From e7fd7f9059f25c6b702621b634c54b5756ca3bf4 Mon Sep 17 00:00:00 2001 From: wuweihua <88888888> Date: Thu, 12 Nov 2026 17:00:04 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=AE=A1=E8=B4=B9=E8=A7=84?= =?UTF-8?q?=E5=88=99=E6=B3=A8=E9=87=8A=EF=BC=8C=E6=96=B0=E5=A2=9E=E4=B8=89?= =?UTF-8?q?=E8=BE=B9=E8=A7=84=E5=88=99=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/PrcOrderBillServiceImpl.java | 2 +- .../system/service/IBmsBizRuleService.java | 2 +- .../service/impl/BmsBizRuleServiceImpl.java | 68 ++++++++++++++----- 3 files changed, 54 insertions(+), 18 deletions(-) diff --git a/bms-back/bms-system/src/main/java/com/bms/price/service/impl/PrcOrderBillServiceImpl.java b/bms-back/bms-system/src/main/java/com/bms/price/service/impl/PrcOrderBillServiceImpl.java index 5ae57441..1fe05347 100644 --- a/bms-back/bms-system/src/main/java/com/bms/price/service/impl/PrcOrderBillServiceImpl.java +++ b/bms-back/bms-system/src/main/java/com/bms/price/service/impl/PrcOrderBillServiceImpl.java @@ -3127,7 +3127,7 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService } /** - * 业务规则计费重量(VOL_8000 等)。 + * 业务规则计费重量(THREE_SIDE / VOL_8000)。 * 如需禁用:注释掉 resolveWeightByRule 调用,始终返回 baseWeight。 */ private BigDecimal applyBizRuleWeight(TmsPriceBillRequest request, BigDecimal baseWeight) diff --git a/bms-back/bms-system/src/main/java/com/bms/system/service/IBmsBizRuleService.java b/bms-back/bms-system/src/main/java/com/bms/system/service/IBmsBizRuleService.java index f2f17da3..1353209d 100644 --- a/bms-back/bms-system/src/main/java/com/bms/system/service/IBmsBizRuleService.java +++ b/bms-back/bms-system/src/main/java/com/bms/system/service/IBmsBizRuleService.java @@ -21,7 +21,7 @@ public interface IBmsBizRuleService int deleteByIds(Long[] ruleIds); /** - * 将生效的重量规则(目前为 VOL_8000)应用到计费请求。 + * 将生效的重量规则(THREE_SIDE / VOL_8000)应用到计费请求。 * @return 规则命中时返回覆盖后的计费重量;无规则适用时返回 null */ BigDecimal resolveWeightByRule(TmsPriceBillRequest request, BigDecimal systemWeight); diff --git a/bms-back/bms-system/src/main/java/com/bms/system/service/impl/BmsBizRuleServiceImpl.java b/bms-back/bms-system/src/main/java/com/bms/system/service/impl/BmsBizRuleServiceImpl.java index 253b3991..8fad44a9 100644 --- a/bms-back/bms-system/src/main/java/com/bms/system/service/impl/BmsBizRuleServiceImpl.java +++ b/bms-back/bms-system/src/main/java/com/bms/system/service/impl/BmsBizRuleServiceImpl.java @@ -136,8 +136,12 @@ public class BmsBizRuleServiceImpl implements IBmsBizRuleService { return null; } - // VOL_8000 在本地入库 / 计费时应用。THREE_SIDE 仅作为配置 - // (上游已应用该产品规则)。 + // 先三边之和取重,未命中再走 VOL_8000 + BigDecimal threeSide = resolveThreeSideWeight(request, systemWeight); + if (threeSide != null) + { + return threeSide; + } BigDecimal vol8000 = resolveVol8000(request, systemWeight); if (vol8000 != null) { @@ -146,6 +150,47 @@ public class BmsBizRuleServiceImpl implements IBmsBizRuleService return null; } + /** + * 三边之和取重:命中 THREE_SIDE 规则时, + * L+W+H < 上限取本地收货重;>= 上限取已有计费重。 + * + * @param existingChargeWeight 当前已有计费重(未被三边规则覆盖前) + * @return 命中规则时返回计费重;未命中返回 null + */ + private BigDecimal resolveThreeSideWeight(TmsPriceBillRequest request, BigDecimal existingChargeWeight) + { + List rules = bizRuleMapper.selectActiveByType(RULE_TYPE_THREE_SIDE); + if (rules == null || rules.isEmpty()) + { + return null; + } + for (BmsBizRule rule : rules) + { + if (!matchThreeSideDims(rule, request, existingChargeWeight)) + { + continue; + } + if (rule.getSideSumMax() == null) + { + continue; + } + BigDecimal sum = sideSum(request); + if (sum == null) + { + continue; + } + // 三边之和 < 上限(如 90):取本地收货重;无收货重则保留已有计费重 + if (sum.compareTo(rule.getSideSumMax()) < 0) + { + BigDecimal receiveWeight = firstPositive(request.getReceiveWeight()); + return receiveWeight != null ? receiveWeight : existingChargeWeight; + } + // 三边之和 >= 上限:保留已有计费重 + return existingChargeWeight; + } + return null; + } + /** * VOL_8000:chargeWeight = max(L*W*H/8000, receive_weight)。 * 将体积重(/8000)与收货重比较。 @@ -273,7 +318,10 @@ public class BmsBizRuleServiceImpl implements IBmsBizRuleService return new ArrayList(set); } - private boolean matchThreeSide(BmsBizRule rule, TmsPriceBillRequest request, BigDecimal systemWeight) + /** + * 三边规则维度匹配(不包含三边和阈值判断)。 + */ + private boolean matchThreeSideDims(BmsBizRule rule, TmsPriceBillRequest request, BigDecimal systemWeight) { if (rule == null) { @@ -292,19 +340,7 @@ public class BmsBizRuleServiceImpl implements IBmsBizRuleService return false; } BigDecimal checkWeight = firstPositive(request.getReceiveWeight(), systemWeight, request.getWeight()); - if (!inWeightRange(checkWeight, rule.getWeightMin(), rule.getWeightMax())) - { - return false; - } - if (rule.getSideSumMax() != null) - { - BigDecimal sum = sideSum(request); - if (sum == null || sum.compareTo(rule.getSideSumMax()) >= 0) - { - return false; - } - } - return true; + return inWeightRange(checkWeight, rule.getWeightMin(), rule.getWeightMax()); } private boolean dimMatch(String requestCode, String ruleCode, boolean tryProductMap)