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