Commit 7b727d5ce2a7e53ec5d3b1765afcafdfae38265b

Authored by YunaiV
1 parent 781ec102

code review:拼团记录流程

Showing 12 changed files with 38 additions and 44 deletions
yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/api/combination/dto/CombinationRecordCreateReqDTO.java
@@ -4,7 +4,6 @@ import lombok.Data; @@ -4,7 +4,6 @@ import lombok.Data;
4 4
5 import javax.validation.constraints.NotNull; 5 import javax.validation.constraints.NotNull;
6 6
7 -// TODO @芋艿:这块要在看看  
8 /** 7 /**
9 * 拼团记录的创建 Request DTO 8 * 拼团记录的创建 Request DTO
10 * 9 *
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/combination/CombinationRecordController.java
@@ -55,8 +55,8 @@ public class CombinationRecordController { @@ -55,8 +55,8 @@ public class CombinationRecordController {
55 public CommonResult<CombinationRecordSummaryVO> getCombinationRecordSummary() { 55 public CommonResult<CombinationRecordSummaryVO> getCombinationRecordSummary() {
56 CombinationRecordSummaryVO summaryVO = new CombinationRecordSummaryVO(); 56 CombinationRecordSummaryVO summaryVO = new CombinationRecordSummaryVO();
57 summaryVO.setUserCount(combinationRecordService.getCombinationRecordCount(null, null)); // 获取所有拼团记录 57 summaryVO.setUserCount(combinationRecordService.getCombinationRecordCount(null, null)); // 获取所有拼团记录
58 - summaryVO.setSuccessCount(combinationRecordService.getCombinationRecordCount(  
59 - CombinationRecordStatusEnum.SUCCESS.getStatus(), null));// 获取成团记录 58 + summaryVO.setSuccessCount(combinationRecordService.getCombinationRecordCount( // 获取成团记录
  59 + CombinationRecordStatusEnum.SUCCESS.getStatus(), null));
60 summaryVO.setVirtualGroupCount(combinationRecordService.getCombinationRecordCount(null, Boolean.TRUE));// 获取虚拟成团记录 60 summaryVO.setVirtualGroupCount(combinationRecordService.getCombinationRecordCount(null, Boolean.TRUE));// 获取虚拟成团记录
61 return success(summaryVO); 61 return success(summaryVO);
62 } 62 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/activity/AppActivityController.java
@@ -55,7 +55,6 @@ public class AppActivityController { @@ -55,7 +55,6 @@ public class AppActivityController {
55 if (CollUtil.isEmpty(spuIds)) { 55 if (CollUtil.isEmpty(spuIds)) {
56 return success(MapUtil.empty()); 56 return success(MapUtil.empty());
57 } 57 }
58 -  
59 // 每种活动,只返回一个;key 为 SPU 编号 58 // 每种活动,只返回一个;key 为 SPU 编号
60 return success(convertMultiMap(getAppActivityRespVOList(spuIds), AppActivityRespVO::getSpuId)); 59 return success(convertMultiMap(getAppActivityRespVOList(spuIds), AppActivityRespVO::getSpuId));
61 } 60 }
@@ -64,20 +63,15 @@ public class AppActivityController { @@ -64,20 +63,15 @@ public class AppActivityController {
64 if (CollUtil.isEmpty(spuIds)) { 63 if (CollUtil.isEmpty(spuIds)) {
65 return new ArrayList<>(); 64 return new ArrayList<>();
66 } 65 }
67 -  
68 List<AppActivityRespVO> activityList = new ArrayList<>(); 66 List<AppActivityRespVO> activityList = new ArrayList<>();
69 // 拼团活动 67 // 拼团活动
70 List<CombinationActivityDO> combinationActivities = combinationActivityService.getCombinationActivityBySpuIdsAndStatus( 68 List<CombinationActivityDO> combinationActivities = combinationActivityService.getCombinationActivityBySpuIdsAndStatus(
71 spuIds, CommonStatusEnum.ENABLE.getStatus()); 69 spuIds, CommonStatusEnum.ENABLE.getStatus());
72 if (CollUtil.isNotEmpty(combinationActivities)) { 70 if (CollUtil.isNotEmpty(combinationActivities)) {
73 combinationActivities.forEach(item -> { 71 combinationActivities.forEach(item -> {
74 - activityList.add(new AppActivityRespVO()  
75 - .setId(item.getId())  
76 - .setType(PromotionTypeEnum.COMBINATION_ACTIVITY.getType())  
77 - .setName(item.getName())  
78 - .setSpuId(item.getSpuId())  
79 - .setStartTime(item.getStartTime())  
80 - .setEndTime(item.getEndTime())); 72 + activityList.add(new AppActivityRespVO().setId(item.getId())
  73 + .setType(PromotionTypeEnum.COMBINATION_ACTIVITY.getType()).setName(item.getName())
  74 + .setSpuId(item.getSpuId()).setStartTime(item.getStartTime()).setEndTime(item.getEndTime()));
81 }); 75 });
82 } 76 }
83 // 秒杀活动 77 // 秒杀活动
@@ -85,13 +79,9 @@ public class AppActivityController { @@ -85,13 +79,9 @@ public class AppActivityController {
85 spuIds, CommonStatusEnum.ENABLE.getStatus()); 79 spuIds, CommonStatusEnum.ENABLE.getStatus());
86 if (CollUtil.isNotEmpty(seckillActivities)) { 80 if (CollUtil.isNotEmpty(seckillActivities)) {
87 seckillActivities.forEach(item -> { 81 seckillActivities.forEach(item -> {
88 - activityList.add(new AppActivityRespVO()  
89 - .setId(item.getId())  
90 - .setType(PromotionTypeEnum.SECKILL_ACTIVITY.getType())  
91 - .setName(item.getName())  
92 - .setSpuId(item.getSpuId())  
93 - .setStartTime(item.getStartTime())  
94 - .setEndTime(item.getEndTime())); 82 + activityList.add(new AppActivityRespVO().setId(item.getId())
  83 + .setType(PromotionTypeEnum.SECKILL_ACTIVITY.getType()).setName(item.getName())
  84 + .setSpuId(item.getSpuId()).setStartTime(item.getStartTime()).setEndTime(item.getEndTime()));
95 }); 85 });
96 } 86 }
97 // 砍价活动 87 // 砍价活动
@@ -99,13 +89,9 @@ public class AppActivityController { @@ -99,13 +89,9 @@ public class AppActivityController {
99 spuIds, CommonStatusEnum.ENABLE.getStatus()); 89 spuIds, CommonStatusEnum.ENABLE.getStatus());
100 if (CollUtil.isNotEmpty(bargainActivities)) { 90 if (CollUtil.isNotEmpty(bargainActivities)) {
101 bargainActivities.forEach(item -> { 91 bargainActivities.forEach(item -> {
102 - activityList.add(new AppActivityRespVO()  
103 - .setId(item.getId())  
104 - .setType(PromotionTypeEnum.BARGAIN_ACTIVITY.getType())  
105 - .setName(item.getName())  
106 - .setSpuId(item.getSpuId())  
107 - .setStartTime(item.getStartTime())  
108 - .setEndTime(item.getEndTime())); 92 + activityList.add(new AppActivityRespVO().setId(item.getId())
  93 + .setType(PromotionTypeEnum.BARGAIN_ACTIVITY.getType()).setName(item.getName())
  94 + .setSpuId(item.getSpuId()).setStartTime(item.getStartTime()).setEndTime(item.getEndTime()));
109 }); 95 });
110 } 96 }
111 return activityList; 97 return activityList;
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/combination/CombinationActivityConvert.java
@@ -109,22 +109,19 @@ public interface CombinationActivityConvert { @@ -109,22 +109,19 @@ public interface CombinationActivityConvert {
109 109
110 CombinationRecordDO convert(CombinationRecordCreateReqDTO reqDTO); 110 CombinationRecordDO convert(CombinationRecordCreateReqDTO reqDTO);
111 111
112 - // TODO @芋艿:在 convert 优化下;  
113 default CombinationRecordDO convert(CombinationRecordCreateReqDTO reqDTO, 112 default CombinationRecordDO convert(CombinationRecordCreateReqDTO reqDTO,
114 CombinationActivityDO activity, MemberUserRespDTO user, 113 CombinationActivityDO activity, MemberUserRespDTO user,
115 ProductSpuRespDTO spu, ProductSkuRespDTO sku) { 114 ProductSpuRespDTO spu, ProductSkuRespDTO sku) {
116 - return convert(reqDTO)  
117 - .setCount(reqDTO.getCount())  
118 - .setVirtualGroup(false) // 默认 false 拼团过期都还没有成功,则按照 CombinationActivityDO#virtualGroup 来如果为 true 则执行虚拟成团的逻辑 115 + return convert(reqDTO).setVirtualGroup(false)
119 .setStatus(CombinationRecordStatusEnum.IN_PROGRESS.getStatus()) // 创建后默认状态为进行中 116 .setStatus(CombinationRecordStatusEnum.IN_PROGRESS.getStatus()) // 创建后默认状态为进行中
120 - .setStartTime(LocalDateTime.now()) 117 + .setStartTime(LocalDateTime.now()) // TODO @puhui999:想了下,这个 startTime 应该是团长的;
  118 + // TODO @puhui999:有团长的情况下,expireTime 应该是团长的;
121 .setExpireTime(activity.getStartTime().plusHours(activity.getLimitDuration())) 119 .setExpireTime(activity.getStartTime().plusHours(activity.getLimitDuration()))
122 - .setUserSize(activity.getUserSize())  
123 - .setUserCount(1) // 默认就是 1 插入后会接着更新一次所有的拼团记录  
124 - .setNickname(user.getNickname())  
125 - .setAvatar(user.getAvatar())  
126 - .setSpuName(spu.getName())  
127 - .setPicUrl(sku.getPicUrl()); 120 + .setUserSize(activity.getUserSize()).setUserCount(1) // 默认就是 1 插入后会接着更新一次所有的拼团记录
  121 + // 用户信息
  122 + .setNickname(user.getNickname()).setAvatar(user.getAvatar())
  123 + // 商品信息
  124 + .setSpuName(spu.getName()).setPicUrl(sku.getPicUrl());
128 125
129 } 126 }
130 127
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/combination/CombinationRecordDO.java
@@ -116,6 +116,9 @@ public class CombinationRecordDO extends BaseDO { @@ -116,6 +116,9 @@ public class CombinationRecordDO extends BaseDO {
116 private Integer userCount; 116 private Integer userCount;
117 /** 117 /**
118 * 是否虚拟成团 118 * 是否虚拟成团
  119 + *
  120 + * 默认为 false。
  121 + * 拼团过期都还没有成功,如果 {@link CombinationActivityDO#getVirtualGroup()} 为 true,则执行虚拟成团的逻辑,才会更新该字段为 true
119 */ 122 */
120 private Boolean virtualGroup; 123 private Boolean virtualGroup;
121 124
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/bargain/BargainActivityMapper.java
@@ -85,6 +85,8 @@ public interface BargainActivityMapper extends BaseMapperX&lt;BargainActivityDO&gt; { @@ -85,6 +85,8 @@ public interface BargainActivityMapper extends BaseMapperX&lt;BargainActivityDO&gt; {
85 .last("LIMIT " + count)); 85 .last("LIMIT " + count));
86 } 86 }
87 87
  88 + // TODO @puhui999:一个商品,在统一时间,不会参与多个活动;so 是不是不用 inner join 哈?
  89 + // PS:如果可以参与多个,其实可以这样写 select * from promotion_bargain_activity group by spu_id ORDER BY create_time DESC;通过 group 来过滤
88 /** 90 /**
89 * 获取指定 spu 编号最近参加的活动,每个 spuId 只返回一条记录 91 * 获取指定 spu 编号最近参加的活动,每个 spuId 只返回一条记录
90 * 92 *
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/combination/CombinationActivityMapper.java
@@ -43,6 +43,7 @@ public interface CombinationActivityMapper extends BaseMapperX&lt;CombinationActivi @@ -43,6 +43,7 @@ public interface CombinationActivityMapper extends BaseMapperX&lt;CombinationActivi
43 .last("LIMIT " + count)); 43 .last("LIMIT " + count));
44 } 44 }
45 45
  46 + // TODO @puhui999:类似 BargainActivityMapper
46 /** 47 /**
47 * 获取指定 spu 编号最近参加的活动,每个 spuId 只返回一条记录 48 * 获取指定 spu 编号最近参加的活动,每个 spuId 只返回一条记录
48 * 49 *
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/combination/CombinationRecordMapper.java
@@ -100,7 +100,8 @@ public interface CombinationRecordMapper extends BaseMapperX&lt;CombinationRecordDO @@ -100,7 +100,8 @@ public interface CombinationRecordMapper extends BaseMapperX&lt;CombinationRecordDO
100 .betweenIfPresent(CombinationRecordDO::getCreateTime, pageVO.getCreateTime())); 100 .betweenIfPresent(CombinationRecordDO::getCreateTime, pageVO.getCreateTime()));
101 } 101 }
102 102
103 - default Long selectRecordCount(Integer status, Boolean virtualGroup) { 103 + // TODO @puhui999:这个最好把 headId 也作为一个参数;因为有个要求 userCount,它要 DISTINCT 下;整体可以参考 selectCombinationRecordCountMapByActivityIdAndStatusAndHeadId
  104 + default Long selectCountByHeadAndStatusAndVirtualGroup(Integer status, Boolean virtualGroup) {
104 return selectCount(new LambdaQueryWrapperX<CombinationRecordDO>() 105 return selectCount(new LambdaQueryWrapperX<CombinationRecordDO>()
105 .eq(status != null || virtualGroup != null, 106 .eq(status != null || virtualGroup != null,
106 CombinationRecordDO::getHeadId, CombinationRecordDO.HEAD_ID_GROUP) // 统计团信息则指定团长 107 CombinationRecordDO::getHeadId, CombinationRecordDO.HEAD_ID_GROUP) // 统计团信息则指定团长
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckill/seckillactivity/SeckillActivityMapper.java
@@ -58,6 +58,7 @@ public interface SeckillActivityMapper extends BaseMapperX&lt;SeckillActivityDO&gt; { @@ -58,6 +58,7 @@ public interface SeckillActivityMapper extends BaseMapperX&lt;SeckillActivityDO&gt; {
58 .apply(ObjectUtil.isNotNull(pageReqVO.getConfigId()), "FIND_IN_SET(" + pageReqVO.getConfigId() + ",config_ids) > 0")); 58 .apply(ObjectUtil.isNotNull(pageReqVO.getConfigId()), "FIND_IN_SET(" + pageReqVO.getConfigId() + ",config_ids) > 0"));
59 } 59 }
60 60
  61 + // TODO @puhui999:类似 BargainActivityMapper
61 /** 62 /**
62 * 获取指定 spu 编号最近参加的活动,每个 spuId 只返回一条记录 63 * 获取指定 spu 编号最近参加的活动,每个 spuId 只返回一条记录
63 * 64 *
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationRecordServiceImpl.java
@@ -169,19 +169,22 @@ public class CombinationRecordServiceImpl implements CombinationRecordService { @@ -169,19 +169,22 @@ public class CombinationRecordServiceImpl implements CombinationRecordService {
169 KeyValue<CombinationActivityDO, CombinationProductDO> keyValue = validateCombinationRecord(reqDTO.getUserId(), 169 KeyValue<CombinationActivityDO, CombinationProductDO> keyValue = validateCombinationRecord(reqDTO.getUserId(),
170 reqDTO.getActivityId(), reqDTO.getHeadId(), reqDTO.getSkuId(), reqDTO.getCount()); 170 reqDTO.getActivityId(), reqDTO.getHeadId(), reqDTO.getSkuId(), reqDTO.getCount());
171 171
172 - // 2. 组合数据创建拼团记录 172 + // 2.1 组合数据创建拼团记录
173 MemberUserRespDTO user = memberUserApi.getUser(reqDTO.getUserId()); 173 MemberUserRespDTO user = memberUserApi.getUser(reqDTO.getUserId());
174 ProductSpuRespDTO spu = productSpuApi.getSpu(reqDTO.getSpuId()); 174 ProductSpuRespDTO spu = productSpuApi.getSpu(reqDTO.getSpuId());
175 ProductSkuRespDTO sku = productSkuApi.getSku(reqDTO.getSkuId()); 175 ProductSkuRespDTO sku = productSkuApi.getSku(reqDTO.getSkuId());
176 CombinationRecordDO record = CombinationActivityConvert.INSTANCE.convert(reqDTO, keyValue.getKey(), user, spu, sku); 176 CombinationRecordDO record = CombinationActivityConvert.INSTANCE.convert(reqDTO, keyValue.getKey(), user, spu, sku);
177 - // 3. 如果是团长需要设置 headId 为 CombinationRecordDO#HEAD_ID_GROUP  
178 - record.setHeadId(record.getHeadId() == null ? CombinationRecordDO.HEAD_ID_GROUP : record.getHeadId()); 177 + // 2.2 如果是团长需要设置 headId 为 CombinationRecordDO#HEAD_ID_GROUP
  178 + if (record.getHeadId() == null) {
  179 + record.setHeadId(CombinationRecordDO.HEAD_ID_GROUP);
  180 + }
179 recordMapper.insert(record); 181 recordMapper.insert(record);
180 182
181 if (ObjUtil.equal(CombinationRecordDO.HEAD_ID_GROUP, record.getHeadId())) { 183 if (ObjUtil.equal(CombinationRecordDO.HEAD_ID_GROUP, record.getHeadId())) {
182 return record.getId(); 184 return record.getId();
183 } 185 }
184 186
  187 + // TODO @puhui:是不是这里的更新,放到 order 模块那;支付完成后;
185 // 4、更新拼团相关信息到订单 188 // 4、更新拼团相关信息到订单
186 tradeOrderApi.updateOrderCombinationInfo(record.getOrderId(), record.getActivityId(), record.getId(), record.getHeadId()); 189 tradeOrderApi.updateOrderCombinationInfo(record.getOrderId(), record.getActivityId(), record.getId(), record.getHeadId());
187 // 4、更新拼团记录 190 // 4、更新拼团记录
@@ -239,7 +242,7 @@ public class CombinationRecordServiceImpl implements CombinationRecordService { @@ -239,7 +242,7 @@ public class CombinationRecordServiceImpl implements CombinationRecordService {
239 242
240 @Override 243 @Override
241 public Long getCombinationRecordCount(@Nullable Integer status, @Nullable Boolean virtualGroup) { 244 public Long getCombinationRecordCount(@Nullable Integer status, @Nullable Boolean virtualGroup) {
242 - return recordMapper.selectRecordCount(status, virtualGroup); 245 + return recordMapper.selectCountByHeadAndStatusAndVirtualGroup(status, virtualGroup);
243 } 246 }
244 247
245 @Override 248 @Override
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderQueryServiceImpl.java
@@ -153,15 +153,15 @@ public class TradeOrderQueryServiceImpl implements TradeOrderQueryService { @@ -153,15 +153,15 @@ public class TradeOrderQueryServiceImpl implements TradeOrderQueryService {
153 * @return 物流轨迹 153 * @return 物流轨迹
154 */ 154 */
155 private List<ExpressTrackRespDTO> getExpressTrackList(TradeOrderDO order) { 155 private List<ExpressTrackRespDTO> getExpressTrackList(TradeOrderDO order) {
156 - // 查询物流公司  
157 if (order.getLogisticsId() == null) { 156 if (order.getLogisticsId() == null) {
158 return Collections.emptyList(); 157 return Collections.emptyList();
159 } 158 }
  159 + // 查询物流公司
160 DeliveryExpressDO express = deliveryExpressService.getDeliveryExpress(order.getLogisticsId()); 160 DeliveryExpressDO express = deliveryExpressService.getDeliveryExpress(order.getLogisticsId());
161 if (express == null) { 161 if (express == null) {
162 throw exception(EXPRESS_NOT_EXISTS); 162 throw exception(EXPRESS_NOT_EXISTS);
163 } 163 }
164 - 164 + // 查询物流轨迹
165 return getSelf().getExpressTrackList(express.getCode(), order.getLogisticsNo(), order.getReceiverMobile()); 165 return getSelf().getExpressTrackList(express.getCode(), order.getLogisticsNo(), order.getReceiverMobile());
166 } 166 }
167 167
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java
@@ -743,6 +743,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { @@ -743,6 +743,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
743 // 校验交易订单 743 // 校验交易订单
744 TradeOrderDO order = validateOrderExists(reqVO.getId()); 744 TradeOrderDO order = validateOrderExists(reqVO.getId());
745 // 发货后,不允许修改; 745 // 发货后,不允许修改;
  746 + // TODO @puhui999:只有待发货,可以执行 update
746 if (TradeOrderStatusEnum.isDelivered(order.getStatus())) { 747 if (TradeOrderStatusEnum.isDelivered(order.getStatus())) {
747 throw exception(ORDER_UPDATE_ADDRESS_FAIL_STATUS_NOT_DELIVERED); 748 throw exception(ORDER_UPDATE_ADDRESS_FAIL_STATUS_NOT_DELIVERED);
748 } 749 }