Explorar o código

合利宝手动分账

zhijiezhao %!s(int64=3) %!d(string=hai) anos
pai
achega
58e2787d34

+ 5 - 0
pom.xml

@@ -110,6 +110,11 @@
 			<artifactId>commons-httpclient</artifactId>
 			<version>3.1</version>
 		</dependency>
+		<dependency>
+			<groupId>com.squareup.okhttp3</groupId>
+			<artifactId>okhttp</artifactId>
+			<version>3.8.1</version>
+		</dependency>
 		<!-- SPRING begin -->
 		<dependency>
 			<groupId>org.springframework</groupId>

+ 5 - 1
src/main/java/com/caimei/modules/order/dao/NewOrderDao.java

@@ -205,7 +205,7 @@ public interface NewOrderDao extends CrudDao<NewOrder> {
 
     Double getOrderProductPaidAmount(Integer orderProductId);
 
-    List<ShopOrderVo> getShopOrderListByOrderId(Integer orderId);
+    ShopOrderVo getShopOrderListByOrderId(Integer shopOrderId);
 
     Double getPaidShipping(Integer orderId, Integer shopId);
 
@@ -216,4 +216,8 @@ public interface NewOrderDao extends CrudDao<NewOrder> {
     void insertSplitAccount(SplitAccountPo splitAccount);
 
     Date findSplitTime();
+
+    Integer findSupport(Integer shopOrderId);
+
+    List<OrderProductVo> getOrderProductByShopOrderId(Integer shopOrderId);
 }

+ 197 - 0
src/main/java/com/caimei/modules/order/entity/AccountPayOrder.java

@@ -0,0 +1,197 @@
+package com.caimei.modules.order.entity;
+
+
+import org.apache.commons.lang3.StringUtils;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Set;
+
+public class AccountPayOrder {
+
+    private String P1_bizType;
+    private String P2_signType;
+    private String P3_timestamp;
+    private String P4_orderId;
+    private String P5_customerNumber;
+    private String P6_ext;
+
+    public String getP1_bizType() {
+        return P1_bizType;
+    }
+
+    public void setP1_bizType(String p1_bizType) {
+        P1_bizType = p1_bizType;
+    }
+
+    public String getP2_signType() {
+        return P2_signType;
+    }
+
+    public void setP2_signType(String p2_signType) {
+        P2_signType = p2_signType;
+    }
+
+    public String getP3_timestamp() {
+        return P3_timestamp;
+    }
+
+    public void setP3_timestamp(String p3_timestamp) {
+        P3_timestamp = p3_timestamp;
+    }
+
+    public String getP4_orderId() {
+        return P4_orderId;
+    }
+
+    public void setP4_orderId(String p4_orderId) {
+        P4_orderId = p4_orderId;
+    }
+
+    public String getP5_customerNumber() {
+        return P5_customerNumber;
+    }
+
+    public void setP5_customerNumber(String p5_customerNumber) {
+        P5_customerNumber = p5_customerNumber;
+    }
+
+
+    public String getP6_ext() {
+        return P6_ext;
+    }
+
+    public void setP6_ext(String p6_ext) {
+        P6_ext = p6_ext;
+    }
+
+    public static class AccountPayOrderExt {
+        // 订单类型
+        private AccountPayOrderType orderType;
+        // 收款商编
+        private String inMerchantNo;
+        // 金额
+        private BigDecimal amount;
+        // 回调地址
+        private String serverCallbackUrl;
+        // 商品名称
+        private String goodsName;
+        // 商品描述(可选)
+        private String orderDesc;
+        /**
+         * 以下两项在补贴场景下必填
+         **/
+        private ProductType productType;
+        // 原收单订单号
+        private String associatedOrderNo;
+        // 分账规则串 - 仅支持资金划拨类订单
+        private List<SplitBillRule> splitBillRules;
+        // 是否为担保交易
+        private boolean inEscrow = false;
+
+
+        public AccountPayOrderType getOrderType() {
+            return orderType;
+        }
+
+        public void setOrderType(AccountPayOrderType orderType) {
+            this.orderType = orderType;
+        }
+
+        public BigDecimal getAmount() {
+            return amount;
+        }
+
+        public void setAmount(BigDecimal amount) {
+            this.amount = amount;
+        }
+
+        public String getServerCallbackUrl() {
+            return serverCallbackUrl;
+        }
+
+        public void setServerCallbackUrl(String serverCallbackUrl) {
+            this.serverCallbackUrl = StringUtils.isEmpty(serverCallbackUrl) ? null : serverCallbackUrl;
+        }
+
+        public String getGoodsName() {
+            return goodsName;
+        }
+
+        public void setGoodsName(String goodsName) {
+            this.goodsName = goodsName;
+        }
+
+        public String getOrderDesc() {
+            return orderDesc;
+        }
+
+        public void setOrderDesc(String orderDesc) {
+            this.orderDesc = orderDesc;
+        }
+
+        public ProductType getProductType() {
+            return productType;
+        }
+
+        public void setProductType(ProductType productType) {
+            this.productType = productType;
+        }
+
+        public String getAssociatedOrderNo() {
+            return associatedOrderNo;
+        }
+
+        public void setAssociatedOrderNo(String associatedOrderNo) {
+            this.associatedOrderNo = associatedOrderNo;
+        }
+
+        public String getInMerchantNo() {
+            return inMerchantNo;
+        }
+
+        public void setInMerchantNo(String inMerchantNo) {
+            this.inMerchantNo = inMerchantNo;
+        }
+
+        public List<SplitBillRule> getSplitBillRules() {
+            return splitBillRules;
+        }
+
+        public void setSplitBillRules(List<SplitBillRule> splitBillRules) {
+            this.splitBillRules = splitBillRules;
+        }
+
+        public boolean isInEscrow() {
+            return inEscrow;
+        }
+
+        public void setInEscrow(boolean inEscrow) {
+            this.inEscrow = inEscrow;
+        }
+
+        public static class SplitBillRule {
+            private String splitBillMerchantNo; // 收账商编
+            private BigDecimal splitBillAmount; // 分账金额
+
+            public String getSplitBillMerchantNo() {
+                return splitBillMerchantNo;
+            }
+
+            public void setSplitBillMerchantNo(String splitBillMerchantNo) {
+                this.splitBillMerchantNo = splitBillMerchantNo;
+            }
+
+            public BigDecimal getSplitBillAmount() {
+                return splitBillAmount;
+            }
+
+            public void setSplitBillAmount(BigDecimal splitBillAmount) {
+                this.splitBillAmount = splitBillAmount;
+            }
+        }
+
+
+    }
+
+}

+ 28 - 0
src/main/java/com/caimei/modules/order/entity/AccountPayOrderType.java

@@ -0,0 +1,28 @@
+package com.caimei.modules.order.entity;
+
+public enum AccountPayOrderType {
+
+    ALLOWANCE("活动补贴", 1),
+
+    TRANSFER("资金划拨", 2),
+
+
+    ;
+
+    private final String desc;
+    private final Integer index;
+
+
+    AccountPayOrderType(String desc, Integer index) {
+        this.desc = desc;
+        this.index = index;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+    public Integer getIndex() {
+        return index;
+    }
+}

+ 52 - 0
src/main/java/com/caimei/modules/order/entity/Constant.java

@@ -0,0 +1,52 @@
+package com.caimei.modules.order.entity;
+
+
+/**
+ * 常量类
+ *
+ * @author Administrator
+ */
+public class Constant {
+
+    public static final String prodSplit = "https://core.caimei365.com/order/pay/delay/split/callback";
+
+    public static final String betaSplit = "https://core-b.caimei365.com/order/pay/delay/split/callback";
+
+    //专票 信息 测试佣金暂入信息  308785626@qq.com vip/二手暂入信息
+    public static final String CUSTOMERNUM = "E1807059160";
+    //信息的邮箱
+    public static final String XX_MAIL = "308785626@qq.com";
+
+    //收款商编 网络   xun.zhang@caimei365.com
+    public static final String CUSTOMERNUM2 = "E1807062884";
+    //网络的邮箱
+    public static final String WL_MAIL = "xun.zhang@caimei365.com";
+
+    //普票 奥泰 测试私账暂进奥泰   caimei365@yeah.net
+    public static final String CUSTOMERNUM3 = "E1807085606";
+
+    public static final String AT_MAIL = "caimei365@yeah.net";
+
+    public static final String SPLIT = "&";
+
+    public static final String DOMAIN_NAME = "http://pay.trx.helipay.com/";
+    //网银地址http://pay.trx.helipay.com/trx/online/interface.action
+    public static final String YL = "http://pay.trx.helipay.com/trx/online/interface.action";
+    //分账地址
+    public static final String FZ = "http://pay.trx.helipay.com/trx/accountPay/interface.action";
+
+    //微信/支付宝扫码/小程序公众号支付
+    public static final String SAOMA = "1iHnZaalUNAVcfcbKdh6n86Z0yUHtM6f";
+    //网银
+    public static final String WANGYIN = "CZiCbGrgFYQMldVkQnzbFQeQkn6mp25w";
+    //虚拟账户支付
+    public static final String XUNI = "8VmdRSXMIOfUo7aEq1iYs2XEWgGZpBQc";
+    //分账
+    public static final String FENZHANG = "2hATS0A4IoxdudGxNkGRNOt6aFSdOd8Q";
+
+    /**
+     * 扫码接口地址
+     */
+    public static final String REQUEST_URL = DOMAIN_NAME + "trx/app/interface.action";
+
+}

+ 1 - 1
src/main/java/com/caimei/modules/order/entity/OrderReceiptRelationPo.java

@@ -70,7 +70,7 @@ public class OrderReceiptRelationPo implements Serializable {
     /**
      * 付款类型:1建设银行7297、2广发银行0115、3中信银行7172、4中信银行0897、5中信银行0897-财付通、6中信银行0897-支付宝、
      * 7线上-支付宝、8线上-微信支付、9线上-快钱支付、10口头返佣、11广发银行5461、12PC-B2B网银、13PC-微信支付、14PC-支付宝、
-     * 15小程序-微信支付、16余额抵扣、20银联转账
+     * 15小程序-微信支付、16余额抵扣、20建设银行3346
      */
     private Integer payType;
     /**

+ 12 - 0
src/main/java/com/caimei/modules/order/entity/PayParamBo.java

@@ -41,6 +41,10 @@ public class PayParamBo implements Serializable {
      * 支付金额,单位分,必须大于2
      */
     private Integer payAmount;
+    /**
+     * double支付金额,单位元
+     */
+    private Double AllPay;
     /**
      * 支付方式,
      * 银联:UNIONPAY,
@@ -98,6 +102,14 @@ public class PayParamBo implements Serializable {
         return serialVersionUID;
     }
 
+    public Double getAllPay() {
+        return AllPay;
+    }
+
+    public void setAllPay(Double allPay) {
+        AllPay = allPay;
+    }
+
     public Integer getUserId() {
         return userId;
     }

+ 21 - 0
src/main/java/com/caimei/modules/order/entity/ProductType.java

@@ -0,0 +1,21 @@
+package com.caimei.modules.order.entity;
+
+public enum ProductType {
+
+    APPPAY("扫码"),
+    ONLINE("网银"),
+    QUICKPAY("快捷"),
+
+
+
+    ;
+    private final String desc;
+
+    ProductType(String desc) {
+        this.desc = desc;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+}

+ 12 - 0
src/main/java/com/caimei/modules/order/entity/ShopOrderVo.java

@@ -189,6 +189,18 @@ public class ShopOrderVo implements Serializable {
      * 返佣订单关联页面展示用
      */
     private OrderVo mainOrder;
+    /**
+     * 子订单绑定的付款商户号
+     */
+    private String splitCode;
+
+    public String getSplitCode() {
+        return splitCode;
+    }
+
+    public void setSplitCode(String splitCode) {
+        this.splitCode = splitCode;
+    }
 
     public static long getSerialVersionUID() {
         return serialVersionUID;

+ 12 - 0
src/main/java/com/caimei/modules/order/entity/SplitAccountPo.java

@@ -18,6 +18,10 @@ public class SplitAccountPo implements Serializable {
      * 主订单id
      */
     private Integer orderId;
+    /**
+     * 子订单Id
+     */
+    private Integer shopOrderId;
     /**
      * 商品id,仅对二手发布商品
      */
@@ -79,6 +83,14 @@ public class SplitAccountPo implements Serializable {
         return serialVersionUID;
     }
 
+    public Integer getShopOrderId() {
+        return shopOrderId;
+    }
+
+    public void setShopOrderId(Integer shopOrderId) {
+        this.shopOrderId = shopOrderId;
+    }
+
     public Integer getId() {
         return id;
     }

+ 182 - 128
src/main/java/com/caimei/modules/order/service/SplitAccountService.java

@@ -9,6 +9,7 @@ import com.caimei.modules.order.utils.PayUtil;
 import com.caimei.redis.RedisService;
 import com.caimei.utils.MathUtil;
 import com.thinkgem.jeesite.common.persistence.Page;
+import okhttp3.*;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -16,18 +17,26 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+import java.io.IOException;
+import java.lang.reflect.Field;
 import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 
 @Service
 @Transactional(readOnly = true)
 public class SplitAccountService {
 
+    public static OkHttpClient client = new OkHttpClient.Builder()
+            .connectTimeout(3, TimeUnit.SECONDS)
+            .readTimeout(20, TimeUnit.SECONDS)
+            .build();
     /**
      * 日志对象
      */
-    protected Logger logger = LoggerFactory.getLogger(getClass());
+    private static Logger logger = LoggerFactory.getLogger(Logger.class);
 
     @Resource
     private NewOrderDao newOrderDao;
@@ -47,10 +56,10 @@ public class SplitAccountService {
             for (OrderReceiptRelationPo orderRelation : orderRelations) {
                 logger.info("【分账】>>>>>>>>>>子订单id:" + orderRelation.getShopOrderId() + "进入分账");
                 // 收款对应的订单信息
-                OrderVo order = orderCommonMapper.getOrderByOrderId(orderRelation.getOrderId());
+                ShopOrderVo shopOrder = newOrderDao.getShopOrderListByOrderId(orderRelation.getShopOrderId());
                 PayParamBo payParam = new PayParamBo();
                 //支付金额
-                payParam.setPayAmount(MathUtil.mul(orderRelation.getAssociateAmount(), 100).intValue());
+                payParam.setAllPay(orderRelation.getAssociateAmount());
                 if (12 == orderRelation.getPayType()) {
                     // 网银支付
                     payParam.setPayWay("UNIONPAY");
@@ -63,55 +72,26 @@ public class SplitAccountService {
                 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();
+                List<SplitAccountPo> splitBillDetail = setSplitAccountDetail(shopOrder, payParam);
+                HashMap<String, BigDecimal> sbm = new HashMap<>();
+                for (SplitAccountPo splitAccountPo : splitBillDetail) {
+                    String subUserNo = splitAccountPo.getSubUserNo();
+                    if(sbm.containsKey(subUserNo)){
+                        BigDecimal v = MathUtil.add(sbm.get(subUserNo), splitAccountPo.getSplitAccount());
+                        sbm.put(subUserNo,v);
+                    }else{
+                        sbm.put(subUserNo,BigDecimal.valueOf(splitAccountPo.getSplitAccount()));
                     }
                 }
                 ArrayList<AccountPayOrder.AccountPayOrderExt.SplitBillRule> splitBillRules = new ArrayList<>();
-                if (MathUtil.compare(totalAmount1, 0.01) > 0) {
+                sbm.forEach((key, value) -> {
                     AccountPayOrder.AccountPayOrderExt.SplitBillRule splitBillRule = new AccountPayOrder.AccountPayOrderExt.SplitBillRule();
-                    splitBillRule.setSplitBillAmount(totalAmount1);
-                    splitBillRule.setSplitBillMerchantNo(sp1);
+                    splitBillRule.setSplitBillAmount(value);
+                    splitBillRule.setSplitBillMerchantNo(key);
                     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);
-                }
+                });
+                // 自己的不分
+                splitBillRules.removeIf(s->s.getSplitBillMerchantNo().equals(shopOrder.getSplitCode()));
                 //第三方分账接口
                 try {
                     AccountPayOrder accountPayOrder = new AccountPayOrder();
@@ -122,65 +102,65 @@ public class SplitAccountService {
                     String substring = format1.substring(20);
                     // fz+当前微秒时间+原唯一订单号
                     accountPayOrder.setP4_orderId("FZ" + substring + orderRelation.getOrderRequestNo());
-                    //todo 付款账户商编暂用网络
-                    accountPayOrder.setP5_customerNumber(Constant.CUSTOMERNUM2);
+                    //付款账户子订单绑定商户号
+                    accountPayOrder.setP5_customerNumber(shopOrder.getSplitCode());
                     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.setServerCallbackUrl(Constant.betaSplit);
                     accountPayOrderExt.setGoodsName("分账");
-
                     if (null != splitBillRules && splitBillRules.size() > 0) {
                         accountPayOrderExt.setSplitBillRules(splitBillRules);
                     }
                     String ext = JSON.toJSONString(accountPayOrderExt);
-                    log.info("分账规则串json串:" + ext);
+                    logger.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);
+                    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 = convertBean(accountPayOrder);
-                    log.info("--------------------> 发送分账参数:  " + bean);
+                    logger.info("--------------------> 发送分账参数:  " + bean);
                     Map<String, String> map = postForm(bean, Constant.FZ, sign, Map.class);
-                    log.info("----------------分账返回数据: " + map.toString());
+                    logger.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);
+                            logger.info("【手动分账】>>>>>>>>>>手动分账失败>>>>>>>msg:" + msg);
                         } else {
                             for (SplitAccountPo splitAccount : splitBillDetail) {
                                 splitAccount.setMbOrderId(orderRelation.getMbOrderId());
                                 splitAccount.setOrderRequestNo(substring + orderRelation.getOrderRequestNo());
                                 splitAccount.setPayStatus(1);
                                 // 保存分账详情
-                                payOrderMapper.insertSplitAccount(splitAccount);
+                                newOrderDao.insertSplitAccount(splitAccount);
                             }
-                            log.info("【延时分账】>>>>>>>>>>此订单分账结束");
+                            redisService.remove("XSFZMDS");
+                            logger.info("【手动分账】>>>>>>>>>>此订单分账结束");
                         }
                     }
                 } catch (Exception e) {
-                    log.error("【延时分账】>>>>>>>>>>错误信息", e);
+                    logger.error("【手动分账】>>>>>>>>>>错误信息", e);
+                }
                 }
-
             }
         }
-    }
 
-    private List<SplitAccountPo> setSplitAccountDetail(OrderVo order, PayParamBo payParam) {
+
+    private List<SplitAccountPo> setSplitAccountDetail(ShopOrderVo shopOrder, PayParamBo payParam) {
         List<SplitAccountPo> list = new ArrayList<>();
         // 本次支付金额,单位/元
-        double payAmount = MathUtil.div(payParam.getPayAmount(), 100).doubleValue();
+        double payAmount = payParam.getAllPay();
         // 待分账总金额
         double splitAmount = payAmount;
         // 总手续费
@@ -204,19 +184,21 @@ public class SplitAccountService {
         if (MathUtil.compare(procedureFee, 0.01) <= 0) {
             procedureFee = 0.01;
         }
+        //手续费承担方 线上支付手续费:默认1采美承担,2供应商承担
+        Integer supportFlag = newOrderDao.findSupport(shopOrder.getShopOrderId());
         //减去收款手续费
         splitAmount = MathUtil.sub(splitAmount, procedureFee).doubleValue();
-        //分账手续费0.1%
-        Double amount = Math.max(MathUtil.mul(splitAmount, 0.001, 2).doubleValue(), 0.01);
-        splitAmount = MathUtil.sub(splitAmount, amount).doubleValue();
-        if (splitAmount <= 0) {
-            return null;
-        }
+
         // 商品数据
-        List<OrderProductVo> orderProductList = orderCommonMapper.getOrderProductByOrderId(order.getOrderId());
+        List<OrderProductVo> orderProductList = newOrderDao.getOrderProductByShopOrderId(shopOrder.getShopOrderId());
+
         for (OrderProductVo orderProduct : orderProductList) {
             //成本价*数量
             double costPrice = MathUtil.mul(orderProduct.getCostPrice(), orderProduct.getNum()).doubleValue();
+            if (2 == supportFlag) {
+                //供应商自己承担手续费
+                costPrice = MathUtil.sub(costPrice, procedureFee).doubleValue();
+            }
             // 不含税能开发票
             if (Integer.valueOf(0).equals(orderProduct.getIncludedTax()) && !Integer.valueOf(3).equals(orderProduct.getInvoiceType())) {
                 //应付总税费
@@ -225,80 +207,153 @@ public class SplitAccountService {
                 costPrice = MathUtil.add(costPrice, payableTax).doubleValue();
             }
             // 判断是否支付过
-            Double paidAmount = payOrderMapper.getOrderProductPaidAmount(orderProduct.getOrderProductId());
+            Double paidAmount = newOrderDao.getOrderProductPaidAmount(orderProduct.getOrderProductId());
             // 支付过金额大于0
-            if (paidAmount != null && MathUtil.compare(paidAmount, 0) > 0) {
-                //成本-支付过的金额
+            //有已付
+            if (null != paidAmount && MathUtil.compare(paidAmount, 0) > 0) {
+                //已付>0,成本-已付
                 costPrice = MathUtil.sub(costPrice, paidAmount).doubleValue();
             }
-            // 没支付过或者支付过的金额-成本<0(成本还没分够)
-            if (paidAmount == null || MathUtil.compare(paidAmount, costPrice) < 0) {
-                // 待分账金额>=本次待分账金额(还要分账的成本)
-                if (MathUtil.compare(splitAmount, costPrice) > 0) {
-                    // 待分账金额=待分账金额-成本
-                    splitAmount = MathUtil.sub(splitAmount, costPrice).doubleValue();
-                } else {
-                    // 待分账金额小于成本
-                    costPrice = splitAmount;
-                    splitAmount = 0.00;
+            // 待分账金额>成本
+            if (MathUtil.compare(splitAmount, costPrice) > 0) {
+                // 待分账金额-成本
+                splitAmount = MathUtil.sub(splitAmount, costPrice).doubleValue();
+            } else {
+                costPrice = splitAmount;
+                splitAmount = 0.00;
+            }
+            if (costPrice > 0) {
+                SplitAccountPo splitAccount = new SplitAccountPo();
+                splitAccount.setShopOrderId(shopOrder.getShopOrderId());
+                splitAccount.setOrderId(shopOrder.getOrderId());
+                splitAccount.setOrderProductId(orderProduct.getOrderProductId());
+                splitAccount.setShopId(orderProduct.getShopId());
+                splitAccount.setSplitAccount(costPrice);
+                splitAccount.setProductType(1);
+                if (StringUtils.isNotBlank(orderProduct.getSplitCode())) {
+                    // 该商品设置了商户号
+                    splitAccount.setType(4);
+                    splitAccount.setSubUserNo(orderProduct.getSplitCode());
                 }
+                logger.info("成本分账参数------------->" + splitAccount.toString());
+                list.add(splitAccount);
+            }
+            if (MathUtil.compare(splitAmount, 0) == 0) {
+                break;
             }
-
         }
-
         // 还有钱就付供应商运费
         // 付供应商运费,是以供应商为单位的
         if (MathUtil.compare(splitAmount, 0) > 0) {
-            List<ShopOrderVo> shopOrderList = orderCommonMapper.getShopOrderListByOrderId(order.getOrderId());
-            for (ShopOrderVo shopOrder : shopOrderList) {
-                // 运费
-                Double shopPostFee = shopOrder.getShopPostFee();
-                if (MathUtil.compare(shopPostFee, 0) > 0) {
-                    // 查询已支付运费
-                    Double shipping = payOrderMapper.getPaidShipping(order.getOrderId(), shopOrder.getShopId());
-                    shopPostFee = MathUtil.sub(shopPostFee, shipping).doubleValue();
-                    if (MathUtil.compare(splitAmount, shopPostFee) > -1) {
-                        //减去运费
-                        splitAmount = MathUtil.sub(splitAmount, shopPostFee).doubleValue();
-                    } else {
-                        //钱不够运费就分剩余
-                        shopPostFee = splitAmount;
-                        splitAmount = 0.00;
-                    }
-                    //todo 暂不考虑供应商有商户号,有分给供应商,没有进私账
-                    SplitAccountPo splitAccount = new SplitAccountPo();
-                    splitAccount.setOrderId(order.getOrderId());
-                    splitAccount.setShopId(shopOrder.getShopId());
-                    splitAccount.setSplitAccount(shopPostFee);
-                    splitAccount.setProductType(2);
-                    splitAccount.setType(2);
-                    //todo 私账-无票,子商户商编 测试暂入奥泰
-                    splitAccount.setSubUserNo(CUSTOMERNUM3);
-                    if (splitAccount.getSplitAccount() > 0) {
-                        log.info("============设置付供应商运费分账详情对象: " + splitAccount.toString());
-                        list.add(splitAccount);
-                    }
+            // 运费
+            Double shopPostFee = shopOrder.getShopPostFee();
+            if (MathUtil.compare(shopPostFee, 0) > 0) {
+                // 查询已支付运费
+                Double shipping = newOrderDao.getPaidShipping(shopOrder.getOrderId(), shopOrder.getShopId());
+                shopPostFee = MathUtil.sub(shopPostFee, shipping).doubleValue();
+                if (MathUtil.compare(splitAmount, shopPostFee) > -1) {
+                    splitAmount = MathUtil.sub(splitAmount, shopPostFee).doubleValue();
+                } else {
+                    shopPostFee = splitAmount;
+                    splitAmount = 0.00;
                 }
+                SplitAccountPo splitAccount = new SplitAccountPo();
+                splitAccount.setOrderId(shopOrder.getOrderId());
+                splitAccount.setShopId(shopOrder.getShopId());
+                splitAccount.setSplitAccount(shopPostFee);
+                splitAccount.setProductType(2);
+                if (StringUtils.isNotBlank(shopOrder.getSplitCode())) {
+                    //供应商拥有子商户号
+                    splitAccount.setType(4);
+                    splitAccount.setSubUserNo(shopOrder.getSplitCode());
+                }
+                logger.info("付供应商运费分账参数------------->" + splitAccount);
+                list.add(splitAccount);
             }
         }
         // 如果还有钱则为佣金,分到采美网络
         if (MathUtil.compare(splitAmount, 0) > 0) {
+            //分账手续费0.1%采美承担,佣金扣除0.1%
+            Double amount = Math.max(MathUtil.mul(splitAmount, 0.001, 2).doubleValue(), 0.01);
+            splitAmount = MathUtil.sub(splitAmount, amount).doubleValue();
             SplitAccountPo splitAccount = new SplitAccountPo();
-            splitAccount.setOrderId(order.getOrderId());
+            splitAccount.setOrderId(shopOrder.getOrderId());
+            splitAccount.setShopOrderId(shopOrder.getShopOrderId());
             splitAccount.setSplitAccount(splitAmount);
             splitAccount.setProductType(3);
             splitAccount.setType(5);
-            //todo 佣金应入采美网络,测试暂入信息
             splitAccount.setSubUserNo(Constant.CUSTOMERNUM);
-            if (splitAccount.getSplitAccount() > 0) {
-                log.info("============设置佣金分账详情对象: " + splitAccount.toString());
-                list.add(splitAccount);
-            }
+            logger.info("佣金分账参数------------->" + splitAccount);
+            list.add(splitAccount);
         }
         return list;
     }
 
+    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 {
+                logger.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")) {
+            logger.error("error: " + res.getString("rt6_retMsg"));
+        }
+        /** rt4_success 为 true,需验签  **/
+        return res.toJavaObject(clazz);
+    }
+
+    public static Map<String, String> convertBean(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) {
+            logger.info("分账", e);
+            throw new IllegalStateException("分账异常", e);
+        }
+    }
+}
 
 //    //正式
 ////    public static final String callUrl = "https://core.caimei365.com/order/pay/delay/split/callback";
@@ -532,4 +587,3 @@ public class SplitAccountService {
 //        return list;
 //    }
 
-}

+ 64 - 4
src/main/resources/mappings/modules/order/OrderMapper.xml

@@ -972,10 +972,11 @@
                cror.mbOrderId,
                cror.orderRequestNo,
                cror.splitStatus,
+               cror.shopOrderId,
                cdr.payType
         FROM cm_receipt_order_relation cror
-                 LEFT JOIN cm_discern_receipt cdr ON cror.receiptID = cdr.id
-                 LEFT JOIN cm_order co ON cror.orderID = co.orderID
+        LEFT JOIN cm_discern_receipt cdr ON cror.receiptID = cdr.id
+        LEFT JOIN cm_order co ON cror.orderID = co.orderID
         WHERE cror.relationType = 2
           AND cror.delFlag = 0
           AND cror.mbOrderId IS NOT NULL
@@ -1103,10 +1104,11 @@
                orderSubmitType,
                payStatus,
                sendOutStatus,
-               splitFlag
+               splitFlag,
+               splitCode
         FROM cm_shop_order
         WHERE delFlag = 0
-          AND orderID = #{orderId}
+          AND shopOrderID = #{shopOrderId}
     </select>
 
     <select id="getPaidShipping" resultType="java.lang.Double">
@@ -1182,6 +1184,64 @@
           AND splitTime > DATE_ADD(NOW(), INTERVAL -2 MINUTE)
         LIMIT 1
     </select>
+    <select id="findSupport" resultType="java.lang.Integer">
+        SELECT s.chargeSupport FROM shop s
+        LEFT JOIN cm_shop_order cso ON cso.shopId= s.shopId
+        WHERE cso.shopOrderId=25059
+    </select>
+    <select id="getOrderProductByShopOrderId" resultType="com.caimei.modules.order.entity.OrderProductVo">
+        SELECT cop.orderProductID                                                 AS orderProductId,
+               cop.orderID                                                        AS orderId,
+               cop.orderNo,
+               cop.shopOrderID                                                    AS shopOrderId,
+               cop.shopOrderNo,
+               cop.orderPromotionsId,
+               cop.productId,
+               cop.shopId,
+               cop.name,
+               cop.productImage                                                   AS image,
+               cop.price,
+               cop.shopName,
+               IF(cop.shopid = 998 AND co.freight > 0, co.freight, 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
+        FROM cm_order_product cop
+        LEFT JOIN product p ON cop.productID = p.productID
+        left join cm_order co on co.orderID = cop.orderID
+        WHERE cop.shopOrderID = #{shopOrderId}
+          AND IF(co.userBeans = 0, 1 = 1, cop.shopid != 998)
+        ORDER BY cop.discountPrice DESC
+    </select>
 
     <insert id="insertSplitAccount">
         INSERT INTO cm_split_account (orderId, productId, orderProductId, shopId, couponRecordId, vipRecordId,

+ 1 - 1
src/main/webapp/WEB-INF/views/modules/product-new/cmNewProductForm.jsp

@@ -544,7 +544,7 @@
         <tr>
             <th>线上分账账号:</th>
             <td colspan="3">
-                <form:input path="splitCode" type="text" id="splitCode" maxlength="10"/>
+                <form:input path="splitCode" type="text" id="splitCode" maxlength="15"/>
             </td>
         </tr>
         <tr id="taxPointDiv">

+ 1 - 1
src/main/webapp/WEB-INF/views/modules/product-new/productEdit.jsp

@@ -499,7 +499,7 @@
         <tr>
             <th>线上分账账号:</th>
             <td colspan="3">
-                <form:input path="splitCode" type="text" id="splitCode" maxlength="10"/>
+                <form:input path="splitCode" type="text" id="splitCode" maxlength="15"/>
             </td>
         </tr>
         <tr id="taxPointDiv">

+ 1 - 1
src/main/webapp/WEB-INF/views/modules/product/cmSecondHandDetailForm.jsp

@@ -409,7 +409,7 @@
     <div class="control-group">
         <label class="control-label">线上分账账号:</label>
         <div class="controls">
-            <form:input path="splitCode" value="${cmSecondHandDetail.splitCode}" type="text" maxlength="10"/>
+            <form:input path="splitCode" value="${cmSecondHandDetail.splitCode}" type="text" maxlength="15"/>
         </div>
     </div>
     <div class="control-group">