feat(system): 添加借支管理功能

- 新增借支管理相关的 API、Controller、Service、Mapper 和 VO 类
- 实现借支管理的创建、查询和分页功能
- 添加根据用户编号获取借支记录的方法
- 为管理后台提供借支管理的接口和页面
This commit is contained in:
furongxin 2025-01-24 17:30:26 +08:00
parent eed729cedb
commit 5b3aa0f83f
13 changed files with 451 additions and 4 deletions

View File

@ -0,0 +1,35 @@
package cn.iocoder.yudao.module.system.api.loan;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.system.api.loan.dto.LoanDTO;
import cn.iocoder.yudao.module.system.controller.admin.loan.vo.LoanSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.loan.LoanDO;
import cn.iocoder.yudao.module.system.service.loan.LoanService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@RestController // 提供 RESTful API 接口 Feign 调用
@Validated
public class LoanApiImpl implements LoanApi {
@Resource
private LoanService loanService;
@Override
public CommonResult<Boolean> createLoan(LoanDTO dto) {
LoanSaveReqVO createDO = BeanUtils.toBean(dto, LoanSaveReqVO.class);
loanService.createLoan(createDO);
return success(true);
}
@Override
public CommonResult<LoanDTO> getByUserId(Long userId) {
LoanDO loanDO = loanService.getByUserId(userId);
return success(BeanUtils.toBean(loanDO, LoanDTO.class));
}
}

View File

@ -17,7 +17,6 @@ import cn.iocoder.yudao.module.system.dal.dataobject.customersettlement.Customer
import cn.iocoder.yudao.module.system.dal.dataobject.customersettlement.SettlementItemDO;
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
import cn.iocoder.yudao.module.system.service.customersettlement.CustomerSettlementService;
import cn.iocoder.yudao.module.system.service.dept.DeptService;
import cn.iocoder.yudao.module.system.service.user.AdminUserService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;

View File

@ -0,0 +1,13 @@
package cn.iocoder.yudao.module.system.controller.admin.customersettlement.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema(description = "管理后台 - 其他扣款明细 Response VO")
@Data
public class OtherDeductionsVO {
private String key;
private String value;
}

View File

@ -0,0 +1,22 @@
package cn.iocoder.yudao.module.system.controller.admin.customersettlement.vo;
import com.alibaba.excel.annotation.format.DateTimeFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
@Schema(description = "管理后台 - 收款明细 Response VO")
@Data
public class PaymentItem {
@Schema(description = "收款方 | 1公司 2个人")
private Integer payee;
@Schema(description = "收款金额")
private BigDecimal amount;
@Schema(description = "收款日期")
@DateTimeFormat("yyyy-MM-dd")
private String paymentDate;
}

View File

@ -0,0 +1,85 @@
package cn.iocoder.yudao.module.system.controller.admin.loan;
import cn.hutool.core.collection.CollUtil;
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.smartfactory.api.staff.StaffApi;
import cn.iocoder.yudao.module.smartfactory.api.staff.dto.StaffDTO;
import cn.iocoder.yudao.module.system.controller.admin.loan.vo.LoanPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.loan.vo.LoanRespVO;
import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
import cn.iocoder.yudao.module.system.dal.dataobject.loan.LoanDO;
import cn.iocoder.yudao.module.system.service.dept.DeptService;
import cn.iocoder.yudao.module.system.service.loan.LoanService;
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.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.Map;
import java.util.Set;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
@Tag(name = "管理后台 - 借支管理")
@RestController
@RequestMapping("/system/loan")
@Validated
public class LoanController {
@Resource
private LoanService loanService;
@Resource
private StaffApi staffApi;
@Resource
private DeptService deptService;
@GetMapping("/get")
@Operation(summary = "获得借支管理")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('system:loan:query')")
public CommonResult<LoanRespVO> getLoan(@RequestParam("id") Long id) {
LoanDO loan = loanService.getLoan(id);
return success(BeanUtils.toBean(loan, LoanRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得借支管理分页")
@PreAuthorize("@ss.hasPermission('system:loan:query')")
public CommonResult<PageResult<LoanRespVO>> getLoanPage(@Valid LoanPageReqVO pageReqVO) {
PageResult<LoanDO> pageResult = loanService.getLoanPage(pageReqVO);
PageResult<LoanRespVO> result = BeanUtils.toBean(pageResult, LoanRespVO.class);
if (CollUtil.isNotEmpty(result.getList())) {
// 获取员工信息
Set<Long> userIds = convertSet(result.getList(), LoanRespVO::getUserId);
Map<Long, StaffDTO> userMap = convertMap(staffApi.getStaffList(userIds).getCheckedData(), StaffDTO::getId);
// 获取部门信息
Set<Long> deptIds = convertSet(result.getList(), LoanRespVO::getDeptId);
Map<Long, DeptDO> deptMap = convertMap(deptService.getDeptList(deptIds), DeptDO::getId);
result.getList().forEach(item -> {
// 设置借支用户名称
item.setUserName(userMap.get(item.getUserId()).getNickName());
// 设置借支用户部门名称
item.setDeptName(deptMap.get(item.getDeptId()).getName());
});
}
return success(result);
}
}

View File

@ -0,0 +1,30 @@
package cn.iocoder.yudao.module.system.controller.admin.loan.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 LoanPageReqVO extends PageParam {
@Schema(description = "借支用户编号", example = "146")
private Long userId;
@Schema(description = "借支用户部门编号", example = "128")
private Long deptId;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}

View File

@ -0,0 +1,43 @@
package cn.iocoder.yudao.module.system.controller.admin.loan.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - 借支管理 Response VO")
@Data
public class LoanRespVO {
@Schema(description = "主键id")
private Long id;
@Schema(description = "申请人姓名")
private String applicantName;
@Schema(description = "借支用户编号")
private Long userId;
@Schema(description = "借支用户姓名")
private String userName;
@Schema(description = "借支用户部门编号")
private Long deptId;
@Schema(description = "借支用户部门名称")
private String deptName;
@Schema(description = "借支总额")
private BigDecimal amount;
@Schema(description = "已归还金额")
private BigDecimal returnAmount;
@Schema(description = "剩余金额")
private BigDecimal remainingAmount;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDateTime createTime;
}

View File

@ -0,0 +1,33 @@
package cn.iocoder.yudao.module.system.controller.admin.loan.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
@Schema(description = "管理后台 - 借支管理新增/修改 Request VO")
@Data
public class LoanSaveReqVO {
@Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Long id;
@Schema(description = "借支用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "146")
@NotNull(message = "借支用户编号不能为空")
private Long userId;
@Schema(description = "借支用户部门编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "128")
@NotNull(message = "借支用户部门编号不能为空")
private Long deptId;
@Schema(description = "借支总额")
private BigDecimal amount;
@Schema(description = "已归还金额")
private BigDecimal returnAmount;
@Schema(description = "剩余金额")
private BigDecimal remainingAmount;
}

View File

@ -0,0 +1,52 @@
package cn.iocoder.yudao.module.system.dal.dataobject.loan;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
import java.math.BigDecimal;
/**
* 借支管理 DO
*
* @author 符溶馨
*/
@TableName("system_loan")
@KeySequence("system_loan_seq") // 用于 OraclePostgreSQLKingbaseDB2H2 数据库的主键自增如果是 MySQL 等数据库可不写
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class LoanDO extends BaseDO {
/**
* 主键id
*/
@TableId
private Long id;
/**
* 借支用户编号
*/
private Long userId;
/**
* 借支用户部门编号
*/
private Long deptId;
/**
* 借支总额
*/
private BigDecimal amount;
/**
* 已归还金额
*/
private BigDecimal returnAmount;
/**
* 剩余金额
*/
private BigDecimal remainingAmount;
}

View File

@ -0,0 +1,26 @@
package cn.iocoder.yudao.module.system.dal.mysql.loan;
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.loan.vo.LoanPageReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.loan.LoanDO;
import org.apache.ibatis.annotations.Mapper;
/**
* 借支管理 Mapper
*
* @author 符溶馨
*/
@Mapper
public interface LoanMapper extends BaseMapperX<LoanDO> {
default PageResult<LoanDO> selectPage(LoanPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<LoanDO>()
.eqIfPresent(LoanDO::getUserId, reqVO.getUserId())
.eqIfPresent(LoanDO::getDeptId, reqVO.getDeptId())
.betweenIfPresent(LoanDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(LoanDO::getId));
}
}

View File

@ -29,9 +29,6 @@ public class FieldworkJob {
@Resource
private BpmOAGoOutApi goOutApi;
@Resource
private BpmOAEntryApi entryApi;
@Resource
private BpmOAEvectionApi evectionApi;

View File

@ -0,0 +1,47 @@
package cn.iocoder.yudao.module.system.service.loan;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.system.controller.admin.loan.vo.LoanPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.loan.vo.LoanSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.loan.LoanDO;
import javax.validation.Valid;
/**
* 借支管理 Service 接口
*
* @author 符溶馨
*/
public interface LoanService {
/**
* 创建借支管理
*
* @param createReqVO 创建信息
*/
void createLoan(@Valid LoanSaveReqVO createReqVO);
/**
* 获得借支管理
*
* @param id 编号
* @return 借支管理
*/
LoanDO getLoan(Long id);
/**
* 获得借支管理分页
*
* @param pageReqVO 分页查询
* @return 借支管理分页
*/
PageResult<LoanDO> getLoanPage(LoanPageReqVO pageReqVO);
/**
* 根据用户编号获取借支管理
* @param userId 用户编号
* @return 借支记录
*/
LoanDO getByUserId(Long userId);
}

View File

@ -0,0 +1,65 @@
package cn.iocoder.yudao.module.system.service.loan;
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.loan.vo.LoanPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.loan.vo.LoanSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.loan.LoanDO;
import cn.iocoder.yudao.module.system.dal.mysql.loan.LoanMapper;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.LOAN_NOT_EXISTS;
/**
* 借支管理 Service 实现类
*
* @author 符溶馨
*/
@Service
@Validated
public class LoanServiceImpl implements LoanService {
@Resource
private LoanMapper loanMapper;
@Override
public void createLoan(LoanSaveReqVO createReqVO) {
// 判断该借支用户 是否已存在借支记录
LoanDO loanDO = loanMapper.selectOne(LoanDO::getUserId, createReqVO.getUserId());
if (loanDO != null) {
// 借支用户已存在借支记录则更新该借支用户记录
LoanDO updateDO = new LoanDO()
.setId(loanDO.getId())
.setAmount(loanDO.getAmount().add(createReqVO.getAmount()))
.setReturnAmount(loanDO.getReturnAmount().add(createReqVO.getReturnAmount()));
// 更新
loanMapper.updateById(updateDO);
}else {
// 借支用户不存在借支记录则插入一条新记录
// 插入
LoanDO createDO = BeanUtils.toBean(createReqVO, LoanDO.class);
loanMapper.insert(createDO);
}
}
@Override
public LoanDO getLoan(Long id) {
return loanMapper.selectById(id);
}
@Override
public PageResult<LoanDO> getLoanPage(LoanPageReqVO pageReqVO) {
return loanMapper.selectPage(pageReqVO);
}
@Override
public LoanDO getByUserId(Long userId) {
return loanMapper.selectOne(LoanDO::getUserId, userId);
}
}