Prechádzať zdrojové kódy

修复了组织机构二次打开弹框选择岗位序列的时候没有数据的问题

lihaiting 1 týždeň pred
rodič
commit
370566ceef

+ 71 - 12
src/views/enterpriseModel/dept/components/org-edit.vue

@@ -515,6 +515,11 @@
   import { basicAreaPageAPI } from '@/api/regionalManage';
   import { cityDataLabel } from 'ele-admin/packages/utils/regions';
 
+  // 岗位序列属配置类数据,会话级缓存:
+  // 只要本页成功拉到过一次非空数据,后续再次打开弹窗就直接复用,
+  // 避免二次请求返回空数据时把已经拿到的选项冲掉
+  let positionSequenceCache = [];
+
   export default {
     components: {
       OrgSelect,
@@ -764,23 +769,55 @@
         }
         this._ensurePositionPromise = (async () => {
           try {
+            // 各数据源独立容错:一个接口失败不能导致其它下拉也没数据
             if (!this.positionList.length) {
-              const res = await getHrPositionPage({
-                pageNum: 1,
-                size: 9999,
-                status: 1
-              });
-              this.positionList = (res && res.list) || [];
+              try {
+                const res = await getHrPositionPage({
+                  pageNum: 1,
+                  size: 9999,
+                  status: 1
+                });
+                // 同理:接口返回空时不覆盖已有岗位选项
+                const list = (res && res.list) || [];
+                if (list.length || !this.positionList.length) {
+                  this.positionList = list;
+                }
+              } catch (e) {
+                console.error('获取岗位列表失败', e);
+              }
+            }
+            // 先用会话缓存兜底,避免再次打开弹窗时因请求返回异常导致下拉为空
+            if (!this.positionSequenceList.length && positionSequenceCache.length) {
+              this.positionSequenceList = positionSequenceCache;
             }
             if (!this.positionSequenceList.length) {
               try {
                 const res = await getPositionSequenceList();
-                this.positionSequenceList = (Array.isArray(res)
+                // 兼容数组 / {list:[...]} / {records:[...]} 三种返回结构
+                const list = Array.isArray(res)
                   ? res
-                  : []
-                ).filter((item) => Number(item.status) === 1);
+                  : (res && (res.list || res.records)) || [];
+                // status 字段缺失时不过滤,只有明确为停用状态才剔除
+                const enabledList = list.filter(
+                  (item) =>
+                    item.status === undefined ||
+                    item.status === null ||
+                    Number(item.status) === 1
+                );
+                if (enabledList.length) {
+                  positionSequenceCache = enabledList;
+                  this.positionSequenceList = enabledList;
+                } else {
+                  // 接口没返回可用数据时保留已有选项,并打印原始响应便于排查
+                  console.error(
+                    '岗位序列接口未返回可用数据,原始响应:',
+                    res
+                  );
+                  this.positionSequenceList = positionSequenceCache;
+                }
               } catch (e) {
-                this.positionSequenceList = [];
+                console.error('获取岗位序列列表失败', e);
+                this.positionSequenceList = positionSequenceCache;
               }
             }
             // 加载岗位性质字典(无静态兜底)
@@ -789,7 +826,7 @@
                 const res = await getPositionNatureDict();
                 this.positionNatureOptions = Array.isArray(res) ? res : [];
               } catch (e) {
-                this.positionNatureOptions = [];
+                console.error('获取岗位性质字典失败', e);
               }
             }
           } finally {
@@ -944,6 +981,22 @@
                 levelOptions: []
               })
             );
+            // 兜底:岗位序列接口没拿到数据时,用该部门已保存的岗位序列补全下拉选项
+            if (!this.positionSequenceList.length) {
+              const seqMap = new Map();
+              this.departmentPositionList.forEach((row) => {
+                if (row.positionSequenceId && row.positionSequence) {
+                  seqMap.set(String(row.positionSequenceId), {
+                    id: row.positionSequenceId,
+                    sequence: row.positionSequence,
+                    status: 1
+                  });
+                }
+              });
+              if (seqMap.size) {
+                this.positionSequenceList = Array.from(seqMap.values());
+              }
+            }
           } finally {
             this._loadDeptPromise = null;
           }
@@ -955,6 +1008,10 @@
         this.positionList = [];
         this.positionSequenceList = [];
         this.positionNatureOptions = [];
+        // 清理并发防重状态,避免上一次弹窗遗留的 Promise 影响下一次打开
+        this._ensurePositionPromise = null;
+        this._loadDeptPromise = null;
+        this._loadDeptId = null;
       },
       formValidate() {
         return new Promise((resolve, reject) => {
@@ -1068,7 +1125,9 @@
             this.isUpdate = false;
           }
         } else {
-          this.$refs.form.clearValidate();
+          // 关闭弹窗时必须确保下面的重置逻辑一定执行,
+          // 否则上一次的岗位下拉数据/防重 Promise 会被带到下一次打开
+          this.$refs.form && this.$refs.form.clearValidate();
           this.$refs.enterpriseForm &&
             this.$refs.enterpriseForm.clearValidate();
           this.form = { ...this.defaultForm };