| 
					
				 | 
			
			
				@@ -27,12 +27,14 @@ import cn.newfeifan.mall.module.trade.enums.aftersale.AfterSaleTypeEnum; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import cn.newfeifan.mall.module.trade.enums.aftersale.AfterSaleWayEnum; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import cn.newfeifan.mall.module.trade.enums.order.TradeOrderItemAfterSaleStatusEnum; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import cn.newfeifan.mall.module.trade.enums.order.TradeOrderStatusEnum; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import cn.newfeifan.mall.module.trade.enums.wxmessage.WcChatMessageTemplateIdEnum; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import cn.newfeifan.mall.module.trade.framework.aftersale.core.annotations.AfterSaleLog; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import cn.newfeifan.mall.module.trade.framework.aftersale.core.utils.AfterSaleLogUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import cn.newfeifan.mall.module.trade.framework.order.config.TradeOrderProperties; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import cn.newfeifan.mall.module.trade.service.delivery.DeliveryExpressService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import cn.newfeifan.mall.module.trade.service.order.TradeOrderQueryService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import cn.newfeifan.mall.module.trade.service.order.TradeOrderUpdateService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import cn.newfeifan.mall.module.trade.utils.wechat.WcChatMessageUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.google.common.collect.Maps; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import lombok.extern.slf4j.Slf4j; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -43,7 +45,10 @@ import org.springframework.transaction.support.TransactionSynchronizationManager 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.validation.annotation.Validated; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import javax.annotation.Resource; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.text.DecimalFormat; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.time.LocalDateTime; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.time.format.DateTimeFormatter; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.ArrayList; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.util.List; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.util.Map; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -78,6 +83,9 @@ public class AfterSaleServiceImpl implements AfterSaleService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Resource 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private TradeOrderProperties tradeOrderProperties; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Resource 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private WcChatMessageUtils wcChatMessageUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public PageResult<AfterSaleDO> getAfterSalePage(AfterSalePageReqVO pageReqVO) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return tradeAfterSaleMapper.selectPage(pageReqVO); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -100,7 +108,7 @@ public class AfterSaleServiceImpl implements AfterSaleService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public List<AfterSaleDO> getAfterSaleByOrderId(Long orderId) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return tradeAfterSaleMapper.selectList(new LambdaQueryWrapper<AfterSaleDO>().eq(AfterSaleDO::getOrderId,orderId)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return tradeAfterSaleMapper.selectList(new LambdaQueryWrapper<AfterSaleDO>().eq(AfterSaleDO::getOrderId, orderId)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Override 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -223,7 +231,8 @@ public class AfterSaleServiceImpl implements AfterSaleService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // 记录售后日志 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         AfterSaleLogUtils.setAfterSaleInfo(afterSale.getId(), afterSale.getStatus(), newStatus); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // TODO 发送售后消息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 发送给微信用户售后消息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        sentWcChatMessage(afterSale,false); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // 更新交易订单项的售后状态为【未申请】 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         tradeOrderUpdateService.updateOrderItemWhenAfterSaleCancel(afterSale.getOrderItemId()); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -370,12 +379,34 @@ public class AfterSaleServiceImpl implements AfterSaleService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         AfterSaleLogUtils.setAfterSaleInfo(afterSale.getId(), afterSale.getStatus(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 AfterSaleStatusEnum.COMPLETE.getStatus()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // TODO 发送售后消息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 发送给微信用户售后消息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        sentWcChatMessage(afterSale,true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // 更新交易订单项的售后状态为【已完成】 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         tradeOrderUpdateService.updateOrderItemWhenAfterSaleSuccess(afterSale.getOrderItemId(), afterSale.getRefundPrice()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 发送微信消息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param afterSale 售后订单 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param afterStatus 是否同意退款 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private void sentWcChatMessage(AfterSaleDO afterSale,Boolean afterStatus) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<String> params = new ArrayList<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        params.add(afterSale.getNo()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        params.add(afterSale.getSpuName()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        DecimalFormat df = new DecimalFormat("0.00"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String formattedPrice = df.format((double) afterSale.getRefundPrice() / 100); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        params.add("¥ " + formattedPrice); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        params.add(afterStatus ? "商家确认退款" : "商家拒绝退款"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        params.add(LocalDateTime.now().format(formatter)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        wcChatMessageUtils.sendWcChatMessage(afterSale.getUserId(), WcChatMessageTemplateIdEnum.AFTER_SALE_CHECK.getTemplateId(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                params, null, afterSale.getUserId(), afterSale.getId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private void createPayRefund(String userIp, AfterSaleDO afterSale) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -427,28 +458,28 @@ public class AfterSaleServiceImpl implements AfterSaleService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public Long getApplyingAfterSaleCount(Long userId, TradeOrderPageReqVO reqVO) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return tradeAfterSaleMapper.selectCountByUserIdAndStatus(userId, AfterSaleStatusEnum.APPLYING_STATUSES,reqVO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return tradeAfterSaleMapper.selectCountByUserIdAndStatus(userId, AfterSaleStatusEnum.APPLYING_STATUSES, reqVO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public Map<Integer, Long> getTabsCount(AfterSalePageReqVO pageVO) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         Map<Integer, Long> counts = Maps.newLinkedHashMapWithExpectedSize(8); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // 查询申请售后的售后订单 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        counts.put(AfterSaleStatusEnum.APPLY.getStatus(),tradeAfterSaleMapper.selectCount(AfterSaleStatusEnum.APPLY.getStatus(),pageVO)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        counts.put(AfterSaleStatusEnum.APPLY.getStatus(), tradeAfterSaleMapper.selectCount(AfterSaleStatusEnum.APPLY.getStatus(), pageVO)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // 查询商品待退货的售后订单 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        counts.put(AfterSaleStatusEnum.SELLER_AGREE.getStatus(),tradeAfterSaleMapper.selectCount(AfterSaleStatusEnum.SELLER_AGREE.getStatus(),pageVO)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        counts.put(AfterSaleStatusEnum.SELLER_AGREE.getStatus(), tradeAfterSaleMapper.selectCount(AfterSaleStatusEnum.SELLER_AGREE.getStatus(), pageVO)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // 查询商家待收货的售后订单 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        counts.put(AfterSaleStatusEnum.BUYER_DELIVERY.getStatus(),tradeAfterSaleMapper.selectCount(AfterSaleStatusEnum.BUYER_DELIVERY.getStatus(),pageVO)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        counts.put(AfterSaleStatusEnum.BUYER_DELIVERY.getStatus(), tradeAfterSaleMapper.selectCount(AfterSaleStatusEnum.BUYER_DELIVERY.getStatus(), pageVO)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // 查询等待退款的售后订单 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        counts.put(AfterSaleStatusEnum.WAIT_REFUND.getStatus(),tradeAfterSaleMapper.selectCount(AfterSaleStatusEnum.WAIT_REFUND.getStatus(),pageVO)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        counts.put(AfterSaleStatusEnum.WAIT_REFUND.getStatus(), tradeAfterSaleMapper.selectCount(AfterSaleStatusEnum.WAIT_REFUND.getStatus(), pageVO)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // 查询退款成功的售后订单 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        counts.put(AfterSaleStatusEnum.COMPLETE.getStatus(),tradeAfterSaleMapper.selectCount(AfterSaleStatusEnum.COMPLETE.getStatus(),pageVO)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        counts.put(AfterSaleStatusEnum.COMPLETE.getStatus(), tradeAfterSaleMapper.selectCount(AfterSaleStatusEnum.COMPLETE.getStatus(), pageVO)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // 查询买家取消的售后订单 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        counts.put(AfterSaleStatusEnum.BUYER_CANCEL.getStatus(),tradeAfterSaleMapper.selectCount(AfterSaleStatusEnum.BUYER_CANCEL.getStatus(),pageVO)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        counts.put(AfterSaleStatusEnum.BUYER_CANCEL.getStatus(), tradeAfterSaleMapper.selectCount(AfterSaleStatusEnum.BUYER_CANCEL.getStatus(), pageVO)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // 查询商家拒绝的售后订单 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        counts.put(AfterSaleStatusEnum.SELLER_DISAGREE.getStatus(),tradeAfterSaleMapper.selectCount(AfterSaleStatusEnum.SELLER_DISAGREE.getStatus(),pageVO)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        counts.put(AfterSaleStatusEnum.SELLER_DISAGREE.getStatus(), tradeAfterSaleMapper.selectCount(AfterSaleStatusEnum.SELLER_DISAGREE.getStatus(), pageVO)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // 查询商家拒收货的售后订单 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        counts.put(AfterSaleStatusEnum.SELLER_REFUSE.getStatus(),tradeAfterSaleMapper.selectCount(AfterSaleStatusEnum.SELLER_REFUSE.getStatus(),pageVO)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        counts.put(AfterSaleStatusEnum.SELLER_REFUSE.getStatus(), tradeAfterSaleMapper.selectCount(AfterSaleStatusEnum.SELLER_REFUSE.getStatus(), pageVO)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return counts; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 |