✨ 合同编号支持手工填写,组织可配置初始流水号

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-10-21 11:53:55 +08:00
parent 5c97d3b5c5
commit 4a0af452e8
3 changed files with 89 additions and 12 deletions
+2 -2
View File
@@ -252,8 +252,8 @@ export const option = createCrudOption([
searchOrder: 6,
searchPlaceholder: '请输入',
order: 185,
disabled: true,
placeholder: '不填写,则系统自动生成',
maxlength: 100,
placeholder: '不填写则按部门规则自动生成',
minWidth: 200,
},
{
+43 -10
View File
@@ -380,17 +380,15 @@
/>
</el-select>
</el-form-item>
<el-form-item label="合同编号">
<el-form-item label="合同编号" prop="contractNo">
<el-input
v-model="form.contractNo"
disabled
maxlength="100"
clearable
:placeholder="
formMode === 'add'
? form.organizationId
? '系统按部门规则自动生成'
: '请先选择合同负责部门'
: ''
formMode === 'add' ? '不填写则按部门规则自动生成' : '请输入合同编号'
"
@input="handleContractNoInput"
/>
</el-form-item>
<el-form-item label="合同名称" prop="contractName">
@@ -1268,7 +1266,23 @@ export default {
{ label: '已到期', value: 'expired', statKey: 'expired' },
],
form: defaultForm(),
contractNoManual: false,
formRules: {
contractNo: [
{
validator: (rule, value, callback) => {
const contractNo = String(value || '').trim();
if (this.formMode === 'edit' && !contractNo) {
return callback(new Error('请输入合同编号'));
}
if (contractNo.length > 100) {
return callback(new Error('合同编号不能超过100个字符'));
}
callback();
},
trigger: 'blur',
},
],
contractName: [{ required: true, message: '请输入合同名称', trigger: 'blur' }],
contractCategory: [{ required: true, message: '请选择合同类别', trigger: 'change' }],
signType: [{ required: true, message: '请选择签约类型', trigger: 'change' }],
@@ -1782,6 +1796,7 @@ export default {
this.api.getDetail(id).then(res => this.applyDetail(res.data?.data || {}));
},
resetFormState() {
this.contractNoManual = false;
this.form = {
...defaultForm(),
handlerUserName:
@@ -1857,7 +1872,20 @@ export default {
this.$router.$avueRouter?.closeTag?.();
this.$router.push(contractManageListRoute);
},
validateContractNo() {
const contractNo = String(this.form.contractNo || '').trim();
if (this.formMode === 'edit' && !contractNo) {
this.$message.warning('请输入合同编号');
return false;
}
if (contractNo.length > 100) {
this.$message.warning('合同编号不能超过100个字符');
return false;
}
return true;
},
validateBase(action) {
if (!this.validateContractNo()) return false;
if (action === 'temporary') {
const required = [
['signType', '签约类型'],
@@ -1943,6 +1971,7 @@ export default {
const projectName = projectId ? normalizeProjectValue(this.form.projectName) : '';
return {
...this.form,
contractNo: String(this.form.contractNo || '').trim(),
projectId,
projectName,
copyCount: normalizeOptionalInteger(this.form.copyCount),
@@ -2314,11 +2343,14 @@ export default {
this.refreshPreviewContractNo();
}
},
handleContractNoInput(value) {
this.contractNoManual = String(value || '').trim() !== '';
},
refreshPreviewContractNo() {
if (this.formMode !== 'add') return;
const organizationId = this.form.organizationId;
if (!organizationId) {
this.form.contractNo = '';
if (!this.contractNoManual) this.form.contractNo = '';
return;
}
const requestId = (this.contractNoPreviewRequestId =
@@ -2326,11 +2358,11 @@ export default {
api
.nextContractNo(organizationId)
.then(res => {
if (requestId !== this.contractNoPreviewRequestId) return;
if (requestId !== this.contractNoPreviewRequestId || this.contractNoManual) return;
this.form.contractNo = res.data?.data || '';
})
.catch(() => {
if (requestId !== this.contractNoPreviewRequestId) return;
if (requestId !== this.contractNoPreviewRequestId || this.contractNoManual) return;
this.form.contractNo = '';
});
},
@@ -2763,6 +2795,7 @@ export default {
},
getContractChangeFieldLabel(field) {
const labels = {
contractNo: '合同编号',
contractName: '合同名称',
partyB: '乙方',
startDate: '开始日期',
+44
View File
@@ -418,6 +418,37 @@ export default {
},
],
},
{
label: '合同初始流水号',
prop: 'contractInitialSerial',
type: 'input',
minWidth: 140,
order: 61,
placeholder: '如 1',
tip: '该部门当年首个合同时从此流水号起编,后续递增;范围1-999,不填默认从1开始',
rules: [
{
validator: (rule, value, callback) => {
if (value === undefined || value === null || value === '') {
callback();
return;
}
const text = String(value).trim();
if (!/^\d+$/.test(text)) {
callback(new Error('合同初始流水号只能输入正整数'));
return;
}
const serial = Number(text);
if (serial < 1 || serial > 999) {
callback(new Error('合同初始流水号范围为1到999'));
return;
}
callback();
},
trigger: 'blur',
},
],
},
{
label: '组织简称',
prop: 'shortName',
@@ -1156,6 +1187,17 @@ export default {
row.parentId = 0;
}
},
normalizeContractInitialSerial(value) {
if (value === undefined || value === null || value === '') {
return null;
}
const text = String(value).trim();
if (!text) {
return null;
}
const serial = Number(text);
return Number.isInteger(serial) ? serial : value;
},
isRootDept(row) {
return row && (row.parentId === 0 || String(row.parentId) === '0');
},
@@ -1302,6 +1344,7 @@ export default {
row.deptCode = String(row.deptCode || '').trim();
row.kingdeeDeptCode = String(row.kingdeeDeptCode || '').trim();
row.contractCodePrefix = String(row.contractCodePrefix || '').trim();
row.contractInitialSerial = this.normalizeContractInitialSerial(row.contractInitialSerial);
row.leaderId = func.join(row.leaderId);
this.normalizeTopParent(row);
if (!this.prepareDeptSubmitRow(row)) {
@@ -1349,6 +1392,7 @@ export default {
row.deptCode = String(row.deptCode || '').trim();
row.kingdeeDeptCode = String(row.kingdeeDeptCode || '').trim();
row.contractCodePrefix = String(row.contractCodePrefix || '').trim();
row.contractInitialSerial = this.normalizeContractInitialSerial(row.contractInitialSerial);
row.leaderId = func.join(row.leaderId);
this.normalizeTopParent(row);
if (!this.prepareDeptSubmitRow(row)) {