|
|
@@ -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);
|