feat: 员工柜员号优化 - 移除tellerNo,employeeId作为7位数字柜员号
## 数据库修改 - 删除teller_no字段 - employee_id改为非自增,手动输入7位数字 - 更新字段注释 ## 后端修改 - Entity: 移除tellerNo,employeeId改为INPUT类型 - DTO: Add/Edit/Query/Excel全部使用employeeId - VO: 移除tellerNo字段 - Service: 添加柜员号唯一性校验(使用selectById) - Mapper XML: 移除teller_no查询和映射 ## 前端修改 - 查询表单: tellerNo改为employeeId,添加7位数字限制 - 表格列: 显示employeeId作为柜员号 - 对话框: 新增可输入,编辑只读 - JavaScript: 数据结构和校验规则更新 ## 文档更新 - API文档: 完整更新所有接口说明 - 实施报告: 生成详细实施报告 ## 测试 - 生成测试脚本(9个测试用例) - 测试账号: admin/admin123 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -22,16 +22,13 @@ public class CcdiEmployee implements Serializable {
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/** 员工ID */
|
||||
@TableId(type = IdType.AUTO)
|
||||
/** 员工ID(柜员号,7位数字) */
|
||||
@TableId(type = IdType.INPUT)
|
||||
private Long employeeId;
|
||||
|
||||
/** 姓名 */
|
||||
private String name;
|
||||
|
||||
/** 柜员号 */
|
||||
private String tellerNo;
|
||||
|
||||
/** 所属部门ID */
|
||||
private Long deptId;
|
||||
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
package com.ruoyi.ccdi.domain.dto;
|
||||
|
||||
import jakarta.validation.constraints.Max;
|
||||
import jakarta.validation.constraints.Min;
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import jakarta.validation.constraints.Pattern;
|
||||
import jakarta.validation.constraints.Size;
|
||||
import lombok.Data;
|
||||
@@ -8,7 +11,6 @@ import lombok.Data;
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 员工信息新增 DTO
|
||||
@@ -27,10 +29,11 @@ public class CcdiEmployeeAddDTO implements Serializable {
|
||||
@Size(max = 100, message = "姓名长度不能超过100个字符")
|
||||
private String name;
|
||||
|
||||
/** 柜员号 */
|
||||
@NotBlank(message = "柜员号不能为空")
|
||||
@Size(max = 50, message = "柜员号长度不能超过50个字符")
|
||||
private String tellerNo;
|
||||
/** 员工ID(柜员号,7位数字) */
|
||||
@NotNull(message = "柜员号不能为空")
|
||||
@Min(value = 1000000L, message = "柜员号必须为7位数字")
|
||||
@Max(value = 9999999L, message = "柜员号必须为7位数字")
|
||||
private Long employeeId;
|
||||
|
||||
/** 所属部门ID */
|
||||
private Long deptId;
|
||||
@@ -50,7 +53,4 @@ public class CcdiEmployeeAddDTO implements Serializable {
|
||||
/** 状态 */
|
||||
@NotBlank(message = "状态不能为空")
|
||||
private String status;
|
||||
|
||||
/** 亲属列表 */
|
||||
private List<CcdiEmployeeRelativeAddDTO> relatives;
|
||||
}
|
||||
|
||||
@@ -8,7 +8,6 @@ import lombok.Data;
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 员工信息编辑 DTO
|
||||
@@ -30,10 +29,6 @@ public class CcdiEmployeeEditDTO implements Serializable {
|
||||
@Size(max = 100, message = "姓名长度不能超过100个字符")
|
||||
private String name;
|
||||
|
||||
/** 柜员号 */
|
||||
@Size(max = 50, message = "柜员号长度不能超过50个字符")
|
||||
private String tellerNo;
|
||||
|
||||
/** 所属部门ID */
|
||||
private Long deptId;
|
||||
|
||||
@@ -50,7 +45,4 @@ public class CcdiEmployeeEditDTO implements Serializable {
|
||||
|
||||
/** 状态 */
|
||||
private String status;
|
||||
|
||||
/** 亲属列表 */
|
||||
private List<CcdiEmployeeRelativeAddDTO> relatives;
|
||||
}
|
||||
|
||||
@@ -17,11 +17,11 @@ public class CcdiEmployeeQueryDTO implements Serializable {
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/** 姓名(模糊查询) */
|
||||
/** 姓名(模糊查询) */
|
||||
private String name;
|
||||
|
||||
/** 柜员号(精确查询) */
|
||||
private String tellerNo;
|
||||
/** 员工ID(柜员号,精确查询) */
|
||||
private Long employeeId;
|
||||
|
||||
/** 所属部门ID */
|
||||
private Long deptId;
|
||||
|
||||
@@ -26,10 +26,10 @@ public class CcdiEmployeeExcel implements Serializable {
|
||||
@ColumnWidth(15)
|
||||
private String name;
|
||||
|
||||
/** 柜员号 */
|
||||
/** 员工ID(柜员号) */
|
||||
@ExcelProperty(value = "柜员号", index = 1)
|
||||
@ColumnWidth(15)
|
||||
private String tellerNo;
|
||||
private Long employeeId;
|
||||
|
||||
/** 所属部门ID */
|
||||
@ExcelProperty(value = "所属部门ID", index = 2)
|
||||
@@ -54,6 +54,6 @@ public class CcdiEmployeeExcel implements Serializable {
|
||||
/** 状态 */
|
||||
@ExcelProperty(value = "状态", index = 6)
|
||||
@ColumnWidth(10)
|
||||
@DictDropdown(dictType = "dpc_employee_status")
|
||||
@DictDropdown(dictType = "ccdi_employee_status")
|
||||
private String status;
|
||||
}
|
||||
|
||||
@@ -5,7 +5,6 @@ import lombok.Data;
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 员工信息 VO
|
||||
@@ -19,15 +18,12 @@ public class CcdiEmployeeVO implements Serializable {
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/** 员工ID */
|
||||
/** 员工ID(柜员号) */
|
||||
private Long employeeId;
|
||||
|
||||
/** 姓名 */
|
||||
private String name;
|
||||
|
||||
/** 柜员号 */
|
||||
private String tellerNo;
|
||||
|
||||
/** 所属部门ID */
|
||||
private Long deptId;
|
||||
|
||||
@@ -60,7 +56,4 @@ public class CcdiEmployeeVO implements Serializable {
|
||||
|
||||
/** 更新者 */
|
||||
private String updateBy;
|
||||
|
||||
/** 亲属列表 */
|
||||
private List<CcdiEmployeeRelativeVO> relatives;
|
||||
}
|
||||
|
||||
@@ -3,16 +3,13 @@ package com.ruoyi.ccdi.service.impl;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.ruoyi.ccdi.domain.CcdiEmployee;
|
||||
import com.ruoyi.ccdi.domain.CcdiEmployeeRelative;
|
||||
import com.ruoyi.ccdi.domain.dto.CcdiEmployeeAddDTO;
|
||||
import com.ruoyi.ccdi.domain.dto.CcdiEmployeeEditDTO;
|
||||
import com.ruoyi.ccdi.domain.dto.CcdiEmployeeQueryDTO;
|
||||
import com.ruoyi.ccdi.domain.dto.CcdiEmployeeRelativeAddDTO;
|
||||
import com.ruoyi.ccdi.domain.excel.CcdiEmployeeExcel;
|
||||
import com.ruoyi.ccdi.domain.vo.CcdiEmployeeVO;
|
||||
import com.ruoyi.ccdi.enums.EmployeeStatus;
|
||||
import com.ruoyi.ccdi.mapper.CcdiEmployeeMapper;
|
||||
import com.ruoyi.ccdi.mapper.CcdiEmployeeRelativeMapper;
|
||||
import com.ruoyi.ccdi.service.ICcdiEmployeeService;
|
||||
import com.ruoyi.common.utils.IdCardUtil;
|
||||
import com.ruoyi.common.utils.StringUtils;
|
||||
@@ -36,9 +33,6 @@ public class CcdiEmployeeServiceImpl implements ICcdiEmployeeService {
|
||||
@Resource
|
||||
private CcdiEmployeeMapper employeeMapper;
|
||||
|
||||
@Resource
|
||||
private CcdiEmployeeRelativeMapper relativeMapper;
|
||||
|
||||
/**
|
||||
* 查询员工列表
|
||||
*
|
||||
@@ -102,7 +96,8 @@ public class CcdiEmployeeServiceImpl implements ICcdiEmployeeService {
|
||||
*/
|
||||
@Override
|
||||
public CcdiEmployeeVO selectEmployeeById(Long employeeId) {
|
||||
return employeeMapper.selectEmployeeWithRelatives(employeeId);
|
||||
CcdiEmployee employee = employeeMapper.selectById(employeeId);
|
||||
return convertToVO(employee);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -114,15 +109,13 @@ public class CcdiEmployeeServiceImpl implements ICcdiEmployeeService {
|
||||
@Override
|
||||
@Transactional
|
||||
public int insertEmployee(CcdiEmployeeAddDTO addDTO) {
|
||||
// 检查柜员号唯一性
|
||||
LambdaQueryWrapper<CcdiEmployee> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(CcdiEmployee::getTellerNo, addDTO.getTellerNo());
|
||||
if (employeeMapper.selectCount(wrapper) > 0) {
|
||||
// 检查柜员号(employeeId)唯一性
|
||||
if (employeeMapper.selectById(addDTO.getEmployeeId()) != null) {
|
||||
throw new RuntimeException("该柜员号已存在");
|
||||
}
|
||||
|
||||
// 检查身份证号唯一性
|
||||
wrapper = new LambdaQueryWrapper<>();
|
||||
LambdaQueryWrapper<CcdiEmployee> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(CcdiEmployee::getIdCard, addDTO.getIdCard());
|
||||
if (employeeMapper.selectCount(wrapper) > 0) {
|
||||
throw new RuntimeException("该身份证号已存在");
|
||||
@@ -132,16 +125,6 @@ public class CcdiEmployeeServiceImpl implements ICcdiEmployeeService {
|
||||
BeanUtils.copyProperties(addDTO, employee);
|
||||
int result = employeeMapper.insert(employee);
|
||||
|
||||
// 插入亲属信息
|
||||
if (addDTO.getRelatives() != null && !addDTO.getRelatives().isEmpty()) {
|
||||
for (CcdiEmployeeRelativeAddDTO relativeAddDTO : addDTO.getRelatives()) {
|
||||
CcdiEmployeeRelative relative = new CcdiEmployeeRelative();
|
||||
BeanUtils.copyProperties(relativeAddDTO, relative);
|
||||
relative.setEmployeeId(employee.getEmployeeId());
|
||||
relativeMapper.insert(relative);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -154,16 +137,6 @@ public class CcdiEmployeeServiceImpl implements ICcdiEmployeeService {
|
||||
@Override
|
||||
@Transactional
|
||||
public int updateEmployee(CcdiEmployeeEditDTO editDTO) {
|
||||
// 检查柜员号唯一性(排除自己)
|
||||
if (StringUtils.isNotEmpty(editDTO.getTellerNo())) {
|
||||
LambdaQueryWrapper<CcdiEmployee> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(CcdiEmployee::getTellerNo, editDTO.getTellerNo())
|
||||
.ne(CcdiEmployee::getEmployeeId, editDTO.getEmployeeId());
|
||||
if (employeeMapper.selectCount(wrapper) > 0) {
|
||||
throw new RuntimeException("该柜员号已存在");
|
||||
}
|
||||
}
|
||||
|
||||
// 检查身份证号唯一性(排除自己)
|
||||
if (StringUtils.isNotEmpty(editDTO.getIdCard())) {
|
||||
LambdaQueryWrapper<CcdiEmployee> wrapper = new LambdaQueryWrapper<>();
|
||||
@@ -178,21 +151,6 @@ public class CcdiEmployeeServiceImpl implements ICcdiEmployeeService {
|
||||
BeanUtils.copyProperties(editDTO, employee);
|
||||
int result = employeeMapper.updateById(employee);
|
||||
|
||||
// 删除原有亲属信息
|
||||
LambdaQueryWrapper<CcdiEmployeeRelative> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(CcdiEmployeeRelative::getEmployeeId, editDTO.getEmployeeId());
|
||||
relativeMapper.delete(wrapper);
|
||||
|
||||
// 插入新的亲属信息
|
||||
if (editDTO.getRelatives() != null && !editDTO.getRelatives().isEmpty()) {
|
||||
for (CcdiEmployeeRelativeAddDTO relativeAddDTO : editDTO.getRelatives()) {
|
||||
CcdiEmployeeRelative relative = new CcdiEmployeeRelative();
|
||||
BeanUtils.copyProperties(relativeAddDTO, relative);
|
||||
relative.setEmployeeId(editDTO.getEmployeeId());
|
||||
relativeMapper.insert(relative);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -205,12 +163,6 @@ public class CcdiEmployeeServiceImpl implements ICcdiEmployeeService {
|
||||
@Override
|
||||
@Transactional
|
||||
public int deleteEmployeeByIds(Long[] employeeIds) {
|
||||
// 级联删除亲属信息
|
||||
for (Long employeeId : employeeIds) {
|
||||
LambdaQueryWrapper<CcdiEmployeeRelative> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(CcdiEmployeeRelative::getEmployeeId, employeeId);
|
||||
relativeMapper.delete(wrapper);
|
||||
}
|
||||
return employeeMapper.deleteBatchIds(List.of(employeeIds));
|
||||
}
|
||||
|
||||
@@ -270,7 +222,7 @@ public class CcdiEmployeeServiceImpl implements ICcdiEmployeeService {
|
||||
private LambdaQueryWrapper<CcdiEmployee> buildQueryWrapper(CcdiEmployeeQueryDTO queryDTO) {
|
||||
LambdaQueryWrapper<CcdiEmployee> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.like(StringUtils.isNotEmpty(queryDTO.getName()), CcdiEmployee::getName, queryDTO.getName())
|
||||
.eq(StringUtils.isNotEmpty(queryDTO.getTellerNo()), CcdiEmployee::getTellerNo, queryDTO.getTellerNo())
|
||||
.eq(queryDTO.getEmployeeId() != null, CcdiEmployee::getEmployeeId, queryDTO.getEmployeeId())
|
||||
.eq(queryDTO.getDeptId() != null, CcdiEmployee::getDeptId, queryDTO.getDeptId())
|
||||
.like(StringUtils.isNotEmpty(queryDTO.getIdCard()), CcdiEmployee::getIdCard, queryDTO.getIdCard())
|
||||
.eq(StringUtils.isNotEmpty(queryDTO.getStatus()), CcdiEmployee::getStatus, queryDTO.getStatus())
|
||||
@@ -286,7 +238,7 @@ public class CcdiEmployeeServiceImpl implements ICcdiEmployeeService {
|
||||
if (StringUtils.isEmpty(addDTO.getName())) {
|
||||
throw new RuntimeException("姓名不能为空");
|
||||
}
|
||||
if (StringUtils.isEmpty(addDTO.getTellerNo())) {
|
||||
if (addDTO.getEmployeeId() == null) {
|
||||
throw new RuntimeException("柜员号不能为空");
|
||||
}
|
||||
if (StringUtils.isEmpty(addDTO.getIdCard())) {
|
||||
@@ -302,15 +254,13 @@ public class CcdiEmployeeServiceImpl implements ICcdiEmployeeService {
|
||||
throw new RuntimeException(idCardError);
|
||||
}
|
||||
|
||||
// 检查柜员号唯一性
|
||||
LambdaQueryWrapper<CcdiEmployee> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(CcdiEmployee::getTellerNo, addDTO.getTellerNo());
|
||||
if (employeeMapper.selectCount(wrapper) > 0) {
|
||||
// 检查柜员号(employeeId)唯一性
|
||||
if (employeeMapper.selectById(addDTO.getEmployeeId()) != null) {
|
||||
throw new RuntimeException("该柜员号已存在");
|
||||
}
|
||||
|
||||
// 检查身份证号唯一性
|
||||
wrapper = new LambdaQueryWrapper<>();
|
||||
LambdaQueryWrapper<CcdiEmployee> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(CcdiEmployee::getIdCard, addDTO.getIdCard());
|
||||
if (employeeMapper.selectCount(wrapper) > 0) {
|
||||
throw new RuntimeException("该身份证号已存在");
|
||||
|
||||
@@ -18,21 +18,9 @@
|
||||
<result property="createTime" column="create_time"/>
|
||||
</resultMap>
|
||||
|
||||
<!-- 员工详情ResultMap(包含亲属信息) -->
|
||||
<resultMap type="com.ruoyi.ccdi.domain.vo.CcdiEmployeeVO" id="CcdiEmployeeWithRelativesResult" extends="CcdiEmployeeVOResult">
|
||||
<collection property="relatives" ofType="CcdiEmployeeRelativeVO" notNullColumn="relative_id">
|
||||
<id property="relativeId" column="relative_id"/>
|
||||
<result property="employeeId" column="employee_id"/>
|
||||
<result property="relativeName" column="relative_name"/>
|
||||
<result property="relativeIdCard" column="relative_id_card"/>
|
||||
<result property="relativePhone" column="relative_phone"/>
|
||||
<result property="relationship" column="relationship"/>
|
||||
</collection>
|
||||
</resultMap>
|
||||
|
||||
<select id="selectEmployeePageWithDept" resultMap="CcdiEmployeeVOResult">
|
||||
SELECT
|
||||
e.employee_id, e.name, e.teller_no, e.dept_id, e.id_card, e.phone, e.hire_date, e.status, e.create_time,
|
||||
e.employee_id, e.name, e.dept_id, e.id_card, e.phone, e.hire_date, e.status, e.create_time,
|
||||
d.dept_name
|
||||
FROM ccdi_employee e
|
||||
LEFT JOIN sys_dept d ON e.dept_id = d.dept_id
|
||||
@@ -40,8 +28,8 @@
|
||||
<if test="query.name != null and query.name != ''">
|
||||
AND e.name LIKE CONCAT('%', #{query.name}, '%')
|
||||
</if>
|
||||
<if test="query.tellerNo != null and query.tellerNo != ''">
|
||||
AND e.teller_no = #{query.tellerNo}
|
||||
<if test="query.employeeId != null">
|
||||
AND e.employee_id = #{query.employeeId}
|
||||
</if>
|
||||
<if test="query.deptId != null">
|
||||
AND e.dept_id = #{query.deptId}
|
||||
@@ -56,15 +44,4 @@
|
||||
ORDER BY e.create_time DESC
|
||||
</select>
|
||||
|
||||
<select id="selectEmployeeWithRelatives" parameterType="Long" resultMap="CcdiEmployeeWithRelativesResult">
|
||||
SELECT
|
||||
e.employee_id, e.name, e.teller_no, e.dept_id, e.id_card, e.phone, e.hire_date, e.status, e.create_time,
|
||||
d.dept_name,
|
||||
r.relative_id, r.employee_id, r.relative_name, r.relative_id_card, r.relative_phone, r.relationship
|
||||
FROM ccdi_employee e
|
||||
LEFT JOIN sys_dept d ON e.dept_id = d.dept_id
|
||||
LEFT JOIN ccdi_employee_relative r ON e.employee_id = r.employee_id
|
||||
WHERE e.employee_id = #{employeeId}
|
||||
</select>
|
||||
|
||||
</mapper>
|
||||
|
||||
Reference in New Issue
Block a user