From 97db34f141fc7bce351a2ef0d79ef33a9ce28821 Mon Sep 17 00:00:00 2001 From: xm <1350250847@qq.com> Date: Fri, 5 Jun 2026 17:31:19 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E6=8B=86=E5=88=86=E9=97=A8=E5=BA=97?= =?UTF-8?q?=E3=80=81=E6=9C=8D=E5=8A=A1=E5=95=86=E8=A7=92=E8=89=B2=E5=8F=8A?= =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=AF=B9=E5=BA=94=E8=AE=A2=E5=8D=95=E8=AE=A1?= =?UTF-8?q?=E7=AE=97=E7=AE=97=E6=B3=95=202=E3=80=81=E6=8E=A8=E8=8D=90?= =?UTF-8?q?=E4=BA=BA=E5=85=B3=E7=B3=BB=E5=88=97=E8=A1=A8=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=A0=87=E8=AE=B0=EF=BC=8C=E6=96=B9=E4=BE=BF?= =?UTF-8?q?=E5=90=8E=E6=9C=9F=E6=95=B0=E6=8D=AE=E7=A1=95=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../task/DealerOrderSettlement10584Task.java | 85 +++++++--------- .../com/gxwebsoft/glt/vo/UserRelationVO.java | 16 +++ .../controller/ShopDealerUserController.java | 2 +- .../shop/entity/ShopDealerReferee.java | 10 +- .../gxwebsoft/shop/entity/ShopDealerUser.java | 2 +- .../mapper/xml/ShopDealerRefereeMapper.xml | 12 +-- .../shop/service/ShopDealerUserService.java | 10 ++ .../impl/ShopDealerUserServiceImpl.java | 99 +++++++++++++++++++ 8 files changed, 174 insertions(+), 62 deletions(-) create mode 100644 src/main/java/com/gxwebsoft/glt/vo/UserRelationVO.java diff --git a/src/main/java/com/gxwebsoft/glt/task/DealerOrderSettlement10584Task.java b/src/main/java/com/gxwebsoft/glt/task/DealerOrderSettlement10584Task.java index 882a258..2f18796 100644 --- a/src/main/java/com/gxwebsoft/glt/task/DealerOrderSettlement10584Task.java +++ b/src/main/java/com/gxwebsoft/glt/task/DealerOrderSettlement10584Task.java @@ -11,6 +11,7 @@ import com.gxwebsoft.common.system.mapper.UserMapper; import com.gxwebsoft.common.system.redis.OrderNoUtils; import com.gxwebsoft.glt.entity.GltTicketTemplate; import com.gxwebsoft.glt.service.GltTicketTemplateService; +import com.gxwebsoft.glt.vo.UserRelationVO; import com.gxwebsoft.shop.dto.ShopDealerSettlementDto; import com.gxwebsoft.shop.dto.ShopDealerSettlementItemDto; import com.gxwebsoft.shop.dto.ShopDealerUserReduceDto; @@ -202,7 +203,7 @@ public class DealerOrderSettlement10584Task { if (!claimOrderToSettle(order.getOrderId(), waterFormIds)) { return; } - settleOneOrderV2(order, level1ParentCache, shopRoleCache, totalDealerUser, dealerBasicSetting.level); + settleOneOrderV2(order, dealerBasicSetting.level); }); } catch (Exception e) { log.error("订单结算失败,将回滚本订单并在下次任务重试 - orderId={}, orderNo={}", order.getOrderId(), order.getOrderNo(), e); @@ -236,7 +237,7 @@ public class DealerOrderSettlement10584Task { if (!claimOrderToSettleV2(order.getOrderId())) { return; } - settleOneOrderV2(order, level1ParentCache, shopRoleCache, totalDealerUser, dealerBasicSetting.level); + settleOneOrderV2(order, dealerBasicSetting.level); }); } } @@ -428,8 +429,7 @@ public class DealerOrderSettlement10584Task { log.info("订单结算完成 - orderId={}, orderNo={}, baseAmount={}", order.getOrderId(), order.getOrderNo(), baseAmount); } - private void settleOneOrderV2(ShopOrder order, Map level1ParentCache, Map shopRoleCache, - ShopDealerUser totalDealerUser, int dealerLevel) { + private void settleOneOrderV2(ShopOrder order, int dealerLevel) { if (order.getUserId() == null || order.getOrderNo() == null) { throw new IllegalStateException("订单关键信息缺失,无法结算 - orderId=" + order.getOrderId()); } @@ -451,11 +451,7 @@ public class DealerOrderSettlement10584Task { // 2) 门店分润上级:从下单用户开始逐级向上找,命中 ShopDealerUser.type=1 的最近两级(直推门店/间推门店)【只统计数据,不对分销账户进行处理, // 已日结形式,统计分销记录表:shop_dealer_order 做对应一级二级管理津贴结算】 - ShopRoleCommission shopRoleCommission = settleShopRoleRefereeCommissionV2(order, rate, orderGoodsVOList, level1ParentCache, shopRoleCache); - -// // 3) 分红:固定比率,每个订单都分 -// int goodsQty = orderGoodsVOList.stream().mapToInt(ShopOrderGoodsVO::getTotalNum).sum(); -// TotalDealerCommission totalDealerCommission = settleTotalDealerCommissionV2(order, goodsQty, totalDealerUser); + ShopRoleCommission shopRoleCommission = settleShopRoleRefereeCommissionV2(order, rate, orderGoodsVOList); // 3) 写入分销订单记录(用于排查/统计;详细分佣以 ShopDealerCapital 为准) createDealerOrderRecordV2(order, dealerRefereeCommission, shopRoleCommission); @@ -594,13 +590,13 @@ public class DealerOrderSettlement10584Task { //一级分销员存在(type = 0)且单项实付金额大于0及商品设置了一级分销比例/金额 if(finalDirectDealerId != null && itemRatePrice.compareTo(BigDecimal.ZERO) > 0 && firstMoney.compareTo(BigDecimal.ZERO) > 0){ - BigDecimal one = calcMoneyByCommissionType(itemRatePrice, firstMoney, orderGoodsVO.getTotalNum(), 2, orderGoodsVO.getCommissionType()); + BigDecimal one = calcMoneyByCommissionType(itemRatePrice, firstMoney, orderGoodsVO.getTotalNum(), 3, orderGoodsVO.getCommissionType()); directMoney.accumulateAndGet(one, BigDecimal::add); } //一级分销员存在(type = 0)且单项实付金额大于0及商品设置了一级分销比例/金额 if(finalSimpleDealerId != null && itemRatePrice.compareTo(BigDecimal.ZERO) > 0 && secondMoney.compareTo(BigDecimal.ZERO) > 0 ){ - BigDecimal two = calcMoneyByCommissionType(itemRatePrice, secondMoney, orderGoodsVO.getTotalNum(), 2, orderGoodsVO.getCommissionType()); + BigDecimal two = calcMoneyByCommissionType(itemRatePrice, secondMoney, orderGoodsVO.getTotalNum(), 3, orderGoodsVO.getCommissionType()); simpleMoney.accumulateAndGet(two, BigDecimal::add); } }); @@ -716,52 +712,39 @@ public class DealerOrderSettlement10584Task { return new ShopRoleCommission(shopRoleReferees.get(0), storeDirectMoney, shopRoleReferees.get(1), storeSimpleMoney); } - private ShopRoleCommission settleShopRoleRefereeCommissionV2(ShopOrder order, BigDecimal rate, List orderGoodsVOList, Map level1ParentCache, Map shopRoleCache) { - List shopRoleReferees = findFirstTwoShopRoleReferees(order.getUserId(), level1ParentCache, shopRoleCache); - log.info("门店分润命中结果(type=1门店角色取前两级) - orderNo={}, buyerUserId={}, shopRoleReferees={}", - order.getOrderNo(), order.getUserId(), shopRoleReferees); - if (shopRoleReferees.isEmpty()) { + private ShopRoleCommission settleShopRoleRefereeCommissionV2(ShopOrder order, BigDecimal rate, List orderGoodsVOList) { + UserRelationVO userSuperior = shopDealerUserService.getUserSuperior(order.getUserId()); + Integer storeDirectUserId = userSuperior.getStoreUserId(); + Integer storeSimpleUserId = userSuperior.getServiceUserId(); + + if(storeDirectUserId == null && storeSimpleUserId == null){ return ShopRoleCommission.empty(); } - if(CollectionUtils.isNotEmpty(shopRoleReferees)){ - Integer storeDirectUserId; - Integer storeSimpleUserId = null; - AtomicReference storeDirectMoney = new AtomicReference<>(BigDecimal.ZERO); - AtomicReference storeSimpleMoney = new AtomicReference<>(BigDecimal.ZERO); + AtomicReference storeDirectMoney = new AtomicReference<>(BigDecimal.ZERO); + AtomicReference storeSimpleMoney = new AtomicReference<>(BigDecimal.ZERO); - if(shopRoleReferees.size() == 1){ - storeDirectUserId = shopRoleReferees.get(0); - }else { - storeDirectUserId = shopRoleReferees.get(0); - storeSimpleUserId = shopRoleReferees.get(1); + Integer finalStoreDirectUserId = storeDirectUserId; + Integer finalStoreSimpleUserId = storeSimpleUserId; + orderGoodsVOList.forEach(orderGoodsVO ->{ + //获取商品对应服务商管理费分润比例/金额 + BigDecimal firstMoney = orderGoodsVO.getFirstDividend(); + BigDecimal secondMoney = orderGoodsVO.getSecondDividend(); + + //按实付比例计算单项应参与分润金额 + BigDecimal itemRatePrice = orderGoodsVO.getPrice().multiply(BigDecimal.valueOf(orderGoodsVO.getTotalNum())).multiply(rate); + + if(finalStoreDirectUserId != null && itemRatePrice.compareTo(BigDecimal.ZERO) > 0){ + BigDecimal one = calcMoneyByCommissionType(itemRatePrice, firstMoney, orderGoodsVO.getTotalNum(), 3, orderGoodsVO.getCommissionType()); + storeDirectMoney.accumulateAndGet(one, BigDecimal::add); } - - Integer finalStoreDirectUserId = storeDirectUserId; - Integer finalStoreSimpleUserId = storeSimpleUserId; - orderGoodsVOList.forEach(orderGoodsVO ->{ - //获取商品对应服务商管理费分润比例/金额 - BigDecimal firstMoney = orderGoodsVO.getFirstDividend(); - BigDecimal secondMoney = orderGoodsVO.getSecondDividend(); - - //按实付比例计算单项应参与分润金额 - BigDecimal itemRatePrice = orderGoodsVO.getPrice().multiply(BigDecimal.valueOf(orderGoodsVO.getTotalNum())).multiply(rate); - - if(finalStoreDirectUserId != null && itemRatePrice.compareTo(BigDecimal.ZERO) > 0){ - BigDecimal one = calcMoneyByCommissionType(itemRatePrice, firstMoney, orderGoodsVO.getTotalNum(), 2, orderGoodsVO.getCommissionType()); - storeDirectMoney.accumulateAndGet(one, BigDecimal::add); - } - - if(finalStoreSimpleUserId != null && itemRatePrice.compareTo(BigDecimal.ZERO) > 0){ - BigDecimal two = calcMoneyByCommissionType(itemRatePrice, secondMoney, orderGoodsVO.getTotalNum(), 2, orderGoodsVO.getCommissionType()); - storeSimpleMoney.accumulateAndGet(two, BigDecimal::add); - } - }); - return new ShopRoleCommission(storeDirectUserId, storeDirectMoney.get(), storeSimpleUserId, storeSimpleMoney.get()); - }else { - return null; - } + if(finalStoreSimpleUserId != null && itemRatePrice.compareTo(BigDecimal.ZERO) > 0){ + BigDecimal two = calcMoneyByCommissionType(itemRatePrice, secondMoney, orderGoodsVO.getTotalNum(), 3, orderGoodsVO.getCommissionType()); + storeSimpleMoney.accumulateAndGet(two, BigDecimal::add); + } + }); + return new ShopRoleCommission(storeDirectUserId, storeDirectMoney.get(), storeSimpleUserId, storeSimpleMoney.get()); } private TotalDealerCommission settleTotalDealerCommission( diff --git a/src/main/java/com/gxwebsoft/glt/vo/UserRelationVO.java b/src/main/java/com/gxwebsoft/glt/vo/UserRelationVO.java new file mode 100644 index 0000000..66b3a8a --- /dev/null +++ b/src/main/java/com/gxwebsoft/glt/vo/UserRelationVO.java @@ -0,0 +1,16 @@ +package com.gxwebsoft.glt.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class UserRelationVO { + @Schema(description = "当前用户ID") + private Integer userId; + + @Schema(description = "上级门店ID") + private Integer storeUserId; + + @Schema(description = "上级服务商ID") + private Integer serviceUserId; +} diff --git a/src/main/java/com/gxwebsoft/shop/controller/ShopDealerUserController.java b/src/main/java/com/gxwebsoft/shop/controller/ShopDealerUserController.java index cbbbdb1..e08d5fe 100644 --- a/src/main/java/com/gxwebsoft/shop/controller/ShopDealerUserController.java +++ b/src/main/java/com/gxwebsoft/shop/controller/ShopDealerUserController.java @@ -90,7 +90,7 @@ public class ShopDealerUserController extends BaseController { @Operation(summary = "修改分销商用户记录表") @PutMapping() public ApiResult update(@RequestBody ShopDealerUser shopDealerUser) { - if (shopDealerUserService.updateById(shopDealerUser)) { + if (shopDealerUserService.updateInfo(shopDealerUser)) { return success("修改成功"); } return fail("修改失败"); diff --git a/src/main/java/com/gxwebsoft/shop/entity/ShopDealerReferee.java b/src/main/java/com/gxwebsoft/shop/entity/ShopDealerReferee.java index 54d84a6..a3d9b1e 100644 --- a/src/main/java/com/gxwebsoft/shop/entity/ShopDealerReferee.java +++ b/src/main/java/com/gxwebsoft/shop/entity/ShopDealerReferee.java @@ -1,11 +1,10 @@ package com.gxwebsoft.shop.entity; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.*; import java.math.BigDecimal; import java.time.LocalDateTime; + import com.fasterxml.jackson.annotation.JsonFormat; import java.io.Serializable; import io.swagger.v3.oas.annotations.media.Schema; @@ -21,6 +20,7 @@ import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper = false) @Schema(name = "ShopDealerReferee对象", description = "分销商推荐关系表") +@TableName("shop_dealer_referee") public class ShopDealerReferee implements Serializable { private static final long serialVersionUID = 1L; @@ -69,6 +69,10 @@ public class ShopDealerReferee implements Serializable { @Schema(description = "推荐关系层级(弃用)") private Integer level; + @Schema(description = "是否删除 0-未删 1-已删") + @TableLogic + private Integer deleted; + @Schema(description = "来源(如 goods_share)") // NOTE: 表 shop_dealer_referee 若未新增该字段,需要 exist=false,避免 MyBatis-Plus 自动生成SQL时报 Unknown column。 @TableField(exist = false) diff --git a/src/main/java/com/gxwebsoft/shop/entity/ShopDealerUser.java b/src/main/java/com/gxwebsoft/shop/entity/ShopDealerUser.java index 4272a7e..cf60775 100644 --- a/src/main/java/com/gxwebsoft/shop/entity/ShopDealerUser.java +++ b/src/main/java/com/gxwebsoft/shop/entity/ShopDealerUser.java @@ -29,7 +29,7 @@ public class ShopDealerUser implements Serializable { @TableId(value = "id", type = IdType.AUTO) private Integer id; - @Schema(description = "0经销商,1企业也,2集团)") + @Schema(description = "0-分销员 1-门店 2-服务商 3-合伙人") private Integer type; @Schema(description = "自增ID") diff --git a/src/main/java/com/gxwebsoft/shop/mapper/xml/ShopDealerRefereeMapper.xml b/src/main/java/com/gxwebsoft/shop/mapper/xml/ShopDealerRefereeMapper.xml index 72960dd..4e0348f 100644 --- a/src/main/java/com/gxwebsoft/shop/mapper/xml/ShopDealerRefereeMapper.xml +++ b/src/main/java/com/gxwebsoft/shop/mapper/xml/ShopDealerRefereeMapper.xml @@ -17,6 +17,7 @@ INNER JOIN gxwebsoft_core.sys_user d ON a.dealer_id = d.user_id AND d.deleted = 0 INNER JOIN gxwebsoft_core.sys_user u ON a.user_id = u.user_id AND u.deleted = 0 + a.deleted = 0 AND a.tenant_id = #{param.tenantId} @@ -65,13 +66,12 @@ d.type simpleUserType FROM shop_dealer_referee a - LEFT JOIN shop_dealer_user b ON a.dealer_id = b.user_id - LEFT JOIN shop_dealer_referee c ON b.user_id = c.user_id - LEFT JOIN shop_dealer_user d ON d.user_id = c.dealer_id + LEFT JOIN shop_dealer_user b ON a.dealer_id = b.user_id AND b.deleted = 0 + LEFT JOIN shop_dealer_referee c ON b.user_id = c.user_id AND c.deleted = 0 + LEFT JOIN shop_dealer_user d ON c.dealer_id = d.user_id and d.deleted = 0 WHERE - b.is_delete = 0 - and d.is_delete = 0 - AND a.user_id = #{userId} + a.deleted = 0 + AND a.user_id = #{userId} diff --git a/src/main/java/com/gxwebsoft/shop/service/ShopDealerUserService.java b/src/main/java/com/gxwebsoft/shop/service/ShopDealerUserService.java index 5e94302..02782e7 100644 --- a/src/main/java/com/gxwebsoft/shop/service/ShopDealerUserService.java +++ b/src/main/java/com/gxwebsoft/shop/service/ShopDealerUserService.java @@ -2,6 +2,7 @@ package com.gxwebsoft.shop.service; import com.baomidou.mybatisplus.extension.service.IService; import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.glt.vo.UserRelationVO; import com.gxwebsoft.shop.dto.ShopDealerRefundDto; import com.gxwebsoft.shop.dto.ShopDealerSettlementDto; import com.gxwebsoft.shop.dto.ShopDealerUserReduceDto; @@ -75,6 +76,8 @@ public interface ShopDealerUserService extends IService { */ Boolean orderProfit(ShopDealerSettlementDto dto); + Boolean updateInfo(ShopDealerUser shopDealerUser); + /** * 开启/关闭分销商用户核销权限 * @param id @@ -82,4 +85,11 @@ public interface ShopDealerUserService extends IService { */ Boolean verifyEnable(Integer id); + /** + * 查询用户上级门店、上级服务商 + * @param userId + * @return + */ + UserRelationVO getUserSuperior(Integer userId); + } diff --git a/src/main/java/com/gxwebsoft/shop/service/impl/ShopDealerUserServiceImpl.java b/src/main/java/com/gxwebsoft/shop/service/impl/ShopDealerUserServiceImpl.java index 51f9e09..ffdf9e7 100644 --- a/src/main/java/com/gxwebsoft/shop/service/impl/ShopDealerUserServiceImpl.java +++ b/src/main/java/com/gxwebsoft/shop/service/impl/ShopDealerUserServiceImpl.java @@ -5,12 +5,15 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.gxwebsoft.common.core.enums.ShopDealerCapitalUpdateEnum; import com.gxwebsoft.common.core.enums.ShopDealerTypeEnum; +import com.gxwebsoft.common.core.exception.BusinessException; +import com.gxwebsoft.common.core.exception.enums.GlobalErrorCodeConstants; import com.gxwebsoft.common.core.utils.LoginUserUtil; import com.gxwebsoft.common.core.web.PageParam; import com.gxwebsoft.common.core.web.PageResult; import com.gxwebsoft.common.system.entity.User; import com.gxwebsoft.common.system.mapper.UserMapper; import com.gxwebsoft.common.system.redis.OrderNoUtils; +import com.gxwebsoft.glt.vo.UserRelationVO; import com.gxwebsoft.shop.dto.ShopDealerRefundDto; import com.gxwebsoft.shop.dto.ShopDealerSettlementDto; import com.gxwebsoft.shop.dto.ShopDealerSettlementItemDto; @@ -19,11 +22,13 @@ import com.gxwebsoft.shop.entity.ShopDealerCapital; import com.gxwebsoft.shop.entity.ShopDealerUser; import com.gxwebsoft.shop.entity.ShopOrder; import com.gxwebsoft.shop.mapper.ShopDealerCapitalMapper; +import com.gxwebsoft.shop.mapper.ShopDealerRefereeMapper; import com.gxwebsoft.shop.mapper.ShopDealerUserMapper; import com.gxwebsoft.shop.mapper.ShopOrderMapper; import com.gxwebsoft.shop.param.ShopDealerUserParam; import com.gxwebsoft.shop.service.ShopDealerCapitalService; import com.gxwebsoft.shop.service.ShopDealerUserService; +import com.gxwebsoft.shop.vo.ShopDealerRefereeVO; import lombok.AllArgsConstructor; import org.apache.commons.collections4.CollectionUtils; import org.springframework.stereotype.Service; @@ -58,6 +63,8 @@ public class ShopDealerUserServiceImpl extends ServiceImpl 0; + }else { + throw new BusinessException(GlobalErrorCodeConstants.NOT_FOUND.getMsg()); + } + } + @Override public Boolean verifyEnable(Integer id) { ShopDealerUser dealerUser = baseMapper.selectById(id); @@ -497,6 +532,70 @@ public class ShopDealerUserServiceImpl extends ServiceImpl().eq(ShopDealerUser::getUserId, tempUserId)); + + + if (dealerUser == null) break; + + // 找到门店,且还没赋值 + if (vo.getStoreUserId() == null && dealerUser.getType() == 1) { + vo.setStoreUserId(tempUserId); + } + // 找到服务商,且还没赋值 + if (vo.getServiceUserId() == null && dealerUser.getType() == 2) { + vo.setServiceUserId(tempUserId); + } + + // 都找到了,提前退出 + if (vo.getStoreUserId() != null && vo.getServiceUserId() != null) { + break; + } + + // 继续向上找上级 + tempUserId = getDirectSuperiorId(tempUserId); + } + } + + + public ShopDealerUser getDealerUser(Integer userId){ ShopDealerUser shopDealerUser = baseMapper.selectOne(new LambdaQueryWrapper().eq(ShopDealerUser::getUserId, userId)); if(shopDealerUser == null){