zhijiezhao 1 year ago
parent
commit
ca0123fd1a

+ 6 - 0
src/main/java/com/caimei365/order/controller/OrderRefundApi.java

@@ -21,6 +21,12 @@ public class OrderRefundApi {
 
     private final OrderRefundService orderRefundService;
 
+    @ApiOperation("一次性接口,数据初始化")
+    @GetMapping("/init")
+    public ResponseJson refundShopOrder(){
+        return orderRefundService.initShopOrder();
+    }
+
     @ApiOperation("子订单退款")
     @ApiImplicitParam(required = true, name = "shopOrderId", value = "子订单id")
     @GetMapping("/shopOrder")

+ 23 - 0
src/main/java/com/caimei365/order/mapper/OrderRefundMapper.java

@@ -3,6 +3,7 @@ package com.caimei365.order.mapper;
 import com.caimei365.order.model.po.OrderReceiptRelationPo;
 import com.caimei365.order.model.po.UserBeansHistoryPo;
 import com.caimei365.order.model.vo.CmRefundRecord;
+import com.caimei365.order.model.vo.CmReturnedPurchase;
 import com.caimei365.order.model.vo.OrderVo;
 import com.caimei365.order.model.vo.UserVo;
 import org.apache.ibatis.annotations.Mapper;
@@ -30,4 +31,26 @@ public interface OrderRefundMapper {
     Integer findByBeansType(Integer orderId);
 
     UserBeansHistoryPo findLowOrder(Integer orderId);
+
+    void updateShopOrder(Integer shopOrderId);
+
+    void updateUser(UserVo user);
+
+    List<CmReturnedPurchase> findRefundShopOrder();
+
+    CmReturnedPurchase findReturnd(Integer id);
+
+    void insertReturns(CmReturnedPurchase returns);
+
+    List<Integer> findReturnShops(Integer id);
+
+    void updateReturn(Integer shopOrderId, Integer id);
+
+    void updateReturnMoney(CmReturnedPurchase cmReturnedPurchase);
+
+    void insertReturnProduct(Integer id, Integer shopOrderId);
+
+    Integer findShopOrderRefundCount(Integer orderId);
+
+    void updateOrderRefund(Integer orderId, Integer refundType);
 }

+ 29 - 1
src/main/java/com/caimei365/order/model/vo/CmReturnedPurchase.java

@@ -23,7 +23,7 @@ public class CmReturnedPurchase implements Serializable {
     private String status;
     /**
      * 发起该操作时订单状态快照:0待确认,11待收待发,12待收部发,13待收全发, 21部收待发,22部收部发,23部收全发,
-     *                               31已收待发,32已收部发,33已收全发,4交易完成,5订单完成,6已关闭,7交易全退
+     * 31已收待发,32已收部发,33已收全发,4交易完成,5订单完成,6已关闭,7交易全退
      */
     private String operatingOrderStatus;
     /**
@@ -54,4 +54,32 @@ public class CmReturnedPurchase implements Serializable {
      * 退线下转账
      */
     private Double refundOfflineFee;
+
+    /**
+     * 一次性字段
+     * 版本废弃字段
+     */
+    private Integer shopCount;
+    private Integer returnedWay;
+    private Integer payType;
+    private String bankAccountName;
+    private String bankAccountNo;
+    private String openBank;
+    private String bankAccountType;
+    private String image1;
+    private String image2;
+    private String image3;
+    private String image4;
+    private String image5;
+    private String reviewImage1;
+    private String reviewImage2;
+    private String reviewImage3;
+    private String reviewImage4;
+    private String reviewImage5;
+    private String remarks;
+    private String reviewRemarks;
+    private Integer applicationUserId;
+    private Integer reviewUserId;
+    private Integer delFlag;
+    private Integer refundType;
 }

+ 2 - 0
src/main/java/com/caimei365/order/service/OrderRefundService.java

@@ -8,4 +8,6 @@ import com.caimei365.order.model.ResponseJson;
 public interface OrderRefundService {
 
     ResponseJson refundShopOrder(Integer shopOrderId) throws Exception;
+
+    ResponseJson initShopOrder();
 }

+ 75 - 28
src/main/java/com/caimei365/order/service/impl/OrderRefundServiceImpl.java

@@ -10,7 +10,6 @@ import com.caimei365.order.model.ResponseJson;
 import com.caimei365.order.model.po.*;
 import com.caimei365.order.model.vo.*;
 import com.caimei365.order.service.OrderRefundService;
-import com.caimei365.order.utils.MathUtil;
 import com.caimei365.order.utils.helipay.Disguiser;
 import com.caimei365.order.utils.helipay.HttpClientService;
 import com.caimei365.order.utils.helipay.MessageHandle;
@@ -18,10 +17,10 @@ import com.caimei365.order.utils.helipay.MyBeanUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.httpclient.HttpStatus;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
-import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicReference;
@@ -57,7 +56,18 @@ public class OrderRefundServiceImpl implements OrderRefundService {
         List<OrderReceiptRelationPo> relationPos = refundMapper.findPayWays(shopOrderId);
         CmReturnedPurchase cmReturnedPurchase = new CmReturnedPurchase();
         String returnNo = "T" + System.currentTimeMillis() + new Random().nextInt(1000);
+        String format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
         cmReturnedPurchase.setReturnedNo(returnNo);
+        cmReturnedPurchase.setShopOrderId(shopOrderId);
+        cmReturnedPurchase.setUserId(order.getUserId());
+        cmReturnedPurchase.setOrderId(order.getOrderId());
+        cmReturnedPurchase.setStatus("2");
+        cmReturnedPurchase.setOperatingOrderStatus(order.getStatus().toString());
+        cmReturnedPurchase.setReturnTime(format);
+        cmReturnedPurchase.setConfirmReturnTime(format);
+        cmReturnedPurchase.setDelFlag(1);
+        refundMapper.insertReturns(cmReturnedPurchase);
+
 
         AtomicReference<Double> refundBalanceFee = new AtomicReference<>(0d);
         AtomicReference<Double> refundOnlineFee = new AtomicReference<>(0d);
@@ -70,7 +80,7 @@ public class OrderRefundServiceImpl implements OrderRefundService {
                     refundOnlineFee.updateAndGet(v -> v + relationPo.getAssociateAmount());
                     break;
                 case 2:
-                    returnOffline(relationPo, cmReturnedPurchase);
+                    returnOffline(relationPo);
                     refundOfflineFee.updateAndGet(v -> v + relationPo.getAssociateAmount());
                     break;
                 case 3:
@@ -81,11 +91,27 @@ public class OrderRefundServiceImpl implements OrderRefundService {
                     throw new IllegalStateException("payWay Unexpected ------>" + relationPo.getPayWay());
             }
         }
-
+        user.setUserMoney(user.getUserMoney() + refundBalanceFee.get());
+        user.setAbleUserMoney(user.getAbleUserMoney() + refundBalanceFee.get());
+        cmReturnedPurchase.setRefundBalanceFee(refundBalanceFee.get());
+        cmReturnedPurchase.setRefundOnlineFee(refundOnlineFee.get());
+        cmReturnedPurchase.setRefundOfflineFee(refundOfflineFee.get());
+        cmReturnedPurchase.setRefundFee(refundBalanceFee.get() + refundOnlineFee.get() + refundOfflineFee.get());
+        cmReturnedPurchase.setReturnedPurchaseFee(refundBalanceFee.get() + refundOnlineFee.get() + refundOfflineFee.get());
+        cmReturnedPurchase.setDelFlag(0);
+        refundMapper.updateReturnMoney(cmReturnedPurchase);
+        /**
+         * 为与旧数据兼容,保持cm_returned_purchase_product数据,当前版本退款为原路退回且只能全退,
+         * cm_returned_purchase_product表数据无实际意义,可直接取cm_order_product,
+         * cm_returned_purchase_product后续版本可删除
+         */
+        refundMapper.insertReturnProduct(cmReturnedPurchase.getId(), shopOrderId);
         // 修改子订单信息
+        refundMapper.updateShopOrder(shopOrderId);
         // 修改订单信息 refundType
-
-
+        Integer count = refundMapper.findShopOrderRefundCount(order.getOrderId());
+        Integer refundType = count > 0 ? 1 : 2;
+        refundMapper.updateOrderRefund(order.getOrderId(), refundType);
         // 二手订单交易全退,标记未售
         if (1 == order.getSecondHandOrderFlag() && 7 == order.getStatus()) {
             refundMapper.updateSecondProduct(shopOrderId);
@@ -93,7 +119,6 @@ public class OrderRefundServiceImpl implements OrderRefundService {
 
         //采美豆退款相关
         if (7 == order.getStatus()) {
-            int userBeans = null == user.getUserBeans() ? 0 : user.getUserBeans();
             /**  todo
              *   抵扣运费需退回,当前版本暂取消抵扣运费
              */
@@ -105,6 +130,7 @@ public class OrderRefundServiceImpl implements OrderRefundService {
              */
             Integer num = refundMapper.findByBeansType(order.getOrderId());
             if (num != null && num > 0) {
+                int userBeans = null == user.getUserBeans() ? 0 : user.getUserBeans();
                 UserBeansHistoryPo beansHistory = new UserBeansHistoryPo();
                 beansHistory.setBeansType(11);
                 beansHistory.setType(2);
@@ -116,9 +142,9 @@ public class OrderRefundServiceImpl implements OrderRefundService {
             }
             //订单低于1000扣500豆子退回
             if (order.getPayTotalFee() != null && order.getPayTotalFee() < 1000) {
-                // 查本单是否扣豆子,所有子订单全退的情况下,有就返回
+                // 查本单是否扣豆子,有且订单交易全退就返回
                 UserBeansHistoryPo bean = refundMapper.findLowOrder(order.getOrderId());
-                if (bean != null) {
+                if (bean != null && 0 == count) {
                     //有扣豆子记录
                     UserBeansHistoryPo beanHistory = new UserBeansHistoryPo();
                     beanHistory.setUserId(order.getUserId());
@@ -134,27 +160,41 @@ public class OrderRefundServiceImpl implements OrderRefundService {
             }
         }
         // 修改user信息
-
+        refundMapper.updateUser(user);
         return ResponseJson.success();
     }
 
+    @Override
+    public ResponseJson initShopOrder() {
+        /**
+         * 退款单数据拆分
+         * 查询有多个子订单退款的主订单,把有多个子订单的退款单拆分成以子订单为退款单
+         */
+        List<CmReturnedPurchase> shopOrders = refundMapper.findRefundShopOrder();
+        shopOrders.forEach(s -> {
+            // 有几个子订单,复制count-1数量的退款单
+            CmReturnedPurchase returns = refundMapper.findReturnd(s.getId());
+            // 拿到当前退款单的绑定子订单,循环次数=子订单数量-1,最后一个子订单不动,前置子订单退款单id变更为复制品
+            List<Integer> shopOrderIds = refundMapper.findReturnShops(returns.getId());
+            int count = shopOrderIds.size() - 1;
+            log.info("-------原退款单id--------" + returns.getId() + "------去重的子订单--------------" + shopOrderIds);
+            if (null != shopOrderIds && shopOrderIds.size() > 1) {
+                for (int i = 0; i < count; i++) {
+                    log.info("-------退款单" + returns.getId() + "第" + (i + 1) + "次复制------");
+                    // 拿到复制退款单,把cm_returned_purchase_product表中子订单换绑returnedID到新单
+                    returns.setId(null);
+                    refundMapper.insertReturns(returns);
+                    log.info("--------复制品Id--------- " + returns.getId() + "修改子订单Id-------------------- " + shopOrderIds.get(i));
+                    refundMapper.updateReturn(shopOrderIds.get(i), returns.getId());
+                }
+            }
+            log.info("====================退款单复制结束===========================");
+        });
+        return ResponseJson.success();
+    }
 
 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
     public void returnOnline(OrderReceiptRelationPo relationPo) throws Exception {
         String splitCode = payOrderMapper.getSplitCodeByShopOrderId(relationPo.getShopOrderId());
         /**  网银
@@ -170,10 +210,14 @@ public class OrderRefundServiceImpl implements OrderRefundService {
         }
     }
 
-    public void returnOffline(OrderReceiptRelationPo relationPo, CmReturnedPurchase cmReturnedPurchase) {
-
+    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
+    public void returnOffline(OrderReceiptRelationPo relationPo) {
+        /**
+         * todo 线下转账当前版本无操作
+         */
     }
 
+    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
     public void returnBalance(OrderReceiptRelationPo relationPo, CmReturnedPurchase cmReturnedPurchase, OrderVo order) {
         //添加余额收支记录
         BalanceRecordPo cmUserBalanceRecord = new BalanceRecordPo();
@@ -190,13 +234,13 @@ public class OrderRefundServiceImpl implements OrderRefundService {
     }
 
 
-
     /**
      * attention:网银退款不退手续费!
      * 1.本方法内转账手续费等待到账再发起退款请求  todo 暂未转
      * 2.异步
      * 3.回调
      */
+    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
     public void unionRefund(String orderRequestNo, String money, Integer shopOrderId, String splitCode) throws Exception {
         Map<String, String> sPara = new HashMap<String, String>();
         sPara.put("P1_bizType", "OnlineRefund");
@@ -234,6 +278,7 @@ public class OrderRefundServiceImpl implements OrderRefundService {
         }
     }
 
+    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
     public void onlinePay(OrderReceiptRelationPo relationPo, String splitCode) throws Exception {
         AppPayRefundOrderVo orderVo = new AppPayRefundOrderVo();
         orderVo.setP1_bizType("AppPayRefund");
@@ -285,6 +330,8 @@ public class OrderRefundServiceImpl implements OrderRefundService {
         }
     }
 
+
+    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
     public void quickRefund(OrderReceiptRelationPo relationPo, String splitCode) throws Exception {
         //快捷支付
         QuickPaySpRefundVo quickPaySpRefundVo = new QuickPaySpRefundVo();

+ 174 - 0
src/main/resources/mapper/OrderRefundMapper.xml

@@ -7,12 +7,126 @@
         values (#{refundAmount}, #{orderRequestNo}, #{shopOrderId})
     </insert>
 
+    <insert id="insertReturns" keyColumn="id" keyProperty="id"
+            parameterType="com.caimei365.order.model.vo.CmReturnedPurchase" useGeneratedKeys="true">
+        INSERT INTO cm_returned_purchase(returnedNo,
+                                         orderID,
+                                         userID,
+                                         status,
+                                         returnedWay,
+                                         payType,
+                                         operatingOrderStatus,
+                                         bankAccountName,
+                                         bankAccountNo,
+                                         openBank,
+                                         bankAccountType,
+                                         returnedPurchaseFee,
+                                         refundFee,
+                                         refundBalanceFee,
+                                         refundOnlineFee,
+                                         refundOfflineFee,
+                                         image1,
+                                         image2,
+                                         image3,
+                                         image4,
+                                         image5,
+                                         remarks,
+                                         reviewRemarks,
+                                         applicationUserID,
+                                         returnTime,
+                                         reviewUserID,
+                                         confirmReturnTime,
+                                         refundType)
+        VALUES (#{returnedNo},
+                #{orderId},
+                #{userId},
+                #{status},
+                #{returnedWay},
+                #{payType},
+                #{operatingOrderStatus},
+                #{bankAccountName},
+                #{bankAccountNo},
+                #{openBank},
+                #{bankAccountType},
+                #{returnedPurchaseFee},
+                #{refundFee},
+                #{refundBalanceFee},
+                #{refundOnlineFee},
+                #{refundOfflineFee},
+                #{image1},
+                #{image2},
+                #{image3},
+                #{image4},
+                #{image5},
+                #{remarks},
+                #{reviewRemarks},
+                #{applicationUserId},
+                #{returnTime},
+                #{reviewUserId},
+                #{confirmReturnTime},
+                #{refundType})
+    </insert>
+
+    <insert id="insertReturnProduct">
+        insert into cm_returned_purchase_product(returnedID, productID, orderProductID, shopOrderID, shopID,
+                                                 applicationReturnedNum, applicationCancelNum, actualReturnedNum,
+                                                 actualCancelNum)
+            (SELECT #{id},
+                    productId,
+                    orderProductId,
+                    shopOrderId,
+                    shopId,
+                    num + presentNum,
+                    num + presentNum,
+                    num + presentNum,
+                    num + presentNum
+             FROM cm_order_product
+             WHERE shopOrderId = #{shopOrderId})
+    </insert>
+
     <update id="updateSecondProduct">
         UPDATE cm_second_hand_detail
         SET sold = 0
         WHERE productID IN (SELECT productId FROM cm_order_product WHERE shoporderid = #{shopOrderId})
     </update>
 
+    <update id="updateShopOrder">
+        update cm_shop_order
+        set refundStatus = 3
+        where shopOrderID = #{shopOrderId}
+    </update>
+
+    <update id="updateUser">
+        update user
+        set ableUserMoney = #{ableUserMoney},
+            userMoney     = #{userMoney},
+            userBeans     = #{userBeans}
+        where userId = #{userId}
+    </update>
+
+    <update id="updateReturn">
+        update cm_returned_purchase_product
+        set returnedID = #{id}
+        where shopOrderId = #{shopOrderId}
+    </update>
+
+    <update id="updateReturnMoney">
+        update cm_returned_purchase
+        set refundOfflineFee    = #{refundOfflineFee},
+            refundFee           = #{refundFee},
+            refundBalanceFee    = #{refundBalanceFee},
+            refundOnlineFee     = #{refundOnlineFee},
+            returnedPurchaseFee = #{returnedPurchaseFee},
+            delFlag             = #{delFlag}
+        where id = #{id}
+    </update>
+
+    <update id="updateOrderRefund">
+        update cm_order
+        set refundType = #{refundType}
+        where orderId = #{orderId}
+    </update>
+
     <select id="findPayWays" resultType="com.caimei365.order.model.po.OrderReceiptRelationPo">
         select cro.relationType,
                cro.receiptID,
@@ -65,4 +179,64 @@
           and beansType = 15
     </select>
 
+    <select id="findRefundShopOrder" resultType="com.caimei365.order.model.vo.CmReturnedPurchase">
+        SELECT COUNT(DISTINCT shopOrderId) as shopCount, shopOrderId, returnedId as id
+        FROM cm_returned_purchase_product
+        GROUP BY returnedID
+        HAVING COUNT(DISTINCT shopOrderId) > 1
+    </select>
+
+    <select id="findReturnd" resultType="com.caimei365.order.model.vo.CmReturnedPurchase">
+        select id,
+               returnedNo,
+               orderId,
+               userId,
+               status,
+               returnedWay,
+               payType,
+               operatingOrderStatus,
+               bankAccountName,
+               bankAccountNo,
+               openBank,
+               bankAccountType,
+               returnedPurchaseFee,
+               refundFee,
+               refundBalanceFee,
+               refundOnlineFee,
+               refundOfflineFee,
+               image1,
+               image2,
+               image3,
+               image4,
+               image5,
+               reviewImage1,
+               reviewImage2,
+               reviewImage3,
+               reviewImage4,
+               reviewImage5,
+               remarks,
+               reviewRemarks,
+               applicationUserId,
+               returnTime,
+               reviewUserId,
+               confirmReturnTime,
+               delFlag,
+               refundType
+        from cm_returned_purchase
+        where id = #{id}
+    </select>
+
+    <select id="findReturnShops" resultType="java.lang.Integer">
+        select distinct shopOrderId
+        from cm_returned_purchase_product
+        where returnedID = #{id}
+    </select>
+
+    <select id="findShopOrderRefundCount" resultType="java.lang.Integer">
+        select count(*)
+        from cm_shop_order
+        where refundStatus = 1
+        and orderID = #{orderId}
+    </select>
+
 </mapper>