Explorar o código

Merge remote-tracking branch 'origin/developer' into developerE

# Conflicts:
#	src/main/resources/mapper/BaseMapper.xml
#	src/main/resources/mapper/OrderCommonMapper.xml
#	src/main/resources/mapper/PayOrderMapper.xml
chao %!s(int64=3) %!d(string=hai) anos
pai
achega
75d9e83ef4
Modificáronse 42 ficheiros con 1275 adicións e 176 borrados
  1. 5 0
      src/main/java/com/caimei365/order/components/ProductService.java
  2. 1 0
      src/main/java/com/caimei365/order/controller/CartSellerApi.java
  3. 1 1
      src/main/java/com/caimei365/order/controller/OrderClubApi.java
  4. 197 30
      src/main/java/com/caimei365/order/controller/PayNonOrderApi.java
  5. 6 0
      src/main/java/com/caimei365/order/controller/PayOrderApi.java
  6. 7 0
      src/main/java/com/caimei365/order/mapper/BaseMapper.java
  7. 5 1
      src/main/java/com/caimei365/order/mapper/OrderClubMapper.java
  8. 6 0
      src/main/java/com/caimei365/order/mapper/OrderCommonMapper.java
  9. 38 1
      src/main/java/com/caimei365/order/mapper/PayOrderMapper.java
  10. 4 0
      src/main/java/com/caimei365/order/model/bo/OrderParamBo.java
  11. 13 0
      src/main/java/com/caimei365/order/model/bo/PayParamBo.java
  12. 59 0
      src/main/java/com/caimei365/order/model/dto/PayCouponDto.java
  13. 1 1
      src/main/java/com/caimei365/order/model/po/BalanceRecordPo.java
  14. 1 1
      src/main/java/com/caimei365/order/model/po/CouponClubPo.java
  15. 16 0
      src/main/java/com/caimei365/order/model/po/CouponRecordPo.java
  16. 1 1
      src/main/java/com/caimei365/order/model/po/DiscernReceiptPo.java
  17. 4 0
      src/main/java/com/caimei365/order/model/po/OrderReceiptRelationPo.java
  18. 1 1
      src/main/java/com/caimei365/order/model/po/PayShopPo.java
  19. 1 1
      src/main/java/com/caimei365/order/model/po/PayShopRecordPo.java
  20. 5 1
      src/main/java/com/caimei365/order/model/po/SplitAccountPo.java
  21. 22 0
      src/main/java/com/caimei365/order/model/vo/BankCodeVo.java
  22. 19 0
      src/main/java/com/caimei365/order/model/vo/CouponCheckVo.java
  23. 13 2
      src/main/java/com/caimei365/order/model/vo/CouponVo.java
  24. 4 0
      src/main/java/com/caimei365/order/model/vo/OrderPayLinkVo.java
  25. 1 1
      src/main/java/com/caimei365/order/model/vo/ReturnedPurchaseVo.java
  26. 2 0
      src/main/java/com/caimei365/order/service/CartSellerService.java
  27. 1 1
      src/main/java/com/caimei365/order/service/OrderClubService.java
  28. 23 0
      src/main/java/com/caimei365/order/service/PayNonOrderService.java
  29. 5 0
      src/main/java/com/caimei365/order/service/PayOrderService.java
  30. 42 28
      src/main/java/com/caimei365/order/service/impl/CartClubServiceImpl.java
  31. 0 1
      src/main/java/com/caimei365/order/service/impl/CartSellerServiceImpl.java
  32. 11 3
      src/main/java/com/caimei365/order/service/impl/OrderClubServiceImpl.java
  33. 322 6
      src/main/java/com/caimei365/order/service/impl/PayNonOrderServiceImpl.java
  34. 219 50
      src/main/java/com/caimei365/order/service/impl/PayOrderServiceImpl.java
  35. 80 34
      src/main/java/com/caimei365/order/service/impl/SubmitServiceImpl.java
  36. 8 0
      src/main/java/com/caimei365/order/task/DelayedSplittingTask.java
  37. 4 0
      src/main/java/com/caimei365/order/utils/PayUtil.java
  38. 5 2
      src/main/resources/mapper/BaseMapper.xml
  39. 11 3
      src/main/resources/mapper/OrderClubMapper.xml
  40. 26 3
      src/main/resources/mapper/OrderCommonMapper.xml
  41. 84 3
      src/main/resources/mapper/PayOrderMapper.xml
  42. 1 0
      src/main/resources/mapper/SubmitMapper.xml

+ 5 - 0
src/main/java/com/caimei365/order/components/ProductService.java

@@ -355,6 +355,11 @@ public class ProductService {
         relation.setAssociateAmount(balancePayFee);
         relation.setRelationType(2);
         relation.setDelFlag(0);
+        String s = "YE" + new SimpleDateFormat("yyyyMMddHHmmssSSS") + "T" + orderId;
+        //todo 余额抵扣订单产生时未产生第三方平台交易,无流水号和唯一订单号,暂自定义相同,防止分账存参数空指针(线上/下余额改版)
+        relation.setMbOrderId(s);
+        relation.setOrderRequestNo(s);
+        relation.setSplitStatus(0);
         // 保存 收款项和订单关系
         baseMapper.insertOrderReceiptRelation(relation);
         log.info(note + ">>>>>>>>>>>收款项和订单关系(insert[cm_receipt_order_relation])id:" + relation.getId() + ",orderId:" + orderId);

+ 1 - 0
src/main/java/com/caimei365/order/controller/CartSellerApi.java

@@ -12,6 +12,7 @@ import lombok.RequiredArgsConstructor;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.web.bind.annotation.*;
 
+
 import java.util.Map;
 
 /**

+ 1 - 1
src/main/java/com/caimei365/order/controller/OrderClubApi.java

@@ -299,7 +299,7 @@ public class OrderClubApi {
     @ApiOperation("分享订单,初始商品数据(旧:/order/commodityData)")
     @ApiImplicitParam(required = true, name = "orderId", value = "订单Id")
     @GetMapping("/share/product")
-    public ResponseJson<List<OrderProductVo>> getOrderShareInitProduct(Integer orderId) {
+    public ResponseJson<Map<String,Object>> getOrderShareInitProduct(Integer orderId) {
         if (null == orderId) {
             return ResponseJson.error("订单Id不能为空!", null);
         }

+ 197 - 30
src/main/java/com/caimei365/order/controller/PayNonOrderApi.java

@@ -2,6 +2,7 @@ package com.caimei365.order.controller;
 
 import com.alibaba.fastjson.JSONObject;
 import com.caimei365.order.model.ResponseJson;
+import com.caimei365.order.model.dto.PayCouponDto;
 import com.caimei365.order.model.dto.PaySecondDto;
 import com.caimei365.order.model.dto.PayVipDto;
 import com.caimei365.order.service.PayNonOrderService;
@@ -21,7 +22,7 @@ import java.security.spec.InvalidKeySpecException;
  * @author : Charles
  * @date : 2021/9/27
  */
-@Api(tags="其他(非订单)支付API")
+@Api(tags = "其他(非订单)支付API")
 @RestController
 @RequiredArgsConstructor
 @RequestMapping("/order/pay")
@@ -31,16 +32,17 @@ public class PayNonOrderApi {
 
     /**
      * 二手发布-微信线上支付
+     *
      * @param paySecondDto {
-     *               productId      二手发布商品id
-     *               returnUrl     页面回调地址
-     *               code          微信小程序code
-     *               state         微信公众号state参数
-     * }
+     *                     productId      二手发布商品id
+     *                     returnUrl     页面回调地址
+     *                     code          微信小程序code
+     *                     state         微信公众号state参数
+     *                     }
      */
     @ApiOperation("二手发布-微信线上支付(旧:/PayOrder/appletsSecondHandPay)(/PayOrder/secondHandPay[WEIXIN])")
     @PostMapping("/second/wechat")
-    public ResponseJson<JSONObject> paySecondByWeChat(PaySecondDto paySecondDto, @RequestHeader HttpHeaders headers){
+    public ResponseJson<JSONObject> paySecondByWeChat(PaySecondDto paySecondDto, @RequestHeader HttpHeaders headers) {
         if (null == paySecondDto.getProductId()) {
             return ResponseJson.error("二手商品Id不能为空!", null);
         }
@@ -52,14 +54,15 @@ public class PayNonOrderApi {
 
     /**
      * 二手发布-支付宝线上支付
+     *
      * @param paySecondDto {
-     *               productId      二手发布商品id
-     *               returnUrl     页面回调地址
-     * }
+     *                     productId      二手发布商品id
+     *                     returnUrl     页面回调地址
+     *                     }
      */
     @ApiOperation("二手发布-支付宝线上支付(旧:/PayOrder/secondHandPay[ALIPAY])")
     @PostMapping("/second/alipay")
-    public ResponseJson<JSONObject> paySecondByAlipay(PaySecondDto paySecondDto, @RequestHeader HttpHeaders headers){
+    public ResponseJson<JSONObject> paySecondByAlipay(PaySecondDto paySecondDto, @RequestHeader HttpHeaders headers) {
         if (null == paySecondDto.getProductId()) {
             return ResponseJson.error("二手商品Id不能为空!", null);
         }
@@ -71,16 +74,17 @@ public class PayNonOrderApi {
 
     /**
      * 二手发布-银联线上支付
+     *
      * @param paySecondDto {
-     *               productId     二手发布商品id
-     *               returnUrl     页面回调地址
-     *               bankCode      银行编码(银联支付使用)
-     *               userType      用户类型(银联支付使用)企业:ENTERPRISE,个人:USER
-     * }
+     *                     productId     二手发布商品id
+     *                     returnUrl     页面回调地址
+     *                     bankCode      银行编码(银联支付使用)
+     *                     userType      用户类型(银联支付使用)企业:ENTERPRISE,个人:USER
+     *                     }
      */
     @ApiOperation("二手发布-银联线上支付(旧:/PayOrder/secondHandPay[UNIONPAY])")
     @PostMapping("/second/union")
-    public ResponseJson<JSONObject> paySecondByUnionPay(PaySecondDto paySecondDto, @RequestHeader HttpHeaders headers){
+    public ResponseJson<JSONObject> paySecondByUnionPay(PaySecondDto paySecondDto, @RequestHeader HttpHeaders headers) {
         if (null == paySecondDto.getProductId()) {
             return ResponseJson.error("二手商品Id不能为空!", null);
         }
@@ -110,16 +114,17 @@ public class PayNonOrderApi {
 
     /**
      * 升级超级会员-微信线上支付
+     *
      * @param payVipDto {
      *                  vipRecordId   会员购买记录Id
      *                  returnUrl     页面回调地址
      *                  code          微信小程序code
      *                  state         微信公众号state参数
-     * }
+     *                  }
      */
     @ApiOperation("升级超级会员-微信线上支付")
     @PostMapping("/vip/wechat")
-    public ResponseJson<JSONObject> paySuperVipByWeChat(PayVipDto payVipDto, @RequestHeader HttpHeaders headers){
+    public ResponseJson<JSONObject> paySuperVipByWeChat(PayVipDto payVipDto, @RequestHeader HttpHeaders headers) {
         if (null == payVipDto.getVipRecordId()) {
             return ResponseJson.error("会员购买记录Id不能为空!", null);
         }
@@ -131,14 +136,15 @@ public class PayNonOrderApi {
 
     /**
      * 升级超级会员-支付宝线上支付
+     *
      * @param payVipDto {
      *                  vipRecordId   会员购买记录Id
      *                  returnUrl     页面回调地址
-     * }
+     *                  }
      */
     @ApiOperation("升级超级会员-支付宝线上支付")
     @PostMapping("/vip/alipay")
-    public ResponseJson<JSONObject> paySuperVipByAlipay(PayVipDto payVipDto, @RequestHeader HttpHeaders headers){
+    public ResponseJson<JSONObject> paySuperVipByAlipay(PayVipDto payVipDto, @RequestHeader HttpHeaders headers) {
         if (null == payVipDto.getVipRecordId()) {
             return ResponseJson.error("会员购买记录Id不能为空!", null);
         }
@@ -150,16 +156,17 @@ public class PayNonOrderApi {
 
     /**
      * 升级超级会员-银联线上支付
+     *
      * @param payVipDto {
-     *               vipRecordId   会员购买记录Id
-     *               returnUrl     页面回调地址
-     *               bankCode      银行编码(银联支付使用)
-     *               userType      用户类型(银联支付使用)企业:ENTERPRISE,个人:USER
-     * }
+     *                  vipRecordId   会员购买记录Id
+     *                  returnUrl     页面回调地址
+     *                  bankCode      银行编码(银联支付使用)
+     *                  userType      用户类型(银联支付使用)企业:ENTERPRISE,个人:USER
+     *                  }
      */
     @ApiOperation("升级超级会员-银联线上支付")
     @PostMapping("/vip/union")
-    public ResponseJson<JSONObject> paySuperVipByUnionPay(PayVipDto payVipDto, @RequestHeader HttpHeaders headers){
+    public ResponseJson<JSONObject> paySuperVipByUnionPay(PayVipDto payVipDto, @RequestHeader HttpHeaders headers) {
         if (null == payVipDto.getVipRecordId()) {
             return ResponseJson.error("会员购买记录Id不能为空!", null);
         }
@@ -189,10 +196,11 @@ public class PayNonOrderApi {
 
     /**
      * 升级超级会员-线上退款
+     *
      * @param payVipDto {
-     *               vipRecordId   会员购买记录Id
-     *               code          退款口令
-     * }
+     *                  vipRecordId   会员购买记录Id
+     *                  code          退款口令
+     *                  }
      */
     @ApiOperation("升级超级会员-线上退款)")
     @PostMapping("/vip/online/refund")
@@ -205,4 +213,163 @@ public class PayNonOrderApi {
         }
         return payNonOrderService.superVipOnlineRefund(payVipDto);
     }
+
+
+    @ApiOperation("购买价值优惠券-获取购买记录id")
+    @PostMapping("/coupon/record")
+    public ResponseJson<PayCouponDto> payCouponGetRecord(PayCouponDto payCouponDto, @RequestHeader HttpHeaders headers) {
+        if (null == payCouponDto.getCouponId()) {
+            return ResponseJson.error("优惠券Id不能为空!", null);
+        }
+        if (null == payCouponDto.getUserId()) {
+            return ResponseJson.error("userId不能为空!", null);
+        }
+        return payNonOrderService.getCouponRecord(payCouponDto, headers);
+    }
+
+    /**
+     * 升级超级会员-微信线上支付
+     *
+     * @param payCouponDto {
+     *                     couponId      购买优惠券Id
+     *                     userId        userId
+     *                     couponRecordId  购买记录id
+     *                     returnUrl     页面回调地址
+     *                     code          微信小程序code
+     *                     state         微信公众号state参数
+     *                     }
+     */
+    @ApiOperation("购买价值优惠券-微信线上支付")
+    @PostMapping("/coupon/wechat")
+    public ResponseJson<JSONObject> payCouponByWeChat(PayCouponDto payCouponDto, @RequestHeader HttpHeaders headers) {
+        if (null == payCouponDto.getCouponRecordId()) {
+            return ResponseJson.error("购买记录id不能为空!", null);
+        }
+        if (null == payCouponDto.getSource()) {
+            return ResponseJson.error("领取渠道不能为空!", null);
+        }
+        if (null == payCouponDto.getCouponId()) {
+            return ResponseJson.error("优惠券Id不能为空!", null);
+        }
+        if (null == payCouponDto.getUserId()) {
+            return ResponseJson.error("userId不能为空!", null);
+        }
+        if (StringUtils.isEmpty(payCouponDto.getCode())) {
+            return ResponseJson.error("微信code不能为空!", null);
+        }
+        return payNonOrderService.payCouponByWeChat(payCouponDto, headers);
+    }
+
+    /**
+     * 购买价值优惠券-支付宝线上支付
+     *
+     * @param payCouponDto {
+     *                     couponRecordId  购买记录id
+     *                     couponId      购买优惠券Id
+     *                     userId        userId
+     *                     returnUrl     页面回调地址
+     *                     }
+     */
+    @ApiOperation("购买价值优惠券-支付宝线上支付")
+    @PostMapping("/coupon/alipay")
+    public ResponseJson<JSONObject> payCouponByAlipay(PayCouponDto payCouponDto, @RequestHeader HttpHeaders headers) {
+        if (null == payCouponDto.getCouponRecordId()) {
+            return ResponseJson.error("购买记录id不能为空!", null);
+        }
+        if (null == payCouponDto.getSource()) {
+            return ResponseJson.error("领取渠道不能为空!", null);
+        }
+        if (null == payCouponDto.getCouponId()) {
+            return ResponseJson.error("优惠券Id不能为空!", null);
+        }
+        if (StringUtils.isEmpty(payCouponDto.getReturnUrl())) {
+            return ResponseJson.error("回调地址不能为空!", null);
+        }
+        return payNonOrderService.payCouponByAlipay(payCouponDto, headers);
+    }
+
+    /**
+     * 购买价值优惠券-银联线上支付
+     *
+     * @param payCouponDto {
+     *                     couponRecordId  购买记录id
+     *                     userID        用户id
+     *                     couponId      购买优惠券Id
+     *                     returnUrl     页面回调地址
+     *                     bankCode      银行编码(银联支付使用)
+     *                     userType      用户类型(银联支付使用)企业:ENTERPRISE,个人:USER
+     *                     }
+     */
+    @ApiOperation("购买价值优惠券-银联线上支付")
+    @PostMapping("/coupon/union")
+    public ResponseJson<JSONObject> payCouponByUnionPay(PayCouponDto payCouponDto, @RequestHeader HttpHeaders headers) {
+        if (null == payCouponDto.getCouponRecordId()) {
+            return ResponseJson.error("购买记录id不能为空!", null);
+        }
+        if (null == payCouponDto.getSource()) {
+            return ResponseJson.error("领取渠道不能为空!", null);
+        }
+        if (null == payCouponDto.getUserId()) {
+            return ResponseJson.error("用户id不能为空!", null);
+        }
+        if (null == payCouponDto.getCouponId()) {
+            return ResponseJson.error("优惠券Id不能为空!", null);
+        }
+        if (StringUtils.isEmpty(payCouponDto.getReturnUrl())) {
+            return ResponseJson.error("回调地址不能为空!", null);
+        }
+        if (StringUtils.isEmpty(payCouponDto.getBankCode())) {
+            return ResponseJson.error("银行编码不能为空!", null);
+        }
+        if (StringUtils.isEmpty(payCouponDto.getUserType())) {
+            return ResponseJson.error("银行用户类型不能为空!", null);
+        }
+        return payNonOrderService.payCouponUnionPay(payCouponDto, headers);
+    }
+
+    /**
+     * 购买优惠券-查询是否购买成功
+     */
+    @ApiOperation("购买优惠券-查询是否购买成功")
+    @GetMapping("/coupon/check")
+    public ResponseJson couponCheck(Integer couponRecordId) {
+        if (null == couponRecordId) {
+            return ResponseJson.error("购买记录id不能为空!", null);
+        }
+        return payNonOrderService.couponCheck(couponRecordId);
+    }
+
+
+    /**
+     * 购买优惠券-支付回调
+     */
+    @ApiOperation("购买优惠券-支付回调")
+    @GetMapping("/coupon/callback")
+    public String couponCallback(String data) throws NoSuchAlgorithmException, InvalidKeySpecException {
+        if (StringUtils.isBlank(data)) {
+            return "回调参数失败";
+        }
+        return payNonOrderService.couponCallback(data);
+    }
+
+    /**
+     * 购买优惠券-查询是否购买成功
+     */
+    @ApiOperation("购买超级会员-查询是否购买成功")
+    @GetMapping("/vip/check")
+    public ResponseJson vipCheck(Integer recordId) {
+        if (null == recordId) {
+            return ResponseJson.error("购买记录id不能为空!", null);
+        }
+        return payNonOrderService.vipCheck(recordId);
+    }
+
+    @ApiOperation("bug测试")
+    @GetMapping("/check/bug")
+    public ResponseJson bugCheck(Integer userId) {
+        if (null == userId) {
+            return ResponseJson.error("userId不能为空!", null);
+        }
+        return payNonOrderService.bugCheck(userId);
+    }
 }

+ 6 - 0
src/main/java/com/caimei365/order/controller/PayOrderApi.java

@@ -264,6 +264,12 @@ public class PayOrderApi {
         return payOrderService.delayedSplittingCallback(data);
     }
 
+    @ApiOperation("银行通道码获取")
+    @GetMapping("/bankcode")
+    public ResponseJson<JSONObject> bankcode() {
+        return payOrderService.bankCode();
+    }
+
 //    /**
 //     * 手动临时分账
 //     */

+ 7 - 0
src/main/java/com/caimei365/order/mapper/BaseMapper.java

@@ -225,4 +225,11 @@ public interface BaseMapper {
     UserBeansHistoryPo findLowOrder(Integer orderId);
 
     Integer findBeans(Integer userId);
+
+    //根据orderid找paytype
+    String findPayType(String orderId);
+    //根据mborderid找paytype
+    String findType(String mbOrderId);
+
+    Double getonlineMoney(Integer userId);
 }

+ 5 - 1
src/main/java/com/caimei365/order/mapper/OrderClubMapper.java

@@ -187,7 +187,7 @@ public interface OrderClubMapper {
     /**
      * 根据clubCouponId获取优惠券
      */
-    CouponVo getClubCouponById(Integer clubCouponId);
+    CouponVo getClubCouponById(Integer clubCouponId,Integer userId);
     /**
      * 修改优惠券使用情况
      */
@@ -212,4 +212,8 @@ public interface OrderClubMapper {
      * 机构最新订单Id
      */
     Integer getLatestOrderId(Integer userId);
+
+    Integer findUserId(Integer orderId);
+
+    void insertCouponRecord(CouponRecordPo couponRecordPo);
 }

+ 6 - 0
src/main/java/com/caimei365/order/mapper/OrderCommonMapper.java

@@ -155,4 +155,10 @@ public interface OrderCommonMapper {
      * 根据用户id查询注册时间
      */
     Date getUserRegisterTime(Integer userId);
+
+    Double findUserMoney(Integer orderId);
+
+    Double findOnlineMoney(Integer orderId);
+
+    Integer finduserBean(Integer orderId);
 }

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

@@ -2,6 +2,8 @@ package com.caimei365.order.mapper;
 
 import com.caimei365.order.model.bo.VipRecordBo;
 import com.caimei365.order.model.po.*;
+import com.caimei365.order.model.vo.BankCodeVo;
+import com.caimei365.order.model.vo.CouponCheckVo;
 import com.caimei365.order.model.vo.OrderPayLinkVo;
 import com.caimei365.order.model.vo.OrderVo;
 import org.apache.ibatis.annotations.Mapper;
@@ -30,13 +32,25 @@ public interface PayOrderMapper {
      * @param order 主订单
      */
     void updateOrderStatus(OrderVo order);
+
+    void updateUserMoney(Double userMoney, Double ableUserMoney,Integer userId);
     /**
      * 根据用户Id更新余额
      * @param userMoney      用户余额
      * @param ableUserMoney 用户可用余额
      * @param userId 用户Id
      */
-    void updateMoneyByUserId(Double userMoney, Double ableUserMoney, Integer userId);
+    void updateMoneyByUserId(Double userMoney, Double ableUserMoney,Double onlineMoney,Integer userId);
+
+    void updateAbleMoney( Double ableUserMoney,Integer userId);
+    /**
+     * 根据用户Id更新线上余额
+     *
+     * @param onlineMoney   线上用户余额
+     * @param ableUserMoney 用户可用余额
+     * @param userId        用户Id
+     */
+    void updateOnlineMoneyByUserId(Double onlineMoney, Double ableUserMoney, Integer userId);
     /**
      * 订单支付链接
      * @param orderId 订单Id
@@ -166,4 +180,27 @@ public interface PayOrderMapper {
      * 更新会员支付历史记录
      */
     void updateVipPackageRecord(VipRecordBo record);
+
+    List<BankCodeVo> findBankCode();
+    /**
+     * 获取线上余额分账
+     *
+     * @param currentTime
+     * @return
+     */
+    List<OrderReceiptRelationPo> getOnlineBalance(String currentTime);
+
+    Double getCouponPrice(Integer couponId);
+
+    void insertCouponRecord(CouponRecordPo cr);
+
+    void updateCouponRecord(Integer recordId);
+
+    Integer findPayStatus(Integer recordId);
+
+    Integer findClubType(Integer userId);
+
+    void bugFix(Integer userId);
+
+    List<CouponCheckVo> findCouponOrder();
 }

+ 4 - 0
src/main/java/com/caimei365/order/model/bo/OrderParamBo.java

@@ -117,4 +117,8 @@ public class OrderParamBo implements Serializable {
      * 超级会员用户标记
      */
     private Boolean svipUserFlag;
+    /**
+     * 线上余额
+     */
+    private Double onlineMoney;
 }

+ 13 - 0
src/main/java/com/caimei365/order/model/bo/PayParamBo.java

@@ -30,6 +30,10 @@ public class PayParamBo implements Serializable {
      * 会员购买记录Id
      */
     private Integer vipRecordId;
+    /**
+     * 优惠券购买记录id
+     */
+    private Integer couponRecordId;
     /**
      * 会员套餐id
      */
@@ -81,4 +85,13 @@ public class PayParamBo implements Serializable {
      * 个人:USER
      */
     private String userType;
+    /**
+     * 购买优惠券id
+     */
+    private Integer couponId;
+    /**
+     *  1小程序 2网站
+     */
+    @ApiModelProperty("领取渠道1小程序 2网站")
+    private Integer source;
 }

+ 59 - 0
src/main/java/com/caimei365/order/model/dto/PayCouponDto.java

@@ -0,0 +1,59 @@
+package com.caimei365.order.model.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class PayCouponDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+    /**
+     * 购买优惠券Id
+     */
+    @ApiModelProperty("购买优惠券Id")
+    private Integer couponId;
+    /**
+     * userId
+     */
+    @ApiModelProperty("userId")
+    private Integer userId;
+    /**
+     * 购买记录id
+     */
+    @ApiModelProperty("购买记录id")
+    private Integer couponRecordId;
+    /**
+     * 页面回调地址
+     */
+    @ApiModelProperty("页面回调地址")
+    private String returnUrl;
+    /**
+     * 微信小程序code,微信小程序支付使用
+     */
+    @ApiModelProperty("微信小程序code")
+    private String code;
+    /**
+     * 微信公众号state参数
+     */
+    @ApiModelProperty("微信公众号state参数")
+    private String state;
+    /**
+     * 银行编码(银联支付使用)
+     */
+    @ApiModelProperty("银行编码(银联支付使用)")
+    private String bankCode;
+    /**
+     * 用户类型(银联支付使用)
+     * 企业:ENTERPRISE
+     * 个人:USER
+     */
+    @ApiModelProperty("用户类型(银联支付使用)企业:ENTERPRISE,个人:USER")
+    private String userType;
+
+    /**
+     *  1小程序 2网站
+     */
+    @ApiModelProperty("领取渠道1小程序 2网站")
+    private Integer source;
+}

+ 1 - 1
src/main/java/com/caimei365/order/model/po/BalanceRecordPo.java

@@ -27,7 +27,7 @@ public class BalanceRecordPo implements Serializable {
      */
     private Integer type;
     /**
-     * 余额类型:1余额抵扣,2多收退款到余额,3申请退款,4余额充值,5余额提现,6订金订单充值,7余额订单充值,8订金订单退款,9余额订单退款
+     * 余额类型:1线下余额抵扣,2多收退款到余额,3申请退款,4余额充值,5余额提现,6订金订单充值,7余额订单充值,8订金订单退款,9余额订单退款,10线上余额抵扣,16线上订金订单充值,17线上余额订单充值
      */
     private Integer balanceType;
     /**

+ 1 - 1
src/main/java/com/caimei365/order/model/po/CouponClubPo.java

@@ -36,7 +36,7 @@ public class CouponClubPo {
 
 
     /**
-     * 领取渠道:1网站 2小程序 3订单退回
+     * 领取渠道:1网站 2小程序 3订单退回,5商品购买转换
      */
     private Integer source;
 

+ 16 - 0
src/main/java/com/caimei365/order/model/po/CouponRecordPo.java

@@ -0,0 +1,16 @@
+package com.caimei365.order.model.po;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class CouponRecordPo implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private Integer id;
+    private Integer couponId;
+    private Integer payStatus;
+    private Integer userId;
+    private Integer orderId;//商品兑换优惠券订单id
+}

+ 1 - 1
src/main/java/com/caimei365/order/model/po/DiscernReceiptPo.java

@@ -27,7 +27,7 @@ public class DiscernReceiptPo implements Serializable {
      */
     private Integer payType;
     /**
-     * 收款款项类型:1订单款,2非订单款,3返佣款 , 5供应商退款,6超级会员款 ,7二手商品上架费
+     * 收款款项类型:1订单款,2非订单款,3返佣款 , 5供应商退款,6超级会员款 ,7二手商品上架费,8优惠券购买费
      */
     private Integer receiptType;
     /**

+ 4 - 0
src/main/java/com/caimei365/order/model/po/OrderReceiptRelationPo.java

@@ -41,6 +41,10 @@ public class OrderReceiptRelationPo implements Serializable {
      *  超级会员购买记录Id
      */
     private Integer vipRecordId;
+    /**
+     * 优惠券购买记录id
+     */
+    private Integer couponRecordId;
     /**
      * 删除标记 0 否,其余是
      */

+ 1 - 1
src/main/java/com/caimei365/order/model/po/PayShopPo.java

@@ -62,7 +62,7 @@ public class PayShopPo implements Serializable {
     private Double transferPayFee;
 
     /**
-     * 付款方式 1建设银行7297, 2中信银行0897, 3中信银行7172, 4广发银行0115, 5广发银行5461
+     * 付款方式 1建设银行7297, 2中信银行0897, 3中信银行7172, 4广发银行0115, 5广发银行5461,6线上分账
      */
     private Integer payType;
 

+ 1 - 1
src/main/java/com/caimei365/order/model/po/PayShopRecordPo.java

@@ -36,7 +36,7 @@ public class PayShopRecordPo implements Serializable {
      */
     private Double wipePayment;
     /**
-     * 付款方式 1建设银行7297, 2中信银行0897, 3中信银行7172, 4广发银行0115, 5广发银行5461
+     * 付款方式 1建设银行7297, 2中信银行0897, 3中信银行7172, 4广发银行0115, 5广发银行5461,6线上分账
      */
     private Integer payType;
     /**

+ 5 - 1
src/main/java/com/caimei365/order/model/po/SplitAccountPo.java

@@ -37,7 +37,11 @@ public class SplitAccountPo implements Serializable {
      */
     private Integer vipRecordId;
     /**
-     * 分账类型:1公账-专票,2私账-无票,3公账-普票,4供应商子商户
+     * 优惠券购买记录id
+     */
+    private Integer couponRecordId;
+    /**
+     * 分账类型:1公账-专票,2私账-无票,3公账-普票,4供应商子商户,5佣金账户
      */
     private Integer type;
     /**

+ 22 - 0
src/main/java/com/caimei365/order/model/vo/BankCodeVo.java

@@ -0,0 +1,22 @@
+package com.caimei365.order.model.vo;
+
+import lombok.Data;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+@Setter
+@Getter
+@ToString
+@Data
+public class BankCodeVo {
+    private String id;
+    private String bankName;
+    //B2C通道编码
+    private String B2C;
+    //B2B通道编码
+    private String B2B;
+    //银行logo
+    private String bankLogo;
+    private String delFlag;
+}

+ 19 - 0
src/main/java/com/caimei365/order/model/vo/CouponCheckVo.java

@@ -0,0 +1,19 @@
+package com.caimei365.order.model.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class CouponCheckVo implements Serializable {
+
+    //购买的商品id
+    private Integer productId;
+    //下单购买的数量
+    private Integer num;
+    //下单订单id
+    private Integer orderId;
+
+    private Integer userId;
+
+}

+ 13 - 2
src/main/java/com/caimei365/order/model/vo/CouponVo.java

@@ -15,6 +15,7 @@ import java.util.List;
  */
 @Data
 public class CouponVo implements Serializable {
+
     /**
      * 用户关联优惠id
      */
@@ -41,12 +42,19 @@ public class CouponVo implements Serializable {
     @JsonFormat(pattern = "yyyy.MM.dd", timezone = "GMT+8")
     private Date startDate;
 
+    /**
+     * 价值优惠券购买金额
+     */
+    private Double moneyCouponPrice;
+    /**
+     * 是否是价值优惠券,1是,2不是
+     */
+    private Integer moneyCouponFlag;
     /**
      * 使用结束时间(有效期)
      */
     @JsonFormat(pattern = "yyyy.MM.dd", timezone = "GMT+8")
     private Date endDate;
-
     /**
      * 劵类型 0活动券 1品类券 2用户专享券 3店铺券 4新用户券
      */
@@ -71,7 +79,6 @@ public class CouponVo implements Serializable {
      * 优惠品类:1产品 2仪器(品类券有效)
      */
     private Integer categoryType;
-
     /**
      * 供应商名称
      */
@@ -82,6 +89,10 @@ public class CouponVo implements Serializable {
      */
     private Integer useStatus;
 
+    /**
+     * 价值优惠券属性,1,意向券,2,定向券
+     */
+    private Integer moneyCouponType;
     /**
      * 领取状态: 0未领取 1已领取 (前端使用)
      */

+ 4 - 0
src/main/java/com/caimei365/order/model/vo/OrderPayLinkVo.java

@@ -25,6 +25,10 @@ public class OrderPayLinkVo implements Serializable {
      * 会员购买记录Id
      */
     private Integer vipRecordId;
+    /**
+     * 优惠券购买记录id
+     */
+    private Integer couponRecordId;
     /**
      * 会员套餐包月数
      */

+ 1 - 1
src/main/java/com/caimei365/order/model/vo/ReturnedPurchaseVo.java

@@ -35,7 +35,7 @@ public class ReturnedPurchaseVo implements Serializable {
      */
     private Integer returnedWay;
     /**
-     * 付款方式 付款方式 1建设银行7297, 2中信银行0897, 3中信银行7172, 4广发银行0115, 5广发银行5461
+     * 付款方式 付款方式 1建设银行7297, 2中信银行0897, 3中信银行7172, 4广发银行0115, 5广发银行5461,6线上分账
      */
     private String payType;
     /**

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

@@ -3,7 +3,9 @@ package com.caimei365.order.service;
 import com.caimei365.order.model.ResponseJson;
 import com.caimei365.order.model.dto.AgainBuyDto;
 import com.caimei365.order.model.dto.SellerCartDto;
+import com.caimei365.order.model.vo.CouponVo;
 
+import java.util.List;
 import java.util.Map;
 
 /**

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

@@ -117,7 +117,7 @@ public interface OrderClubService {
      * 分享订单,初始商品数据
      * @param orderId 订单Id
      */
-    ResponseJson<List<OrderProductVo>> getOrderShareInitProduct(Integer orderId);
+    ResponseJson<Map<String,Object>> getOrderShareInitProduct(Integer orderId);
     /**
      * 二手订单 确认打款供应商
      * @param orderId 订单Id

+ 23 - 0
src/main/java/com/caimei365/order/service/PayNonOrderService.java

@@ -2,6 +2,7 @@ package com.caimei365.order.service;
 
 import com.alibaba.fastjson.JSONObject;
 import com.caimei365.order.model.ResponseJson;
+import com.caimei365.order.model.dto.PayCouponDto;
 import com.caimei365.order.model.dto.PaySecondDto;
 import com.caimei365.order.model.dto.PayVipDto;
 import org.springframework.http.HttpHeaders;
@@ -89,4 +90,26 @@ public interface PayNonOrderService {
      * }
      */
     ResponseJson<JSONObject> superVipOnlineRefund(PayVipDto payVipDto) throws NoSuchAlgorithmException, InvalidKeySpecException;
+
+    /**
+     * 微信购买优惠券
+     * @param payCouponDto
+     * @param headers
+     * @return
+     */
+    ResponseJson<JSONObject> payCouponByWeChat(PayCouponDto payCouponDto, HttpHeaders headers);
+
+    String couponCallback(String data) throws NoSuchAlgorithmException, InvalidKeySpecException;
+
+    ResponseJson<JSONObject> payCouponByAlipay(PayCouponDto payCouponDto, HttpHeaders headers);
+
+    ResponseJson<JSONObject> payCouponUnionPay(PayCouponDto payCouponDto, HttpHeaders headers);
+
+    ResponseJson<PayCouponDto> getCouponRecord(PayCouponDto payCouponDto, HttpHeaders headers);
+
+    ResponseJson couponCheck(Integer recordId);
+
+    ResponseJson vipCheck(Integer recordId);
+
+    ResponseJson bugCheck(Integer userId);
 }

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

@@ -111,6 +111,11 @@ public interface PayOrderService {
      * 延时分账异步通知回调
      */
     String delayedSplittingCallback(String data);
+
+    ResponseJson<JSONObject> bankCode();
+
+    void couponCheck();
+
 //    /**
 //     * 手动临时分账
 //     */

+ 42 - 28
src/main/java/com/caimei365/order/service/impl/CartClubServiceImpl.java

@@ -146,7 +146,7 @@ public class CartClubServiceImpl implements CartClubService {
                     boolean taxFlag = productService.setCartItemImgAndTax(cartItemVo);
                     // 商品可见度: 3:所有人可见,2:普通机构可见,1:会员机构可见,4:仅医美机构可见
                     Integer visibility = cartItemVo.getVisibility();
-                    boolean visibleFlag = visibility == 3 || visibility==2 || (visibility == 1 && (finalUserIdentity == 2 || svipUserFlag)) || (visibility == 4 && finalUserClubType == 1);
+                    boolean visibleFlag = visibility == 3 || visibility == 2 || (visibility == 1 && (finalUserIdentity == 2 || svipUserFlag)) || (visibility == 4 && finalUserClubType == 1);
                     if (!visibleFlag) {
                         //不可见商品 不加入失效商品,直接去除
                         productIterator.remove();
@@ -554,12 +554,12 @@ public class CartClubServiceImpl implements CartClubService {
             Integer finalUserClubType = userClubType;
             Integer finalUserIdentity = userIdentity;
             cartList.removeIf(cartItemVo -> !(
-                // visibility商品可见度: 3:所有人可见,2:普通机构可见,1:会员机构可见,4:仅医美机构可见
-                (cartItemVo.getVisibility() == 3 || cartItemVo.getVisibility()==2 || (cartItemVo.getVisibility() == 1 && (finalUserIdentity == 2 || svipUserFlag)) || (cartItemVo.getVisibility() == 4 && finalUserClubType == 1))
-                // 价格可见度: 0公开价格,1不公开价格,2仅对会员机构公开,3仅对医美机构公开
-                || (cartItemVo.getPriceFlag() == 0 || (cartItemVo.getPriceFlag() == 2 && (finalUserIdentity == 2 || svipUserFlag)) || (cartItemVo.getPriceFlag() == 3 && finalUserClubType == 1))
-                // 是否库存充足
-                || (cartItemVo.getStock() != null && cartItemVo.getStock() > 0 && cartItemVo.getStock() >= cartItemVo.getMin() && cartItemVo.getStock() >= cartItemVo.getNumber())
+                    // visibility商品可见度: 3:所有人可见,2:普通机构可见,1:会员机构可见,4:仅医美机构可见
+                    (cartItemVo.getVisibility() == 3 || cartItemVo.getVisibility() == 2 || (cartItemVo.getVisibility() == 1 && (finalUserIdentity == 2 || svipUserFlag)) || (cartItemVo.getVisibility() == 4 && finalUserClubType == 1))
+                            // 价格可见度: 0公开价格,1不公开价格,2仅对会员机构公开,3仅对医美机构公开
+                            || (cartItemVo.getPriceFlag() == 0 || (cartItemVo.getPriceFlag() == 2 && (finalUserIdentity == 2 || svipUserFlag)) || (cartItemVo.getPriceFlag() == 3 && finalUserClubType == 1))
+                            // 是否库存充足
+                            || (cartItemVo.getStock() != null && cartItemVo.getStock() > 0 && cartItemVo.getStock() >= cartItemVo.getMin() && cartItemVo.getStock() >= cartItemVo.getNumber())
             ));
             cartList.forEach(cartItemVo -> {
                 // 设置商品图片及税费
@@ -695,9 +695,9 @@ public class CartClubServiceImpl implements CartClubService {
      * @param cartDto {
      *                userId       用户ID
      *                productInfo  商品及数量信息:[   // 商品id,数量
-     *                                           {"productId": 2789, "productCount": 1},
-     *                                           {"productId": 2790, "productCount": 1}
-     *                                          ]
+     *                {"productId": 2789, "productCount": 1},
+     *                {"productId": 2790, "productCount": 1}
+     *                ]
      *                }
      */
     @Override
@@ -709,10 +709,10 @@ public class CartClubServiceImpl implements CartClubService {
             log.error("批量添加购物车参数解析异常try-catch:", e);
             return ResponseJson.error("商品及数量信息参数解析异常!", null);
         }
-        if (null == productInfo || productInfo.isEmpty()){
+        if (null == productInfo || productInfo.isEmpty()) {
             return ResponseJson.error("商品及数量信息参数异常!", null);
         }
-        for (Object infoObject: productInfo) {
+        for (Object infoObject : productInfo) {
             JSONObject tempObj = (JSONObject) infoObject;
             Integer productId = (Integer) tempObj.get("productId");
             Integer productCount = (Integer) tempObj.get("productCount");
@@ -812,12 +812,12 @@ public class CartClubServiceImpl implements CartClubService {
             int finalUserIdentity = userIdentity;
             int finalUserClubType = userClubType;
             cartList.removeIf(cartItemVo -> !(
-                // visibility商品可见度: 3:所有人可见,2:普通机构可见,1:会员机构可见,4:仅医美机构可见
-                (cartItemVo.getVisibility() == 3 || cartItemVo.getVisibility()==2 || (cartItemVo.getVisibility() == 1 && (finalUserIdentity == 2 || svipUserFlag)) || (cartItemVo.getVisibility() == 4 && finalUserClubType == 1))
-                // 价格可见度: 0公开价格,1不公开价格,2仅对会员机构公开,3仅对医美机构公开
-                || (cartItemVo.getPriceFlag() == 0 || (cartItemVo.getPriceFlag() == 2 && (finalUserIdentity == 2 || svipUserFlag)) || (cartItemVo.getPriceFlag() == 3 && finalUserClubType == 1))
-                // 是否库存充足
-                || (cartItemVo.getStock() != null && cartItemVo.getStock() > 0 && cartItemVo.getStock() >= cartItemVo.getMin() && cartItemVo.getStock() >= cartItemVo.getNumber())
+                    // visibility商品可见度: 3:所有人可见,2:普通机构可见,1:会员机构可见,4:仅医美机构可见
+                    (cartItemVo.getVisibility() == 3 || cartItemVo.getVisibility() == 2 || (cartItemVo.getVisibility() == 1 && (finalUserIdentity == 2 || svipUserFlag)) || (cartItemVo.getVisibility() == 4 && finalUserClubType == 1))
+                            // 价格可见度: 0公开价格,1不公开价格,2仅对会员机构公开,3仅对医美机构公开
+                            || (cartItemVo.getPriceFlag() == 0 || (cartItemVo.getPriceFlag() == 2 && (finalUserIdentity == 2 || svipUserFlag)) || (cartItemVo.getPriceFlag() == 3 && finalUserClubType == 1))
+                            // 是否库存充足
+                            || (cartItemVo.getStock() != null && cartItemVo.getStock() > 0 && cartItemVo.getStock() >= cartItemVo.getMin() && cartItemVo.getStock() >= cartItemVo.getNumber())
             ));
             return cartList.size();
         } else {
@@ -860,12 +860,16 @@ public class CartClubServiceImpl implements CartClubService {
         List<Integer> shopIds = new ArrayList<>();
         // 用户身份
         Integer userIdentity = baseMapper.getIdentityByUserId(userId);
-        if (null == userIdentity) {userIdentity = 0;}
+        if (null == userIdentity) {
+            userIdentity = 0;
+        }
         // 会员机构类型:1医美,2生美
         Integer userClubType = 0;
         if (userIdentity == 2) {
             userClubType = cartClubMapper.getClubTypeById(userId);
-            if (null == userClubType) {userClubType = 0;}
+            if (null == userClubType) {
+                userClubType = 0;
+            }
         }
         // 超级会员标识
         Integer svipUserId = baseMapper.getSvipUserIdByUserId(userId);
@@ -911,7 +915,7 @@ public class CartClubServiceImpl implements CartClubService {
                     List<CartItemVo> productList = cartClubMapper.getCartProductsByShopIdAndProductIds(userId, shop.getShopId(), finalIdList);
                     if (null != productList && productList.size() > 0) {
                         // 去除不可见商品,visibility商品可见度: 3:所有人可见,2:普通机构可见,1:会员机构可见,4:仅医美机构可见
-                        productList.removeIf(cartItemVo -> !(cartItemVo.getVisibility() == 3 || cartItemVo.getVisibility()==2 || (cartItemVo.getVisibility() == 1 && (finalUserIdentity == 2 || svipUserFlag)) || (cartItemVo.getVisibility() == 4 && finalUserClubType == 1)));
+                        productList.removeIf(cartItemVo -> !(cartItemVo.getVisibility() == 3 || cartItemVo.getVisibility() == 2 || (cartItemVo.getVisibility() == 1 && (finalUserIdentity == 2 || svipUserFlag)) || (cartItemVo.getVisibility() == 4 && finalUserClubType == 1)));
                         // 去除价格不可见商品,价格可见度: 0公开价格,1不公开价格,2仅对会员机构公开,3仅对医美机构公开
                         productList.removeIf(cartItemVo -> !(cartItemVo.getPriceFlag() == 0 || (cartItemVo.getPriceFlag() == 2 && (finalUserIdentity == 2 || svipUserFlag)) || (cartItemVo.getPriceFlag() == 3 && finalUserClubType == 1)));
                         // 去除库存不足商品
@@ -1212,12 +1216,16 @@ public class CartClubServiceImpl implements CartClubService {
         List<String> productIdList = new ArrayList<>();
         // 用户身份
         Integer userIdentity = baseMapper.getIdentityByUserId(userId);
-        if (null == userIdentity) {userIdentity = 0;}
+        if (null == userIdentity) {
+            userIdentity = 0;
+        }
         // 会员机构类型:1医美,2生美
         Integer userClubType = 0;
         if (userIdentity == 2) {
             userClubType = cartClubMapper.getClubTypeById(userId);
-            if (null == userClubType) {userClubType = 0;}
+            if (null == userClubType) {
+                userClubType = 0;
+            }
         }
         // 超级会员标识
         Integer svipUserId = baseMapper.getSvipUserIdByUserId(userId);
@@ -1271,7 +1279,7 @@ public class CartClubServiceImpl implements CartClubService {
                     productList.forEach(p -> p.setNumber(productInfos.get(p.getProductId().toString())));
                     if (null != productList && productList.size() > 0) {
                         // 去除不可见商品,visibility商品可见度: 3:所有人可见,2:普通机构可见,1:会员机构可见,4:仅医美机构可见
-                        productList.removeIf(cartItemVo -> !(cartItemVo.getVisibility() == 3 || cartItemVo.getVisibility()==2 || (cartItemVo.getVisibility() == 1 && (finalUserIdentity == 2 || svipUserFlag)) || (cartItemVo.getVisibility() == 4 && finalUserClubType == 1)));
+                        productList.removeIf(cartItemVo -> !(cartItemVo.getVisibility() == 3 || cartItemVo.getVisibility() == 2 || (cartItemVo.getVisibility() == 1 && (finalUserIdentity == 2 || svipUserFlag)) || (cartItemVo.getVisibility() == 4 && finalUserClubType == 1)));
                         // 去除价格不可见商品,价格可见度: 0公开价格,1不公开价格,2仅对会员机构公开,3仅对医美机构公开
                         productList.removeIf(cartItemVo -> !(cartItemVo.getPriceFlag() == 0 || (cartItemVo.getPriceFlag() == 2 && (finalUserIdentity == 2 || svipUserFlag)) || (cartItemVo.getPriceFlag() == 3 && finalUserClubType == 1)));
                         // 去除库存不足商品
@@ -1557,22 +1565,26 @@ public class CartClubServiceImpl implements CartClubService {
         }
         // 用户身份
         Integer userIdentity = baseMapper.getIdentityByUserId(cartDto.getUserId());
-        if (null == userIdentity) {userIdentity = 0;}
+        if (null == userIdentity) {
+            userIdentity = 0;
+        }
         // 会员机构类型:1医美,2生美
         Integer userClubType = 0;
         if (userIdentity == 2) {
             userClubType = cartClubMapper.getClubTypeById(cartDto.getUserId());
-            if (null == userClubType) {userClubType = 0;}
+            if (null == userClubType) {
+                userClubType = 0;
+            }
         }
         // 超级会员标识
         Integer svipUserId = baseMapper.getSvipUserIdByUserId(cartDto.getUserId());
         boolean svipUserFlag = null != svipUserId;
         // visibility商品可见度: 3:所有人可见,2:普通机构可见,1:会员机构可见,4:仅医美机构可见
-        if (!(cartItemVo.getVisibility() == 3 || cartItemVo.getVisibility()==2 || (cartItemVo.getVisibility() == 1 && (userIdentity == 2 || svipUserFlag)) || (cartItemVo.getVisibility() == 4 && userClubType == 1))){
+        if (!(cartItemVo.getVisibility() == 3 || cartItemVo.getVisibility() == 2 || (cartItemVo.getVisibility() == 1 && (userIdentity == 2 || svipUserFlag)) || (cartItemVo.getVisibility() == 4 && userClubType == 1))) {
             return ResponseJson.error("商品不可见!", null);
         }
         // 价格可见度: 0公开价格,1不公开价格,2仅对会员机构公开,3仅对医美机构公开
-        if (!(cartItemVo.getPriceFlag() == 0 || (cartItemVo.getPriceFlag() == 2 && (userIdentity == 2 || svipUserFlag)) || (cartItemVo.getPriceFlag() == 3 && userClubType == 1))){
+        if (!(cartItemVo.getPriceFlag() == 0 || (cartItemVo.getPriceFlag() == 2 && (userIdentity == 2 || svipUserFlag)) || (cartItemVo.getPriceFlag() == 3 && userClubType == 1))) {
             return ResponseJson.error("商品价格不可见!", null);
         }
         cartItemVo.setNumber(cartDto.getProductCount());
@@ -1892,6 +1904,7 @@ public class CartClubServiceImpl implements CartClubService {
         Date registerTime = orderCommonMapper.getUserRegisterTime(userId);
         // 未领取的优惠券
         List<CouponVo> preCouponList = orderCommonMapper.getPrevCouponList(userId, registerTime);
+        preCouponList.forEach(p -> p.setCouponBtnType(0));
         //剔除超级会员优惠券
         List<Integer> vipCoupon = cartClubMapper.findVipCoupon();
         if (preCouponList != null && preCouponList.size() > 0) {
@@ -1901,6 +1914,7 @@ public class CartClubServiceImpl implements CartClubService {
         filterCoupon(source, productList, preCouponList);
         // 用户可用优惠券(已领取)
         List<CouponVo> couponList = orderCommonMapper.getClubCouponList(userId);
+        couponList.forEach(c -> c.setCouponBtnType(1));
         //剔除超级会员优惠券
         if (couponList != null && couponList.size() > 0) {
             couponList.removeIf(couponVo -> vipCoupon.contains(couponVo.getCouponId()));

+ 0 - 1
src/main/java/com/caimei365/order/service/impl/CartSellerServiceImpl.java

@@ -885,5 +885,4 @@ public class CartSellerServiceImpl implements CartSellerService {
         resultData.put("productIds", againBuyProductIds);
         return ResponseJson.success(resultData);
     }
-
 }

+ 11 - 3
src/main/java/com/caimei365/order/service/impl/OrderClubServiceImpl.java

@@ -326,7 +326,7 @@ public class OrderClubServiceImpl implements OrderClubService {
         if (MathUtil.compare(order.getCouponAmount(), 0) > 0) {
             // 确认订单时才真正使用优惠券
             CouponOrderRecordPo couponOrderRecord = orderClubMapper.getOrderCouponRecord(orderId);
-            CouponVo coupon = orderClubMapper.getClubCouponById(couponOrderRecord.getClubCouponId());
+            CouponVo coupon = orderClubMapper.getClubCouponById(couponOrderRecord.getClubCouponId(),orderClubMapper.findUserId(orderId));
             if (coupon == null) {
                 return ResponseJson.error("订单内优惠券已被使用", null);
             } else {
@@ -837,10 +837,18 @@ public class OrderClubServiceImpl implements OrderClubService {
      * @param orderId 订单Id
      */
     @Override
-    public ResponseJson<List<OrderProductVo>> getOrderShareInitProduct(Integer orderId) {
+    public ResponseJson<Map<String,Object>> getOrderShareInitProduct(Integer orderId) {
         List<OrderProductVo> orderProductList = orderCommonMapper.getOrderProductByOrderId(orderId);
         orderProductList.forEach(orderProduct -> orderProduct.setImage(ImageUtil.getImageUrl("product", orderProduct.getImage(), domain)));
-        return ResponseJson.success(orderProductList);
+        OrderVo order = orderCommonMapper.getOrderByOrderId(orderId);
+        orderCommonService.setOrderStatus(order);
+        HashMap<String, Object> result = new HashMap<>(2);
+        orderCommonService.getDiscernReceiptAndSetOrder(order);
+        result.put("productList",orderProductList);
+        result.put("orderStatus",order.getStatus());
+        //2021.12.14 去掉paybutton判断
+//        result.put("payButton", order.isPayButton());
+        return ResponseJson.success(result);
     }
 
     /**

+ 322 - 6
src/main/java/com/caimei365/order/service/impl/PayNonOrderServiceImpl.java

@@ -3,17 +3,16 @@ package com.caimei365.order.service.impl;
 import com.alibaba.fastjson.JSONObject;
 import com.caimei365.order.components.WeChatService;
 import com.caimei365.order.mapper.BaseMapper;
+import com.caimei365.order.mapper.OrderClubMapper;
 import com.caimei365.order.mapper.OrderCommonMapper;
 import com.caimei365.order.mapper.PayOrderMapper;
 import com.caimei365.order.model.ResponseJson;
 import com.caimei365.order.model.bo.PayParamBo;
 import com.caimei365.order.model.bo.VipRecordBo;
+import com.caimei365.order.model.dto.PayCouponDto;
 import com.caimei365.order.model.dto.PaySecondDto;
 import com.caimei365.order.model.dto.PayVipDto;
-import com.caimei365.order.model.po.DiscernReceiptPo;
-import com.caimei365.order.model.po.OrderReceiptRelationPo;
-import com.caimei365.order.model.po.SplitAccountPo;
-import com.caimei365.order.model.po.UserVipPo;
+import com.caimei365.order.model.po.*;
 import com.caimei365.order.model.vo.DiscernReceiptVo;
 import com.caimei365.order.model.vo.OrderPayLinkVo;
 import com.caimei365.order.service.PayNonOrderService;
@@ -52,11 +51,15 @@ public class PayNonOrderServiceImpl implements PayNonOrderService {
     @Resource
     private OrderCommonMapper orderCommonMapper;
     @Resource
+    private OrderClubMapper orderClubMapper;
+    @Resource
     private WeChatService weChatService;
     @Value("${pay.second-notify-url}")
     private String secondHandUrl;
     @Value("${pay.vip-notify-url}")
     private String superVipUrl;
+    @Value("${pay.coupon-notify-url}")
+    private String couponUrl;
     @Resource
     private RemoteCallService remoteCallService;
 
@@ -205,10 +208,10 @@ public class PayNonOrderServiceImpl implements PayNonOrderService {
             json.put("product", product);
             String attach = payParam.getProductId() + "," + payParam.getPayType() + "," + payParam.getUserType();
             json.put("attach", attach);
-            // 二手发布默认100元,默认私账
+            // 二手发布默认100元,默认公账专票
             List<Map<String, String>> list = new ArrayList<>();
             Map<String, String> map = new HashMap<>(3);
-            map.put("subUserNo", PayUtil.privateAccountNo);
+            map.put("subUserNo", PayUtil.publicAccountNo);
             map.put("splitBillType", "1");
             map.put("splitBillValue", "1");
             list.add(map);
@@ -217,6 +220,7 @@ public class PayNonOrderServiceImpl implements PayNonOrderService {
             String sign = PayUtil.getPaySign(json, PayUtil.merKey);
             json.put("sign", sign);
             // 私钥加密
+            log.info("发送参数 json:" + json);
             String data = RSAUtil.privateEncrypt(json.toJSONString(), PayUtil.merKey);
             // 提交
             result = PayUtil.httpGet("https://platform.mhxxkj.com/paygateway/mbpay/order/v1", PayUtil.merAccount, data);
@@ -504,6 +508,7 @@ public class PayNonOrderServiceImpl implements PayNonOrderService {
             String sign = PayUtil.getPaySign(json, PayUtil.merKey);
             json.put("sign", sign);
             // 私钥加密
+            log.info("发送参数 json:" + json);
             String data = RSAUtil.privateEncrypt(json.toJSONString(), PayUtil.merKey);
             // 提交
             result = PayUtil.httpGet("https://platform.mhxxkj.com/paygateway/mbpay/order/v1", PayUtil.merAccount, data);
@@ -730,4 +735,315 @@ public class PayNonOrderServiceImpl implements PayNonOrderService {
         log.info("【线上退款】成功>>>>>>>vipRecordId:" + payVipDto.getVipRecordId());
         return ResponseJson.success(result);
     }
+
+    /**
+     * 微信买优惠券
+     *
+     * @param payCouponDto
+     * @param headers
+     * @return
+     */
+    @Override
+    public ResponseJson<JSONObject> payCouponByWeChat(PayCouponDto payCouponDto, HttpHeaders headers) {
+        Integer status = payOrderMapper.findPayStatus(payCouponDto.getCouponRecordId());
+        if (null != status && 1 == status) {
+            return ResponseJson.error("该笔记录已支付,请勿重复支付!", null);
+        }
+        PayParamBo tempParam = new PayParamBo();
+        // payDto -> payParam
+        BeanUtils.copyProperties(payCouponDto, tempParam);
+        ResponseJson<PayParamBo> jsonParam = getWeChatResponseJson(tempParam, headers);
+        if (-1 == jsonParam.getCode()) {
+            return ResponseJson.error(jsonParam.getMsg(), null);
+        }
+        PayParamBo payParam = jsonParam.getData();
+        // 获取优惠券价格
+        Double price = payOrderMapper.getCouponPrice(payCouponDto.getCouponId());
+        payParam.setPayAmount(MathUtil.mul(price, 100).intValue());
+        payParam.setNotifyUrl(couponUrl);
+        payParam.setCouponRecordId(payCouponDto.getCouponRecordId());
+        log.info("【购买价值优惠券微信支付】>>>>>>>>>>>couponId:" + payParam.getCouponId() + ",获取openId:" + payParam.getOpenId());
+        return toPayCoupon(payParam, headers);
+    }
+
+    /**
+     * 支付宝买优惠券
+     *
+     * @param headers
+     */
+    @Override
+    public ResponseJson<JSONObject> payCouponByAlipay(PayCouponDto payCouponDto, HttpHeaders headers) {
+        Integer status = payOrderMapper.findPayStatus(payCouponDto.getCouponRecordId());
+        if (null != status && 1 == status) {
+            return ResponseJson.error("该笔记录已支付,请勿重复支付!", null);
+        }
+        PayParamBo payParam = new PayParamBo();
+        // payDto -> payParam
+        BeanUtils.copyProperties(payCouponDto, payParam);
+        //支付宝支付
+        payParam.setPayWay("ALIPAY");
+        payParam.setPayType("ALIPAY_H5");
+        // 获取优惠券价格
+        Double price = payOrderMapper.getCouponPrice(payCouponDto.getCouponId());
+        payParam.setPayAmount(MathUtil.mul(price, 100).intValue());
+        payParam.setNotifyUrl(couponUrl);
+        payParam.setCouponRecordId(payCouponDto.getCouponRecordId());
+        log.info("【购买价值优惠券支付宝支付】>>>>>>>>>>>couponId:" + payParam.getCouponId());
+        return toPayCoupon(payParam, headers);
+    }
+
+    @Override
+    public ResponseJson<JSONObject> payCouponUnionPay(PayCouponDto payCouponDto, HttpHeaders headers) {
+        Integer status = payOrderMapper.findPayStatus(payCouponDto.getCouponRecordId());
+        if (null != status && 1 == status) {
+            return ResponseJson.error("该笔记录已支付,请勿重复支付!", null);
+        }
+        PayParamBo payParam = new PayParamBo();
+        // payDto -> payParam
+        BeanUtils.copyProperties(payCouponDto, payParam);
+        // 银联支付
+        payParam.setPayWay("UNIONPAY");
+        payParam.setPayType("GATEWAY_UNIONPAY");
+        // 获取会员套餐价格
+        Double price = payOrderMapper.getCouponPrice(payCouponDto.getCouponId());
+        if ("ENTERPRISE".equals(payCouponDto.getUserType()) && price <= 8) {
+            return ResponseJson.error("企业网银支付金额低于手续费!", null);
+        }
+        payParam.setPayAmount(MathUtil.mul(price, 100).intValue());
+        payParam.setNotifyUrl(couponUrl);
+        payParam.setCouponRecordId(payCouponDto.getCouponRecordId());
+        log.info("【购买价值优惠券银联线上支付】>>>>>>>>>>>RecordId:" + payCouponDto.getCouponRecordId());
+        return toPayCoupon(payParam, headers);
+    }
+
+    @Override
+    public ResponseJson<PayCouponDto> getCouponRecord(PayCouponDto payCouponDto, HttpHeaders headers) {
+        //个人机构返回状态码-1  不是医美 -2
+        if (49 == payCouponDto.getCouponId()) {
+            //正式id49优惠券 普通机构和非医美机构无法购买
+            //先判断是否是普通机构,是就打回
+            Integer userIdentity = baseMapper.getIdentityByUserId(payCouponDto.getUserId());
+            if (userIdentity != null && 4 == userIdentity) {
+                return ResponseJson.error(-1, "仅供医美机构购买!", null);
+            }
+            Integer clubType = payOrderMapper.findClubType(payCouponDto.getUserId());
+            //为空或者不等于1    医美=1和生美=2
+            if (null == clubType || 1 != clubType) {
+                return ResponseJson.error(-2, "仅供医美机构购买!", null);
+            }
+        }
+        CouponRecordPo cr = new CouponRecordPo();
+        cr.setCouponId(payCouponDto.getCouponId());
+        cr.setUserId(payCouponDto.getUserId());
+        payOrderMapper.insertCouponRecord(cr);
+        payCouponDto.setCouponRecordId(cr.getId());
+        return ResponseJson.success(payCouponDto);
+    }
+
+    @Override
+    public ResponseJson couponCheck(Integer recordId) {
+        Integer status = payOrderMapper.findPayStatus(recordId);
+        if (null != status && 1 == status) {
+            return ResponseJson.success("支付成功", null);
+        }
+        return ResponseJson.error("支付失败", null);
+    }
+
+    @Override
+    public ResponseJson vipCheck(Integer recordId) {
+        // 获取会员套餐记录
+        VipRecordBo record = payOrderMapper.getVipPackageRecord(recordId);
+        if (null != record.getPayStatus() && 1 == record.getPayStatus()) {
+            return ResponseJson.success("支付成功!", null);
+        }
+        return ResponseJson.error("支付失败", null);
+    }
+
+    @Override
+    public ResponseJson bugCheck(Integer userId) {
+        payOrderMapper.bugFix(userId);
+        return ResponseJson.success("修好了!");
+    }
+
+
+    private ResponseJson<JSONObject> toPayCoupon(PayParamBo payParam, HttpHeaders headers) {
+        // 定义支付请求结果
+        JSONObject result = null;
+        try {
+            // 时间戳
+            long time = System.currentTimeMillis() / 1000;
+            // 设置支付基础参数
+            JSONObject json = getPayJsonObject(payParam, headers, time);
+            // 支付环境
+            String environment = "";
+            if (payParam.getNotifyUrl().contains("18002")) {
+                environment = "DEV";
+            } else if (payParam.getNotifyUrl().contains("core-b")) {
+                environment = "BETA";
+            }
+            // 商户订单号
+            String orderId = payParam.getUserId() + "C" + payParam.getCouponId() + "R" + payParam.getCouponRecordId() + "T" + time + environment;
+            json.put("orderId", orderId);
+            //商品名称
+            String product = "采美订单" + orderId;
+            json.put("product", product);
+            //支付类型
+            String payType = PayUtil.getPayTypeId(payParam.getPayType(), payParam.getUserType());
+            String attach = payParam.getCouponId() + "," + payParam.getUserId() + "," + payParam.getCouponRecordId() + "," + payType + "," + payParam.getSource();
+            json.put("attach", attach);
+            // 价值优惠券默认公账专票,彩美信息
+            List<Map<String, String>> list = new ArrayList<>();
+            Map<String, String> map = new HashMap<>(3);
+            map.put("subUserNo", PayUtil.publicAccountNo);
+            // 1按比例分账
+            map.put("splitBillType", "1");
+            // 1比例值总额
+            map.put("splitBillValue", "1");
+            list.add(map);
+            String splitBillDetail = JSONObject.toJSONString(list);
+            json.put("splitBillDetail", splitBillDetail);
+            String sign = PayUtil.getPaySign(json, PayUtil.merKey);
+            json.put("sign", sign);
+            log.info("发送参数 json:" + json);
+            // 私钥加密
+            String data = RSAUtil.privateEncrypt(json.toJSONString(), PayUtil.merKey);
+            // 提交
+            result = PayUtil.httpGet("https://platform.mhxxkj.com/paygateway/mbpay/order/v1", PayUtil.merAccount, data);
+        } catch (Exception e) {
+            log.error("错误信息", e);
+            return ResponseJson.error("支付失败!", null);
+        }
+        String code = result.getString("code");
+        if (!"000000".equals(code)) {
+            String msg = result.getString("msg");
+            log.info("第三方支付失败>>>>>>>msg:" + msg);
+            return ResponseJson.error(msg, null);
+        }
+        // 保存购买优惠券分账参数
+        JSONObject data = result.getJSONObject("data");
+        SplitAccountPo splitAccount = new SplitAccountPo();
+        splitAccount.setCouponRecordId(payParam.getCouponRecordId());
+        // 优惠券 公账-专票
+        splitAccount.setType(1);
+        // 待分账总金额
+        double splitAmount = MathUtil.div(payParam.getPayAmount(), 100).doubleValue();
+        // 总手续费
+        double procedureFee;
+        if ("UNIONPAY".equals(payParam.getPayWay())) {
+            procedureFee = 8.00;
+        } else {
+            //手续费
+            procedureFee = MathUtil.mul(splitAmount, 0.0038, 2).doubleValue();
+            if (MathUtil.compare(procedureFee, 0) == 0) {
+                procedureFee = 0.01;
+            }
+        }
+        splitAmount = MathUtil.sub(splitAmount, procedureFee).doubleValue();
+        splitAccount.setSplitAccount(splitAmount);
+        splitAccount.setMbOrderId(data.getString("mbOrderId"));
+        splitAccount.setOrderRequestNo(data.getString("orderId"));
+        splitAccount.setPayStatus(0);
+        // 保存分账详情
+        payOrderMapper.insertSplitAccount(splitAccount);
+        log.info("【购买优惠券支付成功!】>>>>>>>>>>>couponRecordId:" + payParam.getCouponRecordId() + ",data:" + data.toJSONString());
+        return ResponseJson.success(result);
+    }
+
+    @Override
+    public String couponCallback(String data) throws NoSuchAlgorithmException, InvalidKeySpecException {
+        log.info("******************** 购买优惠券异步回调 start *******************");
+        // 公钥解密
+        JSONObject json = PayUtil.publicKeyDecrypt(data, PayUtil.publicKey);
+        log.info("【购买优惠券异步回调】>>>>>>>>>>>公钥解密:" + json);
+        // 公钥验签
+        String signaa = json.getString("sign");
+        json.remove("sign");
+        String signbb = PayUtil.getPaySign(json, PayUtil.publicKey);
+        if (!signaa.equals(signbb)) {
+            return "验签失败";
+        }
+        // 订单状态
+        String orderStatus = json.getString("orderStatus");
+        // 平台唯一流水号
+        String mbOrderId = json.getString("mbOrderId");
+        // 商户唯一订单号
+        String orderRequestNo = json.getString("orderId");
+        // 金额,以元为单位
+        Double amount = json.getDouble("amount");
+        String payFormData = json.toJSONString();
+        log.info("【购买优惠券异步回调】>>>>>>>>>>>支付订单状态:" + orderStatus);
+        if ("FAILED".equals(orderStatus)) {
+            return "支付失败";
+        }
+        log.info("【购买优惠券异步回调】>>>>>>>>>>>>>>本次支付金额:" + amount);
+        // 附加数据,支付时若有传输则原样返回(vipId,userId,recordId,payType),下单时为空,则不返回该数据
+        String attach = json.getString("attach");
+        String[] split = attach.split(",");
+        int couponId = 0;
+        int userId = 0;
+        int recordId = 0;
+        int payType = 0;
+        int source = 0;
+        try {
+            // 优惠券Id
+            couponId = Integer.parseInt(split[0]);
+            // 用户Id
+            userId = Integer.parseInt(split[1]);
+            // 购买历史记录Id
+            recordId = Integer.parseInt(split[2]);
+            // 支付方式
+            payType = Integer.parseInt(split[3]);
+            //购买渠道
+            source = Integer.parseInt(split[4]);
+        } catch (NumberFormatException e) {
+            log.info("【购买优惠券异步回调】>>>>>>>>>>>>>>获取回调参数解析失败!");
+        }
+        //cm_coupon_club数据库修改
+        CouponClubPo couponClubPo = new CouponClubPo();
+        couponClubPo.setSource(source);
+        couponClubPo.setUserId(userId);
+        couponClubPo.setCouponId(couponId);
+        couponClubPo.setStatus("1");
+        couponClubPo.setDelFlag("0");
+        couponClubPo.setCreateDate(new Date());
+        orderClubMapper.insertCouponClub(couponClubPo);
+        // 改历史记录支付状态
+        payOrderMapper.updateCouponRecord(recordId);
+        Date date = new Date();
+        String curDateStr = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(date);
+        // 保存收款记录
+        DiscernReceiptPo discernReceipt = new DiscernReceiptPo();
+        discernReceipt.setPayWay(1);
+        discernReceipt.setPayType(payType);
+        discernReceipt.setReceiptType(8);
+        discernReceipt.setReceiptStatus(3);
+        discernReceipt.setReceiptAmount(amount);
+        discernReceipt.setConfirmType(4);
+        discernReceipt.setRePayFlag(1);
+        discernReceipt.setFormData(payFormData);
+        discernReceipt.setReceiptDate(curDateStr);
+        discernReceipt.setConfirmDate(curDateStr);
+        discernReceipt.setReviewDate(curDateStr);
+        discernReceipt.setUpdateDate(curDateStr);
+        discernReceipt.setDelFlag(0);
+        // 保存 收款记录
+        baseMapper.insertDiscernReceipt(discernReceipt);
+        log.info("【购买优惠券异步回调】>>>>>>>>>>>>>>保存识别款项(insert[cm_discern_receipt])id:" + discernReceipt.getId() + ",couponRecordId:" + recordId);
+        // 收款项和订单关系表
+        OrderReceiptRelationPo relation = new OrderReceiptRelationPo();
+        relation.setReceiptId(discernReceipt.getId());
+        relation.setCouponRecordId(recordId);
+        relation.setAssociateAmount(amount);
+        relation.setMbOrderId(mbOrderId);
+        relation.setOrderRequestNo(orderRequestNo);
+        relation.setSplitStatus(1);
+        relation.setRelationType(6);
+        relation.setDelFlag(0);
+        // 保存 收款项和订单关系
+        baseMapper.insertOrderReceiptRelation(relation);
+        log.info("【购买优惠券异步回调】>>>>>>>>>>>收款项和购买历史关系(insert[cm_receipt_order_relation])id:" + relation.getId() + ",couponRecordId:" + recordId);
+        //修改分账付款状态
+        payOrderMapper.updateSplitAccountByPay(mbOrderId);
+        return "SUCCESS";
+    }
 }

+ 219 - 50
src/main/java/com/caimei365/order/service/impl/PayOrderServiceImpl.java

@@ -6,6 +6,7 @@ import com.caimei365.order.components.OrderCommonService;
 import com.caimei365.order.components.ProductService;
 import com.caimei365.order.components.WeChatService;
 import com.caimei365.order.mapper.BaseMapper;
+import com.caimei365.order.mapper.OrderClubMapper;
 import com.caimei365.order.mapper.OrderCommonMapper;
 import com.caimei365.order.mapper.PayOrderMapper;
 import com.caimei365.order.model.ResponseJson;
@@ -42,6 +43,9 @@ import java.util.*;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicReference;
 
+import static org.bouncycastle.asn1.x500.style.RFC4519Style.c;
+import static org.bouncycastle.asn1.x500.style.RFC4519Style.o;
+
 /**
  * Description
  *
@@ -64,6 +68,8 @@ public class PayOrderServiceImpl implements PayOrderService {
     @Resource
     private WeChatService weChatService;
     @Resource
+    private OrderClubMapper orderClubMapper;
+    @Resource
     private RemoteCallService remoteCallService;
     @Value("${pay.redirect-link}")
     private String redirectLink;
@@ -124,6 +130,7 @@ public class PayOrderServiceImpl implements PayOrderService {
         return ResponseJson.success(map);
     }
 
+
     /**
      * 订单支付,余额抵扣
      *
@@ -142,6 +149,7 @@ public class PayOrderServiceImpl implements PayOrderService {
         Double availableMoney = baseMapper.getAbleUserMoney(order.getUserId());
         Double balancePayFee = 0d;
         if (MathUtil.compare(availableMoney, 0) > 0) {
+            //可用余额>待付
             if (MathUtil.compare(availableMoney, order.getPendingPayments()) >= 0) {
                 if (OrderStatus.UNCONFIRMED.getCode() != order.getStatus()) {
                     if (1 == order.getSendOutStatus()) {
@@ -168,8 +176,9 @@ public class PayOrderServiceImpl implements PayOrderService {
                 order.setReceiptStatus(2);
                 balancePayFee = availableMoney;
             }
-
+            //设置余额支付金额
             order.setBalancePayFee(MathUtil.add(order.getBalancePayFee(), balancePayFee).doubleValue());
+            //设置真实支付金额
             order.setPayableAmount(MathUtil.sub(order.getPayableAmount(), balancePayFee).doubleValue());
             Date date = new Date();
             String curDateStr = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(date);
@@ -181,26 +190,67 @@ public class PayOrderServiceImpl implements PayOrderService {
             // 修改账户余额
             double userMoney = baseMapper.getUserMoney(order.getUserId());
             if (OrderStatus.UNCONFIRMED.getCode() != order.getStatus()) {
-                userMoney = MathUtil.sub(userMoney, balancePayFee).doubleValue();
                 //保存收款记录
                 productService.saveDiscernReceipt(balancePayFee, orderId, "【订单支付,余额抵扣】");
             }
+            //可用=可用-本次抵扣
             availableMoney = MathUtil.sub(availableMoney, balancePayFee).doubleValue();
-            payOrderMapper.updateMoneyByUserId(userMoney, availableMoney, order.getUserId());
-            log.info("【订单支付,余额抵扣】>>>>>>>>>>>更新用户余额(update[user])userId:" + order.getUserId() + ",orderId:" + orderId);
-            //保存余额到余额收支记录
-            BalanceRecordPo balanceRecord = new BalanceRecordPo();
-            balanceRecord.setUserId(order.getUserId());
-            balanceRecord.setType(2);
-            balanceRecord.setBalanceType(1);
-            balanceRecord.setAddDate(new Date());
-            balanceRecord.setAmount(balancePayFee);
-            balanceRecord.setOrderId(orderId);
-            balanceRecord.setRemark("订单支付,余额抵扣");
-            balanceRecord.setDelFlag(0);
-            // 保存 余额收支记录
-            baseMapper.insertBalanceRecord(balanceRecord);
-            log.info("【订单支付,余额抵扣】>>>>>>>>>>>>>>>>>>>>>>>>>>新增用户余额收支记录(insert[cm_user_balance_record])orderId:" + orderId);
+            //区分扣多少线上扣多少线下,优先线上余额
+            Double onlineMoney = baseMapper.getonlineMoney(order.getUserId());
+            //线上余额>本次抵扣,全抵线上
+            if (onlineMoney > balancePayFee) {
+                onlineMoney = MathUtil.sub(onlineMoney, balancePayFee).doubleValue();
+                payOrderMapper.updateOnlineMoneyByUserId(onlineMoney, availableMoney, order.getUserId());
+                log.info("【订单支付,余额抵扣】>>>>>>>>>>>更新用户余额(update[user])userId:" + order.getUserId() + ",orderId:" + orderId);
+                //保存余额到余额收支记录
+                BalanceRecordPo balanceRecord = new BalanceRecordPo();
+                balanceRecord.setUserId(order.getUserId());
+                balanceRecord.setType(2);
+                balanceRecord.setBalanceType(10);
+                balanceRecord.setAddDate(new Date());
+                balanceRecord.setAmount(balancePayFee);
+                balanceRecord.setOrderId(orderId);
+                balanceRecord.setRemark("订单支付,余额抵扣");
+                balanceRecord.setDelFlag(0);
+                // 保存 余额收支记录
+                baseMapper.insertBalanceRecord(balanceRecord);
+                log.info("【订单支付,余额抵扣】>>>>>>>>>>>>>>>>>>>>>>>>>>新增用户余额收支记录(insert[cm_user_balance_record])orderId:" + orderId);
+            } else {//线上不够,线上全抵,剩余线下
+                //线下=原线下-(本次抵扣-线上)
+                userMoney = MathUtil.sub(userMoney, MathUtil.sub(balancePayFee, onlineMoney)).doubleValue();
+                //更新线上/线下余额  线上置为0,全部抵扣
+                payOrderMapper.updateMoneyByUserId(userMoney, availableMoney, 0d, order.getUserId());
+                log.info("【订单支付,余额抵扣】>>>>>>>>>>>更新用户余额(update[user])userId:" + order.getUserId() + ",orderId:" + orderId);
+                if (onlineMoney > 0) {
+                    // 线上>0有抵扣的情况下保存线上余额到余额收支记录
+                    BalanceRecordPo balanceRecord = new BalanceRecordPo();
+                    balanceRecord.setUserId(order.getUserId());
+                    balanceRecord.setType(2);
+                    balanceRecord.setBalanceType(10);
+                    balanceRecord.setAddDate(new Date());
+                    balanceRecord.setAmount(onlineMoney);
+                    balanceRecord.setOrderId(orderId);
+                    balanceRecord.setRemark("订单支付,余额抵扣");
+                    balanceRecord.setDelFlag(0);
+                    baseMapper.insertBalanceRecord(balanceRecord);
+                    log.info("【订单支付,线上/线下余额抵扣】>>>>>>>>>>>>>>>>>>>>>>>>>>新增用户余额收支记录(insert[cm_user_balance_record])orderId:" + orderId);
+                }
+                if (userMoney > 0) {
+                    // 保存线下余额到余额收支记录
+                    BalanceRecordPo balanceRecord1 = new BalanceRecordPo();
+                    balanceRecord1.setUserId(order.getUserId());
+                    balanceRecord1.setType(2);
+                    balanceRecord1.setBalanceType(1);
+                    balanceRecord1.setAddDate(new Date());
+                    balanceRecord1.setAmount(userMoney);
+                    balanceRecord1.setOrderId(orderId);
+                    balanceRecord1.setRemark("订单支付,余额抵扣");
+                    balanceRecord1.setDelFlag(0);
+                    // 保存 余额收支记录
+                    baseMapper.insertBalanceRecord(balanceRecord1);
+                }
+                log.info("【订单支付,线上/线下余额抵扣】>>>>>>>>>>>>>>>>>>>>>>>>>>新增用户余额收支记录(insert[cm_user_balance_record])orderId:" + orderId);
+            }
         }
         Map<String, Object> map = new HashMap<>(2);
         map.put("order", order);
@@ -249,6 +299,8 @@ public class PayOrderServiceImpl implements PayOrderService {
             }
             order.setReceiptAmount(receiptAmount.get());
         }
+        // 总成本
+        AtomicDouble totalCostPrice = new AtomicDouble(0d);
         // 商品数据
         List<OrderProductVo> orderProductList = orderCommonMapper.getOrderProductByOrderId(orderId);
         //过滤运费商品
@@ -257,27 +309,61 @@ public class PayOrderServiceImpl implements PayOrderService {
         orderProductList.forEach(orderProduct -> {
             // 商品含税未知 or 订单选择开企业发票,商品不含税不能开票
             boolean productTaxFlag = (null == orderProduct.getIncludedTax()) || (null == orderProduct.getInvoiceType()) || (Integer.valueOf(2).equals(orderProduct.getIncludedTax()))
-                                     || (Integer.valueOf(2).equals(order.getInvoiceFlag()) && (Integer.valueOf(0).equals(orderProduct.getIncludedTax()) && Integer.valueOf(3).equals(orderProduct.getInvoiceType())));
+                    || (Integer.valueOf(2).equals(order.getInvoiceFlag()) && (Integer.valueOf(0).equals(orderProduct.getIncludedTax()) && Integer.valueOf(3).equals(orderProduct.getInvoiceType())));
             if (productTaxFlag) {
                 order.setInvoiceStatus(true);
             }
+            //当应付金额小于订单总成本时,不能走线上支付,总成本=商品成本 + 供应商运费 + 供应商税费
+            double costPrice = MathUtil.mul(orderProduct.getCostPrice(), orderProduct.getNum()).doubleValue();
+            if (Integer.valueOf(0).equals(orderProduct.getIncludedTax()) && !Integer.valueOf(3).equals(orderProduct.getInvoiceType())) {
+                //应付总税费
+                Double payableTax = MathUtil.mul(orderProduct.getSingleShouldPayTotalTax(), orderProduct.getNum()).doubleValue();
+                //成本+税费
+                costPrice = MathUtil.add(costPrice, payableTax).doubleValue();
+            }
+            List<ShopOrderVo> shopOrderList = orderCommonMapper.getShopOrderListByOrderId(order.getOrderId());
+            for (ShopOrderVo shopOrder : shopOrderList) {
+                // 付供应商运费
+                Double shopPostFee = shopOrder.getShopPostFee();
+                costPrice = MathUtil.add(costPrice, shopPostFee).doubleValue();
+            }
+            totalCostPrice.set(MathUtil.add(costPrice, totalCostPrice.get()).doubleValue());
         });
+
         // 返回数据
         Map<String, Object> map = new HashMap<>();
         map.put("userName", userName);
         map.put("order", order);
         map.put("discernReceipt", discernReceiptList);
         map.put("orderProductList", orderProductList);
-
+        //能否线上判断付供应商是否大于订单金额
+//        orderCommonService.getDiscernReceiptAndSetOrder(order);
+//        boolean payButton = order.isPayButton();
+        // 总成本>应付 不能线上
+        //todo 判断线上/线下余额
+        Double userMoney = orderCommonMapper.findUserMoney(orderId);
+        Double onlineMoney = orderCommonMapper.findOnlineMoney(orderId);
+        userMoney = userMoney == null ? 0 : userMoney;
+        onlineMoney = onlineMoney == null ? 0 : onlineMoney;
+        if (MathUtil.compare(totalCostPrice, order.getPayableAmount()) > 0 || order.getPayableAmount() <= 0.01) {
+            map.put("onlinePay", 2);
+        } else if (userMoney > 0 && onlineMoney > 0 && !"31".equals(order.getStatus())) {
+            //当线上余额和线下余额两者都抵扣了但只抵扣了部分订单金额,订单只能走线下支付,点击提交订单,跳转到线下支付页面
+            map.put("onlinePay", 2);
+        } else {
+            map.put("onlinePay", 1);
+        }
         return ResponseJson.success(map);
     }
 
+
     /**
-     *  生成网银支付链接
+     * 生成网银支付链接
+     *
      * @param payLinkDto {
      *                   orderId       订单ID
      *                   vipRecordId   会员购买记录Id
-     * }
+     *                   }
      */
     @Override
     public ResponseJson<String> getPayLink(PayLinkDto payLinkDto) {
@@ -403,7 +489,17 @@ public class PayOrderServiceImpl implements PayOrderService {
             code = 5;
         }
         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-        String time = dateFormat.format(orderPayLink.getEffectiveTime());
+        //原24小时有效期,增加2天到72小时
+        String time = "";
+        Date effectiveTime = orderPayLink.getEffectiveTime();
+        Calendar ca = Calendar.getInstance();
+        ca.setTime(effectiveTime);
+        ca.add(Calendar.DAY_OF_MONTH, 2);
+        if (null != orderPayLink.getOrderId()) {
+            time = dateFormat.format(ca.getTime());
+        } else {
+            time = dateFormat.format(orderPayLink.getEffectiveTime());
+        }
         Map<String, Object> map = new HashMap<>(5);
         map.put("type", type);
         map.put("orderPayLink", orderPayLink);
@@ -453,7 +549,7 @@ public class PayOrderServiceImpl implements PayOrderService {
                 Map<String, Object> map = weChatService.getInfoMapByWeb(payParam.getCode(), "crm");
                 openId = (String) map.get(WeChatService.Keys.OPEN_ID);
             } catch (Exception e) {
-                log.error("try-catch:",e);
+                log.error("try-catch:", e);
             }
             if (StringUtils.isEmpty(openId)) {
                 return ResponseJson.error("微信公众号获取openId失败!", null);
@@ -696,7 +792,7 @@ public class PayOrderServiceImpl implements PayOrderService {
             log.info("【支付异步回调】>>>>>>>>>>>>>>订单(部分支付),修改订单状态:" + order.getStatus() + ",orderId:" + orderId);
         }
         // 更新付款次数
-        Integer paySuccessCounter = (null == order.getPaySuccessCounter()) ? 1 : order.getPaySuccessCounter() +1;
+        Integer paySuccessCounter = (null == order.getPaySuccessCounter()) ? 1 : order.getPaySuccessCounter() + 1;
         order.setPaySuccessCounter(paySuccessCounter);
         order.setUpdateDate(curDateStr);
         // 更新订单支付状态
@@ -758,22 +854,25 @@ public class PayOrderServiceImpl implements PayOrderService {
             }
         }
         if (rechargeFlag > 0) {
-            // 账户余额
-            double oldUserMoney = baseMapper.getUserMoney(order.getUserId());
+            // 线上账户余额
+            double oldUserMoney = baseMapper.getonlineMoney(order.getUserId());
+            // 充值算线下余额
             double userMoney = MathUtil.add(oldUserMoney, amount).doubleValue();
             // 可用余额
             Double oldAvailableMoney = baseMapper.getAbleUserMoney(order.getUserId());
+            // 可用余额=之前的可用+充值
             double availableMoney = MathUtil.add(oldAvailableMoney, amount).doubleValue();
-            payOrderMapper.updateMoneyByUserId(userMoney, availableMoney, order.getUserId());
+            //充值线上余额
+            payOrderMapper.updateOnlineMoneyByUserId(userMoney, availableMoney, order.getUserId());
             log.info("【支付异步回调】>>>>>>>>>>>更新用户余额(update[user])userId:" + order.getUserId() + ",orderId:" + orderId);
             //保存余额到余额收支记录
             BalanceRecordPo balanceRecord = new BalanceRecordPo();
             balanceRecord.setUserId(order.getUserId());
             balanceRecord.setType(1);
             if (rechargeFlag == 1) {
-                balanceRecord.setBalanceType(6);
+                balanceRecord.setBalanceType(16);
             } else {
-                balanceRecord.setBalanceType(7);
+                balanceRecord.setBalanceType(17);
             }
             balanceRecord.setAddDate(new Date());
             balanceRecord.setAmount(amount);
@@ -828,7 +927,7 @@ public class PayOrderServiceImpl implements PayOrderService {
                 }
                 // 超级会员用户标识
                 Integer svipUserId = baseMapper.getSvipUserIdByUserId(order.getUserId());
-                if (null != svipUserId && svipUserId.equals(order.getUserId())){
+                if (null != svipUserId && svipUserId.equals(order.getUserId())) {
                     // 超级会员用户采美豆翻倍
                     num = num * 2;
                 }
@@ -842,7 +941,7 @@ public class PayOrderServiceImpl implements PayOrderService {
                 }
             }
             baseMapper.updateUserBeans(beansHistory.getUserId(), userBeans);
-            log.info("【支付异步回调】>>>>>更新用户采美豆(update[user(userBeans:"+ userBeans +")]),userId:" + beansHistory.getUserId());
+            log.info("【支付异步回调】>>>>>更新用户采美豆(update[user(userBeans:" + userBeans + ")]),userId:" + beansHistory.getUserId());
         }
         // 已支付短信推送(取消推送)
         /*boolean smsPushFlag = !orderRequestNo.contains("BETA") && !orderRequestNo.contains("DEV");
@@ -913,7 +1012,7 @@ public class PayOrderServiceImpl implements PayOrderService {
     /**
      * 延时分账
      *
-     * @param callUrl  回调地址
+     * @param callUrl 回调地址
      */
     @Override
     public void delayedSplitting(String callUrl) {
@@ -925,10 +1024,18 @@ public class PayOrderServiceImpl implements PayOrderService {
         String currentTime = format.format(calendar.getTime());
         // 查询未分账已支付收款
         List<OrderReceiptRelationPo> orderRelations = payOrderMapper.getUndividedPaidReceipt(currentTime);
-        if (orderRelations != null && orderRelations.size() > 0) {
+        // 上面过滤了余额抵扣, 把线上余额抵扣单补充到list里面,线上余额抵扣的金额视为正常收款金额进行分账
+        List<OrderReceiptRelationPo> onlineRelations = payOrderMapper.getOnlineBalance(currentTime);
+        if (null != onlineRelations && orderRelations.size() > 0) {
+            // 过滤不足分账金额的单
+            onlineRelations.removeIf(o -> o.getAssociateAmount() < 0.01);
+            // 把线上余额抵扣订单加入分账
+            orderRelations.addAll(onlineRelations);
+        }
+        if (null != orderRelations && orderRelations.size() > 0) {
             for (OrderReceiptRelationPo orderRelation : orderRelations) {
                 log.info("【延时分账】>>>>>>>>>>订单id:" + orderRelation.getOrderId() + ",进入延时分账");
-                // 订单信息
+                // 收款对应的订单信息
                 OrderVo order = orderCommonMapper.getOrderByOrderId(orderRelation.getOrderId());
                 PayParamBo payParam = new PayParamBo();
                 payParam.setPayAmount(MathUtil.mul(orderRelation.getAssociateAmount(), 100).intValue());
@@ -944,7 +1051,7 @@ public class PayOrderServiceImpl implements PayOrderService {
                     double shopTotalAmount = 0.00;
                     String subUserNo = "";
                     for (SplitAccountPo account : splitBillDetail) {
-                        if (null!= account.getType() && 4 == account.getType() && shopOrder.getShopId().equals(account.getShopId())) {
+                        if (null != account.getType() && 4 == account.getType() && shopOrder.getShopId().equals(account.getShopId())) {
                             shopTotalAmount = MathUtil.add(shopTotalAmount, account.getSplitAccount()).doubleValue();
                             subUserNo = account.getSubUserNo();
                         }
@@ -952,9 +1059,11 @@ public class PayOrderServiceImpl implements PayOrderService {
                     addMaps(maps, shopTotalAmount, subUserNo);
                 }
                 //公账-专票总金额,私账-无票总金额,公账-普票总金额
+                //佣金进网络
                 double totalAmount1 = 0.00;
                 double totalAmount2 = 0.00;
                 double totalAmount3 = 0.00;
+                double totalAmount4 = 0.00;
                 for (SplitAccountPo account : splitBillDetail) {
                     if (1 == account.getType()) {
                         totalAmount1 = MathUtil.add(totalAmount1, account.getSplitAccount()).doubleValue();
@@ -962,11 +1071,14 @@ public class PayOrderServiceImpl implements PayOrderService {
                         totalAmount2 = MathUtil.add(totalAmount2, account.getSplitAccount()).doubleValue();
                     } else if (3 == account.getType()) {
                         totalAmount3 = MathUtil.add(totalAmount3, account.getSplitAccount()).doubleValue();
+                    } else if (5 == account.getType()) {
+                        totalAmount4 = MathUtil.add(totalAmount4, account.getSplitAccount()).doubleValue();
                     }
                 }
                 addMaps(maps, totalAmount1, PayUtil.publicAccountNo);
                 addMaps(maps, totalAmount2, PayUtil.privateAccountNo);
                 addMaps(maps, totalAmount3, PayUtil.commonInvoiceNo);
+                addMaps(maps, totalAmount4, PayUtil.brokerage);
                 String parameters = JSON.toJSONString(maps);
                 log.info("【延时分账】>>>>>>>>>>分账参数: " + parameters);
 
@@ -1025,6 +1137,7 @@ public class PayOrderServiceImpl implements PayOrderService {
     }
 
     /**
+     * todo 佣金要改进入采美网络
      * 分账详情
      */
     private List<SplitAccountPo> setSplitAccountDetail(OrderVo order, PayParamBo payParam) {
@@ -1047,6 +1160,7 @@ public class PayOrderServiceImpl implements PayOrderService {
         splitAmount = MathUtil.sub(splitAmount, procedureFee).doubleValue();
         // 商品数据
         List<OrderProductVo> orderProductList = orderCommonMapper.getOrderProductByOrderId(order.getOrderId());
+        orderProductList.removeIf(o -> 998 == o.getShopId() && orderCommonMapper.finduserBean(o.getOrderId()) > 0);
         for (OrderProductVo orderProduct : orderProductList) {
             double costPrice = MathUtil.mul(orderProduct.getCostPrice(), orderProduct.getNum()).doubleValue();
             // 不含税能开发票
@@ -1059,16 +1173,19 @@ public class PayOrderServiceImpl implements PayOrderService {
             Double paidAmount = payOrderMapper.getOrderProductPaidAmount(orderProduct.getOrderProductId());
             if (paidAmount != null && MathUtil.compare(paidAmount, 0) > 0) {
                 costPrice = MathUtil.sub(costPrice, paidAmount).doubleValue();
+                splitAmount = MathUtil.sub(splitAmount, costPrice).doubleValue();
             }
             if (paidAmount == null || MathUtil.compare(paidAmount, costPrice) < 0) {
                 // 待分账金额>=本次待分账金额
-                if (MathUtil.compare(splitAmount, costPrice) > -1) {
+                if (MathUtil.compare(splitAmount, costPrice) > 0) {
                     splitAmount = MathUtil.sub(splitAmount, costPrice).doubleValue();
                 } else {
                     costPrice = splitAmount;
                     splitAmount = 0.00;
                 }
-                String commercialCode = payOrderMapper.getShopCommercialCode(orderProduct.getShopId());
+            }
+            String commercialCode = payOrderMapper.getShopCommercialCode(orderProduct.getShopId());
+            if (costPrice > 0) {
                 SplitAccountPo splitAccount = new SplitAccountPo();
                 splitAccount.setOrderId(order.getOrderId());
                 splitAccount.setOrderProductId(orderProduct.getOrderProductId());
@@ -1080,24 +1197,32 @@ public class PayOrderServiceImpl implements PayOrderService {
                     splitAccount.setType(4);
                     splitAccount.setSubUserNo(commercialCode);
                 } else {
-                    if (1 == orderProduct.getInvoiceType()) {
-                        // 开增值税发票,则分账到公账-专票
-                        splitAccount.setType(1);
-                        splitAccount.setSubUserNo(PayUtil.publicAccountNo);
-                    } else if (2 == orderProduct.getInvoiceType()) {
-                        // 开普通发票,则分账到公账-普票
-                        splitAccount.setType(3);
-                        splitAccount.setSubUserNo(PayUtil.commonInvoiceNo);
+                    //含税或者不含税看票
+                    if (0 == orderProduct.getIncludedTax() || 1 == orderProduct.getIncludedTax()) {
+                        if (1 == orderProduct.getInvoiceType()) {
+                            // 开增值税发票,则分账到公账-专票
+                            splitAccount.setType(1);
+                            splitAccount.setSubUserNo(PayUtil.publicAccountNo);
+                        } else if (2 == orderProduct.getInvoiceType()) {
+                            // 开普通发票,则分账到公账-普票
+                            splitAccount.setType(3);
+                            splitAccount.setSubUserNo(PayUtil.commonInvoiceNo);
+                        } else {
+                            // 不能开票,则分账到私账-无票
+                            splitAccount.setType(2);
+                            splitAccount.setSubUserNo(PayUtil.privateAccountNo);
+                        }
                     } else {
-                        // 不能开票,则分账到私账-无票
+                        //未知或者其他直接私账
                         splitAccount.setType(2);
                         splitAccount.setSubUserNo(PayUtil.privateAccountNo);
                     }
                 }
+                log.info("成本分账参数------------->" + splitAccount);
                 list.add(splitAccount);
-                if (MathUtil.compare(splitAmount, 0) == 0) {
-                    break;
-                }
+            }
+            if (MathUtil.compare(splitAmount, 0) == 0) {
+                break;
             }
         }
         // 付供应商运费,是以供应商为单位的
@@ -1141,8 +1266,10 @@ public class PayOrderServiceImpl implements PayOrderService {
             splitAccount.setOrderId(order.getOrderId());
             splitAccount.setSplitAccount(splitAmount);
             splitAccount.setProductType(3);
-            splitAccount.setType(1);
+            splitAccount.setType(5);
+            //todo 暂时切信息
             splitAccount.setSubUserNo(PayUtil.publicAccountNo);
+            log.info("佣金分账参数------------->" + splitAccount);
             list.add(splitAccount);
         }
         return list;
@@ -1221,6 +1348,7 @@ public class PayOrderServiceImpl implements PayOrderService {
                     // 保存 付供应商记录
                     PayShopRecordPo shopRecord = new PayShopRecordPo();
                     shopRecord.setShopId(shopId);
+                    shopRecord.setPayShopId(payShop.getId());
                     shopRecord.setShopOrderId(shopOrderId);
                     shopRecord.setShopOrderNo(shopOrderNo);
                     shopRecord.setPayAmount(splitAmount);
@@ -1254,6 +1382,47 @@ public class PayOrderServiceImpl implements PayOrderService {
         return "SUCCESS";
     }
 
+    @Override
+    public ResponseJson<JSONObject> bankCode() {
+        List<BankCodeVo> banks = payOrderMapper.findBankCode();
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("list", banks);
+        return ResponseJson.success("获取成功", jsonObject);
+    }
+
+    @Override
+    public void couponCheck() {
+        log.info("------------查询是否有优惠券商品下单------------------------>");
+        List<CouponCheckVo> checks = payOrderMapper.findCouponOrder();
+        log.info("单号列表------------------------>" + checks);
+        if (null != checks && checks.size() > 0) {
+            checks.forEach(checkVo -> {
+                for (int i = 0; i < checkVo.getNum(); i++) {
+                    insertCoupon(checkVo);
+                }
+            });
+        }
+        log.info("---------------优惠券商品兑换结束--------------------------->");
+    }
+
+    private void insertCoupon(CouponCheckVo check) {
+        Integer couponId = 7174 == check.getProductId() ? 44 : 49;
+        CouponRecordPo couponRecordPo = new CouponRecordPo();
+        couponRecordPo.setOrderId(check.getOrderId());
+        couponRecordPo.setUserId(check.getUserId());
+        couponRecordPo.setCouponId(couponId);
+        //保存已兑换orderid
+        orderClubMapper.insertCouponRecord(couponRecordPo);
+        CouponClubPo couponClubPo = new CouponClubPo();
+        couponClubPo.setSource(5);
+        couponClubPo.setUserId(check.getUserId());
+        couponClubPo.setCouponId(couponId);
+        couponClubPo.setStatus("1");
+        couponClubPo.setDelFlag("0");
+        couponClubPo.setCreateDate(new Date());
+        orderClubMapper.insertCouponClub(couponClubPo);
+        log.info("兑换优惠券订单-------------------->" + couponRecordPo);
+    }
 //    /**
 //     * 手动临时分账异步通知回调
 //     *

+ 80 - 34
src/main/java/com/caimei365/order/service/impl/SubmitServiceImpl.java

@@ -60,6 +60,8 @@ public class SubmitServiceImpl implements SubmitService {
     private CartSellerMapper cartSellerMapper;
     @Resource
     private RemoteCallService remoteCallService;
+    @Resource
+    private PayOrderMapper payOrderMapper;
 
     /**
      * 生成订单
@@ -163,7 +165,7 @@ public class SubmitServiceImpl implements SubmitService {
         //订单应付总额
         String orderShouldPayFee = (String) payInfo.get("orderShouldPayFee");
         orderParamBo.setOrderShouldPayFee(Double.parseDouble(orderShouldPayFee));
-        // 运费标志:0包邮 -1到付 1遵循运费规则                               
+        // 运费标志:0包邮 -1到付 1遵循运费规则
         Integer postageFlag = (Integer) payInfo.get("postageFlag");
         // 运费
         String postage = (String) payInfo.get("postage");
@@ -907,7 +909,7 @@ public class SubmitServiceImpl implements SubmitService {
         Double couponAmount = 0d;
         CouponVo coupon = null;
         if (null != orderParamBo.getClubCouponId() && orderParamBo.getClubCouponId() > 0) {
-            coupon = orderClubMapper.getClubCouponById(orderParamBo.getClubCouponId());
+            coupon = orderClubMapper.getClubCouponById(orderParamBo.getClubCouponId(),orderParamBo.getUserId());
             if (null == coupon) {
                 // 设置手动回滚事务
                 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
@@ -966,42 +968,54 @@ public class SubmitServiceImpl implements SubmitService {
         boolean isPaySuccessFlag = false;
         // 余额支付标识,0不使用,1使用
         if (1 == orderParamBo.getBalancePayFlag()) {
-            // 抵扣后用户剩余可用余额
-            Double lastAbleUserMoney;
-            // 抵扣后账户余额
-            Double lastUserMoney = orderParamBo.getUserMoney();
-            // 部分抵扣
+            // 订单总额>账户余额 部分抵扣
             if (MathUtil.compare(payTotalFee.get(), orderParamBo.getAbleUserMoney()) > 0) {
                 balancePayFee.set(orderParamBo.getAbleUserMoney());
                 payableAmount.set(MathUtil.sub(payTotalFee.get(), balancePayFee.get()).doubleValue());
-                // 余额抵扣用完
-                lastAbleUserMoney = 0d;
                 if (3 != orderParamBo.getCartType()) {
                     // 部收款待发货
                     mainOrder.setStatus(21);
-                    lastUserMoney = MathUtil.sub(orderParamBo.getUserMoney(), balancePayFee.get()).doubleValue();
+                    //非协销下单,直接扣
+                    // 线上+线下只够部分抵扣,线上线下可用都置为0
+                    payOrderMapper.updateMoneyByUserId(0d, 0d, 0d, orderParamBo.getUserId());
+                    log.info("【提交订单】>>>>>更新用户余额,抵扣后剩余:[userMoney:" + 0 + "] ,ableUserMoney:" + 0);
+                }else{
+                    //协销下单,只扣可用余额
+                    payOrderMapper.updateAbleMoney(0d, orderParamBo.getUserId());
                 }
                 mainOrder.setReceiptStatus(2);
             } else {
                 // 全部用余额抵扣, 直接变成支付完成
                 balancePayFee.set(payTotalFee.get());
                 payableAmount.set(0d);
-                lastAbleUserMoney = MathUtil.sub(orderParamBo.getAbleUserMoney(), balancePayFee.get()).doubleValue();
+                Double availableMoney = MathUtil.sub(orderParamBo.getAbleUserMoney(), balancePayFee).doubleValue();
                 if (3 != orderParamBo.getCartType()) {
                     // 已收款待发货
                     mainOrder.setStatus(31);
-                    lastUserMoney = MathUtil.sub(orderParamBo.getUserMoney(), balancePayFee.get()).doubleValue();
+                    //非协销下单,直接扣
+                    // 线上余额全付
+                    if (MathUtil.compare(orderParamBo.getOnlineMoney(), balancePayFee) > 0) {
+                        Double onlineMoney = MathUtil.sub(orderParamBo.getOnlineMoney(), balancePayFee).doubleValue();
+                        payOrderMapper.updateOnlineMoneyByUserId(onlineMoney, availableMoney, orderParamBo.getUserId());
+                        log.info("【提交订单】>>>>>更新用户余额,抵扣后剩余:[userMoney:" + availableMoney + "] ,ableUserMoney:" + availableMoney);
+                    } else {
+                        //线上余额不够,线上全抵
+                        Double userMoney = MathUtil.sub(orderParamBo.getUserMoney(), MathUtil.sub(balancePayFee, orderParamBo.getOnlineMoney())).doubleValue();
+                        //更新线上/线下余额  线上置为0,全部抵扣
+                        payOrderMapper.updateMoneyByUserId(userMoney, MathUtil.sub(orderParamBo.getAbleUserMoney(), balancePayFee).doubleValue(), 0d, orderParamBo.getUserId());
+                    }
+                }else{
+                    //协销下单,只扣可用余额,确认订单在扣usermoney和onlinemoney
+                    payOrderMapper.updateAbleMoney(availableMoney, orderParamBo.getUserId());
                 }
                 mainOrder.setReceiptStatus(3);
                 mainOrder.setPayFlag(1);
                 isPaySuccessFlag = true;
             }
-            // 抵扣后更新用户余额
-            submitMapper.updateUserMoney(lastUserMoney, lastAbleUserMoney, orderParamBo.getUserId());
-            log.info("【提交订单】>>>>>更新用户余额,抵扣后剩余:[userMoney:" + lastUserMoney + "] ,ableUserMoney:" + lastAbleUserMoney);
             // 支付时间
             mainOrder.setPayTime(curDateStr);
         } else {
+            //不用余额的情况下真是支付金额赋值为订单总额
             payableAmount.set(payTotalFee.get());
         }
         // 余额支付金额
@@ -1274,26 +1288,57 @@ public class SubmitServiceImpl implements SubmitService {
             return ResponseJson.error("订单地址异常!", null);
         }
 
-        /*
-         *保存余额到余额收支记录
+        /**
+         * 保存余额到余额收支记录
          */
         // 余额支付标识,0不使用,1使用
         if (1 == orderParamBo.getBalancePayFlag() && MathUtil.compare(balancePayFee.get(), 0) > 0) {
-            // 余额支付标识,0不使用,1使用
-            //保存余额到余额收支记录
-            BalanceRecordPo balanceRecord = new BalanceRecordPo();
-            balanceRecord.setUserId(mainOrder.getUserId());
-            balanceRecord.setType(2);
-            balanceRecord.setBalanceType(1);
-            balanceRecord.setAddDate(new Date());
-            balanceRecord.setAmount(balancePayFee.get());
-            balanceRecord.setOrderId(mainOrder.getOrderId());
-            balanceRecord.setRemark("机构自主订单");
-            balanceRecord.setDelFlag(0);
-            // 保存 余额收支记录
-            baseMapper.insertBalanceRecord(balanceRecord);
-            log.info("【提交订单】>>>>>>>>>>>>>>>>>>>>>>>>>>新增用户余额收支记录(insert[cm_user_balance_record])orderId:" + mainOrder.getOrderId());
-
+            Double onlineMoney = orderParamBo.getOnlineMoney();
+            if (MathUtil.compare(onlineMoney, balancePayFee) > 0) {
+                //保存余额到余额收支记录
+                BalanceRecordPo balanceRecord = new BalanceRecordPo();
+                balanceRecord.setUserId(orderParamBo.getUserId());
+                balanceRecord.setType(2);
+                balanceRecord.setBalanceType(10);
+                balanceRecord.setAddDate(new Date());
+                balanceRecord.setAmount(balancePayFee.doubleValue());
+                balanceRecord.setOrderId(mainOrder.getOrderId());
+                balanceRecord.setRemark("订单支付,余额抵扣");
+                balanceRecord.setDelFlag(0);
+                // 保存 余额收支记录
+                baseMapper.insertBalanceRecord(balanceRecord);
+                log.info("【提交订单】>>>>>>>>>>>>>>>>>>>>>>>>>>新增用户余额收支记录(insert[cm_user_balance_record])orderId:" + mainOrder.getOrderId());
+            } else {//线上不够,线上全抵,剩余线下
+                if (onlineMoney > 0) {
+                    // 线上>0有抵扣的情况下保存线上余额到余额收支记录
+                    BalanceRecordPo balanceRecord = new BalanceRecordPo();
+                    balanceRecord.setUserId(orderParamBo.getUserId());
+                    balanceRecord.setType(2);
+                    balanceRecord.setBalanceType(10);
+                    balanceRecord.setAddDate(new Date());
+                    balanceRecord.setAmount(onlineMoney);
+                    balanceRecord.setOrderId(mainOrder.getOrderId());
+                    balanceRecord.setRemark("订单支付,余额抵扣");
+                    balanceRecord.setDelFlag(0);
+                    baseMapper.insertBalanceRecord(balanceRecord);
+                    log.info("【提交订单】>>>>>>>>>>>>>>>>>>>>>>>>>>新增用户余额收支记录(insert[cm_user_balance_record])orderId:" + mainOrder.getOrderId());
+                }
+                if (MathUtil.sub(balancePayFee, orderParamBo.getOnlineMoney()).doubleValue() > 0) {
+                    // 保存线下余额到余额收支记录
+                    BalanceRecordPo balanceRecord1 = new BalanceRecordPo();
+                    balanceRecord1.setUserId(orderParamBo.getUserId());
+                    balanceRecord1.setType(2);
+                    balanceRecord1.setBalanceType(1);
+                    balanceRecord1.setAddDate(new Date());
+                    balanceRecord1.setAmount(MathUtil.sub(balancePayFee, orderParamBo.getOnlineMoney()).doubleValue());
+                    balanceRecord1.setOrderId(mainOrder.getOrderId());
+                    balanceRecord1.setRemark("订单支付,余额抵扣");
+                    balanceRecord1.setDelFlag(0);
+                    // 保存 余额收支记录
+                    baseMapper.insertBalanceRecord(balanceRecord1);
+                    log.info("【提交订单】>>>>>>>>>>>>>>>>>>>>>>>>>>新增用户余额收支记录(insert[cm_user_balance_record])orderId:" + mainOrder.getOrderId());
+                }
+            }
             // 保存余额抵扣到收款记录(自主订单)
             if (3 != orderParamBo.getCartType()) {
                 Integer orderId = mainOrder.getOrderId();
@@ -1501,6 +1546,9 @@ public class SubmitServiceImpl implements SubmitService {
          * 初始化主订单
          */
         OrderPo mainOrder = new OrderPo();
+        //协销订金订单默认不可见
+        mainOrder.setOrderSeen(2);
+        mainOrder.setSpId(rechargeDto.getServiceProviderId());
         // 订单来源
         mainOrder.setOrderSource(6);
         // 订单号
@@ -1565,7 +1613,6 @@ public class SubmitServiceImpl implements SubmitService {
         mainOrder.setClauseName("无条款");
         // 是否返佣订单
         mainOrder.setRebateFlag(0);
-        mainOrder.setSpId(rechargeDto.getServiceProviderId());
         /*
          * 保存主订单数据,返回订单Id
          */
@@ -1643,7 +1690,6 @@ public class SubmitServiceImpl implements SubmitService {
         rechargeProduct.setSingleCmFee(rechargeDto.getPrice());
         rechargeProduct.setNotOutStore(0);
         rechargeProduct.setBuyAgainFlag(0);
-        rechargeProduct.setName(rechargeDto.getName());
         /*
          * 保存 订单商品
          */

+ 8 - 0
src/main/java/com/caimei365/order/task/DelayedSplittingTask.java

@@ -30,4 +30,12 @@ public class DelayedSplittingTask {
     public void delayedSplitting() {
         payOrderService.delayedSplitting(delayedSplittingUrl);
     }
+
+    /**
+     * 优惠券下单查询,下了对应商品,送优惠券  2分钟一次
+     */
+    @Scheduled(cron = "0 0/2 * * * ?")
+    public void couponCheck() {
+        payOrderService.couponCheck();
+    }
 }

+ 4 - 0
src/main/java/com/caimei365/order/utils/PayUtil.java

@@ -47,6 +47,10 @@ public class PayUtil {
      * 私账-无票,子商户商编
      */
     public static final String privateAccountNo = "20001924";
+    /**
+     * 彩美网络,佣金账户
+     */
+    public static final String brokerage="20004104";
 
     /**
      * 支付状态转换

+ 5 - 2
src/main/resources/mapper/BaseMapper.xml

@@ -264,9 +264,9 @@
     </insert>
     <insert id="insertOrderReceiptRelation" keyColumn="id" keyProperty="id"
             parameterType="com.caimei365.order.model.po.OrderReceiptRelationPo" useGeneratedKeys="true">
-        INSERT INTO cm_receipt_order_relation (relationType, receiptId, associationType, associateAmount, orderId, vipRecordId, delFlag,
+        INSERT INTO cm_receipt_order_relation (relationType, receiptId, associationType, associateAmount, orderId, couponRecordId, vipRecordId, delFlag,
                                                mbOrderId, orderRequestNo, splitStatus, productId)
-        VALUES (#{relationType}, #{receiptId}, #{associationType}, #{associateAmount}, #{orderId}, #{vipRecordId}, #{delFlag}, #{mbOrderId},
+        VALUES (#{relationType}, #{receiptId}, #{associationType}, #{associateAmount}, #{orderId}, #{couponRecordId}, #{vipRecordId}, #{delFlag}, #{mbOrderId},
                 #{orderRequestNo}, #{splitStatus}, #{productId})
     </insert>
     <insert id="insertBeansHistory" parameterType="com.caimei365.order.model.po.UserBeansHistoryPo">
@@ -336,4 +336,7 @@
     <select id="findBeans" resultType="java.lang.Integer">
         select userBeans from user where userID=#{userId}
     </select>
+    <select id="getonlineMoney" resultType="java.lang.Double">
+        select onlineMoney FROM USER WHERE userId = #{userId}
+    </select>
 </mapper>

+ 11 - 3
src/main/resources/mapper/OrderClubMapper.xml

@@ -119,6 +119,10 @@
         INSERT INTO cm_coupon_club(userId, couponId, orderId, returnedId, source, status, createDate, useDate, delFlag)
         VALUES (#{userId},#{couponId},#{orderId},#{returnedId},#{source},#{status},#{createDate},#{useDate},#{delFlag})
     </insert>
+    <insert id="insertCouponRecord">
+        INSERT INTO cm_coupon_buyrecord(couponId,payStatus,userId,orderId,delflag)
+        values (#{couponId},1,#{userId},#{orderId},0)
+    </insert>
     <select id="countMainOrderByOrderId" resultType="java.lang.Integer">
         SELECT COUNT(*) FROM cm_order WHERE orderID = #{orderId}
     </select>
@@ -507,12 +511,13 @@
         cc.categoryType
         FROM cm_coupon_club a
         LEFT JOIN cm_coupon cc ON a.couponId = cc.id
-        WHERE cc.delFlag = 0
+        WHERE if(cc.moneyCouponFlag=2,cc.delFlag = 0,cc.id>0)
         AND a.delFlag = 0
         AND a.id = #{clubCouponId}
         AND a.status = 1
-        AND NOW() BETWEEN cc.startDate
-        AND cc.endDate
+        AND NOW() <![CDATA[ > ]]> startDate
+        AND NOW() <![CDATA[ < ]]> if(receiveFlag = 1,endDate,date_add(if((SELECT registerTime FROM user WHERE userID = #{userId}) <![CDATA[ > ]]> startDate and (SELECT registerTime FROM user WHERE userID = #{userId}) <![CDATA[ < ]]> endDate,(SELECT registerTime FROM user WHERE userID = #{userId}),startDate),
+            interval receivePeriod day))
         AND cc.status != 2
     </select>
     <select id="getOrderCouponRecord" resultType="com.caimei365.order.model.po.CouponOrderRecordPo">
@@ -530,4 +535,7 @@
         WHERE userId = #{userId}
         ORDER BY orderID DESC limit 1
     </select>
+    <select id="findUserId" resultType="java.lang.Integer">
+        select userId from cm_order where orderID = #{orderId}
+    </select>
 </mapper>

+ 26 - 3
src/main/resources/mapper/OrderCommonMapper.xml

@@ -457,13 +457,16 @@
             id AS couponId,
             couponAmount,
             touchPrice,
+            moneyCouponPrice,
+            moneyCouponFlag,
+            moneyCouponType,
             <if test="userId == null || userId == 0">
                 startDate,
                 endDate,
             </if>
             <if test="userId >0">
                 if(#{registerTime} <![CDATA[ > ]]> startDate,#{registerTime},startDate) as startDate,
-                if(receiveFlag=1,endDate,date_add(if(#{registerTime} <![CDATA[ > ]]> startDate,#{registerTime},startDate),interval receivePeriod day)) as endDate,
+                if(receiveFlag=1,endDate,date_add(if(#{registerTime} <![CDATA[ > ]]> startDate and #{registerTime} <![CDATA[ < ]]> endDate,#{registerTime},startDate),interval receivePeriod day)) as endDate,
             </if>
             couponType,
             userId,
@@ -480,12 +483,12 @@
         <if test="userId > 0">
             AND id NOT IN(SELECT couponId FROM cm_coupon_club WHERE userId = #{userId})
             AND (couponType IN (0,1,3)
-            OR couponType = 2 AND userId = #{userId}
+            OR (couponType = 2 AND userId = #{userId})
             OR ((SELECT registerTime FROM USER WHERE userID = #{userId}) <![CDATA[ >= ]]> startDate
             AND couponType = 4))
             and NOW() <![CDATA[ > ]]> startDate
             and NOW() <![CDATA[ < ]]> if(receiveFlag = 1,endDate,
-            date_add(if(#{registerTime} <![CDATA[ > ]]> startDate,#{registerTime},startDate),
+            date_add(if(#{registerTime} <![CDATA[ > ]]> startDate and #{registerTime} <![CDATA[ < ]]> endDate,#{registerTime},startDate),
             interval receivePeriod day))
         </if>
         ORDER BY createDate DESC
@@ -496,6 +499,9 @@
             cc.id AS couponId,
             cc.couponAmount,
             cc.touchPrice,
+            cc.moneyCouponFlag,
+            cc.moneyCouponPrice,
+            cc.moneyCouponType,
             if(cc.vipFlag = 1,cc.startDate,a.createDate) as startDate,
             if(cc.vipFlag = 1,cc.endDate,date_add(a.createDate,interval cc.usePeriod day)) as endDate,
             cc.couponType,
@@ -543,4 +549,21 @@
     <select id="getUserRegisterTime" resultType="java.util.Date">
         select registerTime from user where userID = #{userId}
     </select>
+    <select id="findUserMoney" resultType="java.lang.Double">
+        SELECT SUM(amount)
+        FROM cm_user_balance_record
+        WHERE orderId = #{orderId}
+          AND balanceType = 1
+          AND delflag = 0
+    </select>
+    <select id="findOnlineMoney" resultType="java.lang.Double">
+        SELECT SUM(amount)
+        FROM cm_user_balance_record
+        WHERE orderId = #{orderId}
+          AND balanceType = 10
+          AND delflag = 0
+    </select>
+    <select id="finduserBean" resultType="java.lang.Integer">
+        select userBeans from cm_order where orderID = #{orderId}
+    </select>
 </mapper>

+ 84 - 3
src/main/resources/mapper/PayOrderMapper.xml

@@ -26,7 +26,15 @@
         WHERE orderID = #{orderId}
     </update>
     <update id="updateMoneyByUserId">
-        UPDATE USER SET userMoney = #{userMoney}, ableUserMoney = #{ableUserMoney}
+        UPDATE USER
+        SET userMoney     = #{userMoney},
+            ableUserMoney = #{ableUserMoney},
+            onlineMoney   = #{onlineMoney}
+        WHERE userID = #{userId}
+    </update>
+    <update id="updateAbleMoney">
+        UPDATE USER
+        SET ableUserMoney = #{ableUserMoney}
         WHERE userID = #{userId}
     </update>
     <insert id="insertOrderPayLink" keyColumn="id" keyProperty="id"  parameterType="com.caimei365.order.model.vo.OrderPayLinkVo" useGeneratedKeys="true">
@@ -34,9 +42,9 @@
         VALUES (#{orderId}, #{vipRecordId}, #{vipMonth}, #{linkLogo}, #{unpaidAmount}, #{generateTime}, #{effectiveTime}, #{payStatus}, #{payType}, #{delFlag})
     </insert>
     <insert id="insertSplitAccount" keyColumn="id" keyProperty="id"  parameterType="com.caimei365.order.model.po.SplitAccountPo">
-        INSERT INTO cm_split_account (orderId, productId, orderProductId, shopId, vipRecordId, type, subUserNo, splitAccount,
+        INSERT INTO cm_split_account (orderId, productId, orderProductId, shopId, couponRecordId,vipRecordId, type, subUserNo, splitAccount,
                                         mbOrderId, orderRequestNo,payStatus, productType, splitTime)
-        VALUES (#{orderId}, #{productId}, #{orderProductId}, #{shopId},#{vipRecordId}, #{type}, #{subUserNo}, #{splitAccount},
+        VALUES (#{orderId}, #{productId}, #{orderProductId}, #{shopId},#{couponRecordId},#{vipRecordId}, #{type}, #{subUserNo}, #{splitAccount},
                 #{mbOrderId}, #{orderRequestNo}, #{payStatus}, #{productType}, NOW());
     </insert>
     <insert id="insertPayShop" keyColumn="id" keyProperty="id" parameterType="com.caimei365.order.model.po.PayShopPo">
@@ -55,6 +63,9 @@
         INSERT INTO cm_svip_user(userId, beginTime, endTime, delFlag, updateTime)
         VALUES (#{userId}, #{beginTime}, #{endTime}, #{delFlag}, #{updateTime})
     </insert>
+    <insert id="insertCouponRecord" keyColumn="id" keyProperty="id" parameterType="com.caimei365.order.model.po.CouponRecordPo" useGeneratedKeys="true">
+        INSERT INTO cm_coupon_buyrecord (couponId, userId) VALUES (#{couponId},#{userId})
+    </insert>
     <update id="updateUserVipInfo">
         UPDATE cm_svip_user set userId=#{userId}, beginTime=#{beginTime}, endTime=#{endTime}, delFlag=#{delFlag}, updateTime=#{updateTime}
         WHERE userId = #{userId}
@@ -94,6 +105,26 @@
         payStatus = #{payStatus}
         WHERE orderID = #{orderId}
     </update>
+    <update id="updateOnlineMoneyByUserId">
+        UPDATE USER
+        SET onlineMoney   = #{onlineMoney},
+            ableUserMoney = #{ableUserMoney}
+        WHERE userID = #{userId}
+    </update>
+    <update id="updateUserMoney">
+        UPDATE USER
+        SET userMoney     = #{userMoney},
+        ableUserMoney = #{ableUserMoney}
+        WHERE userID = #{userId}
+    </update>
+    <update id="updateCouponRecord">
+        update cm_coupon_buyrecord
+        set payStatus = 1
+        where id = #{recordId}
+    </update>
+    <update id="bugFix">
+        UPDATE USER SET userMoney = ableUserMoney WHERE userId = #{userId}
+    </update>
     <select id="getPayOnLineSwitch" resultType="java.lang.Integer">
         SELECT STATUS FROM cm_pay_online_switch WHERE id=1
     </select>
@@ -242,4 +273,54 @@
         FROM cm_svip_user
         WHERE userId = #{#userId} and endTime > now()
     </select>
+    <select id="findBankCode" resultType="com.caimei365.order.model.vo.BankCodeVo">
+        select id, bankName, B2C, B2B, bankLogo, delFlag
+        from cm_bankcode
+    </select>
+    <select id="getOnlineBalance" resultType="com.caimei365.order.model.po.OrderReceiptRelationPo">
+        SELECT DISTINCT cror.id,
+                        cror.relationType,
+                        cror.receiptId,
+                        cror.associateAmount,
+                        cror.orderId,
+                        cror.delFlag,
+                        cror.mbOrderId,
+                        cror.orderRequestNo,
+                        cror.splitStatus,
+                        cdr.payType
+        FROM cm_receipt_order_relation cror
+                 LEFT JOIN cm_discern_receipt cdr ON cror.receiptID = cdr.id
+                 LEFT JOIN cm_order co ON cror.orderID = co.orderID
+                 LEFT JOIN cm_user_balance_record cubr ON cubr.orderId = cror.orderID
+        WHERE cror.relationType = 2
+          AND cror.delFlag = 0
+          AND cror.splitStatus = 0
+          AND cdr.delFlag = 0
+          AND cdr.payWay = 3
+          AND cdr.receiptDate <![CDATA[  <=  ]]> #{currentTime}
+          AND co.organizeID = 0
+          AND co.orderType != 2
+          AND co.refundType != 2
+          AND cubr.balanceType = 10
+          AND cror.associateAmount > 0.01
+    </select>
+    <select id="getCouponPrice" resultType="java.lang.Double">
+        select moneyCouponPrice from cm_coupon where id = #{couponId}
+    </select>
+    <select id="findPayStatus" resultType="java.lang.Integer">
+        select payStatus from cm_coupon_buyrecord where id = #{recordId}
+    </select>
+    <select id="findClubType" resultType="java.lang.Integer">
+        SELECT firstClubType FROM club WHERE userId = #{userId}
+    </select>
+    <select id="findCouponOrder" resultType="com.caimei365.order.model.vo.CouponCheckVo">
+        SELECT cop.num,co.userId,cop.orderId,cop.productId
+        FROM cm_order_product cop
+        LEFT JOIN cm_order co ON cop.orderId = co.orderId
+        LEFT JOIN cm_coupon_buyrecord ccb ON ccb.orderId = co.orderId
+        WHERE  cop.productId IN (7174,7175)
+          AND co.receiptStatus = 3
+          AND co.delflag = 0
+          AND cop.orderId NOT IN (SELECT orderId FROM cm_coupon_buyrecord WHERE orderId IS NOT NULL)
+    </select>
 </mapper>

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

@@ -174,6 +174,7 @@
                bindMobile,
                userMoney,
                ableUserMoney,
+               onlineMoney,
                userBeans
         FROM user
         WHERE userID = #{userId}