解决在处理7月份数据时出现的空指针异常问题
This commit is contained in:
@@ -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);
|
Date firstDay = getFirstDay(time);
|
||||||
Date lastDay = getLastDay(time);
|
if (firstDay == null) {
|
||||||
// 查询所有的工人
|
log.error("获取月初日期失败,原始时间: {}", time);
|
||||||
List<Long> userIds = sysUserRoleMapper.selectUserIdsByRoleId(1852970465740505090L);
|
return new ArrayList<>();
|
||||||
List<Long> workerIds = baseMapper.selectNowMonthUserId(firstDay);
|
}
|
||||||
// 合并并去重
|
|
||||||
workerIds = Stream
|
|
||||||
.concat(userIds.stream(), workerIds.stream())
|
|
||||||
.distinct()
|
|
||||||
.collect(Collectors.toList());
|
|
||||||
List<LaborCostData> costDataList = new ArrayList<>();
|
|
||||||
|
|
||||||
|
Date lastDay = getLastDay(time);
|
||||||
|
if (lastDay == null) {
|
||||||
|
log.error("获取月末日期失败,原始时间: {}", time);
|
||||||
|
return new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
// 检测当天是否生成了完全一样的数据
|
// 查询所有的工人
|
||||||
List<Long> recordIds = recordMapper.listCommonDateRecord(DateUtils.getDate(), firstDay);
|
List<Long> userIds = sysUserRoleMapper.selectUserIdsByRoleId(1852970465740505090L);
|
||||||
if (!recordIds.isEmpty()) {
|
if (userIds == null) {
|
||||||
// 如果有重复的就删掉
|
userIds = new ArrayList<>();
|
||||||
recordMapper.deleteBatchIds(recordIds);
|
}
|
||||||
}
|
|
||||||
|
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<>();
|
||||||
|
|
||||||
|
// 检测当天是否生成了完全一样的数据
|
||||||
|
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) {
|
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(
|
|
||||||
String.join(",",
|
|
||||||
projSet.stream().map(String::valueOf).toArray(String[]::new)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
rec.setOverNum(BigDecimal.valueOf(overtimeSum));
|
|
||||||
rec.setRemark("自动统计生成");
|
|
||||||
recordMapper.insert(rec);
|
|
||||||
|
|
||||||
|
// 安全处理数值转换
|
||||||
|
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) {
|
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));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user