18782137998 пре 11 месеци
родитељ
комит
d3d1c5673c

+ 1 - 0
src/main/java/com/sckw/freight/config/DataSourceNames.java

@@ -12,4 +12,5 @@ public   class DataSourceNames {
     public static final String KLL = "kll";
     public static final String FREIGHT = "freight";
     public static final String SAAS = "saas";
+    public static final String PAYMENT = "payment";
 }

+ 114 - 0
src/main/java/com/sckw/freight/entity/payment/PayOrder.java

@@ -0,0 +1,114 @@
+package com.sckw.freight.entity.payment;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 支付订单
+ * </p>
+ *
+ * @author xj
+ * @since 2025-01-23
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("pay_order")
+public class PayOrder implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 用户唯一ID
+     */
+    private String uid;
+
+    /**
+     * 唯一订单号
+     */
+    private String orderNo;
+
+    private String platformNo;
+
+    /**
+     * 金额,分
+     */
+    private Integer money;
+
+    /**
+     * 支付时间
+     */
+    private LocalDateTime payTime;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+
+    /**
+     * 删除时间
+     */
+    private LocalDateTime deleteTime;
+
+    /**
+     * 支付通道
+     */
+    private String channel;
+
+    /**
+     * 余额,分
+     */
+    private Integer balance;
+
+    /**
+     * 0:关闭,1:正在使用,1:支付中
+     */
+    private Integer status;
+
+    /**
+     * 过滤器
+     */
+    private String filter;
+
+    /**
+     * 支付地址
+     */
+    private String payUrl;
+
+    /**
+     * 中信支付主体账户ID
+     */
+    private String mainAccount;
+
+    /**
+     * 单据来源1-客户端2-收银台
+     */
+    private Integer source;
+
+    /**
+     * 管理ID
+     */
+    private Integer operId;
+
+    /**
+     * 管理员名称
+     */
+    private String operName;
+
+
+}

+ 19 - 0
src/main/java/com/sckw/freight/mapper/payment/PayOrderMapper.java

@@ -0,0 +1,19 @@
+package com.sckw.freight.mapper.payment;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.sckw.freight.config.DataSourceNames;
+import com.sckw.freight.entity.payment.PayOrder;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 支付订单 Mapper 接口
+ * </p>
+ *
+ * @author xj
+ * @since 2025-01-23
+ */
+@DS(DataSourceNames.PAYMENT)
+public interface PayOrderMapper extends BaseMapper<PayOrder> {
+
+}

+ 95 - 21
src/main/java/com/sckw/freight/service/JobService.java

@@ -2,10 +2,13 @@ package com.sckw.freight.service;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.sckw.freight.entity.freight.KwpSettlementLogistics;
+import com.sckw.freight.entity.payment.PayOrder;
 import com.sckw.freight.mapper.freight.KwpLedgerLogisticsMapper;
 import com.sckw.freight.mapper.freight.KwpSettlementLogisticsMapper;
+import com.sckw.freight.mapper.payment.PayOrderMapper;
+import com.sckw.freight.model.dto.BusinessNo;
+import com.sckw.freight.model.dto.Order;
 import com.sckw.freight.model.dto.PatchPay;
-import com.sckw.freight.model.dto.PayOrderDetail;
 import com.sckw.freight.model.enums.ChannelEnum;
 import com.sckw.freight.model.enums.KwpSettlementLogisticsStatusEnum;
 import com.sckw.freight.model.po.LedgerLogisticsAndBuySellInfo;
@@ -14,9 +17,11 @@ import com.sckw.freight.service.freight.IKwpSettlementLogisticsService;
 import com.sckw.freight.util.MoneyChange;
 import com.sckw.freight.util.R;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -41,6 +46,8 @@ public class JobService {
     KwpLedgerLogisticsMapper kwpLedgerLogisticsMapper;
     @Autowired
     KwpSettlementLogisticsMapper kwpSettlementLogisticsMapper;
+    @Autowired
+    PayOrderMapper payOrderMapper;
 
     /**
      * 【轮循程序】
@@ -72,47 +79,114 @@ public class JobService {
                     LambdaQueryWrapper<KwpSettlementLogistics> settlementLogisticsLambdaQueryWrapper = new LambdaQueryWrapper<>();
                     settlementLogisticsLambdaQueryWrapper.eq(KwpSettlementLogistics::getLLedgerId, logisticsAndBuySellInfo.getId());
                     settlementLogisticsLambdaQueryWrapper.eq(KwpSettlementLogistics::getStatus, KwpSettlementLogisticsStatusEnum.Nopaid.getCode());
-                    settlementLogisticsLambdaQueryWrapper.select(KwpSettlementLogistics::getSlOrderNo);
+                    settlementLogisticsLambdaQueryWrapper.select(KwpSettlementLogistics::getSlOrderNo, KwpSettlementLogistics::getId,
+                            KwpSettlementLogistics::getRemark);
                     List<KwpSettlementLogistics> settlementLogistics = kwpSettlementLogisticsMapper.selectList(settlementLogisticsLambdaQueryWrapper);
                     if (settlementLogistics == null || settlementLogistics.isEmpty()) {
                         //没有未支付的结算信息 直接下一条
                         continue;
                     }
                     for (KwpSettlementLogistics settlementLogisticsInfo : settlementLogistics) {
+                        boolean _cz = false, _yp = false, _qf = false, _tx = false;
                         try {
 
-                            R<PayOrderDetail> details = payCenterService.getPayDetailByOrderNo(settlementLogisticsInfo.getSlOrderNo());
-                            if (details == null || details.getCode() != 200 || details.getData() == null || !details.getStatus()) {
+//                            R<PayOrderDetail> details = payCenterService.getPayDetailByOrderNo(settlementLogisticsInfo.getSlOrderNo());
+//                            if (details == null || details.getCode() != 200 || details.getData() == null || !details.getStatus()) {
+//                                continue;
+//                            }
+                            //记录先关单号,防止重复调用 (0-失败,1一成功) remark=充值状态|预付状态|清分状态|提现状态
+                            String remark = settlementLogisticsInfo.getRemark();
+                            if (!StringUtils.isBlank(remark)) {
+                                String[] split = remark.split("\\|");
+                                if (split.length == 4) {
+                                    _cz = split[0].equals("1");
+                                    _yp = split[1].equals("1");
+                                    _qf = split[2].equals("1");
+                                    _tx = split[3].equals("1");
+                                }
+                            }
+                            //只接查充值订单
+                            LambdaQueryWrapper<PayOrder> payOrderLambdaQueryWrapper = new LambdaQueryWrapper<>();
+                            payOrderLambdaQueryWrapper.eq(PayOrder::getOrderNo, settlementLogisticsInfo.getSlOrderNo());
+                            payOrderLambdaQueryWrapper.eq(PayOrder::getStatus, 1);//已支付
+                            List<PayOrder> payOrders = payOrderMapper.selectList(payOrderLambdaQueryWrapper);
+                            if (payOrders == null || payOrders.isEmpty()) {
+                                _cz = false;
                                 continue;
                             }
+                            _cz = true;
+                            PayOrder details = payOrders.get(0);
+                            BigDecimal money = MoneyChange.smallMoney(new BigDecimal(details.getMoney()));
                             //根据充值订单状态 处理结算状态
-                            if (details.getData().getStatus() == 1) {//已支付
-                                //发起预付
-                                payCenterService.advancePayApply(logisticsAndBuySellInfo.getBuyUid() , ChannelEnum.XW,
-                                        logisticsAndBuySellInfo.getSellUid() , MoneyChange.bigMoney(details.getData().getMoney()));
-
-
+                            //if (details.getData().getStatus() == 1) {//已支付
+                            if (!_yp) {                            //发起预付
+                                R<Order> orderR = payCenterService.advancePayApply(logisticsAndBuySellInfo.getBuyUid(), ChannelEnum.XW,
+                                        logisticsAndBuySellInfo.getSellUid(), MoneyChange.bigMoney(money));
+                                if (orderR == null || !orderR.getStatus() || orderR.getData() == null) {
+                                    _yp = false;
+                                    continue;
+                                }
+                                _yp = true;
+                            }
+                            if (_yp && !_qf) {
                                 // 1.记账
                                 List<PatchPay> list = new ArrayList<>();
                                 PatchPay patchPay = new PatchPay();
-                                patchPay.setUid(logisticsAndBuySellInfo.getSellUid() );
-                                patchPay.setMoney(MoneyChange.bigMoney(details.getData().getMoney()));
+                                patchPay.setUid(logisticsAndBuySellInfo.getSellUid());
+                                patchPay.setMoney(MoneyChange.bigMoney(money));
+                                patchPay.setRemark("对账单结算");
                                 list.add(patchPay);
-                                //清分
-                                payCenterService.payAgentPayV2(logisticsAndBuySellInfo.getBuyUid() , logisticsAndBuySellInfo.getSellUid() , ChannelEnum.XW,
-                                        MoneyChange.bigMoney(details.getData().getMoney()), list, settlementLogisticsInfo.getSlOrderNo(), "1");
+                                try {
 
-                                //提现
-                                payCenterService.withdrawTake(logisticsAndBuySellInfo.getSellUid() , ChannelEnum.XW,
-                                        MoneyChange.bigMoney(details.getData().getMoney()),
-                                        "");
+                                    //清分
+                                    R<BusinessNo> businessNoR = payCenterService.payAgentPayV2(logisticsAndBuySellInfo.getBuyUid(), logisticsAndBuySellInfo.getSellUid(), ChannelEnum.XW,
+                                            MoneyChange.bigMoney(money), list, settlementLogisticsInfo.getSlOrderNo(), "1");
+                                    if (businessNoR == null || !businessNoR.getStatus() || businessNoR.getData() == null) {
+                                        _qf = false;
+                                        continue;
+                                    }
+                                    _qf = true;
+                                } catch (Exception e) {
+                                    _qf = false;
+                                    log.error("发起预付异常", e);
+                                }
 
-                                //修改结算单状态
-                                iKwpSettlementLogisticsService.updateSettlementLogisticsStatusPaid(settlementLogisticsInfo, details.getData());
                             }
+                            if (_qf && !_tx) {
+                                try {
+                                    //提现
+                                    R<Order> withdrawTake = payCenterService.withdrawTake(logisticsAndBuySellInfo.getSellUid(), ChannelEnum.XW,
+                                            MoneyChange.bigMoney(money),
+                                            "提现");
+                                    if (withdrawTake == null || !withdrawTake.getStatus() || withdrawTake.getData() == null) {
+                                        _tx = false;
+                                        continue;
+                                    }
+                                    _tx = true;
+
+                                } catch (Exception e) {
+                                    _tx = false;
+                                    continue;
+                                }
+                            }
+                            if (_tx) {
+                                //修改结算单状态
+                                iKwpSettlementLogisticsService.updateSettlementLogisticsStatusPaid(settlementLogisticsInfo, details);
+                            }    // }
                         } catch (Exception e) {
                             log.error("获取/处理 充值详情异常", e);
                         }
+                        finally {
+                            try {
+                                KwpSettlementLogistics newSetlementLogistics = new KwpSettlementLogistics();
+                                newSetlementLogistics.setId(settlementLogisticsInfo.getId());
+                                String remark =(_cz?"1":"0")+"|"+(_yp?"1":"0")+"|"+(_qf?"1":"0")+"|"+(_tx?"1":"0");
+                                newSetlementLogistics.setRemark(remark);
+                                kwpSettlementLogisticsMapper.updateById(newSetlementLogistics);
+                            } catch (Exception e) {
+                                log.error("修改结算单状态异常", e);
+                            }
+                        }
                     }
                 } catch (Exception e) {
                     log.error("【" + logisticsAndBuySellInfo.getId() + "】轮循任务执行失败", e);

+ 2 - 2
src/main/java/com/sckw/freight/service/freight/IKwpSettlementLogisticsService.java

@@ -3,7 +3,7 @@ package com.sckw.freight.service.freight;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.sckw.freight.entity.freight.KwpLedgerLogistics;
 import com.sckw.freight.entity.freight.KwpSettlementLogistics;
-import com.sckw.freight.model.dto.PayOrderDetail;
+import com.sckw.freight.entity.payment.PayOrder;
 import com.sckw.freight.model.enums.KwpSettlementLogisticsStatusEnum;
 import com.sckw.freight.model.vo.request.RequestSettlementLogisticsPageInfo;
 import com.sckw.freight.model.vo.response.ResponsePageData;
@@ -28,5 +28,5 @@ public interface IKwpSettlementLogisticsService extends IService<KwpSettlementLo
 
     void saveSettlementLogistics(KwpLedgerLogistics logistics, BigDecimal price, String slOrderNo, KwpSettlementLogisticsStatusEnum status, LocalDateTime payTime, Long userid);
 
-    void updateSettlementLogisticsStatusPaid(KwpSettlementLogistics kwpSettlementLogistics, PayOrderDetail payOrderDetail);
+    void updateSettlementLogisticsStatusPaid(KwpSettlementLogistics kwpSettlementLogistics, PayOrder payOrderDetail);
 }

+ 3 - 3
src/main/java/com/sckw/freight/service/freight/impl/KwpLedgerLogisticsServiceImpl.java

@@ -349,9 +349,9 @@ public class KwpLedgerLogisticsServiceImpl extends ServiceImpl<KwpLedgerLogistic
             requestSaveLedgerSettlementInfo.setDeductPrice(BigDecimal.ZERO);
         }
         //不能小于0
-        if (requestSaveLedgerSettlementInfo.getDeductPrice().compareTo(BigDecimal.ZERO) < 0) {
-            throw new RuntimeException("对账单的扣减金额不能小于0");
-        }
+//        if (requestSaveLedgerSettlementInfo.getDeductPrice().compareTo(BigDecimal.ZERO) < 0) {
+//            throw new RuntimeException("对账单的扣减金额不能小于0");
+//        }
         //验证对应的订单是否在该企业下 ,且状态是完结
         LambdaQueryWrapper<KllOrder> wrapper = new LambdaQueryWrapper<>();
         wrapper.in(KllOrder::getId, requestSaveLedgerSettlementInfo.getOrderIds());

+ 5 - 4
src/main/java/com/sckw/freight/service/freight/impl/KwpSettlementLogisticsServiceImpl.java

@@ -5,8 +5,8 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.sckw.freight.entity.freight.KwpLedgerLogistics;
 import com.sckw.freight.entity.freight.KwpSettlementLogistics;
+import com.sckw.freight.entity.payment.PayOrder;
 import com.sckw.freight.mapper.freight.KwpSettlementLogisticsMapper;
-import com.sckw.freight.model.dto.PayOrderDetail;
 import com.sckw.freight.model.enums.DelFlagEnum;
 import com.sckw.freight.model.enums.KwpSettlementLogisticsStatusEnum;
 import com.sckw.freight.model.vo.request.RequestSettlementLogisticsPageInfo;
@@ -15,6 +15,7 @@ import com.sckw.freight.model.vo.response.ResponseSettlementLogistics;
 import com.sckw.freight.service.freight.IKwpLedgerLogisticsService;
 import com.sckw.freight.service.freight.IKwpSettlementLogisticsService;
 import com.sckw.freight.util.DateTimeUtil;
+import com.sckw.freight.util.MoneyChange;
 import com.sckw.freight.util.R;
 import com.sckw.freight.util.SnowflakeIdUtil;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -178,13 +179,13 @@ public class KwpSettlementLogisticsServiceImpl extends ServiceImpl<KwpSettlement
      * @return: null
      **/
     @Override
-    public void updateSettlementLogisticsStatusPaid(KwpSettlementLogistics kwpSettlementLogistics, PayOrderDetail payOrderDetail) {
+    public void updateSettlementLogisticsStatusPaid(KwpSettlementLogistics kwpSettlementLogistics, PayOrder payOrderDetail) {
         KwpSettlementLogistics newSettlementLogistics = new KwpSettlementLogistics();
         newSettlementLogistics.setId(kwpSettlementLogistics.getId());
         newSettlementLogistics.setStatus(KwpSettlementLogisticsStatusEnum.Paid.getCode());
         newSettlementLogistics.setUpdateTime(payOrderDetail.getPayTime());
-        newSettlementLogistics.setActualPrice(payOrderDetail.getMoney());
-        newSettlementLogistics.setTotalPrice(payOrderDetail.getMoney());
+        newSettlementLogistics.setActualPrice(MoneyChange.smallMoney(new BigDecimal(payOrderDetail.getMoney())) );
+        newSettlementLogistics.setTotalPrice(MoneyChange.smallMoney(new BigDecimal(payOrderDetail.getMoney())) );
         boolean update = updateById(newSettlementLogistics);
         if (!update) throw new RuntimeException("更新结算单状态为已支付失败");
     }

+ 16 - 0
src/main/java/com/sckw/freight/service/payment/IPayOrderService.java

@@ -0,0 +1,16 @@
+package com.sckw.freight.service.payment;
+
+import com.sckw.freight.entity.payment.PayOrder;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 支付订单 服务类
+ * </p>
+ *
+ * @author xj
+ * @since 2025-01-23
+ */
+public interface IPayOrderService extends IService<PayOrder> {
+
+}

+ 20 - 0
src/main/java/com/sckw/freight/service/payment/impl/PayOrderServiceImpl.java

@@ -0,0 +1,20 @@
+package com.sckw.freight.service.payment.impl;
+
+import com.sckw.freight.entity.payment.PayOrder;
+import com.sckw.freight.mapper.payment.PayOrderMapper;
+import com.sckw.freight.service.payment.IPayOrderService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 支付订单 服务实现类
+ * </p>
+ *
+ * @author xj
+ * @since 2025-01-23
+ */
+@Service
+public class PayOrderServiceImpl extends ServiceImpl<PayOrderMapper, PayOrder> implements IPayOrderService {
+
+}

+ 5 - 0
src/main/resources/application-dev.yml

@@ -24,6 +24,11 @@ spring:
           url: jdbc:mysql://10.10.10.230:3306/saas?useUnicode=true&characterEncoding=utf8&allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull
           username: saas
           password: saas
+        payment:
+          driver-class-name: com.mysql.cj.jdbc.Driver
+          url: jdbc:mysql://10.10.10.230:3306/payment?useUnicode=true&characterEncoding=utf8&allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull
+          username: payment
+          password: payment
 
 #  data:
 #    redis:

+ 7 - 1
src/main/resources/application-pro.yml

@@ -25,6 +25,12 @@ spring:
           url: jdbc:mysql://rm-2vcw922e20158115lvo.mysql.cn-chengdu.rds.aliyuncs.com:3306/shyj_saas?useUnicode=true&characterEncoding=utf8&allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull
           username: shyj_saas
           password: yTkjJ#1DmqQkfx2@hv1N3o0
+        payment:
+          driver-class-name: com.mysql.cj.jdbc.Driver
+          url: jdbc:mysql://rm-2vcw922e20158115lvo.mysql.cn-chengdu.rds.aliyuncs.com:3306/shyj_pay_platform?useUnicode=true&characterEncoding=utf8&allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull
+          username: shyj_pay_platform
+          password: shyj_payment@2025KwfeZbLH
+
 #  data:
 #    redis:
 #      host: 10.10.10.221
@@ -55,4 +61,4 @@ payCenter:
 #轮循任务 间隔时长(秒)
 job:
   sleep: 5
-  enable: false
+  enable: true

+ 5 - 0
src/main/resources/application-test.yml

@@ -25,6 +25,11 @@ spring:
           url: jdbc:mysql://10.10.10.221:3306/saas?useUnicode=true&characterEncoding=utf8&allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull
           username: saas
           password: saas
+        payment:
+          driver-class-name: com.mysql.cj.jdbc.Driver
+          url: jdbc:mysql://10.10.10.221:3306/payment?useUnicode=true&characterEncoding=utf8&allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull
+          username: payment
+          password: payment
 #  data:
 #    redis:
 #      host: 10.10.10.221

+ 1 - 1
src/main/resources/com/sckw/freight/mapper/freight/KwpLedgerLogisticsMapper.xml

@@ -15,7 +15,7 @@
             resultType="com.sckw.freight.model.po.LedgerLogisticsAndBuySellInfo">
         SELECT
             t.*,
-            rs.uid by_uid,
+            rs.uid buy_uid,
             rp.uid sell_uid
         FROM
             kwp_ledger_logistics t

+ 5 - 0
src/main/resources/com/sckw/freight/mapper/payment/PayOrderMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.sckw.freight.mapper.payment.PayOrderMapper">
+
+</mapper>