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 9a90232..7b2a3a7 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,207 +208,103 @@ 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<>(); - // 检测当天是否生成了完全一样的数据 - 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); - } + 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); + } // 开始写入 for (Long userId : workerIds) { - 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); + SysUserVo sysUser = BeanUtil.toBean(sysUserService.selectUserByIdIncludingDel(userId), SysUserVo.class); + SysOaAttendanceVo sysOaAttendanceVo = new SysOaAttendanceVo(); + //如果sysUser为空就跳过 + if (sysUser == null) { + continue; } + 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()); + } + } + // 此为所有小时计的综合 + 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) { - 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); - } + 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); + } /** 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 268185d..b63cd09 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,11 +470,14 @@ public class SysOaProjectServiceImpl implements ISysOaProjectService { } private Date getLastDay(Date time) { + String format = "yyyy-MM-"; + // 计算某月的天数 Calendar calendar = Calendar.getInstance(); calendar.setTime(time); - calendar.set(Calendar.DAY_OF_MONTH, 1); // 设置为当月第一天 - calendar.add(Calendar.MONTH, 1); // 加一个月 - calendar.add(Calendar.DAY_OF_MONTH, -1); // 减一天,得到当月最后一天 - return calendar.getTime(); + String dateLength = String.valueOf(calendar.getActualMaximum(Calendar.DAY_OF_MONTH)); + // 将字符串拼接 + format += dateLength; + + return DateUtils.parseDate(DateUtils.parseDateToStr(format, time)); } }