From 93dbc226037f8a7b8b9c3e2079756f9c850f6dbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E5=BF=A0=E6=9E=97?= <170083662@qq.com> Date: Sat, 7 Mar 2026 01:58:28 +0800 Subject: [PATCH] =?UTF-8?q?refactor(task):=20=E7=BB=9F=E4=B8=80=E4=BD=A3?= =?UTF-8?q?=E9=87=91=E5=88=86=E7=BA=A2=E6=9C=AF=E8=AF=AD=E4=B8=BA=E5=88=86?= =?UTF-8?q?=E6=B6=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将"分红"相关术语统一替换为"分润",包括日志信息中的"未找到分红账号"改为"未找到分润账号" - 修改注释中"门店分红上级"为"门店分润上级","总经销商分润"为"分润" - 更新佣金计算相关注释和日志信息,将"直推佣金"、"门店直推佣金"等统一为"分佣"、"门店直推分润" - 修正ShopDealerOrder数据回填逻辑中的术语表述,将"门店分红字段"改为"门店分润字段" - 调整门店分润规则注释和订单记录落字段说明,统一使用分润概念 --- .../task/DealerOrderSettlement10584Task.java | 32 +++++++++--------- websoft-modules.log.2026-03-02.0.gz | Bin 8989 -> 0 bytes 2 files changed, 16 insertions(+), 16 deletions(-) delete mode 100644 websoft-modules.log.2026-03-02.0.gz diff --git a/src/main/java/com/gxwebsoft/glt/task/DealerOrderSettlement10584Task.java b/src/main/java/com/gxwebsoft/glt/task/DealerOrderSettlement10584Task.java index d74f4c1..3dc3368 100644 --- a/src/main/java/com/gxwebsoft/glt/task/DealerOrderSettlement10584Task.java +++ b/src/main/java/com/gxwebsoft/glt/task/DealerOrderSettlement10584Task.java @@ -105,7 +105,7 @@ public class DealerOrderSettlement10584Task { DealerBasicSetting dealerBasicSetting = findDealerBasicSetting(); ShopDealerUser totalDealerUser = findTotalDealerUser(); if (totalDealerUser == null || totalDealerUser.getUserId() == null) { - log.warn("未找到总经销商账号,订单仍可结算但不会发放总经销商分润 - tenantId={}", TENANT_ID); + log.warn("未找到分红账号,订单仍可结算但不会发放分红 - tenantId={}", TENANT_ID); } log.debug("租户{}分销设置 - level={}", TENANT_ID, dealerBasicSetting.level); @@ -201,10 +201,10 @@ public class DealerOrderSettlement10584Task { // 1) 直推/间推(shop_dealer_referee) DealerRefereeCommission dealerRefereeCommission = settleDealerRefereeCommission(order, baseAmount, goodsQty, commissionConfig, dealerLevel); - // 2) 门店分红上级:从下单用户开始逐级向上找,命中 ShopDealerUser.type=1 的最近两级(直推门店/间推门店)。 + // 2) 门店分润上级:从下单用户开始逐级向上找,命中 ShopDealerUser.type=1 的最近两级(直推门店/间推门店)。 ShopRoleCommission shopRoleCommission = settleShopRoleRefereeCommission(order, baseAmount, goodsQty, commissionConfig, level1ParentCache, shopRoleCache); - // 3) 总经销商分润:固定比率,每个订单都分。 + // 3) 分红:固定比率,每个订单都分。 TotalDealerCommission totalDealerCommission = settleTotalDealerCommission(order, baseAmount, goodsQty, totalDealerUser); // 4) 写入分销订单记录(用于排查/统计;详细分佣以 ShopDealerCapital 为准) @@ -265,7 +265,7 @@ public class DealerOrderSettlement10584Task { directMoney, order, order.getUserId(), - buildCommissionComment("直推佣金", commissionConfig.commissionType, commissionConfig.dealerDirectValue, goodsQty) + buildCommissionComment("分佣", commissionConfig.commissionType, commissionConfig.dealerDirectValue, goodsQty) ); } if (normalizedLevel >= 2) { @@ -320,7 +320,7 @@ public class DealerOrderSettlement10584Task { Map shopRoleCache ) { List shopRoleReferees = findFirstTwoShopRoleReferees(order.getUserId(), level1ParentCache, shopRoleCache); - log.info("门店分红命中结果(type=1门店角色取前两级) - orderNo={}, buyerUserId={}, shopRoleReferees={}", + log.info("门店分润命中结果(type=1门店角色取前两级) - orderNo={}, buyerUserId={}, shopRoleReferees={}", order.getOrderNo(), order.getUserId(), shopRoleReferees); if (shopRoleReferees.isEmpty()) { return ShopRoleCommission.empty(); @@ -330,14 +330,14 @@ public class DealerOrderSettlement10584Task { // 仅找到一个门店:按(直推+间推)汇总发放 BigDecimal singleStoreValue = safeValue(commissionConfig.storeDirectValue).add(safeValue(commissionConfig.storeSimpleValue)); BigDecimal money = calcMoneyByCommissionType(baseAmount, singleStoreValue, goodsQty, DIVIDEND_SCALE, commissionConfig.commissionType); - log.info("分红发放(仅1门店) - orderNo={}, firstDividendUserId={}, commissionType={}, value={}, money={}", + log.info("分润发放(仅1门店) - orderNo={}, firstDividendUserId={}, commissionType={}, value={}, money={}", order.getOrderNo(), shopRoleReferees.get(0), commissionConfig.commissionType, singleStoreValue, money); creditDealerCommission( shopRoleReferees.get(0), money, order, order.getUserId(), - buildCommissionComment("门店直推佣金(仅1门店)", commissionConfig.commissionType, singleStoreValue, goodsQty) + buildCommissionComment("门店直推分润(仅1门店)", commissionConfig.commissionType, singleStoreValue, goodsQty) ); return new ShopRoleCommission(shopRoleReferees.get(0), money, null, BigDecimal.ZERO); } @@ -347,7 +347,7 @@ public class DealerOrderSettlement10584Task { calcMoneyByCommissionType(baseAmount, commissionConfig.storeDirectValue, goodsQty, DIVIDEND_SCALE, commissionConfig.commissionType); BigDecimal storeSimpleMoney = calcMoneyByCommissionType(baseAmount, commissionConfig.storeSimpleValue, goodsQty, DIVIDEND_SCALE, commissionConfig.commissionType); - log.info("分红发放(2人) - orderNo={}, firstDividendUserId={}, commissionType={}, firstValue={}, firstMoney={}, secondDividendUserId={}, secondValue={}, secondMoney={}", + log.info("分润发放(2人) - orderNo={}, firstDividendUserId={}, commissionType={}, firstValue={}, firstMoney={}, secondDividendUserId={}, secondValue={}, secondMoney={}", order.getOrderNo(), shopRoleReferees.get(0), commissionConfig.commissionType, @@ -361,14 +361,14 @@ public class DealerOrderSettlement10584Task { storeDirectMoney, order, order.getUserId(), - buildCommissionComment("门店直推佣金", commissionConfig.commissionType, commissionConfig.storeDirectValue, goodsQty) + buildCommissionComment("门店直推分润", commissionConfig.commissionType, commissionConfig.storeDirectValue, goodsQty) ); creditDealerCommission( shopRoleReferees.get(1), storeSimpleMoney, order, order.getUserId(), - buildCommissionComment("门店间推佣金", commissionConfig.commissionType, commissionConfig.storeSimpleValue, goodsQty) + buildCommissionComment("门店间推分润", commissionConfig.commissionType, commissionConfig.storeSimpleValue, goodsQty) ); return new ShopRoleCommission(shopRoleReferees.get(0), storeDirectMoney, shopRoleReferees.get(1), storeSimpleMoney); } @@ -387,14 +387,14 @@ public class DealerOrderSettlement10584Task { rate = TOTAL_DEALER_DIVIDEND_RATE; } BigDecimal money = calcMoneyByCommissionType(baseAmount, rate, goodsQty, DIVIDEND_SCALE, 20); - log.info("总经销商分润发放 - orderNo={}, totalDealerUserId={}, rate={}, money={}", + log.info("分红发放 - orderNo={}, totalDealerUserId={}, rate={}, money={}", order.getOrderNo(), totalDealerUser.getUserId(), rate, money); creditDealerCommission( totalDealerUser.getUserId(), money, order, order.getUserId(), - buildCommissionComment("总经销商分润", 20, rate, goodsQty) + buildCommissionComment("分红", 20, rate, goodsQty) ); return new TotalDealerCommission(totalDealerUser.getUserId(), money); } @@ -451,7 +451,7 @@ public class DealerOrderSettlement10584Task { } /** - * 门店分红规则: + * 门店分润规则: * - 门店角色为 ShopDealerUser.type=1; * - 从下单用户开始,沿 shop_dealer_referee(level=1) 链路逐级向上找; * - 遇到第一个 type=1 用户命中为“直推门店用户”,继续向上找到第二个 type=1 用户命中为“间推门店用户”。 @@ -641,7 +641,7 @@ public class DealerOrderSettlement10584Task { .last("limit 1") ); if (existed != null) { - // 允许“补发”门店分佣时回填分红字段,避免订单已结算但分红字段一直为空,影响排查/对账。 + // 允许“补发”门店分润时回填分润字段,避免订单已结算但分润字段一直为空,影响排查/对账。 LambdaUpdateWrapper uw = new LambdaUpdateWrapper() .eq(ShopDealerOrder::getTenantId, TENANT_ID) .eq(ShopDealerOrder::getOrderNo, order.getOrderNo()); @@ -676,7 +676,7 @@ public class DealerOrderSettlement10584Task { } if (needUpdate) { shopDealerOrderService.update(uw); - log.info("ShopDealerOrder已存在,回填门店分红字段 - orderNo={}, firstDividendUser={}, secondDividendUser={}", + log.info("ShopDealerOrder已存在,回填门店分润字段 - orderNo={}, firstDividendUser={}, secondDividendUser={}", order.getOrderNo(), shopRoleCommission.storeDirectUserId, shopRoleCommission.storeSimpleUserId); } else { log.info("ShopDealerOrder已存在,跳过写入 - orderNo={}", order.getOrderNo()); @@ -697,7 +697,7 @@ public class DealerOrderSettlement10584Task { dealerOrder.setThirdUserId(dealerRefereeCommission.thirdDealerId); dealerOrder.setThirdMoney(dealerRefereeCommission.thirdMoney); - // 门店(角色shop)两级分红单独落字段(详细以 ShopDealerCapital 为准) + // 门店(角色shop)两级分润单独落字段(详细以 ShopDealerCapital 为准) dealerOrder.setFirstDividendUser(shopRoleCommission.storeDirectUserId); dealerOrder.setFirstDividend(shopRoleCommission.storeDirectMoney); dealerOrder.setSecondDividendUser(shopRoleCommission.storeSimpleUserId); diff --git a/websoft-modules.log.2026-03-02.0.gz b/websoft-modules.log.2026-03-02.0.gz deleted file mode 100644 index c12dc03d8b3f3c162cdf31af8180e2e837f8ef2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8989 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 F{{>;0=Rg1e