解决在处理7月份数据时出现的空指针异常问题

This commit is contained in:
2025-08-02 11:42:43 +08:00
parent b418d6928d
commit f812194200
2 changed files with 193 additions and 88 deletions

View File

@@ -208,99 +208,207 @@ public class SysOaAttendanceServiceImpl implements ISysOaAttendanceService {
*/ */
@Override @Override
public List<LaborCostData> workerCalc(Date time) { public List<LaborCostData> 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<Long> userIds = sysUserRoleMapper.selectUserIdsByRoleId(1852970465740505090L);
if (userIds == null) {
userIds = new ArrayList<>();
}
List<Long> 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<LaborCostData> costDataList = new ArrayList<>();
Date firstDay = getFirstDay(time); // 检测当天是否生成了完全一样的数据
Date lastDay = getLastDay(time); try {
// 查询所有的工人 String currentDate = DateUtils.getDate();
List<Long> userIds = sysUserRoleMapper.selectUserIdsByRoleId(1852970465740505090L);
List<Long> workerIds = baseMapper.selectNowMonthUserId(firstDay); if (currentDate != null && firstDay != null) {
// 合并并去重 List<Long> recordIds = recordMapper.listCommonDateRecord(currentDate, firstDay);
workerIds = Stream if (recordIds != null && !recordIds.isEmpty()) {
.concat(userIds.stream(), workerIds.stream()) // 如果有重复的就删掉
.distinct() recordMapper.deleteBatchIds(recordIds);
.collect(Collectors.toList()); }
List<LaborCostData> costDataList = new ArrayList<>(); }
} catch (Exception e) {
log.error("处理重复记录失败", e);
// 检测当天是否生成了完全一样的数据 }
List<Long> recordIds = recordMapper.listCommonDateRecord(DateUtils.getDate(), firstDay);
if (!recordIds.isEmpty()) {
// 如果有重复的就删掉
recordMapper.deleteBatchIds(recordIds);
}
// 开始写入 // 开始写入
for (Long userId : workerIds) { for (Long userId : workerIds) {
SysUserVo sysUser = BeanUtil.toBean(sysUserService.selectUserByIdIncludingDel(userId), SysUserVo.class); try {
SysOaAttendanceVo sysOaAttendanceVo = new SysOaAttendanceVo(); if (userId == null) {
sysOaAttendanceVo.setUserId(sysUser.getUserId()); continue;
// 查询某月记录
List<SysOaAttendanceVo> sysOaAttendanceVos = baseMapper.selectVoListAndTime(userId, firstDay, lastDay);
List<SysOaProjectVo> projectVos = new ArrayList<>();
Double workTimes = 0.0;
Double hourWorkTimes = 0.0;
Double overTime = 0.0;
Double tripDays = 0.0;
Double leaveCount = 0.0;
Set<Long> 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());
} }
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<SysOaAttendanceVo> 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<SysOaProjectVo> projectVos = new ArrayList<>();
Double workTimes = 0.0;
Double hourWorkTimes = 0.0;
Double overTime = 0.0;
Double tripDays = 0.0;
Double leaveCount = 0.0;
Set<Long> 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<SysOaProjectVo> 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; 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<Long> projSet, Double overtimeSum) { private void addGenData(Date firstDay, SysUserVo sysUser, Double tripDays, Double leaveCount, Double workDays, Set<Long> projSet, Double overtimeSum) {
OaAttendanceRecord rec = new OaAttendanceRecord(); try {
// relationMonth 只保留年月,可直接传入 firstDay其 day=1 OaAttendanceRecord rec = new OaAttendanceRecord();
rec.setRelationMonth(firstDay); // relationMonth 只保留年月,可直接传入 firstDay其 day=1
// calcTime 为当前时间 rec.setRelationMonth(firstDay);
rec.setCalcTime(new Date()); // calcTime 为当前时间
// 当前操作人昵称 rec.setCalcTime(new Date());
rec.setNickName(sysUser.getNickName()); // 当前操作人昵称
rec.setUserId(sysUser.getUserId()); rec.setNickName(sysUser != null ? sysUser.getNickName() : "未知");
rec.setTrips(new BigDecimal(tripDays.toString())); rec.setUserId(sysUser != null ? sysUser.getUserId() : 0L);
rec.setNotNum(new BigDecimal(leaveCount.toString()));
rec.setWorks(new BigDecimal(workDays.toString())); // 安全处理数值转换
rec.setProjectIds( rec.setTrips(tripDays != null ? BigDecimal.valueOf(tripDays) : BigDecimal.ZERO);
String.join(",", rec.setNotNum(leaveCount != null ? BigDecimal.valueOf(leaveCount) : BigDecimal.ZERO);
projSet.stream().map(String::valueOf).toArray(String[]::new) rec.setWorks(workDays != null ? BigDecimal.valueOf(workDays) : BigDecimal.ZERO);
)
); // 安全处理项目ID集合
rec.setOverNum(BigDecimal.valueOf(overtimeSum)); if (projSet != null && !projSet.isEmpty()) {
rec.setRemark("自动统计生成"); rec.setProjectIds(
recordMapper.insert(rec); 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);
}
} }
/** /**

View File

@@ -470,14 +470,11 @@ public class SysOaProjectServiceImpl implements ISysOaProjectService {
} }
private Date getLastDay(Date time) { private Date getLastDay(Date time) {
String format = "yyyy-MM-";
// 计算某月的天数
Calendar calendar = Calendar.getInstance(); Calendar calendar = Calendar.getInstance();
calendar.setTime(time); calendar.setTime(time);
String dateLength = String.valueOf(calendar.getActualMaximum(Calendar.DAY_OF_MONTH)); calendar.set(Calendar.DAY_OF_MONTH, 1); // 设置为当月第一天
// 将字符串拼接 calendar.add(Calendar.MONTH, 1); // 加一个月
format += dateLength; calendar.add(Calendar.DAY_OF_MONTH, -1); // 减一天,得到当月最后一天
return calendar.getTime();
return DateUtils.parseDate(DateUtils.parseDateToStr(format, time));
} }
} }