Bläddra i källkod

平台后台,订单增加退款功能

baolei 2 månader sedan
förälder
incheckning
c522a5ec28
15 ändrade filer med 348 tillägg och 11 borttagningar
  1. 24 0
      08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/business/order/controller/OrderController.java
  2. 4 0
      08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/business/order/domain/OrderVo.java
  3. 2 0
      08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/business/order/mapper/OrderVoMapper.java
  4. 10 0
      08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/business/order/service/IOrderVoService.java
  5. 54 0
      08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/business/order/service/impl/OrderVoServiceImpl.java
  6. 18 0
      08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/business/refundInfo/domain/RefundInfoVo.java
  7. 23 0
      08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/business/refundInfo/mapper/RefundInfoVoMapper.java
  8. 7 0
      08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/wxpay/controller/WechatPayController.java
  9. 78 0
      08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/wxpay/service/WechatPayService.java
  10. 6 3
      08.src/Xingxi/xingxi-admin/src/main/resources/application-local.yml
  11. 1 1
      08.src/Xingxi/xingxi-admin/src/main/resources/application.yml
  12. 9 0
      08.src/Xingxi/xingxi-admin/src/main/resources/mapper/OrderVoMapper.xml
  13. 16 0
      08.src/Xingxi/xingxi-admin/src/main/resources/mapper/RefundInfoVoMapper.xml
  14. 95 6
      08.src/Xingxi/xingxi-admin/src/main/resources/templates/business/order/order.html
  15. 1 1
      08.src/Xingxi/xingxi-framework/src/main/java/com/xingxi/framework/config/ShiroConfig.java

+ 24 - 0
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/business/order/controller/OrderController.java

@@ -1,9 +1,17 @@
 package com.xingxi.web.controller.business.order.controller;
 
+import com.xingxi.business.Banner.domain.Banner;
+import com.xingxi.business.Order.domain.Order;
+import com.xingxi.common.annotation.Log;
 import com.xingxi.common.core.controller.BaseController;
+import com.xingxi.common.core.domain.AjaxResult;
 import com.xingxi.common.core.page.TableDataInfo;
+import com.xingxi.common.enums.BusinessType;
+import com.xingxi.common.enums.EBannerType;
 import com.xingxi.common.enums.EDelFlag;
 import com.xingxi.common.enums.ERoleKey;
+import com.xingxi.common.utils.DateUtils;
+import com.xingxi.common.utils.RMBUtil;
 import com.xingxi.common.utils.ShiroUtils;
 import com.xingxi.web.controller.business.order.domain.OrderDetailVo;
 import com.xingxi.web.controller.business.order.domain.OrderVo;
@@ -15,6 +23,7 @@ import org.springframework.ui.ModelMap;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -79,4 +88,19 @@ public class OrderController extends BaseController {
         List<OrderDetailVo> orderDetailVoList = orderDetailVoService.selectOrderDetailVoList(cond);
         return getDataTable(orderDetailVoList);
     }
+
+    @RequiresPermissions("business:order:edit")
+    @Log(title = "banner", businessType = BusinessType.UPDATE)
+    @PostMapping("/refundOrder")
+    @ResponseBody
+    public AjaxResult refundOrder(OrderVo orderVo) {
+
+//        orderVo.setRefundAmount(RMBUtil.fenToYuan(orderVo.getRefundAmount()));
+        orderVo.setCreateTime(DateUtils.getNowDate());
+        orderVo.setCreateUser(getLoginName());
+        orderVo.setUpdateTime(DateUtils.getNowDate());
+        orderVo.setUpdateUser(getLoginName());
+        return toAjax(orderVoService.refundOrder(orderVo));
+
+    }
 }

+ 4 - 0
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/business/order/domain/OrderVo.java

@@ -4,6 +4,8 @@ import com.xingxi.business.Order.domain.Order;
 import lombok.Data;
 import lombok.ToString;
 
+import java.math.BigDecimal;
+
 /**
  * 订单 表 t_order
  *
@@ -29,4 +31,6 @@ public class OrderVo extends Order {
     // 选中的发单ID
     private String selectedOrderDetailIds;
     private String[] orderDetailIds;
+
+    private BigDecimal refundAmount;
 }

+ 2 - 0
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/business/order/mapper/OrderVoMapper.java

@@ -21,6 +21,8 @@ public interface OrderVoMapper {
      */
     OrderVo selectOrderVoByOrderId(Long orderId);
 
+    OrderVo selectOrderVoByOrderNo(String orderNo);
+
     /**
      * 查询订单Vo 列表
      *

+ 10 - 0
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/business/order/service/IOrderVoService.java

@@ -1,5 +1,6 @@
 package com.xingxi.web.controller.business.order.service;
 
+import com.xingxi.business.Banner.domain.Banner;
 import com.xingxi.web.controller.business.order.domain.OrderVo;
 
 import java.util.List;
@@ -26,4 +27,13 @@ public interface IOrderVoService {
      * @return 订单Vo 集合
      */
     List<OrderVo> selectOrderVoList(OrderVo orderVo);
+
+    /**
+     * 申请退款
+     *
+     * @param orderVo 退款内容Vo
+     * @return 结果
+     */
+    int refundOrder(OrderVo orderVo);
+
 }

+ 54 - 0
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/business/order/service/impl/OrderVoServiceImpl.java

@@ -1,12 +1,22 @@
 package com.xingxi.web.controller.business.order.service.impl;
 
+import com.github.binarywang.wxpay.bean.result.WxPayRefundV3Result;
+import com.xingxi.business.RefundInfo.domain.RefundInfo;
+import com.xingxi.business.RefundInfo.mapper.RefundInfoMapper;
+import com.xingxi.common.enums.EDelFlag;
+import com.xingxi.common.utils.DateUtils;
 import com.xingxi.common.utils.MaskUtils;
 import com.xingxi.web.controller.business.order.domain.OrderVo;
 import com.xingxi.web.controller.business.order.mapper.OrderVoMapper;
 import com.xingxi.web.controller.business.order.service.IOrderVoService;
+import com.xingxi.web.wxpay.service.WechatPayService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -19,7 +29,11 @@ import java.util.List;
 public class OrderVoServiceImpl implements IOrderVoService {
     @Resource
     private OrderVoMapper orderVoMapper;
+    @Resource
+    private RefundInfoMapper refundInfoMapper;
 
+    @Autowired
+    WechatPayService wechatPayService;
     /**
      * 查询订单 信息
      *
@@ -49,4 +63,44 @@ public class OrderVoServiceImpl implements IOrderVoService {
         }
         return resultList;
     }
+
+    @Override
+    @Transactional
+    public int refundOrder(OrderVo orderVo) {
+
+        Date nowDate = DateUtils.getNowDate();
+
+        // 微信支付发起退款
+        WxPayRefundV3Result result = wechatPayService.refund(orderVo.getOrderNo(), orderVo.getPayAmount(), orderVo.getRefundAmount());
+
+        // 生成退货单
+        RefundInfo refundInfo = new RefundInfo();
+        refundInfo.setTransactionId(result.getTransactionId());
+        refundInfo.setOutTradeNo(orderVo.getOrderNo());
+        refundInfo.setOutRefundNo(result.getOutRefundNo());
+        refundInfo.setReason(orderVo.getOrderNo() + "退款");
+        refundInfo.setAmountRefund(new BigDecimal(result.getAmount().getRefund()));
+        refundInfo.setAmountTotal(new BigDecimal(result.getAmount().getTotal()));
+        refundInfo.setRefundId(result.getRefundId());
+        refundInfo.setChannel(result.getChannel());
+        refundInfo.setUserReceivedAccount(result.getUserReceivedAccount());
+        refundInfo.setSuccessTime(result.getSuccessTime());
+        refundInfo.setRefundTime(refundInfo.getRefundTime());
+        refundInfo.setStatus(result.getStatus());
+        refundInfo.setFundsAccount(result.getFundsAccount());
+        refundInfo.setPayerTotal(new BigDecimal(result.getAmount().getPayerTotal()));
+        refundInfo.setPayerRefund(new BigDecimal(result.getAmount().getPayerRefund()));
+        refundInfo.setSettlementRefund(new BigDecimal(result.getAmount().getSettlementRefund()));
+        refundInfo.setSettlementTotal(new BigDecimal(result.getAmount().getSettlementTotal()));
+        refundInfo.setDiscountRefund(new BigDecimal(result.getAmount().getDiscountRefund()));
+
+        refundInfo.setDelFlag(EDelFlag.NO.getVal());
+        refundInfo.setCreateUser(orderVo.getCreateUser());
+        refundInfo.setCreateTime(orderVo.getCreateTime());
+        refundInfo.setUpdateUser(orderVo.getCreateUser());
+        refundInfo.setUpdateTime(orderVo.getCreateTime());
+        refundInfoMapper.insertRefundInfo(refundInfo);
+
+        return 0;
+    }
 }

+ 18 - 0
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/business/refundInfo/domain/RefundInfoVo.java

@@ -0,0 +1,18 @@
+package com.xingxi.web.controller.business.refundInfo.domain;
+
+import com.xingxi.business.RefundInfo.domain.RefundInfo;
+import lombok.Data;
+import lombok.ToString;
+
+/**
+ * 订单 表 t_order
+ *
+ * @author xingxi
+ * @date 2025-05-20
+ */
+@Data
+@ToString(callSuper = true)
+public class RefundInfoVo extends RefundInfo {
+    private static final long serialVersionUID = 1L;
+
+}

+ 23 - 0
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/business/refundInfo/mapper/RefundInfoVoMapper.java

@@ -0,0 +1,23 @@
+package com.xingxi.web.controller.business.refundInfo.mapper;
+
+import com.xingxi.web.controller.business.refundInfo.domain.RefundInfoVo;
+import org.springframework.stereotype.Repository;
+
+/**
+ * 订单  数据层
+ *
+ * @author xingxi
+ * @date 2025-05-20
+ */
+@Repository
+public interface RefundInfoVoMapper {
+
+    /**
+     * 查询退款订单Vo 信息
+     *
+     * @param outRefundNo 退款单号
+     * @return 订单 信息
+     */
+    RefundInfoVo selectRefundInfoByOutRefundNo(String outRefundNo);
+
+}

+ 7 - 0
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/wxpay/controller/WechatPayController.java

@@ -17,6 +17,8 @@ import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
 
 /**
@@ -67,5 +69,10 @@ public class WechatPayController extends BaseController
         return wechatPayService.refund(orderNo, payAmount, refundAmount);
     }
 
+    @PostMapping("/refund/callback")
+    public String refundCallback(HttpServletRequest request, HttpServletResponse response) {
+        return wechatPayService.refundCallback(request, response);
+    }
+
 }
 

+ 78 - 0
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/wxpay/service/WechatPayService.java

@@ -1,5 +1,7 @@
 package com.xingxi.web.wxpay.service;
 
+import com.github.binarywang.wxpay.bean.notify.SignatureHeader;
+import com.github.binarywang.wxpay.bean.notify.WxPayRefundNotifyV3Result;
 import com.github.binarywang.wxpay.bean.request.WxPayOrderQueryV3Request;
 import com.github.binarywang.wxpay.bean.request.WxPayRefundQueryV3Request;
 import com.github.binarywang.wxpay.bean.request.WxPayRefundV3Request;
@@ -8,11 +10,26 @@ import com.github.binarywang.wxpay.bean.result.WxPayRefundQueryV3Result;
 import com.github.binarywang.wxpay.bean.result.WxPayRefundV3Result;
 import com.github.binarywang.wxpay.exception.WxPayException;
 import com.github.binarywang.wxpay.service.WxPayService;
+import com.xingxi.business.Order.mapper.OrderMapper;
+import com.xingxi.business.RefundInfo.mapper.RefundInfoMapper;
+import com.xingxi.common.enums.EOrderStatus;
+import com.xingxi.common.utils.DateUtils;
+import com.xingxi.web.controller.business.order.domain.OrderVo;
+import com.xingxi.web.controller.business.order.mapper.OrderVoMapper;
+import com.xingxi.web.controller.business.refundInfo.domain.RefundInfoVo;
+import com.xingxi.web.controller.business.refundInfo.mapper.RefundInfoVoMapper;
+import com.xingxi.web.wxpay.config.WechatPayConfig;
+import com.xingxi.web.wxpay.config.WechatPayProperties;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.StreamUtils;
 
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
+import java.nio.charset.Charset;
 
 @Slf4j
 @Service
@@ -20,6 +37,16 @@ public class WechatPayService {
 
     @Autowired
     private WxPayService wxPayService;
+    @Autowired
+    private RefundInfoMapper refundInfoMapper;
+    @Autowired
+    private RefundInfoVoMapper refundInfoVoMapper;
+    @Resource
+    private WechatPayProperties payProperties;
+    @Autowired
+    private OrderVoMapper orderVoMapper;
+    @Autowired
+    private OrderMapper orderMapper;
 
     public WxPayOrderQueryV3Result orderQuery(WxPayOrderQueryV3Request request) {
         // 查询是否支付成功
@@ -53,6 +80,7 @@ public class WechatPayService {
         refundAmountObj.setCurrency("CNY");
 
         wxRefundRequest.setAmount(refundAmountObj);
+        wxRefundRequest.setNotifyUrl(payProperties.getRefundcallbackUrl());
         try {
             rtn = wxPayService.refundV3(wxRefundRequest);
         } catch (WxPayException e) {
@@ -80,4 +108,54 @@ public class WechatPayService {
         return rtn;
     }
 
+    private SignatureHeader httpRequestToSignatureHeader(HttpServletRequest request){
+
+        String serial = request.getHeader("Wechatpay-Serial");
+        String signature = request.getHeader("Wechatpay-Signature");
+        String timestamp = request.getHeader("Wechatpay-Timestamp");
+        String nonceStr = request.getHeader("Wechatpay-Nonce");
+        SignatureHeader signatureHeader = new SignatureHeader();
+        signatureHeader.setSerial(serial);
+        signatureHeader.setSignature(signature);
+        signatureHeader.setNonce(nonceStr);
+        signatureHeader.setTimeStamp(timestamp);
+        return signatureHeader;
+
+    }
+
+    public String refundCallback(HttpServletRequest request, HttpServletResponse response) {
+
+        try {
+            SignatureHeader signatureHeader = httpRequestToSignatureHeader(request);
+            String s = StreamUtils.copyToString(request.getInputStream(), Charset.defaultCharset());
+
+            WxPayRefundNotifyV3Result wxPayOrderNotifyV3Result = wxPayService.parseRefundNotifyV3Result(s, signatureHeader);
+
+            WxPayRefundNotifyV3Result.DecryptNotifyResult decryptNotifyResult = wxPayOrderNotifyV3Result.getResult();
+
+            String outRefundNo = decryptNotifyResult.getOutRefundNo();
+
+            RefundInfoVo refundInfoVo = refundInfoVoMapper.selectRefundInfoByOutRefundNo(outRefundNo);
+
+            refundInfoVo.setStatus(decryptNotifyResult.getRefundStatus());
+            refundInfoVo.setSuccessTime(decryptNotifyResult.getSuccessTime());
+            refundInfoVo.setUserReceivedAccount(decryptNotifyResult.getUserReceivedAccount());
+            refundInfoVo.setUpdateTime(DateUtils.getNowDate());
+            refundInfoVo.setUpdateUser("refundCallback");
+            refundInfoMapper.updateRefundInfo(refundInfoVo);
+
+            OrderVo orderVo = orderVoMapper.selectOrderVoByOrderNo(decryptNotifyResult.getOutTradeNo());
+            orderVo.setOrderStatus(EOrderStatus.FINISHED.getVal());
+//            orderVo.setRefundAmount(BigDecimal.valueOf(decryptNotifyResult.getAmount().getRefund()));
+            orderVo.setUpdateTime(DateUtils.getNowDate());
+            orderVo.setUpdateUser("refundCallback");
+            orderMapper.updateOrder(orderVo);
+
+        } catch (Exception e) {
+            log.error("处理微信支付退款回调通知失败!!!!:{}", e.getMessage());
+            return "FAIL";
+        }
+
+        return "SUCCESS";
+    }
 }

+ 6 - 3
08.src/Xingxi/xingxi-admin/src/main/resources/application-local.yml

@@ -13,9 +13,12 @@ spring:
         druid:
             # 主库数据源
             master:
-                url: jdbc:mysql://47.99.85.139:3306/GoodsMarket?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
-                username: gululuq
-                password: f^*n%QfvekP!0Rur
+#                url: jdbc:mysql://47.99.85.139:3306/GoodsMarket?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+#                username: gululuq
+#                password: f^*n%QfvekP!0Rur
+                url: "jdbc:mysql://rm-uf6fjpp72u4q4u0nofo.mysql.rds.aliyuncs.com:3306/gululuq?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8"
+                username: "gululuqrw"
+                password: 1273349861gululuQ
             # 从库数据源
             slave:
                 # 从数据源开关/默认关闭

+ 1 - 1
08.src/Xingxi/xingxi-admin/src/main/resources/application.yml

@@ -153,4 +153,4 @@ xingxi:
     privateKeyPath: "classpath:META-INF/apiclient_key.pem"
     privateCertPath: "classpath:META-INF/apiclient_cert.pem"
     callbackUrl: "https://mpapi.gululuq.com/unifiedpay/wxpay/callback"
-    refundcallbackUrl: "https://mpapi.gululuq.com/unifiedpay/refund/wxpay/callback"
+    refundcallbackUrl: "https://mpapi.gululuq.com/wechatPay/refund/callback"

+ 9 - 0
08.src/Xingxi/xingxi-admin/src/main/resources/mapper/OrderVoMapper.xml

@@ -30,6 +30,7 @@
         <result property="sellerMobile"     column="sellerMobile"   />
         <result property="buyerName"        column="buyerName"      />
         <result property="prodName"         column="prodName"       />
+        <result property="refundAmount"         column="refundAmount"       />
     </resultMap>
 
     <sql id="selectOrderVo">
@@ -60,9 +61,11 @@
              , m_merchant.mercName as sellerName
              , m_merchant.mobile as sellerMobile
              , sys_user.user_name as buyerName
+            , t_refund_info.amountRefund refundAmount
         from t_order
         inner join m_merchant on m_merchant.mercId = t_order.sellerId
         inner join sys_user on sys_user.user_id = t_order.buyerId
+        left join t_refund_info on t_order.orderNo = t_refund_info.outTradeNo
     </sql>
 
     <select id="selectOrderVoByOrderId" parameterType="Long" resultMap="OrderVoResult">
@@ -70,6 +73,12 @@
         where t_order.orderId = #{orderId}
     </select>
 
+    <select id="selectOrderVoByOrderNo" parameterType="String" resultMap="OrderVoResult">
+        <include refid="selectOrderVo"/>
+        where t_order.orderNo = #{orderNo}
+        limit 1
+    </select>
+
     <select id="selectOrderVoList" parameterType="OrderVo" resultMap="OrderVoResult">
         <include refid="selectOrderVo"/>
         <where>

+ 16 - 0
08.src/Xingxi/xingxi-admin/src/main/resources/mapper/RefundInfoVoMapper.xml

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.xingxi.web.controller.business.refundInfo.mapper.RefundInfoVoMapper">
+
+    <sql id="selectOrderVo">
+        select id, delFlag, createUser, createTime, updateUser, updateTime, transactionId, outTradeNo, outRefundNo, reason, notifyUrl, amountRefund, amountTotal, refundId, channel, userReceivedAccount, successTime, refundTime, status, fundsAccount, payerTotal, payerRefund, settlementRefund, settlementTotal, discountRefund
+        from t_refund_info
+    </sql>
+
+    <select id="selectRefundInfoByOutRefundNo" parameterType="String" resultType="RefundInfoVo">
+        <include refid="selectOrderVo"/>
+        where t_refund_info.outRefundNo = #{outRefundNo}
+        limit 1
+    </select>
+
+</mapper>

+ 95 - 6
08.src/Xingxi/xingxi-admin/src/main/resources/templates/business/order/order.html

@@ -47,7 +47,7 @@
 							</li>
 							<li class="select-time">
 								<label>取消时间: </label>
-								<input type="text" class="time-input" placeholder="开始时间" id="cancel TimeFrom" name="params[cancelTimeFrom]"/>
+								<input type="text" class="time-input" placeholder="开始时间" id="cancelTimeFrom" name="params[cancelTimeFrom]"/>
 								<span>-</span>
 								<input type="text" class="time-input" placeholder="结束时间" id="cancelTimeTo" name="params[cancelTimeTo]"/>
 							</li>
@@ -68,7 +68,7 @@
 					</div>
                 </form>
             </div>
-            
+
             <div class="btn-group-sm" id="toolbar" role="group">
             </div>
             <div class="col-sm-12 select-table table-striped">
@@ -76,6 +76,27 @@
             </div>
         </div>
     </div>
+
+	<!-- 退款区域 -->
+	<script id="divInputRefund" type="text/template">
+		<div class="col-xs-offset-2">
+			<form id="frmInputRefund">
+				<input type="hidden" id="orderId">
+				<div class="form-group form-inline" style="margin-top: 15px;">
+					<label th:for="orderNo">订单号: </label>
+					<p class="form-control-static" id="orderNo"></p>
+				</div>
+				<div class="form-group form-inline" style="margin-top: 15px;">
+					<label th:for="payAmount">订单金额: </label>
+					<p class="form-control-static" id="payAmount"></p>
+				</div>
+				<div class="form-group form-inline" style="margin-top: 15px;">
+					<label th:for="refundAmount">退款金额: </label>
+					<input type="text" class="form-control" id="refundAmount" placeholder="退款金额">
+				</div>
+			</form>
+		</div>
+	</script>
 	<script th:src="@{/js/datatimeTool.js}"></script>
 	<script th:src="@{/ruoyi/js/currency.js}"></script>
 	<th:block th:include="include :: footer" />
@@ -112,9 +133,18 @@
 							return $.table.selectDictLabel(datas, value);
 						}
 					},
+					// {
+					// 	field : 'orderAmount',
+					// 	title : '订单总额',
+					// 	sortable: false,
+					// 	align : "right",
+					// 	formatter: function(value, row, index) {
+					// 		return formatCurrency(value / 100, 2);
+					// 	}
+					// },
 					{
-						field : 'orderAmount',
-						title : '订单总额',
+						field : 'payAmount',
+						title : '实付总额',
 						sortable: false,
 						align : "right",
 						formatter: function(value, row, index) {
@@ -122,8 +152,8 @@
 						}
 					},
 					{
-						field : 'payAmount',
-						title : '实付总额',
+						field : 'refundAmount',
+						title : '退款金额',
 						sortable: false,
 						align : "right",
 						formatter: function(value, row, index) {
@@ -177,6 +207,11 @@
 						formatter: function(value, row, index) {
 							var actions = [];
 							actions.push('<a class="btn btn-success btn-xs" href="javascript:void(0)" onclick="$.modal.openTab(\'订单详情\', \'' + prefix + '/detail/' + row.orderId + '\')"><i class="fa fa-edit"></i>查看</a> ');
+							// 退款
+							if (row.orderStatus === 'PAYED' || row.orderStatus === 'DELIVERED' || row.orderStatus === 'RECEIVED') {
+								actions.push('<a class="btn btn-success btn-xs" href="javascript:void(0)" onclick="refund(\'' + row.orderId + '\', \'' + row.orderNo + '\', \'' + row.payAmount + '\')"><i class="fa fa-edit"></i>退款</a> ');
+
+							}
 							return actions.join('');
 						}
 					}
@@ -184,6 +219,60 @@
 			};
 			$.table.init(options);
 		});
+
+		function refund(orderId, orderNo, payAmount) {
+			var content = $('#divInputRefund').html();
+
+			layer.open({
+				type: 1,
+				fix: false,
+				maxmin: false,
+				shade: 0.3,
+				area: ['520px', '340px'],
+				title: '输入退款金额',
+				// 弹层外区域关闭
+				shadeClose: true,
+				success: function(layero, index) {
+					layero.find('#orderId').val(orderId);
+					layero.find('#orderNo').text(orderNo);
+					layero.find('#payAmount').text(formatCurrency(payAmount / 100, 2));
+				},
+				content: content, //捕获的元素,注意:最好该指定的元素要存放在body最外层,否则可能被其它的相对元素所影响
+				btn: ['<i class="fa fa-check"></i> 确定', '<i class="fa fa-remove"></i> 关闭'],
+				btn1: function() {
+					var refundAmount = $("#refundAmount").val();
+					if (refundAmount === "") {
+						$.modal.alertError("请输入退款金额");
+						return;
+					}
+					var url = prefix + "/refundOrder";
+					var data = {
+						"orderId": orderId,
+						"payAmount": payAmount,
+						"refundAmount": refundAmount
+					};
+					$.post(url, data, function(result) {
+						if (result.code === web_status.SUCCESS) {
+							$.modal.closeAll();
+							$.modal.enable();
+							$.modal.alertSuccess(result.msg);
+							$.table.search();
+						} else if (result.code === web_status.WARNING) {
+							$.modal.closeAll();
+							$.modal.enable();
+							$.modal.alertWarning(result.msg)
+						} else {
+							$.modal.closeAll();
+							$.modal.enable();
+							$.modal.alertError(result.msg);
+						}
+					});
+					layer.closeAll();
+				}
+			});
+
+
+		}
 	</script>
 </body>
 </html>

+ 1 - 1
08.src/Xingxi/xingxi-framework/src/main/java/com/xingxi/framework/config/ShiroConfig.java

@@ -326,7 +326,7 @@ public class ShiroConfig {
         filterChainDefinitionMap.put("/logout", "logout");
         // 不需要拦截的访问
         filterChainDefinitionMap.put("/login", "anon,captchaValidate");
-//        filterChainDefinitionMap.put("/unifiedpay/wxpay/callback", "anon");
+        filterChainDefinitionMap.put("/wechatPay/refund/callback", "anon");
         // 注册相关
         filterChainDefinitionMap.put("/register", "anon,captchaValidate");
         // 系统权限列表