|
@@ -2,8 +2,8 @@ package org.dromara.backstage.payment.service.impl;
|
|
|
|
|
|
|
|
import cn.hutool.core.convert.Convert;
|
|
import cn.hutool.core.convert.Convert;
|
|
|
import cn.hutool.core.util.StrUtil;
|
|
import cn.hutool.core.util.StrUtil;
|
|
|
|
|
+import cn.hutool.json.JSONUtil;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
-import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
|
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
import lombok.RequiredArgsConstructor;
|
|
@@ -12,14 +12,13 @@ import org.dromara.backstage.payment.domain.bo.PtBagBo;
|
|
|
import org.dromara.backstage.payment.domain.vo.PtBagVo;
|
|
import org.dromara.backstage.payment.domain.vo.PtBagVo;
|
|
|
import org.dromara.backstage.payment.mapper.PtBagMapper;
|
|
import org.dromara.backstage.payment.mapper.PtBagMapper;
|
|
|
import org.dromara.backstage.payment.service.IPtBagService;
|
|
import org.dromara.backstage.payment.service.IPtBagService;
|
|
|
-import org.dromara.common.core.constant.CacheNames;
|
|
|
|
|
|
|
+import org.dromara.common.core.exception.consume.BagException;
|
|
|
import org.dromara.common.core.utils.MapstructUtils;
|
|
import org.dromara.common.core.utils.MapstructUtils;
|
|
|
import org.dromara.common.core.utils.SpringUtils;
|
|
import org.dromara.common.core.utils.SpringUtils;
|
|
|
import org.dromara.common.core.utils.StringUtils;
|
|
import org.dromara.common.core.utils.StringUtils;
|
|
|
import org.dromara.common.encrypt.utils.YcEncryptUtil;
|
|
import org.dromara.common.encrypt.utils.YcEncryptUtil;
|
|
|
import org.dromara.common.mybatis.core.page.PageQuery;
|
|
import org.dromara.common.mybatis.core.page.PageQuery;
|
|
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
|
|
-import org.dromara.common.redis.utils.RedisUtils;
|
|
|
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
import java.math.BigDecimal;
|
|
@@ -115,10 +114,9 @@ public class PtBagServiceImpl implements IPtBagService {
|
|
|
@Override
|
|
@Override
|
|
|
public Boolean updateByBo(PtBagBo bo) {
|
|
public Boolean updateByBo(PtBagBo bo) {
|
|
|
PtBag update = MapstructUtils.convert(bo, PtBag.class);
|
|
PtBag update = MapstructUtils.convert(bo, PtBag.class);
|
|
|
-
|
|
|
|
|
- if (update != null && validBalance(update)) {
|
|
|
|
|
- String encryptValue = YcEncryptUtil.encryptBagBalanceByPublicKey(bo.getBalance().toString(), bo.getUserId().toString());
|
|
|
|
|
- update.setEncryptBalance(encryptValue);
|
|
|
|
|
|
|
+ if (update != null) {
|
|
|
|
|
+ verification(bo);
|
|
|
|
|
+ setEncryptBalance(update);
|
|
|
return baseMapper.updateById(update) > 0;
|
|
return baseMapper.updateById(update) > 0;
|
|
|
} else {
|
|
} else {
|
|
|
return false;
|
|
return false;
|
|
@@ -132,26 +130,6 @@ public class PtBagServiceImpl implements IPtBagService {
|
|
|
//TODO 做一些数据校验,如唯一约束
|
|
//TODO 做一些数据校验,如唯一约束
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- /**
|
|
|
|
|
- * 校验账户钱包余额
|
|
|
|
|
- * 校验规则:获取钱包的明文和密文卡余,如果两者一致则通过
|
|
|
|
|
- *
|
|
|
|
|
- * @param data 账户钱包
|
|
|
|
|
- * @return 校给是否成功
|
|
|
|
|
- */
|
|
|
|
|
- private boolean validBalance(PtBag data) {
|
|
|
|
|
- PtBag entity = baseMapper.selectOne(Wrappers.<PtBag>lambdaQuery()
|
|
|
|
|
- .eq(PtBag::getBagCode, data.getBagCode())
|
|
|
|
|
- .eq(PtBag::getUserId, data.getUserId()));
|
|
|
|
|
-
|
|
|
|
|
- BigDecimal entryptValue = BigDecimal.ZERO;
|
|
|
|
|
- if (StrUtil.isNotBlank(entity.getEncryptBalance())) {
|
|
|
|
|
- String decryptValue = YcEncryptUtil.decryptBagBalanceByPublicKey(entity.getEncryptBalance(), entity.getUserId().toString(), RedisUtils.getCacheObject(CacheNames.CUSTOM_PUB_KEY).toString());
|
|
|
|
|
- entryptValue = new BigDecimal(decryptValue);
|
|
|
|
|
- }
|
|
|
|
|
- return entryptValue.compareTo(entity.getBalance()) == 0;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
/**
|
|
/**
|
|
|
* 校验并批量删除账户钱包信息
|
|
* 校验并批量删除账户钱包信息
|
|
|
*
|
|
*
|
|
@@ -223,40 +201,154 @@ public class PtBagServiceImpl implements IPtBagService {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
- * 账户钱包充值
|
|
|
|
|
|
|
+ * 更新钱包
|
|
|
*
|
|
*
|
|
|
* @param bo 账户钱包
|
|
* @param bo 账户钱包
|
|
|
- * @return 是否充值成功
|
|
|
|
|
|
|
+ * @return 更新后的账户钱包
|
|
|
*/
|
|
*/
|
|
|
@Override
|
|
@Override
|
|
|
- public Boolean rechargeByBo(PtBagBo bo) {
|
|
|
|
|
- return baseMapper.update(null, new LambdaUpdateWrapper<PtBag>()
|
|
|
|
|
- .set(PtBag::getBalance, bo.getBalance())
|
|
|
|
|
- .set(PtBag::getEncryptBalance, bo.getEncryptBalance())
|
|
|
|
|
- .set(PtBag::getRechargeCount, bo.getRechargeTotal())
|
|
|
|
|
- .set(PtBag::getRechargeTotal, bo.getRechargeTotal())
|
|
|
|
|
- .eq(PtBag::getBagCode, bo.getBagCode())
|
|
|
|
|
- .eq(PtBag::getUserId, bo.getUserId())) > 0;
|
|
|
|
|
|
|
+ public PtBagVo updateBalanceByBo(PtBagBo bo) {
|
|
|
|
|
+ //校验入库数据
|
|
|
|
|
+ PtBag entity = verification(bo);
|
|
|
|
|
+ //根据不同的操作组装入库数据
|
|
|
|
|
+ switch (bo.getOperationMode()) {
|
|
|
|
|
+ case REFUND:
|
|
|
|
|
+ refundBag(entity, bo);
|
|
|
|
|
+ break;
|
|
|
|
|
+ case CONSUME:
|
|
|
|
|
+ consumeBag(entity, bo);
|
|
|
|
|
+ break;
|
|
|
|
|
+ case RECOVER:
|
|
|
|
|
+ recoverBag(entity, bo);
|
|
|
|
|
+ break;
|
|
|
|
|
+ case COMPENSATE:
|
|
|
|
|
+ compensateBag(entity, bo);
|
|
|
|
|
+ break;
|
|
|
|
|
+ case RECHARGE:
|
|
|
|
|
+ default:
|
|
|
|
|
+ rechargeBag(entity, bo);
|
|
|
|
|
+ }
|
|
|
|
|
+ //数据入库
|
|
|
|
|
+ if (baseMapper.updateById(entity) > 0) {
|
|
|
|
|
+ return queryById(entity.getBagId());
|
|
|
|
|
+ } else {
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
/**
|
|
/**
|
|
|
- * 更新钱包
|
|
|
|
|
|
|
+ * 钱包更新前的验证
|
|
|
*
|
|
*
|
|
|
* @param bo 账户钱包
|
|
* @param bo 账户钱包
|
|
|
- * @return 更新后的账户钱包
|
|
|
|
|
|
|
+ * @return 验证通过后的账户钱包
|
|
|
*/
|
|
*/
|
|
|
@Override
|
|
@Override
|
|
|
- public PtBagVo updateBalanceByBo(PtBagBo bo) {
|
|
|
|
|
- PtBag update = MapstructUtils.convert(bo, PtBag.class);
|
|
|
|
|
- if (update != null){
|
|
|
|
|
- if(baseMapper.updateById(update)>0){
|
|
|
|
|
- return queryById(update.getBagId());
|
|
|
|
|
- } else{
|
|
|
|
|
- return null;
|
|
|
|
|
- }
|
|
|
|
|
- } else {
|
|
|
|
|
- return null;
|
|
|
|
|
|
|
+ public PtBag verification(PtBagBo bo) {
|
|
|
|
|
+ //获取数据库中对应的钱包
|
|
|
|
|
+ PtBag entity = baseMapper.selectOne(Wrappers.<PtBag>lambdaQuery()
|
|
|
|
|
+ .eq(PtBag::getBagId, bo.getBagId()));
|
|
|
|
|
+
|
|
|
|
|
+ //解密余额密文,得到加密的余额
|
|
|
|
|
+ BigDecimal entryptValue = BigDecimal.ZERO;
|
|
|
|
|
+ if (StrUtil.isNotBlank(entity.getEncryptBalance())) {
|
|
|
|
|
+ String decryptValue = YcEncryptUtil.decryptBagBalanceByPublicKey(entity.getEncryptBalance(), entity.getUserId().toString());
|
|
|
|
|
+ entryptValue = new BigDecimal(decryptValue);
|
|
|
|
|
+ }
|
|
|
|
|
+ //如果明文余额与解密后余额不一致则验证不通过
|
|
|
|
|
+ if (entryptValue.compareTo(entity.getBalance()) != 0) {
|
|
|
|
|
+ throw new BagException("bag.balance.valid", JSONUtil.parse(bo));
|
|
|
}
|
|
}
|
|
|
|
|
+ return entity;
|
|
|
|
|
+ }
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 组装充值钱包数据
|
|
|
|
|
+ * 1.设置充值后余额=账户原余额+充值金额
|
|
|
|
|
+ * 2.设置充值次数+1
|
|
|
|
|
+ * 3.设置充值总金额额=原总金额+充值金额
|
|
|
|
|
+ * 4.对充值后余额进行加密处理
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param bag 账户钱包(数据库)
|
|
|
|
|
+ * @param bo 账户钱包(业务)
|
|
|
|
|
+ */
|
|
|
|
|
+ private void rechargeBag(PtBag bag, PtBagBo bo) {
|
|
|
|
|
+ bag.setBalance(bag.getBalance().add(bo.getReceiptMoney()));
|
|
|
|
|
+ bag.setRechargeCount(bag.getRechargeCount() + 1);
|
|
|
|
|
+ bag.setRechargeTotal(bag.getRechargeTotal().add(bo.getReceiptMoney()));
|
|
|
|
|
+ setEncryptBalance(bag);
|
|
|
|
|
+ }
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 组装退款钱包数据
|
|
|
|
|
+ * 1.如果原账户余额>退款金额,则设置退款后余额=账户原余额-退款金额,否则为0
|
|
|
|
|
+ * 2.对退款后余额进行加密处理
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param bag 账户钱包(数据库)
|
|
|
|
|
+ * @param bo 账户钱包(业务)
|
|
|
|
|
+ */
|
|
|
|
|
+ private void refundBag(PtBag bag, PtBagBo bo) {
|
|
|
|
|
+ //退款后的余额
|
|
|
|
|
+ BigDecimal after = BigDecimal.ZERO;
|
|
|
|
|
+ //账户现有余额
|
|
|
|
|
+ BigDecimal balance = bag.getBalance();
|
|
|
|
|
+ //退款金额
|
|
|
|
|
+ BigDecimal doValue = bo.getReceiptMoney();
|
|
|
|
|
+ //如果账户现有余额比退款金额大,则最后余额为账户余额-退款金额,否则为0
|
|
|
|
|
+ if(balance.compareTo(doValue)>0){
|
|
|
|
|
+ after = balance.subtract(doValue);
|
|
|
|
|
+ }
|
|
|
|
|
+ bag.setBalance(after);
|
|
|
|
|
+ setEncryptBalance(bag);
|
|
|
|
|
+ }
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 组装重置钱包数据
|
|
|
|
|
+ * 1.设置重置后余额=操作金额
|
|
|
|
|
+ * 2.对退款后余额进行加密处理
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param bag 账户钱包(数据库)
|
|
|
|
|
+ * @param bo 账户钱包(业务)
|
|
|
|
|
+ */
|
|
|
|
|
+ private void recoverBag(PtBag bag, PtBagBo bo) {
|
|
|
|
|
+ bag.setBalance(bo.getReceiptMoney());
|
|
|
|
|
+ setEncryptBalance(bag);
|
|
|
|
|
+ }
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 组装消费钱包数据
|
|
|
|
|
+ * 1.设置消费后余额=账户原余额-消费金额
|
|
|
|
|
+ * 2.设置消费次数+1
|
|
|
|
|
+ * 3.设置消费总金额额=原总金额+消费金额
|
|
|
|
|
+ * 4.对消费后余额进行加密处理
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param bag 账户钱包(数据库)
|
|
|
|
|
+ * @param bo 账户钱包(业务)
|
|
|
|
|
+ */
|
|
|
|
|
+ private void consumeBag(PtBag bag, PtBagBo bo) {
|
|
|
|
|
+ bag.setBalance(bag.getBalance().subtract(bo.getReceiptMoney()));
|
|
|
|
|
+ bag.setConsumeCount(bag.getConsumeCount() + 1);
|
|
|
|
|
+ bag.setConsumeTotal(bag.getConsumeTotal().add(bo.getReceiptMoney()));
|
|
|
|
|
+ setEncryptBalance(bag);
|
|
|
|
|
+ }
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 组装错扣补款钱包数据
|
|
|
|
|
+ * 1.设置补款后余额=账户原余额+补款金额
|
|
|
|
|
+ * 2.设置消费次数+1
|
|
|
|
|
+ * 3.设置消费总金额额=原总金额-补款金额
|
|
|
|
|
+ * 4.对补款后余额进行加密处理
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param bag 账户钱包(数据库)
|
|
|
|
|
+ * @param bo 账户钱包(业务)
|
|
|
|
|
+ */
|
|
|
|
|
+ private void compensateBag(PtBag bag, PtBagBo bo) {
|
|
|
|
|
+ bag.setBalance(bag.getBalance().add(bo.getReceiptMoney()));
|
|
|
|
|
+ bag.setConsumeCount(bag.getConsumeCount() + 1);
|
|
|
|
|
+ bag.setConsumeTotal(bag.getConsumeTotal().subtract(bo.getReceiptMoney()));
|
|
|
|
|
+ setEncryptBalance(bag);
|
|
|
|
|
+ }
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 设置加密卡余
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param bag 账户钱包(数据库)
|
|
|
|
|
+ */
|
|
|
|
|
+ private void setEncryptBalance(PtBag bag) {
|
|
|
|
|
+ String encryptValue = YcEncryptUtil.encryptBagBalanceByPublicKey(bag.getBalance().toString(), bag.getUserId().toString());
|
|
|
|
|
+ bag.setEncryptBalance(encryptValue);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
}
|
|
}
|