Commit 670a098aa89490824fb6a094520dbfa7d567c985

Authored by YunaiV
1 parent 708af92a

code review:拼团记录流程

Showing 15 changed files with 37 additions and 62 deletions
yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/api/combination/CombinationRecordApi.java
... ... @@ -6,8 +6,6 @@ import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationValidate
6 6  
7 7 import javax.validation.Valid;
8 8  
9   -// TODO @芋艿:后面也再撸撸这几个接口
10   -
11 9 /**
12 10 * 拼团记录 API 接口
13 11 *
... ... @@ -30,7 +28,7 @@ public interface CombinationRecordApi {
30 28 * 创建开团记录
31 29 *
32 30 * @param reqDTO 请求 DTO
33   - * @return key 开团记录编号 value 团长编号
  31 + * @return key 开团记录编号、value 团长编号
34 32 */
35 33 KeyValue<Long, Long> createCombinationRecord(@Valid CombinationRecordCreateReqDTO reqDTO);
36 34  
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/api/combination/CombinationRecordApiImpl.java
... ... @@ -29,6 +29,7 @@ public class CombinationRecordApiImpl implements CombinationRecordApi {
29 29 recordService.validateCombinationRecord(userId, activityId, headId, skuId, count);
30 30 }
31 31  
  32 + // TODO @puhui999:搞个创建的 RespDTO 哈;
32 33 @Override
33 34 public KeyValue<Long, Long> createCombinationRecord(CombinationRecordCreateReqDTO reqDTO) {
34 35 return recordService.createCombinationRecord(reqDTO);
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/combination/CombinationRecordController.java
... ... @@ -40,6 +40,9 @@ public class CombinationRecordController {
40 40 @Lazy
41 41 private CombinationRecordService combinationRecordService;
42 42  
  43 + // TODO @puhui999:getBargainRecordPage 和 getBargainRecordPage 是不是可以合并;然后 CombinationRecordReqPageVO 加一个 headId;
  44 + // 然后如果 headId 非空,并且第一页,单独多查询一条 head ;放到第 0 个位置;相当于说,第一页特殊一点;
  45 +
43 46 @GetMapping("/page")
44 47 @Operation(summary = "获得拼团记录分页")
45 48 @PreAuthorize("@ss.hasPermission('promotion:combination-record:query')")
... ... @@ -47,6 +50,7 @@ public class CombinationRecordController {
47 50 PageResult<CombinationRecordDO> recordPage = combinationRecordService.getCombinationRecordPage(pageVO);
48 51 List<CombinationActivityDO> activities = combinationActivityService.getCombinationActivityListByIds(
49 52 convertSet(recordPage.getList(), CombinationRecordDO::getActivityId));
  53 + // TODO @puhui999:商品没读取
50 54 return success(CombinationActivityConvert.INSTANCE.convert(recordPage, activities));
51 55 }
52 56  
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/bargain/AppBargainRecordController.java
... ... @@ -27,7 +27,6 @@ import io.swagger.v3.oas.annotations.Operation;
27 27 import io.swagger.v3.oas.annotations.Parameter;
28 28 import io.swagger.v3.oas.annotations.Parameters;
29 29 import io.swagger.v3.oas.annotations.tags.Tag;
30   -import org.springframework.context.annotation.Lazy;
31 30 import org.springframework.validation.annotation.Validated;
32 31 import org.springframework.web.bind.annotation.*;
33 32  
... ... @@ -49,20 +48,15 @@ public class AppBargainRecordController {
49 48 @Resource
50 49 private BargainHelpService bargainHelpService;
51 50 @Resource
52   - @Lazy
53 51 private BargainRecordService bargainRecordService;
54 52 @Resource
55   - @Lazy
56 53 private BargainActivityService bargainActivityService;
57 54  
58   -
59 55 @Resource
60 56 private TradeOrderApi tradeOrderApi;
61 57 @Resource
62   - @Lazy
63 58 private MemberUserApi memberUserApi;
64 59 @Resource
65   - @Lazy
66 60 private ProductSpuApi productSpuApi;
67 61  
68 62 @GetMapping("/get-summary")
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/bargain/BargainActivityMapper.java
... ... @@ -9,7 +9,6 @@ import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainActivityD
9 9 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
10 10 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
11 11 import org.apache.ibatis.annotations.Mapper;
12   -import org.apache.ibatis.annotations.Param;
13 12  
14 13 import java.time.LocalDateTime;
15 14 import java.util.Collection;
... ... @@ -87,6 +86,7 @@ public interface BargainActivityMapper extends BaseMapperX&lt;BargainActivityDO&gt; {
87 86 .last("LIMIT " + count));
88 87 }
89 88  
  89 + // TODO @puhui999:是不是返回 BargainActivityDO 更干净哈?
90 90 /**
91 91 * 查询出指定 spuId 的 spu 参加的活动最接近现在的一条记录。多个的话,一个 spuId 对应一个最近的活动编号
92 92 *
... ... @@ -94,7 +94,7 @@ public interface BargainActivityMapper extends BaseMapperX&lt;BargainActivityDO&gt; {
94 94 * @param status 状态
95 95 * @return 包含 spuId 和 activityId 的 map 对象列表
96 96 */
97   - default List<Map<String, Object>> selectSpuIdAndActivityIdMapsBySpuIdsAndStatus(@Param("spuIds") Collection<Long> spuIds, @Param("status") Integer status) {
  97 + default List<Map<String, Object>> selectSpuIdAndActivityIdMapsBySpuIdsAndStatus(Collection<Long> spuIds, Integer status) {
98 98 return selectMaps(new QueryWrapper<BargainActivityDO>()
99 99 .select("spu_id AS spuId, MAX(DISTINCT(id)) AS activityId") // 时间越大 id 也越大 直接用 id
100 100 .in("spu_id", spuIds)
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/combination/CombinationRecordMapper.java
... ... @@ -120,6 +120,7 @@ public interface CombinationRecordMapper extends BaseMapperX&lt;CombinationRecordDO
120 120 */
121 121 default Long selectCountByHeadAndStatusAndVirtualGroup(Integer status, Boolean virtualGroup, Long headId) {
122 122 return selectCount(new QueryWrapper<CombinationRecordDO>()
  123 + // TODO @puhui999:这种偏逻辑性的,不要给 mapper 哈;可以考虑拆成 2 个 mapper,上层也是 2 个 service;
123 124 .select(status == null && virtualGroup == null && headId == null, "DISTINCT (user_id)")
124 125 .eq(status != null, "status", status)
125 126 .eq(virtualGroup != null, "virtual_group", virtualGroup)
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/job/combination/CombinationRecordExpireJob.java
... ... @@ -22,7 +22,7 @@ public class CombinationRecordExpireJob implements JobHandler {
22 22  
23 23 @Override
24 24 @TenantJob
25   - public String execute(String param) throws Exception {
  25 + public String execute(String param) {
26 26 KeyValue<Integer, Integer> keyValue = combinationRecordService.expireCombinationRecord();
27 27 return StrUtil.format("过期拼团 {} 个, 虚拟成团 {} 个", keyValue.getKey(), keyValue.getValue());
28 28 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/bargain/BargainActivityServiceImpl.java
... ... @@ -94,7 +94,6 @@ public class BargainActivityServiceImpl implements BargainActivityService {
94 94 } else if (count > 0) {
95 95 bargainActivityMapper.updateStock(id, count);
96 96 }
97   -
98 97 }
99 98  
100 99 private void validateBargainConflict(Long spuId, Long activityId) {
... ... @@ -184,12 +183,13 @@ public class BargainActivityServiceImpl implements BargainActivityService {
184 183  
185 184 @Override
186 185 public List<BargainActivityDO> getBargainActivityBySpuIdsAndStatus(Collection<Long> spuIds, Integer status) {
187   - // 1.查询出指定 spuId 的 spu 参加的活动最接近现在的一条记录。多个的话,一个 spuId 对应一个最近的活动编号
  186 + // 1. 查询出指定 spuId 的 spu 参加的活动最接近现在的一条记录。多个的话,一个 spuId 对应一个最近的活动编号
  187 + // TODO @puhui999:我想了下,这种是不是只展示当前正在进行中的。已经结束、或者未开始的,可能没啥意义?
188 188 List<Map<String, Object>> spuIdAndActivityIdMaps = bargainActivityMapper.selectSpuIdAndActivityIdMapsBySpuIdsAndStatus(spuIds, status);
189 189 if (CollUtil.isEmpty(spuIdAndActivityIdMaps)) {
190 190 return Collections.emptyList();
191 191 }
192   - // 2.查询活动详情
  192 + // 2. 查询活动详情
193 193 return bargainActivityMapper.selectListByIds(convertSet(spuIdAndActivityIdMaps, map -> MapUtil.getLong(map, "activityId")));
194 194 }
195 195  
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationRecordService.java
... ... @@ -146,7 +146,6 @@ public interface CombinationRecordService {
146 146 */
147 147 PageResult<CombinationRecordDO> getCombinationRecordPage2(CombinationRecordReqPage2VO pageVO);
148 148  
149   -
150 149 /**
151 150 * 【拼团活动】获得拼团记录数量 Map
152 151 *
... ... @@ -159,7 +158,6 @@ public interface CombinationRecordService {
159 158 @Nullable Integer status,
160 159 @Nullable Long headId);
161 160  
162   -
163 161 /**
164 162 * 获取拼团记录
165 163 *
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationRecordServiceImpl.java
... ... @@ -23,7 +23,6 @@ import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationR
23 23 import cn.iocoder.yudao.module.promotion.dal.mysql.combination.CombinationRecordMapper;
24 24 import cn.iocoder.yudao.module.promotion.enums.combination.CombinationRecordStatusEnum;
25 25 import cn.iocoder.yudao.module.trade.api.order.TradeOrderApi;
26   -import org.springframework.context.annotation.Lazy;
27 26 import org.springframework.scheduling.annotation.Async;
28 27 import org.springframework.stereotype.Service;
29 28 import org.springframework.transaction.annotation.Transactional;
... ... @@ -52,7 +51,6 @@ import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*;
52 51 public class CombinationRecordServiceImpl implements CombinationRecordService {
53 52  
54 53 @Resource
55   - @Lazy
56 54 private CombinationActivityService combinationActivityService;
57 55 @Resource
58 56 private CombinationRecordMapper combinationRecordMapper;
... ... @@ -60,16 +58,13 @@ public class CombinationRecordServiceImpl implements CombinationRecordService {
60 58 @Resource
61 59 private MemberUserApi memberUserApi;
62 60 @Resource
63   - @Lazy
64 61 private ProductSpuApi productSpuApi;
65 62 @Resource
66   - @Lazy
67 63 private ProductSkuApi productSkuApi;
68 64  
69 65 @Resource
70 66 private TradeOrderApi tradeOrderApi;
71 67  
72   - // TODO @芋艿:在详细预览下;
73 68 @Override
74 69 @Transactional(rollbackFor = Exception.class)
75 70 public void updateCombinationRecordStatusByUserIdAndOrderId(Integer status, Long userId, Long orderId) {
... ... @@ -77,6 +72,7 @@ public class CombinationRecordServiceImpl implements CombinationRecordService {
77 72 CombinationRecordDO record = validateCombinationRecord(userId, orderId);
78 73  
79 74 // 更新状态
  75 + // TODO @puhui999:不要整个更新,new 一个出来;why?例如说,两个线程都去更新,这样存在相互覆盖的问题
80 76 record.setStatus(status);
81 77 combinationRecordMapper.updateById(record);
82 78 }
... ... @@ -169,16 +165,16 @@ public class CombinationRecordServiceImpl implements CombinationRecordService {
169 165 @Override
170 166 @Transactional(rollbackFor = Exception.class)
171 167 public KeyValue<Long, Long> createCombinationRecord(CombinationRecordCreateReqDTO reqDTO) {
172   - // 1.校验拼团活动
  168 + // 1. 校验拼团活动
173 169 KeyValue<CombinationActivityDO, CombinationProductDO> keyValue = validateCombinationRecord(reqDTO.getUserId(),
174 170 reqDTO.getActivityId(), reqDTO.getHeadId(), reqDTO.getSkuId(), reqDTO.getCount());
175 171  
176   - // 2.组合数据创建拼团记录
  172 + // 2. 组合数据创建拼团记录
177 173 MemberUserRespDTO user = memberUserApi.getUser(reqDTO.getUserId());
178 174 ProductSpuRespDTO spu = productSpuApi.getSpu(reqDTO.getSpuId());
179 175 ProductSkuRespDTO sku = productSkuApi.getSku(reqDTO.getSkuId());
180 176 CombinationRecordDO record = CombinationActivityConvert.INSTANCE.convert(reqDTO, keyValue.getKey(), user, spu, sku);
181   - // 2.1.如果是团长需要设置 headId 为 CombinationRecordDO#HEAD_ID_GROUP
  177 + // 2.1. 如果是团长需要设置 headId 为 CombinationRecordDO#HEAD_ID_GROUP
182 178 if (record.getHeadId() == null) {
183 179 record.setStartTime(LocalDateTime.now())
184 180 .setExpireTime(keyValue.getKey().getStartTime().plusHours(keyValue.getKey().getLimitDuration()))
... ... @@ -191,12 +187,10 @@ public class CombinationRecordServiceImpl implements CombinationRecordService {
191 187 }
192 188 combinationRecordMapper.insert(record);
193 189  
194   - if (ObjUtil.equal(CombinationRecordDO.HEAD_ID_GROUP, record.getHeadId())) {
195   - return new KeyValue<>(record.getId(), record.getHeadId());
  190 + // 3. 更新拼团记录
  191 + if (ObjUtil.notEqual(CombinationRecordDO.HEAD_ID_GROUP, record.getHeadId())) {
  192 + updateCombinationRecordWhenCreate(reqDTO.getHeadId(), keyValue.getKey());
196 193 }
197   -
198   - // 3、更新拼团记录
199   - updateCombinationRecordWhenCreate(reqDTO.getHeadId(), keyValue.getKey());
200 194 return new KeyValue<>(record.getId(), record.getHeadId());
201 195 }
202 196  
... ... @@ -349,6 +343,7 @@ public class CombinationRecordServiceImpl implements CombinationRecordService {
349 343  
350 344 @Override
351 345 public KeyValue<Integer, Integer> expireCombinationRecord() {
  346 + // TODO @puhui999:数字一般是 1. 2. 这种格式哈
352 347 // 1。获取所有正在进行中的过期的父拼团
353 348 List<CombinationRecordDO> headExpireRecords = combinationRecordMapper.selectListByHeadIdAndStatusAndExpireTimeLt(
354 349 CombinationRecordDO.HEAD_ID_GROUP, CombinationRecordStatusEnum.IN_PROGRESS.getStatus(), LocalDateTime.now());
... ... @@ -356,18 +351,21 @@ public class CombinationRecordServiceImpl implements CombinationRecordService {
356 351 return new KeyValue<>(0, 0);
357 352 }
358 353  
359   - // 2.获取拼团活动
  354 + // 2. 获取拼团活动
  355 + // TODO @puhui999:在自己模块里,变量可以简略点;例如说 activityList
360 356 List<CombinationActivityDO> combinationActivities = combinationActivityService.getCombinationActivityListByIds(
361 357 convertSet(headExpireRecords, CombinationRecordDO::getActivityId));
362 358 Map<Long, CombinationActivityDO> activityMap = convertMap(combinationActivities, CombinationActivityDO::getId);
363 359  
364   - // 3.校验是否虚拟成团
  360 + // TODO @puhui999:job 一般不建议异步跑;因为可能下次跑,结果上次还没跑完;
  361 + // TODO 这里,我们可以每个 record 处理下;然后按照是否需要虚拟拼团,各搞一个方法逻辑 + 事务;这样,保证 job 里面尽量不要大事务,而是 n 个独立小事务的处理。
  362 + // 3. 校验是否虚拟成团
365 363 List<CombinationRecordDO> virtualGroupHeadRecords = new ArrayList<>(); // 虚拟成团
366 364 for (Iterator<CombinationRecordDO> iterator = headExpireRecords.iterator(); iterator.hasNext(); ) {
367 365 CombinationRecordDO record = iterator.next();
368 366 // 3.1 不匹配,则直接跳过
369   - CombinationActivityDO activityDO = activityMap.get(record.getActivityId());
370   - if (activityDO == null || !activityDO.getVirtualGroup()) { // 取不到活动的或者不是虚拟拼团的
  367 + CombinationActivityDO activity = activityMap.get(record.getActivityId());
  368 + if (activity == null || !activity.getVirtualGroup()) { // 取不到活动的或者不是虚拟拼团的
371 369 continue;
372 370 }
373 371 // 3.2 匹配,则移除,添加到虚拟成团中,并结束寻找
... ... @@ -380,7 +378,6 @@ public class CombinationRecordServiceImpl implements CombinationRecordService {
380 378 getSelf().handleExpireRecord(headExpireRecords);
381 379 // 5.虚拟成团
382 380 getSelf().handleVirtualGroupRecord(virtualGroupHeadRecords);
383   -
384 381 return new KeyValue<>(headExpireRecords.size(), virtualGroupHeadRecords.size());
385 382 }
386 383  
... ... @@ -401,7 +398,6 @@ public class CombinationRecordServiceImpl implements CombinationRecordService {
401 398 headsAndRecords.forEach(item -> {
402 399 tradeOrderApi.cancelPaidOrder(item.getUserId(), item.getOrderId());
403 400 });
404   -
405 401 }
406 402  
407 403 @Async
... ... @@ -410,9 +406,9 @@ public class CombinationRecordServiceImpl implements CombinationRecordService {
410 406 return;
411 407 }
412 408  
413   - // 1.团员补齐
  409 + // 1. 团员补齐
414 410 combinationRecordMapper.insertBatch(CombinationActivityConvert.INSTANCE.convertVirtualGroupList(virtualGroupHeadRecords));
415   - // 2.更新拼团记录
  411 + // 2. 更新拼团记录
416 412 updateBatchCombinationRecords(virtualGroupHeadRecords, CombinationRecordStatusEnum.SUCCESS);
417 413 }
418 414  
... ...
yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/api/order/TradeOrderApi.java
... ... @@ -39,16 +39,7 @@ public interface TradeOrderApi {
39 39 */
40 40 TradeOrderSummaryRespDTO getOrderSummary(LocalDateTime beginTime, LocalDateTime endTime);
41 41  
42   - /**
43   - * 更新拼团相关信息到订单
44   - *
45   - * @param orderId 订单编号
46   - * @param activityId 拼团活动编号
47   - * @param combinationRecordId 拼团记录编号
48   - * @param headId 团长编号
49   - */
50   - void updateOrderCombinationInfo(Long orderId, Long activityId, Long combinationRecordId, Long headId);
51   -
  42 + // TODO 芋艿:需要优化下;
52 43 /**
53 44 * 取消支付订单
54 45 *
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/api/order/TradeOrderApiImpl.java
... ... @@ -5,7 +5,6 @@ import cn.iocoder.yudao.module.trade.api.order.dto.TradeOrderSummaryRespDTO;
5 5 import cn.iocoder.yudao.module.trade.convert.order.TradeOrderConvert;
6 6 import cn.iocoder.yudao.module.trade.service.order.TradeOrderQueryService;
7 7 import cn.iocoder.yudao.module.trade.service.order.TradeOrderUpdateService;
8   -import org.springframework.context.annotation.Lazy;
9 8 import org.springframework.stereotype.Service;
10 9 import org.springframework.validation.annotation.Validated;
11 10  
... ... @@ -26,7 +25,6 @@ public class TradeOrderApiImpl implements TradeOrderApi {
26 25 @Resource
27 26 private TradeOrderUpdateService tradeOrderUpdateService;
28 27 @Resource
29   - @Lazy
30 28 private TradeOrderQueryService tradeOrderQueryService;
31 29  
32 30 @Override
... ... @@ -45,11 +43,6 @@ public class TradeOrderApiImpl implements TradeOrderApi {
45 43 }
46 44  
47 45 @Override
48   - public void updateOrderCombinationInfo(Long orderId, Long activityId, Long combinationRecordId, Long headId) {
49   - tradeOrderUpdateService.updateOrderCombinationInfo(orderId, activityId, combinationRecordId, headId);
50   - }
51   -
52   - @Override
53 46 public void cancelPaidOrder(Long userId, Long orderId) {
54 47 tradeOrderUpdateService.cancelPaidOrder(userId, orderId);
55 48 }
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/order/TradeOrderMapper.java
... ... @@ -110,6 +110,7 @@ public interface TradeOrderMapper extends BaseMapperX&lt;TradeOrderDO&gt; {
110 110 return selectOne(TradeOrderDO::getPickUpVerifyCode, pickUpVerifyCode);
111 111 }
112 112  
  113 + // TODO @hui999:是不是只针对 combinationActivityId 的查询呀?
113 114 default TradeOrderDO selectByUserIdAndActivityIdAndStatus(Long userId, Long activityId, Integer status) {
114 115 return selectOne(new LambdaQueryWrapperX<TradeOrderDO>()
115 116 .and(q -> q.eq(TradeOrderDO::getUserId, userId)
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java
... ... @@ -657,7 +657,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
657 657 public void updateOrderAddress(TradeOrderUpdateAddressReqVO reqVO) {
658 658 // 校验交易订单
659 659 TradeOrderDO order = validateOrderExists(reqVO.getId());
660   - // 只有待发货状态才可以修改订单收货地址;
  660 + // 只有待发货状态,才可以修改订单收货地址;
661 661 if (!TradeOrderStatusEnum.isUndelivered(order.getStatus())) {
662 662 throw exception(ORDER_UPDATE_ADDRESS_FAIL_STATUS_NOT_DELIVERED);
663 663 }
... ... @@ -823,11 +823,11 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
823 823 @Override
824 824 @Transactional(rollbackFor = Exception.class)
825 825 public void cancelPaidOrder(Long userId, Long orderId) {
  826 + // TODO 芋艿:这里实现要优化下;
826 827 TradeOrderDO order = tradeOrderMapper.selectOrderByIdAndUserId(orderId, userId);
827 828 if (order == null) {
828 829 throw exception(ORDER_NOT_FOUND);
829 830 }
830   -
831 831 cancelOrder0(order, TradeOrderCancelTypeEnum.MEMBER_CANCEL);
832 832 }
833 833  
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeCombinationOrderHandler.java
... ... @@ -10,7 +10,6 @@ import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum;
10 10 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
11 11 import cn.iocoder.yudao.module.trade.service.order.TradeOrderQueryService;
12 12 import cn.iocoder.yudao.module.trade.service.order.TradeOrderUpdateService;
13   -import org.springframework.context.annotation.Lazy;
14 13 import org.springframework.stereotype.Component;
15 14  
16 15 import javax.annotation.Resource;
... ... @@ -29,14 +28,11 @@ import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.ORDER_DELIV
29 28 public class TradeCombinationOrderHandler implements TradeOrderHandler {
30 29  
31 30 @Resource
32   - @Lazy
33 31 private TradeOrderUpdateService orderUpdateService;
34 32 @Resource
35   - @Lazy
36 33 private TradeOrderQueryService orderQueryService;
37 34  
38 35 @Resource
39   - @Lazy
40 36 private CombinationRecordApi combinationRecordApi;
41 37  
42 38 @Override
... ... @@ -51,7 +47,9 @@ public class TradeCombinationOrderHandler implements TradeOrderHandler {
51 47 TradeOrderItemDO item = orderItems.get(0);
52 48 combinationRecordApi.validateCombinationRecord(order.getUserId(), order.getCombinationActivityId(),
53 49 order.getCombinationHeadId(), item.getSkuId(), item.getCount());
54   - // 2. 校验该用户是否存在未支付的拼团活动订单;就是还没支付的时候,重复下单了;需要校验下;不然的话,一个拼团可以下多个单子了;
  50 +
  51 + // 2. 校验该用户是否存在未支付的拼团活动订单,避免一个拼团可以下多个单子了
  52 + // TODO @puhui999:只校验未支付的拼团订单噢
55 53 TradeOrderDO activityOrder = orderQueryService.getActivityOrderByUserIdAndActivityIdAndStatus(
56 54 order.getUserId(), order.getCombinationActivityId(), TradeOrderStatusEnum.UNPAID.getStatus());
57 55 if (activityOrder != null) {
... ...