Explorar o código

Review代码修改

owen hai 1 ano
pai
achega
6b7f071988

+ 1 - 4
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/coupon/AppCouponController.java

@@ -1,7 +1,6 @@
 package cn.iocoder.yudao.module.promotion.controller.app.coupon;
 
 import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.map.MapUtil;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.security.core.annotations.PreAuthenticated;
@@ -50,9 +49,7 @@ public class AppCouponController {
         CouponTemplateDO couponTemplate = couponTemplateService.getCouponTemplate(reqVO.getTemplateId());
         boolean canTakeAgain = true;
         if (couponTemplate.getTakeLimitCount() != null && couponTemplate.getTakeLimitCount() > 0) {
-            // TODO @疯狂:要不要搞个 getTakeCount 方法?
-            Integer takeCount = MapUtil.getInt(couponService.getTakeCountMapByTemplateIds(
-                    Collections.singleton(reqVO.getTemplateId()), userId), reqVO.getTemplateId(), 0);
+            Integer takeCount = couponService.getTakeCount(reqVO.getTemplateId(), userId);
             canTakeAgain = takeCount < couponTemplate.getTakeLimitCount();
         }
         return success(canTakeAgain);

+ 16 - 4
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/coupon/CouponService.java

@@ -8,10 +8,7 @@ import cn.iocoder.yudao.module.promotion.dal.dataobject.coupon.CouponDO;
 import cn.iocoder.yudao.module.promotion.enums.coupon.CouponTakeTypeEnum;
 import cn.iocoder.yudao.module.promotion.service.coupon.bo.CouponTakeCountBO;
 
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
 
@@ -129,6 +126,21 @@ public interface CouponService {
         takeCoupon(templateId, CollUtil.newHashSet(userId), CouponTakeTypeEnum.REGISTER);
     }
 
+    /**
+     * 获取会员领取指定优惠券的数量
+     *
+     * @param templateId 优惠券模板编号
+     * @param userId     用户编号
+     * @return 领取优惠券的数量
+     */
+    default Integer getTakeCount(Long templateId, Long userId) {
+        return CollUtil.emptyIfNull(getTakeCountListByTemplateIds(Collections.singleton(templateId), userId))
+                .stream()
+                .findFirst()
+                .map(CouponTakeCountBO::getCount)
+                .orElse(0);
+    }
+
     /**
      * 统计会员领取优惠券的数量
      *

+ 10 - 1
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/brokerage/BrokerageUserConvert.java

@@ -5,11 +5,13 @@ import cn.hutool.core.util.ObjUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
 import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.user.BrokerageUserRespVO;
+import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserChildSummaryRespVO;
 import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserMySummaryRespVO;
 import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserRankByUserCountRespVO;
 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageUserDO;
-import cn.iocoder.yudao.module.trade.service.brokerage.bo.UserBrokerageSummaryRespBO;
 import cn.iocoder.yudao.module.trade.service.brokerage.bo.BrokerageWithdrawSummaryRespBO;
+import cn.iocoder.yudao.module.trade.service.brokerage.bo.UserBrokerageSummaryRespBO;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.mapstruct.Mapper;
 import org.mapstruct.MappingTarget;
 import org.mapstruct.factory.Mappers;
@@ -85,4 +87,11 @@ public interface BrokerageUserConvert {
                 .ifPresent(user -> respVO.setBrokeragePrice(user.getBrokeragePrice()).setFrozenPrice(user.getFrozenPrice()));
         return respVO;
     }
+
+    default void copyTo(IPage<AppBrokerageUserChildSummaryRespVO> pageResult, Map<Long, MemberUserRespDTO> userMap) {
+        for (AppBrokerageUserChildSummaryRespVO vo : pageResult.getRecords()) {
+            Optional.ofNullable(userMap.get(vo.getId())).ifPresent(user ->
+                    vo.setNickname(user.getNickname()).setAvatar(user.getAvatar()));
+        }
+    }
 }

+ 6 - 3
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/brokerage/BrokerageUserMapper.java

@@ -2,10 +2,10 @@ package cn.iocoder.yudao.module.trade.dal.mysql.brokerage;
 
 import cn.hutool.core.lang.Assert;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.SortingField;
 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.user.BrokerageUserPageReqVO;
-import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserChildSummaryPageReqVO;
 import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserChildSummaryRespVO;
 import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserRankByUserCountRespVO;
 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageUserDO;
@@ -139,8 +139,11 @@ public interface BrokerageUserMapper extends BaseMapperX<BrokerageUserDO> {
                                                                                   @Param("endTime") LocalDateTime endTime);
 
     IPage<AppBrokerageUserChildSummaryRespVO> selectSummaryPageByUserId(Page<?> page,
-                                                                        @Param("param") AppBrokerageUserChildSummaryPageReqVO param,
-                                                                        @Param("userId") Long userId);
+                                                                        @Param("ids") List<Long> ids,
+                                                                        @Param("bizType") Integer bizType,
+                                                                        @Param("status") Integer status,
+                                                                        @Param("bindUserIds") List<Long> bindUserIds,
+                                                                        @Param("sortingField") SortingField sortingField);
 
     default List<BrokerageUserDO> selectListByBindUserId(Long bindUserId) {
         return selectList(BrokerageUserDO::getBindUserId, bindUserId);

+ 4 - 4
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageRecordServiceImpl.java

@@ -232,7 +232,7 @@ public class BrokerageRecordServiceImpl implements BrokerageRecordService {
     }
 
     /**
-     * 激动单条佣金记录
+     * 解冻单条佣金记录
      *
      * @param record 佣金记录
      * @return 解冻是否成功
@@ -258,9 +258,9 @@ public class BrokerageRecordServiceImpl implements BrokerageRecordService {
     @Override
     public List<UserBrokerageSummaryRespBO> getUserBrokerageSummaryListByUserId(Collection<Long> userIds,
                                                                                 Integer bizType, Integer status) {
-         if (CollUtil.isEmpty(userIds)) {
-             return Collections.emptyList();
-         }
+        if (CollUtil.isEmpty(userIds)) {
+            return Collections.emptyList();
+        }
         return brokerageRecordMapper.selectCountAndSumPriceByUserIdInAndBizTypeAndStatus(userIds, bizType, status);
     }
 

+ 21 - 3
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageUserServiceImpl.java

@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.lang.Assert;
 import cn.hutool.core.util.ArrayUtil;
 import cn.hutool.core.util.BooleanUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils;
 import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
@@ -14,11 +15,14 @@ import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokera
 import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserChildSummaryRespVO;
 import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserRankByUserCountRespVO;
 import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserRankPageReqVO;
+import cn.iocoder.yudao.module.trade.convert.brokerage.BrokerageUserConvert;
 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageUserDO;
 import cn.iocoder.yudao.module.trade.dal.dataobject.config.TradeConfigDO;
 import cn.iocoder.yudao.module.trade.dal.mysql.brokerage.BrokerageUserMapper;
 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageBindModeEnum;
 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageEnabledConditionEnum;
+import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum;
+import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordStatusEnum;
 import cn.iocoder.yudao.module.trade.service.config.TradeConfigService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springframework.stereotype.Service;
@@ -221,7 +225,21 @@ public class BrokerageUserServiceImpl implements BrokerageUserService {
 
     @Override
     public PageResult<AppBrokerageUserChildSummaryRespVO> getBrokerageUserChildSummaryPage(AppBrokerageUserChildSummaryPageReqVO pageReqVO, Long userId) {
-        IPage<AppBrokerageUserChildSummaryRespVO> pageResult = brokerageUserMapper.selectSummaryPageByUserId(MyBatisUtils.buildPage(pageReqVO), pageReqVO, userId);
+        // 1.1 根据昵称过滤用户
+        List<Long> ids = StrUtil.isBlank(pageReqVO.getNickname())
+                ? Collections.emptyList()
+                : convertList(memberUserApi.getUserListByNickname(pageReqVO.getNickname()), MemberUserRespDTO::getId);
+        // 1.2 生成推广员编号列表
+        List<Long> bindUserIds = buildBindUserIdsByLevel(userId, pageReqVO.getLevel());
+        // 2. 分页查询
+        IPage<AppBrokerageUserChildSummaryRespVO> pageResult = brokerageUserMapper.selectSummaryPageByUserId(
+                MyBatisUtils.buildPage(pageReqVO), ids, BrokerageRecordBizTypeEnum.ORDER.getType(),
+                BrokerageRecordStatusEnum.SETTLEMENT.getStatus(), bindUserIds, pageReqVO.getSortingField()
+        );
+        // 3. 拼接数据并返回
+        List<Long> userIds = convertList(pageResult.getRecords(), AppBrokerageUserChildSummaryRespVO::getId);
+        Map<Long, MemberUserRespDTO> userMap = memberUserApi.getUserMap(userIds);
+        BrokerageUserConvert.INSTANCE.copyTo(pageResult, userMap);
         return new PageResult<>(pageResult.getRecords(), pageResult.getTotal());
     }
 
@@ -253,9 +271,9 @@ public class BrokerageUserServiceImpl implements BrokerageUserService {
 
     /**
      * 判断是否为新用户
-     *
+     * <p>
      * 标准:注册时间在 30 秒内的,都算新用户
-     *
+     * <p>
      * 疑问:为什么通过这样的方式实现?
      * 回答:因为注册在 member 模块,希望它和 trade 模块解耦,所以只能用这种约定的逻辑。
      *

+ 2 - 14
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java

@@ -5,7 +5,6 @@ import cn.hutool.core.lang.Assert;
 import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.RandomUtil;
-import cn.hutool.core.util.StrUtil;
 import cn.hutool.extra.spring.SpringUtil;
 import cn.iocoder.yudao.framework.common.core.KeyValue;
 import cn.iocoder.yudao.framework.common.enums.TerminalEnum;
@@ -667,7 +666,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
      * 如果金额全部被退款,则取消订单
      * 如果还有未被退款的金额,则无需取消订单
      *
-     * @param order           订单
+     * @param order       订单
      * @param refundPrice 退款金额
      */
     @TradeOrderLog(operateType = TradeOrderOperateTypeEnum.ADMIN_CANCEL_AFTER_SALE)
@@ -774,11 +773,6 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
 
     @Override
     public void updateOrderItemWhenAfterSaleCreate(Long id, Long afterSaleId) {
-        // TODO @疯狂:这个可以直接在接口上,写 @Null 参数校验;
-        if (afterSaleId == null) {
-            throw new IllegalArgumentException(StrUtil.format("id({}) 退款发起,售后单编号不能为空", id));
-        }
-
         // 更新订单项
         updateOrderItemAfterSaleStatus(id, TradeOrderItemAfterSaleStatusEnum.NONE.getStatus(),
                 TradeOrderItemAfterSaleStatusEnum.APPLY.getStatus(), afterSaleId);
@@ -787,11 +781,6 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void updateOrderItemWhenAfterSaleSuccess(Long id, Integer refundPrice) {
-        // TODO @疯狂:这个可以直接在接口上,写 @Null 参数校验;
-        if (refundPrice == null) {
-            throw new IllegalArgumentException(StrUtil.format("id({}) 退款成功,退款金额不能为空", id));
-        }
-
         // 1. 更新订单项
         updateOrderItemAfterSaleStatus(id, TradeOrderItemAfterSaleStatusEnum.APPLY.getStatus(),
                 TradeOrderItemAfterSaleStatusEnum.SUCCESS.getStatus(), null);
@@ -821,8 +810,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
         addUserPoint(order.getUserId(), orderItem.getUsePoint(), MemberPointBizTypeEnum.AFTER_SALE_REFUND_USED, orderItem.getAfterSaleId());
 
         // 5. 回滚经验:扣减用户经验
-        // TODO @疯狂:orderRefundPrice 是不是改成 refundPrice?应该只退这个售后对应的经验
-        getSelf().reduceUserExperienceAsync(order.getUserId(), orderRefundPrice, orderItem.getAfterSaleId());
+        getSelf().reduceUserExperienceAsync(order.getUserId(), refundPrice, orderItem.getAfterSaleId());
 
         // 6. 回滚佣金:更新分佣记录为已失效
         getSelf().cancelBrokerageAsync(order.getUserId(), id);

+ 23 - 22
yudao-module-mall/yudao-module-trade-biz/src/main/resources/mapper/brokerage/BrokerageUserMapper.xml

@@ -4,37 +4,38 @@
 
     <select id="selectSummaryPageByUserId"
             resultType="cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserChildSummaryRespVO">
-        SELECT bu.id, bu.bind_user_time AS brokerageTime, u.nickname, u.avatar,
-        <!-- TODO @疯狂:biz_type、status 可以通过参数传入哇? -->
+        SELECT bu.id, bu.bind_user_time AS brokerageTime,
         (SELECT SUM(price) FROM trade_brokerage_record r
-            WHERE r.user_id = u.id AND biz_type = 1 AND r.status = 1 AND r.deleted = FALSE) AS brokeragePrice,
+        WHERE r.user_id = bu.id AND biz_type = #{bizType} AND r.status = #{status} AND r.deleted = FALSE) AS brokeragePrice,
         (SELECT COUNT(1) FROM trade_brokerage_record r
-            WHERE r.user_id = u.id AND biz_type = 1 AND r.status = 1 AND r.deleted = FALSE) AS brokerageOrderCount,
+        WHERE r.user_id = bu.id AND biz_type = #{bizType} AND r.status = #{status} AND r.deleted = FALSE) AS brokerageOrderCount,
         (SELECT COUNT(1) FROM trade_brokerage_user c
-            WHERE c.bind_user_id = u.id AND c.deleted = FALSE) AS brokerageUserCount
-        FROM member_user AS u
-        JOIN trade_brokerage_user AS bu ON bu.id = u.id
-       <!-- TODO @疯狂:1)bind_user_id 是不是可以先改成内存查询出 userId 的集合,然后去 in 哈?2)nickname 是不是可以基于查询出来的 userId 对应的 nickname 在内存里过滤,主要是避免和 member_user 链表 -->
-       <where>
-            <if test="param.nickname != null and param.nickname != ''">
-                AND u.nickname LIKE concat('', #{param.nickname}, '')
+        WHERE c.bind_user_id = bu.id AND c.deleted = FALSE) AS brokerageUserCount
+        FROM trade_brokerage_user AS bu
+        <where>
+            bu.deleted = false
+            <if test="ids != null and ids.size() > 0">
+                and bu.id in
+                <foreach collection="ids" open="(" item="id" separator="," close=")">
+                    #{id}
+                </foreach>
             </if>
-            <if test="param.level == 1">
-                AND bu.bind_user_id = #{userId}
-            </if>
-            <if test="param.level == 2">
-                AND bu.bind_user_id IN (SELECT id FROM trade_brokerage_user c WHERE c.bind_user_id = #{userId})
+            <if test="bindUserIds != null and bindUserIds.size() > 0">
+                and bu.bind_user_id in
+                <foreach collection="bindUserIds" open="(" item="bindUserId" separator="," close=")">
+                    #{bindUserId}
+                </foreach>
             </if>
         </where>
         <choose>
-            <when test="param.sortingField.field == 'userCount'">
-                ORDER BY brokerageUserCount ${param.sortingField.order}
+            <when test="sortingField.field == 'userCount'">
+                ORDER BY brokerageUserCount ${sortingField.order}
             </when>
-            <when test="param.sortingField.field == 'orderCount'">
-                ORDER BY brokerageOrderCount ${param.sortingField.order}
+            <when test="sortingField.field == 'orderCount'">
+                ORDER BY brokerageOrderCount ${sortingField.order}
             </when>
-            <when test="param.sortingField.field == 'price'">
-                ORDER BY brokeragePrice ${param.sortingField.order}
+            <when test="sortingField.field == 'price'">
+                ORDER BY brokeragePrice ${sortingField.order}
             </when>
             <otherwise>
                 ORDER BY bu.bind_user_time DESC