添加员工管理自动导入能力,修复了部门,岗位未显示

This commit is contained in:
2026-07-08 18:49:37 +08:00
parent 349f06b22b
commit 185231948c
6 changed files with 262 additions and 33 deletions

View File

@@ -62,11 +62,17 @@ public class HrmMyApplyController extends BaseController {
if (currentUserId == null) {
return TableDataInfo.build();
}
HrmEmployee emp = employeeMapper.selectOne(new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<HrmEmployee>()
.eq(HrmEmployee::getUserId, currentUserId));
if (emp == null) {
// 极端场景一个 sys_user 可能对应多条员工记录(历史孤儿/副本没清干净),
// 用 list + limit 1 兜底,别用 selectOne 直接抛异常。
List<HrmEmployee> empList = employeeMapper.selectList(
new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<HrmEmployee>()
.eq(HrmEmployee::getUserId, currentUserId)
.orderByAsc(HrmEmployee::getEmpId)
.last("limit 1"));
if (empList.isEmpty()) {
return TableDataInfo.build();
}
HrmEmployee emp = empList.get(0);
SysUser sysUser = sysUserMapper.selectUserById(emp.getUserId());
String nickName = sysUser != null ? sysUser.getNickName() : null;

View File

@@ -1,8 +1,33 @@
package com.ruoyi.hrm.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.mapper.BaseMapperPlus;
import com.ruoyi.hrm.domain.HrmEmployee;
import com.ruoyi.hrm.domain.bo.HrmEmployeeBo;
import com.ruoyi.hrm.domain.vo.HrmEmployeeVo;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface HrmEmployeeMapper extends BaseMapperPlus<HrmEmployeeMapper, HrmEmployee, HrmEmployeeVo> {
/**
* 按 empId 查询员工详情。JOIN sys_dept / sys_post 补上 dept_name / post_name。
* <p>
* 注意:不能沿用父接口的 selectVoById那是 default 方法先跑 selectById 再 BeanCopy
* 拿不到 JOIN 出来的 dept_name / post_name。
*/
HrmEmployeeVo selectEmployeeVoById(@Param("empId") Long empId);
/**
* 员工列表(含 dept / post 名称)。传 BO自己在 XML 里拼过滤条件,
* 别用 LambdaQueryWrapper——JOIN 里字段名会跟 sys_user / sys_dept 冲突。
*/
List<HrmEmployeeVo> selectEmployeeVoList(@Param("bo") HrmEmployeeBo bo);
/**
* 员工分页(含 dept / post 名称)。
*/
Page<HrmEmployeeVo> selectEmployeeVoPage(IPage<HrmEmployee> page, @Param("bo") HrmEmployeeBo bo);
}

View File

@@ -1,7 +1,6 @@
package com.ruoyi.hrm.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.PageQuery;
@@ -26,25 +25,30 @@ public class HrmEmployeeServiceImpl implements IHrmEmployeeService {
@Override
public HrmEmployeeVo queryById(Long empId) {
return baseMapper.selectVoById(empId);
// 走 JOIN 版本,返回带 deptName/postName 的完整 VO
return baseMapper.selectEmployeeVoById(empId);
}
@Override
public HrmEmployeeVo queryByUserId(Long userId) {
return baseMapper.selectVoOne(Wrappers.<HrmEmployee>lambdaQuery().eq(HrmEmployee::getUserId, userId));
// 同一个 sys_user 极端情况可能对应多条员工,取 empId 最小的一条兜底
HrmEmployeeBo bo = new HrmEmployeeBo();
bo.setUserId(userId);
List<HrmEmployeeVo> list = baseMapper.selectEmployeeVoList(bo);
return list.isEmpty() ? null : list.get(0);
}
@Override
public TableDataInfo<HrmEmployeeVo> queryPageList(HrmEmployeeBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<HrmEmployee> lqw = buildQueryWrapper(bo);
Page<HrmEmployeeVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
// 显式调用 XML 里带 JOIN 的自定义方法,父接口的 selectVoPage default 只会走单表 selectPage
// 拿不到 dept_name / post_name。
Page<HrmEmployeeVo> result = baseMapper.selectEmployeeVoPage(pageQuery.build(), bo);
return TableDataInfo.build(result);
}
@Override
public List<HrmEmployeeVo> queryList(HrmEmployeeBo bo) {
LambdaQueryWrapper<HrmEmployee> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
return baseMapper.selectEmployeeVoList(bo);
}
@Override
@@ -70,17 +74,4 @@ public class HrmEmployeeServiceImpl implements IHrmEmployeeService {
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
return baseMapper.deleteBatchIds(ids) > 0;
}
private LambdaQueryWrapper<HrmEmployee> buildQueryWrapper(HrmEmployeeBo bo) {
LambdaQueryWrapper<HrmEmployee> lqw = Wrappers.lambdaQuery();
lqw.eq(bo.getEmpId() != null, HrmEmployee::getEmpId, bo.getEmpId());
lqw.eq(bo.getUserId() != null, HrmEmployee::getUserId, bo.getUserId());
lqw.like(bo.getEmpNo() != null, HrmEmployee::getEmpNo, bo.getEmpNo());
lqw.like(bo.getEmpName() != null, HrmEmployee::getEmpName, bo.getEmpName());
lqw.eq(bo.getStatus() != null, HrmEmployee::getStatus, bo.getStatus());
lqw.eq(bo.getDeptId() != null, HrmEmployee::getDeptId, bo.getDeptId());
lqw.eq(bo.getPostId() != null, HrmEmployee::getPostId, bo.getPostId());
lqw.orderByAsc(HrmEmployee::getEmpNo);
return lqw;
}
}

View File

@@ -48,6 +48,7 @@
<result column="update_time" property="updateTime"/>
</resultMap>
<!-- 基础 SELECT + JOIN。dept_id 兼容员工表未维护部门时兜底到 sys_user.dept_id -->
<sql id="selectVo">
SELECT
e.emp_id, e.user_id, e.emp_no, e.emp_name, e.gender, e.mobile, e.email, e.id_no,
@@ -59,22 +60,46 @@
p.post_name
FROM hrm_employee e
LEFT JOIN sys_user su ON su.user_id = e.user_id
LEFT JOIN sys_dept d ON d.dept_id = COALESCE(e.dept_id, su.dept_id) AND d.del_flag = 0
LEFT JOIN sys_dept d ON d.dept_id = COALESCE(e.dept_id, su.dept_id) AND d.del_flag = '0'
LEFT JOIN sys_post p ON e.post_id = p.post_id
WHERE e.del_flag = 0
</sql>
<!-- 使用 JOIN 查询的 select 语句,确保使用 VoResultMap -->
<select id="selectVoPage" resultMap="VoResultMap">
<include refid="selectVo"/>
</select>
<sql id="whereBo">
<if test="bo != null">
<if test="bo.empId != null"> AND e.emp_id = #{bo.empId} </if>
<if test="bo.userId != null"> AND e.user_id = #{bo.userId} </if>
<if test="bo.empNo != null and bo.empNo != ''">
AND e.emp_no LIKE CONCAT('%', #{bo.empNo}, '%')
</if>
<if test="bo.empName != null and bo.empName != ''">
AND (e.emp_name LIKE CONCAT('%', #{bo.empName}, '%')
OR e.emp_no LIKE CONCAT('%', #{bo.empName}, '%'))
</if>
<if test="bo.status != null and bo.status != ''">
AND e.status = #{bo.status}
</if>
<if test="bo.deptId != null">
AND COALESCE(e.dept_id, su.dept_id) = #{bo.deptId}
</if>
<if test="bo.postId != null"> AND e.post_id = #{bo.postId} </if>
</if>
</sql>
<select id="selectVoList" resultMap="VoResultMap">
<include refid="selectVo"/>
</select>
<select id="selectVoById" resultMap="VoResultMap">
<select id="selectEmployeeVoById" resultMap="VoResultMap">
<include refid="selectVo"/>
AND e.emp_id = #{empId}
</select>
<select id="selectEmployeeVoList" resultMap="VoResultMap">
<include refid="selectVo"/>
<include refid="whereBo"/>
ORDER BY e.emp_no
</select>
<select id="selectEmployeeVoPage" resultMap="VoResultMap">
<include refid="selectVo"/>
<include refid="whereBo"/>
ORDER BY e.emp_no
</select>
</mapper>