Browse Source

对请假时间的计算进行重写

cs 2 years ago
parent
commit
fc14198e5f

+ 4 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/LeaveSheetService.java

@@ -7,6 +7,8 @@ import com.management.platform.util.HttpRespMsg;
 
 import javax.servlet.http.HttpServletRequest;
 import java.time.LocalDate;
+import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -37,4 +39,6 @@ public interface LeaveSheetService extends IService<LeaveSheet> {
     HttpRespMsg cancel(Integer id, String userId);
 
     HttpRespMsg auditList(LeaveSheet sheet, Integer pageIndex, Integer pageSize);
+
+    float leaveTimeSum(Integer companyId, String startDate, String endDate, float standardHours, float allDay, List<LeaveSheet> leaveSheets);
 }

+ 62 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/LeaveSheetServiceImpl.java

@@ -14,6 +14,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.management.platform.util.ExcelUtil;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.MessageUtils;
+import com.management.platform.util.WorkDayCalculateUtils;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -23,8 +24,10 @@ import org.springframework.web.bind.annotation.RequestParam;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.xml.transform.Source;
+import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.ZoneOffset;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.stream.Collectors;
@@ -712,4 +715,63 @@ public class LeaveSheetServiceImpl extends ServiceImpl<LeaveSheetMapper, LeaveSh
         httpRespMsg.data = map;
         return httpRespMsg;
     }
+
+    /**
+     * 返回某段时间内请假时间总和
+     * @param companyId
+     * @param startDate
+     * @param endDate
+     * @param standardHours 该月总工时
+     * @param allDay 该公司每天工时
+     * @param leaveSheets
+     * @return
+     */
+    @Override
+    public float leaveTimeSum(Integer companyId, String startDate, String endDate, float standardHours, float allDay, List<LeaveSheet> leaveSheets) {
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        LocalDate localStartDate = LocalDate.parse(startDate, dateTimeFormatter);
+        LocalDate localEndDate = LocalDate.parse(endDate, dateTimeFormatter);
+        float leaveTime = 0;
+        for (LeaveSheet leaveSheet : leaveSheets) {
+            //请假期间的工作日
+            int leaveDays = WorkDayCalculateUtils.getWorkDaysListInRange(leaveSheet.getStartDate().toString(), leaveSheet.getEndDate().toString(), 0).size();
+            //当请假时间在筛选时间段内
+            if ((leaveSheet.getStartDate().isEqual(localStartDate) || leaveSheet.getStartDate().isAfter(localStartDate)) && (leaveSheet.getEndDate().isEqual(localEndDate) || leaveSheet.getEndDate().isBefore(localEndDate))){
+                //请假期间的非工作日
+                int nonWorkDays = WorkDayCalculateUtils.getNonWorkDaysListInRange(leaveSheet.getStartDate().toString(), leaveSheet.getEndDate().toString()).size();
+                if (leaveSheet.getStartDate().isEqual(leaveSheet.getEndDate()) || nonWorkDays == 0){
+                    leaveTime+=leaveSheet.getTimeHours();
+                }else {
+                    leaveTime+= leaveDays * allDay;
+                }
+            }else{
+                //请假时间首尾超出
+                if(leaveSheet.getStartDate().isBefore(localStartDate) && leaveSheet.getEndDate().isAfter(localEndDate)){
+                    leaveTime+= standardHours;
+                }else {
+                    //当请假时间开始时间超出
+                    if (leaveSheet.getStartDate().isBefore(localStartDate)){
+                        //超出的天数
+                        int startDay = WorkDayCalculateUtils.getWorkDaysListInRange(leaveSheet.getStartDate().toString(), localStartDate.toString(), 0).size();
+                        if (WorkDayCalculateUtils.isWorkDay(leaveSheet.getStartDate())){
+                            startDay--;
+                        }
+                        float DifDay = leaveDays - startDay;
+                        leaveTime+= allDay*DifDay;
+                    }else {
+                        //当请假时间结束时间超出
+                        //超出的天数
+                        int endDay = WorkDayCalculateUtils.getWorkDaysListInRange(localEndDate.toString(),leaveSheet.getEndDate().toString(),  0).size();
+                        if (WorkDayCalculateUtils.isWorkDay(leaveSheet.getStartDate())){
+                            endDay--;
+                        }
+                        float DifDay = leaveDays - endDay;
+                        leaveTime+= allDay*DifDay;
+                    }
+                }
+            }
+        }
+        leaveTime = new BigDecimal(leaveTime).setScale(1,BigDecimal.ROUND_HALF_UP).floatValue();
+        return leaveTime;
+    }
 }

+ 13 - 52
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -193,6 +193,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     WxCorpInfoMapper wxCorpInfoMapper;
     @Resource
     WxCorpInfoService wxCorpInfoService;
+    @Resource
+    private LeaveSheetService leaveSheetService;
 
     @Resource
     private HttpServletResponse response;
@@ -6094,30 +6096,16 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 map.put("deptName","未分配");
             }
             //计算请假时间
-            Float leaveSum = 0F;
+            ArrayList<LeaveSheet> leaveSheets = new ArrayList<>();
             for (LeaveSheet sheet : leaveSheet) {
                 if (sheet.getOwnerId().equals(map.get("userId"))){
-//                    System.err.println(sheet.getOwnerName());
-//                    System.err.println(sheet.getStartDate());
-//                    System.err.println(sheet.getEndDate());
-                    Float timeHours = sheet.getTimeHours();
-                    //若请假开始时间不在筛选时间内
-                    if (sheet.getStartDate().isBefore(localStartDate)) {
-                        long day = localStartDate.toEpochDay() - sheet.getStartDate().toEpochDay();
-                        timeHours -= day * allDay.getAllday();
-//                        System.err.println("请假开始时间不在筛选时间内,应减去" + day * allDay.getAllday()+"小时");
-                    }
-                    //若请假结束时间不在筛选时间内
-                    if (sheet.getEndDate().isAfter(localEndDate)) {
-                        long day = sheet.getEndDate().toEpochDay() - localEndDate.toEpochDay();
-                        timeHours -= day * allDay.getAllday();
-//                        System.err.println("请假结束时间不在筛选时间内,应减去"+day * allDay.getAllday()+"小时");
-                    }
-//                    System.err.println("计算完的时间为:" + timeHours);
-                    leaveSum += timeHours;
-                }
-            }
-//            System.err.println("总时间为:"+leaveSum);
+                    leaveSheets.add(sheet);
+                }
+            }
+            int days = WorkDayCalculateUtils.getWorkDaysListInRange(startDate, endDate, 0).size();
+            Float allday = allDay.getAllday();
+            float standardHours = allday*days;
+            float leaveSum = leaveSheetService.leaveTimeSum(companyId,startDate,endDate,standardHours,allday,leaveSheet);
             map.put("leaveSum",leaveSum + "h");
             double workTimeDouble = Double.parseDouble(map.get("workingTime").toString()) + leaveSum;
             BigDecimal workTimeBig = new BigDecimal(workTimeDouble);
@@ -7970,10 +7958,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             total=projectMapper.findCountWithEmpMonthHours(targetUser.getCompanyId(),startDate,endDate,null,null,userId,branchDepartment,deptIds);
         }
         if(resultList.size()!=0){
-            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
-            float standardHours = Float.parseFloat(resultList.get(0).get("allday").toString())*days;
-            LocalDate localStartDate = LocalDate.parse(startDate, dateTimeFormatter);
-            LocalDate localEndDate = LocalDate.parse(endDate, dateTimeFormatter);
+            float allday = Float.parseFloat(resultList.get(0).get("allday").toString());
+            float standardHours = allday*days;
             List<LeaveSheet> sumLeave = leaveSheetMapper.selectLeave(targetUser.getCompanyId(), startDate, endDate);
             for (Map<String, Object> map : resultList) {
                 //计算算请假时间
@@ -7988,32 +7974,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         leaveSheets.add(leaveSheet);
                     }
                 }
-                float leaveTime = 0;
-                for (LeaveSheet leaveSheet : leaveSheets) {
-                    //当请假时间在当前月内的
-                    if ((leaveSheet.getStartDate().isEqual(localStartDate) || leaveSheet.getStartDate().isAfter(localStartDate)) && (leaveSheet.getEndDate().isEqual(localEndDate) || leaveSheet.getEndDate().isBefore(localEndDate))){
-                        leaveTime+=leaveSheet.getTimeHours();
-                    }else{
-                        float LeaveDay = leaveSheet.getEndDate().toEpochDay() - leaveSheet.getStartDate().toEpochDay() + 1;
-                        Float timeHours = leaveSheet.getTimeHours();
-                        //请假时间首尾跨月
-                        if(leaveSheet.getStartDate().isBefore(localStartDate) && leaveSheet.getEndDate().isAfter(localEndDate)){
-                            leaveTime+= standardHours;
-                        }else {
-                            //当请假时间开始时间跨月
-                            if (leaveSheet.getStartDate().isBefore(localStartDate)){
-                                //平均计算
-                                float DifDay = localStartDate.toEpochDay() - leaveSheet.getStartDate().toEpochDay();
-                                leaveTime+= timeHours*(1 - DifDay/LeaveDay);
-                            }else {
-                                //当请假时间结束时间跨月
-                                float DifDay = leaveSheet.getEndDate().toEpochDay() - localEndDate.toEpochDay();
-                                leaveTime+= timeHours*(1 - DifDay/LeaveDay);
-                            }
-                        }
-                    }
-                }
-                leaveTime = new BigDecimal(leaveTime).setScale(1,BigDecimal.ROUND_HALF_UP).floatValue();
+                float leaveTime = leaveSheetService.leaveTimeSum(targetUser.getCompanyId(),startDate,endDate,standardHours,allday,leaveSheets);
                 map.put("leaveTime",leaveTime);
                 //是否满足工时
                 if (workingTime + leaveTime < standardHours){