diff --git a/mhd_oms/src/main/java/com/mhd/oms/application/service/businessDocumentOrder/BusinessDocumentOrderAdjustService.java b/mhd_oms/src/main/java/com/mhd/oms/application/service/businessDocumentOrder/BusinessDocumentOrderAdjustService.java index 26aa5a696..fc5e56476 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/application/service/businessDocumentOrder/BusinessDocumentOrderAdjustService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/application/service/businessDocumentOrder/BusinessDocumentOrderAdjustService.java @@ -48,8 +48,15 @@ import java.util.stream.Collectors; * 2. 费用数据源 = 前端回传的费用明细 business_order_account(feeDetailList); * 主表金额 deliveryFreight 为其 amount 合计(冗余汇总,后端自动算)。 * 3. 是否需审核:一旦任一「金额」发生变化 - * = feeDetailList 明细 amount 变化,或主表金额列变化 -> 走业务主管审核; + * = feeDetailList 明细 amount 变化,或主表金额/费用列变化 -> 走业务主管审核; * 否则(仅改非金额字段) -> 直通。 + * 「金额/费用」字段涵盖: deliveryFreight / collectedFreight / uncollectedFreight / + * collectLessFreight / transportationUnitPrice / infoFee / freightUnitPrice / + * cargoInsuranceAmount / freightCharges / freightFee / unloadingFee / customsFee / + * shortageFee / miscellaneousFee / otherFee / detentionFee,以及 settlementCurrency / + * paymentAccountId / accountName / accountInformation(结算币种+收款账户任一变化即视为费用变更)。 + * 判定口径: 以后端兜底比对为准(主表金额/费用列 + 明细 amount 合计), + * 前端 amountChanged 仅作提示;后端比对结果与前端 OR 运算,避免前端误传 false 绕过审核。 * 4. 涉及金额提交 -> 仅把业务单 review_status 置为「调整待审核(3)」;主记录 AUDIT_STATUS=0(待审核); * 不更新业务单数据,不影响其它状态(order_status / execute_status 不动)。 * 5. 审核通过 -> 覆盖业务单(金额) + 替换费用明细;review_status 一律置为 1(已审核), @@ -57,7 +64,6 @@ import java.util.stream.Collectors; * 审核驳回 -> 不更新业务单数据,review_status 还原为调整前值(主记录 before_review_status),可再次调整。 * 6. 直通(未改金额) -> 覆盖业务单可编辑字段 + deliveryFreight(明细合计),并替换 business_order_account * (逻辑删旧 is_delete=1 + 插新 is_delete=0);不改动任何审核/执行状态。 - * 7. 前端以 amountChanged 告知是否改金额(默认前端判定);未传时后端兜底比对。 * * 说明:review_status 原枚举 0未审/1通过/2驳回,新增 3=调整待审核;不改变原有用例。 * @@ -72,12 +78,17 @@ public class BusinessDocumentOrderAdjustService { private static final Integer AUDIT_PASS = 1; // 调整记录:审核通过 private static final Integer AUDIT_REJECT = 2; // 调整记录:驳回 - /** 主表金额(费用)字段,任一变化触发审核 */ + /** 主表金额(费用)字段,任一变化触发审核 + * 含: 运费相关 8 项 + 其他费用 8 项 + 结算币种 + 收款账户(3 字段) + * 任意一项变化即需要审核(对应前端"费用合计 / 运费 / 装卸费 / 仓租及柜租(走明细) / + * 保险 / 压车(走明细) / 运输处理费(走明细) / 报关费 / 其他 / 费用合计 / 结算币种 / 收款账户") */ private static final List FEE_FIELDS = Arrays.asList( "deliveryFreight", "collectedFreight", "uncollectedFreight", "collectLessFreight", "transportationUnitPrice", "infoFee", "freightUnitPrice", "cargoInsuranceAmount", "freightCharges", "freightFee", "unloadingFee", "customsFee", "shortageFee", - "miscellaneousFee", "otherFee", "detentionFee"); + "miscellaneousFee", "otherFee", "detentionFee", + // 结算币种 + 收款账户 任一变化也视为费用变更,需审核 + "settlementCurrency", "paymentAccountId", "accountName", "accountInformation"); /** 不允许被前端调整覆盖的系统字段 */ private static final List PROTECTED_FIELDS = Arrays.asList( @@ -159,14 +170,10 @@ public class BusinessDocumentOrderAdjustService { afterOrder.setDeliveryFreight(sum); } - // 5. 判定是否修改了金额:以前端 amountChanged 为准(前端整单回传已自行判定); - // 若前端未传则后端兜底比对(主表金额列 或 明细 amount 变化) - boolean amountChanged; - if (dto.getAmountChanged() != null) { - amountChanged = dto.getAmountChanged(); - } else { - amountChanged = isAmountChanged(dbOrder, front, hasFeeDetail, dbFeeList, newFeeList); - } + // 5. 判定是否修改了金额:以后端兜底比对为准,避免前端误传 false 绕过审核; + // 前端传 true 也尊重;后端比对结果与前端 OR 运算(任一为真则需审核)。 + boolean backendChanged = isAmountChanged(dbOrder, front, hasFeeDetail, dbFeeList, newFeeList); + boolean amountChanged = backendChanged || Boolean.TRUE.equals(dto.getAmountChanged()); // 6. 写主记录 LoginUser loginUser = SecurityUtils.getLoginUser();