فهرست منبع

代码优化,补缴费功能

lishiqiang 4 روز پیش
والد
کامیت
e3156da8bb
13فایلهای تغییر یافته به همراه338 افزوده شده و 6 حذف شده
  1. 1 0
      ship-module-trade/ship-module-trade-api/src/main/java/com/yc/ship/module/trade/enums/ApiConstants.java
  2. 1 0
      ship-module-trade/ship-module-trade-api/src/main/java/com/yc/ship/module/trade/enums/TradeOrderOperateTypeEnum.java
  3. 17 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/order/OtcTradeOrderController.java
  4. 9 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/app/order/TradeOrderController.java
  5. 1 1
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/dataobject/order/TradeOrderDO.java
  6. 2 1
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/invoice/impl/InvoiceGroupServiceImpl.java
  7. 2 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/otc/OtcTradeOrderService.java
  8. 16 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/otc/impl/OtcTradeOrderServiceImpl.java
  9. 1 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/pay/PayPlatService.java
  10. 2 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/pay/TradeOrderPayService.java
  11. 98 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/pay/impl/PayPlatServiceImpl.java
  12. 186 4
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/pay/impl/TradeOrderPayServiceImpl.java
  13. 2 0
      ship-server-web/src/main/resources/application.yaml

+ 1 - 0
ship-module-trade/ship-module-trade-api/src/main/java/com/yc/ship/module/trade/enums/ApiConstants.java

@@ -126,6 +126,7 @@ public class ApiConstants {
      * 支付单-订单类型 定金支付
      */
     public static final int PAY_ORDER_TYPE_DEPOSI = 2;
+    public static final int PAY_ORDER_TYPE_BC = 3;
 
     /**
      * redis 缓存,时间方案最小时间

+ 1 - 0
ship-module-trade/ship-module-trade-api/src/main/java/com/yc/ship/module/trade/enums/TradeOrderOperateTypeEnum.java

@@ -44,6 +44,7 @@ public enum TradeOrderOperateTypeEnum {
     ORDER_AUDIT(30, "订单审核,结果:{result}"),
     CANCEL_AUDIT(32, "订单取消审核,结果:{result}"),
     ORDER_DEPOSI_PAY(31, "订单定金支付,支付方式:{payType},金额:{payAmount}"),
+    ORDER_BC_PAY(33, "订单补差价支付,支付方式:{payType},金额:{payAmount}"),
     ;
 
     /**

+ 17 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/order/OtcTradeOrderController.java

@@ -192,6 +192,15 @@ public class OtcTradeOrderController {
         return otcTradeOrderService.payDeposiOrder(agencyAuthUtils.getAgencyLoginUser(), payOrderReqVO);
     }
 
+    @RequestDecryption
+    @PostMapping("/travl/payBcOrder")
+    @Operation(summary = "win-旅行社下单支付补差价")
+    @OperateLog(type = TRADE)
+    public CommonResult<PayOrderRespVO> payBcOrder(@Valid @RequestBody PayOrderReqVO payOrderReqVO) {
+        log.error("payBcOrder:{}", JSON.toJSONString(payOrderReqVO));
+        return otcTradeOrderService.payBcOrder(agencyAuthUtils.getAgencyLoginUser(), payOrderReqVO);
+    }
+
     @GetMapping("/travl/queryOrderStatus")
     @Operation(summary = "win-查询订单状态")
     @OperateLog(type = API)
@@ -208,6 +217,14 @@ public class OtcTradeOrderController {
         return otcTradeOrderService.queryDeposiOrderStatus(orderId);
     }
 
+    @GetMapping("/travl/queryBcOrderStatus")
+    @Operation(summary = "win-查询订单补差价支付状态")
+    @OperateLog(type = API)
+    @PlatTenantEnv
+    public CommonResult<?> queryBcOrderStatus(@RequestParam Long orderId) {
+        return otcTradeOrderService.queryBcOrderStatus(orderId);
+    }
+
     @GetMapping("/travl/queryOrderAudit")
     @Operation(summary = "win-查询订单审核信息")
     @OperateLog(type = API)

+ 9 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/app/order/TradeOrderController.java

@@ -57,6 +57,15 @@ public class TradeOrderController {
         return commonResult.isSuccess() ? "success" : "fail";
     }
 
+    @PostMapping("/bcPayNotify")
+    @Operation(summary = "补缴费用支付通知")
+    @OperateLog(type = TRADE)
+    public String bcPayNotify(@RequestParam Map<String, Object> map) {
+        CommonResult<?> commonResult = tradeOrderPayService.handleBcPayNotify(map);
+        log.error("补差价支付通知,参数{},返回参数{}", map, commonResult.isSuccess());
+        return commonResult.isSuccess() ? "success" : "fail";
+    }
+
     @PostMapping("/refundNotify")
     @Operation(summary = "退款通知")
     @OperateLog(type = TRADE)

+ 1 - 1
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/dataobject/order/TradeOrderDO.java

@@ -342,7 +342,7 @@ public class TradeOrderDO extends TenantBaseDO {
     @ForUpdate(fieldName = "政策优惠金额")
     private BigDecimal freeAmount;
 
-    @ForUpdate(fieldName = "是否需要补缴费 1是 0 否")
+    @ForUpdate(fieldName = "是否需要补缴费 1是 0 否 2已补差价")
     private Integer isSupplementary;
 
     @ForUpdate(fieldName = "受损金额")

+ 2 - 1
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/invoice/impl/InvoiceGroupServiceImpl.java

@@ -524,6 +524,7 @@ public class InvoiceGroupServiceImpl implements InvoiceGroupService {
         try {
             JSONObject reqBody = this.buildRequestParam(invoiceList, type, "", remark);
             String batchNo = reqBody.getJSONObject("DDPCXX").getStr("DDQQPCH");
+            log.error("发票开具请求参数reqBody={},secretKey={}", reqBody,secretKey);
             JSONObject resObj = this.doRequest(reqBody, method, secretKey);
             msg = resObj.getStr("returnMessage");
             //成功
@@ -1070,7 +1071,7 @@ public class InvoiceGroupServiceImpl implements InvoiceGroupService {
                 .body(JsonUtils.toJsonString(params))
                 .timeout(15000)
                 .execute().body();
-        log.info("集团电子电子发票返回:{}", resultStr);
+        log.error("集团电子电子发票返回:{}", resultStr);
         return JSONUtil.parseObj(resultStr);
     }
 

+ 2 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/otc/OtcTradeOrderService.java

@@ -37,6 +37,7 @@ public interface OtcTradeOrderService {
      * 定金支付
      */
     CommonResult<PayOrderRespVO> payDeposiOrder(LoginUser loginUser, PayOrderReqVO payOrderReqVO);
+    CommonResult<PayOrderRespVO> payBcOrder(LoginUser loginUser, PayOrderReqVO payOrderReqVO);
 
     /**
      * 查询订单状态
@@ -44,6 +45,7 @@ public interface OtcTradeOrderService {
     CommonResult<?> queryOrderStatus(Long orderId);
 
     CommonResult<?> queryDeposiOrderStatus(Long orderId);
+    CommonResult<?> queryBcOrderStatus(Long orderId);
 
     CommonResult<?> queryOrderAudit(Long orderId);
 

+ 16 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/otc/impl/OtcTradeOrderServiceImpl.java

@@ -303,6 +303,13 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
         return tradeOrderPayService.payDeposiOrder(payOrderReqVO);
     }
 
+    @Override
+    public CommonResult<PayOrderRespVO> payBcOrder(LoginUser loginUser, PayOrderReqVO payOrderReqVO) {
+        //当前旅行社信息
+        initPayParams(loginUser, payOrderReqVO);
+        return tradeOrderPayService.payBcOrder(payOrderReqVO);
+    }
+
     private void initPayParams(LoginUser loginUser, PayOrderReqVO payOrderReqVO) {
         if (loginUser.getDistributorId() == null) {
             payOrderReqVO.setAccountType(PayAccountTypeEnum.OTC.getType());
@@ -330,6 +337,15 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
         return CommonResult.error(999, "待轮询");
     }
 
+    @Override
+    public CommonResult<?> queryBcOrderStatus(Long orderId) {
+        TradeOrderDO tradeOrderDO = tradeOrderRepositoryService.getById(orderId);
+        if (tradeOrderDO != null && tradeOrderDO.getIsSupplementary() == 2) {
+            return CommonResult.success(orderId);
+        }
+        return CommonResult.error(999, "待轮询");
+    }
+
     @Override
     public CommonResult<?> queryOrderAudit(Long orderId) {
         TradeOrderDO tradeOrderDO = tradeOrderRepositoryService.getById(orderId);

+ 1 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/pay/PayPlatService.java

@@ -24,6 +24,7 @@ public interface PayPlatService {
     JSONObject createPayOrder(PayOrderReqVO payOrderReqVO, TradeOrderPayDO tradeOrderPayDO, TradeMchInfoDO tradeMchInfoDO);
 
     JSONObject createDeposiPayOrder(PayOrderReqVO payOrderReqVO, TradeOrderPayDO tradeOrderPayDO, TradeMchInfoDO tradeMchInfoDO);
+    JSONObject createBcPayOrder(PayOrderReqVO payOrderReqVO, TradeOrderPayDO tradeOrderPayDO, TradeMchInfoDO tradeMchInfoDO);
 
     /**
      * 创建退款

+ 2 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/pay/TradeOrderPayService.java

@@ -30,6 +30,7 @@ public interface TradeOrderPayService {
      * 定金支付
      */
     CommonResult<PayOrderRespVO> payDeposiOrder(PayOrderReqVO payOrderReqVO);
+    CommonResult<PayOrderRespVO> payBcOrder(PayOrderReqVO payOrderReqVO);
 
     /**
      * 处理支付成功通知,只有支付成功了,支付平台才调用
@@ -37,6 +38,7 @@ public interface TradeOrderPayService {
     CommonResult<?> handlePayNotify(Map<String, Object> map);
 
     CommonResult<?> handleDeposiPayNotify(Map<String, Object> map);
+    CommonResult<?> handleBcPayNotify(Map<String, Object> map);
 
     /**
      * 支付单反查

+ 98 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/pay/impl/PayPlatServiceImpl.java

@@ -244,6 +244,104 @@ public class PayPlatServiceImpl implements PayPlatService {
         }
     }
 
+    @Override
+    public JSONObject createBcPayOrder(PayOrderReqVO payOrderReqVO, TradeOrderPayDO tradeOrderPayDO, TradeMchInfoDO tradeMchInfoDO) {
+        try {
+            JSONObject paramMap = new JSONObject();
+            //支付平台主商户号
+            String customMchId = tradeOrderPayDO.getMerchantNo();
+            paramMap.set("channelId", tradeOrderPayDO.getChannelId());
+            paramMap.set("goods", payOrderReqVO.getPayParams().getParam());
+            paramMap.set("mchId", customMchId);
+            // 商户订单号
+            paramMap.set("mchOrderNo", tradeOrderPayDO.getId());
+            //分
+            paramMap.set("amount", tradeOrderPayDO.getPayAmount().multiply(new BigDecimal(100)).intValue());
+            // 币种, cny-人民币
+            paramMap.set("currency", "cny");
+            // 用户地址,IP或手机号
+            payOrderReqVO.getPayParams().setClientIp(ServletUtils.getClientIP());
+            paramMap.set("clientIp",  payOrderReqVO.getPayParams().getClientIp());
+
+            paramMap.set("msgType", payOrderReqVO.getPayParams().getMsgType());
+            //个人网银使用
+            paramMap.set("channelType", payOrderReqVO.getPayParams().getChannelType());
+            paramMap.set("returnUrl", payOrderReqVO.getPayParams().getPayReturnUrl());
+            //支付码
+            if(StringUtil.isNotEmpty(payOrderReqVO.getPayCode())) {
+                paramMap.set("payCode", payOrderReqVO.getPayCode());
+            }
+            // 主账号金额
+            paramMap.set("platformAmount", tradeOrderPayDO.getPayAmount().multiply(new BigDecimal(100)).intValue());
+
+            //设备--操作系统
+            ClientInfo clientInfo = new ClientInfo(ServletUtils.getUserAgent());
+            payOrderReqVO.getPayParams().setDevice(clientInfo.getOSName());
+            paramMap.set("device", payOrderReqVO.getPayParams().getDevice());
+
+            paramMap.set("subject",  payOrderReqVO.getPayParams().getSubject());
+            paramMap.set("body",  payOrderReqVO.getPayParams().getBody());
+            // 回调URL
+            paramMap.set("notifyUrl", payNotifyUrl.replace("payNotify", "bcPayNotify"));
+
+            //扩展参数1
+            paramMap.set("param1", tradeOrderPayDO.getPaymentType());
+            //扩展参数2
+            paramMap.set("param2", payOrderReqVO.getPayParams().getParam());
+            //过期时间
+            paramMap.set("expireTime", "1800");
+            if( payOrderReqVO.getPayParams().getExtra() == null){
+                payOrderReqVO.getPayParams().setExtra(new JSONObject());
+            }
+            JSONObject extra = payOrderReqVO.getPayParams().getExtra();
+            extra.set("openId", tradeOrderPayDO.getOpenId());
+            //ALIPAY_WAP需要的参数
+            extra.set("productId", payOrderReqVO.getPayParams().getProductId());
+            extra.set("tradeChannel", payOrderReqVO.getPayParams().getTradeChannel());
+            extra.set("tranCode", payOrderReqVO.getPayParams().getTranCode());
+
+            extra.set("appId", payOrderReqVO.getPayParams().getAppId());
+
+            // 附加参数 经纬度信息也在extra参数中
+            paramMap.set("extra", extra);
+            String reqSign = PayDigestUtil.getSign(paramMap, tradeMchInfoDO.getReqKey());
+            // 签名
+            paramMap.set("sign", reqSign);
+            String reqJsonStr = paramMap.toString();
+            String reqDataEncode = "params=" + URLEncoder.encode(reqJsonStr, "UTF-8");
+            String reqData = "params=" +reqJsonStr;
+            log.info("请求支付中心下单接口,请求数据:{}", reqData);
+            String url = baseUrl + "/pay/create_order?";
+            String result = PayUtil.call4Post(url + reqDataEncode);
+            log.info("请求支付中心下单接口({}{}),响应数据:{}", url, reqDataEncode, result);
+            Map<String, Object> retMap = JSONUtil.parseObj(result);
+            if (StrUtil.equals(SUCCESS, MapUtils.getString(retMap, "retCode"))) {
+                // 补充参数
+                paramMap.set("payOrderId", MapUtils.getString(retMap, "payOrderId"));
+                if (retMap.containsKey("payOrder")) {
+                    Object payOrderStr = retMap.get("payOrder");
+                    JSONObject payOrder = JSONUtil.parseObj(payOrderStr);
+                    if (!payOrder.isEmpty()) {
+                        retMap.put("payOrder", paramMap);
+                    }
+                }
+                //非银联支付返回的支付二维码
+                if (retMap.get("payUrl") == null && retMap.get("codeUrl") != null) {
+                    retMap.put("payUrl", retMap.get("codeUrl"));
+                }
+                retMap.put("channelId", paramMap.getStr("channelId"));
+            }
+            retMap.put("mainMid", customMchId);
+            retMap.put("channelId", paramMap.getStr("channelId"));
+            return JSONUtil.parseObj(retMap);
+        } catch (ServiceException ex) {
+            throw ex;
+        } catch (Exception ex) {
+            log.error("调用支付平台异常",ex);
+            throw exception(PAY_PLAT_UNKNOWN_EXCEPTION);
+        }
+    }
+
     @Override
     public JSONObject createRefundOrder(RefundRecordDO refundRecordDO, RefundDO refundDO, TradeOrderPayDO tradeOrderPayDO, TradeMchInfoDO tradeMchInfoDO) {
         try {

+ 186 - 4
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/pay/impl/TradeOrderPayServiceImpl.java

@@ -221,6 +221,55 @@ public class TradeOrderPayServiceImpl implements TradeOrderPayService {
         return CommonResult.error(ORDER_PAY_FAIL);
     }
 
+    @Override
+    public CommonResult<PayOrderRespVO> payBcOrder(PayOrderReqVO payOrderReqVO) {
+        try {
+            Long orderId = payOrderReqVO.getOrderId();
+            String lockKey = String.format(UPDATE_ORDER_LOCK, orderId);
+            RLock lock = redissonClient.getLock(lockKey);
+            try {
+                if (lock.tryLock(60, 90, TimeUnit.SECONDS)) {
+                    //1.获取订单信息
+                    TradeOrderDO tradeOrder = tradeOrderRepositoryService.getById(payOrderReqVO.getOrderId());
+                    if (tradeOrder == null) {
+                        Asserts.isTrue(false, "订单不存在");
+                    } else {
+                        if (payOrderReqVO.getAccountId() == null && tradeOrder.getSourceId() != null) {
+                            payOrderReqVO.setAccountId(tradeOrder.getSourceId());
+                        }
+                        if (ObjectUtil.equal(tradeOrder.getIsSupplementary(), 2)) {
+                            //重复支付
+                            Asserts.isTrue(false, "补差价已支付,不要重复操作");
+                        } else {
+                            //2.创建定金支付交易单
+                            payOrderReqVO.setPayAmount(tradeOrder.getSupplementAmount());
+                            TradeOrderPayDO tradeOrderPayDO = buildOrderPay(tradeOrder, payOrderReqVO);
+                            tradeOrderPayDO.setOrderType(PAY_ORDER_TYPE_BC);
+                            payOrderReqVO.setStoreId(tradeOrder.getStoreId());
+                            tradeOrderRepositoryService.savePayOrder(tradeOrderPayDO);
+                            payOrderReqVO.setAccountName(tradeOrder.getSourceName());
+                            return doBcPayOrder(tradeOrderPayDO, payOrderReqVO);
+                        }
+                    }
+                } else {
+                    log.error("订单支付失败,未获取到锁。orderId:{}", orderId);
+                    return CommonResult.error(GET_LOCK_EXCEPTION);
+                }
+            } finally {
+                if (lock.isHeldByCurrentThread() && lock.isLocked()) {
+                    lock.unlock();
+                }
+            }
+        } catch (ServiceException e) {
+            ExceptionUtils.log(log, "下单支付失败:", e);
+            return CommonResult.error(e);
+        } catch (Exception e) {
+            log.error("下单支付失败:", e);
+            return CommonResult.error(ORDER_PAY_FAIL);
+        }
+        return CommonResult.error(ORDER_PAY_FAIL);
+    }
+
     @Override
     public CommonResult<?> handlePayNotify(Map<String, Object> map) {
         PayNotifyReqBO payNotifyReqSourceBO = new PayNotifyReqBO();
@@ -325,6 +374,57 @@ public class TradeOrderPayServiceImpl implements TradeOrderPayService {
         return CommonResult.success(null);
     }
 
+    @Override
+    public CommonResult<?> handleBcPayNotify(Map<String, Object> map) {
+        PayNotifyReqBO payNotifyReqSourceBO = new PayNotifyReqBO();
+        final PayNotifyReqBO payNotifyReqBO = BeanUtil.fillBeanWithMap(map, payNotifyReqSourceBO, false);
+        String lockKey = String.format(UPDATE_PAY_ORDER_LOCK, Long.parseLong(payNotifyReqBO.getMchOrderNo()));
+        RLock lock = redissonClient.getLock(lockKey);
+        try {
+            if (lock.tryLock(60, 90, TimeUnit.SECONDS)) {
+                TradeOrderPayDO tradeOrderPayDO = tradeOrderRepositoryService.getPayOrderByIdIgnoreTenant(Long.parseLong(payNotifyReqBO.getMchOrderNo()));
+                //如果支付单已经变为已支付,订单有无效需要自动退,又没有退的时候,就需要把支付单状态改为0,重新推通知
+                if (ObjectUtils.equalsAny(tradeOrderPayDO.getPayStatus(), PaymentStatusEnum.PAID.getStatus(), PaymentStatusEnum.AUTO_REFUND.getStatus())) {
+                    //返回成功,让支付平台无需再推通知
+                    return CommonResult.success(null);
+                }
+                Asserts.isTrue(ObjectUtils.equalsAny(tradeOrderPayDO.getPayStatus(), PaymentStatusEnum.INIT.getStatus(), PaymentStatusEnum.UNPAID.getStatus()), "支付单{}当前状态不可更改{}", payNotifyReqBO.getMchOrderNo(), tradeOrderPayDO.getPayStatus());
+                TenantUtils.execute(tradeOrderPayDO.getTenantId(), () -> {
+                    if (StrUtil.isBlank(tradeOrderPayDO.getPaymentNo())) {
+                        tradeOrderPayDO.setPaymentNo(payNotifyReqBO.getPayOrderId());
+                    }
+                    //银行账单号
+                    tradeOrderPayDO.setBillNo(payNotifyReqBO.getBillNo());
+                    //同步银行返回的支付时间
+                    if (StrUtil.isNotBlank(payNotifyReqBO.getBillDate())) {
+                        try {
+                            tradeOrderPayDO.setPaymentDate(DateUtil.parseLocalDateTime(payNotifyReqBO.getBillDate(), DatePattern.PURE_DATETIME_PATTERN));
+                        } catch (Exception e) {
+                            log.error("支付平台返回的支付时间转换错误{}", payNotifyReqBO.getBillDate());
+                            tradeOrderPayDO.setPaymentDate(LocalDateTime.now());
+                        }
+                    }
+                    TradeOrderDO tradeOrderDO = tradeOrderRepositoryService.getById(tradeOrderPayDO.getOrderId());
+                    //更新支付单状态
+                    updatePayOrderSuccess(tradeOrderPayDO);
+                    //4.1支付成功
+                    updateBcOrderPaid(tradeOrderDO, tradeOrderPayDO);
+                });
+            }
+        } catch (ServiceException e) {
+            ExceptionUtils.log(log, "支付通知处理异常:", e);
+            return CommonResult.error(e);
+        } catch (Exception e) {
+            log.error("支付通知处理异常:{}", payNotifyReqBO.getMchOrderNo(), e);
+        } finally {
+            if (lock.isLocked() && lock.isHeldByCurrentThread()) {
+                lock.unlock();
+            }
+        }
+
+        return CommonResult.success(null);
+    }
+
     @Override
     @TenantIgnore
     public CommonResult<?> payOrderQuery(Long payOrderId) {
@@ -616,6 +716,28 @@ public class TradeOrderPayServiceImpl implements TradeOrderPayService {
         return CommonResult.success(payOrderRespVO);
     }
 
+    private CommonResult<PayOrderRespVO> doBcPayOrder(TradeOrderPayDO tradeOrderPayDO, PayOrderReqVO payOrderReqVO) {
+        PayOrderRespVO payOrderRespVO = new PayOrderRespVO().setOrderPayId(tradeOrderPayDO.getId()).setOrderId(tradeOrderPayDO.getOrderId());
+
+        if (needPayPlatCreateOrder(payOrderReqVO, tradeOrderPayDO)) {
+            //3.调用支付平台,其结果不用于更新订单状态,需要通过支付查询或者异步通知变更订单状态
+            Map result = useBcPayPlatCreatePayOrder(payOrderReqVO, tradeOrderPayDO);
+            payOrderRespVO.setPayPlatResult(result);
+            if (result != null) {
+                tradeOrderPayDO.setPayParams(JsonUtils.toJsonString(result));
+            }
+            tradeOrderRepositoryService.updatePayOrderPayParams(tradeOrderPayDO);
+        } else {
+            //4.其他支付方式
+            String tradeId = useOtherPayType(payOrderReqVO, tradeOrderPayDO);
+            tradeOrderPayDO.setPaymentNo(tradeId);
+            //4.1支付成功
+            TradeOrderDO tradeOrderDO = tradeOrderRepositoryService.getById(payOrderReqVO.getOrderId());
+            updateBcOrderPaid(tradeOrderDO,tradeOrderPayDO);
+        }
+        return CommonResult.success(payOrderRespVO);
+    }
+
     private CommonResult<?> afterPaySuccessWithHeldLock(TradeOrderPayDO tradeOrderPayDO) {
         //更新支付单状态
         updatePayOrderSuccess(tradeOrderPayDO);
@@ -700,10 +822,10 @@ public class TradeOrderPayServiceImpl implements TradeOrderPayService {
     @TradeOrderLog(operateType = TradeOrderOperateTypeEnum.ORDER_DEPOSI_PAY)
     public void updateDeposiOrderPaid(TradeOrderDO tradeOrderDO, TradeOrderPayDO tradeOrderPayDO) {
         Integer orderStatus = tradeOrderDO.getOrderStatus();
-        BigDecimal realPayAmount = (tradeOrderDO.getRealPayAmount()==null?BigDecimal.ZERO:tradeOrderDO.getRealPayAmount()).add(tradeOrderDO.getRealPayAmount());
+        BigDecimal realPayAmount = (tradeOrderDO.getRealPayAmount()==null?BigDecimal.ZERO:tradeOrderDO.getRealPayAmount()).add(tradeOrderDO.getDeposi());
         tradeOrderMapper.update(new LambdaUpdateWrapper<TradeOrderDO>()
                 .eq(TradeOrderDO::getId, tradeOrderDO.getId())
-                .eq(TradeOrderDO::getRealPayAmount, realPayAmount)
+                .set(TradeOrderDO::getRealPayAmount, realPayAmount)
                 .set(TradeOrderDO::getOrderStatus, orderStatus)
                 .set(TradeOrderDO::getDeposiStatus, 2)
                 .set(TradeOrderDO::getDeposiPayTime, LocalDateTime.now()));
@@ -711,6 +833,20 @@ public class TradeOrderPayServiceImpl implements TradeOrderPayService {
         TradeOrderLogUtils.setOrderInfo(tradeOrderDO.getId(), orderStatus, tradeOrderDO.getOrderStatus(), MapUtil.<String, Object>builder().put("payType", PayTypeEnum.valueOf(tradeOrderPayDO.getPaymentType()).getName()).put("payAmount", tradeOrderPayDO.getPayAmount()).build());
     }
 
+    @TradeOrderLog(operateType = TradeOrderOperateTypeEnum.ORDER_BC_PAY)
+    public void updateBcOrderPaid(TradeOrderDO tradeOrderDO, TradeOrderPayDO tradeOrderPayDO) {
+        Integer orderStatus = tradeOrderDO.getOrderStatus();
+        BigDecimal realPayAmount = (tradeOrderDO.getRealPayAmount()==null?BigDecimal.ZERO:tradeOrderDO.getRealPayAmount()).add(tradeOrderDO.getSupplementAmount());
+        tradeOrderMapper.update(new LambdaUpdateWrapper<TradeOrderDO>()
+                .eq(TradeOrderDO::getId, tradeOrderDO.getId())
+                .set(TradeOrderDO::getRealPayAmount, realPayAmount)
+                .set(TradeOrderDO::getOrderStatus, orderStatus)
+                .set(TradeOrderDO::getIsSupplementary, 2)
+                .set(TradeOrderDO::getUpdateTime, LocalDateTime.now()));
+        //保存订单日志
+        TradeOrderLogUtils.setOrderInfo(tradeOrderDO.getId(), orderStatus, tradeOrderDO.getOrderStatus(), MapUtil.<String, Object>builder().put("payType", PayTypeEnum.valueOf(tradeOrderPayDO.getPaymentType()).getName()).put("payAmount", tradeOrderPayDO.getPayAmount()).build());
+    }
+
     @TradeOrderLog(operateType = TradeOrderOperateTypeEnum.ORDER_PAY)
     public void updateOrderPaying(TradeOrderDO tradeOrderDO, TradeOrderPayDO tradeOrderPayDO) {
         Integer orderStatus = tradeOrderDO.getOrderStatus();
@@ -870,7 +1006,7 @@ public class TradeOrderPayServiceImpl implements TradeOrderPayService {
         TradeMchInfoDO tradeMchInfoDO = tradeOrderRepositoryService.getByMchId(mchId);
         Asserts.isTrue(tradeMchInfoDO != null, "未配置商户号信息{}", tradeMchInfoDO);
         //根据支付方式获取channelId
-        String name = tradeOrderPayDO.getOrderType() == PAY_ORDER_TYPE_TRADE ? SellMethodEnum.valueOf(tradeOrderPayDO.getSellMethod()).name() : PaySourceEnum.valueOf(tradeOrderPayDO.getSellMethod()).name();
+        String name = tradeOrderPayDO.getOrderType() == PAY_ORDER_TYPE_DEPOSI ? SellMethodEnum.valueOf(tradeOrderPayDO.getSellMethod()).name() : PaySourceEnum.valueOf(tradeOrderPayDO.getSellMethod()).name();
         String channelId = getChannelIdByPayType(tradeOrderPayDO.getOrderType(), name, PayTypeEnum.valueOf(tradeOrderPayDO.getPaymentType()), payOrderReqVO.getPayExtraType());
         if (tradeMchInfoDO != null) {
             tradeOrderPayDO.setMerchantNo(tradeMchInfoDO.getMchId());
@@ -878,7 +1014,7 @@ public class TradeOrderPayServiceImpl implements TradeOrderPayService {
         tradeOrderPayDO.setChannelId(channelId);
         tradeOrderPayDO.setOpenId(payOrderReqVO.getOpenId());
         //补充支付参数
-        if (tradeOrderPayDO.getOrderType() == PAY_ORDER_TYPE_TRADE) {
+        if (tradeOrderPayDO.getOrderType() == PAY_ORDER_TYPE_DEPOSI) {
             TradeDetailDO tradeDetailDO = tradeOrderRepositoryService.getOrderAnyDetail(tradeOrderPayDO.getOrderId());
             PayOrderReqVO.PayParams payParams = payOrderReqVO.getPayParams();
             payParams.setParam(tradeDetailDO.getProductName());
@@ -901,6 +1037,52 @@ public class TradeOrderPayServiceImpl implements TradeOrderPayService {
         return result;
     }
 
+    private Map useBcPayPlatCreatePayOrder(PayOrderReqVO payOrderReqVO, TradeOrderPayDO tradeOrderPayDO) {
+        Asserts.isTrue(payOrderReqVO.getPayParams() != null, "支付参数不能为空");
+        //获取当前租户配置的支付平台商户号
+        String mchId;
+        if (PAY_ORDER_TYPE_OTHER == tradeOrderPayDO.getOrderType()) {
+            //如果是其他支付单,获取平台配置
+            mchId = configApi.getPlatformConfigValueByKey("payPlatMchId");
+        } else {
+            //获取当前租户配置的支付平台商户号
+            mchId = configApi.getConfigValueByKey("payPlatMchId");
+        }
+        Asserts.isTrue(StrUtil.isNotBlank(mchId), "当前租户未配置商户号");
+        TradeMchInfoDO tradeMchInfoDO = tradeOrderRepositoryService.getByMchId(mchId);
+        Asserts.isTrue(tradeMchInfoDO != null, "未配置商户号信息{}", tradeMchInfoDO);
+        //根据支付方式获取channelId
+        String name = tradeOrderPayDO.getOrderType() == PAY_ORDER_TYPE_TRADE ? SellMethodEnum.valueOf(tradeOrderPayDO.getSellMethod()).name() : PaySourceEnum.valueOf(tradeOrderPayDO.getSellMethod()).name();
+        String channelId = getChannelIdByPayType(tradeOrderPayDO.getOrderType(), name, PayTypeEnum.valueOf(tradeOrderPayDO.getPaymentType()), payOrderReqVO.getPayExtraType());
+        if (tradeMchInfoDO != null) {
+            tradeOrderPayDO.setMerchantNo(tradeMchInfoDO.getMchId());
+        }
+        tradeOrderPayDO.setChannelId(channelId);
+        tradeOrderPayDO.setOpenId(payOrderReqVO.getOpenId());
+        //补充支付参数
+        if (tradeOrderPayDO.getOrderType() == PAY_ORDER_TYPE_BC) {
+            TradeDetailDO tradeDetailDO = tradeOrderRepositoryService.getOrderAnyDetail(tradeOrderPayDO.getOrderId());
+            PayOrderReqVO.PayParams payParams = payOrderReqVO.getPayParams();
+            payParams.setParam(tradeDetailDO.getProductName());
+            payParams.setSubject(payOrderReqVO.getAccountName());
+            payParams.setBody(tradeDetailDO.getProductName());
+            payParams.setProductId(tradeDetailDO.getProductId().toString());
+        }
+
+        JSONObject result = payPlatService.createBcPayOrder(payOrderReqVO, tradeOrderPayDO, tradeMchInfoDO);
+        Asserts.isTrue(StrUtil.equals(SUCCESS, MapUtils.getString(result, "retCode")), "定金支付调用支付平台失败");
+        //保存支付平台支付单号
+        String payOrderId = MapUtil.getStr(result, "payOrderId");
+        if (StrUtil.isNotBlank(payOrderId)) {
+            tradeOrderPayDO.setPaymentNo(payOrderId);
+        }
+        if (payOrderReqVO.getPayParams() != null) {
+            tradeOrderPayDO.setReqParams(JsonUtils.toJsonString(payOrderReqVO.getPayParams()));
+        }
+
+        return result;
+    }
+
     private String getChannelIdByPayType(int orderType, String name, PayTypeEnum payType, Integer payExtraType) {
         String key = name + "_" + payType.name();
         if (payExtraType != null) {

+ 2 - 0
ship-server-web/src/main/resources/application.yaml

@@ -294,6 +294,8 @@ yudao:
       - /travl-app-api/test/index # 基于名字获取租户,不许带租户编号
       - /travl-app-api/trade/orderTest # 基于名字获取租户,不许带租户编号
       - /travl-app-api/trade/payNotify
+      - /travl-app-api/trade/payBcNotify
+      - /travl-app-api/trade/payDeposiOrder
       - /travl-app-api/trade/deposiPayNotify
       - /travl-app-api/trade/refundNotify
       - /travl-app-api/system/sms/callback/aliyun