소스 검색

维沙组织和机构逻辑修改part1

Aslee 3 년 전
부모
커밋
fb3744d6de

+ 14 - 43
src/main/java/com/caimei/controller/OrderApi.java

@@ -33,56 +33,27 @@ public class OrderApi {
         this.orderService = orderService;
     }
 
-
     /**
-     * 下单
-     * data 参数格式:{
-     *                     "sign": ****,        //签名
-     *                     "notifyUrl": ****,       //订单支付完成通知回调地址
-     *                     "addressInfo": {         //收货地址信息
-     *                          "receiveMan":"收货人",     //收货人
-     *                          "mobile":"15816666666",    //手机号
-     *                          "provinceName":"广东省",   //省
-     *                          "cityName":"深圳市",       //市/县
-     *                          "townName":"福田区",       //区
-     *                          "addressDetail":"*****"   //详细地址
-     *                     },          //
-     *                     "orderId": cm6858,          //对接组织的订单Id,由组织自行生成
-     *                     "productInfo": { "0001":2,    // 商品Id:购买数量
-     *                                       "0002":3
-     *                                   }
-     *                     "orderShouldPayFee": 609.11,     // 订单总金额
-     *                     "invoiceInfo": {}// 发票信息: {"type": 0},// 不开发票
-     *                                     {
-     *                                         "type": 2,             // 要发票
-     *                                         "invoiceTitle": "单位名称",
-     *                                         "corporationTaxNum": "NSRSBM97897",
-     *                                         "registeredAddress": "注册地址",
-     *                                         "registeredPhone": "15814011616",
-     *                                         "openBank": "开户银行",
-     *                                         "bankAccountNo": "987987465465464"
-     *                                     }
-     *                 }
+     * 订单详情
      */
-    @PostMapping("/submit")
-    public ResponseJson orderSubmit(HttpServletRequest request) {
-        log.info("API对接组织下单");
+    @PostMapping("/detail")
+    public ResponseJson<Map<String, Object>> orderDetail(HttpServletRequest request) {
         String cmAccount = request.getParameter("cmAccount");
         String data = request.getParameter("data");
         if (StringUtils.isEmpty(cmAccount)) {
-            return ResponseJson.error("采美账户不能为空");
+            return ResponseJson.error("采美账户不能为空", null);
         }
         if (StringUtils.isEmpty(data)) {
-            return ResponseJson.error("订单数据不能为空");
+            return ResponseJson.error("订单数据不能为空", null);
         }
-        return orderService.orderSubmit(cmAccount, data);
+        return orderService.orderDetail(cmAccount, data);
     }
 
     /**
-     * 订单详情
+     * 取消订单
      */
-    @PostMapping("/detail")
-    public ResponseJson<Map<String, Object>> orderDetail(HttpServletRequest request) {
+    @PostMapping("/cancel")
+    public ResponseJson orderCancel(HttpServletRequest request) {
         String cmAccount = request.getParameter("cmAccount");
         String data = request.getParameter("data");
         if (StringUtils.isEmpty(cmAccount)) {
@@ -91,14 +62,14 @@ public class OrderApi {
         if (StringUtils.isEmpty(data)) {
             return ResponseJson.error("订单数据不能为空", null);
         }
-        return orderService.orderDetail(cmAccount, data);
+        return orderService.orderCancel(cmAccount, data);
     }
 
     /**
-     * 取消订单
+     * 余额抵扣
      */
-    @PostMapping("/cancel")
-    public ResponseJson orderCancel(HttpServletRequest request) {
+    @PostMapping("/balance/deduction")
+    public ResponseJson<Map<String, Object>> balanceDeduction(HttpServletRequest request) {
         String cmAccount = request.getParameter("cmAccount");
         String data = request.getParameter("data");
         if (StringUtils.isEmpty(cmAccount)) {
@@ -107,7 +78,7 @@ public class OrderApi {
         if (StringUtils.isEmpty(data)) {
             return ResponseJson.error("订单数据不能为空", null);
         }
-        return orderService.orderCancel(cmAccount, data);
+        return orderService.balanceDeduction(cmAccount, data);
     }
 
     /**

+ 79 - 0
src/main/java/com/caimei/controller/OrderSubmitApi.java

@@ -0,0 +1,79 @@
+package com.caimei.controller;
+
+
+import com.caimei.model.ResponseJson;
+import com.caimei.service.OrderService;
+import com.caimei.service.OrderSubmitService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+/**
+ * @author Aslee
+ */
+@Slf4j
+@RestController
+@RequestMapping("/order")
+public class OrderSubmitApi {
+    private OrderSubmitService orderSubmitService;
+
+    @Autowired
+    public void setOrderSubmitService(OrderSubmitService orderSubmitService) {
+        this.orderSubmitService = orderSubmitService;
+    }
+
+
+
+    /**
+     * 下单
+     * data 参数格式:{
+     *                     "sign": ****,        //签名
+     *                     "notifyUrl": ****,       //订单支付完成通知回调地址
+     *                     "addressInfo": {         //收货地址信息
+     *                          "receiveMan":"收货人",     //收货人
+     *                          "mobile":"15816666666",    //手机号
+     *                          "provinceName":"广东省",   //省
+     *                          "cityName":"深圳市",       //市/县
+     *                          "townName":"福田区",       //区
+     *                          "addressDetail":"*****"   //详细地址
+     *                     },          //
+     *                     "orderId": cm6858,          //对接组织的订单Id,由组织自行生成
+     *                     "productInfo": { "0001":2,    // 商品Id:购买数量
+     *                                       "0002":3
+     *                                   },
+*                          "payInfo": {
+ *                                  "orderShouldPayFee": 609.11,     // 订单总金额
+ *                                  "balancePayFlag": 0,    //是否使用余额抵扣,0否,1是
+     *                          },
+     *                     "invoiceInfo": {}// 发票信息: {"type": 0},// 不开发票
+     *                                     {
+     *                                         "type": 2,             // 要发票
+     *                                         "invoiceTitle": "单位名称",
+     *                                         "corporationTaxNum": "NSRSBM97897",
+     *                                         "registeredAddress": "注册地址",
+     *                                         "registeredPhone": "15814011616",
+     *                                         "openBank": "开户银行",
+     *                                         "bankAccountNo": "987987465465464"
+     *                                     }
+     *                 }
+     */
+    @PostMapping("/submit")
+    public ResponseJson orderSubmit(HttpServletRequest request) {
+        log.info("API对接组织下单");
+        String cmAccount = request.getParameter("cmAccount");
+        String data = request.getParameter("data");
+        if (StringUtils.isEmpty(cmAccount)) {
+            return ResponseJson.error("采美账户不能为空");
+        }
+        if (StringUtils.isEmpty(data)) {
+            return ResponseJson.error("订单数据不能为空");
+        }
+        return orderSubmitService.orderSubmit(cmAccount, data);
+    }
+}

+ 43 - 0
src/main/java/com/caimei/controller/UserApi.java

@@ -0,0 +1,43 @@
+package com.caimei.controller;
+
+import com.caimei.model.ResponseJson;
+import com.caimei.service.UserService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+@Slf4j
+@RestController
+@RequestMapping("/user")
+public class UserApi {
+    private UserService userService;
+
+    @Autowired
+    public void setUserService(UserService userService) {
+        this.userService = userService;
+    }
+
+    /**
+     * 获取用户余额
+     * @param request
+     * @return
+     */
+    @PostMapping("/balance")
+    public ResponseJson<Map<String,Object>> getBalance(HttpServletRequest request){
+        String cmAccount = request.getParameter("cmAccount");
+        String data = request.getParameter("data");
+        if (StringUtils.isEmpty(cmAccount)) {
+            return ResponseJson.error("采美账户不能为空", null);
+        }
+        if (StringUtils.isEmpty(data)) {
+            return ResponseJson.error("用户数据不能为空", null);
+        }
+        return userService.getBalance(cmAccount, data);
+    }
+}

+ 6 - 0
src/main/java/com/caimei/mapper/OrderMapper.java

@@ -70,4 +70,10 @@ public interface OrderMapper {
     CmOrderPo getOrder(@Param("userId") Integer userId, @Param("apiOrganizeOrderId") String apiOrganizeOrderId);
 
     void updateNotifyUrl(@Param("organizeId") Integer organizeId, @Param("notifyUrl") String notifyUrl);
+
+    void updateUserMoney(BigDecimal userMoney, BigDecimal ableUserMoney, Integer userId);
+
+    void insertDiscernReceipt(CmDiscernReceiptPo discernReceipt);
+
+    void insertOrderRelation(CmReceiptOrderRelationPo relation);
 }

+ 10 - 0
src/main/java/com/caimei/mapper/OrganizeMapper.java

@@ -1,7 +1,11 @@
 package com.caimei.mapper;
 
+import com.caimei.model.po.BalanceRecordPo;
 import com.caimei.model.po.CmApiOrganizePo;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.math.BigDecimal;
 
 /**
  * Description
@@ -13,4 +17,10 @@ import org.apache.ibatis.annotations.Mapper;
 public interface OrganizeMapper {
 
     CmApiOrganizePo getOrganizeByCmAccount(String cmAccount);
+
+    BigDecimal getBalanceByUserId(Integer userId);
+
+    void updateMoney(@Param("userMoney") BigDecimal userMoney,@Param("ableUserMoney") BigDecimal ableUserMoney,@Param("userId") Integer userId);
+
+    void insertBalanceRecord(BalanceRecordPo balanceRecord);
 }

+ 76 - 0
src/main/java/com/caimei/model/po/BalanceRecordPo.java

@@ -0,0 +1,76 @@
+package com.caimei.model.po;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * cm_user_balance_record
+ *
+ * @author
+ */
+@Data
+public class BalanceRecordPo implements Serializable {
+    private Long id;
+
+    /**
+     * 用户ID
+     */
+    private Long userId;
+
+    /**
+     * 收支类型:1收入,2支出
+     */
+    private String type;
+
+    /**
+     * 余额类型:1余额抵扣,2多收退款到余额,3申请退款,4余额充值,5余额提现,6订金订单充值,7余额订单充值,8订金订单退款,9余额订单退款
+     */
+    private String balanceType;
+
+    /**
+     * 添加时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date addDate;
+
+    /**
+     * 金额
+     */
+    private BigDecimal amount;
+
+    /**
+     * 主订单ID(适用余额类型1,3[类型为3多次退款存在相同记录ID则需通过退款ID唯一区分])
+     */
+    private Long orderId;
+
+    /**
+     * 收款ID(适用余额类型2)
+     */
+    private Long receiptId;
+
+    /**
+     * 退货退款ID(适用余额类型3)
+     */
+    private Long returnedId;
+
+    /**
+     * 用户提现ID对应表(cm_user_balance_withdrawals)
+     */
+    private Long withdrawalsId;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 删除标记 0 否,其余是
+     */
+    private String delFlag;
+
+    private static final long serialVersionUID = 1L;
+}

+ 70 - 0
src/main/java/com/caimei/model/po/CmReceiptOrderRelationPo.java

@@ -0,0 +1,70 @@
+package com.caimei.model.po;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * cm_receipt_order_relation
+ *
+ * @author
+ */
+@Data
+public class CmReceiptOrderRelationPo implements Serializable {
+    private Long id;
+
+    /**
+     * 关系类型:1返佣订单(返佣款)、2非返佣订单(订单款或者非订单款)
+     */
+    private String relationType;
+
+    /**
+     * 识别款项Id(对应cm_discern_receipt表)
+     */
+    private Integer receiptID;
+
+    /**
+     * 订单Id(relationType值为1是为子订单ID,为2时为主订单ID)
+     */
+    private Integer orderID;
+
+    /**
+     * 关联方式: 1手动 2自动
+     */
+    private String associationType;
+
+    /**
+     * 米花科技平台唯一流水号
+     */
+    private String mbOrderId;
+
+    /**
+     * 商户唯一订单请求号(订单编号T随机时间戳)
+     */
+    private String orderRequestNo;
+
+    /**
+     * 分账状态:0待分账,1已分账(只针对线上支付)
+     */
+    private String splitStatus;
+
+    /**
+     * 关联金额:1普通收款(线下):收款具体对该应母订单的收金额、2线上支付:付款金额就等于该金额、3返佣收款:默认为0
+     */
+    private BigDecimal associateAmount;
+
+    /**
+     * 删除标记 0 否,其余是
+     */
+    private String delFlag;
+
+    /**
+     * 付款类型:1建设银行7297、2广发银行0115、3中信银行7172、4中信银行0897、5中信银行0897-财付通、6中信银行0897-支付宝、
+     * 7线上-支付宝、8线上-微信支付、9线上-快钱支付、10口头返佣、11广发银行5461、12PC-B2B网银、13PC-微信支付、14PC-支付宝、
+     * 15小程序-微信支付、16余额抵扣
+     */
+    private String payType;
+
+    private static final long serialVersionUID = 1L;
+}

+ 8 - 8
src/main/java/com/caimei/service/OrderService.java

@@ -10,14 +10,6 @@ import java.util.Map;
  * @author Aslee
  */
 public interface OrderService {
-    /**
-     * 订单提交
-     *
-     * @param cmAccount
-     * @param data
-     * @return
-     */
-    ResponseJson orderSubmit(String cmAccount, String data);
 
     /**
      * 订单详情
@@ -42,4 +34,12 @@ public interface OrderService {
      * @return
      */
     ResponseJson payCallBack(String cmAccount, String data);
+
+    /**
+     * 余额抵扣
+     * @param cmAccount
+     * @param data
+     * @return
+     */
+    ResponseJson<Map<String, Object>> balanceDeduction(String cmAccount, String data);
 }

+ 35 - 0
src/main/java/com/caimei/service/OrderSubmitService.java

@@ -0,0 +1,35 @@
+package com.caimei.service;
+
+import com.caimei.model.ResponseJson;
+
+import java.math.BigDecimal;
+import java.util.Map;
+
+/**
+ * @author Aslee
+ */
+public interface OrderSubmitService {
+    /**
+     * 订单提交
+     *
+     * @param cmAccount
+     * @param data
+     * @return
+     */
+    ResponseJson orderSubmit(String cmAccount, String data);
+
+    /**
+     * 保存收款记录
+     * @param balancePayFee
+     * @param orderId
+     */
+    void saveDiscernReceipt(BigDecimal balancePayFee, Integer orderId);
+
+    /**
+     * 保存余额抵扣记录
+     * @param balancePayFee
+     * @param orderId
+     * @param userId
+     */
+    void saveBalanceRecord(BigDecimal balancePayFee, Integer orderId, Integer userId);
+}

+ 21 - 0
src/main/java/com/caimei/service/UserService.java

@@ -0,0 +1,21 @@
+package com.caimei.service;
+
+import com.caimei.model.ResponseJson;
+
+import java.util.Map;
+
+
+/**
+ * @author Aslee
+ */
+public interface UserService {
+
+    /**
+     * 获取用户余额
+     * @param cmAccount 采美账户
+     * @param data      用户数据
+     * @return
+     */
+    ResponseJson<Map<String,Object>> getBalance(String cmAccount, String data);
+
+}

+ 108 - 861
src/main/java/com/caimei/service/impl/OrderServiceImpl.java

@@ -9,9 +9,11 @@ import com.caimei.model.enumerate.ReceivablesType;
 import com.caimei.model.po.*;
 import com.caimei.model.vo.*;
 import com.caimei.service.OrderService;
+import com.caimei.service.OrderSubmitService;
 import com.caimei.utils.*;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -40,416 +42,13 @@ public class OrderServiceImpl implements OrderService {
     @Value("${caimei.oldapi}")
     private String domain;
 
-    @Transactional
-    @Override
-    public ResponseJson orderSubmit(String cmAccount, String data) {
-        // 获取组织信息
-        CmApiOrganizePo organizePo = organizeMapper.getOrganizeByCmAccount(cmAccount);
-        if (null == organizePo) {
-            return ResponseJson.error("参数异常,用户不存在");
-        }
-        // 获得用户Id
-        Integer userId = organizePo.getUserId();
-        JSONObject orderInfo = null;
-        try {
-            // 使用组织对应的公钥解密,获得订单数据
-            orderInfo = KeyUtils.decryptDataPublic(data, organizePo.getPublicKey());
-            // 私钥验签
-            String preSign = orderInfo.getString("sign");
-            orderInfo.remove("sign");
-            String sufSign = KeyUtils.buildSign(orderInfo, organizePo.getPrivateKey());
-            if (!preSign.equals(sufSign)) {
-                return ResponseJson.error("验签失败");
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-            return ResponseJson.error("解密失败");
-        }
-        String apiOrganizeOrderId;
-        Map<String, Object> addressInfo;
-        Map<String, Object> productInfo;
-        BigDecimal orderShouldPayFee;
-        Map<String, Object> invoiceInfo;
-        String notifyUrl;
-        try {
-            addressInfo = orderInfo.getJSONObject("addressInfo");
-            if (null == addressInfo) {
-                return ResponseJson.error("地址数据异常");
-            }
-            // 组织订单Id,由组织自行生成,必须唯一
-            apiOrganizeOrderId = orderInfo.getString("orderId");
-            // 验证组织订单Id是否唯一
-            Integer countByOrderId = orderMapper.getCountByOrderId(userId, apiOrganizeOrderId);
-            if (null != countByOrderId && countByOrderId > 0) {
-                return ResponseJson.error("订单Id已存在,请勿重复提交");
-            }
-            productInfo = orderInfo.getJSONObject("productInfo");
-            if (null == productInfo) {
-                return ResponseJson.error("订单商品数据异常");
-            }
-            orderShouldPayFee = orderInfo.getBigDecimal("orderShouldPayFee");
-            if (null == orderShouldPayFee) {
-                return ResponseJson.error("订单金额数据异常");
-            }
-            invoiceInfo = orderInfo.getJSONObject("invoiceInfo");
-            if (null == invoiceInfo) {
-                return ResponseJson.error("订单发票数据异常");
-            }
-            notifyUrl = orderInfo.getString("notifyUrl");
-            if (StringUtils.isNotEmpty(notifyUrl) && !notifyUrl.equals(organizePo.getNotifyUrl())) {
-                //更新回调地址
-                orderMapper.updateNotifyUrl(organizePo.getOrganizeId(), notifyUrl);
-            }
-        } catch (Exception e) {
-            return ResponseJson.error("数据异常");
-        }
-        log.info("******************** 提交订单逻辑处理 start *******************");
-        //机构用户
-        UserPo user = orderMapper.getUserByUserId(userId);
-        if (null == user) {
-            return ResponseJson.error("用户信息异常");
-        }
-        // 商品总数量
-        Integer productCount = 0;
-        // 赠品数量
-        Integer presentCount = 0;
-        //促销赠品数量
-        Integer promotionalGiftsCount = 0;
-        // 商品总金额 (商品单价乘以数量,再加上税费[默认0])
-        BigDecimal productTotalFee = BigDecimal.ZERO;
-        // 小计金额(商品折后单价乘以数量,再加上税费[默认0])
-        BigDecimal orderTotalFee = BigDecimal.ZERO;
-        // 订单总额(小计金额减去经理折扣后,再加上运费[默认0])
-        BigDecimal payTotalFee = BigDecimal.ZERO;
-        // 真实支付金额(订单总额减去抵扣的账户余额)
-        BigDecimal payableAmount = BigDecimal.ZERO;
-        /*
-         * 发票信息获取
-         */
-        boolean invoiceFlag = false;
-        BpOrderInvoicePo invoice = new BpOrderInvoicePo();
-        Integer invoiceType = (Integer) invoiceInfo.get("type");
-        if (null == invoiceType) {
-            return ResponseJson.error("发票类型不能为空");
-        } else {
-            invoice.setType(invoiceType.longValue());
-            if (0 != invoiceType) {
-                // 发票类型 0不开发票 1普通发票 2增值税发票
-                invoiceFlag = true;
-                if (setInvoiceParam(invoiceInfo, invoice, invoiceType)) {
-                    return ResponseJson.error("发票信息不完整");
-                }
-            }
-        }
-        // 获取地址信息
-        String provinceName = (String) addressInfo.get("provinceName");
-        String cityName = (String) addressInfo.get("cityName");
-        String townName = (String) addressInfo.get("townName");
-        String receiveMan = (String) addressInfo.get("receiveMan");
-        String mobile = (String) addressInfo.get("mobile");
-        String addressDetail = (String) addressInfo.get("addressDetail");
-        if (StringUtils.isEmpty(provinceName) || StringUtils.isEmpty(cityName) || StringUtils.isEmpty(townName) || StringUtils.isEmpty(receiveMan) || StringUtils.isEmpty(mobile)) {
-            return ResponseJson.error("地址信息不完整");
-        }
-        Integer provinceId = orderMapper.getProvinceId(provinceName);
-        Integer cityId = orderMapper.getCityId(cityName);
-        Integer townId = orderMapper.getTownId(townName);
-        if (null == provinceId || null == cityId || null == townId) {
-            return ResponseJson.error("地址信息异常");
-        }
-        /*
-         * 初始化主订单参数
-         */
-        CmOrderPo order = new CmOrderPo();
-        String curDateStr = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(new Date());
-        // 订单号
-        String orderNo = OrderNoUtils.getOrderNo("D");
-        order.setOrderNo(orderNo);
-        order.setApiOrganizeOrderId(apiOrganizeOrderId);
-        // 运营人员下单
-        order.setBuyUserID(user.getUserID());
-        order.setOrderType(1);
-        order.setOrderSubmitType(2);
-        order.setConfirmFlag("2");
-        order.setUserID(user.getUserID().longValue());
-        // 机构ID
-        order.setClubID(user.getClubID().longValue());
-        // 订单来源
-        order.setOrderSource("7");
-        order.setOrganizeID(0);
-        order.setUpdateDate(curDateStr);
-        order.setPayFlag("0");
-        order.setCooFreeFlag("0");
-        order.setCooFreeAmount(BigDecimal.ZERO);
-        order.setCooFreeRate(0);
-        order.setOnlinePayFlag("0");
-        order.setPreferential(BigDecimal.ZERO);
-        order.setDiscountFee(BigDecimal.ZERO);
-        // 订单提交时间
-        order.setOrderTime(curDateStr);
-        // 默认订单可以拆分
-        order.setSplitFlag("1");
-        // 发票类型
-        order.setInvoiceFlag(invoiceType.toString());
-        order.setReceiptStatus("1");
-        order.setPayStatus("1");
-        order.setZeroCostFlag(0);
-        order.setSendOutStatus("1");
-        order.setRefundType("0");
-        // 是否包含活动商品(受订单未支付自动关闭时间影响)  0 否 1 是
-        order.setHasActProduct("0");
-        // 订单状态 0 有效  其它无效
-        order.setDelFlag("0");
-        // 是否确认付款供应商
-        order.setAffirmPaymentFlag("0");
-        /*
-            订单商品
-         */
-        List<CmOrderProductPo> orderProductList = new ArrayList<>();
-        // 收集供应商ID列表
-        List<Integer> shopIdList = new ArrayList<>();
-        for (Map.Entry<String, Object> product : productInfo.entrySet()) {
-            String productId = product.getKey();
-            Integer productNum = (Integer)product.getValue();
-            // 统计商品数量
-            productCount += productNum;
-            // 获取商品信息
-            CmApiOrganizeProductPo organizeProduct = productMapper.getProductByProductId(productId);
-            if (productNum < organizeProduct.getMinBuyNumber()) {
-                return ResponseJson.error("商品购买数量不能少于最小起订量");
-            }
-            if (null == organizeProduct) {
-                return ResponseJson.error("订单商品数据异常");
-            }
-            if (null == productNum || productNum == 0) {
-                return ResponseJson.error("商品购买数量异常");
-            }
-            // 获取商品购买价格(活动价格>>>阶梯价格>>>复购价格库>>>商品原始价)
-            BigDecimal productPrice = organizeProduct.getPrice();
-            // 成本价
-            BigDecimal costPrice = BigDecimal.ZERO;
-            // 机构税费(单)
-            BigDecimal addedValueTax = new BigDecimal(0);
-            int priceType = 0;
-            // 活动状态
-            organizeProduct.setActStatus(0);
-            if (1 == organizeProduct.getLadderPriceFlag()) {
-                // 启用了阶梯价格
-                List<LadderPriceVo> ladderPriceList = productMapper.getLadderPriceByProductId(organizeProduct.getId());
-                // 判断阶梯价格的购买数量校验
-                long minBuyNumber = null != ladderPriceList.get(0) ? ladderPriceList.get(0).getBuyNum() : 0L;
-                if (productNum < minBuyNumber) {
-                    return ResponseJson.error("商品购买量低于最小起订量");
-                }
-                //根据商品购买数量获取商品对应阶梯价格
-                for (LadderPriceVo ladderPrice : ladderPriceList) {
-                    if (productNum >= ladderPrice.getBuyNum()) {
-                        productPrice = ladderPrice.getBuyPrice();
-                    }
-                }
-                organizeProduct.setActStatus(2);
-                priceType = 2;
-            }
-            //不含税可开票商品计算税费
-            boolean addTaxFlag = 0 == organizeProduct.getIncludedTax() && (1 == organizeProduct.getInvoiceType() || 2 == organizeProduct.getInvoiceType());
-            if (addTaxFlag) {
-                addedValueTax = MathUtil.div(MathUtil.mul(productPrice, organizeProduct.getClubTaxPoint()), BigDecimal.valueOf(100));
-                productPrice = MathUtil.add(productPrice, addedValueTax);
-            }
-            if (MathUtil.compare(productPrice, BigDecimal.ZERO) == 0) {
-                return ResponseJson.error("商品购买价格不能为0");
-            }
-            // 单个商品的金额
-            BigDecimal productFee = MathUtil.mul(productPrice, productNum);
-            // 统计商品总金额
-            productTotalFee = MathUtil.add(productTotalFee, productFee);
-            // 判断是否选中固定成本价
-            if (MathUtil.compare(organizeProduct.getCostPrice(), 0) > 0 && 1 == organizeProduct.getCostType()) {
-                costPrice = organizeProduct.getCostPrice();
-            }
-            // 判断是否选中比例成本价
-            if (MathUtil.compare(organizeProduct.getCostProportional(), 0) > 0 && 2 == organizeProduct.getCostType()) {
-                // 通过售价*比例得到成本价
-                costPrice = BigDecimal.valueOf(MathUtil.div(MathUtil.mul(productPrice, organizeProduct.getCostProportional()), 100).floatValue());
-            }
-            organizeProduct.setCostPrice(costPrice);
-            /*
-             * 整理订单商品数据
-             */
-            CmOrderProductPo orderProduct = setOrderProduct(productNum, organizeProduct, productPrice, priceType, 0, addedValueTax);
-            // 加入订单商品列表
-            orderProductList.add(orderProduct);
-            // 保存供应商id
-            if (!shopIdList.contains(orderProduct.getShopID().intValue())) {
-                shopIdList.add(orderProduct.getShopID().intValue());
-            }
-        }
-        // 设置是否是二手订单
-        order.setSecondHandOrderFlag("0");
-        order.setPromotionFullReduction(BigDecimal.ZERO);
-        // 商品总数量
-        order.setProductCount(productCount);
-        // 赠品数量
-        order.setPresentCount(0);
-        //促销赠品数量
-        order.setPromotionalGiftsCount(0);
-        // 0包邮 -1到付 1 有运费
-        order.setFreePostFlag("-1");
-        order.setFreight(BigDecimal.ZERO);
-        // 商品总额
-        order.setProductTotalFee(productTotalFee);
-        // 订单总额(商品金额+运费)
-        payTotalFee = productTotalFee;
-        orderTotalFee = productTotalFee;
-        order.setOrderTotalFee(orderTotalFee);
-        order.setPayTotalFee(payTotalFee);
-        payableAmount = payTotalFee;
-
-        // 订单状态
-        order.setStatus("11");
-        order.setConfirmTime(curDateStr);
-
-        // 余额支付金额
-        order.setBalancePayFee(BigDecimal.ZERO);
-        // 实际支付金额(商品金额+运费-余额抵扣)
-        order.setPayableAmount(payableAmount);
-        // 售后条款
-        order.setClauseID(1L);
-        order.setClauseName("无条款");
-        // 是否返佣订单
-        order.setRebateFlag("0");
-        // 判断前端传入orderShouldPayFee订单应付金额,和后台计算应付金额对比
-        double v = MathUtil.sub(payableAmount, orderShouldPayFee).doubleValue();
-        log.info(">>>>>payableAmount:" + payableAmount + " ,orderShouldPayFee:" + orderShouldPayFee);
-        // 考虑前端计算不精确
-        if (v < -0.1d || v > 0.1d) {
-            // 设置手动回滚事务
-            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-            return ResponseJson.error("订单付款金额异常");
-        }
-
-        /*
-         * 保存主订单数据
-         */
-        orderMapper.insertOrder(order);
-        log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>新增主订单(insert[cm_order])orderId:" + order.getOrderID());
-
-        /*
-         * 设置订单商品订单号
-         */
-        for (CmOrderProductPo orderProduct : orderProductList) {
-            orderProduct.setOrderID(order.getOrderID());
-            orderProduct.setOrderNo(order.getOrderNo());
-        }
-        /*
-         * 整理 子订单信息
-         */
-        // 收集子订单供应商ID字符串
-        String shopOrderIds = "";
-        for (Integer shopId : shopIdList) {
-            // 初始化子订单信息
-            CmShopOrderPo shopOrder = saveShopOrder(order, orderProductList, shopId, "");
-            // 保存子订单号
-            shopOrderIds += (("".equals(shopOrderIds) ? "" : ",") + shopOrder.getShopOrderID());
-            // 设置订单商品子订单号
-            for (CmOrderProductPo orderProduct : orderProductList) {
-                if (shopId.longValue() == orderProduct.getShopID()) {
-                    orderProduct.setShopOrderID(shopOrder.getShopOrderID());
-                    orderProduct.setShopOrderNo(shopOrder.getShopOrderNo());
-                }
-            }
-        }
-        /*
-         * 保存订单商品
-         */
-        List<OrderProductLadderPricePo> orderProductLadderPriceList = new ArrayList<>();
-        for (CmOrderProductPo orderProduct : orderProductList) {
-            // 保存订单商品数据
-            orderMapper.insertOrderProduct(orderProduct);
-            log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>保存订单商品(insert[cm_order_product])OrderProductID:" + orderProduct.getOrderProductID());
-            if ("1".equals(orderProduct.getLadderPriceFlag())) {
-                //使用阶梯价格的订单商品保存下单时的阶梯价格列表
-                List<LadderPriceVo> ladderPriceList = productMapper.findLadderPriceByProductId(orderProduct.getProductID());
-                ladderPriceList.forEach(ladderPriceVo -> {
-                    OrderProductLadderPricePo orderProductLadderPrice = new OrderProductLadderPricePo();
-                    orderProductLadderPrice.setOrderProductId(orderProduct.getOrderProductID());
-                    orderProductLadderPrice.setBuyNum(ladderPriceVo.getBuyNum());
-                    orderProductLadderPrice.setBuyPrice(ladderPriceVo.getBuyPrice());
-                    orderProductLadderPrice.setCreateDate(new Date());
-                    orderProductLadderPrice.setLadderNum(ladderPriceVo.getLadderNum());
-                    orderProductLadderPriceList.add(orderProductLadderPrice);
-                });
-            }
-        }
-        if (!CollectionUtils.isEmpty(orderProductLadderPriceList)) {
-            orderProductLadderPriceList.forEach(ladderPrice -> {
-                orderMapper.insertOrderProductLadderPrice(ladderPrice);
-            });
-        }
-        /*
-         * 设置邮费子订单
-         */
-        if ("1".equals(order.getFreePostFlag())) {
-            shopOrderIds = setPostFeeShopOrder(order, shopOrderIds, orderInfo.size());
-        }
-
-        // 更新主订单信息, 子订单ID:1000,1002
-        order.setShopOrderIDs(shopOrderIds);
-        orderMapper.updateOrder(order);
-
-        /*
-         * 保存 订单用户地址
-         */
-        //保存地址信息
-        BpOrderUserInfoPo userInfo = new BpOrderUserInfoPo();
-        userInfo.setOrderId(order.getOrderID());
-        userInfo.setClubId(user.getClubID().longValue());
-        userInfo.setUserId(user.getUserID().longValue());
-        userInfo.setName(user.getName() == null ? user.getUserName() : user.getName());
-        userInfo.setShouHuoRen(receiveMan);
-        userInfo.setMobile(mobile);
-        userInfo.setPostalCode(null);
-        userInfo.setPostalCode(null);
-        userInfo.setTownId(townId);
-        userInfo.setProvince(provinceName);
-        userInfo.setCity(cityName);
-        userInfo.setTown(townName);
-        userInfo.setAddress(addressDetail);
-        orderMapper.insertUserInfo(userInfo);
-        log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>保存订单用户地址(insert[bp_order_userinfo])orderId:" + order.getOrderID());
-
+    private OrderSubmitService orderSubmitService;
 
-        /*
-         * 保存 订单发票信息
-         */
-        if (invoiceFlag) {
-            // 开发票才保存
-            invoice.setOrderId(order.getOrderID());
-            // 查询是否存在老的增值税信息
-            BpOrderInvoicePo userInvoice = orderMapper.getOrderInvoice(order.getOrderID());
-            if (null != userInvoice) {
-                // 更新 发票信息
-                orderMapper.updateOrderInvoice(invoice);
-                log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>更新发票信息(update[bp_order_invoice])orderId:" + order.getOrderID());
-            } else {
-                //  保存 发票信息
-                orderMapper.insertOrderInvoice(invoice);
-                log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>新增发票信息(insert[bp_order_invoice])orderId:" + order.getOrderID());
-            }
-        }
-        log.info("******************** 提交订单逻辑处理 end *******************");
-        /*
-         * 构造返回参数
-         */
-        Map<String, String> info = new HashMap<>(5);
-        //组织订单id
-        info.put("orderId", apiOrganizeOrderId);
-        //真实需要付款金额
-        info.put("payableAmount", String.valueOf(order.getPayableAmount()));
-        return ResponseJson.success(info);
+    @Autowired
+    public void setOrderSubmitService(OrderSubmitService orderSubmitService) {
+        this.orderSubmitService = orderSubmitService;
     }
 
-
     @Override
     public ResponseJson<Map<String,Object>> orderDetail(String cmAccount, String data) {
         // 获取组织信息
@@ -601,8 +200,15 @@ public class OrderServiceImpl implements OrderService {
         return ResponseJson.success();
     }
 
+    /**
+     * 余额抵扣
+     * @param cmAccount
+     * @param data
+     * @return
+     */
     @Override
-    public ResponseJson payCallBack(String cmAccount, String data) {
+    @Transactional(rollbackFor = Exception.class)
+    public ResponseJson<Map<String, Object>> balanceDeduction(String cmAccount, String data) {
         // 获取组织信息
         CmApiOrganizePo organizePo = organizeMapper.getOrganizeByCmAccount(cmAccount);
         if (null == organizePo) {
@@ -610,6 +216,12 @@ public class OrderServiceImpl implements OrderService {
         }
         // 获取用户id
         Integer userId = organizePo.getUserId();
+        UserPo user = orderMapper.getUserByUserId(userId);
+        BigDecimal userMoney = user.getUserMoney();
+        BigDecimal ableUserMoney = user.getAbleUserMoney();
+        if (MathUtil.compare(ableUserMoney, BigDecimal.ZERO) == 0) {
+            return ResponseJson.error("用户可用余额为0", null);
+        }
         JSONObject orderInfo = null;
         try {
             // 使用组织对应的公钥解密,获得订单数据
@@ -625,474 +237,109 @@ public class OrderServiceImpl implements OrderService {
             e.printStackTrace();
             return ResponseJson.error("解密失败", null);
         }
-        String orderId = (String) orderInfo.get("orderId");
-        String result = (String) orderInfo.get("result");
-        Double amount = orderInfo.getDouble("amount");
-        log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>订单支付完成通知回调:orderId:" + orderId + ",amount:" + amount + ",result:" + result);
-        return ResponseJson.success("SUCCESS");
-    }
-
-    /**
-     * 设置订单发票
-     *
-     * @param orderInvoice
-     * @param invoice
-     * @param invoiceType
-     * @return
-     */
-    private boolean setInvoiceParam(Map<String, Object> orderInvoice, BpOrderInvoicePo invoice, Integer invoiceType) {
-        String invoiceTitle = (String) (null != orderInvoice.get("invoiceTitle") ? orderInvoice.get("invoiceTitle") : "");
-        invoice.setInvoiceTitle(invoiceTitle);
-        if (1 == invoiceType) {
-            // 普通发票:发票类型、发票内容(商品明细)、抬头(公司名称)、纳税人识别号[普通发票的公司]
-            String invoiceContent = (String) (null != orderInvoice.get("invoiceContent") ? orderInvoice.get("invoiceContent") : "");
-            String invoiceTitleType = (null != orderInvoice.get("invoiceTitleType") ? orderInvoice.get("invoiceTitleType") : "").toString();
-            if ("".equals(invoiceTitle) || "".equals(invoiceContent) || "".equals(invoiceTitleType)) {
-                return true;
-            }
-            if ("1".equals(invoiceTitleType)) {
-                // 企业
-                String corporationTaxNum = (String) (null != orderInvoice.get("corporationTaxNum") ? orderInvoice.get("corporationTaxNum") : "");
-                if ("".equals(corporationTaxNum)) {
-                    return true;
-                }
-                invoice.setCorporationTaxNum(corporationTaxNum);
-            }
-
-            invoice.setInvoiceContent(invoiceContent);
-        } else if (2 == invoiceType) {
-            // 增值税发票:发票类型、发票、抬头(公司名称)、纳税人识别号、注册地址、注册电话、开户银行、开户银行账户
-            String corporationTaxNum = (String) (null != orderInvoice.get("corporationTaxNum") ? orderInvoice.get("corporationTaxNum") : "");
-            String registeredAddress = (String) (null != orderInvoice.get("registeredAddress") ? orderInvoice.get("registeredAddress") : "");
-            String registeredPhone = (String) (null != orderInvoice.get("registeredPhone") ? orderInvoice.get("registeredPhone") : "");
-            String openBank = (String) (null != orderInvoice.get("openBank") ? orderInvoice.get("openBank") : "");
-            String bankAccountNo = (String) (null != orderInvoice.get("bankAccountNo") ? orderInvoice.get("bankAccountNo") : "");
-            boolean flag = "".equals(invoiceTitle) || "".equals(corporationTaxNum) || "".equals(registeredAddress) || "".equals(registeredPhone) || "".equals(openBank) || "".equals(bankAccountNo);
-            if (flag) {
-                return true;
-            }
-            invoice.setCorporationTaxNum(corporationTaxNum);
-            invoice.setRegisteredAddress(registeredAddress);
-            invoice.setRegisteredPhone(registeredPhone);
-            invoice.setOpenBank(openBank);
-            invoice.setBankAccountNo(bankAccountNo);
+        String apiOrganizeOrderId = (String) orderInfo.get("orderId");
+        if (StringUtils.isEmpty(apiOrganizeOrderId)) {
+            return ResponseJson.error("参数异常,订单Id不能为空",null);
         }
-        return false;
-    }
-
-    /**
-     * 整理订单商品数据
-     *
-     * @param productNum
-     * @param product
-     * @param productPrice
-     * @param priceType    0正常商品 1促销商品 2阶梯价 3复购价
-     * @param productType
-     * @return
-     */
-    private CmOrderProductPo setOrderProduct(Integer productNum, CmApiOrganizeProductPo product, BigDecimal productPrice, Integer priceType, Integer productType, BigDecimal addedValueTax) {
-        CmOrderProductPo orderProduct = new CmOrderProductPo();
-        orderProduct.setShopID(product.getShopId().longValue());
-        orderProduct.setProductID(product.getProductId());
-//        orderProduct.setOrganizeProductID(product.getId());
-        // 预留在保存保存子订单的时候添加
-        orderProduct.setProductNo(null);
-        orderProduct.setNum(productNum);
-        orderProduct.setPresentNum(0);
-        orderProduct.setProductUnit(product.getUnit());
-        if (MathUtil.compare(product.getNormalPrice(), 0) > 0) {
-            orderProduct.setNormalPrice(product.getNormalPrice());
-        } else {
-            orderProduct.setNormalPrice(BigDecimal.ZERO);
+        OrderVo order = orderMapper.getOrderInfo(userId, apiOrganizeOrderId);
+        if (null == order) {
+            return ResponseJson.error("该订单不存在",null);
         }
-        orderProduct.setCostPrice(product.getCostPrice());
-        orderProduct.setPrice0(product.getPrice());
-        orderProduct.setPrice1(product.getPrice());
-        orderProduct.setTotalAmount(MathUtil.mul(product.getPrice(), productNum));
-
-        orderProduct.setDiscount(new BigDecimal(100));
-        // 经理折扣(优惠金额)
-        orderProduct.setDiscountFee(new BigDecimal(0));
-        //机构税率
-        orderProduct.setTaxRate(product.getClubTaxPoint() == null ? new BigDecimal(0) : product.getClubTaxPoint());
-        //供应商税率
-        orderProduct.setSupplierTaxRate(BigDecimal.valueOf(0));
-        orderProduct.setIncludedTax(product.getIncludedTax().toString());
-        orderProduct.setInvoiceType(product.getInvoiceType().toString());
-        BigDecimal singleShouldPayTotalTax = new BigDecimal(0);
-        if (productType == 2) {
-            //促销赠品置机构税率和供应商税率为0
-            orderProduct.setTaxRate(BigDecimal.ZERO);
-            orderProduct.setSupplierTaxRate(BigDecimal.ZERO);
-        } else {
-            //不含税可开发票商品设置税费
-            if (0 == product.getIncludedTax() && (1 == product.getInvoiceType() || 2 == product.getInvoiceType())) {
-                //供应商税费(单)=成本价 * 供应商税率
-                if (product.getShopTaxPoint() == null) {
-                    orderProduct.setSupplierTaxRate(product.getClubTaxPoint());
-                } else {
-                    orderProduct.setSupplierTaxRate(product.getShopTaxPoint());
+        getDiscernReceipt(order);
+        //本次余额抵扣金额
+        BigDecimal balancePayFee = BigDecimal.ZERO;
+        if (MathUtil.compare(ableUserMoney, 0) > 0) {
+            if (MathUtil.compare(ableUserMoney, order.getPendingPayments()) < 0) {
+                if (!"0".equals(order.getStatus())) {
+                    //待确认状态,不修改订单状态
+                    if ("1".equals(order.getSendOutStatus())) {
+                        order.setStatus("21");
+                    } else if ("2".equals(order.getSendOutStatus())) {
+                        order.setStatus("22");
+                    } else {
+                        order.setStatus("23");
+                    }
                 }
-                singleShouldPayTotalTax = MathUtil.div(MathUtil.mul(product.getCostPrice(), orderProduct.getSupplierTaxRate()), BigDecimal.valueOf(100));
-            } else if (1 == product.getIncludedTax()) {
-                //含税商品设置供应商税率
-                if (product.getShopTaxPoint() == null) {
-                    orderProduct.setSupplierTaxRate(product.getClubTaxPoint());
-                } else {
-                    orderProduct.setSupplierTaxRate(product.getShopTaxPoint());
+                order.setReceiptStatus("2");
+                balancePayFee = ableUserMoney;
+            } else {
+                if (!"0".equals(order.getStatus())) {
+                    if ("1".equals(order.getSendOutStatus())) {
+                        order.setStatus("31");
+                    } else if ("2".equals(order.getSendOutStatus())) {
+                        order.setStatus("32");
+                    } else {
+                        order.setStatus("33");
+                    }
                 }
-            } else if ((0 == product.getIncludedTax() && 3 == product.getInvoiceType()) || 2 == product.getIncludedTax()) {
-                //不含税不可开票商品和未知商品,税率置为0
-                orderProduct.setTaxRate(BigDecimal.ZERO);
-                orderProduct.setSupplierTaxRate(BigDecimal.ZERO);
-            }
-        }
-
-        orderProduct.setAddedValueTax(addedValueTax);
-        //机构税费(总)=机构税费(单) * 商品数量
-        orderProduct.setTotalAddedValueTax(MathUtil.mul(addedValueTax, productNum));
-        orderProduct.setSingleShouldPayTotalTax(singleShouldPayTotalTax);
-        //供应商税费(总)=供应商税费(单) * 商品数量
-        orderProduct.setShouldPayTotalTax(MathUtil.mul(singleShouldPayTotalTax, productNum));
-        orderProduct.setTotalFee(MathUtil.mul(productPrice, productNum));
-        orderProduct.setShouldPayFee(MathUtil.mul(productPrice, productNum));
-
-        // 商品费=成本价快照*(购买数量  + 赠品数量)
-        orderProduct.setShopProductAmount(MathUtil.mul(product.getCostPrice(), BigDecimal.valueOf(productNum)));
-        //不含税可开票商品,单价/折后单价=售价-税费
-        if (priceType == 0 || priceType == 1) {
-            //正常价格和促销价格
-            orderProduct.setPrice(product.getPrice());
-            orderProduct.setDiscountPrice(product.getPrice());
-        } else if (priceType == 2) {
-            //阶梯价
-            BigDecimal price1 = productPrice;
-            //不含税可开票商品,单价/折后单价=售价-税费
-            if (0 == product.getIncludedTax() && (1 == product.getInvoiceType() || 2 == product.getInvoiceType())) {
-                price1 = MathUtil.sub(productPrice, orderProduct.getAddedValueTax());
-            }
-            orderProduct.setPrice(price1);
-            orderProduct.setDiscountPrice(price1);
-        }
-        //应付供应商(单)=成本价+供应商税费(单)
-        BigDecimal singleShopFee = MathUtil.add(product.getCostPrice(), singleShouldPayTotalTax);
-        orderProduct.setSingleShopFee(singleShopFee);
-        // 应付供应商(总)=应付供应商(单) * 商品数量
-        orderProduct.setShopFee(MathUtil.mul(singleShopFee, BigDecimal.valueOf(productNum)));
-        orderProduct.setOtherFee(new BigDecimal(0));
-        orderProduct.setSingleOtherFee(new BigDecimal(0));
-
-        //应付采美(单)=单价+机构税费(单)-(成本(单)+供应商税费(单))
-        BigDecimal singleCmFee = MathUtil.sub(MathUtil.add(product.getPrice(), orderProduct.getAddedValueTax()), MathUtil.add(product.getCostPrice(), singleShouldPayTotalTax));
-        orderProduct.setSingleCmFee(singleCmFee);
-        // 应付采美(总)=应付采美(单)*商品数量
-        BigDecimal cmFee = MathUtil.mul(singleCmFee, BigDecimal.valueOf(productNum));
-        orderProduct.setCmFee(cmFee);
-
-        orderProduct.setTotalBeans(new BigDecimal(0));
-        orderProduct.setUseBalanceAmount(0d);
-        // 优惠金额
-        orderProduct.setPreferential(new BigDecimal(0));
-        orderProduct.setUseBalanceAmount(0d);
-        // 订单商品供应商确认标志 0否 1是
-        orderProduct.setConfirmProductFlag("0");
-
-        orderProduct.setShopName(product.getShopName());
-        orderProduct.setName(product.getName());
-        orderProduct.setPayStatus("0");
-        orderProduct.setBuyAgainFlag("0");
-        // 未出库数量
-        orderProduct.setNotOutStore(productNum);
-        // 是否已评论 1 是 0 未评论
-        orderProduct.setCommentFlag("0");
-        orderProduct.setActPreferential(new BigDecimal(0));
-        orderProduct.setActType(null);
-
-        orderProduct.setIsActProduct(product.getActStatus().toString());
-        orderProduct.setLadderPriceFlag(product.getActStatus() == 2 ? "1" : "0");
-        orderProduct.setProductImage(ProductUtils.getImageURL("product", product.getMainImage(), 0, domain));
-        orderProduct.setProductType(productType.toString());
-        //促销赠品
-        if (productType == 2) {
-            orderProduct.setPrice0(BigDecimal.ZERO);
-            orderProduct.setPrice1(BigDecimal.ZERO);
-            orderProduct.setTotalAmount(BigDecimal.ZERO);
-            orderProduct.setTotalFee(BigDecimal.ZERO);
-            orderProduct.setDiscountPrice(BigDecimal.ZERO);
-            orderProduct.setTotalAddedValueTax(BigDecimal.ZERO);
-            orderProduct.setShouldPayTotalTax(BigDecimal.ZERO);
-        }
-        return orderProduct;
-    }
-
-
-
-
-    /**
-     * 计算总运费
-     *
-     * @param provinceId
-     * @param cityId
-     * @return totalPostageFee
-     */
-    public Double computedPostageFee(Integer provinceId, Integer cityId) {
-        if (202 == cityId) {
-            // 深圳市内运费10元
-            return 10d;
-        } else if (19 == provinceId) {
-            // 广东省内深圳市外运费15元
-            return 15d;
+                order.setReceiptStatus("3");
+                balancePayFee = order.getPendingPayments();
+            }
+            order.setBalancePayFee(MathUtil.add(order.getBalancePayFee(), balancePayFee));
+            order.setPayableAmount(MathUtil.sub(order.getPayableAmount(), balancePayFee));
+            orderMapper.updateOrder(order);
+            //剩余待付金额
+            order.setPendingPayments(MathUtil.sub(order.getPendingPayments(), balancePayFee));
+            //修改账户余额
+            if (!"0".equals(order.getStatus())) {
+                user.setUserMoney(MathUtil.sub(userMoney, balancePayFee));
+                //保存收款记录
+                orderSubmitService.saveDiscernReceipt(balancePayFee, order.getOrderID().intValue());
+            }
+            user.setAbleUserMoney(MathUtil.sub(ableUserMoney, balancePayFee));
+            organizeMapper.updateMoney(user.getUserMoney(), user.getAbleUserMoney(), user.getUserID());
+            //保存余额收支记录
+            orderSubmitService.saveBalanceRecord(balancePayFee, order.getOrderID().intValue(), user.getUserID());
+        }
+        Map<String, Object> map = new HashMap<>(2);
+        map.put("balancePayFee", balancePayFee);
+        map.put("orderId", apiOrganizeOrderId);
+        map.put("payableAmount", order.getPayableAmount());
+        if (MathUtil.compare(order.getPayableAmount(),BigDecimal.ZERO) >0) {
+            // 余额抵扣,部分付款
+            map.put("code", "1");
+            map.put("msg", "抵扣成功部分支付");
         } else {
-            return -1d;
+            // 余额抵扣,完成付款
+            map.put("code", "2");
+            map.put("msg", "抵扣成功完成支付");
         }
+        return ResponseJson.success(map);
     }
 
-    /**
-     * 保存子订单,并返回子订单ids
-     *
-     * @param order
-     * @param orderProductList
-     * @param shopId
-     * @param shopNote
-     * @return
-     */
-    private CmShopOrderPo saveShopOrder(CmOrderPo order, List<CmOrderProductPo> orderProductList, Integer shopId, String shopNote) {
-        /*
-         *  初始化子订单信息
-         */
-        CmShopOrderPo shopOrder = new CmShopOrderPo();
-        // 子订单编号
-        String shopOrderNo = "";
-        String maxShopOrderNo = orderMapper.findMaxShopOrderNo(order.getOrderID());
-        if (StringUtils.isNotBlank(maxShopOrderNo)) {
-            shopOrderNo = maxShopOrderNo;
-            shopOrder.setShopOrderNo(OrderNoUtils.getShopOrderNo(order.getOrderNo(), Integer.parseInt(shopOrderNo.substring(shopOrderNo.length() - 2, shopOrderNo.length())) + 1));
-        } else {
-            shopOrder.setShopOrderNo(OrderNoUtils.getShopOrderNo(order.getOrderNo(), 1));
+    @Override
+    public ResponseJson payCallBack(String cmAccount, String data) {
+        // 获取组织信息
+        CmApiOrganizePo organizePo = organizeMapper.getOrganizeByCmAccount(cmAccount);
+        if (null == organizePo) {
+            return ResponseJson.error("参数异常,用户不存在", null);
         }
-        shopOrder.setShopID(shopId);
-        shopOrder.setClubID(order.getClubID().intValue());
-        shopOrder.setOrderID(order.getOrderID());
-        shopOrder.setOrderNo(order.getOrderNo());
-        shopOrder.setUserID(order.getUserID().intValue());
-        shopOrder.setOrganizeID(order.getOrganizeID());
-        /*
-         *  统计子订单金额信息
-         */
-        // 订单总金额
-        BigDecimal totalAmount = new BigDecimal(0);
-        // 商品总金额
-        BigDecimal productAmount = new BigDecimal(0);
-        // 需要支付金额
-        BigDecimal needPayAmount = new BigDecimal(0);
-        // 优惠金额
-        BigDecimal preferential = new BigDecimal(0);
-        // 佣金
-        BigDecimal brokerage = new BigDecimal(0);
-        // 商品费
-        BigDecimal shopProductAmount = new BigDecimal(0);
-        // 供应商税费
-        BigDecimal shopTaxFee = new BigDecimal(0);
-        // 总购买数
-        Integer buyNum = 0;
-        // 计算子订单信息
-        for (CmOrderProductPo orderProduct : orderProductList) {
-            if (shopId.longValue() == orderProduct.getShopID()) {
-                // 商品总金额
-                productAmount = MathUtil.add(productAmount, orderProduct.getTotalAmount());
-                // 订单总金额 包括税费
-                totalAmount = MathUtil.add(totalAmount, orderProduct.getTotalFee());
-                // 应付金额
-                needPayAmount = MathUtil.add(needPayAmount, orderProduct.getShouldPayFee());
-                // 总购买数
-                buyNum += orderProduct.getNum();
-                preferential = MathUtil.add(preferential, orderProduct.getPreferential());
-                brokerage = MathUtil.add(brokerage, orderProduct.getCmFee());
-                if (null != orderProduct.getShopProductAmount()) {
-                    shopProductAmount = MathUtil.add(shopProductAmount, orderProduct.getShopProductAmount());
-                }
-                if (null != orderProduct.getShouldPayTotalTax()) {
-                    shopTaxFee = MathUtil.add(shopTaxFee, orderProduct.getShouldPayTotalTax());
-                }
+        // 获取用户id
+        Integer userId = organizePo.getUserId();
+        JSONObject orderInfo = null;
+        try {
+            // 使用组织对应的公钥解密,获得订单数据
+            orderInfo = KeyUtils.decryptDataPublic(data, organizePo.getPublicKey());
+            // 私钥验签
+            String preSign = orderInfo.getString("sign");
+            orderInfo.remove("sign");
+            String sufSign = KeyUtils.buildSign(orderInfo, organizePo.getPrivateKey());
+            if (!preSign.equals(sufSign)) {
+                return ResponseJson.error("验签失败", null);
             }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return ResponseJson.error("解密失败", null);
         }
-        shopOrder.setPromotionFullReduction(BigDecimal.ZERO);
-        // freePostFlag: 0包邮 -1到付 1 有运费
-        // fee: 运费:-1到付,0包邮,其他为具体运费(v5.0版本已废弃,运费已使用商品形式存储)
-        if ("1".equals(order.getFreePostFlag())) {
-            shopOrder.setFee(0d);
-        } else {
-            shopOrder.setFee(Double.parseDouble(order.getFreePostFlag()));
-        }
-        shopOrder.setNote(shopNote);
-        shopOrder.setOrderTime(order.getOrderTime());
-        shopOrder.setDiscountFee(BigDecimal.ZERO);
-        shopOrder.setCanRefundFlag(1);
-        shopOrder.setCanRefundAmount(needPayAmount.doubleValue());
-        shopOrder.setAccountAmount(BigDecimal.ZERO);
-        // 佣金 采美应收
-        shopOrder.setBrokerage(brokerage);
-        shopOrder.setBuyStatus("1");
-        shopOrder.setPresentNum(0);
-        shopOrder.setUseBeanFlag(0);
-        shopOrder.setUseBeanAmount(0);
-        shopOrder.setUseBalanceFlag(0);
-        shopOrder.setRefundStatus(0);
-        shopOrder.setRefundsAmount(BigDecimal.ZERO);
-        shopOrder.setPayStatus("1");
-        shopOrder.setZeroCostFlag(0);
-        shopOrder.setSendOutStatus("1");
-        shopOrder.setPayFlag("0");
-        // 订单状态标识,1:非退货退款订单、2:退货退款中、3退货退款完成
-        shopOrder.setOrderStatusFlag("1");
-        shopOrder.setDelFlag("0");
-        shopOrder.setOrderBeanAmount(0);
-        // 购买商品数
-        shopOrder.setItemCount(buyNum);
-        // 普通订单 1 协销订单0 与cm_order一样
-        shopOrder.setOrderType(0);
-        shopOrder.setStatus(1);
-        shopOrder.setOrderSubmitType(order.getOrderSubmitType());
-        shopOrder.setTotalAmount(totalAmount);
-        shopOrder.setProductAmount(productAmount);
-        shopOrder.setNeedPayAmount(needPayAmount);
-        shopOrder.setPreferential(preferential);
-        shopOrder.setShopProductAmount(shopProductAmount);
-        // 付给供应商运费
-        shopOrder.setShopPostFee(BigDecimal.ZERO);
-        // 付给供应商税费
-        shopOrder.setShopTaxFee(shopTaxFee);
-        // 已付款金额
-        shopOrder.setPayedShopAmount(BigDecimal.ZERO);
-        // 付第三方
-        shopOrder.setShopOtherFee(BigDecimal.ZERO);
-        // 付供应商 = 商品费 + 运费 + 税费
-        shopOrder.setShouldPayShopAmount(MathUtil.add(shopProductAmount, shopTaxFee));
-        // 订单能否拆分 1 为可拆分, 0为不可拆分
-        if (buyNum > 1) {
-            shopOrder.setSplitFlag("1");
-        } else {
-            shopOrder.setSplitFlag("0");
-        }
-        /*
-         * 保存子订单信息到数据库
-         */
-        orderMapper.insertShopOrder(shopOrder);
-        log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>新增子订单(insert[cm_shop_order])shopOrderId:" + shopOrder.getShopOrderID());
-        return shopOrder;
+        String orderId = (String) orderInfo.get("orderId");
+        String result = (String) orderInfo.get("result");
+        Double amount = orderInfo.getDouble("amount");
+        log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>订单支付完成通知回调:orderId:" + orderId + ",amount:" + amount + ",result:" + result);
+        return ResponseJson.success("SUCCESS");
     }
 
-    /**
-     * 保存运费子订单,并返回子订单ids
-     *
-     * @param order
-     * @param num
-     * @return
-     */
-    private String setPostFeeShopOrder(CmOrderPo order, String shopOrderIds, int num) {
-        ProductPo product = productMapper.findPostFeeProduct();
-        CmShopOrderPo newShopOrder = new CmShopOrderPo();
-        String shopOrderNo = OrderNoUtils.getShopOrderNo(order.getOrderNo(), num + 1);
-        newShopOrder.setShopOrderNo(shopOrderNo);
-        newShopOrder.setOrderNo(order.getOrderNo());
-        newShopOrder.setOrderID(order.getOrderID());
-        newShopOrder.setUserID(order.getUserID().intValue());
-        newShopOrder.setOrderType(order.getOrderType());
-        newShopOrder.setOrderSubmitType(order.getOrderSubmitType());
-        newShopOrder.setPresentNum(0);
-        newShopOrder.setItemCount(1);
-        //运费商品供应商ID默认998
-        newShopOrder.setShopID(product.getShopID());
-        newShopOrder.setFee(order.getFreight().doubleValue());
-        newShopOrder.setProductAmount(order.getFreight());
-        newShopOrder.setTotalAmount(order.getFreight());
-        newShopOrder.setNeedPayAmount(order.getFreight());
-        newShopOrder.setDiscountAmount(BigDecimal.ZERO);
-        newShopOrder.setPayFlag("0");
-        newShopOrder.setOrderTime(order.getOrderTime());
-        newShopOrder.setPayStatus("3");
-        newShopOrder.setSendOutStatus("3");
-        newShopOrder.setTotalAddedValueTax(BigDecimal.ZERO);
-        newShopOrder.setCanRefundAmount(0D);
-        newShopOrder.setRefundAmount(0D);
-        newShopOrder.setRefundStatus(0);
-        newShopOrder.setClubID(order.getClubID().intValue());
-        if (null != order.getSpID()) {
-            newShopOrder.setSpID(order.getSpID().intValue());
-        }
-        if (null != order.getMainSpID()) {
-            newShopOrder.setMainSpID(order.getMainSpID().intValue());
-        }
-        newShopOrder.setAutoOverTimeMills(0L);
-        newShopOrder.setAutoReceiveTimeMills(0L);
-        newShopOrder.setOrderBeanAmount(0);
-        newShopOrder.setUseBeanFlag(0);
-        newShopOrder.setUseBeanAmount(0);
-        newShopOrder.setAccountAmount(BigDecimal.ZERO);
-        newShopOrder.setCanRefundFlag(1);
-        newShopOrder.setBuyStatus("1");
-        newShopOrder.setOutStoreNum(0);
-        newShopOrder.setDelFlag("0");
-        newShopOrder.setPayFlag("0");
-        // 订单默认可拆分
-        newShopOrder.setSplitFlag("1");
-        /*
-         * 保存子订单信息到数据库
-         */
-        orderMapper.insertShopOrder(newShopOrder);
-        log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>新增子订单(运费商品)(insert[cm_shop_order])shopOrderId:" + newShopOrder.getShopOrderID());
 
-        /*
-         * 插入订单 运费商品
-         */
-        CmOrderProductPo feeOrderProduct = new CmOrderProductPo();
-        feeOrderProduct.setProductType("0");
-        feeOrderProduct.setOrderNo(order.getOrderNo());
-        feeOrderProduct.setOrderID(order.getOrderID());
-        feeOrderProduct.setShopOrderID(newShopOrder.getShopOrderID());
-        feeOrderProduct.setShopOrderNo(newShopOrder.getShopOrderNo());
-        feeOrderProduct.setShopID(product.getShopID().longValue());
-        feeOrderProduct.setProductID(999);
-        feeOrderProduct.setNum(1);
-        feeOrderProduct.setPresentNum(0);
-        feeOrderProduct.setOutStoreType("0");
-        feeOrderProduct.setProps(product.getProps());
-        feeOrderProduct.setProductNo(product.getProductCode());
-        feeOrderProduct.setPrice(order.getFreight());
-        feeOrderProduct.setNormalPrice(order.getFreight());
-        feeOrderProduct.setPrice0(order.getFreight());
-        feeOrderProduct.setPrice1(order.getFreight());
-        feeOrderProduct.setTotalAmount(order.getFreight());
-        feeOrderProduct.setTotalFee(order.getFreight());
-        feeOrderProduct.setShouldPayFee(order.getFreight());
-        feeOrderProduct.setDiscount(new BigDecimal(100));
-        feeOrderProduct.setDiscountPrice(order.getFreight());
-        feeOrderProduct.setTaxRate(new BigDecimal(100));
-        feeOrderProduct.setAddedValueTax(BigDecimal.ZERO);
-        feeOrderProduct.setTotalAddedValueTax(BigDecimal.ZERO);
-        feeOrderProduct.setShopFee(BigDecimal.ZERO);
-        feeOrderProduct.setOtherFee(BigDecimal.ZERO);
-        feeOrderProduct.setCmFee(order.getFreight());
-        feeOrderProduct.setSingleShopFee(BigDecimal.ZERO);
-        feeOrderProduct.setSingleOtherFee(BigDecimal.ZERO);
-        feeOrderProduct.setSingleCmFee(order.getFreight());
-        feeOrderProduct.setTotalBeans(BigDecimal.ZERO);
-        feeOrderProduct.setUseBalanceAmount(0D);
-        feeOrderProduct.setUseBeanAmount(0);
-        feeOrderProduct.setNotOutStore(0);
-        feeOrderProduct.setCmbeanPrice(0);
-        feeOrderProduct.setBuyAgainFlag("0");
-        feeOrderProduct.setShopName(product.getShopName());
-        feeOrderProduct.setName(product.getName());
-        feeOrderProduct.setIncludedTax(product.getIncludedTax());
-        feeOrderProduct.setInvoiceType(product.getInvoiceType());
-        // 保存订单商品数据
-        orderMapper.insertOrderProduct(feeOrderProduct);
-        log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>保存订单运费商品(insert[cm_order_product])orderId:" + feeOrderProduct.getOrderProductID());
 
-        shopOrderIds += (("".equals(shopOrderIds) ? "" : ",") + newShopOrder.getShopOrderID());
-        return shopOrderIds;
-    }
 
 
     private List<DiscernReceiptVo> getDiscernReceipt(OrderVo order) {

+ 1026 - 0
src/main/java/com/caimei/service/impl/OrderSubmitServiceImpl.java

@@ -0,0 +1,1026 @@
+package com.caimei.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.caimei.mapper.OrderMapper;
+import com.caimei.mapper.OrganizeMapper;
+import com.caimei.mapper.ProductMapper;
+import com.caimei.model.ResponseJson;
+import com.caimei.model.enumerate.ReceivablesType;
+import com.caimei.model.po.*;
+import com.caimei.model.vo.*;
+import com.caimei.service.OrderService;
+import com.caimei.service.OrderSubmitService;
+import com.caimei.utils.*;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
+import org.springframework.util.CollectionUtils;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.text.DecimalFormat;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * @author Aslee
+ */
+@Slf4j
+@Service
+public class OrderSubmitServiceImpl implements OrderSubmitService {
+    @Resource
+    private OrderMapper orderMapper;
+    @Resource
+    private OrganizeMapper organizeMapper;
+    @Resource
+    private ProductMapper productMapper;
+
+    @Value("${caimei.oldapi}")
+    private String domain;
+
+    @Transactional
+    @Override
+    public ResponseJson orderSubmit(String cmAccount, String data) {
+        // 获取组织信息
+        CmApiOrganizePo organizePo = organizeMapper.getOrganizeByCmAccount(cmAccount);
+        if (null == organizePo) {
+            return ResponseJson.error("参数异常,用户不存在");
+        }
+        // 获得用户Id
+        Integer userId = organizePo.getUserId();
+        JSONObject orderInfo = null;
+        try {
+            // 使用组织对应的公钥解密,获得订单数据
+            orderInfo = KeyUtils.decryptDataPublic(data, organizePo.getPublicKey());
+            // 私钥验签
+            String preSign = orderInfo.getString("sign");
+            orderInfo.remove("sign");
+            String sufSign = KeyUtils.buildSign(orderInfo, organizePo.getPrivateKey());
+            if (!preSign.equals(sufSign)) {
+                return ResponseJson.error("验签失败");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return ResponseJson.error("解密失败");
+        }
+        String apiOrganizeOrderId;
+        Map<String, Object> addressInfo;
+        Map<String, Object> productInfo;
+        Map<String, Object> payInfo;
+        Map<String, Object> invoiceInfo;
+        String notifyUrl;
+        try {
+            addressInfo = orderInfo.getJSONObject("addressInfo");
+            if (null == addressInfo) {
+                return ResponseJson.error("地址数据异常");
+            }
+            // 组织订单Id,由组织自行生成,必须唯一
+            apiOrganizeOrderId = orderInfo.getString("orderId");
+            // 验证组织订单Id是否唯一
+            Integer countByOrderId = orderMapper.getCountByOrderId(userId, apiOrganizeOrderId);
+            if (null != countByOrderId && countByOrderId > 0) {
+                return ResponseJson.error("订单Id已存在,请勿重复提交");
+            }
+            productInfo = orderInfo.getJSONObject("productInfo");
+            if (null == productInfo) {
+                return ResponseJson.error("订单商品数据异常");
+            }
+            payInfo = orderInfo.getJSONObject("payInfo");
+            if (null == payInfo) {
+                return ResponseJson.error("订单支付数据异常");
+            }
+            invoiceInfo = orderInfo.getJSONObject("invoiceInfo");
+            if (null == invoiceInfo) {
+                return ResponseJson.error("订单发票数据异常");
+            }
+            notifyUrl = orderInfo.getString("notifyUrl");
+            if (StringUtils.isNotEmpty(notifyUrl) && !notifyUrl.equals(organizePo.getNotifyUrl())) {
+                //更新回调地址
+                orderMapper.updateNotifyUrl(organizePo.getOrganizeId(), notifyUrl);
+            }
+        } catch (Exception e) {
+            return ResponseJson.error("数据异常");
+        }
+        log.info("******************** 提交订单逻辑处理 start *******************");
+        //机构用户
+        UserPo user = orderMapper.getUserByUserId(userId);
+        if (null == user) {
+            return ResponseJson.error("用户信息异常");
+        }
+        // 用户余额
+        BigDecimal ableUserMoney = user.getAbleUserMoney();
+        BigDecimal userMoney = user.getUserMoney();
+        Integer balancePayFlag = (Integer) payInfo.get("balancePayFlag");
+        if (1 == balancePayFlag && null != ableUserMoney) {
+            // 使用余额
+            if (MathUtil.compare(ableUserMoney, BigDecimal.ZERO) == 0) {
+                return ResponseJson.error("用户可用余额为0", null);
+            }
+        }
+        // 商品总数量
+        Integer productCount = 0;
+        // 赠品数量
+        Integer presentCount = 0;
+        //促销赠品数量
+        Integer promotionalGiftsCount = 0;
+        // 商品总金额 (商品单价乘以数量,再加上税费[默认0])
+        BigDecimal productTotalFee = BigDecimal.ZERO;
+        // 小计金额(商品折后单价乘以数量,再加上税费[默认0])
+        BigDecimal orderTotalFee = BigDecimal.ZERO;
+        // 订单总额(小计金额减去经理折扣后,再加上运费[默认0])
+        BigDecimal payTotalFee = BigDecimal.ZERO;
+        // 余额支付金额
+        BigDecimal balancePayFee = BigDecimal.ZERO;
+        // 真实支付金额(订单总额减去抵扣的账户余额)
+        BigDecimal payableAmount = BigDecimal.ZERO;
+        /*
+         * 发票信息获取
+         */
+        boolean invoiceFlag = false;
+        BpOrderInvoicePo invoice = new BpOrderInvoicePo();
+        Integer invoiceType = (Integer) invoiceInfo.get("type");
+        if (null == invoiceType) {
+            return ResponseJson.error("发票类型不能为空");
+        } else {
+            invoice.setType(invoiceType.longValue());
+            if (0 != invoiceType) {
+                // 发票类型 0不开发票 1普通发票 2增值税发票
+                invoiceFlag = true;
+                if (setInvoiceParam(invoiceInfo, invoice, invoiceType)) {
+                    return ResponseJson.error("发票信息不完整");
+                }
+            }
+        }
+        // 获取地址信息
+        String provinceName = (String) addressInfo.get("provinceName");
+        String cityName = (String) addressInfo.get("cityName");
+        String townName = (String) addressInfo.get("townName");
+        String receiveMan = (String) addressInfo.get("receiveMan");
+        String mobile = (String) addressInfo.get("mobile");
+        String addressDetail = (String) addressInfo.get("addressDetail");
+        if (StringUtils.isEmpty(provinceName) || StringUtils.isEmpty(cityName) || StringUtils.isEmpty(townName) || StringUtils.isEmpty(receiveMan) || StringUtils.isEmpty(mobile)) {
+            return ResponseJson.error("地址信息不完整");
+        }
+        Integer provinceId = orderMapper.getProvinceId(provinceName);
+        Integer cityId = orderMapper.getCityId(cityName);
+        Integer townId = orderMapper.getTownId(townName);
+        if (null == provinceId || null == cityId || null == townId) {
+            return ResponseJson.error("地址信息异常");
+        }
+        /*
+         * 初始化主订单参数
+         */
+        CmOrderPo order = new CmOrderPo();
+        String curDateStr = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(new Date());
+        // 订单号
+        String orderNo = OrderNoUtils.getOrderNo("D");
+        order.setOrderNo(orderNo);
+        order.setApiOrganizeOrderId(apiOrganizeOrderId);
+        // 运营人员下单
+        order.setBuyUserID(user.getUserID());
+        order.setOrderType(1);
+        order.setOrderSubmitType(2);
+        order.setConfirmFlag("2");
+        order.setUserID(user.getUserID().longValue());
+        // 机构ID
+        order.setClubID(user.getClubID().longValue());
+        // 订单来源
+        order.setOrderSource("7");
+        order.setOrganizeID(0);
+        order.setUpdateDate(curDateStr);
+        order.setPayFlag("0");
+        order.setCooFreeFlag("0");
+        order.setCooFreeAmount(BigDecimal.ZERO);
+        order.setCooFreeRate(0);
+        order.setOnlinePayFlag("0");
+        order.setPreferential(BigDecimal.ZERO);
+        order.setDiscountFee(BigDecimal.ZERO);
+        // 订单提交时间
+        order.setOrderTime(curDateStr);
+        // 默认订单可以拆分
+        order.setSplitFlag("1");
+        // 发票类型
+        order.setInvoiceFlag(invoiceType.toString());
+        order.setReceiptStatus("1");
+        order.setPayStatus("1");
+        order.setZeroCostFlag(0);
+        order.setSendOutStatus("1");
+        order.setRefundType("0");
+        // 是否包含活动商品(受订单未支付自动关闭时间影响)  0 否 1 是
+        order.setHasActProduct("0");
+        // 订单状态 0 有效  其它无效
+        order.setDelFlag("0");
+        // 是否确认付款供应商
+        order.setAffirmPaymentFlag("0");
+        /*
+            订单商品
+         */
+        List<CmOrderProductPo> orderProductList = new ArrayList<>();
+        // 收集供应商ID列表
+        List<Integer> shopIdList = new ArrayList<>();
+        for (Map.Entry<String, Object> product : productInfo.entrySet()) {
+            String productId = product.getKey();
+            Integer productNum = (Integer)product.getValue();
+            // 统计商品数量
+            productCount += productNum;
+            // 获取商品信息
+            CmApiOrganizeProductPo organizeProduct = productMapper.getProductByProductId(productId);
+            if (null == organizeProduct) {
+                return ResponseJson.error("订单商品数据异常");
+            }
+            if (null == productNum || productNum == 0) {
+                return ResponseJson.error("商品购买数量异常");
+            }
+            if (productNum < organizeProduct.getMinBuyNumber()) {
+                return ResponseJson.error("商品购买数量不能少于最小起订量");
+            }
+            // 获取商品购买价格(活动价格>>>阶梯价格>>>复购价格库>>>商品原始价)
+            BigDecimal productPrice = organizeProduct.getPrice();
+            // 成本价
+            BigDecimal costPrice = BigDecimal.ZERO;
+            // 机构税费(单)
+            BigDecimal addedValueTax = new BigDecimal(0);
+            int priceType = 0;
+            // 活动状态
+            organizeProduct.setActStatus(0);
+            if (1 == organizeProduct.getLadderPriceFlag()) {
+                // 启用了阶梯价格
+                List<LadderPriceVo> ladderPriceList = productMapper.getLadderPriceByProductId(organizeProduct.getId());
+                // 判断阶梯价格的购买数量校验
+                long minBuyNumber = null != ladderPriceList.get(0) ? ladderPriceList.get(0).getBuyNum() : 0L;
+                if (productNum < minBuyNumber) {
+                    return ResponseJson.error("商品购买量低于最小起订量");
+                }
+                //根据商品购买数量获取商品对应阶梯价格
+                for (LadderPriceVo ladderPrice : ladderPriceList) {
+                    if (productNum >= ladderPrice.getBuyNum()) {
+                        productPrice = ladderPrice.getBuyPrice();
+                    }
+                }
+                organizeProduct.setActStatus(2);
+                priceType = 2;
+            }
+            //不含税可开票商品计算税费
+            boolean addTaxFlag = 0 == organizeProduct.getIncludedTax() && (1 == organizeProduct.getInvoiceType() || 2 == organizeProduct.getInvoiceType());
+            if (addTaxFlag) {
+                addedValueTax = MathUtil.div(MathUtil.mul(productPrice, organizeProduct.getClubTaxPoint()), BigDecimal.valueOf(100));
+                productPrice = MathUtil.add(productPrice, addedValueTax);
+            }
+            if (MathUtil.compare(productPrice, BigDecimal.ZERO) == 0) {
+                return ResponseJson.error("商品购买价格不能为0");
+            }
+            // 单个商品的金额
+            BigDecimal productFee = MathUtil.mul(productPrice, productNum);
+            // 统计商品总金额
+            productTotalFee = MathUtil.add(productTotalFee, productFee);
+            // 判断是否选中固定成本价
+            if (MathUtil.compare(organizeProduct.getCostPrice(), 0) > 0 && 1 == organizeProduct.getCostType()) {
+                costPrice = organizeProduct.getCostPrice();
+            }
+            // 判断是否选中比例成本价
+            if (MathUtil.compare(organizeProduct.getCostProportional(), 0) > 0 && 2 == organizeProduct.getCostType()) {
+                // 通过售价*比例得到成本价
+                costPrice = BigDecimal.valueOf(MathUtil.div(MathUtil.mul(productPrice, organizeProduct.getCostProportional()), 100).floatValue());
+            }
+            organizeProduct.setCostPrice(costPrice);
+            /*
+             * 整理订单商品数据
+             */
+            CmOrderProductPo orderProduct = setOrderProduct(productNum, organizeProduct, productPrice, priceType, 0, addedValueTax);
+            // 加入订单商品列表
+            orderProductList.add(orderProduct);
+            // 保存供应商id
+            if (!shopIdList.contains(orderProduct.getShopID().intValue())) {
+                shopIdList.add(orderProduct.getShopID().intValue());
+            }
+        }
+        // 设置是否是二手订单
+        order.setSecondHandOrderFlag("0");
+        order.setPromotionFullReduction(BigDecimal.ZERO);
+        // 商品总数量
+        order.setProductCount(productCount);
+        // 赠品数量
+        order.setPresentCount(0);
+        //促销赠品数量
+        order.setPromotionalGiftsCount(0);
+        // 0包邮 -1到付 1 有运费
+        order.setFreePostFlag("-1");
+        order.setFreight(BigDecimal.ZERO);
+        // 商品总额
+        order.setProductTotalFee(productTotalFee);
+        // 订单总额(商品金额+运费)
+        payTotalFee = productTotalFee;
+        orderTotalFee = productTotalFee;
+        order.setOrderTotalFee(orderTotalFee);
+        order.setPayTotalFee(payTotalFee);
+        payableAmount = payTotalFee;
+
+        // 订单状态
+        order.setStatus("11");
+        order.setConfirmTime(curDateStr);
+
+        // 是否完成支付(默认不是,只有余额抵扣才算)
+        int isPaySuccessFlag = 0;
+        // 余额支付标识,0不使用,1使用
+        if (1 == balancePayFlag) {
+            // 部分抵扣
+            if (MathUtil.compare(payTotalFee, ableUserMoney) > 0) {
+                balancePayFee = ableUserMoney;
+                payableAmount = MathUtil.sub(payTotalFee, balancePayFee);
+                // 余额抵扣用完
+                user.setAbleUserMoney(new BigDecimal(0));
+                // 部收款待发货
+                order.setStatus("21");
+                user.setUserMoney(MathUtil.sub(userMoney, balancePayFee));
+                order.setReceiptStatus("2");
+                isPaySuccessFlag = 1;
+            } else {
+                // 全部用余额抵扣, 直接变成支付完成
+                balancePayFee = payTotalFee;
+                payableAmount = BigDecimal.ZERO;
+                user.setAbleUserMoney(MathUtil.sub(ableUserMoney, balancePayFee));
+                // 已收款待发货
+                order.setStatus("31");
+                user.setUserMoney(MathUtil.sub(userMoney, balancePayFee));
+                order.setReceiptStatus("3");
+                order.setPayFlag("1");
+                isPaySuccessFlag = 2;
+            }
+            orderMapper.updateUserMoney(user.getUserMoney(), user.getAbleUserMoney(), user.getUserID());
+            log.info(">>>>>更新余额抵扣:[userMoney:" + user.getUserMoney() + "] ,ableUserMoney:" + user.getAbleUserMoney());
+            // 支付时间
+            order.setPayTime(curDateStr);
+        }
+        // 余额支付金额
+        order.setBalancePayFee(balancePayFee);
+        // 实际支付金额(商品金额+运费-余额抵扣)
+        order.setPayableAmount(payableAmount);
+        // 售后条款
+        order.setClauseID(1L);
+        order.setClauseName("无条款");
+        // 是否返佣订单
+        order.setRebateFlag("0");
+        // 判断前端传入orderShouldPayFee订单应付金额,和后台计算应付金额对比
+        BigDecimal orderShouldPayFee = new BigDecimal(payInfo.get("orderShouldPayFee").toString());
+        double v = MathUtil.sub(payableAmount, orderShouldPayFee).doubleValue();
+        log.info(">>>>>payableAmount:" + payableAmount + " ,orderShouldPayFee:" + orderShouldPayFee);
+        // 考虑前端计算不精确
+        if (v < -0.1d || v > 0.1d) {
+            // 设置手动回滚事务
+            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+            return ResponseJson.error("订单付款金额异常");
+        }
+
+        /*
+         * 保存主订单数据
+         */
+        orderMapper.insertOrder(order);
+        log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>新增主订单(insert[cm_order])orderId:" + order.getOrderID());
+
+        /*
+         * 设置订单商品订单号
+         */
+        for (CmOrderProductPo orderProduct : orderProductList) {
+            orderProduct.setOrderID(order.getOrderID());
+            orderProduct.setOrderNo(order.getOrderNo());
+        }
+        /*
+         * 整理 子订单信息
+         */
+        // 收集子订单供应商ID字符串
+        String shopOrderIds = "";
+        for (Integer shopId : shopIdList) {
+            // 初始化子订单信息
+            CmShopOrderPo shopOrder = saveShopOrder(order, orderProductList, shopId, "");
+            // 保存子订单号
+            shopOrderIds += (("".equals(shopOrderIds) ? "" : ",") + shopOrder.getShopOrderID());
+            // 设置订单商品子订单号
+            for (CmOrderProductPo orderProduct : orderProductList) {
+                if (shopId.longValue() == orderProduct.getShopID()) {
+                    orderProduct.setShopOrderID(shopOrder.getShopOrderID());
+                    orderProduct.setShopOrderNo(shopOrder.getShopOrderNo());
+                }
+            }
+        }
+        /*
+         * 保存订单商品
+         */
+        List<OrderProductLadderPricePo> orderProductLadderPriceList = new ArrayList<>();
+        for (CmOrderProductPo orderProduct : orderProductList) {
+            // 保存订单商品数据
+            orderMapper.insertOrderProduct(orderProduct);
+            log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>保存订单商品(insert[cm_order_product])OrderProductID:" + orderProduct.getOrderProductID());
+            if ("1".equals(orderProduct.getLadderPriceFlag())) {
+                //使用阶梯价格的订单商品保存下单时的阶梯价格列表
+                List<LadderPriceVo> ladderPriceList = productMapper.findLadderPriceByProductId(orderProduct.getProductID());
+                ladderPriceList.forEach(ladderPriceVo -> {
+                    OrderProductLadderPricePo orderProductLadderPrice = new OrderProductLadderPricePo();
+                    orderProductLadderPrice.setOrderProductId(orderProduct.getOrderProductID());
+                    orderProductLadderPrice.setBuyNum(ladderPriceVo.getBuyNum());
+                    orderProductLadderPrice.setBuyPrice(ladderPriceVo.getBuyPrice());
+                    orderProductLadderPrice.setCreateDate(new Date());
+                    orderProductLadderPrice.setLadderNum(ladderPriceVo.getLadderNum());
+                    orderProductLadderPriceList.add(orderProductLadderPrice);
+                });
+            }
+        }
+        if (!CollectionUtils.isEmpty(orderProductLadderPriceList)) {
+            orderProductLadderPriceList.forEach(ladderPrice -> {
+                orderMapper.insertOrderProductLadderPrice(ladderPrice);
+            });
+        }
+        /*
+         * 设置邮费子订单
+         */
+        if ("1".equals(order.getFreePostFlag())) {
+            shopOrderIds = setPostFeeShopOrder(order, shopOrderIds, orderInfo.size());
+        }
+
+        // 更新主订单信息, 子订单ID:1000,1002
+        order.setShopOrderIDs(shopOrderIds);
+        orderMapper.updateOrder(order);
+
+        /*
+         * 保存 订单用户地址
+         */
+        //保存地址信息
+        BpOrderUserInfoPo userInfo = new BpOrderUserInfoPo();
+        userInfo.setOrderId(order.getOrderID());
+        userInfo.setClubId(user.getClubID().longValue());
+        userInfo.setUserId(user.getUserID().longValue());
+        userInfo.setName(user.getName() == null ? user.getUserName() : user.getName());
+        userInfo.setShouHuoRen(receiveMan);
+        userInfo.setMobile(mobile);
+        userInfo.setPostalCode(null);
+        userInfo.setPostalCode(null);
+        userInfo.setTownId(townId);
+        userInfo.setProvince(provinceName);
+        userInfo.setCity(cityName);
+        userInfo.setTown(townName);
+        userInfo.setAddress(addressDetail);
+        orderMapper.insertUserInfo(userInfo);
+        log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>保存订单用户地址(insert[bp_order_userinfo])orderId:" + order.getOrderID());
+
+        /*
+         *保存余额到余额收支记录
+         */
+        if (1 == balancePayFlag && MathUtil.compare(balancePayFee, 0) > 0) {
+            // 余额支付标识,0不使用,1使用
+            saveBalanceRecord(balancePayFee, order.getOrderID().intValue(), user.getUserID());
+            //保存余额到收款记录
+            saveDiscernReceipt(balancePayFee, order.getOrderID().intValue());
+        }
+
+        /*
+         * 保存 订单发票信息
+         */
+        if (invoiceFlag) {
+            // 开发票才保存
+            invoice.setOrderId(order.getOrderID());
+            // 查询是否存在老的增值税信息
+            BpOrderInvoicePo userInvoice = orderMapper.getOrderInvoice(order.getOrderID());
+            if (null != userInvoice) {
+                // 更新 发票信息
+                orderMapper.updateOrderInvoice(invoice);
+                log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>更新发票信息(update[bp_order_invoice])orderId:" + order.getOrderID());
+            } else {
+                //  保存 发票信息
+                orderMapper.insertOrderInvoice(invoice);
+                log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>新增发票信息(insert[bp_order_invoice])orderId:" + order.getOrderID());
+            }
+        }
+        log.info("******************** 提交订单逻辑处理 end *******************");
+        /*
+         * 构造返回参数
+         */
+        Map<String, Object> info = new HashMap<>(5);
+        //组织订单id
+        info.put("orderId", apiOrganizeOrderId);
+        //真实需要付款金额
+        info.put("payableAmount", order.getPayableAmount());
+        //余额抵扣金额
+        info.put("balancePayFee", balancePayFee);
+        if (1 == isPaySuccessFlag) {
+            // 余额抵扣,部分付款
+            info.put("code", 1);
+            info.put("msg", "提交成功部分支付");
+        } else if (2 == isPaySuccessFlag) {
+            // 余额抵扣,完成付款
+            info.put("code", 2);
+            info.put("msg", "提交成功完成支付");
+        } else {
+            // 未付款
+            info.put("code", 3);
+            info.put("msg", "提交成功仍未支付");
+        }
+        return ResponseJson.success(info);
+    }
+
+
+
+    /**
+     * 设置订单发票
+     *
+     * @param orderInvoice
+     * @param invoice
+     * @param invoiceType
+     * @return
+     */
+    private boolean setInvoiceParam(Map<String, Object> orderInvoice, BpOrderInvoicePo invoice, Integer invoiceType) {
+        String invoiceTitle = (String) (null != orderInvoice.get("invoiceTitle") ? orderInvoice.get("invoiceTitle") : "");
+        invoice.setInvoiceTitle(invoiceTitle);
+        if (1 == invoiceType) {
+            // 普通发票:发票类型、发票内容(商品明细)、抬头(公司名称)、纳税人识别号[普通发票的公司]
+            String invoiceContent = (String) (null != orderInvoice.get("invoiceContent") ? orderInvoice.get("invoiceContent") : "");
+            String invoiceTitleType = (null != orderInvoice.get("invoiceTitleType") ? orderInvoice.get("invoiceTitleType") : "").toString();
+            if ("".equals(invoiceTitle) || "".equals(invoiceContent) || "".equals(invoiceTitleType)) {
+                return true;
+            }
+            if ("1".equals(invoiceTitleType)) {
+                // 企业
+                String corporationTaxNum = (String) (null != orderInvoice.get("corporationTaxNum") ? orderInvoice.get("corporationTaxNum") : "");
+                if ("".equals(corporationTaxNum)) {
+                    return true;
+                }
+                invoice.setCorporationTaxNum(corporationTaxNum);
+            }
+
+            invoice.setInvoiceContent(invoiceContent);
+        } else if (2 == invoiceType) {
+            // 增值税发票:发票类型、发票、抬头(公司名称)、纳税人识别号、注册地址、注册电话、开户银行、开户银行账户
+            String corporationTaxNum = (String) (null != orderInvoice.get("corporationTaxNum") ? orderInvoice.get("corporationTaxNum") : "");
+            String registeredAddress = (String) (null != orderInvoice.get("registeredAddress") ? orderInvoice.get("registeredAddress") : "");
+            String registeredPhone = (String) (null != orderInvoice.get("registeredPhone") ? orderInvoice.get("registeredPhone") : "");
+            String openBank = (String) (null != orderInvoice.get("openBank") ? orderInvoice.get("openBank") : "");
+            String bankAccountNo = (String) (null != orderInvoice.get("bankAccountNo") ? orderInvoice.get("bankAccountNo") : "");
+            boolean flag = "".equals(invoiceTitle) || "".equals(corporationTaxNum) || "".equals(registeredAddress) || "".equals(registeredPhone) || "".equals(openBank) || "".equals(bankAccountNo);
+            if (flag) {
+                return true;
+            }
+            invoice.setCorporationTaxNum(corporationTaxNum);
+            invoice.setRegisteredAddress(registeredAddress);
+            invoice.setRegisteredPhone(registeredPhone);
+            invoice.setOpenBank(openBank);
+            invoice.setBankAccountNo(bankAccountNo);
+        }
+        return false;
+    }
+
+    /**
+     * 整理订单商品数据
+     *
+     * @param productNum
+     * @param product
+     * @param productPrice
+     * @param priceType    0正常商品 1促销商品 2阶梯价 3复购价
+     * @param productType
+     * @return
+     */
+    private CmOrderProductPo setOrderProduct(Integer productNum, CmApiOrganizeProductPo product, BigDecimal productPrice, Integer priceType, Integer productType, BigDecimal addedValueTax) {
+        CmOrderProductPo orderProduct = new CmOrderProductPo();
+        orderProduct.setShopID(product.getShopId().longValue());
+        orderProduct.setProductID(product.getProductId());
+//        orderProduct.setOrganizeProductID(product.getId());
+        // 预留在保存保存子订单的时候添加
+        orderProduct.setProductNo(null);
+        orderProduct.setNum(productNum);
+        orderProduct.setPresentNum(0);
+        orderProduct.setProductUnit(product.getUnit());
+        if (MathUtil.compare(product.getNormalPrice(), 0) > 0) {
+            orderProduct.setNormalPrice(product.getNormalPrice());
+        } else {
+            orderProduct.setNormalPrice(BigDecimal.ZERO);
+        }
+        orderProduct.setCostPrice(product.getCostPrice());
+        orderProduct.setPrice0(product.getPrice());
+        orderProduct.setPrice1(product.getPrice());
+        orderProduct.setTotalAmount(MathUtil.mul(product.getPrice(), productNum));
+
+        orderProduct.setDiscount(new BigDecimal(100));
+        // 经理折扣(优惠金额)
+        orderProduct.setDiscountFee(new BigDecimal(0));
+        //机构税率
+        orderProduct.setTaxRate(product.getClubTaxPoint() == null ? new BigDecimal(0) : product.getClubTaxPoint());
+        //供应商税率
+        orderProduct.setSupplierTaxRate(BigDecimal.valueOf(0));
+        orderProduct.setIncludedTax(product.getIncludedTax().toString());
+        orderProduct.setInvoiceType(product.getInvoiceType().toString());
+        BigDecimal singleShouldPayTotalTax = new BigDecimal(0);
+        if (productType == 2) {
+            //促销赠品置机构税率和供应商税率为0
+            orderProduct.setTaxRate(BigDecimal.ZERO);
+            orderProduct.setSupplierTaxRate(BigDecimal.ZERO);
+        } else {
+            //不含税可开发票商品设置税费
+            if (0 == product.getIncludedTax() && (1 == product.getInvoiceType() || 2 == product.getInvoiceType())) {
+                //供应商税费(单)=成本价 * 供应商税率
+                if (product.getShopTaxPoint() == null) {
+                    orderProduct.setSupplierTaxRate(product.getClubTaxPoint());
+                } else {
+                    orderProduct.setSupplierTaxRate(product.getShopTaxPoint());
+                }
+                singleShouldPayTotalTax = MathUtil.div(MathUtil.mul(product.getCostPrice(), orderProduct.getSupplierTaxRate()), BigDecimal.valueOf(100));
+            } else if (1 == product.getIncludedTax()) {
+                //含税商品设置供应商税率
+                if (product.getShopTaxPoint() == null) {
+                    orderProduct.setSupplierTaxRate(product.getClubTaxPoint());
+                } else {
+                    orderProduct.setSupplierTaxRate(product.getShopTaxPoint());
+                }
+            } else if ((0 == product.getIncludedTax() && 3 == product.getInvoiceType()) || 2 == product.getIncludedTax()) {
+                //不含税不可开票商品和未知商品,税率置为0
+                orderProduct.setTaxRate(BigDecimal.ZERO);
+                orderProduct.setSupplierTaxRate(BigDecimal.ZERO);
+            }
+        }
+
+        orderProduct.setAddedValueTax(addedValueTax);
+        //机构税费(总)=机构税费(单) * 商品数量
+        orderProduct.setTotalAddedValueTax(MathUtil.mul(addedValueTax, productNum));
+        orderProduct.setSingleShouldPayTotalTax(singleShouldPayTotalTax);
+        //供应商税费(总)=供应商税费(单) * 商品数量
+        orderProduct.setShouldPayTotalTax(MathUtil.mul(singleShouldPayTotalTax, productNum));
+        orderProduct.setTotalFee(MathUtil.mul(productPrice, productNum));
+        orderProduct.setShouldPayFee(MathUtil.mul(productPrice, productNum));
+
+        // 商品费=成本价快照*(购买数量  + 赠品数量)
+        orderProduct.setShopProductAmount(MathUtil.mul(product.getCostPrice(), BigDecimal.valueOf(productNum)));
+        //不含税可开票商品,单价/折后单价=售价-税费
+        if (priceType == 0 || priceType == 1) {
+            //正常价格和促销价格
+            orderProduct.setPrice(product.getPrice());
+            orderProduct.setDiscountPrice(product.getPrice());
+        } else if (priceType == 2) {
+            //阶梯价
+            BigDecimal price1 = productPrice;
+            //不含税可开票商品,单价/折后单价=售价-税费
+            if (0 == product.getIncludedTax() && (1 == product.getInvoiceType() || 2 == product.getInvoiceType())) {
+                price1 = MathUtil.sub(productPrice, orderProduct.getAddedValueTax());
+            }
+            orderProduct.setPrice(price1);
+            orderProduct.setDiscountPrice(price1);
+        }
+        //应付供应商(单)=成本价+供应商税费(单)
+        BigDecimal singleShopFee = MathUtil.add(product.getCostPrice(), singleShouldPayTotalTax);
+        orderProduct.setSingleShopFee(singleShopFee);
+        // 应付供应商(总)=应付供应商(单) * 商品数量
+        orderProduct.setShopFee(MathUtil.mul(singleShopFee, BigDecimal.valueOf(productNum)));
+        orderProduct.setOtherFee(new BigDecimal(0));
+        orderProduct.setSingleOtherFee(new BigDecimal(0));
+
+        //应付采美(单)=单价+机构税费(单)-(成本(单)+供应商税费(单))
+        BigDecimal singleCmFee = MathUtil.sub(MathUtil.add(product.getPrice(), orderProduct.getAddedValueTax()), MathUtil.add(product.getCostPrice(), singleShouldPayTotalTax));
+        orderProduct.setSingleCmFee(singleCmFee);
+        // 应付采美(总)=应付采美(单)*商品数量
+        BigDecimal cmFee = MathUtil.mul(singleCmFee, BigDecimal.valueOf(productNum));
+        orderProduct.setCmFee(cmFee);
+
+        orderProduct.setTotalBeans(new BigDecimal(0));
+        orderProduct.setUseBalanceAmount(0d);
+        // 优惠金额
+        orderProduct.setPreferential(new BigDecimal(0));
+        orderProduct.setUseBalanceAmount(0d);
+        // 订单商品供应商确认标志 0否 1是
+        orderProduct.setConfirmProductFlag("0");
+
+        orderProduct.setShopName(product.getShopName());
+        orderProduct.setName(product.getName());
+        orderProduct.setPayStatus("0");
+        orderProduct.setBuyAgainFlag("0");
+        // 未出库数量
+        orderProduct.setNotOutStore(productNum);
+        // 是否已评论 1 是 0 未评论
+        orderProduct.setCommentFlag("0");
+        orderProduct.setActPreferential(new BigDecimal(0));
+        orderProduct.setActType(null);
+
+        orderProduct.setIsActProduct(product.getActStatus().toString());
+        orderProduct.setLadderPriceFlag(product.getActStatus() == 2 ? "1" : "0");
+        orderProduct.setProductImage(ProductUtils.getImageURL("product", product.getMainImage(), 0, domain));
+        orderProduct.setProductType(productType.toString());
+        //促销赠品
+        if (productType == 2) {
+            orderProduct.setPrice0(BigDecimal.ZERO);
+            orderProduct.setPrice1(BigDecimal.ZERO);
+            orderProduct.setTotalAmount(BigDecimal.ZERO);
+            orderProduct.setTotalFee(BigDecimal.ZERO);
+            orderProduct.setDiscountPrice(BigDecimal.ZERO);
+            orderProduct.setTotalAddedValueTax(BigDecimal.ZERO);
+            orderProduct.setShouldPayTotalTax(BigDecimal.ZERO);
+        }
+        return orderProduct;
+    }
+
+
+
+
+    /**
+     * 保存子订单,并返回子订单ids
+     *
+     * @param order
+     * @param orderProductList
+     * @param shopId
+     * @param shopNote
+     * @return
+     */
+    private CmShopOrderPo saveShopOrder(CmOrderPo order, List<CmOrderProductPo> orderProductList, Integer shopId, String shopNote) {
+        /*
+         *  初始化子订单信息
+         */
+        CmShopOrderPo shopOrder = new CmShopOrderPo();
+        // 子订单编号
+        String shopOrderNo = "";
+        String maxShopOrderNo = orderMapper.findMaxShopOrderNo(order.getOrderID());
+        if (StringUtils.isNotBlank(maxShopOrderNo)) {
+            shopOrderNo = maxShopOrderNo;
+            shopOrder.setShopOrderNo(OrderNoUtils.getShopOrderNo(order.getOrderNo(), Integer.parseInt(shopOrderNo.substring(shopOrderNo.length() - 2, shopOrderNo.length())) + 1));
+        } else {
+            shopOrder.setShopOrderNo(OrderNoUtils.getShopOrderNo(order.getOrderNo(), 1));
+        }
+        shopOrder.setShopID(shopId);
+        shopOrder.setClubID(order.getClubID().intValue());
+        shopOrder.setOrderID(order.getOrderID());
+        shopOrder.setOrderNo(order.getOrderNo());
+        shopOrder.setUserID(order.getUserID().intValue());
+        shopOrder.setOrganizeID(order.getOrganizeID());
+        /*
+         *  统计子订单金额信息
+         */
+        // 订单总金额
+        BigDecimal totalAmount = new BigDecimal(0);
+        // 商品总金额
+        BigDecimal productAmount = new BigDecimal(0);
+        // 需要支付金额
+        BigDecimal needPayAmount = new BigDecimal(0);
+        // 优惠金额
+        BigDecimal preferential = new BigDecimal(0);
+        // 佣金
+        BigDecimal brokerage = new BigDecimal(0);
+        // 商品费
+        BigDecimal shopProductAmount = new BigDecimal(0);
+        // 供应商税费
+        BigDecimal shopTaxFee = new BigDecimal(0);
+        // 总购买数
+        Integer buyNum = 0;
+        // 计算子订单信息
+        for (CmOrderProductPo orderProduct : orderProductList) {
+            if (shopId.longValue() == orderProduct.getShopID()) {
+                // 商品总金额
+                productAmount = MathUtil.add(productAmount, orderProduct.getTotalAmount());
+                // 订单总金额 包括税费
+                totalAmount = MathUtil.add(totalAmount, orderProduct.getTotalFee());
+                // 应付金额
+                needPayAmount = MathUtil.add(needPayAmount, orderProduct.getShouldPayFee());
+                // 总购买数
+                buyNum += orderProduct.getNum();
+                preferential = MathUtil.add(preferential, orderProduct.getPreferential());
+                brokerage = MathUtil.add(brokerage, orderProduct.getCmFee());
+                if (null != orderProduct.getShopProductAmount()) {
+                    shopProductAmount = MathUtil.add(shopProductAmount, orderProduct.getShopProductAmount());
+                }
+                if (null != orderProduct.getShouldPayTotalTax()) {
+                    shopTaxFee = MathUtil.add(shopTaxFee, orderProduct.getShouldPayTotalTax());
+                }
+            }
+        }
+        shopOrder.setPromotionFullReduction(BigDecimal.ZERO);
+        // freePostFlag: 0包邮 -1到付 1 有运费
+        // fee: 运费:-1到付,0包邮,其他为具体运费(v5.0版本已废弃,运费已使用商品形式存储)
+        if ("1".equals(order.getFreePostFlag())) {
+            shopOrder.setFee(0d);
+        } else {
+            shopOrder.setFee(Double.parseDouble(order.getFreePostFlag()));
+        }
+        shopOrder.setNote(shopNote);
+        shopOrder.setOrderTime(order.getOrderTime());
+        shopOrder.setDiscountFee(BigDecimal.ZERO);
+        shopOrder.setCanRefundFlag(1);
+        shopOrder.setCanRefundAmount(needPayAmount.doubleValue());
+        shopOrder.setAccountAmount(BigDecimal.ZERO);
+        // 佣金 采美应收
+        shopOrder.setBrokerage(brokerage);
+        shopOrder.setBuyStatus("1");
+        shopOrder.setPresentNum(0);
+        shopOrder.setUseBeanFlag(0);
+        shopOrder.setUseBeanAmount(0);
+        shopOrder.setUseBalanceFlag(0);
+        shopOrder.setRefundStatus(0);
+        shopOrder.setRefundsAmount(BigDecimal.ZERO);
+        shopOrder.setPayStatus("1");
+        shopOrder.setZeroCostFlag(0);
+        shopOrder.setSendOutStatus("1");
+        shopOrder.setPayFlag("0");
+        // 订单状态标识,1:非退货退款订单、2:退货退款中、3退货退款完成
+        shopOrder.setOrderStatusFlag("1");
+        shopOrder.setDelFlag("0");
+        shopOrder.setOrderBeanAmount(0);
+        // 购买商品数
+        shopOrder.setItemCount(buyNum);
+        // 普通订单 1 协销订单0 与cm_order一样
+        shopOrder.setOrderType(0);
+        shopOrder.setStatus(1);
+        shopOrder.setOrderSubmitType(order.getOrderSubmitType());
+        shopOrder.setTotalAmount(totalAmount);
+        shopOrder.setProductAmount(productAmount);
+        shopOrder.setNeedPayAmount(needPayAmount);
+        shopOrder.setPreferential(preferential);
+        shopOrder.setShopProductAmount(shopProductAmount);
+        // 付给供应商运费
+        shopOrder.setShopPostFee(BigDecimal.ZERO);
+        // 付给供应商税费
+        shopOrder.setShopTaxFee(shopTaxFee);
+        // 已付款金额
+        shopOrder.setPayedShopAmount(BigDecimal.ZERO);
+        // 付第三方
+        shopOrder.setShopOtherFee(BigDecimal.ZERO);
+        // 付供应商 = 商品费 + 运费 + 税费
+        shopOrder.setShouldPayShopAmount(MathUtil.add(shopProductAmount, shopTaxFee));
+        // 订单能否拆分 1 为可拆分, 0为不可拆分
+        if (buyNum > 1) {
+            shopOrder.setSplitFlag("1");
+        } else {
+            shopOrder.setSplitFlag("0");
+        }
+        /*
+         * 保存子订单信息到数据库
+         */
+        orderMapper.insertShopOrder(shopOrder);
+        log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>新增子订单(insert[cm_shop_order])shopOrderId:" + shopOrder.getShopOrderID());
+        return shopOrder;
+    }
+
+    /**
+     * 保存运费子订单,并返回子订单ids
+     *
+     * @param order
+     * @param num
+     * @return
+     */
+    private String setPostFeeShopOrder(CmOrderPo order, String shopOrderIds, int num) {
+        ProductPo product = productMapper.findPostFeeProduct();
+        CmShopOrderPo newShopOrder = new CmShopOrderPo();
+        String shopOrderNo = OrderNoUtils.getShopOrderNo(order.getOrderNo(), num + 1);
+        newShopOrder.setShopOrderNo(shopOrderNo);
+        newShopOrder.setOrderNo(order.getOrderNo());
+        newShopOrder.setOrderID(order.getOrderID());
+        newShopOrder.setUserID(order.getUserID().intValue());
+        newShopOrder.setOrderType(order.getOrderType());
+        newShopOrder.setOrderSubmitType(order.getOrderSubmitType());
+        newShopOrder.setPresentNum(0);
+        newShopOrder.setItemCount(1);
+        //运费商品供应商ID默认998
+        newShopOrder.setShopID(product.getShopID());
+        newShopOrder.setFee(order.getFreight().doubleValue());
+        newShopOrder.setProductAmount(order.getFreight());
+        newShopOrder.setTotalAmount(order.getFreight());
+        newShopOrder.setNeedPayAmount(order.getFreight());
+        newShopOrder.setDiscountAmount(BigDecimal.ZERO);
+        newShopOrder.setPayFlag("0");
+        newShopOrder.setOrderTime(order.getOrderTime());
+        newShopOrder.setPayStatus("3");
+        newShopOrder.setSendOutStatus("3");
+        newShopOrder.setTotalAddedValueTax(BigDecimal.ZERO);
+        newShopOrder.setCanRefundAmount(0D);
+        newShopOrder.setRefundAmount(0D);
+        newShopOrder.setRefundStatus(0);
+        newShopOrder.setClubID(order.getClubID().intValue());
+        if (null != order.getSpID()) {
+            newShopOrder.setSpID(order.getSpID().intValue());
+        }
+        if (null != order.getMainSpID()) {
+            newShopOrder.setMainSpID(order.getMainSpID().intValue());
+        }
+        newShopOrder.setAutoOverTimeMills(0L);
+        newShopOrder.setAutoReceiveTimeMills(0L);
+        newShopOrder.setOrderBeanAmount(0);
+        newShopOrder.setUseBeanFlag(0);
+        newShopOrder.setUseBeanAmount(0);
+        newShopOrder.setAccountAmount(BigDecimal.ZERO);
+        newShopOrder.setCanRefundFlag(1);
+        newShopOrder.setBuyStatus("1");
+        newShopOrder.setOutStoreNum(0);
+        newShopOrder.setDelFlag("0");
+        newShopOrder.setPayFlag("0");
+        // 订单默认可拆分
+        newShopOrder.setSplitFlag("1");
+        /*
+         * 保存子订单信息到数据库
+         */
+        orderMapper.insertShopOrder(newShopOrder);
+        log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>新增子订单(运费商品)(insert[cm_shop_order])shopOrderId:" + newShopOrder.getShopOrderID());
+
+        /*
+         * 插入订单 运费商品
+         */
+        CmOrderProductPo feeOrderProduct = new CmOrderProductPo();
+        feeOrderProduct.setProductType("0");
+        feeOrderProduct.setOrderNo(order.getOrderNo());
+        feeOrderProduct.setOrderID(order.getOrderID());
+        feeOrderProduct.setShopOrderID(newShopOrder.getShopOrderID());
+        feeOrderProduct.setShopOrderNo(newShopOrder.getShopOrderNo());
+        feeOrderProduct.setShopID(product.getShopID().longValue());
+        feeOrderProduct.setProductID(999);
+        feeOrderProduct.setNum(1);
+        feeOrderProduct.setPresentNum(0);
+        feeOrderProduct.setOutStoreType("0");
+        feeOrderProduct.setProps(product.getProps());
+        feeOrderProduct.setProductNo(product.getProductCode());
+        feeOrderProduct.setPrice(order.getFreight());
+        feeOrderProduct.setNormalPrice(order.getFreight());
+        feeOrderProduct.setPrice0(order.getFreight());
+        feeOrderProduct.setPrice1(order.getFreight());
+        feeOrderProduct.setTotalAmount(order.getFreight());
+        feeOrderProduct.setTotalFee(order.getFreight());
+        feeOrderProduct.setShouldPayFee(order.getFreight());
+        feeOrderProduct.setDiscount(new BigDecimal(100));
+        feeOrderProduct.setDiscountPrice(order.getFreight());
+        feeOrderProduct.setTaxRate(new BigDecimal(100));
+        feeOrderProduct.setAddedValueTax(BigDecimal.ZERO);
+        feeOrderProduct.setTotalAddedValueTax(BigDecimal.ZERO);
+        feeOrderProduct.setShopFee(BigDecimal.ZERO);
+        feeOrderProduct.setOtherFee(BigDecimal.ZERO);
+        feeOrderProduct.setCmFee(order.getFreight());
+        feeOrderProduct.setSingleShopFee(BigDecimal.ZERO);
+        feeOrderProduct.setSingleOtherFee(BigDecimal.ZERO);
+        feeOrderProduct.setSingleCmFee(order.getFreight());
+        feeOrderProduct.setTotalBeans(BigDecimal.ZERO);
+        feeOrderProduct.setUseBalanceAmount(0D);
+        feeOrderProduct.setUseBeanAmount(0);
+        feeOrderProduct.setNotOutStore(0);
+        feeOrderProduct.setCmbeanPrice(0);
+        feeOrderProduct.setBuyAgainFlag("0");
+        feeOrderProduct.setShopName(product.getShopName());
+        feeOrderProduct.setName(product.getName());
+        feeOrderProduct.setIncludedTax(product.getIncludedTax());
+        feeOrderProduct.setInvoiceType(product.getInvoiceType());
+        // 保存订单商品数据
+        orderMapper.insertOrderProduct(feeOrderProduct);
+        log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>保存订单运费商品(insert[cm_order_product])orderId:" + feeOrderProduct.getOrderProductID());
+
+        shopOrderIds += (("".equals(shopOrderIds) ? "" : ",") + newShopOrder.getShopOrderID());
+        return shopOrderIds;
+    }
+
+
+
+
+    /**
+     * 保存余额到收款记录,余额收支记录
+     *
+     * @param balancePayFee 余额支付金额
+     * @param orderId       订单id
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void saveDiscernReceipt(BigDecimal balancePayFee, Integer orderId) {
+        String curDateStr = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(new Date());
+        CmDiscernReceiptPo discernReceipt = new CmDiscernReceiptPo();
+        discernReceipt.setPayWay("3");
+        discernReceipt.setPayType("16");
+        discernReceipt.setReceiptType("1");
+        discernReceipt.setReceiptStatus("3");
+        discernReceipt.setReceiptAmount(balancePayFee);
+        discernReceipt.setConfirmType("4");
+        discernReceipt.setReceiptDate(curDateStr);
+        discernReceipt.setConfirmDate(curDateStr);
+        discernReceipt.setReviewDate(curDateStr);
+        discernReceipt.setUpdateDate(curDateStr);
+        discernReceipt.setDelFlag("0");
+        orderMapper.insertDiscernReceipt(discernReceipt);
+        CmReceiptOrderRelationPo relation = new CmReceiptOrderRelationPo();
+        relation.setReceiptID(discernReceipt.getId().intValue());
+        relation.setOrderID(orderId);
+        relation.setAssociateAmount(balancePayFee);
+        relation.setRelationType("2");
+        relation.setDelFlag("0");
+        orderMapper.insertOrderRelation(relation);
+        log.info(">>>>>>>>>>>>>>>>>>>>>>>保存余额到收款记录," + balancePayFee);
+    }
+
+    /**
+     * 新增余额抵扣收支记录
+     *
+     * @param balancePayFee 余额支付金额
+     * @param orderId       订单id
+     * @param userId        用户id
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void saveBalanceRecord(BigDecimal balancePayFee, Integer orderId, Integer userId) {
+        //保存余额到余额收支记录
+        BalanceRecordPo balanceRecord = new BalanceRecordPo();
+        balanceRecord.setUserId(userId.longValue());
+        balanceRecord.setType("2");
+        balanceRecord.setBalanceType("1");
+        balanceRecord.setAddDate(new Date());
+        balanceRecord.setAmount(balancePayFee);
+        balanceRecord.setOrderId(orderId.longValue());
+        balanceRecord.setDelFlag("0");
+        organizeMapper.insertBalanceRecord(balanceRecord);
+        log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>新增用户余额收支记录(insert[cm_user_balance_record])id:" + balanceRecord.getId());
+    }
+
+}

+ 56 - 0
src/main/java/com/caimei/service/impl/UserServiceImpl.java

@@ -0,0 +1,56 @@
+package com.caimei.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.caimei.mapper.OrderMapper;
+import com.caimei.mapper.OrganizeMapper;
+import com.caimei.mapper.ProductMapper;
+import com.caimei.model.ResponseJson;
+import com.caimei.model.enumerate.ReceivablesType;
+import com.caimei.model.po.*;
+import com.caimei.model.vo.*;
+import com.caimei.service.OrderService;
+import com.caimei.service.UserService;
+import com.caimei.utils.*;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
+import org.springframework.util.CollectionUtils;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.text.DecimalFormat;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * @author Aslee
+ */
+@Slf4j
+@Service
+public class UserServiceImpl implements UserService {
+    @Resource
+    private OrganizeMapper organizeMapper;
+
+    @Value("${caimei.oldapi}")
+    private String domain;
+
+
+    @Override
+    public ResponseJson<Map<String, Object>> getBalance(String cmAccount, String data) {
+        // 获取组织信息
+        CmApiOrganizePo organizePo = organizeMapper.getOrganizeByCmAccount(cmAccount);
+        if (null == organizePo) {
+            return ResponseJson.error("参数异常,用户不存在", null);
+        }
+        // 获得用户Id
+        Integer userId = organizePo.getUserId();
+        BigDecimal balance = organizeMapper.getBalanceByUserId(userId);
+        Map<String, Object> result = new HashMap<>(2);
+        result.put("cmAccount", cmAccount);
+        result.put("balance", balance);
+        return ResponseJson.success(result);
+    }
+}

+ 59 - 1
src/main/resources/mapper/OrderMapper.xml

@@ -1365,6 +1365,50 @@
             </if>
         </trim>
     </insert>
+    <insert id="insertDiscernReceipt" keyColumn="id" keyProperty="id" useGeneratedKeys="true" parameterType="com.caimei.model.po.CmDiscernReceiptPo">
+        INSERT INTO `cm_discern_receipt` (
+            `payWay`, `payType`, `receiptType`,
+            `receiptStatus`, `smsContent`, `smsMd5Code`,
+            `orderFlag`, `receiptAmount`, `handlingFee`,
+            `confirmType`, `confirmUserPermissionID`,
+            `reviewUserPermissionID`, `cancelUserPermissionID`,
+            `transactionNum`, `bankID`, `bankCode`,
+            `kuaiQianPayTypeID`, `kuaiQianPayerID`,
+            `rePayFlag`, `actualAmount`, `formData`,
+            `problem`, `noOrderReason`, `reviewReason`,
+            `cancelReason`, `receiptDate`, `confirmDate`,
+            `reviewDate`, `cancelDate`, `updateDate`,
+            `delFlag`
+        )
+        VALUES
+        (
+            #{payWay}, #{payType}, #{receiptType},
+            #{receiptStatus}, #{smsContent}, #{smsMd5Code},
+            #{orderFlag}, #{receiptAmount}, #{handlingFee},
+            #{confirmType}, #{confirmUserPermissionID},
+            #{reviewUserPermissionID}, #{cancelUserPermissionID},
+            #{transactionNum}, #{bankID}, #{bankCode},
+            #{kuaiQianPayTypeID}, #{kuaiQianPayerID},
+            #{rePayFlag}, #{actualAmount}, #{formData},
+            #{problem}, #{noOrderReason}, #{reviewReason},
+            #{cancelReason}, #{receiptDate}, #{confirmDate},
+            #{reviewDate}, #{cancelDate}, #{updateDate},
+            #{delFlag}
+        )
+    </insert>
+    <insert id="insertOrderRelation" keyColumn="id" keyProperty="id" useGeneratedKeys="true" parameterType="com.caimei.model.po.CmReceiptOrderRelationPo">
+        INSERT INTO `cm_receipt_order_relation` (
+            `relationType`, `receiptID`, `associateAmount`,
+            `orderID`, `delFlag`, mbOrderId, orderRequestNo,
+            splitStatus
+        )
+        VALUES
+        (
+            #{relationType}, #{receiptID}, #{associateAmount},
+            #{orderID}, #{delFlag},#{mbOrderId},#{orderRequestNo},
+            #{splitStatus}
+        )
+    </insert>
 
 
     <update id="updateOrder" parameterType="com.caimei.model.po.CmOrderPo">
@@ -1571,6 +1615,18 @@
     <update id="updateNotifyUrl">
         update cm_api_organize set notifyUrl = #{notifyUrl} where id = #{organizeId}
     </update>
+    <update id="updateUserMoney">
+        update user
+        <set>
+            <if test="userMoney != null">
+                userMoney = #{userMoney,jdbcType=DECIMAL},
+            </if>
+            <if test="ableUserMoney != null">
+                ableUserMoney = #{ableUserMoney,jdbcType=DECIMAL},
+            </if>
+        </set>
+        where userID = #{userId,jdbcType=INTEGER}
+    </update>
 
 
     <select id="getUserByUserId" resultType="com.caimei.model.po.UserPo">
@@ -1582,7 +1638,9 @@
             userName,
             realName,
             name,
-            clubID
+            clubID,
+            userMoney,
+            ableUserMoney
         FROM
             user u
             left join cm_api_organize o on u.userID = o.userId

+ 90 - 0
src/main/resources/mapper/OrganizeMapper.xml

@@ -1,10 +1,100 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.caimei.mapper.OrganizeMapper">
+    <insert id="insertBalanceRecord" keyColumn="id" keyProperty="id" parameterType="com.caimei.model.po.BalanceRecordPo" useGeneratedKeys="true">
+    insert into cm_user_balance_record
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+        <if test="userId != null">
+            userId,
+        </if>
+        <if test="type != null">
+            `type`,
+        </if>
+        <if test="balanceType != null">
+            balanceType,
+        </if>
+        <if test="addDate != null">
+            addDate,
+        </if>
+        <if test="amount != null">
+            amount,
+        </if>
+        <if test="orderId != null">
+            orderId,
+        </if>
+        <if test="receiptId != null">
+            receiptId,
+        </if>
+        <if test="returnedId != null">
+            returnedId,
+        </if>
+        <if test="withdrawalsId != null">
+            withdrawalsId,
+        </if>
+        <if test="remark != null">
+            remark,
+        </if>
+        <if test="delFlag != null">
+            delFlag,
+        </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+        <if test="userId != null">
+            #{userId,jdbcType=BIGINT},
+        </if>
+        <if test="type != null">
+            #{type,jdbcType=CHAR},
+        </if>
+        <if test="balanceType != null">
+            #{balanceType,jdbcType=CHAR},
+        </if>
+        <if test="addDate != null">
+            #{addDate,jdbcType=TIMESTAMP},
+        </if>
+        <if test="amount != null">
+            #{amount,jdbcType=DECIMAL},
+        </if>
+        <if test="orderId != null">
+            #{orderId,jdbcType=BIGINT},
+        </if>
+        <if test="receiptId != null">
+            #{receiptId,jdbcType=BIGINT},
+        </if>
+        <if test="returnedId != null">
+            #{returnedId,jdbcType=BIGINT},
+        </if>
+        <if test="withdrawalsId != null">
+            #{withdrawalsId,jdbcType=BIGINT},
+        </if>
+        <if test="remark != null">
+            #{remark,jdbcType=VARCHAR},
+        </if>
+        <if test="delFlag != null">
+            #{delFlag,jdbcType=VARCHAR},
+        </if>
+    </trim>
+</insert>
+    <update id="updateMoney">
+        update user
+        <set>
+            <if test="userMoney != null">
+                userMoney = #{userMoney,jdbcType=DECIMAL},
+            </if>
+            <if test="ableUserMoney != null">
+                ableUserMoney = #{ableUserMoney,jdbcType=DECIMAL},
+            </if>
+        </set>
+        where userID = #{userId,jdbcType=INTEGER}
+    </update>
 
     <select id="getOrganizeByCmAccount" resultType="com.caimei.model.po.CmApiOrganizePo">
         select id as organizeId, userId, cmAccount, privateKey, publicKey, notifyUrl
         from cm_api_organize
         where cmAccount = #{cmAccount};
     </select>
+    <select id="getBalanceByUserId" resultType="java.math.BigDecimal">
+        SELECT ableUserMoney
+        FROM USER
+        WHERE userId = #{userId}
+    </select>
 </mapper>

+ 41 - 7
src/test/java/caimei/OpenApplicationTests.java

@@ -1,9 +1,11 @@
 package caimei;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.caimei.utils.KeyGenerator;
 import com.caimei.utils.KeyPair;
 import com.caimei.utils.KeyUtils;
+import com.google.gson.JsonObject;
 import org.junit.Test;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.core.io.ClassPathResource;
@@ -34,7 +36,7 @@ public class OpenApplicationTests {
     public void productList() throws Exception {
         JSONObject json = new JSONObject();
         json.put("pageNum", 1);
-        json.put("pageSize", 10);
+        json.put("pageSize", 30);
 //        json.put("productName", "精华油");
         // 私钥签名
         String sign = KeyUtils.buildSign(json, privateKey);
@@ -65,7 +67,7 @@ public class OpenApplicationTests {
     @Test
     public void orderSubmit() throws Exception {
         JSONObject json = new JSONObject();
-        json.put("orderId", "cm8883");
+        json.put("orderId", "cm8888");
         json.put("notifyUrl", "https://open-b.caimei365.com/order/pay/callBack");
         JSONObject addressInfoMap =  new JSONObject();
         addressInfoMap.put("provinceName", "广东省");
@@ -79,9 +81,12 @@ public class OpenApplicationTests {
 //        productInfoMap.put("0001", 2);
 //        productInfoMap.put("0002", 3);
 //        productInfoMap.put("0003", 4);
-        productInfoMap.put("0003", 2);
+        productInfoMap.put("0013", 2);
         json.put("productInfo", productInfoMap);
-        json.put("orderShouldPayFee", new BigDecimal(837f).toString());
+        JSONObject payInfoMap = new JSONObject();
+        payInfoMap.put("balancePayFlag", 1);
+        payInfoMap.put("orderShouldPayFee", new BigDecimal(559.5d).toString());
+        json.put("payInfo", payInfoMap);
         JSONObject orderInvoiceMap = new JSONObject();
         orderInvoiceMap.put("type", 2);
         orderInvoiceMap.put("invoiceTitle", "单位名称");
@@ -91,8 +96,6 @@ public class OpenApplicationTests {
         orderInvoiceMap.put("openBank", "开户银行");
         orderInvoiceMap.put("bankAccountNo", "987987465465464");
         json.put("invoiceInfo", orderInvoiceMap);
-//        String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDawyiPFWo4tSS1YX/mXTIGWghehyYfec2JeQFJONfLTOcyJ11RP+19E3QSn6JiclYbRM+Rzt/gvFOnVAyvZ6VUFkIZlMr9ykqB74crQs6pw4AY0lREscV8yk5QYEGPCv3I97A8Pm44ThWGuXQ1cjmxBk+zS4xR2Yu+jPZb65HsNwIDAQAB";
-//        String privateKey = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBANrDKI8Vaji1JLVhf+ZdMgZaCF6HJh95zYl5AUk418tM5zInXVE/7X0TdBKfomJyVhtEz5HO3+C8U6dUDK9npVQWQhmUyv3KSoHvhytCzqnDgBjSVESxxXzKTlBgQY8K/cj3sDw+bjhOFYa5dDVyObEGT7NLjFHZi76M9lvrkew3AgMBAAECgYBFSyISyI6/7aj2By8zMfwBhQ03nAmYWMWhMQIWRnocPHzTJyLo9J3uS3Yt3ADcvCjINHCnV+cUUbMRwo7OFL+KH+NDeLBmv0b+oMoVeOhgJZWkpt+O4bA90+NrA4P3sPqPbJUG1fqtm+Ll8wTASrLxrwyiRn2VRCfwMRTqaTc9sQJBAPqvhe+Ler0dx82kXxr+gwOdRJLqYCqverP66obKRamOG0wF9Hj04fTgz0iwiQK/Jpvu4jfPg6fWyGvGq6lNFdkCQQDfZmMCOHowT9AS21VZYJVE+cBZjg2aP5XV1rXPnOi18cBaDwo8EIIO9gXPtk1GtMeuVf9esXNfSI8SI9GtTXiPAkEAl7UTXAVP8RUNrqCTwbVWuiA5uKNIMWzi1/q4ZXwRrmvGjzpnWa/w8o3+Q6I6OERP7DwkANx/c1ojDj478ogo+QJAfK3H1BVxHEVu+xcuKxOcO0Kn91MwhEW4ef+6uIP53JFvqNN8AsmzzGXCGIrF1hBO4R1dyJuAqEz2jEkxXGdAQQJBAKKFeQ6eiHzwWeiiuMG0Hge4gTPra4v4lHtxcFfqv3tlQ+7LVnw4+4YBMqXRoW+CbwCYhrvoaOqSYTq0xvkctGo=";
         // 私钥签名
         String sign = KeyUtils.buildSign(json, privateKey);
         json.put("sign", sign);
@@ -107,7 +110,7 @@ public class OpenApplicationTests {
     @Test
     public void orderDetail() throws Exception {
         JSONObject json = new JSONObject();
-        json.put("orderId", "cm8872");
+        json.put("orderId", "cm8888");
         // 私钥签名
         String sign = KeyUtils.buildSign(json, privateKey);
         json.put("sign", sign);
@@ -135,5 +138,36 @@ public class OpenApplicationTests {
 //        String code = result.getString("code");
     }
 
+    @Test
+    public void balanceDeduction() throws Exception {
+        JSONObject json = new JSONObject();
+        json.put("orderId", "cm8888");
+        // 私钥签名
+        String sign = KeyUtils.buildSign(json, privateKey);
+        json.put("sign", sign);
+        // 私钥加密
+        String data = KeyUtils.buildDataPrivate(json, privateKey);
+        System.out.println(data);
+        // 发送请求
+//        JSONObject result = KeyUtils.httpPost("http://localhost:8013/order/detail", cmAccount, data);
+//        String code = result.getString("code");
+    }
+
+
+    @Test
+    public void balance() throws Exception {
+        JSONObject json = new JSONObject();
+        json.put("cmAccount", cmAccount);
+        // 私钥签名
+        String sign = KeyUtils.buildSign(json, privateKey);
+        json.put("sign", sign);
+        // 私钥加密
+        String data = KeyUtils.buildDataPrivate(json, privateKey);
+        System.out.println(data);
+        // 发送请求
+//        JSONObject result = KeyUtils.httpPost("http://localhost:8013/order/detail", cmAccount, data);
+//        String code = result.getString("code");
+    }
+
 
 }