✨ 组织编码/平台公司、合同计费客商角色与基础模块查看按钮

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-11-04 03:15:44 +08:00
parent 5bde60d844
commit 014ee537a0
15 changed files with 428 additions and 198 deletions
+8 -1
View File
@@ -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
View File
@@ -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();
},