|
@@ -10,6 +10,7 @@ import com.google.gson.JsonArray;
|
|
|
import com.google.gson.JsonElement;
|
|
|
import com.google.gson.JsonObject;
|
|
|
import com.google.gson.JsonParser;
|
|
|
+import com.xjrsoft.common.enums.DeleteMark;
|
|
|
import com.xjrsoft.common.exception.MyException;
|
|
|
import com.xjrsoft.common.utils.VoToColumnUtil;
|
|
|
import com.xjrsoft.module.attendance.dto.AddAttendanceStatisticsDto;
|
|
@@ -30,6 +31,7 @@ import com.xjrsoft.module.attendance.vo.AttendanceStatisticsRecordVo;
|
|
|
import com.xjrsoft.module.organization.entity.User;
|
|
|
import com.xjrsoft.module.organization.service.IUserService;
|
|
|
import com.xjrsoft.module.organization.vo.UserIdDeptNameVo;
|
|
|
+import com.xjrsoft.module.teacher.entity.BaseTeacher;
|
|
|
import lombok.AllArgsConstructor;
|
|
|
import me.zhyd.oauth.log.Log;
|
|
|
import org.apache.poi.ss.usermodel.Cell;
|
|
@@ -159,126 +161,7 @@ public class AttendanceStatisticsServiceImpl extends MPJBaseServiceImpl<Attendan
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public Boolean refreshRecord(Long id) {
|
|
|
try {
|
|
|
- //1、修改状态为统计中
|
|
|
- AttendanceStatistics statistics = this.getById(id);
|
|
|
- statistics.setStatus(0);
|
|
|
- statistics.setModifyDate(new Date());
|
|
|
- this.updateById(statistics);
|
|
|
-
|
|
|
- //2、删除以前的数据
|
|
|
- statisticsRecordService.remove(
|
|
|
- new QueryWrapper<AttendanceStatisticsRecord>().lambda()
|
|
|
- .eq(AttendanceStatisticsRecord::getAttendanceStatisticsId, id)
|
|
|
- );
|
|
|
-
|
|
|
- /**
|
|
|
- * 3、重新计算数据并入库
|
|
|
- */
|
|
|
- //3.1、根据考勤规则和统计的时间段查询这个规则下面所涉及到的老师
|
|
|
- List<User> userList = userService.list(
|
|
|
- new MPJLambdaWrapper<User>()
|
|
|
- .select(User::getId)
|
|
|
- .select(User.class, x -> VoToColumnUtil.fieldsToColumns(User.class).contains(x.getProperty()))
|
|
|
- .innerJoin(AttendanceUserRelation.class, AttendanceUserRelation::getUserId, User::getId)
|
|
|
- .eq(AttendanceUserRelation::getAttendanceRuleCategoryId, statistics.getAttendanceRuleCategoryId())
|
|
|
- );
|
|
|
- if(userList.isEmpty()){
|
|
|
- throw new MyException("该规则下无考勤人员");
|
|
|
- }
|
|
|
- List<Long> userIds = userList.stream().map(User::getId).collect(Collectors.toList());
|
|
|
-
|
|
|
- //查询固化的考勤数据
|
|
|
- List<TeacherAttendanceRecord> attendanceRecords = recordService.list(
|
|
|
- new QueryWrapper<TeacherAttendanceRecord>().lambda()
|
|
|
- .eq(TeacherAttendanceRecord::getTimeInterval, statistics.getTimePeriod())
|
|
|
- .in(TeacherAttendanceRecord::getUserId, userIds)
|
|
|
- .between(TeacherAttendanceRecord::getCreateDate, statistics.getStartDate(), statistics.getEndDate())
|
|
|
- );
|
|
|
-
|
|
|
- //3.2、准备相关需要的数据
|
|
|
- DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
|
|
|
- DateTimeFormatter timeDtf = DateTimeFormatter.ofPattern("HH:mm");
|
|
|
- Map<String, String> weekCnMap = initWeekCn();
|
|
|
- Map<String, String> weekEnMap = initWeekEn();
|
|
|
- List<UserIdDeptNameVo> teacherDeptName = userService.getTeacherDeptName();
|
|
|
- Map<Long, UserIdDeptNameVo> userDeptMap = teacherDeptName.stream().collect(Collectors.toMap(UserIdDeptNameVo::getId, x -> x));
|
|
|
-
|
|
|
- //3.3、查询这个考勤规则下面的所有细则并转换成map
|
|
|
- List<AttendanceRuleDetails> ruleList = ruleCategoryService.getRules(statistics.getAttendanceRuleCategoryId());
|
|
|
- Map<String, AttendanceRuleDetails> ruleMap = ruleList.stream().collect(Collectors.toMap(AttendanceRuleDetails::getDateType, x -> x));
|
|
|
-
|
|
|
- //3.4、计算出所有的天数
|
|
|
- List<LocalDate> dateList = getDatesBetween(statistics.getStartDate(), statistics.getEndDate(), ruleMap, weekEnMap);
|
|
|
-
|
|
|
- //3.5、循环计算,并存入insertList,方便后续批量入库
|
|
|
- List<AttendanceStatisticsRecord> insertList = new ArrayList<>();
|
|
|
- for (User user : userList) {
|
|
|
- AttendanceStatisticsRecord record = new AttendanceStatisticsRecord();
|
|
|
- record.setUserId(user.getId());
|
|
|
- Long normalCount = 0L;
|
|
|
- Long leaveCount = 0L;
|
|
|
- Long absenteeCount = 0L;
|
|
|
- JsonArray daysData = new JsonArray();
|
|
|
- int sortCode = 1;
|
|
|
- for (LocalDate localDate : dateList) {
|
|
|
- String dayOfWeekName = localDate.getDayOfWeek().name();
|
|
|
- AttendanceRuleDetails ruleDetails = ruleMap.get(weekEnMap.get(dayOfWeekName));
|
|
|
- if(ruleDetails != null && (ruleDetails.getIsAttendance() == null || ruleDetails.getIsAttendance() == 0)){
|
|
|
- continue;
|
|
|
- }
|
|
|
- JsonObject daysJson = new JsonObject();
|
|
|
- daysJson.addProperty("date", localDate.format(dtf));
|
|
|
- daysJson.addProperty("week", weekCnMap.get(dayOfWeekName));
|
|
|
- String content = "";
|
|
|
- if(statistics.getTimePeriod() == 1){
|
|
|
- content += "(" + ruleDetails.getAmStartTime().toLocalTime().format(timeDtf) + ")上班 ";
|
|
|
- }else if(statistics.getTimePeriod() == 2){
|
|
|
- content += "(" + ruleDetails.getPmStartTime().toLocalTime().format(timeDtf) + ")上班 ";
|
|
|
- }
|
|
|
- List<TeacherAttendanceRecord> collect = attendanceRecords.stream().filter(el -> el.getRecordTime().toLocalDate().equals(localDate)).collect(Collectors.toList());
|
|
|
- for (TeacherAttendanceRecord attendanceRecord : collect) {
|
|
|
- if("到校".equals(attendanceRecord.getAttendanceStatus())){
|
|
|
- normalCount ++;
|
|
|
- content += "正常(" + attendanceRecord.getRecordTime().toLocalTime().format(timeDtf) + ")";
|
|
|
- }else if("请假".equals(attendanceRecord.getAttendanceStatus())){
|
|
|
- leaveCount ++;
|
|
|
- content += "请假";
|
|
|
- }else if("不考勤".equals(attendanceRecord.getAttendanceStatus())){
|
|
|
-
|
|
|
- }else{
|
|
|
- absenteeCount ++;
|
|
|
- content += "缺勤";
|
|
|
- }
|
|
|
- }
|
|
|
- daysJson.addProperty("content", content);
|
|
|
- daysJson.addProperty("sortCode", sortCode);
|
|
|
- daysData.add(daysJson);
|
|
|
- sortCode ++;
|
|
|
- }
|
|
|
- record.setNormalCount(normalCount);
|
|
|
- record.setLeaveCount(leaveCount);
|
|
|
- record.setAbsenteeCount(absenteeCount);
|
|
|
- record.setDaysData(daysData.toString());
|
|
|
- UserIdDeptNameVo deptNameVo = userDeptMap.get(record.getUserId());
|
|
|
- if(deptNameVo != null){
|
|
|
- record.setDeptIds(deptNameVo.getDeptIds());
|
|
|
- record.setDeptName(deptNameVo.getDeptName());
|
|
|
- }
|
|
|
|
|
|
- insertList.add(record);
|
|
|
- }
|
|
|
-
|
|
|
- //3.6、插入数据
|
|
|
- if(!insertList.isEmpty()){
|
|
|
- statisticsRecordService.saveBatch(insertList);
|
|
|
- }
|
|
|
-
|
|
|
- //4、将状态改为统计完成
|
|
|
- statistics = this.getById(id);
|
|
|
- statistics.setStatus(1);
|
|
|
- statistics.setModifyDate(new Date());
|
|
|
- statistics.setAttendanceDays(dateList.size());
|
|
|
- this.updateById(statistics);
|
|
|
}catch (Exception e){
|
|
|
Log.error(e.getMessage(), e);
|
|
|
if(e.getClass().equals(MyException.class)){
|
|
@@ -288,6 +171,133 @@ public class AttendanceStatisticsServiceImpl extends MPJBaseServiceImpl<Attendan
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ //1、修改状态为统计中
|
|
|
+ AttendanceStatistics statistics = this.getById(id);
|
|
|
+ statistics.setStatus(0);
|
|
|
+ statistics.setModifyDate(new Date());
|
|
|
+ this.updateById(statistics);
|
|
|
+
|
|
|
+ //2、删除以前的数据
|
|
|
+ statisticsRecordService.remove(
|
|
|
+ new QueryWrapper<AttendanceStatisticsRecord>().lambda()
|
|
|
+ .eq(AttendanceStatisticsRecord::getAttendanceStatisticsId, id)
|
|
|
+ );
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 3、重新计算数据并入库
|
|
|
+ */
|
|
|
+ //3.1、根据考勤规则和统计的时间段查询这个规则下面所涉及到的老师
|
|
|
+ List<User> userList = userService.list(
|
|
|
+ new MPJLambdaWrapper<User>()
|
|
|
+ .select(User::getId)
|
|
|
+ .select(User.class, x -> VoToColumnUtil.fieldsToColumns(User.class).contains(x.getProperty()))
|
|
|
+ .innerJoin(AttendanceUserRelation.class, AttendanceUserRelation::getUserId, User::getId)
|
|
|
+ .innerJoin(BaseTeacher.class, BaseTeacher::getUserId, User::getId)
|
|
|
+ .eq(AttendanceUserRelation::getAttendanceRuleCategoryId, statistics.getAttendanceRuleCategoryId())
|
|
|
+ .eq(AttendanceUserRelation::getDeleteMark, DeleteMark.NODELETE.getCode())
|
|
|
+ );
|
|
|
+ if(userList.isEmpty()){
|
|
|
+ throw new MyException("该规则下无考勤人员");
|
|
|
+ }
|
|
|
+ List<Long> userIds = userList.stream().map(User::getId).collect(Collectors.toList());
|
|
|
+
|
|
|
+ //查询固化的考勤数据
|
|
|
+ List<TeacherAttendanceRecord> attendanceRecords = recordService.list(
|
|
|
+ new QueryWrapper<TeacherAttendanceRecord>().lambda()
|
|
|
+ .eq(TeacherAttendanceRecord::getTimeInterval, statistics.getTimePeriod())
|
|
|
+ .in(TeacherAttendanceRecord::getUserId, userIds)
|
|
|
+ .between(TeacherAttendanceRecord::getAttendanceDate, statistics.getStartDate(), statistics.getEndDate())
|
|
|
+ .eq(TeacherAttendanceRecord::getDeleteMark, DeleteMark.NODELETE.getCode())
|
|
|
+ );
|
|
|
+
|
|
|
+ //3.2、准备相关需要的数据
|
|
|
+ DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
|
|
|
+ DateTimeFormatter timeDtf = DateTimeFormatter.ofPattern("HH:mm");
|
|
|
+ Map<String, String> weekCnMap = initWeekCn();
|
|
|
+ Map<String, String> weekEnMap = initWeekEn();
|
|
|
+ List<UserIdDeptNameVo> teacherDeptName = userService.getTeacherDeptName();
|
|
|
+ Map<Long, UserIdDeptNameVo> userDeptMap = teacherDeptName.stream().collect(Collectors.toMap(UserIdDeptNameVo::getId, x -> x));
|
|
|
+
|
|
|
+ //3.3、查询这个考勤规则下面的所有细则并转换成map
|
|
|
+ List<AttendanceRuleDetails> ruleList = ruleCategoryService.getRules(statistics.getAttendanceRuleCategoryId());
|
|
|
+ Map<String, AttendanceRuleDetails> ruleMap = ruleList.stream().collect(Collectors.toMap(AttendanceRuleDetails::getDateType, x -> x));
|
|
|
+
|
|
|
+ //3.4、计算出所有的天数
|
|
|
+ List<LocalDate> dateList = getDatesBetween(statistics.getStartDate(), statistics.getEndDate(), ruleMap, weekEnMap);
|
|
|
+
|
|
|
+ //3.5、循环计算,并存入insertList,方便后续批量入库
|
|
|
+ List<AttendanceStatisticsRecord> insertList = new ArrayList<>();
|
|
|
+ for (User user : userList) {
|
|
|
+ AttendanceStatisticsRecord record = new AttendanceStatisticsRecord();
|
|
|
+ record.setUserId(user.getId());
|
|
|
+ record.setAttendanceStatisticsId(statistics.getId());
|
|
|
+ Long normalCount = 0L;
|
|
|
+ Long leaveCount = 0L;
|
|
|
+ Long absenteeCount = 0L;
|
|
|
+ JsonArray daysData = new JsonArray();
|
|
|
+ int sortCode = 1;
|
|
|
+ for (LocalDate localDate : dateList) {
|
|
|
+ String dayOfWeekName = localDate.getDayOfWeek().name();
|
|
|
+ AttendanceRuleDetails ruleDetails = ruleMap.get(weekEnMap.get(dayOfWeekName));
|
|
|
+ if(ruleDetails != null && (ruleDetails.getIsAttendance() == null || ruleDetails.getIsAttendance() == 0)){
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ JsonObject daysJson = new JsonObject();
|
|
|
+ daysJson.addProperty("date", localDate.format(dtf));
|
|
|
+ daysJson.addProperty("week", weekCnMap.get(dayOfWeekName));
|
|
|
+ String content = "";
|
|
|
+ if(statistics.getTimePeriod() == 1){
|
|
|
+ content += "(" + ruleDetails.getAmStartTime().toLocalTime().format(timeDtf) + ")上班 ";
|
|
|
+ }else if(statistics.getTimePeriod() == 2){
|
|
|
+ content += "(" + ruleDetails.getPmStartTime().toLocalTime().format(timeDtf) + ")上班 ";
|
|
|
+ }
|
|
|
+ List<TeacherAttendanceRecord> collect = attendanceRecords.stream()
|
|
|
+ .filter(el -> el.getAttendanceDate().equals(localDate) && el.getUserId().equals(user.getId())
|
|
|
+ && !"不考勤".equals(el.getAttendanceStatus())
|
|
|
+ )
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ for (TeacherAttendanceRecord attendanceRecord : collect) {
|
|
|
+ if("到校".equals(attendanceRecord.getAttendanceStatus())){
|
|
|
+ normalCount ++;
|
|
|
+ content += "正常(" + attendanceRecord.getRecordTime().toLocalTime().format(timeDtf) + ")";
|
|
|
+ }else if("请假".equals(attendanceRecord.getAttendanceStatus())){
|
|
|
+ leaveCount ++;
|
|
|
+ content += "请假";
|
|
|
+ }else{
|
|
|
+ absenteeCount ++;
|
|
|
+ content += "缺勤";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ daysJson.addProperty("content", content);
|
|
|
+ daysJson.addProperty("sortCode", sortCode);
|
|
|
+ daysData.add(daysJson);
|
|
|
+ sortCode ++;
|
|
|
+ }
|
|
|
+ record.setNormalCount(normalCount);
|
|
|
+ record.setLeaveCount(leaveCount);
|
|
|
+ record.setAbsenteeCount(absenteeCount);
|
|
|
+ record.setDaysData(daysData.toString());
|
|
|
+ UserIdDeptNameVo deptNameVo = userDeptMap.get(record.getUserId());
|
|
|
+ if(deptNameVo != null){
|
|
|
+ record.setDeptIds(deptNameVo.getDeptIds());
|
|
|
+ record.setDeptName(deptNameVo.getDeptName());
|
|
|
+ }
|
|
|
+
|
|
|
+ insertList.add(record);
|
|
|
+ }
|
|
|
+
|
|
|
+ //3.6、插入数据
|
|
|
+ if(!insertList.isEmpty()){
|
|
|
+ statisticsRecordService.saveBatch(insertList);
|
|
|
+ }
|
|
|
+
|
|
|
+ //4、将状态改为统计完成
|
|
|
+ statistics = this.getById(id);
|
|
|
+ statistics.setStatus(1);
|
|
|
+ statistics.setModifyDate(new Date());
|
|
|
+ statistics.setAttendanceDays(dateList.size());
|
|
|
+ this.updateById(statistics);
|
|
|
+
|
|
|
return true;
|
|
|
}
|
|
|
|
|
@@ -396,11 +406,11 @@ public class AttendanceStatisticsServiceImpl extends MPJBaseServiceImpl<Attendan
|
|
|
Font font = workbook.createFont();
|
|
|
font.setBold(false);// 设置为粗体
|
|
|
font.setFontName("宋体");
|
|
|
- if(content.contains("缺勤")){
|
|
|
+ if(content != null && content.contains("缺勤")){
|
|
|
font.setColor(IndexedColors.RED.getIndex()); // 设置字体颜色为红色
|
|
|
- }else if(content.contains("正常")){
|
|
|
+ }else if(content != null && content.contains("正常")){
|
|
|
font.setColor(IndexedColors.BLUE.getIndex()); // 设置字体颜色为蓝色
|
|
|
- }else if(content.contains("请假")){
|
|
|
+ }else if(content != null && content.contains("请假")){
|
|
|
font.setColor(IndexedColors.YELLOW.getIndex()); // 设置字体颜色为黄色
|
|
|
}
|
|
|
font.setFontHeightInPoints((short)12);
|