银行卡管理模块添加

This commit is contained in:
furongxin 2024-04-27 16:36:25 +08:00
parent f5133bbbdf
commit ba65b0cf22
10 changed files with 638 additions and 0 deletions

View File

@ -0,0 +1,130 @@
package cn.iocoder.yudao.module.system.controller.admin.bank;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.system.controller.admin.bank.vo.UserBankPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.bank.vo.UserBankRespVO;
import cn.iocoder.yudao.module.system.controller.admin.bank.vo.UserBankSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.bank.BankDO;
import cn.iocoder.yudao.module.system.service.bank.UserBankService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.List;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
@Tag(name = "管理后台 - 用户银行卡信息")
@RestController
@RequestMapping("/system/user-bank")
@Validated
public class UserBankController {
@Resource
private UserBankService userBankService;
@PostMapping("/create")
@Operation(summary = "创建银行卡信息")
@PreAuthorize("@ss.hasPermission('system:user-bank:create')")
public CommonResult<Long> createBank(@Valid @RequestBody UserBankSaveReqVO createReqVO) {
return success(userBankService.createBank(createReqVO));
}
@PostMapping("/create-bank")
@Operation(summary = "创建银行卡信息")
@PreAuthorize("@ss.hasPermission('system:user-bank:create')")
public CommonResult<Boolean> createPayBank(@Valid @RequestBody UserBankSaveReqVO createReqVO) {
userBankService.createPayBank(createReqVO);
return success(true);
}
@PostMapping("/create-user")
@Operation(summary = "创建用户和银行卡关联信息")
@PreAuthorize("@ss.hasPermission('system:user-bank:create')")
public CommonResult<Boolean> createUserBank(@RequestBody List<Long> bankId) {
userBankService.createUserBank(bankId);
return success(true);
}
@PutMapping("/update")
@Operation(summary = "更新银行卡信息")
@PreAuthorize("@ss.hasPermission('system:user-bank:update')")
public CommonResult<Boolean> updateBank(@Valid @RequestBody UserBankSaveReqVO updateReqVO) {
userBankService.updateBank(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除用户和银行卡关联信息")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('system:user-bank:delete')")
public CommonResult<Boolean> deleteUserBank(@RequestParam("id") Long id) {
userBankService.deleteUserBank(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得银行卡信息")
@Parameter(name = "bankId", description = "银行卡信息编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('system:user-bank:query')")
public CommonResult<UserBankRespVO> getBank(@RequestParam("bankId") Long bankId) {
BankDO userBank = userBankService.getBank(bankId);
return success(BeanUtils.toBean(userBank, UserBankRespVO.class));
}
@GetMapping("/page-bank")
@Operation(summary = "获得银行卡信息分页列表")
@PreAuthorize("@ss.hasPermission('system:user-bank:query')")
public CommonResult<PageResult<UserBankRespVO>> getBankPage(@Valid UserBankPageReqVO pageReqVO) {
PageResult<BankDO> pageResult = new PageResult<BankDO>();
List<Long> bankIds = userBankService.getBankIds(getLoginUserId());
if (bankIds.isEmpty()) {
pageResult = userBankService.getBankPageIn(pageReqVO, null);
}else {
pageResult = userBankService.getBankPageNotIn(pageReqVO, bankIds);
}
return success(BeanUtils.toBean(pageResult, UserBankRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得用户和银行卡关联信息分页")
@PreAuthorize("@ss.hasPermission('system:user-bank:query')")
public CommonResult<PageResult<UserBankRespVO>> getUserBankPage(@Valid UserBankPageReqVO pageReqVO) {
PageResult<BankDO> pageResult = new PageResult<BankDO>();
List<Long> bankIds = userBankService.getBankIds(getLoginUserId());
if (!bankIds.isEmpty()) {
pageResult = userBankService.getBankPageIn(pageReqVO, bankIds);
}
return success(BeanUtils.toBean(pageResult, UserBankRespVO.class));
}
@GetMapping("/list")
@Operation(summary = "获得用户和银行卡关联信息列表")
@PreAuthorize("@ss.hasPermission('system:user-bank:query')")
public CommonResult<List<UserBankRespVO>> getUserBankList() {
List<BankDO> bankDOS = userBankService.getBankListByUserId(getLoginUserId());
return success(BeanUtils.toBean(bankDOS, UserBankRespVO.class));
}
}

View File

@ -0,0 +1,36 @@
package cn.iocoder.yudao.module.system.controller.admin.bank.vo;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 用户银行卡信息分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class UserBankPageReqVO extends PageParam {
@Schema(description = "用户编号", example = "31665")
private Long userId;
@Schema(description = "银行卡用户名称", example = "芋艿")
private String nickname;
@Schema(description = "银行卡号")
private String bankNo;
@Schema(description = "开户行信息", example = "赵六")
private String bankName;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}

View File

@ -0,0 +1,38 @@
package cn.iocoder.yudao.module.system.controller.admin.bank.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - 用户银行卡信息 Response VO")
@Data
@ExcelIgnoreUnannotated
public class UserBankRespVO {
@Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "3548")
@ExcelProperty("ID")
private Long id;
@Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "31665")
private Long userId;
@Schema(description = "银行卡用户名称", example = "芋艿")
@ExcelProperty("银行卡用户名称")
private String nickname;
@Schema(description = "银行卡号")
@ExcelProperty("银行卡号")
private String bankNo;
@Schema(description = "开户行信息", example = "赵六")
@ExcelProperty("开户行信息")
private String bankName;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}

View File

@ -0,0 +1,22 @@
package cn.iocoder.yudao.module.system.controller.admin.bank.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema(description = "管理后台 - 用户银行卡信息新增/修改 Request VO")
@Data
public class UserBankSaveReqVO {
@Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "3548")
private Long id;
@Schema(description = "银行卡用户名称", example = "芋艿")
private String nickname;
@Schema(description = "银行卡号")
private String bankNo;
@Schema(description = "开户行信息", example = "赵六")
private String bankName;
}

View File

@ -0,0 +1,39 @@
package cn.iocoder.yudao.module.system.dal.dataobject.bank;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
/**
* 管理后台的用户银行卡信息 DO
*/
@TableName(value = "system_bank", autoResultMap = true)
@Data
@EqualsAndHashCode(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class BankDO extends BaseDO {
/**
* ID
*/
@TableId
private Long id;
/**
* 银行卡用户名称
*/
private String nickname;
/**
* 银行卡号
*/
private String bankNo;
/**
* 开户行信息
*/
private String bankName;
}

View File

@ -0,0 +1,34 @@
package cn.iocoder.yudao.module.system.dal.dataobject.bank;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
/**
* 用户和银行卡关联 DO
*/
@TableName(value = "system_user_bank", autoResultMap = true)
@Data
@EqualsAndHashCode(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UserBankDO extends BaseDO {
/**
* ID
*/
@TableId
private Long id;
/**
* 用户ID
*/
private Long userId;
/**
* 银行卡信息 ID
*/
private Long bankId;
}

View File

@ -0,0 +1,41 @@
package cn.iocoder.yudao.module.system.dal.mysql.bank;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.system.controller.admin.bank.vo.UserBankPageReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.bank.BankDO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* 银行卡信息 Mapper
*
* @author 符溶馨
*/
@Mapper
public interface BankMapper extends BaseMapperX<BankDO> {
default PageResult<BankDO> selectPageIn(UserBankPageReqVO reqVO, List<Long> bankId) {
return selectPage(reqVO, new LambdaQueryWrapperX<BankDO>()
.likeIfPresent(BankDO::getNickname, reqVO.getNickname())
.inIfPresent(BankDO::getId, bankId)
.orderByDesc(BankDO::getId));
}
default PageResult<BankDO> selectPageNotIn(UserBankPageReqVO reqVO, List<Long> bankId) {
return selectPage(reqVO, new LambdaQueryWrapperX<BankDO>()
.likeIfPresent(BankDO::getNickname, reqVO.getNickname())
.notIn(BankDO::getId, bankId)
.orderByDesc(BankDO::getId));
}
default List<BankDO> selectBankList(List<Long> bankId) {
return selectList(new LambdaQueryWrapperX<BankDO>()
.in(BankDO::getId, bankId));
}
}

View File

@ -0,0 +1,22 @@
package cn.iocoder.yudao.module.system.dal.mysql.bank;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.system.dal.dataobject.bank.UserBankDO;
import org.apache.ibatis.annotations.Mapper;
/**
* 用户和银行卡关联 Mapper
*
* @author 符溶馨
*/
@Mapper
public interface UserBankMapper extends BaseMapperX<UserBankDO> {
default UserBankDO selectByBankId(Long userId, Long bankId) {
return selectOne(new LambdaQueryWrapperX<UserBankDO>()
.eq(UserBankDO::getUserId, userId)
.eq(UserBankDO::getBankId, bankId));
}
}

View File

@ -0,0 +1,86 @@
package cn.iocoder.yudao.module.system.service.bank;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.system.controller.admin.bank.vo.UserBankPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.bank.vo.UserBankSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.bank.BankDO;
import javax.validation.Valid;
import java.util.List;
/**
* 用户银行卡信息 Service 接口
*
* @author 符溶馨
*/
public interface UserBankService {
/**
* 创建用户银行卡信息
*
* @param createReqVO 创建信息
* @return 编号
*/
Long createBank(@Valid UserBankSaveReqVO createReqVO);
/**
* 创建用户银行卡信息
*
* @param createReqVO 创建信息
*/
void createPayBank(@Valid UserBankSaveReqVO createReqVO);
/**
* 创建用户和银行卡关联信息
*
* @param bankId 银行卡信息编号组
*/
void createUserBank(List<Long> bankId);
/**
* 更新银行卡信息
*
* @param updateReqVO 更新信息
*/
void updateBank(@Valid UserBankSaveReqVO updateReqVO);
/**
* 删除用户银行卡信息
*
* @param id 编号
*/
void deleteUserBank(Long id);
/**
* 获得用户银行卡信息
*
* @param bankId 银行卡信息编号
* @return 银行卡信息
*/
BankDO getBank(Long bankId);
/**
* 获得银行卡信息编号组
* @param userId 用户ID
* @return 银行卡信息编号组
*/
List<Long> getBankIds(Long userId);
/**
* 获得银行卡信息分页
*
* @param pageReqVO 分页查询
* @return 银行卡信息分页
*/
PageResult<BankDO> getBankPageIn(UserBankPageReqVO pageReqVO, List<Long> bankId);
/**
* 获得银行卡信息分页
*
* @param pageReqVO 分页查询
* @return 银行卡信息分页
*/
PageResult<BankDO> getBankPageNotIn(UserBankPageReqVO pageReqVO, List<Long> bankId);
List<BankDO> getBankListByUserId(Long userId);
}

View File

@ -0,0 +1,190 @@
package cn.iocoder.yudao.module.system.service.bank;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.system.controller.admin.bank.vo.UserBankPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.bank.vo.UserBankSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.bank.BankDO;
import cn.iocoder.yudao.module.system.dal.dataobject.bank.UserBankDO;
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
import cn.iocoder.yudao.module.system.dal.mysql.bank.BankMapper;
import cn.iocoder.yudao.module.system.dal.mysql.bank.UserBankMapper;
import cn.iocoder.yudao.module.system.service.user.AdminUserService;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
/**
* 用户银行卡信息 Service 实现类
*
* @author 符溶馨
*/
@Service
@Validated
public class UserBankServiceImpl implements UserBankService {
@Resource
private UserBankMapper userBankMapper;
@Resource
private BankMapper bankMapper;
@Resource
private AdminUserService adminUserService;
@Override
public Long createBank(UserBankSaveReqVO createReqVO) {
//校验银行卡号是否已存在
Long count = bankMapper.selectCount(BankDO::getBankNo, createReqVO.getBankNo());
if (count > 0L) {
throw exception(BANK_EXISTS);
}
// 插入
BankDO bank = BeanUtils.toBean(createReqVO, BankDO.class);
bankMapper.insert(bank);
// 返回
return bank.getId();
}
@Override
public void createPayBank(UserBankSaveReqVO createReqVO) {
//校验银行卡号是否已存在
BankDO bankDO = bankMapper.selectOne(BankDO::getBankNo, createReqVO.getBankNo());
if (bankDO != null) {
UserBankDO userBankDO = userBankMapper.selectByBankId(getLoginUserId(), bankDO.getId());
if (userBankDO == null) {
userBankDO = new UserBankDO();
userBankDO.setUserId(getLoginUserId());
userBankDO.setBankId(bankDO.getId());
userBankDO.setCreator(Objects.requireNonNull(getLoginUserId()).toString());
userBankMapper.insert(userBankDO);
}
}else {
// 插入
BankDO bank = BeanUtils.toBean(createReqVO, BankDO.class);
bankMapper.insert(bank);
UserBankDO userBankDO = new UserBankDO();
userBankDO.setUserId(getLoginUserId());
userBankDO.setBankId(bank.getId());
userBankDO.setCreator(Objects.requireNonNull(getLoginUserId()).toString());
userBankMapper.insert(userBankDO);
}
}
@Override
public void createUserBank(List<Long> bankId) {
//获取当前登录用户信息
AdminUserDO adminUserDO = adminUserService.getUser(getLoginUserId());
List<UserBankDO> useDOs = bankId.stream()
.map(id -> {
UserBankDO userBankDO = new UserBankDO();
userBankDO.setUserId(adminUserDO.getId());
userBankDO.setBankId(id);
userBankDO.setCreator(String.valueOf(adminUserDO.getId()));
return userBankDO;
}).collect(Collectors.toList());
userBankMapper.insertBatch(useDOs);
}
@Override
public void updateBank(UserBankSaveReqVO updateReqVO) {
// 校验存在
validateBankExists(updateReqVO.getId());
// 更新
BankDO updateObj = BeanUtils.toBean(updateReqVO, BankDO.class);
bankMapper.updateById(updateObj);
}
@Override
public void deleteUserBank(Long id) {
// 校验存在
UserBankDO userBankDO = userBankMapper.selectByBankId(getLoginUserId(), id);
if (userBankDO == null) {
throw exception(BANK_NOT_EXISTS);
}
// 删除
userBankMapper.deleteById(userBankDO);
BankDO bankDO = bankMapper.selectById(userBankDO.getBankId());
//校验当前登录用户是否是 该银行卡信息的创建者
if (bankDO.getCreator().equals(userBankDO.getUserId().toString())) {
// 同步删除 银行卡信息
bankMapper.deleteById(bankDO.getId());
}
}
private void validateBankExists(Long id) {
BankDO bankDO = bankMapper.selectById(id);
if (bankDO == null) {
throw exception(BANK_NOT_EXISTS);
}
//校验当前登录用户是否是 该银行卡信息的创建者
if (!Long.valueOf(bankDO.getCreator()).equals(getLoginUserId())) {
throw exception(BANK_NOT_CREATOR);
}
}
@Override
public BankDO getBank(Long id) {
return bankMapper.selectById(id);
}
@Override
public List<Long> getBankIds(Long userId) {
List<UserBankDO> userBankDOS = userBankMapper.selectList(UserBankDO::getUserId, userId);
return convertList(userBankDOS, UserBankDO::getBankId);
}
@Override
public PageResult<BankDO> getBankPageIn(UserBankPageReqVO pageReqVO, List<Long> bankId) {
return bankMapper.selectPageIn(pageReqVO, bankId);
}
@Override
public PageResult<BankDO> getBankPageNotIn(UserBankPageReqVO pageReqVO, List<Long> bankId) {
return bankMapper.selectPageNotIn(pageReqVO, bankId);
}
@Override
public List<BankDO> getBankListByUserId(Long userId) {
if (getBankIds(userId).isEmpty()) {
return null;
}
return bankMapper.selectBankList(getBankIds(userId));
}
}