From f021540afe09a1b9bfeb9cefeb030e6ccf09375d Mon Sep 17 00:00:00 2001
From: zhibing.pu <393733352@qq.com>
Date: 星期三, 28 八月 2024 16:07:28 +0800
Subject: [PATCH] 完善支付相关功能

---
 ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/vo/WxRefundNotifyResp.java            |   35 +++++
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java   |  138 +++++++++++++++++++++-
 ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/feignClient/WxPaymentClient.java      |    7 +
 ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/factory/WxPaymentFallbackFactory.java |    6 +
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/MyShoppingOrderList.java                  |    4 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TGoodsController.java              |   12 ++
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TShoppingOrderService.java            |   12 ++
 ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/GoodsClient.java              |   10 +
 ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/CouponFallbackFactory.java        |    5 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TShoppingOrderController.java      |   17 ++
 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TShoppingOrderRefund.java           |    8 +
 ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/GoodsFallbackFactory.java         |    5 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TCouponController.java             |   14 ++
 ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/controller/WxPayController.java           |   22 ++-
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/MyShoppingOrderInfo.java                  |    2 
 ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/CouponClient.java             |   10 +
 16 files changed, 287 insertions(+), 20 deletions(-)

diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TShoppingOrderRefund.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TShoppingOrderRefund.java
index f3aa48a..708996e 100644
--- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TShoppingOrderRefund.java
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TShoppingOrderRefund.java
@@ -29,6 +29,14 @@
     @ApiModelProperty(value = "主键")
     @TableField("id")
     private Long id;
+    
+    @ApiModelProperty(value = "支付时间")
+    @TableField("pay_time")
+    private LocalDateTime payTime;
+    
+    @ApiModelProperty(value = "支付流水号")
+    @TableField("pay_code")
+    private String payCode;
 
     @ApiModelProperty(value = "累计退款金额")
     @TableField("pay_amount")
diff --git a/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/CouponFallbackFactory.java b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/CouponFallbackFactory.java
index 4937da4..ba006ed 100644
--- a/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/CouponFallbackFactory.java
+++ b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/CouponFallbackFactory.java
@@ -35,6 +35,11 @@
 			public R<List<Integer>> getCouponIdsByName(String name) {
 				return R.fail("根据名称查询优惠券ids:" + throwable.getMessage());
 			}
+			
+			@Override
+			public R updateCoupon(TCoupon coupon) {
+				throw new RuntimeException("修改优惠券失败");
+			}
 		};
 	}
 	
diff --git a/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/GoodsFallbackFactory.java b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/GoodsFallbackFactory.java
index 2ee7b91..e9002f4 100644
--- a/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/GoodsFallbackFactory.java
+++ b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/GoodsFallbackFactory.java
@@ -33,6 +33,11 @@
 			public R<List<Integer>> getGoodsIdsByName(String name) {
 				return R.fail("根据商品名称获取商品ids失败:" + throwable.getMessage());
 			}
+			
+			@Override
+			public R updateGoods(TGoods goods) {
+				throw new RuntimeException("修改商品异常");
+			}
 		};
 	}
 	
diff --git a/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/CouponClient.java b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/CouponClient.java
index 64f7fdb..946dc50 100644
--- a/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/CouponClient.java
+++ b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/CouponClient.java
@@ -8,6 +8,7 @@
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 
 import java.util.List;
 
@@ -28,4 +29,13 @@
 	R<TCoupon> getCouponById1(@PathVariable("id") Integer id);
 	@PostMapping("/t-coupon/getCouponIdsByName/{name}")
 	 R<List<Integer>> getCouponIdsByName(@PathVariable("name")String name);
+	
+	
+	/**
+	 * 修改优惠券
+	 * @param coupon
+	 * @return
+	 */
+	@PostMapping("/t-coupon/updateCoupon")
+	R updateCoupon(@RequestBody TCoupon coupon);
 }
diff --git a/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/GoodsClient.java b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/GoodsClient.java
index 6f918aa..7f7e94a 100644
--- a/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/GoodsClient.java
+++ b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/GoodsClient.java
@@ -8,6 +8,7 @@
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 
 import java.util.List;
 
@@ -32,4 +33,13 @@
 	 */
 	@PostMapping("/t-goods/getGoodsIdsByName/{name}")
 	public R<List<Integer>> getGoodsIdsByName(@PathVariable("name")String name);
+	
+	
+	/**
+	 * 修改商品
+	 * @param goods
+	 * @return
+	 */
+	@PostMapping("/t-goods/updateGoods")
+	R updateGoods(@RequestBody TGoods goods);
 }
diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/factory/WxPaymentFallbackFactory.java b/ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/factory/WxPaymentFallbackFactory.java
index ee40d32..6ed2018 100644
--- a/ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/factory/WxPaymentFallbackFactory.java
+++ b/ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/factory/WxPaymentFallbackFactory.java
@@ -5,6 +5,7 @@
 import com.ruoyi.payment.api.model.WxPaymentRefundModel;
 import com.ruoyi.payment.api.vo.NotifyV3PayDecodeRespBody;
 import com.ruoyi.payment.api.vo.PaymentOrder;
+import com.ruoyi.payment.api.vo.WxRefundNotifyResp;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.cloud.openfeign.FallbackFactory;
@@ -58,6 +59,11 @@
                 return R.fail("微信退款失败:" + throwable.getMessage());
 
             }
+    
+            @Override
+            public R<WxRefundNotifyResp> refundNotify(HttpServletRequest request) {
+                return R.fail("微信退款回调失败:" + throwable.getMessage());
+            }
         };
     }
 }
diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/feignClient/WxPaymentClient.java b/ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/feignClient/WxPaymentClient.java
index a09b432..90cb9c9 100644
--- a/ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/feignClient/WxPaymentClient.java
+++ b/ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/feignClient/WxPaymentClient.java
@@ -6,6 +6,7 @@
 import com.ruoyi.payment.api.model.WxPaymentRefundModel;
 import com.ruoyi.payment.api.vo.NotifyV3PayDecodeRespBody;
 import com.ruoyi.payment.api.vo.PaymentOrder;
+import com.ruoyi.payment.api.vo.WxRefundNotifyResp;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -65,4 +66,10 @@
 	@ApiOperation("订单退款")
 	@PostMapping(value = "/wx/refundOrderR")
 	public R<String> refundOrderR(@RequestBody WxPaymentRefundModel model);
+	
+	
+	
+	@ApiOperation("订单退款回调")
+	@PostMapping(value = "/wx/refund/notify")
+	R<WxRefundNotifyResp> refundNotify(HttpServletRequest request);
 }
diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/vo/WxRefundNotifyResp.java b/ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/vo/WxRefundNotifyResp.java
new file mode 100644
index 0000000..320cc40
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/vo/WxRefundNotifyResp.java
@@ -0,0 +1,35 @@
+package com.ruoyi.payment.api.vo;
+
+import lombok.Data;
+
+/**
+ * @author zhibing.pu
+ * @Date 2024/8/28 14:54
+ */
+@Data
+public class WxRefundNotifyResp {
+	/**
+	 * 支付单号
+	 */
+	private String out_trade_no;
+	/**
+	 * 退款单号
+	 */
+	private String out_refund_no;
+	/**
+	 * 支付流水号
+	 */
+	private String transaction_id;
+	/**
+	 * 退款流水号
+	 */
+	private String refund_id;
+	/**
+	 * 退款状态
+	 */
+	private String tradeState;
+	/**
+	 * 退款时间
+	 */
+	private String success_time;
+}
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TShoppingOrderController.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TShoppingOrderController.java
index c843b31..4edd63f 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TShoppingOrderController.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TShoppingOrderController.java
@@ -24,6 +24,7 @@
 import com.ruoyi.payment.api.model.RefundReq;
 import com.ruoyi.payment.api.model.RefundResp;
 import com.ruoyi.payment.api.model.WxPaymentRefundModel;
+import com.ruoyi.payment.api.vo.WxRefundNotifyResp;
 import com.ruoyi.system.api.domain.SysUser;
 import com.ruoyi.system.api.feignClient.SysUserClient;
 import io.swagger.annotations.Api;
@@ -33,6 +34,7 @@
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
 import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
@@ -228,6 +230,21 @@
 		return shoppingOrderService.cancelOrder(id);
 	}
 	
+	/**
+	 * 商城订单取消微信退款回调
+	 */
+	@PostMapping("/cancelShoppingOrderWxRefund")
+	public void cancelShoppingOrderWxRefund(HttpServletRequest request){
+		WxRefundNotifyResp data = wxPaymentClient.refundNotify(request).getData();
+		if(null != data){
+			String out_refund_no = data.getOut_refund_no();
+			String refund_id = data.getRefund_id();
+			String tradeState = data.getTradeState();
+			String success_time = data.getSuccess_time();
+			shoppingOrderService.cancelShoppingOrderWxRefund(out_refund_no, refund_id, tradeState, success_time);
+		}
+	}
+	
 	
 	
 	@ResponseBody
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/MyShoppingOrderInfo.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/MyShoppingOrderInfo.java
index 307d58f..382c3ff 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/MyShoppingOrderInfo.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/MyShoppingOrderInfo.java
@@ -39,6 +39,8 @@
 	private String code;
 	@ApiModelProperty("下单时间")
 	private String createTime;
+	@ApiModelProperty("订单金额")
+	private BigDecimal orderAmount;
 	@ApiModelProperty("支付金额")
 	private BigDecimal paymentAmount;
 	@ApiModelProperty("备注")
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/MyShoppingOrderList.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/MyShoppingOrderList.java
index 6cc1346..a16ec05 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/MyShoppingOrderList.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/MyShoppingOrderList.java
@@ -19,6 +19,8 @@
 	private String imgUrl;
 	@ApiModelProperty("商品名称")
 	private String name;
+	@ApiModelProperty("商品类型(1=商品,2=优惠券)")
+	private Integer orderType;
 	@ApiModelProperty("状态(1=待发货,2=待收货,3=已完成,4=已取消)")
 	private Integer status;
 	@ApiModelProperty("单价")
@@ -27,4 +29,6 @@
 	private Integer number;
 	@ApiModelProperty("支付金额")
 	private BigDecimal paymentAmount;
+	@ApiModelProperty("订单时间")
+	private String createTime;
 }
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TShoppingOrderService.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TShoppingOrderService.java
index a103b1d..ae5925d 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TShoppingOrderService.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TShoppingOrderService.java
@@ -55,6 +55,18 @@
     
     
     /**
+     * 商城订单取消订单微信退款处理
+     * @param out_refund_no 退款单号
+     * @param refund_id 退款流水号
+     * @param refund_status 退款状态 SUCCESS:退款成功  CLOSED:退款关闭  ABNORMAL:退款异常
+     * @param success_time 退款成功时间
+     * @return
+     */
+    AjaxResult cancelShoppingOrderWxRefund(String out_refund_no, String refund_id, String refund_status, String success_time);
+    
+    
+    
+    /**
      * 获取未开票的订单列表
      * @param query
      * @return
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java
index af1d4e3..30fb46a 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java
@@ -7,11 +7,13 @@
 import com.ruoyi.account.api.feignClient.AppCouponClient;
 import com.ruoyi.account.api.feignClient.AppUserAddressClient;
 import com.ruoyi.account.api.model.TAppUserAddress;
+import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.core.web.domain.AjaxResult;
 import com.ruoyi.common.core.web.page.PageInfo;
 import com.ruoyi.common.security.service.TokenService;
 import com.ruoyi.order.api.model.TExchangeOrder;
 import com.ruoyi.order.api.model.TShoppingOrder;
+import com.ruoyi.order.api.model.TShoppingOrderRefund;
 import com.ruoyi.order.api.query.ShoppingOrderQuery;
 import com.ruoyi.order.api.query.TActivityStatisticsQuery;
 import com.ruoyi.order.api.vo.ChargingOrderVO;
@@ -19,6 +21,7 @@
 import com.ruoyi.order.api.vo.TActivityVO;
 import com.ruoyi.order.dto.*;
 import com.ruoyi.order.mapper.TShoppingOrderMapper;
+import com.ruoyi.order.service.TShoppingOrderRefundService;
 import com.ruoyi.order.service.TShoppingOrderService;
 import com.ruoyi.other.api.domain.TCoupon;
 import com.ruoyi.other.api.domain.TGoods;
@@ -26,17 +29,25 @@
 import com.ruoyi.other.api.feignClient.GoodsClient;
 import com.ruoyi.payment.api.feignClient.AliPaymentClient;
 import com.ruoyi.payment.api.feignClient.WxPaymentClient;
+import com.ruoyi.payment.api.model.RefundReq;
+import com.ruoyi.payment.api.model.RefundResp;
+import com.ruoyi.payment.api.model.WxPaymentRefundModel;
+import com.ruoyi.payment.api.vo.AliQueryOrder;
 import com.ruoyi.payment.api.vo.NotifyV3PayDecodeRespBody;
+import io.seata.spring.annotation.GlobalTransactional;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -68,6 +79,9 @@
     
     @Resource
     private AliPaymentClient aliPaymentClient;
+    
+    @Resource
+    private TShoppingOrderRefundService shoppingOrderRefundService;
     
     
     
@@ -206,6 +220,7 @@
             myShoppingOrderList.setUnitPrice(unitPrice);
             myShoppingOrderList.setNumber(tShoppingOrder.getPurchaseQuantity());
             myShoppingOrderList.setPaymentAmount(tShoppingOrder.getPaymentAmount());
+            myShoppingOrderList.setOrderType(tShoppingOrder.getOrderType());
             pageList.add(myShoppingOrderList);
         }
         return pageList;
@@ -250,6 +265,7 @@
         info.setUnitPrice(unitPrice);
         info.setCode(shoppingOrder.getCode());
         info.setCreateTime(shoppingOrder.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+        info.setOrderAmount(shoppingOrder.getOrderAmount());
         info.setPaymentAmount(shoppingOrder.getPaymentAmount());
         info.setRemark(shoppingOrder.getRemark());
         info.setDeliveryTime(shoppingOrder.getConsignerTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
@@ -272,11 +288,18 @@
         if(shoppingOrder.getStatus() == 3){
             return AjaxResult.error("订单已完成,不能取消");
         }
-        if(shoppingOrder.getStatus() == 4){
+        //退款状态并且所有金额退完
+        List<TShoppingOrderRefund> list = shoppingOrderRefundService.list(new LambdaQueryWrapper<TShoppingOrderRefund>().eq(TShoppingOrderRefund::getShoppingOrderId, id).eq(TShoppingOrderRefund::getRefundStatus, 2));
+        BigDecimal bigDecimal = list.stream().map(TShoppingOrderRefund::getRefundAmount).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, RoundingMode.HALF_EVEN);
+        if(shoppingOrder.getPaymentAmount().compareTo(bigDecimal) == 0 && shoppingOrder.getStatus() == 4){
             return AjaxResult.error("订单已取消,不能重复操作");
         }
+    
+        //退款金额
+        BigDecimal refundAmount = shoppingOrder.getPaymentAmount().subtract(bigDecimal);
+    
         //先查询第三方订单状态订单是否退款
-        //支付方式(1=微信,2=支付宝) todo 待完善
+        //支付方式(1=微信,2=支付宝)
         Integer paymentType = shoppingOrder.getPaymentType();
         if(1 == paymentType){
             NotifyV3PayDecodeRespBody data = wxPaymentClient.queryOrderInfo(shoppingOrder.getCode()).getData();
@@ -290,20 +313,118 @@
             if("USERPAYING".equals(trade_state)){
                 return AjaxResult.error("订单正在支付中,不能操作退款");
             }
-            if("REFUND".equals(trade_state)){
-                return AjaxResult.error("订单已退款,不能操作退款");
-            }
         }
         if(2 == paymentType){
-        
+            AliQueryOrder aliQueryOrder = aliPaymentClient.query(shoppingOrder.getCode()).getData();
+            String tradeStatus = aliQueryOrder.getTradeStatus();
+            if("TRADE_CLOSED".equals(tradeStatus)){
+                return AjaxResult.error("订单还未支付,不能操作退款");
+            }
+            if("TRADE_FINISHED".equals(tradeStatus)){
+                return AjaxResult.error("订单支付已关闭,不能操作退款");
+            }
+            if("WAIT_BUYER_PAY".equals(tradeStatus)){
+                return AjaxResult.error("订单正在支付中,不能操作退款");
+            }
         }
         //退款成功后需要判断商品库存类型后决定是否需要回退库存
         //加redis锁处理高并发
-        
-        
+        //构建退款明细
+        TShoppingOrderRefund shoppingOrderRefund = new TShoppingOrderRefund();
+        shoppingOrderRefund.setPayTime(shoppingOrder.getPayTime());
+        shoppingOrderRefund.setPayCode(shoppingOrder.getSerialNumber());
+        shoppingOrderRefund.setPayType(shoppingOrder.getPaymentType());
+        shoppingOrderRefund.setShoppingOrderId(shoppingOrder.getId());
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
+        shoppingOrderRefund.setRefundCode("GDF" + sdf.format(new Date()) + (Math.random() * 1000));
+        shoppingOrderRefund.setRefundAmount(refundAmount);
+        shoppingOrderRefund.setRefundStatus(1);
+        shoppingOrderRefund.setCode(shoppingOrder.getCode());
+        shoppingOrderRefund.setRefundTitle("取消订单");
+        shoppingOrderRefund.setRefundContent("取消订单");
+        shoppingOrderRefund.setRefundReason("取消订单");
+        shoppingOrderRefund.setRefundRemark("全额退款");
+        shoppingOrderRefund.setRefundTotalAmount(refundAmount.add(bigDecimal));
+        shoppingOrderRefund.setPayAmount(shoppingOrder.getPaymentAmount());
+        if(1 == paymentType){
+            WxPaymentRefundModel model = new WxPaymentRefundModel();
+            model.setOut_trade_no(shoppingOrder.getCode());
+            model.setOut_refund_no(shoppingOrderRefund.getRefundCode());
+            model.setReason("取消订单");
+            model.setNotify_url("http://127.0.0.1:9000/order/t-shopping-order/cancelShoppingOrderWxRefund");
+            WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
+            amount.setRefund(refundAmount.multiply(new BigDecimal(100)).intValue());
+            amount.setTotal(shoppingOrder.getPaymentAmount().multiply(new BigDecimal(100)).intValue());
+            amount.setCurrency("CNY");
+            model.setAmount(amount);
+            R<String> orderR = wxPaymentClient.refundOrderR(model);
+            if(200 == orderR.getCode()){
+                shoppingOrderRefundService.save(shoppingOrderRefund);
+            }
+        }
+        if(2 == paymentType){
+            RefundReq dto = new RefundReq();
+            dto.setOutTradeNo(shoppingOrder.getCode());
+            dto.setOutRequestNo(shoppingOrderRefund.getCode());
+            dto.setRefundAmount(refundAmount.toString());
+            dto.setRefundReason("取消订单");
+            RefundResp resp = aliPaymentClient.refund(dto).getData();
+            if(null != resp){
+                SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-DDTHH:mm:ss+TIMEZONE");
+                AjaxResult success = cancelShoppingOrderWxRefund(resp.getOutTradeNo(), resp.getTradeNo(), "SUCCESS", sdf1.format(new Date()));
+                if(success.isSuccess()){
+                    shoppingOrderRefundService.save(shoppingOrderRefund);
+                }
+            }
+        }
         return AjaxResult.success();
     }
     
+    
+    /**
+     * 商城订单取消订单微信退款处理
+     * @param out_refund_no 退款单号
+     * @param refund_id 退款流水号
+     * @param refund_status 退款状态 SUCCESS:退款成功  CLOSED:退款关闭  ABNORMAL:退款异常
+     * @param success_time 退款成功时间
+     * @return
+     */
+    @Override
+    @GlobalTransactional(rollbackFor = Exception.class)//分布式事务
+    public AjaxResult cancelShoppingOrderWxRefund(String out_refund_no, String refund_id, String refund_status, String success_time) {
+        if("SUCCESS".equals(refund_status)){
+            TShoppingOrderRefund one = shoppingOrderRefundService.getOne(new LambdaQueryWrapper<TShoppingOrderRefund>().eq(TShoppingOrderRefund::getRefundCode, out_refund_no));
+            one.setRefundSerialNumber(refund_id);
+            one.setRefundTime(LocalDateTime.parse(success_time, DateTimeFormatter.ofPattern("yyyy-MM-DDTHH:mm:ss+TIMEZONE")));
+            shoppingOrderRefundService.updateById(one);
+            //判断是否需要回退库存
+            TShoppingOrder shoppingOrder = this.getById(one.getShoppingOrderId());
+            //商品
+            if(shoppingOrder.getOrderType() == 1){
+                // todo 需完善redis锁
+                //redis锁 和支付使用同一个锁
+                TGoods goods = goodsClient.getGoodsById(shoppingOrder.getGoodsId()).getData();
+                Integer inventory = goods.getInventory();
+                if(-1 != inventory){
+                    goods.setInventory(inventory + shoppingOrder.getPurchaseQuantity());
+                    goodsClient.updateGoods(goods);
+                }
+                //解锁
+            }
+            //优惠券
+            if(shoppingOrder.getOrderType() == 2){
+                //redis锁
+                TCoupon coupon = couponClient.getCouponById1(shoppingOrder.getCouponId()).getData();
+                Integer inventory = coupon.getInventoryQuantity();
+                if(-1 != inventory){
+                    coupon.setInventoryQuantity(inventory + shoppingOrder.getPurchaseQuantity());
+                    couponClient.updateCoupon(coupon);
+                }
+                //解锁
+            }
+        }
+        return AjaxResult.success();
+    }
     
     /**
      * 获取未开票的订单列表
@@ -336,6 +457,7 @@
             myShoppingOrderList.setUnitPrice(unitPrice);
             myShoppingOrderList.setNumber(tShoppingOrder.getPurchaseQuantity());
             myShoppingOrderList.setPaymentAmount(tShoppingOrder.getPaymentAmount());
+            myShoppingOrderList.setCreateTime(tShoppingOrder.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm:ss")));
             pageList.add(myShoppingOrderList);
         }
         return pageList;
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TCouponController.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TCouponController.java
index 34d1ff5..a2eefca 100644
--- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TCouponController.java
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TCouponController.java
@@ -202,7 +202,17 @@
         TCoupon coupon = tCouponService.getById(id);
         return R.ok(coupon);
     }
-
-
+    
+    
+    /**
+     * 修改优惠券
+     * @param coupon
+     * @return
+     */
+    @PostMapping(value = "/updateCoupon")
+    public R updateCoupon(@RequestBody TCoupon coupon){
+        tCouponService.updateById(coupon);
+        return R.ok();
+    }
 }
 
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TGoodsController.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TGoodsController.java
index 6021c3a..40fb7c6 100644
--- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TGoodsController.java
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TGoodsController.java
@@ -317,5 +317,17 @@
         TGoods goods = goodsService.getById(id);
         return R.ok(goods);
     }
+    
+    
+    /**
+     * 修改商品
+     * @param goods
+     * @return
+     */
+    @PostMapping("/updateGoods")
+    public R updateGoods(@RequestBody TGoods goods){
+        goodsService.updateById(goods);
+        return R.ok();
+    }
 }
 
diff --git a/ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/controller/WxPayController.java b/ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/controller/WxPayController.java
index 81ea044..a937505 100644
--- a/ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/controller/WxPayController.java
+++ b/ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/controller/WxPayController.java
@@ -4,6 +4,7 @@
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.core.web.domain.AjaxResult;
 import com.ruoyi.payment.api.vo.PaymentOrder;
+import com.ruoyi.payment.api.vo.WxRefundNotifyResp;
 import com.ruoyi.payment.wx.enums.RefundEnum;
 import com.ruoyi.payment.api.model.WxPaymentRefundModel;
 import com.ruoyi.payment.wx.resp.NotifyV3PayDecodeRespBody;
@@ -149,12 +150,12 @@
      * 退款回调
      */
     @PostMapping("refund/notify")
-    public void refundNotify(HttpServletRequest request) throws IOException {
+    public R<WxRefundNotifyResp> refundNotify(HttpServletRequest request) throws IOException {
         try {
             Map<String, Object> params = wxV3Pay.verifyNotify(request, new TypeReference<Map<String, Object>>() {
             });
             // 商户订单号
-            String tradeNo = params.get("out_trade_no").toString();
+            String out_trade_no = params.get("out_trade_no").toString();
             // 商户退款单号
             String out_refund_no = params.get("out_refund_no").toString();
             // 微信支付订单号
@@ -167,21 +168,22 @@
             // 时间不对的话,可以调用  WxTimeUtils.toRfc3339Date(success_time)转换一下
             String success_time = params.get("success_time").toString();
             if (tradeState.equals(RefundEnum.SUCCESS.name())) {
-                String substring = out_refund_no.substring(0, 2);
-                switch (substring){
-                    case "GW":
-                        break;
-
-                }
-                // TODO 退款成功处理
+                WxRefundNotifyResp resp = new WxRefundNotifyResp();
+                resp.setOut_trade_no(out_trade_no);
+                resp.setOut_refund_no(out_refund_no);
+                resp.setTradeState(tradeState);
+                resp.setTransaction_id(transaction_id);
+                resp.setRefund_id(refund_id);
+                resp.setSuccess_time(success_time);
                 wxV3Pay.ack();
+                return R.ok(resp);
             } else {
                 wxV3Pay.ack(false, "不是成功的退款状态");
             }
         } catch (Exception e) {
             wxV3Pay.ack(false, e.getMessage());
         }
-
+        return R.fail();
     }
     
     /**

--
Gitblit v1.7.1