feat(erp): 来票分摊合计允许小于来票金额,未分摊部分可后续编辑补充订单

- 分摊合计只校验不超过来票金额;小于时允许保存,差额显示为待分摊(橙色提示)
- 超出时保存拦截,提示超出金额与处理动作

Co-Authored-By: Claude Code <noreply@anthropic.com>
已修改2个文件
22 ■■■■■ 文件已修改
src/views/erp/purchase/invoice/modules/form.vue 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/erp/purchase/invoice/modules/order-allocation-field.vue 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/erp/purchase/invoice/modules/form.vue
@@ -57,21 +57,22 @@
    }
    modalApi.lock();
    const data = (await formApi.getValues()) as ErpPurchaseInvoiceApi.PurchaseInvoice;
    // 校验采购订单分摊:至少一张订单,且分摊合计 = 来票金额
    // 校验采购订单分摊:至少一张订单,分摊合计不能大于来票金额(允许小于,未分摊部分可后续编辑补充订单)
    const allocations = data.orderAllocations ?? [];
    if (allocations.length === 0) {
      modalApi.unlock();
      message.error('请至少选择一张采购订单,并把来票金额分摊到订单上');
      message.error('请至少选择一张采购订单');
      return;
    }
    const allocationTotal = allocations.reduce(
      (sum, row) => sum + Number(row.price ?? 0),
      0,
    );
    if (Math.abs(allocationTotal - Number(data.price ?? 0)) > 0.001) {
    const invoicePrice = Number(data.price ?? 0);
    if (allocationTotal - invoicePrice > 0.001) {
      modalApi.unlock();
      message.error(
        `各采购订单分摊合计 ${allocationTotal.toFixed(2)} 元与来票金额 ${Number(data.price ?? 0).toFixed(2)} 元不一致,请点击「自动分摊」或调整分摊金额`,
        `各采购订单分摊合计 ${allocationTotal.toFixed(2)} 元大于来票金额 ${invoicePrice.toFixed(2)} 元(超出 ${(allocationTotal - invoicePrice).toFixed(2)} 元),请减少分摊金额或提高来票金额`,
      );
      return;
    }
src/views/erp/purchase/invoice/modules/order-allocation-field.vue
@@ -360,7 +360,7 @@
        自动分摊
      </Button>
      <span class="text-xs text-gray-400">
        一张来票可关联同一供应商的多张采购订单;默认按未开票金额自动分摊,可手工调整
        一张来票可关联同一供应商的多张采购订单;分摊合计不能大于来票金额,未分摊部分可后续编辑补充
      </span>
    </div>
    <Table
@@ -419,8 +419,17 @@
      <span>
        来票金额:<span class="font-medium">{{ formatAmount(invoicePrice) }}</span> 元
      </span>
      <span :class="diff === 0 ? 'text-green-600' : 'text-red-500'">
      <span
        :class="
          diff < 0
            ? 'text-red-500'
            : diff === 0
              ? 'text-green-600'
              : 'text-orange-500'
        "
      >
        待分摊差额:<span class="font-medium">{{ formatAmount(diff) }}</span> 元
        <span v-if="diff > 0" class="text-xs">(未分摊,可保存后编辑补充订单)</span>
      </span>
    </div>