个人取款 及记录查询

This commit is contained in:
gaowdong 2025-04-21 14:04:23 +08:00
parent 06a083c91a
commit 1e2ad095b5
14 changed files with 135 additions and 63 deletions

View File

@ -1,15 +1,19 @@
package com.bonus.canteen.core.account.controller;
import java.util.List;
import java.util.Objects;
import javax.servlet.http.HttpServletResponse;
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.param.*;
import com.bonus.canteen.core.account.domain.vo.AccInfoDetailsVO;
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.security.utils.SecurityUtils;
import com.bonus.system.api.domain.SysUser;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@ -194,10 +198,44 @@ public class AccInfoController extends BaseController {
return AjaxResult.success();
}
@ApiOperation("单人取钱")
@PostMapping("/withdraw")
public AjaxResult individualAccWithdraw(@RequestBody @Valid AccWithdrawParam param) {
this.accInfoService.individualAccWithdraw(param);
return AjaxResult.success();
}
@ApiOperation("离职清空余额(个人钱包和补贴钱包)")
@PostMapping({"/leave/clear"})
public AjaxResult individualAccLeaveClear(@RequestBody @Valid AccLeaveClearParam param) {
this.accInfoService.individualAccLeaveClear(param);
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("补贴记录")
@PostMapping({"/add/history"})
public TableDataInfo queryAccSubOperationAddList(@RequestBody AccSubOperationQueryParam request) {
public TableDataInfo queryAccSubOperationAddList(@RequestBody AccWalletOperationQueryParam request) {
startPage();
request.setTradeType(AccTradeTypeEnum.SUBSIDY.getKey());
return getDataTable(accSubService.queryAccSubOperationList(request));
@ -73,7 +73,7 @@ public class AccSubsidyController extends BaseController {
@ApiOperation("补贴清空记录")
@PostMapping({"/clear/history"})
public TableDataInfo queryAccSubOperationClearList(@RequestBody AccSubOperationQueryParam request) {
public TableDataInfo queryAccSubOperationClearList(@RequestBody AccWalletOperationQueryParam request) {
startPage();
request.setTradeType(AccTradeTypeEnum.CLEAR.getKey());
return getDataTable(accSubService.queryAccSubOperationList(request));

View File

@ -10,7 +10,7 @@ import java.time.LocalDateTime;
import java.util.List;
@Data
public class AccSubOperationQueryParam extends BaseEntity {
public class AccWalletOperationQueryParam extends BaseEntity {
@ApiModelProperty("查询组织id集合")
private List<Long> deptIds;
@ApiModelProperty("开始时间")
@ -20,12 +20,12 @@ public class AccSubOperationQueryParam extends BaseEntity {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime endDateTime;
@ApiModelProperty("交易类型")
@JsonIgnore
private Integer tradeType;
private String searchValue;
private String createBy;
private Long userId;
public AccSubOperationQueryParam() {
public AccWalletOperationQueryParam() {
this.endDateTime = LocalDateTime.now().plusDays(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;
@Data
public class AccSubOperationListVO {
public class AccOperationListVO {
@ApiModelProperty("补贴时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime tradeTime;
@ -26,17 +26,17 @@ public class AccSubOperationListVO {
private Integer userType;
@ApiModelProperty("用户类别(展示)")
private String userTypeName;
@ApiModelProperty("补贴金额")
@ApiModelProperty("金额")
private BigDecimal amount;
@ApiModelProperty("补贴后补贴钱包余额")
@ApiModelProperty("钱包余额")
private BigDecimal walletBal;
@ApiModelProperty("补贴记录交易状态")
@ApiModelProperty("交易状态")
private Integer tradeState;
@ApiModelProperty("充值结果名称")
@ApiModelProperty("结果名称")
private String tradeStateName;
@ApiModelProperty("操作员")
private String createBy;
@ApiModelProperty("补贴订单号")
@ApiModelProperty("交易单号")
private Long tradeId;
public String getTradeStateName() {

View File

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

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.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;
public interface AccSubService {
@ -20,6 +19,6 @@ public interface AccSubService {
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 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.param.*;
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.AccOperationListVO;
import com.bonus.system.api.domain.SysUser;
import org.apache.ibatis.annotations.Param;
/**
* 账户资料Service接口
@ -73,5 +72,7 @@ public interface IAccInfoService {
AccInfoDetailsVO queryAccInfoByUserId(Long userId);
void checkAccStatus(AccInfoDetailsVO accInfoVO);
void individualAccRecharge(AccRechargeParam param);
void individualAccWithdraw(AccWithdrawParam 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.domain.AccTrade;
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.vo.AccSubOperationListVO;
import com.bonus.canteen.core.account.domain.param.AccWalletOperationQueryParam;
import com.bonus.canteen.core.account.domain.vo.AccOperationListVO;
import com.bonus.canteen.core.account.domain.vo.AccTradeVo;
import java.util.List;
@ -70,7 +70,7 @@ public interface IAccTradeService {
*/
public int deleteAccTradeByTradeId(Long tradeId);
List<AccSubOperationListVO> queryAccSubOperationList(AccSubOperationQueryParam param);
List<AccOperationListVO> queryAccOperationList(AccWalletOperationQueryParam param);
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.AccWalletIdEnum;
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.bo.WalletBalanceOperation;
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.AccInfoDetailsVO;
import com.bonus.canteen.core.account.domain.vo.AccInfoInvalidSumVO;
import com.bonus.canteen.core.account.mq.AccMqSender;
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 java.util.ArrayList;
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.AccWalletInfo;
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.pay.constants.PayChannelEnum;
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 org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.core.task.AsyncTaskExecutor;
@ -74,7 +72,8 @@ public class AccInfoServiceImpl implements IAccInfoService {
@Autowired
private AccOperationHistoryService accOperationHistoryService;
@Autowired
private AccMqSender accMqSender;
@Lazy
IAccTradeService accTradeService;
@Resource(
name = "smartCanteenTaskExecutor"
@ -413,6 +412,29 @@ public class AccInfoServiceImpl implements IAccInfoService {
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(
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 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.domain.AccWalletInfo;
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.vo.AccBatchOperationWallerErrorVO;
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.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.IAccInfoService;
import com.bonus.canteen.core.account.service.IAccTradeService;
@ -368,8 +366,8 @@ public class AccSubServiceImpl implements AccSubService {
return errVO;
}
@Override
public List<AccSubOperationListVO> queryAccSubOperationList(AccSubOperationQueryParam param) {
List<AccSubOperationListVO> operationListVOList = accTradeService.queryAccSubOperationList(param);
public List<AccOperationListVO> queryAccSubOperationList(AccWalletOperationQueryParam param) {
List<AccOperationListVO> operationListVOList = accTradeService.queryAccOperationList(param);
operationListVOList = operationListVOList.stream().peek(operation -> {
operation.setPhoneNumber(SM4EncryptUtils.sm4Decrypt(operation.getPhoneNumber()));
}).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.domain.AccTrade;
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.vo.AccSubOperationListVO;
import com.bonus.canteen.core.account.domain.param.AccWalletOperationQueryParam;
import com.bonus.canteen.core.account.domain.vo.AccOperationListVO;
import com.bonus.canteen.core.account.domain.vo.AccTradeVo;
import com.bonus.canteen.core.account.mapper.AccTradeMapper;
import com.bonus.canteen.core.account.service.IAccTradeService;
@ -130,9 +130,9 @@ public class AccTradeServiceImpl implements IAccTradeService {
}
@Override
public List<AccSubOperationListVO> queryAccSubOperationList(AccSubOperationQueryParam param) {
public List<AccOperationListVO> queryAccOperationList(AccWalletOperationQueryParam param) {
String encryptedSearchValue = SM4EncryptUtils.sm4Encrypt(param.getSearchValue());
return accTradeMapper.queryAccSubOperationList(param, encryptedSearchValue);
return accTradeMapper.queryAccOperationList(param, encryptedSearchValue);
}
@Override

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>
</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,
ate.user_id,
su.nick_name,
@ -261,8 +261,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="param.searchValue != null and param.searchValue != ''">
and (su.nick_name = #{param.searchValue}
or su.phonenumber = #{encryptedSearchValue}
or su.user_id like CONCAT('%',#{param.searchValue},'%')
)
</if>
<if test="param.userId != null">
and ate.user_id = #{param.userId}
</if>
</where>
order by atwd.id desc
</select>