Commit 670a098aa89490824fb6a094520dbfa7d567c985
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<BargainActivityDO> { |
| 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<BargainActivityDO> { |
| 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<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<TradeOrderDO> { |
| 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) { | ... | ... |