diff --git a/src/views/project-management/contract/expense-contract/ContractEdit.vue b/src/views/project-management/contract/expense-contract/ContractEdit.vue index 78ece19..5908dcb 100644 --- a/src/views/project-management/contract/expense-contract/ContractEdit.vue +++ b/src/views/project-management/contract/expense-contract/ContractEdit.vue @@ -35,11 +35,11 @@ - 未确认 - 待审批 - 已签署 + 未执行 执行中 - 已完成 + 验收中 + 结算中 + 已结算 已终止 diff --git a/src/views/project-management/contract/expense-contract/index.vue b/src/views/project-management/contract/expense-contract/index.vue index ad3286e..3f2e5f0 100644 --- a/src/views/project-management/contract/expense-contract/index.vue +++ b/src/views/project-management/contract/expense-contract/index.vue @@ -48,18 +48,23 @@ ¥{{ (record.amount || 0).toLocaleString() }} - - @@ -173,11 +187,11 @@ const queryFormColumns = [ props: { placeholder: '请选择合同状态', options: [ - { label: '未确认', value: '未确认' }, - { label: '待审批', value: '待审批' }, - { label: '已签署', value: '已签署' }, + { label: '未执行', value: '未执行' }, { label: '执行中', value: '执行中' }, - { label: '已完成', value: '已完成' }, + { label: '验收中', value: '验收中' }, + { label: '结算中', value: '结算中' }, + { label: '已结算', value: '已结算' }, { label: '已终止', value: '已终止' }, ], }, @@ -187,9 +201,8 @@ const queryFormColumns = [ label: '签署时间', type: 'range-picker' as const, props: { - placeholder: ['开始时间', '结束时间'], - showTime: true, - format: 'YYYY-MM-DD HH:mm:ss', + placeholder: ['开始日期', '结束日期'], + format: 'YYYY-MM-DD', }, }, ] @@ -200,11 +213,11 @@ const tableColumns: TableColumnData[] = [ { title: '项目名称', dataIndex: 'projectName', width: 250, ellipsis: true, tooltip: true }, { title: '客户名称', dataIndex: 'customer', width: 200, ellipsis: true, tooltip: true }, { title: '合同金额', dataIndex: 'amount', slotName: 'contractAmount', width: 120 }, - { title: '已收款金额', dataIndex: 'receivedAmount', slotName: 'receivedAmount', width: 120 }, - { title: '未收款金额', dataIndex: 'pendingAmount', width: 120 }, - { title: '签署日期', dataIndex: 'signDate', width: 120 }, - { title: '履约期限', dataIndex: 'performanceDeadline', width: 120 }, - { title: '付款日期', dataIndex: 'paymentDate', width: 120 }, + { title: '已结算金额', dataIndex: 'settlementAmount', slotName: 'settlementAmount', width: 120 }, + { title: '未结算金额', dataIndex: 'pendingAmount', width: 120 }, + { title: '签署日期', dataIndex: 'signDate', slotName: 'signDate', width: 120 }, + { title: '履约期限', dataIndex: 'performanceDeadline', slotName: 'performanceDeadline', width: 120 }, + { title: '付款日期', dataIndex: 'paymentDate', slotName: 'paymentDate', width: 120 }, { title: '合同状态', dataIndex: 'contractStatus', slotName: 'status', width: 100 }, { title: '销售人员', dataIndex: 'salespersonName', width: 100 }, { title: '销售部门', dataIndex: 'salespersonDeptName', width: 100 }, @@ -252,10 +265,10 @@ const fetchContractList = async () => { } } - // 计算未收款金额 + // 计算未结算金额(支出合同) dataList.value = filtered.map((item: ContractItem) => ({ ...item, - pendingAmount: (item.amount || 0) - (item.receivedAmount || 0), + pendingAmount: (item.amount || 0) - ((item.settlementAmount || item.receivedAmount || 0)), })) // 更新分页总数(前端过滤后以过滤结果数为准) @@ -284,11 +297,11 @@ const pagination = reactive({ // 获取状态颜色 const getStatusColor = (status: string) => { const colorMap: Record = { - 未确认: 'gray', - 待审批: 'orange', - 已签署: 'blue', + 未执行: 'gray', 执行中: 'cyan', - 已完成: 'green', + 验收中: 'arcoblue', + 结算中: 'orange', + 已结算: 'green', 已终止: 'red', } return colorMap[status] || 'gray' @@ -381,7 +394,7 @@ const openAddModal = () => { amount: 0, accountNumber: '', notes: '', - contractStatus: '未确认', + contractStatus: '未执行', contractText: '', projectName: '', salespersonName: null, @@ -477,8 +490,8 @@ const editRecord = (record: ContractItem) => { ...record, amount: record.amount || 0, projectId: record.projectId || '', - type: record.type || '收入合同', - contractStatus: record.contractStatus || '未确认', + type: record.type || '支出合同', + contractStatus: record.contractStatus || '未执行', } selectedContractData.value = completeRecord @@ -548,6 +561,91 @@ const handleEditSubmit = async () => { } } +// 合同结算 +const showSettlementModal = ref(false) +const settlementForm = reactive({ + // 核心字段 + contractId: '', + amount: 0, + paymentDate: '', + paymentPeriod: '', + notes: '', + // 其余接口可选字段(用于兼容接口入参) + accountNumber: '', + code: '', + customer: '', + departmentId: '', + duration: '', + productService: '', + projectId: '', + salespersonId: '', + settlementId: '', + settlementStatus: '', +}) +const settlementRecord = ref(null) +const openSettlement = (record: ContractItem) => { + if (record.contractStatus === '已结算') return + settlementRecord.value = record + Object.assign(settlementForm, { + // 核心 + contractId: record.contractId, + amount: record.amount || 0, + paymentDate: record.paymentDate || '', + paymentPeriod: '', + notes: '', + // 其余字段从合同记录回填,便于直接提交 + accountNumber: (record as any).accountNumber || '', + code: (record as any).code || '', + customer: (record as any).customer || '', + departmentId: (record as any).departmentId || '', + duration: (record as any).duration || '', + productService: (record as any).productService || '', + projectId: (record as any).projectId || '', + salespersonId: (record as any).salespersonId || '', + settlementId: (record as any).settlementId || '', + settlementStatus: (record as any).settlementStatus || '', + }) + showSettlementModal.value = true +} +const submitSettlement = async () => { + try { + const payload:any = { + accountNumber: settlementForm.accountNumber || '', + amount: settlementForm.amount, + code: settlementForm.code || '', + contractId: settlementForm.contractId, + customer: settlementForm.customer || '', + departmentId: settlementForm.departmentId || '', + duration: settlementForm.duration || '', + notes: settlementForm.notes || '', + paymentDate: settlementForm.paymentDate || null, + paymentPeriod: settlementForm.paymentPeriod || '', + productService: settlementForm.productService || '', + projectId: settlementForm.projectId || '', + salespersonId: settlementForm.salespersonId || '', + settlementId: settlementForm.settlementId || '', + settlementStatus: settlementForm.settlementStatus || '', + } + const res = await http.post('/contract-settlement', payload) + if (res.code === 200 || (res as any).status === 200) { + Message.success('合同结算成功') + // 根据未结算金额是否为 0 决定状态:0 => 已结算,否则保留/置为“结算中” + const origin = settlementRecord.value + const settledAmount = (origin?.settlementAmount ?? origin?.receivedAmount ?? 0) + (settlementForm.amount || 0) + const pendingAfter = Math.max((origin?.amount || 0) - settledAmount, 0) + const targetStatus = pendingAfter === 0 ? '已结算' : '结算中' + await http.put('/contract', { contractId: settlementForm.contractId, contractStatus: targetStatus, type: origin?.type || '支出合同' }) + showSettlementModal.value = false + search() + return true + } + Message.error(res.msg || '合同结算失败') + return false + } catch (e:any) { + Message.error(e?.message || '合同结算失败') + return false + } +} // 删除合同:只有在确认框点击确定后才执行删除 const deleteContract = (record: ContractItem) => { diff --git a/src/views/project-management/contract/revenue-contract/ContractEdit.vue b/src/views/project-management/contract/revenue-contract/ContractEdit.vue index f756e1b..d1a4ae5 100644 --- a/src/views/project-management/contract/revenue-contract/ContractEdit.vue +++ b/src/views/project-management/contract/revenue-contract/ContractEdit.vue @@ -35,11 +35,11 @@ - 未确认 - 待审批 - 已签署 + 未执行 执行中 - 已完成 + 验收中 + 结算中 + 已结算 已终止 diff --git a/src/views/project-management/contract/revenue-contract/index.vue b/src/views/project-management/contract/revenue-contract/index.vue index 6c70c57..eaa3b9a 100644 --- a/src/views/project-management/contract/revenue-contract/index.vue +++ b/src/views/project-management/contract/revenue-contract/index.vue @@ -48,18 +48,24 @@ ¥{{ (record.amount || 0).toLocaleString() }} - + + + + + + @@ -87,8 +93,6 @@ @update:contract-data="handleContractDataUpdate" /> - - + + + + + + + + + + +