|
|
@@ -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 };
|