Merge remote-tracking branch 'origin/master'

This commit is contained in:
sxu 2025-04-21 16:18:21 +08:00
commit ad1a3b605b
15 changed files with 199 additions and 96 deletions

View File

@ -1,15 +1,19 @@
package com.bonus.canteen.core.account.controller; package com.bonus.canteen.core.account.controller;
import java.util.List; import java.util.List;
import java.util.Objects;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid; import javax.validation.Valid;
import com.bonus.canteen.core.account.constants.AccTradeTypeEnum;
import com.bonus.canteen.core.account.domain.AccInfo; import com.bonus.canteen.core.account.domain.AccInfo;
import com.bonus.canteen.core.account.domain.param.*; import com.bonus.canteen.core.account.domain.param.*;
import com.bonus.canteen.core.account.domain.vo.AccInfoDetailsVO; import com.bonus.canteen.core.account.domain.vo.AccInfoDetailsVO;
import com.bonus.canteen.core.account.service.AccOperationHistoryService; import com.bonus.canteen.core.account.service.AccOperationHistoryService;
import com.bonus.common.core.exception.ServiceException;
import com.bonus.common.log.enums.OperaType; import com.bonus.common.log.enums.OperaType;
import com.bonus.common.security.utils.SecurityUtils;
import com.bonus.system.api.domain.SysUser; import com.bonus.system.api.domain.SysUser;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
@ -194,10 +198,44 @@ public class AccInfoController extends BaseController {
return AjaxResult.success(); return AjaxResult.success();
} }
@ApiOperation("单人取钱")
@PostMapping("/withdraw")
public AjaxResult individualAccWithdraw(@RequestBody @Valid AccWithdrawParam param) {
this.accInfoService.individualAccWithdraw(param);
return AjaxResult.success();
}
@ApiOperation("离职清空余额(个人钱包和补贴钱包)") @ApiOperation("离职清空余额(个人钱包和补贴钱包)")
@PostMapping({"/leave/clear"}) @PostMapping({"/leave/clear"})
public AjaxResult individualAccLeaveClear(@RequestBody @Valid AccLeaveClearParam param) { public AjaxResult individualAccLeaveClear(@RequestBody @Valid AccLeaveClearParam param) {
this.accInfoService.individualAccLeaveClear(param); this.accInfoService.individualAccLeaveClear(param);
return AjaxResult.success(); return AjaxResult.success();
} }
@ApiOperation("个人钱包操作记录")
@PostMapping({"/wallet/history"})
public TableDataInfo queryAccPersonalWalOperationAddList(@RequestBody AccWalletOperationQueryParam request) {
if(Objects.isNull(request)) {
throw new ServiceException("请求参数为空");
}
if(Objects.isNull(request.getTradeType())) {
throw new ServiceException("交易类型为空");
}
startPage();
return getDataTable(accInfoService.queryAccPersonalWalOperationAddList(request));
}
@ApiOperation("手机端个人钱包操作记录")
@PostMapping({"/mobile/wallet/history"})
public TableDataInfo queryAccPersonalWalOperationAddListForMobile(@RequestBody AccWalletOperationQueryParam request) {
if(Objects.isNull(request)) {
throw new ServiceException("请求参数为空");
}
if(Objects.isNull(request.getTradeType())) {
throw new ServiceException("交易类型为空");
}
startPage();
request.setUserId(SecurityUtils.getUserId());
return getDataTable(accInfoService.queryAccPersonalWalOperationAddList(request));
}
} }

View File

@ -65,7 +65,7 @@ public class AccSubsidyController extends BaseController {
@ApiOperation("补贴记录") @ApiOperation("补贴记录")
@PostMapping({"/add/history"}) @PostMapping({"/add/history"})
public TableDataInfo queryAccSubOperationAddList(@RequestBody AccSubOperationQueryParam request) { public TableDataInfo queryAccSubOperationAddList(@RequestBody AccWalletOperationQueryParam request) {
startPage(); startPage();
request.setTradeType(AccTradeTypeEnum.SUBSIDY.getKey()); request.setTradeType(AccTradeTypeEnum.SUBSIDY.getKey());
return getDataTable(accSubService.queryAccSubOperationList(request)); return getDataTable(accSubService.queryAccSubOperationList(request));
@ -73,7 +73,7 @@ public class AccSubsidyController extends BaseController {
@ApiOperation("补贴清空记录") @ApiOperation("补贴清空记录")
@PostMapping({"/clear/history"}) @PostMapping({"/clear/history"})
public TableDataInfo queryAccSubOperationClearList(@RequestBody AccSubOperationQueryParam request) { public TableDataInfo queryAccSubOperationClearList(@RequestBody AccWalletOperationQueryParam request) {
startPage(); startPage();
request.setTradeType(AccTradeTypeEnum.CLEAR.getKey()); request.setTradeType(AccTradeTypeEnum.CLEAR.getKey());
return getDataTable(accSubService.queryAccSubOperationList(request)); return getDataTable(accSubService.queryAccSubOperationList(request));

View File

@ -10,7 +10,7 @@ import java.time.LocalDateTime;
import java.util.List; import java.util.List;
@Data @Data
public class AccSubOperationQueryParam extends BaseEntity { public class AccWalletOperationQueryParam extends BaseEntity {
@ApiModelProperty("查询组织id集合") @ApiModelProperty("查询组织id集合")
private List<Long> deptIds; private List<Long> deptIds;
@ApiModelProperty("开始时间") @ApiModelProperty("开始时间")
@ -20,12 +20,12 @@ public class AccSubOperationQueryParam extends BaseEntity {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime endDateTime; private LocalDateTime endDateTime;
@ApiModelProperty("交易类型") @ApiModelProperty("交易类型")
@JsonIgnore
private Integer tradeType; private Integer tradeType;
private String searchValue; private String searchValue;
private String createBy; private String createBy;
private Long userId;
public AccSubOperationQueryParam() { public AccWalletOperationQueryParam() {
this.endDateTime = LocalDateTime.now().plusDays(7); this.endDateTime = LocalDateTime.now().plusDays(7);
this.startDateTime = LocalDateTime.now().minusDays(7); this.startDateTime = LocalDateTime.now().minusDays(7);
} }

View File

@ -0,0 +1,27 @@
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 AccWithdrawParam extends BaseEntity {
@ApiModelProperty(value = "用户编号")
private @NotNull(
message = "用户编号不能为空"
) Long userId;
@ApiModelProperty(
value = "提现金额/分"
)
private @NotNull(
message = "提现金额不能为空"
) @Min(
value = 0L,
message = "提现不能小于0"
) BigDecimal amount;
}

View File

@ -10,7 +10,7 @@ import java.math.BigDecimal;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@Data @Data
public class AccSubOperationListVO { public class AccOperationListVO {
@ApiModelProperty("补贴时间") @ApiModelProperty("补贴时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime tradeTime; private LocalDateTime tradeTime;
@ -26,17 +26,17 @@ public class AccSubOperationListVO {
private Integer userType; private Integer userType;
@ApiModelProperty("用户类别(展示)") @ApiModelProperty("用户类别(展示)")
private String userTypeName; private String userTypeName;
@ApiModelProperty("补贴金额") @ApiModelProperty("金额")
private BigDecimal amount; private BigDecimal amount;
@ApiModelProperty("补贴后补贴钱包余额") @ApiModelProperty("钱包余额")
private BigDecimal walletBal; private BigDecimal walletBal;
@ApiModelProperty("补贴记录交易状态") @ApiModelProperty("交易状态")
private Integer tradeState; private Integer tradeState;
@ApiModelProperty("充值结果名称") @ApiModelProperty("结果名称")
private String tradeStateName; private String tradeStateName;
@ApiModelProperty("操作员") @ApiModelProperty("操作员")
private String createBy; private String createBy;
@ApiModelProperty("补贴订单号") @ApiModelProperty("交易单号")
private Long tradeId; private Long tradeId;
public String getTradeStateName() { public String getTradeStateName() {

View File

@ -3,8 +3,8 @@ package com.bonus.canteen.core.account.mapper;
import java.util.List; import java.util.List;
import com.bonus.canteen.core.account.domain.AccTrade; import com.bonus.canteen.core.account.domain.AccTrade;
import com.bonus.canteen.core.account.domain.bo.TradeAndWallerInfo; import com.bonus.canteen.core.account.domain.bo.TradeAndWallerInfo;
import com.bonus.canteen.core.account.domain.param.AccSubOperationQueryParam; import com.bonus.canteen.core.account.domain.param.AccWalletOperationQueryParam;
import com.bonus.canteen.core.account.domain.vo.AccSubOperationListVO; import com.bonus.canteen.core.account.domain.vo.AccOperationListVO;
import com.bonus.canteen.core.account.domain.vo.AccTradeVo; import com.bonus.canteen.core.account.domain.vo.AccTradeVo;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
@ -69,7 +69,7 @@ public interface AccTradeMapper {
*/ */
public int deleteAccTradeByTradeIds(Long[] tradeIds); public int deleteAccTradeByTradeIds(Long[] tradeIds);
List<AccSubOperationListVO> queryAccSubOperationList(@Param("param") AccSubOperationQueryParam param, List<AccOperationListVO> queryAccOperationList(@Param("param") AccWalletOperationQueryParam param,
@Param("encryptedSearchValue") String encryptedSearchValue); @Param("encryptedSearchValue") String encryptedSearchValue);
List<TradeAndWallerInfo> queryTradeAndWallerInfoByOrderNo(@Param("orderNo") String orderNo, List<TradeAndWallerInfo> queryTradeAndWallerInfoByOrderNo(@Param("orderNo") String orderNo,

View File

@ -2,9 +2,8 @@ package com.bonus.canteen.core.account.service;
import com.bonus.canteen.core.account.domain.param.*; import com.bonus.canteen.core.account.domain.param.*;
import com.bonus.canteen.core.account.domain.vo.AccBatchOperationWalletPreCheckVO; import com.bonus.canteen.core.account.domain.vo.AccBatchOperationWalletPreCheckVO;
import com.bonus.canteen.core.account.domain.vo.AccSubOperationListVO; import com.bonus.canteen.core.account.domain.vo.AccOperationListVO;
import java.math.BigDecimal;
import java.util.List; import java.util.List;
public interface AccSubService { public interface AccSubService {
@ -20,6 +19,6 @@ public interface AccSubService {
AccBatchOperationWalletPreCheckVO batchOperationWalletClearCheck(AccSubsidyBatchClearParam param); AccBatchOperationWalletPreCheckVO batchOperationWalletClearCheck(AccSubsidyBatchClearParam param);
List<AccSubOperationListVO> queryAccSubOperationList(AccSubOperationQueryParam param); List<AccOperationListVO> queryAccSubOperationList(AccWalletOperationQueryParam param);
} }

View File

@ -2,13 +2,12 @@ package com.bonus.canteen.core.account.service;
import java.util.List; 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.WalletBalanceVO; import com.bonus.canteen.core.account.domain.WalletBalanceVO;
import com.bonus.canteen.core.account.domain.param.*; import com.bonus.canteen.core.account.domain.param.*;
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.domain.vo.AccOperationListVO;
import com.bonus.system.api.domain.SysUser; import com.bonus.system.api.domain.SysUser;
import org.apache.ibatis.annotations.Param;
/** /**
* 账户资料Service接口 * 账户资料Service接口
@ -73,5 +72,7 @@ public interface IAccInfoService {
AccInfoDetailsVO queryAccInfoByUserId(Long userId); AccInfoDetailsVO queryAccInfoByUserId(Long userId);
void checkAccStatus(AccInfoDetailsVO accInfoVO); void checkAccStatus(AccInfoDetailsVO accInfoVO);
void individualAccRecharge(AccRechargeParam param); void individualAccRecharge(AccRechargeParam param);
void individualAccWithdraw(AccWithdrawParam param);
void individualAccLeaveClear(AccLeaveClearParam param); void individualAccLeaveClear(AccLeaveClearParam param);
List<AccOperationListVO> queryAccPersonalWalOperationAddList(AccWalletOperationQueryParam param);
} }

View File

@ -3,8 +3,8 @@ package com.bonus.canteen.core.account.service;
import com.bonus.canteen.core.account.constants.AccTradeTypeEnum; import com.bonus.canteen.core.account.constants.AccTradeTypeEnum;
import com.bonus.canteen.core.account.domain.AccTrade; import com.bonus.canteen.core.account.domain.AccTrade;
import com.bonus.canteen.core.account.domain.bo.TradeAndWallerInfo; import com.bonus.canteen.core.account.domain.bo.TradeAndWallerInfo;
import com.bonus.canteen.core.account.domain.param.AccSubOperationQueryParam; import com.bonus.canteen.core.account.domain.param.AccWalletOperationQueryParam;
import com.bonus.canteen.core.account.domain.vo.AccSubOperationListVO; import com.bonus.canteen.core.account.domain.vo.AccOperationListVO;
import com.bonus.canteen.core.account.domain.vo.AccTradeVo; import com.bonus.canteen.core.account.domain.vo.AccTradeVo;
import java.util.List; import java.util.List;
@ -70,7 +70,7 @@ public interface IAccTradeService {
*/ */
public int deleteAccTradeByTradeId(Long tradeId); public int deleteAccTradeByTradeId(Long tradeId);
List<AccSubOperationListVO> queryAccSubOperationList(AccSubOperationQueryParam param); List<AccOperationListVO> queryAccOperationList(AccWalletOperationQueryParam param);
List<TradeAndWallerInfo> queryTradeAndWallerInfoByOrderNo(String orderNo, AccTradeTypeEnum accTradeTypeEnum); List<TradeAndWallerInfo> queryTradeAndWallerInfoByOrderNo(String orderNo, AccTradeTypeEnum accTradeTypeEnum);
} }

View File

@ -13,15 +13,15 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
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.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.bo.WalletBalanceOperation;
import com.bonus.canteen.core.account.domain.param.*; import com.bonus.canteen.core.account.domain.param.*;
import com.bonus.canteen.core.account.domain.vo.AccOperationListVO;
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.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;
import com.bonus.canteen.core.account.service.AccOperationHistoryService; import com.bonus.canteen.core.account.service.AccOperationHistoryService;
import com.bonus.canteen.core.account.service.IAccTradeService;
import com.bonus.canteen.core.account.service.IAccWalletInfoService; import com.bonus.canteen.core.account.service.IAccWalletInfoService;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -30,7 +30,6 @@ 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.PayChannelEnum;
import com.bonus.canteen.core.pay.constants.PayTypeEnum; import com.bonus.canteen.core.pay.constants.PayTypeEnum;
@ -46,7 +45,6 @@ import com.bonus.system.api.domain.SysUser;
import com.bonus.common.houqin.utils.SM4EncryptUtils; import com.bonus.common.houqin.utils.SM4EncryptUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
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.context.annotation.Lazy;
import org.springframework.core.task.AsyncTaskExecutor; import org.springframework.core.task.AsyncTaskExecutor;
@ -74,7 +72,8 @@ public class AccInfoServiceImpl implements IAccInfoService {
@Autowired @Autowired
private AccOperationHistoryService accOperationHistoryService; private AccOperationHistoryService accOperationHistoryService;
@Autowired @Autowired
private AccMqSender accMqSender; @Lazy
IAccTradeService accTradeService;
@Resource( @Resource(
name = "smartCanteenTaskExecutor" name = "smartCanteenTaskExecutor"
@ -413,6 +412,29 @@ public class AccInfoServiceImpl implements IAccInfoService {
log.error("发送MQ消息失败", e); log.error("发送MQ消息失败", e);
} }
} }
public void individualAccWithdraw(AccWithdrawParam param) {
AccInfoDetailsVO accInfoVO = queryAccInfoByUserId(param.getUserId());
if(Objects.isNull(accInfoVO)) {
throw new ServiceException("账户不存在");
}
checkAccStatus(accInfoVO);
WalletUpdateDTO walletUpdateDTO = new WalletUpdateDTO();
walletUpdateDTO.setAmount(param.getAmount());
walletUpdateDTO.setUserId(param.getUserId());
walletUpdateDTO.setAccWalletIdEnum(AccWalletIdEnum.WALLET);
walletUpdateDTO.setAccTradeTypeEnum(AccTradeTypeEnum.WITHDRAW);
walletUpdateDTO.setPayChannelEnum(PayChannelEnum.GC_SYSTEM);
walletUpdateDTO.setPayTypeEnum(PayTypeEnum.MEAL_CARD);
accWalletInfoService.clearAccWalletBalance(walletUpdateDTO);
try {
DeviceMqPersonalUpdateMessageDTO bean = new DeviceMqPersonalUpdateMessageDTO().setUpdatePerson(Math.toIntExact(param.getUserId()),"update");
String jsonString = JacksonUtil.writeValueAsString(bean);
log.info("账户变动发送mq内容{}", jsonString);
MqUtil.pushToTenantAllDevice(bean, LeMqConstant.Topic.DEVICE_UPDATE_PERSONAL_CONFIG_V4);
} catch (Exception e) {
log.error("发送MQ消息失败", e);
}
}
@Transactional( @Transactional(
rollbackFor = {Exception.class} rollbackFor = {Exception.class}
) )
@ -445,4 +467,12 @@ public class AccInfoServiceImpl implements IAccInfoService {
} }
} }
} }
@Override
public List<AccOperationListVO> queryAccPersonalWalOperationAddList(AccWalletOperationQueryParam param) {
List<AccOperationListVO> operationListVOList = accTradeService.queryAccOperationList(param);
operationListVOList = operationListVOList.stream().peek(operation -> {
operation.setPhoneNumber(SM4EncryptUtils.sm4Decrypt(operation.getPhoneNumber()));
}).collect(Collectors.toList());
return operationListVOList ;
}
} }

View File

@ -3,15 +3,13 @@ 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.AccWalletIdEnum; import com.bonus.canteen.core.account.constants.AccWalletIdEnum;
import com.bonus.canteen.core.account.constants.WalletBalanceOperationEnum;
import com.bonus.canteen.core.account.domain.AccWalletInfo; import com.bonus.canteen.core.account.domain.AccWalletInfo;
import com.bonus.canteen.core.account.domain.WalletUpdateDTO; import com.bonus.canteen.core.account.domain.WalletUpdateDTO;
import com.bonus.canteen.core.account.domain.bo.WalletBalanceOperation;
import com.bonus.canteen.core.account.domain.param.*; import com.bonus.canteen.core.account.domain.param.*;
import com.bonus.canteen.core.account.domain.vo.AccBatchOperationWallerErrorVO; import com.bonus.canteen.core.account.domain.vo.AccBatchOperationWallerErrorVO;
import com.bonus.canteen.core.account.domain.vo.AccBatchOperationWalletPreCheckVO; import com.bonus.canteen.core.account.domain.vo.AccBatchOperationWalletPreCheckVO;
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.AccSubOperationListVO; import com.bonus.canteen.core.account.domain.vo.AccOperationListVO;
import com.bonus.canteen.core.account.service.AccSubService; import com.bonus.canteen.core.account.service.AccSubService;
import com.bonus.canteen.core.account.service.IAccInfoService; import com.bonus.canteen.core.account.service.IAccInfoService;
import com.bonus.canteen.core.account.service.IAccTradeService; import com.bonus.canteen.core.account.service.IAccTradeService;
@ -368,8 +366,8 @@ public class AccSubServiceImpl implements AccSubService {
return errVO; return errVO;
} }
@Override @Override
public List<AccSubOperationListVO> queryAccSubOperationList(AccSubOperationQueryParam param) { public List<AccOperationListVO> queryAccSubOperationList(AccWalletOperationQueryParam param) {
List<AccSubOperationListVO> operationListVOList = accTradeService.queryAccSubOperationList(param); List<AccOperationListVO> operationListVOList = accTradeService.queryAccOperationList(param);
operationListVOList = operationListVOList.stream().peek(operation -> { operationListVOList = operationListVOList.stream().peek(operation -> {
operation.setPhoneNumber(SM4EncryptUtils.sm4Decrypt(operation.getPhoneNumber())); operation.setPhoneNumber(SM4EncryptUtils.sm4Decrypt(operation.getPhoneNumber()));
}).collect(Collectors.toList()); }).collect(Collectors.toList());

View File

@ -3,8 +3,8 @@ package com.bonus.canteen.core.account.service.impl;
import com.bonus.canteen.core.account.constants.AccTradeTypeEnum; import com.bonus.canteen.core.account.constants.AccTradeTypeEnum;
import com.bonus.canteen.core.account.domain.AccTrade; import com.bonus.canteen.core.account.domain.AccTrade;
import com.bonus.canteen.core.account.domain.bo.TradeAndWallerInfo; import com.bonus.canteen.core.account.domain.bo.TradeAndWallerInfo;
import com.bonus.canteen.core.account.domain.param.AccSubOperationQueryParam; import com.bonus.canteen.core.account.domain.param.AccWalletOperationQueryParam;
import com.bonus.canteen.core.account.domain.vo.AccSubOperationListVO; import com.bonus.canteen.core.account.domain.vo.AccOperationListVO;
import com.bonus.canteen.core.account.domain.vo.AccTradeVo; import com.bonus.canteen.core.account.domain.vo.AccTradeVo;
import com.bonus.canteen.core.account.mapper.AccTradeMapper; import com.bonus.canteen.core.account.mapper.AccTradeMapper;
import com.bonus.canteen.core.account.service.IAccTradeService; import com.bonus.canteen.core.account.service.IAccTradeService;
@ -15,6 +15,8 @@ import com.bonus.common.houqin.utils.id.Id;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.List; import java.util.List;
@ -63,6 +65,7 @@ public class AccTradeServiceImpl implements IAccTradeService {
* @return 结果 * @return 结果
*/ */
@Override @Override
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
public int insertAccTrade(AccTrade accTrade) { public int insertAccTrade(AccTrade accTrade) {
accTrade.setCreateTime(DateUtils.getNowDate()); accTrade.setCreateTime(DateUtils.getNowDate());
return accTradeMapper.insertAccTrade(accTrade); return accTradeMapper.insertAccTrade(accTrade);
@ -88,6 +91,7 @@ public class AccTradeServiceImpl implements IAccTradeService {
* @return 结果 * @return 结果
*/ */
@Override @Override
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
public int updateAccTrade(AccTrade accTrade) { public int updateAccTrade(AccTrade accTrade) {
accTrade.setUpdateTime(DateUtils.getNowDate()); accTrade.setUpdateTime(DateUtils.getNowDate());
try { try {
@ -130,9 +134,9 @@ public class AccTradeServiceImpl implements IAccTradeService {
} }
@Override @Override
public List<AccSubOperationListVO> queryAccSubOperationList(AccSubOperationQueryParam param) { public List<AccOperationListVO> queryAccOperationList(AccWalletOperationQueryParam param) {
String encryptedSearchValue = SM4EncryptUtils.sm4Encrypt(param.getSearchValue()); String encryptedSearchValue = SM4EncryptUtils.sm4Encrypt(param.getSearchValue());
return accTradeMapper.queryAccSubOperationList(param, encryptedSearchValue); return accTradeMapper.queryAccOperationList(param, encryptedSearchValue);
} }
@Override @Override

View File

@ -37,6 +37,7 @@ import com.bonus.common.houqin.utils.id.Id;
import com.bonus.common.security.utils.SecurityUtils; import com.bonus.common.security.utils.SecurityUtils;
import com.bonus.system.api.RemoteUserService; import com.bonus.system.api.RemoteUserService;
import com.bonus.system.api.domain.SysUser; import com.bonus.system.api.domain.SysUser;
import org.apache.commons.lang3.StringUtils;
import org.checkerframework.checker.units.qual.A; import org.checkerframework.checker.units.qual.A;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -242,7 +243,16 @@ public class AccWalletInfoServiceImpl implements IAccWalletInfoService {
private void acWalletBalanceOperation(WalletBalanceOperation operation) { private void acWalletBalanceOperation(WalletBalanceOperation operation) {
Long tradeId = null;
try{ try{
List<AccWalletInfo> walletInfoList = selectAccWalletInfoByUserId(operation.getUserId());
BigDecimal accBalTotal = walletInfoList.stream().map(AccWalletInfo::getWalletBal)
.filter(ObjectUtil::isNotNull).reduce(BigDecimal.ZERO, BigDecimal::add);
tradeId = insertAccTradeRecode(operation, accBalTotal);
if(WalletBalanceOperationEnum.getEnum(operation.getOperationType()) == null) {
throw new ServiceException("钱包操作类型不存在");
}
switch (WalletBalanceOperationEnum.getEnum(operation.getOperationType())) { switch (WalletBalanceOperationEnum.getEnum(operation.getOperationType())) {
case ADD_BAL: case ADD_BAL:
addAccWalletInfo(operation); addAccWalletInfo(operation);
@ -253,9 +263,52 @@ public class AccWalletInfoServiceImpl implements IAccWalletInfoService {
default: default:
throw new ServiceException("钱包操作类型错误"); throw new ServiceException("钱包操作类型错误");
} }
List<AccWalletInfo> walletInfoList = selectAccWalletInfoByUserId(operation.getUserId()); walletInfoList = selectAccWalletInfoByUserId(operation.getUserId());
BigDecimal accBalTotal = walletInfoList.stream().map(AccWalletInfo::getWalletBal) AccTradeWalletDetail accTradeWalletDetail = new AccTradeWalletDetail();
.filter(ObjectUtil::isNotNull).reduce(BigDecimal.ZERO, BigDecimal::add); accTradeWalletDetail.setTradeId(tradeId);
accTradeWalletDetail.setUserId(operation.getUserId());
accTradeWalletDetail.setTradeType(operation.getTradeType());
accTradeWalletDetail.setAmount(operation.getAmount());
accTradeWalletDetail.setWalletId(operation.getWalletId());
BigDecimal walletBalByWalletId = walletInfoList.stream().filter((item) -> {
return item.getWalletId().equals(operation.getWalletId());
}).map(AccWalletInfo::getWalletBal).filter(ObjectUtil::isNotNull).reduce(BigDecimal.ZERO, BigDecimal::add);
accTradeWalletDetail.setWalletBal(walletBalByWalletId);
accTradeWalletDetail.setTradeTime(DateUtils.getNowDate());
accTradeWalletDetail.setCreateBy(SecurityUtils.getUsername());
this.accTradeWalletDetailService.insertAccTradeWalletDetail(accTradeWalletDetail);
AccTrade accTrade = new AccTrade();
accTrade.setTradeId(tradeId);
accTrade.setPayState(PayStateEnum.PAY_SUCC.getKey());
accTrade.setTradeState(AccTradeStateEnum.TAKE_EFFECT.getKey());
accTrade.setUpdateBy(SecurityUtils.getUsername());
this.accTradeService.updateAccTrade(accTrade);
}catch (Exception ex) {
if(Objects.nonNull(tradeId)) {
AccTrade accTrade = new AccTrade();
accTrade.setTradeId(tradeId);
accTrade.setPayState(PayStateEnum.PAY_FAIL.getKey());
accTrade.setTradeState(AccTradeStateEnum.CANCELED.getKey());
accTrade.setUpdateBy(SecurityUtils.getUsername());
accTrade.setFailReason(StringUtils.substring(ex.getMessage(), 0, 100));
this.accTradeService.updateAccTrade(accTrade);
}
log.error("修改钱包失败", ex);
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()));
}
private long insertAccTradeRecode(WalletBalanceOperation operation, BigDecimal accBalTotal) {
AjaxResult userResult = remoteUserService.getInfo(operation.getUserId() , SecurityConstants.INNER); AjaxResult userResult = remoteUserService.getInfo(operation.getUserId() , SecurityConstants.INNER);
SysUser sysUser = null; SysUser sysUser = null;
if(Objects.nonNull(userResult)) { if(Objects.nonNull(userResult)) {
@ -271,8 +324,8 @@ public class AccWalletInfoServiceImpl implements IAccWalletInfoService {
accTrade.setActualAmount(operation.getAmount()); accTrade.setActualAmount(operation.getAmount());
accTrade.setWalletBalTotal(accBalTotal); accTrade.setWalletBalTotal(accBalTotal);
accTrade.setAccAllBal(accBalTotal); accTrade.setAccAllBal(accBalTotal);
accTrade.setPayState(PayStateEnum.PAY_SUCC.getKey()); accTrade.setPayState(PayStateEnum.PAY_INPROCESS.getKey());
accTrade.setTradeState(AccTradeStateEnum.TAKE_EFFECT.getKey()); accTrade.setTradeState(AccTradeStateEnum.CREATE.getKey());
accTrade.setUserId(operation.getUserId()); accTrade.setUserId(operation.getUserId());
accTrade.setPayChannel(operation.getPayChannel()); accTrade.setPayChannel(operation.getPayChannel());
accTrade.setPayType(operation.getPayType()); accTrade.setPayType(operation.getPayType());
@ -284,33 +337,6 @@ public class AccWalletInfoServiceImpl implements IAccWalletInfoService {
accTrade.setOrderNo(operation.getOrderNo().toString()); accTrade.setOrderNo(operation.getOrderNo().toString());
} }
this.accTradeService.insertAccTrade(accTrade); this.accTradeService.insertAccTrade(accTrade);
return tradeId;
AccTradeWalletDetail accTradeWalletDetail = new AccTradeWalletDetail();
accTradeWalletDetail.setTradeId(tradeId);
accTradeWalletDetail.setUserId(operation.getUserId());
accTradeWalletDetail.setTradeType(operation.getTradeType());
accTradeWalletDetail.setAmount(operation.getAmount());
accTradeWalletDetail.setWalletId(operation.getWalletId());
BigDecimal walletBalByWalletId = walletInfoList.stream().filter((item) -> {
return item.getWalletId().equals(operation.getWalletId());
}).map(AccWalletInfo::getWalletBal).filter(ObjectUtil::isNotNull).reduce(BigDecimal.ZERO, BigDecimal::add);
accTradeWalletDetail.setWalletBal(walletBalByWalletId);
accTradeWalletDetail.setTradeTime(DateUtils.getNowDate());
accTradeWalletDetail.setCreateBy(SecurityUtils.getUsername());
this.accTradeWalletDetailService.insertAccTradeWalletDetail(accTradeWalletDetail);
}catch (Exception ex) {
log.error("修改钱包失败", ex);
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

@ -1,25 +0,0 @@
package com.bonus.canteen.core.pay.constants;
public enum TradeTypeEnum {
RECHARGE(1, "充值"),
RECHARGE_REFUND(2, "充值退款"),
CONSUME(3, "消费"),
CONSUME_REFUND(4, "消费退款");
private final Integer key;
private final String desc;
private TradeTypeEnum(Integer key, String desc) {
this.key = key;
this.desc = desc;
}
public Integer getKey() {
return this.key;
}
public String getDesc() {
return this.desc;
}
}

View File

@ -224,7 +224,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</foreach> </foreach>
</delete> </delete>
<select id="queryAccSubOperationList" resultType="com.bonus.canteen.core.account.domain.vo.AccSubOperationListVO"> <select id="queryAccOperationList" resultType="com.bonus.canteen.core.account.domain.vo.AccOperationListVO">
SELECT ate.trade_time, SELECT ate.trade_time,
ate.user_id, ate.user_id,
su.nick_name, su.nick_name,
@ -261,8 +261,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="param.searchValue != null and param.searchValue != ''"> <if test="param.searchValue != null and param.searchValue != ''">
and (su.nick_name = #{param.searchValue} and (su.nick_name = #{param.searchValue}
or su.phonenumber = #{encryptedSearchValue} or su.phonenumber = #{encryptedSearchValue}
or su.user_id like CONCAT('%',#{param.searchValue},'%')
) )
</if> </if>
<if test="param.userId != null">
and ate.user_id = #{param.userId}
</if>
</where> </where>
order by atwd.id desc order by atwd.id desc
</select> </select>
@ -280,7 +284,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
inner join acc_trade_wallet_detail atwd on inner join acc_trade_wallet_detail atwd on
ate.trade_id = atwd.trade_id ate.trade_id = atwd.trade_id
where where
ate.order_no = #{orderNo} ate.pay_state = 3
and ate.order_no = #{orderNo}
and ate.trade_type = #{accTradeType} and ate.trade_type = #{accTradeType}
</select> </select>