✨ 合同结算币种联动计费与运单计价单位,并完善合同与派车交互
结算币种驱动计费单价单位及运单/计划/总单计价单位;同步合同编号预览、部门前缀配置、派车备注与查看弹窗等交互优化。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -128,7 +128,7 @@
|
||||
<el-descriptions-item label="甲方">{{ detailValue('partyA') }}</el-descriptions-item>
|
||||
<el-descriptions-item label="乙方">{{ detailValue('partyB') }}</el-descriptions-item>
|
||||
<el-descriptions-item label="合同期限">{{ detailContractPeriod }}</el-descriptions-item>
|
||||
<el-descriptions-item label="所属组织">{{
|
||||
<el-descriptions-item label="合同负责部门">{{
|
||||
detailValue('organizationName')
|
||||
}}</el-descriptions-item>
|
||||
<el-descriptions-item label="经办人">{{
|
||||
@@ -140,6 +140,9 @@
|
||||
<el-descriptions-item label="签订日期">{{
|
||||
detailValue('signDate')
|
||||
}}</el-descriptions-item>
|
||||
<el-descriptions-item label="申请日期">{{
|
||||
detailValue('applyDate')
|
||||
}}</el-descriptions-item>
|
||||
<el-descriptions-item label="合同格式">{{
|
||||
detailValue('contractFormat')
|
||||
}}</el-descriptions-item>
|
||||
@@ -171,14 +174,17 @@
|
||||
<el-descriptions-item label="是否电子章">
|
||||
{{ detailElectronicSealText }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="备注" :span="3">{{
|
||||
<el-descriptions-item label="合同主要内容" :span="3">{{
|
||||
detailValue('mainContent')
|
||||
}}</el-descriptions-item>
|
||||
<el-descriptions-item label="其他事项说明" :span="3">{{
|
||||
detailValue('remark')
|
||||
}}</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
</section>
|
||||
|
||||
<contract-attachment-section
|
||||
title="合同文件"
|
||||
title="用印材料"
|
||||
description
|
||||
attachment-type
|
||||
readonly
|
||||
@@ -294,7 +300,7 @@
|
||||
</section>
|
||||
|
||||
<contract-attachment-section
|
||||
title="其它附件"
|
||||
title="附件(佐证材料等)"
|
||||
description
|
||||
readonly
|
||||
:rows="detailAttachmentRows"
|
||||
@@ -377,8 +383,14 @@
|
||||
<el-form-item label="合同编号">
|
||||
<el-input
|
||||
v-model="form.contractNo"
|
||||
:disabled="formMode === 'edit'"
|
||||
placeholder="不填写,则系统自动生成"
|
||||
disabled
|
||||
:placeholder="
|
||||
formMode === 'add'
|
||||
? form.organizationId
|
||||
? '系统按部门规则自动生成'
|
||||
: '请先选择合同负责部门'
|
||||
: ''
|
||||
"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="合同名称" prop="contractName">
|
||||
@@ -417,7 +429,7 @@
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="所属组织" prop="organizationName">
|
||||
<el-form-item label="合同负责部门" prop="organizationName">
|
||||
<el-cascader
|
||||
v-model="organizationCascaderValue"
|
||||
:options="organizationOptions"
|
||||
@@ -471,6 +483,16 @@
|
||||
placeholder="请选择签订日期"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="申请日期">
|
||||
<el-date-picker
|
||||
v-model="form.applyDate"
|
||||
type="date"
|
||||
format="YYYY-MM-DD"
|
||||
value-format="YYYY-MM-DD"
|
||||
placeholder="提交正式合同时自动填充"
|
||||
disabled
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="合同期限" prop="startDate">
|
||||
<div class="contract-manage-form__date-range">
|
||||
<el-date-picker
|
||||
@@ -497,7 +519,7 @@
|
||||
@input="value => integerInput('paymentDays', value)"
|
||||
><template #suffix>天</template></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="合同金额">
|
||||
<el-form-item label="合同金额" prop="contractAmount">
|
||||
<el-input
|
||||
:model-value="contractAmountDisplay"
|
||||
placeholder="请输入"
|
||||
@@ -557,7 +579,7 @@
|
||||
>
|
||||
</el-form-item>
|
||||
<el-form-item label="是否需要加盖法人章" prop="legalSealFlag">
|
||||
<el-select v-model="form.legalSealFlag" placeholder="请选择">
|
||||
<el-select v-model="form.legalSealFlag" placeholder="请选择" clearable>
|
||||
<el-option label="否" :value="0" />
|
||||
<el-option label="是" :value="1" />
|
||||
</el-select>
|
||||
@@ -576,20 +598,30 @@
|
||||
<el-input v-model="form.handlerUserName" disabled />
|
||||
</el-form-item>
|
||||
</div>
|
||||
<el-form-item label="备注" prop="remark" class="contract-manage-form__remark">
|
||||
<el-form-item label="合同主要内容" prop="mainContent" class="contract-manage-form__remark">
|
||||
<el-input
|
||||
v-model="form.mainContent"
|
||||
type="textarea"
|
||||
:rows="4"
|
||||
maxlength="1000"
|
||||
show-word-limit
|
||||
placeholder="请输入合同主要内容"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="其他事项说明" prop="remark" class="contract-manage-form__remark">
|
||||
<el-input
|
||||
v-model="form.remark"
|
||||
type="textarea"
|
||||
:rows="2"
|
||||
maxlength="200"
|
||||
show-word-limit
|
||||
placeholder="请输入备注"
|
||||
placeholder="请输入其他事项说明"
|
||||
/>
|
||||
</el-form-item>
|
||||
</section>
|
||||
|
||||
<contract-attachment-section
|
||||
title="合同文件"
|
||||
title="用印材料"
|
||||
description
|
||||
attachment-type
|
||||
:attachment-location-options="contractAttachmentLocationOptions"
|
||||
@@ -809,10 +841,11 @@
|
||||
</section>
|
||||
|
||||
<contract-attachment-section
|
||||
title="其它附件"
|
||||
title="附件(佐证材料等)"
|
||||
description
|
||||
attachment-type
|
||||
attachment-location="其它附件"
|
||||
attachment-location="附件(佐证材料等)"
|
||||
attachment-type-dict-code="contract_supporting_attachment_type"
|
||||
:attachment-location-options="contractAttachmentLocationOptions"
|
||||
:readonly="isAttachmentUploadMode"
|
||||
:rows="attachmentRows"
|
||||
@@ -920,18 +953,19 @@
|
||||
v-model="billingPlanBox"
|
||||
:value="billingPlanForm"
|
||||
:index="billingPlanIndex"
|
||||
:settlement-currency="form.settlementCurrency"
|
||||
@save="saveBillingPlan"
|
||||
/>
|
||||
|
||||
<contract-attachment-section
|
||||
ref="listAttachmentUploader"
|
||||
dialog-only
|
||||
title="合同文件"
|
||||
title="用印材料"
|
||||
description
|
||||
attachment-type
|
||||
use-upload-dialog
|
||||
mark-approved-on-upload
|
||||
:attachment-location-options="['合同文件', '其它附件']"
|
||||
:attachment-location-options="['用印材料', '附件(佐证材料等)']"
|
||||
:rows="listUploadContractFileRows"
|
||||
@update:rows="listUploadContractFileRows = $event"
|
||||
@upload-to-location="handleListAttachmentUploadToLocation"
|
||||
@@ -988,6 +1022,7 @@
|
||||
v-model="detailBillingPlanBox"
|
||||
:value="detailBillingPlanForm"
|
||||
:index="detailBillingPlanIndex"
|
||||
:settlement-currency="detail.settlementCurrency || form.settlementCurrency"
|
||||
readonly
|
||||
/>
|
||||
|
||||
@@ -1026,6 +1061,8 @@ import ChangeRecordDetailDialog from '@/components/change-record-detail-dialog/m
|
||||
import ContractAttachmentSection, {
|
||||
attachmentName as sharedAttachmentName,
|
||||
attachmentUrl as sharedAttachmentUrl,
|
||||
isContractSealMaterialLocation,
|
||||
isContractSupportingAttachmentLocation,
|
||||
normalizeContractFileRows,
|
||||
} from './components/contract-attachment-section.vue';
|
||||
import PdfPreview from '@/components/pdf-preview/main.vue';
|
||||
@@ -1093,8 +1130,9 @@ const defaultForm = () => ({
|
||||
partyB: '',
|
||||
handlerUserName: '',
|
||||
signDate: '',
|
||||
applyDate: '',
|
||||
contractFormat: '',
|
||||
legalSealFlag: 0,
|
||||
legalSealFlag: null,
|
||||
copyCount: '',
|
||||
settlementCurrency: '',
|
||||
invoiceCycle: '',
|
||||
@@ -1110,6 +1148,7 @@ const defaultForm = () => ({
|
||||
effectiveType: '',
|
||||
feeGenerationMode: 'system',
|
||||
archiveStatus: '未归档',
|
||||
mainContent: '',
|
||||
remark: '',
|
||||
});
|
||||
// 复制新增:仅保留可编辑字段与明细,剔除主键、编号、审批与流程信息
|
||||
@@ -1121,6 +1160,7 @@ const createCopiedDetail = (detail = {}) => {
|
||||
return {
|
||||
...form,
|
||||
contractNo: '',
|
||||
applyDate: '',
|
||||
archiveStatus: '未归档',
|
||||
feeGenerationMode: detail.feeGenerationMode || '',
|
||||
billingEnabled: detail.billingEnabled,
|
||||
@@ -1215,13 +1255,12 @@ export default {
|
||||
signType: [{ required: true, message: '请选择签约类型', trigger: 'change' }],
|
||||
settlementCurrency: [{ required: true, message: '请选择结算币种', trigger: 'change' }],
|
||||
projectName: [{ required: true, message: '请选择所属项目', trigger: 'change' }],
|
||||
organizationName: [{ required: true, message: '请选择所属组织', trigger: 'change' }],
|
||||
organizationName: [{ required: true, message: '请选择合同负责部门', trigger: 'change' }],
|
||||
partyA: [{ required: true, message: '请选择甲方', trigger: 'change' }],
|
||||
partyB: [{ required: true, message: '请选择乙方', trigger: 'change' }],
|
||||
signDate: [{ required: true, message: '请选择签订日期', trigger: 'change' }],
|
||||
settlementMode: [{ required: true, message: '请选择结算方式', trigger: 'change' }],
|
||||
contractFormat: [{ required: true, message: '请选择合同格式', trigger: 'change' }],
|
||||
legalSealFlag: [{ required: true, message: '请选择是否需要加盖法人章', trigger: 'change' }],
|
||||
invoiceCycle: [
|
||||
{
|
||||
validator: (rule, value, callback) => {
|
||||
@@ -1236,6 +1275,22 @@ export default {
|
||||
],
|
||||
startDate: [{ required: true, message: '请选择开始日期', trigger: 'change' }],
|
||||
endDate: [{ required: true, message: '请选择结束日期', trigger: 'change' }],
|
||||
contractAmount: [
|
||||
{ required: true, message: '请输入合同金额', trigger: 'blur' },
|
||||
{
|
||||
validator: (rule, value, callback) => {
|
||||
if (value === undefined || value === null || value === '') {
|
||||
return callback(new Error('请输入合同金额'));
|
||||
}
|
||||
if (Number(value) < 0) {
|
||||
return callback(new Error('合同金额不能小于0'));
|
||||
}
|
||||
callback();
|
||||
},
|
||||
trigger: 'blur',
|
||||
},
|
||||
],
|
||||
mainContent: [{ max: 1000, message: '合同主要内容不能超过1000个字符', trigger: 'blur' }],
|
||||
},
|
||||
submitAction: '',
|
||||
projectOptions: [],
|
||||
@@ -1345,8 +1400,8 @@ export default {
|
||||
return this.$route.query.attachmentUpload === '1';
|
||||
},
|
||||
contractAttachmentLocationOptions() {
|
||||
if (this.isAttachmentUploadMode) return ['合同文件'];
|
||||
return ['合同文件', '其它附件'];
|
||||
if (this.isAttachmentUploadMode) return ['用印材料'];
|
||||
return ['用印材料', '附件(佐证材料等)'];
|
||||
},
|
||||
contractAmountDisplay() {
|
||||
const value = this.form.contractAmount;
|
||||
@@ -1413,7 +1468,7 @@ export default {
|
||||
expandTrigger: 'click',
|
||||
};
|
||||
},
|
||||
// 所属组织级联:selectedOrganizationId 存部门 id,级联控件用根到节点的 id 路径,
|
||||
// 合同负责部门级联:selectedOrganizationId 存部门 id,级联控件用根到节点的 id 路径,
|
||||
// 两者在此双向转换;依赖 organizationOptions,树加载完成后回显自动刷新
|
||||
organizationCascaderValue: {
|
||||
get() {
|
||||
@@ -1775,6 +1830,7 @@ export default {
|
||||
this.applyDetail(createCopiedDetail(detail));
|
||||
this.form.handlerUserName =
|
||||
this.userInfo?.realName || this.userInfo?.userName || this.userInfo?.account || '';
|
||||
this.refreshPreviewContractNo();
|
||||
this.$nextTick(() => this.$refs.contractForm?.clearValidate());
|
||||
},
|
||||
closeForm() {
|
||||
@@ -1789,9 +1845,10 @@ export default {
|
||||
['contractName', '合同名称'],
|
||||
['contractCategory', '合同类型'],
|
||||
['projectName', '所属项目'],
|
||||
['organizationName', '所属组织'],
|
||||
['organizationName', '合同负责部门'],
|
||||
['partyA', '甲方'],
|
||||
['partyB', '乙方'],
|
||||
['contractAmount', '合同金额'],
|
||||
];
|
||||
const empty = required.find(([prop]) => {
|
||||
const value = this.form[prop];
|
||||
@@ -1799,10 +1856,16 @@ export default {
|
||||
});
|
||||
if (empty) {
|
||||
this.$message.warning(
|
||||
empty[0] === 'contractName' ? `请输入${empty[1]}` : `请选择${empty[1]}`
|
||||
['contractName', 'contractAmount'].includes(empty[0])
|
||||
? `请输入${empty[1]}`
|
||||
: `请选择${empty[1]}`
|
||||
);
|
||||
return false;
|
||||
}
|
||||
if (Number(this.form.contractAmount) < 0) {
|
||||
this.$message.warning('合同金额不能小于0');
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
if (!this.form.contractName?.trim()) {
|
||||
@@ -1825,7 +1888,7 @@ export default {
|
||||
if (action !== 'formal' && action !== 'edit') return true;
|
||||
const required = [
|
||||
['projectName', '所属项目'],
|
||||
['organizationName', '所属组织'],
|
||||
['organizationName', '合同负责部门'],
|
||||
['partyA', '甲方'],
|
||||
['partyB', '乙方'],
|
||||
['startDate', '合同开始日期'],
|
||||
@@ -1833,10 +1896,20 @@ export default {
|
||||
['signDate', '签订日期'],
|
||||
['settlementMode', '结算方式'],
|
||||
['contractFormat', '合同格式'],
|
||||
['contractAmount', '合同金额'],
|
||||
];
|
||||
const empty = required.find(([prop]) => !this.form[prop]);
|
||||
const empty = required.find(([prop]) => {
|
||||
const value = this.form[prop];
|
||||
return value === undefined || value === null || String(value).trim() === '';
|
||||
});
|
||||
if (empty) {
|
||||
this.$message.warning(`请选择或输入${empty[1]}`);
|
||||
this.$message.warning(
|
||||
empty[0] === 'contractAmount' ? `请输入${empty[1]}` : `请选择或输入${empty[1]}`
|
||||
);
|
||||
return false;
|
||||
}
|
||||
if (Number(this.form.contractAmount) < 0) {
|
||||
this.$message.warning('合同金额不能小于0');
|
||||
return false;
|
||||
}
|
||||
return (
|
||||
@@ -2026,11 +2099,11 @@ export default {
|
||||
},
|
||||
handleListAttachmentUploadToLocation({ location, rows = [] }) {
|
||||
if (!rows.length) return;
|
||||
if (location === '合同文件') {
|
||||
if (isContractSealMaterialLocation(location)) {
|
||||
this.listUploadContractFileRows = [...(this.listUploadContractFileRows || []), ...rows];
|
||||
return;
|
||||
}
|
||||
if (location === '其它附件') {
|
||||
if (isContractSupportingAttachmentLocation(location)) {
|
||||
this.listUploadAttachmentRows = [...(this.listUploadAttachmentRows || []), ...rows];
|
||||
}
|
||||
},
|
||||
@@ -2150,6 +2223,9 @@ export default {
|
||||
column.renderSearch = scope => this.renderOrganizationSearch(scope);
|
||||
}
|
||||
this.syncCurrentOrganizationOption();
|
||||
if (this.isFormPage && this.formMode === 'add' && this.form.organizationId) {
|
||||
this.refreshPreviewContractNo();
|
||||
}
|
||||
})
|
||||
.finally(() => {
|
||||
this.organizationLoading = false;
|
||||
@@ -2212,6 +2288,29 @@ export default {
|
||||
}
|
||||
: { organizationId: '', organizationName: '' }
|
||||
);
|
||||
if (this.formMode === 'add') {
|
||||
this.refreshPreviewContractNo();
|
||||
}
|
||||
},
|
||||
refreshPreviewContractNo() {
|
||||
if (this.formMode !== 'add') return;
|
||||
const organizationId = this.form.organizationId;
|
||||
if (!organizationId) {
|
||||
this.form.contractNo = '';
|
||||
return;
|
||||
}
|
||||
const requestId = (this.contractNoPreviewRequestId =
|
||||
(this.contractNoPreviewRequestId || 0) + 1);
|
||||
api
|
||||
.nextContractNo(organizationId)
|
||||
.then(res => {
|
||||
if (requestId !== this.contractNoPreviewRequestId) return;
|
||||
this.form.contractNo = res.data?.data || '';
|
||||
})
|
||||
.catch(() => {
|
||||
if (requestId !== this.contractNoPreviewRequestId) return;
|
||||
this.form.contractNo = '';
|
||||
});
|
||||
},
|
||||
syncCurrentOrganizationOption() {
|
||||
if (!this.form.organizationId || !this.form.organizationName) return;
|
||||
@@ -2225,7 +2324,7 @@ export default {
|
||||
this.organizationFlatOptions.unshift(item);
|
||||
},
|
||||
renderOrganizationSearch(scope) {
|
||||
// 搜索区所属组织:单选级联(与新增/编辑表单一致)
|
||||
// 搜索区合同负责部门:单选级联(与新增/编辑表单一致)
|
||||
// 级联返回 id 路径数组,提交时由 normalizeSearch 取末级 id 转组织名称
|
||||
return h(ElCascader, {
|
||||
modelValue: Array.isArray(scope.row?.organizationName) ? scope.row.organizationName : [],
|
||||
@@ -2244,7 +2343,7 @@ export default {
|
||||
filterable: true,
|
||||
clearable: true,
|
||||
style: 'width: 100%',
|
||||
placeholder: '请选择 所属组织',
|
||||
placeholder: '请选择 合同负责部门',
|
||||
});
|
||||
},
|
||||
integerInput(prop, value) {
|
||||
@@ -2289,11 +2388,11 @@ export default {
|
||||
},
|
||||
handleAttachmentUploadToLocation({ location, rows = [] }) {
|
||||
if (!rows.length) return;
|
||||
if (location === '合同文件') {
|
||||
if (isContractSealMaterialLocation(location)) {
|
||||
this.contractFileRows = [...(this.contractFileRows || []), ...rows];
|
||||
return;
|
||||
}
|
||||
if (location === '其它附件') {
|
||||
if (isContractSupportingAttachmentLocation(location)) {
|
||||
this.attachmentRows = [...(this.attachmentRows || []), ...rows];
|
||||
}
|
||||
},
|
||||
@@ -2654,15 +2753,16 @@ export default {
|
||||
templateFlag: '是否范本',
|
||||
originalContractNo: '原件合同编号',
|
||||
electronicSealFlag: '是否电子章',
|
||||
remark: '备注',
|
||||
mainContent: '合同主要内容',
|
||||
remark: '其他事项说明',
|
||||
feeGenerationMode: '费用生成模式',
|
||||
billingPlanJson: '计费方案',
|
||||
settlementRuleJson: '结算单规则',
|
||||
preSettlementConfigJson: '预结算配置',
|
||||
formalSettlementConfigJson: '正式结算配置',
|
||||
paymentRatioJson: '付款比例设置',
|
||||
contractFileJson: '合同文件',
|
||||
attachmentsJson: '其它附件',
|
||||
contractFileJson: '用印材料',
|
||||
attachmentsJson: '附件(佐证材料等)',
|
||||
changeAttachmentsJson: '变更材料',
|
||||
};
|
||||
return labels[field] || field;
|
||||
|
||||
Reference in New Issue
Block a user