解决在处理7月份数据时出现的空指针异常问题
This commit is contained in:
@@ -208,99 +208,207 @@ public class SysOaAttendanceServiceImpl implements ISysOaAttendanceService {
|
||||
*/
|
||||
@Override
|
||||
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);
|
||||
// 查询所有的工人
|
||||
List<Long> userIds = sysUserRoleMapper.selectUserIdsByRoleId(1852970465740505090L);
|
||||
List<Long> workerIds = baseMapper.selectNowMonthUserId(firstDay);
|
||||
// 合并并去重
|
||||
workerIds = Stream
|
||||
.concat(userIds.stream(), workerIds.stream())
|
||||
.distinct()
|
||||
.collect(Collectors.toList());
|
||||
List<LaborCostData> costDataList = new ArrayList<>();
|
||||
|
||||
|
||||
// 检测当天是否生成了完全一样的数据
|
||||
List<Long> recordIds = recordMapper.listCommonDateRecord(DateUtils.getDate(), firstDay);
|
||||
if (!recordIds.isEmpty()) {
|
||||
// 如果有重复的就删掉
|
||||
recordMapper.deleteBatchIds(recordIds);
|
||||
}
|
||||
// 检测当天是否生成了完全一样的数据
|
||||
try {
|
||||
String currentDate = DateUtils.getDate();
|
||||
|
||||
if (currentDate != null && firstDay != null) {
|
||||
List<Long> 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<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());
|
||||
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<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;
|
||||
} 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) {
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user