Pārlūkot izejas kodu

bugfix:部分退款

lyx 3 mēneši atpakaļ
vecāks
revīzija
733ed46eda

+ 2 - 1
alien-entity/src/main/java/shop/alien/entity/store/LifeRefundOrder.java

@@ -56,7 +56,8 @@ public class LifeRefundOrder {
 
     @TableField(exist = false)
     private String quanId;
-
+    @ApiModelProperty(value = "部分退款编号")
+    private String partialRefundCode;
     @ApiModelProperty(value = "删除标记, 0:未删除, 1:已删除")
     @TableField("delete_flag")
     @TableLogic

+ 14 - 10
alien-entity/src/main/java/shop/alien/entity/store/OrderCouponMiddle.java

@@ -17,15 +17,16 @@ public class OrderCouponMiddle {
     @TableId(value = "id", type = IdType.AUTO)
     private Integer id;
 
-    private String couponCode; // 券编号
-
-    private String orderId; // 订单id
-
-    private Integer status; // 订单状态,0.待使用, 1.已核销, 2.已过期, 3.待退款,4.已退款,5.退款失败,6.已取消,
-
-    private BigDecimal price; // 券价格
-
-    private String refundReason; // 退款原因
+    @ApiModelProperty(value = "券编号")
+    private String couponCode;
+    @ApiModelProperty(value = "订单id")
+    private String orderId;
+    @ApiModelProperty(value = "订单状态,0.待使用, 1.已核销, 2.已过期, 3.待退款,4.已退款,5.退款失败,6.已取消,")
+    private Integer status;
+    @ApiModelProperty(value = "券金额")
+    private BigDecimal price;
+    @ApiModelProperty(value = "退款原因")
+    private String refundReason;
 
     @TableField(exist = false)
     private Integer count;
@@ -34,7 +35,10 @@ public class OrderCouponMiddle {
     private Date usedTime; // 使用时间
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date refundTime; // 退款时间
-    private Integer couponId; // 团购/代金券id
+    @ApiModelProperty(value = "团购/代金券id")
+    private Integer couponId;
+    @ApiModelProperty(value = "部分退款编号")
+    private String partialRefundCode;
     @ApiModelProperty(value = "删除标记, 0:未删除, 1:已删除")
     @TableField("delete_flag")
     @TableLogic

+ 2 - 1
alien-job/src/main/java/shop/alien/job/feign/AlienStoreFeign.java

@@ -53,6 +53,7 @@ public interface AlienStoreFeign {
     @GetMapping("/processRefund")
     public String processRefund(@RequestParam(value = "outTradeNo") String outTradeNo,
                                    @RequestParam(value = "refundAmount") String refundAmount,
-                                   @RequestParam(value = "refundReason") String refundReason);
+                                   @RequestParam(value = "refundReason") String refundReason,
+                                   @RequestParam(value = "partialRefundCode") String partialRefundCode);
 
 }

+ 7 - 5
alien-job/src/main/java/shop/alien/job/store/LifeUserOrderJob.java

@@ -14,6 +14,7 @@ import shop.alien.entity.store.*;
 import shop.alien.entity.store.vo.LifeUserOrderVo;
 import shop.alien.job.feign.AlienStoreFeign;
 import shop.alien.mapper.*;
+import shop.alien.util.common.UniqueRandomNumGenerator;
 import shop.alien.util.common.constant.DiscountCouponEnum;
 import shop.alien.util.common.constant.OrderStatusEnum;
 
@@ -202,10 +203,11 @@ public class LifeUserOrderJob {
                         String refundResult = null;
                         if (refundList.size() == orderCouponMiddleList.size()) {
                             // 全退
-                            refundResult = alienStoreFeign.processRefund(order.getOrderNo(), totalRefundAmount.toString(), "过期自动退");
+                            refundResult = alienStoreFeign.processRefund(order.getOrderNo(), totalRefundAmount.toString(), "过期自动退","");
                         } else {
                             // TODO 本次部分退款
-                            refundResult = alienStoreFeign.processRefund(order.getOrderNo(), totalRefundAmount.toString(), "过期自动退");
+                            String partialRefundCode = UniqueRandomNumGenerator.generateUniqueCode(12);
+                            refundResult = alienStoreFeign.processRefund(order.getOrderNo(), totalRefundAmount.toString(), "过期自动退",partialRefundCode);
                         }
                         if ("调用成功".equals(refundResult)) {
                             //  1.更新中间表状态
@@ -269,9 +271,9 @@ public class LifeUserOrderJob {
                     } else {
                         // 更新中间表状态
                         //  1.更新中间表状态
-                        int updateNum = orderCouponMiddleMapper.update(null, new LambdaUpdateWrapper<OrderCouponMiddle>()
-                                .set(OrderCouponMiddle::getStatus, OrderStatusEnum.REFUND_FAILED.getStatus())
-                                .in(OrderCouponMiddle::getId, collect));
+//                        int updateNum = orderCouponMiddleMapper.update(null, new LambdaUpdateWrapper<OrderCouponMiddle>()
+//                                .set(OrderCouponMiddle::getStatus, OrderStatusEnum.REFUND_FAILED.getStatus())
+//                                .in(OrderCouponMiddle::getId, collect));
                         log.error("自动退款失败");
                         throw new RuntimeException("自动退款失败");
                     }

+ 3 - 2
alien-store/src/main/java/shop/alien/store/controller/AliController.java

@@ -221,7 +221,8 @@ public class AliController {
     @GetMapping("/processRefund")
     public String processRefund(@RequestParam(value = "outTradeNo") String outTradeNo,
                                        @RequestParam(value = "refundAmount") String refundAmount,
-                                       @RequestParam(value = "refundReason") String refundReason) {
-        return aliApi.processRefund(outTradeNo, refundAmount, refundReason);
+                                       @RequestParam(value = "refundReason") String refundReason,
+                                       @RequestParam(value = "partialRefundCode") String partialRefundCode) {
+        return aliApi.processRefund(outTradeNo, refundAmount, refundReason, partialRefundCode);
     }
 }

+ 23 - 12
alien-store/src/main/java/shop/alien/store/service/LifeUserOrderService.java

@@ -414,6 +414,8 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
         }
         List<OrderCouponMiddle> orderCouponMiddles = orderCouponMiddleMapper.selectList(new QueryWrapper<OrderCouponMiddle>()
                 .eq("order_id", refundOrder.getOrderId()).eq("delete_flag",0));
+        // 1.查询订单信息  订单表 + 中间表
+        LifeUserOrder order = lifeUserOrderMapper.selectById(refundOrder.getOrderId());
         // 待使用的券(可退款的券)
         List<OrderCouponMiddle> orderCouponMiddles1 = orderCouponMiddles.stream().filter(orderCouponMiddle -> orderCouponMiddle.getStatus() == 1).collect(Collectors.toList());
         if (orderCouponMiddles1.size() < refundOrder.getRefundCouponAmount()) {
@@ -430,37 +432,47 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
             totalRefundMoney = totalRefundMoney.add(new BigDecimal(lifeRefundOrder.getRefundMoney()));
             refundCouponCount += lifeRefundOrder.getRefundCouponAmount();
         }
-        if(totalRefundMoney.compareTo(new BigDecimal(refundOrder.getRefundMoney()))>0){
+        if(totalRefundMoney.compareTo(new BigDecimal(order.getFinalPrice()))>0){
             returnMap.put("fail","退款金额(已退+当前退)不能大于订单金额");
             return returnMap;
         }
         Date now = new Date();
-        LifeUserOrder order = lifeUserOrderMapper.selectById(refundOrder.getOrderId());
-        String result = aliApi.processRefund(order.getOrderNo(), refundOrder.getRefundMoney(), refundOrder.getDescription());
+        boolean ifPartialRefund = false;
+        String PartialRefundCode = "";
+        // 只要本次退款不是全退都是部分退
+        if (refundOrder.getRefundCouponAmount() != orderCouponMiddles.size()){
+            ifPartialRefund = true;
+            PartialRefundCode = UniqueRandomNumGenerator.generateUniqueCode(12);
+        }
+        String result = aliApi.processRefund(order.getOrderNo(), refundOrder.getRefundMoney(), refundOrder.getDescription(),PartialRefundCode);
         String refundMessage = "";
 
         // 更新的中间表id
         List<Integer> updateIds = orderCouponMiddles1.stream().limit(refundOrder.getRefundCouponAmount()).map(x -> x.getId()).collect(Collectors.toList());
         if (result.equals("调用失败")) {
             refundMessage = "退款失败";
-            orderCouponMiddleMapper.update(null,new UpdateWrapper<OrderCouponMiddle>().in("id",updateIds)
+            // TODO 退款失败目前不做处理
+            /*orderCouponMiddleMapper.update(null,new UpdateWrapper<OrderCouponMiddle>().in("id",updateIds)
                     .set("status",OrderStatusEnum.REFUND_FAILED.getStatus())
                     .set("refund_time",now)
+                    .set(ifPartialRefund,"refund_code",PartialRefundCode)
                     .set("refund_reason",refundOrder.getReason()));
             // 退款记录
-            refundOrder.setApplicationTime(now);
-            refundOrder.setRefundTime(now);
-            refundOrder.setStatus(1);
+            refundOrder.setApplicationTime(now).setRefundTime(now).setStatus(1);*/
+            returnMap.put("success", refundMessage);
+            return returnMap;
         } else {
             refundMessage = "退款成功";
             orderCouponMiddleMapper.update(null,new UpdateWrapper<OrderCouponMiddle>().in("id",updateIds)
                     .set("status",OrderStatusEnum.REFUND.getStatus())
                     .set("refund_time",now)
+                    .set(ifPartialRefund,"partial_refund_code",PartialRefundCode)
                     .set("refund_reason",refundOrder.getReason()));
             // 退款记录
-            refundOrder.setApplicationTime(now);
-            refundOrder.setRefundTime(now);
-            refundOrder.setStatus(0);
+            refundOrder.setApplicationTime(now).setRefundTime(now).setStatus(0);
+            if(ifPartialRefund){
+                refundOrder.setPartialRefundCode(PartialRefundCode);
+            }
         }
         // 更新数据(中间表数据+订单表数据:当已退款个数+当前退款个数=已使用的券数时,订单状态改为已退款)
         if (refundCouponCount + refundOrder.getRefundCouponAmount() == orderCouponMiddles.size()) {
@@ -477,8 +489,6 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
             }
         }
 
-        // 中间表数据更新
-        returnMap.put("success", refundMessage);
         // 将退款记录插入到数据库中
         if (lifeRefundOrderMapper.insert(refundOrder) > 0) {
             // 发送通知
@@ -507,6 +517,7 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
 //            record.setMoney(-money.intValue());
 //            storeIncomeDetailsRecordMapper.insert(record);
 //        }
+        returnMap.put("success", refundMessage);
         return returnMap;
     }
 

+ 5 - 1
alien-store/src/main/java/shop/alien/store/util/ali/AliApi.java

@@ -11,6 +11,7 @@ import com.alipay.api.response.*;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 import shop.alien.entity.store.LifeUser;
@@ -172,7 +173,7 @@ public class AliApi {
      * @return
      */
 
-    public String processRefund(String outTradeNo, String refundAmount, String refundReason) {
+    public String processRefund(String outTradeNo, String refundAmount, String refundReason,String partialRefundCode) {
         try {
             // TODO 部分退款支付宝接口修改
             AlipayClient alipayClient = new DefaultAlipayClient(setAlipayConfig(null));
@@ -181,6 +182,9 @@ public class AliApi {
             model.setOutTradeNo(outTradeNo);
             model.setRefundAmount(refundAmount);
             model.setRefundReason(refundReason);
+            if(StringUtils.isNotBlank(partialRefundCode)){
+                model.setOutRequestNo(partialRefundCode);
+            }
             request.setBizModel(model);
             AlipayTradeRefundResponse response = alipayClient.certificateExecute(request);
             String refundReslut = "";