✨ 组织编码/平台公司、合同计费客商角色与基础模块查看按钮
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -20,6 +20,13 @@
|
||||
@on-load="onLoad"
|
||||
>
|
||||
<template #menu="{ row, index }">
|
||||
<el-link
|
||||
v-if="permission.business_dept_config_view"
|
||||
type="primary"
|
||||
@click="$refs.crud.rowView(row, index)"
|
||||
>
|
||||
查看
|
||||
</el-link>
|
||||
<el-link
|
||||
v-if="permission.business_dept_config_edit"
|
||||
type="primary"
|
||||
@@ -117,7 +124,7 @@ export default {
|
||||
editBtn: false,
|
||||
delBtn: false,
|
||||
viewBtn: false,
|
||||
menuWidth: 140,
|
||||
menuWidth: 220,
|
||||
dialogWidth: 900,
|
||||
dialogClickModal: false,
|
||||
labelPosition: 'right',
|
||||
|
||||
+44
-105
@@ -203,7 +203,6 @@ import { mapGetters } from 'vuex';
|
||||
import website from '@/config/website';
|
||||
import func from '@/utils/func';
|
||||
|
||||
const escapeRegExp = value => value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
||||
const ORGANIZATION_TYPE_DICT_CODE = 'organization_type';
|
||||
/**
|
||||
* 组织类型名称 → 字典数字键(兼容 dictKey 配成中文的情况)
|
||||
@@ -323,7 +322,7 @@ export default {
|
||||
{
|
||||
validator: (rule, value, callback) => {
|
||||
const deptCode = String(value || '').trim();
|
||||
// 组织编码非必填,为空直接通过
|
||||
// 组织编码非必填,为空直接通过;不再校验 GWWL/上级编码+三位数字格式
|
||||
if (!deptCode) {
|
||||
callback();
|
||||
return;
|
||||
@@ -332,34 +331,6 @@ export default {
|
||||
callback(new Error('组织编码不能超过30个字符'));
|
||||
return;
|
||||
}
|
||||
const parentId = this.normalizeParentId(this.form?.parentId);
|
||||
// 顶级组织不选择上级时,编码不依赖上级编码
|
||||
if (!parentId) {
|
||||
callback();
|
||||
return;
|
||||
}
|
||||
if (!this.parentDept || String(this.parentDept.id) !== String(parentId)) {
|
||||
this.loadParentDeptCode(parentId);
|
||||
callback(new Error('正在加载上级组织编码,请稍后重试'));
|
||||
return;
|
||||
}
|
||||
if (!this.parentDeptCode) {
|
||||
callback(new Error('上级组织未配置组织编码,请先完善上级组织编码'));
|
||||
return;
|
||||
}
|
||||
// 公司:GWWL+三位数字;部门:所属公司编码+三位数字;其他:上级编码+三位数字(中间不加-)
|
||||
let expectedPrefix = this.parentDeptCode;
|
||||
const category = Number(this.form?.deptCategory);
|
||||
if (category === 2) {
|
||||
expectedPrefix = 'GWWL';
|
||||
} else if (category === 3 && this.form?.belongCompanyCode) {
|
||||
expectedPrefix = String(this.form.belongCompanyCode).trim();
|
||||
}
|
||||
const pattern = new RegExp(`^${escapeRegExp(expectedPrefix)}\\d{3}$`);
|
||||
if (!pattern.test(deptCode)) {
|
||||
callback(new Error(`组织编码格式应为:${expectedPrefix}三位数字(不足补零,中间不加-)`));
|
||||
return;
|
||||
}
|
||||
callback();
|
||||
},
|
||||
trigger: 'blur',
|
||||
@@ -431,50 +402,22 @@ export default {
|
||||
{ label: '是', value: 1 },
|
||||
],
|
||||
dataType: 'number',
|
||||
value: 0,
|
||||
width: 120,
|
||||
order: 36,
|
||||
search: true,
|
||||
searchOrder: 2,
|
||||
searchPlaceholder: '请选择是否平台公司',
|
||||
formatter: row => (Number(row.isPlatformCompany) === 1 ? '是' : '否'),
|
||||
change: ({ value }) => this.handlePlatformCompanyChange(value),
|
||||
rules: [
|
||||
{
|
||||
required: true,
|
||||
message: '请选择是否平台公司',
|
||||
trigger: 'change',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
label: '金蝶部门代码',
|
||||
prop: 'kingdeeDeptCode',
|
||||
minWidth: 140,
|
||||
order: 35,
|
||||
maxlength: 64,
|
||||
showWordLimit: true,
|
||||
// 仅平台公司维护/展示金蝶组织代码;非平台公司列表留空
|
||||
addDisplay: false,
|
||||
editDisplay: false,
|
||||
viewDisplay: false,
|
||||
formatter: row =>
|
||||
Number(row.isPlatformCompany) === 1 ? String(row.kingdeeDeptCode || '').trim() : '',
|
||||
rules: [
|
||||
{
|
||||
validator: (rule, value, callback) => {
|
||||
const code = String(value || '').trim();
|
||||
if (!code) {
|
||||
callback();
|
||||
return;
|
||||
}
|
||||
if (code.length > 64) {
|
||||
callback(new Error('金蝶部门代码不能超过64个字符'));
|
||||
if (value === undefined || value === null || value === '') {
|
||||
callback(new Error('请选择是否平台公司'));
|
||||
return;
|
||||
}
|
||||
callback();
|
||||
},
|
||||
trigger: 'blur',
|
||||
trigger: 'change',
|
||||
},
|
||||
],
|
||||
},
|
||||
@@ -487,7 +430,6 @@ export default {
|
||||
{ label: '是', value: 1 },
|
||||
],
|
||||
dataType: 'number',
|
||||
value: 0,
|
||||
width: 120,
|
||||
order: 34,
|
||||
search: true,
|
||||
@@ -496,8 +438,14 @@ export default {
|
||||
formatter: row => (Number(row.isBusinessDept) === 1 ? '是' : '否'),
|
||||
rules: [
|
||||
{
|
||||
required: true,
|
||||
message: '请选择是否业务部门',
|
||||
validator: (rule, value, callback) => {
|
||||
// 不能用 required:true:值为 0(否)时会被当成空
|
||||
if (value === undefined || value === null || value === '') {
|
||||
callback(new Error('请选择是否业务部门'));
|
||||
return;
|
||||
}
|
||||
callback();
|
||||
},
|
||||
trigger: 'change',
|
||||
},
|
||||
],
|
||||
@@ -988,6 +936,7 @@ export default {
|
||||
/**
|
||||
* 提交前将组织类型规范为 Integer;空状态/排序字段去掉,避免 "" 反序列化失败。
|
||||
* 排序为空时由后端默认填充 1。
|
||||
* 是否平台公司 / 是否业务部门强制规范为数字 0/1,避免下拉值类型导致漏更新。
|
||||
*/
|
||||
prepareDeptSubmitRow(row) {
|
||||
const category = this.resolveDeptCategoryValue(row.deptCategory);
|
||||
@@ -995,6 +944,8 @@ export default {
|
||||
return false;
|
||||
}
|
||||
row.deptCategory = category;
|
||||
row.isPlatformCompany = Number(row.isPlatformCompany) === 1 ? 1 : 0;
|
||||
row.isBusinessDept = Number(row.isBusinessDept) === 1 ? 1 : 0;
|
||||
if (row.status === '' || row.status === null || row.status === undefined) {
|
||||
delete row.status;
|
||||
} else {
|
||||
@@ -1007,6 +958,9 @@ export default {
|
||||
}
|
||||
return true;
|
||||
},
|
||||
normalizeYesNoFlag(value) {
|
||||
return Number(value) === 1 ? 1 : 0;
|
||||
},
|
||||
resolveDeptCategoryValue(value) {
|
||||
if (value === null || value === undefined || value === '') {
|
||||
this.$message.warning('请选择组织类型');
|
||||
@@ -1163,21 +1117,6 @@ export default {
|
||||
row.parentId = 0;
|
||||
}
|
||||
},
|
||||
handlePlatformCompanyChange(value) {
|
||||
const isPlatform = Number(value) === 1;
|
||||
this.syncKingdeeDeptCodeDisplay(isPlatform);
|
||||
if (!isPlatform && this.form) {
|
||||
this.form.kingdeeDeptCode = '';
|
||||
}
|
||||
},
|
||||
syncKingdeeDeptCodeDisplay(isPlatformCompany) {
|
||||
const column = this.findColumn(this.option.column, 'kingdeeDeptCode');
|
||||
if (!column) return;
|
||||
const visible = Number(isPlatformCompany) === 1;
|
||||
column.addDisplay = visible;
|
||||
column.editDisplay = visible;
|
||||
column.viewDisplay = visible;
|
||||
},
|
||||
isRootDept(row) {
|
||||
return row && (row.parentId === 0 || String(row.parentId) === '0');
|
||||
},
|
||||
@@ -1322,9 +1261,6 @@ export default {
|
||||
rowSave(row, done, loading) {
|
||||
row.tenantId = row.tenantId || this.userInfo.tenantId || website.tenantId;
|
||||
row.deptCode = String(row.deptCode || '').trim();
|
||||
// 合同前缀/流水已迁至业务部门配置;组织管理仅维护平台公司金蝶代码
|
||||
row.kingdeeDeptCode =
|
||||
Number(row.isPlatformCompany) === 1 ? String(row.kingdeeDeptCode || '').trim() : '';
|
||||
row.leaderId = func.join(row.leaderId);
|
||||
this.normalizeTopParent(row);
|
||||
if (!this.prepareDeptSubmitRow(row)) {
|
||||
@@ -1370,9 +1306,6 @@ export default {
|
||||
rowUpdate(row, index, done, loading) {
|
||||
row.tenantId = row.tenantId || this.userInfo.tenantId || website.tenantId;
|
||||
row.deptCode = String(row.deptCode || '').trim();
|
||||
// 合同前缀/流水已迁至业务部门配置;组织管理仅维护平台公司金蝶代码
|
||||
row.kingdeeDeptCode =
|
||||
Number(row.isPlatformCompany) === 1 ? String(row.kingdeeDeptCode || '').trim() : '';
|
||||
row.leaderId = func.join(row.leaderId);
|
||||
this.normalizeTopParent(row);
|
||||
if (!this.prepareDeptSubmitRow(row)) {
|
||||
@@ -1479,34 +1412,40 @@ export default {
|
||||
beforeOpen(done, type) {
|
||||
if (type === 'add') {
|
||||
this.form.tenantId = this.form.tenantId || this.userInfo.tenantId || website.tenantId;
|
||||
if (this.form.isPlatformCompany === undefined || this.form.isPlatformCompany === null) {
|
||||
this.form.isPlatformCompany = 0;
|
||||
}
|
||||
if (this.form.isBusinessDept === undefined || this.form.isBusinessDept === null) {
|
||||
this.form.isBusinessDept = 0;
|
||||
}
|
||||
this.syncKingdeeDeptCodeDisplay(this.form.isPlatformCompany);
|
||||
this.form.isPlatformCompany = this.normalizeYesNoFlag(this.form.isPlatformCompany);
|
||||
this.form.isBusinessDept = this.normalizeYesNoFlag(this.form.isBusinessDept);
|
||||
this.initData(this.form.tenantId);
|
||||
this.loadParentDeptCode(this.form.parentId);
|
||||
done();
|
||||
return;
|
||||
}
|
||||
if (type === 'edit') {
|
||||
this.initData(this.form.tenantId || this.userInfo.tenantId || website.tenantId);
|
||||
}
|
||||
if (['edit', 'view'].includes(type)) {
|
||||
getDept(this.form.id).then(res => {
|
||||
this.form = Object.assign(res.data.data, {
|
||||
hasChildren: this.form.hasChildren,
|
||||
// 等详情返回后再打开弹窗,避免异步回填覆盖用户已改值;就地赋值保持 Avue 表单引用
|
||||
getDept(this.form.id)
|
||||
.then(res => {
|
||||
const detail = res.data.data || {};
|
||||
Object.assign(this.form, detail, {
|
||||
hasChildren: this.form.hasChildren,
|
||||
isPlatformCompany: this.normalizeYesNoFlag(detail.isPlatformCompany),
|
||||
isBusinessDept: this.normalizeYesNoFlag(detail.isBusinessDept),
|
||||
});
|
||||
if (this.form.parentId === '0') {
|
||||
this.form.parentId = '';
|
||||
}
|
||||
this.loadParentDeptCode(this.form.parentId);
|
||||
if (Object.prototype.hasOwnProperty.call(this.form, 'leaderId')) {
|
||||
const splitResult = func.split(this.form.leaderId);
|
||||
this.form.leaderId = Array.isArray(splitResult) ? splitResult : [];
|
||||
}
|
||||
done();
|
||||
})
|
||||
.catch(() => {
|
||||
done();
|
||||
});
|
||||
if (this.form.parentId === '0') {
|
||||
this.form.parentId = '';
|
||||
}
|
||||
this.syncKingdeeDeptCodeDisplay(this.form.isPlatformCompany);
|
||||
this.loadParentDeptCode(this.form.parentId);
|
||||
if (this.form.hasOwnProperty('leaderId')) {
|
||||
const splitResult = func.split(this.form.leaderId);
|
||||
this.form.leaderId = Array.isArray(splitResult) ? splitResult : [];
|
||||
}
|
||||
});
|
||||
return;
|
||||
}
|
||||
done();
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user