feat(erp): 付款单合计付款支持手动修改
合计付款由明细自动计算后仍可编辑(详情页只读),修改后重算实际付款;回显明细时不再覆盖手动修改值。
Co-Authored-By: Claude Code <noreply@anthropic.com>
| | |
| | | placeholder: '合计付款', |
| | | precision: 2, |
| | | formatter: erpPriceInputFormatter, |
| | | disabled: true, |
| | | // 由付款明细自动计算,也允许用户按实际情况手动修改 |
| | | disabled: formType === 'detail', |
| | | }, |
| | | }, |
| | | { |
| | |
| | | formData.value.invoiceId = values.invoiceId; |
| | | handleInvoiceChange(values.invoiceId); |
| | | } |
| | | // 合计付款由明细自动计算,也允许用户手动修改;修改后重新计算实际付款 |
| | | if (changedFields.includes('totalPrice')) { |
| | | formData.value.totalPrice = values.totalPrice ?? 0; |
| | | formData.value.paymentPrice = |
| | | formData.value.totalPrice - (values.discountPrice || 0); |
| | | formApi.setValues({ |
| | | paymentPrice: formData.value.paymentPrice, |
| | | }); |
| | | } |
| | | // 目的:同步到 item-form 组件,触发整体的价格计算 |
| | | if (changedFields.includes('discountPrice')) { |
| | | formData.value.discountPrice = values.discountPrice; |
| | |
| | | |
| | | const tableData = ref<ErpFinancePaymentApi.FinancePaymentItem[]>([]); // 表格数据 |
| | | |
| | | /** 回显父组件传入的明细时跳过总额重算,避免覆盖用户手动修改的合计付款 */ |
| | | const skipTotalCalc = ref(false); |
| | | |
| | | /** 已根据该来票生成的明细,避免重复生成 */ |
| | | const generatedInvoiceId = ref<number | undefined>(); |
| | | |
| | |
| | | if (!items) { |
| | | return; |
| | | } |
| | | // 父组件回显明细时只刷新表格,不重算总额(合计付款允许手动修改) |
| | | skipTotalCalc.value = true; |
| | | tableData.value = [...items]; |
| | | // 编辑回显时,标记已根据当前来票生成过,避免重复生成 |
| | | generatedInvoiceId.value = props.invoice?.id; |
| | | await nextTick(); // 特殊:保证 gridApi 已经初始化 |
| | | await gridApi.grid.reloadData(tableData.value); |
| | | skipTotalCalc.value = false; |
| | | }, |
| | | { |
| | | immediate: true, |
| | |
| | | watch( |
| | | () => [tableData.value, props.discountPrice], |
| | | () => { |
| | | if (skipTotalCalc.value) { |
| | | return; |
| | | } |
| | | if (!tableData.value || tableData.value.length === 0) { |
| | | return; |
| | | } |