zhijiezhao 1 年之前
父節點
當前提交
e1637ce0f9
共有 23 個文件被更改,包括 1155 次插入40 次删除
  1. 41 0
      src/main/java/com/caimei365/order/components/OnlinePostFormUtil.java
  2. 72 4
      src/main/java/com/caimei365/order/components/ProductService.java
  3. 35 0
      src/main/java/com/caimei365/order/controller/OrderRefundApi.java
  4. 1 0
      src/main/java/com/caimei365/order/mapper/OrderCommonMapper.java
  5. 33 0
      src/main/java/com/caimei365/order/mapper/OrderRefundMapper.java
  6. 6 0
      src/main/java/com/caimei365/order/model/po/BalanceRecordPo.java
  7. 95 0
      src/main/java/com/caimei365/order/model/po/OnlineRefundData.java
  8. 4 0
      src/main/java/com/caimei365/order/model/po/OrderReceiptRelationPo.java
  9. 124 0
      src/main/java/com/caimei365/order/model/vo/AppPayRefundOrderResponseVo.java
  10. 109 0
      src/main/java/com/caimei365/order/model/vo/AppPayRefundOrderVo.java
  11. 37 0
      src/main/java/com/caimei365/order/model/vo/CmRefundRecord.java
  12. 57 0
      src/main/java/com/caimei365/order/model/vo/CmReturnedPurchase.java
  13. 5 1
      src/main/java/com/caimei365/order/model/vo/OrderVo.java
  14. 24 0
      src/main/java/com/caimei365/order/model/vo/QuickPaySpRefundResponseVo.java
  15. 26 0
      src/main/java/com/caimei365/order/model/vo/QuickPaySpRefundVo.java
  16. 8 0
      src/main/java/com/caimei365/order/model/vo/ShopOrderVo.java
  17. 31 0
      src/main/java/com/caimei365/order/model/vo/UserVo.java
  18. 11 0
      src/main/java/com/caimei365/order/service/OrderRefundService.java
  19. 327 0
      src/main/java/com/caimei365/order/service/impl/OrderRefundServiceImpl.java
  20. 4 16
      src/main/java/com/caimei365/order/service/impl/PayOrderServiceImpl.java
  21. 22 16
      src/main/resources/mapper/BaseMapper.xml
  22. 15 3
      src/main/resources/mapper/OrderCommonMapper.xml
  23. 68 0
      src/main/resources/mapper/OrderRefundMapper.xml

+ 41 - 0
src/main/java/com/caimei365/order/components/OnlinePostFormUtil.java

@@ -67,4 +67,45 @@ public class OnlinePostFormUtil {
         return res.toJavaObject(clazz);
     }
 
+    public static <T> T refundPostForm(Map<String, String> params, String url, String sign, Class<T> clazz) {
+        FormBody.Builder builder = new FormBody.Builder();
+        for (Map.Entry<String, String> entry : params.entrySet()) {
+            builder.add(entry.getKey(), entry.getValue());
+        }
+        builder.add("sign", sign);
+
+        Request request = new Request.Builder() // okHttp post
+                .url(url)
+                .post(builder.build())
+                .build();
+
+        Response response = null;
+        try {
+            response = client.newCall(request).execute();
+        } catch (IOException e) {
+            throw new IllegalStateException("请求出错", e);
+        }
+        if (!response.isSuccessful()) {
+            try {
+                log.info(response.body().string());
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+            throw new RuntimeException("请求失败了: http response code: " + response.code());
+        }
+
+        okhttp3.ResponseBody body = response.body();
+        String content = null;
+        try {
+            content = body.string();
+        } catch (IOException e) {
+            throw new IllegalStateException("IO异常", e);
+        }
+        JSONObject res = JSON.parseObject(content);
+        if ("0000".equals(res.getString("rt2_retCode"))) {
+            log.info("退款申请发起成功------->" + res.toString());
+        }
+        /** rt4_success 为 true,需验签  **/
+        return res.toJavaObject(clazz);
+    }
 }

+ 72 - 4
src/main/java/com/caimei365/order/components/ProductService.java

@@ -1,6 +1,7 @@
 package com.caimei365.order.components;
 
 import com.caimei365.order.mapper.BaseMapper;
+import com.caimei365.order.mapper.OrderCommonMapper;
 import com.caimei365.order.model.dto.VipSkuPriceDto;
 import com.caimei365.order.model.po.*;
 import com.caimei365.order.model.vo.*;
@@ -16,6 +17,7 @@ import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.util.*;
+import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 
@@ -32,6 +34,8 @@ public class ProductService {
     private String domain;
     @Resource
     private BaseMapper baseMapper;
+    @Resource
+    private OrderCommonMapper commonMapper;
 
     /**
      * 设置商品图片及税费
@@ -110,7 +114,7 @@ public class ProductService {
         // 设置价格
         if (promotions.getType() == 1 && promotions.getMode() == 1) {
             // 查询当前sku的优惠价
-            Double touchPrice=baseMapper.getTouchPriceBySku(cartItemVo.getSkuId(),promotions.getId());
+            Double touchPrice = baseMapper.getTouchPriceBySku(cartItemVo.getSkuId(), promotions.getId());
             promotions.setTouchPrice(touchPrice);
             // 单品优惠价添加税费
             if (taxFlag) {
@@ -179,9 +183,9 @@ public class ProductService {
     /**
      * 计算运费
      *
-     * @param userId        用户ID
-     * @param townId        地区Id
-     * @param skuIdList     商品Id列表
+     * @param userId    用户ID
+     * @param townId    地区Id
+     * @param skuIdList 商品Id列表
      */
     public Map<String, Object> computePostage(Integer userId, Integer townId, List<String> skuIdList) {
         // 用户组织Id
@@ -440,4 +444,68 @@ public class ProductService {
             cartItemVo.setSvipTotalReducedPrice(MathUtil.mul(MathUtil.sub(cartItemVo.getOriginalPrice(), discountPrice), cartItemVo.getNumber()).doubleValue());
         }
     }
+
+    public void saveShopOrderDiscernReceipt(Double balancePayFee, OrderVo order) {
+        List<ShopOrderVo> shopOrderVos = commonMapper.getShopOrderListByOrderId(order.getOrderId());
+        AtomicReference<Double> bal = new AtomicReference<>(balancePayFee);
+        shopOrderVos.forEach(s -> {
+            Double pay = 0d;
+            if (MathUtil.compare(bal.get(), s.getNeedPayAmount()) >= 0) {
+                pay = s.getNeedPayAmount();
+                bal.updateAndGet(v -> v - s.getNeedPayAmount());
+                s.setReceiptStatus(3);
+            } else {
+                pay = bal.get();
+                s.setReceiptStatus(2);
+            }
+            s.setReceiptAmount(pay);
+            s.setAccountAmount(pay);
+            s.setUseBalanceFlag(1);
+            Date date = new Date();
+            String curDateStr = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(date);
+            // 识别款项表
+            DiscernReceiptPo discernReceipt = new DiscernReceiptPo();
+            discernReceipt.setPayWay(3);
+            discernReceipt.setPayType(16);
+            discernReceipt.setReceiptType(1);
+            discernReceipt.setReceiptStatus(3);
+            discernReceipt.setReceiptAmount(pay);
+            discernReceipt.setConfirmType(4);
+            discernReceipt.setReceiptDate(curDateStr);
+            discernReceipt.setConfirmDate(curDateStr);
+            discernReceipt.setReviewDate(curDateStr);
+            discernReceipt.setUpdateDate(curDateStr);
+            discernReceipt.setDelFlag(0);
+            // 保存 收款记录
+            baseMapper.insertDiscernReceipt(discernReceipt);
+            log.info(">>>>>>>>>>>保存识别款项(insert[cm_discern_receipt])id:" + discernReceipt.getId() + ",shopOrderId:" + s.getShopOrderId());
+            // 收款项和订单关系表
+            OrderReceiptRelationPo relation = new OrderReceiptRelationPo();
+            relation.setReceiptId(discernReceipt.getId());
+            relation.setOrderId(order.getOrderId());
+            relation.setShopOrderId(s.getShopOrderId());
+            relation.setAssociateAmount(pay);
+            relation.setRelationType(2);
+            relation.setDelFlag(0);
+            // 保存 收款项和订单关系
+            baseMapper.insertOrderReceiptRelation(relation);
+            log.info(">>>>>>>>>>>收款项和订单关系(insert[cm_receipt_order_relation])id:" + relation.getId() + ",shopOrderId:" + s.getShopOrderId());
+            //保存余额到余额收支记录
+            BalanceRecordPo balanceRecord = new BalanceRecordPo();
+            balanceRecord.setUserId(order.getUserId());
+            balanceRecord.setType(2);
+            balanceRecord.setBalanceType(1);
+            balanceRecord.setAddDate(new Date());
+            balanceRecord.setAmount(pay);
+            balanceRecord.setOrderId(order.getOrderId());
+            balanceRecord.setShopOrderId(s.getShopOrderId());
+            balanceRecord.setRemark("订单支付,余额抵扣");
+            balanceRecord.setDelFlag(0);
+            // 保存 余额收支记录
+            baseMapper.insertBalanceRecord(balanceRecord);
+            log.info("【订单支付,余额抵扣】>>>>>>>>>>>>>>>>>>>>>>>>>>新增用户余额收支记录(insert[cm_user_balance_record])shopOrderId:" + s.getShopOrderId());
+            commonMapper.updateShopOrderBalance(s);
+        });
+
+    }
 }

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

@@ -0,0 +1,35 @@
+package com.caimei365.order.controller;
+
+import com.caimei365.order.model.ResponseJson;
+import com.caimei365.order.service.OrderRefundService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author zzj
+ */
+@Api(tags = "子订单退款API")
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/order/refund")
+public class OrderRefundApi {
+
+    private final OrderRefundService orderRefundService;
+
+    @ApiOperation("子订单退款")
+    @ApiImplicitParam(required = true, name = "shopOrderId", value = "子订单id")
+    @GetMapping("/shopOrder")
+    public ResponseJson refundShopOrder(Integer shopOrderId) throws Exception {
+        if (null == shopOrderId) {
+            return ResponseJson.error("子订单id不能为空!", null);
+        }
+        return orderRefundService.refundShopOrder(shopOrderId);
+    }
+
+
+}

+ 1 - 0
src/main/java/com/caimei365/order/mapper/OrderCommonMapper.java

@@ -187,5 +187,6 @@ public interface OrderCommonMapper {
 
     String getHelpContent(Integer helpId);
 
+    void updateShopOrderBalance(ShopOrderVo s);
 }
 

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

@@ -0,0 +1,33 @@
+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.OrderVo;
+import com.caimei365.order.model.vo.UserVo;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * @author zzj
+ */
+@Mapper
+public interface OrderRefundMapper {
+
+    List<OrderReceiptRelationPo> findPayWays(Integer shopOrderId);
+
+    OrderVo findOrder(Integer shopOrderId);
+
+    void updateSecondProduct(Integer shopOrderId);
+
+    void insertCmRefundRecord(CmRefundRecord cmRefundRecord);
+
+    String findSplitCodeEmail(String splitCode);
+
+    UserVo findUser(Integer userId);
+
+    Integer findByBeansType(Integer orderId);
+
+    UserBeansHistoryPo findLowOrder(Integer orderId);
+}

+ 6 - 0
src/main/java/com/caimei365/order/model/po/BalanceRecordPo.java

@@ -42,10 +42,16 @@ public class BalanceRecordPo implements Serializable {
      * 主订单ID(适用余额类型1,3[类型为3多次退款存在相同记录ID则需通过退款ID唯一区分])
      */
     private Integer orderId;
+
+    private Integer shopOrderId;
     /**
      * 收款ID(适用余额类型2)
      */
     private Integer receiptId;
+    /**
+     * 退货退款ID
+     */
+    private Integer returnedId;
     /**
      * 备注
      */

+ 95 - 0
src/main/java/com/caimei365/order/model/po/OnlineRefundData.java

@@ -0,0 +1,95 @@
+package com.caimei365.order.model.po;
+
+import com.google.common.collect.ImmutableSet;
+
+import java.io.Serializable;
+import java.util.Set;
+
+public class OnlineRefundData implements Serializable {
+    private String rt1_bizType;
+    private String rt2_retCode;
+    private String rt3_retMsg;
+    private String rt4_customerNumber;
+    private String rt5_orderId;
+    private String rt6_refundOrderId;
+    private String rt7_amount;
+    private String rt8_orderStatus;
+    private String sign;
+    public static final Set<String> NEED_SIGN_PARAMS = ImmutableSet.of("rt1_bizType", "rt2_retCode","rt3_retMsg", "rt4_customerNumber",
+            "rt5_orderId", "rt6_refundOrderNum", "rt7_amount", "rt8_orderStatus");
+
+    public OnlineRefundData() {
+    }
+
+    public String getRt1_bizType() {
+        return rt1_bizType;
+    }
+
+    public void setRt1_bizType(String rt1_bizType) {
+        this.rt1_bizType = rt1_bizType;
+    }
+
+    public String getRt2_retCode() {
+        return rt2_retCode;
+    }
+
+    public void setRt2_retCode(String rt2_retCode) {
+        this.rt2_retCode = rt2_retCode;
+    }
+
+    public String getRt3_retMsg() {
+        return rt3_retMsg;
+    }
+
+    public void setRt3_retMsg(String rt3_retMsg) {
+        this.rt3_retMsg = rt3_retMsg;
+    }
+
+    public String getRt4_customerNumber() {
+        return rt4_customerNumber;
+    }
+
+    public void setRt4_customerNumber(String rt4_customerNumber) {
+        this.rt4_customerNumber = rt4_customerNumber;
+    }
+
+    public String getRt5_orderId() {
+        return rt5_orderId;
+    }
+
+    public void setRt5_orderId(String rt5_orderId) {
+        this.rt5_orderId = rt5_orderId;
+    }
+
+    public String getRt6_refundOrderId() {
+        return rt6_refundOrderId;
+    }
+
+    public void setRt6_refundOrderId(String rt6_refundOrderId) {
+        this.rt6_refundOrderId = rt6_refundOrderId;
+    }
+
+    public String getRt7_amount() {
+        return rt7_amount;
+    }
+
+    public void setRt7_amount(String rt7_amount) {
+        this.rt7_amount = rt7_amount;
+    }
+
+    public String getRt8_orderStatus() {
+        return rt8_orderStatus;
+    }
+
+    public void setRt8_orderStatus(String rt8_orderStatus) {
+        this.rt8_orderStatus = rt8_orderStatus;
+    }
+
+    public String getSign() {
+        return sign;
+    }
+
+    public void setSign(String sign) {
+        this.sign = sign;
+    }
+}

+ 4 - 0
src/main/java/com/caimei365/order/model/po/OrderReceiptRelationPo.java

@@ -13,6 +13,10 @@ import java.io.Serializable;
 @Data
 public class OrderReceiptRelationPo implements Serializable {
     private static final long serialVersionUID = 1L;
+    /**
+     * 1线上,2线下,3余额抵扣
+     */
+    private Integer payWay;
     /**
      * 收款项和订单关系表id
      */

+ 124 - 0
src/main/java/com/caimei365/order/model/vo/AppPayRefundOrderResponseVo.java

@@ -0,0 +1,124 @@
+package com.caimei365.order.model.vo;
+
+import com.google.common.collect.ImmutableSet;
+
+import java.io.Serializable;
+import java.util.Set;
+
+public class AppPayRefundOrderResponseVo implements Serializable {
+
+
+    private String rt1_bizType;
+    private String rt2_retCode;
+    private String rt3_retMsg;
+    private String rt4_customerNumber;
+    private String rt5_orderId;
+    private String rt6_refundOrderNum;
+    private String rt7_serialNumber;
+    private String rt8_amount;
+    private String rt9_currency;
+    private String sign;
+
+    /**
+     * 需要加签的属性参数,要求加签的参数空值也签名
+     * 看接口文档
+     */
+    public static final Set<String> NEED_SIGN_PARAMS = ImmutableSet.of("rt1_bizType", "rt2_retCode", "rt4_customerNumber",
+            "rt5_orderId", "rt6_refundOrderNum", "rt7_serialNumber", "rt8_amount", "rt9_currency");
+
+    public AppPayRefundOrderResponseVo() {
+    }
+
+    public AppPayRefundOrderResponseVo(String rt1_bizType, String rt2_retCode, String rt3_retMsg, String rt4_customerNumber, String rt5_orderId, String rt6_refundOrderNum, String rt7_serialNumber, String rt8_amount, String rt9_currency, String sign) {
+        this.rt1_bizType = rt1_bizType;
+        this.rt2_retCode = rt2_retCode;
+        this.rt3_retMsg = rt3_retMsg;
+        this.rt4_customerNumber = rt4_customerNumber;
+        this.rt5_orderId = rt5_orderId;
+        this.rt6_refundOrderNum = rt6_refundOrderNum;
+        this.rt7_serialNumber = rt7_serialNumber;
+        this.rt8_amount = rt8_amount;
+        this.rt9_currency = rt9_currency;
+        this.sign = sign;
+    }
+
+    public String getRt1_bizType() {
+        return rt1_bizType;
+    }
+
+    public void setRt1_bizType(String rt1_bizType) {
+        this.rt1_bizType = rt1_bizType;
+    }
+
+    public String getRt2_retCode() {
+        return rt2_retCode;
+    }
+
+    public void setRt2_retCode(String rt2_retCode) {
+        this.rt2_retCode = rt2_retCode;
+    }
+
+    public String getRt3_retMsg() {
+        return rt3_retMsg;
+    }
+
+    public void setRt3_retMsg(String rt3_retMsg) {
+        this.rt3_retMsg = rt3_retMsg;
+    }
+
+    public String getRt4_customerNumber() {
+        return rt4_customerNumber;
+    }
+
+    public void setRt4_customerNumber(String rt4_customerNumber) {
+        this.rt4_customerNumber = rt4_customerNumber;
+    }
+
+    public String getRt5_orderId() {
+        return rt5_orderId;
+    }
+
+    public void setRt5_orderId(String rt5_orderId) {
+        this.rt5_orderId = rt5_orderId;
+    }
+
+    public String getRt6_refundOrderNum() {
+        return rt6_refundOrderNum;
+    }
+
+    public void setRt6_refundOrderNum(String rt6_refundOrderNum) {
+        this.rt6_refundOrderNum = rt6_refundOrderNum;
+    }
+
+    public String getRt7_serialNumber() {
+        return rt7_serialNumber;
+    }
+
+    public void setRt7_serialNumber(String rt7_serialNumber) {
+        this.rt7_serialNumber = rt7_serialNumber;
+    }
+
+    public String getRt8_amount() {
+        return rt8_amount;
+    }
+
+    public void setRt8_amount(String rt8_amount) {
+        this.rt8_amount = rt8_amount;
+    }
+
+    public String getRt9_currency() {
+        return rt9_currency;
+    }
+
+    public void setRt9_currency(String rt9_currency) {
+        this.rt9_currency = rt9_currency;
+    }
+
+    public String getSign() {
+        return sign;
+    }
+
+    public void setSign(String sign) {
+        this.sign = sign;
+    }
+}

+ 109 - 0
src/main/java/com/caimei365/order/model/vo/AppPayRefundOrderVo.java

@@ -0,0 +1,109 @@
+package com.caimei365.order.model.vo;
+
+import com.google.common.collect.ImmutableSet;
+
+import java.io.Serializable;
+import java.util.Set;
+
+public class AppPayRefundOrderVo implements Serializable {
+
+
+    private String P1_bizType;
+    private String P2_orderId;
+    private String P3_customerNumber;
+    private String P4_refundOrderId;
+    private String P5_amount;
+    private String P6_callbackUrl;
+    private String P7_desc;
+    private String P8_orderSerialNumber;
+    /**排除签名*/
+    private String acqAddnData;
+    private String sign;
+
+    /**
+     * 需要加签的属性参数,要求加签的参数空值也签名
+     * 看接口文档
+     */
+    public static final Set<String> NEED_SIGN_PARAMS = ImmutableSet.of("P1_bizType", "P2_orderId",
+            "P3_customerNumber", "P4_refundOrderId", "P5_amount", "P6_callbackUrl");
+
+    public String getP1_bizType() {
+        return P1_bizType;
+    }
+
+    public void setP1_bizType(String p1_bizType) {
+        P1_bizType = p1_bizType;
+    }
+
+    public String getP2_orderId() {
+        return P2_orderId;
+    }
+
+    public void setP2_orderId(String p2_orderId) {
+        P2_orderId = p2_orderId;
+    }
+
+    public String getP3_customerNumber() {
+        return P3_customerNumber;
+    }
+
+    public void setP3_customerNumber(String p3_customerNumber) {
+        P3_customerNumber = p3_customerNumber;
+    }
+
+    public String getP4_refundOrderId() {
+        return P4_refundOrderId;
+    }
+
+    public void setP4_refundOrderId(String p4_refundOrderId) {
+        P4_refundOrderId = p4_refundOrderId;
+    }
+
+    public String getP5_amount() {
+        return P5_amount;
+    }
+
+    public void setP5_amount(String p5_amount) {
+        P5_amount = p5_amount;
+    }
+
+    public String getP6_callbackUrl() {
+        return P6_callbackUrl;
+    }
+
+    public void setP6_callbackUrl(String p6_callbackUrl) {
+        P6_callbackUrl = p6_callbackUrl;
+    }
+
+    public String getP7_desc() {
+        return P7_desc;
+    }
+
+    public void setP7_desc(String p7_desc) {
+        P7_desc = p7_desc;
+    }
+
+    public String getP8_orderSerialNumber() {
+        return P8_orderSerialNumber;
+    }
+
+    public void setP8_orderSerialNumber(String p8_orderSerialNumber) {
+        P8_orderSerialNumber = p8_orderSerialNumber;
+    }
+
+    public String getAcqAddnData() {
+        return acqAddnData;
+    }
+
+    public void setAcqAddnData(String acqAddnData) {
+        this.acqAddnData = acqAddnData;
+    }
+
+    public String getSign() {
+        return sign;
+    }
+
+    public void setSign(String sign) {
+        this.sign = sign;
+    }
+}

+ 37 - 0
src/main/java/com/caimei365/order/model/vo/CmRefundRecord.java

@@ -0,0 +1,37 @@
+package com.caimei365.order.model.vo;
+
+
+import java.io.Serializable;
+
+public class CmRefundRecord implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private Double refundAmount;
+    private String orderRequestNo;
+    private Integer shopOrderId;
+
+    public Double getRefundAmount() {
+        return refundAmount;
+    }
+
+    public void setRefundAmount(Double refundAmount) {
+        this.refundAmount = refundAmount;
+    }
+
+    public String getOrderRequestNo() {
+        return orderRequestNo;
+    }
+
+    public void setOrderRequestNo(String orderRequestNo) {
+        this.orderRequestNo = orderRequestNo;
+    }
+
+    public Integer getShopOrderId() {
+        return shopOrderId;
+    }
+
+    public void setShopOrderId(Integer shopOrderId) {
+        this.shopOrderId = shopOrderId;
+    }
+}

+ 57 - 0
src/main/java/com/caimei365/order/model/vo/CmReturnedPurchase.java

@@ -0,0 +1,57 @@
+package com.caimei365.order.model.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class CmReturnedPurchase implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private Integer id;
+    /**
+     * 退款退货编号
+     */
+    private String returnedNo;
+    private Integer orderId;
+    private Integer shopOrderId;
+    private Integer userId;
+    /**
+     * 状态:1待审核、2审核通过、3审核不通过
+     */
+    private String status;
+    /**
+     * 发起该操作时订单状态快照:0待确认,11待收待发,12待收部发,13待收全发, 21部收待发,22部收部发,23部收全发,
+     *                               31已收待发,32已收部发,33已收全发,4交易完成,5订单完成,6已关闭,7交易全退
+     */
+    private String operatingOrderStatus;
+    /**
+     * 退款(退货)总金额
+     */
+    private Double returnedPurchaseFee;
+    /**
+     * 退款总额(给买家)
+     */
+    private Double refundFee;
+    /**
+     * 申请退款时间
+     */
+    private String returnTime;
+    /**
+     * 确认退款时间(审核退款时间)
+     */
+    private String confirmReturnTime;
+    /**
+     * 退账户余额
+     */
+    private Double refundBalanceFee;
+    /**
+     * 退线上退回
+     */
+    private Double refundOnlineFee;
+    /**
+     * 退线下转账
+     */
+    private Double refundOfflineFee;
+}

+ 5 - 1
src/main/java/com/caimei365/order/model/vo/OrderVo.java

@@ -232,9 +232,13 @@ public class OrderVo implements Serializable {
      */
     private String clauseName;
     /**
-     * 子订单ID
+     * 子订单IDs
      */
     private String shopOrderIds;
+    /**
+     * 子订单ID
+     */
+    private Integer shopOrderId;
     /**
      * 订单取消原因
      */

+ 24 - 0
src/main/java/com/caimei365/order/model/vo/QuickPaySpRefundResponseVo.java

@@ -0,0 +1,24 @@
+package com.caimei365.order.model.vo;
+
+
+
+import com.caimei365.order.annotation.SignExclude;
+import lombok.Data;
+
+@Data
+public class QuickPaySpRefundResponseVo {
+
+    private String rt1_bizType;
+    private String rt2_retCode;
+    private String rt3_retMsg;
+    private String rt4_customerNumber;
+    private String rt5_orderId;
+    private String rt6_refundOrderId;
+    private String rt7_amount;
+    private String rt8_orderStatus;
+    @SignExclude
+    private String sign;
+    @SignExclude
+    private String signatureType;
+
+}

+ 26 - 0
src/main/java/com/caimei365/order/model/vo/QuickPaySpRefundVo.java

@@ -0,0 +1,26 @@
+package com.caimei365.order.model.vo;
+
+import com.caimei365.order.annotation.FieldEncrypt;
+import com.caimei365.order.annotation.SignExclude;
+import lombok.Data;
+
+@Data
+public class QuickPaySpRefundVo {
+
+    private String P1_bizType;
+
+    private String P2_orderId;
+
+    private String P3_customerNumber;
+
+    private String P4_refundOrderId;
+
+    @FieldEncrypt
+    private String P5_ruleJson;
+
+    private String P6_callbackUrl;
+
+    @SignExclude
+    private String signatureType;
+
+}

+ 8 - 0
src/main/java/com/caimei365/order/model/vo/ShopOrderVo.java

@@ -255,4 +255,12 @@ public class ShopOrderVo implements Serializable {
      * 收款款项二级类别1.上架费2.订单返佣3.认证通会员4.认证通企划
      */
    private Integer newReceiptType;
+    /**
+     * 余额支付时使用的金额
+     */
+   private Double accountAmount;
+    /**
+     * 是否使用余额 0否 1是
+     */
+   private Integer useBalanceFlag;
 }

+ 31 - 0
src/main/java/com/caimei365/order/model/vo/UserVo.java

@@ -0,0 +1,31 @@
+package com.caimei365.order.model.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author zzj
+ */
+@Data
+public class UserVo implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private Integer userId;
+    private String mobile;
+    private String validFlag;
+    private String clubStatus;
+    private String clubId;
+    /**
+     * 账户余额
+     */
+    private Double userMoney;
+    /**
+     * 账户可用余额
+     */
+    private Double ableUserMoney;
+    /**
+     * 采美豆数量
+     */
+    private Integer userBeans;
+}

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

@@ -0,0 +1,11 @@
+package com.caimei365.order.service;
+
+import com.caimei365.order.model.ResponseJson;
+
+/**
+ * @author zzj
+ */
+public interface OrderRefundService {
+
+    ResponseJson refundShopOrder(Integer shopOrderId) throws Exception;
+}

+ 327 - 0
src/main/java/com/caimei365/order/service/impl/OrderRefundServiceImpl.java

@@ -0,0 +1,327 @@
+package com.caimei365.order.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.caimei365.order.components.OnlinePostFormUtil;
+import com.caimei365.order.constant.Constant;
+import com.caimei365.order.mapper.BaseMapper;
+import com.caimei365.order.mapper.OrderRefundMapper;
+import com.caimei365.order.mapper.PayOrderMapper;
+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;
+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.Transactional;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicReference;
+
+/**
+ * @author zzj
+ */
+@Slf4j
+@Service
+public class OrderRefundServiceImpl implements OrderRefundService {
+
+    @Resource
+    private OrderRefundMapper refundMapper;
+    @Resource
+    private PayOrderMapper payOrderMapper;
+    @Resource
+    private BaseMapper baseMapper;
+
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public ResponseJson refundShopOrder(Integer shopOrderId) throws Exception {
+        /** todo
+         *  当前版本退款为原路退回,无自定义退款和部分退,仅可全退。 线上/线下/余额 三种支付方式,
+         *  如果线上退回,退款并改变主订单/子订单状态
+         *  如果线下退回,仅改变状态,不做其他处理
+         *  如果余额支付,退回余额,改变状态
+         *  所有支付方式,有采美豆使用的,一律退回采美豆,当前版本无采美豆抵扣运费,优惠券退回当前版本暂不考虑
+         */
+        OrderVo order = refundMapper.findOrder(shopOrderId);
+        UserVo user = refundMapper.findUser(order.getUserId());
+
+        List<OrderReceiptRelationPo> relationPos = refundMapper.findPayWays(shopOrderId);
+        CmReturnedPurchase cmReturnedPurchase = new CmReturnedPurchase();
+        String returnNo = "T" + System.currentTimeMillis() + new Random().nextInt(1000);
+        cmReturnedPurchase.setReturnedNo(returnNo);
+
+        AtomicReference<Double> refundBalanceFee = new AtomicReference<>(0d);
+        AtomicReference<Double> refundOnlineFee = new AtomicReference<>(0d);
+        AtomicReference<Double> refundOfflineFee = new AtomicReference<>(0d);
+
+        for (OrderReceiptRelationPo relationPo : relationPos) {
+            switch (relationPo.getPayWay()) {
+                case 1:
+                    returnOnline(relationPo);
+                    refundOnlineFee.updateAndGet(v -> v + relationPo.getAssociateAmount());
+                    break;
+                case 2:
+                    returnOffline(relationPo, cmReturnedPurchase);
+                    refundOfflineFee.updateAndGet(v -> v + relationPo.getAssociateAmount());
+                    break;
+                case 3:
+                    returnBalance(relationPo, cmReturnedPurchase, order);
+                    refundBalanceFee.updateAndGet(v -> v + relationPo.getAssociateAmount());
+                    break;
+                default:
+                    throw new IllegalStateException("payWay Unexpected ------>" + relationPo.getPayWay());
+            }
+        }
+
+        // 修改子订单信息
+        // 修改订单信息 refundType
+
+
+        // 二手订单交易全退,标记未售
+        if (1 == order.getSecondHandOrderFlag() && 7 == order.getStatus()) {
+            refundMapper.updateSecondProduct(shopOrderId);
+        }
+
+        //采美豆退款相关
+        if (7 == order.getStatus()) {
+            int userBeans = null == user.getUserBeans() ? 0 : user.getUserBeans();
+            /**  todo
+             *   抵扣运费需退回,当前版本暂取消抵扣运费
+             */
+
+
+            /**
+             *  1.下单赠送采美豆回收
+             *  2.下单扣除采美豆返回
+             */
+            Integer num = refundMapper.findByBeansType(order.getOrderId());
+            if (num != null && num > 0) {
+                UserBeansHistoryPo beansHistory = new UserBeansHistoryPo();
+                beansHistory.setBeansType(11);
+                beansHistory.setType(2);
+                beansHistory.setNum(num);
+                beansHistory.setPushStatus(0);
+                baseMapper.insertBeansHistory(beansHistory);
+                userBeans = userBeans - num;
+                user.setUserBeans(userBeans);
+            }
+            //订单低于1000扣500豆子退回
+            if (order.getPayTotalFee() != null && order.getPayTotalFee() < 1000) {
+                // 查本单是否扣豆子,所有子订单全退的情况下,有就返回
+                UserBeansHistoryPo bean = refundMapper.findLowOrder(order.getOrderId());
+                if (bean != null) {
+                    //有扣豆子记录
+                    UserBeansHistoryPo beanHistory = new UserBeansHistoryPo();
+                    beanHistory.setUserId(order.getUserId());
+                    beanHistory.setOrderId(order.getOrderId());
+                    beanHistory.setBeansType(16);
+                    beanHistory.setType(1);
+                    beanHistory.setNum(500);
+                    beanHistory.setPushStatus(0);
+                    beanHistory.setAddTime(new Date());
+                    baseMapper.insertBeansHistory(beanHistory);
+                    user.setUserBeans(user.getUserBeans() + 500);
+                }
+            }
+        }
+        // 修改user信息
+
+        return ResponseJson.success();
+    }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    public void returnOnline(OrderReceiptRelationPo relationPo) throws Exception {
+        String splitCode = payOrderMapper.getSplitCodeByShopOrderId(relationPo.getShopOrderId());
+        /**  网银
+         *   快捷
+         *   其他
+         */
+        if (12 == relationPo.getPayType() || 17 == relationPo.getPayType()) {
+            unionRefund(relationPo.getOrderRequestNo(), relationPo.getAssociateAmount().toString(), relationPo.getShopOrderId(), splitCode);
+        } else if (29 == relationPo.getPayType() || 30 == relationPo.getPayType()) {
+            quickRefund(relationPo, splitCode);
+        } else {
+            onlinePay(relationPo, splitCode);
+        }
+    }
+
+    public void returnOffline(OrderReceiptRelationPo relationPo, CmReturnedPurchase cmReturnedPurchase) {
+
+    }
+
+    public void returnBalance(OrderReceiptRelationPo relationPo, CmReturnedPurchase cmReturnedPurchase, OrderVo order) {
+        //添加余额收支记录
+        BalanceRecordPo cmUserBalanceRecord = new BalanceRecordPo();
+        cmUserBalanceRecord.setUserId(order.getUserId());
+        cmUserBalanceRecord.setType(1);
+        cmUserBalanceRecord.setBalanceType(3);
+        cmUserBalanceRecord.setAddDate(new Date());
+        cmUserBalanceRecord.setAmount(relationPo.getAssociateAmount());
+        cmUserBalanceRecord.setOrderId(order.getOrderId());
+        cmUserBalanceRecord.setShopOrderId(order.getShopOrderId());
+        cmUserBalanceRecord.setReturnedId(cmReturnedPurchase.getId());
+        cmUserBalanceRecord.setDelFlag(0);
+        baseMapper.insertBalanceRecord(cmUserBalanceRecord);
+    }
+
+
+
+    /**
+     * attention:网银退款不退手续费!
+     * 1.本方法内转账手续费等待到账再发起退款请求  todo 暂未转
+     * 2.异步
+     * 3.回调
+     */
+    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");
+        sPara.put("P2_orderId", orderRequestNo);
+        sPara.put("P3_customerNumber", splitCode);
+        sPara.put("P4_refundAmount", money);
+        sPara.put("P5_refundOrderId", "TK" + orderRequestNo);
+        sPara.put("P6_desc", "无");
+        sPara.put("P7_serverCallbackUrl", "");
+        StringBuffer sb = new StringBuffer();
+        sb.append("&").append("OnlineRefund").append("&").append(orderRequestNo).append("&").append(splitCode).append("&").
+                append(money).append("&").append("TK" + orderRequestNo).append("&").append("无").append("&").append("&").append(Constant.WANGYIN);
+        String sign = Disguiser.disguiseMD5(sb.toString());
+        sPara.put("sign", sign);
+        OnlineRefundData on = OnlinePostFormUtil.refundPostForm(sPara, Constant.YL, sign, OnlineRefundData.class);
+        if (!"0000".equals(on.getRt2_retCode())) {
+            log.info("网银退款失败:" + on.toString());
+            throw new Exception("网银退款失败");
+        } else {
+            String assemblyRespOriSign = MyBeanUtils.getSignedByPresetParameter(on, OnlineRefundData.NEED_SIGN_PARAMS);
+            log.info("组装返回结果签名串:" + assemblyRespOriSign);
+            assemblyRespOriSign += Constant.SPLIT + Constant.WANGYIN;
+            String checkSign = Disguiser.disguiseMD5(assemblyRespOriSign.trim());
+            if (!checkSign.equals(on.getSign())) {
+                log.error("网银退款验签失败========================" + on.getRt3_retMsg());
+                throw new Exception("网银退款验签失败!");
+            } else {
+                CmRefundRecord cmRefundRecord = new CmRefundRecord();
+                cmRefundRecord.setRefundAmount(Double.parseDouble(money));
+                cmRefundRecord.setOrderRequestNo(orderRequestNo);
+                cmRefundRecord.setShopOrderId(shopOrderId);
+                refundMapper.insertCmRefundRecord(cmRefundRecord);
+                log.info("网银退款成功");
+            }
+        }
+    }
+
+    public void onlinePay(OrderReceiptRelationPo relationPo, String splitCode) throws Exception {
+        AppPayRefundOrderVo orderVo = new AppPayRefundOrderVo();
+        orderVo.setP1_bizType("AppPayRefund");
+        orderVo.setP3_customerNumber(splitCode);
+        //退款原单号
+        orderVo.setP2_orderId(relationPo.getOrderRequestNo());
+        //自定义退款单号
+        String tk = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
+        orderVo.setP4_refundOrderId("TK" + tk + relationPo.getOrderRequestNo());
+        //退款金额
+        orderVo.setP5_amount(relationPo.getAssociateAmount().toString());
+        Map<String, String> map = MyBeanUtils.convertBean(orderVo, new LinkedHashMap());
+        String oriMessage = MyBeanUtils.getSignedByPresetParameter(map, AppPayRefundOrderVo.NEED_SIGN_PARAMS);
+        oriMessage += Constant.SAOMA;
+        String sign = Disguiser.disguiseMD5(oriMessage.trim());
+        log.info("签名串:" + sign);
+        map.put("sign", sign);
+        log.info("发送参数:" + map);
+        Map<String, Object> resultMap = HttpClientService.getHttpResp(map, Constant.REQUEST_URL);
+        log.info("响应结果:" + resultMap);
+        if ((Integer) resultMap.get("statusCode") == HttpStatus.SC_OK) {
+            String resultMsg = (String) resultMap.get("response");
+            AppPayRefundOrderResponseVo orderResponseVo = JSONObject.parseObject(resultMsg, AppPayRefundOrderResponseVo.class);
+            String assemblyRespOriSign = MyBeanUtils.getSignedByPresetParameter(orderResponseVo, AppPayRefundOrderResponseVo.NEED_SIGN_PARAMS);
+            assemblyRespOriSign += Constant.SAOMA;
+            log.info("组装返回结果签名串:" + assemblyRespOriSign);
+            String responseSign = orderResponseVo.getSign();
+            log.info("响应签名:" + responseSign);
+            String checkSign = Disguiser.disguiseMD5(assemblyRespOriSign.trim());
+            if (checkSign.equals(responseSign)) {
+                if ("0001".equals(orderResponseVo.getRt2_retCode())) {
+                    CmRefundRecord cmRefundRecord = new CmRefundRecord();
+                    cmRefundRecord.setRefundAmount(relationPo.getAssociateAmount());
+                    cmRefundRecord.setOrderRequestNo(relationPo.getOrderRequestNo());
+                    cmRefundRecord.setShopOrderId(relationPo.getShopOrderId());
+                    refundMapper.insertCmRefundRecord(cmRefundRecord);
+                    log.info("第三方退款成功>>>>>>>shopOrderId>>>" + relationPo.getShopOrderId());
+                } else {
+                    log.error("退款失败========================" + orderResponseVo.getRt5_orderId() + "-" + orderResponseVo.getRt3_retMsg());
+                    throw new RuntimeException("第三方退款失败!");
+                }
+            } else {
+                log.error("退款验签失败");
+                throw new RuntimeException("第三方退款验签失败!");
+            }
+        } else {
+            log.error("退款请求失败");
+            throw new RuntimeException("第三方退款请求失败!");
+        }
+    }
+
+    public void quickRefund(OrderReceiptRelationPo relationPo, String splitCode) throws Exception {
+        //快捷支付
+        QuickPaySpRefundVo quickPaySpRefundVo = new QuickPaySpRefundVo();
+        quickPaySpRefundVo.setP1_bizType("QuickPaySpRefund");
+        quickPaySpRefundVo.setP2_orderId(relationPo.getOrderRequestNo());
+        quickPaySpRefundVo.setP3_customerNumber(splitCode);
+        quickPaySpRefundVo.setP4_refundOrderId("ref" + relationPo.getOrderRequestNo());
+        /**
+         * [{ 'splitBillMerchantEmail': 'xun.zhang@caimei365.com','refundAmount': 0.12}]
+         */
+        String email = refundMapper.findSplitCodeEmail(splitCode);
+        String refundJson = "[{ 'splitBillMerchantEmail': '" + email + "','refundAmount': " + relationPo.getAssociateAmount() + "}]";
+        quickPaySpRefundVo.setP5_ruleJson(refundJson);
+        quickPaySpRefundVo.setP6_callbackUrl("localhost:8080/manager");
+        quickPaySpRefundVo.setSignatureType("SM3WITHSM2");
+        Map reqestMap = MessageHandle.getReqestMap(quickPaySpRefundVo);
+        Map<String, Object> resultMap = HttpClientService.getHttpResp(reqestMap, Constant.REQUEST_URL_QUICKPAY);
+        if ((Integer) resultMap.get("statusCode") != HttpStatus.SC_OK) {
+            log.info("-------------------快捷支付退款请求失败---------------");
+            throw new RuntimeException("快捷支付退款请求失败!");
+        } else {
+            String resultMsg = (String) resultMap.get("response");
+            QuickPaySpRefundResponseVo responseVo = JSONObject.parseObject(resultMsg, QuickPaySpRefundResponseVo.class);
+            log.info("--------------------->快捷支付退款json: " + JSONObject.toJSON(responseVo));
+            if (!MessageHandle.checkSign(responseVo)) {
+                log.info("---------------快捷支付退款验签失败------------------");
+                throw new RuntimeException("快捷支付退款验签失败!");
+            } else {
+                if ("0000".equals(responseVo.getRt2_retCode())) {
+                    CmRefundRecord cmRefundRecord = new CmRefundRecord();
+                    cmRefundRecord.setRefundAmount(relationPo.getAssociateAmount());
+                    cmRefundRecord.setOrderRequestNo(relationPo.getOrderRequestNo());
+                    cmRefundRecord.setShopOrderId(relationPo.getShopOrderId());
+                    refundMapper.insertCmRefundRecord(cmRefundRecord);
+                    log.info("---------------快捷支付退款成功------------------");
+                }
+            }
+        }
+    }
+}

+ 4 - 16
src/main/java/com/caimei365/order/service/impl/PayOrderServiceImpl.java

@@ -209,28 +209,16 @@ public class PayOrderServiceImpl implements PayOrderService {
             // 修改账户余额
             double userMoney = baseMapper.getUserMoney(order.getUserId());
             if (OrderStatus.UNCONFIRMED.getCode() != order.getStatus()) {
-                //保存收款记录
-                productService.saveDiscernReceipt(balancePayFee, orderId, "【订单支付,余额抵扣】");
+                /**
+                 *  子订单循环抵扣用户余额
+                 */
+                productService.saveShopOrderDiscernReceipt(balancePayFee, order);
             }
             //可用=可用-本次抵扣
             availableMoney = MathUtil.sub(availableMoney, balancePayFee).doubleValue();
             userMoney = MathUtil.sub(userMoney, balancePayFee).doubleValue();
             payOrderMapper.updateMoneyByUserId(userMoney, availableMoney, order.getUserId());
             log.info("【订单支付,余额抵扣】>>>>>>>>>>>更新用户余额(update[user])userId:" + order.getUserId() + ",orderId:" + orderId);
-            //保存余额到余额收支记录
-            BalanceRecordPo balanceRecord = new BalanceRecordPo();
-            balanceRecord.setUserId(order.getUserId());
-            balanceRecord.setType(2);
-            balanceRecord.setBalanceType(1);
-            balanceRecord.setAddDate(new Date());
-            balanceRecord.setAmount(balancePayFee);
-            balanceRecord.setOrderId(orderId);
-            balanceRecord.setRemark("订单支付,余额抵扣");
-            balanceRecord.setDelFlag(0);
-            // 保存 余额收支记录
-            baseMapper.insertBalanceRecord(balanceRecord);
-            log.info("【订单支付,余额抵扣】>>>>>>>>>>>>>>>>>>>>>>>>>>新增用户余额收支记录(insert[cm_user_balance_record])orderId:" + orderId);
-            log.info("【订单支付,线上/线下余额抵扣】>>>>>>>>>>>>>>>>>>>>>>>>>>新增用户余额收支记录(insert[cm_user_balance_record])orderId:" + orderId);
             log.info("************************订单支付完成消息推送*********************");
             //判断是否是二手订单和返佣订单
             List<Integer> productIds = orderClubMapper.getProductOrder(orderId);

+ 22 - 16
src/main/resources/mapper/BaseMapper.xml

@@ -2,10 +2,14 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.caimei365.order.mapper.BaseMapper">
     <select id="getOrganizeId" resultType="java.lang.Integer">
-        SELECT userOrganizeID FROM USER WHERE userId = #{userId}
+        SELECT userOrganizeID
+        FROM USER
+        WHERE userId = #{userId}
     </select>
     <select id="getOrganizeIdShop" resultType="java.lang.Integer">
-        SELECT organizeID FROM cm_shop_order WHERE shopOrderID = #{shopOrderId}
+        SELECT organizeID
+        FROM cm_shop_order
+        WHERE shopOrderID = #{shopOrderId}
     </select>
     <select id="getShopNameById" resultType="java.lang.String">
         SELECT `name`
@@ -65,7 +69,7 @@
     <select id="machineTypeByID" resultType="java.lang.String">
         SELECT p.machineType FROM product p LEFT JOIN cm_sku cs ON p.productID = cs.productId
         WHERE cs.organizeId = 0
-         and cs.skuID in
+        and cs.skuID in
         <foreach collection="skuIds" open="(" separator="," close=")" item="skuId">
             #{skuId}
         </foreach>
@@ -179,7 +183,8 @@
         FROM cm_promotions_gift cpg
                  LEFT JOIN cm_sku cs ON cpg.skuId = cs.skuId
                  LEFT JOIN product p ON cs.productId = p.productID
-        WHERE cpg.promotionsId = #{promotionsId} and cs.organizeId = 0
+        WHERE cpg.promotionsId = #{promotionsId}
+          and cs.organizeId = 0
         ORDER BY cpg.id DESC
     </select>
     <select id="getShopByProductId" resultType="com.caimei365.order.model.vo.CartShopVo">
@@ -247,15 +252,15 @@
     </select>
     <select id="getCart" resultType="com.caimei365.order.model.po.CartPo">
         SELECT productID as productID, userID as userId, productCount FROM cm_cart
-            <where>
-                userID = #{userId}
-                <if test="skuIds.size() > 0">
-                    and skuId IN
-                    <foreach collection="skuIds" open="(" separator="," close=")" item="skuId">
-                        #{skuId}
-                    </foreach>
-                </if>
-            </where>
+        <where>
+            userID = #{userId}
+            <if test="skuIds.size() > 0">
+                and skuId IN
+                <foreach collection="skuIds" open="(" separator="," close=")" item="skuId">
+                    #{skuId}
+                </foreach>
+            </if>
+        </where>
     </select>
     <select id="countUserOrder" resultType="java.lang.Integer">
         SELECT COUNT(*)
@@ -300,7 +305,8 @@
         SELECT p.shopID, p.productType
         FROM product p
                  LEFT JOIN cm_sku cs on cs.productId = p.productID
-        WHERE cs.skuId = #{skuId} and cs.organizeId = 0
+        WHERE cs.skuId = #{skuId}
+          and cs.organizeId = 0
     </select>
     <select id="getClauseList" resultType="com.caimei365.order.model.vo.ClauseVo">
         SELECT id,
@@ -360,9 +366,9 @@
     </update>
     <insert id="insertBalanceRecord" parameterType="com.caimei365.order.model.po.BalanceRecordPo">
         INSERT INTO cm_user_balance_record (userId, type, balanceType, addDate, amount, orderId, receiptId, remark,
-                                            delFlag)
+                                            delFlag, shopOrderId)
         VALUES (#{userId}, #{type}, #{balanceType}, #{addDate}, #{amount}, #{orderId}, #{receiptId}, #{remark},
-                #{delFlag})
+                #{delFlag}, #{shopOrderId})
     </insert>
     <select id="getSvipUserIdByUserId" resultType="java.lang.Integer">
         select userId

+ 15 - 3
src/main/resources/mapper/OrderCommonMapper.xml

@@ -7,7 +7,9 @@
         WHERE orderID = #{orderId}
     </select>
     <select id="getOrganizeId" resultType="java.lang.Integer">
-        select organizeID as organizeId from cm_order where orderId = #{orderId}
+        select organizeID as organizeId
+        from cm_order
+        where orderId = #{orderId}
     </select>
     <select id="getShopOrderList" resultType="com.caimei365.order.model.vo.ShopOrderVo">
         SELECT
@@ -206,6 +208,13 @@
             delFlag    = #{delFlag}
         WHERE id = #{id}
     </update>
+    <update id="updateShopOrderBalance">
+        update cm_shop_order
+        set useBalanceFlag = #{useBalanceFlag},
+            accountAmount = #{accountAmount},
+            receiptStatus = #{receiptStatus}
+        where shopOrderId = #{shopOrderId}
+    </update>
     <delete id="deleteSearchHistoryLimit">
         DELETE
         FROM user_order_history
@@ -750,13 +759,16 @@
     <select id="findMaxStock" resultType="java.lang.Integer">
         SELECT stock
         FROM cm_sku
-        WHERE productId = #{productId} and organizeId = 0
+        WHERE productId = #{productId}
+          and organizeId = 0
         ORDER BY stock DESC
         LIMIT 1
     </select>
 
     <select id="getHelpContent" resultType="java.lang.String">
-        select content from helppage where helpPageID=#{helpId}
+        select content
+        from helppage
+        where helpPageID = #{helpId}
     </select>
     <select id="findOnlinePayWays" resultType="java.lang.String">
         select onlinePayWays

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

@@ -0,0 +1,68 @@
+<?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.caimei365.order.mapper.OrderRefundMapper">
+    <insert id="insertCmRefundRecord">
+        insert into cm_refundmoney_record
+            (refundAmount, orderRequestNo, shopOrderId)
+        values (#{refundAmount}, #{orderRequestNo}, #{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>
+
+    <select id="findPayWays" resultType="com.caimei365.order.model.po.OrderReceiptRelationPo">
+        select cro.relationType,
+               cro.receiptID,
+               cro.shopOrderId,
+               cro.orderId,
+               cro.mbOrderId,
+               cro.orderRequestNo,
+               cro.splitStatus,
+               cro.associateAmount,
+               cro.delFlag,
+               cdr.payType,
+               cdr.payWay
+        from cm_receipt_order_relation cro
+                 left join cm_discern_receipt cdr on cro.receiptID = cdr.id
+        where cro.shopOrderId = #{shopOrderId}
+    </select>
+
+    <select id="findOrder" resultType="com.caimei365.order.model.vo.OrderVo">
+        select secondHandOrderFlag, status, co.orderId, co.userId, co.payTotalFee
+        from cm_order co
+                 left join cm_shop_order cso on co.orderId = cso.orderId
+        where cso.shopOrderID = #{shopOrderId}
+    </select>
+
+    <select id="findSplitCodeEmail" resultType="java.lang.String">
+        select email
+        from cm_shop_email
+        where splitCode = #{splitCode}
+    </select>
+
+    <select id="findUser" resultType="com.caimei365.order.model.vo.UserVo">
+        select userId, clubId, ableUserMoney, userMoney, userBeans
+        from user
+        where userId = #{userId}
+    </select>
+
+    <select id="findByBeansType" resultType="java.lang.Integer">
+        SELECT SUM(num)
+        FROM user_beans_history
+        WHERE orderId = #{orderId}
+          AND beansType = 5
+    </select>
+
+    <select id="findLowOrder" resultType="com.caimei365.order.model.po.UserBeansHistoryPo">
+        select userId, type, beansType, orderId, num, addTime
+        from user_beans_history
+        where orderId = #{orderId}
+          and delFlag = 0
+          and type = 2
+          and beansType = 15
+    </select>
+
+</mapper>