From 7957cfa50d3eeb4aca22acb6dd4d5fd4bb1ba235 Mon Sep 17 00:00:00 2001 From: puhui999 Date: Mon, 24 Jul 2023 17:29:51 +0800 Subject: [PATCH] =?UTF-8?q?fix=EF=BC=9A=E4=BC=98=E5=8C=96=E6=8B=BC?= =?UTF-8?q?=E5=9B=A2=E4=B8=8E=E8=AE=A2=E5=8D=95=E9=9B=86=E6=88=90=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/combination/CombinationApi.java | 4 ++- .../api/combination/CombinationApiImpl.java | 4 +-- .../CombinationRecordDO.java | 5 ++- .../CombinationRecordMapper.java | 12 +++++++ .../CombinationActivityService.java | 3 +- .../CombinationActivityServiceImpl.java | 30 ++++++++++++++++-- .../service/order/TradeOrderServiceImpl.java | 31 ++++++++++++------- 7 files changed, 70 insertions(+), 19 deletions(-) diff --git a/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/api/combination/CombinationApi.java b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/api/combination/CombinationApi.java index fc1ca72f9..486409320 100644 --- a/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/api/combination/CombinationApi.java +++ b/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 { * @param userId 用户编号 * @param orderId 订单编号 */ - Integer getRecordStatus(Long userId, Long orderId); + boolean validateRecordStatusIsSuccess(Long userId, Long orderId); + /** * 更新开团记录状态 @@ -41,6 +42,7 @@ public interface CombinationApi { * @param userId 用户编号 * @param orderId 订单编号 * @param status 状态值 + * @return */ void updateRecordStatusAndStartTime(Long userId, Long orderId, Integer status); diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/api/combination/CombinationApiImpl.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/api/combination/CombinationApiImpl.java index e2ca8698d..2386f9ed6 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/api/combination/CombinationApiImpl.java +++ b/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 { } @Override - public Integer getRecordStatus(Long userId, Long orderId) { - return activityService.getRecordStatus(userId, orderId); + public boolean validateRecordStatusIsSuccess(Long userId, Long orderId) { + return activityService.validateRecordStatusIsSuccess(userId, orderId); } @Override diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/combination/combinationactivity/CombinationRecordDO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/combination/combinationactivity/CombinationRecordDO.java index 7dd509ff5..842f4e9c9 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/combination/combinationactivity/CombinationRecordDO.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/combination/combinationactivity/CombinationRecordDO.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.promotion.dal.dataobject.combination.combinationactivity; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.module.promotion.enums.combination.CombinationRecordStatusEnum; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; @@ -72,7 +73,9 @@ public class CombinationRecordDO extends BaseDO { */ private String avatar; /** - * 开团状态: 正在开团 拼团成功 拼团失败 + * 开团状态 + * + * 关联 {@link CombinationRecordStatusEnum} */ private Integer status; /** diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/combination/combinationactivity/CombinationRecordMapper.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/combination/combinationactivity/CombinationRecordMapper.java index a601e284e..e121ae9d1 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/combination/combinationactivity/CombinationRecordMapper.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/combination/combinationactivity/CombinationRecordMapper.java @@ -1,9 +1,12 @@ package cn.iocoder.yudao.module.promotion.dal.mysql.combination.combinationactivity; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.combinationactivity.CombinationRecordDO; import org.apache.ibatis.annotations.Mapper; +import java.util.List; + /** * 拼团记录 Mapper * @@ -16,4 +19,13 @@ public interface CombinationRecordMapper extends BaseMapperX selectListByHeadIdAndStatus(Long headId, Integer status) { + return selectList(new LambdaQueryWrapperX().eq(CombinationRecordDO::getHeadId, headId) + .eq(CombinationRecordDO::getStatus, status)); + } + + default List selectListByStatus(Integer status) { + return selectList(new LambdaQueryWrapperX().eq(CombinationRecordDO::getStatus, status)); + } + } diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationActivityService.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationActivityService.java index 247ba95cf..0946d5956 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationActivityService.java +++ b/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 { * @param orderId 订单编号 * @param status 状态 * @param startTime 开始时间 + * @return */ void updateRecordStatusAndStartTimeByUserIdAndOrderId(Long userId, Long orderId, Integer status, LocalDateTime startTime); @@ -116,5 +117,5 @@ public interface CombinationActivityService { * @param orderId 订单编号 * @return 拼团状态 */ - Integer getRecordStatus(Long userId, Long orderId); + boolean validateRecordStatusIsSuccess(Long userId, Long orderId); } diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationActivityServiceImpl.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationActivityServiceImpl.java index f6e6aa3ed..68886dabb 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationActivityServiceImpl.java +++ b/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 import cn.iocoder.yudao.module.promotion.dal.mysql.combination.combinationactivity.CombinationActivityMapper; import cn.iocoder.yudao.module.promotion.dal.mysql.combination.combinationactivity.CombinationProductMapper; import cn.iocoder.yudao.module.promotion.dal.mysql.combination.combinationactivity.CombinationRecordMapper; +import cn.iocoder.yudao.module.promotion.enums.combination.CombinationRecordStatusEnum; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; @@ -217,14 +219,27 @@ public class CombinationActivityServiceImpl implements CombinationActivityServic } @Override + @Transactional(rollbackFor = Exception.class) public void updateRecordStatusAndStartTimeByUserIdAndOrderId(Long userId, Long orderId, Integer status, LocalDateTime startTime) { CombinationRecordDO recordDO = validateCombinationRecord(userId, orderId); - // 更新状态 recordDO.setStatus(status); // 更新开始时间 recordDO.setStartTime(startTime); recordMapper.updateById(recordDO); + + // 更新拼团参入人数 + List recordDOs = recordMapper.selectListByHeadIdAndStatus(recordDO.getHeadId(), status); + if (CollUtil.isNotEmpty(recordDOs)) { + recordDOs.forEach(item -> { + item.setUserCount(recordDOs.size()); + // 校验拼团是否满足要求 + if (recordDOs.size() >= recordDO.getUserSize()) { + item.setStatus(CombinationRecordStatusEnum.SUCCESS.getStatus()); + } + }); + } + recordMapper.updateBatch(recordDOs); } private CombinationRecordDO validateCombinationRecord(Long userId, Long orderId) { @@ -249,9 +264,18 @@ public class CombinationActivityServiceImpl implements CombinationActivityServic } @Override - public Integer getRecordStatus(Long userId, Long orderId) { + public boolean validateRecordStatusIsSuccess(Long userId, Long orderId) { CombinationRecordDO recordDO = validateCombinationRecord(userId, orderId); - return recordDO.getStatus(); + return ObjectUtil.equal(recordDO.getStatus(), CombinationRecordStatusEnum.SUCCESS.getStatus()); + } + + /** + * APP 端获取开团记录 + * + * @return 开团记录 + */ + public List getRecordList() { + return recordMapper.selectListByStatus(CombinationRecordStatusEnum.ONGOING.getStatus()); } } diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderServiceImpl.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderServiceImpl.java index f7d9aa1b1..ee2feec1a 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderServiceImpl.java +++ b/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 { @Override @Transactional(rollbackFor = Exception.class) public TradeOrderDO createOrder(Long userId, String userIp, AppTradeOrderCreateReqVO createReqVO) { - // 1. 用户收件地址的校验 - AddressRespDTO address = validateAddress(userId, createReqVO.getAddressId()); // 2. 价格计算 TradePriceCalculateRespBO calculateRespBO = calculatePrice(userId, createReqVO); - // 3.1 插入 TradeOrderDO 订单 - TradeOrderDO order = createTradeOrder(userId, userIp, createReqVO, calculateRespBO, address); + TradeOrderDO order = createTradeOrder(userId, userIp, createReqVO, calculateRespBO); // 3.2 插入 TradeOrderItemDO 订单项 List orderItems = createTradeOrderItems(order, calculateRespBO); // 订单创建完后的逻辑 @@ -183,6 +180,10 @@ public class TradeOrderServiceImpl implements TradeOrderService { combinationApi.createRecord(TradeOrderConvert.INSTANCE.convert(order, orderItems.get(0), createReqVO, user) .setStatus(CombinationRecordStatusEnum.NOT_PAY.getStatus())); } + // TODO 秒杀扣减库存是下单就扣除还是等待订单支付成功再扣除 + if (ObjectUtil.equal(TradeOrderTypeEnum.SECKILL.getType(), order.getType())) { + + } // TODO @LeeYan9: 是可以思考下, 订单的营销优惠记录, 应该记录在哪里, 微信讨论起来! return order; @@ -221,7 +222,13 @@ public class TradeOrderServiceImpl implements TradeOrderService { } private TradeOrderDO createTradeOrder(Long userId, String clientIp, AppTradeOrderCreateReqVO createReqVO, - TradePriceCalculateRespBO calculateRespBO, AddressRespDTO address) { + TradePriceCalculateRespBO calculateRespBO) { + // 用户选择物流配送的时候才需要填写收货地址 + AddressRespDTO address = new AddressRespDTO(); + if (ObjectUtil.equal(createReqVO.getDeliveryType(), DeliveryTypeEnum.EXPRESS.getMode())) { + // 用户收件地址的校验 + address = validateAddress(userId, createReqVO.getAddressId()); + } TradeOrderDO order = TradeOrderConvert.INSTANCE.convert(userId, clientIp, createReqVO, calculateRespBO, address); order.setType(validateActivity(createReqVO)); order.setNo(IdUtil.getSnowflakeNextId() + ""); // TODO @LeeYan9: 思考下, 怎么生成好点哈; 这个是会展示给用户的; @@ -232,7 +239,7 @@ public class TradeOrderServiceImpl implements TradeOrderService { // 支付信息 order.setAdjustPrice(0).setPayStatus(false); // 物流信息 TODO 芋艿:暂时写死物流方式;应该是前端选择的 - order.setDeliveryType(DeliveryTypeEnum.EXPRESS.getMode()).setDeliveryStatus(TradeOrderDeliveryStatusEnum.UNDELIVERED.getStatus()); + order.setDeliveryType(createReqVO.getDeliveryType()).setDeliveryStatus(TradeOrderDeliveryStatusEnum.UNDELIVERED.getStatus()); // 退款信息 order.setRefundStatus(TradeOrderRefundStatusEnum.NONE.getStatus()).setRefundPrice(0); tradeOrderMapper.insert(order); @@ -260,7 +267,7 @@ public class TradeOrderServiceImpl implements TradeOrderService { TradePriceCalculateRespBO calculateRespBO) { // 下单时扣减商品库存 productSkuApi.updateSkuStock(new ProductSkuUpdateStockReqDTO(TradeOrderConvert.INSTANCE.convertList(orderItems))); - // TODO puhui:扣减活动库存 + // 删除购物车商品 TODO 芋艿:待实现 // 扣减积分,抵扣金额 TODO 芋艿:待实现 @@ -271,7 +278,7 @@ public class TradeOrderServiceImpl implements TradeOrderService { .setOrderId(tradeOrderDO.getId())); } - // 生成预支付 TODO puhui: 活动支付金额怎么算? + // 生成预支付 createPayOrder(tradeOrderDO, orderItems, calculateRespBO); // 增加订单日志 TODO 芋艿:待实现 @@ -289,6 +296,7 @@ public class TradeOrderServiceImpl implements TradeOrderService { } @Override + @Transactional(rollbackFor = Exception.class) public void updateOrderPaid(Long id, Long payOrderId) { // 校验并获得交易订单(可支付) KeyValue orderResult = validateOrderPayable(id, payOrderId); @@ -305,7 +313,7 @@ public class TradeOrderServiceImpl implements TradeOrderService { // 校验活动 // 1、拼团活动 if (ObjectUtil.equal(TradeOrderTypeEnum.COMBINATION.getType(), order.getType())) { - // 更新拼团状态 TODO puhui999:订单支付失败或订单过期删除这条拼团记录 + // 更新拼团状态 TODO puhui999:订单支付失败或订单支付过期删除这条拼团记录 combinationApi.updateRecordStatusAndStartTime(order.getUserId(), order.getId(), CombinationRecordStatusEnum.ONGOING.getStatus()); } // TODO 芋艿:发送订单变化的消息 @@ -498,10 +506,11 @@ public class TradeOrderServiceImpl implements TradeOrderService { if (ObjectUtil.notEqual(TradeOrderRefundStatusEnum.NONE.getStatus(), order.getRefundStatus())) { throw exception(ORDER_DELIVERY_FAIL_REFUND_STATUS_NOT_NONE); } - // 校验订单拼团是否成功 + // 订单类型:拼团 if (ObjectUtil.equal(TradeOrderTypeEnum.COMBINATION.getType(), order.getType())) { + // 校验订单拼团是否成功 // TODO 用户 ID 使用当前登录用户的还是订单保存的? - if (ObjectUtil.notEqual(combinationApi.getRecordStatus(order.getUserId(), order.getId()), CombinationRecordStatusEnum.SUCCESS.getStatus())) { + if (combinationApi.validateRecordStatusIsSuccess(order.getUserId(), order.getId())) { throw exception(ORDER_DELIVERY_FAIL_COMBINATION_RECORD_STATUS_NOT_SUCCESS); } }