mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-10-31 10:18:42 +08:00 
			
		
		
		
	code review:拼团记录流程
This commit is contained in:
		| @@ -6,8 +6,6 @@ import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationValidate | |||||||
|  |  | ||||||
| import javax.validation.Valid; | import javax.validation.Valid; | ||||||
|  |  | ||||||
| // TODO @芋艿:后面也再撸撸这几个接口 |  | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * 拼团记录 API 接口 |  * 拼团记录 API 接口 | ||||||
|  * |  * | ||||||
| @@ -30,7 +28,7 @@ public interface CombinationRecordApi { | |||||||
|      * 创建开团记录 |      * 创建开团记录 | ||||||
|      * |      * | ||||||
|      * @param reqDTO 请求 DTO |      * @param reqDTO 请求 DTO | ||||||
|      * @return key 开团记录编号 value 团长编号 |      * @return key 开团记录编号、value 团长编号 | ||||||
|      */ |      */ | ||||||
|     KeyValue<Long, Long> createCombinationRecord(@Valid CombinationRecordCreateReqDTO reqDTO); |     KeyValue<Long, Long> createCombinationRecord(@Valid CombinationRecordCreateReqDTO reqDTO); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -29,6 +29,7 @@ public class CombinationRecordApiImpl implements CombinationRecordApi { | |||||||
|         recordService.validateCombinationRecord(userId, activityId, headId, skuId, count); |         recordService.validateCombinationRecord(userId, activityId, headId, skuId, count); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     // TODO @puhui999:搞个创建的 RespDTO 哈; | ||||||
|     @Override |     @Override | ||||||
|     public KeyValue<Long, Long> createCombinationRecord(CombinationRecordCreateReqDTO reqDTO) { |     public KeyValue<Long, Long> createCombinationRecord(CombinationRecordCreateReqDTO reqDTO) { | ||||||
|         return recordService.createCombinationRecord(reqDTO); |         return recordService.createCombinationRecord(reqDTO); | ||||||
|   | |||||||
| @@ -40,6 +40,9 @@ public class CombinationRecordController { | |||||||
|     @Lazy |     @Lazy | ||||||
|     private CombinationRecordService combinationRecordService; |     private CombinationRecordService combinationRecordService; | ||||||
|  |  | ||||||
|  |     // TODO @puhui999:getBargainRecordPage 和 getBargainRecordPage 是不是可以合并;然后 CombinationRecordReqPageVO 加一个 headId; | ||||||
|  |     // 然后如果 headId 非空,并且第一页,单独多查询一条 head ;放到第 0 个位置;相当于说,第一页特殊一点; | ||||||
|  |  | ||||||
|     @GetMapping("/page") |     @GetMapping("/page") | ||||||
|     @Operation(summary = "获得拼团记录分页") |     @Operation(summary = "获得拼团记录分页") | ||||||
|     @PreAuthorize("@ss.hasPermission('promotion:combination-record:query')") |     @PreAuthorize("@ss.hasPermission('promotion:combination-record:query')") | ||||||
| @@ -47,6 +50,7 @@ public class CombinationRecordController { | |||||||
|         PageResult<CombinationRecordDO> recordPage = combinationRecordService.getCombinationRecordPage(pageVO); |         PageResult<CombinationRecordDO> recordPage = combinationRecordService.getCombinationRecordPage(pageVO); | ||||||
|         List<CombinationActivityDO> activities = combinationActivityService.getCombinationActivityListByIds( |         List<CombinationActivityDO> activities = combinationActivityService.getCombinationActivityListByIds( | ||||||
|                 convertSet(recordPage.getList(), CombinationRecordDO::getActivityId)); |                 convertSet(recordPage.getList(), CombinationRecordDO::getActivityId)); | ||||||
|  |         // TODO @puhui999:商品没读取 | ||||||
|         return success(CombinationActivityConvert.INSTANCE.convert(recordPage, activities)); |         return success(CombinationActivityConvert.INSTANCE.convert(recordPage, activities)); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -27,7 +27,6 @@ import io.swagger.v3.oas.annotations.Operation; | |||||||
| import io.swagger.v3.oas.annotations.Parameter; | import io.swagger.v3.oas.annotations.Parameter; | ||||||
| import io.swagger.v3.oas.annotations.Parameters; | import io.swagger.v3.oas.annotations.Parameters; | ||||||
| import io.swagger.v3.oas.annotations.tags.Tag; | import io.swagger.v3.oas.annotations.tags.Tag; | ||||||
| import org.springframework.context.annotation.Lazy; |  | ||||||
| import org.springframework.validation.annotation.Validated; | import org.springframework.validation.annotation.Validated; | ||||||
| import org.springframework.web.bind.annotation.*; | import org.springframework.web.bind.annotation.*; | ||||||
|  |  | ||||||
| @@ -49,20 +48,15 @@ public class AppBargainRecordController { | |||||||
|     @Resource |     @Resource | ||||||
|     private BargainHelpService bargainHelpService; |     private BargainHelpService bargainHelpService; | ||||||
|     @Resource |     @Resource | ||||||
|     @Lazy |  | ||||||
|     private BargainRecordService bargainRecordService; |     private BargainRecordService bargainRecordService; | ||||||
|     @Resource |     @Resource | ||||||
|     @Lazy |  | ||||||
|     private BargainActivityService bargainActivityService; |     private BargainActivityService bargainActivityService; | ||||||
|  |  | ||||||
|  |  | ||||||
|     @Resource |     @Resource | ||||||
|     private TradeOrderApi tradeOrderApi; |     private TradeOrderApi tradeOrderApi; | ||||||
|     @Resource |     @Resource | ||||||
|     @Lazy |  | ||||||
|     private MemberUserApi memberUserApi; |     private MemberUserApi memberUserApi; | ||||||
|     @Resource |     @Resource | ||||||
|     @Lazy |  | ||||||
|     private ProductSpuApi productSpuApi; |     private ProductSpuApi productSpuApi; | ||||||
|  |  | ||||||
|     @GetMapping("/get-summary") |     @GetMapping("/get-summary") | ||||||
|   | |||||||
| @@ -9,7 +9,6 @@ import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainActivityD | |||||||
| import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | ||||||
| import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; | ||||||
| import org.apache.ibatis.annotations.Mapper; | import org.apache.ibatis.annotations.Mapper; | ||||||
| import org.apache.ibatis.annotations.Param; |  | ||||||
|  |  | ||||||
| import java.time.LocalDateTime; | import java.time.LocalDateTime; | ||||||
| import java.util.Collection; | import java.util.Collection; | ||||||
| @@ -87,6 +86,7 @@ public interface BargainActivityMapper extends BaseMapperX<BargainActivityDO> { | |||||||
|                 .last("LIMIT " + count)); |                 .last("LIMIT " + count)); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     // TODO @puhui999:是不是返回 BargainActivityDO 更干净哈? | ||||||
|     /** |     /** | ||||||
|      * 查询出指定 spuId 的 spu 参加的活动最接近现在的一条记录。多个的话,一个 spuId 对应一个最近的活动编号 |      * 查询出指定 spuId 的 spu 参加的活动最接近现在的一条记录。多个的话,一个 spuId 对应一个最近的活动编号 | ||||||
|      * |      * | ||||||
| @@ -94,7 +94,7 @@ public interface BargainActivityMapper extends BaseMapperX<BargainActivityDO> { | |||||||
|      * @param status 状态 |      * @param status 状态 | ||||||
|      * @return 包含 spuId 和 activityId 的 map 对象列表 |      * @return 包含 spuId 和 activityId 的 map 对象列表 | ||||||
|      */ |      */ | ||||||
|     default List<Map<String, Object>> selectSpuIdAndActivityIdMapsBySpuIdsAndStatus(@Param("spuIds") Collection<Long> spuIds, @Param("status") Integer status) { |     default List<Map<String, Object>> selectSpuIdAndActivityIdMapsBySpuIdsAndStatus(Collection<Long> spuIds, Integer status) { | ||||||
|         return selectMaps(new QueryWrapper<BargainActivityDO>() |         return selectMaps(new QueryWrapper<BargainActivityDO>() | ||||||
|                 .select("spu_id AS spuId, MAX(DISTINCT(id)) AS activityId") // 时间越大 id 也越大 直接用 id |                 .select("spu_id AS spuId, MAX(DISTINCT(id)) AS activityId") // 时间越大 id 也越大 直接用 id | ||||||
|                 .in("spu_id", spuIds) |                 .in("spu_id", spuIds) | ||||||
|   | |||||||
| @@ -120,6 +120,7 @@ public interface CombinationRecordMapper extends BaseMapperX<CombinationRecordDO | |||||||
|      */ |      */ | ||||||
|     default Long selectCountByHeadAndStatusAndVirtualGroup(Integer status, Boolean virtualGroup, Long headId) { |     default Long selectCountByHeadAndStatusAndVirtualGroup(Integer status, Boolean virtualGroup, Long headId) { | ||||||
|         return selectCount(new QueryWrapper<CombinationRecordDO>() |         return selectCount(new QueryWrapper<CombinationRecordDO>() | ||||||
|  |                 // TODO @puhui999:这种偏逻辑性的,不要给 mapper 哈;可以考虑拆成 2 个 mapper,上层也是 2 个 service; | ||||||
|                 .select(status == null && virtualGroup == null && headId == null, "DISTINCT (user_id)") |                 .select(status == null && virtualGroup == null && headId == null, "DISTINCT (user_id)") | ||||||
|                 .eq(status != null, "status", status) |                 .eq(status != null, "status", status) | ||||||
|                 .eq(virtualGroup != null, "virtual_group", virtualGroup) |                 .eq(virtualGroup != null, "virtual_group", virtualGroup) | ||||||
|   | |||||||
| @@ -22,7 +22,7 @@ public class CombinationRecordExpireJob implements JobHandler { | |||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     @TenantJob |     @TenantJob | ||||||
|     public String execute(String param) throws Exception { |     public String execute(String param) { | ||||||
|         KeyValue<Integer, Integer> keyValue = combinationRecordService.expireCombinationRecord(); |         KeyValue<Integer, Integer> keyValue = combinationRecordService.expireCombinationRecord(); | ||||||
|         return StrUtil.format("过期拼团 {} 个, 虚拟成团 {} 个", keyValue.getKey(), keyValue.getValue()); |         return StrUtil.format("过期拼团 {} 个, 虚拟成团 {} 个", keyValue.getKey(), keyValue.getValue()); | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -94,7 +94,6 @@ public class BargainActivityServiceImpl implements BargainActivityService { | |||||||
|         } else if (count > 0) { |         } else if (count > 0) { | ||||||
|             bargainActivityMapper.updateStock(id, count); |             bargainActivityMapper.updateStock(id, count); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private void validateBargainConflict(Long spuId, Long activityId) { |     private void validateBargainConflict(Long spuId, Long activityId) { | ||||||
| @@ -185,6 +184,7 @@ public class BargainActivityServiceImpl implements BargainActivityService { | |||||||
|     @Override |     @Override | ||||||
|     public List<BargainActivityDO> getBargainActivityBySpuIdsAndStatus(Collection<Long> spuIds, Integer status) { |     public List<BargainActivityDO> getBargainActivityBySpuIdsAndStatus(Collection<Long> spuIds, Integer status) { | ||||||
|         // 1. 查询出指定 spuId 的 spu 参加的活动最接近现在的一条记录。多个的话,一个 spuId 对应一个最近的活动编号 |         // 1. 查询出指定 spuId 的 spu 参加的活动最接近现在的一条记录。多个的话,一个 spuId 对应一个最近的活动编号 | ||||||
|  |         // TODO @puhui999:我想了下,这种是不是只展示当前正在进行中的。已经结束、或者未开始的,可能没啥意义? | ||||||
|         List<Map<String, Object>> spuIdAndActivityIdMaps = bargainActivityMapper.selectSpuIdAndActivityIdMapsBySpuIdsAndStatus(spuIds, status); |         List<Map<String, Object>> spuIdAndActivityIdMaps = bargainActivityMapper.selectSpuIdAndActivityIdMapsBySpuIdsAndStatus(spuIds, status); | ||||||
|         if (CollUtil.isEmpty(spuIdAndActivityIdMaps)) { |         if (CollUtil.isEmpty(spuIdAndActivityIdMaps)) { | ||||||
|             return Collections.emptyList(); |             return Collections.emptyList(); | ||||||
|   | |||||||
| @@ -146,7 +146,6 @@ public interface CombinationRecordService { | |||||||
|      */ |      */ | ||||||
|     PageResult<CombinationRecordDO> getCombinationRecordPage2(CombinationRecordReqPage2VO pageVO); |     PageResult<CombinationRecordDO> getCombinationRecordPage2(CombinationRecordReqPage2VO pageVO); | ||||||
|  |  | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 【拼团活动】获得拼团记录数量 Map |      * 【拼团活动】获得拼团记录数量 Map | ||||||
|      * |      * | ||||||
| @@ -159,7 +158,6 @@ public interface CombinationRecordService { | |||||||
|                                                               @Nullable Integer status, |                                                               @Nullable Integer status, | ||||||
|                                                               @Nullable Long headId); |                                                               @Nullable Long headId); | ||||||
|  |  | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 获取拼团记录 |      * 获取拼团记录 | ||||||
|      * |      * | ||||||
|   | |||||||
| @@ -23,7 +23,6 @@ import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationR | |||||||
| import cn.iocoder.yudao.module.promotion.dal.mysql.combination.CombinationRecordMapper; | import cn.iocoder.yudao.module.promotion.dal.mysql.combination.CombinationRecordMapper; | ||||||
| import cn.iocoder.yudao.module.promotion.enums.combination.CombinationRecordStatusEnum; | import cn.iocoder.yudao.module.promotion.enums.combination.CombinationRecordStatusEnum; | ||||||
| import cn.iocoder.yudao.module.trade.api.order.TradeOrderApi; | import cn.iocoder.yudao.module.trade.api.order.TradeOrderApi; | ||||||
| import org.springframework.context.annotation.Lazy; |  | ||||||
| import org.springframework.scheduling.annotation.Async; | import org.springframework.scheduling.annotation.Async; | ||||||
| import org.springframework.stereotype.Service; | import org.springframework.stereotype.Service; | ||||||
| import org.springframework.transaction.annotation.Transactional; | import org.springframework.transaction.annotation.Transactional; | ||||||
| @@ -52,7 +51,6 @@ import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*; | |||||||
| public class CombinationRecordServiceImpl implements CombinationRecordService { | public class CombinationRecordServiceImpl implements CombinationRecordService { | ||||||
|  |  | ||||||
|     @Resource |     @Resource | ||||||
|     @Lazy |  | ||||||
|     private CombinationActivityService combinationActivityService; |     private CombinationActivityService combinationActivityService; | ||||||
|     @Resource |     @Resource | ||||||
|     private CombinationRecordMapper combinationRecordMapper; |     private CombinationRecordMapper combinationRecordMapper; | ||||||
| @@ -60,16 +58,13 @@ public class CombinationRecordServiceImpl implements CombinationRecordService { | |||||||
|     @Resource |     @Resource | ||||||
|     private MemberUserApi memberUserApi; |     private MemberUserApi memberUserApi; | ||||||
|     @Resource |     @Resource | ||||||
|     @Lazy |  | ||||||
|     private ProductSpuApi productSpuApi; |     private ProductSpuApi productSpuApi; | ||||||
|     @Resource |     @Resource | ||||||
|     @Lazy |  | ||||||
|     private ProductSkuApi productSkuApi; |     private ProductSkuApi productSkuApi; | ||||||
|  |  | ||||||
|     @Resource |     @Resource | ||||||
|     private TradeOrderApi tradeOrderApi; |     private TradeOrderApi tradeOrderApi; | ||||||
|  |  | ||||||
|     // TODO @芋艿:在详细预览下; |  | ||||||
|     @Override |     @Override | ||||||
|     @Transactional(rollbackFor = Exception.class) |     @Transactional(rollbackFor = Exception.class) | ||||||
|     public void updateCombinationRecordStatusByUserIdAndOrderId(Integer status, Long userId, Long orderId) { |     public void updateCombinationRecordStatusByUserIdAndOrderId(Integer status, Long userId, Long orderId) { | ||||||
| @@ -77,6 +72,7 @@ public class CombinationRecordServiceImpl implements CombinationRecordService { | |||||||
|         CombinationRecordDO record = validateCombinationRecord(userId, orderId); |         CombinationRecordDO record = validateCombinationRecord(userId, orderId); | ||||||
|  |  | ||||||
|         // 更新状态 |         // 更新状态 | ||||||
|  |         // TODO @puhui999:不要整个更新,new 一个出来;why?例如说,两个线程都去更新,这样存在相互覆盖的问题 | ||||||
|         record.setStatus(status); |         record.setStatus(status); | ||||||
|         combinationRecordMapper.updateById(record); |         combinationRecordMapper.updateById(record); | ||||||
|     } |     } | ||||||
| @@ -191,12 +187,10 @@ public class CombinationRecordServiceImpl implements CombinationRecordService { | |||||||
|         } |         } | ||||||
|         combinationRecordMapper.insert(record); |         combinationRecordMapper.insert(record); | ||||||
|  |  | ||||||
|         if (ObjUtil.equal(CombinationRecordDO.HEAD_ID_GROUP, record.getHeadId())) { |         // 3. 更新拼团记录 | ||||||
|             return new KeyValue<>(record.getId(), record.getHeadId()); |         if (ObjUtil.notEqual(CombinationRecordDO.HEAD_ID_GROUP, record.getHeadId())) { | ||||||
|         } |  | ||||||
|  |  | ||||||
|         // 3、更新拼团记录 |  | ||||||
|             updateCombinationRecordWhenCreate(reqDTO.getHeadId(), keyValue.getKey()); |             updateCombinationRecordWhenCreate(reqDTO.getHeadId(), keyValue.getKey()); | ||||||
|  |         } | ||||||
|         return new KeyValue<>(record.getId(), record.getHeadId()); |         return new KeyValue<>(record.getId(), record.getHeadId()); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -349,6 +343,7 @@ public class CombinationRecordServiceImpl implements CombinationRecordService { | |||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public KeyValue<Integer, Integer> expireCombinationRecord() { |     public KeyValue<Integer, Integer> expireCombinationRecord() { | ||||||
|  |         // TODO @puhui999:数字一般是 1. 2. 这种格式哈 | ||||||
|         // 1。获取所有正在进行中的过期的父拼团 |         // 1。获取所有正在进行中的过期的父拼团 | ||||||
|         List<CombinationRecordDO> headExpireRecords = combinationRecordMapper.selectListByHeadIdAndStatusAndExpireTimeLt( |         List<CombinationRecordDO> headExpireRecords = combinationRecordMapper.selectListByHeadIdAndStatusAndExpireTimeLt( | ||||||
|                 CombinationRecordDO.HEAD_ID_GROUP, CombinationRecordStatusEnum.IN_PROGRESS.getStatus(), LocalDateTime.now()); |                 CombinationRecordDO.HEAD_ID_GROUP, CombinationRecordStatusEnum.IN_PROGRESS.getStatus(), LocalDateTime.now()); | ||||||
| @@ -357,17 +352,20 @@ public class CombinationRecordServiceImpl implements CombinationRecordService { | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         // 2. 获取拼团活动 |         // 2. 获取拼团活动 | ||||||
|  |         // TODO @puhui999:在自己模块里,变量可以简略点;例如说 activityList | ||||||
|         List<CombinationActivityDO> combinationActivities = combinationActivityService.getCombinationActivityListByIds( |         List<CombinationActivityDO> combinationActivities = combinationActivityService.getCombinationActivityListByIds( | ||||||
|                 convertSet(headExpireRecords, CombinationRecordDO::getActivityId)); |                 convertSet(headExpireRecords, CombinationRecordDO::getActivityId)); | ||||||
|         Map<Long, CombinationActivityDO> activityMap = convertMap(combinationActivities, CombinationActivityDO::getId); |         Map<Long, CombinationActivityDO> activityMap = convertMap(combinationActivities, CombinationActivityDO::getId); | ||||||
|  |  | ||||||
|  |         // TODO @puhui999:job 一般不建议异步跑;因为可能下次跑,结果上次还没跑完; | ||||||
|  |         // TODO 这里,我们可以每个 record 处理下;然后按照是否需要虚拟拼团,各搞一个方法逻辑 + 事务;这样,保证 job 里面尽量不要大事务,而是 n 个独立小事务的处理。 | ||||||
|         // 3. 校验是否虚拟成团 |         // 3. 校验是否虚拟成团 | ||||||
|         List<CombinationRecordDO> virtualGroupHeadRecords = new ArrayList<>(); // 虚拟成团 |         List<CombinationRecordDO> virtualGroupHeadRecords = new ArrayList<>(); // 虚拟成团 | ||||||
|         for (Iterator<CombinationRecordDO> iterator = headExpireRecords.iterator(); iterator.hasNext(); ) { |         for (Iterator<CombinationRecordDO> iterator = headExpireRecords.iterator(); iterator.hasNext(); ) { | ||||||
|             CombinationRecordDO record = iterator.next(); |             CombinationRecordDO record = iterator.next(); | ||||||
|             // 3.1 不匹配,则直接跳过 |             // 3.1 不匹配,则直接跳过 | ||||||
|             CombinationActivityDO activityDO = activityMap.get(record.getActivityId()); |             CombinationActivityDO activity = activityMap.get(record.getActivityId()); | ||||||
|             if (activityDO == null || !activityDO.getVirtualGroup()) { // 取不到活动的或者不是虚拟拼团的 |             if (activity == null || !activity.getVirtualGroup()) { // 取不到活动的或者不是虚拟拼团的 | ||||||
|                 continue; |                 continue; | ||||||
|             } |             } | ||||||
|             // 3.2 匹配,则移除,添加到虚拟成团中,并结束寻找 |             // 3.2 匹配,则移除,添加到虚拟成团中,并结束寻找 | ||||||
| @@ -380,7 +378,6 @@ public class CombinationRecordServiceImpl implements CombinationRecordService { | |||||||
|         getSelf().handleExpireRecord(headExpireRecords); |         getSelf().handleExpireRecord(headExpireRecords); | ||||||
|         // 5.虚拟成团 |         // 5.虚拟成团 | ||||||
|         getSelf().handleVirtualGroupRecord(virtualGroupHeadRecords); |         getSelf().handleVirtualGroupRecord(virtualGroupHeadRecords); | ||||||
|  |  | ||||||
|         return new KeyValue<>(headExpireRecords.size(), virtualGroupHeadRecords.size()); |         return new KeyValue<>(headExpireRecords.size(), virtualGroupHeadRecords.size()); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -401,7 +398,6 @@ public class CombinationRecordServiceImpl implements CombinationRecordService { | |||||||
|         headsAndRecords.forEach(item -> { |         headsAndRecords.forEach(item -> { | ||||||
|             tradeOrderApi.cancelPaidOrder(item.getUserId(), item.getOrderId()); |             tradeOrderApi.cancelPaidOrder(item.getUserId(), item.getOrderId()); | ||||||
|         }); |         }); | ||||||
|  |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Async |     @Async | ||||||
|   | |||||||
| @@ -39,16 +39,7 @@ public interface TradeOrderApi { | |||||||
|      */ |      */ | ||||||
|     TradeOrderSummaryRespDTO getOrderSummary(LocalDateTime beginTime, LocalDateTime endTime); |     TradeOrderSummaryRespDTO getOrderSummary(LocalDateTime beginTime, LocalDateTime endTime); | ||||||
|  |  | ||||||
|     /** |     // TODO 芋艿:需要优化下; | ||||||
|      * 更新拼团相关信息到订单 |  | ||||||
|      * |  | ||||||
|      * @param orderId             订单编号 |  | ||||||
|      * @param activityId          拼团活动编号 |  | ||||||
|      * @param combinationRecordId 拼团记录编号 |  | ||||||
|      * @param headId              团长编号 |  | ||||||
|      */ |  | ||||||
|     void updateOrderCombinationInfo(Long orderId, Long activityId, Long combinationRecordId, Long headId); |  | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 取消支付订单 |      * 取消支付订单 | ||||||
|      * |      * | ||||||
|   | |||||||
| @@ -5,7 +5,6 @@ import cn.iocoder.yudao.module.trade.api.order.dto.TradeOrderSummaryRespDTO; | |||||||
| import cn.iocoder.yudao.module.trade.convert.order.TradeOrderConvert; | import cn.iocoder.yudao.module.trade.convert.order.TradeOrderConvert; | ||||||
| import cn.iocoder.yudao.module.trade.service.order.TradeOrderQueryService; | import cn.iocoder.yudao.module.trade.service.order.TradeOrderQueryService; | ||||||
| import cn.iocoder.yudao.module.trade.service.order.TradeOrderUpdateService; | import cn.iocoder.yudao.module.trade.service.order.TradeOrderUpdateService; | ||||||
| import org.springframework.context.annotation.Lazy; |  | ||||||
| import org.springframework.stereotype.Service; | import org.springframework.stereotype.Service; | ||||||
| import org.springframework.validation.annotation.Validated; | import org.springframework.validation.annotation.Validated; | ||||||
|  |  | ||||||
| @@ -26,7 +25,6 @@ public class TradeOrderApiImpl implements TradeOrderApi { | |||||||
|     @Resource |     @Resource | ||||||
|     private TradeOrderUpdateService tradeOrderUpdateService; |     private TradeOrderUpdateService tradeOrderUpdateService; | ||||||
|     @Resource |     @Resource | ||||||
|     @Lazy |  | ||||||
|     private TradeOrderQueryService tradeOrderQueryService; |     private TradeOrderQueryService tradeOrderQueryService; | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
| @@ -44,11 +42,6 @@ public class TradeOrderApiImpl implements TradeOrderApi { | |||||||
|         return tradeOrderQueryService.getOrderSummary(beginTime, endTime); |         return tradeOrderQueryService.getOrderSummary(beginTime, endTime); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |  | ||||||
|     public void updateOrderCombinationInfo(Long orderId, Long activityId, Long combinationRecordId, Long headId) { |  | ||||||
|         tradeOrderUpdateService.updateOrderCombinationInfo(orderId, activityId, combinationRecordId, headId); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public void cancelPaidOrder(Long userId, Long orderId) { |     public void cancelPaidOrder(Long userId, Long orderId) { | ||||||
|         tradeOrderUpdateService.cancelPaidOrder(userId, orderId); |         tradeOrderUpdateService.cancelPaidOrder(userId, orderId); | ||||||
|   | |||||||
| @@ -110,6 +110,7 @@ public interface TradeOrderMapper extends BaseMapperX<TradeOrderDO> { | |||||||
|         return selectOne(TradeOrderDO::getPickUpVerifyCode, pickUpVerifyCode); |         return selectOne(TradeOrderDO::getPickUpVerifyCode, pickUpVerifyCode); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     // TODO @hui999:是不是只针对 combinationActivityId 的查询呀? | ||||||
|     default TradeOrderDO selectByUserIdAndActivityIdAndStatus(Long userId, Long activityId, Integer status) { |     default TradeOrderDO selectByUserIdAndActivityIdAndStatus(Long userId, Long activityId, Integer status) { | ||||||
|         return selectOne(new LambdaQueryWrapperX<TradeOrderDO>() |         return selectOne(new LambdaQueryWrapperX<TradeOrderDO>() | ||||||
|                 .and(q -> q.eq(TradeOrderDO::getUserId, userId) |                 .and(q -> q.eq(TradeOrderDO::getUserId, userId) | ||||||
|   | |||||||
| @@ -657,7 +657,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { | |||||||
|     public void updateOrderAddress(TradeOrderUpdateAddressReqVO reqVO) { |     public void updateOrderAddress(TradeOrderUpdateAddressReqVO reqVO) { | ||||||
|         // 校验交易订单 |         // 校验交易订单 | ||||||
|         TradeOrderDO order = validateOrderExists(reqVO.getId()); |         TradeOrderDO order = validateOrderExists(reqVO.getId()); | ||||||
|         // 只有待发货状态才可以修改订单收货地址; |         // 只有待发货状态,才可以修改订单收货地址; | ||||||
|         if (!TradeOrderStatusEnum.isUndelivered(order.getStatus())) { |         if (!TradeOrderStatusEnum.isUndelivered(order.getStatus())) { | ||||||
|             throw exception(ORDER_UPDATE_ADDRESS_FAIL_STATUS_NOT_DELIVERED); |             throw exception(ORDER_UPDATE_ADDRESS_FAIL_STATUS_NOT_DELIVERED); | ||||||
|         } |         } | ||||||
| @@ -823,11 +823,11 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { | |||||||
|     @Override |     @Override | ||||||
|     @Transactional(rollbackFor = Exception.class) |     @Transactional(rollbackFor = Exception.class) | ||||||
|     public void cancelPaidOrder(Long userId, Long orderId) { |     public void cancelPaidOrder(Long userId, Long orderId) { | ||||||
|  |         // TODO 芋艿:这里实现要优化下; | ||||||
|         TradeOrderDO order = tradeOrderMapper.selectOrderByIdAndUserId(orderId, userId); |         TradeOrderDO order = tradeOrderMapper.selectOrderByIdAndUserId(orderId, userId); | ||||||
|         if (order == null) { |         if (order == null) { | ||||||
|             throw exception(ORDER_NOT_FOUND); |             throw exception(ORDER_NOT_FOUND); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         cancelOrder0(order, TradeOrderCancelTypeEnum.MEMBER_CANCEL); |         cancelOrder0(order, TradeOrderCancelTypeEnum.MEMBER_CANCEL); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -10,7 +10,6 @@ import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum; | |||||||
| import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum; | import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum; | ||||||
| import cn.iocoder.yudao.module.trade.service.order.TradeOrderQueryService; | import cn.iocoder.yudao.module.trade.service.order.TradeOrderQueryService; | ||||||
| import cn.iocoder.yudao.module.trade.service.order.TradeOrderUpdateService; | import cn.iocoder.yudao.module.trade.service.order.TradeOrderUpdateService; | ||||||
| import org.springframework.context.annotation.Lazy; |  | ||||||
| import org.springframework.stereotype.Component; | import org.springframework.stereotype.Component; | ||||||
|  |  | ||||||
| import javax.annotation.Resource; | import javax.annotation.Resource; | ||||||
| @@ -29,14 +28,11 @@ import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.ORDER_DELIV | |||||||
| public class TradeCombinationOrderHandler implements TradeOrderHandler { | public class TradeCombinationOrderHandler implements TradeOrderHandler { | ||||||
|  |  | ||||||
|     @Resource |     @Resource | ||||||
|     @Lazy |  | ||||||
|     private TradeOrderUpdateService orderUpdateService; |     private TradeOrderUpdateService orderUpdateService; | ||||||
|     @Resource |     @Resource | ||||||
|     @Lazy |  | ||||||
|     private TradeOrderQueryService orderQueryService; |     private TradeOrderQueryService orderQueryService; | ||||||
|  |  | ||||||
|     @Resource |     @Resource | ||||||
|     @Lazy |  | ||||||
|     private CombinationRecordApi combinationRecordApi; |     private CombinationRecordApi combinationRecordApi; | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
| @@ -51,7 +47,9 @@ public class TradeCombinationOrderHandler implements TradeOrderHandler { | |||||||
|         TradeOrderItemDO item = orderItems.get(0); |         TradeOrderItemDO item = orderItems.get(0); | ||||||
|         combinationRecordApi.validateCombinationRecord(order.getUserId(), order.getCombinationActivityId(), |         combinationRecordApi.validateCombinationRecord(order.getUserId(), order.getCombinationActivityId(), | ||||||
|                 order.getCombinationHeadId(), item.getSkuId(), item.getCount()); |                 order.getCombinationHeadId(), item.getSkuId(), item.getCount()); | ||||||
|         // 2. 校验该用户是否存在未支付的拼团活动订单;就是还没支付的时候,重复下单了;需要校验下;不然的话,一个拼团可以下多个单子了; |  | ||||||
|  |         // 2. 校验该用户是否存在未支付的拼团活动订单,避免一个拼团可以下多个单子了 | ||||||
|  |         // TODO @puhui999:只校验未支付的拼团订单噢 | ||||||
|         TradeOrderDO activityOrder = orderQueryService.getActivityOrderByUserIdAndActivityIdAndStatus( |         TradeOrderDO activityOrder = orderQueryService.getActivityOrderByUserIdAndActivityIdAndStatus( | ||||||
|                 order.getUserId(), order.getCombinationActivityId(), TradeOrderStatusEnum.UNPAID.getStatus()); |                 order.getUserId(), order.getCombinationActivityId(), TradeOrderStatusEnum.UNPAID.getStatus()); | ||||||
|         if (activityOrder != null) { |         if (activityOrder != null) { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 YunaiV
					YunaiV