Explorar o código

手动分账bugfix

zhijiezhao %!s(int64=3) %!d(string=hai) anos
pai
achega
476fb9f944

+ 16 - 0
src/main/java/com/caimei/modules/order/dao/NewOrderDao.java

@@ -207,6 +207,8 @@ public interface NewOrderDao extends CrudDao<NewOrder> {
 
     ShopOrderVo getShopOrderListByOrderId(Integer shopOrderId);
 
+    List<ShopOrderVo> getShopOrderByOrderId(Integer orderId);
+
     Double getPaidShipping(Integer orderId, Integer shopId);
 
     String getShopCommercialCode(Integer shopId);
@@ -222,4 +224,18 @@ public interface NewOrderDao extends CrudDao<NewOrder> {
     Integer findSupport(Integer shopOrderId);
 
     List<OrderProductVo> getOrderProductByShopOrderId(Integer shopOrderId);
+
+    List<SplitAccountPo> getSplitAccountList(String mbOrderId);
+
+    Double getPaidShopAmount(Integer shopOrderId);
+
+    void updateShopOrderByPayStatus(@Param("shopOrderId")Integer shopOrderId,@Param("paidShop") Double paidShop,@Param("payStatus") Integer payStatus);
+
+    void insertPayShop(PayShopPo payShop);
+
+    void insertPayShopRecord(PayShopRecordPo shopRecord);
+
+    void updateOrderByPayStatus(@Param("orderId")Integer orderId, @Param("payStatus")Integer payStatus);
+
+    void updateBySplitStatus(String mbOrderId);
 }

+ 310 - 0
src/main/java/com/caimei/modules/order/entity/PayShopPo.java

@@ -0,0 +1,310 @@
+package com.caimei.modules.order.entity;
+
+import java.io.Serializable;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2021/8/3
+ */
+
+public class PayShopPo implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private Integer id;
+
+    /**
+     * 供应商Id
+     */
+    private Integer shopId;
+
+    /**
+     * 付款单名称
+     */
+    private String name;
+
+    /**
+     * 付款账号的户名
+     */
+    private String bankAccountName;
+
+    /**
+     * 付款账号
+     */
+    private String bankAccount;
+
+    /**
+     * 付款账号的开户行
+     */
+    private String bankName;
+
+    /**
+     *  付款账号的类型 0公账, 1私账
+     */
+    private Integer type;
+
+    /**
+     * 付供应商总金额
+     */
+    private Double totalAmount;
+
+    /**
+     * 余额支付
+     */
+    private Double balancePayFee;
+
+    /**
+     * 转账支付
+     */
+    private Double transferPayFee;
+
+    /**
+     * 付款方式 1建设银行7297, 2中信银行0897, 3中信银行7172, 4广发银行0115, 5广发银行5461,6线上分账
+     */
+    private Integer payType;
+
+    /**
+     * 付款抹平金额(总)
+     */
+    private Double wipePayment;
+
+    /**
+     * 付款抹平备注(文字)
+     */
+    private String wipeRemarks;
+
+    /**
+     * 付款抹平备注(图片),以"##"隔开
+     */
+    private String wipeRemarkImages;
+
+    /**
+     * 抹平申请时间
+     */
+    private String wipeTime;
+
+    /**
+     * 申请人ID
+     */
+    private Integer applicant;
+
+    /**
+     * 申请时间
+     */
+    private String applyTime;
+
+    /**
+     * 审核人ID
+     */
+    private Integer reviewer;
+
+    /**
+     * 审核时间
+     */
+    private String reviewTime;
+
+    /**
+     * 付款时间
+     */
+    private String payTime;
+
+    /**
+     * 审核状态  0待审核,  1审核通过  2审核不通过
+     */
+    private Integer status;
+
+    /**
+     * 审核不通过原因
+     */
+    private String reason;
+
+    /**
+     * 删除标记 0 否,其余是
+     */
+    private Integer delFlag;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getShopId() {
+        return shopId;
+    }
+
+    public void setShopId(Integer shopId) {
+        this.shopId = shopId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getBankAccountName() {
+        return bankAccountName;
+    }
+
+    public void setBankAccountName(String bankAccountName) {
+        this.bankAccountName = bankAccountName;
+    }
+
+    public String getBankAccount() {
+        return bankAccount;
+    }
+
+    public void setBankAccount(String bankAccount) {
+        this.bankAccount = bankAccount;
+    }
+
+    public String getBankName() {
+        return bankName;
+    }
+
+    public void setBankName(String bankName) {
+        this.bankName = bankName;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Double getTotalAmount() {
+        return totalAmount;
+    }
+
+    public void setTotalAmount(Double totalAmount) {
+        this.totalAmount = totalAmount;
+    }
+
+    public Double getBalancePayFee() {
+        return balancePayFee;
+    }
+
+    public void setBalancePayFee(Double balancePayFee) {
+        this.balancePayFee = balancePayFee;
+    }
+
+    public Double getTransferPayFee() {
+        return transferPayFee;
+    }
+
+    public void setTransferPayFee(Double transferPayFee) {
+        this.transferPayFee = transferPayFee;
+    }
+
+    public Integer getPayType() {
+        return payType;
+    }
+
+    public void setPayType(Integer payType) {
+        this.payType = payType;
+    }
+
+    public Double getWipePayment() {
+        return wipePayment;
+    }
+
+    public void setWipePayment(Double wipePayment) {
+        this.wipePayment = wipePayment;
+    }
+
+    public String getWipeRemarks() {
+        return wipeRemarks;
+    }
+
+    public void setWipeRemarks(String wipeRemarks) {
+        this.wipeRemarks = wipeRemarks;
+    }
+
+    public String getWipeRemarkImages() {
+        return wipeRemarkImages;
+    }
+
+    public void setWipeRemarkImages(String wipeRemarkImages) {
+        this.wipeRemarkImages = wipeRemarkImages;
+    }
+
+    public String getWipeTime() {
+        return wipeTime;
+    }
+
+    public void setWipeTime(String wipeTime) {
+        this.wipeTime = wipeTime;
+    }
+
+    public Integer getApplicant() {
+        return applicant;
+    }
+
+    public void setApplicant(Integer applicant) {
+        this.applicant = applicant;
+    }
+
+    public String getApplyTime() {
+        return applyTime;
+    }
+
+    public void setApplyTime(String applyTime) {
+        this.applyTime = applyTime;
+    }
+
+    public Integer getReviewer() {
+        return reviewer;
+    }
+
+    public void setReviewer(Integer reviewer) {
+        this.reviewer = reviewer;
+    }
+
+    public String getReviewTime() {
+        return reviewTime;
+    }
+
+    public void setReviewTime(String reviewTime) {
+        this.reviewTime = reviewTime;
+    }
+
+    public String getPayTime() {
+        return payTime;
+    }
+
+    public void setPayTime(String payTime) {
+        this.payTime = payTime;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public String getReason() {
+        return reason;
+    }
+
+    public void setReason(String reason) {
+        this.reason = reason;
+    }
+
+    public Integer getDelFlag() {
+        return delFlag;
+    }
+
+    public void setDelFlag(Integer delFlag) {
+        this.delFlag = delFlag;
+    }
+}

+ 145 - 0
src/main/java/com/caimei/modules/order/entity/PayShopRecordPo.java

@@ -0,0 +1,145 @@
+package com.caimei.modules.order.entity;
+
+
+import java.io.Serializable;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2021/8/3
+ */
+
+public class PayShopRecordPo implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private Integer id;
+    /**
+     * 供应商Id
+     */
+    private Integer shopId;
+    /**
+     * 子订单ID
+     */
+    private Integer shopOrderId;
+    /**
+     * 子订单编号
+     */
+    private String shopOrderNo;
+    /**
+     * 付款金额
+     */
+    private Double payAmount;
+    /**
+     * 付款抹平金额
+     */
+    private Double wipePayment;
+    /**
+     * 付款方式 1建设银行7297, 2中信银行0897, 3中信银行7172, 4广发银行0115, 5广发银行5461,6线上分账
+     */
+    private Integer payType;
+    /**
+     * 付款时间
+     */
+    private String payTime;
+    /**
+     * 付款单表id
+     */
+    private Integer payShopId;
+    /**
+     * 0待审核, 1审核通过, 2审核不通过
+     */
+    private Integer status;
+    /**
+     * 删除标记 0 否,其余是
+     */
+    private Integer delFlag;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getShopId() {
+        return shopId;
+    }
+
+    public void setShopId(Integer shopId) {
+        this.shopId = shopId;
+    }
+
+    public Integer getShopOrderId() {
+        return shopOrderId;
+    }
+
+    public void setShopOrderId(Integer shopOrderId) {
+        this.shopOrderId = shopOrderId;
+    }
+
+    public String getShopOrderNo() {
+        return shopOrderNo;
+    }
+
+    public void setShopOrderNo(String shopOrderNo) {
+        this.shopOrderNo = shopOrderNo;
+    }
+
+    public Double getPayAmount() {
+        return payAmount;
+    }
+
+    public void setPayAmount(Double payAmount) {
+        this.payAmount = payAmount;
+    }
+
+    public Double getWipePayment() {
+        return wipePayment;
+    }
+
+    public void setWipePayment(Double wipePayment) {
+        this.wipePayment = wipePayment;
+    }
+
+    public Integer getPayType() {
+        return payType;
+    }
+
+    public void setPayType(Integer payType) {
+        this.payType = payType;
+    }
+
+    public String getPayTime() {
+        return payTime;
+    }
+
+    public void setPayTime(String payTime) {
+        this.payTime = payTime;
+    }
+
+    public Integer getPayShopId() {
+        return payShopId;
+    }
+
+    public void setPayShopId(Integer payShopId) {
+        this.payShopId = payShopId;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public Integer getDelFlag() {
+        return delFlag;
+    }
+
+    public void setDelFlag(Integer delFlag) {
+        this.delFlag = delFlag;
+    }
+}

+ 167 - 81
src/main/java/com/caimei/modules/order/service/SplitAccountService.java

@@ -5,15 +5,11 @@ import com.alibaba.fastjson.JSONObject;
 import com.caimei.modules.order.dao.NewOrderDao;
 import com.caimei.modules.order.entity.*;
 import com.caimei.modules.order.utils.Disguiser;
-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 com.thinkgem.jeesite.common.service.BaseService;
 import okhttp3.*;
 import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -24,7 +20,7 @@ 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)
@@ -73,85 +69,179 @@ public class SplitAccountService extends BaseService {
                 HashMap<String, BigDecimal> sbm = new HashMap<>();
                 for (SplitAccountPo splitAccountPo : splitBillDetail) {
                     String subUserNo = splitAccountPo.getSubUserNo();
-                    if(sbm.containsKey(subUserNo)){
+                    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()));
+                        sbm.put(subUserNo, v);
+                    } else {
+                        sbm.put(subUserNo, BigDecimal.valueOf(splitAccountPo.getSplitAccount()));
+                    }
+                    // splitcode相同的收款的时候已经是成本已分帐
+                    if (subUserNo.equals(shopOrder.getSplitCode())) {
+                        splitAccountPo.setMbOrderId(orderRelation.getMbOrderId());
+                        splitAccountPo.setOrderRequestNo(orderRelation.getOrderRequestNo());
+                        splitAccountPo.setPayStatus(1);
+                        // 保存分账详情
+                        newOrderDao.insertSplitAccount(splitAccountPo);
                     }
                 }
                 ArrayList<AccountPayOrder.AccountPayOrderExt.SplitBillRule> splitBillRules = new ArrayList<>();
                 sbm.forEach((key, value) -> {
-                    AccountPayOrder.AccountPayOrderExt.SplitBillRule splitBillRule = new AccountPayOrder.AccountPayOrderExt.SplitBillRule();
-                    splitBillRule.setSplitBillAmount(value);
-                    splitBillRule.setSplitBillMerchantNo(key);
-                    splitBillRules.add(splitBillRule);
+                    // 不是自己的splitcode分走,是自己的不动
+                    if (!key.equals(shopOrder.getSplitCode())) {
+                        //佣金
+                        AccountPayOrder.AccountPayOrderExt.SplitBillRule splitBillRule = new AccountPayOrder.AccountPayOrderExt.SplitBillRule();
+                        splitBillRule.setSplitBillAmount(value);
+                        splitBillRule.setSplitBillMerchantNo(key);
+                        splitBillRules.add(splitBillRule);
+                    }else{
+                        // 成本分账处理
+                        // 子订单的splitcode和分账对象的splitcode一样的是留在账户里的钱,实际在付款完成后,付款状态就为已付款,分账状态就为已分账
+                        // 为维持业务完整性,保持原来的分账流程不变
+                        List<SplitAccountPo> splitAccountList = newOrderDao.getSplitAccountList(orderRelation.getMbOrderId());
+                        if (splitAccountList != null && splitAccountList.size() > 0) {
+                            Integer orderId = splitAccountList.get(0).getOrderId();
+                            List<ShopOrderVo> shopOrderList = newOrderDao.getShopOrderByOrderId(orderId);
+                            Integer shopOrderId = null;
+                            String shopOrderNo = "";
+                            for (SplitAccountPo account : splitAccountList) {
+                                // 本次付供应商金额(分账金额)
+                                Double splitAmount = account.getSplitAccount();
+                                orderId = account.getOrderId();
+                                Integer shopId = account.getShopId();
+                                for (ShopOrderVo shop : shopOrderList) {
+                                    if (shopId.equals(shop.getShopId())) {
+                                        shopOrderId = shop.getShopOrderId();
+                                        shopOrderNo = shop.getShopOrderNo();
+                                        // 已付供应商金额
+                                        Double paidAmount = newOrderDao.getPaidShopAmount(shopOrderId);
+                                        Double paidShop = MathUtil.add(paidAmount, splitAmount).doubleValue();
+                                        shopOrder.setPayedShopAmount(paidShop);
+                                        if (MathUtil.compare(shopOrder.getShouldPayShopAmount(), paidShop) == 0) {
+                                            shopOrder.setPayStatus(3);
+                                        } else {
+                                            shopOrder.setPayStatus(2);
+                                        }
+                                        // 修改子订单付款状态及付款金额
+                                        newOrderDao.updateShopOrderByPayStatus(shopOrderId, paidShop, shopOrder.getPayStatus());
+                                    }
+                                }
+                                SimpleDateFormat format2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                                String currentTime2 = format2.format(new Date());
+                                // 保存付款单表
+                                PayShopPo payShop = new PayShopPo();
+                                payShop.setShopId(shopId);
+                                payShop.setName("线上支付分账");
+                                payShop.setTotalAmount(splitAmount);
+                                payShop.setWipePayment(0d);
+                                payShop.setPayType(6);
+                                payShop.setStatus(1);
+                                payShop.setDelFlag(0);
+                                payShop.setApplyTime(currentTime2);
+                                payShop.setReviewTime(currentTime2);
+                                payShop.setPayTime(currentTime2);
+                                newOrderDao.insertPayShop(payShop);
+                                // 保存 付供应商记录
+                                PayShopRecordPo shopRecord = new PayShopRecordPo();
+                                shopRecord.setShopId(shopId);
+                                shopRecord.setShopOrderId(shopOrderId);
+                                shopRecord.setShopOrderNo(shopOrderNo);
+                                shopRecord.setPayAmount(splitAmount);
+                                shopRecord.setWipePayment(0d);
+                                shopRecord.setPayType(6);
+                                shopRecord.setPayTime(currentTime2);
+                                shopRecord.setPayShopId(payShop.getId());
+                                shopRecord.setStatus(1);
+                                shopRecord.setDelFlag(0);
+                                newOrderDao.insertPayShopRecord(shopRecord);
+                            }
+                            // 子订单是否全部付款
+                            boolean isPay = true;
+                            for (ShopOrderVo shops : shopOrderList) {
+                                if (3 != shops.getPayStatus()) {
+                                    isPay = false;
+                                    break;
+                                }
+                            }
+                            // 修改主订单付款状态
+                            if (isPay) {
+                                newOrderDao.updateOrderByPayStatus(orderId, 3);
+                            } else {
+                                newOrderDao.updateOrderByPayStatus(orderId, 2);
+                            }
+                        }
+                    }
                 });
-                // 自己的不分
-                splitBillRules.removeIf(s->s.getSplitBillMerchantNo().equals(shopOrder.getSplitCode()));
-                //第三方分账接口
-                try {
-                    AccountPayOrder accountPayOrder = new AccountPayOrder();
-                    accountPayOrder.setP1_bizType("AccountPaySub");
-                    accountPayOrder.setP2_signType("MD5");
-                    String format1 = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss.SSS").format(new Date());
-                    accountPayOrder.setP3_timestamp(format1);
-                    String substring = format1.substring(20);
-                    // fz+当前微秒时间+原唯一订单号
-                    accountPayOrder.setP4_orderId("FZ" + substring + orderRelation.getOrderRequestNo());
-                    //付款账户子订单绑定商户号
-                    accountPayOrder.setP5_customerNumber(shopOrder.getSplitCode());
-                    AccountPayOrder.AccountPayOrderExt accountPayOrderExt = new AccountPayOrder.AccountPayOrderExt();
-                    //收款账户商编  填写splitBillRules时候不填写MerchantNo,Amount并且即使填写这两个参数不生效!!
+                splitBillDetail.removeIf(s -> s.getSubUserNo().equals(shopOrder.getSplitCode()));
+                if (null != splitBillRules && splitBillRules.size() > 0) {
+                    //第三方分账接口
+                    try {
+                        AccountPayOrder accountPayOrder = new AccountPayOrder();
+                        accountPayOrder.setP1_bizType("AccountPaySub");
+                        accountPayOrder.setP2_signType("MD5");
+                        String format1 = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss.SSS").format(new Date());
+                        accountPayOrder.setP3_timestamp(format1);
+                        String substring = format1.substring(20);
+                        // fz+当前微秒时间+原唯一订单号
+                        accountPayOrder.setP4_orderId("FZ" + substring + orderRelation.getOrderRequestNo());
+                        //付款账户子订单绑定商户号
+                        accountPayOrder.setP5_customerNumber(shopOrder.getSplitCode());
+                        AccountPayOrder.AccountPayOrderExt accountPayOrderExt = new AccountPayOrder.AccountPayOrderExt();
+                        //收款账户商编  填写splitBillRules时候不填写MerchantNo,Amount并且即使填写这两个参数不生效!!
 //                    accountPayOrderExt.setInMerchantNo(splitMoneyVo.getName());
-                    accountPayOrderExt.setOrderType(AccountPayOrderType.TRANSFER);
+                        accountPayOrderExt.setOrderType(AccountPayOrderType.TRANSFER);
 //                    accountPayOrderExt.setAmount(splitMoneyVo.getSplitMoney());
-                    accountPayOrderExt.setServerCallbackUrl(Constant.betaSplit);
-                    accountPayOrderExt.setGoodsName("分账");
-                    if (null != splitBillRules && splitBillRules.size() > 0) {
-                        accountPayOrderExt.setSplitBillRules(splitBillRules);
-                    }
-                    String ext = JSON.toJSONString(accountPayOrderExt);
-                    logger.info("分账规则串json串:" + ext);
-                    accountPayOrder.setP6_ext(ext);
-                    // 生成签名
-                    StringBuilder builder = new StringBuilder();
-                    builder.append(Constant.SPLIT)
-                            .append(accountPayOrder.getP1_bizType()).append(Constant.SPLIT)
-                            .append(accountPayOrder.getP2_signType()).append(Constant.SPLIT)
-                            .append(accountPayOrder.getP3_timestamp()).append(Constant.SPLIT)
-                            .append(accountPayOrder.getP4_orderId()).append(Constant.SPLIT)
-                            .append(accountPayOrder.getP5_customerNumber()).append(Constant.SPLIT)
-                            .append(accountPayOrder.getP6_ext()).append(Constant.SPLIT)
-                            .append(Constant.XUNI);
-                    String sign = Disguiser.disguiseMD5(builder.toString().trim());
-                    Map<String, String> bean = convertBean(accountPayOrder);
-                    logger.info("--------------------> 发送分账参数:  " + bean);
-                    Map<String, String> map = postForm(bean, Constant.FZ, sign, Map.class);
-                    logger.info("----------------分账返回数据: " + map.toString());
-                    if (map != null) {
-                        String code = map.get("rt5_retCode");
-                        if (!"0000".equals(code)) {
-                            String msg = map.get("rt6_retMsg");
-                            logger.info("【手动分账】>>>>>>>>>>手动分账失败>>>>>>>msg:" + msg);
-                        } else {
-                            for (SplitAccountPo splitAccount : splitBillDetail) {
-                                splitAccount.setMbOrderId(orderRelation.getMbOrderId());
-                                splitAccount.setOrderRequestNo(substring + orderRelation.getOrderRequestNo());
-                                splitAccount.setPayStatus(1);
-                                // 保存分账详情
-                                newOrderDao.insertSplitAccount(splitAccount);
+                        accountPayOrderExt.setServerCallbackUrl(Constant.betaSplit);
+                        accountPayOrderExt.setGoodsName("分账");
+                        if (null != splitBillRules && splitBillRules.size() > 0) {
+                            accountPayOrderExt.setSplitBillRules(splitBillRules);
+                        }
+                        String ext = JSON.toJSONString(accountPayOrderExt);
+                        logger.info("分账规则串json串:" + ext);
+                        accountPayOrder.setP6_ext(ext);
+                        // 生成签名
+                        StringBuilder builder = new StringBuilder();
+                        builder.append(Constant.SPLIT)
+                                .append(accountPayOrder.getP1_bizType()).append(Constant.SPLIT)
+                                .append(accountPayOrder.getP2_signType()).append(Constant.SPLIT)
+                                .append(accountPayOrder.getP3_timestamp()).append(Constant.SPLIT)
+                                .append(accountPayOrder.getP4_orderId()).append(Constant.SPLIT)
+                                .append(accountPayOrder.getP5_customerNumber()).append(Constant.SPLIT)
+                                .append(accountPayOrder.getP6_ext()).append(Constant.SPLIT)
+                                .append(Constant.XUNI);
+                        String sign = Disguiser.disguiseMD5(builder.toString().trim());
+                        Map<String, String> bean = convertBean(accountPayOrder);
+                        logger.info("--------------------> 发送分账参数:  " + bean);
+                        Map<String, String> map = postForm(bean, Constant.FZ, sign, Map.class);
+                        logger.info("----------------分账返回数据: " + map.toString());
+                        if (map != null) {
+                            String code = map.get("rt5_retCode");
+                            if (!"0000".equals(code)) {
+                                String msg = map.get("rt6_retMsg");
+                                logger.info("【手动分账】>>>>>>>>>>手动分账失败>>>>>>>msg:" + msg);
+                            } else {
+                                for (SplitAccountPo splitAccount : splitBillDetail) {
+                                    splitAccount.setMbOrderId(orderRelation.getMbOrderId());
+                                    splitAccount.setOrderRequestNo(substring + orderRelation.getOrderRequestNo());
+                                    splitAccount.setPayStatus(1);
+                                    // 保存分账详情
+                                    newOrderDao.insertSplitAccount(splitAccount);
+                                }
+                                redisService.remove("XSFZMDS");
+                                logger.info("【手动分账】>>>>>>>>>>此订单分账结束");
                             }
-                            redisService.remove("XSFZMDS");
-                            logger.info("【手动分账】>>>>>>>>>>此订单分账结束");
                         }
+                    } catch (Exception e) {
+                        logger.error("【手动分账】>>>>>>>>>>错误信息", e);
                     }
-                } catch (Exception e) {
-                    logger.error("【手动分账】>>>>>>>>>>错误信息", e);
-                }
+                } else {
+                    // 没有佣金分账,全是成本,本笔交易已分帐
+                    newOrderDao.updateBySplitStatus(orderRelation.getMbOrderId());
+                    //没有佣金分账也解锁
+                    redisService.remove("XSFZMDS");
                 }
             }
         }
+    }
 
 
     private List<SplitAccountPo> setSplitAccountDetail(ShopOrderVo shopOrder, PayParamBo payParam) {
@@ -227,11 +317,9 @@ public class SplitAccountService extends BaseService {
                 splitAccount.setShopId(orderProduct.getShopId());
                 splitAccount.setSplitAccount(costPrice);
                 splitAccount.setProductType(1);
-                if (StringUtils.isNotBlank(orderProduct.getSplitCode())) {
-                    // 该商品设置了商户号
-                    splitAccount.setType(4);
-                    splitAccount.setSubUserNo(orderProduct.getSplitCode());
-                }
+                // 该商品设置了商户号
+                splitAccount.setType(4);
+                splitAccount.setSubUserNo(shopOrder.getSplitCode());
                 logger.info("成本分账参数------------->" + splitAccount.toString());
                 list.add(splitAccount);
             }
@@ -259,16 +347,14 @@ public class SplitAccountService extends BaseService {
                 splitAccount.setShopId(shopOrder.getShopId());
                 splitAccount.setSplitAccount(shopPostFee);
                 splitAccount.setProductType(2);
-                if (StringUtils.isNotBlank(shopOrder.getSplitCode())) {
-                    //供应商拥有子商户号
-                    splitAccount.setType(4);
-                    splitAccount.setSubUserNo(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);

+ 81 - 2
src/main/resources/mappings/modules/order/OrderMapper.xml

@@ -961,7 +961,19 @@
     <update id="updateOnlinePayFlag">
         update cm_order set onlinePayFlag = #{onlinePayFlag} where orderID = #{orderId}
     </update>
-
+    <update id="updateShopOrderByPayStatus">
+        UPDATE cm_shop_order SET
+        payStatus = #{payStatus}, payedShopAmount = #{paidShop}
+        WHERE shopOrderID = #{shopOrderId}
+    </update>
+    <update id="updateOrderByPayStatus">
+        UPDATE cm_order SET
+            payStatus = #{payStatus}
+        WHERE orderID = #{orderId}
+    </update>
+    <update id="updateBySplitStatus">
+        UPDATE cm_receipt_order_relation SET splitStatus = 1 WHERE mbOrderId = #{mbOrderId}
+    </update>
     <delete id="deleteCouponOrderRecord">
         DELETE
         FROM cm_coupon_order_record
@@ -1247,7 +1259,62 @@
           AND IF(co.userBeans = 0, 1 = 1, cop.shopid != 998)
         ORDER BY cop.discountPrice DESC
     </select>
-
+    <select id="getShopOrderByOrderId" resultType="com.caimei.modules.order.entity.ShopOrderVo">
+        SELECT shopOrderID AS shopOrderId,
+               shopOrderNo,
+               orderID     AS orderId,
+               orderNo,
+               shopID      AS shopId,
+               note,
+               userID      AS userId,
+               clubID      AS clubId,
+               spID        AS spId,
+               orderPromotionsId,
+               promotionFullReduction,
+               brokerage,
+               canRefundAmount,
+               itemCount,
+               totalAmount,
+               productAmount,
+               needPayAmount,
+               shopProductAmount,
+               shopPostFee,
+               shopTaxFee,
+               shouldPayShopAmount,
+               orderTime,
+               orderSubmitType,
+               payStatus,
+               sendOutStatus,
+               splitFlag,
+               splitCode
+        FROM cm_shop_order
+        WHERE delFlag = 0
+          AND orderID = #{orderId}
+    </select>
+    <select id="getSplitAccountList" resultType="com.caimei.modules.order.entity.SplitAccountPo">
+        SELECT
+            id,
+            orderId,
+            productId,
+            orderProductId,
+            shopId,
+            type,
+            subUserNo,
+            SUM(splitAccount) AS splitAccount,
+            mbOrderId,
+            orderRequestNo,
+            payStatus,
+            productType
+        FROM cm_split_account
+        WHERE type = 4 AND payStatus = 1 AND splitAccount > 0
+          AND mbOrderId = #{mbOrderId}
+        GROUP BY shopId
+    </select>
+    <select id="getPaidShopAmount" resultType="java.lang.Double">
+        SELECT SUM(payAmount)
+        FROM cm_pay_shop_record
+        WHERE STATUS = 1 AND delFlag = 0 AND shopOrderID = #{shopOrderId}
+    </select>
     <insert id="insertSplitAccount">
         INSERT INTO cm_split_account (orderId, productId, orderProductId, shopId, couponRecordId, vipRecordId,
                                       authVipRecordId, type, subUserNo, splitAccount,
@@ -1256,4 +1323,16 @@
                 #{authVipRecordId}, #{type}, #{subUserNo}, #{splitAccount},
                 #{mbOrderId}, #{orderRequestNo}, #{payStatus}, #{productType},#{shopOrderId}, NOW());
     </insert>
+    <insert id="insertPayShop">
+        INSERT INTO cm_pay_shop (shopID, name, bankAccountName, bankAccount, bankName, type, totalAmount, balancePayFee,
+                                 transferPayFee, payType, wipePayment, wipeRemarks, wipeRemarkImages, wipeTime, applicant,
+                                 applyTime, reviewer, reviewTime, payTime, status, reason, delFlag)
+        VALUES (#{shopId}, #{name}, #{bankAccountName}, #{bankAccount}, #{bankName}, #{type}, #{totalAmount}, #{balancePayFee},
+                #{transferPayFee}, #{payType}, #{wipePayment}, #{wipeRemarks}, #{wipeRemarkImages}, #{wipeTime}, #{applicant},
+                #{applyTime}, #{reviewer}, #{reviewTime}, #{payTime}, #{status}, #{reason}, #{delFlag})
+    </insert>
+    <insert id="insertPayShopRecord">
+        INSERT INTO cm_pay_shop_record (shopID, shopOrderID, shopOrderNo, payAmount, wipePayment, payType, payTime, payShopID, status, delFlag)
+        VALUES (#{shopId}, #{shopOrderId}, #{shopOrderNo}, #{payAmount}, #{wipePayment}, #{payType}, #{payTime}, #{payShopId}, #{status}, #{delFlag})
+    </insert>
 </mapper>