|
@@ -1,26 +1,37 @@
|
|
|
package com.sckw.payment.dubbo;
|
|
package com.sckw.payment.dubbo;
|
|
|
|
|
|
|
|
|
|
+import cn.hutool.core.util.NumberUtil;
|
|
|
|
|
+import cn.hutool.core.util.StrUtil;
|
|
|
import com.alibaba.fastjson2.JSONObject;
|
|
import com.alibaba.fastjson2.JSONObject;
|
|
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.sckw.core.exception.BusinessException;
|
|
import com.sckw.core.exception.BusinessException;
|
|
|
|
|
+import com.sckw.core.utils.DateTimeUtil;
|
|
|
import com.sckw.core.utils.OrderUtils;
|
|
import com.sckw.core.utils.OrderUtils;
|
|
|
import com.sckw.core.web.constant.HttpStatus;
|
|
import com.sckw.core.web.constant.HttpStatus;
|
|
|
|
|
+import com.sckw.core.web.context.LoginUserHolder;
|
|
|
|
|
+import com.sckw.core.web.response.BaseResult;
|
|
|
import com.sckw.core.web.response.HttpResult;
|
|
import com.sckw.core.web.response.HttpResult;
|
|
|
import com.sckw.payment.api.dubbo.PaymentDubboService;
|
|
import com.sckw.payment.api.dubbo.PaymentDubboService;
|
|
|
|
|
+import com.sckw.payment.api.model.WalletFreeze;
|
|
|
import com.sckw.payment.api.model.constant.ChannelEnum;
|
|
import com.sckw.payment.api.model.constant.ChannelEnum;
|
|
|
import com.sckw.payment.api.model.constant.OrderEnum;
|
|
import com.sckw.payment.api.model.constant.OrderEnum;
|
|
|
import com.sckw.payment.api.model.dto.LedgerCount;
|
|
import com.sckw.payment.api.model.dto.LedgerCount;
|
|
|
import com.sckw.payment.api.model.dto.SettlementMoney;
|
|
import com.sckw.payment.api.model.dto.SettlementMoney;
|
|
|
|
|
+import com.sckw.payment.dao.KwpBizWalletMapper;
|
|
|
|
|
+import com.sckw.payment.dao.KwpBizWalletPrepayMapper;
|
|
|
|
|
+import com.sckw.payment.model.KwpBizWallet;
|
|
|
|
|
+import com.sckw.payment.model.KwpBizWalletPrepay;
|
|
|
import com.sckw.payment.model.constant.LogisticsUnitType;
|
|
import com.sckw.payment.model.constant.LogisticsUnitType;
|
|
|
import com.sckw.payment.model.constant.TradeUnitType;
|
|
import com.sckw.payment.model.constant.TradeUnitType;
|
|
|
import com.sckw.payment.model.dto.LedgerSize;
|
|
import com.sckw.payment.model.dto.LedgerSize;
|
|
|
import com.sckw.payment.model.dto.MoneyType;
|
|
import com.sckw.payment.model.dto.MoneyType;
|
|
|
import com.sckw.payment.service.*;
|
|
import com.sckw.payment.service.*;
|
|
|
-import com.sckw.core.utils.DateTimeUtil;
|
|
|
|
|
import com.sckw.payment.utils.DecimalUtils;
|
|
import com.sckw.payment.utils.DecimalUtils;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
import lombok.RequiredArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.apache.dubbo.config.annotation.DubboService;
|
|
import org.apache.dubbo.config.annotation.DubboService;
|
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
import java.math.BigDecimal;
|
|
|
import java.text.DecimalFormat;
|
|
import java.text.DecimalFormat;
|
|
@@ -43,6 +54,8 @@ public class PaymentDubboServiceImpl implements PaymentDubboService {
|
|
|
private final KwpSettlementTradeService kwpSettlementTradeService;
|
|
private final KwpSettlementTradeService kwpSettlementTradeService;
|
|
|
private final WalletService walletService;
|
|
private final WalletService walletService;
|
|
|
private final KwpTradeFreezeService kwpTradeFreezeService;
|
|
private final KwpTradeFreezeService kwpTradeFreezeService;
|
|
|
|
|
+ private final KwpBizWalletPrepayMapper kwpBizWalletPrepayMapper;
|
|
|
|
|
+ private final KwpBizWalletMapper kwpBizWalletMapper;
|
|
|
|
|
|
|
|
|
|
|
|
|
private SettlementMoney change(List<MoneyType> moneyType) {
|
|
private SettlementMoney change(List<MoneyType> moneyType) {
|
|
@@ -229,5 +242,148 @@ public class PaymentDubboServiceImpl implements PaymentDubboService {
|
|
|
List<MoneyType> moneyType = kwpSettlementLogisticsService.moneySum(entId, cur, pre, LogisticsUnitType.SHIPPER);
|
|
List<MoneyType> moneyType = kwpSettlementLogisticsService.moneySum(entId, cur, pre, LogisticsUnitType.SHIPPER);
|
|
|
return change(moneyType);
|
|
return change(moneyType);
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
|
|
+ public BaseResult<Boolean> freezeMoney(WalletFreeze walletFreeze) {
|
|
|
|
|
+ log.info("冻结钱包:{}", JSONObject.toJSONString(walletFreeze));
|
|
|
|
|
+ KwpBizWallet one = kwpBizWalletMapper.selectOne(new LambdaQueryWrapper<KwpBizWallet>()
|
|
|
|
|
+ .eq(KwpBizWallet::getSupEntId, walletFreeze.getSaleEntId())
|
|
|
|
|
+ .eq(KwpBizWallet::getProEntId, walletFreeze.getBuyEntId()).eq(KwpBizWallet::getState, 1)
|
|
|
|
|
+ );
|
|
|
|
|
+ if (Objects.isNull(one)) {
|
|
|
|
|
+ return BaseResult.failed("钱包不存在,请核实");
|
|
|
|
|
+ }
|
|
|
|
|
+ BigDecimal amount = one.getAmount();
|
|
|
|
|
+ if (NumberUtil.isLess(amount, walletFreeze.getMoney())) {
|
|
|
|
|
+ return BaseResult.failed("可用余额不足");
|
|
|
|
|
+ }
|
|
|
|
|
+ one.setAmount(NumberUtil.sub(amount, walletFreeze.getMoney()));
|
|
|
|
|
+ one.setPrepayAmount(NumberUtil.add(one.getPrepayAmount(), walletFreeze.getMoney()));
|
|
|
|
|
+ one.setUpdateUser(LoginUserHolder.getUserName());
|
|
|
|
|
+ kwpBizWalletMapper.updateById(one);
|
|
|
|
|
+ //新增订单
|
|
|
|
|
+ KwpBizWalletPrepay kwpBizWalletPrepay = new KwpBizWalletPrepay();
|
|
|
|
|
+ kwpBizWalletPrepay.setWalletId(one.getId());
|
|
|
|
|
+ kwpBizWalletPrepay.setOrderId(walletFreeze.getTTradeOrderId());
|
|
|
|
|
+ kwpBizWalletPrepay.setChangeAmount(walletFreeze.getMoney());
|
|
|
|
|
+ kwpBizWalletPrepay.setAmount(one.getAmount());
|
|
|
|
|
+ kwpBizWalletPrepay.setPrepayAmount(one.getPrepayAmount());
|
|
|
|
|
+ kwpBizWalletPrepay.setType(2);
|
|
|
|
|
+ kwpBizWalletPrepay.setRemark(StrUtil.format("[订单号:{}]冻结", walletFreeze.getOrderNo()));
|
|
|
|
|
+ kwpBizWalletPrepay.setVoucherUrl("");
|
|
|
|
|
+ kwpBizWalletPrepay.setCreateTime(new Date());
|
|
|
|
|
+ kwpBizWalletPrepay.setUpdateTime(new Date());
|
|
|
|
|
+ kwpBizWalletPrepay.setCreateUser(LoginUserHolder.getUserName());
|
|
|
|
|
+ kwpBizWalletPrepay.setUpdateUser(LoginUserHolder.getUserName());
|
|
|
|
|
+
|
|
|
|
|
+ kwpBizWalletPrepayMapper.insert(kwpBizWalletPrepay);
|
|
|
|
|
+ return BaseResult.success();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public BaseResult<Boolean> dealMoney(WalletFreeze walletFreeze) {
|
|
|
|
|
+ log.info("钱包结算 {}", JSONObject.toJSONString(walletFreeze));
|
|
|
|
|
+ Long tTradeOrderId = walletFreeze.getTTradeOrderId();
|
|
|
|
|
+ KwpBizWalletPrepay one = kwpBizWalletPrepayMapper.selectOne(new LambdaQueryWrapper<KwpBizWalletPrepay>()
|
|
|
|
|
+ .eq(KwpBizWalletPrepay::getOrderId, tTradeOrderId)
|
|
|
|
|
+ .eq(KwpBizWalletPrepay::getType, 2)
|
|
|
|
|
+ .last("limit 1")
|
|
|
|
|
+ );
|
|
|
|
|
+ if (Objects.isNull(one)) {
|
|
|
|
|
+ return BaseResult.failed("冻结订单不存在");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ KwpBizWallet wallet = kwpBizWalletMapper.selectById(one.getWalletId());
|
|
|
|
|
+ if (Objects.isNull(wallet) || Objects.equals(wallet.getState(), 0)) {
|
|
|
|
|
+ return BaseResult.failed("钱包不存在或状态异常");
|
|
|
|
|
+ }
|
|
|
|
|
+ BigDecimal changeAmount = one.getChangeAmount();//冻结金额
|
|
|
|
|
+ //钱包实际可用
|
|
|
|
|
+ BigDecimal amount = wallet.getAmount();
|
|
|
|
|
+ //新增解冻订单
|
|
|
|
|
+ amount = NumberUtil.add(amount, changeAmount);
|
|
|
|
|
+ KwpBizWalletPrepay kwpBizWalletPrepay = new KwpBizWalletPrepay();
|
|
|
|
|
+ kwpBizWalletPrepay.setWalletId(one.getId());
|
|
|
|
|
+ kwpBizWalletPrepay.setOrderId(walletFreeze.getTTradeOrderId());
|
|
|
|
|
+ kwpBizWalletPrepay.setChangeAmount(changeAmount);
|
|
|
|
|
+ kwpBizWalletPrepay.setAmount(amount);
|
|
|
|
|
+ kwpBizWalletPrepay.setPrepayAmount(NumberUtil.sub(wallet.getPrepayAmount(), changeAmount));
|
|
|
|
|
+ kwpBizWalletPrepay.setType(3);
|
|
|
|
|
+ kwpBizWalletPrepay.setRemark(StrUtil.format("[{}][结算]解冻订单总金额", walletFreeze.getOrderNo()));
|
|
|
|
|
+ kwpBizWalletPrepay.setVoucherUrl("");
|
|
|
|
|
+ kwpBizWalletPrepay.setCreateTime(new Date());
|
|
|
|
|
+ kwpBizWalletPrepay.setUpdateTime(new Date());
|
|
|
|
|
+ kwpBizWalletPrepay.setCreateUser(LoginUserHolder.getUserName());
|
|
|
|
|
+ kwpBizWalletPrepay.setUpdateUser(LoginUserHolder.getUserName());
|
|
|
|
|
+ kwpBizWalletPrepayMapper.insert(kwpBizWalletPrepay);
|
|
|
|
|
+
|
|
|
|
|
+ //新增消费订单
|
|
|
|
|
+ KwpBizWalletPrepay kwpBizWalletPrepay2 = new KwpBizWalletPrepay();
|
|
|
|
|
+ kwpBizWalletPrepay2.setWalletId(one.getId());
|
|
|
|
|
+ kwpBizWalletPrepay2.setOrderId(walletFreeze.getTTradeOrderId());
|
|
|
|
|
+ kwpBizWalletPrepay2.setChangeAmount(walletFreeze.getMoney());
|
|
|
|
|
+ kwpBizWalletPrepay2.setAmount(NumberUtil.sub(amount, walletFreeze.getMoney()));
|
|
|
|
|
+ kwpBizWalletPrepay2.setPrepayAmount(kwpBizWalletPrepay.getPrepayAmount());
|
|
|
|
|
+ kwpBizWalletPrepay2.setType(4);
|
|
|
|
|
+ kwpBizWalletPrepay2.setRemark(StrUtil.format("[{}][结算]扣除订单总金额", walletFreeze.getOrderNo()));
|
|
|
|
|
+ kwpBizWalletPrepay2.setVoucherUrl("");
|
|
|
|
|
+ kwpBizWalletPrepay2.setCreateTime(new Date());
|
|
|
|
|
+ kwpBizWalletPrepay2.setUpdateTime(new Date());
|
|
|
|
|
+ kwpBizWalletPrepay2.setCreateUser(LoginUserHolder.getUserName());
|
|
|
|
|
+ kwpBizWalletPrepay2.setUpdateUser(LoginUserHolder.getUserName());
|
|
|
|
|
+ kwpBizWalletPrepayMapper.insert(kwpBizWalletPrepay2);
|
|
|
|
|
+
|
|
|
|
|
+ wallet.setAmount(kwpBizWalletPrepay2.getAmount());
|
|
|
|
|
+ wallet.setPrepayAmount(kwpBizWalletPrepay2.getPrepayAmount());
|
|
|
|
|
+ kwpBizWalletMapper.updateById(wallet);
|
|
|
|
|
+ return BaseResult.success();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public BaseResult<Boolean> unfreezeMoney(WalletFreeze walletFreeze) {
|
|
|
|
|
+ log.info("解冻钱包:{}", JSONObject.toJSONString(walletFreeze));
|
|
|
|
|
+ Long tTradeOrderId = walletFreeze.getTTradeOrderId();
|
|
|
|
|
+ KwpBizWalletPrepay one = kwpBizWalletPrepayMapper.selectOne(new LambdaQueryWrapper<KwpBizWalletPrepay>()
|
|
|
|
|
+ .eq(KwpBizWalletPrepay::getOrderId, tTradeOrderId)
|
|
|
|
|
+ .eq(KwpBizWalletPrepay::getType, 2)
|
|
|
|
|
+ .last("limit 1")
|
|
|
|
|
+ );
|
|
|
|
|
+ if (Objects.isNull(one)) {
|
|
|
|
|
+ return BaseResult.failed("冻结订单不存在");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ KwpBizWallet wallet = kwpBizWalletMapper.selectById(one.getWalletId());
|
|
|
|
|
+ if (Objects.isNull(wallet) || Objects.equals(wallet.getState(), 0)) {
|
|
|
|
|
+ return BaseResult.failed("钱包不存在或状态异常");
|
|
|
|
|
+ }
|
|
|
|
|
+ BigDecimal changeAmount = one.getChangeAmount();//冻结金额
|
|
|
|
|
+ //钱包实际可用
|
|
|
|
|
+ BigDecimal amount = wallet.getAmount();
|
|
|
|
|
+ //新增解冻订单
|
|
|
|
|
+ amount = NumberUtil.add(amount, changeAmount);
|
|
|
|
|
+ KwpBizWalletPrepay kwpBizWalletPrepay = new KwpBizWalletPrepay();
|
|
|
|
|
+ kwpBizWalletPrepay.setWalletId(one.getId());
|
|
|
|
|
+ kwpBizWalletPrepay.setOrderId(walletFreeze.getTTradeOrderId());
|
|
|
|
|
+ kwpBizWalletPrepay.setChangeAmount(changeAmount);
|
|
|
|
|
+ kwpBizWalletPrepay.setAmount(amount);
|
|
|
|
|
+ kwpBizWalletPrepay.setPrepayAmount(NumberUtil.sub(wallet.getPrepayAmount(), changeAmount));
|
|
|
|
|
+ kwpBizWalletPrepay.setType(3);
|
|
|
|
|
+ kwpBizWalletPrepay.setRemark(StrUtil.format("[订单号:{}]解冻", walletFreeze.getOrderNo()));
|
|
|
|
|
+ kwpBizWalletPrepay.setVoucherUrl("");
|
|
|
|
|
+ kwpBizWalletPrepay.setCreateTime(new Date());
|
|
|
|
|
+ kwpBizWalletPrepay.setUpdateTime(new Date());
|
|
|
|
|
+ kwpBizWalletPrepay.setCreateUser(LoginUserHolder.getUserName());
|
|
|
|
|
+ kwpBizWalletPrepay.setUpdateUser(LoginUserHolder.getUserName());
|
|
|
|
|
+ kwpBizWalletPrepayMapper.insert(kwpBizWalletPrepay);
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ wallet.setAmount(amount);
|
|
|
|
|
+ wallet.setPrepayAmount(kwpBizWalletPrepay.getPrepayAmount());
|
|
|
|
|
+ kwpBizWalletMapper.updateById(wallet);
|
|
|
|
|
+ return BaseResult.success();
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|