Browse Source

自动补全工时

cs 2 năm trước cách đây
mục cha
commit
4e225a56a7

+ 6 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java

@@ -2069,5 +2069,11 @@ public class ReportController {
         return reportService.fillWorkingHours(yearMonth,monthVO,request);
     }
 
+    //为所有人补足工时
+    @RequestMapping("/fillAll")
+    public HttpRespMsg fillAll(String month,String userId,Integer departmentId,Integer whether,HttpServletRequest request){
+        return reportService.fillAll(month,userId,departmentId,whether,request);
+    }
+
 }
 

+ 2 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ReportMapper.java

@@ -157,4 +157,6 @@ public interface ReportMapper extends BaseMapper<Report> {
     Map<String, Object> getDefaultDegree(Integer companyId, String userId, Integer projectId);
 
     Map<String, Object> selectCostTimeByProject(String startDate, String endDate, Integer projectId);
+
+    List<HashMap<String, Object>> selectFill(String userId,LocalDate startDate, LocalDate endDate);
 }

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

@@ -110,4 +110,6 @@ public interface ReportService extends IService<Report> {
     void moveReport(User sourceUser,User targetUser);
 
     HttpRespMsg fillWorkingHours(String yearMonth, MonthWorkingTimeVO monthVO, HttpServletRequest request);
+
+    HttpRespMsg fillAll(String month, String userId, Integer departmentId, Integer whether,HttpServletRequest request);
 }

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

@@ -21,6 +21,7 @@ import org.apache.poi.EncryptedDocumentException;
 import org.apache.poi.hssf.usermodel.*;
 import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
 import org.apache.poi.ss.usermodel.*;
+import org.apache.velocity.runtime.directive.contrib.For;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.web.client.RestTemplateBuilder;
@@ -49,6 +50,7 @@ import java.security.cert.X509Certificate;
 import java.sql.Timestamp;
 import java.text.DateFormat;
 import java.text.DecimalFormat;
+import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.time.Duration;
 import java.time.LocalDate;
@@ -118,6 +120,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     @Resource
     ReportExtraDegreeMapper reportExtraDegreeMapper;
     @Resource
+    private ReportController reportController;
+    @Resource
     WxCorpInfoService wxCorpInfoService;
     @Resource
     ProjectCategoryMapper projectCategoryMapper;
@@ -188,6 +192,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     @Resource
     private ReportImportLogMapper reportImportLogMapper;
     @Resource
+    private ProjectService projectService;
+    @Resource
     private ReportAuditLogMapper reportAuditLogMapper;
     @Resource
     private ReportAlogMembdateMapper reportAlogMembdateMapper;
@@ -205,6 +211,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     private CorpwxJobResultMapper corpwxJobResultMapper;
     @Autowired
     RestTemplate restTemplate;
+    @Resource
+    private TimeAutoExcludeMapper timeAutoExcludeMapper;
 
     @Resource
     private ReportAuditLogService reportAuditLogService;
@@ -5803,6 +5811,138 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
 
     @Override
     public HttpRespMsg fillWorkingHours(String yearMonth, MonthWorkingTimeVO monthVO, HttpServletRequest request) {
-        return null;
+        HttpRespMsg msg = new HttpRespMsg();
+        //需要补的时间
+        double fillTime = monthVO.getStandardHours() - monthVO.getWorkingTime() - monthVO.getLeaveTime();
+        User user = userMapper.selectById(monthVO.getUserId());
+        yearMonth = yearMonth;
+        LocalDate time = LocalDate.parse(yearMonth, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+        LocalDate startDate = time.with(TemporalAdjusters.firstDayOfMonth());
+        LocalDate endDate = time.with(TemporalAdjusters.lastDayOfMonth());
+        if (monthVO.getWhether()!=0){
+            return msg;
+        }
+        //查询该员工所有日报
+        List<HashMap<String, Object>> reportList = reportMapper.selectFill(monthVO.getUserId(), startDate, endDate);
+        List<String> projectId = reportList.stream().map(r -> r.get("projectId").toString()).distinct().collect(Collectors.toList());
+        if (projectId.size() == 0){
+            return msg;
+        }
+        //获取该公司上班和下班时间
+        List<Map<String, Object>> startAndEndTime = reportMapper.selectMaps(new QueryWrapper<Report>().select("min(start_time) startTime", "max(end_time) endTime").eq("company_id", user.getCompanyId()));
+        String workStartTime = "";
+        String workEndTime = "";
+        if (startAndEndTime.size() != 0){
+            Map<String, Object> startAndEndTimeMap = startAndEndTime.get(0);
+            workStartTime = startAndEndTimeMap.get("startTime").toString();
+            workEndTime = startAndEndTimeMap.get("endTime").toString();
+        }else {
+            return msg;
+        }
+        List<TimeAutoExclude> timeAutoExclude = timeAutoExcludeMapper.selectList(new QueryWrapper<TimeAutoExclude>().eq("company_id", user.getCompanyId()));
+        //遍历工作日
+        ArrayList<Report> reports = new ArrayList<>();
+        for (LocalDate i = startDate; i.isEqual(endDate) || i.isBefore(endDate); i = i.plusDays(1)) {
+            Boolean workDay = timeTypeService.isWorkDay(user.getCompanyId(), i);
+            if (workDay){
+                Double workTime = 0.0;
+                //添加该日日报进入集合
+                ArrayList<HashMap<String, Object>> report = new ArrayList<>();
+                for (HashMap<String, Object> map : reportList) {
+                    if(map.get("createDate").toString().equals(i.toString())){
+                        report.add(map);
+                        workTime += Double.parseDouble(map.get("workingTime").toString());
+                    }
+                }
+                //如果该日工作时长没有填满
+                if (workTime < monthVO.getAllday()){
+                    Report reportItem = new Report();
+                    reportItem.setCreatorId(user.getId());
+                    reportItem.setProjectId(Integer.valueOf(projectId.get(0)));
+                    reportItem.setCreateDate(i);
+                    reportItem.setCreateTime(LocalDateTime.now());
+                    reportItem.setContent("该工时为自动补全的工时");
+                    reportItem.setState(1);
+                    reportItem.setTimeType(0);
+                    reportItem.setIsOvertime(0);
+                    reportItem.setDepartmentAuditState(-1);
+                    reportItem.setDegreeId(-1);
+                    reportItem.setCompanyId(user.getCompanyId());
+                    reportItem.setProjectAuditorId(request.getHeader("token"));
+                    reportItem.setDeptId(user.getDepartmentId());
+                    if (workTime == 0){
+                        reportItem.setWorkingTime(monthVO.getAllday());
+                    }else {
+                        //获取日报的最小开始时间和最大结束时间
+                        List<String> endTime = report.stream().map(m -> m.get("endTime").toString()).collect(Collectors.toList());
+                        String eTime = endTime.get(0);
+                        for (String s : endTime) {
+                            if (s.compareTo(eTime) < 0){
+                                eTime = s;
+                            }
+                        }
+                        reportItem.setStartTime(eTime);
+                        if (eTime.compareTo(workEndTime) < 0){
+                            reportItem.setEndTime(workEndTime);
+                        }else {
+                            reportItem.setEndTime("22:00");
+                        }
+                        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
+                        try {
+                            long t = sdf.parse(reportItem.getEndTime()).getTime() - sdf.parse(reportItem.getStartTime()).getTime();
+                            int excludeTime = 0;
+                            if (timeAutoExclude.size() > 0) {
+                                for (TimeAutoExclude exclude : timeAutoExclude) {
+                                    if (!(exclude.getEndTime().compareTo(reportItem.getStartTime()) < 0 || exclude.getStartTime().compareTo(reportItem.getEndTime()) > 0)) {
+                                        //有交叉的情况,结束时间取较早的,开始时间取较晚的
+                                        String mEndTime = exclude.getEndTime().compareTo(reportItem.getEndTime()) <0 ? exclude.getEndTime() : reportItem.getEndTime();
+                                        String mStartTime = exclude.getStartTime().compareTo(reportItem.getStartTime()) > 0 ? exclude.getStartTime() : reportItem.getStartTime();
+                                        //落在休息时间范围内,需要计算去掉的时间
+                                        long subtractTime = sdf.parse(mEndTime).getTime() - sdf.parse(mStartTime).getTime();
+                                        excludeTime += subtractTime;
+                                    }
+                                }
+                            }
+                            if (excludeTime > 0) {
+                                t -= excludeTime;//去掉休息时间
+                            }
+
+                            int minutes = (int)t/1000/60;
+                            double hours = minutes*1.0f/60;
+                            reportItem.setWorkingTime(hours);
+                        }catch (ParseException e) {
+                            e.printStackTrace();
+                        }
+                    }
+                    reports.add(reportItem);
+                    fillTime -= reportItem.getWorkingTime();
+                    if(fillTime < 0){
+                        break;
+                    }
+                }
+            }
+        }
+        reportService.saveBatch(reports);
+        return msg;
+    }
+
+
+    @Override
+    public HttpRespMsg fillAll(String month, String userId, Integer departmentId, Integer whether,HttpServletRequest request) {
+        HttpRespMsg empMonthHours = projectService.getEmpMonthHours(null, null, month, departmentId, userId, whether, request);
+        Map<String,Object> data = (Map<String, Object>) empMonthHours.data;
+        List<Map<String,Object>> resultList= (List<Map<String, Object>>) data.get("result");
+        for (Map<String, Object> map : resultList) {
+            MonthWorkingTimeVO monthWorkingTimeVO = new MonthWorkingTimeVO();
+            monthWorkingTimeVO.setAllday(Double.valueOf(map.get("allday").toString()));
+            monthWorkingTimeVO.setLeaveTime(Double.valueOf(map.get("leaveTime").toString()));
+            monthWorkingTimeVO.setName(map.get("name").toString());
+            monthWorkingTimeVO.setStandardHours(Double.valueOf(map.get("standardHours").toString()));
+            monthWorkingTimeVO.setUserId(map.get("userId").toString());
+            monthWorkingTimeVO.setWhether(Integer.valueOf(map.get("whether").toString()));
+            monthWorkingTimeVO.setWorkingTime(Double.valueOf(map.get("workingTime").toString()));
+            fillWorkingHours(month,monthWorkingTimeVO,request);
+        }
+        return new HttpRespMsg();
     }
 }

+ 3 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/TimeTypeServiceImpl.java

@@ -61,6 +61,9 @@ public class TimeTypeServiceImpl extends ServiceImpl<TimeTypeMapper, TimeType> i
                 workDay = false;
             }
         }
+        if (WorkDayCalculateUtils.isWorkDay(date)){
+            workDay = true;
+        }
         return workDay;
     }
 }

+ 6 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml

@@ -780,4 +780,10 @@
         and state = 1
     </select>
 
+    <select id="selectFill" resultType="java.util.Map">
+        SELECT working_time workingTime,create_date createDate,content,creator_id creatorId,project_id projectId,start_time startTime,end_time endTime
+        FROM report
+        WHERE creator_id = #{userId}
+        AND create_date BETWEEN #{startDate} AND #{endDate}
+    </select>
 </mapper>