mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-10-31 18:28:43 +08:00 
			
		
		
		
	!653 完善拼团活动下单流程
Merge pull request !653 from puhui999/feature/mall_product
This commit is contained in:
		| @@ -16,6 +16,7 @@ import cn.iocoder.yudao.module.product.api.property.dto.ProductPropertyValueDeta | ||||
| import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuRespDTO; | ||||
| import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuUpdateStockReqDTO; | ||||
| import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO; | ||||
| import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordCreateReqDTO; | ||||
| import cn.iocoder.yudao.module.trade.api.order.dto.TradeOrderRespDTO; | ||||
| import cn.iocoder.yudao.module.trade.controller.admin.base.member.user.MemberUserRespVO; | ||||
| import cn.iocoder.yudao.module.trade.controller.admin.base.product.property.ProductPropertyValueDetailRespVO; | ||||
| @@ -265,4 +266,16 @@ public interface TradeOrderConvert { | ||||
|     @Named("convertList04") | ||||
|     List<TradeOrderRespDTO> convertList04(List<TradeOrderDO> list); | ||||
|  | ||||
|     @Mappings({ | ||||
|             @Mapping(target = "activityId", source = "order.combinationActivityId"), | ||||
|             @Mapping(target = "spuId", source = "item.spuId"), | ||||
|             @Mapping(target = "skuId", source = "item.skuId"), | ||||
|             @Mapping(target = "count", source = "item.count"), | ||||
|             @Mapping(target = "orderId", source = "order.id"), | ||||
|             @Mapping(target = "userId", source = "order.userId"), | ||||
|             @Mapping(target = "headId", source = "order.combinationHeadId"), | ||||
|             @Mapping(target = "combinationPrice", source = "item.payPrice"), | ||||
|     }) | ||||
|     CombinationRecordCreateReqDTO convert(TradeOrderDO order, TradeOrderItemDO item); | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -7,7 +7,10 @@ import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageUserDO; | ||||
| import cn.iocoder.yudao.module.trade.dal.dataobject.delivery.DeliveryExpressDO; | ||||
| import cn.iocoder.yudao.module.trade.dal.dataobject.delivery.DeliveryPickUpStoreDO; | ||||
| import cn.iocoder.yudao.module.trade.enums.delivery.DeliveryTypeEnum; | ||||
| import cn.iocoder.yudao.module.trade.enums.order.*; | ||||
| import cn.iocoder.yudao.module.trade.enums.order.TradeOrderCancelTypeEnum; | ||||
| import cn.iocoder.yudao.module.trade.enums.order.TradeOrderRefundStatusEnum; | ||||
| import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum; | ||||
| import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum; | ||||
| import com.baomidou.mybatisplus.annotation.KeySequence; | ||||
| import com.baomidou.mybatisplus.annotation.TableName; | ||||
| import lombok.*; | ||||
| @@ -308,4 +311,17 @@ public class TradeOrderDO extends BaseDO { | ||||
|      */ | ||||
|     private Long bargainRecordId; | ||||
|  | ||||
|     /** | ||||
|      * 拼团活动编号 | ||||
|      * | ||||
|      * 关联 CombinationActivityDO 的 id 字段 | ||||
|      */ | ||||
|     private Long combinationActivityId; | ||||
|     /** | ||||
|      * 团长编号 | ||||
|      * | ||||
|      * 关联 CombinationRecordDO 的 id 字段 | ||||
|      */ | ||||
|     private Long combinationHeadId; | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -738,16 +738,19 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     @TradeOrderLog(operateType = TradeOrderOperateTypeEnum.SYSTEM_UP_ADDRESS) | ||||
|     public void updateOrderAddress(TradeOrderUpdateAddressReqVO reqVO) { | ||||
|         // 校验交易订单 | ||||
|         validateOrderExists(reqVO.getId()); | ||||
|         TradeOrderDO order = validateOrderExists(reqVO.getId()); | ||||
|         // TODO @puhui999:是否需要校验订单是否发货 | ||||
|         // TODO 发货后是否支持修改收货地址 | ||||
|  | ||||
|         // 更新 | ||||
|         tradeOrderMapper.updateById(TradeOrderConvert.INSTANCE.convert(reqVO)); | ||||
|  | ||||
|         // TODO @puhui999:操作日志 | ||||
|         // 记录订单日志 | ||||
|         TradeOrderLogUtils.setOrderInfo(order.getId(), order.getStatus(), order.getStatus(), | ||||
|                 MapUtil.<String, Object>builder().put("orderId", order.getId()).build()); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|   | ||||
| @@ -1,9 +1,16 @@ | ||||
| package cn.iocoder.yudao.module.trade.service.order.handler; | ||||
|  | ||||
| import cn.hutool.core.lang.Assert; | ||||
| import cn.hutool.core.util.ObjectUtil; | ||||
| import cn.iocoder.yudao.module.promotion.api.combination.CombinationRecordApi; | ||||
| import cn.iocoder.yudao.module.trade.convert.order.TradeOrderConvert; | ||||
| import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; | ||||
| import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO; | ||||
| import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum; | ||||
| import org.springframework.stereotype.Component; | ||||
|  | ||||
| import javax.annotation.Resource; | ||||
| import java.util.List; | ||||
|  | ||||
| /** | ||||
|  * 拼团订单 handler 接口实现类 | ||||
| @@ -16,38 +23,43 @@ public class TradeCombinationHandler implements TradeOrderHandler { | ||||
|     @Resource | ||||
|     private CombinationRecordApi combinationRecordApi; | ||||
|  | ||||
| //    @Override | ||||
| //    public void beforeOrderCreate(TradeBeforeOrderCreateReqBO reqBO) { | ||||
| //        // 如果不是拼团订单则结束 | ||||
| //        if (ObjectUtil.notEqual(TradeOrderTypeEnum.COMBINATION.getType(), reqBO.getOrderType())) { | ||||
| //            return; | ||||
| //        } | ||||
| // | ||||
| //        // 获取商品信息 | ||||
| //        TradeBeforeOrderCreateReqBO.Item item = reqBO.getItems().get(0); | ||||
| //        // 校验是否满足拼团活动相关限制 | ||||
| //        combinationRecordApi.validateCombinationRecord(reqBO.getCombinationActivityId(), reqBO.getUserId(), item.getSkuId(), item.getCount()); | ||||
| //    } | ||||
|     @Override | ||||
|     public void beforeOrderCreate(TradeOrderDO order, List<TradeOrderItemDO> orderItems) { | ||||
|         // 如果不是拼团订单则结束 | ||||
|         if (ObjectUtil.notEqual(TradeOrderTypeEnum.COMBINATION.getType(), order.getType())) { | ||||
|             return; | ||||
|         } | ||||
|         Assert.isTrue(orderItems.size() == 1, "拼团时,只允许选择一个商品"); | ||||
|  | ||||
| //    @Override | ||||
| //    public void afterOrderCreate(TradeAfterOrderCreateReqBO reqBO) { | ||||
| //        if (reqBO.getCombinationActivityId() == null) { | ||||
| //            return; | ||||
| //        } | ||||
| // | ||||
| //        // 创建砍价记录 | ||||
| //        combinationRecordApi.createCombinationRecord(TradeOrderConvert.INSTANCE.convert(reqBO)); | ||||
| //    } | ||||
|         // 获取商品信息 | ||||
|         TradeOrderItemDO item = orderItems.get(0); | ||||
|         // 校验是否满足拼团活动相关限制 | ||||
|         combinationRecordApi.validateCombinationRecord(order.getCombinationActivityId(), order.getUserId(), item.getSkuId(), item.getCount()); | ||||
|     } | ||||
|  | ||||
| //    @Override | ||||
| //    public void afterPayOrder(TradeAfterPayOrderReqBO reqBO) { | ||||
| //        // 如果不是拼团订单则结束 | ||||
| //        if (ObjectUtil.notEqual(TradeOrderTypeEnum.COMBINATION.getType(), reqBO.getOrderType())) { | ||||
| //            return; | ||||
| //        } | ||||
| // | ||||
| //        // 更新拼团状态 TODO puhui999:订单支付失败或订单支付过期删除这条拼团记录 | ||||
| //        combinationRecordApi.updateRecordStatusToInProgress(reqBO.getUserId(), reqBO.getOrderId(), reqBO.getPayTime()); | ||||
| //    } | ||||
|     @Override | ||||
|     public void afterOrderCreate(TradeOrderDO order, List<TradeOrderItemDO> orderItems) { | ||||
|         // 如果不是拼团订单则结束 | ||||
|         if (ObjectUtil.notEqual(TradeOrderTypeEnum.COMBINATION.getType(), order.getType())) { | ||||
|             return; | ||||
|         } | ||||
|         Assert.isTrue(orderItems.size() == 1, "拼团时,只允许选择一个商品"); | ||||
|  | ||||
|         // 获取商品信息 | ||||
|         TradeOrderItemDO item = orderItems.get(0); | ||||
|         // 创建砍价记录 | ||||
|         combinationRecordApi.createCombinationRecord(TradeOrderConvert.INSTANCE.convert(order, item)); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void afterPayOrder(TradeOrderDO order) { | ||||
|         // 如果不是拼团订单则结束 | ||||
|         if (ObjectUtil.notEqual(TradeOrderTypeEnum.COMBINATION.getType(), order.getType())) { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         // 更新拼团状态 TODO puhui999:订单支付失败或订单支付过期删除这条拼团记录 | ||||
|         combinationRecordApi.updateRecordStatusToInProgress(order.getUserId(), order.getId(), order.getPayTime()); | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -0,0 +1,53 @@ | ||||
| package cn.iocoder.yudao.module.trade.service.price.calculator; | ||||
|  | ||||
| import cn.hutool.core.lang.Assert; | ||||
| import cn.hutool.core.util.StrUtil; | ||||
| import cn.iocoder.yudao.module.promotion.api.combination.CombinationRecordApi; | ||||
| import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationValidateJoinRespDTO; | ||||
| import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum; | ||||
| import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO; | ||||
| import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO; | ||||
| import org.springframework.core.annotation.Order; | ||||
| import org.springframework.stereotype.Component; | ||||
|  | ||||
| import javax.annotation.Resource; | ||||
|  | ||||
| /** | ||||
|  * 拼团活动的 {@link TradePriceCalculator} 实现类 | ||||
|  * | ||||
|  * @author HUIHUI | ||||
|  */ | ||||
| @Component | ||||
| @Order(TradePriceCalculator.ORDER_COMBINATION_ACTIVITY) | ||||
| public class TradeCombinationActivityPriceCalculator implements TradePriceCalculator { | ||||
|  | ||||
|     @Resource | ||||
|     private CombinationRecordApi combinationRecordApi; | ||||
|  | ||||
|     @Override | ||||
|     public void calculate(TradePriceCalculateReqBO param, TradePriceCalculateRespBO result) { | ||||
|         // 1. 判断订单类型和是否具有拼团活动编号 | ||||
|         if (param.getCombinationActivityId() == null) { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         Assert.isTrue(param.getItems().size() == 1, "拼团时,只允许选择一个商品"); | ||||
|         // 2. 校验是否可以参与拼团 | ||||
|         TradePriceCalculateRespBO.OrderItem orderItem = result.getItems().get(0); | ||||
|         CombinationValidateJoinRespDTO combinationActivity = combinationRecordApi.validateJoinCombination( | ||||
|                 param.getCombinationActivityId(), param.getUserId(), | ||||
|                 orderItem.getSkuId(), orderItem.getCount()); | ||||
|  | ||||
|         // 3.1 记录优惠明细 | ||||
|         Integer discountPrice = orderItem.getPayPrice() - combinationActivity.getCombinationPrice() * orderItem.getCount(); | ||||
|         TradePriceCalculatorHelper.addPromotion(result, orderItem, | ||||
|                 param.getCombinationActivityId(), combinationActivity.getName(), PromotionTypeEnum.COMBINATION_ACTIVITY.getType(), | ||||
|                 StrUtil.format("拼团活动:省 {} 元", TradePriceCalculatorHelper.formatPrice(discountPrice)), | ||||
|                 discountPrice); | ||||
|         // 3.2 更新 SKU 优惠金额 | ||||
|         orderItem.setDiscountPrice(orderItem.getDiscountPrice() + discountPrice); | ||||
|         TradePriceCalculatorHelper.recountPayPrice(orderItem); | ||||
|         TradePriceCalculatorHelper.recountAllPrice(result); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -17,6 +17,7 @@ public interface TradePriceCalculator { | ||||
|  | ||||
|     int ORDER_SECKILL_ACTIVITY = 8; | ||||
|     int ORDER_BARGAIN_ACTIVITY = 8; | ||||
|     int ORDER_COMBINATION_ACTIVITY = 8; | ||||
|  | ||||
|     int ORDER_DISCOUNT_ACTIVITY = 10; | ||||
|     int ORDER_REWARD_ACTIVITY = 20; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 芋道源码
					芋道源码