✨ 业务数量单位改走计量单位,并放开运输计划日期必填
发货模板、运输计划、运单与总单调度从计量单位取 unitName;修复调度提交顶层单位为空,并取消计划开始/结束日期必填。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+35
-38
@@ -189,6 +189,20 @@ import func from '@/utils/func';
|
||||
|
||||
const escapeRegExp = value => value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
||||
const ORGANIZATION_TYPE_DICT_CODE = 'organization_type';
|
||||
/**
|
||||
* 组织类型名称 → 字典数字键(兼容 dictKey 配成中文的情况)
|
||||
*/
|
||||
const ORGANIZATION_TYPE_CODE_BY_LABEL = {
|
||||
集团: 1,
|
||||
一级集团: 1,
|
||||
事业部: 2,
|
||||
二级事业部: 2,
|
||||
部门: 3,
|
||||
分公司: 4,
|
||||
三级分公司: 4,
|
||||
物流园区: 5,
|
||||
承运商: 6,
|
||||
};
|
||||
|
||||
export default {
|
||||
data() {
|
||||
@@ -755,7 +769,7 @@ export default {
|
||||
.filter(Boolean);
|
||||
this.resetDeptCategoryOptions();
|
||||
if (list.length && !this.organizationTypeOptions.length) {
|
||||
this.$message.warning('组织类型字典 dictKey 须为数字 1~6,当前无法解析,请检查业务字典配置');
|
||||
this.$message.warning('组织类型字典无法解析,请检查业务字典 organization_type 的字典键配置');
|
||||
}
|
||||
// 字典异步返回后触发表格组织类型标签重绘
|
||||
if (Array.isArray(this.data) && this.data.length) {
|
||||
@@ -765,29 +779,31 @@ export default {
|
||||
},
|
||||
/**
|
||||
* 业务字典项转下拉选项。后端 deptCategory 为 Integer,value 必须始终为数字。
|
||||
* dictKey 为纯数字时直接使用;若配成中文则回退用 sort(1~6)作为层级码。
|
||||
* 优先用数字 dictKey;若 dictKey 配成中文,则按名称映射已知编码。
|
||||
*/
|
||||
normalizeOrganizationTypeOption(item) {
|
||||
const label = item?.dictValue ?? item?.label;
|
||||
if (label === undefined || label === null || String(label).trim() === '') {
|
||||
return null;
|
||||
}
|
||||
const labelText = String(label).trim();
|
||||
const rawKey = item?.dictKey ?? item?.value;
|
||||
const keyText = rawKey === undefined || rawKey === null ? '' : String(rawKey).trim();
|
||||
const keyNumber = Number(keyText);
|
||||
const isPureNumber = keyText !== '' && !Number.isNaN(keyNumber) && String(keyNumber) === keyText;
|
||||
if (isPureNumber) {
|
||||
return {
|
||||
label: String(label),
|
||||
label: labelText,
|
||||
value: keyNumber,
|
||||
};
|
||||
}
|
||||
// 兼容 dictKey 误配成中文:用排序号作为 1~6 层级码,保证下拉有数据且可提交 Integer
|
||||
const sortNumber = Number(item?.sort);
|
||||
if (!Number.isNaN(sortNumber) && sortNumber >= 1 && sortNumber <= 6) {
|
||||
// dictKey / 名称 配成中文时,按标准名称映射到数字键
|
||||
const codeByLabel =
|
||||
ORGANIZATION_TYPE_CODE_BY_LABEL[labelText] ?? ORGANIZATION_TYPE_CODE_BY_LABEL[keyText];
|
||||
if (codeByLabel) {
|
||||
return {
|
||||
label: String(label),
|
||||
value: sortNumber,
|
||||
label: labelText,
|
||||
value: codeByLabel,
|
||||
};
|
||||
}
|
||||
return null;
|
||||
@@ -813,18 +829,25 @@ export default {
|
||||
this.$message.warning('请选择组织类型');
|
||||
return null;
|
||||
}
|
||||
if (typeof value === 'number' && !Number.isNaN(value)) {
|
||||
return value;
|
||||
}
|
||||
const asNumber = Number(value);
|
||||
if (!Number.isNaN(asNumber) && String(asNumber) === String(value).trim()) {
|
||||
return asNumber;
|
||||
}
|
||||
// 容错:表单里残留了中文标签时,按字典项 label 反查数字编码
|
||||
// 容错:表单里残留了中文标签时,按字典项 label / 标准名称反查数字编码
|
||||
const matched = this.organizationTypeOptions.find(
|
||||
item => String(item.label) === String(value) || this.isSameDeptCategory(item.value, value)
|
||||
);
|
||||
if (matched && typeof matched.value === 'number' && !Number.isNaN(matched.value)) {
|
||||
return matched.value;
|
||||
}
|
||||
this.$message.warning('组织类型无效,请重新选择(字典键须为数字 1~6)');
|
||||
const codeByLabel = ORGANIZATION_TYPE_CODE_BY_LABEL[String(value).trim()];
|
||||
if (codeByLabel) {
|
||||
return codeByLabel;
|
||||
}
|
||||
this.$message.warning('组织类型无效,请重新选择');
|
||||
return null;
|
||||
},
|
||||
resetDeptCategoryOptions() {
|
||||
@@ -860,35 +883,9 @@ export default {
|
||||
const text = matched?.label || value;
|
||||
return String(text).includes('承运商');
|
||||
},
|
||||
filterOrganizationTypeOptions(values) {
|
||||
const valueSet = new Set(values.map(item => String(item)));
|
||||
const filtered = this.organizationTypeOptions.filter(item => valueSet.has(String(item.value)));
|
||||
// 字典 key 非数字时无法按历史层级码过滤,回退展示全部,避免下拉无选项
|
||||
return filtered.length ? filtered : [...this.organizationTypeOptions];
|
||||
},
|
||||
updateDeptCategoryOptions() {
|
||||
const categoryColumn = this.findColumn(this.option.column, 'deptCategory');
|
||||
const parent = this.parentDept;
|
||||
if (!parent || !categoryColumn) {
|
||||
return;
|
||||
}
|
||||
let dicData = [];
|
||||
if (this.isRootDept(parent)) {
|
||||
dicData =
|
||||
parent.deptName === '外部组织'
|
||||
? this.filterOrganizationTypeOptions([6])
|
||||
: this.filterOrganizationTypeOptions([1]);
|
||||
} else if (Number(parent.deptCategory) === 1) {
|
||||
dicData = this.filterOrganizationTypeOptions([2, 3]);
|
||||
} else if ([2, 3].includes(Number(parent.deptCategory))) {
|
||||
dicData = this.filterOrganizationTypeOptions([4, 5, 6]);
|
||||
} else {
|
||||
dicData = [...this.organizationTypeOptions];
|
||||
}
|
||||
categoryColumn.dicData = dicData;
|
||||
if (!dicData.some(item => this.isSameDeptCategory(item.value, this.form.deptCategory))) {
|
||||
this.form.deptCategory = dicData[0]?.value;
|
||||
}
|
||||
// 组织层级仅由 parentId 决定,组织类型不再按上级过滤,始终展示全部字典项
|
||||
this.resetDeptCategoryOptions();
|
||||
if (this.isCarrierDeptCategory(this.form.deptCategory)) {
|
||||
this.openCarrierDialog();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user