فهرست منبع

Merge remote-tracking branch 'origin/developerC' into developerC

Aslee 3 سال پیش
والد
کامیت
44bb0192cb

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

@@ -0,0 +1,70 @@
+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 java.io.IOException;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author zzj
+ */
+
+@Slf4j
+public class OnlinePostFormUtil {
+
+    public static OkHttpClient client = new OkHttpClient.Builder()
+            .connectTimeout(3, TimeUnit.SECONDS)
+            .readTimeout(20, TimeUnit.SECONDS)
+            .build();
+
+    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()) {
+            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 (!"SUCCESS".equals(res.getString("rt10_orderStatus"))) {
+            log.info("网银查询成功结果------->"+res.toString());
+        }
+        /** rt4_success 为 true,需验签  **/
+        return res.toJavaObject(clazz);
+    }
+
+}

+ 27 - 5
src/main/java/com/caimei365/order/controller/HeliPayApi.java

@@ -165,7 +165,7 @@ public class HeliPayApi {
      */
     @ApiOperation("判断此次支付是否完成(旧:/PayOrder/payWhetherSuccess)")
     @ApiImplicitParams({
-            @ApiImplicitParam(required = false, name = "shopOrderId", value = "订单id"),
+            @ApiImplicitParam(required = false, name = "shopOrderId", value = "订单id"),
             @ApiImplicitParam(required = false, name = "paySuccessCounter", value = "付款次数")
     })
     @GetMapping("/result/check")
@@ -186,20 +186,42 @@ public class HeliPayApi {
      */
     @ApiOperation("查询本次支付订单结果(旧:/PayOrder/findOrderStatus)")
     @ApiImplicitParams({
-            @ApiImplicitParam(required = false, name = "mbOrderId", value = "平台唯一流水号"),
-            @ApiImplicitParam(required = false, name = "orderFlag", value = "订单标识:0非订单,1订单"),
+            @ApiImplicitParam(required = true, name = "mbOrderId", value = "平台唯一流水号"),
+            @ApiImplicitParam(required = true, name = "orderFlag", value = "订单标识:0非订单,1订单"),
+            @ApiImplicitParam(required = false, name = "shopOrderId", value = "子订单Id")
     })
     @GetMapping("/result/json")
-    public ResponseJson<JSONObject> getPayOrderResult(String mbOrderId,Integer orderFlag) throws IntrospectionException, InvocationTargetException, IllegalAccessException {
+    public ResponseJson<JSONObject> getPayOrderResult(String mbOrderId,Integer orderFlag,Integer shopOrderId) throws IntrospectionException, InvocationTargetException, IllegalAccessException {
         if (null == mbOrderId) {
             return ResponseJson.error("平台唯一流水号不能为空!", null);
         }
         if (null == orderFlag) {
             return ResponseJson.error("订单标识不能为空!", null);
         }
-        return heliPayService.getPayOrderResult(mbOrderId, orderFlag);
+        return heliPayService.getPayOrderResult(mbOrderId, orderFlag,shopOrderId);
     }
 
+    /**
+     * 查询网银本次支付订单结果
+     *
+     * @param mbOrderId 平台唯一流水号
+     */
+    @ApiOperation("查询网银本次支付订单结果(旧:/PayOrder/findOrderStatus)")
+    @ApiImplicitParams({
+            @ApiImplicitParam(required = true, name = "mbOrderId", value = "平台唯一流水号"),
+            @ApiImplicitParam(required = true, name = "orderFlag", value = "订单标识:0非订单,1订单"),
+            @ApiImplicitParam(required = false, name = "shopOrderId", value = "子订单Id")
+    })
+    @GetMapping("/result/union")
+    public ResponseJson<JSONObject> getUnionResult(String mbOrderId,Integer orderFlag,Integer shopOrderId) throws IntrospectionException, InvocationTargetException, IllegalAccessException {
+        if (null == mbOrderId) {
+            return ResponseJson.error("平台唯一流水号不能为空!", null);
+        }
+        if (null == orderFlag) {
+            return ResponseJson.error("订单标识不能为空!", null);
+        }
+        return heliPayService.getUnionResult(mbOrderId, orderFlag,shopOrderId);
+    }
     /**
      * 合利宝pc支付宝二维码
      */

+ 13 - 0
src/main/java/com/caimei365/order/controller/HeliPayNonOrderApi.java

@@ -459,4 +459,17 @@ public class HeliPayNonOrderApi {
         }
         return payNonOrderService.authVipCheck(vipRecordId);
     }
+
+    /**
+     * 购买超级会员-查询是否购买成功
+     */
+    @ApiOperation("购买超级会员-查询是否购买成功")
+    @GetMapping("/vip/check")
+    public ResponseJson vipCheck(Integer recordId) {
+        if (null == recordId) {
+            return ResponseJson.error("购买记录id不能为空!", null);
+        }
+        return payNonOrderService.vipCheck(recordId);
+    }
+
 }

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

@@ -248,9 +248,9 @@ public interface PayOrderMapper {
 
     Integer getOrderId(Integer shopOrderId);
 
-    String getSplitCodeByMbOrderId(String mbOrderId);
-
     List<BankCodeVo> findB2BBankCode();
 
     List<BankCodeVo> findB2CBankCode();
+
+    String getSplitCodeByShopOrderId(Integer shopOrderId);
 }

+ 5 - 0
src/main/java/com/caimei365/order/mapper/SubmitMapper.java

@@ -5,6 +5,7 @@ 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 org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -145,4 +146,8 @@ public interface SubmitMapper {
     List<Integer> findLowOrder(@Param("userId") Integer userId, @Param("orderTime") Date orderTime);
 
     void updateOnlinePayFlag(Integer onlinePayFlag, Integer orderId);
+
+    List<OrderShopPo> findShops(List<String> productIdList);
+
+    Integer findSplitResult(List<String> productIdList);
 }

+ 40 - 0
src/main/java/com/caimei365/order/model/vo/OnlineCheckVo.java

@@ -0,0 +1,40 @@
+package com.caimei365.order.model.vo;
+
+import com.google.common.collect.ImmutableSet;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+import java.io.Serializable;
+import java.util.Set;
+
+@Setter
+@Getter
+@ToString
+public class OnlineCheckVo implements Serializable {
+    private String rt1_bizType;
+    private String rt2_retCode;
+    private String rt3_customerNumber;
+    private String rt4_orderId;
+    private String rt5_orderAmount;
+    private String rt6_bankId;
+    private String rt7_business;
+    private String rt8_createDate;
+    private String rt9_completeDate;
+    private String rt10_orderStatus;
+    private String rt11_desc;
+    //DEBIT:借记卡
+    //CREDIT:贷记卡
+    //UNKNOWN:未知ZCREDIT:准贷记卡
+    //DEBIT_CREDIT:借贷合一
+    private String onlineCardType;
+    private String sign;
+
+
+    /**
+     * 需要加签的属性参数
+     * 看接口文档
+     */
+    public static final Set<String> NEED_SIGN_PARAMS = ImmutableSet.of("rt1_bizType", "rt2_retCode", "rt3_customerNumber",
+            "rt4_orderId", "rt5_orderAmount", "rt6_bankId", "rt7_business", "rt8_createDate","rt9_completeDate","rt10_orderStatus");
+}

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

@@ -119,4 +119,6 @@ public interface HeliPayNonOrderService {
      * 认证通会员购买确认
      */
     ResponseJson authVipCheck(Integer vipRecordId);
+
+    ResponseJson vipCheck(Integer recordId);
 }

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

@@ -43,11 +43,13 @@ public interface HeliPayService {
 
     ResponseJson<Map<String, Object>> bankCode();
 
-    ResponseJson<JSONObject> getPayOrderResult(String mbOrderId, Integer orderFlag) 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<JSONObject> getUnionResult(String mbOrderId, Integer orderFlag, Integer shopOrderId);
 }

+ 10 - 0
src/main/java/com/caimei365/order/service/impl/HeliPayNonOrderServiceImpl.java

@@ -1902,6 +1902,16 @@ public class HeliPayNonOrderServiceImpl implements HeliPayNonOrderService {
         return ResponseJson.success("支付失败", map1);
     }
 
+    @Override
+    public ResponseJson vipCheck(Integer recordId) {
+        // 获取会员套餐记录
+        VipRecordBo record = payOrderMapper.getVipPackageRecord(recordId);
+        if (null != record.getPayStatus() && 1 == record.getPayStatus()) {
+            return ResponseJson.success("支付成功!", null);
+        }
+        return ResponseJson.error("支付失败", null);
+    }
+
     public void saveRoleRelation(Integer userId, String roleIds) {
         if (StringUtils.isNotEmpty(roleIds)) {
             // 设置用户角色

+ 65 - 17
src/main/java/com/caimei365/order/service/impl/HeliPayServiceImpl.java

@@ -3,6 +3,7 @@ package com.caimei365.order.service.impl;
 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.WeChatService;
 import com.caimei365.order.constant.Constant;
 import com.caimei365.order.mapper.BaseMapper;
@@ -840,35 +841,37 @@ public class HeliPayServiceImpl implements HeliPayService {
         List<BankCodeVo> B2B = payOrderMapper.findB2BBankCode();
         List<BankCodeVo> B2C = payOrderMapper.findB2CBankCode();
         Map<String, Object> banks = new HashMap<>(2);
-        banks.put("B2B",B2B);
-        banks.put("B2C",B2C);
+        banks.put("B2B", B2B);
+        banks.put("B2C", B2C);
         return ResponseJson.success("获取成功", banks);
     }
 
     @Override
-    public ResponseJson<JSONObject> getPayOrderResult(String mbOrderId, Integer orderFlag) throws IntrospectionException, InvocationTargetException, IllegalAccessException {
+    public ResponseJson<JSONObject> getPayOrderResult(String mbOrderId, Integer orderFlag, Integer shopOrderId) throws IntrospectionException, InvocationTargetException, IllegalAccessException {
         log.info("--------进入交易订单查询接口----------");
+        //区分网银和其他产品
         QueryOrderVo queryOrderVo = new QueryOrderVo();
         queryOrderVo.setP1_bizType("AppPayQuery");
         queryOrderVo.setP2_orderId(mbOrderId);
         if (0 == orderFlag) {
             queryOrderVo.setP3_customerNumber(Constant.CUSTOMERNUM);
         } else {
-            String splitCode = payOrderMapper.getSplitCodeByMbOrderId(mbOrderId);
+            if (null == shopOrderId) {
+                return ResponseJson.error("子订单Id不能为空!", null);
+            }
+            String splitCode = payOrderMapper.getSplitCodeByShopOrderId(shopOrderId);
+            if (null == splitCode) {
+                return ResponseJson.error("订单信息不正确!", null);
+            }
             queryOrderVo.setP3_customerNumber(splitCode);
         }
+
         Map<String, String> map = MyBeanUtils.convertBean(queryOrderVo, new LinkedHashMap());
         String oriMessage = MyBeanUtils.getSignedByPresetParameter(map, QueryOrderVo.NEED_SIGN_PARAMS);
-        //区分网银和其他产品
-        String payType = baseMapper.findType(mbOrderId);
-        if ("12".equals(payType) || "17".equals(payType)) {
-            oriMessage += Constant.SPLIT + Constant.WANGYIN;
-        } else {
-            oriMessage += Constant.SPLIT + Constant.SAOMA;
-        }
+        oriMessage += Constant.SPLIT + Constant.SAOMA;
         log.info("签名原文串:" + oriMessage);
         String sign = Disguiser.disguiseMD5(oriMessage.trim());
-        log.info("签名串:" + sign);
+        log.info("md5加密签名串:" + sign);
         map.put("sign", sign);
         log.info("发送参数:" + map);
         Map<String, Object> resultMap = HttpClientService.getHttpResp(map, Constant.REQUEST_URL);
@@ -878,11 +881,7 @@ public class HeliPayServiceImpl implements HeliPayService {
             QueryOrderResponseVo queryOrderResponseVo = JSONObject.parseObject(resultMsg, QueryOrderResponseVo.class);
             String assemblyRespOriSign = MyBeanUtils.getSignedByPresetParameter(queryOrderResponseVo, QueryOrderResponseVo.NEED_SIGN_PARAMS);
             log.info("组装返回结果签名串:" + assemblyRespOriSign);
-            if ("12".equals(payType) || "17".equals(payType)) {
-                assemblyRespOriSign += Constant.SPLIT + Constant.WANGYIN;
-            } else {
-                assemblyRespOriSign += Constant.SPLIT + Constant.SAOMA;
-            }
+            assemblyRespOriSign += Constant.SPLIT + Constant.SAOMA;
             String responseSign = queryOrderResponseVo.getSign();
             log.info("响应签名:" + responseSign);
             String checkSign = Disguiser.disguiseMD5(assemblyRespOriSign.trim());
@@ -899,8 +898,10 @@ public class HeliPayServiceImpl implements HeliPayService {
         } else {
             return ResponseJson.error("查询失败", null);
         }
+
     }
 
+
     @Override
     public String unionCallback(UnionResVo res) throws IntrospectionException, InvocationTargetException, IllegalAccessException {
         log.info("******************** 网银支付异步回调 start *******************");
@@ -1178,6 +1179,53 @@ public class HeliPayServiceImpl implements HeliPayService {
         return ResponseJson.success(shopOrderList);
     }
 
+    @Override
+    public ResponseJson<JSONObject> getUnionResult(String mbOrderId, Integer orderFlag, Integer shopOrderId) {
+        String customerNumber = "";
+        if (0 == orderFlag) {
+            customerNumber = Constant.CUSTOMERNUM;
+        } else {
+            if (null == shopOrderId) {
+                return ResponseJson.error("子订单Id不能为空!", null);
+            }
+            String splitCode = payOrderMapper.getSplitCodeByShopOrderId(shopOrderId);
+            if (null == splitCode) {
+                return ResponseJson.error("订单信息不正确!", null);
+            }
+            customerNumber = splitCode;
+        }
+        Map<String, String> sPara = new HashMap<String, String>();
+        sPara.put("P1_bizType", "OnlineQuery");
+        sPara.put("P2_orderId", mbOrderId);
+        sPara.put("P3_customerNumber", customerNumber);
+        StringBuffer sb = new StringBuffer();
+        sb.append("&").append("OnlineQuery").append("&").append(mbOrderId).append("&")
+                .append(customerNumber).append("&").append(WANGYIN);
+        String sign = Disguiser.disguiseMD5(sb.toString());
+        sPara.put("sign", sign);
+        try {
+            OnlineCheckVo on = OnlinePostFormUtil.postForm(sPara, YL, sign, OnlineCheckVo.class);
+            JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(on), JSONObject.class);
+            if (!"0000".equals(on.getRt2_retCode())) {
+                log.info("查询失败:" + on.toString());
+                return ResponseJson.error("查询失败", jsonObject);
+            } else {
+                String assemblyRespOriSign = MyBeanUtils.getSignedByPresetParameter(on, OnlineCheckVo.NEED_SIGN_PARAMS);
+                log.info("组装返回结果签名串:" + assemblyRespOriSign);
+                assemblyRespOriSign += Constant.SPLIT + WANGYIN;
+                String checkSign = Disguiser.disguiseMD5(assemblyRespOriSign.trim());
+                if (!checkSign.equals(on.getSign())) {
+                    return ResponseJson.error("验签失败", jsonObject);
+                } else {
+                    return ResponseJson.success("查询成功", jsonObject);
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
     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()) {

+ 5 - 0
src/main/java/com/caimei365/order/service/impl/PayOrderServiceImpl.java

@@ -343,6 +343,7 @@ public class PayOrderServiceImpl implements PayOrderService {
      * @param payLinkDto {
      *                   orderId       订单ID
      *                   vipRecordId   会员购买记录Id
+     *                   couponRecordId 优惠券购买记录id
      *                   }
      */
     @Override
@@ -446,9 +447,12 @@ public class PayOrderServiceImpl implements PayOrderService {
         AuthUserVo authUser = null;
         // 链接类型:1订单,2超级会员,3认证通会员
         int type = 0;
+        // 订单标识,0非订单,1订单
+        int orderFlag = 0;
         // 订单支付记录
         List<DiscernReceiptVo> discernReceiptList = null;
         if (null != orderPayLink.getShopOrderId()) {
+            orderFlag = 1;
             type = 1;
             // 订单信息
             OrderVo order = orderCommonMapper.getOrderByShopOrderId(orderPayLink.getShopOrderId());
@@ -499,6 +503,7 @@ public class PayOrderServiceImpl implements PayOrderService {
             time = dateFormat.format(orderPayLink.getEffectiveTime());
         }
         Map<String, Object> map = new HashMap<>(5);
+        map.put("orderFlag",orderFlag);
         map.put("type", type);
         map.put("orderPayLink", orderPayLink);
         map.put("userName", userName);

+ 128 - 29
src/main/java/com/caimei365/order/service/impl/SubmitServiceImpl.java

@@ -34,6 +34,7 @@ import java.util.*;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
+import java.util.stream.Collectors;
 
 import static com.alibaba.fastjson.JSON.parseArray;
 import static com.alibaba.fastjson.JSON.parseObject;
@@ -129,7 +130,6 @@ public class SubmitServiceImpl implements SubmitService {
     public ResponseJson<Map<String, Object>> generateOrder(SubmitDto submitDto) {
         // 获取机构用户Id
         Integer clubUserId = baseMapper.getUserIdByClubId(submitDto.getClubId());
-        submitDto.getUnionId();
         unionId = submitDto.getUnionId();
         if (null == clubUserId || clubUserId == 0) {
             return ResponseJson.error("机构用户信息异常!", null);
@@ -300,7 +300,7 @@ public class SubmitServiceImpl implements SubmitService {
 
     public ResponseJson<Map<String, Object>> saveOrder(OrderParamBo orderParamBo) {
         log.info("******************** 提交订单逻辑处理 start *******************");
-        /*
+        /**
          * 初始化主订单
          */
         OrderPo mainOrder = new OrderPo();
@@ -322,8 +322,6 @@ public class SubmitServiceImpl implements SubmitService {
         mainOrder.setUpdateDate(curDateStr);
         // 订单状态 0 有效  其它无效
         mainOrder.setDelFlag(0);
-
-
         //协销下单
         if (3 == orderParamBo.getCartType()) {
             mainOrder.setSpId(orderParamBo.getServiceProviderId());
@@ -364,7 +362,7 @@ public class SubmitServiceImpl implements SubmitService {
         // 是否开发票
         mainOrder.setInvoiceFlag(orderParamBo.getInvoiceType());
 
-        /*
+        /**
          * 整理订单商品信息
          */
         // 商品总数量
@@ -412,14 +410,10 @@ public class SubmitServiceImpl implements SubmitService {
         for (Object infoObject : orderInfo) {
             JSONObject shopInfo = (JSONObject) infoObject;
             Integer shopId = (Integer) shopInfo.get("shopId");
-            String splitCode = (String) shopInfo.get("splitCode");
             String shopNote = (String) shopInfo.get("note");
             if (null == shopId) {
                 return ResponseJson.error("供应商数据异常!", null);
             }
-            if (StringUtils.isBlank(splitCode)) {
-                onlinePay.set(false);
-            }
             JSONArray productArr = (JSONArray) shopInfo.get("productInfo");
             if (null == productArr) {
                 return ResponseJson.error("订单商品数据异常!", null);
@@ -430,7 +424,6 @@ public class SubmitServiceImpl implements SubmitService {
              * 初始化子订单
              */
             OrderShopPo shopOrder = new OrderShopPo();
-            shopOrder.setSplitCode(splitCode);
             shopOrder.setShopId(shopId);
             shopOrder.setShopName(shopName);
             shopOrder.setNote(shopNote);
@@ -638,7 +631,6 @@ public class SubmitServiceImpl implements SubmitService {
                             if (promotions.getMode() == 1 || MathUtil.compare(productFee, promotions.getTouchPrice()) >= 0) {
                                 // 满减
                                 if (promotions.getMode() == 2) {
-
                                     if (promotions.getDiscount() != null && promotions.getDiscount() == 1) {
                                         //叠加优惠计算
                                         //叠加倍数
@@ -792,7 +784,11 @@ public class SubmitServiceImpl implements SubmitService {
                 orderProductList.add(product);
                 productIdList.add(product.getProductId().toString());
             }
-
+            Integer count = submitMapper.findSplitResult(productIdList);
+            if (count > 0) {
+                //有商品无分帐号,走线下
+                onlinePay.set(false);
+            }
             if (null != shopPromotions) {
                 // 是否满足满减满赠
                 if (MathUtil.compare(shopPromotionFee.get(), shopPromotions.getTouchPrice()) >= 0) {
@@ -933,7 +929,7 @@ public class SubmitServiceImpl implements SubmitService {
         mainOrder.setPresentCount(presentCount.get());
         //促销赠品数量
         mainOrder.setPromotionalGiftsCount(promotionalGiftsCount.get());
-        /*
+        /**
          * 处理优惠券
          */
         Double couponAmount = 0d;
@@ -948,7 +944,7 @@ public class SubmitServiceImpl implements SubmitService {
             couponAmount = coupon.getCouponAmount();
         }
         mainOrder.setCouponAmount(couponAmount);
-        /*
+        /**
          * 计算运费
          */
         if (3 != orderParamBo.getCartType()) {
@@ -1070,16 +1066,14 @@ public class SubmitServiceImpl implements SubmitService {
             mainOrder.setClauseName("无条款");
         }
 
-        /*
+        /**
          * 保存主订单数据,返回订单Id
          */
         submitMapper.insertMainOrder(mainOrder);
         log.info("【提交订单】>>>>>>>>>>>>>>>>>>>>>>>>>>新增主订单(insert[cm_order])orderId:" + mainOrder.getOrderId());
 
 
-
-
-        /*
+        /**
          * 保存订单促销,返回订单促销Id
          */
         promotionList.forEach(promotions -> {
@@ -1090,7 +1084,18 @@ public class SubmitServiceImpl implements SubmitService {
         /**
          * 线上单分摊优惠
          */
+        if (presentCount.get() > 0) {
+            //有赠品不能线上,赠品成本无法分账
+            onlinePay.set(false);
+        }
         if (onlinePay.get()) {
+            //在店铺满减算完之后重新根据商品的splitCode排shopOrderList
+            List<OrderShopPo> shops = submitMapper.findShops(productIdList);
+            //子订单分多子订单,满减分摊到原子订单分开的子订单,无满减重算佣金/应付
+//            if (shops.size() != shopOrderList.size()) {
+                //重组订单
+                findSplitShopOrder(orderProductList, shopOrderList, shops, orderParamBo);
+//            }
             //线上支付分摊优惠总和到子订单
             //经理折扣+优惠券+满减 提交订单的时候无经理折扣
             double allDiscount = MathUtil.add(couponAmount, promotionFullReduction.get()).doubleValue();
@@ -1098,16 +1103,8 @@ public class SubmitServiceImpl implements SubmitService {
             AtomicDouble oldBrokerage = new AtomicDouble(0);
             //超级会员价/复购价/阶梯价/促销活动冲突,只能生效一个,促销活动满减计入优惠分摊,子订单售价=NeedPayAmount+promotionFullReduction
             shopOrderList.forEach(orderShopPo -> {
-                // 单品满减和店铺满减会存入shoporder信息中
-                if (null != orderShopPo.getPromotionFullReduction() && orderShopPo.getPromotionFullReduction() > 0) {
-                    //不含分摊优惠的子订单金额
-                    orderShopPo.setOldPrice(MathUtil.add(orderShopPo.getNeedPayAmount(), orderShopPo.getPromotionFullReduction()).doubleValue());
-                    //此处佣金未算优惠券和满减金额,不用加上分摊优惠金额
-                    orderShopPo.setOldBrokerage(orderShopPo.getBrokerage());
-                } else {
-                    orderShopPo.setOldPrice(orderShopPo.getNeedPayAmount());
-                    orderShopPo.setOldBrokerage(orderShopPo.getBrokerage());
-                }
+                orderShopPo.setOldPrice(orderShopPo.getNeedPayAmount());
+                orderShopPo.setOldBrokerage(orderShopPo.getBrokerage());
                 oldBrokerage.set(MathUtil.add(oldBrokerage.get(), orderShopPo.getOldBrokerage()).doubleValue());
             });
             // 按分摊前的佣金排序
@@ -1608,7 +1605,7 @@ public class SubmitServiceImpl implements SubmitService {
         //应付订单金额
         info.put("payTotalFee", mainOrder.getPayTotalFee());
         //线上线下按钮onlinePayFlag:0线上,1线下
-        info.put("onlinePayFlag",onlinePayFlag);
+        info.put("onlinePayFlag", onlinePayFlag);
         //真实需要付款金额
         info.put("payableAmount", mainOrder.getPayableAmount());
         if (isPaySuccessFlag) {
@@ -1626,6 +1623,108 @@ public class SubmitServiceImpl implements SubmitService {
         return ResponseJson.success("操作成功!", info);
     }
 
+    private void findSplitShopOrder(List<OrderProductPo> orderProductList, List<OrderShopPo> shopOrderList, List<OrderShopPo> shops, OrderParamBo orderParamBo) {
+        //统计拆分的shop
+        //List<OrderShopPo> collect = shops.stream().filter(s -> shops.stream().filter(so -> so.getShopId().equals(s.getShopId())).count() > 1).collect(Collectors.toList());
+        //对拆分的shop重新计算子订单佣金,应付,不计入店铺满减
+        ArrayList<OrderShopPo> orderShopPos = new ArrayList<>();
+        for (OrderShopPo shop : shops) {
+            // 供应商名称
+            String shopName = baseMapper.getShopNameById(shop.getShopId());
+            /*
+             * 初始化子订单
+             */
+            List<OrderShopPo> oldShop = shopOrderList.stream().filter(s -> s.getShopId().equals(shop.getShopId())).collect(Collectors.toList());
+            OrderShopPo shopOrder = new OrderShopPo();
+            shopOrder.setSplitCode(shop.getSplitCode());
+            shopOrder.setShopId(shop.getShopId());
+            shopOrder.setShopName(shopName);
+            shopOrder.setNote(oldShop.get(0).getNote());
+            // 用户Id
+            shopOrder.setUserId(oldShop.get(0).getUserId());
+            shopOrder.setClubId(oldShop.get(0).getClubId());
+            if (null != oldShop.get(0).getOrderPromotionsId()) {
+                shopOrder.setOrderPromotionsId(oldShop.get(0).getOrderPromotionsId());
+            }
+            if (3 == orderParamBo.getCartType()) {
+                // 协销订单
+                shopOrder.setSpId(orderParamBo.getBuyUserId());
+            }
+            // 商品总数量
+            AtomicInteger shopProductCount = new AtomicInteger(0);
+            // 佣金 =  应付采美
+            AtomicDouble brokerage = new AtomicDouble(0);
+            // 需要支付金额
+            AtomicDouble needPayAmount = new AtomicDouble(0);
+            // 商品总金额
+            AtomicDouble shopAmount = new AtomicDouble(0);
+            // 付供应商 商品费
+            AtomicDouble shopProductAmount = new AtomicDouble(0);
+            // 付供应商税费
+            AtomicDouble shopTaxFee = new AtomicDouble(0);
+            // 商品费
+            AtomicDouble shopProductFee = new AtomicDouble(0);
+            // 该供应商下该分帐号的商品
+            List<OrderProductPo> shopProducts = orderProductList.stream().filter(po -> po.getSplitCode().equals(shop.getSplitCode()) && po.getShopId().equals(shop.getShopId())).collect(Collectors.toList());
+            // 遍历所有商品
+            for (OrderProductPo product : shopProducts) {
+                /*
+                 * 子订单金额计算
+                 */
+                // 供应商商品数量
+                shopProductCount.set(shopProductCount.get() + product.getNum());
+                // 佣金 = 应付采美
+                brokerage.set(MathUtil.add(brokerage.get(), product.getCmFee()).doubleValue());
+                // 需要支付金额 shouldPayFee +运费
+                needPayAmount.set(MathUtil.add(needPayAmount.get(), product.getShouldPayFee()).doubleValue());
+                // 统计 总金额 包括税费
+                shopProductFee.set(MathUtil.add(shopProductFee.get(), product.getTotalFee()).doubleValue());
+                // 商品总金额
+                shopAmount.set(MathUtil.add(shopAmount.get(), product.getTotalAmount()).doubleValue());
+                // 付供应商 商品费
+                shopProductAmount.set(MathUtil.add(shopProductAmount.get(), product.getShopProductAmount()).doubleValue());
+                // 付供应商税费
+                shopTaxFee.set(MathUtil.add(shopTaxFee.get(), product.getShouldPayTotalTax()).doubleValue());
+            }
+
+            // 佣金 采美应收
+            shopOrder.setBrokerage(brokerage.get());
+            // 可退款金额 = 余额抵扣金额
+            shopOrder.setCanRefundAmount(needPayAmount.get());
+            // 购买商品数
+            shopOrder.setItemCount(shopProductCount.get());
+            // 总价(含税) = totalFee
+            shopOrder.setTotalAmount(shopProductFee.get());
+            // 总金额 = 订单商品totalAmount
+            shopOrder.setProductAmount(shopAmount.get());
+            // 需要支付金额 shouldPayFee +运费
+            shopOrder.setNeedPayAmount(needPayAmount.get());
+            // 付供应商 商品费=成本价*(购买数量  + 赠品数量)
+            shopOrder.setShopProductAmount(shopProductAmount.get());
+            // 付给供应商税费
+            shopOrder.setShopTaxFee(shopTaxFee.get());
+            // 付供应商 = 商品费 + 运费 + 税费
+            shopOrder.setShouldPayShopAmount(MathUtil.add(shopProductAmount.get(), shopTaxFee.get()).doubleValue());
+            // 付给供应商运费
+            shopOrder.setShopPostFee(0d);
+            // 已付供应商金额
+            shopOrder.setPayedShopAmount(0d);
+            // (付款供应商)付款状态:1待付款、2部分付款、3已付款
+            shopOrder.setPayStatus(1);
+            if (3 == orderParamBo.getCartType()) {
+                // 协销订单
+                shopOrder.setOrderType(0);
+            } else {
+                // 普通订单
+                shopOrder.setOrderType(1);
+            }
+            orderShopPos.add(shopOrder);
+            //把原shoporderlist拆分的shop剔除,加入拆分后的shop
+            shopOrderList.removeIf(s -> s.getShopId().equals(shopOrder.getShopId()));
+        }
+        shopOrderList.addAll(orderShopPos);
+    }
+
     /**
      * 生成充值商品订单
      *

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

@@ -645,7 +645,7 @@
                cop.realPay,
                cop.receiptAmount,
                cop.receiptStatus,
-               cop.paySuccessCounter,
+               ifnull(cop.paySuccessCounter,0) as paySuccessCounter,
                p.name          as shopName
         FROM cm_shop_order cop
                  left join shop p on cop.shopID = p.shopID

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

@@ -220,7 +220,7 @@
         SELECT id FROM cm_promotions_order WHERE orderId = #{orderId} LIMIT 1
     </select>
     <select id="getDbPaySuccessCounter" resultType="java.lang.Integer">
-        SELECT paySuccessCounter FROM cm_shop_order
+        SELECT ifnull(paySuccessCounter,0) FROM cm_shop_order
         WHERE shopOrderID = #{shopOrderId} AND delFlag = '0'
     </select>
 
@@ -369,11 +369,6 @@
     <select id="getOrderId" resultType="java.lang.Integer">
         select orderId from cm_shop_order where shopOrderID = #{shopOrderId}
     </select>
-    <select id="getSplitCodeByMbOrderId" resultType="java.lang.String">
-        select cso.splitCode from cm_shop_order cso
-            left join cm_receipt_order_relation cror on cso.shopOrderID = cror.shopOrderId
-        where cror.orderRequestNo = #{mbOrderId}
-    </select>
     <select id="findB2BBankCode" resultType="com.caimei365.order.model.vo.BankCodeVo">
         select id, bankName, B2B, bankLogo, delFlag
         from cm_bankcode
@@ -388,4 +383,7 @@
           and B2C != ''
           and delFlag = 0
     </select>
+    <select id="getSplitCodeByShopOrderId" resultType="java.lang.String">
+        select splitCode from cm_shop_order where shopOrderID = #{shopOrderId}
+    </select>
 </mapper>

+ 20 - 0
src/main/resources/mapper/SubmitMapper.xml

@@ -245,4 +245,24 @@
           and orderTime <![CDATA[ > ]]> #{orderTime}
           and userID = #{userId}
     </select>
+    <select id="findShops" resultType="com.caimei365.order.model.po.OrderShopPo">
+        SELECT DISTINCT
+            s.shopID AS shopId,
+            p.splitCode
+        FROM shop s
+        LEFT JOIN product p ON p.shopID = s.shopID
+        WHERE p.productID IN
+        <foreach collection="productIdList" open="(" separator="," close=")" item="productId">
+            #{productId}
+        </foreach>
+        GROUP BY s.shopID,p.splitCode
+    </select>
+    <select id="findSplitResult" resultType="java.lang.Integer">
+        SELECT COUNT(*) FROM product
+        WHERE productId IN
+        <foreach collection="productIdList" open="(" separator="," close=")" item="productId">
+            #{productId}
+        </foreach>
+        AND (splitcode IS NULL OR splitcode ='')
+    </select>
 </mapper>

+ 6 - 0
src/test/java/com/caimei365/order/OrderApplicationTests.java

@@ -2,9 +2,13 @@
 //
 //import com.alibaba.fastjson.JSON;
 //import com.alibaba.fastjson.JSONObject;
+//import com.caimei365.order.mapper.SubmitMapper;
+//import com.caimei365.order.model.po.OrderShopPo;
+//import com.caimei365.order.model.vo.ShopOrderVo;
 //import org.junit.jupiter.api.Test;
 //import org.springframework.boot.test.context.SpringBootTest;
 //
+//import javax.annotation.Resource;
 //import java.io.IOException;
 //import java.io.InputStream;
 //import java.lang.reflect.Type;
@@ -19,6 +23,8 @@
 // */
 //@SpringBootTest
 //class OrderApplicationTests {
+//    @Resource
+//    private SubmitMapper submitMapper;
 //
 //    @Test
 //    void contextLoads() throws IOException {