fix: HRM 删除员工级联删除关联系统用户;MES 首页统计 summary 兼容设备状态为空

- HRM:deleteEmployee
同步删除关联系统用户,避免手机号(登录账号)被残留孤儿账号占用导致
「账号已存在」;AdminUserApi 新增 deleteUser 接口并实现
- MES:getHomeSummary 设备统计改为先判空,status 为 NULL 的历史设备只计入 total
不归类,
修复 /mes/home-statistics/summary 的 NPE
已修改4个文件
25 ■■■■■ 文件已修改
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/employee/HrmEmployeeServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/home/MesHomeStatisticsServiceImpl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/api/user/AdminUserApi.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/api/user/AdminUserApiImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/employee/HrmEmployeeServiceImpl.java
@@ -252,13 +252,17 @@
    @Transactional(rollbackFor = Exception.class)
    public void deleteEmployee(Long id) {
        // 校验存在
        validateEmployeeExists(id);
        HrmEmployeeDO employee = validateEmployeeExists(id);
        // 级联删除子表
        educationMapper.deleteByEmployeeId(id);
        workHistoryMapper.deleteByEmployeeId(id);
        emergencyContactMapper.deleteByEmployeeId(id);
        // 删除员工
        employeeMapper.deleteById(id);
        // 同步删除关联的系统用户,避免手机号(登录账号)被残留的孤儿账号占用
        if (employee.getUserId() != null) {
            adminUserApi.deleteUser(employee.getUserId());
        }
    }
    private HrmEmployeeDO validateEmployeeExists(Long id) {
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/home/MesHomeStatisticsServiceImpl.java
@@ -70,9 +70,14 @@
        long stop = 0L;
        long maintenance = 0L;
        for (Map<String, Object> stat : machineryStats) {
            int status = ((Number) stat.get("status")).intValue();
            long count = ((Number) stat.get("count")).longValue();
            total += count;
            // 状态为空的设备(历史数据)计入总数,但不归类,避免解引用 null 导致 NPE
            Number statusValue = (Number) stat.get("status");
            if (statusValue == null) {
                continue;
            }
            int status = statusValue.intValue();
            if (status == MesDvMachineryStatusEnum.PRODUCING.getStatus()) {
                producing = count;
            } else if (status == MesDvMachineryStatusEnum.STOP.getStatus()) {
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/api/user/AdminUserApi.java
@@ -33,6 +33,13 @@
    void updateUser(AdminUserUpdateReqDTO updateReqDTO);
    /**
     * 删除用户(供其他模块在下游记录删除时,同步删除其关联的系统用户,避免残留孤儿账号)
     *
     * @param id 用户编号
     */
    void deleteUser(Long id);
    /**
     * 通过用户 ID 查询用户
     *
     * @param id 用户ID
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/api/user/AdminUserApiImpl.java
@@ -67,6 +67,11 @@
    }
    @Override
    public void deleteUser(Long id) {
        userService.deleteUser(id);
    }
    @Override
    @DataPermission(enable = false) // 忽略数据权限,避免因为过滤,导致无法查询用户。类似:https://github.com/YunaiV/ruoyi-vue-pro/issues/1051
    public AdminUserRespDTO getUser(Long id) {
        AdminUserDO user = userService.getUser(id);