Commit 7957cfa50d3eeb4aca22acb6dd4d5fd4bb1ba235

Authored by puhui999
1 parent 8d13ecc9

fix:优化拼团与订单集成逻辑

yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/api/combination/CombinationApi.java
... ... @@ -24,7 +24,8 @@ public interface CombinationApi {
24 24 * @param userId 用户编号
25 25 * @param orderId 订单编号
26 26 */
27   - Integer getRecordStatus(Long userId, Long orderId);
  27 + boolean validateRecordStatusIsSuccess(Long userId, Long orderId);
  28 +
28 29  
29 30 /**
30 31 * 更新开团记录状态
... ... @@ -41,6 +42,7 @@ public interface CombinationApi {
41 42 * @param userId 用户编号
42 43 * @param orderId 订单编号
43 44 * @param status 状态值
  45 + * @return
44 46 */
45 47 void updateRecordStatusAndStartTime(Long userId, Long orderId, Integer status);
46 48  
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/api/combination/CombinationApiImpl.java
... ... @@ -23,8 +23,8 @@ public class CombinationApiImpl implements CombinationApi {
23 23 }
24 24  
25 25 @Override
26   - public Integer getRecordStatus(Long userId, Long orderId) {
27   - return activityService.getRecordStatus(userId, orderId);
  26 + public boolean validateRecordStatusIsSuccess(Long userId, Long orderId) {
  27 + return activityService.validateRecordStatusIsSuccess(userId, orderId);
28 28 }
29 29  
30 30 @Override
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/combination/combinationactivity/CombinationRecordDO.java
1 1 package cn.iocoder.yudao.module.promotion.dal.dataobject.combination.combinationactivity;
2 2  
3 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
  4 +import cn.iocoder.yudao.module.promotion.enums.combination.CombinationRecordStatusEnum;
4 5 import com.baomidou.mybatisplus.annotation.KeySequence;
5 6 import com.baomidou.mybatisplus.annotation.TableId;
6 7 import com.baomidou.mybatisplus.annotation.TableName;
... ... @@ -72,7 +73,9 @@ public class CombinationRecordDO extends BaseDO {
72 73 */
73 74 private String avatar;
74 75 /**
75   - * 开团状态: 正在开团 拼团成功 拼团失败
  76 + * 开团状态
  77 + *
  78 + * 关联 {@link CombinationRecordStatusEnum}
76 79 */
77 80 private Integer status;
78 81 /**
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/combination/combinationactivity/CombinationRecordMapper.java
1 1 package cn.iocoder.yudao.module.promotion.dal.mysql.combination.combinationactivity;
2 2  
3 3 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  4 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
4 5 import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.combinationactivity.CombinationRecordDO;
5 6 import org.apache.ibatis.annotations.Mapper;
6 7  
  8 +import java.util.List;
  9 +
7 10 /**
8 11 * 拼团记录 Mapper
9 12 *
... ... @@ -16,4 +19,13 @@ public interface CombinationRecordMapper extends BaseMapperX<CombinationRecordDO
16 19 return selectOne(CombinationRecordDO::getUserId, userId, CombinationRecordDO::getOrderId, orderId);
17 20 }
18 21  
  22 + default List<CombinationRecordDO> selectListByHeadIdAndStatus(Long headId, Integer status) {
  23 + return selectList(new LambdaQueryWrapperX<CombinationRecordDO>().eq(CombinationRecordDO::getHeadId, headId)
  24 + .eq(CombinationRecordDO::getStatus, status));
  25 + }
  26 +
  27 + default List<CombinationRecordDO> selectListByStatus(Integer status) {
  28 + return selectList(new LambdaQueryWrapperX<CombinationRecordDO>().eq(CombinationRecordDO::getStatus, status));
  29 + }
  30 +
19 31 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationActivityService.java
... ... @@ -99,6 +99,7 @@ public interface CombinationActivityService {
99 99 * @param orderId 订单编号
100 100 * @param status 状态
101 101 * @param startTime 开始时间
  102 + * @return
102 103 */
103 104 void updateRecordStatusAndStartTimeByUserIdAndOrderId(Long userId, Long orderId, Integer status, LocalDateTime startTime);
104 105  
... ... @@ -116,5 +117,5 @@ public interface CombinationActivityService {
116 117 * @param orderId 订单编号
117 118 * @return 拼团状态
118 119 */
119   - Integer getRecordStatus(Long userId, Long orderId);
  120 + boolean validateRecordStatusIsSuccess(Long userId, Long orderId);
120 121 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationActivityServiceImpl.java
... ... @@ -24,7 +24,9 @@ import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.combinationa
24 24 import cn.iocoder.yudao.module.promotion.dal.mysql.combination.combinationactivity.CombinationActivityMapper;
25 25 import cn.iocoder.yudao.module.promotion.dal.mysql.combination.combinationactivity.CombinationProductMapper;
26 26 import cn.iocoder.yudao.module.promotion.dal.mysql.combination.combinationactivity.CombinationRecordMapper;
  27 +import cn.iocoder.yudao.module.promotion.enums.combination.CombinationRecordStatusEnum;
27 28 import org.springframework.stereotype.Service;
  29 +import org.springframework.transaction.annotation.Transactional;
28 30 import org.springframework.validation.annotation.Validated;
29 31  
30 32 import javax.annotation.Resource;
... ... @@ -217,14 +219,27 @@ public class CombinationActivityServiceImpl implements CombinationActivityServic
217 219 }
218 220  
219 221 @Override
  222 + @Transactional(rollbackFor = Exception.class)
220 223 public void updateRecordStatusAndStartTimeByUserIdAndOrderId(Long userId, Long orderId, Integer status, LocalDateTime startTime) {
221 224 CombinationRecordDO recordDO = validateCombinationRecord(userId, orderId);
222   -
223 225 // 更新状态
224 226 recordDO.setStatus(status);
225 227 // 更新开始时间
226 228 recordDO.setStartTime(startTime);
227 229 recordMapper.updateById(recordDO);
  230 +
  231 + // 更新拼团参入人数
  232 + List<CombinationRecordDO> recordDOs = recordMapper.selectListByHeadIdAndStatus(recordDO.getHeadId(), status);
  233 + if (CollUtil.isNotEmpty(recordDOs)) {
  234 + recordDOs.forEach(item -> {
  235 + item.setUserCount(recordDOs.size());
  236 + // 校验拼团是否满足要求
  237 + if (recordDOs.size() >= recordDO.getUserSize()) {
  238 + item.setStatus(CombinationRecordStatusEnum.SUCCESS.getStatus());
  239 + }
  240 + });
  241 + }
  242 + recordMapper.updateBatch(recordDOs);
228 243 }
229 244  
230 245 private CombinationRecordDO validateCombinationRecord(Long userId, Long orderId) {
... ... @@ -249,9 +264,18 @@ public class CombinationActivityServiceImpl implements CombinationActivityServic
249 264 }
250 265  
251 266 @Override
252   - public Integer getRecordStatus(Long userId, Long orderId) {
  267 + public boolean validateRecordStatusIsSuccess(Long userId, Long orderId) {
253 268 CombinationRecordDO recordDO = validateCombinationRecord(userId, orderId);
254   - return recordDO.getStatus();
  269 + return ObjectUtil.equal(recordDO.getStatus(), CombinationRecordStatusEnum.SUCCESS.getStatus());
  270 + }
  271 +
  272 + /**
  273 + * APP 端获取开团记录
  274 + *
  275 + * @return 开团记录
  276 + */
  277 + public List<CombinationRecordDO> getRecordList() {
  278 + return recordMapper.selectListByStatus(CombinationRecordStatusEnum.ONGOING.getStatus());
255 279 }
256 280  
257 281 }
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderServiceImpl.java
... ... @@ -164,13 +164,10 @@ public class TradeOrderServiceImpl implements TradeOrderService {
164 164 @Override
165 165 @Transactional(rollbackFor = Exception.class)
166 166 public TradeOrderDO createOrder(Long userId, String userIp, AppTradeOrderCreateReqVO createReqVO) {
167   - // 1. 用户收件地址的校验
168   - AddressRespDTO address = validateAddress(userId, createReqVO.getAddressId());
169 167 // 2. 价格计算
170 168 TradePriceCalculateRespBO calculateRespBO = calculatePrice(userId, createReqVO);
171   -
172 169 // 3.1 插入 TradeOrderDO 订单
173   - TradeOrderDO order = createTradeOrder(userId, userIp, createReqVO, calculateRespBO, address);
  170 + TradeOrderDO order = createTradeOrder(userId, userIp, createReqVO, calculateRespBO);
174 171 // 3.2 插入 TradeOrderItemDO 订单项
175 172 List<TradeOrderItemDO> orderItems = createTradeOrderItems(order, calculateRespBO);
176 173 // 订单创建完后的逻辑
... ... @@ -183,6 +180,10 @@ public class TradeOrderServiceImpl implements TradeOrderService {
183 180 combinationApi.createRecord(TradeOrderConvert.INSTANCE.convert(order, orderItems.get(0), createReqVO, user)
184 181 .setStatus(CombinationRecordStatusEnum.NOT_PAY.getStatus()));
185 182 }
  183 + // TODO 秒杀扣减库存是下单就扣除还是等待订单支付成功再扣除
  184 + if (ObjectUtil.equal(TradeOrderTypeEnum.SECKILL.getType(), order.getType())) {
  185 +
  186 + }
186 187  
187 188 // TODO @LeeYan9: 是可以思考下, 订单的营销优惠记录, 应该记录在哪里, 微信讨论起来!
188 189 return order;
... ... @@ -221,7 +222,13 @@ public class TradeOrderServiceImpl implements TradeOrderService {
221 222 }
222 223  
223 224 private TradeOrderDO createTradeOrder(Long userId, String clientIp, AppTradeOrderCreateReqVO createReqVO,
224   - TradePriceCalculateRespBO calculateRespBO, AddressRespDTO address) {
  225 + TradePriceCalculateRespBO calculateRespBO) {
  226 + // 用户选择物流配送的时候才需要填写收货地址
  227 + AddressRespDTO address = new AddressRespDTO();
  228 + if (ObjectUtil.equal(createReqVO.getDeliveryType(), DeliveryTypeEnum.EXPRESS.getMode())) {
  229 + // 用户收件地址的校验
  230 + address = validateAddress(userId, createReqVO.getAddressId());
  231 + }
225 232 TradeOrderDO order = TradeOrderConvert.INSTANCE.convert(userId, clientIp, createReqVO, calculateRespBO, address);
226 233 order.setType(validateActivity(createReqVO));
227 234 order.setNo(IdUtil.getSnowflakeNextId() + ""); // TODO @LeeYan9: 思考下, 怎么生成好点哈; 这个是会展示给用户的;
... ... @@ -232,7 +239,7 @@ public class TradeOrderServiceImpl implements TradeOrderService {
232 239 // 支付信息
233 240 order.setAdjustPrice(0).setPayStatus(false);
234 241 // 物流信息 TODO 芋艿:暂时写死物流方式;应该是前端选择的
235   - order.setDeliveryType(DeliveryTypeEnum.EXPRESS.getMode()).setDeliveryStatus(TradeOrderDeliveryStatusEnum.UNDELIVERED.getStatus());
  242 + order.setDeliveryType(createReqVO.getDeliveryType()).setDeliveryStatus(TradeOrderDeliveryStatusEnum.UNDELIVERED.getStatus());
236 243 // 退款信息
237 244 order.setRefundStatus(TradeOrderRefundStatusEnum.NONE.getStatus()).setRefundPrice(0);
238 245 tradeOrderMapper.insert(order);
... ... @@ -260,7 +267,7 @@ public class TradeOrderServiceImpl implements TradeOrderService {
260 267 TradePriceCalculateRespBO calculateRespBO) {
261 268 // 下单时扣减商品库存
262 269 productSkuApi.updateSkuStock(new ProductSkuUpdateStockReqDTO(TradeOrderConvert.INSTANCE.convertList(orderItems)));
263   - // TODO puhui:扣减活动库存
  270 +
264 271 // 删除购物车商品 TODO 芋艿:待实现
265 272  
266 273 // 扣减积分,抵扣金额 TODO 芋艿:待实现
... ... @@ -271,7 +278,7 @@ public class TradeOrderServiceImpl implements TradeOrderService {
271 278 .setOrderId(tradeOrderDO.getId()));
272 279 }
273 280  
274   - // 生成预支付 TODO puhui: 活动支付金额怎么算?
  281 + // 生成预支付
275 282 createPayOrder(tradeOrderDO, orderItems, calculateRespBO);
276 283  
277 284 // 增加订单日志 TODO 芋艿:待实现
... ... @@ -289,6 +296,7 @@ public class TradeOrderServiceImpl implements TradeOrderService {
289 296 }
290 297  
291 298 @Override
  299 + @Transactional(rollbackFor = Exception.class)
292 300 public void updateOrderPaid(Long id, Long payOrderId) {
293 301 // 校验并获得交易订单(可支付)
294 302 KeyValue<TradeOrderDO, PayOrderRespDTO> orderResult = validateOrderPayable(id, payOrderId);
... ... @@ -305,7 +313,7 @@ public class TradeOrderServiceImpl implements TradeOrderService {
305 313 // 校验活动
306 314 // 1、拼团活动
307 315 if (ObjectUtil.equal(TradeOrderTypeEnum.COMBINATION.getType(), order.getType())) {
308   - // 更新拼团状态 TODO puhui999:订单支付失败或订单过期删除这条拼团记录
  316 + // 更新拼团状态 TODO puhui999:订单支付失败或订单支付过期删除这条拼团记录
309 317 combinationApi.updateRecordStatusAndStartTime(order.getUserId(), order.getId(), CombinationRecordStatusEnum.ONGOING.getStatus());
310 318 }
311 319 // TODO 芋艿:发送订单变化的消息
... ... @@ -498,10 +506,11 @@ public class TradeOrderServiceImpl implements TradeOrderService {
498 506 if (ObjectUtil.notEqual(TradeOrderRefundStatusEnum.NONE.getStatus(), order.getRefundStatus())) {
499 507 throw exception(ORDER_DELIVERY_FAIL_REFUND_STATUS_NOT_NONE);
500 508 }
501   - // 校验订单拼团是否成功
  509 + // 订单类型:拼团
502 510 if (ObjectUtil.equal(TradeOrderTypeEnum.COMBINATION.getType(), order.getType())) {
  511 + // 校验订单拼团是否成功
503 512 // TODO 用户 ID 使用当前登录用户的还是订单保存的?
504   - if (ObjectUtil.notEqual(combinationApi.getRecordStatus(order.getUserId(), order.getId()), CombinationRecordStatusEnum.SUCCESS.getStatus())) {
  513 + if (combinationApi.validateRecordStatusIsSuccess(order.getUserId(), order.getId())) {
505 514 throw exception(ORDER_DELIVERY_FAIL_COMBINATION_RECORD_STATUS_NOT_SUCCESS);
506 515 }
507 516 }
... ...