diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaAttendanceServiceImpl.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaAttendanceServiceImpl.java index 5a2c53a..9a90232 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaAttendanceServiceImpl.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaAttendanceServiceImpl.java @@ -208,99 +208,207 @@ public class SysOaAttendanceServiceImpl implements ISysOaAttendanceService { */ @Override public List workerCalc(Date time) { + try { + if (time == null) { + log.error("传入的时间参数为null"); + return new ArrayList<>(); + } + + Date firstDay = getFirstDay(time); + if (firstDay == null) { + log.error("获取月初日期失败,原始时间: {}", time); + return new ArrayList<>(); + } + + Date lastDay = getLastDay(time); + if (lastDay == null) { + log.error("获取月末日期失败,原始时间: {}", time); + return new ArrayList<>(); + } + + // 查询所有的工人 + List userIds = sysUserRoleMapper.selectUserIdsByRoleId(1852970465740505090L); + if (userIds == null) { + userIds = new ArrayList<>(); + } + + List workerIds; + try { + workerIds = baseMapper.selectNowMonthUserId(firstDay); + if (workerIds == null) { + workerIds = new ArrayList<>(); + } + } catch (Exception e) { + log.error("查询当月用户ID失败", e); + workerIds = new ArrayList<>(); + } + + // 合并并去重 + workerIds = Stream + .concat(userIds.stream(), workerIds.stream()) + .filter(Objects::nonNull) + .distinct() + .collect(Collectors.toList()); + + List costDataList = new ArrayList<>(); - Date firstDay = getFirstDay(time); - Date lastDay = getLastDay(time); - // 查询所有的工人 - List userIds = sysUserRoleMapper.selectUserIdsByRoleId(1852970465740505090L); - List workerIds = baseMapper.selectNowMonthUserId(firstDay); - // 合并并去重 - workerIds = Stream - .concat(userIds.stream(), workerIds.stream()) - .distinct() - .collect(Collectors.toList()); - List costDataList = new ArrayList<>(); - - - // 检测当天是否生成了完全一样的数据 - List recordIds = recordMapper.listCommonDateRecord(DateUtils.getDate(), firstDay); - if (!recordIds.isEmpty()) { - // 如果有重复的就删掉 - recordMapper.deleteBatchIds(recordIds); - } + // 检测当天是否生成了完全一样的数据 + try { + String currentDate = DateUtils.getDate(); + + if (currentDate != null && firstDay != null) { + List recordIds = recordMapper.listCommonDateRecord(currentDate, firstDay); + if (recordIds != null && !recordIds.isEmpty()) { + // 如果有重复的就删掉 + recordMapper.deleteBatchIds(recordIds); + } + } + } catch (Exception e) { + log.error("处理重复记录失败", e); + } // 开始写入 for (Long userId : workerIds) { - SysUserVo sysUser = BeanUtil.toBean(sysUserService.selectUserByIdIncludingDel(userId), SysUserVo.class); - SysOaAttendanceVo sysOaAttendanceVo = new SysOaAttendanceVo(); - sysOaAttendanceVo.setUserId(sysUser.getUserId()); - - // 查询某月记录 - List sysOaAttendanceVos = baseMapper.selectVoListAndTime(userId, firstDay, lastDay); - List projectVos = new ArrayList<>(); - Double workTimes = 0.0; - Double hourWorkTimes = 0.0; - Double overTime = 0.0; - Double tripDays = 0.0; - Double leaveCount = 0.0; - Set projSet = new HashSet<>(); - for (SysOaAttendanceVo oaAttendanceVo : sysOaAttendanceVos) { - tripDays += oaAttendanceVo.getTripDays(); - leaveCount+=oaAttendanceVo.getAbsenceDays(); - workTimes += oaAttendanceVo.getWorkTimes(); - hourWorkTimes += oaAttendanceVo.getHourWorkTimes(); - overTime += oaAttendanceVo.getOverTime(); - if (oaAttendanceVo.getProjectId() != 0L && oaAttendanceVo.getProjectId() != 1L) { - SysOaProjectVo sysOaProjectVo = projectService.queryById(oaAttendanceVo.getProjectId()); - oaAttendanceVo.setColor(sysOaProjectVo.getColor()); - oaAttendanceVo.setSysOaProjectVo(sysOaProjectVo); - oaAttendanceVo.setProjectName(sysOaProjectVo.getProjectName()); - projectVos.add(sysOaProjectVo); - projSet.add(oaAttendanceVo.getProjectId()); + try { + if (userId == null) { + continue; } + + Object userObj = null; + try { + userObj = sysUserService.selectUserByIdIncludingDel(userId); + } catch (Exception e) { + log.error("查询用户信息失败,用户ID: {}", userId, e); + continue; + } + + if (userObj == null) { + log.warn("未找到用户信息,用户ID: {}", userId); + continue; + } + + SysUserVo sysUser = BeanUtil.toBean(userObj, SysUserVo.class); + SysOaAttendanceVo sysOaAttendanceVo = new SysOaAttendanceVo(); + sysOaAttendanceVo.setUserId(sysUser.getUserId()); + + // 查询某月记录 + List sysOaAttendanceVos; + try { + sysOaAttendanceVos = baseMapper.selectVoListAndTime(userId, firstDay, lastDay); + if (sysOaAttendanceVos == null) { + sysOaAttendanceVos = new ArrayList<>(); + } + } catch (Exception e) { + log.error("查询考勤记录失败,用户ID: {}", userId, e); + sysOaAttendanceVos = new ArrayList<>(); + } + + List projectVos = new ArrayList<>(); + Double workTimes = 0.0; + Double hourWorkTimes = 0.0; + Double overTime = 0.0; + Double tripDays = 0.0; + Double leaveCount = 0.0; + Set projSet = new HashSet<>(); + + for (SysOaAttendanceVo oaAttendanceVo : sysOaAttendanceVos) { + if (oaAttendanceVo == null) { + continue; + } + + tripDays += (oaAttendanceVo.getTripDays() != null ? oaAttendanceVo.getTripDays() : 0); + leaveCount += (oaAttendanceVo.getAbsenceDays() != null ? oaAttendanceVo.getAbsenceDays() : 0); + workTimes += (oaAttendanceVo.getWorkTimes() != null ? oaAttendanceVo.getWorkTimes() : 0); + hourWorkTimes += (oaAttendanceVo.getHourWorkTimes() != null ? oaAttendanceVo.getHourWorkTimes() : 0); + overTime += (oaAttendanceVo.getOverTime() != null ? oaAttendanceVo.getOverTime() : 0); + + if (oaAttendanceVo.getProjectId() != null && oaAttendanceVo.getProjectId() != 0L && oaAttendanceVo.getProjectId() != 1L) { + try { + SysOaProjectVo sysOaProjectVo = projectService.queryById(oaAttendanceVo.getProjectId()); + if (sysOaProjectVo != null) { + oaAttendanceVo.setColor(sysOaProjectVo.getColor()); + oaAttendanceVo.setSysOaProjectVo(sysOaProjectVo); + oaAttendanceVo.setProjectName(sysOaProjectVo.getProjectName()); + projectVos.add(sysOaProjectVo); + projSet.add(oaAttendanceVo.getProjectId()); + } else { + log.warn("项目ID {} 未找到对应的项目信息", oaAttendanceVo.getProjectId()); + } + } catch (Exception e) { + log.error("查询项目信息失败,项目ID: {}", oaAttendanceVo.getProjectId(), e); + } + } + } + + // 此为所有小时计的综合 + List distinctProjects = projectVos.stream().distinct().collect(Collectors.toList()); + + LaborCostData laborCostData = new LaborCostData(); + laborCostData.setProjects(distinctProjects); + laborCostData.setAttendances(sysOaAttendanceVos); + laborCostData.setSysUser(sysUser); + laborCostData.setWorkTimes(workTimes); + laborCostData.setTripTimes(tripDays); + laborCostData.setAbsenceDays(leaveCount); + laborCostData.setHourWorkTime(hourWorkTimes); + // 加班时间 + laborCostData.setOvertime(overTime); + costDataList.add(laborCostData); + + // 构造并保存记录 + try { + addGenData(firstDay, sysUser, tripDays, leaveCount, workTimes, projSet, overTime); + } catch (Exception e) { + log.error("保存考勤记录失败,用户ID: {}", userId, e); + } + } catch (Exception e) { + log.error("处理用户考勤数据失败,用户ID: {}", userId, e); } - // 此为所有小时计的综合 - projectVos.stream().distinct().collect(Collectors.toList()); - LaborCostData laborCostData = new LaborCostData(); - laborCostData.setProjects(projectVos); - laborCostData.setAttendances(sysOaAttendanceVos); - laborCostData.setSysUser(sysUser); - laborCostData.setWorkTimes(workTimes); - laborCostData.setTripTimes(tripDays); - laborCostData.setAbsenceDays(leaveCount); - laborCostData.setHourWorkTime(hourWorkTimes); - // 加班时间 - laborCostData.setOvertime(overTime); - costDataList.add(laborCostData); - // 构造并保存记录 - addGenData(firstDay, sysUser, tripDays, leaveCount, workTimes, projSet, overTime); } - return costDataList; + } catch (Exception e) { + log.error("计算人力成本失败", e); + return new ArrayList<>(); + } } private void addGenData(Date firstDay, SysUserVo sysUser, Double tripDays, Double leaveCount, Double workDays, Set projSet, Double overtimeSum) { - OaAttendanceRecord rec = new OaAttendanceRecord(); - // relationMonth 只保留年月,可直接传入 firstDay(其 day=1) - rec.setRelationMonth(firstDay); - // calcTime 为当前时间 - rec.setCalcTime(new Date()); - // 当前操作人昵称 - rec.setNickName(sysUser.getNickName()); - rec.setUserId(sysUser.getUserId()); - rec.setTrips(new BigDecimal(tripDays.toString())); - rec.setNotNum(new BigDecimal(leaveCount.toString())); - rec.setWorks(new BigDecimal(workDays.toString())); - rec.setProjectIds( - String.join(",", - projSet.stream().map(String::valueOf).toArray(String[]::new) - ) - ); - rec.setOverNum(BigDecimal.valueOf(overtimeSum)); - rec.setRemark("自动统计生成"); - recordMapper.insert(rec); - + try { + OaAttendanceRecord rec = new OaAttendanceRecord(); + // relationMonth 只保留年月,可直接传入 firstDay(其 day=1) + rec.setRelationMonth(firstDay); + // calcTime 为当前时间 + rec.setCalcTime(new Date()); + // 当前操作人昵称 + rec.setNickName(sysUser != null ? sysUser.getNickName() : "未知"); + rec.setUserId(sysUser != null ? sysUser.getUserId() : 0L); + + // 安全处理数值转换 + rec.setTrips(tripDays != null ? BigDecimal.valueOf(tripDays) : BigDecimal.ZERO); + rec.setNotNum(leaveCount != null ? BigDecimal.valueOf(leaveCount) : BigDecimal.ZERO); + rec.setWorks(workDays != null ? BigDecimal.valueOf(workDays) : BigDecimal.ZERO); + + // 安全处理项目ID集合 + if (projSet != null && !projSet.isEmpty()) { + rec.setProjectIds( + String.join(",", + projSet.stream() + .filter(Objects::nonNull) + .map(String::valueOf) + .toArray(String[]::new) + ) + ); + } else { + rec.setProjectIds(""); + } + + rec.setOverNum(overtimeSum != null ? BigDecimal.valueOf(overtimeSum) : BigDecimal.ZERO); + rec.setRemark("自动统计生成"); + recordMapper.insert(rec); + } catch (Exception e) { + log.error("添加考勤记录失败", e); + } } /** diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaProjectServiceImpl.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaProjectServiceImpl.java index b63cd09..268185d 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaProjectServiceImpl.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaProjectServiceImpl.java @@ -470,14 +470,11 @@ public class SysOaProjectServiceImpl implements ISysOaProjectService { } private Date getLastDay(Date time) { - String format = "yyyy-MM-"; - // 计算某月的天数 Calendar calendar = Calendar.getInstance(); calendar.setTime(time); - String dateLength = String.valueOf(calendar.getActualMaximum(Calendar.DAY_OF_MONTH)); - // 将字符串拼接 - format += dateLength; - - return DateUtils.parseDate(DateUtils.parseDateToStr(format, time)); + calendar.set(Calendar.DAY_OF_MONTH, 1); // 设置为当月第一天 + calendar.add(Calendar.MONTH, 1); // 加一个月 + calendar.add(Calendar.DAY_OF_MONTH, -1); // 减一天,得到当月最后一天 + return calendar.getTime(); } }