xucaiqin 2 лет назад
Родитель
Сommit
5158e2242c

+ 30 - 3
sckw-modules/sckw-payment/src/main/java/com/sckw/payment/controller/WalletController.java

@@ -1,13 +1,23 @@
 package com.sckw.payment.controller;
 
+import com.alibaba.fastjson2.JSON;
+import com.sckw.core.utils.UUIDUtils;
+import com.sckw.core.web.context.LoginUserHolder;
 import com.sckw.core.web.response.HttpResult;
 import com.sckw.payment.model.vo.req.*;
 import com.sckw.payment.service.WalletService;
+import com.sckw.stream.enums.MessageEnum;
+import com.sckw.stream.model.SckwMessage;
 import jakarta.annotation.Resource;
 import jakarta.validation.Valid;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.cloud.stream.function.StreamBridge;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.ArrayList;
+import java.util.HashMap;
+
 /**
  * 钱包
  *
@@ -17,10 +27,26 @@ import org.springframework.web.bind.annotation.*;
 @Validated
 @RestController
 @RequestMapping("/wallet")
+@Slf4j
 public class WalletController {
     @Resource
     private WalletService walletService;
-
+    @Resource
+    private StreamBridge streamBridge;
+    @GetMapping("test")
+    public HttpResult test() {
+        SckwMessage msg = new SckwMessage();
+        msg.setRequestId(UUIDUtils.get32UUID())
+                .setMessageEnum(MessageEnum.ORDER_INITIATE_SALE)
+                .setParams(new HashMap<>())
+                .setMsgUrl("")
+                .setUserInfos(new ArrayList<>())
+                .setCreateBy(LoginUserHolder.getUserId());
+        log.info("有新的提醒消息:{}", JSON.toJSONString(msg));
+        streamBridge.send("sckw-message", JSON.toJSONString(msg));
+
+        return HttpResult.ok();
+    }
     /**
      * 钱包总览信息
      *
@@ -92,7 +118,7 @@ public class WalletController {
      * @return
      */
     @PostMapping("transfer")
-    public HttpResult transfer(TransferReq transferReq) {
+    public HttpResult transfer(@RequestBody @Valid TransferReq transferReq) {
         return HttpResult.ok(walletService.transfer(transferReq));
     }
 
@@ -169,7 +195,7 @@ public class WalletController {
      * @return
      */
     @PostMapping("prePayAppend")
-    public HttpResult prePayAppend(@RequestBody @Valid PrePay prePay) {
+    public HttpResult prePayAppend(@RequestBody @Valid PrePayAppend prePay) {
         return HttpResult.ok(walletService.prePayAppend(prePay));
     }
 
@@ -183,6 +209,7 @@ public class WalletController {
     public HttpResult applyRefund(@RequestBody @Valid RefundReq refundReq) {
         return HttpResult.ok(walletService.applyRefund(refundReq));
     }
+
     /**
      * 退款
      *

+ 1 - 1
sckw-modules/sckw-payment/src/main/java/com/sckw/payment/model/constant/PayCenterEnum.java

@@ -14,7 +14,6 @@ public enum PayCenterEnum {
     MEMBER_WALLET("/v1/member/wallet", "钱包清单"),
     MEMBER_WALLET_V2("/v2/member/wallet", "钱包清单"),
     MEMBER_GENERAL("/v2/wallet/general", "总览信息"),
-
     WITHDRAW_DETAIL("/v1/wallet/withdraw/detail", "提现详情"),
     //    WITHDRAW_INDEX("/v1/wallet/withdraw/index", "提现清单"), 原接口
     WITHDRAW_INDEX("/v2/wallet/withdraw/index", "提现清单"),
@@ -43,6 +42,7 @@ public enum PayCenterEnum {
     WALLET_UNFREEZE("/v1/wallet/unfreeze", "解冻金额"),
     PAY_AGENT_PAY("/v1/pay/agent_pay", "清分"),
     PAY_AGENT_PAY_V2("/v2/pay/agent_pay", "清分"),
+    AGENT_PAY_QUERY("/v2/pay/status/query", "清分结果查询"),
     WALLET_INDEX("/v1/wallet/index", "创建钱包");
     private final String addr;
     private final String desc;

+ 2 - 2
sckw-modules/sckw-payment/src/main/java/com/sckw/payment/model/constant/RefundEnum.java

@@ -9,11 +9,11 @@ import java.util.Objects;
  * @date 2023-07-11 12:00:52
  */
 public enum RefundEnum {
-    ALL(0, "全部", "0"),
     APPLY(1, "申请退款", "1"),
     REFUNDING(2, "退款中", "2"),
     FAILED(3, "退款失败", "3"),
-    BACK(4, "退款驳回", "4");
+    BACK(4, "退款驳回", "4"),
+    SUCCESS(5,"退款成功","5");
 
     private final int status;
     private final String desc;

+ 52 - 0
sckw-modules/sckw-payment/src/main/java/com/sckw/payment/model/constant/TransferEnum.java

@@ -0,0 +1,52 @@
+package com.sckw.payment.model.constant;
+
+import java.util.Objects;
+
+/**
+ * 转账枚举
+ *
+ * @author xucaiqin
+ * @date 2023-07-11 12:00:52
+ */
+public enum TransferEnum {
+    APPLY(1, "已提交", "1"),
+    TRANSFERRING(2, "转帐中", "2"),
+    FAILED(3, "转账失败", "3"),
+    SUCCESS(4, "转账成功", "4");
+
+    private final int status;
+    private final String desc;
+    private final String label;
+
+    TransferEnum(int status, String desc, String label) {
+        this.status = status;
+        this.label = label;
+        this.desc = desc;
+    }
+
+    public static String getDesc(Integer status) {
+        if (Objects.isNull(status)) {
+            return "";
+        }
+        for (TransferEnum value : values()) {
+            if (status == value.getStatus()) {
+                return value.getDesc();
+            }
+        }
+        return "";
+    }
+
+    public String getLabel() {
+        return label;
+    }
+
+    public int getStatus() {
+        return status;
+    }
+
+
+    public String getDesc() {
+        return desc;
+    }
+
+}

+ 7 - 0
sckw-modules/sckw-payment/src/main/java/com/sckw/payment/model/dto/page/PrePayWalletPage.java

@@ -1,5 +1,6 @@
 package com.sckw.payment.model.dto.page;
 
+import com.alibaba.fastjson2.annotation.JSONField;
 import com.sckw.payment.model.dto.common.Page;
 import com.sckw.payment.model.dto.wallet.PrePayWallet;
 import lombok.Getter;
@@ -16,4 +17,10 @@ import java.io.Serial;
 public class PrePayWalletPage extends Page<PrePayWallet> {
     @Serial
     private static final long serialVersionUID = 8374847700935135347L;
+    @JSONField(name = "ap_money")
+    private long apMoney;
+    @JSONField(name = "using_ap_money")
+    private long usingApMoney;
+    @JSONField(name = "total_ap_money")
+    private long totalApMoney;
 }

+ 67 - 0
sckw-modules/sckw-payment/src/main/java/com/sckw/payment/model/vo/PrePayWalletVo.java

@@ -0,0 +1,67 @@
+package com.sckw.payment.model.vo;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 预付预收数据
+ */
+@Getter
+@Setter
+public class PrePayWalletVo implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 7340075510663637767L;
+    /**
+     * 预付时,代表付款人
+     * 预收时,代表收款人
+     */
+    @JSONField(name = "uid")
+    private String uid;
+    /**
+     * 预付时,代表收款人
+     * 预收时,代表付款人
+     */
+    @JSONField(name = "filter")
+    private String filter;
+
+    @JSONField(name = "channel")
+    private String channel;
+
+    @JSONField(name = "channel_label")
+    private String channelLabel;
+    /**
+     * 预付金额
+     */
+    @JSONField(name = "ap_money")
+    private String apMoney;
+    /**
+     * 退款中
+     */
+    @JSONField(name = "refund_ap_money")
+    private String refundApMoney;
+    /**
+     * 使用中
+     */
+    @JSONField(name = "using_ap_money")
+    private String usingApMoney;
+    /**
+     * 结算中
+     */
+    @JSONField(name = "settling_ap_money")
+    private String settlingApMoney;
+    /**
+     * 总预付金额
+     */
+    @JSONField(name = "total_ap_money")
+    private String totalApMoney;
+    /**
+     * 相关操作
+     */
+    private String action;
+
+
+}

+ 3 - 6
sckw-modules/sckw-payment/src/main/java/com/sckw/payment/model/vo/req/PrePay.java

@@ -20,16 +20,13 @@ import java.math.BigDecimal;
 @Setter
 public class PrePay implements MoneyChange {
     /**
-     * 支付通道 huifu
+     * 支付通道 字典值
      */
     @NotBlank(message = "支付通道不能为空")
     private String channel;
 
-    @NotBlank(message = "uid不能为空")
-    private String uid;
-
-    @NotBlank(message = "filter不能为空")
-    private String filter;
+    @NotBlank(message = "合作企业不能为空")
+    private String entId;
 
     @Positive(message = "提现金额必须大于0")
     @Digits(message = "小数位数过长或金额过大", integer = 10, fraction = 2)

+ 41 - 0
sckw-modules/sckw-payment/src/main/java/com/sckw/payment/model/vo/req/PrePayAppend.java

@@ -0,0 +1,41 @@
+package com.sckw.payment.model.vo.req;
+
+import com.sckw.payment.model.vo.res.MoneyChange;
+import jakarta.validation.constraints.Digits;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.Positive;
+import jakarta.validation.constraints.Size;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * 预付追加
+ *
+ * @author xucaiqin
+ * @date 2023-08-29 09:14:04
+ */
+@Getter
+@Setter
+public class PrePayAppend implements MoneyChange {
+    /**
+     * 支付通道 huifu
+     */
+    @NotBlank(message = "支付通道不能为空")
+    private String channel;
+
+    @NotBlank(message = "uid不能为空")
+    private String uid;
+
+    @NotBlank(message = "filter不能为空")
+    private String filter;
+
+    @Positive(message = "提现金额必须大于0")
+    @Digits(message = "小数位数过长或金额过大", integer = 10, fraction = 2)
+    private BigDecimal money;
+
+    @Size(message = "备注不能超过200字")
+    private String remark;
+
+}

+ 2 - 2
sckw-modules/sckw-payment/src/main/java/com/sckw/payment/model/vo/req/PrePayCheck.java

@@ -18,6 +18,6 @@ public class PrePayCheck {
      */
     @NotBlank(message = "支付通道不能为空")
     private String channel;
-    @NotBlank(message = "filter不能为空")
-    private String filter;
+    @NotBlank(message = "合作企业不能为空")
+    private String entId;
 }

+ 61 - 29
sckw-modules/sckw-payment/src/main/java/com/sckw/payment/service/PayCenterService.java

@@ -118,7 +118,7 @@ public class PayCenterService {
                         okHttpUtils.addPara(k + "[" + i + "]", l[i]);
                     }
                 } else {
-                    okHttpUtils.addBodyPara(k, v.toString());
+                    okHttpUtils.addBodyPara(k, JSONObject.toJSONString(v));
                 }
             }
         }
@@ -133,6 +133,22 @@ public class PayCenterService {
         return changeRes(sync);
     }
 
+    private String jsonHttp(PayCenterEnum payCenterEnum, Object object) {
+        String para = object instanceof JSONObject jsonObject ? jsonObject.toJSONString() : JSONObject.toJSONString(object);
+        log.debug("{}入参->{}", payCenterEnum.getDesc(), para);
+        OkHttpUtils okHttpUtils = OkHttpUtils.builder().url(payCenterAddr + payCenterEnum.getAddr());
+        okHttpUtils.addBodyJsonStr(para);
+        String sync;
+        try {
+            sync = okHttpUtils.post(true).sync();
+        } catch (Exception e) {
+            log.error("中台服务异常", e.getCause());
+            throw new RuntimeException("支付服务异常!");
+        }
+        log.debug("{}返回值->{}", payCenterEnum.getDesc(), sync);
+        return changeRes(sync);
+    }
+
     private String changeRes(String sync) {
         JSONObject jsonObject = JSONObject.parseObject(sync);
         //我的泛型是对象 返回值有可能 是对象或数组 {} []
@@ -658,6 +674,23 @@ public class PayCenterService {
         });
     }
 
+    /**
+     * 清分结果查询
+     *
+     * @param uid
+     * @param channel
+     * @param businessNo
+     * @return
+     */
+    public R<List<SplitDto>> agentPayQuery(String uid, ChannelEnum channel, String businessNo) {
+        String sync = getHttp(PayCenterEnum.AGENT_PAY_QUERY, new HashMap<>() {{
+            put("uid", uid);
+            put("channel", channel);
+            put("business_no", businessNo);
+        }});
+        return parseArray(sync, SplitDto.class);
+    }
+
     /**
      * 创建/更新账户
      *
@@ -665,9 +698,8 @@ public class PayCenterService {
      * @return
      */
     public R<MemberRes> memberIndex(MemberCreate memberCreate) {
-        Map<String, Object> map = JSONObject.parseObject(JSONObject.toJSONString(memberCreate), new TypeReference<>() {
-        });
-        String sync = postHttp(PayCenterEnum.MEMBER_INDEX, map);
+
+        String sync = jsonHttp(PayCenterEnum.MEMBER_INDEX, memberCreate);
         return JSONObject.parseObject(sync, new TypeReference<>() {
         });
     }
@@ -683,8 +715,8 @@ public class PayCenterService {
      */
     public R<PayIndex> payIndex(String buyUid, String sellUid, ChannelEnum channel, Long money) {
         String sync = postHttp(PayCenterEnum.PAY_INDEX, new HashMap<>() {{
-            put("buyUid", buyUid);
-            put("sellUid", sellUid);
+            put("buy_uid", buyUid);
+            put("sell_uid", sellUid);
             put("channel", channel);
             put("money", money);
         }});
@@ -747,14 +779,14 @@ public class PayCenterService {
      * @return
      */
     public R<BusinessNo> payAgentPay(String buyUid, String sellUid, ChannelEnum channel, Long money, List<PatchPay> batchPayList, String businessNo) {
-        String sync = postHttp(PayCenterEnum.PAY_AGENT_PAY, new HashMap<>() {{
-            put("buy_uid", buyUid);
-            put("sell_uid", sellUid);
-            put("channel", channel);
-            put("money", money);
-            put("batch_pay_list", JSONObject.toJSONString(batchPayList));
-            put("business_no", businessNo);
-        }});
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("buy_uid", buyUid);
+        jsonObject.put("sell_uid", sellUid);
+        jsonObject.put("channel", channel.getChannel());
+        jsonObject.put("money", money);
+        jsonObject.put("batch_pay_list", batchPayList);
+        jsonObject.put("business_no", businessNo);
+        String sync = jsonHttp(PayCenterEnum.PAY_AGENT_PAY, jsonObject);
         return JSONObject.parseObject(sync, new TypeReference<>() {
         });
     }
@@ -762,25 +794,25 @@ public class PayCenterService {
     /**
      * 清分
      *
-     * @param buyUid 付款方uid
-     * @param sellUid 收款方
-     * @param channel
-     * @param money 总清分金额
+     * @param buyUid       付款方uid
+     * @param sellUid      收款方
+     * @param channel      渠道
+     * @param money        总清分金额
      * @param batchPayList 收款方集合
-     * @param businessNo 流水号
-     * @param payType 支付类型 0-默认 1-仅预付支付 2-仅余额支付
+     * @param businessNo   流水号
+     * @param payType      支付类型 0-默认 1-仅预付支付 2-仅余额支付
      * @return
      */
     public R<BusinessNo> payAgentPayV2(String buyUid, String sellUid, ChannelEnum channel, Long money, List<PatchPay> batchPayList, String businessNo, String payType) {
-        String sync = postHttp(PayCenterEnum.PAY_AGENT_PAY_V2, new HashMap<>() {{
-            put("buy_uid", buyUid);
-            put("sell_uid", sellUid);
-            put("channel", channel);
-            put("money", money);
-            put("batch_pay_list", JSONObject.toJSONString(batchPayList));
-            put("business_no", businessNo);
-            put("pay_type", payType);
-        }});
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("buy_uid", buyUid);
+        jsonObject.put("sell_uid", sellUid);
+        jsonObject.put("channel", Objects.nonNull(channel) ? channel.getChannel() : "");
+        jsonObject.put("money", money);
+        jsonObject.put("batch_pay_list", batchPayList);
+        jsonObject.put("business_no", businessNo);
+        jsonObject.put("pay_type", payType);
+        String sync = jsonHttp(PayCenterEnum.PAY_AGENT_PAY_V2, jsonObject);
         return JSONObject.parseObject(sync, new TypeReference<>() {
         });
     }

+ 142 - 31
sckw-modules/sckw-payment/src/main/java/com/sckw/payment/service/WalletService.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.sckw.core.common.enums.NumberConstant;
 import com.sckw.core.exception.BusinessException;
+import com.sckw.core.model.constant.Global;
 import com.sckw.core.model.page.PageRes;
 import com.sckw.core.utils.CollectionUtils;
 import com.sckw.core.utils.IdWorker;
@@ -12,20 +13,27 @@ import com.sckw.core.web.context.LoginUserHolder;
 import com.sckw.manage.api.RemoteManageService;
 import com.sckw.manage.api.model.dto.res.FindEntCooperateResVo;
 import com.sckw.payment.api.model.constant.ChannelEnum;
-import com.sckw.payment.api.model.dto.*;
-import com.sckw.payment.model.dto.common.BusinessNo;
+import com.sckw.payment.api.model.dto.WalletDto;
 import com.sckw.payment.api.model.dto.common.R;
-import com.sckw.payment.model.dto.page.CashPage;
-import com.sckw.payment.model.dto.page.PrePayWalletPage;
 import com.sckw.payment.dao.KwpWalletRefundMapper;
+import com.sckw.payment.dao.KwpWalletTransferMapper;
 import com.sckw.payment.job.AsyncPool;
 import com.sckw.payment.model.KwpWalletRefund;
+import com.sckw.payment.model.KwpWalletTransfer;
 import com.sckw.payment.model.constant.RefundEnum;
+import com.sckw.payment.model.constant.TransferEnum;
+import com.sckw.payment.model.dto.common.BusinessNo;
+import com.sckw.payment.model.dto.page.CashPage;
+import com.sckw.payment.model.dto.page.PrePayWalletPage;
 import com.sckw.payment.model.dto.wallet.*;
+import com.sckw.payment.model.vo.PrePayWalletVo;
 import com.sckw.payment.model.vo.req.*;
+import com.sckw.payment.model.vo.res.ApPageRes;
 import com.sckw.payment.model.vo.res.FundVo;
 import com.sckw.payment.model.vo.res.MorePageRes;
 import com.sckw.payment.model.vo.res.WalletDetail;
+import com.sckw.redis.config.RedisLockUtil;
+import com.sckw.redis.constant.RedisLockKey;
 import com.sckw.system.api.RemoteSystemService;
 import com.sckw.system.api.model.dto.res.EntCacheResDto;
 import lombok.RequiredArgsConstructor;
@@ -57,6 +65,8 @@ public class WalletService {
     private final PayCenterService payCenterService;
     private final KwpWalletRelationService walletRelationService;
     private final KwpWalletRefundMapper kwpWalletRefundMapper;
+    private final KwpWalletTransferMapper transferMapper;
+    private final RedisLockUtil redisLockUtil;
     @DubboReference(version = "1.0.0", group = "design", check = false)
     private RemoteSystemService remoteSystemService;
     @DubboReference(version = "1.0.0", group = "design", check = false)
@@ -132,6 +142,32 @@ public class WalletService {
         return df.format(money / 100.0D);
     }
 
+    /**
+     * 退款中金额和相关操作
+     *
+     * @param change 是否需要转换预付人与预收人
+     * @return
+     */
+    private void refundMoney(PrePayWallet prePayWallet, PrePayWalletVo prePayWalletVo, boolean change) {
+        DecimalFormat df = new DecimalFormat("0.00");
+        LambdaQueryWrapper<KwpWalletRefund> wrapper = new LambdaQueryWrapper<>();
+        //预收时,切换预收预付的双方人员
+        if (change) {
+            wrapper.eq(KwpWalletRefund::getUid, prePayWallet.getFilter()).eq(KwpWalletRefund::getFilter, prePayWallet.getUid());
+        } else {
+            wrapper.eq(KwpWalletRefund::getUid, prePayWallet.getUid()).eq(KwpWalletRefund::getFilter, prePayWallet.getFilter());
+        }
+        wrapper.eq(KwpWalletRefund::getChannel, prePayWallet.getChannel()).eq(KwpWalletRefund::getStatus, RefundEnum.REFUNDING.getStatus()).last("limit 1");
+        KwpWalletRefund kwpWalletRefund = kwpWalletRefundMapper.selectOne(wrapper);
+        if (Objects.nonNull(kwpWalletRefund)) {
+            prePayWalletVo.setRefundApMoney(df.format(kwpWalletRefund.getActualMoney()));
+            prePayWalletVo.setAction(RefundEnum.getDesc(kwpWalletRefund.getStatus()));
+        } else {
+            prePayWalletVo.setRefundApMoney("0.00");
+            prePayWalletVo.setAction("");
+        }
+    }
+
     /**
      * 钱包总览信息
      *
@@ -280,7 +316,7 @@ public class WalletService {
         if (StringUtils.isBlank(filter)) {
             throw new BusinessException("合作单位暂未开通电子钱包");
         }
-        ChannelEnum channelEnum = ChannelEnum.getByValue(addWalletReq.getChannel());
+        ChannelEnum channelEnum = ChannelEnum.getByChannel(addWalletReq.getChannel());
         if (Objects.isNull(channelEnum)) {
             throw new BusinessException("支付通道不存在");
         }
@@ -352,22 +388,54 @@ public class WalletService {
      */
     public Object transfer(TransferReq transferReq) {
         log.info("转账:{}", JSONObject.toJSONString(transferReq));
-        ChannelEnum channelEnum = ChannelEnum.getByChannel(transferReq.getChannel());
-        if (Objects.isNull(channelEnum)) {
-            throw new BusinessException("支付通道不存在");
-        }
-        List<PatchPay> list = new ArrayList<>();
-        PatchPay patchPay = new PatchPay();
-        patchPay.setUid(transferReq.getFilter());
-        patchPay.setMoney(transferReq.bigMoney(transferReq.getMoney()));
-        patchPay.setRemark(transferReq.getRemark());
-        list.add(patchPay);
-        R<BusinessNo> businessNoR1 = payCenterService.payAgentPayV2(transferReq.getUid(), transferReq.getFilter(),
-                channelEnum, transferReq.bigMoney(transferReq.getMoney()), list, OrderUtils.generateOrderNo("TF"), "2");
-        if (!businessNoR1.getStatus()) {
-            throw new BusinessException(StringUtils.isNotBlank(businessNoR1.getMsg()) ? businessNoR1.getMsg() : "转账失败");
+        String key = RedisLockKey.TRANSFER + transferReq.getUid() + ":" + transferReq.getFilter();
+        if (redisLockUtil.tryLock(key)) {
+            try {
+                ChannelEnum channelEnum = ChannelEnum.getByChannel(transferReq.getChannel());
+                if (Objects.isNull(channelEnum)) {
+                    throw new BusinessException("支付通道不存在");
+                }
+                String orderNo = OrderUtils.generateOrderNo("TF");
+                KwpWalletTransfer walletTransfer = new KwpWalletTransfer();
+                walletTransfer.setId(new IdWorker(NumberConstant.ONE).nextId());
+                walletTransfer.setOrderNo(orderNo);
+                walletTransfer.setUid(transferReq.getUid());
+                walletTransfer.setFromEnt(walletRelationService.getEnt(transferReq.getUid()));
+                walletTransfer.setFilter(transferReq.getFilter());
+                walletTransfer.setToEnt(walletRelationService.getEnt(transferReq.getFilter()));
+                walletTransfer.setChannel(transferReq.getChannel());
+                walletTransfer.setMoney(transferReq.getMoney());
+                walletTransfer.setRemark(transferReq.getRemark());
+                walletTransfer.setCreateBy(LoginUserHolder.getUserId());
+                walletTransfer.setCreateTime(LocalDateTime.now());
+                walletTransfer.setUpdateBy(LoginUserHolder.getUserId());
+                walletTransfer.setUpdateTime(LocalDateTime.now());
+                walletTransfer.setDelFlag(Global.UN_DELETED);
+                //默认已提交
+                walletTransfer.setStatus(TransferEnum.APPLY.getStatus());
+
+                List<PatchPay> list = new ArrayList<>();
+                PatchPay patchPay = new PatchPay();
+                patchPay.setUid(transferReq.getFilter());
+                patchPay.setMoney(transferReq.bigMoney(transferReq.getMoney()));
+                patchPay.setRemark(transferReq.getRemark());
+                list.add(patchPay);
+                R<BusinessNo> businessNoR1 = payCenterService.payAgentPayV2(transferReq.getUid(), transferReq.getFilter(), channelEnum, transferReq.bigMoney(transferReq.getMoney()), list, orderNo, "2");
+                if (!businessNoR1.getStatus()) {
+                    //转账失败
+                    walletTransfer.setStatus(TransferEnum.FAILED.getStatus());
+                    transferMapper.insert(walletTransfer);
+                    throw new BusinessException(StringUtils.isNotBlank(businessNoR1.getMsg()) ? businessNoR1.getMsg() : "转账失败");
+                }
+                //转帐中
+                walletTransfer.setStatus(TransferEnum.TRANSFERRING.getStatus());
+                transferMapper.insert(walletTransfer);
+                return businessNoR1.getData();
+            } finally {
+                redisLockUtil.unlock(key);
+            }
         }
-        return businessNoR1.getData();
+        return "请勿重复提交!";
     }
 
 
@@ -455,9 +523,28 @@ public class WalletService {
         R<PrePayWalletPage> prePayIndexPageR = payCenterService.advancePayWALLET(uid, channelEnum, filter, prePayPage.getPage(), prePayPage.getPageSize());
         if (prePayIndexPageR.getStatus()) {
             PrePayWalletPage data = prePayIndexPageR.getData();
-            return new PageRes<>(prePayPage.getPage(), prePayPage.getPageSize(), data.getTotal(), (int) (data.getTotal() / prePayPage.getPageSize() + 1), data.getRows());
+            //数据转换
+            List<PrePayWalletVo> list = new ArrayList<>();
+            if (!CollectionUtils.isEmpty(data.getRows())) {
+                PrePayWalletVo prePayWalletVo;
+                for (PrePayWallet row : data.getRows()) {
+                    prePayWalletVo = new PrePayWalletVo();
+                    BeanUtils.copyProperties(row, prePayWalletVo);
+                    prePayWalletVo.setApMoney(dfMoney(row.getApMoney()));
+                    prePayWalletVo.setUsingApMoney(dfMoney(row.getUsingApMoney()));
+                    prePayWalletVo.setSettlingApMoney(dfMoney(row.getSettlingApMoney()));
+                    prePayWalletVo.setTotalApMoney(dfMoney(row.getTotalApMoney()));
+                    refundMoney(row, prePayWalletVo, false);
+                    list.add(prePayWalletVo);
+                }
+            }
+            ApPageRes<PrePayWalletVo> page = new ApPageRes<>(prePayPage.getPage(), prePayPage.getPageSize(), data.getTotal(), (int) (data.getTotal() / prePayPage.getPageSize() + 1), list);
+            page.setApMoney(dfMoney(data.getApMoney()));
+            page.setUsingApMoney(dfMoney(data.getUsingApMoney()));
+            page.setTotalApMoney(dfMoney(data.getTotalApMoney()));
+            return page;
         }
-        return new PageRes<>(prePayPage.getPage(), prePayPage.getPageSize(), 0, 0, new ArrayList<>());
+        return new ApPageRes<>(prePayPage.getPage(), prePayPage.getPageSize(), 0, 0, new ArrayList<>());
 
     }
 
@@ -490,7 +577,26 @@ public class WalletService {
         R<PrePayWalletPage> prePayIndexPageR = payCenterService.advancePayReceive(uid, channelEnum, filter, prePayPage.getPage(), prePayPage.getPageSize());
         if (prePayIndexPageR.getStatus()) {
             PrePayWalletPage data = prePayIndexPageR.getData();
-            return new PageRes<>(prePayPage.getPage(), prePayPage.getPageSize(), data.getTotal(), (int) (data.getTotal() / prePayPage.getPageSize() + 1), data.getRows());
+            //数据转换
+            List<PrePayWalletVo> list = new ArrayList<>();
+            if (!CollectionUtils.isEmpty(data.getRows())) {
+                PrePayWalletVo prePayWalletVo;
+                for (PrePayWallet row : data.getRows()) {
+                    prePayWalletVo = new PrePayWalletVo();
+                    BeanUtils.copyProperties(row, prePayWalletVo);
+                    prePayWalletVo.setApMoney(dfMoney(row.getApMoney()));
+                    prePayWalletVo.setUsingApMoney(dfMoney(row.getUsingApMoney()));
+                    prePayWalletVo.setSettlingApMoney(dfMoney(row.getSettlingApMoney()));
+                    prePayWalletVo.setTotalApMoney(dfMoney(row.getTotalApMoney()));
+                    refundMoney(row, prePayWalletVo, true);
+                    list.add(prePayWalletVo);
+                }
+            }
+            ApPageRes<PrePayWalletVo> page = new ApPageRes<>(prePayPage.getPage(), prePayPage.getPageSize(), data.getTotal(), (int) (data.getTotal() / prePayPage.getPageSize() + 1), list);
+            page.setApMoney(dfMoney(data.getApMoney()));
+            page.setUsingApMoney(dfMoney(data.getUsingApMoney()));
+            page.setTotalApMoney(dfMoney(data.getTotalApMoney()));
+            return page;
         }
         return new PageRes<>(prePayPage.getPage(), prePayPage.getPageSize(), 0, 0, new ArrayList<>());
     }
@@ -506,11 +612,16 @@ public class WalletService {
         if (StringUtils.isBlank(uid)) {
             throw new BusinessException("您暂未开通电子钱包");
         }
+        //字典
         ChannelEnum channelEnum = ChannelEnum.getByValue(prePayCheck.getChannel());
         if (Objects.isNull(channelEnum)) {
             throw new BusinessException("支付通道不存在");
         }
-        R<WalletInfo> walletInfoR = payCenterService.totalInfo(uid, channelEnum, prePayCheck.getFilter());
+        String filter = walletRelationService.getRelation(Long.parseLong(prePayCheck.getEntId()));
+        if (StringUtils.isBlank(filter)) {
+            throw new BusinessException("合作企业暂未开通电子钱包");
+        }
+        R<WalletInfo> walletInfoR = payCenterService.totalInfo(uid, channelEnum, filter);
         if (!walletInfoR.getStatus()) {
             throw new BusinessException(StringUtils.isNotBlank(walletInfoR.getMsg()) ? walletInfoR.getMsg() : "未找到交易方");
         }
@@ -531,12 +642,13 @@ public class WalletService {
         if (StringUtils.isBlank(uid)) {
             throw new BusinessException("您暂未开通电子钱包");
         }
+        //字典
         ChannelEnum channelEnum = ChannelEnum.getByValue(prePay.getChannel());
         if (Objects.isNull(channelEnum)) {
             throw new BusinessException("支付通道不存在");
         }
 
-        R<Order> orderR = payCenterService.advancePayApply(prePay.getUid(), channelEnum, prePay.getFilter(), prePay.bigMoney(prePay.getMoney()));
+        R<Order> orderR = payCenterService.advancePayApply(uid, channelEnum, prePay.getEntId(), prePay.bigMoney(prePay.getMoney()));
         if (!orderR.getStatus()) {
             throw new BusinessException(StringUtils.isNotBlank(orderR.getMsg()) ? orderR.getMsg() : "预付失败");
         }
@@ -548,12 +660,12 @@ public class WalletService {
      *
      * @return
      */
-    public Object prePayAppend(PrePay prePay) {
+    public Object prePayAppend(PrePayAppend prePay) {
         String uid = walletRelationService.getRelation(LoginUserHolder.getEntId());
         if (StringUtils.isBlank(uid)) {
             throw new BusinessException("您暂未开通电子钱包");
         }
-        ChannelEnum channelEnum = ChannelEnum.getByValue(prePay.getChannel());
+        ChannelEnum channelEnum = ChannelEnum.getByChannel(prePay.getChannel());
         if (Objects.isNull(channelEnum)) {
             throw new BusinessException("支付通道不存在");
         }
@@ -572,8 +684,7 @@ public class WalletService {
      */
     public Object applyRefund(RefundReq refundReq) {
         LambdaQueryWrapper<KwpWalletRefund> wrapper = new LambdaQueryWrapper<>();
-        wrapper.eq(KwpWalletRefund::getChannel, refundReq.getChannel());
-        wrapper.eq(KwpWalletRefund::getUid, refundReq.getUid()).eq(KwpWalletRefund::getFilter, refundReq.getFilter()).eq(KwpWalletRefund::getStatus, RefundEnum.APPLY.getStatus()).last("limit 1");
+        wrapper.eq(KwpWalletRefund::getChannel, refundReq.getChannel()).eq(KwpWalletRefund::getUid, refundReq.getUid()).eq(KwpWalletRefund::getFilter, refundReq.getFilter()).eq(KwpWalletRefund::getStatus, RefundEnum.APPLY.getStatus()).last("limit 1");
         KwpWalletRefund kwpWalletRefund = kwpWalletRefundMapper.selectOne(wrapper);
         if (Objects.nonNull(kwpWalletRefund)) {
             throw new BusinessException("存在未完成的退款订单");
@@ -631,7 +742,7 @@ public class WalletService {
         patchPay.setMoney(refundReq.bigMoney(refundReq.getMoney()));
         patchPay.setRemark(refundReq.getRemark());
         list.add(patchPay);
-        R<BusinessNo> businessNoR = payCenterService.payAgentPayV2(refundReq.getUid(), refundReq.getFilter(), channelEnum, refundReq.bigMoney(refundReq.getMoney()), list, kwpWalletRefund.getOrderNo(), "1");
+        R<BusinessNo> businessNoR = payCenterService.payAgentPayV2(refundReq.getUid(), refundReq.getFilter(), channelEnum, refundReq.bigMoney(refundReq.getMoney()), list, OrderUtils.generateOrderNo("SEQ"), "1");
         if (!businessNoR.getStatus()) {
             throw new BusinessException(StringUtils.isNotBlank(businessNoR.getMsg()) ? businessNoR.getMsg() : "退款失败");
         }
@@ -664,7 +775,7 @@ public class WalletService {
             patchPay.setRemark(refundReq.getRemark());
             list.add(patchPay);
             log.info("异步提交清分退款任务");
-            R<BusinessNo> businessNoR1 = payCenterService.payAgentPayV2(refundReq.getFilter(), refundReq.getUid(), channelEnum, refundReq.bigMoney(refundReq.getMoney()), list, kwpWalletRefund.getOrderNo(), "2");
+            R<BusinessNo> businessNoR1 = payCenterService.payAgentPayV2(refundReq.getFilter(), refundReq.getUid(), channelEnum, refundReq.bigMoney(refundReq.getMoney()), list, OrderUtils.generateOrderNo("SEQ"), "2");
             if (businessNoR1.getStatus()) {
                 kwpWalletRefund.setActualMoney(refundReq.getMoney());
                 kwpWalletRefund.setUpdateBy(userId);

+ 16 - 21
sckw-modules/sckw-payment/src/main/java/com/sckw/payment/task/RefundTask.java

@@ -1,10 +1,12 @@
 package com.sckw.payment.task;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.sckw.payment.model.dto.wallet.PatchPay;
+import com.sckw.payment.api.model.constant.ChannelEnum;
+import com.sckw.payment.api.model.dto.common.R;
 import com.sckw.payment.dao.KwpWalletRefundMapper;
 import com.sckw.payment.model.KwpWalletRefund;
 import com.sckw.payment.model.constant.RefundEnum;
+import com.sckw.payment.model.dto.wallet.SplitDto;
 import com.sckw.payment.service.PayCenterService;
 import jakarta.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
@@ -13,10 +15,8 @@ import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 import org.springframework.util.CollectionUtils;
 
-import java.math.BigDecimal;
-import java.util.ArrayList;
+import java.time.LocalDateTime;
 import java.util.List;
-import java.util.Objects;
 
 /**
  * @author xucaiqin
@@ -31,7 +31,6 @@ public class RefundTask {
     @Resource
     private KwpWalletRefundMapper kwpWalletRefundMapper;
 
-
     @Scheduled(cron = "0 0/1 * * * ? ")
     public void task() {
         LambdaQueryWrapper<KwpWalletRefund> wrapper = new LambdaQueryWrapper<>();
@@ -41,27 +40,23 @@ public class RefundTask {
             log.warn("无数据");
             return;
         }
-        List<PatchPay> list;
         try {
             for (KwpWalletRefund kwpWalletRefund : kwpWalletRefunds) {
-                list = new ArrayList<>();
-                PatchPay patchPay = new PatchPay();
-                patchPay.setUid(kwpWalletRefund.getFilter());
-                patchPay.setMoney(bigMoney(kwpWalletRefund.getActualMoney()));
-                patchPay.setRemark(kwpWalletRefund.getRemark());
-                list.add(patchPay);
-                //查询清分状态,修改退款单状态 todo-xcq
+                //查询清分状态,修改退款单状态
+                R<List<SplitDto>> listR = payCenterService.agentPayQuery(kwpWalletRefund.getUid(), ChannelEnum.getByChannel(kwpWalletRefund.getChannel()), kwpWalletRefund.getOrderNo());
+                if (listR.getStatus()) {
+                    List<SplitDto> data = listR.getData();
+                    if (!CollectionUtils.isEmpty(data)) {
+                        if (data.stream().allMatch(a -> a.getStatus() == 1)) {
+                            kwpWalletRefund.setUpdateTime(LocalDateTime.now());
+                            kwpWalletRefund.setStatus(RefundEnum.SUCCESS.getStatus());
+                            kwpWalletRefundMapper.updateById(kwpWalletRefund);
+                        }
+                    }
+                }
             }
         } catch (Exception ex) {
             log.error("定时任务异常:{}", ex, ex);
         }
     }
-
-    private Long bigMoney(BigDecimal big) {
-        if (Objects.isNull(big)) {
-            return 0L;
-        }
-        BigDecimal divide = big.multiply(new BigDecimal("100"));
-        return divide.longValueExact();
-    }
 }