Kaynağa Gözat

Merge remote-tracking branch 'origin/developer' into developerD

huangzhiguo 1 yıl önce
ebeveyn
işleme
3938a619ef
93 değiştirilmiş dosya ile 6597 ekleme ve 1480 silme
  1. 12 2
      pom.xml
  2. 111 5
      src/main/java/com/caimei365/order/components/OnlinePostFormUtil.java
  3. 301 37
      src/main/java/com/caimei365/order/components/OrderCommonService.java
  4. 64 0
      src/main/java/com/caimei365/order/components/OssService.java
  5. 188 23
      src/main/java/com/caimei365/order/components/ProductService.java
  6. 5 1
      src/main/java/com/caimei365/order/constant/Constant.java
  7. 2 1
      src/main/java/com/caimei365/order/controller/AddressApi.java
  8. 6 4
      src/main/java/com/caimei365/order/controller/CartClubApi.java
  9. 3 3
      src/main/java/com/caimei365/order/controller/CartSellerApi.java
  10. 38 15
      src/main/java/com/caimei365/order/controller/HeliPayApi.java
  11. 51 36
      src/main/java/com/caimei365/order/controller/OrderClubApi.java
  12. 41 0
      src/main/java/com/caimei365/order/controller/OrderRefundApi.java
  13. 9 8
      src/main/java/com/caimei365/order/controller/OrderSellerApi.java
  14. 63 57
      src/main/java/com/caimei365/order/controller/OrderSubmitApi.java
  15. 5 2
      src/main/java/com/caimei365/order/controller/ReceiptApi.java
  16. 145 33
      src/main/java/com/caimei365/order/controller/ShipApi.java
  17. 7 0
      src/main/java/com/caimei365/order/mapper/AddressMapper.java
  18. 80 13
      src/main/java/com/caimei365/order/mapper/BaseMapper.java
  19. 6 0
      src/main/java/com/caimei365/order/mapper/CartClubMapper.java
  20. 10 4
      src/main/java/com/caimei365/order/mapper/CartSellerMapper.java
  21. 102 3
      src/main/java/com/caimei365/order/mapper/OrderClubMapper.java
  22. 69 2
      src/main/java/com/caimei365/order/mapper/OrderCommonMapper.java
  23. 61 0
      src/main/java/com/caimei365/order/mapper/OrderRefundMapper.java
  24. 27 0
      src/main/java/com/caimei365/order/mapper/OrderSellerMapper.java
  25. 16 0
      src/main/java/com/caimei365/order/mapper/PayOrderMapper.java
  26. 99 4
      src/main/java/com/caimei365/order/mapper/ShipMapper.java
  27. 9 4
      src/main/java/com/caimei365/order/mapper/SubmitMapper.java
  28. 5 0
      src/main/java/com/caimei365/order/model/dto/AgainBuyDto.java
  29. 5 0
      src/main/java/com/caimei365/order/model/dto/CartDto.java
  30. 2 2
      src/main/java/com/caimei365/order/model/dto/OrderDto.java
  31. 16 0
      src/main/java/com/caimei365/order/model/dto/OrderProductDto.java
  32. 28 0
      src/main/java/com/caimei365/order/model/dto/OrderRemarkDto.java
  33. 33 0
      src/main/java/com/caimei365/order/model/dto/OssFileDto.java
  34. 3 0
      src/main/java/com/caimei365/order/model/dto/PayDto.java
  35. 18 0
      src/main/java/com/caimei365/order/model/dto/RemarkImageDto.java
  36. 80 0
      src/main/java/com/caimei365/order/model/dto/SettlementDto.java
  37. 2 2
      src/main/java/com/caimei365/order/model/dto/VoucherDto.java
  38. 6 0
      src/main/java/com/caimei365/order/model/po/BalanceRecordPo.java
  39. 95 0
      src/main/java/com/caimei365/order/model/po/OnlineRefundData.java
  40. 0 8
      src/main/java/com/caimei365/order/model/po/OrderProductPo.java
  41. 12 0
      src/main/java/com/caimei365/order/model/po/OrderReceiptRelationPo.java
  42. 20 0
      src/main/java/com/caimei365/order/model/po/OrderShopPo.java
  43. 33 0
      src/main/java/com/caimei365/order/model/po/ShopPo.java
  44. 1 1
      src/main/java/com/caimei365/order/model/po/VoucherPo.java
  45. 124 0
      src/main/java/com/caimei365/order/model/vo/AppPayRefundOrderResponseVo.java
  46. 109 0
      src/main/java/com/caimei365/order/model/vo/AppPayRefundOrderVo.java
  47. 9 0
      src/main/java/com/caimei365/order/model/vo/CartItemVo.java
  48. 28 0
      src/main/java/com/caimei365/order/model/vo/CartShopVo.java
  49. 37 0
      src/main/java/com/caimei365/order/model/vo/CmRefundRecord.java
  50. 85 0
      src/main/java/com/caimei365/order/model/vo/CmReturnedPurchase.java
  51. 7 1
      src/main/java/com/caimei365/order/model/vo/OrderProductVo.java
  52. 4 0
      src/main/java/com/caimei365/order/model/vo/OrderShareCodeRecordVo.java
  53. 4 0
      src/main/java/com/caimei365/order/model/vo/OrderShareCodeVo.java
  54. 5 1
      src/main/java/com/caimei365/order/model/vo/OrderVo.java
  55. 24 0
      src/main/java/com/caimei365/order/model/vo/QuickPaySpRefundResponseVo.java
  56. 26 0
      src/main/java/com/caimei365/order/model/vo/QuickPaySpRefundVo.java
  57. 38 4
      src/main/java/com/caimei365/order/model/vo/SettlementVo.java
  58. 123 0
      src/main/java/com/caimei365/order/model/vo/ShopOrderVo.java
  59. 31 0
      src/main/java/com/caimei365/order/model/vo/UserVo.java
  60. 2 1
      src/main/java/com/caimei365/order/service/AddressService.java
  61. 3 2
      src/main/java/com/caimei365/order/service/CartClubService.java
  62. 1 1
      src/main/java/com/caimei365/order/service/CartSellerService.java
  63. 11 6
      src/main/java/com/caimei365/order/service/HeliPayService.java
  64. 30 22
      src/main/java/com/caimei365/order/service/OrderClubService.java
  65. 13 0
      src/main/java/com/caimei365/order/service/OrderRefundService.java
  66. 5 4
      src/main/java/com/caimei365/order/service/OrderSellerService.java
  67. 5 5
      src/main/java/com/caimei365/order/service/PayOrderService.java
  68. 57 5
      src/main/java/com/caimei365/order/service/ShipService.java
  69. 5 6
      src/main/java/com/caimei365/order/service/SubmitService.java
  70. 9 2
      src/main/java/com/caimei365/order/service/impl/AddressServiceImpl.java
  71. 145 47
      src/main/java/com/caimei365/order/service/impl/CartClubServiceImpl.java
  72. 49 10
      src/main/java/com/caimei365/order/service/impl/CartSellerServiceImpl.java
  73. 282 161
      src/main/java/com/caimei365/order/service/impl/HeliPayServiceImpl.java
  74. 237 194
      src/main/java/com/caimei365/order/service/impl/OrderClubServiceImpl.java
  75. 401 0
      src/main/java/com/caimei365/order/service/impl/OrderRefundServiceImpl.java
  76. 36 15
      src/main/java/com/caimei365/order/service/impl/OrderSellerServiceImpl.java
  77. 108 133
      src/main/java/com/caimei365/order/service/impl/PayOrderServiceImpl.java
  78. 380 9
      src/main/java/com/caimei365/order/service/impl/ShipServiceImpl.java
  79. 334 294
      src/main/java/com/caimei365/order/service/impl/SubmitServiceImpl.java
  80. 243 0
      src/main/java/com/caimei365/order/utils/OSSUtils.java
  81. 14 1
      src/main/resources/mapper/AddressMapper.xml
  82. 57 27
      src/main/resources/mapper/BaseMapper.xml
  83. 67 60
      src/main/resources/mapper/CartClubMapper.xml
  84. 28 13
      src/main/resources/mapper/CartSellerMapper.xml
  85. 1 1
      src/main/resources/mapper/MessagePushMapper.xml
  86. 347 45
      src/main/resources/mapper/OrderClubMapper.xml
  87. 258 15
      src/main/resources/mapper/OrderCommonMapper.xml
  88. 247 0
      src/main/resources/mapper/OrderRefundMapper.xml
  89. 217 1
      src/main/resources/mapper/OrderSellerMapper.xml
  90. 19 6
      src/main/resources/mapper/PayOrderMapper.xml
  91. 6 3
      src/main/resources/mapper/ReceiptMapper.xml
  92. 224 44
      src/main/resources/mapper/ShipMapper.xml
  93. 213 71
      src/main/resources/mapper/SubmitMapper.xml

+ 12 - 2
pom.xml

@@ -166,7 +166,17 @@
             <artifactId>hutool-crypto</artifactId>
             <version>5.7.16</version>
         </dependency>
-
+        <!--对象存储oss-->
+        <dependency>
+            <groupId>com.aliyun.oss</groupId>
+            <artifactId>aliyun-sdk-oss</artifactId>
+            <version>3.10.2</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>easyexcel</artifactId>
+            <version>2.1.6</version>
+        </dependency>
 
 
 
@@ -242,4 +252,4 @@
         </plugins>
     </build>
 
-</project>
+</project>

+ 111 - 5
src/main/java/com/caimei365/order/components/OnlinePostFormUtil.java

@@ -3,12 +3,11 @@ package com.caimei365.order.components;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import lombok.extern.slf4j.Slf4j;
-import okhttp3.FormBody;
-import okhttp3.OkHttpClient;
-import okhttp3.Request;
-import okhttp3.Response;
+import okhttp3.*;
 
 import java.io.IOException;
+import java.lang.reflect.Field;
+import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
 
@@ -61,10 +60,117 @@ public class OnlinePostFormUtil {
         JSONObject res = JSON.parseObject(content);
         //网银查询回调
         if (!"SUCCESS".equals(res.getString("rt10_orderStatus"))) {
-            log.info("网银查询成功结果------->"+res.toString());
+            log.info("网银查询成功结果------->" + res.toString());
         }
         /** rt4_success 为 true,需验签  **/
         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);
+    }
+
+    public static <T> T splitPostForm(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());
+        }
+
+        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 (!res.getBooleanValue("rt4_success")) {
+            log.error("error: " + res.getString("rt6_retMsg"));
+        }
+        /** rt4_success 为 true,需验签  **/
+        return res.toJavaObject(clazz);
+    }
+
+
+    public static Map<String, String> splitConvertBean(Object bean) {
+        Class clazz = bean.getClass();
+        Field[] fields = clazz.getDeclaredFields();
+        for (Field f : fields) {
+            f.setAccessible(true);
+        }
+        try {
+            Map<String, String> retMap = new LinkedHashMap<>();
+            for (Field f : fields) {
+                String key = f.toString().substring(f.toString().lastIndexOf(".") + 1);
+                Object value = f.get(bean);
+                if (value == null) {
+                    value = "";
+                }
+                retMap.put(key, (String) value);
+            }
+            return retMap;
+        } catch (Exception e) {
+            log.info("分账", e);
+            throw new IllegalStateException("分账异常", e);
+        }
+    }
 }

+ 301 - 37
src/main/java/com/caimei365/order/components/OrderCommonService.java

@@ -15,7 +15,7 @@ import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.util.*;
-import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.stream.Collectors;
 
 /**
@@ -68,9 +68,9 @@ public class OrderCommonService {
         String[] shopOrderIdArr = order.getShopOrderIds().split(",");
         List<String> shopOrderIds = Arrays.asList(shopOrderIdArr);
         List<ShopOrderVo> shopOrderList = orderCommonMapper.getShopOrderList(shopOrderIds);
-        // 冷链商品类型
-        List<Integer> arrList = new ArrayList<>();
         shopOrderList.forEach(shopOrder -> {
+            // 冷链商品类型
+            List<Integer> arrList = new ArrayList<>();
             // 店铺促销活动
             PromotionsVo shopPromotion = null;
             if (null != shopOrder.getOrderPromotionsId() && shopOrder.getOrderPromotionsId() > 0) {
@@ -125,47 +125,46 @@ public class OrderCommonService {
                     }
                 }
             });
-            shopOrder.setOrderProductList(orderProductList);
-            shopOrder.setShopLogo(ImageUtil.getImageUrl("shopLogo", shopOrder.getShopLogo(), domain));
-            if (0 == order.getOnlinePayFlag()) {
-                shopOrder.setObligation(MathUtil.sub(shopOrder.getRealPay(), shopOrder.getReceiptAmount()).doubleValue());
-            }
             // 冷链运输费 -- 联合丽格
             if (null != shopOrder.getIsColdChina() && 1 == shopOrder.getIsColdChina()) {
-                order.setColdChina(700.00d);
-                order.setIsColdChina(shopOrder.getIsColdChina());
+                shopOrder.setColdChina(700.00d);
             } else {
-                order.setColdChina(0.00d);
-                order.setIsColdChina(0);
+                shopOrder.setColdChina(0.00d);
             }
-        });
-        // 拼接运费信息--联合丽格
-        if (null != order.getColdChina()) {
-            String open = "";
-            String close = "";
-            if (order.getIsColdChina()==1) {
-                open = "(";
-                close = ")";
-            } else if (!arrList.stream().allMatch(c -> c == 1)) {
-                open = "(";
-                close = ")";
+            // 拼接运费信息--联合丽格
+            if (null != shopOrder.getColdChina()) {
+                String open = "";
+                String close = "";
+                if (shopOrder.getIsColdChina()==1) {
+                    open = "(";
+                    close = ")";
+                } else if (!arrList.stream().allMatch(c -> c == 1)) {
+                    open = "(";
+                    close = ")";
+                } else {
+                    open = "";
+                    close = "";
+                }
+                if (-1 == shopOrder.getShopPostFlag()) {
+                    // 到付
+                    shopOrder.setPostageInfo("¥" + shopOrder.getShopPostFee().doubleValue() + open +(shopOrder.getIsColdChina()==1?"冷链费: ¥" + shopOrder.getColdChina().doubleValue():"") + (arrList.stream().allMatch(c -> c == 1)?"":" 其他: 到付")+close);
+                } else if (0 == shopOrder.getShopPostFlag()) {
+                    // 包邮
+                    shopOrder.setPostageInfo("¥" + shopOrder.getShopPostFee().doubleValue() + open +(shopOrder.getIsColdChina()==1?"冷链费: ¥" + shopOrder.getColdChina().doubleValue():"") + (arrList.stream().allMatch(c -> c == 1)?"":" 其他: 包邮")+close);
+                } else {
+                    // 有运费
+                    shopOrder.setPostageInfo("¥" + shopOrder.getShopPostFee().doubleValue() + open +(shopOrder.getIsColdChina()==1?"冷链费: ¥" + shopOrder.getColdChina().doubleValue():"") + (!arrList.stream().allMatch(c -> c == 1)?" 其他: ¥" + MathUtil.sub(order.getPostage(), order.getColdChina()).doubleValue():"") + close);
+                }
             } else {
-                open = "";
-                close = "";
+                shopOrder.setPostageInfo(shopOrder.getShopPostFlag() == -1?"到付":shopOrder.getShopPostFlag() == 0?"包邮":"¥" + shopOrder.getShopPostFee().doubleValue());
             }
-            if (-1 == order.getPostageFlag()) {
-                // 到付
-                order.setPostageInfo("¥" + order.getPostage().doubleValue() + open +(order.getIsColdChina()==1?"冷链费: ¥" + order.getColdChina().doubleValue():"") + (arrList.stream().allMatch(c -> c == 1)?"":" 其他: 到付")+close);
-            } else if (0 == order.getPostageFlag()) {
-                // 包邮
-                order.setPostageInfo("¥" + order.getPostage().doubleValue() + open +(order.getIsColdChina()==1?"冷链费: ¥" + order.getColdChina().doubleValue():"") + (arrList.stream().allMatch(c -> c == 1)?"":" 其他: 包邮")+close);
-            } else {
-                // 有运费
-                order.setPostageInfo("¥" + order.getPostage().doubleValue() + open +(order.getIsColdChina()==1?"冷链费: ¥" + order.getColdChina().doubleValue():"") + (!arrList.stream().allMatch(c -> c == 1)?" 其他: ¥" + MathUtil.sub(order.getPostage(), order.getColdChina()).doubleValue():"") + close);
+            shopOrder.setOrderProductList(orderProductList);
+            shopOrder.setShopLogo(ImageUtil.getImageUrl("shopLogo", shopOrder.getShopLogo(), domain));
+            if (0 == order.getOnlinePayFlag()) {
+                shopOrder.setObligation(MathUtil.sub(shopOrder.getRealPay(), shopOrder.getReceiptAmount()).doubleValue());
             }
-        } else {
-            order.setPostageInfo(order.getPostage().doubleValue() == -1?"到付":order.getPostageFlag() == 0?"包邮":"¥" + order.getPostage().doubleValue());
-        }
+
+        });
         // 过滤运费商品
         shopOrderList.removeIf(shopOrder -> shopOrder.getShopId() == 998);
         order.setShopOrderList(shopOrderList);
@@ -232,6 +231,271 @@ public class OrderCommonService {
         return discernReceiptList;
     }
 
+    /**
+     * 设置子订单状态
+     * shopStatus  0:待确认 1:已确认 2:交易完成 3:订单完成 4:已关闭 5:交易全退
+     *
+     * payStatus (付款供应商)付款状态:1待付款、2部分付款、3已付款
+     * sendOutStatus  发货状态:1待发货、2部分发货、3已发货
+     * receiptStatus 收款状态:1待收款、2部分收款、3已收款
+     */
+    public void setShopOrderStatus(ShopOrderVo shopOrderVo) {
+        // 11, 待付待收待发
+        if (1 == shopOrderVo.getStatus() ) {
+            if ( 1 == shopOrderVo.getReceiptStatus() && 1 == shopOrderVo.getSendOutStatus()){
+                shopOrderVo.setStatus(11);
+            } else if ( 1 == shopOrderVo.getReceiptStatus() && 2 == shopOrderVo.getSendOutStatus()) {
+                shopOrderVo.setStatus(12);
+            } else if ( 1 == shopOrderVo.getReceiptStatus() && 3 == shopOrderVo.getSendOutStatus()) {
+                shopOrderVo.setStatus(13);
+            } else if ( 2 == shopOrderVo.getReceiptStatus() && 1 == shopOrderVo.getSendOutStatus()) {
+                shopOrderVo.setStatus(21);
+            } else if ( 2 == shopOrderVo.getReceiptStatus() && 2 == shopOrderVo.getSendOutStatus()) {
+                shopOrderVo.setStatus(22);
+            } else if ( 2 == shopOrderVo.getReceiptStatus() && 3 == shopOrderVo.getSendOutStatus()) {
+                shopOrderVo.setStatus(23);
+            } else if ( 3 == shopOrderVo.getReceiptStatus() && 1 == shopOrderVo.getSendOutStatus()) {
+                shopOrderVo.setStatus(31);
+            } else if ( 3 == shopOrderVo.getReceiptStatus() && 2 == shopOrderVo.getSendOutStatus()) {
+                shopOrderVo.setStatus(32);
+            } else if ( 3 == shopOrderVo.getReceiptStatus() && 3 == shopOrderVo.getSendOutStatus()) {
+                shopOrderVo.setStatus(33);
+            }
+        }
+        // 判断交易全退情况下,是否发过货,6,交易全退可以查看物流
+        int logisticsCount = orderCommonMapper.countLogisticsBatchShop(shopOrderVo.getShopOrderId());
+        if (5 == shopOrderVo.getStatus() && logisticsCount > 0) {
+            shopOrderVo.setStatus(6);
+        }
+    }
+
+    /**
+     * 子订单信息
+     * @param shopOrder
+     */
+    public void setShopOrderInfo(ShopOrderVo shopOrder) {
+        if (null != shopOrder) {
+            Integer organizeId = orderCommonMapper.getShopOrganizeId(shopOrder.getShopOrderId());
+            // 冷链商品类型
+            List<Integer> arrList = new ArrayList<>();
+            // 店铺促销活动
+            PromotionsVo shopPromotion = null;
+            if (null != shopOrder.getOrderPromotionsId() && shopOrder.getOrderPromotionsId() > 0) {
+                shopPromotion = orderCommonMapper.getOrderPromotionsById(shopOrder.getOrderPromotionsId());
+                shopOrder.setShopPromotion(shopPromotion);
+            }
+            List<OrderProductVo> orderProductList = orderCommonMapper.getShopOrderProduct(shopOrder.getShopOrderId());
+            orderProductList.removeIf(Objects::isNull);
+            // 冷链商品判定
+            List<Integer> collect = orderProductList.stream().map(OrderProductVo::getProductId).collect(Collectors.toList());
+            collect.removeIf(c -> c == 999);
+            if (collect.stream().allMatch(c -> c == 7881)) {
+                arrList.add(1);
+            } else if (!collect.contains(7881)) {
+                arrList.add(2);
+            } else {
+                arrList.add(3);
+            }
+            // 是否有分帐号
+            AtomicBoolean isSplit = new AtomicBoolean(true);
+            orderProductList.forEach(orderProduct -> {
+                // 不含税可开票商品,单价/折后单价在原基础上加上税费
+                boolean taxFlag = false;
+                if (0 == organizeId) {
+                    taxFlag = (Integer.valueOf(0).equals(orderProduct.getIncludedTax()) && (Integer.valueOf(1).equals(orderProduct.getInvoiceType()) || Integer.valueOf(2).equals(orderProduct.getInvoiceType())));
+                }
+                /*if (taxFlag) {
+                    Double valueTax = MathUtil.div(MathUtil.mul(orderProduct.getPrice(), orderProduct.getTaxRate()), 100).doubleValue();
+                    orderProduct.setPrice(MathUtil.add(orderProduct.getPrice(), valueTax).doubleValue());
+                    orderProduct.setDiscountPrice(MathUtil.add(orderProduct.getDiscountPrice(), orderProduct.getAddedValueTax()).doubleValue());
+                }*/
+                orderProduct.setImage(ImageUtil.getImageUrl("product", orderProduct.getImage(), domain));
+                // 查询订单下商品的促销活动
+                if (null != orderProduct.getOrderPromotionsId() && orderProduct.getOrderPromotionsId() > 0) {
+                    PromotionsVo promotions = orderCommonMapper.getOrderPromotionsById(orderProduct.getOrderPromotionsId());
+                    if (null != promotions) {
+                        if (1 == promotions.getType() && 1 == promotions.getMode()) {
+                            // 单品优惠价取sku的优惠价
+                            Double touchPrice = baseMapper.getTouchPriceBySku(orderProduct.getSkuId(),promotions.getId());
+                            promotions.setTouchPrice(touchPrice);
+                        }
+                        if (taxFlag && Integer.valueOf(1).equals(promotions.getType()) && Integer.valueOf(1).equals(promotions.getMode())) {
+                            promotions.setTouchPrice(MathUtil.add(promotions.getTouchPrice(), MathUtil.div(MathUtil.mul(promotions.getTouchPrice(), orderProduct.getTaxRate()), 100)).doubleValue());
+                        }
+                        orderProduct.setProductPromotion(promotions);
+                    }
+                }
+                // 超级会员优惠商品设置优惠标签
+                if (null != orderProduct.getSvipPriceFlag() && 1 == orderProduct.getSvipPriceFlag()) {
+                    if (1 == orderProduct.getSvipPriceType()) {
+                        orderProduct.setSvipPriceTag(MathUtil.div(orderProduct.getSvipDiscount(), 10, 1) + "折");
+                    } else if (2 == orderProduct.getSvipPriceType()) {
+                        orderProduct.setSvipPriceTag("¥" + orderProduct.getDiscountPrice());
+                    }
+                }
+                if (StringUtils.isEmpty(orderProduct.getSplitCode())) {
+                    isSplit.set(false);
+                }
+            });
+            // 冷链运输费
+            if (null != shopOrder.getIsColdChina() && 1 == shopOrder.getIsColdChina()) {
+                shopOrder.setColdChina(700.00d);
+            } else {
+                shopOrder.setColdChina(0.00d);
+            }
+            // 拼接运费信息
+            if (null != shopOrder.getColdChina() && null != shopOrder.getIsColdChina() && 1 == shopOrder.getIsColdChina()) {
+                String open = "";
+                String close = "";
+                if (shopOrder.getIsColdChina()==1) {
+                    open = "(";
+                    close = ")";
+                } else if (!arrList.stream().allMatch(c -> c == 1)) {
+                    open = "(";
+                    close = ")";
+                } else {
+                    open = "";
+                    close = "";
+                }
+                if (2 == shopOrder.getShopPostFlag()) {
+                    // 到付
+                    shopOrder.setPostageInfo("¥" + MathUtil.add(shopOrder.getShopPostFee(), shopOrder.getColdChina()).doubleValue() + open +(shopOrder.getIsColdChina()==1?"冷链费: ¥" + shopOrder.getColdChina().doubleValue():"") + (arrList.stream().allMatch(c -> c == 1)?"":" 其他: 到付")+close);
+                } else if (0 == shopOrder.getShopPostFlag()) {
+                    // 包邮
+                    shopOrder.setPostageInfo("¥" + MathUtil.add(shopOrder.getShopPostFee(), shopOrder.getColdChina()).doubleValue() + open +(shopOrder.getIsColdChina()==1?"冷链费: ¥" + shopOrder.getColdChina().doubleValue():"") + (arrList.stream().allMatch(c -> c == 1)?"":" 其他: 包邮")+close);
+                } else {
+                    // 有运费
+                    shopOrder.setPostageInfo("¥" + MathUtil.add(shopOrder.getShopPostFee(), shopOrder.getColdChina()).doubleValue() + open +(shopOrder.getIsColdChina()==1?"冷链费: ¥" + shopOrder.getColdChina().doubleValue():"") + ((shopOrder.getShopPostFee() != null && shopOrder.getShopPostFee() != 0d)?" 其他: ¥" + shopOrder.getShopPostFee():"") + close);
+                }
+            } else {
+                shopOrder.setPostageInfo(shopOrder.getShopPostFlag() == 2 ?"到付":shopOrder.getShopPostFlag() == 0?"包邮":"¥" + shopOrder.getShopPostFee());
+            }
+            shopOrder.setOrderProductList(orderProductList);
+            shopOrder.setShopLogo(ImageUtil.getImageUrl("shopLogo", shopOrder.getShopLogo(), domain));
+            //if (0 == order.getOnlinePayFlag()) {
+            if (null == shopOrder.getRealPay()) {
+                shopOrder.setRealPay(shopOrder.getNeedPayAmount());
+            }
+            shopOrder.setObligation(MathUtil.sub(shopOrder.getRealPay(), shopOrder.getReceiptAmount()).doubleValue());
+            //}
+        }
+
+    }
+
+    /**
+     * 设置子订单付款金额
+     * @param shopOrderVo
+     * @return
+     */
+    public List<DiscernReceiptVo> getDiscernReceiptAndSetShoporder(ShopOrderVo shopOrderVo) {
+        // 判断是否可以走线上支付
+        if (0 == shopOrderVo.getPayway()) {
+            shopOrderVo.setOnlinePay(0);
+        } else if (1 == shopOrderVo.getPayway()) {
+            shopOrderVo.setOnlinePay(1);
+        } else {
+            shopOrderVo.setOnlinePay(2);
+        }
+        Integer orderVoucher = orderCommonMapper.getOrderVoucher(shopOrderVo.getShopOrderId());
+        if (null != orderVoucher && orderVoucher > 0) {
+            shopOrderVo.setOnlinePay(2);
+        }
+        // 余额抵扣线下
+        if (1 == shopOrderVo.getUseBalanceFlag()) {
+            shopOrderVo.setOnlinePay(2);
+        }
+        // 支付记录
+        List<DiscernReceiptVo> discernReceiptList = orderCommonMapper.getDiscernReceipt(shopOrderVo.getOrderId(), shopOrderVo.getShopOrderId().toString());
+        Double receiptAmount = 0d;
+        // 订单款
+        if (!discernReceiptList.isEmpty()) {
+            AtomicDouble finalReceiptAmount = new AtomicDouble(0d);
+            discernReceiptList.forEach(discernReceipt -> {
+                finalReceiptAmount.set(MathUtil.add(finalReceiptAmount.get(), discernReceipt.getAssociateAmount()).doubleValue());
+                if (null != discernReceipt.getPayType()) {
+                    discernReceipt.setPayTypeStr(ReceivablesType.getReceivablesType(discernReceipt.getPayType()));
+                }
+                if (1 == discernReceipt.getPayWay()) {
+                    shopOrderVo.setOnlinePay(1);
+                } else {
+                    shopOrderVo.setOnlinePay(2);
+                }
+            });
+            receiptAmount = finalReceiptAmount.get();
+        } else {
+            //返佣款
+            Double tempAmount = orderCommonMapper.getRebateAmountByShopOrder(shopOrderVo.getShopOrderId());
+            if (null != tempAmount) {
+                shopOrderVo.setOnlinePay(2);
+            }
+        }
+        //待付总金额
+        if (null == shopOrderVo.getRealPay()) {
+            shopOrderVo.setRealPay(shopOrderVo.getNeedPayAmount());
+        }
+        AtomicDouble receipt = new AtomicDouble(0);
+        if (MathUtil.compare(shopOrderVo.getAccountAmount(), 0) > 0 && shopOrderVo.getStatus() != 0) {
+            receipt.set(MathUtil.add(receipt.get(), shopOrderVo.getAccountAmount()).doubleValue());
+        }
+        // 支付总金额 = 用户结算金额 + 付款金额
+        if(!discernReceiptList.isEmpty()) {
+            shopOrderVo.setReceiptAmount(MathUtil.add(receipt.get(), receiptAmount).doubleValue());
+        }
+        // 待付金额
+        shopOrderVo.setObligation(MathUtil.sub(shopOrderVo.getRealPay(), shopOrderVo.getReceiptAmount()).doubleValue());
+        return discernReceiptList;
+    }
+
+    public void setPostageInfo(ShopOrderVo shopOrder) {
+        // 冷链商品类型
+        List<Integer> arrList = new ArrayList<>();
+        List<OrderProductVo> orderProductList = orderCommonMapper.getShopOrderProduct(shopOrder.getShopOrderId());
+        orderProductList.removeIf(Objects::isNull);
+        // 冷链商品判定
+        List<Integer> collect = orderProductList.stream().map(OrderProductVo::getProductId).collect(Collectors.toList());
+        collect.removeIf(c -> c == 999);
+        if (collect.stream().allMatch(c -> c == 7881)) {
+            arrList.add(1);
+        } else if (!collect.contains(7881)) {
+            arrList.add(2);
+        } else {
+            arrList.add(3);
+        }
+        // 冷链运输费 -- 联合丽格
+        if (null != shopOrder.getIsColdChina() && 1 == shopOrder.getIsColdChina()) {
+            shopOrder.setColdChina(700.00d);
+        } else {
+            shopOrder.setColdChina(0.00d);
+        }
+        // 拼接运费信息--联合丽格
+        if (null != shopOrder.getColdChina() && null != shopOrder.getIsColdChina() && 1 == shopOrder.getIsColdChina()) {
+            String open = "";
+            String close = "";
+            if (shopOrder.getIsColdChina()==1) {
+                open = "(";
+                close = ")";
+            } else if (!arrList.stream().allMatch(c -> c == 1)) {
+                open = "(";
+                close = ")";
+            } else {
+                open = "";
+                close = "";
+            }
+            if (2 == shopOrder.getShopPostFlag()) {
+                // 到付
+                shopOrder.setPostageInfo("¥" + MathUtil.add(shopOrder.getShopPostFee(), shopOrder.getColdChina()).doubleValue() + open +(shopOrder.getIsColdChina()==1?"冷链费: ¥" + shopOrder.getColdChina().doubleValue():"") + (arrList.stream().allMatch(c -> c == 1)?"":" 其他: 到付")+close);
+            } else if (0 == shopOrder.getShopPostFlag()) {
+                // 包邮
+                shopOrder.setPostageInfo("¥" + MathUtil.add(shopOrder.getShopPostFee(), shopOrder.getColdChina()).doubleValue() + open +(shopOrder.getIsColdChina()==1?"冷链费: ¥" + shopOrder.getColdChina().doubleValue():"") + (arrList.stream().allMatch(c -> c == 1)?"":" 其他: 包邮")+close);
+            } else {
+                // 有运费
+                shopOrder.setPostageInfo("¥" + MathUtil.add(shopOrder.getShopPostFee(), shopOrder.getColdChina()).doubleValue() + open +(shopOrder.getIsColdChina()==1?"冷链费: ¥" + shopOrder.getColdChina().doubleValue():"") + ((shopOrder.getShopPostFee() != null && shopOrder.getShopPostFee() != 0d)?" 其他: ¥" + shopOrder.getShopPostFee():"") + close);
+            }
+        } else {
+            shopOrder.setPostageInfo(shopOrder.getShopPostFlag() == 2?"到付":shopOrder.getShopPostFlag() == 0?"包邮":"¥" + shopOrder.getShopPostFee());
+        }
+    }
+
     /**
      * 设置搜索关键词历史记录
      *

+ 64 - 0
src/main/java/com/caimei365/order/components/OssService.java

@@ -0,0 +1,64 @@
+package com.caimei365.order.components;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+
+/**
+ * @author zzj
+ */
+@Slf4j
+@Service
+public class OssService {
+
+    public void download(HttpServletRequest request, HttpServletResponse response, String fileName) throws IOException {
+        File file = new File("./" + fileName);
+        //  文件存在才下载
+        if (file.exists()) {
+            OutputStream out = null;
+            FileInputStream in = null;
+            try {
+                // 1.读取要下载的内容
+                in = new FileInputStream(file);
+
+                // 2. 告诉浏览器下载的方式以及一些设置
+                // 解决文件名乱码问题,获取浏览器类型,转换对应文件名编码格式,IE要求文件名必须是utf-8, firefo要求是iso-8859-1编码
+                String agent = request.getHeader("user-agent");
+                if (agent.contains("FireFox")) {
+                    fileName = new String(fileName.getBytes("UTF-8"), "iso-8859-1");
+                } else {
+                    fileName = URLEncoder.encode(fileName, "UTF-8");
+                }
+                // 设置下载文件的mineType,告诉浏览器下载文件类型
+                String mineType = request.getServletContext().getMimeType(fileName);
+                response.setContentType(mineType);
+                // 设置一个响应头,无论是否被浏览器解析,都下载
+                response.setHeader("Content-disposition", "attachment; filename=" + fileName);
+                // 将要下载的文件内容通过输出流写到浏览器
+                out = response.getOutputStream();
+                int len = 0;
+                byte[] buffer = new byte[1024];
+                while ((len = in.read(buffer)) > 0) {
+                    out.write(buffer, 0, len);
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+            } finally {
+                if (out != null) {
+                    out.close();
+                }
+                if (in != null) {
+                    in.close();
+                }
+                file.delete();
+            }
+        }
+    }
+}

+ 188 - 23
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.PayOrderMapper;
 import com.caimei365.order.model.dto.VipSkuPriceDto;
 import com.caimei365.order.model.po.*;
 import com.caimei365.order.model.vo.*;
@@ -8,6 +9,7 @@ import com.caimei365.order.utils.MathUtil;
 import com.caimei365.order.utils.ImageUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.ArrayUtils;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
@@ -16,6 +18,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 +35,8 @@ public class ProductService {
     private String domain;
     @Resource
     private BaseMapper baseMapper;
+    @Resource
+    private PayOrderMapper payOrderMapper;
 
     /**
      * 设置商品图片及税费
@@ -110,7 +115,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,16 +184,16 @@ 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
         Integer organizeId = baseMapper.getOrganizeId(userId);
         // 返回数据初始化
         Map<String, Object> postageMap = new HashMap<>(4);
-        // 运费标志:0包邮 -1到付 1遵循运费规则
+        // 运费标志:0包邮 2到付 1遵循运费规则
         int postageFlag = 0;
         // 运费
         Double postage = 0.00d;
@@ -211,15 +216,13 @@ public class ProductService {
             postageFlagList = baseMapper.getPostageFlagOrganizeList(skuIdList);
         }
         // 是否包含需要冷链运输商品
-        if (0 != organizeId) {
-            List<Integer> collect = postageFlagList.stream().map(ProductPostageVo::getProductId).collect(Collectors.toList());
-            if (collect.stream().allMatch(c -> c == 7881)) {
-                postageMap.put("designatedFlag", 1);
-            } else if (!collect.contains(7881)) {
-                postageMap.put("designatedFlag", 2);
-            } else {
-                postageMap.put("designatedFlag", 3);
-            }
+        List<Integer> collect = postageFlagList.stream().map(ProductPostageVo::getProductId).collect(Collectors.toList());
+        if (collect.stream().allMatch(c -> c == 7881)) {
+            postageMap.put("designatedFlag", 1);
+        } else if (!collect.contains(7881)) {
+            postageMap.put("designatedFlag", 2);
+        } else {
+            postageMap.put("designatedFlag", 3);
         }
         if (null != postageFlagList && postageFlagList.size() > 0) {
             for (ProductPostageVo postageVo : postageFlagList) {
@@ -228,7 +231,7 @@ public class ProductService {
                     boolean flag = (null == postageVo.getCommodityType() || 2 == postageVo.getCommodityType() || (null != postageVo.getPostageFlag() && 1 == postageVo.getPostageFlag()));
                     if (flag) {
                         // 到付
-                        postageMap.put("postageFlag", -1);
+                        postageMap.put("postageFlag", 2);
                         postageMap.put("postage", 0.00d);
                         return postageMap;
                     } else if (null != postageVo.getPostageFlag() && 2 == postageVo.getPostageFlag()) {
@@ -269,7 +272,11 @@ public class ProductService {
                 postage = 15.00d;
             } else {
                 // 到付
-                postageFlag = -1;
+                postageFlag = 2;
+            }
+            // 只有冷链费商品 运费为0
+            if (1 == (Integer) postageMap.get("designatedFlag")) {
+                postage = 0d;
             }
             postageMap.put("postageFlag", postageFlag);
             postageMap.put("postage", postage);
@@ -359,19 +366,107 @@ public class ProductService {
      * 保存余额抵扣到收款记录
      *
      * @param balancePayFee 余额抵扣
-     * @param orderId       主订单Id
+     * @param shopOrderList 主订单Id
      * @param note          日志备注
      */
-    public void saveDiscernReceipt(Double balancePayFee, Integer orderId, String note) {
+    public void saveDiscernReceipt(Double balancePayFee, List<OrderShopPo> shopOrderList, String note) {
         Date date = new Date();
         String curDateStr = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(date);
+        ShopOrderVo shopOrderVo = new ShopOrderVo();
+        AtomicReference<Double> ba = new AtomicReference<>(balancePayFee);
+        shopOrderList.forEach(shopOrder -> {
+            double shopOrderPay = 0d;
+            if (MathUtil.compare(balancePayFee, shopOrder.getNeedPayAmount()) >= 0) {
+                shopOrder.setReceiptStatus(3);
+                shopOrderPay = shopOrder.getNeedPayAmount();
+            } else {
+                shopOrder.setReceiptStatus(2);
+                shopOrderPay = ba.get();
+            }
+            ba.updateAndGet(v -> ba.get() - shopOrder.getNeedPayAmount());
+            // 识别款项表
+            DiscernReceiptPo discernReceipt = new DiscernReceiptPo();
+            discernReceipt.setPayWay(3);
+            discernReceipt.setPayType(16);
+            discernReceipt.setReceiptType(1);
+            discernReceipt.setReceiptStatus(3);
+            discernReceipt.setReceiptAmount(shopOrderPay);
+            discernReceipt.setConfirmType(4);
+            discernReceipt.setReceiptDate(curDateStr);
+            discernReceipt.setConfirmDate(curDateStr);
+            discernReceipt.setReviewDate(curDateStr);
+            discernReceipt.setUpdateDate(curDateStr);
+            discernReceipt.setDelFlag(0);
+            // 保存 收款记录
+            baseMapper.insertDiscernReceipt(discernReceipt);
+            log.info(note + ">>>>>>>>>>>保存识别款项(insert[cm_discern_receipt])id:" + discernReceipt.getId() + ",shopOrderId:" + shopOrder.getShopOrderId());
+            // 收款项和订单关系表
+            OrderReceiptRelationPo relation = new OrderReceiptRelationPo();
+            relation.setReceiptId(discernReceipt.getId());
+            relation.setOrderId(shopOrder.getOrderId());
+            relation.setShopOrderId(shopOrder.getShopOrderId());
+            relation.setAssociateAmount(shopOrderPay);
+            relation.setRelationType(2);
+            relation.setDelFlag(0);
+            // 保存 收款项和订单关系
+            baseMapper.insertOrderReceiptRelation(relation);
+            //保存余额到余额收支记录
+            BalanceRecordPo balanceRecord = new BalanceRecordPo();
+            balanceRecord.setUserId(shopOrder.getUserId());
+            balanceRecord.setType(2);
+            balanceRecord.setBalanceType(1);
+            balanceRecord.setAddDate(new Date());
+            balanceRecord.setAmount(shopOrderPay);
+            balanceRecord.setOrderId(shopOrder.getOrderId());
+            balanceRecord.setShopOrderId(shopOrder.getShopOrderId());
+            balanceRecord.setRemark("机构自主订单");
+            balanceRecord.setDelFlag(0);
+            // 保存 余额收支记录
+            baseMapper.insertBalanceRecord(balanceRecord);
+            log.info("【提交订单】>>>>>>>>>>>>>>>>>>>>>>>>>>新增用户余额收支记录(insert[cm_user_balance_record])shopOrderId:" + shopOrder.getShopOrderId());
+            log.info(note + ">>>>>>>>>>>收款项和订单关系(insert[cm_receipt_order_relation])id:" + relation.getId() + ",shopOrderId:" + shopOrder.getShopOrderId());
+            // 修改子订单状态
+            shopOrderVo.setShopOrderId(shopOrder.getShopOrderId());
+            // 订单状态
+            shopOrderVo.setReceiptStatus(shopOrder.getReceiptStatus());
+            // 余额抵扣金额
+            shopOrderVo.setAccountAmount(shopOrderPay);
+            // 用户已付金额
+            shopOrderVo.setReceiptAmount(shopOrderPay);
+            // 余额抵扣状态
+            shopOrderVo.setUseBalanceFlag(1);
+            payOrderMapper.updateShopOrderBalancePay(shopOrderVo);
+
+        });
+
+    }
+
+    /**
+     * 保存余额抵扣到收款记录
+     * @param balancePayFee
+     * @param shopOrder
+     * @param note
+     */
+    public void saveShopOrderDiscernReceipt(Double balancePayFee, ShopOrderVo shopOrder, String note) {
+        Date date = new Date();
+        String curDateStr = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(date);
+        AtomicReference<Double> ba = new AtomicReference<>(balancePayFee);
+        double shopOrderPay = 0d;
+        if (MathUtil.compare(balancePayFee, shopOrder.getNeedPayAmount()) >= 0) {
+            shopOrder.setReceiptStatus(3);
+            shopOrderPay = shopOrder.getNeedPayAmount();
+        } else {
+            shopOrder.setReceiptStatus(2);
+            shopOrderPay = ba.get();
+        }
+        ba.updateAndGet(v -> ba.get() - shopOrder.getNeedPayAmount());
         // 识别款项表
         DiscernReceiptPo discernReceipt = new DiscernReceiptPo();
         discernReceipt.setPayWay(3);
         discernReceipt.setPayType(16);
         discernReceipt.setReceiptType(1);
         discernReceipt.setReceiptStatus(3);
-        discernReceipt.setReceiptAmount(balancePayFee);
+        discernReceipt.setReceiptAmount(shopOrderPay);
         discernReceipt.setConfirmType(4);
         discernReceipt.setReceiptDate(curDateStr);
         discernReceipt.setConfirmDate(curDateStr);
@@ -380,17 +475,41 @@ public class ProductService {
         discernReceipt.setDelFlag(0);
         // 保存 收款记录
         baseMapper.insertDiscernReceipt(discernReceipt);
-        log.info(note + ">>>>>>>>>>>保存识别款项(insert[cm_discern_receipt])id:" + discernReceipt.getId() + ",orderId:" + orderId);
+        log.info(note + ">>>>>>>>>>>保存识别款项(insert[cm_discern_receipt])id:" + discernReceipt.getId() + ",shopOrderId:" + shopOrder.getShopOrderId());
         // 收款项和订单关系表
         OrderReceiptRelationPo relation = new OrderReceiptRelationPo();
         relation.setReceiptId(discernReceipt.getId());
-        relation.setOrderId(orderId);
-        relation.setAssociateAmount(balancePayFee);
+        relation.setOrderId(shopOrder.getOrderId());
+        relation.setShopOrderId(shopOrder.getShopOrderId());
+        relation.setAssociateAmount(shopOrderPay);
         relation.setRelationType(2);
         relation.setDelFlag(0);
         // 保存 收款项和订单关系
         baseMapper.insertOrderReceiptRelation(relation);
-        log.info(note + ">>>>>>>>>>>收款项和订单关系(insert[cm_receipt_order_relation])id:" + relation.getId() + ",orderId:" + orderId);
+        //保存余额到余额收支记录
+        BalanceRecordPo balanceRecord = new BalanceRecordPo();
+        balanceRecord.setUserId(shopOrder.getUserId());
+        balanceRecord.setType(2);
+        balanceRecord.setBalanceType(1);
+        balanceRecord.setAddDate(new Date());
+        balanceRecord.setAmount(shopOrderPay);
+        balanceRecord.setOrderId(shopOrder.getOrderId());
+        balanceRecord.setShopOrderId(shopOrder.getShopOrderId());
+        balanceRecord.setRemark("协销订单");
+        balanceRecord.setDelFlag(0);
+        // 保存 余额收支记录
+        baseMapper.insertBalanceRecord(balanceRecord);
+        log.info("【提交订单】>>>>>>>>>>>>>>>>>>>>>>>>>>新增用户余额收支记录(insert[cm_user_balance_record])shopOrderId:" + shopOrder.getShopOrderId());
+        log.info(note + ">>>>>>>>>>>收款项和订单关系(insert[cm_receipt_order_relation])id:" + relation.getId() + ",shopOrderId:" + shopOrder.getShopOrderId());
+
+        // 修改子订单状态
+        shopOrder.setAccountAmount(shopOrderPay);
+        // 用户已付金额
+        shopOrder.setReceiptAmount(MathUtil.add(shopOrder.getReceiptAmount(),shopOrderPay).doubleValue());
+        // 余额抵扣状态
+        shopOrder.setUseBalanceFlag(1);
+        payOrderMapper.updateShopOrderBalancePay(shopOrder);
+
     }
 
     /**
@@ -440,4 +559,50 @@ public class ProductService {
             cartItemVo.setSvipTotalReducedPrice(MathUtil.mul(MathUtil.sub(cartItemVo.getOriginalPrice(), discountPrice), cartItemVo.getNumber()).doubleValue());
         }
     }
+
+    public void saveShopOrderDiscernReceipt(Double balancePayFee, ShopOrderVo order) {
+        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(balancePayFee);
+        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:" + order.getShopOrderId());
+        // 收款项和订单关系表
+        OrderReceiptRelationPo relation = new OrderReceiptRelationPo();
+        relation.setReceiptId(discernReceipt.getId());
+        relation.setOrderId(order.getOrderId());
+        relation.setShopOrderId(order.getShopOrderId());
+        relation.setAssociateAmount(balancePayFee);
+        relation.setRelationType(2);
+        relation.setDelFlag(0);
+        // 保存 收款项和订单关系
+        baseMapper.insertOrderReceiptRelation(relation);
+        log.info(">>>>>>>>>>>收款项和订单关系(insert[cm_receipt_order_relation])id:" + relation.getId() + ",shopOrderId:" + order.getShopOrderId());
+        //保存余额到余额收支记录
+        BalanceRecordPo balanceRecord = new BalanceRecordPo();
+        balanceRecord.setUserId(order.getUserId());
+        balanceRecord.setType(2);
+        balanceRecord.setBalanceType(1);
+        balanceRecord.setAddDate(new Date());
+        balanceRecord.setAmount(balancePayFee);
+        balanceRecord.setOrderId(order.getOrderId());
+        balanceRecord.setShopOrderId(order.getShopOrderId());
+        balanceRecord.setRemark("订单支付,余额抵扣");
+        balanceRecord.setDelFlag(0);
+        // 保存 余额收支记录
+        baseMapper.insertBalanceRecord(balanceRecord);
+        log.info("【订单支付,余额抵扣】>>>>>>>>>>>>>>>>>>>>>>>>>>新增用户余额收支记录(insert[cm_user_balance_record])shopOrderId:" + order.getShopOrderId());
+    }
 }

+ 5 - 1
src/main/java/com/caimei365/order/constant/Constant.java

@@ -11,6 +11,7 @@ public class Constant {
     public static final String SIGNATURE_TYPE = "SM3WITHSM2";
     //专票 信息 测试佣金暂入信息  308785626@qq.com vip/二手暂入信息
     public static final String CUSTOMERNUM = "E1807059160";
+    public static final String BCCMERCHANT = "E1807782723";
     //信息的邮箱
     public static final String XX_MAIL = "308785626@qq.com";
 
@@ -25,7 +26,10 @@ public class Constant {
     public static final String AT_MAIL = "caimei365@yeah.net";
 
     public static final String SPLIT = "&";
-
+    /**
+     * 分账回调地址
+     */
+    public static final String prodWYREFUND = "https://core.caimei365.com/order/pay/refund/split/callback";
     /**
      * 快捷支付地址
      */

+ 2 - 1
src/main/java/com/caimei365/order/controller/AddressApi.java

@@ -2,6 +2,7 @@ package com.caimei365.order.controller;
 
 import com.caimei365.order.model.ResponseJson;
 import com.caimei365.order.model.dto.AddressDto;
+import com.caimei365.order.model.po.AddressPo;
 import com.caimei365.order.model.vo.AddressSelectVo;
 import com.caimei365.order.model.vo.AddressVo;
 import com.caimei365.order.service.AddressService;
@@ -93,7 +94,7 @@ public class AddressApi {
      */
     @ApiOperation("保存收货地址(旧:/personalCenter/saveAddress)")
     @PostMapping("/save")
-    public ResponseJson<Integer> addUserAddress(AddressDto addressDto) {
+    public ResponseJson<AddressVo> addUserAddress(AddressDto addressDto) {
         if (null == addressDto.getUserId()) {
             return ResponseJson.error("用户Id不能为空!", null);
         }

+ 6 - 4
src/main/java/com/caimei365/order/controller/CartClubApi.java

@@ -202,18 +202,19 @@ public class CartClubApi {
     @ApiOperation("购物车结算(旧:/order/confirm)")
     @ApiImplicitParams({
             @ApiImplicitParam(required = false, name = "userId", value = "用户Id"),
+            @ApiImplicitParam(required = false, name = "townId", value = "地址"),
             @ApiImplicitParam(required = false, name = "skuIds", value = "skuIds,逗号隔开"),
             @ApiImplicitParam(required = false, name = "source", value = "来源 : 1 网站 ; 2 小程序")
     })
     @GetMapping("/cart/settlement")
-    public ResponseJson<Map<String, Object>> settlementShoppingCart(Integer userId, String skuIds, Integer source) {
+    public ResponseJson<Map<String, Object>> settlementShoppingCart(Integer userId, Integer townId, String skuIds, Integer source) {
         if (null == userId) {
             return ResponseJson.error("用户Id不能为空!", null);
         }
         if (StringUtils.isEmpty(skuIds)) {
             return ResponseJson.error("skuId集合不能为空!", null);
         }
-        return cartClubService.settlementShoppingCart(userId, skuIds, source);
+        return cartClubService.settlementShoppingCart(userId, townId, skuIds, source);
     }
 
     /**
@@ -249,17 +250,18 @@ public class CartClubApi {
     @GetMapping("/product/buynow")
     @ApiImplicitParams({
             @ApiImplicitParam(required = false, name = "userId", value = "用户Id"),
+            @ApiImplicitParam(required = false, name = "townId", value = "地址"),
             @ApiImplicitParam(required = false, name = "productInfo", value = "组合商品信息:Json字符串格式[{\"id\":4351,\"count\":1,\"skuId\":123},{}]"),
             @ApiImplicitParam(required = false, name = "source", value = "来源 : 1 网站 ; 2 小程序")
     })
-    public ResponseJson<Map<String, Object>> MultipleBuyNow(Integer userId, String productInfo, Integer source) {
+    public ResponseJson<Map<String, Object>> MultipleBuyNow(Integer userId, Integer townId, String productInfo, Integer source) {
         if (null == userId) {
             return ResponseJson.error("用户Id不能为空!", null);
         }
         if (StringUtils.isEmpty(productInfo)) {
             return ResponseJson.error("组合商品信息不能为空!", null);
         }
-        return cartClubService.MultipleBuyNow(userId, productInfo, source);
+        return cartClubService.MultipleBuyNow(userId, townId, productInfo, source);
     }
 
     /**

+ 3 - 3
src/main/java/com/caimei365/order/controller/CartSellerApi.java

@@ -209,7 +209,7 @@ public class CartSellerApi {
             @ApiImplicitParam(required = false, name = "skuIds", value = "skuIds,逗号隔开")
     })
     @GetMapping("/cart/settlement")
-    public ResponseJson<Map<String, Object>> settlementSellerCart(Integer serviceProviderId, Integer clubId, String skuIds) {
+    public ResponseJson<Map<String, Object>> settlementSellerCart(Integer serviceProviderId, Integer townId, Integer clubId, String skuIds) {
         if (null == serviceProviderId) {
             return ResponseJson.error("协销Id不能为空!", null);
         }
@@ -219,7 +219,7 @@ public class CartSellerApi {
         if (StringUtils.isEmpty(skuIds)) {
             return ResponseJson.error("skuId集合不能为空!", null);
         }
-        return cartSellerService.settlementSellerCart(serviceProviderId, clubId, skuIds);
+        return cartSellerService.settlementSellerCart(serviceProviderId, townId, clubId, skuIds);
     }
 
     /**
@@ -264,7 +264,7 @@ public class CartSellerApi {
         if (null == againBuyDto.getServiceProviderId()) {
             return ResponseJson.error("协销Id不能为空!", null);
         }
-        if (null == againBuyDto.getOrderId()) {
+        if (null == againBuyDto.getShopOrderId()) {
             return ResponseJson.error("订单Id不能为空!", null);
         }
         return cartSellerService.addCartBuyAgain(againBuyDto);

+ 38 - 15
src/main/java/com/caimei365/order/controller/HeliPayApi.java

@@ -133,26 +133,37 @@ public class HeliPayApi {
     }
 
     @ApiOperation("获取子订单信息")
-    @ApiImplicitParam(required = true, name = "orderId", value = "订单Id")
+    @ApiImplicitParams({
+            @ApiImplicitParam(required = true, name = "orderId", value = "订单Id"),
+            @ApiImplicitParam(required = true, name = "shopOrderId", value = "子订单Id")
+    })
+
     @GetMapping("/shoporders")
-    public ResponseJson<List<ShopOrderVo>> getShopOrders(Integer orderId) {
+    public ResponseJson<List<ShopOrderVo>> getShopOrders(Integer orderId, Integer shopOrderId) {
         if (null == orderId) {
-            return ResponseJson.error("订单Id不能为空!", null);
+            if (null == shopOrderId) {
+                return ResponseJson.error("子订单Id不能为空!", null);
+            }
         }
-        return heliPayService.getShopOrders(orderId);
+        if (null == shopOrderId) {
+            if (null == orderId) {
+                return ResponseJson.error("订单Id不能为空!", null);
+            }
+        }
+        return heliPayService.getShopOrders(orderId, shopOrderId);
     }
 
     /**
      * 订单支付前效验付款规则
      */
     @ApiOperation("订单支付前效验付款规则(旧:/order/paymentValidation)")
-    @ApiImplicitParam(required = false, name = "orderId", value = "订单Id")
+    @ApiImplicitParam(required = false, name = "shopOrderId", value = "订单Id")
     @GetMapping("/check")
-    public ResponseJson<Map<String, Object>> paymentValidation(Integer orderId) {
-        if (null == orderId) {
+    public ResponseJson<Map<String, Object>> paymentValidation(Integer shopOrderId) {
+        if (null == shopOrderId) {
             return ResponseJson.error("订单Id不能为空!", null);
         }
-        return payOrderService.payBeforeCheck(orderId);
+        return payOrderService.payBeforeCheck(shopOrderId);
     }
 
     /**
@@ -165,10 +176,10 @@ public class HeliPayApi {
     @ApiOperation("订单支付,余额抵扣(旧:/order/balanceDeduction)")
     @PostMapping("/balance/deduction")
     public ResponseJson<Map<String, Object>> balanceDeduction(PayDto payDto) {
-        if (null == payDto.getOrderId()) {
+        if (null == payDto.getShopOrderId()) {
             return ResponseJson.error("订单Id不能为空!", null);
         }
-        return payOrderService.balanceDeduction(payDto.getOrderId());
+        return payOrderService.balanceDeduction(payDto.getShopOrderId());
     }
 
     /**
@@ -184,13 +195,13 @@ public class HeliPayApi {
      * 收银台数据显示
      */
     @ApiOperation("收银台数据(旧:/PayOrder/checkoutCounter)")
-    @ApiImplicitParam(required = true, name = "orderId", value = "订单Id")
+    @ApiImplicitParam(required = true, name = "shopOrderId", value = "订单Id")
     @GetMapping("/checkout/counter")
-    public ResponseJson<Map<String, Object>> getCheckoutCounter(Integer orderId) {
-        if (null == orderId) {
+    public ResponseJson<Map<String, Object>> getCheckoutCounter(Integer shopOrderId) {
+        if (null == shopOrderId) {
             return ResponseJson.error("订单Id不能为空!", null);
         }
-        return payOrderService.getCheckoutCounter(orderId);
+        return payOrderService.getCheckoutCounter(shopOrderId);
     }
 
     /**
@@ -301,7 +312,7 @@ public class HeliPayApi {
             @ApiImplicitParam(required = false, name = "shopOrderId", value = "子订单Id")
     })
     @GetMapping("/result/union")
-    public ResponseJson<JSONObject> getUnionResult(String mbOrderId, Integer orderFlag, Integer shopOrderId) throws IntrospectionException, InvocationTargetException, IllegalAccessException {
+    public ResponseJson<JSONObject> getUnionResult(String mbOrderId, Integer orderFlag, Integer shopOrderId) {
         if (null == mbOrderId) {
             return ResponseJson.error("平台唯一流水号不能为空!", null);
         }
@@ -434,6 +445,18 @@ public class HeliPayApi {
         return heliPayService.delayedSplittingCallback(data);
     }
 
+    /**
+     * 网银退款手续费转回回调
+     */
+    @ApiOperation("网银退款手续费转回回调")
+    @PostMapping("/refund/split/callback")
+    public String refundSplittingCallback(AccountResVo data) {
+        if (null == data) {
+            return "回调参数失败";
+        }
+        return heliPayService.refundSplittingCallback(data);
+    }
+
     @ApiOperation("银行通道码获取")
     @GetMapping("/bankcode")
     public ResponseJson<Map<String, Object>> bankcode() {

+ 51 - 36
src/main/java/com/caimei365/order/controller/OrderClubApi.java

@@ -3,6 +3,7 @@ package com.caimei365.order.controller;
 import com.caimei365.order.model.ResponseJson;
 import com.caimei365.order.model.dto.OrderDto;
 import com.caimei365.order.model.dto.VoucherDto;
+import com.caimei365.order.model.po.ShopPo;
 import com.caimei365.order.model.vo.*;
 import com.caimei365.order.service.OrderClubService;
 import com.github.pagehelper.PageInfo;
@@ -59,7 +60,7 @@ public class OrderClubApi {
             @ApiImplicitParam(required = false, name = "pageSize", value = "每页数量")
     })
     @GetMapping("/list")
-    public ResponseJson<PageInfo<OrderVo>> getOrderList(Integer userId, Integer orderState, String orderNo, String beginTime, String endTime,
+    public ResponseJson<PageInfo<ShopOrderVo>> getOrderList(Integer userId, Integer orderState, String orderNo, String beginTime, String endTime,
                                                         @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
                                                         @RequestParam(value = "pageSize", defaultValue = "10") int pageSize) {
         if (null == userId) {
@@ -79,7 +80,7 @@ public class OrderClubApi {
             @ApiImplicitParam(required = false, name = "pageSize", value = "每页数量")
     })
     @GetMapping("/search")
-    public ResponseJson<PageInfo<OrderVo>> getOrderListByKeyword(Integer userId, String searchWord,
+    public ResponseJson<PageInfo<ShopOrderVo>> getOrderListByKeyword(Integer userId, String searchWord,
                                                         @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
                                                         @RequestParam(value = "pageSize", defaultValue = "10") int pageSize) {
         if (null == userId) {
@@ -97,17 +98,17 @@ public class OrderClubApi {
     @ApiOperation("机构订单详情(旧:/order/detail)")
     @ApiImplicitParams({
             @ApiImplicitParam(required = true, name = "userId", value = "用户Id"),
-            @ApiImplicitParam(required = true, name = "orderId", value = "订单Id")
+            @ApiImplicitParam(required = true, name = "shopOrderId", value = "订单Id")
     })
     @GetMapping("/detail")
-    public ResponseJson<Map<String, Object>> getOrderDetail(Integer userId, Integer orderId) {
+    public ResponseJson<Map<String, Object>> getOrderDetail(Integer userId, Integer shopOrderId) {
         if (null == userId) {
             return ResponseJson.error("用户Id不能为空!", null);
         }
-        if (null == orderId) {
+        if (null == shopOrderId) {
             return ResponseJson.error("订单Id不能为空!", null);
         }
-        return orderClubService.getOrderDetail(userId, orderId);
+        return orderClubService.getOrderDetail(userId, shopOrderId);
     }
 
     /**
@@ -144,10 +145,10 @@ public class OrderClubApi {
     @ApiOperation("机构确认订单(旧:/order/affirmOrder)")
     @PostMapping("/confirm")
     public ResponseJson<Void> confirmOrder(OrderDto orderDto){
-        if (null == orderDto.getOrderId()) {
+        if (null == orderDto.getShopOrderId()) {
             return ResponseJson.error("订单Id不能为空!", null);
         }
-        return orderClubService.confirmMainOrder(orderDto.getOrderId());
+        return orderClubService.confirmMainOrder(orderDto.getShopOrderId());
     }
 
     /**
@@ -161,10 +162,10 @@ public class OrderClubApi {
     @ApiOperation("机构取消订单(旧:/order/cancel)")
     @PostMapping("/cancel")
     public ResponseJson<Void> cancelOrder(OrderDto orderDto){
-        if (null == orderDto.getOrderId()) {
+        if (null == orderDto.getShopOrderId()) {
             return ResponseJson.error("订单Id不能为空!", null);
         }
-        return orderClubService.cancelMainOrder(orderDto.getOrderId(), orderDto.getUserIdentity(), orderDto.getRemark());
+        return orderClubService.cancelMainOrder(orderDto.getShopOrderId(), orderDto.getUserIdentity(), orderDto.getRemark());
     }
 
     /**
@@ -177,10 +178,10 @@ public class OrderClubApi {
     @ApiOperation("机构删除订单(旧:/order/delete)")
     @PostMapping("/delete")
     public ResponseJson<Void> deleteOrder(OrderDto orderDto){
-        if (null == orderDto.getOrderId()) {
+        if (null == orderDto.getShopOrderId()) {
             return ResponseJson.error("订单Id不能为空!", null);
         }
-        return orderClubService.deleteMainOrder(orderDto.getOrderId());
+        return orderClubService.deleteMainOrder(orderDto.getShopOrderId());
     }
 
     /**
@@ -193,10 +194,10 @@ public class OrderClubApi {
     @ApiOperation("机构确认收货(旧:/order/affirm)")
     @PostMapping("/receive")
     public ResponseJson<Void> receiveGoods(OrderDto orderDto){
-        if (null == orderDto.getOrderId()) {
+        if (null == orderDto.getShopOrderId()) {
             return ResponseJson.error("订单Id不能为空!", null);
         }
-        return orderClubService.receiveGoods(orderDto.getOrderId());
+        return orderClubService.receiveGoods(orderDto.getShopOrderId());
     }
 
     /**
@@ -229,26 +230,26 @@ public class OrderClubApi {
      * 物流详情
      */
     @ApiOperation("物流详情(旧:/order/logistics)")
-    @ApiImplicitParam(required = true, name = "orderId", value = "订单Id")
+    @ApiImplicitParam(required = true, name = "shopOrderId", value = "订单Id")
     @GetMapping("/logistics")
-    public ResponseJson<List<LogisticsBatchVo>> getOrderLogistics(Integer orderId) {
-        if (null == orderId) {
+    public ResponseJson<List<LogisticsBatchVo>> getOrderLogistics(Integer shopOrderId) {
+        if (null == shopOrderId) {
             return ResponseJson.error("订单Id不能为空!", null);
         }
-        return orderClubService.getOrderLogistics(orderId);
+        return orderClubService.getOrderLogistics(shopOrderId);
     }
 
     /**
      * 分享订单,获取分享码
      */
     @ApiOperation("分享订单,获取分享码(旧:/order/share)")
-    @ApiImplicitParam(required = true, name = "orderId", value = "订单Id")
+    @ApiImplicitParam(required = true, name = "shopOrdedId", value = "子订单Id")
     @GetMapping("/share/code")
-    public ResponseJson<String> getOrderShareCode(Integer orderId) {
-        if (null == orderId) {
+    public ResponseJson<String> getOrderShareCode(Integer shopOrderId) {
+        if (null == shopOrderId) {
             return ResponseJson.error("订单Id不能为空!", null);
         }
-        return orderClubService.getOrderShareCode(orderId);
+        return orderClubService.getOrderShareCode(shopOrderId);
     }
 
     /**
@@ -256,7 +257,7 @@ public class OrderClubApi {
      */
     @ApiOperation("分享订单,用户身份(旧:/order/shareCode)")
     @ApiImplicitParams({
-            @ApiImplicitParam(required = true, name = "orderId", value = "订单Id"),
+            @ApiImplicitParam(required = true, name = "shopOrderId", value = "订单Id"),
             @ApiImplicitParam(required = false, name = "userId", value = "用户Id"),
             @ApiImplicitParam(required = false, name = "serviceProviderId", value = "协销Id"),
             @ApiImplicitParam(required = false, name = "code", value = "微信code"),
@@ -264,19 +265,19 @@ public class OrderClubApi {
             @ApiImplicitParam(required = false, name = "iv", value = "微信加密算法的初始向量")
     })
     @GetMapping("/share/code/identity")
-    public ResponseJson<String> identityOrderShareCode( Integer orderId, Integer userId, Integer serviceProviderId, String code, String encryptedData, String iv, @RequestHeader HttpHeaders headers) {
+    public ResponseJson<String> identityOrderShareCode( Integer shopOrderId, Integer userId, Integer serviceProviderId, String code, String encryptedData, String iv, @RequestHeader HttpHeaders headers) {
         //head可能报错,不确定原因,版本回退
 
         if (null == userId) {
             return ResponseJson.error("用户Id不能为空!", null);
         }
-        if (null == orderId) {
+        if (null == shopOrderId) {
             return ResponseJson.error("订单Id不能为空!", null);
         }
         if (StringUtils.isEmpty(code)) {
             return ResponseJson.error("微信code不能为空!", null);
         }
-        return orderClubService.identityOrderShareCode(orderId, userId, serviceProviderId, code, encryptedData, iv, headers);
+        return orderClubService.identityOrderShareCode(shopOrderId, userId, serviceProviderId, code, encryptedData, iv, headers);
     }
 
     /**
@@ -284,15 +285,15 @@ public class OrderClubApi {
      */
     @ApiOperation("分享订单,校验分享码(旧:/order/shareCode)")
     @ApiImplicitParams({
-            @ApiImplicitParam(required = true, name = "orderId", value = "订单Id"),
+            @ApiImplicitParam(required = true, name = "shopOrderId", value = "订单Id"),
             @ApiImplicitParam(required = false, name = "shareCode", value = "分享码"),
             @ApiImplicitParam(required = false, name = "code", value = "微信code"),
             @ApiImplicitParam(required = false, name = "encryptedData", value = "微信加密数据"),
             @ApiImplicitParam(required = false, name = "iv", value = "微信加密算法的初始向量")
     })
     @GetMapping("/share/code/check")
-    public ResponseJson<String> checkOrderShareCode(Integer userId, Integer orderId, String shareCode, String code, String encryptedData, String iv, @RequestHeader HttpHeaders headers) {
-        if (null == orderId) {
+    public ResponseJson<String> checkOrderShareCode(Integer userId, Integer shopOrderId, String shareCode, String code, String encryptedData, String iv, @RequestHeader HttpHeaders headers) {
+        if (null == shopOrderId) {
             return ResponseJson.error("订单Id不能为空!", null);
         }
         if (StringUtils.isEmpty(shareCode)) {
@@ -301,7 +302,7 @@ public class OrderClubApi {
         if (StringUtils.isEmpty(code)) {
             return ResponseJson.error("微信code不能为空!", null);
         }
-        return orderClubService.checkOrderShareCode(userId, orderId, shareCode, code, encryptedData, iv, headers);
+        return orderClubService.checkOrderShareCode(userId, shopOrderId, shareCode, code, encryptedData, iv, headers);
     }
 
 
@@ -309,13 +310,13 @@ public class OrderClubApi {
      * 分享订单,初始商品数据
      */
     @ApiOperation("分享订单,初始商品数据(旧:/order/commodityData)")
-    @ApiImplicitParam(required = true, name = "orderId", value = "订单Id")
+    @ApiImplicitParam(required = true, name = "shopOrderId", value = "订单Id")
     @GetMapping("/share/product")
-    public ResponseJson<Map<String,Object>> getOrderShareInitProduct(Integer orderId) {
-        if (null == orderId) {
+    public ResponseJson<Map<String,Object>> getOrderShareInitProduct(Integer shopOrderId) {
+        if (null == shopOrderId) {
             return ResponseJson.error("订单Id不能为空!", null);
         }
-        return orderClubService.getOrderShareInitProduct(orderId);
+        return orderClubService.getOrderShareInitProduct(shopOrderId);
     }
 
     /**
@@ -332,10 +333,10 @@ public class OrderClubApi {
         if (null == orderDto.getUserId()) {
             return ResponseJson.error("用户Id不能为空!", null);
         }
-        if (null == orderDto.getOrderId()) {
+        if (null == orderDto.getShopOrderId()) {
             return ResponseJson.error("订单Id不能为空!", null);
         }
-        return orderClubService.secondPaymentConfirm(orderDto.getOrderId(), orderDto.getUserId());
+        return orderClubService.secondPaymentConfirm(orderDto.getShopOrderId(), orderDto.getUserId());
     }
 
     /**
@@ -350,4 +351,18 @@ public class OrderClubApi {
         }
         return orderClubService.getClauseById(clauseId);
     }
+
+    /**
+     * 查询供应商银行账户信息
+     * @param shopId
+     * @return
+     */
+    @ApiOperation("查询供应商银行账户信息")
+    @GetMapping("/getShopBank")
+    public ResponseJson<ShopPo> getShopBankAccount(Integer shopId) {
+        if (null == shopId) {
+            return ResponseJson.error(-1, "供应商Id不能为空",null);
+        }
+        return orderClubService.getShopBankAccount(shopId);
+    }
 }

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

@@ -0,0 +1,41 @@
+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("一次性接口,数据初始化")
+//    @GetMapping("/init")
+//    public ResponseJson refundShopOrder(){
+//        return orderRefundService.initShopOrder();
+//    }
+
+    @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);
+    }
+
+
+}

+ 9 - 8
src/main/java/com/caimei365/order/controller/OrderSellerApi.java

@@ -2,6 +2,7 @@ package com.caimei365.order.controller;
 
 import com.caimei365.order.model.ResponseJson;
 import com.caimei365.order.model.vo.OrderVo;
+import com.caimei365.order.model.vo.ShopOrderVo;
 import com.caimei365.order.service.OrderSellerService;
 import com.github.pagehelper.PageInfo;
 import io.swagger.annotations.Api;
@@ -50,21 +51,21 @@ public class OrderSellerApi {
     @ApiImplicitParams({
             @ApiImplicitParam(required = true, name = "serviceProviderId", value = "协销Id"),
             @ApiImplicitParam(required = false, name = "listType", value = "1:待确认,2:待付款,3:待发货,4:已发货,5:退货款"),
-            @ApiImplicitParam(required = false, name = "orderNo", value = "订单编号"),
+            @ApiImplicitParam(required = false, name = "shopOrderNo", value = "订单编号"),
             @ApiImplicitParam(required = false, name = "orderSubmitType", value = "1:自主订单, 2:协销或后台订单,3:组员订单"),
             @ApiImplicitParam(required = false, name = "groupServiceId", value = "组员协销id"),
             @ApiImplicitParam(required = false, name = "pageNum", value = "页码"),
             @ApiImplicitParam(required = false, name = "pageSize", value = "每页数量")
     })
     @GetMapping("/list")
-    public ResponseJson<PageInfo<OrderVo>> getOrderList(Integer serviceProviderId, Integer listType, Integer orderSubmitType,
-                                                        String orderNo, Integer groupServiceId,
-                                                        @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
-                                                        @RequestParam(value = "pageSize", defaultValue = "10") int pageSize) {
+    public ResponseJson<PageInfo<ShopOrderVo>> getOrderList(Integer serviceProviderId, Integer listType, Integer orderSubmitType,
+                                                            String shopOrderNo, Integer groupServiceId,
+                                                            @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
+                                                            @RequestParam(value = "pageSize", defaultValue = "10") int pageSize) {
         if (null == serviceProviderId) {
             return ResponseJson.error("协销Id不能为空!", null);
         }
-        return orderSellerService.getOrderList(serviceProviderId, listType, orderSubmitType, orderNo, groupServiceId, pageNum, pageSize);
+        return orderSellerService.getOrderList(serviceProviderId, listType, orderSubmitType, shopOrderNo, groupServiceId, pageNum, pageSize);
     }
 
     /**
@@ -80,7 +81,7 @@ public class OrderSellerApi {
             @ApiImplicitParam(required = false, name = "pageSize", value = "每页数量")
     })
     @GetMapping("/list/club")
-    public ResponseJson<PageInfo<OrderVo>> getOrderListClub(Integer serviceProviderId, Integer clubId, Integer listType, Integer orderSubmitType,
+    public ResponseJson<PageInfo<ShopOrderVo>> getOrderListClub(Integer serviceProviderId, Integer clubId, Integer listType, Integer orderSubmitType,
                                                             @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
                                                             @RequestParam(value = "pageSize", defaultValue = "10") int pageSize) {
         if (null == serviceProviderId) {
@@ -103,7 +104,7 @@ public class OrderSellerApi {
             @ApiImplicitParam(required = false, name = "pageSize", value = "每页数量")
     })
     @GetMapping("/search")
-    public ResponseJson<PageInfo<OrderVo>> getOrderListByKeyword(Integer serviceProviderId, String searchWord,
+    public ResponseJson<PageInfo<ShopOrderVo>> getOrderListByKeyword(Integer serviceProviderId, String searchWord,
                                                                  @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
                                                                  @RequestParam(value = "pageSize", defaultValue = "10") int pageSize) {
         if (null == serviceProviderId) {

+ 63 - 57
src/main/java/com/caimei365/order/controller/OrderSubmitApi.java

@@ -1,6 +1,7 @@
 package com.caimei365.order.controller;
 
 import com.caimei365.order.model.ResponseJson;
+import com.caimei365.order.model.dto.OrderProductDto;
 import com.caimei365.order.model.dto.RechargeDto;
 import com.caimei365.order.model.dto.SubmitDto;
 import com.caimei365.order.service.SubmitService;
@@ -10,18 +11,20 @@ import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.Map;
 
+
 /**
  * 提交订单API
  *
  * @author : Charles
  * @date : 2021/7/6
  */
-@Api(tags="提交订单API")
+@Api(tags = "提交订单API")
 @RestController
 @RequiredArgsConstructor
 @RequestMapping("/order/submit")
@@ -39,86 +42,76 @@ public class OrderSubmitApi {
      *                  "cartType":3,               //购买类型:(1自主下单(购物车),2自主下单(立即购买),3协销下单)
      *                  "serviceProviderId": 1378,  //协销ID(小程序忽略)
      *                  "clubCouponId": ""          //优惠券Id
-     *                   "orderSeen":               //订单对机构可见度,1可见,2不可见
+     *                  "orderSeen":               //订单对机构可见度,1可见,2不可见
      *                  "orderInfo": [              //【订单商品】
-     *                      { "shopId":1001,                         // 供应商Id
-     *                        "splitCode:E123123"       //分账号
-     *                        "note":备注,
-     *                        "productInfo":[                      // skuId,数量,赠品数,商品类型
-     *                              {"skuId": 2789, "productNum": 1, "presentNum":0,"productType":2},
-     *                              {"skuId": 2789, "productNum": 1, "presentNum":0,"productType":0}
-     *                          ]
-     *                      },{多个供应商商品数据结构同上}
+     *                  { "shopId":1001,                         // 供应商Id
+     *                  "splitCode:E123123"       //分账号
+     *                  "note":备注,
+     *                  "productInfo":[                      // skuId,数量,赠品数,商品类型
+     *                  {"skuId": 2789, "productNum": 1, "presentNum":0,"productType":2},
+     *                  {"skuId": 2789, "productNum": 1, "presentNum":0,"productType":0}
+     *                  ]
+     *                  },{多个供应商商品数据结构同上}
      *                  ],
      *                  "payInfo": {                //【订单金额】
-     *                      "orderShouldPayFee": 609.11,
-     *                      "balancePayFlag": 0,
-     *                      "clauseId": "2",
-     *                      "postage": "15",
-     *                      "postageFlag": 1,
-     *                      "userBeans": 100,//抵扣采美豆数量
-     *                      "rebateFlag":0,
-     *                      "rebateFee":0.00 //普通订单返佣服务费
+     *                  "orderShouldPayFee": 609.11,
+     *                  "balancePayFlag": 0,
+     *                  "clauseId": "2",
+     *                  "postage": "15",
+     *                  "postageFlag": 1,
+     *                  "userBeans": 100,//抵扣采美豆数量
+     *                  "rebateFlag":0,
+     *                  "rebateFee":0.00 //普通订单返佣服务费
      *                  },
      *                  "orderInvoice":             //【发票信息】
-     *                          {"type": 0 // 不开发票  }
-     *                      或: { // 普通发票
-     *                              "type": 1,
-     *                              "invoiceTitle": "企业抬头",
-     *                              "invoiceTitleType": 1,
-     *                              "corporationTaxNum": "XXX4156465465",
-     *                              "invoiceContent": "明细 "
-     *                          }
-     *                      或: { // 增值税发票
-     *                              "type": 2,
-     *                              "invoiceTitle": "单位名称",
-     *                              "corporationTaxNum": "NSRSBM97897",
-     *                              "registeredAddress": "注册地址",
-     *                              "registeredPhone": "15814011616",
-     *                              "openBank": "开户银行",
-     *                              "bankAccountNo": "987987465465464"
-     *                          }
-     *
-     *              }
+     *                  {"type": 0 // 不开发票  }
+     *                  或: { // 普通发票
+     *                  "type": 1,
+     *                  "invoiceTitle": "企业抬头",
+     *                  "invoiceTitleType": 1,
+     *                  "corporationTaxNum": "XXX4156465465",
+     *                  "invoiceContent": "明细 "
+     *                  }
+     *                  或: { // 增值税发票
+     *                  "type": 2,
+     *                  "invoiceTitle": "单位名称",
+     *                  "corporationTaxNum": "NSRSBM97897",
+     *                  "registeredAddress": "注册地址",
+     *                  "registeredPhone": "15814011616",
+     *                  "openBank": "开户银行",
+     *                  "bankAccountNo": "987987465465464"
+     *                  }
+     *                  <p>
+     *                  }
      */
-    @PostMapping("/verify")
-    public ResponseJson<Map<String,Object>> verify(SubmitDto submitDto) {
-        if (null == submitDto.getClubId()){
-            return ResponseJson.error("机构Id不能为空!", null);
-        }
-        if (StringUtils.isEmpty(submitDto.getOrderInfo())){
-            return ResponseJson.error("订单商品数据不能为空!", null);
-        }
-        return submitService.verify(submitDto);
-    }
 
 
     @ApiOperation("提交订单(旧:/order/submit)(/seller/order/submit)")
     @PostMapping("/generate")
-    public ResponseJson<Map<String, Object>> generateOrder(SubmitDto submitDto){
-        if(null == submitDto.getOrderSource()){
+    public ResponseJson<Map<String, Object>> generateOrder(SubmitDto submitDto) {
+        if (null == submitDto.getOrderSource()) {
             return ResponseJson.error("订单来源不能为空!", null);
         }
         // 1,www来源    2,crm来源    6,小程序来源
-        if (null == submitDto.getOrderSource()  || !(1 == submitDto.getOrderSource() || 2 == submitDto.getOrderSource() || 6 == submitDto.getOrderSource())) {
+        if (null == submitDto.getOrderSource() || !(1 == submitDto.getOrderSource() || 2 == submitDto.getOrderSource() || 6 == submitDto.getOrderSource())) {
             return ResponseJson.error("订单来源异常!", null);
         }
-        if(null == submitDto.getCartType()){
+        if (null == submitDto.getCartType()) {
             return ResponseJson.error("购买类型不能为空!", null);
         }
-        if(null == submitDto.getClubId()){
+        if (null == submitDto.getClubId()) {
             return ResponseJson.error("机构Id不能为空!", null);
         }
-        if(null == submitDto.getAddressId()){
+        if (null == submitDto.getAddressId()) {
             return ResponseJson.error("收货地址Id不能为空!", null);
         }
-        if (StringUtils.isEmpty(submitDto.getOrderInfo())){
+        if (StringUtils.isEmpty(submitDto.getOrderInfo())) {
             return ResponseJson.error("订单商品数据不能为空!", null);
         }
-        if (StringUtils.isEmpty(submitDto.getPayInfo())){
+        if (StringUtils.isEmpty(submitDto.getPayInfo())) {
             return ResponseJson.error("订单金额数据不能为空!", null);
         }
-        if (StringUtils.isEmpty(submitDto.getOrderInvoice())){
+        if (StringUtils.isEmpty(submitDto.getOrderInvoice())) {
             return ResponseJson.error("发票信息数据不能为空!", null);
         }
         if (3 == submitDto.getCartType() && null == submitDto.getServiceProviderId()) {
@@ -129,6 +122,7 @@ public class OrderSubmitApi {
 
     /**
      * 生成充值商品订单
+     *
      * @param rechargeDto {
      *                    serviceProviderId 协销id
      *                    clubId            机构id
@@ -139,7 +133,7 @@ public class OrderSubmitApi {
      */
     @ApiOperation("提交充值商品订单(旧:/order/submit/rechargeOrder)")
     @PostMapping("/recharge")
-    public ResponseJson<Map<String, Object>> generateRechargeOrder(RechargeDto rechargeDto){
+    public ResponseJson<Map<String, Object>> generateRechargeOrder(RechargeDto rechargeDto) {
         if (null == rechargeDto.getServiceProviderId()) {
             return ResponseJson.error("协销Id不能为空!", null);
         }
@@ -155,4 +149,16 @@ public class OrderSubmitApi {
         return submitService.generateRechargeOrder(rechargeDto);
     }
 
+    /**
+     * 生成充值商品订单
+     */
+    @ApiOperation("修改订单")
+    @PostMapping("/update")
+    public ResponseJson updateOrder(@RequestBody OrderProductDto orderProducts) {
+        if (null == orderProducts) {
+            return ResponseJson.error("订单不能为空!", null);
+        }
+        return submitService.updateOrder(orderProducts.getOrderProducts());
+    }
+
 }

+ 5 - 2
src/main/java/com/caimei365/order/controller/ReceiptApi.java

@@ -36,7 +36,8 @@ import java.util.Map;
 public class ReceiptApi {
     private final ReceiptService receiptService;
 
-    @Resource private cmOfflineCollectionService collectionService;
+    @Resource
+    private cmOfflineCollectionService collectionService;
 
     /**
      * 线下收款用户微信授权
@@ -99,6 +100,7 @@ public class ReceiptApi {
 
     /**
      * 获取后台配置显示银行账户配置信息
+     *
      * @return
      */
     @ApiOperation("获取银行账户配置信息")
@@ -172,7 +174,8 @@ public class ReceiptApi {
             @ApiImplicitParam(required = false, name = "pageSize", value = "每页数量")
     })
     @GetMapping("/list")
-    public ResponseJson<PageInfo<ReceiptVo>> getReceiptList(Integer newReceiptType, Integer receiptType, Integer receiptStatus, String smsContent, String startDate, String endDate,
+    public ResponseJson<PageInfo<ReceiptVo>> getReceiptList(Integer newReceiptType, Integer receiptType, Integer receiptStatus,
+                                                            String smsContent, String startDate, String endDate,
                                                             @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
                                                             @RequestParam(value = "pageSize", defaultValue = "10") int pageSize,
                                                             @RequestHeader HttpHeaders headers) {

+ 145 - 33
src/main/java/com/caimei365/order/controller/ShipApi.java

@@ -1,18 +1,23 @@
 package com.caimei365.order.controller;
 
+import com.alibaba.excel.EasyExcel;
 import com.caimei365.order.model.ResponseJson;
-import com.caimei365.order.model.dto.JsonParamsDto;
-import com.caimei365.order.model.dto.LogisticsBatchDto;
-import com.caimei365.order.model.dto.LogisticsDto;
+import com.caimei365.order.model.dto.*;
 import com.caimei365.order.model.vo.*;
 import com.caimei365.order.service.ShipService;
 import com.github.pagehelper.PageInfo;
 import io.swagger.annotations.*;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.http.HttpHeaders;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.net.URLEncoder;
 import java.util.List;
 import java.util.Map;
 
@@ -22,10 +27,11 @@ import java.util.Map;
  * @author : Charles
  * @date : 2021/8/5
  */
-@Api(tags="供应商发货API")
+@Api(tags = "供应商发货API")
 @RestController
 @RequiredArgsConstructor
 @RequestMapping("/order/shop")
+@Slf4j
 public class ShipApi {
     private final ShipService shipService;
 
@@ -40,17 +46,21 @@ public class ShipApi {
             @ApiImplicitParam(required = false, name = "payStatus", value = "结算状态"),
             @ApiImplicitParam(required = false, name = "shopOrderNo", value = "订单编号"),
             @ApiImplicitParam(required = false, name = "receiver", value = "买家名称(收货人)"),
+            @ApiImplicitParam(required = false, name = "refundStatus", value = "退款状态"),
+            @ApiImplicitParam(required = false, name = "receiptStatus", value = "收款状态"),
+            @ApiImplicitParam(required = false, name = "organizeId", value = "订单来源"),
             @ApiImplicitParam(required = false, name = "pageNum", value = "页码"),
             @ApiImplicitParam(required = false, name = "pageSize", value = "每页数量")
     })
     @GetMapping("/list")
-    public ResponseJson<PageInfo<ShopOrderVo>> getShopOrderList(Integer shopId, Integer sendOutStatus, Integer payStatus, String shopOrderNo, String receiver,
-                                                        @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
-                                                        @RequestParam(value = "pageSize", defaultValue = "10") int pageSize) {
+    public ResponseJson<PageInfo<ShopOrderVo>> getShopOrderList(Integer shopId, Integer sendOutStatus, Integer payStatus,
+                                                                String shopOrderNo, String receiver, Integer refundStatus, Integer receiptStatus, Integer organizeId,
+                                                                @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
+                                                                @RequestParam(value = "pageSize", defaultValue = "10") int pageSize) {
         if (null == shopId) {
             return ResponseJson.error("供应商Id不能为空!", null);
         }
-        return shipService.getShopOrderList(shopId, sendOutStatus, payStatus, shopOrderNo, receiver, pageNum, pageSize);
+        return shipService.getShopOrderList(shopId, sendOutStatus, payStatus, shopOrderNo, receiver, refundStatus, receiptStatus, organizeId, pageNum, pageSize);
     }
 
     /**
@@ -62,17 +72,49 @@ public class ShipApi {
             @ApiImplicitParam(required = false, name = "shopOrderNo", value = "订单编号"),
             @ApiImplicitParam(required = false, name = "payStatus", value = "结算状态"),
             @ApiImplicitParam(required = false, name = "name", value = "买家名称"),
+            @ApiImplicitParam(required = false, name = "beginTime", value = "订单开始时间"),
+            @ApiImplicitParam(required = false, name = "endTime", value = "订单结束时间"),
+            @ApiImplicitParam(required = false, name = "refundStatus", value = "退款状态"),
             @ApiImplicitParam(required = false, name = "pageNum", value = "页码"),
             @ApiImplicitParam(required = false, name = "pageSize", value = "每页数量")
     })
     @GetMapping("/settlement/list")
-    public ResponseJson<PageInfo<SettlementVo>> getSettlementList(Integer shopId, String shopOrderNo, Integer payStatus, String name,
+    public ResponseJson<PageInfo<SettlementVo>> getSettlementList(Integer shopId, String shopOrderNo, Integer payStatus,
+                                                                  String name, String beginTime, String endTime, Integer refundStatus,
                                                                   @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
                                                                   @RequestParam(value = "pageSize", defaultValue = "10") int pageSize) {
         if (null == shopId) {
             return ResponseJson.error("供应商Id不能为空!", null);
         }
-        return shipService.getSettlementList(shopId, payStatus, shopOrderNo, name, pageNum, pageSize);
+        return shipService.getSettlementList(shopId, payStatus, shopOrderNo, name, beginTime, endTime, refundStatus, pageNum, pageSize);
+    }
+
+    /**
+     *导出结算列表
+     * @param shopId
+     * @param shopOrderNo
+     * @param payStatus
+     * @param name
+     * @param beginTime
+     * @param endTime
+     * @param refundStatus
+     * @param response
+     */
+    @PostMapping("/exportExcel")
+    public void exportExcel(Integer shopId, String shopOrderNo, Integer payStatus, String name, String beginTime, String endTime, Integer refundStatus, HttpServletResponse response) {
+        String file = "结算列表数据";
+        try {
+            List<SettlementDto> list = shipService.exportExcel(shopId, payStatus, shopOrderNo, name, beginTime, endTime, refundStatus);
+            SettlementDto settLementDto = new SettlementDto();
+            response.setContentType("application/vnd.ms-excel");
+            response.setCharacterEncoding("utf-8");
+            // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
+            String fileName = URLEncoder.encode(file, "UTF-8").replaceAll("\\+", "%20");
+            response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
+            EasyExcel.write(response.getOutputStream(), settLementDto.getClass()).autoCloseStream(Boolean.TRUE).sheet("数据").doWrite(list);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
     }
 
     /**
@@ -94,7 +136,7 @@ public class ShipApi {
     @ApiOperation("供应商售货清单(旧:/supplier/salesList)")
     @ApiImplicitParam(required = true, name = "shopOrderId", value = "子订单Id")
     @GetMapping("/sales/list")
-    public ResponseJson<Map<String, Object>> getSalesList(Integer shopOrderId){
+    public ResponseJson<Map<String, Object>> getSalesList(Integer shopOrderId) {
         if (null == shopOrderId) {
             return ResponseJson.error("参数不能为空!", null);
         }
@@ -132,13 +174,13 @@ public class ShipApi {
      *                     note: 备注信息,
      *                     image: 图片备注以##隔开,
      *                     logistics:[  // 物流信息
-     *                          {number:'45646464646',logisticsCompanyName:'顺丰物流',logisticsCompanyCode:'物流英文代码'},
-     *                          {number:'45646464646',logisticsCompanyName:'顺丰物流',logisticsCompanyCode:'物流英文代码'}
-     *                        ],
+     *                     {number:'45646464646',logisticsCompanyName:'顺丰物流',logisticsCompanyCode:'物流英文代码'},
+     *                     {number:'45646464646',logisticsCompanyName:'顺丰物流',logisticsCompanyCode:'物流英文代码'}
+     *                     ],
      *                     products:[   // 商品信息
-     *                          {orderProductId:订单商品id,num:此次发货数量},
-     *                          {orderProductId:订单商品id,num:此次发货数量}
-     *                        ],
+     *                     {orderProductId:订单商品id,num:此次发货数量},
+     *                     {orderProductId:订单商品id,num:此次发货数量}
+     *                     ],
      *                     }
      */
     @ApiOperation("供应商发货(旧:/supplier/addLogistics)")
@@ -179,7 +221,7 @@ public class ShipApi {
      * 供应商撤销发货
      *
      * @param logisticsBatchDto {
-     *                              logisticsBatchId: 发货批次表Id
+     *                          logisticsBatchId: 发货批次表Id
      *                          }
      */
     @ApiOperation("供应商撤销发货(旧:/supplier/cancelShipment)")
@@ -208,13 +250,13 @@ public class ShipApi {
      * 发货记录-添加物流
      *
      * @param logisticsBatchDto {
-     *                              logisticsBatchId: 发货批次表Id,
-     *                              remark: 备注,
-     *                              remarkImage: 图片备注,
-     *                              logistics:[  // 物流信息
-     *                                  {number:'45646464646',logisticsCompanyName:'顺丰物流',logisticsCompanyCode:'物流英文代码'},
-     *                                  {number:'45646464646',logisticsCompanyName:'顺丰物流',logisticsCompanyCode:'物流英文代码'}
-     *                              ]
+     *                          logisticsBatchId: 发货批次表Id,
+     *                          remark: 备注,
+     *                          remarkImage: 图片备注,
+     *                          logistics:[  // 物流信息
+     *                          {number:'45646464646',logisticsCompanyName:'顺丰物流',logisticsCompanyCode:'物流英文代码'},
+     *                          {number:'45646464646',logisticsCompanyName:'顺丰物流',logisticsCompanyCode:'物流英文代码'}
+     *                          ]
      *                          }
      */
     @ApiOperation("发货记录-添加物流(旧:/supplier/addLogisticsInfo)")
@@ -228,8 +270,9 @@ public class ShipApi {
 
     /**
      * 扫码添加物流
-     * @param number      快递单号
-     * @param mobile      收/寄件人的电话号码(顺丰必填)
+     *
+     * @param number 快递单号
+     * @param mobile 收/寄件人的电话号码(顺丰必填)
      */
     @ApiOperation("扫码添加物流(旧:/supplier/scanLogistics)")
     @ApiImplicitParams({
@@ -302,7 +345,8 @@ public class ShipApi {
             @ApiImplicitParam(required = false, name = "iv", value = "微信加密算法的初始向量")
     })
     @GetMapping("/share/code/check")
-    public ResponseJson<Map<String, Object>> checkShipShareCode( Integer source, Integer shopOrderId, String shareCode, String code, String encryptedData, String iv, @RequestHeader HttpHeaders headers) {
+    public ResponseJson<Map<String, Object>> checkShipShareCode(Integer source, Integer shopOrderId, String shareCode,
+                                                                String code, String encryptedData, String iv, @RequestHeader HttpHeaders headers) {
         if (null == source) {
             return ResponseJson.error("来源不能为空!", null);
         }
@@ -337,15 +381,83 @@ public class ShipApi {
      * 保存商品资质
      *
      * @param jsonParamsDto params:[{
-     *                         recordId: 商品发货记录id,
-     *                         sn:       sn码,
-     *                         files:    [{fileName:"文件名称",ossName:"oss文件名称"},{fileName:"文件名称",ossName:"oss文件名称"}...]
-     *                         images:   ["图片","图片",...]
-     *                         }, {}]
+     *                      recordId: 商品发货记录id,
+     *                      sn:       sn码,
+     *                      files:    [{fileName:"文件名称",ossName:"oss文件名称"},{fileName:"文件名称",ossName:"oss文件名称"}...]
+     *                      images:   ["图片","图片",...]
+     *                      }, {}]
      */
     @ApiOperation("上传商品资质(旧:/supplier/qualification)")
     @PostMapping("/qualification/save")
     public ResponseJson<Void> saveProductQualification(JsonParamsDto jsonParamsDto) {
         return shipService.saveProductQualification(jsonParamsDto);
     }
+
+    /**
+     * 更改收款状态 -- 确认收款
+     *
+     * @param amount
+     * @param shopOrderId
+     * @return
+     */
+    @GetMapping("/check/receipt")
+    public ResponseJson checkReceipt(Double amount, Integer shopOrderId) {
+        if (null == amount || null == shopOrderId) {
+            return ResponseJson.error("参数不能为空!");
+        }
+        return shipService.checkReceipt(amount, shopOrderId);
+    }
+
+    /**
+     * 订单备注详情
+     *
+     * @param shopOrderId
+     * @return
+     */
+    @ApiOperation("订单备注详情")
+    @GetMapping(value = "/remarksView")
+    public ResponseJson<List<OrderRemarkDto>> remarksView(Integer shopOrderId) {
+        List<OrderRemarkDto> remarksList = shipService.findList(shopOrderId);
+        return ResponseJson.success(remarksList);
+    }
+
+    /**
+     * 添加订单备注
+     *
+     * @param remark
+     * @return
+     */
+    @ApiOperation("添加订单备注")
+    @PostMapping(value = "/add/remark")
+    public ResponseJson addRemark(@RequestBody OrderRemarkDto remark) {
+        shipService.insertRemark(remark);
+        return ResponseJson.success();
+    }
+
+    /**
+     * 上传备注文件
+     *
+     * @param file
+     * @param orderId
+     * @return
+     */
+    @ApiOperation("上传备注文件")
+    @PostMapping("/upload/remark")
+    public ResponseJson<Map<String, Object>> uploadFile(MultipartFile file, Integer orderId) {
+        return shipService.upload(file, orderId);
+    }
+
+    /**
+     * 下载备注文件
+     *
+     * @param fileId
+     * @param request
+     * @param response
+     * @throws IOException
+     */
+    @ApiOperation("下载备注文件")
+    @PostMapping("/download/remark")
+    public void downFile(Integer fileId, HttpServletRequest request, HttpServletResponse response) throws IOException {
+        shipService.downFile(fileId, request, response);
+    }
 }

+ 7 - 0
src/main/java/com/caimei365/order/mapper/AddressMapper.java

@@ -35,6 +35,13 @@ public interface AddressMapper {
      * @param cityId
      */
     List<AddressSelectVo> getTownListByCityId(Integer cityId);
+
+    /**
+     * 根据townId查询
+     * @param townId
+     * @return
+     */
+    AddressVo getAddressByTownId(Integer townId);
     /**
      * 地址Id获取收货地址
      * @param addressId 地址Id

+ 80 - 13
src/main/java/com/caimei365/order/mapper/BaseMapper.java

@@ -20,6 +20,7 @@ import java.util.List;
 public interface BaseMapper {
     /**
      * 获取用户组织Id -- userId
+     *
      * @param userId
      * @return
      */
@@ -27,28 +28,36 @@ public interface BaseMapper {
 
     /**
      * 获取用户组织Id -- shopOrderId
+     *
      * @param shopOrderId
      * @return
      */
     Integer getOrganizeIdShop(@Param("shopOrderId") Integer shopOrderId);
+
     /**
      * 供应商名称
+     *
      * @param shopId 供应商Id
      */
     String getShopNameById(Integer shopId);
+
     /**
      * 供应商名称
+     *
      * @param clubId 供应商Id
      */
     String getClubNameById(Integer clubId);
+
     /**
      * 获取商品供应商Id
+     *
      * @param skuId skuId
      */
     Integer getShopIdByproductId(Integer skuId);
 
     /**
      * 获取机构一级分类
+     *
      * @param clubId
      * @return
      */
@@ -56,152 +65,200 @@ public interface BaseMapper {
 
     /**
      * 商品对应械字号类型
+     *
      * @param skuIds
      * @return
      */
     List<String> machineTypeByID(List<String> skuIds);
+
     /**
      * 获取机构用户Id
+     *
      * @param clubId 机构Id
      */
     Integer getUserIdByClubId(Integer clubId);
+
     /**
      * 根据用户Id查询用户身份
      */
     Integer getIdentityByUserId(Integer userId);
+
     /**
      * 根据用户Id查询公司名
      */
     String getUserNameByUserId(Integer userId);
+
     /**
      * 根据用户Id查询手机号
      */
     String getBindMobileByUserId(Integer userId);
+
     /**
      * 根据商品ID查询阶梯价列表
      */
     List<LadderPriceVo> getLadderPriceList(Integer skuId);
+
     /**
      * 根据skuId和用户ID 查询复购价
      */
     Double getRepurchasePrice(@Param("skuId") Integer skuId, @Param("userId") Integer userId);
+
     /**
      * 供应商促销优惠活动
+     *
      * @param shopId 供应商Id
      */
     PromotionsVo getPromotionByShopId(Integer shopId);
+
     /**
      * 商品促销优惠活动
+     *
      * @param productId 商品Id
      */
     PromotionsVo getPromotionByProductId(Integer productId);
+
     /**
      * 促销优惠活动赠品列表
+     *
      * @param promotionsId 促销Id
      */
     List<CartItemVo> getPromotionGifts(Integer promotionsId);
+
     /**
      * 根据商品Id获取供应商
+     *
      * @param productId 商品Id
      */
     CartShopVo getShopByProductId(Integer productId);
+
     /**
      * 发票信息
+     *
      * @param userId 用户Id
      */
     InvoiceVo getUserInvoice(Integer userId);
+
     /**
      * 根据用户Id获取用户余额
+     *
      * @param userId 用户Id
      */
     Double getUserMoney(Integer userId);
+
     /**
      * 可用余额
+     *
      * @param userId 用户Id
      */
     Double getAbleUserMoney(Integer userId);
+
     /**
      * 可用采美豆
+     *
      * @param userId 用户Id
      */
     Integer getUserBeans(Integer userId);
+
     /**
      * 获取商品运费 (0包邮 1到付 2默认(遵循运费规则))
-     * @param skuIds    skuId列表
+     *
+     * @param skuIds skuId列表
      */
     List<ProductPostageVo> getPostageFlagList(@Param("skuIds") List<String> skuIds);
+
     /**
      * 获取商品运费 (0包邮 1到付 2默认(遵循运费规则)) -- 组织
-     * @param skuIds    skuId列表
+     *
+     * @param skuIds skuId列表
      */
     List<ProductPostageVo> getPostageFlagOrganizeList(@Param("skuIds") List<String> skuIds);
 
     /**
      * 获取购物车商品数据
+     *
      * @param userId
      * @param skuIds
      * @return
      */
     List<CartPo> getCart(Integer userId, @Param("skuIds") List<String> skuIds);
+
     /**
      * 统计用户订单数
+     *
      * @param userId 用户Id
      */
     Integer countUserOrder(Integer userId);
+
     /**
      * 获取根据地区Id获取省市地址信息
+     *
      * @param townId 地区Id
      */
     AddressVo getProvinceIdAndCityId(Integer townId);
+
     /**
      * 获取详细地址信息
+     *
      * @param addressId 地址Id
      */
     Integer getTownIdByAddressId(Integer addressId);
+
     /**
      * 更新用户增值税发票
      */
     void updateUserInvoiceByUserId(InvoiceVo invoice);
+
     /**
      * 新增用户增值税发票
      */
     void insertUserInvoiceByUserId(InvoiceVo userInvoice);
+
     /**
      * 查询当前商品复购价信息
-     * @param userId    机构用户Id
-     * @param skuId     skuId
+     *
+     * @param userId 机构用户Id
+     * @param skuId  skuId
      */
     PurchasePricePo getPurchasePricePo(Integer userId, Integer skuId);
+
     /**
      * 更新复购价格库
      */
     void updatePurchasePrice(PurchasePricePo purchase);
+
     /**
      * 新增复购价格库
      */
     void insertPurchasePrice(PurchasePricePo purchase);
+
     /**
      * 新增历史复购价记录
      */
     void insertPurchaseHistory(PurchaseHistoryPo purchaseHistory);
+
     /**
      * 保存 收款记录
      */
     void insertDiscernReceipt(DiscernReceiptPo discernReceipt);
+
     /**
      * 保存 收款项和订单关系
      */
     void insertOrderReceiptRelation(OrderReceiptRelationPo relation);
+
     /**
      * 保存 采美豆使用记录
      */
     void insertBeansHistory(UserBeansHistoryPo beansHistory);
+
     /**
      * 更新用户剩余采美豆数量
+     *
      * @param userBeans 采美豆数量
-     * @param userId 机构用户Id
+     * @param userId    机构用户Id
      */
     void updateUserBeans(Integer userId, int userBeans);
+
     /**
      * 抵扣后更新用户余额
      *
@@ -210,31 +267,37 @@ public interface BaseMapper {
      * @param userId        机构用户Id
      */
     void updateUserMoney(Double userMoney, Double ableUserMoney, Integer userId);
+
     /**
      * 保存余额到余额收支记录
      */
     void insertBalanceRecord(BalanceRecordPo balanceRecord);
+
     /**
      * 获取条款列表
      */
     List<ClauseVo> getClauseList();
+
     /**
      * 查询超级会员用户id
-     * @param userId    用户id
+     *
+     * @param userId 用户id
      * @return
      */
     Integer getSvipUserIdByUserId(Integer userId);
 
     /**
      * 查询超级会员用户id
-     * @param clubId    机构id
+     *
+     * @param clubId 机构id
      * @return
      */
     Integer getSvipUserIdByClubId(Integer clubId);
 
     /**
      * 查询机构状态
-     * @param userId    用户id
+     *
+     * @param userId 用户id
      * @return
      */
     Integer getClubStatus(Integer userId);
@@ -250,24 +313,26 @@ public interface BaseMapper {
     /**
      * 更新user机构状态
      *
-     * @param clubStatus    机构状态
-     * @param userId        用户id
+     * @param clubStatus 机构状态
+     * @param userId     用户id
      */
     void updateUserClubStatus(@Param("clubStatus") int clubStatus, @Param("userId") Integer userId);
 
     /**
      * 更新club机构状态
      *
-     * @param clubStatus    机构状态
-     * @param userId        用户id
+     * @param clubStatus 机构状态
+     * @param userId     用户id
      */
     void updateClubStatus(@Param("clubStatus") int clubStatus, @Param("userId") Integer userId);
 
     UserBeansHistoryPo findLowOrder(Integer orderId);
 
     Integer findBeans(Integer userId);
+
     /**
      * 查询认证通用户名称
+     *
      * @param userId
      * @return
      */
@@ -283,5 +348,7 @@ public interface BaseMapper {
 
     VipSkuPriceDto getSvipSku(Integer skuId);
 
-    Double getTouchPriceBySku(Integer skuId,Integer promotionId);
+    Double getTouchPriceBySku(Integer skuId, Integer promotionId);
+
+    List<BalanceRecordPo> findShopOrderBalanceRecord(Integer shopOrderId);
 }

+ 6 - 0
src/main/java/com/caimei365/order/mapper/CartClubMapper.java

@@ -77,6 +77,12 @@ public interface CartClubMapper {
      */
     List<CartShopVo> getCartShopsByProductIds(@Param("userId") Integer userId, @Param("skuIds") List<String> skuIds,@Param("status")Integer status);
 
+    /**
+     * 商品能否退货
+     * @param skuIds
+     * @return
+     */
+    List<CartShopVo> getProductReturnGoodsStutas(@Param("skuIds") List<String> skuIds);
     /**
      * 根据商品ids获取供应商列表
      * @param productIds

+ 10 - 4
src/main/java/com/caimei365/order/mapper/CartSellerMapper.java

@@ -99,19 +99,25 @@ public interface CartSellerMapper {
     CartItemVo getSecondByProductId(Integer productId);
     /**
      * 获取订单里用户Id
-     * @param orderId 订单Id
+     * @param shopOrderId 订单Id
      */
-    Integer getOrderUserIdByOrderId(Integer orderId);
+    Integer getOrderUserIdByShopOrderId(Integer shopOrderId);
     /**
      * 获取订单里用户Id
-     * @param orderId 订单Id
+     * @param shopOrderId 订单Id
      */
-    Integer getOrderClubIdByOrderId(Integer orderId);
+    Integer getOrderClubIdByShopOrderId(Integer shopOrderId);
     /**
      * 获取订单商品的商品数量列表
      * @param orderId 订单Id
      */
     List<CartItemVo> getOrderProductNum(Integer orderId);
 
+    /**
+     * 获取订单商品的商品数量列表
+     * @param shopOrderId 订单Id
+     */
+    List<CartItemVo> getShopOrderProductNum(Integer shopOrderId);
+
     void deleteClubCart(SellerCartDto sellerCartDto);
 }

+ 102 - 3
src/main/java/com/caimei365/order/mapper/OrderClubMapper.java

@@ -25,6 +25,13 @@ public interface OrderClubMapper {
      */
     int countMainOrderByOrderId(Integer orderId);
 
+    /**
+     * 判断子订单是否存在
+     * @param shopOrderId
+     * @return
+     */
+    int countMainShopOrderByOrderId(Integer shopOrderId);
+
     /**
      * 根据订单Id查询订单
      *
@@ -32,6 +39,13 @@ public interface OrderClubMapper {
      */
     OrderPo getMainOrderByOrderId(Integer orderId);
 
+    /**
+     * 根据子订单Id 查询子订单
+     * @param shopOrderId
+     * @return
+     */
+    ShopOrderVo getShopOrderById(Integer shopOrderId);
+
     /**
      * 根据订单Id查询订单商品列表
      *
@@ -39,6 +53,20 @@ public interface OrderClubMapper {
      */
     List<OrderProductPo> getOrderProductList(Integer orderId);
 
+    /**
+     * 根据子订单Id查询订单商品列表
+     * @param shopOrderId
+     * @return
+     */
+    List<OrderProductPo> getShopOrderProductList(Integer shopOrderId);
+
+    /**
+     * 获取订单中子订单状态
+     * @param orderId
+     * @return
+     */
+    List<Integer> getShopOrderStatus(Integer orderId);
+
     /**
      * 设置二手仪器已售
      *
@@ -67,6 +95,12 @@ public interface OrderClubMapper {
      */
     void updateOrderStatus(OrderPo order);
 
+    /**
+     * 更新子订单状态
+     * @param shopOrderVo
+     */
+    void updateShopOrderStatus(ShopOrderVo shopOrderVo);
+
     /**
      * 取消 余额收支记录
      */
@@ -77,6 +111,12 @@ public interface OrderClubMapper {
      */
     void cancelMainOrder(OrderPo order);
 
+    /**
+     * 取消订单
+     * @param shopOrderVo
+     */
+    void cancelMainShopOrder(ShopOrderVo shopOrderVo);
+
     /**
      * 逻辑删除主订单
      */
@@ -96,6 +136,13 @@ public interface OrderClubMapper {
      */
     List<String> getOrderReceiptIds(Integer orderId);
 
+    /**
+     * 根据子订单 获取收款记录Id列表
+     * @param orderId
+     * @return
+     */
+    List<String> getShopOrderReceiptIds(Integer orderId);
+
     /**
      * 逻辑删除订单与收款记录关系表
      *
@@ -103,6 +150,12 @@ public interface OrderClubMapper {
      */
     void deleteOrderReceiptRelation(Integer orderId);
 
+    /**
+     * 逻辑删除订单与收款记录关系表
+     * @param shopOrderId
+     */
+    void deleteShopOrderReceiptRelation(Integer shopOrderId);
+
     /**
      * 逻辑删除收款记录表
      *
@@ -136,7 +189,7 @@ public interface OrderClubMapper {
      *
      * @param orderId 订单Id
      */
-    void updateLogisticsBatch(Integer orderId);
+    void updateLogisticsBatch(Integer orderId, Integer shopOrderId);
 
     /**
      * 获取各状态订单数量
@@ -166,6 +219,17 @@ public interface OrderClubMapper {
      */
     List<OrderVo> getOrderList(Integer userId, Integer orderState, String orderNo, String beginTime, String endTime);
 
+    /**
+     * 机构子订单列表
+     * @param userId
+     * @param status
+     * @param shopOrderNo
+     * @param beginTime
+     * @param endTime
+     * @return
+     */
+    List<ShopOrderVo> getShopOrderList(@Param("userId") Integer userId, @Param("status") Integer status, @Param("shopOrderNo") String shopOrderNo, @Param("beginTime") String beginTime, @Param("endTime") String endTime);
+
     /**
      * 根据关键词搜索订单
      *
@@ -174,6 +238,14 @@ public interface OrderClubMapper {
      */
     List<OrderVo> getOrderListByKeyword(String searchWord, Integer userId);
 
+    /**
+     * 根据关键词搜索子订单
+     * @param searchWord
+     * @param userId
+     * @return
+     */
+    List<ShopOrderVo> getShopOrderListByKeyword(@Param("searchWord") String searchWord, @Param("userId") Integer userId);
+
     /**
      * 根据用户Id查找订单搜索历史记录
      *
@@ -217,6 +289,13 @@ public interface OrderClubMapper {
      */
     OrderShareCodeVo getOrderCodeById(Integer orderId);
 
+    /**
+     * 子订单Id 获取数据库已有分享码
+     * @param shopOrderId
+     * @return
+     */
+    OrderShareCodeVo getShopOrderCodeById(Integer shopOrderId);
+
     /**
      * 删除分享码使用记录
      *
@@ -224,6 +303,12 @@ public interface OrderClubMapper {
      */
     void deleteOrderShareCodeRecord(Integer orderId);
 
+    /**
+     * 删除分享码使用记录
+     * @param shopOrderId
+     */
+    void deleteShopOrderShareCodeRecord(Integer shopOrderId);
+
     /**
      * 更新数据库的分享码
      */
@@ -238,7 +323,7 @@ public interface OrderClubMapper {
     /**
      * 根据openId统计数据库内是否有有效分享码
      */
-    int countShareCodeRecord(Integer orderId, String openId);
+    int countShareCodeRecord(@Param("shopOrderId") Integer shopOrderId,@Param("openId") String openId);
 
     /**
      * 根据用户id获取用户openid列表(微信公众号openid,下单)
@@ -356,7 +441,14 @@ public interface OrderClubMapper {
 
     List<Sku> getOrganizeSku(@Param("productId") Integer productId);
 
-    List<VoucherPo> getVoucher(@Param("orderId") Integer orderId);
+    /**
+     * 发票信息
+     * @param orderId
+     * @return
+     */
+    InvoicePo getOrderInvoice(@Param("orderId") Integer orderId);
+
+    List<VoucherPo> getVoucher(@Param("shopOrderId") Integer shopOrderId);
 
     List<VoucherImageDto> getVoucherImage(@Param("voucherIds") List<Integer> voucherIds);
 
@@ -367,4 +459,11 @@ public interface OrderClubMapper {
     void updateVoucherImage(VoucherImageDto voucherImageDto);
 
     void insertVoucherImage(VoucherImageDto voucherImageDto);
+
+    /**
+     * 查询供应商银行卡信息
+     * @param shopId
+     * @return
+     */
+    ShopPo getShopBankAccount(@Param("shopId") Integer shopId);
 }

+ 69 - 2
src/main/java/com/caimei365/order/mapper/OrderCommonMapper.java

@@ -21,17 +21,43 @@ public interface OrderCommonMapper {
      */
     int countLogisticsBatch(Integer orderId);
 
+    /**
+     * 查询订单发货次数
+     * @param shopOrderId 子订单Id
+     */
+    int countLogisticsBatchShop(Integer shopOrderId);
     /**
      * 组织
      * @param orderId
      * @return
      */
-    Integer getOrganizeId(Integer orderId);
+    Integer getOrganizeId(@Param("orderId") Integer orderId);
+
     /**
-     * 根据子订单Id查询子订单列表
+     * 组织
+     * @param shopOrderId
+     * @return
+     */
+    Integer getShopOrganizeId(@Param("shopOrderId") Integer shopOrderId);
+    /**
+     * 根据子订单Id查询子订单列表 -- 不包括已付款
      * @param shopOrderIds 子订单Ids
      */
     List<ShopOrderVo> getShopOrderList(@Param("shopOrderIds") List<String> shopOrderIds);
+
+    /**
+     * 根据子订单Id查询子订单列表
+     * @param shopOrderIds
+     * @return
+     */
+    List<ShopOrderVo> getPayShopOrderList(@Param("shopOrderIds") List<String> shopOrderIds);
+
+    /**
+     * 子订单是否支付
+     * @param shopOrderId
+     * @return
+     */
+    List<DiscernReceiptVo> getShopOrderReceipt(@Param("shopOrderId") Integer shopOrderId);
     /**
      * 根据Id获取订单促销
      * @param orderPromotionsId 订单促销Id
@@ -47,6 +73,13 @@ public interface OrderCommonMapper {
      * @param orderId 订单Id
      */
     List<OrderProductVo> getOrderProductByOrderId(Integer orderId);
+
+    /**
+     * 根据订单Id获取订单商品列表
+     * @param shopOrderId
+     * @return
+     */
+    List<OrderProductVo> getshopOrderProductByOrderId(Integer shopOrderId);
     /**
      * 支付记录(收款记录)
      * @param orderId 订单Id
@@ -67,6 +100,20 @@ public interface OrderCommonMapper {
      * @param orderId 订单Id
      */
     int countOfflinePayment(Integer orderId);
+
+    /**
+     * 是否线上
+     * @param shopOrderId
+     * @return
+     */
+    int countOfflinePaymentshopOrder(Integer shopOrderId);
+
+    /**
+     * 线下支付凭证
+     * @param shopOrderId
+     * @return
+     */
+    Integer getOrderVoucher(Integer shopOrderId);
     /**
      * 付供应商费用列表
      * @param orderId 订单Id
@@ -109,11 +156,25 @@ public interface OrderCommonMapper {
      * @param productId   商品Id
      */
     Integer countActualCancelNum(Integer shopOrderId, Integer productId);
+
+    /**
+     * 子订单退款状态
+     * @param shopOrderId
+     * @return
+     */
+    Integer getRefundStatus(@Param("shopOrderId") Integer shopOrderId );
     /**
      * 根据订单Id获取订单
      * @param orderId 订单Id
      */
     OrderVo getOrderByOrderId(Integer orderId);
+
+    /**
+     * 根据子订单Id获取子订单数据
+     * @param shopOrderId
+     * @return
+     */
+    ShopOrderVo getShopOrderById(Integer shopOrderId);
     /**
      * 根据子订单Id获取订单
      * @param shopOrderId 订单Id
@@ -128,6 +189,11 @@ public interface OrderCommonMapper {
      * @param orderId 订单Id
      */
     List<LogisticsBatchVo> getLogisticsBatchList(Integer orderId);
+    /**
+     * 获取物流批次列表
+     * @param shopOrderId 子订单Id
+     */
+    List<LogisticsBatchVo> getShopLogisticsBatchList(Integer shopOrderId);
     /**
      * 获取发货物流记录
      * @param shopOrderId      子订单Id
@@ -187,5 +253,6 @@ public interface OrderCommonMapper {
 
     String getHelpContent(Integer helpId);
 
+    void updateShopOrderBalance(ShopOrderVo s);
 }
 

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

@@ -0,0 +1,61 @@
+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;
+
+import java.math.BigDecimal;
+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);
+
+    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);
+
+    void insertTransfer(BigDecimal money, String orderRequestNo, Integer shopOrderId);
+
+    OrderReceiptRelationPo findOrderRelationByNo(String orderRequestNo);
+}

+ 27 - 0
src/main/java/com/caimei365/order/mapper/OrderSellerMapper.java

@@ -1,6 +1,7 @@
 package com.caimei365.order.mapper;
 
 import com.caimei365.order.model.vo.OrderVo;
+import com.caimei365.order.model.vo.ShopOrderVo;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -30,6 +31,16 @@ public interface OrderSellerMapper {
      */
     List<OrderVo> getOrderList(@Param("userIds") List<Integer> userIds, Integer listType, @Param("orderSubmitType") Integer orderSubmitType, @Param("orderNo") String orderNo);
 
+    /**
+     * 订单列表
+     * @param userIds           用户Ids
+     * @param listType          1:待确认,2:待付款,3:待发货,4:已发货,5:退货款
+     * @param orderSubmitType   1:自主订单, 2:协销或后台订单
+     * @param shopOrderNo           订单编号
+     * @return
+     */
+    List<ShopOrderVo> getShopOrderList(@Param("userIds") List<Integer> userIds, @Param("listType") Integer listType, @Param("orderSubmitType") Integer orderSubmitType, @Param("shopOrderNo") String shopOrderNo);
+
     /**
      * 根据机构Id获取协销Id
      * @param clubId 机构Id
@@ -44,6 +55,14 @@ public interface OrderSellerMapper {
      */
     List<OrderVo> getOrderListClub(Integer clubId, Integer listType, Integer orderSubmitType);
 
+    /**
+     * 机构总订单列表
+     * @param clubId            机构Id
+     * @param listType          1:待确认,2:待付款,3:待发货,4:已发货,5:退货款
+     * @param orderSubmitType   1:自主订单, 2:协销或后台订单
+     */
+    List<ShopOrderVo> getShopOrderListClub(Integer clubId, Integer listType, Integer orderSubmitType);
+
     /**
      * 更新协销查看机构订单时间
      * @param clubId 机构Id
@@ -63,6 +82,14 @@ public interface OrderSellerMapper {
      * @param userIds     用户Id
      */
     List<OrderVo> getOrderListByKeyword(@Param("userIds") List<Integer> userIds, @Param("searchWord") String searchWord);
+
+    /**
+     * 协销根据关键词搜索订单
+     * @param userIds
+     * @param searchWord
+     * @return
+     */
+    List<ShopOrderVo> getShopOrderListByKeyword(@Param("userIds") List<Integer> userIds, @Param("searchWord") String searchWord);
     /**
      * 获取协销用户下的机构ID列表
      */

+ 16 - 0
src/main/java/com/caimei365/order/mapper/PayOrderMapper.java

@@ -20,11 +20,25 @@ public interface PayOrderMapper {
      * 获取线上支付全局开关状态
      */
     Integer getPayOnLineSwitch();
+
+    /**
+     * 供应商分帐账号
+     * @param shopId
+     * @return
+     */
+    String getShopCode(@Param("shopId") Integer shopId);
     /**
      * 查询审核中的退款退货数量
      * @param orderId 订单Id
      */
     int getRefundCount(Integer orderId);
+
+    /**
+     * 查询审核中的退款退货数量
+     * @param shopOrderId
+     * @return
+     */
+    int getShopRefundCount(Integer shopOrderId);
     /**
      * 更新订单状态
      * @param order 主订单
@@ -281,4 +295,6 @@ public interface PayOrderMapper {
     QuickInfoVo findInfoById(Integer infoId);
 
     QuickInfoVo findInfoNotDel(String infoId);
+
+    void updateShopOrderBalancePay(ShopOrderVo shopOrder);
 }

+ 99 - 4
src/main/java/com/caimei365/order/mapper/ShipMapper.java

@@ -1,8 +1,12 @@
 package com.caimei365.order.mapper;
 
+import com.caimei365.order.model.dto.OrderRemarkDto;
+import com.caimei365.order.model.dto.OssFileDto;
+import com.caimei365.order.model.dto.RemarkImageDto;
 import com.caimei365.order.model.po.*;
 import com.caimei365.order.model.vo.*;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
@@ -17,11 +21,32 @@ public interface ShipMapper {
     /**
      * 机构订单列表
      */
-    List<ShopOrderVo> getShopOrderList(Integer shopId, Integer sendOutStatus, Integer payStatus, String shopOrderNo, String receiver);
+    List<ShopOrderVo> getShopOrderList(Integer shopId, Integer sendOutStatus, Integer payStatus, String shopOrderNo, String receiver, Integer refundStatus, Integer receiptStatus, Integer organizeId);
     /**
      * 供应商结算列表
      */
-    List<SettlementVo> getSettlementList(Integer shopId, Integer payStatus, String shopOrderNo, String name);
+    List<SettlementVo> getSettlementList(@Param("shopId") Integer shopId, @Param("payStatus") Integer payStatus,@Param("shopOrderNo") String shopOrderNo,@Param("name") String name,@Param("beginTime") String beginTime,@Param("endTime") String endTime,@Param("refundStatus") Integer refundStatus);
+
+    /**
+     * 子订单付款记录
+     * @param shopOrderId
+     * @return
+     */
+    List<DiscernReceiptVo> getShopOrderRelation(@Param("shopOrderId") Integer shopOrderId);
+
+    /**
+     * 子订单退款记录
+     * @param shopOrderId
+     * @return
+     */
+    List<CmReturnedPurchase> getRefundPurchase(@Param("shopOrderId") Integer shopOrderId);
+
+    /**
+     * 子订单分帐记录
+     * @param shopOrderId
+     * @return
+     */
+    Double getSplitAccount(Integer shopOrderId);
     /**
      * 发货页面子订单数据
      * @param shopOrderId 子订单Id
@@ -38,9 +63,10 @@ public interface ShipMapper {
 
     /**
      * (收款买家)收款状态:1待收款、2部分收款、3已收款
-     * @param orderId 订单Id
+     * @param shopOrderId 子订单Id
+     * @return
      */
-    Integer getOrderReceiptStatus(Integer orderId);
+    Integer getShopOrderReceiptStatus(Integer shopOrderId);
     /**
      * 物流公司
      * @param value 快递公司代码
@@ -208,4 +234,73 @@ public interface ShipMapper {
     void updateLogisticsRecordSn(Integer recordId, String sn);
 
     Integer getUserIdByShopId(Integer shopId);
+
+    Double findWaitPay(Integer shopOrderId);
+
+    void insertOrderReceipt(ReceiptVo receiptVo);
+
+    void insertOrderRelation(OrderReceiptRelationPo record);
+
+    String findOrderStatus(Integer orderId);
+
+    void updateReceiptStatus(Integer status, Integer shopOrderId);
+
+    Integer getOrderId(Integer shopOrderId);
+
+    List<Integer> getReceiptStatus(Integer orderId);
+
+    void updateOrderReceiptStatus(Integer status, Integer orderId);
+    /**
+     * 订单备注
+     * @param shopOrderId
+     * @return
+     */
+    List<OrderRemarkDto> findList(Integer shopOrderId);
+
+    /**
+     * 插入订单备注
+     * @param remark
+     */
+    void insert(OrderRemarkDto remark);
+
+    /**
+     * 修改订单备注
+     * @param remark
+     */
+    void update(OrderRemarkDto remark);
+
+    /**
+     * 订单备注图
+     * @param id
+     * @return
+     */
+    List<String> findImages(Integer id);
+
+    /**
+     * 订单备注文件
+     * @param id
+     * @return
+     */
+    List<OssFileDto> findFiles(Integer id);
+
+    OssFileDto findFileByMd5(String md5Hex);
+
+    /**
+     * 订单备注 -- Id查询
+     * @param fileId
+     * @return
+     */
+    OssFileDto findRemarkById(Integer fileId);
+
+    /**
+     * 插入订单备注图
+     * @param i
+     */
+    void insertImage(RemarkImageDto i);
+
+    /**
+     * 插入订单备注文件信息
+     * @param o
+     */
+    void insertFile(OssFileDto o);
 }

+ 9 - 4
src/main/java/com/caimei365/order/mapper/SubmitMapper.java

@@ -2,10 +2,7 @@ package com.caimei365.order.mapper;
 
 import com.caimei365.order.model.bo.OrderParamBo;
 import com.caimei365.order.model.po.*;
-import com.caimei365.order.model.vo.AddressVo;
-import com.caimei365.order.model.vo.LadderPriceVo;
-import com.caimei365.order.model.vo.PromotionsVo;
-import com.caimei365.order.model.vo.ShopOrderVo;
+import com.caimei365.order.model.vo.*;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -171,4 +168,12 @@ public interface SubmitMapper {
     Integer findSplitResult(List<String> productIdList);
 
     OrderProductPo getRechargeProductDetails(Integer productId);
+
+    List<OrderProductVo> findOrderProducts(List<Integer> orderProductIds);
+
+    void updateOrderProduct(OrderProductPo o);
+
+    void updateShopOrder(ShopOrderVo shopOrder);
+
+    void updateUserMoneyByChange(Integer userId, double change);
 }

+ 5 - 0
src/main/java/com/caimei365/order/model/dto/AgainBuyDto.java

@@ -24,6 +24,11 @@ public class AgainBuyDto implements Serializable {
      */
     @ApiModelProperty("订单Id")
     private Integer orderId;
+    /**
+     * 子订单Id
+     */
+    @ApiModelProperty("子订单Id")
+    private Integer shopOrderId;
     /**
      * 确认标志:0未确认 1已确认-将失效商品以外的正常商品加入购物车
      */

+ 5 - 0
src/main/java/com/caimei365/order/model/dto/CartDto.java

@@ -29,6 +29,11 @@ public class CartDto implements Serializable {
      */
     @ApiModelProperty("商品id")
     private Integer productId;
+    /**
+     * 地址Id
+     */
+    @ApiModelProperty("地址Id")
+    private Integer townId;
     /**
      * 商品数量
      */

+ 2 - 2
src/main/java/com/caimei365/order/model/dto/OrderDto.java

@@ -17,8 +17,8 @@ public class OrderDto implements Serializable {
     /**
      * 订单Id
      */
-    @ApiModelProperty("订单Id")
-    private Integer orderId;
+    @ApiModelProperty("订单Id")
+    private Integer shopOrderId;
     /**
      * 用户Id
      */

+ 16 - 0
src/main/java/com/caimei365/order/model/dto/OrderProductDto.java

@@ -0,0 +1,16 @@
+package com.caimei365.order.model.dto;
+
+import com.caimei365.order.model.vo.OrderProductVo;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author zzj
+ */
+@Data
+public class OrderProductDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+    private List<OrderProductVo> orderProducts;
+}

+ 28 - 0
src/main/java/com/caimei365/order/model/dto/OrderRemarkDto.java

@@ -0,0 +1,28 @@
+package com.caimei365.order.model.dto;
+
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2023/6/12
+ */
+@Data
+public class OrderRemarkDto implements Serializable {
+
+    private Integer id;
+    private Integer orderId;
+    private Integer shopOrderId;
+    private Integer createBy;
+    private String remarks;
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private String createDate;
+    private String createName;
+    private List<String> images;
+    private List<OssFileDto> ossFiles;
+}

+ 33 - 0
src/main/java/com/caimei365/order/model/dto/OssFileDto.java

@@ -0,0 +1,33 @@
+package com.caimei365.order.model.dto;
+
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2023/6/12
+ */
+@Data
+public class OssFileDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private Integer id;
+
+    private Integer orderId;
+
+    private Integer remarkId;
+
+    private String name;
+
+    private String ossName;
+
+    private String md5Hex;
+
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private String uploadTime;
+}

+ 3 - 0
src/main/java/com/caimei365/order/model/dto/PayDto.java

@@ -54,4 +54,7 @@ public class PayDto implements Serializable {
 
     @ApiModelProperty("支付类型 微信:WXPAY  支付宝:ALIPAY 公众号:AppPayPublic 小程序:AppPayApplet 银联:PUBLIC")
     private String payType;
+
+    @ApiModelProperty("子订单Id")
+    private Integer shopOrderId;
 }

+ 18 - 0
src/main/java/com/caimei365/order/model/dto/RemarkImageDto.java

@@ -0,0 +1,18 @@
+package com.caimei365.order.model.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2023/6/12
+ */
+@Data
+public class RemarkImageDto implements Serializable {
+    private Integer orderId;
+    private Integer remarkId;
+    private String remarkImage;
+}

+ 80 - 0
src/main/java/com/caimei365/order/model/dto/SettlementDto.java

@@ -0,0 +1,80 @@
+package com.caimei365.order.model.dto;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2023/6/19
+ */
+@Data
+public class SettlementDto {
+    /**
+     * 子订单编号
+     */
+    @ExcelProperty(value = "子订单编号", index = 0)
+    private String shopOrderNo;
+    /**
+     * 订单提交时间
+     */
+    @ExcelProperty(value = "订单提交时间", index = 1)
+    private String orderTime;
+    /**
+     * 用户名称
+     */
+    @ExcelProperty(value = "用户名称", index = 2)
+    private String name;
+    /**
+     * 商品信息
+     */
+    @ExcelProperty(value = "商品信息", index = 3)
+    private String productInfo;
+    /**
+     * 订单金额
+     */
+    @ExcelProperty(value = "订单金额", index = 4)
+    private Double totalAmount;
+    /**
+     * 退款状态 1无退款、3有退款
+     */
+    @ExcelProperty(value = "退款状态", index = 5)
+    private String refundStatus;
+    /**
+     * 退款金额
+     */
+    @ExcelProperty(value = "退款金额", index = 6)
+    private Double refundAmount;
+    /**
+     * 支付手续费
+     */
+    @ExcelProperty(value = "支付手续费", index = 7)
+    private Double paymentCommission;
+    /**
+     * 分帐手续费
+     */
+    @ExcelProperty(value = "分帐手续费", index = 8)
+    private Double prorateCommission;
+    /**
+     * (付款供应商)付款状态:1待付款、2部分付款、3已付款
+     */
+    @ExcelProperty(value = "结算状态", index = 9)
+    private String payStatus;
+    /**
+     * 付供应商 = 商品费 + 运费 + 税费
+     */
+    @ExcelProperty(value = "总结算金额", index = 10)
+    private Double shouldPayShopAmount;
+    /**
+     * 已付款金额
+     */
+    @ExcelProperty(value = "已结算金额", index = 11)
+    private Double settleAmount;
+    /**
+     * 未结算金额
+     */
+    @ExcelProperty(value = "未结算金额", index = 12)
+    private Double unsettledAmount;
+}

+ 2 - 2
src/main/java/com/caimei365/order/model/dto/VoucherDto.java

@@ -17,9 +17,9 @@ public class VoucherDto {
      */
     private Integer id;
     /**
-     * 订单Id
+     * 订单Id
      */
-    private Integer orderId;
+    private Integer shopOrderId;
     /**
      * 备注
      */

+ 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;
+    }
+}

+ 0 - 8
src/main/java/com/caimei365/order/model/po/OrderProductPo.java

@@ -18,10 +18,6 @@ public class OrderProductPo implements Serializable {
     private static final long serialVersionUID = 1L;
 
     private Integer skuId;
-    /**
-     * 外部商城skuId
-     */
-    private Integer organizeSkuId;
     /**
      * 不包含单品满减的商品金额
      */
@@ -34,10 +30,6 @@ public class OrderProductPo implements Serializable {
      * 供应商Id
      */
     private Integer shopId;
-    /**
-     * 组织的商品Id
-     */
-    private Integer organizeProductId;
     /**
      * 组织Id
      */

+ 12 - 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
      */
@@ -49,6 +53,10 @@ public class OrderReceiptRelationPo implements Serializable {
      *  认证通会员购买记录Id
      */
     private Integer authVipRecordId;
+    /**
+     * 收款金额
+     */
+    private Double receiptAmount;
     /**
      * 删除标记 0 否,其余是
      */
@@ -79,4 +87,8 @@ public class OrderReceiptRelationPo implements Serializable {
      * 子订单id
      */
     private Integer shopOrderId;
+    /**
+     * 商户号
+     */
+    private String splitCode;
 }

+ 20 - 0
src/main/java/com/caimei365/order/model/po/OrderShopPo.java

@@ -101,6 +101,14 @@ public class OrderShopPo implements Serializable {
      * 佣金 =  应付采美
      */
     private Double brokerage;
+    /**
+     * 是否使用余额
+     */
+    private Integer useBalanceFlag;
+    /**
+     * 余额支付时使用的金额
+     */
+    private Double accountAmount;
     /**
      * 可退款金额 = 余额抵扣金额
      */
@@ -129,6 +137,10 @@ public class OrderShopPo implements Serializable {
      * 付供应商 运费
      */
     private Double shopPostFee;
+    /**
+     * 免邮标志  运费:-1到付,0包邮,1需要运费,-2仪器到付其它包邮
+     */
+    private Integer shopPostFlag;
     /**
      * 付供应商税费
      */
@@ -153,6 +165,14 @@ public class OrderShopPo implements Serializable {
      * (付款供应商)付款状态:1待付款、2部分付款、3已付款
      */
     private Integer payStatus;
+    /**
+     * 订单状态 1:待确认 2:已确认 3:交易完成 4:订单完成 5:已关闭 6:交易全退
+     */
+    private Integer shopStatus;
+    /**
+     *
+     */
+    private Integer receiptStatus;
     /**
      * 已付款金额
      */

+ 33 - 0
src/main/java/com/caimei365/order/model/po/ShopPo.java

@@ -0,0 +1,33 @@
+package com.caimei365.order.model.po;
+
+import lombok.Data;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2023/6/18
+ */
+@Data
+public class ShopPo {
+    /**
+     * 供应商Id
+     */
+    private Integer shopId;
+    /**
+     * 供应商名称
+     */
+    private String name;
+    /**
+     * 银行账号
+     */
+    private String bankAccount;
+    /**
+     * 付款账号的户名
+     */
+    private String bankAccountName;
+    /**
+     * 付款账号的开户行
+     */
+    private String bankName;
+}

+ 1 - 1
src/main/java/com/caimei365/order/model/po/VoucherPo.java

@@ -20,7 +20,7 @@ public class VoucherPo {
     /**
      * 订单Id
      */
-    private Integer orderId;
+    private Integer shopOrderId;
     /**
      * 备注
      */

+ 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;
+    }
+}

+ 9 - 0
src/main/java/com/caimei365/order/model/vo/CartItemVo.java

@@ -5,6 +5,7 @@ import lombok.Data;
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 购物车商品列表
@@ -180,4 +181,12 @@ public class CartItemVo implements Serializable {
      * 特殊商品退货须知提示  (取后台帮助中心id1040的数据)
      */
     private String  helpContent;
+    /**
+     * 冷链费
+     */
+    private Double coldChain;
+    /**
+     * 运费标志:0包邮 2到付 1遵循运费规则
+     */
+    private Integer postageFlag;
 }

+ 28 - 0
src/main/java/com/caimei365/order/model/vo/CartShopVo.java

@@ -78,4 +78,32 @@ public class CartShopVo implements Serializable {
      * 特殊商品退货须知提示  (取后台帮助中心id1040的数据)
      */
     private String  helpContent;
+    /**
+     * 冷链费
+     */
+    private Double coldChain;
+    /**
+     * 运费标志:0包邮 2到付 1遵循运费规则
+     */
+    private Integer postageFlag;
+    /**
+     * 运费
+     */
+    private Double postage;
+    /**
+     * 总运费
+     */
+    private Double allPostage;
+    /**
+     * 可用采美豆
+     */
+    private Integer userBeans;
+    /**
+     * 是否包含需要冷链运输商品
+     */
+    private Integer designatedFlag;
+    /**
+     * 是否勾选冷链费
+     */
+    private Boolean isColdChina;
 }

+ 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;
+    }
+}

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

@@ -0,0 +1,85 @@
+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;
+
+    /**
+     * 一次性字段
+     * 版本废弃字段
+     */
+    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;
+}

+ 7 - 1
src/main/java/com/caimei365/order/model/vo/OrderProductVo.java

@@ -15,6 +15,12 @@ import java.math.BigDecimal;
 public class OrderProductVo implements Serializable {
     private static final long serialVersionUID = 1L;
 
+    private Integer organizeId;
+    /**
+     * 商品类型(0正常商品,1协商赠品,2促销赠品)
+     */
+    private Integer productType;
+
     private Integer skuId;
     /**
      * 商品货号
@@ -67,7 +73,7 @@ public class OrderProductVo implements Serializable {
     /**
      * 比例成本百分比
      */
-    private Double costProportional;
+    private Double shopPercent;
     /**
      * 启用阶梯价标志 0否 1是
      */

+ 4 - 0
src/main/java/com/caimei365/order/model/vo/OrderShareCodeRecordVo.java

@@ -24,6 +24,10 @@ public class OrderShareCodeRecordVo implements Serializable {
      * 主订单ID,关联cm_order的ID
      */
     private Integer orderId;
+    /**
+     * 子订单Id
+     */
+    private Integer shopOrderId;
     /**
      * 订单分享码,关联cm_mall_order_share_code表ID
      */

+ 4 - 0
src/main/java/com/caimei365/order/model/vo/OrderShareCodeVo.java

@@ -20,6 +20,10 @@ public class OrderShareCodeVo implements Serializable {
      * 主订单ID,关联cm_order的ID
      */
     private Integer orderId;
+    /**
+     * 子订单Id
+     */
+    private Integer shopOrderId;
     /**
      * 订单分享码,默认24小时有效
      */

+ 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;
+
+}

+ 38 - 4
src/main/java/com/caimei365/order/model/vo/SettlementVo.java

@@ -1,5 +1,7 @@
 package com.caimei365.order.model.vo;
 
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
 import lombok.Data;
 
 import java.util.List;
@@ -16,33 +18,65 @@ public class SettlementVo {
     /**
      * 子订单ID
      */
+    @ExcelIgnore
     private Integer shopOrderId;
     /**
      * 子订单编号
      */
+    @ExcelProperty(value = "子订单编号", index = 0)
     private String shopOrderNo;
     /**
      * 订单提交时间
      */
+    @ExcelProperty(value = "订单提交时间", index = 1)
     private String orderTime;
     /**
      * 用户名称
      */
     private String name;
     /**
-     * (付款供应商)付款状态:1待付款、2部分付款、3已付款
+     * 1 未结算 2 部分结算 3 已结算
      */
-    private Integer payStatus;
+    @ExcelProperty(value = "结算状态", index = 9)
+    private Integer settlestatus;
+    /**
+     * 订单金额
+     */
+    @ExcelProperty(value = "订单金额", index = 4)
+    private Double totalAmount;
+    /**
+     * 退款状态 1无退款、3有退款
+     */
+    @ExcelProperty(value = "退款状态 1无退款、3有退款", index = 5)
+    private Integer refundStatus;
+    /**
+     * 退款金额
+     */
+    @ExcelProperty(value = "退款金额", index = 6)
+    private Double refundAmount;
+    /**
+     * 支付手续费
+     */
+    @ExcelProperty(value = "支付手续费", index = 7)
+    private Double paymentCommission;
+    /**
+     * 分帐手续费
+     */
+    @ExcelProperty(value = "分帐手续费", index = 8)
+    private Double prorateCommission;
     /**
      * 付供应商 = 商品费 + 运费 + 税费
      */
+    @ExcelProperty(value = "付供应商", index = 10)
     private Double shouldPayShopAmount;
     /**
-     * 已付款金额
+     * 已结算金额
      */
-    private Double payedShopAmount;
+    @ExcelProperty(value = "已结算金额", index = 11)
+    private Double settleAmount;
     /**
      * 订单商品信息
      */
+    @ExcelIgnore
     private List<OrderProductVo> orderProductList;
 }

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

@@ -1,9 +1,12 @@
 package com.caimei365.order.model.vo;
 
+import com.caimei365.order.model.po.InvoicePo;
+import com.caimei365.order.model.po.VoucherPo;
 import lombok.Data;
 
 import java.io.Serializable;
 import java.math.BigDecimal;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -15,6 +18,10 @@ import java.util.List;
 @Data
 public class ShopOrderVo implements Serializable {
     private static final long serialVersionUID = 1L;
+    /**
+     * 虚拟字段,不包含店铺满减的子订单应付
+     */
+    private Double realNeedPay;
     /**
      * 返佣服务费
      */
@@ -43,14 +50,50 @@ public class ShopOrderVo implements Serializable {
      * 订单号
      */
     private Integer orderId;
+    /**
+     * 普通订单 1 协销订单 0
+     */
+    private Integer orderType;
     /**
      * 组织Id
      */
     private Integer organizeId;
+    /**
+     * 订单更新时间
+     */
+    private Date updateTime;
+    /**
+     * 协销联系人
+     */
+    private String serviceName;
+    /**
+     * 结算状态 1未结算2部分结算3已结算
+     */
+    private Integer settlestatus;
+    /**
+     * vip
+     */
+    private Integer svipUserFlag;
+    /**
+     * 用户类型
+     */
+    private Integer userIdentity;
+    /**
+     * 机构名称
+     */
+    private String clubName;
     /**
      * 冷链费用标记
      */
     private Integer isColdChina;
+    /**
+     * 冷链费
+     */
+    private Double coldChina;
+    /**
+     * 运费--联合丽格
+     */
+    private String postageInfo;
     /**
      * 订单编号
      */
@@ -59,6 +102,14 @@ public class ShopOrderVo implements Serializable {
      * 供应商Id
      */
     private Integer shopId;
+    /**
+     * 订单标识:#订单号#
+     */
+    private String OrderMark;
+    /**
+     * 供应商 支持支付方式 0 线上下线  1 线上 2 线下
+     */
+    private Integer payway;
     /**
      * 供应商名称
      */
@@ -83,6 +134,18 @@ public class ShopOrderVo implements Serializable {
      * 协销Id
      */
     private Integer spId;
+    /**
+     * 子订单状态
+     */
+    private Integer status;
+    /**
+     * 退货退款类型:0未发生退款、1部分退、2全部退
+     */
+    private Integer refundType;
+    /**
+     * 上传支付凭证状态
+     */
+    private Integer checkFlag;
     /**
      * 订单促销id(店铺促销)
      */
@@ -111,6 +174,14 @@ public class ShopOrderVo implements Serializable {
      * 已付款金额
      */
     private Double payedShopAmount;
+    /**
+     * orderSeen:订单对机构可见度,1可见,2不可见
+     */
+    private Integer orderSeen;
+    /**
+     * 采美豆数
+     */
+    private Integer userBeans;
     /**
      * 佣金 =  应付采美
      */
@@ -151,6 +222,10 @@ public class ShopOrderVo implements Serializable {
      * 付供应商 运费
      */
     private Double shopPostFee;
+    /**
+     * 免邮标志  运费:-1到付,0包邮,1需要运费,-2仪器到付其它包邮
+     */
+    private Integer shopPostFlag;
     /**
      * 付供应商税费
      */
@@ -211,6 +286,10 @@ public class ShopOrderVo implements Serializable {
      * (收款买家)收款状态:1待收款、2部分收款、3已收款
      */
     private Integer receiptStatus;
+    /**
+     * 退款状态:1无退款、3有退款
+     */
+    private Integer refundStatus;
     /**
      * 供应商已退金额
      */
@@ -255,4 +334,48 @@ public class ShopOrderVo implements Serializable {
      * 收款款项二级类别1.上架费2.订单返佣3.认证通会员4.认证通企划
      */
    private Integer newReceiptType;
+    /**
+     * 余额支付时使用的金额
+     */
+   private Double accountAmount;
+    /**
+     * 是否使用余额 0否 1是
+     */
+   private Integer useBalanceFlag;
+    /**
+     * 发票信息
+     */
+   private InvoicePo invoice;
+    /**
+     * 支付凭证
+     */
+   private List<VoucherPo> voucher;
+    /**
+     * 供应商支持支付方式 0 线上下线  1 线上 2 线下
+     */
+   private Integer onlinePay;
+    /**
+     * 是否包含充值商品
+     */
+    private boolean rechargeGoods = false;
+    /**
+     * 总税费
+     */
+    private Double expensesOfTaxation;
+    /**
+     * 是否开发票 没开发票 0 开个人发票 1 开企业发票2
+     */
+    private Integer invoiceFlag;
+    /**
+     * 是否有商品发票属性的限制,为true时只能线下支付
+     */
+    private boolean invoiceStatus = false;
+    /**
+     * 退款总金额
+     */
+    private Double returnedPurchaseFee;
+    /**
+     * 条款ID
+     */
+    private Integer clauseId;
 }

+ 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;
+}

+ 2 - 1
src/main/java/com/caimei365/order/service/AddressService.java

@@ -2,6 +2,7 @@ package com.caimei365.order.service;
 
 import com.caimei365.order.model.ResponseJson;
 import com.caimei365.order.model.dto.AddressDto;
+import com.caimei365.order.model.po.AddressPo;
 import com.caimei365.order.model.vo.AddressSelectVo;
 import com.caimei365.order.model.vo.AddressVo;
 import com.github.pagehelper.PageInfo;
@@ -46,7 +47,7 @@ public interface AddressService {
      *                   mobile       手机
      *                   defaultFlag  是否默认收货地址(0 不是默认,1 默认)
      */
-    ResponseJson<Integer> addUserAddress(AddressDto addressDto);
+    ResponseJson<AddressVo> addUserAddress(AddressDto addressDto);
 
     /**
      * 删除收货地址

+ 3 - 2
src/main/java/com/caimei365/order/service/CartClubService.java

@@ -80,10 +80,11 @@ public interface CartClubService {
      * 购物车结算
      *
      * @param userId 用户ID
+     * @param townId 地址
      * @param skuIds skuIds,逗号隔开
      * @param source 来源 : 1 网站 ; 2 小程序
      */
-    ResponseJson<Map<String, Object>> settlementShoppingCart(Integer userId, String skuIds, Integer source);
+    ResponseJson<Map<String, Object>> settlementShoppingCart(Integer userId, Integer townId, String skuIds, Integer source);
 
     /**
      * 立即购买
@@ -174,7 +175,7 @@ public interface CartClubService {
      * @param
      * @return
      */
-    ResponseJson<Map<String, Object>> MultipleBuyNow(Integer userId, String productInfo, Integer source);
+    ResponseJson<Map<String, Object>> MultipleBuyNow(Integer userId, Integer townId, String productInfo, Integer source);
 
     ResponseJson checkSkuId(Integer userId, Integer oldSkuId, Integer newSkuId, Integer count);
 }

+ 1 - 1
src/main/java/com/caimei365/order/service/CartSellerService.java

@@ -83,7 +83,7 @@ public interface CartSellerService {
      * @param clubId            机构Id
      * @param skuIds            skuIds
      */
-    ResponseJson<Map<String, Object>> settlementSellerCart(Integer serviceProviderId, Integer clubId, String skuIds);
+    ResponseJson<Map<String, Object>> settlementSellerCart(Integer serviceProviderId, Integer townId, Integer clubId, String skuIds);
 
     /**
      * 协销二手商品立即购买

+ 11 - 6
src/main/java/com/caimei365/order/service/HeliPayService.java

@@ -27,6 +27,7 @@ public interface HeliPayService {
     ResponseJson<JSONObject> payByWeChat(HeliDto heliDto, HttpHeaders headers) throws IntrospectionException, InvocationTargetException, IllegalAccessException;
 
     ResponseJson<JSONObject> payOnline(HeliDto heliDto, HttpHeaders headers) throws IntrospectionException, InvocationTargetException, IllegalAccessException;
+
     /**
      * 回调
      */
@@ -37,7 +38,8 @@ public interface HeliPayService {
     /**
      * 延时分账
      */
-    void delayedSplitting(String callUrl);
+//    void delayedSplitting(String callUrl);
+
     /**
      * 延时分账异步回调
      */
@@ -45,23 +47,24 @@ public interface HeliPayService {
 
     ResponseJson<Map<String, Object>> bankCode();
 
-    ResponseJson<JSONObject> getPayOrderResult(String mbOrderId, Integer orderFlag,Integer shopOrderId) throws IntrospectionException, InvocationTargetException, IllegalAccessException;
+    ResponseJson<JSONObject> getPayOrderResult(String mbOrderId, Integer orderFlag, Integer shopOrderId) throws IntrospectionException, InvocationTargetException, IllegalAccessException;
+
     /**
      * 银联回调
      */
     String unionCallback(UnionResVo res) throws IntrospectionException, InvocationTargetException, IllegalAccessException;
 
-    ResponseJson<List<ShopOrderVo>> getShopOrders(Integer orderId);
+    ResponseJson<List<ShopOrderVo>> getShopOrders(Integer orderId, Integer shopOrderId);
 
     ResponseJson<JSONObject> getUnionResult(String mbOrderId, Integer orderFlag, Integer shopOrderId);
 
-    ResponseJson<Map<String, String>>  quickPay(HeliDto heliDto, HttpHeaders headers);
+    ResponseJson<Map<String, String>> quickPay(HeliDto heliDto, HttpHeaders headers);
 
     String quickPayCallback(QuickPayConfirmPayResponseVo res);
 
-    ResponseJson<Map<String,String>> bindBankCard(HeliDto heliDto);
+    ResponseJson<Map<String, String>> bindBankCard(HeliDto heliDto);
 
-    ResponseJson bindByCode(Integer flag,String bindCode, String orderId,String infoId,String customer);
+    ResponseJson bindByCode(Integer flag, String bindCode, String orderId, String infoId, String customer);
 
     ResponseJson<List<BankListDto>> bankInfos(Integer cardType);
 
@@ -70,4 +73,6 @@ public interface HeliPayService {
     ResponseJson<String> bindCardNoCode(HeliDto heliDto);
 
     ResponseJson<List<QuickBankVo>> unCodeInfos();
+
+    String refundSplittingCallback(AccountResVo data);
 }

+ 30 - 22
src/main/java/com/caimei365/order/service/OrderClubService.java

@@ -2,6 +2,7 @@ package com.caimei365.order.service;
 
 import com.caimei365.order.model.ResponseJson;
 import com.caimei365.order.model.dto.VoucherDto;
+import com.caimei365.order.model.po.ShopPo;
 import com.caimei365.order.model.vo.*;
 import com.github.pagehelper.PageInfo;
 import org.springframework.http.HttpHeaders;
@@ -32,7 +33,7 @@ public interface OrderClubService {
      * @param pageNum    页码
      * @param pageSize   每页数量
      */
-    ResponseJson<PageInfo<OrderVo>> getOrderList(Integer userId, Integer orderState, String orderNo, String beginTime, String endTime, int pageNum, int pageSize);
+    ResponseJson<PageInfo<ShopOrderVo>> getOrderList(Integer userId, Integer orderState, String orderNo, String beginTime, String endTime, int pageNum, int pageSize);
     /**
      * 根据关键词搜索订单
      * @param userId     用户Id
@@ -40,13 +41,13 @@ public interface OrderClubService {
      * @param pageNum    页码
      * @param pageSize   每页数量
      */
-    ResponseJson<PageInfo<OrderVo>> getOrderListByKeyword(Integer userId, String searchWord, int pageNum, int pageSize);
+    ResponseJson<PageInfo<ShopOrderVo>> getOrderListByKeyword(Integer userId, String searchWord, int pageNum, int pageSize);
     /**
      * 机构订单详情
      * @param userId     用户Id
-     * @param orderId    订单Id
+     * @param shopOrderId    订单Id
      */
-    ResponseJson<Map<String, Object>> getOrderDetail(Integer userId, Integer orderId);
+    ResponseJson<Map<String, Object>> getOrderDetail(Integer userId, Integer shopOrderId);
 
     /**
      * 上传支付凭证
@@ -61,26 +62,26 @@ public interface OrderClubService {
     ResponseJson<OrderVo> getOrderLatest(Integer userId);
     /**
      * 机构确认订单
-     * @param orderId  订单Id
+     * @param shopOrderId  订单Id
      */
-    ResponseJson<Void> confirmMainOrder(Integer orderId);
+    ResponseJson<Void> confirmMainOrder(Integer shopOrderId);
     /**
      * 机构取消订单
-     * @param orderId  订单Id
+     * @param shopOrderId  订单Id
      * @param userIdentity    用户身份 1协销 其他用户
      * @param remark    备注(订单取消原因)
      */
-    ResponseJson<Void> cancelMainOrder(Integer orderId,Integer userIdentity, String remark);
+    ResponseJson<Void> cancelMainOrder(Integer shopOrderId,Integer userIdentity, String remark);
     /**
      * 机构删除订单
-     * @param orderId  订单Id
+     * @param shopOrderId  订单Id
      */
-    ResponseJson<Void> deleteMainOrder(Integer orderId);
+    ResponseJson<Void> deleteMainOrder(Integer shopOrderId);
     /**
      * 机构确认收货
-     * @param orderId 订单Id
+     * @param shopOrderId 订单Id
      */
-    ResponseJson<Void> receiveGoods(Integer orderId);
+    ResponseJson<Void> receiveGoods(Integer shopOrderId);
     /**
      * 根据用户Id查找订单搜索历史记录
      * @param userId  用户Id
@@ -93,17 +94,17 @@ public interface OrderClubService {
     ResponseJson<Void> deleteOrderSearchHistory(Integer userId);
     /**
      * 物流详情
-     * @param orderId 订单Id
+     * @param shopOrderId 订单Id
      */
-    ResponseJson<List<LogisticsBatchVo>> getOrderLogistics(Integer orderId);
+    ResponseJson<List<LogisticsBatchVo>> getOrderLogistics(Integer shopOrderId);
     /**
      * 分享订单,获取分享码
-     * @param orderId 订单Id
+     * @param shopOrderId 订单Id
      */
-    ResponseJson<String> getOrderShareCode(Integer orderId);
+    ResponseJson<String> getOrderShareCode(Integer shopOrderId);
     /**
      * 分享订单,用户身份
-     * @param orderId 订单Id
+     * @param shopOrderId 订单Id
      * @param userId 用户Id
      * @param serviceProviderId 协销Id
      * @param code 微信code
@@ -111,23 +112,23 @@ public interface OrderClubService {
      * @param iv 微信加密算法的初始向量
      * @param headers HttpHeaders
      */
-    ResponseJson<String> identityOrderShareCode(Integer orderId, Integer userId, Integer serviceProviderId, String code, String encryptedData, String iv, HttpHeaders headers);
+    ResponseJson<String> identityOrderShareCode(Integer shopOrderId, Integer userId, Integer serviceProviderId, String code, String encryptedData, String iv, HttpHeaders headers);
     /**
      * 分享订单,校验分享码
      * @param userId 用户Id
-     * @param orderId 订单Id
+     * @param shopOrderId 订单Id
      * @param shareCode 分享码
      * @param code 微信code
      * @param encryptedData 微信加密数据
      * @param iv 微信加密算法的初始向量
      * @param headers HttpHeaders
      */
-    ResponseJson<String> checkOrderShareCode(Integer userId, Integer orderId, String shareCode, String code, String encryptedData, String iv, HttpHeaders headers);
+    ResponseJson<String> checkOrderShareCode(Integer userId, Integer shopOrderId, String shareCode, String code, String encryptedData, String iv, HttpHeaders headers);
     /**
      * 分享订单,初始商品数据
-     * @param orderId 订单Id
+     * @param shopOrderId 订单Id
      */
-    ResponseJson<Map<String,Object>> getOrderShareInitProduct(Integer orderId);
+    ResponseJson<Map<String,Object>> getOrderShareInitProduct(Integer shopOrderId);
     /**
      * 二手订单 确认打款供应商
      * @param orderId 订单Id
@@ -140,4 +141,11 @@ public interface OrderClubService {
      */
     ResponseJson<ClauseVo> getClauseById(Integer clauseId);
 
+    /**
+     * 查询供应商银行卡信息
+     * @param shopId
+     * @return
+     */
+    ResponseJson<ShopPo> getShopBankAccount(Integer shopId);
+
 }

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

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

+ 5 - 4
src/main/java/com/caimei365/order/service/OrderSellerService.java

@@ -2,6 +2,7 @@ package com.caimei365.order.service;
 
 import com.caimei365.order.model.ResponseJson;
 import com.caimei365.order.model.vo.OrderVo;
+import com.caimei365.order.model.vo.ShopOrderVo;
 import com.github.pagehelper.PageInfo;
 
 import java.util.Map;
@@ -18,11 +19,11 @@ public interface OrderSellerService {
      * @param serviceProviderId 协销Id
      * @param listType 1:待确认,2:待付款,3:待发货,4:已发货,5:退货款
      * @param orderSubmitType    1:自主订单, 2:协销或后台订单
-     * @param orderNo    订单编号
+     * @param shopOrderNo    订单编号
      * @param pageNum    页码
      * @param pageSize   每页数量
      */
-    ResponseJson<PageInfo<OrderVo>> getOrderList(Integer serviceProviderId, Integer listType, Integer orderSubmitType, String orderNo,Integer groupServiceId, int pageNum, int pageSize);
+    ResponseJson<PageInfo<ShopOrderVo>> getOrderList(Integer serviceProviderId, Integer listType, Integer orderSubmitType, String shopOrderNo, Integer groupServiceId, int pageNum, int pageSize);
 
     /**
      * 协销下机构总订单列表
@@ -33,7 +34,7 @@ public interface OrderSellerService {
      * @param pageNum    页码
      * @param pageSize   每页数量
      */
-    ResponseJson<PageInfo<OrderVo>> getOrderListClub(Integer serviceProviderId, Integer clubId, Integer listType, Integer orderSubmitType, int pageNum, int pageSize);
+    ResponseJson<PageInfo<ShopOrderVo>> getOrderListClub(Integer serviceProviderId, Integer clubId, Integer listType, Integer orderSubmitType, int pageNum, int pageSize);
 
     /**
      * 协销根据关键词搜索订单
@@ -42,7 +43,7 @@ public interface OrderSellerService {
      * @param pageNum    页码
      * @param pageSize   每页数量
      */
-    ResponseJson<PageInfo<OrderVo>> getOrderListByKeyword(Integer serviceProviderId, String searchWord, int pageNum, int pageSize);
+    ResponseJson<PageInfo<ShopOrderVo>> getOrderListByKeyword(Integer serviceProviderId, String searchWord, int pageNum, int pageSize);
 
     /**
      * 获取协销各状态订单数量

+ 5 - 5
src/main/java/com/caimei365/order/service/PayOrderService.java

@@ -23,23 +23,23 @@ import java.util.Map;
 public interface PayOrderService {
     /**
      * 订单支付前效验付款规则
-     * @param orderId 订单Id
+     * @param shopOrderId 订单Id
      */
-    ResponseJson<Map<String, Object>> payBeforeCheck(Integer orderId);
+    ResponseJson<Map<String, Object>> payBeforeCheck(Integer shopOrderId);
     /**
      * 订单支付,余额抵扣
      * @param orderId 订单Id
      */
-    ResponseJson<Map<String, Object>> balanceDeduction(Integer orderId);
+    ResponseJson<Map<String, Object>> balanceDeduction(Integer shopOrderId);
     /**
      * 获取线上支付全局开关状态
      */
     ResponseJson<Integer> getPayOnLineSwitch();
     /**
      * 收银台数据显示
-     * @param orderId 订单Id
+     * @param shopOrderId 订单Id
      */
-    ResponseJson<Map<String, Object>> getCheckoutCounter(Integer orderId);
+    ResponseJson<Map<String, Object>> getCheckoutCounter(Integer shopOrderId);
     /**
      *  生成网银支付链接
      * @param payLinkDto {

+ 57 - 5
src/main/java/com/caimei365/order/service/ShipService.java

@@ -1,13 +1,15 @@
 package com.caimei365.order.service;
 
 import com.caimei365.order.model.ResponseJson;
-import com.caimei365.order.model.dto.JsonParamsDto;
-import com.caimei365.order.model.dto.LogisticsBatchDto;
-import com.caimei365.order.model.dto.LogisticsDto;
+import com.caimei365.order.model.dto.*;
 import com.caimei365.order.model.vo.*;
 import com.github.pagehelper.PageInfo;
 import org.springframework.http.HttpHeaders;
+import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
 import java.util.List;
 import java.util.Map;
 
@@ -28,7 +30,7 @@ public interface ShipService {
      * @param pageNum        页码
      * @param pageSize       每页数量
      */
-    ResponseJson<PageInfo<ShopOrderVo>> getShopOrderList(Integer shopId, Integer sendOutStatus, Integer payStatus, String shopOrderNo, String receiver, int pageNum, int pageSize);
+    ResponseJson<PageInfo<ShopOrderVo>> getShopOrderList(Integer shopId, Integer sendOutStatus, Integer payStatus, String shopOrderNo, String receiver, Integer refundStatus, Integer receiptStatus, Integer organizeId, int pageNum, int pageSize);
     /**
      * 供应商结算列表
      * @param shopId         供应商Id
@@ -38,7 +40,20 @@ public interface ShipService {
      * @param pageNum        页码
      * @param pageSize       每页数量
      */
-    ResponseJson<PageInfo<SettlementVo>> getSettlementList(Integer shopId, Integer payStatus, String shopOrderNo, String name, int pageNum, int pageSize);
+    ResponseJson<PageInfo<SettlementVo>> getSettlementList(Integer shopId, Integer payStatus, String shopOrderNo, String name, String beginTime, String endTime, Integer refundStatus, int pageNum, int pageSize);
+
+    /**
+     * 导出excel
+     * @param shopId
+     * @param payStatus
+     * @param shopOrderNo
+     * @param name
+     * @param beginTime
+     * @param endTime
+     * @param refundStatus
+     * @return
+     */
+    List<SettlementDto> exportExcel(Integer shopId, Integer payStatus, String shopOrderNo, String name, String beginTime, String endTime, Integer refundStatus);
     /**
      * 供应商子订单详情
      * @param shopOrderId 子订单Id
@@ -155,4 +170,41 @@ public interface ShipService {
      *                         }, {}]
      */
     ResponseJson<Void> saveProductQualification(JsonParamsDto jsonParamsDto);
+
+    /**
+     * 更改收款状态
+     * @param amount
+     * @param shopOrderId
+     * @return
+     */
+    ResponseJson checkReceipt(Double amount, Integer shopOrderId);
+    /**
+     * 订单备注列表
+     * @param shopOrderId
+     * @return
+     */
+    List<OrderRemarkDto> findList(Integer shopOrderId);
+
+    /**
+     * 插入订单备注
+     * @param remark
+     */
+    void insertRemark(OrderRemarkDto remark);
+
+    /**
+     * 上传备注文件
+     * @param file
+     * @param orderId
+     * @return
+     */
+    ResponseJson<Map<String, Object>> upload(MultipartFile file, Integer orderId);
+
+    /**
+     * 下载
+     * @param fileId
+     * @param request
+     * @param response
+     * @throws IOException
+     */
+    void downFile(Integer fileId, HttpServletRequest request, HttpServletResponse response) throws IOException;
 }

+ 5 - 6
src/main/java/com/caimei365/order/service/SubmitService.java

@@ -3,7 +3,10 @@ package com.caimei365.order.service;
 import com.caimei365.order.model.ResponseJson;
 import com.caimei365.order.model.dto.RechargeDto;
 import com.caimei365.order.model.dto.SubmitDto;
+import com.caimei365.order.model.po.OrderProductPo;
+import com.caimei365.order.model.vo.OrderProductVo;
 
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -13,12 +16,6 @@ import java.util.Map;
  * @date : 2021/7/6
  */
 public interface SubmitService {
-    /**
-     * 验证是否有购买资格
-     * @param submitDto
-     * @return
-     */
-    ResponseJson<Map<String,Object>> verify(SubmitDto submitDto);
     /**
      * 生成订单
      */
@@ -35,4 +32,6 @@ public interface SubmitService {
      *                    }
      */
     ResponseJson<Map<String, Object>> generateRechargeOrder(RechargeDto rechargeDto);
+
+    ResponseJson updateOrder(List<OrderProductVo> orderProducts);
 }

+ 9 - 2
src/main/java/com/caimei365/order/service/impl/AddressServiceImpl.java

@@ -98,7 +98,7 @@ public class AddressServiceImpl implements AddressService {
      *                   defaultFlag  是否默认收货地址(0 不是默认,1 默认)
      */
     @Override
-    public ResponseJson<Integer> addUserAddress(AddressDto addressDto) {
+    public ResponseJson<AddressVo> addUserAddress(AddressDto addressDto) {
         AddressPo address = null;
         if (null != addressDto.getAddressId()) {
             // 获取地址信息
@@ -134,7 +134,14 @@ public class AddressServiceImpl implements AddressService {
             // 更新地址
             addressMapper.updateAddress(address);
         }
-        return ResponseJson.success(1);
+        AddressVo addressVo = addressMapper.getAddressByTownId(addressDto.getTownId());
+        addressVo.setAddress(addressDto.getAddress());
+        addressVo.setUserId(addressDto.getUserId());
+        addressVo.setReceiver(addressDto.getReceiver());
+        addressVo.setMobile(addressDto.getMobile());
+        addressVo.setDefaultFlag(address.getDefaultFlag());
+        addressVo.setAddressId(address.getAddressId());
+        return ResponseJson.success(addressVo);
     }
 
     /**

+ 145 - 47
src/main/java/com/caimei365/order/service/impl/CartClubServiceImpl.java

@@ -199,9 +199,6 @@ public class CartClubServiceImpl implements CartClubService {
                                             shopSvipReducedPrice.set(MathUtil.add(shopSvipReducedPrice, cartItemVo.getSvipTotalReducedPrice()).doubleValue());
                                         }
                                     } else {
-                                        //失效无库存不统计
-                                        totalCount.updateAndGet(v -> v - 1);
-                                        kindCount.updateAndGet(v -> v - 1);
                                         // 获取商品促销信息
                                         PromotionsVo promotions = null;
                                         // 没有店铺促销时,商品促销才有效
@@ -251,7 +248,8 @@ public class CartClubServiceImpl implements CartClubService {
                                             if (1 == cartItemVo.getLadderFlag()) {
                                                 // 设置阶梯价
                                                 productService.setCartLadderPrices(cartItemVo, taxFlag);
-                                            } else {
+                                            }
+                                            /*else {
                                                 // 复购价
                                                 Double repurchase = baseMapper.getRepurchasePrice(cartItemVo.getSkuId(), userId);
                                                 if (null != repurchase && repurchase > 0) {
@@ -262,7 +260,7 @@ public class CartClubServiceImpl implements CartClubService {
                                                         cartItemVo.setPrice(repurchase);
                                                     }
                                                 }
-                                            }
+                                            }*/
                                         }
                                     }
                                 // 该供应商下价格累加
@@ -280,6 +278,9 @@ public class CartClubServiceImpl implements CartClubService {
                                 // 购物车总数量 + 当前商品购买数量
                                 totalCount.updateAndGet(v -> v + cartItemVo.getNumber());
                             } else {
+                                //失效无库存不统计
+                                totalCount.updateAndGet(v -> v - 1);
+                                kindCount.updateAndGet(v -> v - 1);
                                 // 失效商品
                                 if (cartItemVo.getPriceFlag() == 1) {
                                     // 未公开价格
@@ -319,7 +320,9 @@ public class CartClubServiceImpl implements CartClubService {
                             productIterator.remove();
                         }
                     } else {
-                        if (cartItemVo.getValidFlag() == 1) {
+                        // 设置商品图片及税费
+                        productService.setCartItemImgAndTax(cartItemVo);
+                        if (cartItemVo.getValidFlag() == 2) {
                             // 设置商品有效
                             cartItemVo.setStatus(0);
                             // 该供应商下价格累加
@@ -918,7 +921,7 @@ public class CartClubServiceImpl implements CartClubService {
      * @param source 来源 : 1 网站 ; 2 小程序
      */
     @Override
-    public ResponseJson<Map<String, Object>> settlementShoppingCart(Integer userId, String skuIds, Integer source) {
+    public ResponseJson<Map<String, Object>> settlementShoppingCart(Integer userId, Integer townId, String skuIds, Integer source) {
         // 用户组织Id
         Integer organizeId = baseMapper.getOrganizeId(userId);
         log.info("¥¥¥¥¥¥¥¥¥¥ > 商品结算");
@@ -977,6 +980,7 @@ public class CartClubServiceImpl implements CartClubService {
         if (firstSize != shopList.size()) {
             shopList = cartClubMapper.getCartShopsByProductIds(userId, skuIdList, 2);
         }
+        List<CartShopVo> goodsStutas = cartClubMapper.getProductReturnGoodsStutas(skuIdList);
         String helpContent = null;
         boolean flag = false;
         if (null != shopList && shopList.size() > 0) {
@@ -985,9 +989,9 @@ public class CartClubServiceImpl implements CartClubService {
             Integer finalUserIdentity = userIdentity;
             Integer finalUserClubType = userClubType;
             Integer finalUserIdentity1 = userIdentity;
-            for (int i = 0; i < shopList.size(); i++) {
+            for (int i = 0; i < goodsStutas.size(); i++) {
                 //订单中存在不能退货的商品则给出不能退货提示
-                if (null != shopList.get(i).getReturnGoodsStutas() && shopList.get(i).getReturnGoodsStutas() == 2) {
+                if (null != goodsStutas.get(i).getReturnGoodsStutas() && goodsStutas.get(i).getReturnGoodsStutas() == 2) {
                     flag = true;
                     helpContent = cartClubMapper.getHelpContent(1040);
                     break;
@@ -1029,17 +1033,31 @@ public class CartClubServiceImpl implements CartClubService {
                             // 去除库存不足商品
                             productList.removeIf(cartItemVo -> !(cartItemVo.getStock() != null && cartItemVo.getStock() > 0 && cartItemVo.getStock() >= cartItemVo.getMin() && cartItemVo.getStock() >= cartItemVo.getNumber()));
                         }
+                        List<Integer> collect = productList.stream().map(CartItemVo::getSkuId).collect(Collectors.toList());
+                        List<String> skuIdsList = collect.stream().map(String::valueOf).collect(Collectors.toList());
+                        // 设置商品运费
+                        if (null != townId) {
+                            Map<String, Object> postageMap = productService.computePostage(userId, townId, skuIdsList);
+                            shop.setPostage((Double) postageMap.get("postage"));
+                            shop.setPostageFlag((Integer) postageMap.get("postageFlag"));
+                            shop.setUserBeans((Integer) postageMap.get("userBeans"));
+                            shop.setDesignatedFlag((Integer) postageMap.get("designatedFlag"));
+                        }
+                        // 冷链费
+                        Double coldChain = 0d;
                         // 迭代器设置商品信息
                         for (CartItemVo cartItemVo : productList) {
-                            // 设置商品图片及税费
-                            boolean taxFlag = false;
-                            if (0 == organizeId) {
-                                taxFlag = productService.setCartItemImgAndTax(cartItemVo);
-                            } else {
-                                // 图片路径
-                                String image = ImageUtil.getImageUrl("product", cartItemVo.getImage(), domain);
-                                cartItemVo.setImage(image);
+                            // 设置商品
+                            if (7881 == cartItemVo.getProductId()) {
+                                if (cartItemVo.getNumber() >= 100) {
+                                    coldChain = 0d;
+                                } else {
+                                    coldChain = 700d;
+                                    shop.setPostageFlag(1);
+                                }
                             }
+                            // 设置商品图片及税费
+                            boolean taxFlag = productService.setCartItemImgAndTax(cartItemVo);
                             // 是否充值商品
                             boolean recharge = productService.isRechargeProduct(cartItemVo.getProductId());
                             if (recharge) {
@@ -1108,7 +1126,8 @@ public class CartClubServiceImpl implements CartClubService {
                                         if (cartItemVo.getLadderFlag() == 1) {
                                             // 设置阶梯价
                                             productService.setCartLadderPrices(cartItemVo, taxFlag);
-                                        } else {
+                                        }
+                                        /*else {
                                             // 复购价
                                             Double repurchase = baseMapper.getRepurchasePrice(cartItemVo.getSkuId(), userId);
                                             if (null != repurchase && repurchase > 0) {
@@ -1119,7 +1138,7 @@ public class CartClubServiceImpl implements CartClubService {
                                                     cartItemVo.setPrice(repurchase);
                                                 }
                                             }
-                                        }
+                                        }*/
                                     }
                                 }
                             }
@@ -1139,6 +1158,24 @@ public class CartClubServiceImpl implements CartClubService {
                             totalCount.updateAndGet(v -> v + cartItemVo.getNumber());
                         }
 
+                        shop.setColdChain(coldChain);
+                        if (700 == coldChain) {
+                            shop.setIsColdChina(true);
+                        } else {
+                            shop.setIsColdChina(false);
+                        }
+                        // 总费用 + 冷链费
+                        // shopPrice.set(MathUtil.add(shopPrice.get(), coldChain).doubleValue());
+                        // 只有冷链费商品 运费为0
+                        /*if (null != townId) {
+                            if (1 == shop.getDesignatedFlag()) {
+                                shop.setPostage(0d);
+                            }
+                        }*/
+                        // 总运费
+                        shop.setAllPostage(MathUtil.add(shop.getPostage(),coldChain).doubleValue());
+                        // 供应商总金额
+                        shopPrice.set(MathUtil.add(shopPrice.get(), shop.getAllPostage()).doubleValue());
                         if (shopKindCount.get() > 0) {
                             // 店铺促销
                             if (null != shopPromotion) {
@@ -1337,7 +1374,7 @@ public class CartClubServiceImpl implements CartClubService {
      * @return
      */
     @Override
-    public ResponseJson<Map<String, Object>> MultipleBuyNow(Integer userId, String productInfo, Integer source) {
+    public ResponseJson<Map<String, Object>> MultipleBuyNow(Integer userId, Integer townId, String productInfo, Integer source) {
         log.info("¥¥¥¥¥¥¥¥¥¥ > 组合商品立即购买");
         // 商品种类
         AtomicInteger kindCount = new AtomicInteger(0);
@@ -1402,6 +1439,7 @@ public class CartClubServiceImpl implements CartClubService {
 
         // 商品的供应商列表
         List<CartShopVo> shopList = cartClubMapper.getShopsByProductIds(productIdList);
+        List<CartShopVo> goodsStutas = cartClubMapper.getProductReturnGoodsStutas(skuIdList.stream().map(String::valueOf).collect(Collectors.toList()));
         //按供应商分类统计商品
         String helpContent = null;
         boolean flag = false;
@@ -1411,9 +1449,9 @@ public class CartClubServiceImpl implements CartClubService {
             Integer finalUserIdentity = userIdentity;
             Integer finalUserClubType = userClubType;
             Integer finalUserIdentity1 = userIdentity;
-            for (int i = 0; i < shopList.size(); i++) {
+            for (int i = 0; i < goodsStutas.size(); i++) {
                 //订单中存在不能退货的商品则给出不能退货提示
-                if (null != shopList.get(i).getReturnGoodsStutas() && shopList.get(i).getReturnGoodsStutas() == 2) {
+                if (null != goodsStutas.get(i).getReturnGoodsStutas() && goodsStutas.get(i).getReturnGoodsStutas() == 2) {
                     flag = true;
                     helpContent = cartClubMapper.getHelpContent(1040);
                     break;
@@ -1449,8 +1487,30 @@ public class CartClubServiceImpl implements CartClubService {
                         productList.removeIf(cartItemVo -> !(cartItemVo.getPriceFlag() == 0 || (cartItemVo.getPriceFlag() == 2 && (finalUserIdentity == 2 || svipUserFlag)) || (cartItemVo.getPriceFlag() == 3 && finalUserClubType == 1)));
                         // 去除库存不足商品
                         productList.removeIf(cartItemVo -> !(cartItemVo.getStock() != null && cartItemVo.getStock() > 0 && cartItemVo.getStock() >= cartItemVo.getMin() && cartItemVo.getStock() >= cartItemVo.getNumber()));
+                        // 设置商品运费
+                        List<Integer> collect = productList.stream().map(CartItemVo::getSkuId).collect(Collectors.toList());
+                        List<String> skuIdsList = collect.stream().map(String::valueOf).collect(Collectors.toList());
+                        if (null != townId) {
+                            Map<String, Object> postageMap = productService.computePostage(userId, townId, skuIdsList);
+                            shop.setPostage((Double) postageMap.get("postage"));
+                            shop.setPostageFlag((Integer) postageMap.get("postageFlag"));
+                            shop.setUserBeans((Integer) postageMap.get("userBeans"));
+                            shop.setDesignatedFlag((Integer) postageMap.get("designatedFlag"));
+                        }
+                        Double coldChain = 0d;
                         // 迭代器设置商品信息
                         for (CartItemVo cartItemVo : productList) {
+                            // 设置商品运费
+                            if (null != townId) {
+                                if (7881 == cartItemVo.getProductId()) {
+                                    if (cartItemVo.getNumber() >= 100) {
+                                        coldChain = 0d;
+                                    } else {
+                                        coldChain = 700d;
+                                        shop.setPostageFlag(1);
+                                    }
+                                }
+                            }
                             // 设置商品图片及税费
                             boolean taxFlag = productService.setCartItemImgAndTax(cartItemVo);
                             // 是否充值商品
@@ -1516,7 +1576,8 @@ public class CartClubServiceImpl implements CartClubService {
                                     if (cartItemVo.getLadderFlag() == 1) {
                                         // 设置阶梯价
                                         productService.setCartLadderPrices(cartItemVo, taxFlag);
-                                    } else {
+                                    }
+                                    /*else {
                                         // 复购价
                                         Double repurchase = baseMapper.getRepurchasePrice(cartItemVo.getSkuId(), userId);
                                         if (null != repurchase && repurchase > 0) {
@@ -1527,7 +1588,7 @@ public class CartClubServiceImpl implements CartClubService {
                                                 cartItemVo.setPrice(repurchase);
                                             }
                                         }
-                                    }
+                                    }*/
                                 }
                             }
                             // 该供应商下价格累加
@@ -1544,6 +1605,24 @@ public class CartClubServiceImpl implements CartClubService {
                             totalCount.updateAndGet(v -> v + cartItemVo.getNumber());
                         }
 
+                        shop.setColdChain(coldChain);
+                        if (700 == coldChain) {
+                            shop.setIsColdChina(true);
+                        } else {
+                            shop.setIsColdChina(false);
+                        }
+                        // 总费用 + 冷链费
+                        // shopPrice.set(MathUtil.add(shopPrice.get(), coldChain).doubleValue());
+                        // 只有冷链费商品 运费为0
+                        /*if (null != townId) {
+                            if (1 == shop.getDesignatedFlag()) {
+                                shop.setPostage(0d);
+                            }
+                        }*/
+                        // 总运费
+                        shop.setAllPostage(MathUtil.add(shop.getPostage(),coldChain).doubleValue());
+                        // 供应商总金额
+                        shopPrice.set(MathUtil.add(shopPrice.get(), shop.getAllPostage()).doubleValue());
                         if (shopKindCount.get() > 0) {
                             // 店铺促销
                             if (null != shopPromotion) {
@@ -1788,21 +1867,16 @@ public class CartClubServiceImpl implements CartClubService {
         }
         cartItemVo.setNumber(cartDto.getProductCount());
         // 库存不足商品
-        if (!(cartItemVo.getStock() != null && cartItemVo.getStock() > 0 && cartItemVo.getStock() >= cartItemVo.getMin() && cartItemVo.getStock() >= cartItemVo.getNumber())) {
-            return ResponseJson.error("商品库存不足!", null);
-        }
+//        if (!(cartItemVo.getStock() != null && cartItemVo.getStock() > 0 && cartItemVo.getStock() >= cartItemVo.getMin() && cartItemVo.getStock() >= cartItemVo.getNumber())) {
+//            return ResponseJson.error("商品库存不足!", null);
+//        }
         // 供应商Id集合,用户判断赠品供应商是否在当前供应商中
         List<Integer> shopIds = new ArrayList<>();
         shopIds.add(shop.getShopId());
         List<CartShopVo> shopList = new ArrayList<>();
         // 设置商品图片及税费
-        boolean taxFlag = false;
-        if (0 == organizeId) {
-            taxFlag = productService.setCartItemImgAndTax(cartItemVo);
-        } else {
-            String image = ImageUtil.getImageUrl("product", cartItemVo.getImage(), domain);
-            cartItemVo.setImage(image);
-        }
+        boolean taxFlag = productService.setCartItemImgAndTax(cartItemVo);
+
         // 促销活动(总)
         List<PromotionsVo> totalPromotions = new ArrayList<>();
         // 统计商品总金额
@@ -1812,7 +1886,6 @@ public class CartClubServiceImpl implements CartClubService {
         AtomicDouble reducedPrice = new AtomicDouble(0);
         // svip优惠金额
         AtomicDouble svipReducedPrice = new AtomicDouble(0);
-
         // 供应商促销优惠活动
         PromotionsVo promotions = baseMapper.getPromotionByShopId(shop.getShopId());
         if (promotions != null && promotions.getSeen() != null && promotions.getSeen() == 2 && userIdentity == 1) {
@@ -1887,7 +1960,8 @@ public class CartClubServiceImpl implements CartClubService {
                     if (cartItemVo.getLadderFlag() == 1) {
                         // 设置阶梯价
                         productService.setCartLadderPrices(cartItemVo, taxFlag);
-                    } else {
+                    }
+                    /*else {
                         // 复购价
                         Double repurchase = baseMapper.getRepurchasePrice(cartItemVo.getSkuId(), cartDto.getUserId());
                         if (null != repurchase && repurchase > 0) {
@@ -1898,10 +1972,44 @@ public class CartClubServiceImpl implements CartClubService {
                                 cartItemVo.setPrice(repurchase);
                             }
                         }
-                    }
+                    }*/
                 }
             }
         }
+        // 计算运费
+        Double coldChain = 0d;
+        if (null != cartDto.getTownId()) {
+            List<String> skuIds = new ArrayList<>();
+            skuIds.add(cartDto.getSkuId().toString());
+            Map<String, Object> postageMap = productService.computePostage(cartDto.getUserId(), cartDto.getTownId(), skuIds);
+            shop.setPostage((Double) postageMap.get("postage"));
+            shop.setPostageFlag((Integer) postageMap.get("postageFlag"));
+            shop.setUserBeans((Integer) postageMap.get("userBeans"));
+            shop.setDesignatedFlag((Integer) postageMap.get("designatedFlag"));
+            if (7881 == cartItemVo.getProductId()) {
+                if (cartItemVo.getNumber() >= 100) {
+                    coldChain = 0d;
+                } else {
+                    coldChain = 700d;
+                    shop.setPostageFlag(1);
+                    // totalPrice.set(MathUtil.add(totalPrice.get(), coldChain).doubleValue());
+                    shop.setIsColdChina(true);
+                }
+            } else {
+                shop.setIsColdChina(false);
+            }
+            shop.setColdChain(coldChain);
+        }
+        // 只有冷链费商品 运费为0
+        /*if (null != cartDto.getTownId()) {
+            if (1 == shop.getDesignatedFlag()) {
+                shop.setPostage(0d);
+            }
+        }*/
+        // 总运费
+        shop.setAllPostage(MathUtil.add(shop.getPostage(),coldChain).doubleValue());
+        // 供应商总金额
+        totalPrice.set(MathUtil.add(totalPrice.get(), shop.getAllPostage()).doubleValue());
         // 商品总金额累加
         originalPrice.set(MathUtil.mul(cartItemVo.getNumber(), cartItemVo.getOriginalPrice()).doubleValue());
         totalPrice.set(MathUtil.add(totalPrice.get(), MathUtil.mul(cartItemVo.getNumber(), cartItemVo.getPrice())).doubleValue());
@@ -1998,16 +2106,6 @@ public class CartClubServiceImpl implements CartClubService {
         resultData.put("couponList", couponList);
         // 联合丽格冷链费
         if (0 != organizeId) {
-            double coldChain = 0.00d;
-            if (7881 == cartDto.getProductId()) {
-                if (cartDto.getProductCount() >= 100) {
-                    coldChain = 0.00d;
-                } else {
-                    coldChain = 700.00d;
-                }
-            } else {
-                coldChain = 0.00d;
-            }
             resultData.put("coldChain", coldChain);
         }
         if (flag) {

+ 49 - 10
src/main/java/com/caimei365/order/service/impl/CartSellerServiceImpl.java

@@ -196,7 +196,8 @@ public class CartSellerServiceImpl implements CartSellerService {
                                 if (cartItemVo.getLadderFlag() == 1) {
                                     // 设置阶梯价
                                     productService.setCartLadderPrices(cartItemVo, taxFlag);
-                                } else {
+                                }
+                                /*else {
                                     // 复购价
                                     Double repurchase = baseMapper.getRepurchasePrice(cartItemVo.getSkuId(), clubUserId);
                                     if (null != repurchase && repurchase > 0) {
@@ -207,7 +208,7 @@ public class CartSellerServiceImpl implements CartSellerService {
                                             cartItemVo.setPrice(repurchase);
                                         }
                                     }
-                                }
+                                }*/
                             }
                         }
                         // 再来一单的商品前端默认勾选
@@ -517,7 +518,7 @@ public class CartSellerServiceImpl implements CartSellerService {
      * @param skuIds            skuIds
      */
     @Override
-    public ResponseJson<Map<String, Object>> settlementSellerCart(Integer serviceProviderId, Integer clubId, String skuIds) {
+    public ResponseJson<Map<String, Object>> settlementSellerCart(Integer serviceProviderId, Integer townId, Integer clubId, String skuIds) {
         log.info("¥¥¥¥¥¥¥¥¥¥ > 商品结算(协销帮机构下单)");
         // 商品种类
         AtomicInteger kindCount = new AtomicInteger(0);
@@ -539,7 +540,6 @@ public class CartSellerServiceImpl implements CartSellerService {
         List<Integer> promotionsIds = new ArrayList<>();
         // 供应商Id集合,用户判断赠品供应商是否在当前供应商中
         List<Integer> shopIds = new ArrayList<>();
-
         // 前端接收商品Id信息
         List<String> skuIdList = new ArrayList<>();
         if (skuIds.contains(",")) {
@@ -575,8 +575,28 @@ public class CartSellerServiceImpl implements CartSellerService {
                 }
                 // 供应商下商品列表
                 List<CartItemVo> productList = cartSellerMapper.getCartProductsByProductIds(serviceProviderId, clubId, shop.getShopId(), finalIdList);
+                List<Integer> collect = productList.stream().map(CartItemVo::getSkuId).collect(Collectors.toList());
+                List<String> skuIdsList = collect.stream().map(String::valueOf).collect(Collectors.toList());
+                // 设置商品运费
+                if (null != townId) {
+                    Map<String, Object> postageMap = productService.computePostage(clubUserId, townId, skuIdsList);
+                    shop.setPostage((Double) postageMap.get("postage"));
+                    shop.setPostageFlag((Integer) postageMap.get("postageFlag"));
+                    shop.setUserBeans((Integer) postageMap.get("userBeans"));
+                    shop.setDesignatedFlag((Integer) postageMap.get("designatedFlag"));
+                }
+                // 冷链费
+                AtomicDouble coldChain = new AtomicDouble(0);
                 if (null != productList && productList.size() > 0) {
                     for (CartItemVo cartItemVo : productList) {
+                        if (7881 == cartItemVo.getProductId()) {
+                            if (cartItemVo.getNumber() >= 100) {
+                                coldChain.set(0);
+                            } else {
+                                coldChain.set(700);
+                                shop.setPostageFlag(1);
+                            }
+                        }
                         // 设置商品图片及税费
                         boolean taxFlag = productService.setCartItemImgAndTax(cartItemVo);
                         // 是否充值商品
@@ -647,7 +667,8 @@ public class CartSellerServiceImpl implements CartSellerService {
                                 if (cartItemVo.getLadderFlag() == 1) {
                                     // 设置阶梯价
                                     productService.setCartLadderPrices(cartItemVo, taxFlag);
-                                } else {
+                                }
+                                /*else {
                                     // 复购价
                                     Double repurchase = baseMapper.getRepurchasePrice(cartItemVo.getSkuId(), clubUserId);
                                     if (null != repurchase && repurchase > 0) {
@@ -658,7 +679,7 @@ public class CartSellerServiceImpl implements CartSellerService {
                                             cartItemVo.setPrice(repurchase);
                                         }
                                     }
-                                }
+                                }*/
                             }
                         }
                         // 该供应商下价格累加
@@ -673,6 +694,23 @@ public class CartSellerServiceImpl implements CartSellerService {
                         // 总数量 + 当前商品购买数量
                         totalCount.updateAndGet(v -> v + cartItemVo.getNumber());
                     }
+
+                    shop.setColdChain(coldChain.get());
+                    if (700 == coldChain.get()) {
+                        shop.setIsColdChina(true);
+                    } else {
+                        shop.setIsColdChina(false);
+                    }
+                    // 只有冷链费商品 运费为0
+                    /*if (null != townId) {
+                        if (1 == shop.getDesignatedFlag()) {
+                            shop.setPostage(0d);
+                        }
+                    }*/
+                    // 总运费
+                    shop.setAllPostage(MathUtil.add(shop.getPostage(),coldChain.get()).doubleValue());
+                    // 供应商总金额
+                    shopPrice.set(MathUtil.add(shopPrice.get(), shop.getAllPostage()).doubleValue());
                     if (shopKindCount.get() > 0) {
                         // 店铺促销
                         if (null != shopPromotion) {
@@ -733,7 +771,7 @@ public class CartSellerServiceImpl implements CartSellerService {
                         // 供应商总超级会员优惠
                         shop.setSvipReducedPrice(shopSvipReducedPrice.get());
                         // 供应商划线价
-                        shop.setOriginalPrice(MathUtil.add(shopPrice.get(), shopReduction).doubleValue());
+                        shop.setOriginalPrice(MathUtil.sub(MathUtil.add(shopPrice.get(), shopReduction), shop.getAllPostage()).doubleValue());
 
                         // 添加供应商Id集合
                         shopIds.add(shop.getShopId());
@@ -748,6 +786,7 @@ public class CartSellerServiceImpl implements CartSellerService {
                     }
                     totalProductList.addAll(productList);
                 }
+
                 // 供应商下商品种类
                 shop.setCount(shopKindCount.get());
             });
@@ -945,12 +984,12 @@ public class CartSellerServiceImpl implements CartSellerService {
         // 返回数据
         Map<String, Object> resultData = new HashMap<>();
         // 获取订单里用户Id
-        Integer orderUserId = cartSellerMapper.getOrderUserIdByOrderId(againBuyDto.getOrderId());
-        Integer orderClubId = cartSellerMapper.getOrderClubIdByOrderId(againBuyDto.getOrderId());
+        Integer orderUserId = cartSellerMapper.getOrderUserIdByShopOrderId(againBuyDto.getShopOrderId());
+        Integer orderClubId = cartSellerMapper.getOrderClubIdByShopOrderId(againBuyDto.getShopOrderId());
         if (null == orderUserId || orderUserId == 0 || null == orderClubId || orderClubId == 0) {
             return ResponseJson.error("订单异常或不存在!", null);
         }
-        List<CartItemVo> productList = cartSellerMapper.getOrderProductNum(againBuyDto.getOrderId());
+        List<CartItemVo> productList = cartSellerMapper.getShopOrderProductNum(againBuyDto.getShopOrderId());
         // 移除运费商品
         productList.removeIf(cartItemVo -> (null == cartItemVo || null == cartItemVo.getValidFlag() || cartItemVo.getProductId() == 999));
         // 总商品种类数量

+ 282 - 161
src/main/java/com/caimei365/order/service/impl/HeliPayServiceImpl.java

@@ -4,16 +4,17 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.caimei365.order.components.HeliPayUtil;
 import com.caimei365.order.components.OnlinePostFormUtil;
+import com.caimei365.order.components.OrderCommonService;
 import com.caimei365.order.components.WeChatService;
 import com.caimei365.order.constant.Constant;
 import com.caimei365.order.mapper.BaseMapper;
 import com.caimei365.order.mapper.OrderCommonMapper;
+import com.caimei365.order.mapper.OrderRefundMapper;
 import com.caimei365.order.mapper.PayOrderMapper;
 import com.caimei365.order.model.ResponseJson;
 import com.caimei365.order.model.bo.PayParamBo;
 import com.caimei365.order.model.dto.BankListDto;
 import com.caimei365.order.model.dto.HeliDto;
-import com.caimei365.order.model.enums.AccountPayOrderType;
 import com.caimei365.order.model.enums.AppPayType;
 import com.caimei365.order.model.enums.OrderStatus;
 import com.caimei365.order.model.enums.PayType;
@@ -28,6 +29,7 @@ import com.caimei365.order.utils.helipay.HttpClientService;
 import com.caimei365.order.utils.helipay.MessageHandle;
 import com.caimei365.order.utils.helipay.MyBeanUtils;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.util.concurrent.AtomicDouble;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.http.HttpStatus;
@@ -35,14 +37,12 @@ import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.http.HttpHeaders;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import java.beans.IntrospectionException;
 import java.io.IOException;
 import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
-import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
@@ -77,7 +77,11 @@ public class HeliPayServiceImpl implements HeliPayService {
     @Resource
     private RemoteCallService remoteCallService;
     @Resource
+    private OrderCommonService orderCommonService;
+    @Resource
     private WeChatService weChatService;
+    @Resource
+    private OrderRefundMapper refundMapper;
     @Value("${caimei.wwwDomain}")
     private String domain;
 
@@ -634,153 +638,153 @@ public class HeliPayServiceImpl implements HeliPayService {
         return openId;
     }
 
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public void delayedSplitting(String callUrl) {
-        log.info("【延时分账】>>>>>>>>>>延时分账,每一小时执行一次");
-        Calendar calendar = Calendar.getInstance();
-        calendar.setTime(new Date());
-        //todo 测试 不减时间,现在有就分账
-        //测试查5分钟前的单
-        calendar.add(Calendar.SECOND, -5);
-//        calendar.add(Calendar.DAY_OF_MONTH, -1);
-        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-        String currentTime = format.format(calendar.getTime());
-        // 查询未分账已支付收款      排除线上订金/充值订单
-        List<OrderReceiptRelationPo> orderRelations = payOrderMapper.getUndividedPaidReceipt(currentTime);
-        if (null != orderRelations && orderRelations.size() > 0) {
-            for (OrderReceiptRelationPo orderRelation : orderRelations) {
-                log.info("【延时分账】>>>>>>>>>>订单id:" + orderRelation.getOrderId() + "进入延时分账");
-                // 收款对应的订单信息
-                OrderVo order = orderCommonMapper.getOrderByOrderId(orderRelation.getOrderId());
-                PayParamBo payParam = new PayParamBo();
-                //支付金额
-                payParam.setPayAmount(MathUtil.mul(orderRelation.getAssociateAmount(), 100).intValue());
-                if (12 == orderRelation.getPayType()) {
-                    // 网银支付
-                    payParam.setPayWay("UNIONPAY");
-                }
-                if (17 == orderRelation.getPayType()) {
-                    //b2c网银
-                    payParam.setPayWay("B2C");
-                }
-                //微信0.65%手续费
-                if (8 == orderRelation.getPayType() || 13 == orderRelation.getPayType() || 15 == orderRelation.getPayType()) {
-                    payParam.setPayWay("WX");
-                }
-                List<SplitAccountPo> splitBillDetail = setSplitAccountDetail(order, payParam);
-                List<Map<String, String>> maps = new ArrayList<>();
-                List<ShopOrderVo> shopOrderList = orderCommonMapper.getShopOrderListByOrderId(order.getOrderId());
-                for (ShopOrderVo shopOrder : shopOrderList) {
-                    double shopTotalAmount = 0.00;
-                    String subUserNo = "";
-                    for (SplitAccountPo account : splitBillDetail) {
-                        //供应商有支付平台账户type=4
-                        if (null != account.getType() && 4 == account.getType() && shopOrder.getShopId().equals(account.getShopId())) {
-                            shopTotalAmount = MathUtil.add(shopTotalAmount, account.getSplitAccount()).doubleValue();
-                            subUserNo = account.getSubUserNo();
-                        }
-                    }
-//                    addMaps(maps, shopTotalAmount, subUserNo);
-                }
-                if (null == splitBillDetail || splitBillDetail.size() == 0) {
-                    log.info("无满足条件分账单号");
-                    return;
-                }
-                //公账-专票总金额,私账-无票总金额,公账-普票总金额
-                //Type2,3奥泰,1,5信息
-                //todo 正式改
-                String sp1 = "";
-                BigDecimal totalAmount1 = BigDecimal.ZERO;
-                String sp2 = "";
-                BigDecimal totalAmount2 = BigDecimal.ZERO;
-                for (SplitAccountPo account : splitBillDetail) {
-                    if (1 == account.getType() || 5 == account.getType()) {
-                        totalAmount1 = MathUtil.add(totalAmount1, account.getSplitAccount());
-                        sp1 = account.getSubUserNo();
-                    }
-                    if (2 == account.getType() || 3 == account.getType()) {
-                        totalAmount2 = MathUtil.add(totalAmount2, account.getSplitAccount());
-                        sp2 = account.getSubUserNo();
-                    }
-                }
-                ArrayList<AccountPayOrder.AccountPayOrderExt.SplitBillRule> splitBillRules = new ArrayList<>();
-                if (MathUtil.compare(totalAmount1, 0.01) > 0) {
-                    AccountPayOrder.AccountPayOrderExt.SplitBillRule splitBillRule = new AccountPayOrder.AccountPayOrderExt.SplitBillRule();
-                    splitBillRule.setSplitBillAmount(totalAmount1);
-                    splitBillRule.setSplitBillMerchantNo(sp1);
-                    splitBillRules.add(splitBillRule);
-                }
-                if (MathUtil.compare(totalAmount2, 0.01) > 0) {
-                    AccountPayOrder.AccountPayOrderExt.SplitBillRule splitBillRule = new AccountPayOrder.AccountPayOrderExt.SplitBillRule();
-                    splitBillRule.setSplitBillAmount(totalAmount2);
-                    splitBillRule.setSplitBillMerchantNo(sp2);
-                    splitBillRules.add(splitBillRule);
-                }
-                //第三方分账接口
-                try {
-                    AccountPayOrder accountPayOrder = new AccountPayOrder();
-                    accountPayOrder.setP1_bizType("AccountPaySub");
-                    accountPayOrder.setP2_signType("MD5");
-                    String format1 = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss.SSS").format(new Date());
-                    accountPayOrder.setP3_timestamp(format1);
-                    String substring = format1.substring(20);
-                    // fz+当前微秒时间+原唯一订单号
-                    accountPayOrder.setP4_orderId("FZ" + substring + orderRelation.getOrderRequestNo());
-                    //todo 付款账户商编暂用网络
-                    accountPayOrder.setP5_customerNumber(Constant.CUSTOMERNUM2);
-                    AccountPayOrder.AccountPayOrderExt accountPayOrderExt = new AccountPayOrder.AccountPayOrderExt();
-                    //收款账户商编  填写splitBillRules时候不填写MerchantNo,Amount并且即使填写这两个参数不生效!!
-//                    accountPayOrderExt.setInMerchantNo(splitMoneyVo.getName());
-                    accountPayOrderExt.setOrderType(AccountPayOrderType.TRANSFER);
-//                    accountPayOrderExt.setAmount(splitMoneyVo.getSplitMoney());
-                    accountPayOrderExt.setServerCallbackUrl(callUrl);
-                    accountPayOrderExt.setGoodsName("分账");
-
-                    if (null != splitBillRules && splitBillRules.size() > 0) {
-                        accountPayOrderExt.setSplitBillRules(splitBillRules);
-                    }
-                    String ext = JSON.toJSONString(accountPayOrderExt);
-                    log.info("分账规则串json串:" + ext);
-                    accountPayOrder.setP6_ext(ext);
-                    // 生成签名
-                    StringBuilder builder = new StringBuilder();
-                    builder.append(SPLIT)
-                            .append(accountPayOrder.getP1_bizType()).append(SPLIT)
-                            .append(accountPayOrder.getP2_signType()).append(SPLIT)
-                            .append(accountPayOrder.getP3_timestamp()).append(SPLIT)
-                            .append(accountPayOrder.getP4_orderId()).append(SPLIT)
-                            .append(accountPayOrder.getP5_customerNumber()).append(SPLIT)
-                            .append(accountPayOrder.getP6_ext()).append(SPLIT)
-                            .append(XUNI);
-                    String sign = Disguiser.disguiseMD5(builder.toString().trim());
-                    Map<String, String> bean = convertBean(accountPayOrder);
-                    log.info("--------------------> 发送分账参数:  " + bean);
-                    Map<String, String> map = postForm(bean, Constant.FZ, sign, Map.class);
-                    log.info("----------------分账返回数据: " + map.toString());
-                    if (map != null) {
-                        String code = map.get("rt5_retCode");
-                        if (!"0000".equals(code)) {
-                            String msg = map.get("rt6_retMsg");
-                            log.info("【延时分账】>>>>>>>>>>第三方延迟分账失败>>>>>>>msg:" + msg);
-                        } else {
-                            for (SplitAccountPo splitAccount : splitBillDetail) {
-                                splitAccount.setMbOrderId(orderRelation.getMbOrderId());
-                                splitAccount.setOrderRequestNo(substring + orderRelation.getOrderRequestNo());
-                                splitAccount.setPayStatus(1);
-                                // 保存分账详情
-                                payOrderMapper.insertSplitAccount(splitAccount);
-                            }
-                            log.info("【延时分账】>>>>>>>>>>此订单分账结束");
-                        }
-                    }
-                } catch (Exception e) {
-                    log.error("【延时分账】>>>>>>>>>>错误信息", e);
-                }
-
-            }
-        }
-    }
+//    @Override
+//    @Transactional(rollbackFor = Exception.class)
+//    public void delayedSplitting(String callUrl) {
+//        log.info("【延时分账】>>>>>>>>>>延时分账,每一小时执行一次");
+//        Calendar calendar = Calendar.getInstance();
+//        calendar.setTime(new Date());
+//        //todo 测试 不减时间,现在有就分账
+//        //测试查5分钟前的单
+//        calendar.add(Calendar.SECOND, -5);
+////        calendar.add(Calendar.DAY_OF_MONTH, -1);
+//        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+//        String currentTime = format.format(calendar.getTime());
+//        // 查询未分账已支付收款      排除线上订金/充值订单
+//        List<OrderReceiptRelationPo> orderRelations = payOrderMapper.getUndividedPaidReceipt(currentTime);
+//        if (null != orderRelations && orderRelations.size() > 0) {
+//            for (OrderReceiptRelationPo orderRelation : orderRelations) {
+//                log.info("【延时分账】>>>>>>>>>>订单id:" + orderRelation.getOrderId() + "进入延时分账");
+//                // 收款对应的订单信息
+//                OrderVo order = orderCommonMapper.getOrderByOrderId(orderRelation.getOrderId());
+//                PayParamBo payParam = new PayParamBo();
+//                //支付金额
+//                payParam.setPayAmount(MathUtil.mul(orderRelation.getAssociateAmount(), 100).intValue());
+//                if (12 == orderRelation.getPayType()) {
+//                    // 网银支付
+//                    payParam.setPayWay("UNIONPAY");
+//                }
+//                if (17 == orderRelation.getPayType()) {
+//                    //b2c网银
+//                    payParam.setPayWay("B2C");
+//                }
+//                //微信0.65%手续费
+//                if (8 == orderRelation.getPayType() || 13 == orderRelation.getPayType() || 15 == orderRelation.getPayType()) {
+//                    payParam.setPayWay("WX");
+//                }
+//                List<SplitAccountPo> splitBillDetail = setSplitAccountDetail(order, payParam);
+//                List<Map<String, String>> maps = new ArrayList<>();
+//                List<ShopOrderVo> shopOrderList = orderCommonMapper.getShopOrderListByOrderId(order.getOrderId());
+//                for (ShopOrderVo shopOrder : shopOrderList) {
+//                    double shopTotalAmount = 0.00;
+//                    String subUserNo = "";
+//                    for (SplitAccountPo account : splitBillDetail) {
+//                        //供应商有支付平台账户type=4
+//                        if (null != account.getType() && 4 == account.getType() && shopOrder.getShopId().equals(account.getShopId())) {
+//                            shopTotalAmount = MathUtil.add(shopTotalAmount, account.getSplitAccount()).doubleValue();
+//                            subUserNo = account.getSubUserNo();
+//                        }
+//                    }
+////                    addMaps(maps, shopTotalAmount, subUserNo);
+//                }
+//                if (null == splitBillDetail || splitBillDetail.size() == 0) {
+//                    log.info("无满足条件分账单号");
+//                    return;
+//                }
+//                //公账-专票总金额,私账-无票总金额,公账-普票总金额
+//                //Type2,3奥泰,1,5信息
+//                //todo 正式改
+//                String sp1 = "";
+//                BigDecimal totalAmount1 = BigDecimal.ZERO;
+//                String sp2 = "";
+//                BigDecimal totalAmount2 = BigDecimal.ZERO;
+//                for (SplitAccountPo account : splitBillDetail) {
+//                    if (1 == account.getType() || 5 == account.getType()) {
+//                        totalAmount1 = MathUtil.add(totalAmount1, account.getSplitAccount());
+//                        sp1 = account.getSubUserNo();
+//                    }
+//                    if (2 == account.getType() || 3 == account.getType()) {
+//                        totalAmount2 = MathUtil.add(totalAmount2, account.getSplitAccount());
+//                        sp2 = account.getSubUserNo();
+//                    }
+//                }
+//                ArrayList<AccountPayOrder.AccountPayOrderExt.SplitBillRule> splitBillRules = new ArrayList<>();
+//                if (MathUtil.compare(totalAmount1, 0.01) > 0) {
+//                    AccountPayOrder.AccountPayOrderExt.SplitBillRule splitBillRule = new AccountPayOrder.AccountPayOrderExt.SplitBillRule();
+//                    splitBillRule.setSplitBillAmount(totalAmount1);
+//                    splitBillRule.setSplitBillMerchantNo(sp1);
+//                    splitBillRules.add(splitBillRule);
+//                }
+//                if (MathUtil.compare(totalAmount2, 0.01) > 0) {
+//                    AccountPayOrder.AccountPayOrderExt.SplitBillRule splitBillRule = new AccountPayOrder.AccountPayOrderExt.SplitBillRule();
+//                    splitBillRule.setSplitBillAmount(totalAmount2);
+//                    splitBillRule.setSplitBillMerchantNo(sp2);
+//                    splitBillRules.add(splitBillRule);
+//                }
+//                //第三方分账接口
+//                try {
+//                    AccountPayOrder accountPayOrder = new AccountPayOrder();
+//                    accountPayOrder.setP1_bizType("AccountPaySub");
+//                    accountPayOrder.setP2_signType("MD5");
+//                    String format1 = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss.SSS").format(new Date());
+//                    accountPayOrder.setP3_timestamp(format1);
+//                    String substring = format1.substring(20);
+//                    // fz+当前微秒时间+原唯一订单号
+//                    accountPayOrder.setP4_orderId("FZ" + substring + orderRelation.getOrderRequestNo());
+//                    //todo 付款账户商编暂用网络
+//                    accountPayOrder.setP5_customerNumber(Constant.CUSTOMERNUM2);
+//                    AccountPayOrder.AccountPayOrderExt accountPayOrderExt = new AccountPayOrder.AccountPayOrderExt();
+//                    //收款账户商编  填写splitBillRules时候不填写MerchantNo,Amount并且即使填写这两个参数不生效!!
+////                    accountPayOrderExt.setInMerchantNo(splitMoneyVo.getName());
+//                    accountPayOrderExt.setOrderType(AccountPayOrderType.TRANSFER);
+////                    accountPayOrderExt.setAmount(splitMoneyVo.getSplitMoney());
+//                    accountPayOrderExt.setServerCallbackUrl(callUrl);
+//                    accountPayOrderExt.setGoodsName("分账");
+//
+//                    if (null != splitBillRules && splitBillRules.size() > 0) {
+//                        accountPayOrderExt.setSplitBillRules(splitBillRules);
+//                    }
+//                    String ext = JSON.toJSONString(accountPayOrderExt);
+//                    log.info("分账规则串json串:" + ext);
+//                    accountPayOrder.setP6_ext(ext);
+//                    // 生成签名
+//                    StringBuilder builder = new StringBuilder();
+//                    builder.append(SPLIT)
+//                            .append(accountPayOrder.getP1_bizType()).append(SPLIT)
+//                            .append(accountPayOrder.getP2_signType()).append(SPLIT)
+//                            .append(accountPayOrder.getP3_timestamp()).append(SPLIT)
+//                            .append(accountPayOrder.getP4_orderId()).append(SPLIT)
+//                            .append(accountPayOrder.getP5_customerNumber()).append(SPLIT)
+//                            .append(accountPayOrder.getP6_ext()).append(SPLIT)
+//                            .append(XUNI);
+//                    String sign = Disguiser.disguiseMD5(builder.toString().trim());
+//                    Map<String, String> bean = convertBean(accountPayOrder);
+//                    log.info("--------------------> 发送分账参数:  " + bean);
+//                    Map<String, String> map = postForm(bean, Constant.FZ, sign, Map.class);
+//                    log.info("----------------分账返回数据: " + map.toString());
+//                    if (map != null) {
+//                        String code = map.get("rt5_retCode");
+//                        if (!"0000".equals(code)) {
+//                            String msg = map.get("rt6_retMsg");
+//                            log.info("【延时分账】>>>>>>>>>>第三方延迟分账失败>>>>>>>msg:" + msg);
+//                        } else {
+//                            for (SplitAccountPo splitAccount : splitBillDetail) {
+//                                splitAccount.setMbOrderId(orderRelation.getMbOrderId());
+//                                splitAccount.setOrderRequestNo(substring + orderRelation.getOrderRequestNo());
+//                                splitAccount.setPayStatus(1);
+//                                // 保存分账详情
+//                                payOrderMapper.insertSplitAccount(splitAccount);
+//                            }
+//                            log.info("【延时分账】>>>>>>>>>>此订单分账结束");
+//                        }
+//                    }
+//                } catch (Exception e) {
+//                    log.error("【延时分账】>>>>>>>>>>错误信息", e);
+//                }
+//
+//            }
+//        }
+//    }
 
     @Override
     public String delayedSplittingCallback(AccountResVo data) {
@@ -1178,15 +1182,24 @@ public class HeliPayServiceImpl implements HeliPayService {
     }
 
     @Override
-    public ResponseJson<List<ShopOrderVo>> getShopOrders(Integer orderId) {
-        String shopOrderId = baseMapper.findShopOrderIds(orderId);
-        // 子订单
-        if (StringUtils.isBlank(shopOrderId)) {
-            return ResponseJson.error("子订单为空!", null);
-        }
-        String[] shopOrderIdArr = shopOrderId.split(",");
-        List<String> shopOrderIds = Arrays.asList(shopOrderIdArr);
-        List<ShopOrderVo> shopOrderList = orderCommonMapper.getShopOrderList(shopOrderIds);
+    public ResponseJson<List<ShopOrderVo>> getShopOrders(Integer orderId, Integer shopOrderId) {
+        String[] shopOrderIdArr;
+        List<String> shopOrderIds = new ArrayList<>();
+        if (null != orderId) {
+            String getShopOrderId = baseMapper.findShopOrderIds(orderId);
+            // 子订单
+            if (StringUtils.isBlank(getShopOrderId)) {
+                return ResponseJson.error("子订单为空!", null);
+            }
+             shopOrderIdArr = getShopOrderId.split(",");
+             shopOrderIds = Arrays.asList(shopOrderIdArr);
+        } else {
+            if (null == shopOrderId) {
+                return ResponseJson.error("子订单为空!", null);
+            }
+            shopOrderIds.add(shopOrderId.toString());
+        }
+        List<ShopOrderVo> shopOrderList = orderCommonMapper.getPayShopOrderList(shopOrderIds);
         shopOrderList.forEach(shopOrder -> {
             // 店铺促销活动
             PromotionsVo shopPromotion = null;
@@ -1194,6 +1207,7 @@ public class HeliPayServiceImpl implements HeliPayService {
                 shopPromotion = orderCommonMapper.getOrderPromotionsById(shopOrder.getOrderPromotionsId());
                 shopOrder.setShopPromotion(shopPromotion);
             }
+            AtomicReference<Boolean> reference = new AtomicReference<>(true);
             List<OrderProductVo> orderProductList = orderCommonMapper.getShopOrderProduct(shopOrder.getShopOrderId());
             orderProductList.removeIf(Objects::isNull);
             orderProductList.forEach(orderProduct -> {
@@ -1201,8 +1215,8 @@ public class HeliPayServiceImpl implements HeliPayService {
                 boolean taxFlag = (Integer.valueOf(0).equals(orderProduct.getIncludedTax()) && (Integer.valueOf(1).equals(orderProduct.getInvoiceType()) || Integer.valueOf(2).equals(orderProduct.getInvoiceType())));
                 if (taxFlag) {
                     Double valueTax = MathUtil.div(MathUtil.mul(orderProduct.getPrice(), orderProduct.getTaxRate()), 100).doubleValue();
-                    orderProduct.setPrice(MathUtil.add(orderProduct.getPrice(), valueTax).doubleValue());
-                    orderProduct.setDiscountPrice(MathUtil.add(orderProduct.getDiscountPrice(), orderProduct.getAddedValueTax()).doubleValue());
+                    // orderProduct.setPrice(MathUtil.add(orderProduct.getPrice(), valueTax).doubleValue());
+                    // orderProduct.setDiscountPrice(MathUtil.add(orderProduct.getDiscountPrice(), orderProduct.getAddedValueTax()).doubleValue());
                 }
                 orderProduct.setImage(ImageUtil.getImageUrl("product", orderProduct.getImage(), domain));
                 // 查询订单下商品的促销活动
@@ -1234,13 +1248,57 @@ public class HeliPayServiceImpl implements HeliPayService {
                 if (null != orderProduct.getTotalFee()) {
                     orderProduct.setTotalAmount(orderProduct.getTotalFee());
                 }
+                // 商品分帐号
+                if (StringUtils.isEmpty(orderProduct.getSplitCode()) || StringUtils.isBlank(orderProduct.getSplitCode())) {
+                    reference.set(false);
+                }
             });
+            if (null == shopOrder.getRealPay()) {
+                shopOrder.setRealPay(shopOrder.getNeedPayAmount());
+            }
             shopOrder.setObligation(MathUtil.sub(shopOrder.getRealPay(), shopOrder.getReceiptAmount()).doubleValue());
             if (998 == shopOrder.getShopId()) {
                 shopOrder.setObligation(shopOrder.getTotalAmount());
             }
             shopOrder.setOrderProductList(orderProductList);
             shopOrder.setShopLogo(ImageUtil.getImageUrl("shopLogo", shopOrder.getShopLogo(), domain));
+            // 子订单支付方式
+            AtomicReference<Integer> onlinePay = new AtomicReference<>(0);
+
+            // 供应商是否支持线上下线
+            if (null != shopOrder.getPayway()) {
+                onlinePay.set(shopOrder.getPayway());
+            }
+            // 线上分帐号
+            String shopCode = payOrderMapper.getShopCode(shopOrder.getShopId());
+            if (null == shopCode) {
+                onlinePay.set(2);
+            }
+            // 支付记录
+            List<DiscernReceiptVo> shopOrderReceipt = orderCommonMapper.getShopOrderReceipt(shopOrder.getShopOrderId());
+            AtomicDouble finalReceiptAmount = new AtomicDouble(0d);
+            // 1线上,2线下,3余额抵扣
+            if (null != shopOrderReceipt) {
+                shopOrderReceipt.forEach(receipt -> {
+                    finalReceiptAmount.set(MathUtil.add(finalReceiptAmount.get(), receipt.getReceiptAmount()).doubleValue());
+                    if (1 == receipt.getPayWay()) {
+                        onlinePay.set(1);
+                    } else {
+                        onlinePay.set(2);
+                    }
+                });
+            }
+            // 商品无分帐号线下
+            if (!reference.get()) {
+                onlinePay.set(2);
+            }
+            // 余额抵扣只能下线
+            if (1 == shopOrder.getUseBalanceFlag()) {
+                onlinePay.set(2);
+            }
+            shopOrder.setReceiptAmount(MathUtil.add(shopOrder.getReceiptAmount(), finalReceiptAmount.get()).doubleValue());
+            shopOrder.setOnlinePay(onlinePay.get());
+            orderCommonService.setPostageInfo(shopOrder);
         });
         return ResponseJson.success(shopOrderList);
     }
@@ -1735,6 +1793,69 @@ public class HeliPayServiceImpl implements HeliPayService {
         return ResponseJson.success(banks);
     }
 
+    @Override
+    public String refundSplittingCallback(AccountResVo data) {
+        log.info("网银退款分账异步回调参数-------------------》 " + data.toString());
+        try {
+            String oriMessage = MyBeanUtils.getSigned(data, null);
+            oriMessage = oriMessage + SPLIT + XUNI;
+            String checkSign = Disguiser.disguiseMD5(oriMessage.trim());
+            log.info("网银退款回调签名 :" + data.getSign());
+            log.info("checkSign : " + checkSign);
+            if (!checkSign.equals(data.getSign())) {
+                log.info("网银退款分账异步回调验签失败------------------");
+                return "验签失败";
+            }
+            // wytk+sss + orderRequestNo
+            String orderRequestNo = data.getRt7_orderId().substring(7);
+            String status = data.getRt10_orderStatus();
+            log.info("【网银退款分账回调】>>>>>>>>>>分账状态:" + status);
+            if (!"SUCCESS".equals(status)) {
+                return "分账失败";
+            }
+            OrderReceiptRelationPo po = refundMapper.findOrderRelationByNo(orderRequestNo);
+            // 网银退款
+            Map<String, String> sPara = new HashMap<String, String>();
+            sPara.put("P1_bizType", "OnlineRefund");
+            sPara.put("P2_orderId", orderRequestNo);
+            sPara.put("P3_customerNumber", po.getSplitCode());
+            sPara.put("P4_refundAmount", po.getAssociateAmount().toString());
+            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(po.getSplitCode()).append("&").
+                    append(po.getAssociateAmount().toString()).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());
+                return "分账失败";
+            } else {
+                String assemblyRespOriSign = MyBeanUtils.getSignedByPresetParameter(on, OnlineRefundData.NEED_SIGN_PARAMS);
+                log.info("组装返回结果签名串:" + assemblyRespOriSign);
+                assemblyRespOriSign += Constant.SPLIT + Constant.WANGYIN;
+                String backSign = Disguiser.disguiseMD5(assemblyRespOriSign.trim());
+                if (!backSign.equals(on.getSign())) {
+                    log.error("网银退款验签失败========================" + on.getRt3_retMsg());
+                    return "分账失败";
+                } else {
+                    CmRefundRecord cmRefundRecord = new CmRefundRecord();
+                    cmRefundRecord.setRefundAmount(Double.parseDouble(po.getAssociateAmount().toString()));
+                    cmRefundRecord.setOrderRequestNo(orderRequestNo);
+                    cmRefundRecord.setShopOrderId(po.getShopOrderId());
+                    refundMapper.insertCmRefundRecord(cmRefundRecord);
+                    log.info("网银退款成功");
+                }
+            }
+        } catch (Exception e) {
+            log.error("【网银退款手续费转账失败】>>>>>>>>>>网银退款分账异常", e);
+            return "分账失败";
+        }
+        return "SUCCESS";
+    }
+
     public static <T> T postForm(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()) {

+ 237 - 194
src/main/java/com/caimei365/order/service/impl/OrderClubServiceImpl.java

@@ -137,10 +137,25 @@ public class OrderClubServiceImpl implements OrderClubService {
      * @param pageSize   每页数量
      */
     @Override
-    public ResponseJson<PageInfo<OrderVo>> getOrderList(Integer userId, Integer orderState, String orderNo, String beginTime, String endTime, int pageNum, int pageSize) {
+    public ResponseJson<PageInfo<ShopOrderVo>> getOrderList(Integer userId, Integer orderState, String orderNo, String beginTime, String endTime, int pageNum, int pageSize) {
         // 分页请求数据
         PageHelper.startPage(pageNum, pageSize);
-        List<OrderVo> orderList = orderClubMapper.getOrderList(userId, orderState, orderNo, beginTime, endTime);
+        List<ShopOrderVo> shopOrderList = orderClubMapper.getShopOrderList(userId, orderState, orderNo, beginTime, endTime);
+        shopOrderList.forEach(shopOrder -> {
+            // 设置订单状态
+            orderCommonService.setShopOrderStatus(shopOrder);
+            // 设置数据
+            orderCommonService.setShopOrderInfo(shopOrder);
+            // 设置子订单付款金额
+            orderCommonService.getDiscernReceiptAndSetShoporder(shopOrder);
+            // 联合丽格 [待付款]或者线下支付[部分付款] 的子订单 状态
+            if ((4 != shopOrder.getStatus() && 5 != shopOrder.getStatus()) && ((1 == shopOrder.getReceiptStatus() && (2 == shopOrder.getOnlinePay() || 0 == shopOrder.getOnlinePay())) || (2 == shopOrder.getReceiptStatus() && 2 == shopOrder.getOnlinePay()))) {
+                shopOrder.setCheckFlag(2);
+            } else {
+                shopOrder.setCheckFlag(1);
+            }
+        });
+        /*List<OrderVo> orderList = orderClubMapper.getOrderList(userId, orderState, orderNo, beginTime, endTime);
         orderList.forEach(order -> {
             // 设置订单状态
             orderCommonService.setOrderStatus(order);
@@ -156,8 +171,8 @@ public class OrderClubServiceImpl implements OrderClubService {
                     order.setCheckFlag(0);
                 }
             }
-        });
-        PageInfo<OrderVo> pageInfo = new PageInfo(orderList);
+        });*/
+        PageInfo<ShopOrderVo> pageInfo = new PageInfo(shopOrderList);
         return ResponseJson.success(pageInfo);
     }
 
@@ -170,26 +185,27 @@ public class OrderClubServiceImpl implements OrderClubService {
      * @param pageSize   每页数量
      */
     @Override
-    public ResponseJson<PageInfo<OrderVo>> getOrderListByKeyword(Integer userId, String searchWord, int pageNum, int pageSize) {
+    public ResponseJson<PageInfo<ShopOrderVo>> getOrderListByKeyword(Integer userId, String searchWord, int pageNum, int pageSize) {
         Integer identity = baseMapper.getIdentityByUserId(userId);
         // 设置搜索关键词历史记录
         orderCommonService.setHistoryRecord(userId, searchWord);
         PageHelper.startPage(pageNum, pageSize);
-        List<OrderVo> orderList = orderClubMapper.getOrderListByKeyword(searchWord, userId);
+        // List<OrderVo> orderList = orderClubMapper.getOrderListByKeyword(searchWord, userId);
+        List<ShopOrderVo> shopOrderList = orderClubMapper.getShopOrderListByKeyword(searchWord, userId);
         //获取主订单数据
-        orderList.forEach(order -> {
+        shopOrderList.forEach(shopOrder -> {
             // 设置订单状态
-            orderCommonService.setOrderStatus(order);
+            orderCommonService.setShopOrderStatus(shopOrder);
             // 设置子订单数据
-            orderCommonService.getShopOrderData(order);
+            orderCommonService.setShopOrderInfo(shopOrder);
             // 设置付款金额
-            orderCommonService.getDiscernReceiptAndSetOrder(order);
+            orderCommonService.getDiscernReceiptAndSetShoporder(shopOrder);
         });
         //不是协销,订单不可见屏蔽
         if (identity != 1) {
-            orderList.removeIf(o -> o.getOrderSeen().equals(2));
+            shopOrderList.removeIf(o -> o.getOrderSeen().equals(2));
         }
-        PageInfo<OrderVo> pageInfo = new PageInfo(orderList);
+        PageInfo<ShopOrderVo> pageInfo = new PageInfo(shopOrderList);
         return ResponseJson.success(pageInfo);
     }
 
@@ -197,42 +213,37 @@ public class OrderClubServiceImpl implements OrderClubService {
      * 机构订单详情
      *
      * @param userId  用户Id
-     * @param orderId 订单Id
+     * @param shopOrderId 订单Id
      */
     @Override
-    public ResponseJson<Map<String, Object>> getOrderDetail(Integer userId, Integer orderId) {
-        OrderPo orderPo = orderClubMapper.getMainOrderByOrderId(orderId);
-        if (null == orderPo) {
+    public ResponseJson<Map<String, Object>> getOrderDetail(Integer userId, Integer shopOrderId) {
+//        OrderPo orderPo = orderClubMapper.getMainOrderByOrderId(orderId);
+        ShopOrderVo shopOrder = orderClubMapper.getShopOrderById(shopOrderId);
+        if (null == shopOrder) {
             return ResponseJson.error("该订单不存在!", null);
         }
-        if (!userId.equals(orderPo.getUserId())) {
+        if (!userId.equals(shopOrder.getUserId())) {
             return ResponseJson.error("无权限查看此订单!", null);
         }
-        OrderVo order = new OrderVo();
+//        OrderVo order = new OrderVo();
         // OrderPo -> OrderVo
-        BeanUtils.copyProperties(orderPo, order);
-        if (0 != order.getOrganizeId()) {
-            if ((6 != order.getStatus() && 7 != order.getStatus()) && (1 == order.getReceiptStatus() || (2 == order.getReceiptStatus() && 1 == order.getOnlinePayFlag()))) {
-                order.setCheckFlag(1);
-            } else {
-                order.setCheckFlag(0);
-            }
-        }
-        order.setOrderMark("#" + order.getOrderId() + "#");
+//        BeanUtils.copyProperties(orderPo, order);
+
+        shopOrder.setOrderMark("#" + shopOrder.getShopOrderId() + "#");
         // 设置订单状态
-        orderCommonService.setOrderStatus(order);
-        // 设置子订单数据
-        orderCommonService.getShopOrderData(order);
+        orderCommonService.setShopOrderStatus(shopOrder);
+        // 设置子订单信息
+        orderCommonService.setShopOrderInfo(shopOrder);
         // 子订单列表
-        List<ShopOrderVo> shopOrderList = order.getShopOrderList();
+//        List<ShopOrderVo> shopOrderList = order.getShopOrderList();
         AtomicDouble expensesOfTaxation = new AtomicDouble(0d);
-        shopOrderList.forEach(shopOrder -> {
+//        shopOrderList.forEach(shopOrder -> {
             List<OrderProductVo> orderProductList = shopOrder.getOrderProductList();
             orderProductList.forEach(orderProduct -> {
                 // 是否充值商品
                 boolean recharge = productService.isRechargeProduct(orderProduct.getProductId());
                 if (recharge) {
-                    order.setRechargeGoods(true);
+                    shopOrder.setRechargeGoods(true);
                 }
                 //是否能退货
                 if (null != orderProduct.getReturnGoodsStutas() && 2 == orderProduct.getReturnGoodsStutas()) {
@@ -261,18 +272,30 @@ public class OrderClubServiceImpl implements OrderClubService {
                     orderProduct.setIncludedTaxFlag(3);
                 }
             });
-        });
-        order.setExpensesOfTaxation(expensesOfTaxation.get());
+            // 支付凭证
+            List<VoucherPo> voucher = orderClubMapper.getVoucher(shopOrder.getShopOrderId());
+            // 支付凭证图片
+            if (null != voucher) {
+                List<Integer> ids = voucher.stream().map(VoucherPo::getId).collect(Collectors.toList());
+                List<VoucherImageDto> voucherImage = orderClubMapper.getVoucherImage(ids);
+                voucher.forEach(v -> {
+                    List<VoucherImageDto> imageList = voucherImage.stream().filter(m -> m.getVoucherId().equals(v.getId())).collect(Collectors.toList());
+                    v.setImgs(imageList);
+                });
+            }
+            shopOrder.setVoucher(voucher);
+//        });
+        shopOrder.setExpensesOfTaxation(expensesOfTaxation.get());
         // 发票信息
         InvoiceVo invoice = null;
-        if (null != order.getInvoiceFlag() && order.getInvoiceFlag() > 0) {
-            invoice = orderCommonMapper.getOrderInvoice(orderId);
+        if (null != shopOrder.getInvoiceFlag() && shopOrder.getInvoiceFlag() > 0) {
+            invoice = orderCommonMapper.getOrderInvoice(shopOrder.getOrderId());
             invoice.setUserId(userId);
         }
         // 可用余额
         Double availableMoney = baseMapper.getAbleUserMoney(userId);
         // 付款金额
-        List<DiscernReceiptVo> discernReceiptList = orderCommonService.getDiscernReceiptAndSetOrder(order);
+        List<DiscernReceiptVo> discernReceiptList = orderCommonService.getDiscernReceiptAndSetShoporder(shopOrder);
         if (null != discernReceiptList && discernReceiptList.size() > 0) {
             discernReceiptList.forEach(d -> {
                 if (29 == d.getPayType() || 30 == d.getPayType()) {
@@ -287,60 +310,48 @@ public class OrderClubServiceImpl implements OrderClubService {
             });
         }
         // 退款记录
-        List<ReturnedPurchaseVo> returnedPurchaseList = orderClubMapper.getReturnedPurchaseList(order.getOrderId());
+        List<ReturnedPurchaseVo> returnedPurchaseList = orderClubMapper.getReturnedPurchaseList(shopOrder.getOrderId());
         if (!returnedPurchaseList.isEmpty()) {
             AtomicDouble returnedPurchaseFee = new AtomicDouble(0d);
             returnedPurchaseList.forEach(returnedPurchase -> returnedPurchaseFee.set(MathUtil.add(returnedPurchaseFee.get(), returnedPurchase.getRefundFee()).doubleValue()));
             //退款总金额
-            order.setReturnedPurchaseFee(returnedPurchaseFee.get());
+            shopOrder.setReturnedPurchaseFee(returnedPurchaseFee.get());
+        }
+        if ((4 != shopOrder.getStatus() && 5 != shopOrder.getStatus()) && ((1 == shopOrder.getReceiptStatus() && (2 == shopOrder.getOnlinePay() || 0 == shopOrder.getOnlinePay())) || (2 == shopOrder.getReceiptStatus() && 2 == shopOrder.getOnlinePay()))) {
+            shopOrder.setCheckFlag(2);
+        } else {
+            shopOrder.setCheckFlag(1);
         }
         //售后条款
         ClauseVo clause = null;
         // 非二手
-        if (0 == order.getSecondHandOrderFlag()) {
-            Integer clauseId = order.getClauseId() == null ? 1 : order.getClauseId();
+        if (0 == shopOrder.getSecondHandOrderFlag()) {
+            Integer clauseId = shopOrder.getClauseId() == null ? 1 : shopOrder.getClauseId();
             clause = orderClubMapper.getClauseById(clauseId);
         }
         // 收货地址
-        OrderUserinfoVo userInfo = addressMapper.getOrderUserinfo(orderId);
+        OrderUserinfoVo userInfo = addressMapper.getOrderUserinfo(shopOrder.getOrderId());
         //订单中存在不能退货的商品则给出不能退货提示
         boolean flag = false;
         String helpContent = null;
-        if (null != shopOrderList && shopOrderList.size() > 0) {
-            for (ShopOrderVo so : shopOrderList) {
-                List<OrderProductVo> orderProductList = so.getOrderProductList();
-                if (null != orderProductList && orderProductList.size() > 0) {
-                    for (OrderProductVo op : orderProductList) {
-                        if (null != op.getReturnGoodsStutas() && op.getReturnGoodsStutas() == 2) {
-                            flag = true;
-                            helpContent = op.getHelpContent();
-                        }
-                    }
+        if (null != orderProductList && orderProductList.size() > 0) {
+            for (OrderProductVo op : orderProductList) {
+                if (null != op.getReturnGoodsStutas() && op.getReturnGoodsStutas() == 2) {
+                    flag = true;
+                    helpContent = op.getHelpContent();
                 }
             }
         }
-        // 支付凭证
-//        VoucherPo voucherPo = new VoucherPo();
-        List<VoucherPo> voucher = orderClubMapper.getVoucher(orderId);
-        // 支付凭证图片
-        if (null != voucher) {
-            List<Integer> ids = voucher.stream().map(VoucherPo::getId).collect(Collectors.toList());
-            List<VoucherImageDto> voucherImage = orderClubMapper.getVoucherImage(ids);
-            voucher.forEach(v -> {
-                List<VoucherImageDto> imageList = voucherImage.stream().filter(m -> m.getVoucherId().equals(v.getId())).collect(Collectors.toList());
-                v.setImgs(imageList);
-            });
-        }
+
         Map<String, Object> map = new HashMap<>();
-        map.put("order", order);
-        map.put("shopOrderList", shopOrderList);
+        map.put("shopOrder", shopOrder);
+        map.put("voucher", voucher);
         map.put("orderInvoice", invoice);
         map.put("ableUserMoney", availableMoney);
         map.put("userInfo", userInfo);
         map.put("discernReceiptList", discernReceiptList);
         map.put("returnedPurchaseList", returnedPurchaseList);
         map.put("clause", clause);
-        map.put("voucher",voucher);
         if (flag) {
             map.put("returnGoodsStutas", 2);
             map.put("helpContent", helpContent);
@@ -360,10 +371,10 @@ public class OrderClubServiceImpl implements OrderClubService {
      */
     @Override
     public ResponseJson voucher(VoucherDto voucherDto) {
-        if (null == voucherDto.getOrderId()) {
+        if (null == voucherDto.getShopOrderId()) {
             return ResponseJson.error(-1,"订单Id不能为空",null);
         }
-        // 修改支付凭证
+        // 上传支付凭证
         orderClubMapper.insertVoucher(voucherDto);
         // 修改支付凭证图片
         if (!"".equals(voucherDto.getVoucherImgs())) {
@@ -424,16 +435,16 @@ public class OrderClubServiceImpl implements OrderClubService {
     /**
      * 机构确认订单
      *
-     * @param orderId 订单Id
+     * @param shopOrderId 订单Id
      */
     @Override
-    public ResponseJson<Void> confirmMainOrder(Integer orderId) {
-        OrderPo order = orderClubMapper.getMainOrderByOrderId(orderId);
-        if (null == order || OrderStatus.UNCONFIRMED.getCode() != order.getStatus()) {
+    public ResponseJson<Void> confirmMainOrder(Integer shopOrderId) {
+        ShopOrderVo shopOrder = orderClubMapper.getShopOrderById(shopOrderId);
+        if (null == shopOrder || 0 != shopOrder.getStatus()) {
             // 非待确认订单
             return ResponseJson.error("订单异常!", null);
         }
-        if (MathUtil.compare(order.getCouponAmount(), 0) > 0) {
+        /*if (MathUtil.compare(order.getCouponAmount(), 0) > 0) {
             // 确认订单时才真正使用优惠券
             CouponOrderRecordPo couponOrderRecord = orderClubMapper.getOrderCouponRecord(orderId);
             CouponVo coupon = orderClubMapper.getClubCouponById(couponOrderRecord.getClubCouponId(), orderClubMapper.findUserId(orderId));
@@ -442,11 +453,11 @@ public class OrderClubServiceImpl implements OrderClubService {
             } else {
                 orderClubMapper.updateCouponClubStatus(couponOrderRecord.getClubCouponId(), orderId);
             }
-        }
+        }*/
         Date date = new Date();
         String curDateStr = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(date);
         String note = "【确认订单】";
-        List<OrderProductPo> orderProducts = orderClubMapper.getOrderProductList(orderId);
+        List<OrderProductPo> orderProducts = orderClubMapper.getShopOrderProductList(shopOrderId);
         orderProducts.forEach(product -> {
             // 是否二手商品
             boolean secondFlag = false;
@@ -454,34 +465,31 @@ public class OrderClubServiceImpl implements OrderClubService {
                 secondFlag = true;
             }
             // 更新复购价格库
-            productService.savePurchasePrice(order, product, secondFlag, note);
+             // productService.savePurchasePrice(order, product, secondFlag, note);
             // 二手商品确认商品如果是二手仪器则需要把该二手商品置为已售
             if (secondFlag) {
                 orderClubMapper.updateSecondStatus(product.getProductId(), 1);
             }
         });
-        if (null != order.getBalancePayFee() && MathUtil.compare(order.getBalancePayFee(), 0) > 0) {
-            double userMoney = baseMapper.getUserMoney(order.getUserId());
-            double updateMoney = MathUtil.sub(userMoney, order.getBalancePayFee()).doubleValue();
+        if (null != shopOrder.getAccountAmount() && MathUtil.compare(shopOrder.getAccountAmount(), 0) > 0) {
+            double userMoney = baseMapper.getUserMoney(shopOrder.getUserId());
+            double updateMoney = MathUtil.sub(userMoney, shopOrder.getAccountAmount()).doubleValue();
             // 扣除用户余额
-            orderClubMapper.updateUserMoneyByUserId(updateMoney, order.getUserId());
-            log.info(note + ">>>>>>>>>>>更新用户余额(update[user(userMoney)])userId:" + order.getUserId() + ",orderId:" + orderId);
+            orderClubMapper.updateUserMoneyByUserId(updateMoney, shopOrder.getUserId());
+            log.info(note + ">>>>>>>>>>>更新用户余额(update[user(userMoney)])userId:" + shopOrder.getUserId() + ",shopOrderId:" + shopOrderId);
             // 保存余额到收款记录
-            productService.saveDiscernReceipt(order.getBalancePayFee(), orderId, note);
+            productService.saveShopOrderDiscernReceipt(shopOrder.getAccountAmount(), shopOrder, note);
         }
-        if (null == order.getBalancePayFee() || order.getBalancePayFee() == 0d) {
-            order.setStatus(11);
-            order.setReceiptStatus(1);
-        } else if (null != order.getBalancePayFee() && MathUtil.compare(order.getBalancePayFee(), order.getPayTotalFee()) < 0) {
-            order.setStatus(21);
-            order.setReceiptStatus(2);
+        if (null == shopOrder.getAccountAmount() || shopOrder.getAccountAmount() == 0d) {
+            shopOrder.setReceiptStatus(1);
+        } else if (null != shopOrder.getAccountAmount() && MathUtil.compare(shopOrder.getAccountAmount(), shopOrder.getTotalAmount()) < 0) {
+            shopOrder.setReceiptStatus(2);
         } else {
-            order.setStatus(31);
-            order.setReceiptStatus(3);
+            shopOrder.setReceiptStatus(3);
         }
         Integer count = 0;
         log.info("********************下单微信公众号消息推送***************************");
-        if (0 == order.getSecondHandOrderFlag() && 0 == order.getRebateFlag() && !orderClubMapper.getProductOrder(order.getOrderId()).contains(6060) && order.getOrderType() != 0) {
+        /*if (0 == order.getSecondHandOrderFlag() && 0 == order.getRebateFlag() && !orderClubMapper.getProductOrder(order.getOrderId()).contains(6060) && order.getOrderType() != 0) {
             log.info("*******" + order.getSecondHandOrderFlag() + "**********" + order.getRebateFlag());
             log.info("*******获取公众名" + orderClubMapper.getOrderIds(orderId).toString());
             String name = "0";
@@ -552,28 +560,28 @@ public class OrderClubServiceImpl implements OrderClubService {
             } else {
                 log.info("》》》》》推送了协销下单短信");
             }
-        }
-        order.setUpdateDate(curDateStr);
-        order.setConfirmTime(curDateStr);
+        }*/
+        /*order.setUpdateDate(curDateStr);
+        order.setConfirmTime(curDateStr);*/
         //确认订单状态
-        order.setConfirmFlag(2);
+        shopOrder.setStatus(1);
         // 更新订单状态
-        orderClubMapper.updateOrderStatus(order);
+        orderClubMapper.updateShopOrderStatus(shopOrder);
         return ResponseJson.success("确认订单成功!", null);
     }
 
     /**
      * 机构取消订单
      *
-     * @param orderId      订单Id
+     * @param shopOrderId      订单Id
      * @param userIdentity 用户身份 1协销 其他用户
      * @param remark       备注(订单取消原因)
      */
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public ResponseJson<Void> cancelMainOrder(Integer orderId, Integer userIdentity, String remark) {
-        OrderPo order = orderClubMapper.getMainOrderByOrderId(orderId);
-        boolean cancelFlag = (null != order && (OrderStatus.UNCONFIRMED.getCode() == order.getStatus() || OrderStatus.UNRECEIVED_AND_UNSHIPPED.getCode() == order.getStatus()));
+    public ResponseJson<Void> cancelMainOrder(Integer shopOrderId, Integer userIdentity, String remark) {
+        ShopOrderVo shopOrder = orderClubMapper.getShopOrderById(shopOrderId);
+        boolean cancelFlag = (null != shopOrder && (0 == shopOrder.getStatus() || (1 == shopOrder.getStatus() && 1 == shopOrder.getReceiptStatus())));
         if (!cancelFlag) {
             // 非待确认(或待收待发)订单
             return ResponseJson.error("订单异常!", null);
@@ -582,23 +590,23 @@ public class OrderClubServiceImpl implements OrderClubService {
         String curDateStr = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(date);
         String note = "【取消订单】";
         // 余额退回原账户
-        if (null != order.getBalancePayFee() && MathUtil.compare(order.getBalancePayFee(), 0) > 0) {
-            double ableUserMoney = baseMapper.getAbleUserMoney(order.getUserId());
-            double updateMoney = MathUtil.add(ableUserMoney, order.getBalancePayFee()).doubleValue();
+        if (null != shopOrder.getAccountAmount() && MathUtil.compare(shopOrder.getAccountAmount(), 0) > 0) {
+            double ableUserMoney = baseMapper.getAbleUserMoney(shopOrder.getUserId());
+            double updateMoney = MathUtil.add(ableUserMoney, shopOrder.getAccountAmount()).doubleValue();
             // 退回用户可用余额
-            orderClubMapper.updateAbleUserMoneyByUserId(updateMoney, order.getUserId());
-            log.info(note + ">>>>>>>>>>>可用余额退回原账户(update[user(ableUserMoney)])userId:" + order.getUserId() + ",orderId:" + orderId);
+            orderClubMapper.updateAbleUserMoneyByUserId(updateMoney, shopOrder.getUserId());
+            log.info(note + ">>>>>>>>>>>可用余额退回原账户(update[user(ableUserMoney)])userId:" + shopOrder.getUserId() + ",shopOrderId:" + shopOrderId);
             // 取消收支记录
             BalanceRecordPo balanceRecord = new BalanceRecordPo();
-            balanceRecord.setUserId(order.getUserId());
-            balanceRecord.setOrderId(orderId);
+            balanceRecord.setUserId(shopOrder.getUserId());
+            balanceRecord.setShopOrderId(shopOrderId);
             balanceRecord.setRemark("取消订单,余额记录无效");
             balanceRecord.setDelFlag(1);
             // 取消 余额收支记录
             orderClubMapper.cancelBalanceRecord(balanceRecord);
-            log.info(note + ">>>>>>>>>>>>取消余额收支记录(update[cm_user_balance_record])orderId:" + orderId);
+            log.info(note + ">>>>>>>>>>>>取消余额收支记录(update[cm_user_balance_record])shopOrderId:" + shopOrderId);
         }
-        order.setStatus(6);
+        shopOrder.setStatus(4);
         if (StringUtils.isBlank(remark)) {
             if (userIdentity == 1) {
                 remark = "协销帮用户取消订单";
@@ -606,13 +614,13 @@ public class OrderClubServiceImpl implements OrderClubService {
                 remark = "用户主动取消订单";
             }
         }
-        order.setCloseReason(remark);
-        order.setCloseTime(curDateStr);
+        /*order.setCloseReason(remark);
+        order.setCloseTime(curDateStr);*/
         // 取消 订单
-        orderClubMapper.cancelMainOrder(order);
+        orderClubMapper.cancelMainShopOrder(shopOrder);
         //二手订单取消订单, 二手商品标记未售
-        if (1 == order.getSecondHandOrderFlag()) {
-            List<OrderProductPo> orderProducts = orderClubMapper.getOrderProductList(orderId);
+        if (1 == shopOrder.getSecondHandOrderFlag()) {
+            List<OrderProductPo> orderProducts = orderClubMapper.getShopOrderProductList(shopOrderId);
             orderProducts.forEach(product -> {
                 // 是否二手商品
                 boolean secondFlag = false;
@@ -626,7 +634,7 @@ public class OrderClubServiceImpl implements OrderClubService {
             });
         }
         //推送信息中心-取消订单
-        MessageCenter messageCenter = new MessageCenter();
+        /*MessageCenter messageCenter = new MessageCenter();
         messageCenter.setShopID(null);
         messageCenter.setClubID(order.getClubId());
         messageCenter.setUserType(1);
@@ -635,44 +643,50 @@ public class OrderClubServiceImpl implements OrderClubService {
         messageCenter.setOrderID(orderId);
         messageCenter.setContent("您的订单已成功取消!");
         messageCenter.setTime(curDateStr);
-        orderClubMapper.addMessageCenter(messageCenter);
+        orderClubMapper.addMessageCenter(messageCenter);*/
+        // 子订单状态
+        List<Integer> shopOrderStatus = orderClubMapper.getShopOrderStatus(shopOrder.getOrderId());
+        boolean flag = false;
+        if (shopOrderStatus.stream().allMatch(s -> s == 4)) {
+            flag = true;
+        }
         // 退回 采美豆
-        if (null != order.getUserBeans() && order.getUserBeans() > 0) {
+        if (null != shopOrder.getUserBeans() && shopOrder.getUserBeans() > 0 && flag) {
             UserBeansHistoryPo beansHistory = new UserBeansHistoryPo();
-            beansHistory.setUserId(order.getUserId());
-            beansHistory.setOrderId(orderId);
+            beansHistory.setUserId(shopOrder.getUserId());
+            beansHistory.setOrderId(shopOrder.getOrderId());
             beansHistory.setBeansType(9);
             beansHistory.setType(1);
-            beansHistory.setNum(order.getUserBeans());
+            beansHistory.setNum(shopOrder.getUserBeans());
             beansHistory.setPushStatus(0);
             beansHistory.setAddTime(date);
             beansHistory.setDelFlag(0);
             // 用户采美豆
-            Integer userBeans = baseMapper.getUserBeans(order.getUserId());
+            Integer userBeans = baseMapper.getUserBeans(shopOrder.getUserId());
             // 更新用户剩余采美豆数量
             int beans = userBeans + beansHistory.getNum();
             productService.updateUserBeans(beansHistory, beans, note);
         }
-        if (order.getPayTotalFee() != null && order.getPayTotalFee() < 1000) {
+        if (shopOrder.getTotalAmount() != null && shopOrder.getTotalAmount() < 1000) {
             //查本单是否扣豆子,有就返回
-            UserBeansHistoryPo bean = baseMapper.findLowOrder(orderId);
+            UserBeansHistoryPo bean = baseMapper.findLowOrder(shopOrder.getShopOrderId());
             if (bean != null) {
                 //有扣豆子记录
                 UserBeansHistoryPo beansHistory = new UserBeansHistoryPo();
-                beansHistory.setUserId(order.getUserId());
-                beansHistory.setOrderId(orderId);
+                beansHistory.setUserId(shopOrder.getUserId());
+                beansHistory.setOrderId(shopOrder.getShopOrderId());
                 beansHistory.setBeansType(16);
                 beansHistory.setType(1);
                 beansHistory.setNum(500);
                 beansHistory.setPushStatus(0);
                 beansHistory.setAddTime(date);
                 beansHistory.setDelFlag(0);
-                int beans = baseMapper.getUserBeans(order.getUserId()) + 500;
+                int beans = baseMapper.getUserBeans(shopOrder.getUserId()) + 500;
                 productService.updateUserBeans(beansHistory, beans, note);
             }
         }
         //取消订单短信推送(取消推送)
-        if (orderClubMapper.getProductOrder(orderId).contains(6060)) {
+        /*if (orderClubMapper.getProductOrder(orderId).contains(6060)) {
             String bindMobile = baseMapper.getBindMobileByUserId(order.getUserId());
             if (StringUtils.isNotBlank(bindMobile)) {
                 String shortLink = remoteCallService.getShortLink(8, 11, domain + "/user/order/detail.html?orderId=" + orderId);
@@ -683,26 +697,26 @@ public class OrderClubServiceImpl implements OrderClubService {
                     log.info("取消订单推送失败,orderId>>>>" + orderId);
                 }
             }
-        }
+        }*/
         // 客服确认注册机构,一天内取消有效
-        Integer clubStatus = baseMapper.getClubStatus(order.getUserId());
+        Integer clubStatus = baseMapper.getClubStatus(shopOrder.getUserId());
         if (null != clubStatus && 94 == clubStatus) {
             // 已冻结(客服确认机构)
             // 查询最后的确认时间
-            Date confirmTime = baseMapper.getClubConfirmTime(order.getUserId());
+            Date confirmTime = baseMapper.getClubConfirmTime(shopOrder.getUserId());
             if (confirmTime != null) {
                 Calendar calendar = Calendar.getInstance();
                 calendar.setTime(confirmTime);
                 calendar.add(Calendar.DATE, 1);
                 if (calendar.getTime().compareTo(new Date()) > 0) {
                     // 机构状态修改为:已确认(客服确认机构)
-                    baseMapper.updateUserClubStatus(93, order.getUserId());
-                    baseMapper.updateClubStatus(93, order.getUserId());
+                    baseMapper.updateUserClubStatus(93, shopOrder.getUserId());
+                    baseMapper.updateClubStatus(93, shopOrder.getUserId());
                 }
             }
         }
         //优惠券退回
-        if (MathUtil.compare(order.getCouponAmount(), 0) > 0) {
+        /*if (MathUtil.compare(order.getCouponAmount(), 0) > 0) {
             CouponOrderRecordPo couponRecord = orderClubMapper.getOrderCouponRecord(order.getOrderId());
             if (couponRecord != null) {
                 orderClubMapper.deleteCouponClubById(couponRecord.getClubCouponId());
@@ -716,44 +730,53 @@ public class OrderClubServiceImpl implements OrderClubService {
                 couponClub.setDelFlag("0");
                 orderClubMapper.insertCouponClub(couponClub);
             }
-        }
+        }*/
         return ResponseJson.success("取消订单成功!", null);
     }
 
     /**
      * 机构删除订单
      *
-     * @param orderId 订单Id
+     * @param shopOrderId 订单Id
      */
     @Override
-    public ResponseJson<Void> deleteMainOrder(Integer orderId) {
-        OrderPo order = orderClubMapper.getMainOrderByOrderId(orderId);
-        if (null == order || OrderStatus.CLOSED.getCode() != order.getStatus()) {
+    public ResponseJson<Void> deleteMainOrder(Integer shopOrderId) {
+//        OrderPo order = orderClubMapper.getMainOrderByOrderId(orderId);
+        ShopOrderVo shopOrder = orderClubMapper.getShopOrderById(shopOrderId);
+        if (null == shopOrder || 4 != shopOrder.getStatus()) {
             // 非已关闭订单
             return ResponseJson.error("订单异常!", null);
         }
-        // 逻辑删除主订单
-        order.setNote("用户发起删除订单");
-        orderClubMapper.deleteMainOrder(order.getOrderId(), order.getNote());
-        log.info("【删除订单】>>>>>>>>>逻辑删除主订单(update[cm_order])orderId:" + orderId);
         // 逻辑删除子订单
-        String[] shopOrderIdArr = order.getShopOrderIds().split(",");
-        List<String> shopOrderIds = Arrays.asList(shopOrderIdArr);
+        // String[] shopOrderIdArr = order.getShopOrderIds().split(",");
+        List<String> shopOrderIds = new ArrayList<>();
+        shopOrderIds.add(shopOrder.getShopOrderId().toString());
         orderClubMapper.deleteShopOrder(shopOrderIds);
-        log.info("【删除订单】>>>>>>>>>逻辑删除子订单(update[cm_shop_order])shopOrderIds:" + order.getShopOrderIds());
+        log.info("【删除订单】>>>>>>>>>逻辑删除子订单(update[cm_shop_order])shopOrderId:" + shopOrder.getShopOrderId());
+        // 逻辑删除主订单
+        List<Integer> shopOrderStatus = orderClubMapper.getShopOrderStatus(shopOrder.getOrderId());
+        boolean flag = false;
+        if (shopOrderStatus.stream().allMatch(s -> s == 4)) {
+            flag = true;
+        }
+        if (flag) {
+            orderClubMapper.deleteMainOrder(shopOrder.getOrderId(), "用户发起删除订单");
+            log.info("【删除订单】>>>>>>>>>逻辑删除主订单(update[cm_order])orderId:" + shopOrder.getOrderId());
+        }
+
         // 逻辑删除收款记录
-        List<String> receiptIds = orderClubMapper.getOrderReceiptIds(orderId);
+        List<String> receiptIds = orderClubMapper.getShopOrderReceiptIds(shopOrderId);
         if (!receiptIds.isEmpty()) {
-            orderClubMapper.deleteOrderReceiptRelation(orderId);
+            orderClubMapper.deleteShopOrderReceiptRelation(shopOrderId);
             orderClubMapper.deleteDiscernReceipt(receiptIds);
-            log.info("【删除订单】>>>>>>>>>逻辑删除收款记录(update[cm_discern_receipt])orderId:" + orderId);
+            log.info("【删除订单】>>>>>>>>>逻辑删除收款记录(update[cm_discern_receipt])orderId:" + shopOrderId);
         }
         // 逻辑删除付款记录
         List<String> payIds = orderClubMapper.getPayShopIds(shopOrderIds);
         if (!payIds.isEmpty()) {
             orderClubMapper.deletePayShopRecord(shopOrderIds);
             orderClubMapper.deletePayShop(payIds);
-            log.info("【删除订单】>>>>>>>>>逻辑删除付款记录(update[cm_pay_shop])shopOrderIds:" + order.getShopOrderIds());
+            log.info("【删除订单】>>>>>>>>>逻辑删除付款记录(update[cm_pay_shop])shopOrderIds:" + shopOrderIds);
         }
 
         return ResponseJson.success("删除订单成功!", null);
@@ -762,36 +785,37 @@ public class OrderClubServiceImpl implements OrderClubService {
     /**
      * 机构确认收货
      *
-     * @param orderId 订单Id
+     * @param shopOrderId 订单Id
      */
     @Override
-    public ResponseJson<Void> receiveGoods(Integer orderId) {
-        OrderPo order = orderClubMapper.getMainOrderByOrderId(orderId);
-        if (null == order) {
+    public ResponseJson<Void> receiveGoods(Integer shopOrderId) {
+        ShopOrderVo shopOrder = orderClubMapper.getShopOrderById(shopOrderId);
+        if (null == shopOrder) {
             return ResponseJson.error("订单不存在!", null);
         }
-        if (OrderStatus.RECEIVED_AND_FULL_SHIPPED.getCode() == order.getStatus() && 3 == order.getPayStatus()) {
+        orderCommonService.setShopOrderStatus(shopOrder);
+        if (33 == shopOrder.getStatus() && 3 == shopOrder.getPayStatus()) {
             // 已付款供应商,订单完成
-            order.setStatus(5);
-        } else if (OrderStatus.RECEIVED_AND_FULL_SHIPPED.getCode() == order.getStatus()) {
+            shopOrder.setStatus(3);
+        } else if (33 == shopOrder.getStatus()) {
             // 交易完成
-            order.setStatus(4);
+            shopOrder.setStatus(2);
         } else {
             return ResponseJson.error("订单异常!", null);
         }
         Date date = new Date();
         String curDateStr = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(date);
         String note = "【确认收货】";
-        order.setUpdateDate(curDateStr);
+        shopOrder.setUpdateTime(date);
         // 更新订单状态
-        orderClubMapper.updateOrderStatus(order);
+        orderClubMapper.updateShopOrderStatus(shopOrder);
         // 更新物流状态
-        orderClubMapper.updateLogisticsBatch(orderId);
+        orderClubMapper.updateLogisticsBatch(shopOrder.getOrderId(), shopOrderId);
 
         // 主动确认收货,赠送100采美豆
         UserBeansHistoryPo beansHistory = new UserBeansHistoryPo();
-        beansHistory.setUserId(order.getUserId());
-        beansHistory.setOrderId(orderId);
+        beansHistory.setUserId(shopOrder.getUserId());
+        beansHistory.setOrderId(shopOrder.getOrderId());
         beansHistory.setBeansType(7);
         beansHistory.setType(1);
         beansHistory.setNum(100);
@@ -799,7 +823,7 @@ public class OrderClubServiceImpl implements OrderClubService {
         beansHistory.setAddTime(date);
         beansHistory.setDelFlag(0);
         // 用户采美豆
-        Integer userBeans = baseMapper.getUserBeans(order.getUserId());
+        Integer userBeans = baseMapper.getUserBeans(shopOrder.getUserId());
         // 更新用户剩余采美豆数量
         int beans = userBeans + beansHistory.getNum();
         productService.updateUserBeans(beansHistory, beans, note);
@@ -832,19 +856,21 @@ public class OrderClubServiceImpl implements OrderClubService {
     /**
      * 物流详情
      *
-     * @param orderId 订单Id
+     * @param shopOrderId 订单Id
      */
     @Override
-    public ResponseJson<List<LogisticsBatchVo>> getOrderLogistics(Integer orderId) {
-        int orderCount = orderClubMapper.countMainOrderByOrderId(orderId);
+    public ResponseJson<List<LogisticsBatchVo>> getOrderLogistics(Integer shopOrderId) {
+        int orderCount = orderClubMapper.countMainShopOrderByOrderId(shopOrderId);
         if (0 == orderCount) {
             return ResponseJson.error("订单不存在!", null);
         }
         // 获取物流批次列表
-        List<LogisticsBatchVo> batchList = orderCommonMapper.getLogisticsBatchList(orderId);
+        List<LogisticsBatchVo> batchList = orderCommonMapper.getShopLogisticsBatchList(shopOrderId);
         batchList.forEach(batch -> {
             // 根据物流批次获取子订单
-            List<String> shopOrderIds = orderClubMapper.getBatchShopOrderIds(orderId, batch.getId());
+            // List<String> shopOrderIds = orderClubMapper.getBatchShopOrderIds(orderId, batch.getId());
+            List<String> shopOrderIds = new ArrayList<>();
+            shopOrderIds.add(shopOrderId.toString());
             List<ShopOrderVo> shopOrderList = orderCommonMapper.getShopOrderList(shopOrderIds);
             shopOrderList.forEach(shopOrder -> {
                 shopOrder.setShopLogo(ImageUtil.getImageUrl("shopLogo", shopOrder.getShopLogo(), domain));
@@ -875,14 +901,16 @@ public class OrderClubServiceImpl implements OrderClubService {
     /**
      * 分享订单,获取分享码
      *
-     * @param orderId 订单Id
+     * @param shopOrderId 订单Id
      */
     @Override
-    public ResponseJson<String> getOrderShareCode(Integer orderId) {
-        int orderCount = orderClubMapper.countMainOrderByOrderId(orderId);
-        if (0 == orderCount) {
+    public ResponseJson<String> getOrderShareCode(Integer shopOrderId) {
+        // int orderCount = orderClubMapper.countMainOrderByOrderId(orderId);
+        int shopOrderCount = orderClubMapper.countMainShopOrderByOrderId(shopOrderId);
+        if (0 == shopOrderCount) {
             return ResponseJson.error("订单不存在!", null);
         }
+        ShopOrderVo shopOrder = orderClubMapper.getShopOrderById(shopOrderId);
         // 生成分享码
         String shareCode = RandomStringUtils.random(4, false, true);
         // 过期时间
@@ -890,13 +918,13 @@ public class OrderClubServiceImpl implements OrderClubService {
         calendar.setTime(new Date());
         calendar.add(Calendar.DATE, 1);
         // 获取数据库已有分享码
-        OrderShareCodeVo orderCodeVo = orderClubMapper.getOrderCodeById(orderId);
+        OrderShareCodeVo orderCodeVo = orderClubMapper.getShopOrderCodeById(shopOrderId);
         if (orderCodeVo != null && orderCodeVo.getExpiredTime().compareTo(new Date()) >= 0) {
             // 旧分享码还未过期,直接返回
             return ResponseJson.success(orderCodeVo.getShareCode());
         } else if (orderCodeVo != null) {
             // 如果旧分享码已经过期,删除分享码使用记录
-            orderClubMapper.deleteOrderShareCodeRecord(orderId);
+            orderClubMapper.deleteShopOrderShareCodeRecord(shopOrderId);
             // 更新数据库的分享码
             orderCodeVo.setShareCode(shareCode);
             orderCodeVo.setExpiredTime(calendar.getTime());
@@ -905,7 +933,8 @@ public class OrderClubServiceImpl implements OrderClubService {
         } else {
             // 如果没有分享记录,新增数据库的分享码
             OrderShareCodeVo newShareCodeVo = new OrderShareCodeVo();
-            newShareCodeVo.setOrderId(orderId);
+            newShareCodeVo.setOrderId(shopOrder.getOrderId());
+            newShareCodeVo.setShopOrderId(shopOrderId);
             newShareCodeVo.setShareCode(shareCode);
             newShareCodeVo.setExpiredTime(calendar.getTime());
             newShareCodeVo.setAddTime(new Date());
@@ -919,7 +948,7 @@ public class OrderClubServiceImpl implements OrderClubService {
     /**
      * 分享订单,用户身份
      *
-     * @param orderId           订单Id
+     * @param shopOrderId           订单Id
      * @param userId            用户Id
      * @param serviceProviderId 协销Id
      * @param code              微信code
@@ -928,11 +957,12 @@ public class OrderClubServiceImpl implements OrderClubService {
      * @param headers           HttpHeaders
      */
     @Override
-    public ResponseJson<String> identityOrderShareCode(Integer orderId, Integer userId, Integer serviceProviderId, String code, String encryptedData, String iv, HttpHeaders headers) {
+    public ResponseJson<String> identityOrderShareCode(Integer shopOrderId, Integer userId, Integer serviceProviderId, String code, String encryptedData, String iv, HttpHeaders headers) {
         // 用户组织Id
         Integer organizeId = baseMapper.getOrganizeId(userId);
-        int orderCount = orderClubMapper.countMainOrderByOrderId(orderId);
-        if (0 == orderCount) {
+        // int orderCount = orderClubMapper.countMainOrderByOrderId(orderId);
+        int shopOrderCount = orderClubMapper.countMainShopOrderByOrderId(shopOrderId);
+        if (0 == shopOrderCount) {
             return ResponseJson.error("订单不存在!", null);
         }
         // 微信小程序授权登录(调用user服务,发送服务间调用POST请求)
@@ -972,7 +1002,7 @@ public class OrderClubServiceImpl implements OrderClubService {
             return ResponseJson.success(1, "该机构的运营人员查看分享订单!", loginData);
         }
         // 根据openId统计数据库内是否有有效分享码
-        int codeCount = orderClubMapper.countShareCodeRecord(orderId, openId);
+        int codeCount = orderClubMapper.countShareCodeRecord(shopOrderId, openId);
         if (codeCount > 0) {
             // 游客权限
             return ResponseJson.success(3, "游客权限查看分享订单!", null);
@@ -986,7 +1016,7 @@ public class OrderClubServiceImpl implements OrderClubService {
     /**
      * 分享订单,校验分享码
      *
-     * @param orderId       订单Id
+     * @param shopOrderId       订单Id
      * @param shareCode     分享码
      * @param code          微信code
      * @param encryptedData 微信加密数据
@@ -994,11 +1024,12 @@ public class OrderClubServiceImpl implements OrderClubService {
      * @param headers       HttpHeaders
      */
     @Override
-    public ResponseJson<String> checkOrderShareCode(Integer userId, Integer orderId, String shareCode, String code, String encryptedData, String iv, HttpHeaders headers) {
+    public ResponseJson<String> checkOrderShareCode(Integer userId, Integer shopOrderId, String shareCode, String code, String encryptedData, String iv, HttpHeaders headers) {
         // 用户组织Id
         Integer organizeId = baseMapper.getOrganizeId(userId);
-        int orderCount = orderClubMapper.countMainOrderByOrderId(orderId);
-        if (0 == orderCount) {
+        // int orderCount = orderClubMapper.countMainOrderByOrderId(orderId);
+        int shopOrderCount = orderClubMapper.countMainShopOrderByOrderId(shopOrderId);
+        if (0 == shopOrderCount) {
             return ResponseJson.error("订单不存在!", null);
         }
         // 微信小程序授权登录(调用user服务,发送服务间调用POST请求)
@@ -1018,7 +1049,7 @@ public class OrderClubServiceImpl implements OrderClubService {
             return ResponseJson.error("微信授权登录异常!", null);
         }
         // 根据订单Id获取分享码
-        OrderShareCodeVo orderCodeVo = orderClubMapper.getOrderCodeById(orderId);
+        OrderShareCodeVo orderCodeVo = orderClubMapper.getShopOrderCodeById(shopOrderId);
         if (null == orderCodeVo) {
             return ResponseJson.error("该订单没有生成分享码!", null);
         }
@@ -1030,6 +1061,7 @@ public class OrderClubServiceImpl implements OrderClubService {
                 codeRecord.setOpenId(openId);
                 codeRecord.setAddTime(new Date());
                 codeRecord.setOrderId(orderCodeVo.getOrderId());
+                codeRecord.setShopOrderId(shopOrderId);
                 codeRecord.setDelFlag(0);
                 codeRecord.setShareCodeId(orderCodeVo.getId());
                 orderClubMapper.insertOrderShareCodeRecord(codeRecord);
@@ -1047,18 +1079,18 @@ public class OrderClubServiceImpl implements OrderClubService {
     /**
      * 分享订单,初始商品数据
      *
-     * @param orderId 订单Id
+     * @param shopOrderId 订单Id
      */
     @Override
-    public ResponseJson<Map<String, Object>> getOrderShareInitProduct(Integer orderId) {
-        List<OrderProductVo> orderProductList = orderCommonMapper.getOrderProductByOrderId(orderId);
+    public ResponseJson<Map<String, Object>> getOrderShareInitProduct(Integer shopOrderId) {
+        List<OrderProductVo> orderProductList = orderCommonMapper.getshopOrderProductByOrderId(shopOrderId);
         orderProductList.forEach(orderProduct -> orderProduct.setImage(ImageUtil.getImageUrl("product", orderProduct.getImage(), domain)));
-        OrderVo order = orderCommonMapper.getOrderByOrderId(orderId);
-        orderCommonService.setOrderStatus(order);
+        ShopOrderVo shopOrderVo = orderCommonMapper.getShopOrderById(shopOrderId);
+        orderCommonService.setShopOrderStatus(shopOrderVo);
         HashMap<String, Object> result = new HashMap<>(2);
-        orderCommonService.getDiscernReceiptAndSetOrder(order);
+        orderCommonService.getDiscernReceiptAndSetShoporder(shopOrderVo);
         result.put("productList", orderProductList);
-        result.put("orderStatus", order.getStatus());
+        result.put("orderStatus", shopOrderVo.getStatus());
         //2021.12.14 去掉paybutton判断
 //        result.put("payButton", order.isPayButton());
         return ResponseJson.success(result);
@@ -1111,4 +1143,15 @@ public class OrderClubServiceImpl implements OrderClubService {
         return ResponseJson.success(clause);
     }
 
+    /**
+     * 查询供应商银行卡信息
+     *
+     * @param shopId
+     * @return
+     */
+    @Override
+    public ResponseJson<ShopPo> getShopBankAccount(Integer shopId) {
+        return ResponseJson.success(orderClubMapper.getShopBankAccount(shopId));
+    }
+
 }

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

@@ -0,0 +1,401 @@
+package com.caimei365.order.service.impl;
+
+import com.alibaba.fastjson.JSON;
+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.enums.AccountPayOrderType;
+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.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;
+
+/**
+ * @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);
+        String format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
+        cmReturnedPurchase.setReturnedWay(1);
+        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);
+        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);
+                    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());
+            }
+        }
+        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);
+        }
+
+        //采美豆退款相关
+        if (7 == order.getStatus()) {
+            /**  todo
+             *   抵扣运费需退回,当前版本暂取消抵扣运费
+             */
+
+
+            /**
+             *  1.下单赠送采美豆回收
+             *  2.下单扣除采美豆返回
+             */
+            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);
+                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 && 0 == count) {
+                    //有扣豆子记录
+                    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信息
+        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());
+        /**  网银
+         *   快捷
+         *   其他
+         */
+        if (12 == relationPo.getPayType() || 17 == relationPo.getPayType()) {
+            /** todo
+             *  网银退款此处只是发起手续费退回分账请求,如果本次退款中包含网银退款,应该直接return方法,在发起分账请求回调中
+             *  继续退款方法中的其他操作,当前版本暂不考虑失败,默认转账成功
+             */
+            BigDecimal charge = 12 == relationPo.getPayType() ? BigDecimal.valueOf(10) : MathUtil.mul(relationPo.getAssociateAmount(), 0.002, 2);
+            unionRefund(relationPo.getOrderRequestNo(), charge, relationPo.getShopOrderId(), splitCode);
+        } else if (29 == relationPo.getPayType() || 30 == relationPo.getPayType()) {
+            quickRefund(relationPo, splitCode);
+        } else {
+            onlinePay(relationPo, splitCode);
+        }
+    }
+
+    @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();
+        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:网银退款不退手续费!
+     * 本方法内转账手续费等待到账再发起退款请求
+     * 本方法内仅发起向申请退款账户的分账请求,手续费分账给申请账户后,在回调接口中,再进行网银退款
+     */
+    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
+    public void unionRefund(String orderRequestNo, BigDecimal money, Integer shopOrderId, String splitCode) {
+
+        ArrayList<AccountPayOrder.AccountPayOrderExt.SplitBillRule> splitBillRules = new ArrayList<>();
+        AccountPayOrder.AccountPayOrderExt.SplitBillRule splitBillRule = new AccountPayOrder.AccountPayOrderExt.SplitBillRule();
+        splitBillRule.setSplitBillAmount(money);
+        splitBillRule.setSplitBillMerchantNo(splitCode);
+        splitBillRules.add(splitBillRule);
+
+        AccountPayOrder accountPayOrder = new AccountPayOrder();
+        accountPayOrder.setP1_bizType("AccountPaySub");
+        accountPayOrder.setP2_signType("MD5");
+        String format1 = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss.SSS").format(new Date());
+        accountPayOrder.setP3_timestamp(format1);
+        String substring = format1.substring(20);
+        // fz+当前微秒时间+原唯一订单号
+        accountPayOrder.setP4_orderId("WYTK" + substring + orderRequestNo);
+        // 付款账户子订单绑定商户号
+        accountPayOrder.setP5_customerNumber(Constant.CUSTOMERNUM2);
+        AccountPayOrder.AccountPayOrderExt accountPayOrderExt = new AccountPayOrder.AccountPayOrderExt();
+        accountPayOrderExt.setOrderType(AccountPayOrderType.TRANSFER);
+        // 分账回调地址,此处重写一个接口,做网银退款专用,收到回调后,再接口中再进行网银的退款
+        accountPayOrderExt.setServerCallbackUrl(Constant.prodWYREFUND);
+        accountPayOrderExt.setGoodsName("网银手续费");
+        accountPayOrderExt.setSplitBillRules(splitBillRules);
+
+        String ext = JSON.toJSONString(accountPayOrderExt);
+        log.info("网银退款手续费分账规则串json串:" + ext);
+        accountPayOrder.setP6_ext(ext);
+        // 生成签名
+        StringBuilder builder = new StringBuilder();
+        builder.append(Constant.SPLIT)
+                .append(accountPayOrder.getP1_bizType()).append(Constant.SPLIT)
+                .append(accountPayOrder.getP2_signType()).append(Constant.SPLIT)
+                .append(accountPayOrder.getP3_timestamp()).append(Constant.SPLIT)
+                .append(accountPayOrder.getP4_orderId()).append(Constant.SPLIT)
+                .append(accountPayOrder.getP5_customerNumber()).append(Constant.SPLIT)
+                .append(accountPayOrder.getP6_ext()).append(Constant.SPLIT)
+                .append(Constant.XUNI);
+        String sign = Disguiser.disguiseMD5(builder.toString().trim());
+        Map<String, String> bean = OnlinePostFormUtil.splitConvertBean(accountPayOrder);
+        log.info("--------------------> 网银退款-手续费转账 参数:  " + bean);
+        Map<String, String> map = OnlinePostFormUtil.splitPostForm(bean, Constant.FZ, sign, Map.class);
+        log.info("----------------网银退款-手续费转账 返回数据: " + map.toString());
+        if (map != null) {
+            String code = map.get("rt5_retCode");
+            if (!"0000".equals(code)) {
+                String msg = map.get("rt6_retMsg");
+                log.info("【网银退款-手续费转账】>>>>>>>>>>网银退款手续费转账失败>>>>>>>msg:" + msg);
+            } else {
+                refundMapper.insertTransfer(money, orderRequestNo, shopOrderId);
+                log.info("【网银退款-手续费转账】>>>>>>>>>>网银退款手续费转账发起成功>>>>>>>");
+            }
+        }
+    }
+
+    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
+    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("第三方退款请求失败!");
+        }
+    }
+
+
+    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
+    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("---------------快捷支付退款成功------------------");
+                }
+            }
+        }
+    }
+}

+ 36 - 15
src/main/java/com/caimei365/order/service/impl/OrderSellerServiceImpl.java

@@ -5,6 +5,7 @@ import com.caimei365.order.mapper.BaseMapper;
 import com.caimei365.order.mapper.OrderSellerMapper;
 import com.caimei365.order.model.ResponseJson;
 import com.caimei365.order.model.vo.OrderVo;
+import com.caimei365.order.model.vo.ShopOrderVo;
 import com.caimei365.order.service.OrderSellerService;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
@@ -36,12 +37,12 @@ public class OrderSellerServiceImpl implements OrderSellerService {
      * @param serviceProviderId 协销Id
      * @param listType          1:待确认,2:待付款,3:待发货,4:已发货,5:退货款
      * @param orderSubmitType   1:自主订单, 2:协销或后台订单 ,3:组员订单
-     * @param orderNo           订单编号
+     * @param shopOrderNo           订单编号
      * @param pageNum           页码
      * @param pageSize          每页数量
      */
     @Override
-    public ResponseJson<PageInfo<OrderVo>> getOrderList(Integer serviceProviderId, Integer listType, Integer orderSubmitType, String orderNo, Integer groupServiceId, int pageNum, int pageSize) {
+    public ResponseJson<PageInfo<ShopOrderVo>> getOrderList(Integer serviceProviderId, Integer listType, Integer orderSubmitType, String shopOrderNo, Integer groupServiceId, int pageNum, int pageSize) {
         // 获取该协销下的机构用户Id
         List<Integer> clubUserIds = new ArrayList<>();
         if (null != orderSubmitType && 3 == orderSubmitType) {
@@ -55,18 +56,18 @@ public class OrderSellerServiceImpl implements OrderSellerService {
         } else {
             clubUserIds = orderSellerMapper.getClubUserIds(serviceProviderId);
         }
-        List<OrderVo> orderList = new ArrayList<OrderVo>();
+        List<ShopOrderVo> shopOrderList = new ArrayList<>();
         // 获取订单列表
         if (null != clubUserIds && clubUserIds.size() > 0) {
             // 分页请求数据
             PageHelper.startPage(pageNum, pageSize);
-            orderList = orderSellerMapper.getOrderList(clubUserIds, listType, orderSubmitType, orderNo);
+            shopOrderList = orderSellerMapper.getShopOrderList(clubUserIds, listType, orderSubmitType, shopOrderNo);
             //设置主订单数据
-            orderList.forEach(this::setSellerOrder);
-            PageInfo<OrderVo> pageInfo = new PageInfo(orderList);
+            shopOrderList.forEach(this::setSellerShopOrder);
+            PageInfo<ShopOrderVo> pageInfo = new PageInfo(shopOrderList);
             return ResponseJson.success(pageInfo);
         } else {
-            return ResponseJson.success(new PageInfo<OrderVo>(orderList));
+            return ResponseJson.success(new PageInfo<ShopOrderVo>(shopOrderList));
         }
     }
 
@@ -90,6 +91,26 @@ public class OrderSellerServiceImpl implements OrderSellerService {
         order.setUserIdentity(userIdentity);
     }
 
+    /**
+     * 设置协销订单
+     */
+    private void setSellerShopOrder(ShopOrderVo shopOrder) {
+        // 设置订单状态
+        orderCommonService.setShopOrderStatus(shopOrder);
+        // 设置子订单数据
+        orderCommonService.setShopOrderInfo(shopOrder);
+        // 设置付款金额
+        orderCommonService.getDiscernReceiptAndSetShoporder(shopOrder);
+        // 设置机构名称
+        String clubName = baseMapper.getClubNameById(shopOrder.getClubId());
+        shopOrder.setClubName(clubName);
+        // 设置机构类型
+        Integer svipUserId = baseMapper.getSvipUserIdByClubId(shopOrder.getClubId());
+        shopOrder.setSvipUserFlag(null != svipUserId ? 1 : 0);
+        Integer userIdentity = baseMapper.getIdentityByUserId(shopOrder.getUserId());
+        shopOrder.setUserIdentity(userIdentity);
+    }
+
     /**
      * 协销下机构总订单列表
      *
@@ -101,7 +122,7 @@ public class OrderSellerServiceImpl implements OrderSellerService {
      * @param pageSize          每页数量
      */
     @Override
-    public ResponseJson<PageInfo<OrderVo>> getOrderListClub(Integer serviceProviderId, Integer clubId, Integer listType, Integer orderSubmitType, int pageNum, int pageSize) {
+    public ResponseJson<PageInfo<ShopOrderVo>> getOrderListClub(Integer serviceProviderId, Integer clubId, Integer listType, Integer orderSubmitType, int pageNum, int pageSize) {
         // 判断该机构是不是该协销下的 1342采美默认协销经理(官方账号)协销id1342为默认,不受限制
         Integer spId = orderSellerMapper.getSpIdByClubId(clubId);
         // 协销组长和总管理员也可以看
@@ -117,10 +138,10 @@ public class OrderSellerServiceImpl implements OrderSellerService {
         // 分页请求数据
         PageHelper.startPage(pageNum, pageSize);
         // 获取订单列表
-        List<OrderVo> orderList = orderSellerMapper.getOrderListClub(clubId, listType, orderSubmitType);
+        List<ShopOrderVo> shopOrderList = orderSellerMapper.getShopOrderListClub(clubId, listType, orderSubmitType);
         //设置主订单数据
-        orderList.forEach(this::setSellerOrder);
-        PageInfo<OrderVo> pageInfo = new PageInfo(orderList);
+        shopOrderList.forEach(this::setSellerShopOrder);
+        PageInfo<ShopOrderVo> pageInfo = new PageInfo(shopOrderList);
         // 更新协销查看机构订单时间
         orderSellerMapper.updateClubLastCheckOrderDate(clubId, new Date());
         return ResponseJson.success(pageInfo);
@@ -135,7 +156,7 @@ public class OrderSellerServiceImpl implements OrderSellerService {
      * @param pageSize          每页数量
      */
     @Override
-    public ResponseJson<PageInfo<OrderVo>> getOrderListByKeyword(Integer serviceProviderId, String searchWord, int pageNum, int pageSize) {
+    public ResponseJson<PageInfo<ShopOrderVo>> getOrderListByKeyword(Integer serviceProviderId, String searchWord, int pageNum, int pageSize) {
         // 获取协销用户Id
         Integer spUserId = orderSellerMapper.getUserIdBySpId(serviceProviderId);
         if (null == spUserId) {
@@ -148,10 +169,10 @@ public class OrderSellerServiceImpl implements OrderSellerService {
         // 分页请求数据
         PageHelper.startPage(pageNum, pageSize);
         // 获取订单列表
-        List<OrderVo> orderList = orderSellerMapper.getOrderListByKeyword(clubUserIds, searchWord);
+        List<ShopOrderVo> shopOrderList = orderSellerMapper.getShopOrderListByKeyword(clubUserIds, searchWord);
         //设置主订单数据
-        orderList.forEach(this::setSellerOrder);
-        PageInfo<OrderVo> pageInfo = new PageInfo(orderList);
+        shopOrderList.forEach(this::setSellerShopOrder);
+        PageInfo<ShopOrderVo> pageInfo = new PageInfo(shopOrderList);
         return ResponseJson.success(pageInfo);
     }
 

+ 108 - 133
src/main/java/com/caimei365/order/service/impl/PayOrderServiceImpl.java

@@ -46,8 +46,6 @@ import java.util.*;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicReference;
 
-import static org.bouncycastle.asn1.x500.style.RFC4519Style.c;
-import static org.bouncycastle.asn1.x500.style.RFC4519Style.o;
 
 /**
  * Description
@@ -86,27 +84,29 @@ public class PayOrderServiceImpl implements PayOrderService {
     /**
      * 订单支付前效验付款规则
      *
-     * @param orderId 订单Id
+     * @param shopOrderId 订单Id
      */
     @Override
-    public ResponseJson<Map<String, Object>> payBeforeCheck(Integer orderId) {
+    public ResponseJson<Map<String, Object>> payBeforeCheck(Integer shopOrderId) {
         // 订单信息
-        OrderVo order = orderCommonMapper.getOrderByOrderId(orderId);
-        if (null == order) {
+        // OrderVo order = orderCommonMapper.getOrderByOrderId(orderId);
+        ShopOrderVo shopOrder = orderCommonMapper.getShopOrderById(shopOrderId);
+        if (null == shopOrder) {
             return ResponseJson.error("订单不存在", null);
         }
         // 返回数据
         Map<String, Object> map = new HashMap<>();
-        map.put("orderId", orderId);
+        map.put("shopOrderId", shopOrderId);
+        map.put("orderId", shopOrder.getOrderId());
         // 查询审核中的退款退货数量
-        int refundCount = payOrderMapper.getRefundCount(orderId);
+        int refundCount = payOrderMapper.getShopRefundCount(shopOrderId);
         if (refundCount > 0) {
             map.put("code", -1);
             map.put("msg", "订单已申请全部退款,无需再付款!");
             return ResponseJson.success(map);
         }
         // 付款金额
-        List<DiscernReceiptVo> discernReceiptAndSetOrder = orderCommonService.getDiscernReceiptAndSetOrder(order);
+        List<DiscernReceiptVo> discernReceiptAndSetOrder = orderCommonService.getDiscernReceiptAndSetShoporder(shopOrder);
         if (null == discernReceiptAndSetOrder || discernReceiptAndSetOrder.size() == 0) {
             //无支付记录可余额抵扣
             map.put("balanceFlag", 0);
@@ -120,10 +120,10 @@ public class PayOrderServiceImpl implements PayOrderService {
                 map.put("balanceFlag", 1);
             }
         }
-        map.put("pendingPayments", order.getPendingPayments());
-        map.put("onlinePayFlag", order.getOnlinePayFlag());
+        map.put("obligation", shopOrder.getObligation());
+        map.put("invoiceFlag", shopOrder.getInvoiceFlag());
         // 商品数据
-        List<OrderProductVo> orderProductList = orderCommonMapper.getOrderProductByOrderId(orderId);
+        List<OrderProductVo> orderProductList = orderCommonMapper.getshopOrderProductByOrderId(shopOrderId);
         for (OrderProductVo orderProduct : orderProductList) {
             // 是否充值商品
             boolean recharge = productService.isRechargeProduct(orderProduct.getProductId());
@@ -132,9 +132,9 @@ public class PayOrderServiceImpl implements PayOrderService {
             }
         }
         // 可用余额
-        Double availableMoney = baseMapper.getAbleUserMoney(order.getUserId());
+        Double availableMoney = baseMapper.getAbleUserMoney(shopOrder.getUserId());
         if (MathUtil.compare(availableMoney, 0) > 0) {
-            if (MathUtil.compare(availableMoney, order.getPendingPayments()) >= 0) {
+            if (MathUtil.compare(availableMoney, shopOrder.getObligation()) >= 0) {
                 map.put("code", 2);
                 map.put("msg", "余额大于或等于待付金额");
                 map.put("ableUserMoney", availableMoney);
@@ -142,7 +142,7 @@ public class PayOrderServiceImpl implements PayOrderService {
                 map.put("code", 1);
                 map.put("msg", "余额不为0且小于待付金额");
                 map.put("ableUserMoney", availableMoney);
-                map.put("pendingPayments", MathUtil.sub(order.getPendingPayments(), availableMoney));
+                map.put("pendingPayments", MathUtil.sub(shopOrder.getObligation(), availableMoney));
             }
         }
         return ResponseJson.success(map);
@@ -152,126 +152,91 @@ public class PayOrderServiceImpl implements PayOrderService {
     /**
      * 订单支付,余额抵扣
      *
-     * @param orderId 订单Id
+     * @param shopOrderId 订单Id
      */
     @Override
-    public ResponseJson<Map<String, Object>> balanceDeduction(Integer orderId) {
+    public ResponseJson<Map<String, Object>> balanceDeduction(Integer shopOrderId) {
         // 订单信息
-        OrderVo order = orderCommonMapper.getOrderByOrderId(orderId);
-        if (null == order) {
+        ShopOrderVo shopOrder = orderCommonMapper.getShopOrderByOrderId(shopOrderId);
+        double amount = shopOrder.getReceiptAmount();
+        if (null == shopOrder) {
             return ResponseJson.error("订单不存在", null);
         }
         // 付款金额
-        orderCommonService.getDiscernReceiptAndSetOrder(order);
+        orderCommonService.getDiscernReceiptAndSetShoporder(shopOrder);
         // 可用余额
-        Double availableMoney = baseMapper.getAbleUserMoney(order.getUserId());
+        Double availableMoney = baseMapper.getAbleUserMoney(shopOrder.getUserId());
         Double balancePayFee = 0d;
         if (MathUtil.compare(availableMoney, 0) > 0) {
             //可用余额>待付
-            if (MathUtil.compare(availableMoney, order.getPendingPayments()) >= 0) {
-                if (OrderStatus.UNCONFIRMED.getCode() != order.getStatus()) {
-                    if (1 == order.getSendOutStatus()) {
-                        order.setStatus(31);
-                    } else if (2 == order.getSendOutStatus()) {
-                        order.setStatus(32);
-                    } else {
-                        order.setStatus(33);
-                    }
-                }
-                order.setReceiptStatus(3);
-                balancePayFee = order.getPendingPayments();
+            if (MathUtil.compare(availableMoney, shopOrder.getObligation()) >= 0) {
+                shopOrder.setReceiptStatus(3);
+                balancePayFee = shopOrder.getObligation();
             } else {
-                if (OrderStatus.UNCONFIRMED.getCode() != order.getStatus()) {
-                    //待确认状态,不修改订单状态
-                    if (1 == order.getSendOutStatus()) {
-                        order.setStatus(21);
-                    } else if (2 == order.getSendOutStatus()) {
-                        order.setStatus(22);
-                    } else {
-                        order.setStatus(23);
-                    }
-                }
-                order.setReceiptStatus(2);
+                shopOrder.setReceiptStatus(2);
                 balancePayFee = availableMoney;
             }
             //设置余额支付金额
-            order.setBalancePayFee(MathUtil.add(order.getBalancePayFee(), balancePayFee).doubleValue());
+            shopOrder.setAccountAmount(MathUtil.add(shopOrder.getAccountAmount(), balancePayFee).doubleValue());
             //设置真实支付金额
-            order.setPayableAmount(MathUtil.sub(order.getPayableAmount(), balancePayFee).doubleValue());
-            Date date = new Date();
-            String curDateStr = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(date);
-            order.setUpdateDate(curDateStr);
-            order.setOnlinePayFlag(1);
+            shopOrder.setReceiptAmount(MathUtil.add(amount, balancePayFee).doubleValue());
+            shopOrder.setOnlinePay(1);
+            // 余额抵扣状态
+            shopOrder.setUseBalanceFlag(1);
             // 更新订单支付状态
-            payOrderMapper.updateOrderStatus(order);
-            // 剩余待付金额
-            order.setPendingPayments(MathUtil.sub(order.getPendingPayments(), balancePayFee).doubleValue());
+            payOrderMapper.updateShopOrderBalancePay(shopOrder);
             // 修改账户余额
-            double userMoney = baseMapper.getUserMoney(order.getUserId());
-            if (OrderStatus.UNCONFIRMED.getCode() != order.getStatus()) {
-                //保存收款记录
-                productService.saveDiscernReceipt(balancePayFee, orderId, "【订单支付,余额抵扣】");
+            double userMoney = baseMapper.getUserMoney(shopOrder.getUserId());
+            if (OrderStatus.UNCONFIRMED.getCode() != shopOrder.getStatus()) {
+                /**
+                 *  子订单抵扣用户余额
+                 */
+                productService.saveShopOrderDiscernReceipt(balancePayFee, shopOrder);
             }
             //可用=可用-本次抵扣
             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);
-            if (0 == orderClubMapper.getsecondHandOrderFlag(orderId) && 0 == orderClubMapper.getrebateFlag(orderId) && (null != productIds && !productIds.contains(6060))) {
-                try {
-                    String accessToken = weChatService.getAccessToken();
-                    List<String> openidList = orderClubMapper.getOpenidListByPermission(orderClubMapper.FromUnionId(order.getOrderId()));
-                    openidList.removeIf(Objects::isNull);
-                    String name = StringUtils.strip(orderClubMapper.getOrderIds(orderId).toString().substring(0, 11), "[]");
-                    String associateTitle = "订单支付成功!";
-                    Double money = orderClubMapper.getpayTotalFee(orderId);
-                    String orderno = order.getOrderNo();
-                    String paytime = curDateStr;
-                    String remarkText = "采美将尽快为您安排发货~";
-                    // 跳转到【小程序付款-选择支付方式页面】
-                    String pagePath = "pages/user/order/order-details?type=share&orderId=" + orderId;
-                    for (String openid : openidList) {
-                        // sendTemplateMsg(openid, 标题, 金额, 收款日期, 备注, 跳转链接)
-                        weChatService.sendTemplateMsgz(accessToken, openid, associateTitle, paytime, name, orderno, money, remarkText, pagePath);
-                    }
-                } catch (Exception e) {
-                    log.error("【订单发货通知】获取微信公众号access_token异常!", e);
-                }
-
-                //推送信息中心-交易物流
-                MessageCenter messageCenter = new MessageCenter();
-                messageCenter.setShopID(null);
-                messageCenter.setClubID(order.getClubId());
-                messageCenter.setUserType(1);
-                messageCenter.setMessageType(1);
-                messageCenter.setOrderMessageType(2);
-                messageCenter.setOrderID(orderId);
-                messageCenter.setContent(null);
-                messageCenter.setTime(curDateStr);
-                orderClubMapper.addMessageCenter(messageCenter);
-
-            }
-            log.info("支付成功" + order.getUserId());
+            payOrderMapper.updateMoneyByUserId(userMoney, availableMoney, shopOrder.getUserId());
+            log.info("【订单支付,余额抵扣】>>>>>>>>>>>更新用户余额(update[user])userId:" + shopOrder.getUserId() + ",shopOrderId:" + shopOrder.getShopOrderId());
+//            log.info("************************订单支付完成消息推送*********************");
+//            //判断是否是二手订单和返佣订单
+//            List<Integer> productIds = orderClubMapper.getProductOrder(shopOrder.getOrderId());
+//            if (0 == orderClubMapper.getsecondHandOrderFlag(orderId) && 0 == orderClubMapper.getrebateFlag(orderId) && (null != productIds && !productIds.contains(6060))) {
+//                try {
+//                    String accessToken = weChatService.getAccessToken();
+//                    List<String> openidList = orderClubMapper.getOpenidListByPermission(orderClubMapper.FromUnionId(order.getOrderId()));
+//                    openidList.removeIf(Objects::isNull);
+//                    String name = StringUtils.strip(orderClubMapper.getOrderIds(orderId).toString().substring(0, 11), "[]");
+//                    String associateTitle = "订单支付成功!";
+//                    Double money = orderClubMapper.getpayTotalFee(orderId);
+//                    String orderno = order.getOrderNo();
+//                    String paytime = curDateStr;
+//                    String remarkText = "采美将尽快为您安排发货~";
+//                    // 跳转到【小程序付款-选择支付方式页面】
+//                    String pagePath = "pages/user/order/order-details?type=share&orderId=" + orderId;
+//                    for (String openid : openidList) {
+//                        // sendTemplateMsg(openid, 标题, 金额, 收款日期, 备注, 跳转链接)
+//                        weChatService.sendTemplateMsgz(accessToken, openid, associateTitle, paytime, name, orderno, money, remarkText, pagePath);
+//                    }
+//                } catch (Exception e) {
+//                    log.error("【订单发货通知】获取微信公众号access_token异常!", e);
+//                }
+//
+//                //推送信息中心-交易物流
+//                MessageCenter messageCenter = new MessageCenter();
+//                messageCenter.setShopID(null);
+//                messageCenter.setClubID(order.getClubId());
+//                messageCenter.setUserType(1);
+//                messageCenter.setMessageType(1);
+//                messageCenter.setOrderMessageType(2);
+//                messageCenter.setOrderID(orderId);
+//                messageCenter.setContent(null);
+//                messageCenter.setTime(curDateStr);
+//                orderClubMapper.addMessageCenter(messageCenter);
+//            }
         }
         Map<String, Object> map = new HashMap<>(2);
-        map.put("order", order);
+        map.put("order", shopOrder);
         map.put("balancePayFee", balancePayFee);
         return ResponseJson.success(map);
     }
@@ -288,19 +253,20 @@ public class PayOrderServiceImpl implements PayOrderService {
     /**
      * 收银台数据显示
      *
-     * @param orderId 订单Id
+     * @param shopOrderId 订单Id
      */
     @Override
-    public ResponseJson<Map<String, Object>> getCheckoutCounter(Integer orderId) {
+    public ResponseJson<Map<String, Object>> getCheckoutCounter(Integer shopOrderId) {
         // 订单信息
-        OrderVo order = orderCommonMapper.getOrderByOrderId(orderId);
-        if (null == order) {
+        // OrderVo order = orderCommonMapper.getOrderByOrderId(orderId);
+        ShopOrderVo shopOrder = orderCommonMapper.getShopOrderById(shopOrderId);
+        if (null == shopOrder) {
             return ResponseJson.error("订单不存在", null);
         }
         // 机构信息
-        String userName = baseMapper.getUserNameByUserId(order.getUserId());
+        String userName = baseMapper.getUserNameByUserId(shopOrder.getUserId());
         // 支付记录
-        List<DiscernReceiptVo> discernReceiptList = orderCommonMapper.getDiscernReceipt(order.getOrderId(), order.getShopOrderIds());
+        List<DiscernReceiptVo> discernReceiptList = orderCommonMapper.getDiscernReceipt(shopOrder.getOrderId(), shopOrder.getShopOrderId().toString());
         if (!discernReceiptList.isEmpty()) {
             AtomicDouble receiptAmount = new AtomicDouble(0d);
             AtomicBoolean offlineFlag = new AtomicBoolean(false);
@@ -316,23 +282,23 @@ public class PayOrderServiceImpl implements PayOrderService {
                 }
             });
             if (offlineFlag.get()) {
-                order.setOnlinePayFlag(1);
+                shopOrder.setOnlinePay(1);
             }
-            order.setReceiptAmount(receiptAmount.get());
+            shopOrder.setReceiptAmount(receiptAmount.get());
         }
         // 总成本
         AtomicDouble totalCostPrice = new AtomicDouble(0d);
         // 商品数据
-        List<OrderProductVo> orderProductList = orderCommonMapper.getOrderProductByOrderId(orderId);
+        List<OrderProductVo> orderProductList = orderCommonMapper.getshopOrderProductByOrderId(shopOrderId);
         //过滤运费商品
         orderProductList.removeIf(product -> product.getShopId() == 998);
         // 是否有商品发票属性的限制
         orderProductList.forEach(orderProduct -> {
             // 商品含税未知 or 订单选择开企业发票,商品不含税不能开票
             boolean productTaxFlag = (null == orderProduct.getIncludedTax()) || (null == orderProduct.getInvoiceType()) || (Integer.valueOf(2).equals(orderProduct.getIncludedTax()))
-                    || (Integer.valueOf(2).equals(order.getInvoiceFlag()) && (Integer.valueOf(0).equals(orderProduct.getIncludedTax()) && Integer.valueOf(3).equals(orderProduct.getInvoiceType())));
+                    || (Integer.valueOf(2).equals(shopOrder.getInvoiceFlag()) && (Integer.valueOf(0).equals(orderProduct.getIncludedTax()) && Integer.valueOf(3).equals(orderProduct.getInvoiceType())));
             if (productTaxFlag) {
-                order.setInvoiceStatus(true);
+                shopOrder.setInvoiceStatus(true);
             }
             //当应付金额小于订单总成本时,不能走线上支付,总成本=商品成本 + 供应商运费 + 供应商税费
             double costPrice = MathUtil.mul(orderProduct.getCostPrice(), orderProduct.getNum()).doubleValue();
@@ -342,26 +308,31 @@ public class PayOrderServiceImpl implements PayOrderService {
                 //成本+税费
                 costPrice = MathUtil.add(costPrice, payableTax).doubleValue();
             }
-            List<ShopOrderVo> shopOrderList = orderCommonMapper.getShopOrderListByOrderId(order.getOrderId());
-            for (ShopOrderVo shopOrder : shopOrderList) {
+//            List<ShopOrderVo> shopOrderList = orderCommonMapper.getShopOrderListByOrderId(order.getOrderId());
+//            for (ShopOrderVo shopOrder : shopOrderList) {
                 // 付供应商运费
                 Double shopPostFee = shopOrder.getShopPostFee();
                 costPrice = MathUtil.add(costPrice, shopPostFee).doubleValue();
-            }
+//            }
             totalCostPrice.set(MathUtil.add(costPrice, totalCostPrice.get()).doubleValue());
         });
-        Integer onlinePay = order.getOnlinePayFlag();
+        // 待付金额
+        if (null == shopOrder.getRealPay()) {
+            shopOrder.setRealPay(shopOrder.getNeedPayAmount());
+        }
+        shopOrder.setObligation(MathUtil.sub(shopOrder.getRealPay(), shopOrder.getReceiptAmount()).doubleValue());
+        Integer onlinePay = shopOrder.getOnlinePay();
         // 返回数据
         Map<String, Object> map = new HashMap<>();
         map.put("userName", userName);
-        map.put("order", order);
+        map.put("shopOrder", shopOrder);
         map.put("discernReceipt", discernReceiptList);
         map.put("orderProductList", orderProductList);
         //能否线上判断付供应商是否大于订单金额
-        if (order.getBalancePayFee() > 0 || totalCostPrice.get() > order.getPayTotalFee()) {
+        if (shopOrder.getAccountAmount() > 0 || totalCostPrice.get() > shopOrder.getTotalAmount()) {
             onlinePay = 1;
         }
-        Integer num = orderCommonMapper.findSplitCode(orderId);
+        Integer num = orderCommonMapper.findSplitCode(shopOrder.getOrderId());
         if (num > 0) {
             onlinePay = 1;
         }
@@ -720,6 +691,10 @@ public class PayOrderServiceImpl implements PayOrderService {
         }
         shop.setReceiptAmount(receiptAmount.get());
         shop.setEachDiscount(orderCommonMapper.findEachDiscount(shopOrderId));
+        // 待付金额
+        if (null == shop.getRealPay()) {
+            shop.setRealPay(shop.getNeedPayAmount());
+        }
         shop.setObligation(MathUtil.sub(shop.getRealPay(), receiptAmount.get()).doubleValue());
         if (998 == shop.getShopId()) {
             shop.setObligation(orderCommonMapper.findShopFee(shopOrderId));
@@ -748,12 +723,12 @@ public class PayOrderServiceImpl implements PayOrderService {
                 //成本+税费
                 costPrice = MathUtil.add(costPrice, payableTax).doubleValue();
             }
-            List<ShopOrderVo> shopOrderList = orderCommonMapper.getShopOrderListByOrderId(order.getOrderId());
-            for (ShopOrderVo shopOrder : shopOrderList) {
+             List<ShopOrderVo> shopOrderList = orderCommonMapper.getShopOrderListByOrderId(order.getOrderId());
+             for (ShopOrderVo shopOrder : shopOrderList) {
                 // 付供应商运费
                 Double shopPostFee = shopOrder.getShopPostFee();
                 costPrice = MathUtil.add(costPrice, shopPostFee).doubleValue();
-            }
+             }
             totalCostPrice.set(MathUtil.add(costPrice, totalCostPrice.get()).doubleValue());
         });
         //. 后台线上支付开关2.商品是否有分账账号 3. 订单是否进行过线下支付 4.是否使用了余额抵扣

+ 380 - 9
src/main/java/com/caimei365/order/service/impl/ShipServiceImpl.java

@@ -2,20 +2,24 @@ package com.caimei365.order.service.impl;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.caimei365.order.components.OrderCommonService;
+import com.caimei365.order.components.OssService;
 import com.caimei365.order.components.WeChatService;
 import com.caimei365.order.mapper.*;
 import com.caimei365.order.model.ResponseJson;
-import com.caimei365.order.model.dto.JsonParamsDto;
-import com.caimei365.order.model.dto.LogisticsBatchDto;
-import com.caimei365.order.model.dto.LogisticsDto;
+import com.caimei365.order.model.dto.*;
 import com.caimei365.order.model.po.*;
 import com.caimei365.order.model.vo.*;
 import com.caimei365.order.service.RemoteCallService;
 import com.caimei365.order.service.ShipService;
 import com.caimei365.order.utils.ImageUtil;
+import com.caimei365.order.utils.MathUtil;
+import com.caimei365.order.utils.OSSUtils;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
+import com.google.common.util.concurrent.AtomicDouble;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.commons.lang.RandomStringUtils;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Value;
@@ -24,10 +28,17 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
 import org.springframework.util.CollectionUtils;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
 import java.text.SimpleDateFormat;
 import java.util.*;
+import java.util.stream.Collectors;
 
 import static com.alibaba.fastjson.JSON.parseArray;
 
@@ -49,11 +60,17 @@ public class ShipServiceImpl implements ShipService {
     @Resource
     private AddressMapper addressMapper;
     @Resource
+    private OrderCommonService orderCommonService;
+    @Resource
     private OrderCommonMapper orderCommonMapper;
     @Resource
     private OrderClubMapper orderClubMapper;
     @Resource
     private RemoteCallService remoteCallService;
+    @Resource
+    private OssService ossService;
+    @Resource
+    private OSSUtils ossUtils;
 
     @Resource
     private WeChatService weChatService;
@@ -70,14 +87,20 @@ public class ShipServiceImpl implements ShipService {
      * @param pageSize      每页数量
      */
     @Override
-    public ResponseJson<PageInfo<ShopOrderVo>> getShopOrderList(Integer shopId, Integer sendOutStatus, Integer payStatus, String shopOrderNo, String receiver, int pageNum, int pageSize) {
+    public ResponseJson<PageInfo<ShopOrderVo>> getShopOrderList(Integer shopId, Integer sendOutStatus, Integer payStatus, String shopOrderNo, String receiver, Integer refundStatus, Integer receiptStatus, Integer organizeId, int pageNum, int pageSize) {
         // 分页请求数据
         PageHelper.startPage(pageNum, pageSize);
-        List<ShopOrderVo> shopOrderList = shipMapper.getShopOrderList(shopId, sendOutStatus, payStatus, shopOrderNo, receiver);
+        List<ShopOrderVo> shopOrderList = shipMapper.getShopOrderList(shopId, sendOutStatus, payStatus, shopOrderNo, receiver, refundStatus, receiptStatus, organizeId);
         shopOrderList.forEach(shopOrder -> {
             if (null != shopOrder) {
                 setShopOrderInfo(shopOrder);
             }
+            // 联合丽格 [待付款]或者线下支付[部分付款] 的子订单 状态
+            if ((4 != shopOrder.getStatus() && 5 != shopOrder.getStatus()) && ((1 == shopOrder.getReceiptStatus() && (2 == shopOrder.getOnlinePay() || 0 == shopOrder.getOnlinePay())) || (2 == shopOrder.getReceiptStatus() && 2 == shopOrder.getOnlinePay()))) {
+                shopOrder.setCheckFlag(2);
+            } else {
+                shopOrder.setCheckFlag(1);
+            }
         });
         PageInfo<ShopOrderVo> pageInfo = new PageInfo(shopOrderList);
         return ResponseJson.success(pageInfo);
@@ -94,20 +117,199 @@ public class ShipServiceImpl implements ShipService {
      * @param pageSize    每页数量
      */
     @Override
-    public ResponseJson<PageInfo<SettlementVo>> getSettlementList(Integer shopId, Integer payStatus, String shopOrderNo, String name, int pageNum, int pageSize) {
+    public ResponseJson<PageInfo<SettlementVo>> getSettlementList(Integer shopId, Integer payStatus, String shopOrderNo, String name, String beginTime, String endTime, Integer refundStatus, int pageNum, int pageSize) {
         // 分页请求数据
         PageHelper.startPage(pageNum, pageSize);
-        List<SettlementVo> settlementList = shipMapper.getSettlementList(shopId, payStatus, shopOrderNo, name);
+        List<SettlementVo> settlementList = shipMapper.getSettlementList(shopId, payStatus, shopOrderNo, name, beginTime, endTime, refundStatus);
         settlementList.forEach(settlement -> {
             if (null != settlement) {
                 List<OrderProductVo> orderProductList = orderCommonMapper.getShopOrderProduct(settlement.getShopOrderId());
                 settlement.setOrderProductList(orderProductList);
             }
+            // 退款金额
+            AtomicDouble refund = new AtomicDouble(0);
+            // 付款手续费
+            double procedureFee = 0d;
+            // 付款记录
+            List<DiscernReceiptVo> shopOrderRelation = shipMapper.getShopOrderRelation(settlement.getShopOrderId());
+            for (DiscernReceiptVo discernReceipt : shopOrderRelation) {
+                // 本次支付金额,单位/元
+                double splitAmount = discernReceipt.getAssociateAmount();
+                double payAmount;
+                if (1 == discernReceipt.getPayWay()) {
+                    if (12 == discernReceipt.getPayType()) {
+                        // 网银支付
+                        payAmount = 10.00;
+                    } else if (17 == discernReceipt.getPayType()) {
+                        //b2c网银
+                        //b2c 0.2%
+                        payAmount = MathUtil.mul(splitAmount, 0.002, 2).doubleValue();
+                        //b2c最低手续费0.1
+                        if (payAmount < 0.1) {
+                            payAmount = 0.1;
+                        }
+                    } else if (8 == discernReceipt.getPayType() || 13 == discernReceipt.getPayType() || 15 == discernReceipt.getPayType()) {
+                        //微信0.65%手续费
+                        //微信0.65%
+                        payAmount = MathUtil.mul(splitAmount, 0.0065, 2).doubleValue();
+                    } else if (29 == discernReceipt.getPayType()) {
+                        //快捷支付 借记卡支付29,
+
+                        payAmount = MathUtil.mul(splitAmount, 0.003, 2).doubleValue();
+                        if (payAmount < 0.1) {
+                            payAmount = 0.1;
+                        }
+                    } else if (30 == discernReceipt.getPayType()) {
+                        //快捷支付 贷记卡支付30
+                        payAmount = MathUtil.mul(splitAmount, 0.006, 2).doubleValue();
+                        if (payAmount < 0.1) {
+                            payAmount = 0.1;
+                        }
+                    } else {
+                        //手续费 其他0.25%
+                        payAmount = MathUtil.mul(splitAmount, 0.0025, 2).doubleValue();
+                    }
+                    if (MathUtil.compare(payAmount, 0.01) <= 0) {
+                        payAmount = 0.01;
+                    }
+                    procedureFee = MathUtil.add(procedureFee, payAmount).doubleValue();
+                }
+            }
+            // 退款记录
+            List<CmReturnedPurchase> refundPurchase = shipMapper.getRefundPurchase(settlement.getShopOrderId());
+            for (CmReturnedPurchase refundPur : refundPurchase) {
+                refund.set(MathUtil.add(refund.get(), refundPur.getReturnedPurchaseFee()).doubleValue());
+            }
+            // 支付手续费
+            settlement.setPaymentCommission(procedureFee);
+            // 分帐记录
+            Double splitAccount = shipMapper.getSplitAccount(settlement.getShopOrderId());
+            // 分帐手续费
+            settlement.setProrateCommission(MathUtil.mul(splitAccount, 0.001).doubleValue());
+            // 总退款金额
+            settlement.setRefundAmount(refund.get());
         });
         PageInfo<SettlementVo> pageInfo = new PageInfo(settlementList);
         return ResponseJson.success(pageInfo);
     }
 
+    /**
+     * 导出excel
+     *
+     * @param shopId
+     * @param payStatus
+     * @param shopOrderNo
+     * @param name
+     * @param beginTime
+     * @param endTime
+     * @param refundStatus
+     * @return
+     */
+    @Override
+    public List<SettlementDto> exportExcel(Integer shopId, Integer payStatus, String shopOrderNo, String name, String beginTime, String endTime, Integer refundStatus) {
+        List<SettlementVo> settlementList = shipMapper.getSettlementList(shopId, payStatus, shopOrderNo, name, beginTime, endTime, refundStatus);
+        List<SettlementDto> settlementDtoList = new ArrayList<>();
+        settlementList.forEach(settlement -> {
+            if (null != settlement) {
+                List<OrderProductVo> orderProductList = orderCommonMapper.getShopOrderProduct(settlement.getShopOrderId());
+                settlement.setOrderProductList(orderProductList);
+            }
+            // 退款金额
+            AtomicDouble refund = new AtomicDouble(0);
+            // 付款手续费
+            double procedureFee = 0d;
+            // 付款记录
+            List<DiscernReceiptVo> shopOrderRelation = shipMapper.getShopOrderRelation(settlement.getShopOrderId());
+            for (DiscernReceiptVo discernReceipt:shopOrderRelation) {
+                // 本次支付金额,单位/元
+                double splitAmount = discernReceipt.getAssociateAmount();
+                double payAmount;
+                if (12 == discernReceipt.getPayType()) {
+                    // 网银支付
+                    payAmount = 10.00;
+                } else if (17 == discernReceipt.getPayType()) {
+                    //b2c网银
+                    //b2c 0.2%
+                    payAmount = MathUtil.mul(splitAmount, 0.002, 2).doubleValue();
+                    //b2c最低手续费0.1
+                    if (payAmount < 0.1) {
+                        payAmount = 0.1;
+                    }
+                } else if (8 == discernReceipt.getPayType() || 13 == discernReceipt.getPayType() || 15 == discernReceipt.getPayType()) {
+                    //微信0.65%手续费
+                    //微信0.65%
+                    payAmount = MathUtil.mul(splitAmount, 0.0065, 2).doubleValue();
+                } else if (29 == discernReceipt.getPayType()) {
+                    //快捷支付 借记卡支付29,
+
+                    payAmount = MathUtil.mul(splitAmount, 0.003, 2).doubleValue();
+                    if (payAmount < 0.1) {
+                        payAmount = 0.1;
+                    }
+                }else if (30 == discernReceipt.getPayType()) {
+                    //快捷支付 贷记卡支付30
+                    payAmount = MathUtil.mul(splitAmount, 0.006, 2).doubleValue();
+                    if (payAmount < 0.1) {
+                        payAmount = 0.1;
+                    }
+                } else {
+                    //手续费 其他0.25%
+                    payAmount = MathUtil.mul(splitAmount, 0.0025, 2).doubleValue();
+                }
+                if (MathUtil.compare(payAmount, 0.01) <= 0) {
+                    payAmount = 0.01;
+                }
+                procedureFee = MathUtil.add(procedureFee, payAmount).doubleValue();
+            }
+            // 退款记录
+            List<CmReturnedPurchase> refundPurchase = shipMapper.getRefundPurchase(settlement.getShopOrderId());
+            for (CmReturnedPurchase refundPur : refundPurchase) {
+                refund.set(MathUtil.add(refund.get(), refundPur.getReturnedPurchaseFee()).doubleValue());
+            }
+            // 支付手续费
+            settlement.setPaymentCommission(procedureFee);
+            // 分帐记录
+            Double splitAccount = shipMapper.getSplitAccount(settlement.getShopOrderId());
+            // 分帐手续费
+            settlement.setProrateCommission(MathUtil.mul(splitAccount, 0.001).doubleValue());
+            // 总退款金额
+            settlement.setRefundAmount(refund.get());
+            // 设置返回数据
+            SettlementDto lementDto = new SettlementDto();
+            lementDto.setShopOrderNo(settlement.getShopOrderNo());
+            lementDto.setOrderTime(settlement.getOrderTime());
+            lementDto.setName(settlement.getName());
+            if(settlement.getOrderProductList().size() > 0) {
+                String names = "";
+                for (OrderProductVo sett : settlement.getOrderProductList()) {
+                    names = names + sett.getName();
+                }
+                lementDto.setProductInfo(names);
+            }
+            lementDto.setTotalAmount(settlement.getTotalAmount());
+            if (1 == settlement.getRefundStatus()) {
+                lementDto.setRefundStatus("无退款");
+            } else {
+                lementDto.setRefundStatus("有退款");
+            }
+            lementDto.setRefundAmount(settlement.getRefundAmount());
+            lementDto.setPaymentCommission(settlement.getPaymentCommission());
+            lementDto.setProrateCommission(settlement.getProrateCommission());
+            if (1 == settlement.getSettlestatus()) {
+                lementDto.setPayStatus("未结算");
+            } else if (2 == settlement.getSettlestatus()){
+                lementDto.setPayStatus("部分结算");
+            } else {
+                lementDto.setPayStatus("已结算");
+            }
+            lementDto.setShouldPayShopAmount(settlement.getShouldPayShopAmount());
+            lementDto.setSettleAmount(settlement.getSettleAmount());
+            lementDto.setUnsettledAmount(MathUtil.sub(settlement.getShouldPayShopAmount(), settlement.getSettleAmount()).doubleValue());
+            settlementDtoList.add(lementDto);
+        });
+        return settlementDtoList;
+    }
+
     /**
      * 供应商子订单详情
      *
@@ -120,6 +322,12 @@ public class ShipServiceImpl implements ShipService {
             return ResponseJson.error("子订单异常,shopOrderId:" + shopOrderId, null);
         }
         setShopOrderInfo(shopOrder);
+        // 联合丽格 [待付款]或者线下支付[部分付款] 的子订单 状态
+        if ((4 != shopOrder.getStatus() && 5 != shopOrder.getStatus()) && ((1 == shopOrder.getReceiptStatus() && (2 == shopOrder.getOnlinePay() || 0 == shopOrder.getOnlinePay())) || (2 == shopOrder.getReceiptStatus() && 2 == shopOrder.getOnlinePay()))) {
+            shopOrder.setCheckFlag(2);
+        } else {
+            shopOrder.setCheckFlag(1);
+        }
         Map<String, Object> map = new HashMap<>(2);
         map.put("shopOrder", shopOrder);
         // 结算记录
@@ -171,11 +379,13 @@ public class ShipServiceImpl implements ShipService {
 
 
     private void setShopOrderInfo(ShopOrderVo shopOrder) {
+        // 设置订单状态
+        orderCommonService.setShopOrderStatus(shopOrder);
         // 收货地址
         OrderUserinfoVo userInfo = addressMapper.getOrderUserinfo(shopOrder.getOrderId());
         shopOrder.setUserInfo(userInfo);
         // (收款买家)收款状态:1待收款、2部分收款、3已收款
-        Integer receiptStatus = shipMapper.getOrderReceiptStatus(shopOrder.getOrderId());
+        Integer receiptStatus = shipMapper.getShopOrderReceiptStatus(shopOrder.getShopOrderId());
         //(收款买家)收款状态:1待收款、2部分收款、3已收款
         shopOrder.setReceiptStatus(receiptStatus);
         // 供应商名称
@@ -202,6 +412,25 @@ public class ShipServiceImpl implements ShipService {
                 orderProduct.setActualCancelNum(actualCancelNum);
             }
         });
+        // 发票信息
+        InvoicePo orderInvoice = orderClubMapper.getOrderInvoice(shopOrder.getOrderId());
+        shopOrder.setInvoice(orderInvoice);
+        // 线下支付凭证
+        List<VoucherPo> voucher = orderClubMapper.getVoucher(shopOrder.getShopOrderId());
+        // 支付凭证图片
+        if (null != voucher) {
+            List<Integer> ids = voucher.stream().map(VoucherPo::getId).collect(Collectors.toList());
+            List<VoucherImageDto> voucherImage = orderClubMapper.getVoucherImage(ids);
+            voucher.forEach(v -> {
+                List<VoucherImageDto> imageList = voucherImage.stream().filter(m -> m.getVoucherId().equals(v.getId())).collect(Collectors.toList());
+                v.setImgs(imageList);
+            });
+        }
+        // 子订单信息
+        orderCommonService.setShopOrderInfo(shopOrder);
+        // 设置子订单付款金额
+        orderCommonService.getDiscernReceiptAndSetShoporder(shopOrder);
+        shopOrder.setVoucher(voucher);
         shopOrder.setOrderProductList(orderProductList);
         shopOrder.setShopLogo(ImageUtil.getImageUrl("shopLogo", shopOrder.getShopLogo(), domain));
         shopOrder.setOrderProductList(orderProductList);
@@ -523,8 +752,14 @@ public class ShipServiceImpl implements ShipService {
         // 已取消发货数量
         Integer actualCancelNum = orderCommonMapper.countActualCancelNum(orderProduct.getShopOrderId(), orderProduct.getProductId());
         actualCancelNum = null != actualCancelNum ? actualCancelNum : 0;
+        // 子订单退款状态
+        Integer refundStatus = orderCommonMapper.getRefundStatus(orderProduct.getShopOrderId());
+        // 有退款 未发货置为 0
+        if (3 == refundStatus) {
+            actualCancelNum = 0;
+        }
         // 未发货数量
-        recordVo.setNotShippedNum(orderProduct.getNotOutStore() - actualCancelNum);
+        recordVo.setNotShippedNum(recordVo.getBuyNum() - shipmentsNum + actualCancelNum);
     }
 
     /**
@@ -973,4 +1208,140 @@ public class ShipServiceImpl implements ShipService {
             return ResponseJson.error("保存商品资质参数解析异常!", null);
         }
     }
+
+    /**
+     * 更改收款状态
+     *
+     * @param amount
+     * @param shopOrderId
+     * @return
+     */
+    @Override
+    public ResponseJson checkReceipt(Double amount, Integer shopOrderId) {
+        Double wait = shipMapper.findWaitPay(shopOrderId);
+        if (amount > wait) {
+            return ResponseJson.error("支付金额大于待付!");
+        }
+        // 修改cm_order状态
+        Integer orderId = shipMapper.getOrderId(shopOrderId);
+        ReceiptVo receiptVo = new ReceiptVo();
+        // 31 线下凭证
+        receiptVo.setPayType(31);
+        receiptVo.setPayWay(2);
+        receiptVo.setNewReceiptType(2);
+        receiptVo.setReceiptType(1);
+        receiptVo.setReceiptStatus(3);
+        receiptVo.setReceiptAmount(amount);
+        shipMapper.insertOrderReceipt(receiptVo);
+        OrderReceiptRelationPo record = new OrderReceiptRelationPo();
+        record.setReceiptAmount(amount);
+        record.setRelationType(2);
+        record.setReceiptId(receiptVo.getId());
+        record.setShopOrderId(shopOrderId);
+        record.setOrderId(orderId);
+        shipMapper.insertOrderRelation(record);
+        // 根据金额修改cm_Shop_order状态
+        Integer status = 2;
+        if (0 == wait - amount) {
+            status = 3;
+        }
+        shipMapper.updateReceiptStatus(status, shopOrderId);
+        // 获取订单下子订单收款状态
+        List<Integer> receiptStatus = shipMapper.getReceiptStatus(orderId);
+        Integer sta = 1;
+        if (receiptStatus.stream().allMatch(r -> r==3)) {
+            sta = 3;
+        } else if (receiptStatus.stream().allMatch(r -> r==1)) {
+            sta = 1;
+        } else {
+            sta = 2;
+        }
+        shipMapper.updateOrderReceiptStatus(sta, orderId);
+        return ResponseJson.success();
+    }
+
+    @Override
+    public List<OrderRemarkDto> findList(Integer orderId) {
+        List<OrderRemarkDto> list = shipMapper.findList(orderId);
+        list.forEach(l -> {
+            l.setImages(shipMapper.findImages(l.getId()));
+            l.setOssFiles(shipMapper.findFiles(l.getId()));
+        });
+        return list;
+    }
+
+    @Override
+    public void insertRemark(OrderRemarkDto remark) {
+        // CmMallAdminUser user = (CmMallAdminUser) SecurityUtils.getSubject().getPrincipal();
+        // remark.setCreateBy(user.getId());
+        shipMapper.insert(remark);
+        List<String> images = remark.getImages();
+        List<OssFileDto> ossFiles = remark.getOssFiles();
+        if (null != images && images.size() > 0) {
+            images.forEach(i -> {
+                RemarkImageDto remarkImage = new RemarkImageDto();
+                remarkImage.setRemarkImage(i);
+                remarkImage.setRemarkId(remark.getId());
+                remarkImage.setOrderId(remark.getOrderId());
+                shipMapper.insertImage(remarkImage);
+            });
+        }
+        if (null != ossFiles && ossFiles.size() > 0) {
+            ossFiles.forEach(o -> {
+                o.setRemarkId(remark.getId());
+                o.setOrderId(remark.getOrderId());
+                shipMapper.insertFile(o);
+            });
+        }
+    }
+
+    @Override
+    public ResponseJson<Map<String, Object>> upload(MultipartFile file, Integer orderId) {
+        Map<String, Object> map = new HashMap<>();
+        String fileAllName = file.getOriginalFilename();
+        String fileType = fileAllName.substring(fileAllName.lastIndexOf(".") + 1);
+        String uuid = UUID.randomUUID().toString().replaceAll("-", "");
+        String filePath = uuid + "." + fileType;
+        String contentType = ossUtils.getContentType(fileAllName);
+        try {
+            //保存本地
+            File fil = ossUtils.ossUpload(file);
+            //判断文件的唯一性,转换成16进制md5值
+            String md5Hex = DigestUtils.md5Hex(new FileInputStream(fil));
+            OssFileDto remarkFile = shipMapper.findFileByMd5(md5Hex);
+            String url = "";
+            if (remarkFile == null) {
+                log.info("默认路径>>>" + fil.getAbsolutePath());
+                //上传oss
+                url = ossUtils.ossUpload(filePath, fil, contentType);
+            } else {
+                filePath = remarkFile.getOssName();
+            }
+            //删除本地文件
+            ossUtils.deleteFile(fil);
+            //保存关联关系
+            OssFileDto orderRemarkFile = new OssFileDto();
+            orderRemarkFile.setOrderId(orderId);
+            orderRemarkFile.setName(fileAllName);
+            orderRemarkFile.setOssName(filePath);
+            orderRemarkFile.setMd5Hex(md5Hex);
+            map.put("url", url);
+            map.put("ossFiles", orderRemarkFile);
+            return ResponseJson.success(map);
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.info("备注文件上传异常!!!");
+            return ResponseJson.error("备注文件上传异常");
+        }
+    }
+
+    @Override
+    public void downFile(Integer fileId, HttpServletRequest request, HttpServletResponse response) throws IOException {
+        OssFileDto remarkFile = shipMapper.findRemarkById(fileId);
+        if (null != remarkFile) {
+            String fileName = remarkFile.getName();
+            ossUtils.downFile(remarkFile.getOssName(), fileName);
+            ossService.download(request, response, fileName);
+        }
+    }
 }

Dosya farkı çok büyük olduğundan ihmal edildi
+ 334 - 294
src/main/java/com/caimei365/order/service/impl/SubmitServiceImpl.java


+ 243 - 0
src/main/java/com/caimei365/order/utils/OSSUtils.java

@@ -0,0 +1,243 @@
+package com.caimei365.order.utils;
+
+import com.aliyun.oss.OSS;
+import com.aliyun.oss.OSSClientBuilder;
+import com.aliyun.oss.model.GetObjectRequest;
+import com.aliyun.oss.model.ObjectMetadata;
+import com.aliyun.oss.model.UploadFileRequest;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.io.IOException;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.UUID;
+
+@Slf4j
+@Component
+public class OSSUtils {
+
+
+    private static final String config = "beta";
+    private static final String endpoint = "https://oss-cn-shenzhen.aliyuncs.com";
+    private static final String accessKeyId = "LTAI4GBL3o4YkWnbKYgf2Xia";
+    private static final String accessKeySecret = "dBjAXqbYiEPP6Ukuk2ZsXQeET7FVkK";
+    private static final String privateBucket = "caimei-oss";
+
+
+    public String ossUpload(String fileName, File file, String contentType) {
+        String url = null;
+        try {
+            if ("product".equals(config)) {
+                fileName = "prod/" + fileName;
+            } else {
+                fileName = config + "/" + fileName;
+            }
+            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
+            ObjectMetadata meta = new ObjectMetadata();
+            meta.setContentType(contentType);
+            UploadFileRequest uploadFileRequest = new UploadFileRequest(privateBucket, fileName);
+            // 指定上传的本地文件。
+            uploadFileRequest.setUploadFile(file.toString());
+            // 指定上传并发线程数,默认为1。
+            uploadFileRequest.setTaskNum(10);
+            // 指定上传的分片大小,范围为100KB~5GB,默认为文件大小/10000。
+            uploadFileRequest.setPartSize(1024 * 1024);
+            // 开启断点续传,默认关闭。
+            uploadFileRequest.setEnableCheckpoint(true);
+            uploadFileRequest.setCheckpointFile(file.getAbsolutePath() + "uploadFile.ucp");
+            // 文件的元数据。
+            uploadFileRequest.setObjectMetadata(meta);
+            // 设置上传成功回调,参数为Callback类型。
+            //uploadFileRequest.setCallback("<yourCallbackEvent>");
+            // 断点续传上传。
+            ossClient.uploadFile(uploadFileRequest);
+            Date expiration = new Date(new Date().getTime() + 3600L * 1000);
+            url = ossClient.generatePresignedUrl(privateBucket, fileName, expiration).toString();
+            // 关闭OSSClient。
+            ossClient.shutdown();
+        } catch (Throwable e) {
+            e.printStackTrace();
+        }
+        return url;
+    }
+
+
+    /**
+     * 通过文件名判断并获取OSS服务文件上传时文件的contentType
+     */
+    public String getContentType(String fileName) {
+        String fileExtension = fileName.substring(fileName.lastIndexOf("."));
+        if (".bmp".equalsIgnoreCase(fileExtension)) {
+            return "image/bmp";
+        }
+        if (".gif".equalsIgnoreCase(fileExtension)) {
+            return "image/gif";
+        }
+        if (".jpeg".equalsIgnoreCase(fileExtension)) {
+            return "image/jpeg";
+        }
+        if (".jpg".equalsIgnoreCase(fileExtension)) {
+            return "image/jpg";
+        }
+        if (".png".equalsIgnoreCase(fileExtension)) {
+            return "image/png";
+        }
+        if (".html".equalsIgnoreCase(fileExtension)) {
+            return "text/html";
+        }
+        if (".txt".equalsIgnoreCase(fileExtension)) {
+            return "text/plain";
+        }
+        if (".vsd".equalsIgnoreCase(fileExtension)) {
+            return "application/vnd.visio";
+        }
+        if (".ppt".equalsIgnoreCase(fileExtension)) {
+            return "application/vnd.ms-powerpoint";
+        }
+        if (".pptx".equalsIgnoreCase(fileExtension)) {
+            return "application/vnd.openxmlformats-officedocument.presentationml.presentation";
+        }
+        if (".doc".equalsIgnoreCase(fileExtension)) {
+            return "application/msword";
+        }
+        if ("docx".equalsIgnoreCase(fileExtension)) {
+            return "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
+        }
+        if (".xml".equalsIgnoreCase(fileExtension)) {
+            return "text/xml";
+        }
+        if (".mp4".equalsIgnoreCase(fileExtension)) {
+            return "video/mp4";
+        }
+        if (".mp3".equalsIgnoreCase(fileExtension)) {
+            return "audio/mp3";
+        }
+        if (".pdf".equalsIgnoreCase(fileExtension)) {
+            return "application/pdf";
+        }
+        return "text/html";
+    }
+
+    public void deleteFile(File... files) {
+        for (File file : files) {
+            //logger.info("File:[{}]",file.getAbsolutePath());
+            if (file.exists()) {
+                file.delete();
+            }
+        }
+    }
+
+    public File ossUpload(MultipartFile file) throws IOException {
+        // 获取文件名
+        String fileName = file.getOriginalFilename();
+        // 获取文件后缀
+        String prefix = fileName.substring(fileName.lastIndexOf("."));
+        // 用uuid作为文件名,防止生成的临时文件重复
+        File excelFile = File.createTempFile(UUID.randomUUID().toString(), prefix);
+        // MultipartFile to File
+        file.transferTo(excelFile);
+        //程序结束时,删除临时文件
+        return excelFile;
+    }
+
+    /**
+     * 授权生成签名URL临时访问
+     *
+     * @param fileName 文件名称
+     */
+    public String getOssUrl(String fileName) {
+        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
+        // 设置URL过期时间为1个小时
+        Date expiration = new Date(new Date().getTime() + 3600L * 1000);
+        if ("product".equals(config)) {
+            fileName = "prod/" + fileName;
+        } else {
+            fileName = config + "/" + fileName;
+        }
+        String url = ossClient.generatePresignedUrl(privateBucket, fileName, expiration).toString();
+        // 关闭OSSClient。
+        ossClient.shutdown();
+        return url;
+    }
+
+    /**
+     * 生成商品资料库链接
+     *
+     * @param archiveFile
+     * @return
+     */
+    public String generateProductArchiveUrl(String ossName, Date uploadTime) {
+        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
+        // 设置URL过期时间为1个小时
+        Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000);
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        try {
+            Date dateOne = format.parse("2021-06-01 00:00:00");
+            Date dateTwo = format.parse("2021-09-17 18:00:00");
+            String active = "product".equals(config) ? "prod" : config;
+            if (uploadTime != null && uploadTime.compareTo(dateOne) > 0 && uploadTime.compareTo(dateTwo) < 0) {
+                ossName = active + "/" + ossName;
+            } else if (uploadTime != null && uploadTime.compareTo(dateTwo) > 0) {
+                ossName = active + "/archiveFile/" + ossName;
+            }
+        } catch (ParseException e) {
+        }
+        String url = ossClient.generatePresignedUrl(privateBucket, ossName, expiration).toString();
+        ossClient.shutdown();
+        return url;
+    }
+
+    /**
+     * oss单个文件删除
+     *
+     * @param fileName 文件名称或文件夹名称
+     */
+    public void deleteSingleFile(String fileName) {
+        // 创建OSSClient实例。
+        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
+        // 删除文件。如需删除文件夹,请将ObjectName设置为对应的文件夹名称。
+        // 如果文件夹非空,则需要将文件夹下的所有object删除后才能删除该文件夹。
+        try {
+            //之前的文件没有放进文件夹
+            ossClient.deleteObject(privateBucket, fileName);
+        } catch (Exception e) {
+            if ("product".equals(config)) {
+                fileName = "prod/" + fileName;
+            } else {
+                fileName = config + "/" + fileName;
+            }
+            ossClient.deleteObject(privateBucket, fileName);
+        }
+        // 关闭OSSClient。
+        ossClient.shutdown();
+    }
+
+    /**
+     * oss单个文件下载
+     */
+    public void downFile(String ossName, String fileName) {
+        // 创建OSSClient实例。
+        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
+        // 下载OSS文件到本地文件。如果指定的本地文件存在会覆盖,不存在则新建。
+        try {
+            //之前的文件没有放进文件夹
+            ossClient.getObject(new GetObjectRequest(privateBucket, ossName), new File("./" + fileName));
+        } catch (Exception e) {
+            if ("product".equals(config)) {
+                ossName = "prod/" + ossName;
+            } else {
+                ossName = config + "/" + ossName;
+            }
+            ossClient.getObject(new GetObjectRequest(privateBucket, ossName), new File("./" + fileName));
+        }
+        // 关闭OSSClient。
+        ossClient.shutdown();
+    }
+}

+ 14 - 1
src/main/resources/mapper/AddressMapper.xml

@@ -34,6 +34,19 @@
         SELECT cityID AS parentId, townID AS id, name
         FROM town WHERE cityID = #{cityId} AND validFlag = '1'
     </select>
+    <select id="getAddressByTownId" resultType="com.caimei365.order.model.vo.AddressVo">
+        SELECT
+            t.name AS town,
+            c.name AS city,
+            c.cityID AS cityId,
+            t.townID AS townId,
+            p.name AS province,
+            p.provinceID AS provinceID
+        FROM town t
+                 LEFT JOIN city c ON c.cityID = t.cityID
+                 LEFT JOIN province p ON p.provinceID = c.provinceID
+        WHERE t.townId = #{townId}
+    </select>
     <select id="getAddressById" resultType="com.caimei365.order.model.po.AddressPo">
         SELECT
             a.addressID AS addressId,
@@ -90,4 +103,4 @@
         FROM bp_order_userinfo
         WHERE orderId = #{orderId}
     </select>
-</mapper>
+</mapper>

+ 57 - 27
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 ifnull(userOrganizeID, 0) as 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`
@@ -20,9 +24,9 @@
         LIMIT 1
     </select>
     <insert id="insertUserInvoiceByUserId" parameterType="com.caimei365.order.model.vo.InvoiceVo">
-        INSERT INTO cm_user_invoiceinfo (userId, invoiceTitle, corporationTaxNum, registeredAddress, registeredPhone,
+        INSERT INTO cm_user_invoiceinfo (userId, type, headingType, invoiceTitle, corporationTaxNum, registeredAddress, registeredPhone,
                                          bankAccountNo, openBank)
-        VALUES (#{userId}, #{invoiceTitle}, #{corporationTaxNum}, #{registeredAddress}, #{registeredPhone},
+        VALUES (#{userId}, #{type}, #{headingType}, #{invoiceTitle}, #{corporationTaxNum}, #{registeredAddress}, #{registeredPhone},
                 #{bankAccountNo}, #{openBank})
     </insert>
     <insert id="insertPurchasePrice" keyColumn="id" keyProperty="id"
@@ -41,7 +45,9 @@
     </insert>
     <update id="updateUserInvoiceByUserId" parameterType="com.caimei365.order.model.vo.InvoiceVo">
         UPDATE cm_user_invoiceinfo
-        SET invoiceTitle      = #{invoiceTitle},
+        SET type              = #{type},
+            headingType       = #{headingType},
+            invoiceTitle      = #{invoiceTitle},
             corporationTaxNum = #{corporationTaxNum},
             registeredAddress = #{registeredAddress},
             registeredPhone   = #{registeredPhone},
@@ -64,8 +70,8 @@
     </select>
     <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.skuID in
+        WHERE cs.organizeId = 0
+        and cs.skuID in
         <foreach collection="skuIds" open="(" separator="," close=")" item="skuId">
             #{skuId}
         </foreach>
@@ -109,6 +115,7 @@
           and r.userId = #{userId}
           and ((cs.costCheckFlag = 1 and r.currentPrice <![CDATA[ >= ]]> cs.costPrice) or cs.costCheckFlag = 2)
           and cs.price <![CDATA[ >= ]]> r.currentPrice
+          and cs.organizeId = 0
           and r.delFlag = 0
     </select>
     <select id="getPromotionByShopId" resultType="com.caimei365.order.model.vo.PromotionsVo">
@@ -173,12 +180,14 @@
                cs.unit      AS unit,
                cs.stock     AS stock,
                cpg.skuId    AS giftSkuId,
-               p.validFlag  AS validFlag,
+               IFNULL((SELECT validFlag FROM cm_organize_product_info WHERE productId = p.productID AND organizeId = 0),
+                      999)  AS validFlag,
                p.productType
         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
         ORDER BY cpg.id DESC
     </select>
     <select id="getShopByProductId" resultType="com.caimei365.order.model.vo.CartShopVo">
@@ -221,12 +230,14 @@
     <select id="getPostageFlagList" resultType="com.caimei365.order.model.vo.ProductPostageVo">
         SELECT
         p.productID AS productId,
-        freePostFlag AS postageFlag,
-        commodityType,
-        productType
+        p.freePostFlag AS postageFlag,
+        p.commodityType,
+        p.productType
         FROM product p
         left join cm_sku cs on p.productID=cs.productId
-        WHERE validFlag='2' AND cs.skuId in
+        left join cm_organize_product_info copi on copi.productId = p.productId
+        where copi.validFlag = 2 and copi.organizeId = 0 and cs.organizeId = 0
+        AND cs.skuId in
         <foreach collection="skuIds" open="(" separator="," close=")" item="skuId">
             #{skuId}
         </foreach>
@@ -238,25 +249,24 @@
         p.commodityType,
         p.productType
         FROM product p
-        LEFT JOIN cm_sku cs ON p.productID=cs.productId
-        LEFT JOIN cm_mall_product_sku cmps ON cmps.skuId = cs.skuId
-        LEFT JOIN cm_mall_organize_products cmop ON cmop.productId = p.productId
-        WHERE cmop.validFlag='1' AND cmop.delFlag = 0 AND cs.skuId IN
+        LEFT JOIN cm_sku cs ON p.productID = cs.productId
+        left join cm_organize_product_info copi on copi.productId = p.productId
+        where copi.validFlag=2 and copi.organizeId = 4 and cs.organizeId = 4 AND cs.skuId IN
         <foreach collection="skuIds" open="(" separator="," close=")" item="skuId">
             #{skuId}
         </foreach>
     </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(*)
@@ -302,6 +312,7 @@
         FROM product p
                  LEFT JOIN cm_sku cs on cs.productId = p.productID
         WHERE cs.skuId = #{skuId}
+          and cs.organizeId = 0
     </select>
     <select id="getClauseList" resultType="com.caimei365.order.model.vo.ClauseVo">
         SELECT id,
@@ -361,9 +372,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
@@ -443,4 +454,23 @@
         where skuId = #{skuId}
           and promotionId = #{promotionId}
     </select>
+    <select id="findShopOrderBalanceRecord" resultType="com.caimei365.order.model.po.BalanceRecordPo">
+        select id,
+               userId,
+               type,
+               balanceType,
+               addDate,
+               amount,
+               orderId,
+               shopOrderId,
+               receiptId,
+               returnedId,
+               remark,
+               delFlag
+        from cm_user_balance_record
+        where shopOrderId = #{shopOrderId}
+        and delFlag = 0
+        and type = 2
+        and balanceType = 1
+    </select>
 </mapper>

+ 67 - 60
src/main/resources/mapper/CartClubMapper.xml

@@ -18,7 +18,6 @@
         c.shopID AS shopId,
         s.name AS shopName,
         s.logo AS shopLogo,
-        p.returnGoodsStutas,
         s.shopType as shopType
         <if test="status!=null and status == 1">
             ,p.splitCode
@@ -35,12 +34,26 @@
         ORDER BY c.cm_cartID DESC
     </select>
 
+    <select id="getProductReturnGoodsStutas" resultType="com.caimei365.order.model.vo.CartShopVo">
+        SELECT DISTINCT
+        c.shopID AS shopId,
+        p.returnGoodsStutas
+        FROM cm_cart c
+        LEFT JOIN shop s ON c.shopID = s.shopID
+        LEFT JOIN product p ON c.productID = p.productID
+        WHERE  c.skuId in
+        <foreach collection="skuIds" open="(" separator="," close=")" item="skuId">
+            #{skuId}
+        </foreach>
+        GROUP BY c.shopID, c.cm_cartID
+        ORDER BY c.cm_cartID DESC
+    </select>
+
     <select id="getShopsByProductIds" resultType="com.caimei365.order.model.vo.CartShopVo">
         SELECT DISTINCT
         s.shopID AS shopId,
         s.name AS shopName,
         s.logo AS shopLogo,
-        p.returnGoodsStutas,
         p.productType
         FROM shop s
         LEFT JOIN product p ON p.shopID = s.shopID
@@ -73,7 +86,7 @@
                p.invoiceType                 AS invoiceType,
                p.taxPoint                    AS taxRate,
                p.productCategory,
-               p.validFlag                   AS validFlag,
+               IFNULL((SELECT validFlag FROM cm_organize_product_info  WHERE productId = p.productID AND organizeId = 0), 999) AS validFlag,
                p.visibility,
                if(csp.id is not null and csp.status = 0, 1, 0)  as svipProductFlag,
 #                csp.priceType                 as svipPriceType,
@@ -86,9 +99,10 @@
                  LEFT JOIN cm_svip_product csp ON c.productID = csp.productId
         WHERE c.userID = #{userId}
           and p.shopID = #{shopId}
+          and cs.organizeId = 0
         ORDER BY c.cm_cartID DESC
     </select>
-        <select id="getCartOrganizeProductsByShopId" resultType="com.caimei365.order.model.vo.CartItemVo">
+    <select id="getCartOrganizeProductsByShopId" resultType="com.caimei365.order.model.vo.CartItemVo">
         SELECT c.cm_cartID                   AS id,
                c.productCount                AS number,
                p.productID                   AS productId,
@@ -97,30 +111,26 @@
                p.mainImage                   AS image,
                p.productCode,
                c.skuId,
-               cmps.price,
-               cmps.price                      AS originalPrice,
+               cs.price,
+               cs.price                      AS originalPrice,
                cs.unit                       AS unit,
-               cs.stock                      AS stock,
                p.step                        AS step,
-               cmps.minBuyNumber AS MIN,
+               cs.minBuyNumber AS MIN,
                p.priceFlag,
                IFNULL(cs.ladderPriceFlag, 0) AS ladderFlag,
                p.includedTax                 AS includedTax,
                p.invoiceType                 AS invoiceType,
                p.taxPoint                    AS taxRate,
                p.productCategory,
-               cmop.validFlag                   AS validFlag,
+               IFNULL((SELECT validFlag FROM cm_organize_product_info  WHERE productId = p.productID AND organizeId = #{organizeId}), 999) AS validFlag,
                p.visibility,
                p.productType
         FROM cm_cart c
                  LEFT JOIN product P ON c.productID = p.productID
-                 LEFT JOIN cm_sku cs ON c.skuId = cs.skuId
-                 LEFT JOIN cm_mall_product_sku cmps ON cmps.skuId = cs.skuId
-                 LEFT JOIN cm_mall_organize_products cmop ON cmop.productId = c.productId
+                 LEFT JOIN cm_sku cs ON cs.skuId = c.skuId
         WHERE c.userID = #{userId}
           and p.shopID = #{shopId}
-          and cmop.organizeID = #{organizeId}
-          AND cmop.delFlag = 0
+          and cs.organizeID = #{organizeId}
         ORDER BY c.cm_cartID DESC
     </select>
     <select id="getCartProductsByShopIdAndProductIds" resultType="com.caimei365.order.model.vo.CartItemVo">
@@ -145,7 +155,7 @@
         p.invoiceType AS invoiceType,
         p.taxPoint AS taxRate,
         p.productCategory,
-        p.validFlag AS validFlag,
+        IFNULL((SELECT validFlag FROM cm_organize_product_info  WHERE productId = p.productID AND organizeId = 0), 999) AS validFlag,
         p.visibility,
         p.commodityType as commodityType,
         if(csp.id is not null and csp.status = 0,1,0) as svipProductFlag,
@@ -158,8 +168,9 @@
         LEFT JOIN product p ON c.productID = p.productID
         LEFT JOIN cm_sku cs ON c.skuId = cs.skuId
         LEFT JOIN cm_svip_product csp ON p.productID = csp.productId
-        WHERE c.userID = #{userId} and p.shopID = #{shopId}
-        AND p.validFlag='2'
+        left join cm_organize_product_info copi on copi.productId = p.productId
+        WHERE c.userID = #{userId} and p.shopID = #{shopId} and cs.organizeId = 0 and copi.organizeId = 0
+        AND copi.validFlag='2'
         <if test="splitCode !=null and splitCode !=''">
             AND p.splitCode = #{splitCode}
         </if>
@@ -179,33 +190,27 @@
         p.`name` AS `name`,
         p.mainImage AS image,
         p.productCode,
-        cmps.price,
-        cmps.price AS originalPrice,
+        cs.price,
+        cs.price AS originalPrice,
         cs.unit AS unit,
-        ifnull(cs.stock,0) AS stock,
         p.step AS step,
-        cmps.minBuyNumber AS min,
+        cs.minBuyNumber AS min,
         p.priceFlag,
-        cs.ladderPriceFlag AS ladderFlag,
         p.includedTax AS includedTax,
         p.invoiceType AS invoiceType,
         p.taxPoint AS taxRate,
         p.productCategory,
-        cmop.validFlag AS validFlag,
+        copi.validFlag AS validFlag,
         p.visibility,
         p.commodityType as commodityType,
-        #         csp.priceType as svipPriceType,
-        #         csp.discount as svipDiscount,
-        #         csp.discountPrice as svipDiscountPrice,
         p.productType,
         p.splitCode
         FROM cm_cart c
         LEFT JOIN product p ON c.productID = p.productID
-        LEFT JOIN cm_sku cs ON c.skuId = cs.skuId
-        LEFT JOIN cm_mall_organize_products cmop ON cmop.productId = p.productID
-        LEFT JOIN cm_mall_product_sku cmps ON cmps.skuId = cs.skuId
-        WHERE c.userID = #{userId} and p.shopID = #{shopId} and cmop.organizeID = #{organizeId} and cmop.delFlag = 0
-        AND cmop.validFlag='1'
+        LEFT JOIN cm_sku cs ON cs.skuId = c.skuId
+        left join cm_organize_product_info copi on copi.productId = p.productId
+        WHERE c.userID = #{userId} and p.shopID = #{shopId} and cs.organizeID = #{organizeId} and copi.organizeID = #{organizeId}
+        AND copi.validFlag='2'
         <if test="splitCode !=null and splitCode !=''">
             AND p.splitCode = #{splitCode}
         </if>
@@ -236,7 +241,7 @@
         p.invoiceType AS invoiceType,
         p.taxPoint AS taxRate,
         p.productCategory,
-        p.validFlag AS validFlag,
+        copi.validFlag AS validFlag,
         p.visibility,
         p.commodityType as commodityType,
         if(csp.id is not null and csp.status = 0,1,0) as svipProductFlag,
@@ -247,8 +252,9 @@
         FROM cm_sku cs
         LEFT JOIN product p on cs.productId = p.productID
         LEFT JOIN cm_svip_product csp ON p.productID = csp.productId
-        WHERE p.shopID = #{shopId}
-        AND p.validFlag='2' AND cs.skuId in
+        left join cm_organize_product_info copi on copi.productId = p.productId
+        WHERE p.shopID = #{shopId} and cs.organizeId = 0 and copi.organizeId = 0
+        AND copi.validFlag='2' AND cs.skuId in
         <foreach collection="skuIdList" open="(" separator="," close=")" item="skuId">
             #{skuId}
         </foreach>
@@ -276,14 +282,17 @@
                p.taxPoint         AS taxRate,
                p.productCategory,
                p.visibility,
-               p.validFlag        AS validFlag,
+               copi.validFlag        AS validFlag,
                p.productType
         FROM cm_cart c
                  LEFT JOIN product p ON c.productID = p.productID
                  LEFT JOIN cm_sku cs ON cs.skuId = c.skuId
-        WHERE p.validFlag = '2'
+                 left join cm_organize_product_info copi on copi.productId = p.productId
+        WHERE copi.validFlag = '2'
+          and copi.organizeId = 0
           AND c.userID = #{userId}
           AND p.priceFlag != '1'
+          and cs.organizeId = 0
           AND cs.stock != '0'
           AND cs.stock <![CDATA[ >= ]]> c.productCount
         ORDER BY c.cm_cartID DESC
@@ -297,12 +306,11 @@
                p.`name`           AS `name`,
                p.mainImage        AS image,
                p.productCode,
-               cmps.price,
-               cmps.price           AS originalPrice,
+               cs.price,
+               cs.price           AS originalPrice,
                cs.unit            AS unit,
-               cs.stock           AS stock,
                p.step             AS step,
-               cmps.minBuyNumber    AS MIN,
+               cs.minBuyNumber    AS MIN,
                p.priceFlag,
                cs.ladderPriceFlag AS ladderFlag,
                p.includedTax      AS includedTax,
@@ -310,19 +318,17 @@
                p.taxPoint         AS taxRate,
                p.productCategory,
                p.visibility,
-               cmop.validFlag        AS validFlag,
+               copi.validFlag        AS validFlag,
                p.productType
         FROM cm_cart c
                  LEFT JOIN product p ON c.productID = p.productID
                  LEFT JOIN cm_sku cs ON cs.skuId = c.skuId
-                 LEFT JOIN cm_mall_organize_products cmop ON cmop.productId = c.productID
-                 LEFT JOIN cm_mall_product_sku cmps ON cmps.skuId = c.skuId
-        WHERE -- cmop.validFlag = '1'
+                 left join cm_organize_product_info copi on copi.productId = p.productId
+        WHERE
            c.userID = #{userId}
+          AND copi.organizeId = 4
           AND p.priceFlag != '1'
-          AND cs.stock != '0'
-          AND cmop.organizeId = 4
-          AND cs.stock <![CDATA[ >= ]]> c.productCount
+          AND cs.organizeId = 4
         ORDER BY c.cm_cartID DESC
     </select>
     <select id="getCartPo" resultType="com.caimei365.order.model.po.CartPo">
@@ -447,7 +453,7 @@
                p.invoiceType                AS invoiceType,
                p.taxPoint                   AS taxRate,
                p.productCategory,
-               p.validFlag                  AS validFlag,
+               copi.validFlag                  AS validFlag,
                p.visibility,
                p.commodityType              AS commodityType,
                if(csp.id is not null and csp.status = 0, 1, 0) as svipProductFlag,
@@ -459,40 +465,41 @@
         FROM cm_sku cs
                  LEFT JOIN product p on p.productID = cs.productId
                  LEFT JOIN cm_svip_product csp ON p.productID = csp.productId
-        WHERE p.validFlag = '2'
+                 left join cm_organize_product_info copi on copi.productId = p.productId
+        WHERE copi.validFlag = '2'
+          AND copi.organizeId = 0
           AND cs.skuId = #{skuId}
+          and cs.organizeId = 0
     </select>
 
     <select id="getCartOrganizeProductId" resultType="com.caimei365.order.model.vo.CartItemVo">
-        SELECT cs.skuId,
+        SELECT cs.skuId as skuId,
                p.productID                  AS productId,
                p.shopID                     AS shopId,
                p.`name`                     AS `name`,
                p.mainImage                  AS image,
                p.productCode,
-               cmps.price,
-               cmps.price                     AS originalPrice,
+               cs.price,
+               cs.price                     AS originalPrice,
                cs.unit                      AS unit,
-               IFNULL(cs.stock,0)           AS stock,
                p.step                       AS step,
-               cmps.minBuyNumber AS MIN,
+               cs.minBuyNumber AS MIN,
                p.priceFlag,
                cs.ladderPriceFlag           AS ladderFlag,
                p.includedTax                AS includedTax,
                p.invoiceType                AS invoiceType,
                p.taxPoint                   AS taxRate,
                p.productCategory,
-               p.validFlag                  AS validFlag,
+               copi.validFlag                  AS validFlag,
                p.visibility,
                p.commodityType              AS commodityType,
                p.productType,
                p.returnGoodsStutas
-        FROM cm_mall_product_sku cmps
-                 LEFT JOIN cm_mall_organize_products cmop ON cmop.id = cmps.mallProductId
-                 LEFT JOIN cm_sku cs ON cmps.skuId = cs.skuId
+        FROM cm_sku cs
                  LEFT JOIN product p ON p.productID = cs.productId
-        WHERE cmop.validFlag = '1'
-          AND cs.skuId = #{skuId}
+                 left join cm_organize_product_info copi on copi.productId = p.productId
+        WHERE copi.validFlag = '2'
+          AND cs.skuId = #{skuId} and cs.organizeId = 4 and copi.organizeId = 4
     </select>
 
     <select id="findVipCoupon" resultType="java.lang.Integer">

+ 28 - 13
src/main/resources/mapper/CartSellerMapper.xml

@@ -33,7 +33,7 @@
                p.invoiceType                AS invoiceType,
                p.taxPoint                   AS taxRate,
                p.productCategory,
-               p.validFlag                  AS validFlag,
+               IFNULL((SELECT validFlag FROM cm_organize_product_info  WHERE productId = p.productID AND organizeId = 0), 999) AS validFlag,
                if(csp.id is not null and csp.status = 0, 1, 0) as svipProductFlag,
 #                csp.priceType                as svipPriceType,
 #                csp.discount                 as svipDiscount,
@@ -46,6 +46,7 @@
         WHERE c.serviceProviderId = #{serviceProviderId}
           AND c.clubId = #{clubId}
           AND c.shopID = #{shopId}
+          and cs.organizeId = 0
         ORDER BY c.id DESC
     </select>
     <select id="getSellerCartOrganizeProducts" resultType="com.caimei365.order.model.vo.CartItemVo">
@@ -180,7 +181,7 @@
         p.invoiceType AS invoiceType,
         p.taxPoint AS taxRate,
         p.productCategory,
-        p.validFlag AS validFlag,
+        IFNULL((SELECT validFlag FROM cm_organize_product_info  WHERE productId = p.productID AND organizeId = 0), 999) AS validFlag,
         p.productType,
         if(csp.id is not null and csp.status = 0,1,0) as svipProductFlag
 #         csp.priceType as svipPriceType,
@@ -190,7 +191,7 @@
         LEFT JOIN cm_sku cs ON c.skuId = cs.skuId
         LEFT JOIN product p ON cs.productId = p.productID
         LEFT JOIN cm_svip_product csp ON cs.productID = csp.productId
-        WHERE c.serviceProviderId = #{serviceProviderId} AND c.clubId = #{clubId} AND c.shopID = #{shopId}
+        WHERE c.serviceProviderId = #{serviceProviderId} AND c.clubId = #{clubId} AND c.shopID = #{shopId} and cs.organizeId = 0
         AND c.skuId in
         <foreach collection="skuIds" open="(" separator="," close=")" item="skuId">
             #{skuId}
@@ -213,24 +214,24 @@
                p.invoiceType      AS invoiceType,
                p.taxPoint         AS taxRate,
                p.productCategory,
-               p.validFlag        AS validFlag
+               IFNULL((SELECT validFlag FROM cm_organize_product_info  WHERE productId = p.productID AND organizeId = 0), 999) AS validFlag,
         FROM product p
             left join cm_sku cs on p.productID=cs.productId
                  LEFT JOIN cm_second_hand_detail cshd ON p.productID = cshd.productID
-        WHERE p.productCategory = 2
+        WHERE p.productCategory = 2 and cs.organizeId = 0
           AND p.productID = #{productId}
         LIMIT 1
     </select>
-    <select id="getOrderUserIdByOrderId" resultType="java.lang.Integer">
+    <select id="getOrderUserIdByShopOrderId" resultType="java.lang.Integer">
         SELECT userID
-        FROM cm_order
-        WHERE orderID = #{orderId}
+        FROM cm_shop_order
+        WHERE shopOrderId = #{shopOrderId}
           AND delFlag = '0'
     </select>
-    <select id="getOrderClubIdByOrderId" resultType="java.lang.Integer">
+    <select id="getOrderClubIdByShopOrderId" resultType="java.lang.Integer">
         SELECT clubID
-        FROM cm_order
-        WHERE orderID = #{orderId}
+        FROM cm_shop_order
+        WHERE shopOrderId = #{shopOrderId}
           AND delFlag = '0'
     </select>
     <select id="getOrderProductNum" resultType="com.caimei365.order.model.vo.CartItemVo">
@@ -240,11 +241,25 @@
                cs.minBuyNumber AS min,
                p.`name`       AS `name`,
                p.mainImage    AS image,
-               p.validFlag    AS validFlag
+               IFNULL((SELECT validFlag FROM cm_organize_product_info  WHERE productId = p.productID AND organizeId = 0), 999) AS validFlag
         FROM cm_order_product op
             left join cm_sku cs on op.skuID=cs.skuId
                  LEFT JOIN product p ON op.productID = p.productID
-        WHERE orderID = #{orderID}
+        WHERE op.orderID = #{orderID} and cs.organizeId = 0
+        GROUP BY op.ProductID
+    </select>
+    <select id="getShopOrderProductNum" resultType="com.caimei365.order.model.vo.CartItemVo">
+        SELECT op.ProductID   AS productId,
+               op.skuId       AS skuId,
+               op.num         AS number,
+               cs.minBuyNumber AS min,
+               p.`name`       AS `name`,
+               p.mainImage    AS image,
+               IFNULL((SELECT validFlag FROM cm_organize_product_info  WHERE productId = p.productID AND organizeId = 0), 999) AS validFlag
+        FROM cm_order_product op
+                 left join cm_sku cs on op.skuID=cs.skuId
+                 LEFT JOIN product p ON op.productID = p.productID
+        WHERE op.shopOrderId = #{shopOrderId} and cs.organizeId = 0
         GROUP BY op.ProductID
     </select>
 </mapper>

+ 1 - 1
src/main/resources/mapper/MessagePushMapper.xml

@@ -27,7 +27,7 @@
         WHERE c.STATUS = 90
           AND covs.activeState != '流失用户'
           AND ( cbr.pagePath NOT LIKE '%https://www.caimei365.com/page-390.html%' OR cbr.pagePath NOT LIKE '%https://www.caimei365.com/product-6878.html%' )
-          AND ( ( cbr.pageLabel LIKE '%皮肤管理%' AND cbr.pageType = 10 ) OR cbr.productID IN ( SELECT productID FROM product WHERE bigTypeID = 1022 AND validFlag = 2 ) )
+          AND ( ( cbr.pageLabel LIKE '%皮肤管理%' AND cbr.pageType = 10 ) OR cbr.productID IN ( SELECT p.productID FROM product p left join cm_organize_product_info copi on copi.productId = p.productId WHERE p.bigTypeID = 1022 AND copi.validFlag = 2 ) )
 
           AND c.userID NOT IN (
                18578,13938,

+ 347 - 45
src/main/resources/mapper/OrderClubMapper.xml

@@ -38,12 +38,27 @@
         ,updateDate = #{updateDate}
         WHERE orderID = #{orderId}
     </update>
+    <update id="updateShopOrderStatus">
+        UPDATE cm_shop_order SET
+        shopStatus = #{status}
+        <if test="receiptStatus != null and receiptStatus != ''">
+            ,receiptStatus = #{receiptStatus}
+        </if>
+        <if test="payStatus != null and payStatus != ''">
+            ,payStatus = #{payStatus}
+        </if>
+        <if test="confirmTime != null and confirmTime != ''">
+            ,confirmTime = #{confirmTime}
+        </if>
+        ,updateTime = now()
+        WHERE shopOrderId = #{shopOrderId}
+    </update>
     <update id="cancelBalanceRecord">
         UPDATE cm_user_balance_record
         SET remark  = #{remark},
             delFlag = #{delFlag}
         WHERE userId = #{userId}
-          AND orderId = #{orderId}
+          AND shopOrderId = #{shopOrderId}
     </update>
     <update id="cancelMainOrder">
         UPDATE cm_order
@@ -52,6 +67,11 @@
             closeTime   = #{closeTime}
         WHERE orderID = #{orderId}
     </update>
+    <update id="cancelMainShopOrder">
+        UPDATE cm_shop_order
+        SET shopStatus = #{status}
+        WHERE shopOrderId = #{shopOrderId}
+    </update>
     <update id="deleteMainOrder">
         UPDATE cm_order
         SET delFlag=1,
@@ -70,6 +90,11 @@
         SET delFlag=1
         WHERE orderID = #{orderId}
     </update>
+    <update id="deleteShopOrderReceiptRelation">
+        UPDATE cm_receipt_order_relation
+        SET delFlag=1
+        WHERE shopOrderId = #{shopOrderId}
+    </update>
     <update id="deleteDiscernReceipt">
         UPDATE cm_discern_receipt SET delFlag=1
         WHERE id IN
@@ -96,7 +121,7 @@
         SET status      = 1,
             updateDate  = NOW(),
             receiptTime = NOW()
-        WHERE orderID = #{orderId}
+        WHERE orderID = #{orderId} and shopOrderId = #{shopOrderId}
     </update>
     <update id="updateOrderShareCode">
         UPDATE cm_mall_order_share_code
@@ -122,18 +147,23 @@
         FROM cm_mall_share_code_record
         WHERE orderID = #{orderId}
     </delete>
+    <delete id="deleteShopOrderShareCodeRecord">
+        DELETE
+        FROM cm_mall_share_code_record
+        WHERE shopOrderId = #{shopOrderId}
+    </delete>
     <update id="deleteCouponClubById">
         update cm_coupon_club
         set delFlag = '1'
         where id = #{clubCouponId}
     </update>
     <insert id="insertOrderShareCode">
-        INSERT INTO cm_mall_order_share_code (orderID, shareCode, addTime, expiredTime, delFlag)
-        VALUES (#{orderId}, #{shareCode}, #{addTime}, #{expiredTime}, #{delFlag})
+        INSERT INTO cm_mall_order_share_code (orderID, shopOrderId, shareCode, addTime, expiredTime, delFlag)
+        VALUES (#{orderId}, #{shopOrderId}, #{shareCode}, #{addTime}, #{expiredTime}, #{delFlag})
     </insert>
     <insert id="insertOrderShareCodeRecord">
-        INSERT INTO cm_mall_share_code_record (openid, orderID, shareCodeId, addTime, delFlag)
-        VALUES (#{openId}, #{orderId}, #{shareCodeId}, #{addTime}, #{delFlag})
+        INSERT INTO cm_mall_share_code_record (openid, shopOrderId, orderID, shareCodeId, addTime, delFlag)
+        VALUES (#{openId}, #{shopOrderId}, #{orderId}, #{shareCodeId}, #{addTime}, #{delFlag})
     </insert>
     <insert id="insertCouponClub" keyColumn="id" keyProperty="id" useGeneratedKeys="true">
         INSERT INTO cm_coupon_club(userId, couponId, orderId, returnedId, source, status, createDate, useDate, delFlag)
@@ -149,6 +179,11 @@
         FROM cm_order
         WHERE orderID = #{orderId}
     </select>
+    <select id="countMainShopOrderByOrderId" resultType="java.lang.Integer">
+        SELECT COUNT(*)
+        FROM cm_shop_order
+        WHERE shopOrderId = #{shopOrderId}
+    </select>
     <select id="getMainOrderByOrderId" resultType="com.caimei365.order.model.po.OrderPo">
         SELECT ifnull(orderSeen, 0) AS orderSeen,
                orderID              AS orderId,
@@ -204,6 +239,60 @@
         FROM cm_order
         WHERE orderID = #{orderId}
     </select>
+    <select id="getShopOrderById" resultType="com.caimei365.order.model.vo.ShopOrderVo">
+        SELECT
+            cso.shopOrderID AS shopOrderId,
+            cso.shopOrderNo,
+            cso.orderID AS orderId,
+            IFNULL(cso.organizeID, 0) AS organizeId,
+            IFNULL(cso.isColdChina, 0) AS isColdChina,
+            cso.orderNo,
+            cso.shopID AS shopId,
+            cso.note,
+            cso.userID AS userId,
+            cso.clubID AS clubId,
+            cso.spID AS spId,
+            ifnull(cso.presentNum, 0) as presentNum,
+            cso.orderPromotionsId,
+            cso.promotionFullReduction,
+            cso.svipShopReduction,
+            cso.brokerage,
+            cso.canRefundAmount,
+            cso.itemCount,
+            ifnull(cso.accountAmount, 0) as accountAmount,
+            cso.totalAmount,
+            cso.productAmount,
+            cso.needPayAmount,
+            cso.shopProductAmount,
+            ifnull(cso.shopPostFee, 0) as shopPostFee,
+            IFNULL(cso.shopPostFlag, 0) AS shopPostFlag,
+            cso.shopTaxFee,
+            cso.shouldPayShopAmount,
+            co.userBeans,
+            cso.orderTime,
+            cso.payStatus,
+            cso.orderSubmitType,
+            cso.splitFlag,
+            ifnull(cso.useBalanceFlag, 0) as useBalanceFlag,
+            ifnull(cso.sendOutStatus, 1) as sendOutStatus,
+            co.secondHandOrderFlag as secondHandOrderFlag,
+            IFNULL(cso.receiptAmount,0) AS receiptAmount,
+            cso.eachDiscount,
+            IFNULL(cso.realPay, cso.needPayAmount)AS readPay,
+            s.name AS shopName,
+            ifnull(s.payway, 0) AS payway,
+            s.logo AS shopLogo,
+            s.shopType AS shopType,
+            co.clauseID AS clauseId,
+            co.invoiceFlag,
+            ifnull(cso.receiptStatus, 1) as receiptStatus,
+            cso.shopStatus as status
+        FROM cm_shop_order cso
+                 LEFT JOIN shop s ON cso.shopID = s.shopID
+                 LEFT JOIN cm_order co ON cso.orderId = co.orderId
+        WHERE cso.delFlag = 0
+          AND cso.shopOrderId = #{shopOrderId}
+    </select>
     <select id="getOrderProductList" resultType="com.caimei365.order.model.po.OrderProductPo">
         SELECT cop.skuId,
                cop.orderID               AS orderId,
@@ -252,6 +341,57 @@
                  LEFT JOIN product p ON p.productID = cop.productID
         WHERE cop.orderID = #{orderID}
     </select>
+    <select id="getShopOrderProductList" resultType="com.caimei365.order.model.po.OrderProductPo">
+        SELECT cop.skuId,
+               cop.orderID               AS orderId,
+               cop.orderNo,
+               cop.shopOrderID           AS shopOrderId,
+               cop.shopOrderNo,
+               cop.orderPromotionsId,
+               cop.productId,
+               cop.shopID                AS shopId,
+               cop.name,
+               cop.productImage          AS image,
+               cop.price,
+               cop.shopName,
+               cop.costPrice,
+               cop.normalPrice,
+               cop.ladderPriceFlag,
+               cop.discountPrice,
+               cop.discount,
+               cop.totalAmount,
+               cop.totalFee,
+               cop.shouldPayFee,
+               cop.productUnit,
+               cop.num,
+               IFNULL(cop.presentNum, 0) AS presentNum,
+               cop.discountFee,
+               cop.includedTax,
+               cop.invoiceType,
+               cop.taxRate,
+               cop.addedValueTax,
+               cop.totalAddedValueTax,
+               cop.singleShouldPayTotalTax,
+               cop.shouldPayTotalTax,
+               cop.shopProductAmount,
+               cop.singleShopFee,
+               cop.shopFee,
+               cop.singleOtherFee,
+               cop.otherFee,
+               cop.singleCmFee,
+               cop.cmFee,
+               cop.payStatus,
+               cop.buyAgainFlag,
+               cop.notOutStore,
+               cop.isActProduct          AS actProduct,
+               p.productCategory         AS productCategory
+        FROM cm_order_product cop
+                 LEFT JOIN product p ON p.productID = cop.productID
+        WHERE cop.shopOrderId = #{shopOrderId}
+    </select>
+    <select id="getShopOrderStatus" resultType="java.lang.Integer">
+        select shopStatus from cm_shop_order where orderId = #{orderId}
+    </select>
     <select id="getOrderReceiptIds" resultType="java.lang.String">
         SELECT c.id
         FROM cm_discern_receipt c
@@ -263,6 +403,17 @@
           AND c.receiptStatus = '3'
           AND c.payType != '16'
     </select>
+    <select id="getShopOrderReceiptIds" resultType="java.lang.String">
+        SELECT c.id
+        FROM cm_discern_receipt c
+                 LEFT JOIN cm_receipt_order_relation r ON r.receiptID = c.id
+        WHERE r.shopOrderId = #{shopOrderId}
+          AND r.relationType = '2'
+          AND r.delFlag = '0'
+          AND c.delFlag = '0'
+          AND c.receiptStatus = '3'
+          AND c.payType != '16'
+    </select>
     <select id="getPayShopIds" resultType="java.lang.String">
         SELECT payShopID FROM cm_pay_shop_record
         WHERE delFlag = 0
@@ -272,43 +423,43 @@
         </foreach>
     </select>
     <select id="getOrderCount" resultType="java.lang.Integer">
-        SELECT COUNT(*) FROM cm_order
+        SELECT COUNT(*) FROM cm_shop_order
         WHERE delFlag = 0 AND userID = #{userId}
         <if test="orderState == 1 ">
-            AND status = '0'
+            AND shopStatus = 0
         </if>
         <if test="orderState == 2 ">
-            AND status IN(11,12,13,21,22,23)
+            AND receiptStatus = 1 AND shopStatus not in (4,5)
         </if>
         <if test="orderState == 3 ">
-            AND status IN(11,12,21,22,31,32)
+            AND sendOutStatus = 1 AND shopStatus not in (4,5)
         </if>
         <if test="orderState == 4 ">
-            AND status IN(12,13,22,23,32,33)
+            AND sendOutStatus = 3 AND shopStatus not in (4,5)
         </if>
         <if test="orderState == 5 ">
-            AND refundType IN(1,2)
+            AND (orderStatusFlag in (2, 3) or refundStatus = 3) AND shopStatus not in (4,5)
         </if>
     </select>
     <select id="getOrderSeenCount" resultType="java.lang.Integer">
-        SELECT COUNT(*) FROM cm_order
-        WHERE delFlag = 0 AND userID = #{userId}
+        SELECT COUNT(*) FROM cm_shop_order cso left join cm_order co on cso.orderId = co.orderId
+        WHERE cso.delFlag = 0 AND cso.userID = #{userId}
         <if test="orderState == 1 ">
-            AND status = '0'
+            AND cso.shopStatus = 0
         </if>
         <if test="orderState == 2 ">
-            AND status IN(11,12,13,21,22,23)
+            AND cso.receiptStatus = 1 AND cso.shopStatus not in (4,5)
         </if>
         <if test="orderState == 3 ">
-            AND status IN(11,12,21,22,31,32)
+            AND cso.sendOutStatus = 1 AND cso.shopStatus not in (4,5)
         </if>
         <if test="orderState == 4 ">
-            AND status IN(12,13,22,23,32,33)
+            AND cso.sendOutStatus = 3 AND cso.shopStatus not in (4,5)
         </if>
         <if test="orderState == 5 ">
-            AND refundType IN(1,2)
+            AND (cso.orderStatusFlag in (2, 3) or cso.refundStatus = 3) AND cso.shopStatus not in (4,5)
         </if>
-        AND orderSeen = 2
+        AND co.orderSeen = 2
     </select>
     <select id="getOrderList" resultType="com.caimei365.order.model.vo.OrderVo">
         SELECT
@@ -387,6 +538,83 @@
         </if>
         ORDER BY orderTime DESC
     </select>
+    <select id="getShopOrderList" resultType="com.caimei365.order.model.vo.ShopOrderVo">
+        SELECT
+            cso.shopOrderID AS shopOrderId,
+            cso.shopOrderNo,
+            cso.orderID AS orderId,
+            IFNULL(cso.organizeID, 0) AS organizeId,
+            IFNULL(cso.isColdChina, 0) AS isColdChina,
+            cso.orderNo,
+            cso.shopID AS shopId,
+            cso.note,
+            cso.userID AS userId,
+            cso.clubID AS clubId,
+            cso.spID AS spId,
+            ifnull(cso.presentNum, 0) as presentNum,
+            cso.orderPromotionsId,
+            cso.promotionFullReduction,
+            cso.svipShopReduction,
+            cso.brokerage,
+            cso.canRefundAmount,
+            cso.itemCount,
+            cso.totalAmount,
+            cso.productAmount,
+            cso.needPayAmount,
+            cso.shopProductAmount,
+            ifnull(cso.shopPostFee, 0) as shopPostFee,
+            IFNULL(cso.shopPostFlag, 0) AS shopPostFlag,
+            cso.shopTaxFee,
+            cso.shouldPayShopAmount,
+            (select userBeans from cm_order where orderId = cso.orderId ) as userBeans,
+            cso.orderTime,
+            cso.payStatus,
+            cso.orderSubmitType,
+            cso.splitFlag,
+            ifnull(cso.useBalanceFlag, 0) as useBalanceFlag,
+            ifnull(cso.sendOutStatus, 1) as sendOutStatus,
+            (select onlinePayFlag from cm_order where orderId = cso.orderId ) as onlinePay,
+            (select secondHandOrderFlag from cm_order where orderId = cso.orderId ) as secondHandOrderFlag,
+            s.name AS shopName,
+            ifnull(s.payway, 0) AS payway,
+            s.logo AS shopLogo,
+            s.shopType AS shopType,
+            IFNULL(cso.receiptAmount,0) AS receiptAmount,
+            cso.eachDiscount,
+            IFNULL(cso.realPay, cso.needPayAmount)AS readPay,
+            ifnull(cso.receiptStatus, 1) as receiptStatus,
+            cso.shopStatus as status
+        FROM cm_shop_order cso
+                 LEFT JOIN shop s ON cso.shopID = s.shopID
+        <where>
+             cso.delFlag = 0 AND cso.userId = #{userId}
+            <if test="status == 1 ">
+                AND cso.shopStatus = 0
+            </if>
+            <if test="status == 2 ">
+                AND cso.receiptStatus = 1 AND shopStatus not in (4,5)
+            </if>
+            <if test="status == 3 ">
+                AND cso.sendOutStatus = 1 AND shopStatus not in (4,5)
+            </if>
+            <if test="status == 4 ">
+                AND cso.sendOutStatus = 3 AND shopStatus not in (4,5)
+            </if>
+            <if test="status == 5 ">
+                AND (cso.orderStatusFlag in (2, 3) or cso.refundStatus = 3) AND cso.shopStatus not in (4,5)
+            </if>
+            <if test="shopOrderNo != null and shopOrderNo != '' ">
+                AND cso.shopOrderNo = #{shopOrderNo}
+            </if>
+            <if test="beginTime != null and beginTime != '' ">
+                AND cso.orderTime <![CDATA[>=]]> #{beginTime}
+            </if>
+            <if test="endTime != null and endTime != '' ">
+                AND cso.orderTime <![CDATA[<=]]> #{endTime}
+            </if>
+        </where>
+        ORDER BY cso.orderTime DESC
+    </select>
     <select id="getOrderListByKeyword" resultType="com.caimei365.order.model.vo.OrderVo">
         SELECT DISTINCT ifnull(co.orderSeen, 0) AS orderSeen,
                         co.orderID              AS orderId,
@@ -442,6 +670,57 @@
         GROUP BY co.orderID, co.orderTime
         ORDER BY co.orderTime DESC
     </select>
+    <select id="getShopOrderListByKeyword" resultType="com.caimei365.order.model.vo.ShopOrderVo">
+        SELECT DISTINCT cso.shopOrderID AS shopOrderId,
+                        cso.shopOrderNo,
+                        cso.orderID AS orderId,
+                        IFNULL(cso.organizeID, 0) AS organizeId,
+                        IFNULL(cso.isColdChina, 0) AS isColdChina,
+                        cso.orderNo,
+                        cso.shopID AS shopId,
+                        cso.note,
+                        cso.userID AS userId,
+                        cso.clubID AS clubId,
+                        cso.spID AS spId,
+                        IFNULL(cso.presentNum, 0) AS presentNum,
+                        cso.orderPromotionsId,
+                        cso.promotionFullReduction,
+                        cso.svipShopReduction,
+                        cso.brokerage,
+                        cso.canRefundAmount,
+                        cso.itemCount,
+                        cso.totalAmount,
+                        cso.productAmount,
+                        cso.needPayAmount,
+                        cso.shopProductAmount,
+                        ifnull(cso.shopPostFee, 0) as shopPostFee,
+                        IFNULL(cso.shopPostFlag, 0) AS shopPostFlag,
+                        cso.shopTaxFee,
+                        cso.shouldPayShopAmount,
+                        (SELECT ifnull(orderSeen, 0) FROM cm_order WHERE orderId = cso.orderId ) AS orderSeen,
+                        (SELECT userBeans FROM cm_order WHERE orderId = cso.orderId ) AS userBeans,
+                        cso.orderTime,
+                        cso.payStatus,
+                        cso.orderSubmitType,
+                        cso.splitFlag,
+                        ifnull(cso.useBalanceFlag, 0) as useBalanceFlag,
+                        ifnull(cso.sendOutStatus, 1) as sendOutStatus,
+                        (SELECT secondHandOrderFlag FROM cm_order WHERE orderId = cso.orderId ) AS secondHandOrderFlag,
+                        IFNULL(cso.receiptAmount,0) AS receiptAmount,
+                        cso.eachDiscount,
+                        ifnull(s.payway, 0) AS payway,
+                        IFNULL(cso.realPay, cso.needPayAmount)AS readPay,
+                        ifnull(cso.receiptStatus, 1) as receiptStatus,
+                        cso.shopStatus AS STATUS
+        FROM cm_shop_order cso
+                 LEFT JOIN cm_order_product cop ON cso.shopOrderId = cop.shopOrderId
+                 LEFT JOIN shop s ON cso.shopID = s.shopID
+        WHERE cso.delFlag = 0
+          AND cso.userID = #{userId}
+          AND cop.name LIKE concat('%',#{searchWord},'%')
+        GROUP BY cso.shopOrderId, cso.orderTime
+        ORDER BY cso.orderTime DESC
+    </select>
     <select id="getOrderSearchHistory" resultType="com.caimei365.order.model.vo.SearchHistoryVo">
         SELECT id, userId, searchWord, searchDate, delFlag
         FROM user_order_history
@@ -515,12 +794,25 @@
           AND delFlag = '0'
         LIMIT 1
     </select>
+    <select id="getShopOrderCodeById" resultType="com.caimei365.order.model.vo.OrderShareCodeVo">
+        SELECT id,
+               orderID AS orderId,
+               shopOrderId as shopOrderId,
+               shareCode,
+               addTime,
+               expiredTime,
+               delFlag
+        FROM cm_mall_order_share_code
+        WHERE shopOrderId = #{shopOrderId}
+          AND delFlag = '0'
+        LIMIT 1
+    </select>
     <select id="countShareCodeRecord" resultType="java.lang.Integer">
         SELECT COUNT(*)
         FROM cm_mall_share_code_record scr
                  LEFT JOIN cm_mall_order_share_code osc ON scr.shareCodeId = osc.id
         WHERE scr.openid = #{openId}
-          AND osc.orderID = #{orderId}
+          AND ( osc.orderID = #{shopOrderId} or osc.shopOrderId = #{shopOrderId})
           AND scr.delFlag = '0'
           AND osc.expiredTime > NOW()
     </select>
@@ -530,13 +822,6 @@
         WHERE unionId = #{unionId}
     </select>
 
-    <select id="getOpenidunionId" resultType="java.lang.String">
-        SELECT DISTINCT cm.unionId
-        FROM `cm_mall_operation_user` cm
-                 LEFT JOIN `user` u ON u.userID = cm.userID
-        WHERE u.userID = #{userId}
-    </select>
-
     <select id="getProductOrder" resultType="java.lang.Integer">
         SELECT productID
         FROM `cm_order_product`
@@ -742,7 +1027,7 @@
                costPrice,
                ifnull(ladderPriceFlag,0) as ladderPriceFlag,
                costCheckFlag,
-               costProportional,
+               shopPercent as costProportional,
                stock,
                unit,
                minBuyNumber,
@@ -751,25 +1036,38 @@
                csps.priceType
         from cm_sku cs
         left join cm_svip_product_sku csps on cs.skuId = csps.skuId
-        where cs.productId = #{productId}
+        where cs.productId = #{productId} and cs.organizeId = 0
         ORDER BY price ASC
     </select>
     <select id="getOrganizeSku" resultType="com.caimei365.order.model.vo.Sku">
-        SELECT distinct cmps.skuId, cmps.minBuyNumber, cmps.price,
-            cs.normalPrice,
-            cs.costPrice,
-            ifnull(cs.ladderPriceFlag,0) as ladderPriceFlag,
-            cs.costCheckFlag,
-            cs.costProportional,
-            cs.stock,
-            cs.unit
-        FROM cm_mall_product_sku cmps
-        left join cm_sku cs on cmps.skuId = cs.skuId
-        WHERE cmps.productId = #{productId}
-        ORDER BY cmps.price ASC
+        SELECT distinct skuId as skuId,
+            minBuyNumber,
+            price,
+            unit,
+            stock,
+            organizePercent,
+            shopPercent,
+            cmPercent
+        FROM cm_sku
+        WHERE productId = #{productId} and organizeId = 4
+        ORDER BY price ASC
+    </select>
+    <select id="getOrderInvoice" resultType="com.caimei365.order.model.po.InvoicePo">
+        SELECT id,
+               orderId,
+               type,
+               invoiceTitle,
+               invoiceTitleType as headingType,
+               corporationTaxNum,
+               registeredAddress,
+               registeredPhone,
+               bankAccountNo,
+               openBank
+        FROM bp_order_invoice
+        WHERE orderId = #{orderId}
     </select>
     <select id="getVoucher" resultType="com.caimei365.order.model.po.VoucherPo">
-        SELECT id, orderId, remarks, addtime FROM cm_order_payment_voucher WHERE orderId = #{orderId}
+        SELECT id, shopOrderId, remarks, addtime FROM cm_order_payment_voucher WHERE shopOrderId = #{shopOrderId}
     </select>
     <select id="getVoucherImage" resultType="com.caimei365.order.model.dto.VoucherImageDto">
         SELECT id, voucherId, image as img FROM cm_voucher_image
@@ -788,8 +1086,8 @@
         where id = #{id}
     </update>
     <insert id="insertVoucher" parameterType="com.caimei365.order.model.dto.VoucherDto" keyProperty="id" useGeneratedKeys="true">
-        insert into cm_order_payment_voucher (orderId, remarks, addtime)
-        values (#{orderId},#{remarks},now())
+        insert into cm_order_payment_voucher (shopOrderId, remarks, addtime)
+        values (#{shopOrderId},#{remarks},now())
     </insert>
     <update id="updateVoucherImage">
         update cm_voucher_image
@@ -800,4 +1098,8 @@
         insert into cm_voucher_image (voucherId, image)
         values (#{voucherId},#{img})
     </insert>
+
+    <select id="getShopBankAccount" resultType="com.caimei365.order.model.po.ShopPo">
+        SELECT shopId, name, bankAccount, bankAccountName, bankName FROM shop WHERE shopId = #{shopId}
+    </select>
 </mapper>

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

@@ -6,8 +6,20 @@
         FROM cm_logistics_batch
         WHERE orderID = #{orderId}
     </select>
+    <select id="countLogisticsBatchShop" resultType="java.lang.Integer">
+        SELECT COUNT(*)
+        FROM cm_logistics_batch
+        WHERE shopOrderId = #{shopOrderId}
+    </select>
     <select id="getOrganizeId" resultType="java.lang.Integer">
-        select organizeID as organizeId from cm_order where orderId = #{orderId}
+        select ifnull(organizeID, 0) as organizeId
+        from cm_order
+        where orderId = #{orderId}
+    </select>
+    <select id="getShopOrganizeId" resultType="java.lang.Integer">
+        select ifnull(organizeID, 0) as organizeId
+        from cm_shop_order
+        where shopOrderId = #{shopOrderId}
     </select>
     <select id="getShopOrderList" resultType="com.caimei365.order.model.vo.ShopOrderVo">
         SELECT
@@ -15,7 +27,7 @@
         cso.shopOrderNo,
         cso.orderID AS orderId,
         cso.organizeID AS organizeId,
-        cso.isColdChina AS isColdChina,
+        ifnull(cso.isColdChina, 0) AS isColdChina,
         cso.orderNo,
         cso.shopID AS shopId,
         cso.note,
@@ -32,20 +44,22 @@
         cso.productAmount,
         cso.needPayAmount,
         cso.shopProductAmount,
-        cso.shopPostFee,
+        ifnull(cso.shopPostFee, 0) as shopPostFee,
+        ifnull(cso.shopPostFlag, 0) as shopPostFlag,
         cso.shopTaxFee,
         cso.shouldPayShopAmount,
         cso.orderTime,
         cso.orderSubmitType,
         cso.splitFlag,
-        cso.sendOutStatus,
+        ifnull(cso.sendOutStatus, 1) as sendOutStatus,
         s.name AS shopName,
+        ifnull(s.payway, 0) AS payway,
         s.logo AS shopLogo,
         s.shopType as shopType,
         ifnull(cso.receiptAmount,0) as receiptAmount,
         cso.eachDiscount,
-        cso.realPay,
-        cso.receiptStatus
+        ifnull(cso.realPay, cso.needPayAmount) as readPay,
+        ifnull(cso.receiptStatus, 1) as receiptStatus
         FROM cm_shop_order cso
         LEFT JOIN shop s ON cso.shopID = s.shopID
         WHERE cso.delFlag = 0
@@ -54,6 +68,80 @@
             #{shopOrderId}
         </foreach>
     </select>
+    <select id="getPayShopOrderList" resultType="com.caimei365.order.model.vo.ShopOrderVo">
+        SELECT
+        cso.shopOrderID AS shopOrderId,
+        cso.shopOrderNo,
+        cso.orderID AS orderId,
+        cso.organizeID AS organizeId,
+        ifnull(cso.isColdChina, 0) AS isColdChina,
+        cso.orderNo,
+        cso.shopID AS shopId,
+        cso.note,
+        cso.userID AS userId,
+        cso.clubID AS clubId,
+        cso.spID AS spId,
+        cso.orderPromotionsId,
+        cso.promotionFullReduction,
+        cso.svipShopReduction,
+        cso.brokerage,
+        cso.canRefundAmount,
+        cso.itemCount,
+        cso.totalAmount,
+        cso.productAmount,
+        cso.needPayAmount,
+        cso.shopProductAmount,
+        ifnull(cso.shopPostFee, 0) as shopPostFee,
+        ifnull(cso.shopPostFlag, 0) as shopPostFlag,
+        cso.shopTaxFee,
+        cso.shouldPayShopAmount,
+        cso.orderTime,
+        cso.orderSubmitType,
+        cso.splitFlag,
+        ifnull(cso.accountAmount,0) as accountAmount,
+        ifnull(cso.useBalanceFlag,0) as useBalanceFlag,
+        ifnull(cso.sendOutStatus, 1) as sendOutStatus,
+        s.name AS shopName,
+        ifnull(s.payway, 0) AS payway,
+        s.logo AS shopLogo,
+        s.shopType as shopType,
+        ifnull(cso.receiptAmount,0) as receiptAmount,
+        cso.eachDiscount,
+        ifnull(cso.realPay, cso.needPayAmount) as readPay,
+        ifnull(cso.receiptStatus, 1) as receiptStatus
+        FROM cm_shop_order cso
+        LEFT JOIN shop s ON cso.shopID = s.shopID
+        WHERE cso.delFlag = 0 and cso.receiptStatus != 3
+        AND cso.shopOrderID IN
+        <foreach collection="shopOrderIds" open="(" separator="," close=")" item="shopOrderId">
+            #{shopOrderId}
+        </foreach>
+    </select>
+    <select id="getShopOrderReceipt" resultType="com.caimei365.order.model.vo.DiscernReceiptVo">
+        SELECT cdr.id,
+               cdr.payWay,
+               cdr.payType,
+               cdr.receiptType,
+               cdr.receiptStatus,
+               cdr.receiptAmount,
+               cdr.confirmType,
+               cdr.receiptDate,
+               cdr.confirmDate,
+               cdr.reviewDate,
+               cdr.updateDate,
+               cdr.delFlag,
+               cdr.quickInfoId as infoId,
+               cror.associateAmount
+        FROM cm_receipt_order_relation cror
+                 LEFT JOIN cm_discern_receipt cdr ON cror.receiptID = cdr.id
+        WHERE ((cror.orderID = #{shopOrderId} AND cror.relationType = '2') OR
+               (cror.shopOrderId = #{shopOrderId} AND cror.relationType = '2'))
+          AND cror.delFlag = '0'
+          AND cdr.delFlag = '0'
+          AND cdr.receiptStatus = '3'
+          AND cdr.payType != '16'
+        ORDER BY cdr.receiptDate DESC
+    </select>
     <select id="getOrderPromotionsById" resultType="com.caimei365.order.model.vo.PromotionsVo">
         SELECT id,
                name,
@@ -77,6 +165,7 @@
                cop.shopOrderID    AS shopOrderId,
                cop.shopOrderNo,
                cop.orderPromotionsId,
+               cop.organizeId,
                cop.productId,
                cop.shopId,
                cop.name,
@@ -120,6 +209,7 @@
                p.productCategory  as productCategory,
                p.productType,
                p.productCode,
+               p.splitCode,
                p.returnGoodsStutas
         FROM cm_order_product cop
                  LEFT JOIN product p ON cop.productID = p.productID
@@ -143,7 +233,7 @@
         FROM cm_receipt_order_relation cror
                  LEFT JOIN cm_discern_receipt cdr ON cror.receiptID = cdr.id
         WHERE ((cror.orderID = #{orderId} AND cror.relationType = '2') OR
-               (cror.orderID = #{shopOrderId} AND cror.relationType = '1'))
+               (cror.shopOrderId = #{shopOrderId} AND cror.relationType = '2'))
           AND cror.delFlag = '0'
           AND cdr.delFlag = '0'
           AND cdr.receiptStatus = '3'
@@ -192,6 +282,20 @@
           AND cdr.receiptStatus IN (2, 3)
           AND cdr.payWay = '2'
     </select>
+    <select id="countOfflinePaymentshopOrder" resultType="java.lang.Integer">
+        SELECT count(*)
+        FROM cm_receipt_order_relation cror
+                 LEFT JOIN cm_discern_receipt cdr ON cror.receiptID = cdr.id
+        WHERE (cror.orderId = #{shopOrderId} or cror.shopOrderId = #{shopOrderId} )
+          AND cror.relationType = '2'
+          AND cror.delFlag = '0'
+          AND cdr.delFlag = '0'
+          AND cdr.receiptStatus IN (2, 3)
+          AND cdr.payWay = '2'
+    </select>
+    <select id="getOrderVoucher" resultType="java.lang.Integer">
+        select count(id) from cm_order_payment_voucher where shopOrderId = #{shopOrderId}
+    </select>
     <select id="getShouldPayShopAmountList" resultType="java.lang.Double">
         SELECT shouldPayShopAmount
         FROM cm_shop_order
@@ -206,6 +310,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
@@ -286,6 +397,62 @@
           AND IF(co.userBeans = 0, 1 = 1, cop.shopid != 998)
         ORDER BY cop.discountPrice DESC
     </select>
+    <select id="getshopOrderProductByOrderId" resultType="com.caimei365.order.model.vo.OrderProductVo">
+        SELECT cop.skuId,
+               cop.orderProductID                                                 AS orderProductId,
+               cop.orderID                                                        AS orderId,
+               cop.orderNo,
+               cop.shopOrderID                                                    AS shopOrderId,
+               cop.shopOrderNo,
+               (select clubID from cm_order where orderId = cso.orderId ) as clubId,
+               cop.orderPromotionsId,
+               cop.productId,
+               cop.shopId,
+               cop.name,
+               cop.productImage                                                   AS image,
+               cop.price,
+               cop.shopName,
+               IF(cop.shopid = 998 AND cso.shopPostFlag > 0, cso.shopPostFlag, cop.costPrice) AS costPrice,
+               cop.normalPrice,
+               cop.ladderPriceFlag,
+               cop.discountPrice,
+               cop.discount,
+               cop.totalAmount,
+               cop.totalFee,
+               cop.shouldPayFee,
+               cop.productUnit,
+               cop.num,
+               cop.presentNum,
+               cop.discountFee,
+               cop.includedTax,
+               cop.invoiceType,
+               cop.taxRate,
+               cop.addedValueTax,
+               cop.totalAddedValueTax,
+               cop.singleShouldPayTotalTax,
+               cop.shouldPayTotalTax,
+               cop.shopProductAmount,
+               cop.singleShopFee,
+               cop.shopFee,
+               cop.singleOtherFee,
+               cop.otherFee,
+               cop.singleCmFee,
+               cop.cmFee,
+               cop.payStatus,
+               cop.buyAgainFlag,
+               cop.notOutStore,
+               cop.isActProduct                                                   AS actProduct,
+               cop.productType,
+               p.productCategory                                                  as productCategory,
+               p.splitCode,
+               p.productType
+        FROM cm_order_product cop
+                 LEFT JOIN product p ON cop.productID = p.productID
+                 LEFT JOIN cm_shop_order cso ON cop.orderId = cso.orderId
+        WHERE cso.shopOrderId = #{shopOrderId}
+          AND IF(cso.useBeanAmount = 0, 1 = 1, cop.shopid != 998)
+        ORDER BY cop.discountPrice DESC
+    </select>
     <select id="countReturnedNum" resultType="java.lang.Integer">
         SELECT SUM(crpp.actualReturnedNum)
         FROM cm_returned_purchase_product crpp
@@ -304,6 +471,9 @@
           AND rp.status = '2'
           AND rp.delFlag = '0'
     </select>
+    <select id="getRefundStatus" resultType="java.lang.Integer">
+        select refundStatus from cm_shop_order where shopOrderId = #{shopOrderId}
+    </select>
     <select id="getOrderByOrderId" resultType="com.caimei365.order.model.vo.OrderVo">
         SELECT orderID      AS orderId,
                shopOrderIds,
@@ -356,6 +526,56 @@
         FROM cm_order
         WHERE orderID = #{orderId}
     </select>
+    <select id="getShopOrderById" resultType="com.caimei365.order.model.vo.ShopOrderVo">
+        SELECT
+        cso.shopOrderID AS shopOrderId,
+        cso.shopOrderNo,
+        cso.orderID AS orderId,
+        IFNULL(cso.organizeID, 0) AS organizeId,
+        IFNULL(cso.isColdChina, 0) AS isColdChina,
+        cso.orderNo,
+        cso.shopID AS shopId,
+        cso.note,
+        cso.userID AS userId,
+        (select clubID from cm_order where orderId = cso.orderId ) as clubId,
+        cso.spID AS spId,
+        ifnull(cso.presentNum, 0) as presentNum,
+        cso.orderPromotionsId,
+        cso.promotionFullReduction,
+        cso.svipShopReduction,
+        cso.brokerage,
+        cso.canRefundAmount,
+        cso.itemCount,
+        cso.totalAmount,
+        cso.productAmount,
+        cso.needPayAmount,
+        ifnull(cso.accountAmount,0) as accountAmount,
+        cso.shopProductAmount,
+        ifnull(cso.shopPostFee, 0) as shopPostFee,
+        IFNULL(cso.shopPostFlag, 0) AS shopPostFlag,
+        cso.shopTaxFee,
+        cso.shouldPayShopAmount,
+        (select userBeans from cm_order where orderId = cso.orderId ) as userBeans,
+        cso.orderTime,
+        cso.payStatus,
+        cso.orderSubmitType,
+        cso.splitFlag,
+        ifnull(cso.useBalanceFlag, 0) as useBalanceFlag,
+        ifnull(cso.sendOutStatus, 1) as sendOutStatus,
+        (select secondHandOrderFlag from cm_order where orderId = cso.orderId ) as secondHandOrderFlag,
+        s.name AS shopName,
+        ifnull(s.payway, 0) AS payway,
+        s.logo AS shopLogo,
+        s.shopType AS shopType,
+        IFNULL(cso.receiptAmount,0) AS receiptAmount,
+        cso.eachDiscount,
+        IFNULL(cso.realPay, cso.needPayAmount)AS readPay,
+        ifnull(cso.receiptStatus, 1) as receiptStatus,
+        cso.shopStatus as status
+        FROM cm_shop_order cso
+        LEFT JOIN shop s ON cso.shopID = s.shopID
+        where cso.delFlag = 0 AND cso.shopOrderId = #{shopOrderId}
+    </select>
     <select id="getOrderByShopOrderId" resultType="com.caimei365.order.model.vo.OrderVo">
         SELECT co.orderID      AS orderId,
                co.shopOrderIds,
@@ -426,13 +646,14 @@
                productAmount,
                needPayAmount,
                shopProductAmount,
-               shopPostFee,
+               ifnull(shopPostFee, 0) as shopPostFee,
                shopTaxFee,
                shouldPayShopAmount,
                orderTime,
                orderSubmitType,
                payStatus,
-               sendOutStatus,
+               ifnull(sendOutStatus, 1) as sendOutStatus,
+               ifnull(receiptStatus, 1) as receiptStatus,
                splitFlag
         FROM cm_shop_order
         WHERE delFlag = 0
@@ -454,6 +675,22 @@
         FROM cm_logistics_batch
         WHERE orderID = #{orderId}
     </select>
+    <select id="getShopLogisticsBatchList" resultType="com.caimei365.order.model.vo.LogisticsBatchVo">
+        SELECT id,
+               shopOrderID AS shopOrderId,
+               orderID     AS orderId,
+               outStoreTimes,
+               status,
+               mailer,
+               shopID      AS shopId,
+               updateDate,
+               deliveryTime,
+               receiptTime,
+               remarkImage,
+               remark
+        FROM cm_logistics_batch
+        WHERE shopOrderID = #{shopOrderId}
+    </select>
     <select id="getLogisticsRecord" resultType="com.caimei365.order.model.vo.LogisticsRecordVo">
         SELECT clr.id,
                clr.logisticsBatchID AS logisticsBatchId,
@@ -649,20 +886,23 @@
                cop.productAmount,
                cop.needPayAmount,
                cop.shopProductAmount,
-               cop.shopPostFee,
+               ifnull(cop.shopPostFee, 0) as shopPostFee,
                cop.shopTaxFee,
                cop.shouldPayShopAmount,
                cop.orderTime,
                cop.orderSubmitType,
                cop.payStatus,
-               cop.sendOutStatus,
                cop.splitFlag,
-               cop.realPay,
+               ifnull(cop.useBalanceFlag, 0) as useBalanceFlag,
+               ifnull(cop.realPay, cop.needPayAmount) as realPay,
                cop.receiptAmount,
-               cop.receiptStatus,
+               ifnull(cop.sendOutStatus, 1) as sendOutStatus,
+               ifnull(cop.receiptStatus, 1) as receiptStatus,
                cop.splitCode,
                ifnull(cop.paySuccessCounter, 0) as paySuccessCounter,
-               p.name                           as shopName
+               p.name                           as shopName,
+               ifnull(p.payway, 0) AS payway,
+               cop.shopStatus as status
         FROM cm_shop_order cop
                  left join shop p on cop.shopID = p.shopID
         WHERE delFlag = 0
@@ -751,12 +991,15 @@
         SELECT stock
         FROM cm_sku
         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

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

@@ -0,0 +1,247 @@
+<?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>
+
+    <insert id="insertReturns" keyColumn="id" keyProperty="id"
+            parameterType="com.caimei365.order.model.vo.CmReturnedPurchase" useGeneratedKeys="true">
+        INSERT INTO cm_returned_purchase(returnedNo,
+                                         orderID,
+                                         shopOrderId,
+                                         userID,
+                                         status,
+                                         returnedWay,
+                                         payType,
+                                         operatingOrderStatus,
+                                         bankAccountName,
+                                         bankAccountNo,
+                                         openBank,
+                                         bankAccountType,
+                                         returnedPurchaseFee,
+                                         refundFee,
+                                         refundBalanceFee,
+                                         refundOnlineFee,
+                                         refundOfflineFee,
+                                         remarks,
+                                         reviewRemarks,
+                                         applicationUserID,
+                                         returnTime,
+                                         reviewUserID,
+                                         confirmReturnTime,
+                                         refundType)
+        VALUES (#{returnedNo},
+                #{orderId},
+                #{shopOrderId},
+                #{userId},
+                #{status},
+                #{returnedWay},
+                #{payType},
+                #{operatingOrderStatus},
+                #{bankAccountName},
+                #{bankAccountNo},
+                #{openBank},
+                #{bankAccountType},
+                #{returnedPurchaseFee},
+                #{refundFee},
+                #{refundBalanceFee},
+                #{refundOnlineFee},
+                #{refundOfflineFee},
+                #{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>
+
+    <insert id="insertTransfer">
+        insert into cm_refund_transfer(transferType, transferTime, transferAmount, orderRequestNo, shopOrderId)
+        values (1, now(), #{money}, #{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>
+
+    <update id="updateShopOrder">
+        update cm_shop_order
+        set refundStatus = 3,
+            shopStatus = 5
+        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,
+               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>
+
+    <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>
+
+    <select id="findOrderRelationByNo" resultType="com.caimei365.order.model.po.OrderReceiptRelationPo">
+        select cso.splitCode,cror.associateAmount,cror.orderRequestNo,cror.shopOrderId
+        from cm_receipt_order_relation cror
+        left join cm_shop_order cso on cror.shopOrderId = cso.shopOrderId
+        where cror.orderRequestNo = #{orderRequestNo}
+    </select>
+
+</mapper>

+ 217 - 1
src/main/resources/mapper/OrderSellerMapper.xml

@@ -97,6 +97,93 @@
         </if>
         ORDER BY co.orderTime DESC
     </select>
+    <select id="getShopOrderList" resultType="com.caimei365.order.model.vo.ShopOrderVo">
+        SELECT
+        cso.shopOrderID AS shopOrderId,
+        cso.shopOrderNo,
+        cso.orderID AS orderId,
+        IFNULL(cso.organizeID, 0) AS organizeId,
+        IFNULL(cso.isColdChina, 0) AS isColdChina,
+        cso.orderNo,
+        cso.shopID AS shopId,
+        cso.note,
+        cso.userID AS userId,
+        (select clubID from cm_order where orderId = cso.orderId ) as clubId,
+        cso.spID AS spId,
+        ifnull(cso.presentNum, 0) as presentNum,
+        cso.orderPromotionsId,
+        cso.promotionFullReduction,
+        cso.svipShopReduction,
+        cso.brokerage,
+        cso.canRefundAmount,
+        cso.itemCount,
+        cso.totalAmount,
+        cso.productAmount,
+        cso.needPayAmount,
+        cso.shopProductAmount,
+        ifnull(cso.shopPostFee, 0) as shopPostFee,
+        IFNULL(cso.shopPostFlag, 0) AS shopPostFlag,
+        cso.shopTaxFee,
+        cso.shouldPayShopAmount,
+        (select userBeans from cm_order where orderId = cso.orderId ) as userBeans,
+        cso.orderTime,
+        cso.payStatus,
+        cso.orderSubmitType,
+        cso.splitFlag,
+        ifnull(cso.useBalanceFlag, 0) as useBalanceFlag,
+        ifnull(cso.sendOutStatus, 1) as sendOutStatus,
+        (select onlinePayFlag from cm_order where orderId = cso.orderId ) as onlinePay,
+        (select secondHandOrderFlag from cm_order where orderId = cso.orderId ) as secondHandOrderFlag,
+        IFNULL(cso.receiptAmount,0) AS receiptAmount,
+        cso.eachDiscount,
+        s.name AS shopName,
+        ifnull(s.payway, 0) AS payway,
+        s.logo AS shopLogo,
+        s.shopType AS shopType,
+        IFNULL(cso.realPay, cso.needPayAmount)AS readPay,
+        ifnull(cso.receiptStatus, 1) as receiptStatus,
+        cso.shopStatus as status
+        <if test="orderSubmitType == 3">
+            ,s.linkMan as serviceName
+        </if>
+        FROM cm_shop_order cso
+        LEFT JOIN shop s ON cso.shopID = s.shopID
+        <if test="orderSubmitType == 3">
+            LEFT JOIN club c ON cso.userId=c.userId
+            LEFT JOIN serviceprovider s ON c.spId=s.serviceProviderID
+        </if>
+        <where>
+            cso.delFlag = 0 AND cso.userID IN
+            <foreach item="userId" index="index" collection="userIds" open="(" separator="," close=")">
+                #{userId}
+            </foreach>
+            <if test="listType == 1 ">
+                AND cso.shopStatus = 0
+            </if>
+            <if test="listType == 2 ">
+                AND cso.payStatus = 1
+            </if>
+            <if test="listType == 3 ">
+                AND cso.sendOutStatus = 1
+            </if>
+            <if test="listType == 4 ">
+                AND cso.sendOutStatus = 3
+            </if>
+            <if test="listType == 5 ">
+                AND (cso.orderStatusFlag in (2, 3) or cso.refundStatus = 2)
+            </if>
+            <if test="shopOrderNo != null and shopOrderNo != '' ">
+                AND cso.shopOrderNo = #{shopOrderNo}
+            </if>
+            <if test="orderSubmitType == 1">
+                AND cso.orderSubmitType IN (0,1,2)
+            </if>
+            <if test="orderSubmitType == 2">
+                AND cso.orderSubmitType IN (3,4)
+            </if>
+        </where>
+        ORDER BY cso.orderTime DESC
+    </select>
     <select id="getSpIdByClubId" resultType="java.lang.Integer">
         SELECT spID
         FROM club
@@ -174,6 +261,78 @@
         </if>
         ORDER BY orderTime DESC
     </select>
+    <select id="getShopOrderListClub" resultType="com.caimei365.order.model.vo.ShopOrderVo">
+        SELECT
+        cso.shopOrderID AS shopOrderId,
+        cso.shopOrderNo,
+        cso.orderID AS orderId,
+        IFNULL(cso.organizeID, 0) AS organizeId,
+        IFNULL(cso.isColdChina, 0) AS isColdChina,
+        cso.orderNo,
+        cso.shopID AS shopId,
+        (select clubID from cm_order where orderId = cso.orderId ) as clubId,
+        cso.note,
+        cso.userID AS userId,
+        cso.spID AS spId,
+        ifnull(cso.presentNum, 0) as presentNum,
+        cso.orderPromotionsId,
+        cso.promotionFullReduction,
+        cso.svipShopReduction,
+        cso.brokerage,
+        cso.canRefundAmount,
+        cso.itemCount,
+        cso.totalAmount,
+        cso.productAmount,
+        cso.needPayAmount,
+        cso.shopProductAmount,
+        ifnull(cso.shopPostFee, 0)as shopPostFee,
+        IFNULL(cso.shopPostFlag, 0) AS shopPostFlag,
+        cso.shopTaxFee,
+        cso.shouldPayShopAmount,
+        (select userBeans from cm_order where orderId = cso.orderId ) as userBeans,
+        cso.orderTime,
+        cso.payStatus,
+        cso.orderSubmitType,
+        cso.splitFlag,
+        ifnull(cso.useBalanceFlag, 0) as useBalanceFlag,
+        ifnull(cso.sendOutStatus, 1) as sendOutStatus,
+        (select onlinePayFlag from cm_order where orderId = cso.orderId ) as onlinePay,
+        (select secondHandOrderFlag from cm_order where orderId = cso.orderId ) as secondHandOrderFlag,
+        IFNULL(cso.receiptAmount,0) AS receiptAmount,
+        cso.eachDiscount,
+        s.name AS shopName,
+        ifnull(s.payway, 0) AS payway,
+        s.logo AS shopLogo,
+        s.shopType AS shopType,
+        IFNULL(cso.realPay, cso.needPayAmount)AS readPay,
+        ifnull(cso.receiptStatus, 1) as receiptStatus,
+        cso.shopStatus as status
+        FROM cm_shop_order cso
+        LEFT JOIN shop s ON cso.shopID = s.shopID
+        WHERE cso.delFlag = 0 AND cso.clubID = #{clubId}
+        <if test="listType == 1 ">
+            AND cso.shopStatus = 0
+        </if>
+        <if test="listType == 2 ">
+            AND cso.payStatus = 1
+        </if>
+        <if test="listType == 3 ">
+            AND cso.sendOutStatus = 1
+        </if>
+        <if test="listType == 4 ">
+            AND cso.sendOutStatus = 3
+        </if>
+        <if test="listType == 5 ">
+            AND (cso.orderStatusFlag in (2, 3) or cso.refundStatus = 2)
+        </if>
+        <if test="orderSubmitType == 1">
+            AND cso.orderSubmitType IN (0,1,2)
+        </if>
+        <if test="orderSubmitType == 2">
+            AND cso.orderSubmitType IN (3,4)
+        </if>
+        ORDER BY cso.orderTime DESC
+    </select>
     <select id="getUserIdBySpId" resultType="java.lang.Integer">
         SELECT userID
         FROM serviceprovider
@@ -236,6 +395,63 @@
         GROUP BY co.orderID, co.orderTime
         ORDER BY co.orderTime DESC
     </select>
+    <select id="getShopOrderListByKeyword" resultType="com.caimei365.order.model.vo.ShopOrderVo">
+        SELECT DISTINCT
+        cso.shopOrderID AS shopOrderId,
+        cso.shopOrderNo,
+        cso.orderID AS orderId,
+        IFNULL(cso.organizeID, 0) AS organizeId,
+        IFNULL(cso.isColdChina, 0) AS isColdChina,
+        cso.orderNo,
+        cso.shopID AS shopId,
+        cso.note,
+        cso.userID AS userId,
+        (select clubID from cm_order where orderId = cso.orderId ) as clubId,
+        cso.spID AS spId,
+        ifnull(cso.presentNum, 0) as presentNum,
+        cso.orderPromotionsId,
+        cso.promotionFullReduction,
+        cso.svipShopReduction,
+        cso.brokerage,
+        cso.canRefundAmount,
+        cso.itemCount,
+        cso.totalAmount,
+        cso.productAmount,
+        cso.needPayAmount,
+        cso.shopProductAmount,
+        ifnull(cso.shopPostFee, 0) as shopPostFee,
+        IFNULL(cso.shopPostFlag, 0) AS shopPostFlag,
+        cso.shopTaxFee,
+        cso.shouldPayShopAmount,
+        (select userBeans from cm_order where orderId = cso.orderId ) as userBeans,
+        cso.orderTime,
+        cso.payStatus,
+        cso.orderSubmitType,
+        cso.splitFlag,
+        ifnull(cso.useBalanceFlag, 0) as useBalanceFlag,
+        ifnull(cso.sendOutStatus, 1) as sendOutStatus,
+        (select onlinePayFlag from cm_order where orderId = cso.orderId ) as onlinePay,
+        (select secondHandOrderFlag from cm_order where orderId = cso.orderId ) as secondHandOrderFlag,
+        IFNULL(cso.receiptAmount,0) AS receiptAmount,
+        cso.eachDiscount,
+        s.name AS shopName,
+        ifnull(s.payway, 0) AS payway,
+        s.logo AS shopLogo,
+        s.shopType AS shopType,
+        IFNULL(cso.realPay, cso.needPayAmount)AS readPay,
+        ifnull(cso.receiptStatus, 1) as receiptStatus,
+        cso.shopStatus as status
+        FROM cm_shop_order cso
+        LEFT JOIN cm_order_product cop ON cso.shopOrderId = cop.shopOrderId
+        LEFT JOIN shop s ON cso.shopID = s.shopID
+        WHERE cso.delFlag = 0 AND cso.userID IN
+        <foreach item="userId" index="index" collection="userIds" open="(" separator="," close=")">
+            #{userId}
+        </foreach>
+        AND cop.name LIKE CONCAT('%',#{searchWord},'%')
+        GROUP BY cso.orderID, cso.orderTime
+        ORDER BY cso.orderTime DESC
+    </select>
     <select id="getClubIdsBySellerId" resultType="java.lang.Integer">
         select userID
         from club
@@ -310,4 +526,4 @@
         select serviceProviderId
         from cm_serviceteam_manager
     </select>
-</mapper>
+</mapper>

+ 19 - 6
src/main/resources/mapper/PayOrderMapper.xml

@@ -187,12 +187,6 @@
         SET payStatus = #{payStatus}
         WHERE orderID = #{orderId}
     </update>
-    <update id="updateUserMoney">
-        UPDATE USER
-        SET userMoney     = #{userMoney},
-            ableUserMoney = #{ableUserMoney}
-        WHERE userID = #{userId}
-    </update>
     <update id="updateCouponRecord">
         update cm_coupon_buyrecord
         set payStatus = 1
@@ -251,11 +245,23 @@
             idCard         = #{idCard}
         where id = #{id}
     </update>
+    <update id="updateShopOrderBalancePay">
+        update cm_shop_order
+        set accountAmount = #{accountAmount},
+            receiptAmount = #{receiptAmount},
+            receiptStatus = #{receiptStatus},
+            useBalanceFlag = #{useBalanceFlag},
+            updateTime = now()
+        where shopOrderId = #{shopOrderId}
+    </update>
     <select id="getPayOnLineSwitch" resultType="java.lang.Integer">
         SELECT STATUS
         FROM cm_pay_online_switch
         WHERE id = 1
     </select>
+    <select id="getShopCode" resultType="java.lang.String">
+        SELECT commercialCode FROM cm_shop_splitcode WHERE shopId = #{shopId} limit 1
+    </select>
     <select id="getRefundCount" resultType="java.lang.Integer">
         SELECT COUNT(*)
         FROM cm_returned_purchase
@@ -263,6 +269,13 @@
           AND STATUS = '1'
           AND delFlag = '0'
     </select>
+    <select id="getShopRefundCount" resultType="java.lang.Integer">
+        SELECT COUNT(*)
+        FROM cm_returned_purchase
+        WHERE shopOrderId = #{shopOrderId}
+          AND STATUS = '1'
+          AND delFlag = '0'
+    </select>
     <select id="getOrderPayLink" resultType="com.caimei365.order.model.vo.OrderPayLinkVo">
         SELECT
         id,

+ 6 - 3
src/main/resources/mapper/ReceiptMapper.xml

@@ -816,7 +816,8 @@
         cso.orderTime,
         cso.orderSubmitType,
         cso.payStatus,
-        cso.sendOutStatus,
+        ifnull(cso.sendOutStatus, 1) as sendOutStatus,
+        ifnull(cso.receiptStatus, 1) as receiptStatus,
         cso.splitFlag,
         cso.shopOtherFee,
         s.name AS shopName,
@@ -876,7 +877,8 @@
         cso.orderTime,
         cso.orderSubmitType,
         cso.payStatus,
-        cso.sendOutStatus,
+        ifnull(cso.sendOutStatus, 1) as sendOutStatus,
+        ifnull(cso.receiptStatus, 1) as receiptStatus,
         cso.splitFlag,
         cso.shopOtherFee,
         s.name AS shopName,
@@ -938,7 +940,8 @@
                orderTime,
                orderSubmitType,
                payStatus,
-               sendOutStatus,
+               ifnull(sendOutStatus, 1) as sendOutStatus,
+               ifnull(receiptStatus, 1) as receiptStatus,
                splitFlag
         FROM cm_shop_order
         WHERE shopOrderID = #{shopOrderId}

+ 224 - 44
src/main/resources/mapper/ShipMapper.xml

@@ -101,10 +101,13 @@
             a.orderID AS orderId,
             a.orderNo,
             a.shopID AS shopId,
+            a.organizeID as organizeId,
+            IFNULL(a.isColdChina, 0) AS isColdChina,
             a.note,
             a.userID AS userId,
             a.clubID AS clubId,
             a.spID AS spId,
+            a.orderType,
             a.orderPromotionsId,
             a.promotionFullReduction,
             a.brokerage,
@@ -114,18 +117,28 @@
             a.productAmount,
             a.needPayAmount,
             a.shopProductAmount,
-            a.shopPostFee,
-            a.shopTaxFee,
+            ifnull(a.shopPostFee, 0) as shopPostFee,
+            ifnull(a.shopTaxFee, 0) as shopTaxFee,
+            IFNULL(a.shopPostFlag, 0) AS shopPostFlag,
             a.shouldPayShopAmount,
             a.payedShopAmount,
+            ifnull(a.accountAmount,0) as accountAmount,
             a.orderTime,
             a.orderSubmitType,
             a.payStatus,
-            a.sendOutStatus,
-            a.splitFlag
+            a.settlestatus,
+            ifnull(a.sendOutStatus, 1) as sendOutStatus,
+            ifnull(a.receiptStatus, 1) as receiptStatus,
+            a.refundStatus,
+            ifnull(s.payway, 0) AS payway,
+            a.shopStatus as status,
+            a.splitFlag,
+            ifnull(a.useBalanceFlag, 0) as useBalanceFlag,
+            ifnull(a.ReceiptAmount,0) as ReceiptAmount
         FROM cm_shop_order a
         LEFT JOIN bp_order_userinfo ou ON  ou.orderId=a.orderId
         LEFT JOIN cm_order o ON a.orderID=o.orderID
+        LEFT JOIN shop s ON a.shopID = s.shopID
         <where>
             <if test="shopOrderNo != null and shopOrderNo != ''">
                 AND a.shopOrderNo = #{shopOrderNo}
@@ -146,11 +159,20 @@
                     AND a.payStatus = #{payStatus}
                 </if>
             </if>
+            <if test="refundStatus != null">
+                and a.refundStatus = #{refundStatus}
+            </if>
+            <if test="receiptStatus != null">
+                and a.receiptStatus = #{receiptStatus}
+            </if>
+            <if test="organizeId != null">
+                and a.organizeID = #{organizeId}
+            </if>
             <if test="receiver != null and receiver != ''">
                 AND ou.shouHuoRen like concat('%',#{receiver},'%')
             </if>
-            AND o.delFlag='0'
-            AND o.status NOT IN(0,6)
+            AND a.delFlag='0'
+            AND a.shopStatus not in (0, 4)
             AND a.delFlag='0'
             AND a.shopID=#{shopId}
         </where>
@@ -161,11 +183,16 @@
             so.shopOrderNo,
             so.shopOrderID AS shopOrderId,
             so.orderTime,
+            so.settlestatus,
             user.userName AS name,
-            so.payStatus,
-            so.shouldPayShopAmount,
-            so.payedShopAmount
+            IFNULL(so.shouldPayShopAmount, 0) AS shouldPayShopAmount,
+            so.payedShopAmount,
+            ifnull(csr.settleAmount, 0) as settleAmount,
+            so.totalAmount,
+            so.refundStatus,
+            IFNULL(so.refundAmount, 0) AS refundAmount
         FROM cm_shop_order so
+        LEFT JOIN cm_settle_record csr ON so.shopOrderId = csr.shopOrderId
         LEFT JOIN USER ON user.userID = so.userID
         <where>
             <if test="shopOrderNo != null and shopOrderNo != ''">
@@ -182,44 +209,82 @@
             <if test="name != null and name != ''">
                 AND user.userName like concat('%',#{name},'%')
             </if>
+            <if test="beginTime != null and beginTime != ''">
+                AND so.orderTime <![CDATA[ >= ]]> #{beginTime}
+            </if>
+            <if test="endTime != null and endTime != ''">
+                AND so.orderTime <![CDATA[ <= ]]> #{endTime}
+            </if>
+            <if test="refundStatus != null">
+                AND so.refundStatus = #{refundStatus}
+            </if>
             AND so.shopID = #{shopId}
             AND so.delFlag='0'
             ORDER BY so.orderTime DESC
         </where>
     </select>
+    <select id="getShopOrderRelation" resultType="com.caimei365.order.model.vo.DiscernReceiptVo">
+        SELECT cdr.payWay, cdr.payType, cror.orderId, cror.shopOrderId, cror.associateAmount
+            FROM cm_discern_receipt cdr
+        LEFT JOIN cm_receipt_order_relation cror ON (cror.receiptID = cdr.id AND cror.delFlag = '0')
+        where cror.shopOrderId = #{shopOrderId}
+    </select>
+    <select id="getRefundPurchase" resultType="com.caimei365.order.model.vo.CmReturnedPurchase">
+        SELECT returnedNo, returnedWay, shopOrderId, orderID, userID, returnedPurchaseFee
+        FROM cm_returned_purchase
+        WHERE shopOrderId = #{shopOrderId} AND status = 2
+    </select>
+    <select id="getSplitAccount" resultType="java.lang.Double">
+        SELECT SUM(splitAccount)
+        FROM cm_split_account
+        WHERE shopOrderId = #{shopOrderId}
+          AND payStatus = 1
+    </select>
     <select id="getShopOrder" resultType="com.caimei365.order.model.vo.ShopOrderVo">
         SELECT
-            shopOrderID AS shopOrderId,
-            shopOrderNo,
-            orderID AS orderId,
-            orderNo,
-            shopID AS shopId,
-            note,
-            userID AS userId,
-            clubID AS clubId,
-            spID AS spId,
-            orderPromotionsId,
-            promotionFullReduction,
-            brokerage,
-            canRefundAmount,
-            itemCount,
-            totalAmount,
-            productAmount,
-            needPayAmount,
-            shopProductAmount,
-            shopPostFee,
-            shopTaxFee,
-            shouldPayShopAmount,
-            payedShopAmount,
-            outStoreNum,
-            IFNULL(presentNum,0) AS presentNum,
-            orderTime,
-            orderSubmitType,
-            payStatus,
-            sendOutStatus,
-            splitFlag
-        FROM cm_shop_order
-        WHERE shopOrderID = #{shopOrderId} AND delFlag = '0'
+            ifnull(cso.receiptAmount,0) as ReceiptAmount,
+            cso.shopOrderID AS shopOrderId,
+            cso.shopOrderNo,
+            cso.orderID AS orderId,
+            cso.orderNo,
+            cso.shopID AS shopId,
+            cso.organizeID as organizeId,
+            IFNULL(cso.isColdChina, 0) AS isColdChina,
+            cso.note,
+            cso.userID AS userId,
+            cso.clubID AS clubId,
+            cso.spID AS spId,
+            cso.orderPromotionsId,
+            cso.promotionFullReduction,
+            cso.brokerage,
+            cso.canRefundAmount,
+            cso.itemCount,
+            cso.totalAmount,
+            cso.productAmount,
+            cso.needPayAmount,
+            cso.shopProductAmount,
+            ifnull(cso.shopPostFee, 0) as shopPostFee,
+            IFNULL(cso.shopPostFlag, 0) AS shopPostFlag,
+            cso.shopTaxFee,
+            cso.shouldPayShopAmount,
+            cso.payedShopAmount,
+            ifnull(cso.accountAmount,0) as accountAmount,
+            cso.outStoreNum,
+            IFNULL(cso.presentNum,0) AS presentNum,
+            cso.orderTime,
+            cso.orderSubmitType,
+            cso.payStatus,
+            cso.settlestatus,
+            ifnull(cso.sendOutStatus, 1) as sendOutStatus,
+            ifnull(cso.receiptStatus, 1) as receiptStatus,
+            cso.refundStatus,
+            ifnull(s.payway, 0) AS payway,
+            cso.shopStatus as status,
+            cso.splitFlag,
+            ifnull(cso.useBalanceFlag, 0) as useBalanceFlag
+        FROM cm_shop_order cso
+                 LEFT JOIN shop s ON cso.shopID = s.shopID
+        WHERE cso.shopOrderID = #{shopOrderId} AND cso.delFlag = '0'
     </select>
 
     <select id="getOpenidListByPermission" resultType="java.lang.String">
@@ -234,10 +299,9 @@
         WHERE cmo.shopOrderID=#{shopOrderId}
     </select>
 
-
-    <select id="getOrderReceiptStatus" resultType="java.lang.Integer">
-        SELECT receiptStatus FROM cm_order
-        WHERE orderID = #{orderId} AND delFlag = '0'
+    <select id="getShopOrderReceiptStatus" resultType="java.lang.Integer">
+        SELECT receiptStatus FROM cm_shop_order
+        WHERE shopOrderId = #{shopOrderId} AND delFlag = '0'
     </select>
     <select id="getLogisticsCompany" resultType="com.caimei365.order.model.vo.CompanyVo">
         SELECT id, value, label
@@ -403,4 +467,120 @@
         SELECT userID FROM shop WHERE shopID=#{shopId}
     </select>
 
+    <select id="findWaitPay" resultType="java.lang.Double">
+        SELECT ifnull((SELECT IFNULL(realPay, needPayAmount) - receiptAmount  FROM cm_shop_order WHERE shopOrderId = #{shopOrderId}) - ifnull(SUM(receiptAmount),0),0)
+        FROM cm_discern_receipt cdr
+                 LEFT JOIN cm_receipt_order_relation cror ON cdr.id = cror.receiptID
+        WHERE cror.shopOrderId = #{shopOrderId} AND cdr.payway != 3
+    </select>
+    <insert id="insertOrderReceipt" keyColumn="id" keyProperty="id"
+            parameterType="com.caimei365.order.model.vo.ReceiptVo" useGeneratedKeys="true">
+        insert into cm_discern_receipt(payWay, payType, receiptType, receiptStatus, receiptAmount, confirmType,
+                                       receiptDate, confirmDate, reviewDate, delFlag, receStatct)
+        values (#{payWay}, #{payType}, #{receiptType}, #{receiptStatus}, #{receiptAmount}, 4, now(), now(), now(), 0, 0)
+    </insert>
+    <insert id="insertOrderRelation">
+        INSERT INTO cm_receipt_order_relation(relationType,
+                                              receiptID,
+                                              associateAmount,
+                                              shopOrderId,
+                                              orderId,
+                                              delFlag)
+        VALUES (#{relationType},
+                #{receiptId},
+                #{receiptAmount},
+                #{shopOrderId},
+                #{orderId},
+                0)
+    </insert>
+    <select id="findOrderStatus" resultType="java.lang.String">
+        select status from cm_order where orderId = #{orderId}
+    </select>
+    <update id="updateReceiptStatus">
+        update cm_shop_order
+        set receiptStatus = #{status}
+        where shopOrderId = #{shopOrderId}
+    </update>
+    <select id="getOrderId" resultType="java.lang.Integer">
+        select distinct orderId from cm_shop_order where shopOrderId = #{shopOrderId} limit 1
+    </select>
+    <select id="getReceiptStatus" resultType="java.lang.Integer">
+        select receiptStatus from cm_shop_order where orderId = #{orderId}
+    </select>
+    <update id="updateOrderReceiptStatus">
+        update cm_order
+        set receiptStatus = #{status}
+        where orderId = #{orderId}
+    </update>
+    <select id="findList" resultType="com.caimei365.order.model.dto.OrderRemarkDto">
+        SELECT a.id           AS "id",
+               a.orderId      AS "orderId",
+               a.remarks      AS "remarks",
+               a.createBy     AS "createBy.id",
+               a.createDate   AS "createDate",
+               cu.accountName AS "createName"
+        FROM cm_order_remark a
+                 LEFT JOIN cm_mall_admin_user cu ON cu.id = a.createBy
+        where a.shopOrderId = #{shopOrderId}
+        ORDER BY a.createDate
+    </select>
+
+    <select id="findImages" resultType="java.lang.String">
+        select remarkImage
+        from cm_order_remark_image
+        where remarkId = #{id}
+    </select>
+
+    <select id="findFiles" resultType="com.caimei365.order.model.dto.OssFileDto">
+        select id, orderId, name, ossName, md5Hex, uploadTime
+        from cm_order_remark_file
+        where remarkId = #{id}
+    </select>
+
+    <select id="findFileByMd5" resultType="com.caimei365.order.model.dto.OssFileDto">
+        select id, orderId, remarkId, name, ossName, md5Hex, uploadTime
+        from cm_order_remark_file
+        where md5Hex = #{md5Hex}
+        limit 1
+    </select>
+
+    <select id="findRemarkById" resultType="com.caimei365.order.model.dto.OssFileDto">
+        select id, orderId, remarkId, name, ossName, md5Hex, uploadTime
+        from cm_order_remark_file
+        where id = #{fileId}
+    </select>
+
+    <insert id="insert" parameterType="com.caimei365.order.model.dto.OrderRemarkDto" keyProperty="id"
+            useGeneratedKeys="true">
+        INSERT INTO cm_order_remark(orderID,
+                                    shopOrderId,
+                                    remarks,
+                                    createBy,
+                                    createDate)
+        VALUES (#{orderId},
+                #{shopOrderId},
+                #{remarks},
+                #{createBy},
+                now())
+    </insert>
+
+    <insert id="insertImage">
+        INSERT INTO cm_order_remark_image(orderID, remarkId, remarkImage, addTime, delFlag)
+        values (#{orderId}, #{remarkId}, #{remarkImage}, now(), 0)
+    </insert>
+
+    <insert id="insertFile">
+        insert into cm_order_remark_file(orderId, remarkId, name, ossName, md5Hex, uploadTime)
+        values (#{orderId}, #{remarkId}, #{name}, #{ossName}, #{md5Hex}, now())
+    </insert>
+
+    <update id="update">
+        UPDATE cm_order_remark
+        SET orderID     = #{orderId},
+            shopOrderID = #{shopOrderId},
+            remarks     = #{remarks},
+            createBy    = #{createBy},
+            createDate  = #{createDate}
+        WHERE id = #{id}
+    </update>
 </mapper>

+ 213 - 71
src/main/resources/mapper/SubmitMapper.xml

@@ -3,7 +3,8 @@
 <mapper namespace="com.caimei365.order.mapper.SubmitMapper">
     <insert id="insertMainOrder" keyColumn="orderID" keyProperty="orderId"
             parameterType="com.caimei365.order.model.po.OrderPo" useGeneratedKeys="true">
-        INSERT INTO cm_order (orderSeen, orderSource, orderNo, userID, clubID, organizeID, buyUserID, spID, orderTime, updateDate,
+        INSERT INTO cm_order (orderSeen, orderSource, orderNo, userID, clubID, organizeID, buyUserID, spID, orderTime,
+                              updateDate,
                               delFlag,
                               userBeans, orderType, orderSubmitType, confirmFlag, onlinePayFlag, splitFlag, payFlag,
                               receiptStatus, payStatus, zeroCostFlag, sendOutStatus, refundType, affirmPaymentFlag,
@@ -12,8 +13,9 @@
                               productTotalFee,
                               orderTotalFee, payTotalFee, payableAmount, balancePayFee, couponAmount, status,
                               confirmTime,
-                              payTime, rebateFlag,rebateFee, clauseID, clauseName)
-        VALUES (#{orderSeen}, #{orderSource}, #{orderNo}, #{userId}, #{clubId}, #{organizeId}, #{buyUserId}, #{spId}, #{orderTime},
+                              payTime, rebateFlag, rebateFee, clauseID, clauseName)
+        VALUES (#{orderSeen}, #{orderSource}, #{orderNo}, #{userId}, #{clubId}, #{organizeId}, #{buyUserId}, #{spId},
+                #{orderTime},
                 #{updateDate},
                 #{delFlag},
                 #{userBeans}, #{orderType}, #{orderSubmitType}, #{confirmFlag}, #{onlinePayFlag}, #{splitFlag},
@@ -24,22 +26,26 @@
                 #{secondHandOrderFlag}, #{invoiceFlag}, #{postageFlag}, #{postage}, #{productTotalFee},
                 #{orderTotalFee},
                 #{payTotalFee}, #{payableAmount}, #{balancePayFee}, #{couponAmount}, #{status}, #{confirmTime},
-                #{payTime}, #{rebateFlag},#{rebateFee},
+                #{payTime}, #{rebateFlag}, #{rebateFee},
                 #{clauseId}, #{clauseName})
     </insert>
     <insert id="insertShopOrder" keyColumn="shopOrderID" keyProperty="shopOrderId"
             parameterType="com.caimei365.order.model.po.OrderShopPo" useGeneratedKeys="true">
-        INSERT INTO cm_shop_order (onlinePayWays, shopOrderNo, orderID, orderNo, organizeID, isColdChina, shopID, note, userID, clubID, orderType,
+        INSERT INTO cm_shop_order (onlinePayWays, shopOrderNo, orderID, orderNo, organizeID, isColdChina, shopID, note,
+                                   userID, clubID, orderType,
                                    spID, orderPromotionsId, promotionFullReduction, svipShopReduction, brokerage,
-                                   canRefundAmount, itemCount,
+                                   canRefundAmount, itemCount, shopStatus, accountAmount, useBalanceFlag,
                                    totalAmount, productAmount, needPayAmount, shopProductAmount, shopPostFee,
+                                   shopPostFlag,
                                    shopTaxFee,
                                    shouldPayShopAmount, orderTime, orderSubmitType, splitFlag, payStatus,
                                    payedShopAmount, splitCode, realPay, eachDiscount, receiptStatus)
-        VALUES (#{onlinePayWays}, #{shopOrderNo}, #{orderId}, #{orderNo}, #{organizeId},#{isColdChina}, #{shopId}, #{note}, #{userId}, #{clubId}, #{orderType},
+        VALUES (#{onlinePayWays}, #{shopOrderNo}, #{orderId}, #{orderNo}, #{organizeId}, #{isColdChina}, #{shopId},
+                #{note}, #{userId}, #{clubId}, #{orderType},
                 #{spId}, #{orderPromotionsId}, #{promotionFullReduction}, #{svipShopReduction}, #{brokerage},
-                #{canRefundAmount}, #{itemCount},
-                #{totalAmount}, #{productAmount}, #{needPayAmount}, #{shopProductAmount}, #{shopPostFee}, #{shopTaxFee},
+                #{canRefundAmount}, #{itemCount}, #{shopStatus}, #{accountAmount}, #{useBalanceFlag},
+                #{totalAmount}, #{productAmount}, #{needPayAmount}, #{shopProductAmount}, #{shopPostFee},
+                #{shopPostFlag}, #{shopTaxFee},
                 #{shouldPayShopAmount}, #{orderTime}, #{orderSubmitType}, #{splitFlag}, #{payStatus},
                 #{payedShopAmount}, #{splitCode}, #{realPay}, #{eachDiscount}, 1)
     </insert>
@@ -50,7 +56,8 @@
     </update>
     <insert id="insertOrderProduct" keyColumn="orderProductID" keyProperty="orderProductId"
             parameterType="com.caimei365.order.model.po.OrderProductPo" useGeneratedKeys="true">
-        INSERT INTO cm_order_product (orderID, orderNo, shopOrderID, shopOrderNo, organizeProductID,organizeID, orderPromotionsId, productId, shopId,
+        INSERT INTO cm_order_product (orderID, orderNo, shopOrderID, shopOrderNo, organizeID, orderPromotionsId,
+                                      productId, shopId,
                                       name,
                                       productImage, price, shopName, costPrice, normalPrice, ladderPriceFlag,
                                       discountPrice, discount,
@@ -62,8 +69,9 @@
                                       cmFee,
                                       payStatus, buyAgainFlag, notOutStore, isActProduct, productType, svipPriceFlag,
                                       svipPriceType,
-                                      svipDiscount, svipReduction,skuID, organizeSkuId, cmPercent, organizePercent, shopPercent)
-        VALUES (#{orderId}, #{orderNo}, #{shopOrderId}, #{shopOrderNo}, #{organizeProductId}, #{organizeId}, #{orderPromotionsId}, #{productId}, #{shopId},
+                                      svipDiscount, svipReduction, skuID, cmPercent, organizePercent, shopPercent)
+        VALUES (#{orderId}, #{orderNo}, #{shopOrderId}, #{shopOrderNo}, #{organizeId}, #{orderPromotionsId},
+                #{productId}, #{shopId},
                 #{name},
                 #{image}, #{price}, #{shopName}, #{costPrice}, #{normalPrice}, #{ladderPriceFlag},
                 #{discountPrice}, #{discount},
@@ -74,13 +82,15 @@
                 #{shopProductAmount}, #{singleShopFee}, #{shopFee}, #{singleOtherFee}, #{otherFee}, #{singleCmFee},
                 #{cmFee},
                 #{payStatus}, #{buyAgainFlag}, #{notOutStore}, #{actProduct}, #{productType}, #{svipPriceFlag},
-                #{svipPriceType}, #{svipDiscount}, #{svipReduction},#{skuId}, #{organizeSkuId}, #{cmPercent}, #{organizePercent}, #{shopPercent})
+                #{svipPriceType}, #{svipDiscount}, #{svipReduction}, #{skuId}, #{cmPercent}, #{organizePercent},
+                #{shopPercent})
     </insert>
     <insert id="insertOrderPromotions" keyColumn="id" keyProperty="id"
             parameterType="com.caimei365.order.model.vo.PromotionsVo" useGeneratedKeys="true">
         INSERT INTO cm_promotions_order (orderId, promotionsId, name, description, type, mode, touchPrice, reducedPrice,
-                                         discount,status, beginTime, endTime)
-        VALUES (#{orderId}, #{id}, #{name}, #{description}, #{type}, #{mode}, #{touchPrice}, #{reducedPrice}, #{discount},
+                                         discount, status, beginTime, endTime)
+        VALUES (#{orderId}, #{id}, #{name}, #{description}, #{type}, #{mode}, #{touchPrice}, #{reducedPrice},
+                #{discount},
                 #{status}, #{beginTime}, #{endTime})
     </insert>
     <insert id="insertLadderPrices" keyColumn="id" keyProperty="id"
@@ -159,25 +169,17 @@
         WHERE orderID = #{orderId}
     </update>
     <select id="getOrganizeSkuInfo" resultType="com.caimei365.order.model.po.CmOrganizeSkuPo">
-        SELECT
-            cmps.id,
-            cmps.productId,
-            cmps.id,
-            cmps.skuId,
-            cmps.minBuyNumber,
-            cmps.price,
-            cs.unit,
-            cs.price as clubPrice,
-            cs.costCheckFlag as costCheckFlag,
-            cs.costPrice as costPrice,
-            cs.costProportional as costProportional,
-            cs.minBuyNumber AS cmMinBuyNumber,
-            cmps.organizePercent,
-            cmps.shopPercent,
-            cmps.cmPercent
-        FROM cm_mall_product_sku cmps
-                 LEFT JOIN cm_sku cs ON cmps.skuId = cs.skuId
-            where cmps.skuId = #{skuId}
+        SELECT skuId,
+               productId,
+               minBuyNumber,
+               price,
+               unit,
+               stock,
+               ifnull(organizePercent, 0) as organizePercent,
+               ifnull(shopPercent, 0) as shopPercent,
+               ifnull(cmPercent, 0) as cmPercent
+        FROM cm_sku
+        where skuId = #{skuId}
     </select>
     <select id="getOrderInvoice" resultType="com.caimei365.order.model.po.InvoicePo">
         SELECT id,
@@ -215,39 +217,39 @@
         WHERE userID = #{userId}
     </select>
     <select id="getProductDetails" resultType="com.caimei365.order.model.po.OrderProductPo">
-        SELECT cs.skuId                   AS skuId,
-               p.productID                AS productId,
-               p.shopID                   AS shopId,
-               p.`name`                   AS `name`,
-               p.mainImage                AS image,
+        SELECT cs.skuId                    AS skuId,
+               p.productID                 AS productId,
+               p.shopID                    AS shopId,
+               p.`name`                    AS `name`,
+               p.mainImage                 AS image,
                cs.price,
                cs.costPrice,
                IFNULL(cs.costCheckFlag, 1) AS costCheckFlag,
-               cs.costProportional,
+               cs.shopPercent              as costProportional,
                p.productCategory,
                cs.ladderPriceFlag,
                p.includedTax,
                p.invoiceType,
-               p.taxPoint                 AS taxRate,
+               p.taxPoint                  AS taxRate,
                cs.unit                     AS productUnit,
                cs.normalPrice,
-               p.supplierTaxPoint         AS shopTaxRate,
-               p.splitCode as splitCode
+               p.supplierTaxPoint          AS shopTaxRate,
+               p.splitCode                 as splitCode
         FROM product p
-        LEFT JOIN cm_sku cs on p.productID = cs.productId
+                 LEFT JOIN cm_sku cs on p.productID = cs.productId
         WHERE cs.skuId = #{skuId}
+          and cs.organizeId = 0
     </select>
     <select id="getProductOrganizeDetails" resultType="com.caimei365.order.model.po.OrderProductPo">
-        SELECT cs.skuId                   AS skuId,
-               p.productID                AS productId,
-               p.shopID                   AS shopId,
-               p.`name`                   AS `name`,
-               p.mainImage                AS image,
-               cmop.id as organizeProductId,
-               cmps.price,
+        SELECT cs.skuId           AS skuId,
+               p.productID        AS productId,
+               p.shopID           AS shopId,
+               p.`name`           AS `name`,
+               p.mainImage        AS image,
+               cs.price,
                cs.costPrice,
                IFNULL(cs.costCheckFlag, 1) AS costCheckFlag,
-               cs.costProportional,
+               cs.shopPercent as costProportional,
                p.productCategory,
                cs.ladderPriceFlag,
                p.includedTax,
@@ -259,9 +261,7 @@
                p.splitCode as splitCode
         FROM product p
                  LEFT JOIN cm_sku cs on p.productID = cs.productId
-                 LEFT JOIN cm_mall_organize_products cmop ON cmop.productId = p.productID
-                 LEFT JOIN cm_mall_product_sku cmps ON cmps.skuId = cs.skuId
-        WHERE cs.skuId = #{skuId}
+        WHERE cs.skuId = #{skuId} and cs.organizeId = 4
     </select>
     <select id="getClauseNameById" resultType="java.lang.String">
         SELECT `name`
@@ -290,13 +290,13 @@
     </select>
     <select id="getSvipProductDetails" resultType="com.caimei365.order.model.po.SvipProductPo">
         select if(id is not null and csp.status = 0, 1, 0) as svipProductFlag,
-               priceType                as svipPriceType,
-               discount                 as svipDiscount,
-               discountPrice            as svipDiscountPrice
+               priceType                                   as svipPriceType,
+               discount                                    as svipDiscount,
+               discountPrice                               as svipDiscountPrice
         from cm_svip_product_sku
-        left join cm_svip_product csp on cm_svip_product_sku.productId = csp.productId
+                 left join cm_svip_product csp on cm_svip_product_sku.productId = csp.productId
         where skuId = #{skuId}
-        and csp.status=0
+          and csp.status = 0
     </select>
     <select id="findLowOrder" resultType="java.lang.Integer">
         select orderID
@@ -308,8 +308,8 @@
     </select>
     <select id="findShops" resultType="com.caimei365.order.model.po.OrderShopPo">
         SELECT DISTINCT
-            s.shopID AS shopId,
-            p.splitCode
+        s.shopID AS shopId,
+        p.splitCode
         FROM shop s
         LEFT JOIN product p ON p.shopID = s.shopID
         WHERE p.productID IN
@@ -327,26 +327,168 @@
         AND (splitcode IS NULL OR splitcode ='')
     </select>
     <select id="getRechargeProductDetails" resultType="com.caimei365.order.model.po.OrderProductPo">
-        SELECT cs.skuId                   AS skuId,
-               p.productID                AS productId,
-               p.shopID                   AS shopId,
-               p.`name`                   AS `name`,
-               p.mainImage                AS image,
+        SELECT cs.skuId                    AS skuId,
+               p.productID                 AS productId,
+               p.shopID                    AS shopId,
+               p.`name`                    AS `name`,
+               p.mainImage                 AS image,
                cs.price,
                cs.costPrice,
                IFNULL(cs.costCheckFlag, 1) AS costCheckFlag,
-               cs.costProportional,
+               cs.shopPercent              as costProportional,
                p.productCategory,
                cs.ladderPriceFlag,
                p.includedTax,
                p.invoiceType,
-               p.taxPoint                 AS taxRate,
+               p.taxPoint                  AS taxRate,
                cs.unit                     AS productUnit,
                cs.normalPrice,
-               p.supplierTaxPoint         AS shopTaxRate,
-               p.splitCode as splitCode
+               p.supplierTaxPoint          AS shopTaxRate,
+               p.splitCode                 as splitCode
         FROM product p
                  LEFT JOIN cm_sku cs on p.productID = cs.productId
         WHERE cs.productId = #{productId}
+          and cs.organizeId = 0
+    </select>
+    <select id="findOrderProducts" resultType="com.caimei365.order.model.vo.OrderProductVo">
+        select
+        orderProductId,
+        orderNo,
+        orderId,
+        shopOrderId,
+        shopOrderNo,
+        shopID,
+        productId,
+        organizeId,
+        num,
+        presentNum,
+        outStoreType,
+        skuId,
+        productNo,
+        price,
+        normalPrice,
+        costPrice,
+        totalAmount,
+        totalFee,
+        shouldPayFee,
+        discount,
+        discountPrice,
+        includedTax,
+        invoiceType,
+        ladderPriceFlag,
+        taxRate,
+        supplierTaxRate,
+        addedValueTax,
+        totalAddedValueTax,
+        shouldPayTotalTax,
+        singleShouldPayTotalTax,
+        shopProductAmount,
+        shopFee,
+        otherFee,
+        cmFee,
+        singleShopFee,
+        singleOtherFee,
+        singleCmFee,
+        status,
+        totalBeans,
+        useBalanceAmount,
+        useBeanAmount,
+        notOutStore,
+        cmbeanPrice,
+        isActProduct,
+        isGiftProduct,
+        productActInfo,
+        buyAgainFlag,
+        confirmProductFlag,
+        payStatus,
+        shopName,
+        name,
+        productUnit,
+        productImage,
+        actType,
+        actPreferential,
+        ifnull(productType,0) as productType,
+        orderPromotionsId,
+        preferential,
+        discountFee,
+        cancelNum,
+        heUserId,
+        svipPriceFlag,
+        svipPriceType,
+        svipDiscount,
+        svipReduction,
+        cmPercent,
+        organizePercent,
+        shopPercent
+        from cm_order_product
+        where orderProductID in
+        <foreach item="orderProductId" index="index" collection="orderProductIds" open="(" separator="," close=")">
+            #{orderProductId}
+        </foreach>
     </select>
+    <update id="updateOrderProduct">
+        update cm_order_product
+        set price                   = #{price},
+            costPrice               = #{costPrice},
+            totalAmount             = #{totalAmount},
+            totalFee                = #{totalFee},
+            shouldPayFee            = #{shouldPayFee},
+            ladderPriceFlag         = #{ladderPriceFlag},
+            taxRate                 = #{taxRate},
+            addedValueTax           = #{addedValueTax},
+            totalAddedValueTax      = #{totalAddedValueTax},
+            shouldPayTotalTax       = #{shouldPayTotalTax},
+            singleShouldPayTotalTax = #{singleShouldPayTotalTax},
+            shopProductAmount       = #{shopProductAmount},
+            singleShopFee           = #{singleShopFee},
+            shopFee                 = #{shopFee}
+        where orderProductId = #{orderProductId}
+    </update>
+    <update id="updateShopOrder">
+        update cm_shop_order
+        set
+        <if test="status != null">
+            shopStatus = #{status},
+        </if>
+        <if test="realNeedPay != null">
+            realPay = #{realNeedPay},
+        </if>
+        <if test="receiptAmount != null">
+            receiptAmount = #{receiptAmount},
+        </if>
+        <if test="accountAmount != null">
+            accountAmount = #{accountAmount},
+        </if>
+        <if test="productAmount != null">
+            productAmount = #{productAmount},
+        </if>
+        <if test="totalAmount != null">
+            totalAmount = #{totalAmount},
+        </if>
+        <if test="needPayAmount != null">
+            needPayAmount = #{needPayAmount},
+        </if>
+        <if test="promotionFullReduction != null">
+            promotionFullReduction = #{promotionFullReduction},
+        </if>
+        <if test="receiptStatus != null">
+            receiptStatus = #{receiptStatus},
+        </if>
+        <if test="shopProductAmount != null">
+            shopProductAmount = #{shopProductAmount},
+        </if>
+        <if test="shopTaxFee != null">
+            shopTaxFee = #{shopTaxFee},
+        </if>
+        <if test="shouldPayShopAmount != null">
+            shouldPayShopAmount = #{shouldPayShopAmount}
+        </if>
+        where shopOrderId = #{shopOrderId}
+    </update>
+    <update id="updateUserMoneyByChange">
+        update user
+        set userMoney = userMoney + #{change},
+            ableUserMoney = ableUserMoney + #{change}
+        where userId = #{userId}
+    </update>
 </mapper>

Bu fark içinde çok fazla dosya değişikliği olduğu için bazı dosyalar gösterilmiyor