From 0b30fc2126396e7b42f114cf671b557f12282070 Mon Sep 17 00:00:00 2001 From: weizong song Date: Tue, 15 Sep 2026 14:44:16 +0800 Subject: [PATCH] up --- src/views/payment/ContractManagement.vue | 103 +++++++++++++++++------ 1 file changed, 76 insertions(+), 27 deletions(-) diff --git a/src/views/payment/ContractManagement.vue b/src/views/payment/ContractManagement.vue index 90f4af7..95e7359 100644 --- a/src/views/payment/ContractManagement.vue +++ b/src/views/payment/ContractManagement.vue @@ -94,7 +94,7 @@ @@ -111,7 +111,7 @@ @@ -127,7 +127,7 @@ @@ -140,7 +140,7 @@ @@ -165,7 +165,7 @@ @@ -286,9 +286,9 @@ - + - + @@ -297,8 +297,9 @@ @@ -342,8 +343,8 @@ - - + + + @@ -379,8 +382,9 @@ @@ -403,8 +407,9 @@ @@ -531,14 +536,14 @@ {{ viewData.main_content || '-' }} {{ viewData.party_a || '-' }} {{ viewData.party_b || '-' }} - {{ formatAmount(viewData.amount_total) }} + {{ formatContractAmount(viewData) }} {{ formatAmount(viewData.budget_amount) }} 闭口合同 开口合同 - - {{ viewData.amount_description || '-' }} + {{ viewData.amount_description || '-' }} {{ viewData.sign_date || '-' }} {{ viewData.apply_date || '-' }} {{ viewData.perform_period || '-' }} @@ -556,15 +561,15 @@ - - {{ viewData.contractType.name }} + {{ viewData.contract_type.name }} - - {{ viewData.purchaseCategory.name }} + {{ viewData.purchase_category.name }} - - {{ viewData.purchaseMethod.name }} + {{ viewData.purchase_method.name }} - @@ -578,7 +583,7 @@ 否 - {{ getDepartmentName(viewData.owner_department_id) }} + {{ formatDepartmentNames(viewData) }} {{ formatUserNames(viewData.handler_admin_ids) }} @@ -1359,7 +1364,11 @@ const rules = { main_content: [{ required: true, message: '请填写合同主要内容', trigger: 'blur' }], party_a: [{ required: true, message: '请填写甲方', trigger: 'blur' }], party_b: [{ required: true, message: '请填写乙方', trigger: 'blur' }], - amount_total: [{ required: true, message: '请填写合同金额', trigger: 'blur' }], + amount_total: [{ validator: (rule, value, callback) => { + if (form.amount_type !== 'open' && (value === null || value === undefined || value === '')) { + callback(new Error('闭口合同请填写合同金额')) + } else { callback() } + }, trigger: ['blur', 'change'] }], amount_type: [{ required: true, message: '请选择金额类型', trigger: 'change' }], amount_description: [ { @@ -1397,7 +1406,7 @@ const rules = { validator: (rule, value, callback) => { // 默认必填,只有当合同类型明确是"收入类"时才撤销必填校验 const contractTypeName = getContractTypeName() - if (contractTypeName === '收入类') { + if (contractTypeName === '收入类' || canKeepLegacyFundSource()) { // 收入类不需要必填 callback() } else { @@ -1417,7 +1426,7 @@ const rules = { validator: (rule, value, callback) => { // 默认必填,只有当合同类型明确是"收入类"时才撤销必填校验 const contractTypeName = getContractTypeName() - if (contractTypeName === '收入类') { + if (contractTypeName === '收入类' || canKeepLegacyFundSource()) { // 收入类不需要必填 callback() } else { @@ -1636,6 +1645,12 @@ function fillPartyB() { } +watch(() => form.amount_type, () => { + nextTick(() => { + formRef.value?.validateField(['amount_total', 'amount_description'], () => {}) + }) +}) + // 监听预算年度变化,刷新经费来源选项 watch(() => form.fund_source_year_id, (newVal) => { if (newVal) { @@ -1703,6 +1718,8 @@ function getEmptyForm() { fund_source_year_id: null, fund_source_budget_data_id: null, fund_source: '', // 保留旧字段,用于兼容 + legacy_fund_source_display: '', + original_fund_source_year_id: null, is_government_purchase: false, tender_agent: '', contract_type_id: null, @@ -1728,6 +1745,9 @@ function getEmptyForm() { } function resetContractForm({ withDefaultPayPlan = false } = {}) { + for (const options of [contractTypeOptions, purchaseCategoryOptions, purchaseMethodOptions]) { + options.value = options.value.filter(option => !option._historical) + } Object.assign(form, getEmptyForm()) payPlanDeleteIds.value = [] attachmentFileList.value = [] @@ -1890,6 +1910,18 @@ async function fetchPurchaseCategoryOptions() { } // 获取合同类型名称 +function preserveCurrentOption(options, current) { + options.value = options.value.filter(option => !option._historical) + if (current?.id && !options.value.some(option => String(option.id) === String(current.id))) { + options.value.push({ ...current, _historical: true }) + } +} + +function canKeepLegacyFundSource() { + return !!form.id && !!form.legacy_fund_source_display && !form.fund_source_budget_data_id + && String(form.fund_source_year_id || '') === String(form.original_fund_source_year_id || '') +} + function getContractTypeName() { if (!form.contract_type_id) { return null @@ -2264,11 +2296,14 @@ async function loadDetail(id) { if (response && response.code === 0) { const data = response.data || response + data.original_fund_source_year_id = data.fund_source_year_id || null + data.legacy_fund_source_display = !data.fund_source_budget_data_id ? (data.fund_source_display || '') : '' + data.amount_total = data.amount_total == null ? null : Number(data.amount_total) // 处理科室多选 if (data.owner_department_ids) { data.owner_department_ids_array = data.owner_department_ids.split(',').filter(id => id) } else { - data.owner_department_ids_array = [] + data.owner_department_ids_array = data.owner_department_id ? [String(data.owner_department_id)] : [] } // 处理经办人多选 @@ -2333,6 +2368,10 @@ async function loadDetail(id) { } } + preserveCurrentOption(contractTypeOptions, data.contract_type) + preserveCurrentOption(purchaseCategoryOptions, data.purchase_category) + preserveCurrentOption(purchaseMethodOptions, data.purchase_method) + // 处理附件 if (data.attachment_id && data.attachment) { attachmentFileList.value = [{ @@ -2437,7 +2476,7 @@ function collectPayload() { main_content: form.main_content, party_a: form.party_a, party_b: form.party_b, - amount_total: form.amount_total || 0, + amount_total: form.amount_total ?? null, amount_type: form.amount_type || 'fixed', amount_description: form.amount_description || '', budget_amount: form.budget_amount || 0, @@ -2451,8 +2490,6 @@ function collectPayload() { tender_agent: form.tender_agent, contract_type_id: form.contract_type_id, purchase_method_id: form.purchase_method_id, - contract_type: form.contract_type, // 保留旧字段,用于兼容 - purchase_method: form.purchase_method, // 保留旧字段,用于兼容 perform_status: form.perform_status, is_accepted: form.is_accepted || false, purchase_category_id: form.purchase_category_id, @@ -2562,7 +2599,7 @@ function openRelatedPayment(payment) { // 根据用户ID获取用户名称 function getUserName(userId) { if (!userId) return '-' - const user = userList.value.find(u => u.id === userId) + const user = userList.value.find(u => String(u.id) === String(userId)) return user ? user.name : '-' } @@ -2579,9 +2616,21 @@ function formatUserNames(userIds) { } // 根据科室ID获取科室名称 +function formatContractAmount(contract) { + if (contract.amount_total == null || contract.amount_total === '') { + return contract.amount_type === 'open' ? '未确定' : '-' + } + return formatAmount(contract.amount_total) +} + +function formatDepartmentNames(contract) { + const ids = String(contract.owner_department_ids || contract.owner_department_id || '').split(',').map(id => id.trim()).filter(Boolean) + return ids.map(id => departmentList.value.find(dept => String(dept.id) === id)?.name || id).join('、') || '-' +} + function getDepartmentName(departmentId) { if (!departmentId) return '-' - const dept = departmentList.value.find(d => d.id === departmentId) + const dept = departmentList.value.find(d => String(d.id) === String(departmentId)) return dept ? dept.name : '-' }