Просмотр исходного кода

港大考勤统计
更新考勤状态逻辑(任意用户打卡后触发):
1.跨日配置的打卡记录会更新前两日之前三天的考勤状态
2.非跨日配置的打卡记录会更新前一日之前三天的考勤状态

xiexh 5 дней назад
Родитель
Сommit
578da97ad5

+ 42 - 1
ibps-provider-root/modules/provider-business/src/main/java/com/lc/ibps/components/employee/domain/AttendanceDetail.java

@@ -15,6 +15,7 @@ import oracle.sql.DATE;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.context.annotation.Scope;
+import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.stereotype.Service;
 
@@ -61,6 +62,8 @@ public class AttendanceDetail extends AbstractDomain<String, AttendanceDetailPo>
 	private AttendanceDetailRepository attendanceDetailRepository;
 	@Resource
 	private UpdateDataTableDao updateDataTableDao;
+	@Resource
+	private JdbcTemplate jdbcTemplate;
 
 	private static final DateTimeFormatter DATETIME_FORMATTER = DateTimeFormatter.ofPattern(StringPool.DATE_FORMAT_DATETIME);
 	private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern(StringPool.DATE_FORMAT_DATE);
@@ -599,5 +602,43 @@ public class AttendanceDetail extends AbstractDomain<String, AttendanceDetailPo>
 		}
 		return records;
 	}
-	
+	/**
+	 * 修正所有满足条件的考勤记录(基于每条记录的 shi_fou_kua_ri_ 和 ri_qi_)
+	 * 非跨日记录:修正 ri_qi_ = 昨天
+	 * 跨日记录:修正 ri_qi_ = 前天
+	 * 利用 huan_cun_biao_zhi 防重,仅处理未标记的记录
+	 */
+	public void correctRecentAttendanceOnClock() {
+		// 修正非跨日:ri_qi_ 在 [CURDATE()-3, CURDATE()-1]
+		String sqlNonCross = "UPDATE t_attendance_detail " +
+				"SET kao_qin_zhuang_ta = CASE " +
+				"    WHEN zhuang_tai_1_ = '正常' AND zhuang_tai_2_ = '正常' THEN '正常' " +
+				"    ELSE '异常' END, " +
+				"    huan_cun_biao_zhi = 'Y', " +
+				"    update_time_ = NOW() " +
+				"WHERE shi_fou_kua_ri_ = 'N' " +
+				"  AND ri_qi_ BETWEEN DATE_SUB(CURDATE(), INTERVAL 3 DAY) AND DATE_SUB(CURDATE(), INTERVAL 1 DAY) " +
+				"  AND (huan_cun_biao_zhi IS NULL OR huan_cun_biao_zhi != 'Y')";
+
+		// 修正跨日:ri_qi_ 在 [CURDATE()-4, CURDATE()-2]
+		String sqlCross = "UPDATE t_attendance_detail " +
+				"SET kao_qin_zhuang_ta = CASE " +
+				"    WHEN zhuang_tai_1_ = '正常' AND zhuang_tai_2_ = '正常' THEN '正常' " +
+				"    ELSE '异常' END, " +
+				"    huan_cun_biao_zhi = 'Y', " +
+				"    update_time_ = NOW() " +
+				"WHERE shi_fou_kua_ri_ = 'Y' " +
+				"  AND ri_qi_ BETWEEN DATE_SUB(CURDATE(), INTERVAL 4 DAY) AND DATE_SUB(CURDATE(), INTERVAL 2 DAY) " +
+				"  AND (huan_cun_biao_zhi IS NULL OR huan_cun_biao_zhi != 'Y')";
+
+		try {
+			int updated1 = jdbcTemplate.update(sqlNonCross);
+			int updated2 = jdbcTemplate.update(sqlCross);
+			if (updated1 + updated2 > 0) {
+				LOGGER.info("打卡触发修正最近3天考勤状态,非跨日更新={}, 跨日更新={}", updated1, updated2);
+			}
+		} catch (Exception e) {
+			LOGGER.error("打卡触发修正考勤状态失败", e);
+		}
+	}
 }

+ 1 - 0
ibps-provider-root/modules/provider-business/src/main/java/com/lc/ibps/components/employee/provider/AttendanceDetailProvider.java

@@ -148,6 +148,7 @@ public class AttendanceDetailProvider extends GenericProvider implements IAttend
 			//调用保存接口
 			AttendanceDetail domain = attendanceDetailRepository.newInstance(data);
 			domain.save();
+			attendanceDetail.correctRecentAttendanceOnClock();
 			result.setMessage("打卡成功");
 		} catch (Exception e) {
 			result.setMessage("打卡失败");

+ 1 - 1
ibps-provider-root/modules/provider-business/src/main/java/com/lc/ibps/components/sqlzdy/Service/SwdlServiceImpl.java

@@ -1008,7 +1008,7 @@ public class SwdlServiceImpl extends GenericProvider implements SwdlService {
             if (statusBuilder.length() > 0) {
                 statusBuilder.append(",");
             }
-            statusBuilder.append("缺勤").append(queQinCount).append("次");
+            statusBuilder.append("未打卡").append(queQinCount).append("次");
         }
         if (statusBuilder.length() == 0) {
             statusBuilder.append("正常");