zhijiezhao преди 3 години
родител
ревизия
e29ceb12a9

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

@@ -35,6 +35,10 @@ public class OrderReceiptRelationPo implements Serializable {
      * 订单Id(relationType值为1是为子订单ID,为2时为主订单ID)
      * 订单Id(relationType值为1是为子订单ID,为2时为主订单ID)
      */
      */
     private Integer orderId;
     private Integer orderId;
+    /**
+     * 子订单id
+     */
+    private Integer shopOrderId;
     /**
     /**
      *  超级会员购买记录Id
      *  超级会员购买记录Id
      */
      */
@@ -74,6 +78,14 @@ public class OrderReceiptRelationPo implements Serializable {
      */
      */
     private Integer productId;
     private Integer productId;
 
 
+    public Integer getShopOrderId() {
+        return shopOrderId;
+    }
+
+    public void setShopOrderId(Integer shopOrderId) {
+        this.shopOrderId = shopOrderId;
+    }
+
     public static long getSerialVersionUID() {
     public static long getSerialVersionUID() {
         return serialVersionUID;
         return serialVersionUID;
     }
     }

+ 406 - 139
src/main/java/com/caimei/modules/order/service/SplitAccountService.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
 import com.caimei.modules.order.dao.NewOrderDao;
 import com.caimei.modules.order.dao.NewOrderDao;
 import com.caimei.modules.order.entity.*;
 import com.caimei.modules.order.entity.*;
+import com.caimei.modules.order.utils.Disguiser;
 import com.caimei.modules.order.utils.PayUtil;
 import com.caimei.modules.order.utils.PayUtil;
 import com.caimei.redis.RedisService;
 import com.caimei.redis.RedisService;
 import com.caimei.utils.MathUtil;
 import com.caimei.utils.MathUtil;
@@ -15,6 +16,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
+import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.*;
 
 
@@ -27,16 +29,10 @@ public class SplitAccountService {
      */
      */
     protected Logger logger = LoggerFactory.getLogger(getClass());
     protected Logger logger = LoggerFactory.getLogger(getClass());
 
 
-    @Resource
-    private RedisService redisService;
-
-    //正式
-//    public static final String callUrl = "https://core.caimei365.com/order/pay/delay/split/callback";
-    //测试
-    public static final String callUrl = "https://core-b.caimei365.com/order/pay/delay/split/callback";
-
     @Resource
     @Resource
     private NewOrderDao newOrderDao;
     private NewOrderDao newOrderDao;
+    @Resource
+    private RedisService redisService;
 
 
     @Transactional(readOnly = false)
     @Transactional(readOnly = false)
     public void SplitAccount() {
     public void SplitAccount() {
@@ -49,113 +45,138 @@ public class SplitAccountService {
         List<OrderReceiptRelationPo> orderRelations = newOrderDao.getUndividedPaidReceipt(currentTime);
         List<OrderReceiptRelationPo> orderRelations = newOrderDao.getUndividedPaidReceipt(currentTime);
         if (null != orderRelations && orderRelations.size() > 0) {
         if (null != orderRelations && orderRelations.size() > 0) {
             for (OrderReceiptRelationPo orderRelation : orderRelations) {
             for (OrderReceiptRelationPo orderRelation : orderRelations) {
-                logger.info("【手动分账】>>>>>>>>>>订单id:" + orderRelation.getOrderId() + ",进入手动分账");
+                logger.info("【分账】>>>>>>>>>>订单id:" + orderRelation.getShopOrderId() + "进入分账");
                 // 收款对应的订单信息
                 // 收款对应的订单信息
-                OrderVo order = newOrderDao.getOrderByOrderId(orderRelation.getOrderId());
+                OrderVo order = orderCommonMapper.getOrderByOrderId(orderRelation.getOrderId());
                 PayParamBo payParam = new PayParamBo();
                 PayParamBo payParam = new PayParamBo();
+                //支付金额
                 payParam.setPayAmount(MathUtil.mul(orderRelation.getAssociateAmount(), 100).intValue());
                 payParam.setPayAmount(MathUtil.mul(orderRelation.getAssociateAmount(), 100).intValue());
                 if (12 == orderRelation.getPayType()) {
                 if (12 == orderRelation.getPayType()) {
                     // 网银支付
                     // 网银支付
                     payParam.setPayWay("UNIONPAY");
                     payParam.setPayWay("UNIONPAY");
                 }
                 }
-                if (20 == orderRelation.getPayType()) {
-                    payParam.setPayWay("TRANSFER");
+                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<SplitAccountPo> splitBillDetail = setSplitAccountDetail(order, payParam);
                 List<Map<String, String>> maps = new ArrayList<>();
                 List<Map<String, String>> maps = new ArrayList<>();
-                //供应商子商户金额
-                for (SplitAccountPo account : splitBillDetail) {
-                    if (null != account.getType() && 4 == account.getType()) {
-                        //每个有供应商子商户的分账给对应供应商子商户
-                        addMaps(maps, account.getSplitAccount(), account.getSubUserNo());
+                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;
                 }
                 }
                 //公账-专票总金额,私账-无票总金额,公账-普票总金额
                 //公账-专票总金额,私账-无票总金额,公账-普票总金额
-                //佣金进网络
-                double totalAmount1 = 0.00;
-                double totalAmount2 = 0.00;
-                double totalAmount3 = 0.00;
-                double totalAmount4 = 0.00;
+                //Type2,3奥泰,1,5信息
+                //todo 正式改
+                String sp1 = "";
+                BigDecimal totalAmount1 = BigDecimal.ZERO;
+                String sp2 = "";
+                BigDecimal totalAmount2 = BigDecimal.ZERO;
                 for (SplitAccountPo account : splitBillDetail) {
                 for (SplitAccountPo account : splitBillDetail) {
-                    if (1 == account.getType()) {
-                        totalAmount1 = MathUtil.add(totalAmount1, account.getSplitAccount()).doubleValue();
-                    } else if (2 == account.getType()) {
-                        totalAmount2 = MathUtil.add(totalAmount2, account.getSplitAccount()).doubleValue();
-                    } else if (3 == account.getType()) {
-                        totalAmount3 = MathUtil.add(totalAmount3, account.getSplitAccount()).doubleValue();
-                    } else if (5 == account.getType()) {
-                        totalAmount4 = MathUtil.add(totalAmount4, account.getSplitAccount()).doubleValue();
+                    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();
                     }
                     }
                 }
                 }
-                addMaps(maps, totalAmount1, PayUtil.publicAccountNo);
-                addMaps(maps, totalAmount2, PayUtil.privateAccountNo);
-                addMaps(maps, totalAmount3, PayUtil.commonInvoiceNo);
-                // 网络
-                addMaps(maps, totalAmount4, PayUtil.brokerage);
-//                addMaps(maps, totalAmount4, PayUtil.publicAccountNo);
-                String parameters = JSON.toJSONString(maps);
-                logger.info("【手动分账】>>>>>>>>>>分账参数: " + parameters);
-
+                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);
+                }
                 //第三方分账接口
                 //第三方分账接口
-                JSONObject result = null;
                 try {
                 try {
-                    // 时间戳
-                    long time = System.currentTimeMillis() / 1000;
-                    JSONObject json = new JSONObject();
-                    json.put("merAccount", PayUtil.merAccount);
-                    json.put("orderId", orderRelation.getOrderRequestNo());
-                    json.put("requestNo", orderRelation.getOrderRequestNo());
-                    json.put("mbOrderId", orderRelation.getMbOrderId());
-                    json.put("time", time);
-                    json.put("splitBillDetail", parameters);
-                    json.put("notifyUrl", callUrl);
-                    logger.info("回调接口>>>" + callUrl);
-                    String sign = PayUtil.getPaySign(json, PayUtil.merKey);
-                    json.put("sign", sign);
-                    logger.info("发送参数json----->" + json);
-                    String data = PayUtil.privateKeyEncrypt(json, PayUtil.merKey);
-                    result = PayUtil.httpGet("https://platform.mhxxkj.com/paygateway/mbpay/splitOrder/v1", PayUtil.merAccount, data);
-                } catch (Exception e) {
-                    logger.error("【手动分账】>>>>>>>>>>错误信息", e);
-                }
-                if (result != null) {
-                    String code = result.getString("code");
-                    if (!"000000".equals(code)) {
-                        String msg = result.getString("msg");
-                        logger.info("【手动分账】>>>>>>>>>>第三方延迟分账失败>>>>>>>msg:" + msg);
-                    } else {
-                        for (SplitAccountPo splitAccount : splitBillDetail) {
-                            splitAccount.setMbOrderId(orderRelation.getMbOrderId());
-                            splitAccount.setOrderRequestNo(orderRelation.getOrderRequestNo());
-                            splitAccount.setPayStatus(1);
-                            // 保存分账详情
-                            newOrderDao.insertSplitAccount(splitAccount);
-                            redisService.remove("XSFZMDS");
+                    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("【延时分账】>>>>>>>>>>此订单分账结束");
                         }
                         }
-                        logger.info("【手动分账】>>>>>>>>>>此订单分账结束");
                     }
                     }
+                } catch (Exception e) {
+                    log.error("【延时分账】>>>>>>>>>>错误信息", e);
                 }
                 }
-            }
-        }
-    }
-
 
 
-    /**
-     * 分账参数添加
-     */
-    private void addMaps(List<Map<String, String>> maps, Double shopTotalAmount, String subUserNo) {
-        if (MathUtil.compare(shopTotalAmount, 0) > 0) {
-            Map<String, String> map = new HashMap<>(3);
-            map.put("subUserNo", subUserNo);
-            map.put("splitBillType", "2");
-            map.put("splitBillValue", MathUtil.mul(shopTotalAmount, 100).toString());
-            maps.add(map);
+            }
         }
         }
     }
     }
 
 
-    /**
-     * 分账详情
-     */
     private List<SplitAccountPo> setSplitAccountDetail(OrderVo order, PayParamBo payParam) {
     private List<SplitAccountPo> setSplitAccountDetail(OrderVo order, PayParamBo payParam) {
         List<SplitAccountPo> list = new ArrayList<>();
         List<SplitAccountPo> list = new ArrayList<>();
         // 本次支付金额,单位/元
         // 本次支付金额,单位/元
@@ -165,104 +186,350 @@ public class SplitAccountService {
         // 总手续费
         // 总手续费
         double procedureFee;
         double procedureFee;
         if ("UNIONPAY".equals(payParam.getPayWay())) {
         if ("UNIONPAY".equals(payParam.getPayWay())) {
-            procedureFee = 8.00;
-        } else {
-            //手续费
-            procedureFee = MathUtil.mul(payAmount, 0.0038, 2).doubleValue();
-            if (MathUtil.compare(procedureFee, 0) == 0) {
-                procedureFee = 0.01;
+            procedureFee = 10.00;
+        } else if ("B2C".equals(payParam.getPayWay())) {
+            //b2c 0.2%
+            procedureFee = MathUtil.mul(payAmount, 0.002, 2).doubleValue();
+            //b2c最低手续费0.1
+            if (procedureFee < 0.1) {
+                procedureFee = 0.1;
             }
             }
+        } else if ("WX".equals(payParam.getPayWay())) {
+            //微信0.65%
+            procedureFee = MathUtil.mul(payAmount, 0.0065, 2).doubleValue();
+        } else {
+            //手续费 其他0.25%
+            procedureFee = MathUtil.mul(payAmount, 0.0025, 2).doubleValue();
         }
         }
+        if (MathUtil.compare(procedureFee, 0.01) <= 0) {
+            procedureFee = 0.01;
+        }
+        //减去收款手续费
         splitAmount = MathUtil.sub(splitAmount, procedureFee).doubleValue();
         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 = newOrderDao.getOrderProductByOrderId(order.getOrderId());
+        List<OrderProductVo> orderProductList = orderCommonMapper.getOrderProductByOrderId(order.getOrderId());
         for (OrderProductVo orderProduct : orderProductList) {
         for (OrderProductVo orderProduct : orderProductList) {
+            //成本价*数量
             double costPrice = MathUtil.mul(orderProduct.getCostPrice(), orderProduct.getNum()).doubleValue();
             double costPrice = MathUtil.mul(orderProduct.getCostPrice(), orderProduct.getNum()).doubleValue();
             // 不含税能开发票
             // 不含税能开发票
             if (Integer.valueOf(0).equals(orderProduct.getIncludedTax()) && !Integer.valueOf(3).equals(orderProduct.getInvoiceType())) {
             if (Integer.valueOf(0).equals(orderProduct.getIncludedTax()) && !Integer.valueOf(3).equals(orderProduct.getInvoiceType())) {
                 //应付总税费
                 //应付总税费
                 Double payableTax = MathUtil.mul(orderProduct.getSingleShouldPayTotalTax(), orderProduct.getNum()).doubleValue();
                 Double payableTax = MathUtil.mul(orderProduct.getSingleShouldPayTotalTax(), orderProduct.getNum()).doubleValue();
+                //成本+税费
                 costPrice = MathUtil.add(costPrice, payableTax).doubleValue();
                 costPrice = MathUtil.add(costPrice, payableTax).doubleValue();
             }
             }
             // 判断是否支付过
             // 判断是否支付过
-            Double paidAmount = newOrderDao.getOrderProductPaidAmount(orderProduct.getOrderProductId());
-            //有已付
-            if (null != paidAmount  && MathUtil.compare(paidAmount, 0) > 0) {
-                //已付>0,成本-已付
+            Double paidAmount = payOrderMapper.getOrderProductPaidAmount(orderProduct.getOrderProductId());
+            // 支付过金额大于0
+            if (paidAmount != null && MathUtil.compare(paidAmount, 0) > 0) {
+                //成本-支付过的金额
                 costPrice = MathUtil.sub(costPrice, paidAmount).doubleValue();
                 costPrice = MathUtil.sub(costPrice, paidAmount).doubleValue();
             }
             }
-            // 待分账金额>成本
-            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.setOrderId(order.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());
+            // 没支付过或者支付过的金额-成本<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;
                 }
                 }
-                logger.info("成本分账参数------------->" + splitAccount.toString());
-                list.add(splitAccount);
-            }
-            if (MathUtil.compare(splitAmount, 0) == 0) {
-                break;
             }
             }
+
         }
         }
+
+        // 还有钱就付供应商运费
         // 付供应商运费,是以供应商为单位的
         // 付供应商运费,是以供应商为单位的
         if (MathUtil.compare(splitAmount, 0) > 0) {
         if (MathUtil.compare(splitAmount, 0) > 0) {
-            List<ShopOrderVo> shopOrderList = newOrderDao.getShopOrderListByOrderId(order.getOrderId());
+            List<ShopOrderVo> shopOrderList = orderCommonMapper.getShopOrderListByOrderId(order.getOrderId());
             for (ShopOrderVo shopOrder : shopOrderList) {
             for (ShopOrderVo shopOrder : shopOrderList) {
                 // 运费
                 // 运费
                 Double shopPostFee = shopOrder.getShopPostFee();
                 Double shopPostFee = shopOrder.getShopPostFee();
                 if (MathUtil.compare(shopPostFee, 0) > 0) {
                 if (MathUtil.compare(shopPostFee, 0) > 0) {
                     // 查询已支付运费
                     // 查询已支付运费
-                    Double shipping = newOrderDao.getPaidShipping(order.getOrderId(), shopOrder.getShopId());
+                    Double shipping = payOrderMapper.getPaidShipping(order.getOrderId(), shopOrder.getShopId());
                     shopPostFee = MathUtil.sub(shopPostFee, shipping).doubleValue();
                     shopPostFee = MathUtil.sub(shopPostFee, shipping).doubleValue();
                     if (MathUtil.compare(splitAmount, shopPostFee) > -1) {
                     if (MathUtil.compare(splitAmount, shopPostFee) > -1) {
+                        //减去运费
                         splitAmount = MathUtil.sub(splitAmount, shopPostFee).doubleValue();
                         splitAmount = MathUtil.sub(splitAmount, shopPostFee).doubleValue();
                     } else {
                     } else {
+                        //钱不够运费就分剩余
                         shopPostFee = splitAmount;
                         shopPostFee = splitAmount;
                         splitAmount = 0.00;
                         splitAmount = 0.00;
                     }
                     }
-                    String commercialCode = newOrderDao.getShopCommercialCode(shopOrder.getShopId());
+                    //todo 暂不考虑供应商有商户号,有分给供应商,没有进私账
                     SplitAccountPo splitAccount = new SplitAccountPo();
                     SplitAccountPo splitAccount = new SplitAccountPo();
                     splitAccount.setOrderId(order.getOrderId());
                     splitAccount.setOrderId(order.getOrderId());
                     splitAccount.setShopId(shopOrder.getShopId());
                     splitAccount.setShopId(shopOrder.getShopId());
                     splitAccount.setSplitAccount(shopPostFee);
                     splitAccount.setSplitAccount(shopPostFee);
                     splitAccount.setProductType(2);
                     splitAccount.setProductType(2);
-                    if (StringUtils.isNotBlank(commercialCode)) {
-                        //供应商拥有子商户号
-                        splitAccount.setType(4);
-                        splitAccount.setSubUserNo(commercialCode);
+                    splitAccount.setType(2);
+                    //todo 私账-无票,子商户商编 测试暂入奥泰
+                    splitAccount.setSubUserNo(CUSTOMERNUM3);
+                    if (splitAccount.getSplitAccount() > 0) {
+                        log.info("============设置付供应商运费分账详情对象: " + splitAccount.toString());
+                        list.add(splitAccount);
                     }
                     }
-                    logger.info("付供应商运费分账参数------------->" + splitAccount);
-                    list.add(splitAccount);
                 }
                 }
             }
             }
         }
         }
-        //佣金,公账
+        // 如果还有钱则为佣金,分到采美网络
         if (MathUtil.compare(splitAmount, 0) > 0) {
         if (MathUtil.compare(splitAmount, 0) > 0) {
             SplitAccountPo splitAccount = new SplitAccountPo();
             SplitAccountPo splitAccount = new SplitAccountPo();
             splitAccount.setOrderId(order.getOrderId());
             splitAccount.setOrderId(order.getOrderId());
             splitAccount.setSplitAccount(splitAmount);
             splitAccount.setSplitAccount(splitAmount);
             splitAccount.setProductType(3);
             splitAccount.setProductType(3);
             splitAccount.setType(5);
             splitAccount.setType(5);
-            //佣金进采美网络
-            splitAccount.setSubUserNo(PayUtil.brokerage);
-            logger.info("佣金分账参数------------->" + splitAccount);
-            list.add(splitAccount);
+            //todo 佣金应入采美网络,测试暂入信息
+            splitAccount.setSubUserNo(Constant.CUSTOMERNUM);
+            if (splitAccount.getSplitAccount() > 0) {
+                log.info("============设置佣金分账详情对象: " + splitAccount.toString());
+                list.add(splitAccount);
+            }
         }
         }
         return list;
         return list;
     }
     }
 
 
+
+
+//    //正式
+////    public static final String callUrl = "https://core.caimei365.com/order/pay/delay/split/callback";
+//    //测试
+//    public static final String callUrl = "https://core-b.caimei365.com/order/pay/delay/split/callback";
+
+//    @Transactional(readOnly = false)
+//    public void SplitAccount() {
+//        logger.info("【手动分账开始】>>>>>>>>>>手动分账");
+//        Calendar calendar = Calendar.getInstance();
+//        calendar.setTime(new Date());
+//        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+//        String currentTime = format.format(calendar.getTime());
+//        // 查询未分账已支付收款
+//        List<OrderReceiptRelationPo> orderRelations = newOrderDao.getUndividedPaidReceipt(currentTime);
+//        if (null != orderRelations && orderRelations.size() > 0) {
+//            for (OrderReceiptRelationPo orderRelation : orderRelations) {
+//                logger.info("【手动分账】>>>>>>>>>>订单id:" + orderRelation.getOrderId() + ",进入手动分账");
+//                // 收款对应的订单信息
+//                OrderVo order = newOrderDao.getOrderByOrderId(orderRelation.getOrderId());
+//                PayParamBo payParam = new PayParamBo();
+//                payParam.setPayAmount(MathUtil.mul(orderRelation.getAssociateAmount(), 100).intValue());
+//                if (12 == orderRelation.getPayType()) {
+//                    // 网银支付
+//                    payParam.setPayWay("UNIONPAY");
+//                }
+//                if (20 == orderRelation.getPayType()) {
+//                    payParam.setPayWay("TRANSFER");
+//                }
+//                List<SplitAccountPo> splitBillDetail = setSplitAccountDetail(order, payParam);
+//                List<Map<String, String>> maps = new ArrayList<>();
+//                //供应商子商户金额
+//                for (SplitAccountPo account : splitBillDetail) {
+//                    if (null != account.getType() && 4 == account.getType()) {
+//                        //每个有供应商子商户的分账给对应供应商子商户
+//                        addMaps(maps, account.getSplitAccount(), account.getSubUserNo());
+//                    }
+//                }
+//                //公账-专票总金额,私账-无票总金额,公账-普票总金额
+//                //佣金进网络
+//                double totalAmount1 = 0.00;
+//                double totalAmount2 = 0.00;
+//                double totalAmount3 = 0.00;
+//                double totalAmount4 = 0.00;
+//                for (SplitAccountPo account : splitBillDetail) {
+//                    if (1 == account.getType()) {
+//                        totalAmount1 = MathUtil.add(totalAmount1, account.getSplitAccount()).doubleValue();
+//                    } else if (2 == account.getType()) {
+//                        totalAmount2 = MathUtil.add(totalAmount2, account.getSplitAccount()).doubleValue();
+//                    } else if (3 == account.getType()) {
+//                        totalAmount3 = MathUtil.add(totalAmount3, account.getSplitAccount()).doubleValue();
+//                    } else if (5 == account.getType()) {
+//                        totalAmount4 = MathUtil.add(totalAmount4, account.getSplitAccount()).doubleValue();
+//                    }
+//                }
+//                addMaps(maps, totalAmount1, PayUtil.publicAccountNo);
+//                addMaps(maps, totalAmount2, PayUtil.privateAccountNo);
+//                addMaps(maps, totalAmount3, PayUtil.commonInvoiceNo);
+//                // 网络
+//                addMaps(maps, totalAmount4, PayUtil.brokerage);
+////                addMaps(maps, totalAmount4, PayUtil.publicAccountNo);
+//                String parameters = JSON.toJSONString(maps);
+//                logger.info("【手动分账】>>>>>>>>>>分账参数: " + parameters);
+//
+//                //第三方分账接口
+//                JSONObject result = null;
+//                try {
+//                    // 时间戳
+//                    long time = System.currentTimeMillis() / 1000;
+//                    JSONObject json = new JSONObject();
+//                    json.put("merAccount", PayUtil.merAccount);
+//                    json.put("orderId", orderRelation.getOrderRequestNo());
+//                    json.put("requestNo", orderRelation.getOrderRequestNo());
+//                    json.put("mbOrderId", orderRelation.getMbOrderId());
+//                    json.put("time", time);
+//                    json.put("splitBillDetail", parameters);
+//                    json.put("notifyUrl", callUrl);
+//                    logger.info("回调接口>>>" + callUrl);
+//                    String sign = PayUtil.getPaySign(json, PayUtil.merKey);
+//                    json.put("sign", sign);
+//                    logger.info("发送参数json----->" + json);
+//                    String data = PayUtil.privateKeyEncrypt(json, PayUtil.merKey);
+//                    result = PayUtil.httpGet("https://platform.mhxxkj.com/paygateway/mbpay/splitOrder/v1", PayUtil.merAccount, data);
+//                } catch (Exception e) {
+//                    logger.error("【手动分账】>>>>>>>>>>错误信息", e);
+//                }
+//                if (result != null) {
+//                    String code = result.getString("code");
+//                    if (!"000000".equals(code)) {
+//                        String msg = result.getString("msg");
+//                        logger.info("【手动分账】>>>>>>>>>>第三方延迟分账失败>>>>>>>msg:" + msg);
+//                    } else {
+//                        for (SplitAccountPo splitAccount : splitBillDetail) {
+//                            splitAccount.setMbOrderId(orderRelation.getMbOrderId());
+//                            splitAccount.setOrderRequestNo(orderRelation.getOrderRequestNo());
+//                            splitAccount.setPayStatus(1);
+//                            // 保存分账详情
+//                            newOrderDao.insertSplitAccount(splitAccount);
+//                            redisService.remove("XSFZMDS");
+//                        }
+//                        logger.info("【手动分账】>>>>>>>>>>此订单分账结束");
+//                    }
+//                }
+//            }
+//        }
+//    }
+//
+//
+//    /**
+//     * 分账参数添加
+//     */
+//    private void addMaps(List<Map<String, String>> maps, Double shopTotalAmount, String subUserNo) {
+//        if (MathUtil.compare(shopTotalAmount, 0) > 0) {
+//            Map<String, String> map = new HashMap<>(3);
+//            map.put("subUserNo", subUserNo);
+//            map.put("splitBillType", "2");
+//            map.put("splitBillValue", MathUtil.mul(shopTotalAmount, 100).toString());
+//            maps.add(map);
+//        }
+//    }
+//
+//    /**
+//     * 分账详情
+//     */
+//    private List<SplitAccountPo> setSplitAccountDetail(OrderVo order, PayParamBo payParam) {
+//        List<SplitAccountPo> list = new ArrayList<>();
+//        // 本次支付金额,单位/元
+//        double payAmount = MathUtil.div(payParam.getPayAmount(), 100).doubleValue();
+//        // 待分账总金额
+//        double splitAmount = payAmount;
+//        // 总手续费
+//        double procedureFee;
+//        if ("UNIONPAY".equals(payParam.getPayWay())) {
+//            procedureFee = 8.00;
+//        } else {
+//            //手续费
+//            procedureFee = MathUtil.mul(payAmount, 0.0038, 2).doubleValue();
+//            if (MathUtil.compare(procedureFee, 0) == 0) {
+//                procedureFee = 0.01;
+//            }
+//        }
+//        splitAmount = MathUtil.sub(splitAmount, procedureFee).doubleValue();
+//        // 商品数据
+//        List<OrderProductVo> orderProductList = newOrderDao.getOrderProductByOrderId(order.getOrderId());
+//        for (OrderProductVo orderProduct : orderProductList) {
+//            double costPrice = MathUtil.mul(orderProduct.getCostPrice(), orderProduct.getNum()).doubleValue();
+//            // 不含税能开发票
+//            if (Integer.valueOf(0).equals(orderProduct.getIncludedTax()) && !Integer.valueOf(3).equals(orderProduct.getInvoiceType())) {
+//                //应付总税费
+//                Double payableTax = MathUtil.mul(orderProduct.getSingleShouldPayTotalTax(), orderProduct.getNum()).doubleValue();
+//                costPrice = MathUtil.add(costPrice, payableTax).doubleValue();
+//            }
+//            // 判断是否支付过
+//            Double paidAmount = newOrderDao.getOrderProductPaidAmount(orderProduct.getOrderProductId());
+//            //有已付
+//            if (null != paidAmount  && MathUtil.compare(paidAmount, 0) > 0) {
+//                //已付>0,成本-已付
+//                costPrice = MathUtil.sub(costPrice, paidAmount).doubleValue();
+//            }
+//            // 待分账金额>成本
+//            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.setOrderId(order.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 = newOrderDao.getShopOrderListByOrderId(order.getOrderId());
+//            for (ShopOrderVo shopOrder : shopOrderList) {
+//                // 运费
+//                Double shopPostFee = shopOrder.getShopPostFee();
+//                if (MathUtil.compare(shopPostFee, 0) > 0) {
+//                    // 查询已支付运费
+//                    Double shipping = newOrderDao.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;
+//                    }
+//                    String commercialCode = newOrderDao.getShopCommercialCode(shopOrder.getShopId());
+//                    SplitAccountPo splitAccount = new SplitAccountPo();
+//                    splitAccount.setOrderId(order.getOrderId());
+//                    splitAccount.setShopId(shopOrder.getShopId());
+//                    splitAccount.setSplitAccount(shopPostFee);
+//                    splitAccount.setProductType(2);
+//                    if (StringUtils.isNotBlank(commercialCode)) {
+//                        //供应商拥有子商户号
+//                        splitAccount.setType(4);
+//                        splitAccount.setSubUserNo(commercialCode);
+//                    }
+//                    logger.info("付供应商运费分账参数------------->" + splitAccount);
+//                    list.add(splitAccount);
+//                }
+//            }
+//        }
+//        //佣金,公账
+//        if (MathUtil.compare(splitAmount, 0) > 0) {
+//            SplitAccountPo splitAccount = new SplitAccountPo();
+//            splitAccount.setOrderId(order.getOrderId());
+//            splitAccount.setSplitAccount(splitAmount);
+//            splitAccount.setProductType(3);
+//            splitAccount.setType(5);
+//            //佣金进采美网络
+//            splitAccount.setSubUserNo(PayUtil.brokerage);
+//            logger.info("佣金分账参数------------->" + splitAccount);
+//            list.add(splitAccount);
+//        }
+//        return list;
+//    }
+
 }
 }

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

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

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

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

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

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