Browse Source

封装泓浒计算时长

QuYueTing 11 hours ago
parent
commit
e46fc72a53

+ 6 - 52
fhKeeper/formulahousekeeper/collectdata/src/main/java/com/management/collectdata/controller/DataCollectController.java

@@ -12,9 +12,11 @@ import org.springframework.web.bind.annotation.RestController;
 
 
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.math.RoundingMode;
-import java.sql.*;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
 import java.text.SimpleDateFormat;
 import java.text.SimpleDateFormat;
-import java.time.Duration;
 import java.time.LocalDate;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.time.LocalTime;
@@ -23,6 +25,8 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.List;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
+import static com.management.collectdata.util.DateTimeUtil.calculateWorkHoursFromTime;
+
 @RequestMapping("/dataCollect")
 @RequestMapping("/dataCollect")
 @RestController
 @RestController
 public class DataCollectController {
 public class DataCollectController {
@@ -429,56 +433,6 @@ public class DataCollectController {
     }
     }
 
 
 
 
-    public static float calculateWorkHoursFromTime(UserFvTime userFvTime) {
-        String baseMorningStart = "06:00";
-        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);
-        if (userFvTime.getEndTime().compareTo(baseMorningStart) < 0) {
-            //算夜班加班
-            endCardTime.plusHours(24);
-        }
-
-//        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 (endCardTime.compareTo(LocalTime.parse(baseMorningStart,df)) < 0) {
-            bigDecimal = bigDecimal.add(BigDecimal.valueOf(24*60));
-//            System.out.println("矫正后打卡时长(分钟):" + bigDecimal);
-            bigDecimal = bigDecimal.divide(BigDecimal.valueOf(60),1,BigDecimal.ROUND_HALF_UP);
-            if (startCardTime.compareTo(LocalTime.parse(baseMorningEnd,df)) <= 0) {
-                //重新计算打卡工时时,需要减去中间午休时间
-                bigDecimal = bigDecimal.subtract(new BigDecimal(restTime));
-            }
-            System.out.println("矫正后打卡时长(小时):" + bigDecimal);
-        }
-        //开始时间在上午,结束时间在下午,要减去午休时长
-        else if (startCardTime.compareTo(LocalTime.parse(baseMorningEnd,df)) <= 0) {
-            if (endCardTime.compareTo(LocalTime.parse(baseAfternoonStart,df)) >= 0) {
-                //重新计算打卡工时时,需要减去中间午休时间
-                bigDecimal = bigDecimal.divide(BigDecimal.valueOf(60),1,BigDecimal.ROUND_HALF_UP).subtract(new BigDecimal(restTime));
-            } else if (endCardTime.compareTo(LocalTime.parse(baseMorningEnd,df)) > 0) {
-                //以上午下班时间为准,计算时长
-                bigDecimal = new BigDecimal(Duration.between(startCardTime,LocalTime.parse(baseMorningEnd,df)).toMinutes());
-                //转化为小时,四舍五入
-                bigDecimal = bigDecimal.divide(BigDecimal.valueOf(60),1,BigDecimal.ROUND_HALF_UP);
-            }
-        } else {
-            bigDecimal = bigDecimal.divide(BigDecimal.valueOf(60),1,BigDecimal.ROUND_HALF_UP);
-        }
-        double time = bigDecimal.doubleValue();
-        if (time < 0) {
-            time = 0;
-        }
-        return (float)time;
-    }
-
-
 
 
 
 
     @RequestMapping("/getLeaveSheetDataSum")
     @RequestMapping("/getLeaveSheetDataSum")

+ 74 - 0
fhKeeper/formulahousekeeper/collectdata/src/main/java/com/management/collectdata/util/DateTimeUtil.java

@@ -0,0 +1,74 @@
+package com.management.collectdata.util;
+
+import com.management.collectdata.entity.UserFvTime;
+
+import java.math.BigDecimal;
+import java.time.Duration;
+import java.time.LocalTime;
+import java.time.format.DateTimeFormatter;
+
+public class DateTimeUtil {
+
+
+    public static void main(String[] args) {
+        UserFvTime userFvTime = new UserFvTime();
+        userFvTime.setStartTime("09:00");
+        userFvTime.setEndTime("11:30");
+        float workHours = calculateWorkHoursFromTime(userFvTime);
+        System.out.println("workHours=" + workHours);
+    }
+
+
+    public static float calculateWorkHoursFromTime(UserFvTime userFvTime) {
+        String baseMorningStart = "06:00";
+        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);
+        if (userFvTime.getEndTime().compareTo(baseMorningStart) < 0) {
+            //算夜班加班
+            endCardTime.plusHours(24);
+        }
+
+//        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 (endCardTime.compareTo(LocalTime.parse(baseMorningStart,df)) < 0) {
+            bigDecimal = bigDecimal.add(BigDecimal.valueOf(24*60));
+//            System.out.println("矫正后打卡时长(分钟):" + bigDecimal);
+            bigDecimal = bigDecimal.divide(BigDecimal.valueOf(60),1,BigDecimal.ROUND_HALF_UP);
+            if (startCardTime.compareTo(LocalTime.parse(baseMorningEnd,df)) <= 0) {
+                //重新计算打卡工时时,需要减去中间午休时间
+                bigDecimal = bigDecimal.subtract(new BigDecimal(restTime));
+            }
+//            System.out.println("矫正后打卡时长(小时):" + bigDecimal);
+        }
+        //开始时间在上午,结束时间在下午,要减去午休时长
+        else if (startCardTime.compareTo(LocalTime.parse(baseMorningEnd,df)) <= 0) {
+            if (endCardTime.compareTo(LocalTime.parse(baseAfternoonStart,df)) >= 0) {
+                //重新计算打卡工时时,需要减去中间午休时间
+                bigDecimal = bigDecimal.divide(BigDecimal.valueOf(60),1,BigDecimal.ROUND_HALF_UP).subtract(new BigDecimal(restTime));
+            } else if (endCardTime.compareTo(LocalTime.parse(baseMorningEnd,df)) > 0) {
+                //以上午下班时间为准,计算时长
+                bigDecimal = new BigDecimal(Duration.between(startCardTime,LocalTime.parse(baseMorningEnd,df)).toMinutes());
+                //转化为小时,四舍五入
+                bigDecimal = bigDecimal.divide(BigDecimal.valueOf(60),1,BigDecimal.ROUND_HALF_UP);
+            } else {
+                //不需要调整,直接转化为小时
+                bigDecimal = bigDecimal.divide(BigDecimal.valueOf(60),1,BigDecimal.ROUND_HALF_UP);
+            }
+        } else {
+            bigDecimal = bigDecimal.divide(BigDecimal.valueOf(60),1,BigDecimal.ROUND_HALF_UP);
+        }
+        double time = bigDecimal.doubleValue();
+        if (time < 0) {
+            time = 0;
+        }
+        return (float)time;
+    }
+
+}

+ 2 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserController.java

@@ -1085,5 +1085,7 @@ public class UserController {
     public HttpRespMsg getUserIsMachineList(){
     public HttpRespMsg getUserIsMachineList(){
         return userService.getUserIsMachineList(request);
         return userService.getUserIsMachineList(request);
     }
     }
+
+
 }
 }
 
 

+ 1 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/UserService.java

@@ -122,4 +122,5 @@ public interface UserService extends IService<User> {
     HttpRespMsg getUserByProject(Integer projectId, HttpServletRequest request);
     HttpRespMsg getUserByProject(Integer projectId, HttpServletRequest request);
 
 
     HttpRespMsg getChargeUserByProjectId(Integer projectId, HttpServletRequest request);
     HttpRespMsg getChargeUserByProjectId(Integer projectId, HttpServletRequest request);
+
 }
 }

+ 4 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ExceptionInfosServiceImpl.java

@@ -9,6 +9,7 @@ import com.management.platform.service.ExceptionInfosService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.WorkDayCalculateUtils;
 import com.management.platform.util.WorkDayCalculateUtils;
+import com.mysql.cj.protocol.a.NativeConstants;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 import org.springframework.util.StringUtils;
@@ -166,7 +167,7 @@ public class ExceptionInfosServiceImpl extends ServiceImpl<ExceptionInfosMapper,
         // 构建导出数据
         // 构建导出数据
         List<List<String>> exportList = new ArrayList<>();
         List<List<String>> exportList = new ArrayList<>();
         // 表头
         // 表头
-        exportList.add(Arrays.asList("姓名", "部门", "迟到次数", "早退次数", "缺卡次数", "旷工次数", "合计异常次数"));
+        exportList.add(Arrays.asList("姓名", "部门", "迟到次数", "早退次数", "缺卡次数", "旷工次数", "合计异常次数", "月标准工时数", "月填报工时数"));
         // 数据行
         // 数据行
         for (ExceptionInfosSum item : finalList) {
         for (ExceptionInfosSum item : finalList) {
             int total = item.getLateCount() + item.getEarlyLeaveCount()
             int total = item.getLateCount() + item.getEarlyLeaveCount()
@@ -178,7 +179,7 @@ public class ExceptionInfosServiceImpl extends ServiceImpl<ExceptionInfosMapper,
                     String.valueOf(item.getEarlyLeaveCount()),
                     String.valueOf(item.getEarlyLeaveCount()),
                     String.valueOf(item.getMissPunchCount()),
                     String.valueOf(item.getMissPunchCount()),
                     String.valueOf(item.getAbsenteeismCount()),
                     String.valueOf(item.getAbsenteeismCount()),
-                    String.valueOf(total)
+                    String.valueOf(total), item.getActualWorkingHours() == 0?"":String.valueOf(item.getStandardWorkingHours()), item.getActualWorkingHours() == 0?"":String.valueOf(item.getActualWorkingHours())
             ));
             ));
             //childList
             //childList
             List<ExceptionInfosSum> childList = item.getChildList();
             List<ExceptionInfosSum> childList = item.getChildList();
@@ -193,7 +194,7 @@ public class ExceptionInfosServiceImpl extends ServiceImpl<ExceptionInfosMapper,
                             String.valueOf(childItem.getEarlyLeaveCount()),
                             String.valueOf(childItem.getEarlyLeaveCount()),
                             String.valueOf(childItem.getMissPunchCount()),
                             String.valueOf(childItem.getMissPunchCount()),
                             String.valueOf(childItem.getAbsenteeismCount()),
                             String.valueOf(childItem.getAbsenteeismCount()),
-                            String.valueOf(total)
+                            String.valueOf(total), "", ""
                     ));
                     ));
                 }
                 }
             }
             }

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -2845,7 +2845,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                         String multiDegrId = (String)report.get("multiDegrId");
                         String multiDegrId = (String)report.get("multiDegrId");
                         if (multiDegrId != null) {
                         if (multiDegrId != null) {
                             multiDegrId = multiDegrId.replace("@", ",");
                             multiDegrId = multiDegrId.replace("@", ",");
-                            System.out.println("multiDegrId=="+multiDegrId+", date="+map.get("dateStr")+", user="+map.get("userId")+", "+map.get("name"));
+//                            System.out.println("multiDegrId=="+multiDegrId+", date="+map.get("dateStr")+", user="+map.get("userId")+", "+map.get("name"));
                             JSONArray array = JSONArray.parseArray(multiDegrId);
                             JSONArray array = JSONArray.parseArray(multiDegrId);
                             String s = "";
                             String s = "";
                             for (int i=0;i<array.size(); i++) {
                             for (int i=0;i<array.size(); i++) {

+ 2 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java

@@ -2851,6 +2851,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
         }
         }
         return msg;
         return msg;
     }
     }
+
+
     private List<Department> getSubDepts(Department dp, List<Department> list) {
     private List<Department> getSubDepts(Department dp, List<Department> list) {
         List<Department> collect = list.stream().filter(l -> dp.getDepartmentId().equals(l.getSuperiorId())).collect(Collectors.toList());;
         List<Department> collect = list.stream().filter(l -> dp.getDepartmentId().equals(l.getSuperiorId())).collect(Collectors.toList());;
         List<Department> allList = new ArrayList<>();
         List<Department> allList = new ArrayList<>();

+ 74 - 97
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java

@@ -1857,92 +1857,90 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                                         if (showLog) System.out.println("请假时长为:"+ct.getAskLeaveTime()+"小时");
                                         if (showLog) System.out.println("请假时长为:"+ct.getAskLeaveTime()+"小时");
                                     }
                                     }
                                 } else if (leaveText.startsWith("外出") || leaveText.startsWith("出差") || leaveText.startsWith("外勤")) {
                                 } else if (leaveText.startsWith("外出") || leaveText.startsWith("出差") || leaveText.startsWith("外勤")) {
-                                    //格式 "10/17 09:00 / 10/19 18:00", "10/17 上午 / 10/17 下午"
-                                    String string = holiday.getJSONObject("sp_description").getJSONArray("data").getJSONObject(m).getString("text");
-                                    String[] s = string.split(" \\/ | |\\~");
-                                    if (showLog) {
-                                        for (String ss : s) {
-                                            System.out.println(ss);
-                                        }
-                                    }
-                                    //获取到外出的开始时间和结束时间
-                                    boolean isOldFormat = false;
-                                    if (s.length < 5) {
-                                        isOldFormat = true;
-                                    }
-                                    //获取外出的日期; 9/1格式
-                                    String dateStart = localDate.getYear() + "/" + s[0];
-                                    String dateEnd = localDate.getYear() + "/" + (isOldFormat ? s[2] : s[3]);
-                                    LocalDate sDate = LocalDate.parse(dateStart, mdFormat);
-                                    LocalDate eDate = LocalDate.parse(dateEnd, mdFormat);
-                                    //跨年情况的校验
-                                    if (eDate.isBefore(sDate)) {
-                                        eDate = eDate.plusYears(1);
-                                    }
-                                    String outEnd = isOldFormat ? s[3] : s[4];
-                                    String outStart = s[1];
-                                    if (sDate.isEqual(eDate)) {
-                                        //外出在一天内
-                                        if (outStart.equals("上午")) {
-                                            outStart = baseMorningStart;
-                                        } else if (outStart.equals("下午")) {
-                                            outStart = baseAfternoonStart;
-                                        }
-                                        if (outEnd.equals("上午")) {
-                                            outEnd = baseMorningEnd;
-                                        } else if (outEnd.equals("下午")) {
-                                            outEnd = baseAfternoonEnd;
+                                    boolean isXiHe = corpInfo.getCompanyId() == Constant.XI_HE_CHAO_DAO_COMPANY_ID || corpInfo.getCompanyId() == Constant.XI_HE_CHAO_DAO_JIA_XING_COMPANY_ID;
+                                    if (!isXiHe || leaveText.startsWith("出差")) {//非羲合超导或者出差的情况,需要校准上下班时间。 羲合超导的外出和外勤情况也需要打卡,以打卡的为准。
+                                        //格式 "10/17 09:00 / 10/19 18:00", "10/17 上午 / 10/17 下午"
+                                        String string = holiday.getJSONObject("sp_description").getJSONArray("data").getJSONObject(m).getString("text");
+                                        String[] s = string.split(" \\/ | |\\~");
+                                        //获取到外出的开始时间和结束时间
+                                        boolean isOldFormat = false;
+                                        if (s.length < 5) {
+                                            isOldFormat = true;
                                         }
                                         }
-                                    } else {
-                                        if (showLog) System.out.println("跨天外出===");
-                                        if (showLog)
-                                            System.out.println("当天==" + localDate + ", sDate=" + sDate + ", 比较=" + (localDate.isEqual(sDate)));
-                                        //跨天外出,获取期间的非工作日,加进去
-                                        List<LocalDate> localDates = WorkDayCalculateUtils.getNonWorkDaysListInRange(dtf.format(sDate) ,dtf.format(eDate));
-                                        for (LocalDate curLdate : localDates) {
-                                            if (!betweenNonWorkDays.stream().anyMatch(be->be.isEqual(curLdate))) {
-                                                if (showLog) System.out.println("含非工作日请假:"+curLdate);
-                                                betweenNonWorkDays.add(curLdate);
-                                            }
+                                        //获取外出的日期; 9/1格式
+                                        String dateStart = localDate.getYear() + "/" + s[0];
+                                        String dateEnd = localDate.getYear() + "/" + (isOldFormat ? s[2] : s[3]);
+                                        LocalDate sDate = LocalDate.parse(dateStart, mdFormat);
+                                        LocalDate eDate = LocalDate.parse(dateEnd, mdFormat);
+                                        //跨年情况的校验
+                                        if (eDate.isBefore(sDate)) {
+                                            eDate = eDate.plusYears(1);
                                         }
                                         }
-                                        if (betweenNonWorkDays.size() > 0) {
-                                            betweenTotalDays = (int)sDate.until(eDate, ChronoUnit.DAYS) + 1;
-                                            if (showLog) System.out.println("总跨度外出天数为:"+betweenTotalDays);
-                                        }
-                                        if (localDate.isEqual(sDate)) {
-                                            //当前日期第一天,需判断上下午半天请假的情况
-                                            if (showLog) System.out.println("跨天外出第一天outStart为:"+outStart);
+                                        String outEnd = isOldFormat ? s[3] : s[4];
+                                        String outStart = s[1];
+                                        if (sDate.isEqual(eDate)) {
+                                            //外出在一天内
                                             if (outStart.equals("上午")) {
                                             if (outStart.equals("上午")) {
                                                 outStart = baseMorningStart;
                                                 outStart = baseMorningStart;
                                             } else if (outStart.equals("下午")) {
                                             } else if (outStart.equals("下午")) {
                                                 outStart = baseAfternoonStart;
                                                 outStart = baseAfternoonStart;
                                             }
                                             }
-                                            //跨天请假的第一天,结束时间默认为18:00
-                                            outEnd = baseAfternoonEnd;//上午开始请假的算全天
-                                        } else if (localDate.isEqual(eDate)) {
-                                            //当前日期就是最后一天,需判断上下午半天请假的情况
-                                            if (outEnd.equals("下午")) {
-                                                outEnd = baseAfternoonEnd;//请假到最后一天的下午,就算是全天
-                                            } else if (outEnd.equals("上午")) {
-                                                //上午外出
+                                            if (outEnd.equals("上午")) {
                                                 outEnd = baseMorningEnd;
                                                 outEnd = baseMorningEnd;
+                                            } else if (outEnd.equals("下午")) {
+                                                outEnd = baseAfternoonEnd;
                                             }
                                             }
-                                            outStart = baseMorningStart;
                                         } else {
                                         } else {
-                                            //中间日期就是全天
-                                            outStart = baseMorningStart;
-                                            outEnd = baseAfternoonEnd;
-                                            if (showLog) System.out.println("===中间天外出===");
+                                            if (showLog) System.out.println("跨天外出===");
+                                            if (showLog)
+                                                System.out.println("当天==" + localDate + ", sDate=" + sDate + ", 比较=" + (localDate.isEqual(sDate)));
+                                            //跨天外出,获取期间的非工作日,加进去
+                                            List<LocalDate> localDates = WorkDayCalculateUtils.getNonWorkDaysListInRange(dtf.format(sDate) ,dtf.format(eDate));
+                                            for (LocalDate curLdate : localDates) {
+                                                if (!betweenNonWorkDays.stream().anyMatch(be->be.isEqual(curLdate))) {
+                                                    if (showLog) System.out.println("含非工作日请假:"+curLdate);
+                                                    betweenNonWorkDays.add(curLdate);
+                                                }
+                                            }
+                                            if (betweenNonWorkDays.size() > 0) {
+                                                betweenTotalDays = (int)sDate.until(eDate, ChronoUnit.DAYS) + 1;
+                                                if (showLog) System.out.println("总跨度外出天数为:"+betweenTotalDays);
+                                            }
+                                            if (localDate.isEqual(sDate)) {
+                                                //当前日期第一天,需判断上下午半天请假的情况
+                                                if (showLog) System.out.println("跨天外出第一天outStart为:"+outStart);
+                                                if (outStart.equals("上午")) {
+                                                    outStart = baseMorningStart;
+                                                } else if (outStart.equals("下午")) {
+                                                    outStart = baseAfternoonStart;
+                                                }
+                                                //跨天请假的第一天,结束时间默认为18:00
+                                                outEnd = baseAfternoonEnd;//上午开始请假的算全天
+                                            } else if (localDate.isEqual(eDate)) {
+                                                //当前日期就是最后一天,需判断上下午半天请假的情况
+                                                if (outEnd.equals("下午")) {
+                                                    outEnd = baseAfternoonEnd;//请假到最后一天的下午,就算是全天
+                                                } else if (outEnd.equals("上午")) {
+                                                    //上午外出
+                                                    outEnd = baseMorningEnd;
+                                                }
+                                                outStart = baseMorningStart;
+                                            } else {
+                                                //中间日期就是全天
+                                                outStart = baseMorningStart;
+                                                outEnd = baseAfternoonEnd;
+                                                if (showLog) System.out.println("===中间天外出===");
+                                            }
+                                        }
+                                        //获取外出的最早的开始时间和最晚的结束时间最为当天考勤的最早和最晚时间
+                                        if (ct.getStartTime().equals("00:00") || ct.getStartTime().compareTo(outStart) > 0) {
+                                            ct.setStartTime(outStart);
+                                            needRecaculate = true;
+                                        }
+                                        if (ct.getEndTime().compareTo(outEnd) < 0) {
+                                            ct.setEndTime(outEnd);
+                                            needRecaculate = true;
                                         }
                                         }
-                                    }
-                                    //获取外出的最早的开始时间和最晚的结束时间最为当天考勤的最早和最晚时间
-                                    if (ct.getStartTime().equals("00:00") || ct.getStartTime().compareTo(outStart) > 0) {
-                                        ct.setStartTime(outStart);
-                                        needRecaculate = true;
-                                    }
-                                    if (ct.getEndTime().compareTo(outEnd) < 0) {
-                                        ct.setEndTime(outEnd);
-                                        needRecaculate = true;
                                     }
                                     }
                                 }
                                 }
                             }
                             }
@@ -2017,7 +2015,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                                     }
                                     }
                                     break;
                                     break;
                                 case 2://补卡
                                 case 2://补卡
-                                case 3://出差
+                                case 3://出差;以出差为准
                                 case 4://外出
                                 case 4://外出
                                 case 100://外勤
                                 case 100://外勤
                                     Double outdoorTime = ct.getOutdoorTime();
                                     Double outdoorTime = ct.getOutdoorTime();
@@ -2274,21 +2272,11 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                     } else {
                     } else {
                         if (hasTimeRecord) {
                         if (hasTimeRecord) {
                             if (showLog) System.out.println("插入考勤记录"+curUserid+", "+localDate);
                             if (showLog) System.out.println("插入考勤记录"+curUserid+", "+localDate);
-//                            userCorpwxTimeMapper.insert(ct);
                             insertList.add(ct);
                             insertList.add(ct);
                         }
                         }
-                        //影响性能,此处不再获取打卡,用户手动刷新单日接口本身有后续的获取打卡记录步骤,这里为冗余代码,需要去掉
-//                        else if (startTime == endTime){ //只在单日刷新考勤的情况下,才去获取打卡详情来计算
-//                            //调用打卡详情去获取,弥补外出打卡且时间不在自动同步范围内的情况; 仅对工作日有效
-//                            if (timeTypeService.isWorkDay(corpInfo.getCompanyId(), localDate, timeType, holidaySettings)) {
-//                                getUserPunchRecord(corpInfo.getCompanyId(), curUserid, localDate.atTime(0,0,0),
-//                                        localDate.atTime(23,59,59), showLog);
-//                            }
-//                        }
                     }
                     }
                     //保存异常情况记录
                     //保存异常情况记录
                     if (corpInfo.getCompanyId() == Constant.XI_HE_CHAO_DAO_JIA_XING_COMPANY_ID || corpInfo.getCompanyId() == Constant.XI_HE_CHAO_DAO_COMPANY_ID) {
                     if (corpInfo.getCompanyId() == Constant.XI_HE_CHAO_DAO_JIA_XING_COMPANY_ID || corpInfo.getCompanyId() == Constant.XI_HE_CHAO_DAO_COMPANY_ID) {
-//                        saveException(ct, jsonObject.getJSONArray("exception_infos"));
                         List<ExceptionInfos> exceptionInfos = getExceptionInfos(ct, jsonObject.getJSONArray("exception_infos"));
                         List<ExceptionInfos> exceptionInfos = getExceptionInfos(ct, jsonObject.getJSONArray("exception_infos"));
                         if (exceptionInfos != null) {
                         if (exceptionInfos != null) {
                             allExceptionInfoList.addAll(exceptionInfos);
                             allExceptionInfoList.addAll(exceptionInfos);
@@ -2307,7 +2295,6 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                 }
                 }
             } else {
             } else {
                 //TODO: 记录同步失败
                 //TODO: 记录同步失败
-
                 throw new Exception(json.toJSONString());
                 throw new Exception(json.toJSONString());
             }
             }
 
 
@@ -2330,16 +2317,6 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
         return list;
         return list;
     }
     }
 
 
-    private double convertDayTimeToHours(double d) {
-        if (d == 12) {
-            return 4.0;
-        } else if (d == 24) {
-            return 8.0;
-        } else {
-            return d;
-        }
-    }
-
     //更新审核中的请假单以及查询某时间段的微信请假单
     //更新审核中的请假单以及查询某时间段的微信请假单
     @Override
     @Override
     public List<LeaveSheet> wxLeaveNumber(String startTime,String endTime,List<WxCorpInfo> wxCorpInfos,List<LeaveSheet> approvalLeave) throws Exception {
     public List<LeaveSheet> wxLeaveNumber(String startTime,String endTime,List<WxCorpInfo> wxCorpInfos,List<LeaveSheet> approvalLeave) throws Exception {

+ 6 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/DateTimeUtil.java

@@ -343,7 +343,7 @@ public class DateTimeUtil {
 
 
     public static void main(String[] args) {
     public static void main(String[] args) {
         LocalDate date = LocalDate.parse("2026-05-06", DateTimeFormatter.ofPattern("yyyy-MM-dd"));
         LocalDate date = LocalDate.parse("2026-05-06", DateTimeFormatter.ofPattern("yyyy-MM-dd"));
-        System.out.println(calculateOvertime(date, "07:54","17:30"));
+        System.out.println(calculateOvertime(date, "07:54","04:30"));
         // 测试用例验证 calculateHuaYanWorkHours 新规则(基准上班8:30,基准下班17:30)
         // 测试用例验证 calculateHuaYanWorkHours 新规则(基准上班8:30,基准下班17:30)
         // 规则:
         // 规则:
         // 1. 周一至周六:午间11:30-12:30扣1小时、17:30-18:00扣0.5小时;周日及法定假日不扣
         // 1. 周一至周六:午间11:30-12:30扣1小时、17:30-18:00扣0.5小时;周日及法定假日不扣
@@ -395,14 +395,17 @@ public class DateTimeUtil {
 
 
     public static double calculateOvertime(LocalDate date, String startTime, String endTime) {
     public static double calculateOvertime(LocalDate date, String startTime, String endTime) {
         String workEndTime = "17:00";
         String workEndTime = "17:00";
-        if (StringUtils.isEmpty(startTime) || StringUtils.isEmpty(endTime) || endTime.compareTo(workEndTime) < 0) {
+        if (endTime.compareTo(startTime) < 0) {
+            endTime = "次日" + endTime;
+        }
+        if (StringUtils.isEmpty(startTime) || StringUtils.isEmpty(endTime) || (!endTime.startsWith("次日") && endTime.compareTo(workEndTime) < 0)) {
             return 0;
             return 0;
         }
         }
         // 计算加班
         // 计算加班
         DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
         DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
         String startDate = "1990-01-01";
         String startDate = "1990-01-01";
         String endDate = "1990-01-01";
         String endDate = "1990-01-01";
-        if (startTime.compareTo(endTime) > 0 || endTime.startsWith("次日")) {
+        if (endTime.startsWith("次日")) {
             endDate = "1990-01-02";
             endDate = "1990-01-02";
             if (endTime.startsWith("次日")) {
             if (endTime.startsWith("次日")) {
                 endTime = endTime.substring(2).trim();
                 endTime = endTime.substring(2).trim();