gaoluyang
2 天以前 8b0476cb0cbd4baa4ab1214f4f9481bafe0a7db6
feat(erp): 付款单合计付款支持手动修改

合计付款由明细自动计算后仍可编辑(详情页只读),修改后重算实际付款;回显明细时不再覆盖手动修改值。

Co-Authored-By: Claude Code <noreply@anthropic.com>
已修改3个文件
21 ■■■■■ 文件已修改
src/views/erp/finance/payment/data.ts 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/erp/finance/payment/modules/form.vue 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/erp/finance/payment/modules/item-form.vue 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/erp/finance/payment/data.ts
@@ -168,7 +168,8 @@
        placeholder: '合计付款',
        precision: 2,
        formatter: erpPriceInputFormatter,
        disabled: true,
        // 由付款明细自动计算,也允许用户按实际情况手动修改
        disabled: formType === 'detail',
      },
    },
    {
src/views/erp/finance/payment/modules/form.vue
@@ -73,6 +73,15 @@
        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;
src/views/erp/finance/payment/modules/item-form.vue
@@ -51,6 +51,9 @@
const tableData = ref<ErpFinancePaymentApi.FinancePaymentItem[]>([]); // 表格数据
/** 回显父组件传入的明细时跳过总额重算,避免覆盖用户手动修改的合计付款 */
const skipTotalCalc = ref(false);
/** 已根据该来票生成的明细,避免重复生成 */
const generatedInvoiceId = ref<number | undefined>();
@@ -100,11 +103,14 @@
    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,
@@ -146,6 +152,9 @@
watch(
  () => [tableData.value, props.discountPrice],
  () => {
    if (skipTotalCalc.value) {
      return;
    }
    if (!tableData.value || tableData.value.length === 0) {
      return;
    }