Quellcode durchsuchen

手动计算考勤时长

seyason vor 1 Woche
Ursprung
Commit
6d32dd778b

+ 1 - 0
fhKeeper/formulahousekeeper/collectdata/build.bat

@@ -0,0 +1 @@
+mvn package

+ 39 - 7
fhKeeper/formulahousekeeper/collectdata/src/main/java/com/management/collectdata/controller/DataCollectController.java

@@ -17,8 +17,10 @@ import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.text.SimpleDateFormat;
+import java.time.Duration;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.List;
@@ -324,7 +326,7 @@ public class DataCollectController {
 
     @RequestMapping("/getWorkDayDataSum")
     public String getWorkDayDataSum() {
-        String sqlCount = "select count(*) from att_work_hour_day where create_date >= DATE_SUB(CURDATE(), INTERVAL 7 DAY) ";
+        String sqlCount = "select count(*) from att_work_hour_day where create_date >= DATE_SUB(CURDATE(), INTERVAL 7 DAY) and come1 is not null and go1 is not null";
         int totalCount = 0;
         try (Connection connection = mysqlDataSource.getConnection()) {
             PreparedStatement countStmt = connection.prepareStatement(sqlCount);
@@ -341,11 +343,11 @@ public class DataCollectController {
 
     @RequestMapping("/getWorkDayDataList")
     public List<UserFvTime> getWorkDayDataList(@RequestBody PageBO pageBO) {
-        String sqlQuery = " select id,emp_no,emp_name,attendance_date,earliest_clock_date,last_clock_date,if(worktime_total_hour=0,off_hour,worktime_total_hour) as worktime_total_hour,overtime_total_hour " +
-                " from att_work_hour_day  where create_date >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)  order by id limit ?,? ";
+        String sqlQuery = " select id,emp_no,emp_name,attendance_date,come1,go1,if(worktime_total_hour=0,off_hour,worktime_total_hour) as worktime_total_hour,overtime_total_hour " +
+                " from att_work_hour_day  where create_date >= DATE_SUB(CURDATE(), INTERVAL 7 DAY) and come1 is not null and go1 is not null order by id limit ?,? ";
         List<UserFvTime> resList = new ArrayList<>();
-        SimpleDateFormat sdfAll = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         SimpleDateFormat sdfYmd = new SimpleDateFormat("yyyy-MM-dd");
+
         try (Connection connection = mysqlDataSource.getConnection()) {
             PreparedStatement queryStmt = connection.prepareStatement(sqlQuery);
             int pageSize = pageBO.getPageSize();
@@ -360,9 +362,9 @@ public class DataCollectController {
                     userFvTime.setProcinstId(resultSet.getString("id"));
                     userFvTime.setUserId(resultSet.getString("emp_no"));
                     userFvTime.setWorkDate(null==resultSet.getDate("attendance_date")?null:LocalDate.parse(sdfYmd.format(resultSet.getDate("attendance_date")), DateTimeFormatter.ofPattern("yyyy-MM-dd")));
-                    userFvTime.setStartTime(null==resultSet.getDate("earliest_clock_date")?null:sdfAll.format(resultSet.getDate("earliest_clock_date")));
-                    userFvTime.setEndTime(null==resultSet.getDate("last_clock_date")?null:sdfAll.format(resultSet.getDate("last_clock_date")));
-                    userFvTime.setWorkHours(null==resultSet.getBigDecimal("worktime_total_hour")?null:resultSet.getBigDecimal("worktime_total_hour").setScale(2, RoundingMode.HALF_UP).floatValue());
+                    userFvTime.setStartTime(resultSet.getString("come1"));
+                    userFvTime.setEndTime(resultSet.getString("go1"));
+                    userFvTime.setWorkHours(calculateWorkHoursFromTime(userFvTime));
                     userFvTime.setOverTimeSeconds(null==resultSet.getBigDecimal("worktime_total_hour")?null:resultSet.getBigDecimal("worktime_total_hour").setScale(1,RoundingMode.HALF_UP)
                             .multiply(new BigDecimal("3600")).longValue());
 
@@ -376,6 +378,36 @@ public class DataCollectController {
         return resList;
     }
 
+    private float calculateWorkHoursFromTime(UserFvTime userFvTime) {
+        String baseMorningEnd = "12:00";
+        String baseAfternoonStart = "13:00";
+        double restTime = 1.0;
+        //12:00-13:00为休息时间,根据StartTime和endTime计算工作时长
+        DateTimeFormatter df = DateTimeFormatter.ofPattern("HH:mm");
+        LocalTime startCardTime = LocalTime.parse(userFvTime.getStartTime(),df);
+        LocalTime endCardTime = LocalTime.parse(userFvTime.getEndTime(),df);
+//        System.out.println(", startTime="+startCardTime.format(df)
+//                +"endTime="+endCardTime.format(df));
+        BigDecimal bigDecimal = new BigDecimal(Duration.between(startCardTime,endCardTime).toMinutes());
+//        System.out.println("打卡时长(分钟):" + bigDecimal);
+        //开始时间在上午,结束时间在下午,要减去午休时长
+        if (startCardTime.compareTo(LocalTime.parse(baseMorningEnd,df)) <= 0 && endCardTime.compareTo(LocalTime.parse(baseAfternoonStart,df)) >= 0) {
+            //重新计算打卡工时时,需要减去中间午休时间
+            bigDecimal = bigDecimal.divide(BigDecimal.valueOf(60),1,BigDecimal.ROUND_HALF_UP).subtract(new BigDecimal(restTime));
+//            System.out.println("午休时间:"+restTime+", 减去后,工作时长="+bigDecimal);
+        } else {
+            bigDecimal = bigDecimal.divide(BigDecimal.valueOf(60),1,BigDecimal.ROUND_HALF_UP);
+        }
+        double time = bigDecimal.doubleValue();
+        if (time < 0) {
+            time = 0;
+        } else {
+            BigDecimal decimal = new BigDecimal(time);
+            time = decimal.setScale(0, BigDecimal.ROUND_HALF_UP).doubleValue();
+        }
+        return (float)time;
+    }
+