个人钱包-线下充值,直接输入金额

个人钱包-离职时,清空金额
This commit is contained in:
gaowdong 2025-04-11 13:13:24 +08:00
parent dbacf19ad0
commit f2c63d168a
15 changed files with 289 additions and 179 deletions

View File

@ -5,11 +5,8 @@ import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid; import javax.validation.Valid;
import com.bonus.canteen.core.account.domain.AccInfo; import com.bonus.canteen.core.account.domain.AccInfo;
import com.bonus.canteen.core.account.domain.param.AccOperationQueryParam; import com.bonus.canteen.core.account.domain.param.*;
import com.bonus.canteen.core.account.domain.param.AccountBalanceEditParam;
import com.bonus.canteen.core.account.domain.param.AccountEnableDisableParam;
import com.bonus.canteen.core.account.domain.vo.AccInfoDetailsVO; import com.bonus.canteen.core.account.domain.vo.AccInfoDetailsVO;
import com.bonus.canteen.core.account.domain.param.AccountInfoQueryParam;
import com.bonus.canteen.core.account.service.AccOperationHistoryService; import com.bonus.canteen.core.account.service.AccOperationHistoryService;
import com.bonus.common.log.enums.OperaType; import com.bonus.common.log.enums.OperaType;
@ -190,4 +187,17 @@ public class AccInfoController extends BaseController {
public AjaxResult queryWalletBalance(@RequestBody AccInfo accInfo) { public AjaxResult queryWalletBalance(@RequestBody AccInfo accInfo) {
return success(this.accInfoService.queryWalletBalance(accInfo)); return success(this.accInfoService.queryWalletBalance(accInfo));
} }
@ApiOperation("单人充值")
@PostMapping("/recharge")
public AjaxResult individualAccRechargeA(@RequestBody @Valid AccRechargeParam param) {
this.accInfoService.individualAccRecharge(param);
return AjaxResult.success();
}
@ApiOperation("离职清空余额(个人钱包和补贴钱包)")
@PostMapping({"/leave/clear"})
public AjaxResult individualAccLeaveClear(@RequestBody @Valid AccLeaveClearParam param) {
this.accInfoService.individualAccLeaveClear(param);
return AjaxResult.success();
}
} }

View File

@ -1,28 +1,20 @@
package com.bonus.canteen.core.account.controller; package com.bonus.canteen.core.account.controller;
import java.util.List; import com.bonus.canteen.core.account.domain.AccWalletInfo;
import javax.servlet.http.HttpServletResponse; import com.bonus.canteen.core.account.service.IAccWalletInfoService;
import com.bonus.common.core.utils.poi.ExcelUtil;
import com.bonus.common.core.web.controller.BaseController;
import com.bonus.common.core.web.domain.AjaxResult;
import com.bonus.common.core.web.page.TableDataInfo;
import com.bonus.common.log.annotation.SysLog;
import com.bonus.common.log.enums.OperaType; import com.bonus.common.log.enums.OperaType;
import com.bonus.canteen.core.common.annotation.PreventRepeatSubmit;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping; import javax.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.DeleteMapping; import java.util.List;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.bonus.common.log.annotation.SysLog;
import com.bonus.common.security.annotation.RequiresPermissions;
import com.bonus.canteen.core.account.domain.AccWalletInfo;
import com.bonus.canteen.core.account.service.IAccWalletInfoService;
import com.bonus.common.core.web.controller.BaseController;
import com.bonus.common.core.web.domain.AjaxResult;
import com.bonus.common.core.utils.poi.ExcelUtil;
import com.bonus.common.core.web.page.TableDataInfo;
/** /**
* 钱包详情信息Controller * 钱包详情信息Controller
@ -89,22 +81,6 @@ public class AccWalletInfoController extends BaseController {
} }
} }
/**
* 修改钱包详情信息
*/
@ApiOperation(value = "修改钱包详情信息")
//@PreventRepeatSubmit
//@RequiresPermissions("account:info:edit")
@SysLog(title = "钱包详情信息", businessType = OperaType.UPDATE, logType = 1,module = "仓储管理->修改钱包详情信息")
@PostMapping("/edit")
public AjaxResult edit(@RequestBody AccWalletInfo accWalletInfo) {
try {
return toAjax(accWalletInfoService.updateAccWalletInfo(accWalletInfo));
} catch (Exception e) {
return error("系统错误, " + e.getMessage());
}
}
/** /**
* 删除钱包详情信息 * 删除钱包详情信息
*/ */

View File

@ -0,0 +1,18 @@
package com.bonus.canteen.core.account.domain.param;
import com.bonus.common.core.web.domain.BaseEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
@Data
public class AccLeaveClearParam extends BaseEntity {
@ApiModelProperty(value = "用户编号")
private @NotNull(
message = "用户编号不能为空"
) Long userId;
@ApiModelProperty("清空类型 清空-1 清空至-2")
private Integer clearType = 1;
}

View File

@ -0,0 +1,30 @@
package com.bonus.canteen.core.account.domain.param;
import com.bonus.common.core.web.domain.BaseEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
@Data
public class AccRechargeParam extends BaseEntity {
@ApiModelProperty(value = "用户编号")
private @NotNull(
message = "用户编号不能为空"
) Long userId;
@ApiModelProperty(
value = "充值金额/分"
)
private @NotNull(
message = "金额不能为空"
) @Max(
value = 10000000L,
message = "超过最大金额限制"
) @Min(
value = 1L,
message = "小于最小充值金额"
) BigDecimal amount;
}

View File

@ -44,13 +44,6 @@ public interface AccWalletInfoMapper {
public int batchInsertAccWalletInfo(@Param("list") List<AccWalletInfo> accWalletInfos); public int batchInsertAccWalletInfo(@Param("list") List<AccWalletInfo> accWalletInfos);
/**
* 修改钱包详情信息
*
* @param accWalletInfo 钱包详情信息
* @return 结果
*/
public int updateAccWalletInfo(AccWalletInfo accWalletInfo);
/** /**
* 删除钱包详情信息 * 删除钱包详情信息

View File

@ -20,8 +20,6 @@ public interface AccSubService {
AccBatchOperationWalletPreCheckVO batchOperationWalletClearCheck(AccSubsidyBatchClearParam param); AccBatchOperationWalletPreCheckVO batchOperationWalletClearCheck(AccSubsidyBatchClearParam param);
public void addAccWalletBalance(BigDecimal amount, Long userId, Integer walletId);
List<AccSubOperationListVO> queryAccSubOperationList(AccSubOperationQueryParam param); List<AccSubOperationListVO> queryAccSubOperationList(AccSubOperationQueryParam param);
} }

View File

@ -4,9 +4,7 @@ import java.util.List;
import com.bonus.canteen.core.account.domain.AccInfo; import com.bonus.canteen.core.account.domain.AccInfo;
import com.bonus.canteen.core.account.domain.AccInfoVo; import com.bonus.canteen.core.account.domain.AccInfoVo;
import com.bonus.canteen.core.account.domain.WalletBalanceVO; import com.bonus.canteen.core.account.domain.WalletBalanceVO;
import com.bonus.canteen.core.account.domain.param.AccountBalanceEditParam; import com.bonus.canteen.core.account.domain.param.*;
import com.bonus.canteen.core.account.domain.param.AccountEnableDisableParam;
import com.bonus.canteen.core.account.domain.param.AccountInfoQueryParam;
import com.bonus.canteen.core.account.domain.vo.AccInfoDetailsVO; import com.bonus.canteen.core.account.domain.vo.AccInfoDetailsVO;
import com.bonus.canteen.core.account.domain.vo.AccInfoInvalidSumVO; import com.bonus.canteen.core.account.domain.vo.AccInfoInvalidSumVO;
import com.bonus.system.api.domain.SysUser; import com.bonus.system.api.domain.SysUser;
@ -74,4 +72,6 @@ public interface IAccInfoService {
List<AccInfoDetailsVO> queryAccInfoByUserIds(List<Long> userIds); List<AccInfoDetailsVO> queryAccInfoByUserIds(List<Long> userIds);
AccInfoDetailsVO queryAccInfoByUserId(Long userId); AccInfoDetailsVO queryAccInfoByUserId(Long userId);
void checkAccStatus(AccInfoDetailsVO accInfoVO); void checkAccStatus(AccInfoDetailsVO accInfoVO);
void individualAccRecharge(AccRechargeParam param);
void individualAccLeaveClear(AccLeaveClearParam param);
} }

View File

@ -4,9 +4,13 @@ import java.math.BigDecimal;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import com.bonus.canteen.core.account.constants.AccTradeTypeEnum;
import com.bonus.canteen.core.account.constants.AccWalletIdEnum;
import com.bonus.canteen.core.account.domain.AccWalletInfo; import com.bonus.canteen.core.account.domain.AccWalletInfo;
import com.bonus.canteen.core.account.domain.bo.WalletBalanceOperation; import com.bonus.canteen.core.account.domain.bo.WalletBalanceOperation;
import com.bonus.canteen.core.account.domain.vo.AccWalletInfoVO; import com.bonus.canteen.core.account.domain.vo.AccWalletInfoVO;
import com.bonus.canteen.core.pay.constants.PayChannelEnum;
import com.bonus.canteen.core.pay.constants.PayTypeEnum;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
/** /**
@ -43,14 +47,6 @@ public interface IAccWalletInfoService {
public int batchInsertAccWalletInfo(List<AccWalletInfo> accWalletInfos); public int batchInsertAccWalletInfo(List<AccWalletInfo> accWalletInfos);
/**
* 修改钱包详情信息
*
* @param accWalletInfo 钱包详情信息
* @return 结果
*/
public int updateAccWalletInfo(AccWalletInfo accWalletInfo);
/** /**
* 批量删除钱包详情信息 * 批量删除钱包详情信息
* *
@ -70,5 +66,18 @@ public interface IAccWalletInfoService {
Map<Long, List<AccWalletInfoVO>> selectAccWalletInfoByUserIds(List<Long> userIds); Map<Long, List<AccWalletInfoVO>> selectAccWalletInfoByUserIds(List<Long> userIds);
void updateMinBalance(List<Long> userIds, Integer walletId, BigDecimal minBalance); void updateMinBalance(List<Long> userIds, Integer walletId, BigDecimal minBalance);
void acWalletBalanceOperation(WalletBalanceOperation operation);
void addAccWalletBalance(BigDecimal amount,
Long userId,
AccWalletIdEnum walletIdEnum,
AccTradeTypeEnum accTradeTypeEnum,
PayChannelEnum payChannelEnum,
PayTypeEnum payTypeEnum);
void clearAccWalletBalance(BigDecimal amount,
Long userId,
AccWalletIdEnum accWalletIdEnum,
AccTradeTypeEnum accTradeTypeEnum,
PayChannelEnum payChannelEnum,
PayTypeEnum payTypeEnum);
} }

View File

@ -10,13 +10,14 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.ListUtil; import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.*; import cn.hutool.core.util.*;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.bonus.canteen.core.account.constants.AccTradeTypeEnum;
import com.bonus.canteen.core.account.constants.AccWalletIdEnum; import com.bonus.canteen.core.account.constants.AccWalletIdEnum;
import com.bonus.canteen.core.account.constants.AccStatusEnum; import com.bonus.canteen.core.account.constants.AccStatusEnum;
import com.bonus.canteen.core.account.constants.WalletBalanceOperationEnum;
import com.bonus.canteen.core.account.domain.*; import com.bonus.canteen.core.account.domain.*;
import com.bonus.canteen.core.account.domain.param.AccountBalanceEditParam; import com.bonus.canteen.core.account.domain.bo.WalletBalanceOperation;
import com.bonus.canteen.core.account.domain.param.AccountEnableDisableParam; import com.bonus.canteen.core.account.domain.param.*;
import com.bonus.canteen.core.account.domain.vo.AccWalletInfoVO; import com.bonus.canteen.core.account.domain.vo.AccWalletInfoVO;
import com.bonus.canteen.core.account.domain.param.AccountInfoQueryParam;
import com.bonus.canteen.core.account.domain.vo.AccInfoDetailsVO; import com.bonus.canteen.core.account.domain.vo.AccInfoDetailsVO;
import com.bonus.canteen.core.account.domain.vo.AccInfoInvalidSumVO; import com.bonus.canteen.core.account.domain.vo.AccInfoInvalidSumVO;
import com.bonus.canteen.core.account.mq.AccMqSender; import com.bonus.canteen.core.account.mq.AccMqSender;
@ -29,7 +30,10 @@ import cn.hutool.json.JSONUtil;
import com.bonus.canteen.core.account.domain.AccInfoVo; import com.bonus.canteen.core.account.domain.AccInfoVo;
import com.bonus.canteen.core.account.domain.AccWalletInfo; import com.bonus.canteen.core.account.domain.AccWalletInfo;
import com.bonus.canteen.core.account.domain.WalletBalanceVO; import com.bonus.canteen.core.account.domain.WalletBalanceVO;
import com.bonus.canteen.core.account.utils.AccRedisUtils;
import com.bonus.canteen.core.common.utils.MqUtil; import com.bonus.canteen.core.common.utils.MqUtil;
import com.bonus.canteen.core.pay.constants.PayChannelEnum;
import com.bonus.canteen.core.pay.constants.PayTypeEnum;
import com.bonus.common.core.exception.ServiceException; import com.bonus.common.core.exception.ServiceException;
import com.bonus.common.core.utils.DateUtils; import com.bonus.common.core.utils.DateUtils;
import com.bonus.common.houqin.constant.LeCodeUseSceneEnum; import com.bonus.common.houqin.constant.LeCodeUseSceneEnum;
@ -130,27 +134,27 @@ public class AccInfoServiceImpl implements IAccInfoService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void updateAccInfo(AccountBalanceEditParam accountBalanceEditParam) { public void updateAccInfo(AccountBalanceEditParam accountBalanceEditParam) {
LocalDate accEndDate = accountBalanceEditParam.getEndDate(); // LocalDate accEndDate = accountBalanceEditParam.getEndDate();
Map<AccWalletIdEnum, BigDecimal> walletLimits = new HashMap<>(); // Map<AccWalletIdEnum, BigDecimal> walletLimits = new HashMap<>();
walletLimits.put(AccWalletIdEnum.WALLET, accountBalanceEditParam.getMinWalletBalLimit()); // walletLimits.put(AccWalletIdEnum.WALLET, accountBalanceEditParam.getMinWalletBalLimit());
walletLimits.put(AccWalletIdEnum.SUBSIDY, accountBalanceEditParam.getMinSubBalLimit()); // walletLimits.put(AccWalletIdEnum.SUBSIDY, accountBalanceEditParam.getMinSubBalLimit());
for (Map.Entry<AccWalletIdEnum, BigDecimal> entry : walletLimits.entrySet()) { // for (Map.Entry<AccWalletIdEnum, BigDecimal> entry : walletLimits.entrySet()) {
accWalletInfoService.updateMinBalance(ListUtil.toList(accountBalanceEditParam.getUserId()), entry.getKey().getKey(), entry.getValue()); // accWalletInfoService.updateMinBalance(ListUtil.toList(accountBalanceEditParam.getUserId()), entry.getKey().getKey(), entry.getValue());
} // }
updateAccountEndDate(ListUtil.toList(accountBalanceEditParam.getUserId()), accEndDate); // updateAccountEndDate(ListUtil.toList(accountBalanceEditParam.getUserId()), accEndDate);
} }
protected void updateAccountEndDate(List<Long> userIds, LocalDate accEndDate) { protected void updateAccountEndDate(List<Long> userIds, LocalDate accEndDate) {
if (ObjectUtil.isEmpty(userIds)) { // if (ObjectUtil.isEmpty(userIds)) {
log.info("更新账户有效期-账户信息为空"); // log.info("更新账户有效期-账户信息为空");
return; // return;
} // }
try { // try {
accInfoMapper.updateAccInfoEndDateByUserId(accEndDate, userIds, SecurityUtils.getUsername()); // accInfoMapper.updateAccInfoEndDateByUserId(accEndDate, userIds, SecurityUtils.getUsername());
} catch (Exception e) { // } catch (Exception e) {
log.error("[更新账户有效期失败", e); // log.error("[更新账户有效期失败", e);
throw new ServiceException("更新账户有效期失败"); // throw new ServiceException("更新账户有效期失败");
} // }
} }
@ -370,4 +374,44 @@ public class AccInfoServiceImpl implements IAccInfoService {
accInfoVo.setAccAllBal(accInfoVo.getWalletBal().add(accInfoVo.getSubsidyBal())); accInfoVo.setAccAllBal(accInfoVo.getWalletBal().add(accInfoVo.getSubsidyBal()));
} }
} }
@Transactional(
rollbackFor = {Exception.class}
)
public void individualAccRecharge(AccRechargeParam param) {
AccInfoDetailsVO accInfoVO = queryAccInfoByUserId(param.getUserId());
if(Objects.isNull(accInfoVO)) {
throw new ServiceException("账户不存在");
}
checkAccStatus(accInfoVO);
accWalletInfoService.addAccWalletBalance(
param.getAmount(),
param.getUserId(),
AccWalletIdEnum.WALLET,
AccTradeTypeEnum.RECHARGE,
PayChannelEnum.GC_SYSTEM,
PayTypeEnum.CASH);
}
@Transactional(
rollbackFor = {Exception.class}
)
public void individualAccLeaveClear(AccLeaveClearParam param) {
AccInfoDetailsVO accInfoVO = queryAccInfoByUserId(param.getUserId());
if(Objects.isNull(accInfoVO)) {
throw new ServiceException("账户不存在");
}
checkAccStatus(accInfoVO);
List<AccWalletInfo> walletInfoList = accWalletInfoService.selectAccWalletInfoByUserId(accInfoVO.getUserId());
if(CollUtil.isEmpty(walletInfoList)) {
throw new ServiceException("补贴钱包不存在");
}
for(AccWalletInfo walletInfo : walletInfoList){
accWalletInfoService.clearAccWalletBalance(
walletInfo.getWalletBal(),
param.getUserId(),
AccWalletIdEnum.getEnum(walletInfo.getWalletId()),
AccTradeTypeEnum.CLEAR,
PayChannelEnum.GC_SYSTEM,
PayTypeEnum.MEAL_CARD);
}
}
} }

View File

@ -2,7 +2,6 @@ package com.bonus.canteen.core.account.service.impl;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import com.bonus.canteen.core.account.constants.AccTradeTypeEnum; import com.bonus.canteen.core.account.constants.AccTradeTypeEnum;
import com.bonus.canteen.core.account.constants.AccWalletClearTypeEnum;
import com.bonus.canteen.core.account.constants.AccWalletIdEnum; import com.bonus.canteen.core.account.constants.AccWalletIdEnum;
import com.bonus.canteen.core.account.constants.WalletBalanceOperationEnum; import com.bonus.canteen.core.account.constants.WalletBalanceOperationEnum;
import com.bonus.canteen.core.account.domain.AccWalletInfo; import com.bonus.canteen.core.account.domain.AccWalletInfo;
@ -64,7 +63,12 @@ public class AccSubServiceImpl implements AccSubService {
throw new ServiceException("账户不存在"); throw new ServiceException("账户不存在");
} }
accInfoService.checkAccStatus(accInfoVO); accInfoService.checkAccStatus(accInfoVO);
addAccWalletBalance(param.getAmount(), param.getUserId(), AccWalletIdEnum.SUBSIDY.getKey()); accWalletInfoService.addAccWalletBalance(param.getAmount(),
param.getUserId(),
AccWalletIdEnum.SUBSIDY,
AccTradeTypeEnum.SUBSIDY,
PayChannelEnum.GC_SYSTEM,
PayTypeEnum.SUB_GRANT);
} }
@Transactional( @Transactional(
rollbackFor = {Exception.class} rollbackFor = {Exception.class}
@ -101,7 +105,12 @@ public class AccSubServiceImpl implements AccSubService {
if(Objects.isNull(walletInfo)) { if(Objects.isNull(walletInfo)) {
throw new ServiceException("补贴钱包不存在"); throw new ServiceException("补贴钱包不存在");
} }
clearAccWalletBalance(walletInfo.getWalletBal(), param.getUserId(), AccWalletIdEnum.SUBSIDY.getKey()); accWalletInfoService.clearAccWalletBalance(walletInfo.getWalletBal(),
param.getUserId(),
AccWalletIdEnum.SUBSIDY,
AccTradeTypeEnum.CLEAR,
PayChannelEnum.GC_SYSTEM,
PayTypeEnum.SUB_GRANT);
} }
// private BigDecimal calculateClearAmount(BigDecimal walletBal, Integer clearType, BigDecimal amount) { // private BigDecimal calculateClearAmount(BigDecimal walletBal, Integer clearType, BigDecimal amount) {
@ -157,7 +166,13 @@ public class AccSubServiceImpl implements AccSubService {
throw new ServiceException(accInfo.getNickName() + "的账户不存在"); throw new ServiceException(accInfo.getNickName() + "的账户不存在");
} }
accInfoService.checkAccStatus(accInfoVO); accInfoService.checkAccStatus(accInfoVO);
addAccWalletBalance(amount, accInfo.getUserId(), AccWalletIdEnum.SUBSIDY.getKey()); accWalletInfoService.addAccWalletBalance(
amount,
accInfo.getUserId(),
AccWalletIdEnum.SUBSIDY,
AccTradeTypeEnum.SUBSIDY,
PayChannelEnum.GC_SYSTEM,
PayTypeEnum.SUB_GRANT);
} catch (Exception ex) { } catch (Exception ex) {
log.error("批量补贴充值异常, 用户id: {}, 补贴金额:{}", accInfo.getUserId(), amount, ex); log.error("批量补贴充值异常, 用户id: {}, 补贴金额:{}", accInfo.getUserId(), amount, ex);
} }
@ -200,30 +215,6 @@ public class AccSubServiceImpl implements AccSubService {
log.info("批量清空补贴结束"); log.info("批量清空补贴结束");
} }
public void addAccWalletBalance(BigDecimal amount, Long userId, Integer walletId) {
log.info("新增补贴入参: amount{} userId{}walletId{}", amount, userId, walletId);
AccRedisUtils.lockUpdateAccWalletBalance(userId);
try {
WalletBalanceOperation operation = new WalletBalanceOperation();
operation.setAmount(amount);
operation.setUserId(userId);
operation.setWalletId(walletId);
operation.setOperationType(WalletBalanceOperationEnum.ADD_BAL.getKey());
if (AccWalletIdEnum.SUBSIDY.getKey().equals(walletId)) {
operation.setTradeType(AccTradeTypeEnum.SUBSIDY.getKey());
operation.setPayChannel(PayChannelEnum.GW_SYSTEM.getKey());
operation.setPayType(PayTypeEnum.SUB_GRANT.getKey());
} else if (AccWalletIdEnum.WALLET.getKey().equals(walletId)) {
operation.setTradeType(AccTradeTypeEnum.RECHARGE.getKey());
operation.setPayChannel(PayChannelEnum.ALI.getKey());
operation.setPayType(PayTypeEnum.ALI_H5_PAY.getKey());
}
accWalletInfoService.acWalletBalanceOperation(operation);
log.info("新增补贴结束");
} finally {
AccRedisUtils.unlockUpdateAccWalletBalance(userId);
}
}
// public void reduceAccWalletBalance(BigDecimal amount, Long userId, Integer walletId) { // public void reduceAccWalletBalance(BigDecimal amount, Long userId, Integer walletId) {
// log.info("清空补贴入参: amount{} userId{}walletId{}", amount, userId, walletId); // log.info("清空补贴入参: amount{} userId{}walletId{}", amount, userId, walletId);
@ -244,25 +235,6 @@ public class AccSubServiceImpl implements AccSubService {
// } // }
// } // }
public void clearAccWalletBalance(BigDecimal amount, Long userId, Integer walletId) {
log.info("清空补贴入参: userId{}walletId{}", userId, walletId);
AccRedisUtils.lockUpdateAccWalletBalance(userId);
try {
WalletBalanceOperation operation = new WalletBalanceOperation();
operation.setUserId(userId);
operation.setAmount(amount);
operation.setWalletId(walletId);
operation.setOperationType(WalletBalanceOperationEnum.REDUCE_BAL.getKey());
operation.setTradeType(AccTradeTypeEnum.CLEAR.getKey());
operation.setPayChannel(PayChannelEnum.GW_SYSTEM.getKey());
operation.setPayType(PayTypeEnum.SUB_GRANT.getKey());
accWalletInfoService.acWalletBalanceOperation(operation);
log.info("清空补贴结束");
} finally {
AccRedisUtils.unlockUpdateAccWalletBalance(userId);
}
}
public AccBatchOperationWalletPreCheckVO batchOperationWalletClearCheck(AccSubsidyBatchClearParam param) { public AccBatchOperationWalletPreCheckVO batchOperationWalletClearCheck(AccSubsidyBatchClearParam param) {
log.info("批量清空校验操作人数:{}", param.getUserIds().size()); log.info("批量清空校验操作人数:{}", param.getUserIds().size());
List<AccInfoDetailsVO> accInfoVOList = accInfoService.queryAccInfoByUserIds(param.getUserIds()); List<AccInfoDetailsVO> accInfoVOList = accInfoService.queryAccInfoByUserIds(param.getUserIds());

View File

@ -13,6 +13,7 @@ import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.bonus.canteen.core.account.constants.AccTradeStateEnum; import com.bonus.canteen.core.account.constants.AccTradeStateEnum;
import com.bonus.canteen.core.account.constants.AccTradeTypeEnum; import com.bonus.canteen.core.account.constants.AccTradeTypeEnum;
import com.bonus.canteen.core.account.constants.AccWalletIdEnum;
import com.bonus.canteen.core.account.constants.WalletBalanceOperationEnum; import com.bonus.canteen.core.account.constants.WalletBalanceOperationEnum;
import com.bonus.canteen.core.account.domain.AccTrade; import com.bonus.canteen.core.account.domain.AccTrade;
import com.bonus.canteen.core.account.domain.AccTradeWalletDetail; import com.bonus.canteen.core.account.domain.AccTradeWalletDetail;
@ -20,7 +21,10 @@ import com.bonus.canteen.core.account.domain.bo.WalletBalanceOperation;
import com.bonus.canteen.core.account.domain.vo.AccWalletInfoVO; import com.bonus.canteen.core.account.domain.vo.AccWalletInfoVO;
import com.bonus.canteen.core.account.service.IAccTradeService; import com.bonus.canteen.core.account.service.IAccTradeService;
import com.bonus.canteen.core.account.service.IAccTradeWalletDetailService; import com.bonus.canteen.core.account.service.IAccTradeWalletDetailService;
import com.bonus.canteen.core.account.utils.AccRedisUtils;
import com.bonus.canteen.core.pay.constants.PayChannelEnum;
import com.bonus.canteen.core.pay.constants.PayStateEnum; import com.bonus.canteen.core.pay.constants.PayStateEnum;
import com.bonus.canteen.core.pay.constants.PayTypeEnum;
import com.bonus.common.core.constant.SecurityConstants; import com.bonus.common.core.constant.SecurityConstants;
import com.bonus.common.core.exception.ServiceException; import com.bonus.common.core.exception.ServiceException;
import com.bonus.common.core.utils.DateUtils; import com.bonus.common.core.utils.DateUtils;
@ -114,18 +118,6 @@ public class AccWalletInfoServiceImpl implements IAccWalletInfoService {
} }
} }
/**
* 修改钱包详情信息
*
* @param accWalletInfo 钱包详情信息
* @return 结果
*/
@Override
public int updateAccWalletInfo(AccWalletInfo accWalletInfo) {
accWalletInfo.setUpdateTime(DateUtils.getNowDate());
return accWalletInfoMapper.updateAccWalletInfo(accWalletInfo);
}
/** /**
* 批量删除钱包详情信息 * 批量删除钱包详情信息
* *
@ -180,23 +172,73 @@ public class AccWalletInfoServiceImpl implements IAccWalletInfoService {
} }
} }
private void addAccWalletInfo(WalletBalanceOperation operation) {
accWalletInfoMapper.addAccWalletInfo(operation.getAmount(), operation.getUserId(), operation.getWalletId(),
SecurityUtils.getUserId().toString(), DateUtils.toLocalDateTime(new Date()));
}
private void reduceAccWalletInfo(WalletBalanceOperation operation) {
accWalletInfoMapper.reduceAccWalletInfo(operation.getAmount(), operation.getUserId(), operation.getWalletId(),
SecurityUtils.getUserId().toString(), DateUtils.toLocalDateTime(new Date()));
}
// private void clearAccWalletInfo(WalletBalanceOperation operation) { // private void clearAccWalletInfo(WalletBalanceOperation operation) {
// accWalletInfoMapper.clearAccWalletInfo(operation.getUserId(), operation.getWalletId(), // accWalletInfoMapper.clearAccWalletInfo(operation.getUserId(), operation.getWalletId(),
// SecurityUtils.getUserId().toString(), DateUtils.toLocalDateTime(new Date())); // SecurityUtils.getUserId().toString(), DateUtils.toLocalDateTime(new Date()));
// } // }
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void acWalletBalanceOperation(WalletBalanceOperation operation) { public void addAccWalletBalance(BigDecimal amount,
Long userId,
AccWalletIdEnum walletIdEnum,
AccTradeTypeEnum accTradeTypeEnum,
PayChannelEnum payChannelEnum,
PayTypeEnum payTypeEnum) {
log.info("新增钱包入参: amount{} userId{}walletId{}", amount, userId, walletIdEnum.getKey());
AccRedisUtils.lockUpdateAccWalletBalance(userId);
try {
WalletBalanceOperation operation = operationBuilder(amount,
userId,
walletIdEnum.getKey(),
accTradeTypeEnum.getKey(),
payChannelEnum.getKey(),
payTypeEnum.getKey());
operation.setOperationType(WalletBalanceOperationEnum.ADD_BAL.getKey());
acWalletBalanceOperation(operation);
log.info("新增钱包结束");
} finally {
AccRedisUtils.unlockUpdateAccWalletBalance(userId);
}
}
@Transactional(rollbackFor = Exception.class)
public void clearAccWalletBalance(BigDecimal amount,
Long userId,
AccWalletIdEnum accWalletIdEnum,
AccTradeTypeEnum accTradeTypeEnum,
PayChannelEnum payChannelEnum,
PayTypeEnum payTypeEnum) {
log.info("扣减钱包入参: userId{}walletId{}", userId, accWalletIdEnum.getKey());
AccRedisUtils.lockUpdateAccWalletBalance(userId);
try {
WalletBalanceOperation operation = operationBuilder(amount,
userId,
accWalletIdEnum.getKey(),
accTradeTypeEnum.getKey(),
payChannelEnum.getKey(),
payTypeEnum.getKey());
operation.setOperationType(WalletBalanceOperationEnum.REDUCE_BAL.getKey());
acWalletBalanceOperation(operation);
log.info("扣减钱包结束");
} finally {
AccRedisUtils.unlockUpdateAccWalletBalance(userId);
}
}
private WalletBalanceOperation operationBuilder(BigDecimal amount, Long userId, Integer walletId,
Integer tradeType, Integer payChannel, Integer payType) {
WalletBalanceOperation operation = new WalletBalanceOperation();
operation.setUserId(userId);
operation.setAmount(amount);
operation.setWalletId(walletId);
operation.setTradeType(tradeType);
operation.setPayChannel(payChannel);
operation.setPayType(payType);
return operation;
}
private void acWalletBalanceOperation(WalletBalanceOperation operation) {
try{ try{
switch (WalletBalanceOperationEnum.getEnum(operation.getOperationType())) { switch (WalletBalanceOperationEnum.getEnum(operation.getOperationType())) {
case ADD_BAL: case ADD_BAL:
@ -254,4 +296,14 @@ public class AccWalletInfoServiceImpl implements IAccWalletInfoService {
throw new ServiceException("修改钱包失败"); throw new ServiceException("修改钱包失败");
} }
} }
private void addAccWalletInfo(WalletBalanceOperation operation) {
accWalletInfoMapper.addAccWalletInfo(operation.getAmount(), operation.getUserId(), operation.getWalletId(),
SecurityUtils.getUserId().toString(), DateUtils.toLocalDateTime(new Date()));
}
private void reduceAccWalletInfo(WalletBalanceOperation operation) {
accWalletInfoMapper.reduceAccWalletInfo(operation.getAmount(), operation.getUserId(), operation.getWalletId(),
SecurityUtils.getUserId().toString(), DateUtils.toLocalDateTime(new Date()));
}
} }

View File

@ -4,13 +4,10 @@ package com.bonus.canteen.core.pay.constants;
//import com.bonus.canteen.core.pay.channel.account.extension.AccPayExtension; //import com.bonus.canteen.core.pay.channel.account.extension.AccPayExtension;
//import com.bonus.canteen.core.pay.channel.ali.extension.AliPayExtension; //import com.bonus.canteen.core.pay.channel.ali.extension.AliPayExtension;
import java.util.*;
import java.util.stream.Collectors;
public enum PayChannelEnum { public enum PayChannelEnum {
ACC(1, "系统账户", null), //AccPayExtension.class ACC(1, "系统账户", null), //AccPayExtension.class
ALI(3, "支付宝", null), //AliPayExtension.class ALI(3, "支付宝", null), //AliPayExtension.class
GW_SYSTEM(20, "系统后台", null); GC_SYSTEM(20, "系统后台", null);
private final Integer key; private final Integer key;
private final String desc; private final String desc;

View File

@ -3,18 +3,23 @@ package com.bonus.canteen.core.pay.controller;
import com.alipay.api.AlipayApiException; import com.alipay.api.AlipayApiException;
import com.alipay.api.internal.util.AlipaySignature; import com.alipay.api.internal.util.AlipaySignature;
import com.bonus.canteen.core.account.constants.AccTradeStateEnum; import com.bonus.canteen.core.account.constants.AccTradeStateEnum;
import com.bonus.canteen.core.account.constants.AccTradeTypeEnum;
import com.bonus.canteen.core.account.constants.AccWalletIdEnum; import com.bonus.canteen.core.account.constants.AccWalletIdEnum;
import com.bonus.canteen.core.account.domain.AccTrade; import com.bonus.canteen.core.account.domain.AccTrade;
import com.bonus.canteen.core.account.service.AccSubService; import com.bonus.canteen.core.account.service.AccSubService;
import com.bonus.canteen.core.account.service.IAccTradeService; import com.bonus.canteen.core.account.service.IAccTradeService;
import com.bonus.canteen.core.account.service.IAccWalletInfoService;
import com.bonus.canteen.core.pay.constants.AliPayTradeStatusEnum; import com.bonus.canteen.core.pay.constants.AliPayTradeStatusEnum;
import com.bonus.canteen.core.pay.constants.PayChannelEnum;
import com.bonus.canteen.core.pay.constants.PayStateEnum; import com.bonus.canteen.core.pay.constants.PayStateEnum;
import com.bonus.canteen.core.account.domain.vo.AccTradeVo; import com.bonus.canteen.core.account.domain.vo.AccTradeVo;
import com.bonus.canteen.core.pay.constants.PayTypeEnum;
import com.bonus.canteen.core.pay.util.AlipayConfig; import com.bonus.canteen.core.pay.util.AlipayConfig;
import com.bonus.common.security.utils.SecurityUtils; import com.bonus.common.security.utils.SecurityUtils;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@ -36,7 +41,9 @@ public class NotifyCotroller {
IAccTradeService accTradeService; IAccTradeService accTradeService;
@Autowired @Autowired
AccSubService accSubService; AccSubService accSubService;
@Autowired
@Lazy
private IAccWalletInfoService accWalletInfoService;
@RequestMapping("getnotify") @RequestMapping("getnotify")
public void getNotify(HttpServletRequest request, HttpServletResponse response) throws AlipayApiException, IOException { public void getNotify(HttpServletRequest request, HttpServletResponse response) throws AlipayApiException, IOException {
Map<String, String> params = new HashMap<String, String>(); Map<String, String> params = new HashMap<String, String>();
@ -80,7 +87,13 @@ public class NotifyCotroller {
updateTrade.setTradeState(AccTradeStateEnum.TAKE_EFFECT.getKey().longValue()); updateTrade.setTradeState(AccTradeStateEnum.TAKE_EFFECT.getKey().longValue());
updateTrade.setFailReason(trade_status); updateTrade.setFailReason(trade_status);
if (PayStateEnum.PAY_INPROCESS.getKey().equals(accTradeInDB.getPayState())) { if (PayStateEnum.PAY_INPROCESS.getKey().equals(accTradeInDB.getPayState())) {
accSubService.addAccWalletBalance(totalAmount, SecurityUtils.getUserId(), AccWalletIdEnum.WALLET.getKey()); accWalletInfoService.addAccWalletBalance(
totalAmount,
SecurityUtils.getUserId(),
AccWalletIdEnum.WALLET,
AccTradeTypeEnum.RECHARGE,
PayChannelEnum.ALI,
PayTypeEnum.ALI_H5_PAY);
} }
this.accTradeService.updateAccTradeVoByOrderNo(updateTrade); this.accTradeService.updateAccTradeVoByOrderNo(updateTrade);
} else if (AliPayTradeStatusEnum.TRADE_STATUS_SUCCESS.getKey().equals(trade_status)) { } else if (AliPayTradeStatusEnum.TRADE_STATUS_SUCCESS.getKey().equals(trade_status)) {
@ -95,7 +108,13 @@ public class NotifyCotroller {
updateTrade.setTradeState(AccTradeStateEnum.TAKE_EFFECT.getKey().longValue()); updateTrade.setTradeState(AccTradeStateEnum.TAKE_EFFECT.getKey().longValue());
updateTrade.setFailReason(trade_status); updateTrade.setFailReason(trade_status);
if (PayStateEnum.PAY_INPROCESS.getKey().equals(accTradeInDB.getPayState())) { if (PayStateEnum.PAY_INPROCESS.getKey().equals(accTradeInDB.getPayState())) {
accSubService.addAccWalletBalance(totalAmount, SecurityUtils.getUserId(), AccWalletIdEnum.WALLET.getKey()); accWalletInfoService.addAccWalletBalance(
totalAmount,
SecurityUtils.getUserId(),
AccWalletIdEnum.WALLET,
AccTradeTypeEnum.RECHARGE,
PayChannelEnum.ALI,
PayTypeEnum.ALI_H5_PAY);
} }
this.accTradeService.updateAccTradeVoByOrderNo(updateTrade); this.accTradeService.updateAccTradeVoByOrderNo(updateTrade);
} else { } else {

View File

@ -13,7 +13,9 @@ import com.bonus.canteen.core.account.constants.AccWalletIdEnum;
import com.bonus.canteen.core.account.domain.AccTrade; import com.bonus.canteen.core.account.domain.AccTrade;
import com.bonus.canteen.core.account.service.AccSubService; import com.bonus.canteen.core.account.service.AccSubService;
import com.bonus.canteen.core.account.service.IAccTradeService; import com.bonus.canteen.core.account.service.IAccTradeService;
import com.bonus.canteen.core.account.service.IAccWalletInfoService;
import com.bonus.canteen.core.pay.constants.AliPayTradeStatusEnum; import com.bonus.canteen.core.pay.constants.AliPayTradeStatusEnum;
import com.bonus.canteen.core.pay.constants.PayChannelEnum;
import com.bonus.canteen.core.pay.constants.PayStateEnum; import com.bonus.canteen.core.pay.constants.PayStateEnum;
import com.bonus.canteen.core.pay.constants.PayTypeEnum; import com.bonus.canteen.core.pay.constants.PayTypeEnum;
import com.bonus.canteen.core.pay.util.AlipayConfig; import com.bonus.canteen.core.pay.util.AlipayConfig;
@ -23,6 +25,7 @@ import com.bonus.common.security.utils.SecurityUtils;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
@ -48,7 +51,9 @@ public class PayController {
IAccTradeService accTradeService; IAccTradeService accTradeService;
@Autowired @Autowired
AccSubService accSubService; AccSubService accSubService;
@Autowired
@Lazy
private IAccWalletInfoService accWalletInfoService;
@PostMapping("pay") @PostMapping("pay")
public void pay(@RequestBody AccTradeVo accTradeVo, HttpServletResponse response) throws AlipayApiException, IOException { public void pay(@RequestBody AccTradeVo accTradeVo, HttpServletResponse response) throws AlipayApiException, IOException {
// 预装数据存档 // 预装数据存档
@ -114,7 +119,13 @@ public class PayController {
AccTrade accTradeInDB = accTradeService.selectAccTradeByOrderNo(accTradeVo.getOrderNo()); AccTrade accTradeInDB = accTradeService.selectAccTradeByOrderNo(accTradeVo.getOrderNo());
if (PayStateEnum.PAY_INPROCESS.getKey().equals(accTradeInDB.getPayState())) { if (PayStateEnum.PAY_INPROCESS.getKey().equals(accTradeInDB.getPayState())) {
BigDecimal totalAmount = new BigDecimal(response.getTotalAmount()); BigDecimal totalAmount = new BigDecimal(response.getTotalAmount());
accSubService.addAccWalletBalance(totalAmount, accTradeVo.getUserId(), AccWalletIdEnum.WALLET.getKey()); accWalletInfoService.addAccWalletBalance(
totalAmount,
accTradeVo.getUserId(),
AccWalletIdEnum.WALLET,
AccTradeTypeEnum.RECHARGE,
PayChannelEnum.ALI,
PayTypeEnum.ALI_H5_PAY);
} }
this.accTradeService.updateAccTradeVoByOrderNo(updateTrade); this.accTradeService.updateAccTradeVoByOrderNo(updateTrade);
} }

View File

@ -104,25 +104,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</foreach> </foreach>
</insert> </insert>
<update id="updateAccWalletInfo" parameterType="com.bonus.canteen.core.account.domain.AccWalletInfo">
update acc_wallet_info
<trim prefix="SET" suffixOverrides=",">
<if test="accId != null">acc_id = #{accId},</if>
<if test="walletId != null">wallet_id = #{walletId},</if>
<if test="walletBal != null">wallet_bal = #{walletBal},</if>
<if test="limitBalance != null">limit_balance = #{limitBalance},</if>
<if test="frozenBalance != null">frozen_balance = #{frozenBalance},</if>
<if test="expiredTime != null">expired_time = #{expiredTime},</if>
<if test="lastSubsidyAmount != null">last_subsidy_amount = #{lastSubsidyAmount},</if>
<if test="lastSubsidyTime != null">last_subsidy_time = #{lastSubsidyTime},</if>
<if test="createBy != null">create_by = #{createBy},</if>
<if test="createTime != null">create_time = #{createTime},</if>
<if test="updateBy != null">update_by = #{updateBy},</if>
<if test="updateTime != null">update_time = #{updateTime},</if>
</trim>
where user_id = #{userId}
</update>
<delete id="deleteAccWalletInfoByUserId" parameterType="Long"> <delete id="deleteAccWalletInfoByUserId" parameterType="Long">
delete from acc_wallet_info where user_id = #{userId} delete from acc_wallet_info where user_id = #{userId}
</delete> </delete>