@ -6,7 +6,9 @@ import cn.hutool.core.util.IdUtil;
 
		
	
		
			
				import   cn.hutool.core.util.ObjectUtil ;  
		
	
		
			
				import   cn.hutool.core.util.StrUtil ;  
		
	
		
			
				import   cn.iocoder.yudao.framework.common.core.KeyValue ;  
		
	
		
			
				import   cn.iocoder.yudao.framework.common.enums.CommonStatusEnum ;  
		
	
		
			
				import   cn.iocoder.yudao.framework.common.enums.TerminalEnum ;  
		
	
		
			
				import   cn.iocoder.yudao.framework.common.enums.UserTypeEnum ;  
		
	
		
			
				import   cn.iocoder.yudao.framework.common.pojo.PageResult ;  
		
	
		
			
				import   cn.iocoder.yudao.framework.common.util.json.JsonUtils ;  
		
	
		
			
				import   cn.iocoder.yudao.module.member.api.address.AddressApi ;  
		
	
	
		
			
				
					
					
						
					 
				
			
			@ -21,6 +23,11 @@ import cn.iocoder.yudao.module.product.api.sku.ProductSkuApi;
 
		
	
		
			
				import   cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuUpdateStockReqDTO ;  
		
	
		
			
				import   cn.iocoder.yudao.module.promotion.api.coupon.CouponApi ;  
		
	
		
			
				import   cn.iocoder.yudao.module.promotion.api.coupon.dto.CouponUseReqDTO ;  
		
	
		
			
				import   cn.iocoder.yudao.module.system.api.notify.NotifyMessageSendApi ;  
		
	
		
			
				import   cn.iocoder.yudao.module.system.api.notify.dto.NotifySendSingleToUserReqDTO ;  
		
	
		
			
				import   cn.iocoder.yudao.module.system.api.notify.dto.NotifyTemplateReqDTO ;  
		
	
		
			
				import   cn.iocoder.yudao.module.system.api.user.AdminUserApi ;  
		
	
		
			
				import   cn.iocoder.yudao.module.system.enums.notify.NotifyTemplateTypeEnum ;  
		
	
		
			
				import   cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderDeliveryReqVO ;  
		
	
		
			
				import   cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderPageReqVO ;  
		
	
		
			
				import   cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderCreateReqVO ;  
		
	
	
		
			
				
					
					
						
					 
				
			
			@ -29,6 +36,7 @@ import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderSettle
 
		
	
		
			
				import   cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderSettlementRespVO ;  
		
	
		
			
				import   cn.iocoder.yudao.module.trade.convert.order.TradeOrderConvert ;  
		
	
		
			
				import   cn.iocoder.yudao.module.trade.dal.dataobject.cart.TradeCartDO ;  
		
	
		
			
				import   cn.iocoder.yudao.module.trade.dal.dataobject.delivery.DeliveryExpressDO ;  
		
	
		
			
				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.dal.mysql.order.TradeOrderItemMapper ;  
		
	
	
		
			
				
					
					
						
					 
				
			
			@ -38,6 +46,7 @@ import cn.iocoder.yudao.module.trade.enums.delivery.DeliveryTypeEnum;
 
		
	
		
			
				import   cn.iocoder.yudao.module.trade.enums.order.* ;  
		
	
		
			
				import   cn.iocoder.yudao.module.trade.framework.order.config.TradeOrderProperties ;  
		
	
		
			
				import   cn.iocoder.yudao.module.trade.service.cart.TradeCartService ;  
		
	
		
			
				import   cn.iocoder.yudao.module.trade.service.delivery.DeliveryExpressService ;  
		
	
		
			
				import   cn.iocoder.yudao.module.trade.service.price.TradePriceService ;  
		
	
		
			
				import   cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO ;  
		
	
		
			
				import   cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO ;  
		
	
	
		
			
				
					
					
						
					 
				
			
			@ -74,6 +83,8 @@ public class TradeOrderServiceImpl implements TradeOrderService {
 
		
	
		
			
				     private   TradeCartService   tradeCartService ;  
		
	
		
			
				     @Resource  
		
	
		
			
				     private   TradePriceService   tradePriceService ;  
		
	
		
			
				     @Resource  
		
	
		
			
				     private   DeliveryExpressService   deliveryExpressService ;  
		
	
		
			
				 
		
	
		
			
				     @Resource  
		
	
		
			
				     private   ProductSkuApi   productSkuApi ;  
		
	
	
		
			
				
					
					
						
					 
				
			
			@ -85,7 +96,10 @@ public class TradeOrderServiceImpl implements TradeOrderService {
 
		
	
		
			
				     private   CouponApi   couponApi ;  
		
	
		
			
				     @Resource  
		
	
		
			
				     private   MemberUserApi   memberUserApi ;  
		
	
		
			
				 
		
	
		
			
				     @Resource  
		
	
		
			
				     private   AdminUserApi   adminUserApi ;  
		
	
		
			
				     @Resource  
		
	
		
			
				     private   NotifyMessageSendApi   notifyMessageSendApi ;  
		
	
		
			
				     @Resource  
		
	
		
			
				     private   TradeOrderProperties   tradeOrderProperties ;  
		
	
		
			
				 
		
	
	
		
			
				
					
					
						
					 
				
			
			@ -123,7 +137,7 @@ public class TradeOrderServiceImpl implements TradeOrderService {
 
		
	
		
			
				     /**  
		
	
		
			
				     * 计算订单价格  
		
	
		
			
				     *  
		
	
		
			
				     * @param userId 用户编号  
		
	
		
			
				     * @param userId           用户编号  
		
	
		
			
				     * @param settlementReqVO 结算信息  
		
	
		
			
				     * @return 订单价格  
		
	
		
			
				     */  
		
	
	
		
			
				
					
					
						
					 
				
			
			@ -162,7 +176,7 @@ public class TradeOrderServiceImpl implements TradeOrderService {
 
		
	
		
			
				     /**  
		
	
		
			
				     * 校验收件地址是否存在  
		
	
		
			
				     *  
		
	
		
			
				     * @param userId 用户编号  
		
	
		
			
				     * @param userId     用户编号  
		
	
		
			
				     * @param addressId 收件地址编号  
		
	
		
			
				     * @return 收件地址  
		
	
		
			
				     */  
		
	
	
		
			
				
					
					
						
					 
				
			
			@ -181,7 +195,7 @@ public class TradeOrderServiceImpl implements TradeOrderService {
 
		
	
		
			
				         order . setStatus ( TradeOrderStatusEnum . UNPAID . getStatus ( ) ) ;  
		
	
		
			
				         order . setType ( TradeOrderTypeEnum . NORMAL . getType ( ) ) ;  
		
	
		
			
				         order . setRefundStatus ( TradeOrderRefundStatusEnum . NONE . getStatus ( ) ) ;  
		
	
		
			
				         order . setProductCount ( getSumValue ( calculateRespBO . getItems ( ) ,    TradePriceCalculateRespBO . OrderItem : : getCount ,   Integer : : sum ) ) ;  
		
	
		
			
				         order . setProductCount ( getSumValue ( calculateRespBO . getItems ( ) ,   TradePriceCalculateRespBO . OrderItem : : getCount ,   Integer : : sum ) ) ;  
		
	
		
			
				         order . setTerminal ( TerminalEnum . H5 . getTerminal ( ) ) ;   // todo 数据来源?  
		
	
		
			
				         // 支付信息  
		
	
		
			
				         order . setAdjustPrice ( 0 ) . setPayed ( false ) ;  
		
	
	
		
			
				
					
					
						
					 
				
			
			@ -201,12 +215,12 @@ public class TradeOrderServiceImpl implements TradeOrderService {
 
		
	
		
			
				 
		
	
		
			
				     /**  
		
	
		
			
				     * 执行创建完创建完订单后的逻辑  
		
	
		
			
				     *  
		
	
		
			
				     * <p>   
		
	
		
			
				     * 例如说:优惠劵的扣减、积分的扣减、支付单的创建等等  
		
	
		
			
				     *  
		
	
		
			
				     * @param userId 用户编号  
		
	
		
			
				     * @param createReqVO 创建订单请求  
		
	
		
			
				     * @param tradeOrderDO 交易订单  
		
	
		
			
				     * @param userId           用户编号  
		
	
		
			
				     * @param createReqVO      创建订单请求  
		
	
		
			
				     * @param tradeOrderDO     交易订单  
		
	
		
			
				     * @param calculateRespBO 订单价格计算结果  
		
	
		
			
				     */  
		
	
		
			
				     private   void   afterCreateTradeOrder ( Long   userId ,   AppTradeOrderCreateReqVO   createReqVO ,  
		
	
	
		
			
				
					
					
						
					 
				
			
			@ -265,11 +279,11 @@ public class TradeOrderServiceImpl implements TradeOrderService {
 
		
	
		
			
				 
		
	
		
			
				     /**  
		
	
		
			
				     * 校验交易订单满足被支付的条件  
		
	
		
			
				     *  
		
	
		
			
				     * <p>   
		
	
		
			
				     * 1. 交易订单未支付  
		
	
		
			
				     * 2. 支付单已支付  
		
	
		
			
				     *  
		
	
		
			
				     * @param id 交易订单编号  
		
	
		
			
				     * @param id          交易订单编号  
		
	
		
			
				     * @param payOrderId 支付订单编号  
		
	
		
			
				     * @return 交易订单  
		
	
		
			
				     */  
		
	
	
		
			
				
					
					
						
					 
				
			
			@ -324,8 +338,11 @@ public class TradeOrderServiceImpl implements TradeOrderService {
 
		
	
		
			
				     public   void   deliveryOrder ( Long   userId ,   TradeOrderDeliveryReqVO   deliveryReqVO )   {  
		
	
		
			
				         // 校验并获得交易订单(可发货)  
		
	
		
			
				         TradeOrderDO   order   =   validateOrderDeliverable ( deliveryReqVO . getId ( ) ) ;  
		
	
		
			
				 
		
	
		
			
				         // TODO 芋艿:   
		
	
		
			
				         // TODO 芋艿:   
		
	
		
			
				         DeliveryExpressDO   deliveryExpress   =   deliveryExpressService . getDeliveryExpress ( deliveryReqVO . getLogisticsId ( ) ) ;  
		
	
		
			
				         if   ( deliveryExpress   = =   null )   {  
		
	
		
			
				             throw   exception ( DELIVERY_EXPRESS_NOT_EXISTS ) ;  
		
	
		
			
				         }  
		
	
		
			
				 
		
	
		
			
				         // 更新 TradeOrderDO 状态为已发货,等待收货  
		
	
		
			
				         int   updateCount   =   tradeOrderMapper . updateByIdAndStatus ( order . getId ( ) ,   order . getStatus ( ) ,  
		
	
	
		
			
				
					
					
						
					 
				
			
			@ -338,8 +355,32 @@ public class TradeOrderServiceImpl implements TradeOrderService {
 
		
	
		
			
				 
		
	
		
			
				         // TODO 芋艿:发送订单变化的消息  
		
	
		
			
				 
		
	
		
			
				         // TODO 芋艿:发送站内信  
		
	
		
			
				 
		
	
		
			
				         // TODO 芋艿:发送站内信 fix   
		
	
		
			
				         // 1、获取模版编码为 order_delivery 的模版,判断是否存在 存在放回 true  
		
	
		
			
				         if   ( ! notifyMessageSendApi . validateNotifyTemplate ( " order_delivery " ) )   {  
		
	
		
			
				             // 1、1 站内信模版不存在则创建模版  
		
	
		
			
				             NotifyTemplateReqDTO   templateReqDTO   =   new   NotifyTemplateReqDTO ( ) ;  
		
	
		
			
				             templateReqDTO . setName ( " 订单发货通知模版 " ) ;  
		
	
		
			
				             templateReqDTO . setCode ( " order_delivery " ) ;  
		
	
		
			
				             templateReqDTO . setType ( NotifyTemplateTypeEnum . NOTIFICATION_MESSAGE . getType ( ) ) ;   // 系统消息  
		
	
		
			
				             // 获取操作用户  
		
	
		
			
				             // AdminUserRespDTO user = adminUserApi.getUser(userId);  
		
	
		
			
				             // templateReqDTO.setNickname(user.getNickname());  
		
	
		
			
				             templateReqDTO . setNickname ( UserTypeEnum . ADMIN . getName ( ) ) ;  
		
	
		
			
				             templateReqDTO . setContent ( " 订单:{orderId}{msg} " ) ;  
		
	
		
			
				             templateReqDTO . setStatus ( CommonStatusEnum . ENABLE . getStatus ( ) ) ;  
		
	
		
			
				             notifyMessageSendApi . createNotifyTemplate ( templateReqDTO ) ;  
		
	
		
			
				         }  
		
	
		
			
				         // 2、构造消息  
		
	
		
			
				         Map < String ,   Object >   msgMap   =   new   HashMap < > ( ) ;  
		
	
		
			
				         msgMap . put ( " orderId " ,   deliveryReqVO . getId ( ) ) ;  
		
	
		
			
				         msgMap . put ( " msg " ,   TradeOrderStatusEnum . DELIVERED . getStatus ( ) ) ;  
		
	
		
			
				         // 2、发送站内信  
		
	
		
			
				         notifyMessageSendApi . sendSingleMessageToAdmin (  
		
	
		
			
				                 new   NotifySendSingleToUserReqDTO ( )  
		
	
		
			
				                         . setUserId ( userId )  
		
	
		
			
				                         . setTemplateCode ( " order_delivery " )  
		
	
		
			
				                         . setTemplateParams ( msgMap ) ) ;  
		
	
		
			
				         // TODO 芋艿:   
		
	
		
			
				 
		
	
		
			
				         // TODO 设计: :   
		
	
	
		
			
				
					
					
						
					 
				
			
			@ -349,7 +390,7 @@ public class TradeOrderServiceImpl implements TradeOrderService {
 
		
	
		
			
				 
		
	
		
			
				     /**  
		
	
		
			
				     * 校验交易订单满足被发货的条件  
		
	
		
			
				     *  
		
	
		
			
				     * <p>   
		
	
		
			
				     * 1. 交易订单未发货  
		
	
		
			
				     *  
		
	
		
			
				     * @param id 交易订单编号  
		
	
	
		
			
				
					
					
						
					 
				
			
			@ -363,7 +404,7 @@ public class TradeOrderServiceImpl implements TradeOrderService {
 
		
	
		
			
				         }  
		
	
		
			
				         // 校验订单是否是待发货状态  
		
	
		
			
				         if   ( ! TradeOrderStatusEnum . isUndelivered ( order . getStatus ( ) )  
		
	
		
			
				             | |   ObjectUtil . notEqual ( order . getDeliveryStatus ( ) ,   TradeOrderDeliveryStatusEnum . UNDELIVERED . getStatus ( ) ) )   {  
		
	
		
			
				                  | |   ObjectUtil . notEqual ( order . getDeliveryStatus ( ) ,   TradeOrderDeliveryStatusEnum . UNDELIVERED . getStatus ( ) ) )   {  
		
	
		
			
				             throw   exception ( ORDER_DELIVERY_FAIL_STATUS_NOT_UNDELIVERED ) ;  
		
	
		
			
				         }  
		
	
		
			
				         return   order ;  
		
	
	
		
			
				
					
					
						
					 
				
			
			@ -397,11 +438,11 @@ public class TradeOrderServiceImpl implements TradeOrderService {
 
		
	
		
			
				 
		
	
		
			
				     /**  
		
	
		
			
				     * 校验交易订单满足可售货的条件  
		
	
		
			
				     *  
		
	
		
			
				     * <p>   
		
	
		
			
				     * 1. 交易订单待收货  
		
	
		
			
				     *  
		
	
		
			
				     * @param userId 用户编号  
		
	
		
			
				     * @param id 交易订单编号  
		
	
		
			
				     * @param id      交易订单编号  
		
	
		
			
				     * @return 交易订单  
		
	
		
			
				     */  
		
	
		
			
				     private   TradeOrderDO   validateOrderReceivable ( Long   userId ,   Long   id )   {  
		
	
	
		
			
				
					
					
						
					 
				
			
			@ -476,7 +517,7 @@ public class TradeOrderServiceImpl implements TradeOrderService {
 
		
	
		
			
				     public   void   updateOrderItemAfterSaleStatus ( Long   id ,   Integer   oldAfterSaleStatus ,   Integer   newAfterSaleStatus ,   Integer   refundPrice )   {  
		
	
		
			
				         // 如果退款成功,则 refundPrice 非空  
		
	
		
			
				         if   ( Objects . equals ( newAfterSaleStatus ,   TradeOrderItemAfterSaleStatusEnum . SUCCESS . getStatus ( ) )  
		
	
		
			
				             & &   refundPrice   = =   null )   {  
		
	
		
			
				                  & &   refundPrice   = =   null )   {  
		
	
		
			
				             throw   new   IllegalArgumentException ( StrUtil . format ( " id({}) 退款成功,退款金额不能为空 " ,   id ) ) ;  
		
	
		
			
				         }