Commit 4359c584bb2b970f33df78fd0a5f5f9f24567e1f
1 parent
7bc3b7b2
code review:拼团逻辑
Showing
8 changed files
with
16 additions
and
16 deletions
yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/api/combination/CombinationRecordApi.java
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/combination/CombinationRecordController.java
| ... | ... | @@ -40,8 +40,6 @@ public class CombinationRecordController { |
| 40 | 40 | @Lazy |
| 41 | 41 | private CombinationRecordService combinationRecordService; |
| 42 | 42 | |
| 43 | - // 然后如果 headId 非空,并且第一页,单独多查询一条 head ;放到第 0 个位置;相当于说,第一页特殊一点; | |
| 44 | - | |
| 45 | 43 | @GetMapping("/page") |
| 46 | 44 | @Operation(summary = "获得拼团记录分页") |
| 47 | 45 | @PreAuthorize("@ss.hasPermission('promotion:combination-record:query')") | ... | ... |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/combination/AppCombinationRecordController.java
| ... | ... | @@ -47,13 +47,13 @@ public class AppCombinationRecordController { |
| 47 | 47 | public CommonResult<AppCombinationRecordSummaryRespVO> getCombinationRecordSummary() { |
| 48 | 48 | AppCombinationRecordSummaryRespVO summary = new AppCombinationRecordSummaryRespVO(); |
| 49 | 49 | // 1. 获得拼团参与用户数量 |
| 50 | - Long count = combinationRecordService.getCombinationUserCount(); | |
| 51 | - if (count == 0) { | |
| 50 | + Long userCount = combinationRecordService.getCombinationUserCount(); | |
| 51 | + if (userCount == 0) { | |
| 52 | 52 | summary.setAvatars(Collections.emptyList()); |
| 53 | - summary.setUserCount(count); | |
| 53 | + summary.setUserCount(userCount); | |
| 54 | 54 | return success(summary); |
| 55 | 55 | } |
| 56 | - summary.setUserCount(count); | |
| 56 | + summary.setUserCount(userCount); | |
| 57 | 57 | |
| 58 | 58 | // 2. 获得拼团记录头像 |
| 59 | 59 | List<CombinationRecordDO> records = combinationRecordService.getLatestCombinationRecordList( | ... | ... |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/combination/CombinationActivityConvert.java
| ... | ... | @@ -192,7 +192,6 @@ public interface CombinationActivityConvert { |
| 192 | 192 | return result; |
| 193 | 193 | } |
| 194 | 194 | |
| 195 | - | |
| 196 | 195 | default AppCombinationRecordDetailRespVO convert(Long userId, CombinationRecordDO headRecord, List<CombinationRecordDO> memberRecords) { |
| 197 | 196 | AppCombinationRecordDetailRespVO respVO = new AppCombinationRecordDetailRespVO() |
| 198 | 197 | .setHeadRecord(convert(headRecord)).setMemberRecords(convertList3(memberRecords)); | ... | ... |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/combination/CombinationRecordMapper.java
| ... | ... | @@ -99,10 +99,10 @@ public interface CombinationRecordMapper extends BaseMapperX<CombinationRecordDO |
| 99 | 99 | LambdaQueryWrapperX<CombinationRecordDO> queryWrapper = new LambdaQueryWrapperX<CombinationRecordDO>() |
| 100 | 100 | .eqIfPresent(CombinationRecordDO::getStatus, pageVO.getStatus()) |
| 101 | 101 | .betweenIfPresent(CombinationRecordDO::getCreateTime, pageVO.getCreateTime()); |
| 102 | + // 如果 headId 非空,说明查询指定团的团长 + 团员的拼团记录 | |
| 102 | 103 | if (pageVO.getHeadId() != null) { |
| 103 | - queryWrapper.eq(CombinationRecordDO::getId, pageVO.getHeadId()) | |
| 104 | - .or() | |
| 105 | - .eq(CombinationRecordDO::getHeadId, pageVO.getHeadId()); | |
| 104 | + queryWrapper.eq(CombinationRecordDO::getId, pageVO.getHeadId()) // 团长 | |
| 105 | + .or().eq(CombinationRecordDO::getHeadId, pageVO.getHeadId()); // 团员 | |
| 106 | 106 | } |
| 107 | 107 | return selectPage(pageVO, queryWrapper); |
| 108 | 108 | } |
| ... | ... | @@ -127,6 +127,7 @@ public interface CombinationRecordMapper extends BaseMapperX<CombinationRecordDO |
| 127 | 127 | * |
| 128 | 128 | * @return 参加过拼团的用户数 |
| 129 | 129 | */ |
| 130 | + // TODO @puhui999:1)方法名,直接 selectUserCount;2)COUNT(DISTINCT(user_id)) 就可以啦,不用 group by 哈 | |
| 130 | 131 | default Long selectUserDistinctCount() { |
| 131 | 132 | return selectCount(new QueryWrapper<CombinationRecordDO>() |
| 132 | 133 | .select("DISTINCT (user_id)") | ... | ... |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationRecordServiceImpl.java
| ... | ... | @@ -339,19 +339,20 @@ public class CombinationRecordServiceImpl implements CombinationRecordService { |
| 339 | 339 | |
| 340 | 340 | @Override |
| 341 | 341 | public KeyValue<Integer, Integer> expireCombinationRecord() { |
| 342 | - // 1.获取所有正在进行中的过期的父拼团 | |
| 342 | + // 1. 获取所有正在进行中的过期的父拼团 | |
| 343 | 343 | List<CombinationRecordDO> headExpireRecords = combinationRecordMapper.selectListByHeadIdAndStatusAndExpireTimeLt( |
| 344 | 344 | CombinationRecordDO.HEAD_ID_GROUP, CombinationRecordStatusEnum.IN_PROGRESS.getStatus(), LocalDateTime.now()); |
| 345 | 345 | if (CollUtil.isEmpty(headExpireRecords)) { |
| 346 | 346 | return new KeyValue<>(0, 0); |
| 347 | 347 | } |
| 348 | 348 | |
| 349 | - // 2.获取拼团活动 | |
| 349 | + // 2. 获取拼团活动 | |
| 350 | 350 | List<CombinationActivityDO> activities = combinationActivityService.getCombinationActivityListByIds( |
| 351 | 351 | convertSet(headExpireRecords, CombinationRecordDO::getActivityId)); |
| 352 | 352 | Map<Long, CombinationActivityDO> activityMap = convertMap(activities, CombinationActivityDO::getId); |
| 353 | 353 | |
| 354 | - // 3.校验是否虚拟成团 | |
| 354 | + // TODO @puhui999:这里可以改成“每个团”,处理一次哈;这样 handleExpireRecord、handleVirtualGroupRecord 都改成按团处理,每个是一个小事务; | |
| 355 | + // 3. 校验是否虚拟成团 | |
| 355 | 356 | List<CombinationRecordDO> virtualGroupHeadRecords = new ArrayList<>(); // 虚拟成团 |
| 356 | 357 | for (Iterator<CombinationRecordDO> iterator = headExpireRecords.iterator(); iterator.hasNext(); ) { |
| 357 | 358 | CombinationRecordDO record = iterator.next(); | ... | ... |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/order/TradeOrderMapper.java
| ... | ... | @@ -93,6 +93,7 @@ public interface TradeOrderMapper extends BaseMapperX<TradeOrderDO> { |
| 93 | 93 | return selectOne(TradeOrderDO::getPickUpVerifyCode, pickUpVerifyCode); |
| 94 | 94 | } |
| 95 | 95 | |
| 96 | + // TODO @puhui999:selectByUserIdAndCombinationActivityIdAndStatus,这样更容易理解哈。 | |
| 96 | 97 | /** |
| 97 | 98 | * 只针对 combinationActivityId 的查询 |
| 98 | 99 | * | ... | ... |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeCombinationOrderHandler.java
| ... | ... | @@ -70,8 +70,8 @@ public class TradeCombinationOrderHandler implements TradeOrderHandler { |
| 70 | 70 | TradeOrderConvert.INSTANCE.convert(order, item)); |
| 71 | 71 | |
| 72 | 72 | // 3. 更新拼团相关信息到订单 |
| 73 | - // TODO 芋艿,只需要更新 record。 如果创建订单时自己是团长的情况下 combinationHeadId 是为 null 的, | |
| 74 | - // 设置团长编号这个操作时在订单是否后创建拼团记录时才设置的,所以支付完创建拼团记录后需要设置一下记录编号和团长编号 | |
| 73 | + // 为什么几个字段都要更新?原因是: | |
| 74 | + // 如果创建订单时自己是团长的情况下 combinationHeadId 是为 null 的,设置团长编号这个操作时在订单是否后创建拼团记录时才设置的。 | |
| 75 | 75 | orderUpdateService.updateOrderCombinationInfo(order.getId(), order.getCombinationActivityId(), |
| 76 | 76 | combinationRecord.getCombinationRecordId(), combinationRecord.getCombinationHeadId()); |
| 77 | 77 | } | ... | ... |