Преглед изворни кода

移除打印。 日报内完成任务的控制字段。

QuYueTing пре 1 месец
родитељ
комит
0fa53d53c6
46 измењених фајлова са 1680 додато и 3187 уклоњено
  1. 4 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/constant/Constant.java
  2. 0 118
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/LeaveSheetController.java
  3. 0 16
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/LeaveSheetFvController.java
  4. 263 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/OvertimeAllowanceController.java
  5. 0 467
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/OvertimeAllowanceController.java~
  6. 419 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/OvertimeController.java
  7. 0 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java
  8. 40 253
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java
  9. 14 6
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserCorpwxTimeController.java
  10. 0 263
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserFvTimeController.java
  11. 36 18
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java
  12. 4 262
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WxCorpInfoController.java
  13. 5 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Company.java
  14. 27 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Overtime.java
  15. 6 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/SysModule.java
  16. 6 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TimeType.java
  17. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/OvertimeAllowanceMapper.java
  18. 0 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/LeaveSheetFvService.java
  19. 15 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/OvertimeAllowanceService.java
  20. 1 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ReportService.java
  21. 10 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/WxCorpInfoService.java
  22. 0 6
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DepartmentServiceImpl.java
  23. 0 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FeishuInfoServiceImpl.java
  24. 0 104
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/LeaveSheetFvServiceImpl.java
  25. 0 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/LeaveSheetServiceImpl.java
  26. 0 1120
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/LeaveSheetServiceImpl.java~
  27. 14 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/OvertimeAllowanceServiceImpl.java
  28. 3 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/PermissionServiceImpl.java
  29. 1 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  30. 421 17
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  31. 4 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  32. 284 25
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java
  33. 25 258
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java
  34. 0 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/test/TestApplicationTests.java
  35. 0 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/AuthService.java
  36. 0 9
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/CRC16Util.java
  37. 0 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/CheckPicUtil.java
  38. 0 198
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/DockWithMLD.java
  39. 1 5
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/HttpKit.java
  40. 0 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/TimeZoneConverter.java
  41. 0 13
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/WorkDayCalculateUtils.java
  42. 5 5
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/application.yml
  43. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/CompanyMapper.xml
  44. 47 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/OvertimeAllowanceMapper.xml
  45. 5 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/OvertimeMapper.xml
  46. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TimeTypeMapper.xml

+ 4 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/constant/Constant.java

@@ -65,4 +65,8 @@ public class Constant {
 
 
     //安及乙实业
     //安及乙实业
     public static final int AN_JI_YI_COMPANY_ID=3511;
     public static final int AN_JI_YI_COMPANY_ID=3511;
+
+    //羲合超导-合肥
+    public static final int XI_HE_CHAO_DAO_COMPANY_ID=5792;
+    public static final int XI_HE_CHAO_DAO_JIA_XING_COMPANY_ID=8555;
 }
 }

+ 0 - 118
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/LeaveSheetController.java

@@ -1,11 +1,7 @@
 package com.management.platform.controller;
 package com.management.platform.controller;
 
 
 
 
-import com.alibaba.fastjson.JSONObject;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.management.platform.entity.LeaveSheet;
 import com.management.platform.entity.LeaveSheet;
-import com.management.platform.entity.TimeType;
-import com.management.platform.entity.User;
 import com.management.platform.entity.vo.ExportLeave;
 import com.management.platform.entity.vo.ExportLeave;
 import com.management.platform.mapper.DepartmentMapper;
 import com.management.platform.mapper.DepartmentMapper;
 import com.management.platform.mapper.SysFunctionMapper;
 import com.management.platform.mapper.SysFunctionMapper;
@@ -13,7 +9,6 @@ import com.management.platform.mapper.TimeTypeMapper;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.DepartmentService;
 import com.management.platform.service.DepartmentService;
 import com.management.platform.service.LeaveSheetService;
 import com.management.platform.service.LeaveSheetService;
-import com.management.platform.util.DockWithMLD;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.HttpRespMsg;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -22,13 +17,6 @@ import org.springframework.web.bind.annotation.RestController;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequest;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
 
 
 /**
 /**
  * <p>
  * <p>
@@ -41,22 +29,10 @@ import java.util.Optional;
 @RestController
 @RestController
 @RequestMapping("/leave-sheet")
 @RequestMapping("/leave-sheet")
 public class LeaveSheetController {
 public class LeaveSheetController {
-
-    @Resource
-    UserMapper userMapper;
     @Resource
     @Resource
     LeaveSheetService leaveSheetService;
     LeaveSheetService leaveSheetService;
     @Resource
     @Resource
     private HttpServletRequest request;
     private HttpServletRequest request;
-    @Resource
-    SysFunctionMapper sysFunctionMapper;
-    @Resource
-    DepartmentMapper departmentMapper;
-    @Resource
-    DepartmentService departmentService;
-    @Resource
-    TimeTypeMapper timeTypeMapper;
-
 
 
     /***
     /***
      * 获取员工调休时长
      * 获取员工调休时长
@@ -170,99 +146,5 @@ public class LeaveSheetController {
         return leaveSheetService.leaveDays(startDate,endDate);
         return leaveSheetService.leaveDays(startDate,endDate);
     }
     }
 
 
-    @RequestMapping("/syncLeaveSheet")
-    public HttpRespMsg syncLeaveSheet(){
-        HttpRespMsg msg=new HttpRespMsg();
-        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
-        TimeType one = timeTypeMapper.selectOne(new QueryWrapper<TimeType>().eq("company_id", companyId).eq("sync_fanwei", 1));
-        if(one==null){
-            msg.setError("暂无请假数据待同步");
-            return msg;
-        }
-        DockWithMLD dockWithMLD=new DockWithMLD();
-        JSONObject jsonObject=new JSONObject();
-        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
-        DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
-        String startDate = dtf.format(LocalDateTime.now());
-        jsonObject.put("gmtFinished",startDate);
-        String jsonString = jsonObject.toJSONString();
-        TimeType allDay = timeTypeMapper.selectOne(new QueryWrapper<TimeType>().eq("company_id", companyId));
-        List<User> allUserList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
-        List<LeaveSheet> leaveSheetList=new ArrayList<>();
-        List<LeaveSheet> oldLeaveSheetList = leaveSheetService.list(new QueryWrapper<LeaveSheet>().eq("company_id", companyId));
-        //Todo: 获取请假数据
-        HttpRespMsg leaveRecordMsg = dockWithMLD.getResult("http://10.1.10.51:20175/api/cube/restful/interface/getModeDataPageList/getLeaveRecord", jsonString);
-        if(leaveRecordMsg.getCode().equals("error")){
-            msg.setError("同步失败");
-            return msg;
-        }
-        List<Map<String,Object>> leaveRecordList= (List<Map<String, Object>>) leaveRecordMsg.data;
-        for (Map<String, Object> map : leaveRecordList) {
-            Optional<User> optional=allUserList.stream().filter(al->al.getJobNumber()!=null&&al.getJobNumber().equals(map.get("rybh"))).findFirst();
-            if(!optional.isPresent()){
-                continue;
-            }
-            User user=optional.get();
-            /*System.out.println("泛微同步人员请假数据----"+user.getName());*/
-            if(companyId.equals(user.getCompanyId())){
-                LeaveSheet leaveSheet = new LeaveSheet();
-                leaveSheet.setCompanyId(user.getCompanyId());
-                leaveSheet.setStatus(0);
-                leaveSheet.setOwnerId(user.getId());
-                leaveSheet.setOwnerName(user.getName());
-                leaveSheet.setStartDate(LocalDate.parse(String.valueOf(map.get("startDate")),dtf1));
-                leaveSheet.setEndDate(LocalDate.parse(String.valueOf(map.get("endDate")),dtf1));
-                Integer timeType=null;
-                switch (String.valueOf(map.get("timeType"))){
-                    case "小时":timeType=1;
-                        break;
-                    case "天":timeType=0;
-                        break;
-                }
-                leaveSheet.setTimeType(timeType);
-                leaveSheet.setTimeDays(Float.parseFloat(((String) map.get("timeDays")).equals("")?"0.00":((String) map.get("timeDays"))));
-                if (timeType == 0){
-                    leaveSheet.setTimeHours(leaveSheet.getTimeDays()*allDay.getAllday());
-                }else {
-                    leaveSheet.setTimeHours(Float.parseFloat(((String) map.get("timeHours")).equals("")?"0.00":((String) map.get("timeHours"))));
-                }
-                Integer leaveType;
-                switch (String.valueOf(map.get("leaveType"))){
-                    case "事假":leaveType=0;
-                        break;
-                    case "病假":leaveType=1;
-                        break;
-                    case "年假":leaveType=2;
-                        break;
-                    case "产假":leaveType=3;
-                        break;
-                    case "婚假":leaveType=4;
-                        break;
-                    case "丧假":leaveType=5;
-                        break;
-                    case "调休":leaveType=6;
-                        break;
-                    case "陪产假":leaveType=7;
-                        break;
-                    default:leaveType=8;
-                }
-                leaveSheet.setLeaveType(leaveType);
-                leaveSheet.setProcinstId(String.valueOf(map.get("id")));
-                leaveSheet.setGmtFinished(String.valueOf(map.get("gmtFinished")));
-                Optional<LeaveSheet> first = oldLeaveSheetList.stream().filter(ol -> ol.getStartDate().isEqual(leaveSheet.getStartDate())&&ol.getEndDate().isEqual(leaveSheet.getEndDate())&& ol.getOwnerId().equals(leaveSheet.getOwnerId())&&(ol.getProcinstId()!=null&& ol.getProcinstId().equals(leaveSheet.getProcinstId()))).findFirst();
-                if(first.isPresent()){
-                    leaveSheet.setId(first.get().getId());
-                }
-                leaveSheetList.add(leaveSheet);
-            }
-        }
-        if(leaveSheetList.size()>0){
-            leaveSheetService.remove(new QueryWrapper<LeaveSheet>().eq("company_id",companyId));
-            leaveSheetService.saveBatch(leaveSheetList);
-        }
-        return msg;
-    }
-
-
 }
 }
 
 

+ 0 - 16
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/LeaveSheetFvController.java

@@ -21,21 +21,5 @@ import javax.annotation.Resource;
 @RequestMapping("/leave-sheet-fv")
 @RequestMapping("/leave-sheet-fv")
 public class LeaveSheetFvController {
 public class LeaveSheetFvController {
 
 
-    @Resource
-    LeaveSheetFvService leaveSheetFvService;
-
-    @RequestMapping("/syncData")
-    public HttpRespMsg syncData(String startDate, String endDate, Integer companyId) {
-        HttpRespMsg httpRespMsg = new HttpRespMsg();
-        httpRespMsg.data = leaveSheetFvService.syncData(startDate, endDate, companyId);
-        return httpRespMsg;
-    }
-
-    @RequestMapping("/testAdd")
-    public HttpRespMsg testAdd(Integer companyId) {
-        HttpRespMsg httpRespMsg = new HttpRespMsg();
-        leaveSheetFvService.testAdd(companyId);
-        return httpRespMsg;
-    }
 }
 }
 
 

+ 263 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/OvertimeAllowanceController.java

@@ -62,6 +62,8 @@ public class OvertimeAllowanceController {
 
 
     @Value(value = "${upload.path}")
     @Value(value = "${upload.path}")
     private String path;
     private String path;
+
+    @Resource
     private UserMapper userMapper;
     private UserMapper userMapper;
 
 
     /**
     /**
@@ -194,7 +196,7 @@ public class OvertimeAllowanceController {
                     if (!isAllowance) {
                     if (!isAllowance) {
                         if (userCorpwxTimes != null) {
                         if (userCorpwxTimes != null) {
                             for (UserCorpwxTime userCorpwxTime : userCorpwxTimes) {
                             for (UserCorpwxTime userCorpwxTime : userCorpwxTimes) {
-                                if (userCorpwxTime.getCorpwxUserid().equals(allowance.getCorpwxUserid()) && userCorpwxTime.getCreateDate().equals(allowance.getDate())) {
+                                if (userCorpwxTime.getCorpwxUserid().equals(allowance.getCorpwxUserid()) && userCorpwxTime.getCreateDate().isEqual(allowance.getDate())) {
                                     allowance.setApplyOvertimeDuration(userCorpwxTime.getOtTime());
                                     allowance.setApplyOvertimeDuration(userCorpwxTime.getOtTime());
                                 }
                                 }
                             }
                             }
@@ -214,6 +216,266 @@ public class OvertimeAllowanceController {
         return msg;
         return msg;
     }
     }
 
 
+    /**
+     * 获取按人员合计统计餐补数据列表
+     * @param userId 用户ID
+     * @param departmentId 部门ID
+     * @param startDate 开始日期
+     * @param endDate 结束日期
+     * @param isAllowance 是否餐补模式
+     * @param pageIndex 页码
+     * @param pageSize 每页大小
+     * @return 按人员合计的分页查询结果
+     */
+    @RequestMapping("/getSummaryList")
+    public HttpRespMsg getSummaryList(
+            String userId,
+            Integer departmentId,
+            String startDate,
+            String endDate,
+            @RequestParam(required = false, defaultValue = "true") Boolean isAllowance) {
+        HttpRespMsg msg = new HttpRespMsg();
+        // 获取当前用户的公司ID
+        String token = request.getHeader("TOKEN");
+        User currentUser = userService.getById(token);
+        Integer companyId = currentUser != null ? currentUser.getCompanyId() : null;
+
+        // 解析 userId 对应的 corpwxUserid
+        String corpwxUserid = null;
+        if (!StringUtils.isEmpty(userId)) {
+            User u = userMapper.selectById(userId);
+            if (u != null) {
+                corpwxUserid = u.getCorpwxUserid();
+            }
+        }
+
+        // 根据 departmentId 解析部门下所有人员的 corpwxUserids
+        boolean noRecords = false;
+        List<String> corpwxUserids = null;
+        if (departmentId != null) {
+            List<Department> allDepts = departmentService.list(new QueryWrapper<Department>().eq("company_id", departmentId));
+            List<Integer> deptIds = departmentService.getDeptIncludeSubDeptIds(departmentId, allDepts);
+            if (deptIds.size() > 0) {
+                List<User> deptUsers = userMapper.selectList(new QueryWrapper<User>().in("department_id", deptIds));
+                if (deptUsers.size() > 0) {
+                    corpwxUserids = deptUsers.stream().map(User::getCorpwxUserid).collect(Collectors.toList());
+                } else {
+                    noRecords = true;
+                }
+            } else {
+                noRecords = true;
+            }
+        }
+
+        // 通过 SQL GROUP BY + SUM 在数据库层面完成聚合,直接返回全部数据
+        List<OvertimeAllowance> list = overtimeAllowanceService.getSummaryList(companyId, isAllowance, corpwxUserid, corpwxUserids, noRecords, startDate, endDate);
+
+        // 补充用户信息(userName、jobNumber、departmentName)和申请加班时长
+        if (companyId != null && !list.isEmpty()) {
+            // 查询公司所有用户
+            List<User> userList = userService.list(new QueryWrapper<User>().eq("company_id", companyId));
+            Map<String, User> userMap = userList.stream()
+                    .filter(u -> !StringUtils.isEmpty(u.getCorpwxUserid()))
+                    .collect(Collectors.toMap(User::getCorpwxUserid, u -> u, (u1, u2) -> u1));
+
+            // 查询公司所有部门
+            List<Department> departmentList = departmentService.list(new QueryWrapper<Department>().eq("company_id", companyId));
+            Map<Integer, Department> departmentMap = departmentList.stream()
+                    .collect(Collectors.toMap(Department::getDepartmentId, d -> d, (d1, d2) -> d1));
+
+            // 非餐补模式:按人员汇总申请加班时长
+            List<UserCorpwxTime> userCorpwxTimes = null;
+            if (!isAllowance) {
+                userCorpwxTimes = userCorpwxTimeService.list(new QueryWrapper<UserCorpwxTime>()
+                        .eq("company_id", companyId)
+                        .between("create_date", startDate, endDate));
+            }
+
+            for (OvertimeAllowance allowance : list) {
+                if (!StringUtils.isEmpty(allowance.getCorpwxUserid())) {
+                    User user = userMap.get(allowance.getCorpwxUserid());
+                    if (user != null) {
+                        allowance.setUserName(user.getName());
+                        allowance.setJobNumber(user.getJobNumber());
+                        if (user.getDepartmentId() != null) {
+                            Department department = departmentMap.get(user.getDepartmentId());
+                            if (department != null) {
+                                allowance.setDepartmentName(department.getDepartmentName());
+                            }
+                        }
+                    }
+                    // 合计该人员在日期范围内的申请加班时长
+                    if (!isAllowance && userCorpwxTimes != null) {
+                        final String cuid = allowance.getCorpwxUserid();
+                        double totalApply = userCorpwxTimes.stream()
+                                .filter(t -> cuid.equals(t.getCorpwxUserid()))
+                                .mapToDouble(t -> t.getOtTime() != null ? t.getOtTime() : 0.0)
+                                .sum();
+                        allowance.setApplyOvertimeDuration(totalApply);
+                    }
+                }
+            }
+        }
+
+        msg.data = list;
+        return msg;
+    }
+
+    /**
+     * 导出按人员合计统计餐补数据
+     * @param userId 用户ID
+     * @param departmentId 部门ID
+     * @param startDate 开始日期
+     * @param endDate 结束日期
+     * @param isAllowance 是否餐补模式
+     * @return Excel文件下载路径
+     */
+    @RequestMapping("/exportSummaryList")
+    public HttpRespMsg exportSummaryList(
+            String userId,
+            Integer departmentId,
+            String startDate,
+            String endDate,
+            @RequestParam(required = false, defaultValue = "true") Boolean isAllowance) {
+        HttpRespMsg msg = new HttpRespMsg();
+        try {
+            // 获取当前用户的公司ID
+            String token = request.getHeader("TOKEN");
+            User currentUser = userService.getById(token);
+            Integer companyId = currentUser != null ? currentUser.getCompanyId() : null;
+
+            // 解析 userId 对应的 corpwxUserid
+            String corpwxUserid = null;
+            if (!StringUtils.isEmpty(userId)) {
+                User u = userMapper.selectById(userId);
+                if (u != null) {
+                    corpwxUserid = u.getCorpwxUserid();
+                }
+            }
+
+            // 根据 departmentId 解析部门下所有人员的 corpwxUserids
+            boolean noRecords = false;
+            List<String> corpwxUserids = null;
+            if (departmentId != null) {
+                List<Department> allDepts = departmentService.list(new QueryWrapper<Department>().eq("company_id", departmentId));
+                List<Integer> deptIds = departmentService.getDeptIncludeSubDeptIds(departmentId, allDepts);
+                if (deptIds.size() > 0) {
+                    List<User> deptUsers = userMapper.selectList(new QueryWrapper<User>().in("department_id", deptIds));
+                    if (deptUsers.size() > 0) {
+                        corpwxUserids = deptUsers.stream().map(User::getCorpwxUserid).collect(Collectors.toList());
+                    } else {
+                        noRecords = true;
+                    }
+                } else {
+                    noRecords = true;
+                }
+            }
+
+            // 通过 SQL GROUP BY + SUM 在数据库层面完成聚合,返回全部数据
+            List<OvertimeAllowance> list = overtimeAllowanceService.getSummaryList(companyId, isAllowance, corpwxUserid, corpwxUserids, noRecords, startDate, endDate);
+
+            // 补充用户信息(userName、jobNumber、departmentName)和申请加班时长
+            if (companyId != null && !list.isEmpty()) {
+                List<User> userList = userService.list(new QueryWrapper<User>().eq("company_id", companyId));
+                Map<String, User> userMap = userList.stream()
+                        .filter(u -> !StringUtils.isEmpty(u.getCorpwxUserid()))
+                        .collect(Collectors.toMap(User::getCorpwxUserid, u -> u, (u1, u2) -> u1));
+
+                List<Department> departmentList = departmentService.list(new QueryWrapper<Department>().eq("company_id", companyId));
+                Map<Integer, Department> departmentMap = departmentList.stream()
+                        .collect(Collectors.toMap(Department::getDepartmentId, d -> d, (d1, d2) -> d1));
+
+                List<UserCorpwxTime> userCorpwxTimes = null;
+                if (!isAllowance) {
+                    userCorpwxTimes = userCorpwxTimeService.list(new QueryWrapper<UserCorpwxTime>()
+                            .eq("company_id", companyId)
+                            .between("create_date", startDate, endDate));
+                }
+
+                for (OvertimeAllowance allowance : list) {
+                    if (!StringUtils.isEmpty(allowance.getCorpwxUserid())) {
+                        User user = userMap.get(allowance.getCorpwxUserid());
+                        if (user != null) {
+                            allowance.setUserName(user.getName());
+                            allowance.setJobNumber(user.getJobNumber());
+                            if (user.getDepartmentId() != null) {
+                                Department department = departmentMap.get(user.getDepartmentId());
+                                if (department != null) {
+                                    allowance.setDepartmentName(department.getDepartmentName());
+                                }
+                            }
+                        }
+                        if (!isAllowance && userCorpwxTimes != null) {
+                            final String cuid = allowance.getCorpwxUserid();
+                            double totalApply = userCorpwxTimes.stream()
+                                    .filter(t -> cuid.equals(t.getCorpwxUserid()))
+                                    .mapToDouble(t -> t.getOtTime() != null ? t.getOtTime() : 0.0)
+                                    .sum();
+                            allowance.setApplyOvertimeDuration(totalApply);
+                        }
+                    }
+                }
+            }
+
+            // 准备导出数据
+            List<List<String>> allData = new ArrayList<>();
+
+            // 添加表头
+            List<String> headers = new ArrayList<>();
+            headers.add("员工姓名");
+            headers.add("员工工号");
+            headers.add("部门");
+            if (isAllowance) {
+                headers.add("在岗时长合计(小时)");
+                headers.add("有效工作时长合计(小时)");
+                headers.add("实际加班时长合计(小时)");
+                headers.add("补贴合计(元)");
+            } else {
+                headers.add("考勤时长合计(小时)");
+                headers.add("有效工作时长合计(小时)");
+                headers.add("考勤加班时长合计(小时)");
+                headers.add("申请加班时长合计(小时)");
+            }
+            allData.add(headers);
+
+            // 添加数据行
+            for (OvertimeAllowance allowance : list) {
+                List<String> row = new ArrayList<>();
+                row.add(allowance.getUserName() != null ? "$userName=" + allowance.getUserName() + "$" : "");
+                row.add(allowance.getJobNumber() != null ? allowance.getJobNumber() : "");
+                row.add(allowance.getDepartmentName() != null ? "$departmentName=" + allowance.getDepartmentName() + "$" : "");
+                row.add(allowance.getOnDutyHours() != null ? String.valueOf(allowance.getOnDutyHours()) : "0");
+                row.add(allowance.getWorkHours() != null ? String.valueOf(allowance.getWorkHours()) : "0");
+                row.add(allowance.getOvertimeDuration() != null ? String.valueOf(allowance.getOvertimeDuration()) : "0");
+                if (isAllowance) {
+                    row.add(allowance.getAllowance() != null ? String.valueOf(allowance.getAllowance()) : "0");
+                } else {
+                    row.add(allowance.getApplyOvertimeDuration() != null ? String.valueOf(allowance.getApplyOvertimeDuration()) : "0");
+                }
+                allData.add(row);
+            }
+
+            // 获取企业微信和钉钉信息
+            WxCorpInfo wxCorpInfo = null;
+            CompanyDingding dingding = null;
+            if (companyId != null) {
+                wxCorpInfo = wxCorpInfoService.getOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+                dingding = companyDingdingService.getOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
+            }
+
+            // 生成文件名
+            String fileName = isAllowance ? "餐补汇总_" + System.currentTimeMillis() : "加班汇总_" + System.currentTimeMillis();
+
+            // 导出Excel
+            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo, dingding, fileName, allData, path);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            msg.setError("导出失败:" + e.getMessage());
+            return msg;
+        }
+    }
+
     /**
     /**
      * 导出餐补列表
      * 导出餐补列表
      * @param userId 用户ID
      * @param userId 用户ID

+ 0 - 467
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/OvertimeAllowanceController.java~

@@ -1,467 +0,0 @@
-package com.management.platform.controller;
-
-
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.management.platform.entity.*;
-import com.management.platform.mapper.UserMapper;
-import com.management.platform.service.*;
-import com.management.platform.util.HttpRespMsg;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.util.StringUtils;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
-
-import javax.annotation.Resource;
-import javax.servlet.http.HttpServletRequest;
-import java.time.LocalDate;
-import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-
-/**
- * <p>
- *  前端控制器
- * </p>
- *
- * @author Seyason
- * @since 2026-03-09
- */
-@RestController
-@RequestMapping("/overtime-allowance")
-public class OvertimeAllowanceController {
-
-    @Resource
-    private OvertimeAllowanceService overtimeAllowanceService;
-
-    @Resource
-    private UserService userService;
-
-    @Resource
-    private DepartmentService departmentService;
-
-    @Resource
-    private HttpServletRequest request;
-
-    @Resource
-    private ExcelExportService excelExportService;
-
-    @Resource
-    private WxCorpInfoService wxCorpInfoService;
-
-    @Resource
-    private CompanyDingdingService companyDingdingService;
-
-    @Resource
-    UserCorpwxTimeService userCorpwxTimeService;
-
-    @Value(value = "${upload.path}")
-    private String path;
-    private UserMapper userMapper;
-
-    /**
-     * 获取餐补列表
-     * @param userId 用户ID
-     * @param departmentId 部门ID
-     * @param startDate 开始日期
-     * @param endDate 结束日期
-     * @param pageIndex 页码
-     * @param pageSize 每页大小
-     * @return 分页查询结果
-     */
-    @RequestMapping("/getList")
-    public HttpRespMsg getList(
-            String userId,
-            Integer departmentId,
-            String startDate,
-            String endDate,
-            @RequestParam(required = false, defaultValue = "true" ) Boolean isAllowance,
-            @RequestParam Integer pageIndex,
-            @RequestParam Integer pageSize) {
-        HttpRespMsg msg = new HttpRespMsg();
-        // 获取当前用户的公司ID
-        String token = request.getHeader("TOKEN");
-        User currentUser = userService.getById(token);
-        Integer companyId = currentUser != null ? currentUser.getCompanyId() : null;
-
-        QueryWrapper<OvertimeAllowance> queryWrapper = new QueryWrapper<OvertimeAllowance>().eq("company_id", companyId);
-        if (isAllowance) {
-            queryWrapper.ge("type", 0);
-        } else {
-            //只取考勤加班的数据,type=-1或者白班加班,周末加班
-            queryWrapper.and(w->w.eq("type", -1).or().eq("type", 0).or().eq("type", 1).or().eq("type", 4));
-        }
-
-        // 根据userId查询
-        if (!StringUtils.isEmpty(userId)) {
-            queryWrapper.eq("corpwx_userid", userMapper.selectById(userId).getCorpwxUserid());
-        }
-
-        // 根据departmentId查询(如果需要关联部门表,可能需要调整)
-        boolean noRecords = false;
-        if (departmentId != null) {
-            // 部门以及子部门
-            List<Department> allDepts = departmentService.list(new QueryWrapper<Department>().eq("company_id", departmentId));
-            List<Integer> deptIds = departmentService.getDeptIncludeSubDeptIds(departmentId, allDepts);
-            if (deptIds.size() > 0) {
-                List<User> deptUsers = userMapper.selectList(new QueryWrapper<User>().in("department_id", deptIds));
-                if (deptUsers.size() > 0) {
-                    List<String> corpwxUserIds = deptUsers.stream().map(User::getCorpwxUserid).collect(Collectors.toList());
-                    queryWrapper.in("corpwx_userid", corpwxUserIds);
-                } else {
-                    noRecords = true;
-                }
-            } else {
-                noRecords = true;
-            }
-        }
-        if (noRecords) {
-            queryWrapper.eq("id", -1);
-        }
-        
-        // 根据日期范围查询
-        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
-        if (!StringUtils.isEmpty(startDate)) {
-            LocalDate start = LocalDate.parse(startDate, formatter);
-            queryWrapper.ge("date", start);
-        }
-        if (!StringUtils.isEmpty(endDate)) {
-            LocalDate end = LocalDate.parse(endDate, formatter);
-            queryWrapper.le("date", end);
-        }
-        
-        // 按日期降序排列
-        queryWrapper.orderByDesc("date");
-        
-        // 分页查询
-        IPage<OvertimeAllowance> iPage = overtimeAllowanceService.page(
-                new Page<>(pageIndex, pageSize), 
-                queryWrapper);
-        
-        List<OvertimeAllowance> list = iPage.getRecords();
-        Long total = iPage.getTotal();
-        
-
-        // 查询整个公司的用户列表和部门列表
-        if (companyId != null && !list.isEmpty()) {
-            // 查询公司所有用户
-            QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
-            userQueryWrapper.eq("company_id", companyId);
-            List<User> userList = userService.list(userQueryWrapper);
-            
-            // 创建用户映射表,key为corpwxUserid
-            Map<String, User> userMap = userList.stream()
-                    .filter(u -> !StringUtils.isEmpty(u.getCorpwxUserid()))
-                    .collect(Collectors.toMap(User::getCorpwxUserid, u -> u, (u1, u2) -> u1));
-            
-            // 查询公司所有部门
-            QueryWrapper<Department> deptQueryWrapper = new QueryWrapper<>();
-            deptQueryWrapper.eq("company_id", companyId);
-            List<Department> departmentList = departmentService.list(deptQueryWrapper);
-            
-            // 创建部门映射表,key为departmentId
-            Map<Integer, Department> departmentMap = departmentList.stream()
-                    .collect(Collectors.toMap(Department::getDepartmentId, d -> d, (d1, d2) -> d1));
-            List<UserCorpwxTime> userCorpwxTimes = null;
-            if (!isAllowance) {
-                userCorpwxTimes = userCorpwxTimeService.list(new QueryWrapper<UserCorpwxTime>().eq("company_id", companyId).between("create_date", startDate, endDate));
-            }
-            // 遍历餐补列表,设置userName、jobNumber和departmentName
-            for (OvertimeAllowance allowance : list) {
-                if (!StringUtils.isEmpty(allowance.getCorpwxUserid())) {
-                    User user = userMap.get(allowance.getCorpwxUserid());
-                    if (user != null) {
-                        // 设置用户名称
-                        allowance.setUserName(user.getName());
-                        
-                        // 设置员工工号
-                        allowance.setJobNumber(user.getJobNumber());
-                        
-                        // 通过用户的departmentId查找部门名称
-                        if (user.getDepartmentId() != null) {
-                            Department department = departmentMap.get(user.getDepartmentId());
-                            if (department != null) {
-                                allowance.setDepartmentName(department.getDepartmentName());
-                            }
-                        }
-                    }
-                    //设置加班时长
-                    if (!isAllowance) {
-                        if (userCorpwxTimes != null) {
-                            for (UserCorpwxTime userCorpwxTime : userCorpwxTimes) {
-                                if (userCorpwxTime.getCorpwxUserid().equals(allowance.getCorpwxUserid()) && userCorpwxTime.getCreateDate().equals(allowance.getDate())) {
-                                    allowance.setApplyOvertimeDuration(userCorpwxTime.getOtTime());
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-        
-        Map<String, Object> map = new HashMap<>();
-        map.put("records", list);
-        map.put("total", total);
-        map.put("size", pageSize);
-        map.put("current", pageIndex);
-        
-        msg.data = map;
-        return msg;
-    }
-
-    /**
-     * 导出餐补列表
-     * @param userId 用户ID
-     * @param departmentId 部门ID
-     * @param startDate 开始日期
-     * @param endDate 结束日期
-     * @return Excel文件下载路径
-     */
-    @RequestMapping("/export")
-    public HttpRespMsg export(
-            String userId,
-            Integer departmentId,
-            @RequestParam(required = false, defaultValue = "true" ) Boolean isAllowance,
-            String startDate,
-            String endDate) {
-        HttpRespMsg msg = new HttpRespMsg();
-        // 获取当前用户的公司ID
-        String token = request.getHeader("TOKEN");
-        User currentUser = userService.getById(token);
-        Integer companyId = currentUser != null ? currentUser.getCompanyId() : null;
-
-        try {
-            QueryWrapper<OvertimeAllowance> queryWrapper = new QueryWrapper<OvertimeAllowance>().eq("company_id", companyId);
-            if (isAllowance) {
-                queryWrapper.ge("type", 0);
-            } else {
-                //只取考勤加班的数据
-                queryWrapper.eq("type", -1);
-            }
-            // 根据userId查询
-            if (!StringUtils.isEmpty(userId)) {
-                queryWrapper.eq("corpwx_userid", userId);
-            }
-
-            // 根据departmentId查询(如果需要关联部门表,可能需要调整)
-            boolean noRecords = false;
-            if (departmentId != null) {
-                // 部门以及子部门
-                List<Department> allDepts = departmentService.list(new QueryWrapper<Department>().eq("company_id", departmentId));
-                List<Integer> deptIds = departmentService.getDeptIncludeSubDeptIds(departmentId, allDepts);
-                if (deptIds.size() > 0) {
-                    List<User> deptUsers = userMapper.selectList(new QueryWrapper<User>().in("department_id", deptIds));
-                    if (deptUsers.size() > 0) {
-                        List<String> corpwxUserIds = deptUsers.stream().map(User::getCorpwxUserid).collect(Collectors.toList());
-                        queryWrapper.in("corpwx_userid", corpwxUserIds);
-                    } else {
-                        noRecords = true;
-                    }
-                } else {
-                    noRecords = true;
-                }
-            }
-            if (noRecords) {
-                queryWrapper.eq("id", -1);
-            }
-
-            // 根据日期范围查询
-            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
-            if (!StringUtils.isEmpty(startDate)) {
-                LocalDate start = LocalDate.parse(startDate, formatter);
-                queryWrapper.ge("date", start);
-            }
-            if (!StringUtils.isEmpty(endDate)) {
-                LocalDate end = LocalDate.parse(endDate, formatter);
-                queryWrapper.le("date", end);
-            }
-            
-            // 按日期降序排列
-            queryWrapper.orderByDesc("date");
-            
-            // 查询全部数据(不分页)
-            List<OvertimeAllowance> list = overtimeAllowanceService.list(queryWrapper);
-
-
-            // 查询整个公司的用户列表和部门列表
-            if (companyId != null && !list.isEmpty()) {
-                // 查询公司所有用户
-                QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
-                userQueryWrapper.eq("company_id", companyId);
-                List<User> userList = userService.list(userQueryWrapper);
-                
-                // 创建用户映射表,key为corpwxUserid
-                Map<String, User> userMap = userList.stream()
-                        .filter(u -> !StringUtils.isEmpty(u.getCorpwxUserid()))
-                        .collect(Collectors.toMap(User::getCorpwxUserid, u -> u, (u1, u2) -> u1));
-                
-                // 查询公司所有部门
-                QueryWrapper<Department> deptQueryWrapper = new QueryWrapper<>();
-                deptQueryWrapper.eq("company_id", companyId);
-                List<Department> departmentList = departmentService.list(deptQueryWrapper);
-                
-                // 创建部门映射表,key为departmentId
-                Map<Integer, Department> departmentMap = departmentList.stream()
-                        .collect(Collectors.toMap(Department::getDepartmentId, d -> d, (d1, d2) -> d1));
-                List<UserCorpwxTime> userCorpwxTimeList = !isAllowance ? userCorpwxTimeService.list(new QueryWrapper<UserCorpwxTime>().eq("company_id", companyId).between("create_date", startDate, endDate)): null;
-                // 遍历餐补列表,设置userName、jobNumber和departmentName
-                for (OvertimeAllowance allowance : list) {
-                    if (!StringUtils.isEmpty(allowance.getCorpwxUserid())) {
-                        User user = userMap.get(allowance.getCorpwxUserid());
-                        if (user != null) {
-                            // 设置用户名称
-                            allowance.setUserName(user.getName());
-                            
-                            // 设置员工工号
-                            allowance.setJobNumber(user.getJobNumber());
-                            
-                            // 通过用户的departmentId查找部门名称
-                            if (user.getDepartmentId() != null) {
-                                Department department = departmentMap.get(user.getDepartmentId());
-                                if (department != null) {
-                                    allowance.setDepartmentName(department.getDepartmentName());
-                                }
-                            }
-                        }
-                        if (!isAllowance) {
-                            for (UserCorpwxTime userCorpwxTime : userCorpwxTimeList) {
-                                if (userCorpwxTime.getCorpwxUserid().equals(allowance.getCorpwxUserid()) && userCorpwxTime.getCreateDate().equals(allowance.getDate())) {
-                                    allowance.setApplyOvertimeDuration(userCorpwxTime.getOtTime());
-                                    break;
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-            
-            // 准备导出数据
-            List<List<String>> allData = new ArrayList<>();
-            
-            // 添加表头
-            List<String> headers = new ArrayList<>();
-            headers.add("员工姓名");
-            headers.add("员工工号");
-            headers.add("部门");
-            headers.add("工作日期");
-            headers.add("上班时间");
-            headers.add("下班时间");
-            if (isAllowance) {
-                headers.add("在岗时长(小时)");
-            } else {
-                headers.add("考勤时长(小时)");
-            }
-            headers.add("有效工作时长(小时)");
-            if (isAllowance) {
-                headers.add("实际加班时长(小时)");
-                headers.add("班次");
-                headers.add("是否跨凌晨");
-                headers.add("补贴(元)");
-                headers.add("补贴说明");
-            } else {
-                headers.add("考勤加班时长(小时)");
-                headers.add("班次");
-                headers.add("申请加班时长");
-                headers.add("有效加班时长");
-            }
-            allData.add(headers);
-            
-            // 添加数据行
-            DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
-            DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
-            
-            for (OvertimeAllowance allowance : list) {
-                List<String> row = new ArrayList<>();
-                row.add(allowance.getUserName() != null ? "$userName="+allowance.getUserName()+"$" : "");
-                row.add(allowance.getJobNumber() != null ? allowance.getJobNumber() : "");
-                row.add(allowance.getDepartmentName() != null ? "$departmentName="+allowance.getDepartmentName() +"$": "");
-                row.add(allowance.getDate() != null ? allowance.getDate().format(dateFormatter) : "");
-                row.add(allowance.getStartTime() != null ? allowance.getStartTime().format(timeFormatter) : "");
-                row.add(allowance.getEndTime() != null ? allowance.getEndTime().format(timeFormatter) : "");
-                row.add(allowance.getOnDutyHours() != null ? String.valueOf(allowance.getOnDutyHours()) : "0");
-                row.add(allowance.getWorkHours() != null ? String.valueOf(allowance.getWorkHours()) : "0");
-                row.add(allowance.getOvertimeDuration() != null ? String.valueOf(allowance.getOvertimeDuration()) : "0");
-                String typeStr = "";
-                String crossMidnightStr = "";
-                String comment = "";
-                if (allowance.getType() != null) {
-                    switch (allowance.getType()) {
-                        case 0:
-                            typeStr = "白班";
-                            crossMidnightStr = "否";
-                            comment = "工作日加班≥ 3 小时,餐补 20 元";
-                            break;
-                        case 1:
-                            typeStr = "白班";
-                            crossMidnightStr = "是";
-                            comment = "加班跨凌晨,餐补 30 元";
-                            break;
-                        case 2:
-                            typeStr = "小夜班";
-                            crossMidnightStr = "是";
-                            comment = "小夜班,补贴 30 元";
-                            break;
-                        case 3:
-                            typeStr = "大夜班";
-                            crossMidnightStr = "是";
-                            comment = "大夜班,补贴 50 元";
-                            break;
-                        case 4:
-                            typeStr = "全天加班";
-                            crossMidnightStr = "否";
-                            comment = "全天加班";
-                            break;
-                        default:
-                            comment = String.valueOf(allowance.getType());
-                    }
-                }
-                row.add(typeStr);
-                if (isAllowance) {
-                    row.add(crossMidnightStr);
-                    row.add(allowance.getAllowance() != null ? String.valueOf(allowance.getAllowance()) : "0");
-                    row.add(comment);
-                } else {
-                    //申请加班时长
-                    row.add(allowance.getApplyOvertimeDuration() != null ? String.valueOf(allowance.getApplyOvertimeDuration()) : "0");
-                    //实际加班时长,以考勤加班时长为准,不足时,提示补交加班申请
-                    if (allowance.getOvertimeDuration() != null) {
-                        if (allowance.getOvertimeDuration() > allowance.getApplyOvertimeDuration()) {
-                            row.add("需补加班申请");
-                        } else {
-                            row.add(allowance.getOvertimeDuration() != null ? String.valueOf(allowance.getOvertimeDuration()) : "0");
-                        }
-                    }
-                }
-
-//                row.add(allowance.getSpNo() != null ? allowance.getSpNo() : "");
-                allData.add(row);
-            }
-            
-            // 获取企业微信和钉钉信息
-            WxCorpInfo wxCorpInfo = null;
-            CompanyDingding dingding = null;
-            if (companyId != null) {
-                wxCorpInfo = wxCorpInfoService.getOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
-                dingding = companyDingdingService.getOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
-            }
-            
-            // 生成文件名
-            String fileName = isAllowance?"餐补列表_" + System.currentTimeMillis():"加班列表_" + System.currentTimeMillis();
-            
-            // 导出Excel
-            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo, dingding, fileName, allData, path);
-            
-        } catch (Exception e) {
-            e.printStackTrace();
-            msg.setError("导出失败:" + e.getMessage());
-            return msg;
-        }
-    }
-
-}
-

+ 419 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/OvertimeController.java

@@ -1,10 +1,33 @@
 package com.management.platform.controller;
 package com.management.platform.controller;
 
 
 
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.management.platform.entity.Department;
+import com.management.platform.entity.Overtime;
+import com.management.platform.entity.User;
+import com.management.platform.mapper.DepartmentMapper;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.OvertimeService;
+import com.management.platform.service.SysFunctionService;
+import com.management.platform.service.UserService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
-
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.bind.annotation.RestController;
 
 
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
 /**
 /**
  * <p>
  * <p>
  *  前端控制器
  *  前端控制器
@@ -17,5 +40,399 @@ import org.springframework.web.bind.annotation.RestController;
 @RequestMapping("/overtime")
 @RequestMapping("/overtime")
 public class OvertimeController {
 public class OvertimeController {
 
 
-}
+    @Resource
+    private OvertimeService overtimeService;
+
+    @Resource
+    private UserService userService;
+
+    @Resource
+    private HttpServletRequest request;
+    @Autowired
+    private SysFunctionService sysFunctionService;
+    @Autowired
+    private DepartmentMapper departmentMapper;
+    @Autowired
+    private UserMapper userMapper;
+
+    /**
+     * 分页查询加班列表
+     *
+     * @param userId     用户ID(可选,按用户过滤)
+     * @param startDate  开始日期(可选,格式 yyyy-MM-dd)
+     * @param endDate    结束日期(可选,格式 yyyy-MM-dd)
+     * @param status     审批状态(可选:0-待部门审核,1-待HR审核,2-审核通过,3-审核驳回)
+     * @param pageIndex  页码(从1开始)
+     * @param pageSize   每页大小
+     * @return 分页查询结果
+     */
+    @RequestMapping("/getList")
+    public HttpRespMsg getList(
+            String userId,
+            String startDate,
+            String endDate,
+            Integer status,
+            @RequestParam Integer pageIndex,
+            @RequestParam Integer pageSize) {
+        HttpRespMsg msg = new HttpRespMsg();
+        // 获取当前用户的公司ID
+        String token = request.getHeader("TOKEN");
+        User currentUser = userService.getById(token);
+        Integer companyId = currentUser != null ? currentUser.getCompanyId() : null;
+        boolean canViewAll =sysFunctionService.hasPriviledge(currentUser.getRoleId(), "查看全部加班单");
+        QueryWrapper<Overtime> queryWrapper = new QueryWrapper<Overtime>()
+                .eq("company_id", companyId);
+
+        // 按用户过滤
+        if (!StringUtils.isEmpty(userId)) {
+            queryWrapper.eq("user_id", userId);
+        }
+
+        // 按审批状态过滤
+        if (status != null) {
+            queryWrapper.eq("status", status);
+        }
+
+        // 按日期范围过滤
+        if (!StringUtils.isEmpty(startDate)) {
+            queryWrapper.ge("date", startDate);
+        }
+        if (!StringUtils.isEmpty(endDate)) {
+            queryWrapper.le("date", endDate);
+        }
+        if (!canViewAll) {
+            //默认只能看到自己或者本人负责的部门下的员工的
+            List<String> userIds = new ArrayList<>();
+            userIds.add(currentUser.getId());
+            List<Department> deptList = departmentMapper.selectList(
+                    new QueryWrapper<Department>().eq("company_id", companyId).eq("manager_id", currentUser.getId()));
+            if (deptList.size() > 0) {
+                List<User> deptUsers = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId).in("department_id", deptList.stream().map(Department::getDepartmentId).collect(Collectors.toList())));
+                if (deptUsers.size() > 0) {
+                    userIds.addAll(deptUsers.stream().map(User::getId).collect(Collectors.toList()));
+                }
+            }
+            queryWrapper.in("user_id", userIds);
+        }
+
+        // 按日期降序排列
+        queryWrapper.orderByDesc("date");
+
+        // 分页查询
+        IPage<Overtime> iPage = overtimeService.page(new Page<>(pageIndex, pageSize), queryWrapper);
+        List<Overtime> retList = iPage.getRecords();
+        if (retList.size() > 0) {
+            List<User> userList = userMapper.selectList(new QueryWrapper<User>().select("id, name").in("id", retList.stream().map(Overtime::getUserId).collect(Collectors.toList())));
+            for (Overtime overtime : retList) {
+                for (User user : userList) {
+                    if (user.getId().equals(overtime.getUserId())) {
+                        overtime.setUserName(user.getName());
+                        break;
+                    }
+                }
+            }
+        }
+        Map<String, Object> map = new HashMap<>();
+        map.put("records", retList);
+        map.put("total", iPage.getTotal());
+        map.put("size", pageSize);
+        map.put("current", pageIndex);
+
+        msg.data = map;
+        return msg;
+    }
+
+    /**
+     * 分页查询加班列表
+     *
+     * @param userId     用户ID(可选,按用户过滤)
+     * @param startDate  开始日期(可选,格式 yyyy-MM-dd)
+     * @param endDate    结束日期(可选,格式 yyyy-MM-dd)
+     * @param pageIndex  页码(从1开始)
+     * @param pageSize   每页大小
+     * @return 分页查询结果
+     */
+    @RequestMapping("/getAuditList")
+    public HttpRespMsg getAuditList(
+            String userId,
+            String startDate,
+            String endDate,
+            @RequestParam Integer pageIndex,
+            @RequestParam Integer pageSize) {
+        HttpRespMsg msg = new HttpRespMsg();
+        // 获取当前用户的公司ID
+        String token = request.getHeader("TOKEN");
+        User currentUser = userService.getById(token);
+        boolean hasPriviledgeOne = sysFunctionService.hasPriviledge(currentUser.getRoleId(), "一级审核");
+        boolean hasPriviledgeTwo = sysFunctionService.hasPriviledge(currentUser.getRoleId(), "二级审核");
+        Integer companyId = currentUser != null ? currentUser.getCompanyId() : null;
+
+        QueryWrapper<Overtime> queryWrapper = new QueryWrapper<Overtime>()
+                .eq("company_id", companyId);
+
+        // 按用户过滤
+        if (!StringUtils.isEmpty(userId)) {
+            queryWrapper.eq("user_id", userId);
+        }
 
 
+        // 按审批状态过滤
+        if (hasPriviledgeOne || hasPriviledgeTwo) {
+            final List<String> userIds = new ArrayList<>();
+            userIds.add("-1");
+            if (hasPriviledgeOne && hasPriviledgeTwo) {
+                List<Department> deptList = departmentMapper.selectList(
+                        new QueryWrapper<Department>().eq("company_id", companyId).eq("manager_id", currentUser.getId()));
+                if (deptList.size() > 0) {
+                    List<User> deptUsers = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId).in("department_id", deptList.stream().map(Department::getDepartmentId).collect(Collectors.toList())));
+                    if (deptUsers.size() > 0) {
+                        userIds.addAll(deptUsers.stream().map(User::getId).collect(Collectors.toList()));
+                    }
+                }
+                queryWrapper.and(wrapper -> wrapper.eq("status", 1).or(statusWrapper -> statusWrapper.eq("status", 0).in("user_id", userIds)));
+            } else if (hasPriviledgeOne) {
+                queryWrapper.eq("status", 0);
+                //按部门下属人员过滤
+                List<Department> deptList = departmentMapper.selectList(
+                        new QueryWrapper<Department>().eq("company_id", companyId).eq("manager_id", currentUser.getId()));
+                if (deptList.size() > 0) {
+                    List<User> deptUsers = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId).in("department_id", deptList.stream().map(Department::getDepartmentId).collect(Collectors.toList())));
+                    if (deptUsers.size() > 0) {
+                        userIds.addAll(deptUsers.stream().map(User::getId).collect(Collectors.toList()));
+                    }
+                }
+                queryWrapper.in("user_id", userIds);
+            } else if (hasPriviledgeTwo) {
+                queryWrapper.eq("status", 1);
+            }
+
+        } else {
+            //没有审核权限
+            msg.setError("您没有审核权限");
+            return msg;
+        }
+
+        // 按日期范围过滤
+        if (!StringUtils.isEmpty(startDate)) {
+            queryWrapper.ge("date", startDate);
+        }
+        if (!StringUtils.isEmpty(endDate)) {
+            queryWrapper.le("date", endDate);
+        }
+
+        // 按日期降序排列
+        queryWrapper.orderByDesc("date");
+
+        // 分页查询
+        IPage<Overtime> iPage = overtimeService.page(new Page<>(pageIndex, pageSize), queryWrapper);
+        List<Overtime> retList = iPage.getRecords();
+        if (retList.size() > 0) {
+            List<User> userList = userMapper.selectList(new QueryWrapper<User>().select("id, name").in("id", retList.stream().map(Overtime::getUserId).collect(Collectors.toList())));
+            for (Overtime overtime : retList) {
+                for (User user : userList) {
+                    if (user.getId().equals(overtime.getUserId())) {
+                        overtime.setUserName(user.getName());
+                        break;
+                    }
+                }
+            }
+        }
+        Map<String, Object> map = new HashMap<>();
+        map.put("records", retList);
+        map.put("total", iPage.getTotal());
+        map.put("size", pageSize);
+        map.put("current", pageIndex);
+
+        msg.data = map;
+        return msg;
+    }
+
+    /**
+     * 根据ID获取加班记录详情
+     *
+     * @param id 加班记录ID
+     * @return 加班记录详情
+     */
+    @RequestMapping("/getById")
+    public HttpRespMsg getById(@RequestParam Integer id) {
+        HttpRespMsg msg = new HttpRespMsg();
+        Overtime overtime = overtimeService.getById(id);
+        if (overtime == null) {
+            msg.setError("加班记录不存在");
+            return msg;
+        }
+        msg.data = overtime;
+        return msg;
+    }
+
+    /**
+     * 新增加班记录
+     *
+     * @param overtime 加班记录对象
+     * @return 操作结果
+     */
+    @RequestMapping("/add")
+    public HttpRespMsg add(Overtime overtime) {
+        HttpRespMsg msg = new HttpRespMsg();
+        // 获取当前用户的公司ID
+        String token = request.getHeader("TOKEN");
+        User currentUser = userService.getById(token);
+        if (currentUser == null) {
+            msg.setError("用户未登录或TOKEN无效");
+            return msg;
+        }
+        //校验是否已经存在交叉的开始结束时间的加班单
+        QueryWrapper<Overtime> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("company_id", currentUser.getCompanyId());
+        queryWrapper.eq("user_id", currentUser.getId());
+        queryWrapper.and(wrapper -> wrapper.between("start_time", overtime.getStartTime(), overtime.getEndTime()).or().between("end_time", overtime.getStartTime(), overtime.getEndTime()));
+        int count = overtimeService.count(queryWrapper);
+        if (count > 0) {
+            msg.setError("已存在交叉的开始结束时间的加班单");
+            return msg;
+        }
+        // 自动填充公司ID
+        overtime.setCompanyId(currentUser.getCompanyId());
+        overtime.setUserId(currentUser.getId());
+        overtime.setApplyerWxUserid(currentUser.getCorpwxUserid());
+        // 默认状态为待部门审核
+        if (overtime.getStatus() == null) {
+            overtime.setStatus(0);
+        }
+        boolean success = overtimeService.save(overtime);
+        if (!success) {
+            msg.setError("新增加班记录失败");
+        }
+        return msg;
+    }
+
+    /**
+     * 修改并提交加班记录
+     *
+     * @param overtime 加班记录对象(需包含id)
+     * @return 操作结果
+     */
+    @RequestMapping("/update")
+    public HttpRespMsg update(Overtime overtime) {
+        HttpRespMsg msg = new HttpRespMsg();
+        if (overtime.getId() == null) {
+            msg.setError("加班记录ID不能为空");
+            return msg;
+        }
+        overtime.setStatus(0);
+        boolean success = overtimeService.updateById(overtime);
+        if (!success) {
+            msg.setError("修改加班记录失败");
+        }
+        return msg;
+    }
+
+    /**
+     * 删除加班记录
+     *
+     * @param id 加班记录ID
+     * @return 操作结果
+     */
+    @RequestMapping("/delete")
+    public HttpRespMsg delete(@RequestParam Integer id) {
+        HttpRespMsg msg = new HttpRespMsg();
+        boolean success = overtimeService.removeById(id);
+        if (!success) {
+            msg.setError("删除加班记录失败");
+        }
+        return msg;
+    }
+
+    /**
+     * 撤回加班申请
+     *
+     * @param id 加班记录ID
+     * @return 操作结果
+     */
+    @RequestMapping("/withdraw")
+    public HttpRespMsg withdraw(@RequestParam Integer id) {
+        HttpRespMsg msg = new HttpRespMsg();
+        Overtime overtime = overtimeService.getById(id);
+        if (overtime == null) {
+            msg.setError("加班记录不存在");
+            return msg;
+        }
+        if (overtime.getStatus() != 0) {
+            msg.setError("该加班申请已经审核,不可撤回");
+            return msg;
+        }
+        overtime.setStatus(-1);
+        boolean success = overtimeService.updateById(overtime);
+        if (!success) {
+            msg.setError("撤回加班申请失败");
+        }
+        return msg;
+    }
+
+    /**
+     * 撤回加班申请
+     *
+     * @param id 加班记录ID
+     * @return 操作结果
+     */
+    @RequestMapping("/withdrawPass")
+    public HttpRespMsg withdrawPass(@RequestParam Integer id) {
+        HttpRespMsg msg = new HttpRespMsg();
+        Overtime overtime = overtimeService.getById(id);
+        if (overtime == null) {
+            msg.setError("加班记录不存在");
+            return msg;
+        }
+        overtime.setStatus(-1);
+        boolean success = overtimeService.updateById(overtime);
+        if (!success) {
+            msg.setError("撤回加班申请失败");
+        }
+        return msg;
+    }
+
+
+    /**
+     * 审批加班记录(更新审批状态)
+     *
+     * @param id         加班记录ID
+     * @param isPass     审批状态(1-审核通过,0-审核驳回)
+     * @param denyReason 驳回原因(驳回时必填)
+     * @return 操作结果
+     */
+    @RequestMapping("/approve")
+    public HttpRespMsg approve(
+            @RequestParam Integer id,
+            @RequestParam Integer isPass,
+            String denyReason) {
+        HttpRespMsg msg = new HttpRespMsg();
+        Overtime overtime = overtimeService.getById(id);
+        if (overtime == null) {
+            msg.setError("加班记录不存在");
+            return msg;
+        }
+        if (overtime.getStatus() == 2) {
+            msg.setError("该加班申请已经审核通过,不可重复操作");
+            return msg;
+        }
+        if (isPass == 1) {
+            if (overtime.getStatus() == 0) {
+                //一级审核
+                overtime.setStatus(1);
+            } else if (overtime.getStatus() == 1) {
+                //二级审核
+                overtime.setStatus(2);//最终审核通过了
+            }
+        } else {
+            overtime.setStatus(3);//驳回
+            if (!StringUtils.isEmpty(denyReason)) {
+                overtime.setDenyReason(denyReason);
+            }
+        }
+        boolean success = overtimeService.updateById(overtime);
+        if (!success) {
+            msg.setError("审批操作失败");
+        }
+        return msg;
+    }
+
+}

+ 0 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java

@@ -11,7 +11,6 @@ import com.management.platform.service.OperationRecordService;
 import com.management.platform.service.ParticipationService;
 import com.management.platform.service.ParticipationService;
 import com.management.platform.service.ProjectMainService;
 import com.management.platform.service.ProjectMainService;
 import com.management.platform.service.ProjectService;
 import com.management.platform.service.ProjectService;
-import com.management.platform.util.DockWithMLD;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.MessageUtils;
 import com.management.platform.util.MessageUtils;
 import com.management.platform.util.SysConstant;
 import com.management.platform.util.SysConstant;

+ 40 - 253
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java

@@ -141,6 +141,8 @@ public class ReportController {
     private MaskWordService maskWordService;
     private MaskWordService maskWordService;
     @Autowired
     @Autowired
     private ReportProjectConstructionMapper reportProjectConstructionMapper;
     private ReportProjectConstructionMapper reportProjectConstructionMapper;
+    @Resource
+    private OvertimeMapper overtimeMapper;
 
 
     //获取任务相关的日报列表
     //获取任务相关的日报列表
     @RequestMapping("/getTaskReportList")
     @RequestMapping("/getTaskReportList")
@@ -1859,6 +1861,39 @@ public class ReportController {
                         }
                         }
                     }
                     }
                 }
                 }
+                //针对羲合超导-合肥,校验加班时长不得超过加班申请单的时长。同理,只要加班申请单有记录就校验。不然不校验。
+                if (Constant.XI_HE_CHAO_DAO_COMPANY_ID == company.getId()) {
+                    //查找当前的填报的加班时长和数据库中的加班时长
+                    if (overtime > 0) {
+                        //存在加班时长的情况下,才去校验
+                        Overtime sumOverTimeApply = overtimeMapper.selectOne(new QueryWrapper<Overtime>().select("sum(duration) duration").eq("date", cDate).eq("user_id", creatorId));
+                        if (sumOverTimeApply != null) {
+                            if (sumOverTimeApply.getDuration() != null) {
+                                if (sumOverTimeApply.getDuration() < overtime*3600) {
+                                    HttpRespMsg httpRespMsg = new HttpRespMsg();
+                                    httpRespMsg.setError("合计加班时长"+overtime+"h不得超过加班申请单的时长"+sumOverTimeApply.getDuration()/3600+"h");
+                                    return httpRespMsg;
+                                } else {
+                                    //去查找数据库中已经填报的加班时长
+                                    Report oldReportSum = reportMapper.selectOne(new QueryWrapper<Report>().select("sum(overtime_hours) as overTime").eq("create_date", cDate).eq("creator_id", creatorId).gt("overtime_hours", 0));
+                                    if (oldReportSum != null) {
+                                        if (oldReportSum.getOvertimeHours() != null) {
+                                            if ((oldReportSum.getOvertimeHours() + overtime) * 3600 > sumOverTimeApply.getDuration()) {
+                                                HttpRespMsg httpRespMsg = new HttpRespMsg();
+                                                httpRespMsg.setError("合计加班时长"+(oldReportSum.getOvertimeHours() + overtime)+"h不得超过加班申请单的时长"+sumOverTimeApply.getDuration()/3600+"h");
+                                                return httpRespMsg;
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        } else {
+                            HttpRespMsg httpRespMsg = new HttpRespMsg();
+                            httpRespMsg.setError(cDate.toString()+"的加班申请单不存在,无法填报加班日报");
+                            return httpRespMsg;
+                        }
+                    }
+                }
 
 
                 //HardCode:对于正北两家公司,校验填报工时不得少于考勤时长。(代填的不校验)
                 //HardCode:对于正北两家公司,校验填报工时不得少于考勤时长。(代填的不校验)
                 if ((SysConstant.ZhengBeiCompIds.contains(company.getId())) && (report.getFillUserid() == null || creatorId.equals(report.getFillUserid()))) {
                 if ((SysConstant.ZhengBeiCompIds.contains(company.getId())) && (report.getFillUserid() == null || creatorId.equals(report.getFillUserid()))) {
@@ -3074,6 +3109,11 @@ public class ReportController {
         return reportService.importNewDataZhengbei(companyId, file, isPass, request);
         return reportService.importNewDataZhengbei(companyId, file, isPass, request);
     }
     }
 
 
+    @RequestMapping("/importNewDataXiHe")
+    public HttpRespMsg importNewDataXiHe(Integer companyId,
+                                             MultipartFile file, HttpServletRequest request) {
+        return reportService.importNewDataXiHe(companyId, file, request);
+    }
     @RequestMapping("/listImportByState")
     @RequestMapping("/listImportByState")
     public HttpRespMsg listDeptImportByState(
     public HttpRespMsg listDeptImportByState(
                                       Integer projectId,
                                       Integer projectId,
@@ -3157,259 +3197,6 @@ public class ReportController {
         return reportService.correctWorkingTime(userIds,startDate,endDate);
         return reportService.correctWorkingTime(userIds,startDate,endDate);
     }
     }
 
 
-    @RequestMapping("/fvTongBu")
-    public void fvTongBu(){
-        List<TimeType> timeTypeList = timeTypeMapper.selectList(new QueryWrapper<TimeType>().eq("sync_fanwei", 1));
-        List<Integer> compIds = timeTypeList.stream().map(TimeType::getCompanyId).collect(Collectors.toList());
-        if(compIds.isEmpty()){
-            return;
-        }
-        for (Integer compId : compIds) {
-            DockWithMLD dockWithMLD=new DockWithMLD();
-            JSONObject jsonObject=new JSONObject();
-            DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
-            DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
-            DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("HH:mm");
-            //需要修改************************************************  日期
-            LocalDateTime yesterday = LocalDateTime.now().minusDays(2);
-            String startDate = dtf.format(yesterday);
-            String endDate = dtf.format(yesterday.plusDays(30));
-            List<UserFvTime> oldUserFvTimeList = userFvTimeService.list(new QueryWrapper<UserFvTime>().eq("company_id", compId));
-            List<LeaveSheet> oldLeaveSheetList = leaveSheetService.list(new QueryWrapper<LeaveSheet>().eq("company_id", compId));
-            List<BusinessTrip> oldBusinessTripList = businessTripService.list(new QueryWrapper<BusinessTrip>().eq("company_id", compId));
-            /*jsonObject.put("startDate",startDate);
-            jsonObject.put("endDate",endDate);*/
-            jsonObject.put("workDate",startDate);
-            jsonObject.put("gmtFinished",startDate);
-            String jsonString = jsonObject.toJSONString();
-            List<UserFvTime> userFvTimeList=new ArrayList<>();
-            List<LeaveSheet> leaveSheetList=new ArrayList<>();
-            List<BusinessTrip> businessTripList=new ArrayList<>();
-            TimeType allDay = timeTypeMapper.selectOne(new QueryWrapper<TimeType>().eq("company_id", compId));
-            List<User> allUserList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", compId));
-            //获取休息设置
-            List<TimeAutoExclude> excludeTimeList = timeAutoExcludeMapper.selectList(new QueryWrapper<TimeAutoExclude>().eq("company_id", compId));
-
-            //Todo: 获取考勤打卡数据
-            HttpRespMsg workDataMsg = dockWithMLD.getResult("http://10.1.10.51:20175/api/cube/restful/interface/getModeDataPageList/getWorkData", jsonString);
-            List<Map<String,Object>> workDataList= (List<Map<String, Object>>) workDataMsg.data;
-            //Todo: 获取外出打卡数据
-            HttpRespMsg outWorkDataMsg = dockWithMLD.getResult("http://10.1.10.51:20175/api/cube/restful/interface/getModeDataPageList/getOutRecord", jsonString);
-            List<Map<String,Object>> outWorkDataList= (List<Map<String, Object>>) outWorkDataMsg.data;
-            //Todo: 获取考勤补卡数据
-            HttpRespMsg replaceWorkDataMsg = dockWithMLD.getResult("http://10.1.10.51:20175/api/cube/restful/interface/getModeDataPageList/getReplaceRecord", jsonString);
-            List<Map<String,Object>> replaceWorkDataList= (List<Map<String, Object>>) replaceWorkDataMsg.data;
-            List<String> userIds = workDataList.stream().map(map -> String.valueOf(map.get("userId"))).distinct().collect(Collectors.toList());
-            List<User> userList = userMapper.selectList(new QueryWrapper<User>().in("job_number", userIds));
-            List<LocalDateTime> dateTimeList = getDays(yesterday, yesterday.plusDays(2));
-            for (User user : userList) {
-                //按当前填报人所属部门或者全公司来匹配
-                excludeTimeList = excludeTimeList.stream().filter(ex->ex.getDId() == null || ex.getDId().equals(user.getDepartmentId())).collect(Collectors.toList());
-
-                for (LocalDateTime localDateTime : dateTimeList) {
-                    LocalDate workDate=localDateTime.toLocalDate();
-                    //当天的考勤记录
-                    List<Map<String, Object>> list = workDataList.stream().filter(wl -> wl.get("userId").equals(user.getJobNumber())&&wl.get("workDate").equals(workDate.format(dtf))).collect(Collectors.toList());
-                    UserFvTime userFvTime=new UserFvTime();
-                    userFvTime.setWorkDate(workDate);
-                    LocalTime startTime=null;
-                    LocalTime endTime=null;
-                    for (Map<String, Object> map : list) {
-                        if(String.valueOf(map.get("signtype")).equals("签到")&&!map.get("signtime").equals("")){
-                            startTime=LocalTime.parse(String.valueOf(map.get("signtime")), dtf2);
-                        }
-                        if(String.valueOf(map.get("signtype")).equals("签退")&&!map.get("signtime").equals("")){
-                            endTime=LocalTime.parse(String.valueOf(map.get("signtime")), dtf2);
-                        }
-                        //处理外出记录 有外出记录默认以默认规则作为考勤数据来源
-                        Optional<Map<String, Object>> outFirst = outWorkDataList.stream().filter(ol -> ol.get("ycbgkssj").equals(map.get("workDate")) && ol.get("rybh").equals(map.get("userId"))).findFirst();
-                        if(outFirst.isPresent()){
-                            if(startTime==null||LocalTime.parse(String.valueOf(outFirst.get().get("kssj")), dtf2).isBefore(startTime)){
-                                startTime=LocalTime.parse(String.valueOf(outFirst.get().get("kssj")), dtf2);
-                            }
-                            if(endTime==null||LocalTime.parse(String.valueOf(outFirst.get().get("jssj")), dtf2).isBefore(endTime)){
-                                endTime=LocalTime.parse(String.valueOf(outFirst.get().get("jssj")), dtf2);
-                            }
-                        }
-                        //处理补卡记录 有补卡记录以补卡记录作为考勤数据来源
-                        Optional<Map<String, Object>> replaceFirst = replaceWorkDataList.stream().filter(rl -> rl.get("kqrq").equals(map.get("workDate")) && rl.get("rybh").equals(map.get("userId"))).findFirst();
-                        if(replaceFirst.isPresent()){
-                            if(startTime==null||replaceFirst.get().get("bklx").equals("上班")){
-                                startTime=LocalTime.parse(String.valueOf(replaceFirst.get().get("bksj")), dtf2);
-                            }
-                            if(endTime==null||replaceFirst.get().get("bklx").equals("下班")){
-                                endTime=LocalTime.parse(String.valueOf(replaceFirst.get().get("bksj")), dtf2);
-                            }
-                        }
-                    }
-                    if(compIds.contains(user.getCompanyId())){
-                        if(startTime==null||endTime==null){
-                            continue;
-                        }
-                        Duration between = Duration.between(startTime, endTime);
-                        userFvTime.setStartTime(startTime.format(dtf2));
-                        userFvTime.setEndTime(endTime.format(dtf2));
-                        userFvTime.setCompanyId(user.getCompanyId());
-                        userFvTime.setUserId(user.getId());
-                        long workHours = between.toHours();
-                        long restHours = 0;
-                        //处理排除时间段
-                        for (TimeAutoExclude timeAutoExclude : excludeTimeList) {
-                            if(startTime.isBefore(LocalTime.parse(timeAutoExclude.getStartTime(),dtf2))
-                                    &&endTime.isAfter(LocalTime.parse(timeAutoExclude.getEndTime(),dtf2))){
-                                Duration bt = Duration.between(LocalTime.parse(timeAutoExclude.getStartTime(),dtf2), LocalTime.parse(timeAutoExclude.getEndTime(),dtf2));
-                                restHours += bt.toHours();
-                            }
-                        }
-
-                        userFvTime.setWorkHours(BigDecimal.valueOf(workHours).subtract(BigDecimal.valueOf(restHours)).floatValue());
-                        Optional<UserFvTime> first = oldUserFvTimeList.stream().filter(ol -> ol.getWorkDate().isEqual(userFvTime.getWorkDate()) && ol.getUserId().equals(userFvTime.getUserId())).findFirst();
-                        if(first.isPresent()){
-                            userFvTime.setId(first.get().getId());
-                        }
-                        if(endTime.isBefore(startTime)){
-                            continue;
-                        }
-                        userFvTimeList.add(userFvTime);
-                    }
-                }
-            }
-            if(userFvTimeList.size()>0){
-                userFvTimeService.saveOrUpdateBatch(userFvTimeList);
-            }
-//            System.out.println(userFvTimeList);
-            //Todo: 获取请假数据
-            HttpRespMsg leaveRecordMsg = dockWithMLD.getResult("http://10.1.10.51:20175/api/cube/restful/interface/getModeDataPageList/getLeaveRecord", jsonString);
-            List<Map<String,Object>> leaveRecordList= (List<Map<String, Object>>) leaveRecordMsg.data;
-            for (Map<String, Object> map : leaveRecordList) {
-                Optional<User> optional=allUserList.stream().filter(al->al.getJobNumber()!=null&&al.getJobNumber().equals(map.get("rybh"))).findFirst();
-                if(!optional.isPresent()){
-                    continue;
-                }
-                User user=optional.get();
-                /*System.out.println("泛微同步人员请假数据----"+user.getName());*/
-                if(compIds.contains(user.getCompanyId())){
-                    LeaveSheet leaveSheet=new LeaveSheet();
-                    leaveSheet.setCompanyId(user.getCompanyId());
-                    leaveSheet.setStatus(0);
-                    leaveSheet.setOwnerId(user.getId());
-                    leaveSheet.setOwnerName(user.getName());
-                    leaveSheet.setStartDate(LocalDate.parse(String.valueOf(map.get("startDate")),dtf1));
-                    leaveSheet.setEndDate(LocalDate.parse(String.valueOf(map.get("endDate")),dtf1));
-                    Integer timeType=null;
-                    switch (String.valueOf(map.get("timeType"))){
-                        case "小时":timeType=1;
-                            break;
-                        case "天":timeType=0;
-                            break;
-                    }
-                    leaveSheet.setTimeType(timeType);
-                    leaveSheet.setTimeDays(Float.parseFloat(((String) map.get("timeDays")).equals("")?"0.00":((String) map.get("timeDays"))));
-                    if (timeType == 0){
-                        leaveSheet.setTimeHours(leaveSheet.getTimeDays()*allDay.getAllday());
-                    }else {
-                        leaveSheet.setTimeHours(Float.parseFloat(((String) map.get("timeHours")).equals("")?"0.00":((String) map.get("timeHours"))));
-                    }
-                    Integer leaveType;
-                    switch (String.valueOf(map.get("leaveType"))){
-                        case "事假":leaveType=0;
-                            break;
-                        case "病假":leaveType=1;
-                            break;
-                        case "年假":leaveType=2;
-                            break;
-                        case "产假":leaveType=3;
-                            break;
-                        case "婚假":leaveType=4;
-                            break;
-                        case "丧假":leaveType=5;
-                            break;
-                        case "调休":leaveType=6;
-                            break;
-                        case "陪产假":leaveType=7;
-                            break;
-                        default:leaveType=8;
-                    }
-                    leaveSheet.setLeaveType(leaveType);
-                    leaveSheet.setProcinstId(String.valueOf(map.get("id")));
-                    leaveSheet.setGmtFinished(String.valueOf(map.get("gmtFinished")));
-                    Optional<LeaveSheet> first = oldLeaveSheetList.stream().filter(ol -> ol.getStartDate().isEqual(leaveSheet.getStartDate())&&ol.getEndDate().isEqual(leaveSheet.getEndDate())&& ol.getOwnerId().equals(leaveSheet.getOwnerId())&&(ol.getProcinstId()!=null&& ol.getProcinstId().equals(leaveSheet.getProcinstId()))).findFirst();
-                    if(first.isPresent()){
-                        leaveSheet.setId(first.get().getId());
-                    }
-                    leaveSheetList.add(leaveSheet);
-                }
-            }
-            if(leaveSheetList.size()>0){
-                leaveSheetService.saveOrUpdateBatch(leaveSheetList);
-            }
-            //Todo: 获取出差数据
-            HttpRespMsg travelRecordMsg = dockWithMLD.getResult("http://10.1.10.51:20175/api/cube/restful/interface/getModeDataPageList/getTravelRecord", jsonString);
-            List<Map<String,Object>> travelRecordList= (List<Map<String, Object>>) travelRecordMsg.data;
-            for (Map<String, Object> map : travelRecordList) {
-                Optional<User> optional=allUserList.stream().filter(al->al.getJobNumber()!=null&&al.getJobNumber().equals(map.get("rybh"))).findFirst();
-                if(!optional.isPresent()){
-                    continue;
-                }
-                User user=optional.get();
-                if(compIds.contains(user.getCompanyId())){
-                    BusinessTrip businessTrip=new BusinessTrip();
-                    businessTrip.setCompanyId(user.getCompanyId());
-                    businessTrip.setOwnerId(user.getId());
-                    businessTrip.setOwnerName(user.getName());
-                    businessTrip.setStartDate(LocalDate.parse(String.valueOf(map.get("startDate")),dtf1));
-                    businessTrip.setEndDate(LocalDate.parse(String.valueOf(map.get("endDate")),dtf1));
-                    Integer way=null;
-                    switch (String.valueOf(map.get("way"))){
-                        case "飞机":way=0;
-                            break;
-                        case "高铁/火车":way=1;
-                            break;
-                        case "汽车":way=2;
-                            break;
-                        case "轮船":way=3;
-                            break;
-                        case "其他":way=4;
-                            break;
-                    }
-                    businessTrip.setWay(way);
-                    businessTrip.setCityFrom((String) map.get("cityFrom"));
-                    businessTrip.setCityTo((String) map.get("cityTo"));
-                    Integer goBack=null;
-                    switch (String.valueOf(map.get("goBack"))){
-                        case "单程":goBack=0;
-                            break;
-                        case "往返":goBack=1;
-                            break;
-                    }
-                    businessTrip.setGoBack(goBack);
-                    Double dayCount =Double.valueOf(String.valueOf(map.get("dayCount")));
-                    businessTrip.setDayCount(dayCount.intValue());
-                    businessTrip.setProcinstId((String) map.get("id"));
-                    businessTrip.setGmtFinished((String)map.get("gmtFinished"));
-                    Optional<BusinessTrip> first = oldBusinessTripList.stream().filter(ol -> ol.getStartDate().isEqual(businessTrip.getStartDate())&&ol.getEndDate().isEqual(businessTrip.getEndDate())&& ol.getOwnerId().equals(businessTrip.getOwnerId())&&(ol.getProcinstId()!=null&&ol.getProcinstId().equals(businessTrip.getProcinstId()))).findFirst();
-                    if(first.isPresent()){
-                        businessTrip.setId(first.get().getId());
-                    }
-                    businessTripList.add(businessTrip);
-                }
-            }
-            if(businessTripList.size()>0){
-                businessTripService.saveOrUpdateBatch(businessTripList);
-            }
-        }
-    }
-
-    private  List<LocalDateTime> getDays(LocalDateTime start, LocalDateTime end) {
-        List<LocalDateTime> result = new ArrayList();
-        while (start.isBefore(end)) {
-            result.add(start);
-            start=start.plusDays(1);
-        }
-        result.add(start);
-        return result;
-    }
-
     //为单个人补足工时
     //为单个人补足工时
     @RequestMapping("/fillWorkingHours")
     @RequestMapping("/fillWorkingHours")
     public HttpRespMsg fillWorkingHours(String yearMonth, MonthWorkingTimeVO monthVO){
     public HttpRespMsg fillWorkingHours(String yearMonth, MonthWorkingTimeVO monthVO){

+ 14 - 6
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserCorpwxTimeController.java

@@ -6,6 +6,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.aliyun.dingtalkcontact_1_0.models.SearchUserResponse;
 import com.aliyun.dingtalkcontact_1_0.models.SearchUserResponse;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.constant.Constant;
 import com.management.platform.entity.*;
 import com.management.platform.entity.*;
 import com.management.platform.entity.vo.SysRichFunction;
 import com.management.platform.entity.vo.SysRichFunction;
 import com.management.platform.entity.vo.WorktimeItem;
 import com.management.platform.entity.vo.WorktimeItem;
@@ -106,6 +107,8 @@ public class UserCorpwxTimeController {
     private ReportLogMapper reportLogMapper;
     private ReportLogMapper reportLogMapper;
     @Autowired
     @Autowired
     private ReportLogDetailService reportLogDetailService;
     private ReportLogDetailService reportLogDetailService;
+    @Resource
+    private OvertimeMapper overtimeMapper;
 
 
     /**
     /**
      * 获取用户的考勤打卡记录
      * 获取用户的考勤打卡记录
@@ -324,7 +327,6 @@ public class UserCorpwxTimeController {
         JSONArray columnsArray = JSONArray.parseArray(projectColumns);
         JSONArray columnsArray = JSONArray.parseArray(projectColumns);
         List<String> pnames = new ArrayList<>();
         List<String> pnames = new ArrayList<>();
         for (int i=0;i<columnsArray.size(); i++) {
         for (int i=0;i<columnsArray.size(); i++) {
-            System.out.println(columnsArray.getString(i));
             pnames.add(columnsArray.getString(i));
             pnames.add(columnsArray.getString(i));
         }
         }
         List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().in("project_name", pnames).eq("company_id", user.getCompanyId()));
         List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().in("project_name", pnames).eq("company_id", user.getCompanyId()));
@@ -333,7 +335,6 @@ public class UserCorpwxTimeController {
 
 
         for (int i=0;i<array.size(); i++) {
         for (int i=0;i<array.size(); i++) {
             JSONObject jsonObject = array.getJSONObject(i);
             JSONObject jsonObject = array.getJSONObject(i);
-            System.out.println(jsonObject);
             LocalDate createDate = LocalDate.parse(jsonObject.getString("createDate"), DateTimeFormatter.ofPattern("yyyy-MM-dd"));
             LocalDate createDate = LocalDate.parse(jsonObject.getString("createDate"), DateTimeFormatter.ofPattern("yyyy-MM-dd"));
             String userId = jsonObject.getString("userId");
             String userId = jsonObject.getString("userId");
             //获取该员工的各个项目分配的工时
             //获取该员工的各个项目分配的工时
@@ -563,6 +564,17 @@ public class UserCorpwxTimeController {
 
 
             if (changedCorpwxTimes.size() > 0) {
             if (changedCorpwxTimes.size() > 0) {
                 UserCorpwxTime time = changedCorpwxTimes.get(0);
                 UserCorpwxTime time = changedCorpwxTimes.get(0);
+                //针对羲合超导(嘉兴),如果没有同步到加班,需要查询加班表单,更新加班时间
+                if (user.getCompanyId() == Constant.XI_HE_CHAO_DAO_JIA_XING_COMPANY_ID) {
+                    if (time.getOtTime() == 0) {
+                        Overtime overtime = overtimeMapper.selectOne(new QueryWrapper<Overtime>().select("sum(duration) as duration")
+                                .eq("user_id", user.getId()).eq("date", date));
+                        if (overtime != null) {
+                            time.setOtTime(DateTimeUtil.getHoursFromSeconds(overtime.getDuration()));
+                            userCorpwxTimeMapper.updateById(time);
+                        }
+                    }
+                }
                 resultMap.put("time", time);
                 resultMap.put("time", time);
             }
             }
             msg.data=resultMap;
             msg.data=resultMap;
@@ -834,11 +846,7 @@ public class UserCorpwxTimeController {
                                 .eq("wx_corpid", wxCorpInfo.getCorpid()));
                                 .eq("wx_corpid", wxCorpInfo.getCorpid()));
                     }
                     }
                 });
                 });
-                long l2 = System.currentTimeMillis();
-                System.out.println("删除耗时="+(l2-l1));
                 userCorpwxTimeService.saveBatch(userCorpwxTimeList);
                 userCorpwxTimeService.saveBatch(userCorpwxTimeList);
-                long l3 = System.currentTimeMillis();
-                System.out.println("插入耗时="+(l3-l2));
             }
             }
         } catch (IOException e) {
         } catch (IOException e) {
             e.printStackTrace();
             e.printStackTrace();

+ 0 - 263
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserFvTimeController.java

@@ -11,7 +11,6 @@ import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.BusinessTripService;
 import com.management.platform.service.BusinessTripService;
 import com.management.platform.service.LeaveSheetService;
 import com.management.platform.service.LeaveSheetService;
 import com.management.platform.service.UserFvTimeService;
 import com.management.platform.service.UserFvTimeService;
-import com.management.platform.util.DockWithMLD;
 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 org.springframework.http.*;
 import org.springframework.http.*;
@@ -62,268 +61,6 @@ public class UserFvTimeController {
 
 
     private DecimalFormat df = new DecimalFormat("#0.0");
     private DecimalFormat df = new DecimalFormat("#0.0");
 
 
-    @RequestMapping("/get")
-    public HttpRespMsg get(String startDate,String endDate, HttpServletRequest request){
-        HttpRespMsg httpRespMsg=new HttpRespMsg();
-        List<TimeType> timeTypeList = timeTypeMapper.selectList(new QueryWrapper<TimeType>().eq("sync_fanwei", 1));
-        List<Integer> compIds = timeTypeList.stream().map(TimeType::getCompanyId).collect(Collectors.toList());
-        if(compIds.isEmpty()){
-            httpRespMsg.setError("验证失败");
-            return httpRespMsg;
-        }
-        //需要修改************************************************  日期
-        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
-        DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
-        DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("HH:mm");
-        LocalDateTime yesterday = LocalDateTime.now().minusDays(2);
-        if (startDate == null) {
-            startDate = dtf.format(yesterday);
-        }
-        if (endDate == null) {
-            endDate = dtf.format(yesterday.plusDays(30));
-        }
-        for (Integer compId : compIds) {
-            DockWithMLD dockWithMLD=new DockWithMLD();
-            JSONObject jsonObject=new JSONObject();
-            List<UserFvTime> oldUserFvTimeList = userFvTimeService.list(new QueryWrapper<UserFvTime>().eq("company_id", compId));
-            List<LeaveSheet> oldLeaveSheetList = leaveSheetService.list(new QueryWrapper<LeaveSheet>().eq("company_id", compId));
-            List<BusinessTrip> oldBusinessTripList = businessTripService.list(new QueryWrapper<BusinessTrip>().eq("company_id", compId));
-            /*jsonObject.put("startDate",startDate);
-            jsonObject.put("endDate",endDate);*/
-            jsonObject.put("workDate",startDate);
-            /*jsonObject.put("gmtFinished",startDate);*/
-            String jsonString = jsonObject.toJSONString();
-            List<UserFvTime> userFvTimeList=new ArrayList<>();
-            List<LeaveSheet> leaveSheetList=new ArrayList<>();
-            List<BusinessTrip> businessTripList=new ArrayList<>();
-            TimeType allDay = timeTypeMapper.selectOne(new QueryWrapper<TimeType>().eq("company_id", compId));
-            List<User> allUserList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", compId));
-            //获取休息设置
-            List<TimeAutoExclude> excludeTimeList = timeAutoExcludeMapper.selectList(new QueryWrapper<TimeAutoExclude>().eq("company_id", compId));
-            //Todo: 获取考勤打卡数据
-            HttpRespMsg workDataMsg = dockWithMLD.getResult("http://10.1.10.51:20175/api/cube/restful/interface/getModeDataPageList/getWorkData", jsonString);
-            List<Map<String,Object>> workDataList= (List<Map<String, Object>>) workDataMsg.data;
-            //Todo: 获取外出打卡数据
-            HttpRespMsg outWorkDataMsg = dockWithMLD.getResult("http://10.1.10.51:20175/api/cube/restful/interface/getModeDataPageList/getOutRecord", jsonString);
-            List<Map<String,Object>> outWorkDataList= (List<Map<String, Object>>) outWorkDataMsg.data;
-            //Todo: 获取考勤补卡数据
-            HttpRespMsg replaceWorkDataMsg = dockWithMLD.getResult("http://10.1.10.51:20175/api/cube/restful/interface/getModeDataPageList/getReplaceRecord", jsonString);
-            List<Map<String,Object>> replaceWorkDataList= (List<Map<String, Object>>) replaceWorkDataMsg.data;
-            List<String> userIds = workDataList.stream().map(map -> String.valueOf(map.get("userId"))).distinct().collect(Collectors.toList());
-            List<User> userList = userMapper.selectList(new QueryWrapper<User>().in("job_number", userIds));
-            List<LocalDateTime> dateTimeList = getDays(yesterday, yesterday.plusDays(2));
-            for (User user : userList) {
-                //按当前填报人所属部门或者全公司来匹配
-                excludeTimeList = excludeTimeList.stream().filter(ex->ex.getDId() == null || ex.getDId().equals(user.getDepartmentId())).collect(Collectors.toList());
-                for (LocalDateTime localDateTime : dateTimeList) {
-                    LocalDate workDate=localDateTime.toLocalDate();
-                    //当天的考勤记录
-                    List<Map<String, Object>> list = workDataList.stream().filter(wl -> wl.get("userId").equals(user.getJobNumber())&&wl.get("workDate").equals(workDate.format(dtf))).collect(Collectors.toList());
-                    UserFvTime userFvTime=new UserFvTime();
-                    userFvTime.setWorkDate(workDate);
-                    LocalTime startTime=null;
-                    LocalTime endTime=null;
-                    for (Map<String, Object> map : list) {
-                        if(String.valueOf(map.get("signtype")).equals("签到")&&!map.get("signtime").equals("")){
-                            startTime=LocalTime.parse(String.valueOf(map.get("signtime")), dtf2);
-                        }
-                        if(String.valueOf(map.get("signtype")).equals("签退")&&!map.get("signtime").equals("")){
-                            endTime=LocalTime.parse(String.valueOf(map.get("signtime")), dtf2);
-                        }
-                        //处理外出记录 有外出记录默认以默认规则作为考勤数据来源
-                        Optional<Map<String, Object>> outFirst = outWorkDataList.stream().filter(ol -> ol.get("ycbgkssj").equals(map.get("workDate")) && ol.get("rybh").equals(map.get("userId"))).findFirst();
-                        if(outFirst.isPresent()){
-                            if(startTime==null||LocalTime.parse(String.valueOf(outFirst.get().get("kssj")), dtf2).isBefore(startTime)){
-                                startTime=LocalTime.parse(String.valueOf(outFirst.get().get("kssj")), dtf2);
-                            }
-                            if(endTime==null||LocalTime.parse(String.valueOf(outFirst.get().get("jssj")), dtf2).isBefore(endTime)){
-                                endTime=LocalTime.parse(String.valueOf(outFirst.get().get("jssj")), dtf2);
-                            }
-                        }
-                        //处理补卡记录 有补卡记录以补卡记录作为考勤数据来源
-                        Optional<Map<String, Object>> replaceFirst = replaceWorkDataList.stream().filter(rl -> rl.get("kqrq").equals(map.get("workDate")) && rl.get("rybh").equals(map.get("userId"))).findFirst();
-                        if(replaceFirst.isPresent()){
-                            if(startTime==null||replaceFirst.get().get("bklx").equals("上班")){
-                                startTime=LocalTime.parse(String.valueOf(replaceFirst.get().get("bksj")), dtf2);
-                            }
-                            if(endTime==null||replaceFirst.get().get("bklx").equals("下班")){
-                                endTime=LocalTime.parse(String.valueOf(replaceFirst.get().get("bksj")), dtf2);
-                            }
-                        }
-                    }
-                    if(compIds.contains(user.getCompanyId())){
-                        if(startTime==null||endTime==null){
-                            continue;
-                        }
-                        Duration between = Duration.between(startTime, endTime);
-                        userFvTime.setStartTime(startTime.format(dtf2));
-                        userFvTime.setEndTime(endTime.format(dtf2));
-                        userFvTime.setCompanyId(user.getCompanyId());
-                        userFvTime.setUserId(user.getId());
-                        long workHours = between.toHours();
-                        long restHours = 0;
-                        //处理排除时间段
-                        for (TimeAutoExclude timeAutoExclude : excludeTimeList) {
-                            if(startTime.isBefore(LocalTime.parse(timeAutoExclude.getStartTime(),dtf2))
-                                    &&endTime.isAfter(LocalTime.parse(timeAutoExclude.getEndTime(),dtf2))){
-                                Duration bt = Duration.between(LocalTime.parse(timeAutoExclude.getStartTime(),dtf2), LocalTime.parse(timeAutoExclude.getEndTime(),dtf2));
-                                restHours += bt.toHours();
-                            }
-                        }
-
-                        userFvTime.setWorkHours(BigDecimal.valueOf(workHours).subtract(BigDecimal.valueOf(restHours)).floatValue());
-                        Optional<UserFvTime> first = oldUserFvTimeList.stream().filter(ol -> ol.getWorkDate().isEqual(userFvTime.getWorkDate()) && ol.getUserId().equals(userFvTime.getUserId())).findFirst();
-                        if(first.isPresent()){
-                            userFvTime.setId(first.get().getId());
-                        }
-                        if(endTime.isBefore(startTime)){
-                            continue;
-                        }
-                        userFvTimeList.add(userFvTime);
-                    }
-                }
-            }
-            if(userFvTimeList.size()>0){
-                userFvTimeService.saveOrUpdateBatch(userFvTimeList);
-            }
-            System.out.println(userFvTimeList);
-            //Todo: 获取请假数据
-            HttpRespMsg leaveRecordMsg = dockWithMLD.getResult("http://10.1.10.51:20175/api/cube/restful/interface/getModeDataPageList/getLeaveRecord", jsonString);
-            List<Map<String,Object>> leaveRecordList= (List<Map<String, Object>>) leaveRecordMsg.data;
-            for (Map<String, Object> map : leaveRecordList) {
-                Optional<User> optional=allUserList.stream().filter(al->al.getJobNumber()!=null&&al.getJobNumber().equals(map.get("userId"))).findFirst();
-                if(!optional.isPresent()){
-                    continue;
-                }
-                User user=optional.get();
-                System.out.println("泛微同步人员请假数据----"+user.getName());
-                if(compIds.contains(user.getCompanyId())){
-                    LeaveSheet leaveSheet=new LeaveSheet();
-                    leaveSheet.setCompanyId(user.getCompanyId());
-                    leaveSheet.setStatus(0);
-                    leaveSheet.setOwnerId(user.getId());
-                    leaveSheet.setOwnerName(user.getName());
-                    leaveSheet.setStartDate(LocalDate.parse(String.valueOf(map.get("startDate")),dtf1));
-                    leaveSheet.setEndDate(LocalDate.parse(String.valueOf(map.get("endDate")),dtf1));
-                    Integer timeType=null;
-                    switch (String.valueOf(map.get("timeType"))){
-                        case "小时":timeType=1;
-                            break;
-                        case "天":timeType=0;
-                            break;
-                    }
-                    leaveSheet.setTimeType(timeType);
-                    leaveSheet.setTimeDays(Float.parseFloat(((String) map.get("timeDays")).equals("")?"0.00":((String) map.get("timeDays"))));
-                    if (timeType == 0){
-                        leaveSheet.setTimeHours(leaveSheet.getTimeDays()*allDay.getAllday());
-                    }else {
-                        leaveSheet.setTimeHours(Float.parseFloat(((String) map.get("timeHours")).equals("")?"0.00":((String) map.get("timeHours"))));
-                    }
-                    Integer leaveType;
-                    switch (String.valueOf(map.get("leaveType"))){
-                        case "事假":leaveType=0;
-                            break;
-                        case "病假":leaveType=1;
-                            break;
-                        case "年假":leaveType=2;
-                            break;
-                        case "产假":leaveType=3;
-                            break;
-                        case "婚假":leaveType=4;
-                            break;
-                        case "丧假":leaveType=5;
-                            break;
-                        case "调休":leaveType=6;
-                            break;
-                        case "陪产假":leaveType=7;
-                            break;
-                        default:leaveType=8;
-                    }
-                    leaveSheet.setLeaveType(leaveType);
-                    leaveSheet.setProcinstId(String.valueOf(map.get("procinstId")));
-                    leaveSheet.setGmtFinished(String.valueOf(map.get("gmtFinished")));
-                    /*&& ol.getOwnerId().equals(businessTrip.getOwnerId())*/
-                    Optional<LeaveSheet> first = oldLeaveSheetList.stream().filter(ol -> ol.getStartDate().isEqual(leaveSheet.getStartDate())&&ol.getEndDate().isEqual(leaveSheet.getEndDate())&&ol.getProcinstId().equals(leaveSheet.getProcinstId())).findFirst();
-                    if(first.isPresent()){
-                        leaveSheet.setId(first.get().getId());
-                    }
-                    leaveSheetList.add(leaveSheet);
-                }
-            }
-            if(leaveSheetList.size()>0){
-                leaveSheetService.saveOrUpdateBatch(leaveSheetList);
-            }
-            System.out.println(leaveRecordList);
-            //Todo: 获取出差数据
-            HttpRespMsg travelRecordMsg = dockWithMLD.getResult("http://10.1.10.51:20175/api/cube/restful/interface/getModeDataPageList/getTravelRecord", jsonString);
-            List<Map<String,Object>> travelRecordList= (List<Map<String, Object>>) travelRecordMsg.data;
-            for (Map<String, Object> map : travelRecordList) {
-                Optional<User> optional=allUserList.stream().filter(al->al.getJobNumber()!=null&&al.getJobNumber().equals(map.get("userId"))).findFirst();
-                if(!optional.isPresent()){
-                    continue;
-                }
-                User user=optional.get();
-                if(compIds.contains(user.getCompanyId())){
-                    BusinessTrip businessTrip=new BusinessTrip();
-                    businessTrip.setCompanyId(user.getCompanyId());
-                    businessTrip.setOwnerId(user.getId());
-                    businessTrip.setOwnerName(user.getName());
-                    businessTrip.setStartDate(LocalDate.parse(String.valueOf(map.get("startDate")),dtf1));
-                    businessTrip.setEndDate(LocalDate.parse(String.valueOf(map.get("endDate")),dtf1));
-                    Integer way=null;
-                    switch (String.valueOf(map.get("way"))){
-                        case "飞机":way=0;
-                            break;
-                        case "高铁/火车":way=1;
-                            break;
-                        case "汽车":way=2;
-                            break;
-                        case "轮船":way=3;
-                            break;
-                        case "其他":way=4;
-                            break;
-                    }
-                    businessTrip.setWay(way);
-                    businessTrip.setCityFrom((String) map.get("cityFrom"));
-                    businessTrip.setCityTo((String) map.get("cityTo"));
-                    Integer goBack=null;
-                    switch (String.valueOf(map.get("goBack"))){
-                        case "单程":goBack=0;
-                            break;
-                        case "往返":goBack=1;
-                            break;
-                    }
-                    businessTrip.setGoBack(goBack);
-                    Double dayCount =Double.valueOf(String.valueOf(map.get("dayCount")));
-                    businessTrip.setDayCount(dayCount.intValue());
-                    businessTrip.setProcinstId((String) map.get("procinstId"));
-                    businessTrip.setGmtFinished((String)map.get("gmtFinished"));
-                    /*&& ol.getOwnerId().equals(businessTrip.getOwnerId())*/
-                    Optional<BusinessTrip> first = oldBusinessTripList.stream().filter(ol -> ol.getStartDate().isEqual(businessTrip.getStartDate())&&ol.getEndDate().isEqual(businessTrip.getEndDate())&&ol.getProcinstId().equals(businessTrip.getProcinstId())).findFirst();
-                    if(first.isPresent()){
-                        businessTrip.setId(first.get().getId());
-                    }
-                    businessTripList.add(businessTrip);
-                }
-            }
-            if(businessTripList.size()>0){
-                businessTripService.saveOrUpdateBatch(businessTripList);
-            }
-        }
-        return httpRespMsg;
-    }
-
-
-    private  List<LocalDateTime> getDays(LocalDateTime start, LocalDateTime end) {
-        List<LocalDateTime> result = new ArrayList();
-        while (start.isBefore(end)) {
-            result.add(start);
-            start=start.plusDays(1);
-        }
-        result.add(start);
-        return result;
-    }
-
     @RequestMapping("syncAttendanceForMingYi")
     @RequestMapping("syncAttendanceForMingYi")
     public HttpRespMsg getAttendanceForMingYi(Integer isBatch,String startDate,String endDate,String userId, HttpServletRequest request) throws Exception {
     public HttpRespMsg getAttendanceForMingYi(Integer isBatch,String startDate,String endDate,String userId, HttpServletRequest request) throws Exception {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         HttpRespMsg httpRespMsg = new HttpRespMsg();

+ 36 - 18
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java

@@ -411,11 +411,9 @@ public class WeiXinCorpController {
                 //重新获取
                 //重新获取
                 String getTicketUrl = "https://qyapi.weixin.qq.com/cgi-bin/ticket/get?access_token=ACCESS_TOKEN&type=agent_config";
                 String getTicketUrl = "https://qyapi.weixin.qq.com/cgi-bin/ticket/get?access_token=ACCESS_TOKEN&type=agent_config";
                 String corpToken = getCorpAccessToken(wxCorpInfo);
                 String corpToken = getCorpAccessToken(wxCorpInfo);
-                System.out.println(corpToken);
                 getTicketUrl = getTicketUrl.replace("ACCESS_TOKEN", corpToken);
                 getTicketUrl = getTicketUrl.replace("ACCESS_TOKEN", corpToken);
                 String forObject = this.restTemplate.getForObject(getTicketUrl, String.class);
                 String forObject = this.restTemplate.getForObject(getTicketUrl, String.class);
                 JSONObject json = JSONObject.parseObject(forObject);
                 JSONObject json = JSONObject.parseObject(forObject);
-                System.out.println("getCorpWXAgentConfig返回:"+json.toJSONString());
                 if (json.getIntValue("errcode") == 0) {
                 if (json.getIntValue("errcode") == 0) {
                     String ticket = json.getString("ticket");
                     String ticket = json.getString("ticket");
                     AgentItem it = new AgentItem();
                     AgentItem it = new AgentItem();
@@ -430,7 +428,6 @@ public class WeiXinCorpController {
                 msg.setError(MessageUtils.message("wx.TicketError"));
                 msg.setError(MessageUtils.message("wx.TicketError"));
                 return msg;
                 return msg;
             }
             }
-            System.out.println("getCorpWXAgentConfig jsTicket = " + agentItem.jsTicket);
             // 对以下字段进行签名
             // 对以下字段进行签名
             SortedMap<String, String> packageParams = new TreeMap<String, String>();
             SortedMap<String, String> packageParams = new TreeMap<String, String>();
             SortedMap<String, String> packageParam = new TreeMap<String, String>();
             SortedMap<String, String> packageParam = new TreeMap<String, String>();
@@ -486,7 +483,6 @@ public class WeiXinCorpController {
     @RequestMapping(value = "/dataCallback/{corpId}", method = RequestMethod.GET)
     @RequestMapping(value = "/dataCallback/{corpId}", method = RequestMethod.GET)
     @ResponseBody
     @ResponseBody
     public String dataCallback(@PathVariable String corpId, String msg_signature, String timestamp, String nonce, String echostr) {
     public String dataCallback(@PathVariable String corpId, String msg_signature, String timestamp, String nonce, String echostr) {
-        System.out.println("========dataCallback========="+corpId);
         try {
         try {
             String sVerifyMsgSig = msg_signature;
             String sVerifyMsgSig = msg_signature;
             String sVerifyTimeStamp = timestamp;
             String sVerifyTimeStamp = timestamp;
@@ -495,7 +491,6 @@ public class WeiXinCorpController {
             WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(token, encodingAesKey, corpId);
             WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(token, encodingAesKey, corpId);
             String sEchoStr = wxcpt.VerifyURL(sVerifyMsgSig, sVerifyTimeStamp,
             String sEchoStr = wxcpt.VerifyURL(sVerifyMsgSig, sVerifyTimeStamp,
                     sVerifyNonce, sVerifyEchoStr);//需要返回的明文
                     sVerifyNonce, sVerifyEchoStr);//需要返回的明文
-            System.out.println("verifyurl echostr: " + sEchoStr);
             return sEchoStr;
             return sEchoStr;
             // 验证URL成功,将sEchoStr返回
             // 验证URL成功,将sEchoStr返回
             // HttpUtils.SetResponse(sEchoStr);
             // HttpUtils.SetResponse(sEchoStr);
@@ -584,7 +579,7 @@ public class WeiXinCorpController {
                 }else if("sys_approval_change".equals(event)){
                 }else if("sys_approval_change".equals(event)){
                     //审批动作事件,发生在该企业已经开通应用的情况下。
                     //审批动作事件,发生在该企业已经开通应用的情况下。
                     System.out.println("审批动作事件");
                     System.out.println("审批动作事件");
-                    System.out.println(jsonObject.toString());
+//                    System.out.println(jsonObject.toString());
                     if(jsonObject.has("ApprovalInfo")){
                     if(jsonObject.has("ApprovalInfo")){
                         org.json.JSONObject approvalInfo = jsonObject.getJSONObject("ApprovalInfo");
                         org.json.JSONObject approvalInfo = jsonObject.getJSONObject("ApprovalInfo");
                         Long spNo = approvalInfo.getLong("SpNo");
                         Long spNo = approvalInfo.getLong("SpNo");
@@ -833,7 +828,6 @@ public class WeiXinCorpController {
                     String corpId = jsonObject.getString("AuthCorpId");
                     String corpId = jsonObject.getString("AuthCorpId");
                     org.json.JSONObject authUserJson = jsonObject.getJSONObject("AccountList");
                     org.json.JSONObject authUserJson = jsonObject.getJSONObject("AccountList");
                     String authUserId = authUserJson.getString("UserId");
                     String authUserId = authUserJson.getString("UserId");
-                    System.out.println("authUserId="+authUserId);
                     List<User> oneUserList = userMapper.selectList(new QueryWrapper<User>().eq("corpwx_userid", authUserId));
                     List<User> oneUserList = userMapper.selectList(new QueryWrapper<User>().eq("corpwx_userid", authUserId));
                     if (oneUserList.size() == 0) {
                     if (oneUserList.size() == 0) {
                         //生成该用户
                         //生成该用户
@@ -845,7 +839,6 @@ public class WeiXinCorpController {
                                 User user = wxCorpInfoService.generateUserInfo(companyId, authUserId);
                                 User user = wxCorpInfoService.generateUserInfo(companyId, authUserId);
                                 //查询详情进行更新
                                 //查询详情进行更新
                                 JSONObject userObj = getUserInfo(getCorpAccessToken(wxCorpInfo), authUserId);
                                 JSONObject userObj = getUserInfo(getCorpAccessToken(wxCorpInfo), authUserId);
-                                System.out.println("userObj=="+userObj);
                                 //成功获取到通讯录的个人详情
                                 //成功获取到通讯录的个人详情
                                 String userId = userObj.getString("userid");
                                 String userId = userObj.getString("userid");
                                 String openUserId = userObj.getString("open_userid");
                                 String openUserId = userObj.getString("open_userid");
@@ -868,7 +861,6 @@ public class WeiXinCorpController {
                                     userUpdate.setDepartmentCascade(convertDepartmentIdToCascade(userUpdate.getDepartmentId(), allDeptList));
                                     userUpdate.setDepartmentCascade(convertDepartmentIdToCascade(userUpdate.getDepartmentId(), allDeptList));
                                 }
                                 }
                                 userMapper.updateById(userUpdate);
                                 userMapper.updateById(userUpdate);
-                                System.out.println("======更新人员======");
                                 sendCardMsg(authUserId);
                                 sendCardMsg(authUserId);
                             }
                             }
                         }
                         }
@@ -2483,13 +2475,30 @@ public class WeiXinCorpController {
                 if (userJson.getInteger("status") != 1) continue;
                 if (userJson.getInteger("status") != 1) continue;
                 //不存在的人员, 进行插入
                 //不存在的人员, 进行插入
                 User user = new User();
                 User user = new User();
+                //曦合超导, 如果有多个部门,取员工主部门
                 JSONArray userDeptArray = userJson.getJSONArray("department");
                 JSONArray userDeptArray = userJson.getJSONArray("department");
-                //取最末级的,也就是最大的deptId
-                int maxDeptId = 1;
-                for (int m=0;m<userDeptArray.size(); m++) {
-                    int curId = userDeptArray.getInteger(m);
-                    if (curId > maxDeptId) maxDeptId = curId;
+                int targetUserDeptId = 1;
+                if (userDeptArray.size() > 1 && (Constant.XI_HE_CHAO_DAO_COMPANY_ID == companyId || Constant.XI_HE_CHAO_DAO_JIA_XING_COMPANY_ID == companyId)) {
+                    JSONObject userInfo = getUserInfo(curCorpAccessToken, curUserid);
+                    if (userInfo.containsKey("main_department")) {
+                        targetUserDeptId = userInfo.getInteger("main_department");
+                    } else {
+                        userDeptArray = userInfo.getJSONArray("department");
+                        //取最末级的,也就是最大的deptId
+                        for (int m=0;m<userDeptArray.size(); m++) {
+                            int curId = userDeptArray.getInteger(m);
+                            if (curId > targetUserDeptId) targetUserDeptId = curId;
+                        }
+                    }
+                } else {
+                    //取最末级的,也就是最大的deptId
+                    for (int m=0;m<userDeptArray.size(); m++) {
+                        int curId = userDeptArray.getInteger(m);
+                        if (curId > targetUserDeptId) targetUserDeptId = curId;
+                    }
                 }
                 }
+
+
                 user.setId(SnowFlake.nextId()+"")
                 user.setId(SnowFlake.nextId()+"")
                         .setRoleId(defaultRole.getId())//默认普通员工
                         .setRoleId(defaultRole.getId())//默认普通员工
                         .setRoleName(defaultRole.getRolename())
                         .setRoleName(defaultRole.getRolename())
@@ -2501,7 +2510,7 @@ public class WeiXinCorpController {
                         .setColor(ColorUtil.randomColor())
                         .setColor(ColorUtil.randomColor())
                         .setPassword(MD5Util.getPassword("000000"))
                         .setPassword(MD5Util.getPassword("000000"))
                         .setJobNumber(openUserid.equals(curUserid)?null:curUserid)
                         .setJobNumber(openUserid.equals(curUserid)?null:curUserid)
-                        .setCorpwxDeptid(maxDeptId);
+                        .setCorpwxDeptid(targetUserDeptId);
                 allCorpWxUserList.add(user);
                 allCorpWxUserList.add(user);
             }
             }
 
 
@@ -2547,12 +2556,20 @@ public class WeiXinCorpController {
                     String curUserid = userJson.getString("userid");
                     String curUserid = userJson.getString("userid");
                     String openUserid = userJson.getString("open_userid");
                     String openUserid = userJson.getString("open_userid");
                     System.out.println("人员信息:"+userJson.toString());
                     System.out.println("人员信息:"+userJson.toString());
+                    JSONArray department = userJson.getJSONArray("department");
                     //不存在的人员, 进行插入
                     //不存在的人员, 进行插入
                     User user = new User();
                     User user = new User();
+                    int targetUserDeptId = deptId;
                     Optional<User> first = allCorpWxUserList.stream().filter(all -> all.getCorpwxUserid().equals(openUserid)).findFirst();
                     Optional<User> first = allCorpWxUserList.stream().filter(all -> all.getCorpwxUserid().equals(openUserid)).findFirst();
+                    if (department.size() > 1 && (companyId == Constant.XI_HE_CHAO_DAO_JIA_XING_COMPANY_ID || companyId == Constant.XI_HE_CHAO_DAO_COMPANY_ID)) {
+                        JSONObject userInfo = getUserInfo(curCorpAccessToken, openUserid);
+                        if (userInfo.containsKey("main_department")) {
+                            targetUserDeptId = userInfo.getInteger("main_department");
+                        }
+                    }
                     if (first.isPresent()) {
                     if (first.isPresent()) {
                         user = first.get();
                         user = first.get();
-                        user.setCorpwxDeptid(deptId);
+                        user.setCorpwxDeptid(targetUserDeptId);
                     } else {
                     } else {
                         //在当前部门下的员工
                         //在当前部门下的员工
                         user.setId(SnowFlake.nextId()+"")
                         user.setId(SnowFlake.nextId()+"")
@@ -2564,8 +2581,9 @@ public class WeiXinCorpController {
                                 .setCorpwxRealUserid(curUserid)
                                 .setCorpwxRealUserid(curUserid)
                                 .setColor(ColorUtil.randomColor())
                                 .setColor(ColorUtil.randomColor())
                                 .setJobNumber(openUserid.equals(curUserid)?null:curUserid)
                                 .setJobNumber(openUserid.equals(curUserid)?null:curUserid)
-                                .setPassword(MD5Util.getPassword("000000"))
-                                .setCorpwxDeptid(curDept==null?1:curDept.getCorpwxDeptid());//默认1属于公司下面
+                                .setPassword(MD5Util.getPassword("000000"));
+
+                        user.setCorpwxDeptid(curDept==null?1:targetUserDeptId);//默认1属于公司下面
                         allCorpWxUserList.add(user);
                         allCorpWxUserList.add(user);
                     }
                     }
                 }
                 }

+ 4 - 262
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WxCorpInfoController.java

@@ -175,275 +175,17 @@ public class WxCorpInfoController {
      * record_type=5 表示加班审批
      * record_type=5 表示加班审批
      */
      */
     @RequestMapping("/getOvertimeApprovalList")
     @RequestMapping("/getOvertimeApprovalList")
-    public HttpRespMsg getOvertimeApprovalList(int companyId, String startDate, String endDate) {
+    public HttpRespMsg getOvertimeApprovalList(int companyId, String userId, String startDate, String endDate) {
         HttpRespMsg msg = new HttpRespMsg();
         HttpRespMsg msg = new HttpRespMsg();
         try {
         try {
-            // 构建过滤条件:record_type=5 表示加班审批
-            JSONArray filterArray = new JSONArray();
-            JSONObject filter = new JSONObject();
-            filter.put("key", "record_type");
-            filter.put("value", "5");
-            filterArray.add(filter);
-            
-            // 调用service层方法获取审批单号列表
-            JSONArray approvalList = wxCorpInfoService.getApprovalInfo(companyId, startDate, endDate, "", filterArray);
-            
-            if (approvalList != null && approvalList.size() > 0) {
-                // TODO: 获取审批单详情
-                JSONArray detailList = new JSONArray();
-                
-                for (int i = 0; i < approvalList.size(); i++) {
-                    String spNo = approvalList.getString(i);
-                    try {
-                        // 获取审批单详情
-                        JSONObject detail = wxCorpInfoService.getApprovalDetail(companyId, spNo);
-                        
-                        if (detail != null) {
-                            // 解析需要的字段
-                            JSONObject result = new JSONObject();
-                            result.put("sp_no", spNo);
-                            
-                            // 提交人信息
-                            JSONObject applyer = detail.getJSONObject("applyer");
-                            if (applyer != null) {
-                                result.put("applyer_userid", applyer.getString("userid"));
-                                result.put("applyer_name", applyer.getString("partyname"));
-                            }
-                            
-                            // 审批申请数据
-                            JSONObject applyData = detail.getJSONObject("apply_data");
-                            if (applyData != null) {
-                                JSONArray contents = applyData.getJSONArray("contents");
-                                if (contents != null) {
-                                    for (int j = 0; j < contents.size(); j++) {
-                                        JSONObject content = contents.getJSONObject(j);
-                                        String controlName = content.getString("control");
-                                        System.out.println("content=" + content);
-                                        JSONArray array = content.getJSONArray("title");
-                                        String title = null;
-                                        for (int k = 0; k < array.size(); k++) {
-                                            JSONObject item = array.getJSONObject(k);
-                                            if (item.getString("lang").equals("zh_CN")) {
-                                                title = item.getString("text");
-                                                break;
-                                            }
-                                        }
-                                        // 加班时间信息 - 从Attendance控件中解析
-                                        if ("Attendance".equals(controlName)) {
-                                            JSONObject value = content.getJSONObject("value");
-                                            if (value != null) {
-                                                JSONObject attendance = value.getJSONObject("attendance");
-                                                if (attendance != null) {
-                                                    // 解析date_range
-                                                    JSONObject dateRange = attendance.getJSONObject("date_range");
-                                                    if (dateRange != null) {
-                                                        // 时间格式化器
-                                                        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
-                                                        
-                                                        // 加班开始时间(时间戳转换为格式化字符串)
-                                                        Long startTimestamp = dateRange.getLong("new_begin");
-                                                        LocalDateTime startDateTime = LocalDateTime.ofInstant(
-                                                            Instant.ofEpochSecond(startTimestamp), 
-                                                            ZoneId.systemDefault()
-                                                        );
-                                                        result.put("start_time", startDateTime.format(formatter));
-                                                        
-                                                        // 加班结束时间(时间戳转换为格式化字符串)
-                                                        Long endTimestamp = dateRange.getLong("new_end");
-                                                        LocalDateTime endDateTime = LocalDateTime.ofInstant(
-                                                            Instant.ofEpochSecond(endTimestamp), 
-                                                            ZoneId.systemDefault()
-                                                        );
-                                                        result.put("end_time", endDateTime.format(formatter));
-                                                        
-                                                        // 加班时长(秒)
-                                                        result.put("duration", dateRange.getLong("new_duration"));
-                                                        // 时长类型
-                                                        result.put("duration_type", dateRange.getString("type"));
-                                                    }
-                                                    
-//                                                    // 解析slice_info中的duration
-//                                                    JSONObject sliceInfo = attendance.getJSONObject("slice_info");
-//                                                    if (sliceInfo != null) {
-//                                                        result.put("slice_duration", sliceInfo.getLong("duration"));
-//                                                        result.put("slice_state", sliceInfo.getInteger("state"));
-//                                                    }
-                                                    
-                                                    // 加班类型(5表示加班)
-                                                    result.put("attendance_type", attendance.getInteger("type"));
-                                                }
-                                            }
-                                        } else if ("是否夜班".equals(title)){
-                                            // 是否夜班字段 - 从Selector控件中解析
-                                            JSONObject value = content.getJSONObject("value");
-                                            if (value != null) {
-                                                JSONObject selector = value.getJSONObject("selector");
-                                                if (selector != null) {
-                                                    JSONArray options = selector.getJSONArray("options");
-                                                    if (options != null && options.size() > 0) {
-                                                        JSONObject option = options.getJSONObject(0);
-                                                        JSONArray valueArray = option.getJSONArray("value");
-                                                        if (valueArray != null) {
-                                                            for (int k = 0; k < valueArray.size(); k++) {
-                                                                JSONObject valueItem = valueArray.getJSONObject(k);
-                                                                if ("zh_CN".equals(valueItem.getString("lang"))) {
-                                                                    String nightShiftText = valueItem.getString("text");
-                                                                    // "是"表示是夜班,"否"表示不是夜班
-                                                                    result.put("is_night_shift", "是".equals(nightShiftText));
-                                                                    break;
-                                                                }
-                                                            }
-                                                        }
-                                                    }
-                                                }
-                                            }
-                                        }
-                                    }
-                                }
-                            }
-                            
-                            // 打印详情
-                            System.out.println("=== 加班审批单详情 ===");
-                            System.out.println("审批单号: " + result.getString("sp_no"));
-                            System.out.println("提交人ID: " + result.getString("applyer_userid"));
-                            System.out.println("提交人姓名: " + result.getString("applyer_name"));
-                            System.out.println("开始时间: " + result.getString("start_time"));
-                            System.out.println("结束时间: " + result.getString("end_time"));
-                            System.out.println("加班时长(秒): " + result.getLong("duration"));
-                            System.out.println("时长类型: " + result.getString("duration_type"));
-                            System.out.println("考勤类型: " + result.getInteger("attendance_type"));
-                            System.out.println("=====================");
-                            
-                            detailList.add(result);
-                        }
-                    } catch (Exception e) {
-                        System.err.println("获取审批单 " + spNo + " 详情失败: " + e.getMessage());
-                        e.printStackTrace();
-                    }
-                }
-                saveOrUpdateOverTime(companyId, detailList);
-                msg.data = detailList;
-                msg.msg = "成功获取" + detailList.size() + "条加班审批详情";
-
-            } else {
-                msg.data = new JSONArray();
-                msg.msg = "未查询到加班审批单号";
-            }
+            JSONArray detailList = wxCorpInfoService.getAndSaveOvertimeApprovalList(companyId, userId, startDate, endDate);
+            msg.data = detailList;
+            msg.msg = "成功获取" + detailList.size() + "条加班审批详情";
         } catch (Exception e) {
         } catch (Exception e) {
             e.printStackTrace();
             e.printStackTrace();
             msg.setError("获取加班审批单号失败:" + e.getMessage());
             msg.setError("获取加班审批单号失败:" + e.getMessage());
         }
         }
         return msg;
         return msg;
     }
     }
-
-    /**
-     * 保存或更新加班数据
-     * @param array 加班审批详情数组
-     */
-    private void saveOrUpdateOverTime(Integer companyId, JSONArray array) {
-        if (array == null || array.isEmpty()) {
-            return;
-        }
-        
-        for (int i = 0; i < array.size(); i++) {
-            JSONObject item = array.getJSONObject(i);
-            
-            try {
-                // 获取审批单号
-                String spNo = item.getString("sp_no");
-                if (StringUtils.isEmpty(spNo)) {
-                    System.err.println("审批单号为空,跳过该记录");
-                    continue;
-                }
-                
-                // 根据审批单号查询是否已存在
-                QueryWrapper<Overtime> queryWrapper = new QueryWrapper<>();
-                queryWrapper.eq("sp_no", spNo).eq("company_id", companyId);
-                Overtime existingOvertime = overtimeService.getOne(queryWrapper);
-                
-                Overtime overtime;
-                if (existingOvertime != null) {
-                    // 更新已存在的记录
-                    overtime = existingOvertime;
-                } else {
-                    // 创建新记录
-                    overtime = new Overtime();
-                    overtime.setSpNo(spNo);
-                    overtime.setCompanyId(companyId);
-                }
-                
-                // 设置企微用户ID
-                String applyerWxUserid = item.getString("applyer_userid");
-                if (!StringUtils.isEmpty(applyerWxUserid)) {
-                    overtime.setApplyerWxUserid(applyerWxUserid);
-                    
-                    // 根据企微用户ID查询系统用户ID
-                    QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
-                    if (companyId == 7) {
-                        userQueryWrapper.eq("corpwx_real_userid", applyerWxUserid).eq("company_id", companyId);
-                    } else {
-                        userQueryWrapper.eq("corpwx_userid", applyerWxUserid).eq("company_id", companyId);
-                    }
-                    User user = userMapper.selectOne(userQueryWrapper);
-                    
-                    if (user != null) {
-                        overtime.setUserId(user.getId());
-                    } else {
-                        System.err.println("未找到企微用户ID对应的系统用户: " + applyerWxUserid);
-                    }
-                }
-                
-                // 设置加班开始时间
-                String startTimeStr = item.getString("start_time");
-                if (!StringUtils.isEmpty(startTimeStr)) {
-                    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
-                    overtime.setStartTime(LocalDateTime.parse(startTimeStr, formatter));
-                }
-                
-                // 设置加班结束时间
-                String endTimeStr = item.getString("end_time");
-                if (!StringUtils.isEmpty(endTimeStr)) {
-                    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
-                    overtime.setEndTime(LocalDateTime.parse(endTimeStr, formatter));
-                }
-                
-                // 设置加班时长(秒)
-                Long duration = item.getLong("duration");
-                if (duration != null) {
-                    overtime.setDuration(duration.intValue());
-                }
-                
-                // 设置时长类型
-                String durationType = item.getString("duration_type");
-                if (!StringUtils.isEmpty(durationType)) {
-                    overtime.setDurationType(durationType);
-                }
-                
-                // 设置考勤类型
-                Integer attendanceType = item.getInteger("attendance_type");
-                if (attendanceType != null) {
-                    overtime.setAttendanceType(attendanceType);
-                }
-                
-                // 设置是否夜班
-                Boolean isNightShift = item.getBoolean("is_night_shift");
-                if (isNightShift != null) {
-                    overtime.setIsNightShift(isNightShift);
-                }
-                
-                // 保存或更新
-                boolean success = overtimeService.saveOrUpdate(overtime);
-                if (success) {
-                    System.out.println("成功保存加班记录,审批单号: " + spNo);
-                } else {
-                    System.err.println("保存加班记录失败,审批单号: " + spNo);
-                }
-                
-            } catch (Exception e) {
-                System.err.println("处理加班记录时发生异常: " + e.getMessage());
-                e.printStackTrace();
-            }
-        }
-    }
 }
 }
 
 

+ 5 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Company.java

@@ -169,7 +169,11 @@ public class Company extends Model<Company> {
     @TableField("enable_ai")
     @TableField("enable_ai")
     private Boolean enableAi;
     private Boolean enableAi;
 
 
-
+    /**
+     * 是否有加班模块
+     */
+    @TableField("package_overtime")
+    private Integer packageOvertime;
 
 
     @Override
     @Override
     protected Serializable pkVal() {
     protected Serializable pkVal() {

+ 27 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Overtime.java

@@ -97,6 +97,33 @@ public class Overtime extends Model<Overtime> {
     private LocalDate date;
     private LocalDate date;
 
 
 
 
+    /**
+     * 加班事由
+     */
+    @TableField("reason")
+    private String reason;
+
+    /**
+     * 证明材料
+     */
+    @TableField("file")
+    private String file;
+
+    /**
+     * 0-待部门审核,1-待HR审核,2-审核通过,3-审核驳回, -1(已撤回)
+     */
+    @TableField("status")
+    private Integer status;
+
+    /**
+     * 驳回原因
+     */
+    @TableField("deny_reason")
+    private String denyReason;
+
+    @TableField(exist = false)
+    private String userName;
+
     @Override
     @Override
     protected Serializable pkVal() {
     protected Serializable pkVal() {
         return this.id;
         return this.id;

+ 6 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/SysModule.java

@@ -158,6 +158,12 @@ public class SysModule extends Model<SysModule> {
     @TableField("package_device")
     @TableField("package_device")
     private Integer packageDevice;
     private Integer packageDevice;
 
 
+    /**
+     * 是否属于加班管理模块
+     */
+    @TableField("package_overtime")
+    private Integer packageOvertime;
+
 
 
     @TableField(exist = false)
     @TableField(exist = false)
     private List<SysModule> children;
     private List<SysModule> children;

+ 6 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TimeType.java

@@ -715,6 +715,12 @@ public class TimeType extends Model<TimeType> {
      */
      */
     @TableField("notify_last_week_on_weekday")
     @TableField("notify_last_week_on_weekday")
     private Integer notifyLastWeekOnWeekday;
     private Integer notifyLastWeekOnWeekday;
+    /**
+     * 日报内是否可以完成任务
+     */
+    @TableField("finish_task_in_report")
+    private Boolean finishTaskInReport;
+
 
 
 
 
     @TableField(exist = false)
     @TableField(exist = false)

+ 16 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/OvertimeAllowanceMapper.java

@@ -2,6 +2,9 @@ package com.management.platform.mapper;
 
 
 import com.management.platform.entity.OvertimeAllowance;
 import com.management.platform.entity.OvertimeAllowance;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 
 /**
 /**
  * <p>
  * <p>
@@ -13,4 +16,17 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
  */
 public interface OvertimeAllowanceMapper extends BaseMapper<OvertimeAllowance> {
 public interface OvertimeAllowanceMapper extends BaseMapper<OvertimeAllowance> {
 
 
+    /**
+     * 按人员合计统计餐补数据(SQL GROUP BY + SUM),返回全部数据
+     */
+    List<OvertimeAllowance> getSummaryList(
+            @Param("companyId") Integer companyId,
+            @Param("isAllowance") Boolean isAllowance,
+            @Param("corpwxUserid") String corpwxUserid,
+            @Param("corpwxUserids") List<String> corpwxUserids,
+            @Param("noRecords") Boolean noRecords,
+            @Param("startDate") String startDate,
+            @Param("endDate") String endDate
+    );
+
 }
 }

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

@@ -13,7 +13,4 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
  */
 public interface LeaveSheetFvService extends IService<LeaveSheetFv> {
 public interface LeaveSheetFvService extends IService<LeaveSheetFv> {
 
 
-    Integer syncData(String startDate, String endDate, Integer companyId);
-
-    void testAdd(Integer companyId);
 }
 }

+ 15 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/OvertimeAllowanceService.java

@@ -3,6 +3,8 @@ package com.management.platform.service;
 import com.management.platform.entity.OvertimeAllowance;
 import com.management.platform.entity.OvertimeAllowance;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.service.IService;
 
 
+import java.util.List;
+
 /**
 /**
  * <p>
  * <p>
  *  服务类
  *  服务类
@@ -13,4 +15,17 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
  */
 public interface OvertimeAllowanceService extends IService<OvertimeAllowance> {
 public interface OvertimeAllowanceService extends IService<OvertimeAllowance> {
 
 
+    /**
+     * 按人员合计统计餐补数据(SQL GROUP BY + SUM),返回全部数据
+     */
+    List<OvertimeAllowance> getSummaryList(
+            Integer companyId,
+            Boolean isAllowance,
+            String corpwxUserid,
+            List<String> corpwxUserids,
+            Boolean noRecords,
+            String startDate,
+            String endDate
+    );
+
 }
 }

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

@@ -219,4 +219,5 @@ public interface ReportService extends IService<Report> {
 
 
     HttpRespMsg exportReportGroupByDay(String startDate, String endDate, String userId, Integer departmentId, Integer projectId, HttpServletRequest request);
     HttpRespMsg exportReportGroupByDay(String startDate, String endDate, String userId, Integer departmentId, Integer projectId, HttpServletRequest request);
 
 
+    HttpRespMsg importNewDataXiHe(Integer companyId, MultipartFile file, HttpServletRequest request);
 }
 }

+ 10 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/WxCorpInfoService.java

@@ -99,4 +99,14 @@ public interface WxCorpInfoService extends IService<WxCorpInfo> {
     void getUserByCompanyIdAndTransferLicenseBatch(Integer companyId,List<String> takeoverIdList) throws Exception;
     void getUserByCompanyIdAndTransferLicenseBatch(Integer companyId,List<String> takeoverIdList) throws Exception;
 
 
     void setUserCorpWxCardTime(UserCorpwxTime userCorpWxCardTime);
     void setUserCorpWxCardTime(UserCorpwxTime userCorpWxCardTime);
+
+    /**
+     * 获取并保存加班审批单列表(针对指定公司)
+     * @param companyId 公司ID
+     * @param userId 用户ID(可为null,为null时获取所有人)
+     * @param startDate 开始日期(yyyy-MM-dd)
+     * @param endDate 结束日期(yyyy-MM-dd)
+     * @return 加班审批详情列表
+     */
+    JSONArray getAndSaveOvertimeApprovalList(Integer companyId, String userId, String startDate, String endDate) throws Exception;
 }
 }

+ 0 - 6
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DepartmentServiceImpl.java

@@ -262,10 +262,6 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
                 //修改任务文件审核人
                 //修改任务文件审核人
                 List<Integer> taskFileIds = taskFilesMapper.getTaskFilesByCreatorDeptId(departmentId);
                 List<Integer> taskFileIds = taskFilesMapper.getTaskFilesByCreatorDeptId(departmentId);
                 if(CollectionUtils.isNotEmpty(taskFileIds)){
                 if(CollectionUtils.isNotEmpty(taskFileIds)){
-                    System.out.println("managerId="+managerId);
-                    taskFileIds.forEach(id->{
-                        System.out.println(id);
-                    });
                     taskFilesMapper.update(null,new LambdaUpdateWrapper<TaskFiles>()
                     taskFilesMapper.update(null,new LambdaUpdateWrapper<TaskFiles>()
                             .set(TaskFiles::getChargeOneId,managerId)
                             .set(TaskFiles::getChargeOneId,managerId)
                             .in(TaskFiles::getId,taskFileIds)
                             .in(TaskFiles::getId,taskFileIds)
@@ -1339,11 +1335,9 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
             //检查是否有查看全公司数值的权限
             //检查是否有查看全公司数值的权限
             User curUser = userMapper.selectById(request.getHeader("TOKEN"));
             User curUser = userMapper.selectById(request.getHeader("TOKEN"));
             List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(curUser.getRoleId(), "查看全公司数值");
             List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(curUser.getRoleId(), "查看全公司数值");
-            System.out.println("functionList=="+functionList.size());
             if (functionList.size() == 0) {
             if (functionList.size() == 0) {
                 //检查是否有负责的部门
                 //检查是否有负责的部门
                 deptIds = getAllManagedDeptIdList(curUser, allDeptList);
                 deptIds = getAllManagedDeptIdList(curUser, allDeptList);
-                System.out.println("负责的部门:"+deptIds);
                 if (deptIds.size() == 0) {
                 if (deptIds.size() == 0) {
                     deptIds.add(-1);//没有负责的部门,无权查看
                     deptIds.add(-1);//没有负责的部门,无权查看
                 }
                 }

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

@@ -186,7 +186,6 @@ public class FeishuInfoServiceImpl extends ServiceImpl<FeishuInfoMapper, FeishuI
         MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
         MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
         headers.setContentType(type);
         headers.setContentType(type);
         String token = getTenantAccessToken(feishuInfo.getAppId());
         String token = getTenantAccessToken(feishuInfo.getAppId());
-        System.out.println("飞书token======" + token);
         headers.add("Authorization", "Bearer " + token);
         headers.add("Authorization", "Bearer " + token);
         HttpEntity<JSONObject> httpEntity = new HttpEntity<>(null, headers);
         HttpEntity<JSONObject> httpEntity = new HttpEntity<>(null, headers);
         ResponseEntity<String> ResponseEntity = restTemplate.exchange(url, HttpMethod.GET, httpEntity, String.class);
         ResponseEntity<String> ResponseEntity = restTemplate.exchange(url, HttpMethod.GET, httpEntity, String.class);
@@ -234,7 +233,6 @@ public class FeishuInfoServiceImpl extends ServiceImpl<FeishuInfoMapper, FeishuI
         MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
         MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
         headers.setContentType(type);
         headers.setContentType(type);
         headers.add("Authorization", "Bearer " + getTenantAccessToken(feishuInfo.getAppId()));
         headers.add("Authorization", "Bearer " + getTenantAccessToken(feishuInfo.getAppId()));
-        System.out.println("headers==================>" + headers);
         HttpEntity<JSONObject> httpEntity = new HttpEntity<>(null, headers);
         HttpEntity<JSONObject> httpEntity = new HttpEntity<>(null, headers);
         Map<String, Object> map = new HashMap<>();
         Map<String, Object> map = new HashMap<>();
         map.put("page_size", 50);
         map.put("page_size", 50);
@@ -326,7 +324,6 @@ public class FeishuInfoServiceImpl extends ServiceImpl<FeishuInfoMapper, FeishuI
         ResponseEntity<String> ResponseEntity = restTemplate.exchange(url, HttpMethod.GET, httpEntity, String.class);
         ResponseEntity<String> ResponseEntity = restTemplate.exchange(url, HttpMethod.GET, httpEntity, String.class);
         if (ResponseEntity.getStatusCode() == HttpStatus.OK) {
         if (ResponseEntity.getStatusCode() == HttpStatus.OK) {
             String resp = ResponseEntity.getBody();
             String resp = ResponseEntity.getBody();
-            System.out.println(resp);
             JSONObject respJson = JSONObject.parseObject(resp);
             JSONObject respJson = JSONObject.parseObject(resp);
             if (respJson.getInteger("code") == 0) {
             if (respJson.getInteger("code") == 0) {
                 JSONObject data = respJson.getJSONObject("data");
                 JSONObject data = respJson.getJSONObject("data");

+ 0 - 104
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/LeaveSheetFvServiceImpl.java

@@ -8,7 +8,6 @@ import com.management.platform.mapper.TimeTypeMapper;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.LeaveSheetFvService;
 import com.management.platform.service.LeaveSheetFvService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.management.platform.util.DockWithMLD;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.HttpRespMsg;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
@@ -38,107 +37,4 @@ import java.util.stream.Collectors;
 @Transactional
 @Transactional
 public class LeaveSheetFvServiceImpl extends ServiceImpl<LeaveSheetFvMapper, LeaveSheetFv> implements LeaveSheetFvService {
 public class LeaveSheetFvServiceImpl extends ServiceImpl<LeaveSheetFvMapper, LeaveSheetFv> implements LeaveSheetFvService {
 
 
-    @Resource
-    LeaveSheetFvMapper leaveSheetFvMapper;
-    @Resource
-    TimeTypeMapper timeTypeMapper;
-    @Resource
-    UserMapper userMapper;
-
-    @Override
-    public Integer syncData(String startDate, String endDate, Integer companyId) {
-        TimeType comTimeType = timeTypeMapper.selectById(companyId);
-        DockWithMLD dockWithMLD=new DockWithMLD();
-        JSONObject jsonObject=new JSONObject();
-        DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
-        List<LeaveSheetFv> oldLeaveSheetList = list(new QueryWrapper<LeaveSheetFv>().eq("company_id", companyId));
-        jsonObject.put("workDate",startDate);
-        jsonObject.put("gmtFinished",endDate);
-        String jsonString = jsonObject.toJSONString();
-        List<LeaveSheetFv> leaveSheetList=new ArrayList<>();
-
-        List<User> allUserList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
-        //Todo: 获取请假数据
-        HttpRespMsg leaveRecordMsg = dockWithMLD.getResult("http://10.1.10.51:20175/api/cube/restful/interface/getModeDataPageList/getLeaveRecord", jsonString);
-        List<Map<String,Object>> leaveRecordList= (List<Map<String, Object>>) leaveRecordMsg.data;
-        System.out.println("原始数据条数:"+leaveRecordList.size());
-        for (Map<String, Object> map : leaveRecordList) {
-            Optional<User> optional=allUserList.stream().filter(al->al.getJobNumber()!=null&&al.getJobNumber().equals(map.get("rybh"))).findFirst();
-            if(!optional.isPresent()){
-                continue;
-            }
-            User user=optional.get();
-            LeaveSheetFv leaveSheet=new LeaveSheetFv();
-            leaveSheet.setCompanyId(user.getCompanyId());
-            leaveSheet.setStatus(0);
-            leaveSheet.setOwnerId(user.getId());
-            leaveSheet.setOwnerName(user.getName());
-            leaveSheet.setStartDate(LocalDate.parse(String.valueOf(map.get("startDate")),dtf1));
-            leaveSheet.setEndDate(LocalDate.parse(String.valueOf(map.get("endDate")),dtf1));
-            Integer timeType=null;
-            switch (String.valueOf(map.get("timeType"))){
-                case "小时":timeType=1;
-                    break;
-                case "天":timeType=0;
-                    break;
-            }
-            leaveSheet.setTimeType(timeType);
-            leaveSheet.setTimeDays(Float.parseFloat(((String) map.get("timeDays")).equals("")?"0.00":((String) map.get("timeDays"))));
-            if (timeType == 0){
-                leaveSheet.setTimeHours(leaveSheet.getTimeDays()*comTimeType.getAllday());
-            }else {
-                leaveSheet.setTimeHours(Float.parseFloat(((String) map.get("timeHours")).equals("")?"0.00":((String) map.get("timeHours"))));
-            }
-            Integer leaveType;
-            switch (String.valueOf(map.get("leaveType"))){
-                case "事假":leaveType=0;
-                    break;
-                case "病假":leaveType=1;
-                    break;
-                case "年假":leaveType=2;
-                    break;
-                case "产假":leaveType=3;
-                    break;
-                case "婚假":leaveType=4;
-                    break;
-                case "丧假":leaveType=5;
-                    break;
-                case "调休":leaveType=6;
-                    break;
-                case "陪产假":leaveType=7;
-                    break;
-                default:leaveType=8;
-            }
-            leaveSheet.setLeaveType(leaveType);
-            leaveSheet.setProcinstId(String.valueOf(map.get("id")));
-            leaveSheet.setGmtFinished(String.valueOf(map.get("gmtFinished")));
-            leaveSheetList.add(leaveSheet);
-        }
-        if(leaveSheetList.size()>0){
-            //删掉该公司的所有请假数据
-            System.out.println("删除老数据");
-            leaveSheetFvMapper.delete(new QueryWrapper<LeaveSheetFv>().eq("company_id",companyId));
-            //再重新插入
-            saveBatch(leaveSheetList);
-        }
-        System.out.println("请假数据同步完成,共获取到"+leaveSheetList.size()+"条数据");
-        return new Integer(leaveSheetList.size());
-    }
-
-    @Override
-    public void testAdd(Integer companyId) {
-        LeaveSheetFv leaveSheetFv=new LeaveSheetFv();
-        leaveSheetFv.setCompanyId(companyId);
-        leaveSheetFv.setOwnerId("1");
-        leaveSheetFv.setOwnerName("张三");
-        leaveSheetFv.setStartDate(LocalDate.of(2024,1,1));
-        leaveSheetFv.setEndDate(LocalDate.of(2024,1,2));
-        leaveSheetFv.setTimeType(0);
-        leaveSheetFv.setTimeDays(1.0f);
-        leaveSheetFv.setTimeHours(8.0f);
-        leaveSheetFv.setLeaveType(0);
-        leaveSheetFv.setProcinstId("1");
-        leaveSheetFv.setGmtFinished(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
-        leaveSheetFvMapper.insert(leaveSheetFv);
-    }
 }
 }

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

@@ -928,7 +928,6 @@ public class LeaveSheetServiceImpl extends ServiceImpl<LeaveSheetMapper, LeaveSh
             );
             );
             if (sumResponse.getStatusCode() == HttpStatus.OK) {
             if (sumResponse.getStatusCode() == HttpStatus.OK) {
                 totalNum = Integer.parseInt(sumResponse.getBody());
                 totalNum = Integer.parseInt(sumResponse.getBody());
-                System.out.println("totalNum===="+totalNum);
             } else {
             } else {
                 System.out.println("请求失败,状态码: " + sumResponse.getStatusCode());
                 System.out.println("请求失败,状态码: " + sumResponse.getStatusCode());
             }
             }

Разлика између датотеке није приказан због своје велике величине
+ 0 - 1120
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/LeaveSheetServiceImpl.java~


+ 14 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/OvertimeAllowanceServiceImpl.java

@@ -6,6 +6,8 @@ import com.management.platform.service.OvertimeAllowanceService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
+import java.util.List;
+
 /**
 /**
  * <p>
  * <p>
  *  服务实现类
  *  服务实现类
@@ -17,4 +19,16 @@ import org.springframework.stereotype.Service;
 @Service
 @Service
 public class OvertimeAllowanceServiceImpl extends ServiceImpl<OvertimeAllowanceMapper, OvertimeAllowance> implements OvertimeAllowanceService {
 public class OvertimeAllowanceServiceImpl extends ServiceImpl<OvertimeAllowanceMapper, OvertimeAllowance> implements OvertimeAllowanceService {
 
 
+    @Override
+    public List<OvertimeAllowance> getSummaryList(
+            Integer companyId,
+            Boolean isAllowance,
+            String corpwxUserid,
+            List<String> corpwxUserids,
+            Boolean noRecords,
+            String startDate,
+            String endDate) {
+        return baseMapper.getSummaryList(companyId, isAllowance, corpwxUserid, corpwxUserids, noRecords, startDate, endDate);
+    }
+
 }
 }

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

@@ -216,6 +216,9 @@ public class PermissionServiceImpl extends ServiceImpl<PermissionMapper, Permiss
             if (timeType.getNeedDeptAudit() == 1) {
             if (timeType.getNeedDeptAudit() == 1) {
                 wrapper.or().eq("need_dept_audit", 1);
                 wrapper.or().eq("need_dept_audit", 1);
             }
             }
+            if (company.getPackageOvertime() == 1) {
+                wrapper.or().eq("package_overtime", 1);
+            }
             return wrapper;
             return wrapper;
         });
         });
         List<SysRoleModule> sysRoleModuleList = sysRoleModuleMapper.selectList(new QueryWrapper<SysRoleModule>().eq("role_id", user.getRoleId()));
         List<SysRoleModule> sysRoleModuleList = sysRoleModuleMapper.selectList(new QueryWrapper<SysRoleModule>().eq("role_id", user.getRoleId()));

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

@@ -899,6 +899,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     //只能看本人参与的项目
                     //只能看本人参与的项目
                     httpRespMsg.data = projectMapper.getOnlyJoinProjects(user.getId(), user.getCompanyId());
                     httpRespMsg.data = projectMapper.getOnlyJoinProjects(user.getId(), user.getCompanyId());
                 } else {
                 } else {
+                    TimeType timeType = timeTypeMapper.selectById(user.getCompanyId());
                     //有权限的填报全部的进行中项目
                     //有权限的填报全部的进行中项目
                     QueryWrapper<Project> queryWrapper = new QueryWrapper<>();
                     QueryWrapper<Project> queryWrapper = new QueryWrapper<>();
                     queryWrapper.eq("company_id", user.getCompanyId())
                     queryWrapper.eq("company_id", user.getCompanyId())

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

@@ -56,7 +56,6 @@ import java.text.SimpleDateFormat;
 import java.time.*;
 import java.time.*;
 import java.time.chrono.ChronoLocalDate;
 import java.time.chrono.ChronoLocalDate;
 import java.time.format.DateTimeFormatter;
 import java.time.format.DateTimeFormatter;
-import java.time.format.DateTimeFormatterBuilder;
 import java.time.format.DateTimeParseException;
 import java.time.format.DateTimeParseException;
 import java.time.temporal.ChronoUnit;
 import java.time.temporal.ChronoUnit;
 import java.time.temporal.TemporalAdjusters;
 import java.time.temporal.TemporalAdjusters;
@@ -67,7 +66,6 @@ import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Executors;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.Function;
 import java.util.function.Function;
-import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
 /**
 /**
@@ -512,7 +510,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             }
             }
 
 
             //针对柘中,增加重新设置customText
             //针对柘中,增加重新设置customText
-            if (companyId == 4811 || companyId == 10) {
+            if (companyId == 4811) {
                 List<ConstructionStage> stageList = constructionStageMapper.selectList(new QueryWrapper<ConstructionStage>());
                 List<ConstructionStage> stageList = constructionStageMapper.selectList(new QueryWrapper<ConstructionStage>());
                 for (Map map : nameList) {
                 for (Map map : nameList) {
                     List<Map<String, Object>> reportList = (List<Map<String, Object>>) map.get("data");
                     List<Map<String, Object>> reportList = (List<Map<String, Object>>) map.get("data");
@@ -947,11 +945,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     r.setMultiDegrIdList(list);
                     r.setMultiDegrIdList(list);
                 }
                 }
 
 
-                if (companyId == 10 || companyId == 4811) {
+                if (companyId == 4811) {
                     List<ReportProjectConstruction> rpcList = reportProjectConstructionMapper.selectList(new QueryWrapper<ReportProjectConstruction>().eq("report_id", r.getId()));
                     List<ReportProjectConstruction> rpcList = reportProjectConstructionMapper.selectList(new QueryWrapper<ReportProjectConstruction>().eq("report_id", r.getId()));
-                    for (ReportProjectConstruction rpc : rpcList) {
-                        System.out.println(rpc.getConstructionStageId()+", "+rpc.getFinishNumber());
-                    }
                     List<ProjectConstructionStage> projectConstructionStageList = projectConstructionStageMapper.selectList(new QueryWrapper<ProjectConstructionStage>().eq("project_id", r.getProjectId()));
                     List<ProjectConstructionStage> projectConstructionStageList = projectConstructionStageMapper.selectList(new QueryWrapper<ProjectConstructionStage>().eq("project_id", r.getProjectId()));
                     for (ProjectConstructionStage stage : projectConstructionStageList) {
                     for (ProjectConstructionStage stage : projectConstructionStageList) {
                         if (rpcList.size() > 0) {
                         if (rpcList.size() > 0) {
@@ -979,10 +974,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 }
                 }
                 showRefresh = true;
                 showRefresh = true;
             }else if(timeType.getSyncFanwei()==1){
             }else if(timeType.getSyncFanwei()==1){
-                System.out.println("获取泛微考勤==="+date+", userId="+userId);
                 List<UserFvTime> userFvTimeList = userFvTimeMapper.selectList(new QueryWrapper<UserFvTime>()
                 List<UserFvTime> userFvTimeList = userFvTimeMapper.selectList(new QueryWrapper<UserFvTime>()
                         .eq("user_id", userId).eq("work_date", date));
                         .eq("user_id", userId).eq("work_date", date));
-                System.out.println("userFvTimeList:"+userFvTimeList.size());
                 if (userFvTimeList.size() > 0) {
                 if (userFvTimeList.size() > 0) {
                     UserFvTime time = userFvTimeList.get(0);
                     UserFvTime time = userFvTimeList.get(0);
                     resultMap.put("time", time);
                     resultMap.put("time", time);
@@ -1005,6 +998,15 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 showRefresh = true;
                 showRefresh = true;
             }
             }
             resultMap.put("showRefresh", showRefresh);
             resultMap.put("showRefresh", showRefresh);
+            if (company.getPackageOvertime() == 1) {
+                //有加班申请模块
+                Overtime overtime = overtimeMapper.selectOne(new QueryWrapper<Overtime>()
+                        .select("user_id, sum(duration) as duration").eq("user_id", userId).eq("date", date).ne("status", -1).ne("status", 3));
+                if (overtime != null) {
+                    //将秒转化为小时显示
+                    resultMap.put("overtime", DateTimeUtil.getHoursFromSeconds(overtime.getDuration()));
+                }
+            }
 
 
             //顺便返回公司的工作时间设置
             //顺便返回公司的工作时间设置
             resultMap.put("timeType",timeType);
             resultMap.put("timeType",timeType);
@@ -1481,10 +1483,6 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         //批量新增或更新
         //批量新增或更新
         if (reportList.size() > 0) {
         if (reportList.size() > 0) {
             reportService.saveOrUpdateBatch(reportList);
             reportService.saveOrUpdateBatch(reportList);
-            System.out.println("打印日报主键:");
-            for (Report r : reportList) {
-                System.out.println("reportId==========="+r.getId());
-            }
             //成都明夷电子,需要生成批量记录
             //成都明夷电子,需要生成批量记录
             Company company = companyMapper.selectById(companyId);
             Company company = companyMapper.selectById(companyId);
             if (company.getCompanyName().equals("成都明夷电子科技股份有限公司") || timeType.getEnableNewWeeklyfill() == 1 || timeType.getWeeklyChargeFilter() == 1) {//物奇需要填写周总结
             if (company.getCompanyName().equals("成都明夷电子科技股份有限公司") || timeType.getEnableNewWeeklyfill() == 1 || timeType.getWeeklyChargeFilter() == 1) {//物奇需要填写周总结
@@ -1701,7 +1699,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             }
             }
         }
         }
         //存储日报中的施工节点完成数量,并更新柘中的项目的完成度
         //存储日报中的施工节点完成数量,并更新柘中的项目的完成度
-        if (companyId == 10 || companyId == 4811) {
+        if (companyId == 4811) {
             List<ReportProjectConstruction> rpcList = new ArrayList<>();
             List<ReportProjectConstruction> rpcList = new ArrayList<>();
             //先删除,当天该员工的rpc记录
             //先删除,当天该员工的rpc记录
             String creatorId = reportList.get(0).getCreatorId();
             String creatorId = reportList.get(0).getCreatorId();
@@ -1783,6 +1781,96 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
 
 
     }
     }
 
 
+    //保存日报的记录(提交和审核通过)
+    private void saveReportWithAuditLog(List<User> userList, List<Report> reportList) {
+        if (reportList.size() == 0) return;
+        Report r = reportList.get(0);
+        List<ReportLog> addLogList = new ArrayList<>();
+        List<ReportLogDetail> addLogDetailList = new ArrayList<>();
+        Integer companyId = r.getCompanyId();
+        //合并提交和审核的记录
+        List<Report> mergeList = new ArrayList<>();
+        for (Report report : reportList) {
+            Report exists = mergeList.stream().filter(m -> m.getCreatorId().equals(report.getCreatorId()) && m.getCreateDate().isEqual(report.getCreateDate())).findFirst().orElse(null);
+            if (exists != null) {
+                exists.setContent(exists.getContent() + "," + report.getId());
+            } else {
+                report.setContent(report.getId()+"");
+                mergeList.add(report);
+            }
+        }
+        for (Report report : mergeList) {
+            //删除老的记录
+            reportLogMapper.delete(new QueryWrapper<ReportLog>().eq("company_id", r.getCompanyId()).eq("creator_id", report.getCreatorId())
+                    .eq("create_date", report.getCreateDate()));
+
+            //提交记录
+            ReportLog log = new ReportLog();
+            String creatorId = report.getCreatorId();
+            log.setCreatorId(report.getCreatorId());
+            log.setCreateDate(report.getCreateDate());
+            log.setOperateDate(report.getCreateTime());
+            log.setReportIds(report.getContent());
+            log.setOperatorId(report.getCreatorId());
+
+            ReportLogDetail detail = new ReportLogDetail();
+            detail.setWorkDate(log.getCreateDate());
+            detail.setReportId(report.getId());
+            detail.setCompanyId(companyId);
+            detail.setOperateDate(report.getCreateTime());
+
+            Optional<User> first = userList.stream().filter(u -> u.getId().equals(creatorId)).findFirst();
+            String reportOwner = "";
+            if (first.isPresent()) {
+                reportOwner = first.get().getName();
+            }
+            //日报提交记录
+            String msg = MessageUtils.message("profession.submit",reportOwner);
+            log.setMsg(msg);
+            log.setCompanyId(companyId);
+            addLogList.add(log);
+
+            detail.setOperatorId(log.getOperatorId());
+            detail.setOperateDate(log.getOperateDate());
+            detail.setMsg(log.getMsg());
+
+            addLogDetailList.add(detail);
+
+            //审核记录
+            if (report.getProjectAuditorId() != null) {
+                String auditorId = report.getProjectAuditorId();
+                log = new ReportLog();
+                log.setCreatorId(report.getCreatorId());
+                log.setCreateDate(report.getCreateDate());
+                log.setOperateDate(report.getProjectAuditTime());
+                log.setReportIds(report.getContent());
+                log.setOperatorId(report.getProjectAuditorId());
+
+                detail = new ReportLogDetail();
+                detail.setWorkDate(log.getCreateDate());
+                detail.setReportId(report.getId());
+                detail.setCompanyId(companyId);
+                User auditorUser = userList.stream().filter(u -> u.getId().equals(auditorId)).findFirst().orElse(null);
+                if (auditorUser != null) {
+                    //日报审核
+                    log.setMsg(auditorUser.getName() + "审核通过了日报");
+                    log.setCompanyId(companyId);
+                    addLogList.add(log);
+
+                    detail.setOperatorId(log.getOperatorId());
+                    detail.setOperateDate(log.getOperateDate());
+                    detail.setMsg(log.getMsg());
+                    addLogDetailList.add(detail);
+                }
+
+            }
+
+        }
+        reportLogService.saveBatch(addLogList);
+        //详细保存
+        reportLogDetailService.saveBatch(addLogDetailList);
+    }
+
     //保存提交日报的记录
     //保存提交日报的记录
     private void saveFillReportLog(List<Report> reportList) {
     private void saveFillReportLog(List<Report> reportList) {
         if (reportList.size() == 0) return;
         if (reportList.size() == 0) return;
@@ -2001,7 +2089,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             }
             }
             reportDeleteService.saveOrUpdateBatch(delList);
             reportDeleteService.saveOrUpdateBatch(delList);
             //更新项目施工进度
             //更新项目施工进度
-            if (company.getId() == 10 || company.getId() == 4811) {
+            if (company.getId() == 4811) {
                 List<ReportProjectConstruction> rpcList = new ArrayList<>();
                 List<ReportProjectConstruction> rpcList = new ArrayList<>();
                 //先删除,当天该员工的rpc记录
                 //先删除,当天该员工的rpc记录
                 String creatorId = reportList.get(0).getCreatorId();
                 String creatorId = reportList.get(0).getCreatorId();
@@ -2547,7 +2635,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 }
                 }
             }
             }
             //针对柘中的施工节点进度显示
             //针对柘中的施工节点进度显示
-            if (companyId == 10 || companyId == 4811) {
+            if (companyId == 4811) {
                 changeCustomText(auditReportList);
                 changeCustomText(auditReportList);
                 List<ConstructionStage> stageList = constructionStageMapper.selectList(new QueryWrapper<ConstructionStage>());
                 List<ConstructionStage> stageList = constructionStageMapper.selectList(new QueryWrapper<ConstructionStage>());
                 for (Map map : nameList) {
                 for (Map map : nameList) {
@@ -7995,7 +8083,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     }
                     }
 
 
                     if (curUser.getDepartmentId() != null && curUser.getDepartmentId() != 0) {
                     if (curUser.getDepartmentId() != null && curUser.getDepartmentId() != 0) {
-                        noRecord.department = departmentList.stream().filter(d->d.getDepartmentId().equals(curUser.getDepartmentId())).findFirst().get().getDepartmentName();
+                        noRecord.department = departmentList.stream().filter(d->d.getDepartmentId().equals(curUser.getDepartmentId())).findFirst().orElse(new Department().setDepartmentName("无")).getDepartmentName();
                     } else {
                     } else {
                         //noRecord.department = "无";
                         //noRecord.department = "无";
                         noRecord.department = MessageUtils.message("entry.none");
                         noRecord.department = MessageUtils.message("entry.none");
@@ -14888,6 +14976,322 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         return httpRespMsg;
         return httpRespMsg;
     }
     }
 
 
+    @Override
+    public HttpRespMsg importNewDataXiHe(Integer companyId, MultipartFile multipartFile, HttpServletRequest request) {
+        HttpRespMsg msg = new HttpRespMsg();
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+        TimeType timeType = timeTypeMapper.selectById(user.getCompanyId());
+        //然后处理文件
+        String fileName = multipartFile.getOriginalFilename();
+        File file = new File(fileName == null ? "file" : fileName);
+        InputStream inputStream = null;
+        OutputStream outputStream = null;
+        try {
+            inputStream = multipartFile.getInputStream();
+            outputStream = new FileOutputStream(file);
+            byte[] buffer = new byte[4096];
+            int temp = 0;
+            while ((temp = inputStream.read(buffer, 0, 4096)) != -1) {
+                outputStream.write(buffer, 0, temp);
+            }
+            inputStream.close();
+            outputStream.close();
+            //然后解析表格
+            Workbook workbook = WorkbookFactory.create(new FileInputStream(file));
+
+            DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/M/d");
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy/M/d");
+            SimpleDateFormat timeSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+            DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
+            SimpleDateFormat createTimeFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            DateTimeFormatter createTimeFormatterLocal = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+            //获取公司全部成员
+            List<User> allUserList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
+            List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
+            Sheet sheet = workbook.getSheetAt(0);
+            //由于第一行需要指明列对应的标题
+            int rowNum = sheet.getLastRowNum();
+            if (rowNum == 0) {
+                //msg.setError("请填写工时数据");
+                msg.setError(MessageUtils.message("report.data"));
+                return msg;
+            }
+            List<Project> allProjectList = projectMapper.selectList(new QueryWrapper<Project>().eq("company_id", companyId));
+            List<Report> reportList = new ArrayList<>();
+            List<String> userNameList=new ArrayList<>();
+            for (int rowIndex = 0; rowIndex <= rowNum; rowIndex++) {
+                Row row = sheet.getRow(rowIndex);
+                if (row == null) {
+                    continue;
+                }
+                if (ExcelUtil.isRowEmpty(row)) {
+                    continue;
+                }
+                //设置字符格式,防止纯数字工号读取时报错
+                row.getCell(7).setCellType(CellType.STRING);
+                String username = row.getCell(7).getStringCellValue().trim();
+
+                if (rowIndex == 0) {
+                    if(username.equals("填写人")){
+                        continue;
+                    }
+                }
+                if(!userNameList.contains(username)&&!username.equals("")){
+                    System.out.println("读取到填写人:" + username);
+                    userNameList.add(username);
+                }
+            }
+
+            WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+            List<User> targetUserList=new ArrayList<>();
+            HttpRespMsg respMsg=new HttpRespMsg();
+            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1&&userNameList.size()>0){
+                System.out.println("参与搜素的人员列表"+userNameList + userNameList.size());
+                respMsg = wxCorpInfoService.getBatchSearchUserInfo(wxCorpInfo, userNameList,null);
+                if(respMsg.code.equals("0")){
+                    msg.setError("姓名为["+String.valueOf(respMsg.data)+"]的人员存在重复,请使用工号!");
+                    return msg;
+                }
+                targetUserList= (List<User>) respMsg.data;
+            }
+
+            //下标从0开始
+            int dataCount = 0;
+            for (int rowIndex = 0; rowIndex <= rowNum; rowIndex++) {
+                Row row = sheet.getRow(rowIndex);
+                if (row == null) {
+                    continue;
+                }
+                if (ExcelUtil.isRowEmpty(row)) {
+                    continue;
+                }
+                if (rowIndex > 0) {
+                    dataCount++;
+                    //数据行
+                    if (row.getCell(0) == null) {
+                        //msg.setError("第"+dataCount+"行缺少日期");
+                        msg.setError(MessageUtils.message("data.NullErrorByRow",dataCount));
+                        return msg;
+                    }
+
+                    for (int i=0;i<=10;i++) {
+                        if (i != 6 && row.getCell(i) != null && i != 9 && i != 10) {
+                            row.getCell(i).setCellType(CellType.STRING);
+                        }
+                    }
+                    boolean isDateFormat = row.getCell(6).getCellTypeEnum() == CellType.NUMERIC;
+                    String reportDate = isDateFormat?sdf.format(row.getCell(6).getDateCellValue()):row.getCell(6).getStringCellValue();
+                    if (StringUtils.isEmpty(reportDate)) {
+                        //msg.setError("第"+dataCount+"行缺少日期");
+                        msg.setError(MessageUtils.message("data.NullErrorByRow",dataCount));
+                        return msg;
+                    }
+                    String jobNumber = row.getCell(8) != null?row.getCell(8).getStringCellValue().trim():null;
+//                    if (StringUtils.isEmpty(jobNumber)) {
+//                        msg.setError("员工工号不能为空");
+//                        return msg;
+//                    }
+//                    //检查人员是否存在
+//                    Optional<User> any = allUserList.stream().filter(u -> (u.getJobNumber()!=null&&u.getJobNumber().equals(jobNumber))).sorted(new Comparator<User>() {
+//                        @Override
+//                        public int compare(User o1, User o2) {
+//                            return o1.getIsActive() > o2.getIsActive() ? -1 : 1;
+//                        }
+//                    }).findAny();
+//                    if (!any.isPresent()) {
+//                        //msg.setError("人员["+username+"]不存在,请先在组织结构中添加或者通过钉钉同步导入");
+//                        msg.setError("工号:" + jobNumber + "不存在,请在系统组织架构中完善");
+//                        return msg;
+//                    }
+//                    User reportCreator = any.get();
+                    String username = row.getCell(7).getStringCellValue().trim();
+                    //检查人员是否存在
+                    Optional<User> any;
+                    Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(username)).findFirst();
+                    any = allUserList.stream().filter(u -> u.getName().equals(username)||(u.getJobNumber()!=null&&u.getJobNumber().equals(jobNumber))||(optional.isPresent()&&((u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))||(u.getDingdingUserid()!=null&&u.getDingdingUserid().equals(optional.get().getCorpwxUserid()))))).sorted(new Comparator<User>() {
+                        @Override
+                        public int compare(User o1, User o2) {
+                            return o1.getIsActive() > o2.getIsActive() ? -1 : 1;
+                        }
+                    }).findAny();
+                    if (!any.isPresent()) {
+                        //msg.setError("人员["+username+"]不存在,请先在组织结构中添加或者通过钉钉同步导入");
+                        msg.setError("人员["+username+"]不存在,请先在组织结构中同步导入");
+                        return msg;
+                    }
+                    User reportCreator = any.get();
+                    String pCode = row.getCell(0)==null?null:row.getCell(0).getStringCellValue();
+                    String pName = row.getCell(1)==null?null:row.getCell(1).getStringCellValue();
+                    Project project = null;
+                    if (StringUtils.isEmpty(pCode) && StringUtils.isEmpty(pName)) {
+                        msg.setError("项目编码和名称至少填写一项");
+                        return msg;
+                    } else if (!StringUtils.isEmpty(pCode)) {
+                        //优先按编码匹配
+                        Optional<Project> first = allProjectList.stream().filter(p -> pCode.equals(p.getProjectCode())).findFirst();
+                        if (first.isPresent()) {
+                            project = first.get();
+                        }
+                    } else if (!StringUtils.isEmpty(pName)) {
+                        Optional<Project> first = allProjectList.stream().filter(p -> pName.equals(p.getProjectName())).findFirst();
+                        if (first.isPresent()) {
+                            project = first.get();
+                        }
+                    }
+                    if (project == null) {
+                        msg.setError(MessageUtils.message("project.noExist","编码:"+pCode+"/名称:"+pName));
+                        return msg;
+                    }
+
+                    String workContent = row.getCell(2) == null?null:row.getCell(2).getStringCellValue();
+                    if (!StringUtils.isEmpty(workContent)) {
+                        workContent = workContent.trim();
+                    }
+                    double time = 0;
+                    String timeCell = row.getCell(3) == null?null:row.getCell(3).getStringCellValue();
+                    if (!StringUtils.isEmpty(timeCell)) {
+                        timeCell = timeCell.replace("H", "");
+                        time = Double.parseDouble(timeCell);
+                    }
+                    String overtimeCell = row.getCell(4) == null?null:row.getCell(4).getStringCellValue();
+                    Integer isOvertime = 0;
+                    if (!StringUtils.isEmpty(overtimeCell)) {
+                        overtimeCell = overtimeCell.replace("H", "");
+                        isOvertime = overtimeCell.equals("正常工时")?1:0;
+                    }
+                    String isAbnormal = row.getCell(5) == null?null:row.getCell(5).getStringCellValue();
+                    Integer extraField1 = "正常".equals(isAbnormal)? 0 : 1;
+                    String finishTime = null;
+                    if (row.getCell(9) == null) {
+                        //完成时间没有,按当前时间作为完成时间
+                        finishTime = timeSdf.format(new Date());
+                    } else {
+                        isDateFormat = row.getCell(9).getCellTypeEnum() == CellType.NUMERIC;
+                        finishTime = isDateFormat?timeSdf.format(row.getCell(9).getDateCellValue()):row.getCell(9).getStringCellValue();
+                    }
+                    if (StringUtils.isEmpty(finishTime)) {
+                        finishTime = timeSdf.format(new Date());
+                    }
+
+                    isDateFormat = row.getCell(10).getCellTypeEnum() == CellType.NUMERIC;
+                    String createTime = isDateFormat?createTimeFormatter.format(row.getCell(10).getDateCellValue()):row.getCell(10).getStringCellValue();
+
+                    if (time >= 0) {
+                        Report report = new Report();
+                        report.setCreateDate(LocalDate.parse(reportDate, dtf));
+                        report.setCompanyId(companyId);
+                        report.setCreatorId(reportCreator.getId());
+                        report.setDeptId(reportCreator.getDepartmentId());
+                        report.setProjectId(project.getId());
+                        report.setReportTimeType(1);
+                        report.setWorkingTime(time);
+                        report.setMultiWorktime(timeType.getMultiWorktime());
+                        report.setContent(workContent);
+                        report.setIsOvertime(isOvertime);
+                        if (isOvertime == 1) {
+                            report.setOvertimeHours(report.getWorkingTime());
+                        }
+                        report.setExtraField1(extraField1);
+                        report.setProjectAuditState(1);
+                        if (reportCreator.getDepartmentId() != null) {
+                            Department dept = departmentList.stream().filter(dept2->dept2.getDepartmentId().equals(reportCreator.getDepartmentId())).findFirst().orElse(null);
+                            if (dept != null) {
+                                report.setProjectAuditorId(dept.getManagerId());
+                            }
+                        }
+                        report.setProjectAuditTime(LocalDateTime.parse(finishTime, timeFormatter));
+                        report.setCreateTime(LocalDateTime.parse(createTime, createTimeFormatterLocal));
+                        report.setState(1);//直接设置为通过
+
+                        report.setCreateDate(LocalDate.parse(reportDate, dtf));
+                        report.setCost(reportCreator.getCost()==null?new BigDecimal(0) : reportCreator.getCost().multiply(new BigDecimal(time)));
+                        reportList.add(report);
+                    } else if (time < 0) {
+                        msg.setError("第" + dataCount + "行工时为负数");
+                        return msg;
+                    }
+                }
+            }
+
+            if (reportList.size() > 0) {
+                int shouldSkipPassData = 0;
+                //依赖于对是否需要部门审核的判断,如果不需要则认为导入的就是审核通过的,重新导入就直接覆盖之前的。
+                reportMapper.deleteUserSameDayReport(companyId, reportList, shouldSkipPassData);
+                //存储
+                if (reportList.size() == 0) {
+                    //全部是重复的,本次没有需要导入的
+                    //msg.setError("本次数据全部已审核通过,无法导入。");
+                    msg.setError(MessageUtils.message("finance.importErrorByAllAdopt"));
+                    return msg;
+                } else {
+                    reportService.saveBatch(reportList);
+                    saveReportWithAuditLog(allUserList, reportList);
+                    msg.data = dataCount;
+                    String originName = fileName;
+                    //定义一个独立的文件夹
+                    String importFolder = "report_import";
+                    File dir = new File(path, importFolder);
+                    if (!dir.exists()) {
+                        dir.mkdir();
+                    }
+
+                    String[] names = originName.split("\\.");
+                    String destFileName = names[0] + "_"+System.currentTimeMillis()+"."+names[1];
+                    File destFile = new File(dir, destFileName);
+                    FileUtils.copyFile(file, destFile);
+                    ReportImportLog log = new ReportImportLog();
+                    log.setCompanyId(user.getCompanyId());
+                    log.setFileName(originName);
+                    log.setServerName(importFolder+"/"+destFileName);
+                    log.setUserId(user.getId());
+                    log.setUserName(user.getName());
+                    reportImportLogMapper.insert(log);
+                }
+            } else {
+                //msg.setError("工时数据不能为空");
+                msg.setError(MessageUtils.message("report.dataNullError"));
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+            //msg.setError("文件处理出错");
+            msg.setError(MessageUtils.message("file.error"));
+            return msg;
+        } catch (NullPointerException e) {
+            e.printStackTrace();
+            //msg.setError("数据格式有误或存在空数据 导入失败");
+            msg.setError(MessageUtils.message("file.dataFormatError"));
+            return msg;
+        }catch (InvalidFormatException e) {
+            e.printStackTrace();
+            //msg.setError("文件格式错误,如果安装了加密软件需要先解密再上传");
+            msg.setError(MessageUtils.message("file.FormatErrorAndDecrypt"));
+            return msg;
+        }catch (EncryptedDocumentException e) {
+            e.printStackTrace();
+            //msg.setError("文件加密状态,需要先解除加密状态再上传");
+            msg.setError(MessageUtils.message("file.encryption"));
+            return msg;
+        } catch (Exception e) {
+            e.printStackTrace();
+            //msg.setError("发生其他错误:"+e.getMessage());
+            msg.setError(MessageUtils.message("other.errorByParameter",e.getMessage()));
+            return msg;
+        } finally {
+            //关闭流
+            try {
+                if (outputStream != null && inputStream != null) {
+                    outputStream.close();
+                    inputStream.close();
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+            file.delete();
+        }
+        return msg;
+    }
+
     public String getWeek(DayOfWeek dayOfWeek){
     public String getWeek(DayOfWeek dayOfWeek){
         //获取中文形式的星期几
         //获取中文形式的星期几
         String dayOfWeekChinese = "";
         String dayOfWeekChinese = "";

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

@@ -243,7 +243,6 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
         if (userList.size() == 0) {
         if (userList.size() == 0) {
             //未检索到账号时
             //未检索到账号时
             String noUser = MessageUtils.message("user.notExists");
             String noUser = MessageUtils.message("user.notExists");
-            System.out.println(noUser);
             httpRespMsg.setError(noUser);
             httpRespMsg.setError(noUser);
         } else if (userList.size() > 1) {
         } else if (userList.size() > 1) {
             //检索到两个及以上账号时
             //检索到两个及以上账号时
@@ -511,7 +510,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             } catch (IOException e) {
             } catch (IOException e) {
                 e.printStackTrace();
                 e.printStackTrace();
             }
             }
-            System.out.println(file.delete());
+            file.delete();
         }
         }
         return msg;
         return msg;
     }
     }
@@ -601,6 +600,9 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
         if (company.getPackageDevice() == 1) {
         if (company.getPackageDevice() == 1) {
             queryWrapper.or().eq("package_device", 1);
             queryWrapper.or().eq("package_device", 1);
         }
         }
+        if (company.getPackageOvertime() == 1) {
+            queryWrapper.or().eq("package_overtime", 1);
+        }
 
 
         queryWrapper.orderByAsc("orderitem");
         queryWrapper.orderByAsc("orderitem");
 
 

+ 284 - 25
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java

@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.management.platform.constant.Constant;
 import com.management.platform.controller.WeiXinCorpController;
 import com.management.platform.controller.WeiXinCorpController;
 import com.management.platform.entity.*;
 import com.management.platform.entity.*;
 import com.management.platform.mapper.*;
 import com.management.platform.mapper.*;
@@ -192,6 +193,9 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
     @Autowired
     @Autowired
     private OvertimeAllowanceService overtimeAllowanceService;
     private OvertimeAllowanceService overtimeAllowanceService;
 
 
+    @Resource
+    private com.management.platform.service.OvertimeService overtimeService;
+
 
 
     //获取服务商provider_access_token
     //获取服务商provider_access_token
     @Override
     @Override
@@ -337,7 +341,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
         }else {
         }else {
             throw new Exception(json.toJSONString());
             throw new Exception(json.toJSONString());
         }
         }
-        System.out.println(resultUrl);
+//        System.out.println(resultUrl);
         return resultUrl;
         return resultUrl;
     }
     }
     @Override
     @Override
@@ -788,7 +792,6 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                 //指定获取员工
                 //指定获取员工
                 User user = userMapper.selectById(userId);
                 User user = userMapper.selectById(userId);
                 corpwxUserIds.add(user.getCorpwxUserid());
                 corpwxUserIds.add(user.getCorpwxUserid());
-                System.out.println("获取corpwxuserid==" + user.getCorpwxUserid() + "的考勤记录");
             }
             }
             //按批调用
             //按批调用
             for (int i = 0; i < batchCount; i++) {
             for (int i = 0; i < batchCount; i++) {
@@ -1051,6 +1054,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
         long dataTime = needDataTime.toEpochSecond(ZoneOffset.of("+8"));
         long dataTime = needDataTime.toEpochSecond(ZoneOffset.of("+8"));
         String checkinOption = getCheckinOption(corpInfo, dataTime, objects);
         String checkinOption = getCheckinOption(corpInfo, dataTime, objects);
         JSONObject optionObject = JSONObject.parseObject(checkinOption);
         JSONObject optionObject = JSONObject.parseObject(checkinOption);
+//        showLog = true;
         JSONArray  optionDatas= optionObject.getJSONArray("info");
         JSONArray  optionDatas= optionObject.getJSONArray("info");
         String url = GET_CHECKIN_DATA.replace("ACCESS_TOKEN", getCorpAccessToken(corpInfo));
         String url = GET_CHECKIN_DATA.replace("ACCESS_TOKEN", getCorpAccessToken(corpInfo));
         HttpHeaders headers = new HttpHeaders();
         HttpHeaders headers = new HttpHeaders();
@@ -1133,7 +1137,6 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                     UserCorpwxTime userCorpwxTime=new UserCorpwxTime();
                     UserCorpwxTime userCorpwxTime=new UserCorpwxTime();
                     userCorpwxTime.setCorpwxUserid((String) objects[i]);
                     userCorpwxTime.setCorpwxUserid((String) objects[i]);
                     userCorpwxTime.setCompanyId(corpInfo.getCompanyId());
                     userCorpwxTime.setCompanyId(corpInfo.getCompanyId());
-
                     if(upList.isEmpty()||downList.isEmpty()){
                     if(upList.isEmpty()||downList.isEmpty()){
                         continue;
                         continue;
                     }
                     }
@@ -1146,7 +1149,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                     LocalTime startCardTime = LocalTime.parse(minTime,df).plusHours(8);
                     LocalTime startCardTime = LocalTime.parse(minTime,df).plusHours(8);
                     LocalTime endCardTime = LocalTime.parse(maxTime,df).plusHours(8);
                     LocalTime endCardTime = LocalTime.parse(maxTime,df).plusHours(8);
                     if (showLog) System.out.println("min=" + min + ",max=" + max+", startTime="+startCardTime.format(df)
                     if (showLog) System.out.println("min=" + min + ",max=" + max+", startTime="+startCardTime.format(df)
-                                +"endTime="+endCardTime.format(df));
+                                +"endTime="+endCardTime.format(df) + ", restTime="+ restTime);
                     userCorpwxTime.setStartTime(startCardTime.format(df));
                     userCorpwxTime.setStartTime(startCardTime.format(df));
                     userCorpwxTime.setEndTime(endCardTime.format(df));
                     userCorpwxTime.setEndTime(endCardTime.format(df));
                     userCorpwxTime.setWxCorpid(corpInfo.getCorpid());
                     userCorpwxTime.setWxCorpid(corpInfo.getCorpid());
@@ -1196,7 +1199,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                         }
                         }
                     }
                     }
                     //处理曦合超导的加班补贴
                     //处理曦合超导的加班补贴
-                    if (corpInfo.getCompanyId() == 8555 || corpInfo.getCompanyId() == 8128) {
+                    if (corpInfo.getCompanyId() == Constant.XI_HE_CHAO_DAO_COMPANY_ID || corpInfo.getCompanyId() == Constant.XI_HE_CHAO_DAO_JIA_XING_COMPANY_ID || corpInfo.getCompanyId() == 8128) {
                         handleAllowance(userCorpwxTime, baseMorningStart, baseMorningEnd, baseAfternoonStart, baseAfternoonEnd, restTime);
                         handleAllowance(userCorpwxTime, baseMorningStart, baseMorningEnd, baseAfternoonStart, baseAfternoonEnd, restTime);
                     }
                     }
                 }
                 }
@@ -1440,6 +1443,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
 
 
         if (responseEntity.getStatusCode() == HttpStatus.OK) {
         if (responseEntity.getStatusCode() == HttpStatus.OK) {
             String resp = responseEntity.getBody();
             String resp = responseEntity.getBody();
+            System.out.println("考勤规则:" + resp);
             return resp;
             return resp;
         }
         }
         return "";
         return "";
@@ -1814,7 +1818,24 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                                 }
                                 }
                             }
                             }
                         }
                         }
-                        if (corpInfo.getCompanyId() == 469 || corpInfo.getCompanyId() == 7 || corpInfo.getCompanyId() == 8607 || corpInfo.getCompanyId() == 8555 || corpInfo.getCompanyId() == 8582) {
+                        //处理加班时长
+                        JSONObject overtimeInfo = jsonObject.getJSONObject("ot_info");
+                        Integer otStatus = overtimeInfo.getIntValue("ot_status");
+                        Integer duration = overtimeInfo.getInteger("ot_duration");//秒为单位
+                        if (otStatus == 2 && duration == 0) {
+                            //加班时长不足,还是以加班单时长为准
+                            JSONArray array = overtimeInfo.getJSONArray("exception_duration");
+                            if (array != null && array.size() > 0) {
+                                duration = array.getIntValue(0);
+                            }
+                        }
+                        ct.setOtStatus(otStatus);
+                        //加班
+                        double overtime = convertDayTimeToHours(DateTimeUtil.getHoursFromSeconds(duration));
+                        if (showLog) System.out.println("加班时长:"+overtime);
+                        ct.setOtTime(overtime);
+
+                        if (corpInfo.getCompanyId() == 469 || corpInfo.getCompanyId() == 7 || corpInfo.getCompanyId() == 8607 || corpInfo.getCompanyId() == Constant.XI_HE_CHAO_DAO_COMPANY_ID || corpInfo.getCompanyId() == Constant.XI_HE_CHAO_DAO_JIA_XING_COMPANY_ID || corpInfo.getCompanyId() == 8582) {
                             needRecaculate = true;//赛元微电子,都需要重新计算
                             needRecaculate = true;//赛元微电子,都需要重新计算
                         }
                         }
                         double timeDelta = 0;
                         double timeDelta = 0;
@@ -1828,7 +1849,9 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                             }
                             }
                         } else {
                         } else {
                             //企微传过来的考勤时间大于等于9小时,可能是包含午休的时间,需要减去。
                             //企微传过来的考勤时间大于等于9小时,可能是包含午休的时间,需要减去。
-                            if (ct.getEndTime().compareTo(baseAfternoonStart) >= 0 && ct.getCardTime() >= standard_work_time + restTime) {
+                            if (corpInfo.getCompanyId() == 3092) {
+                                timeDelta = ct.getCardTime();
+                            } else if (ct.getEndTime().compareTo(baseAfternoonStart) >= 0 && ct.getCardTime() >= standard_work_time + restTime + overtime) {
                                 //重新计算工作工时时,需要用打卡总时间减去中间午休时间
                                 //重新计算工作工时时,需要用打卡总时间减去中间午休时间
                                 timeDelta = ct.getCardTime() - restTime;
                                 timeDelta = ct.getCardTime() - restTime;
                             } else {
                             } else {
@@ -1932,22 +1955,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                                 }
                                 }
                             }
                             }
                         }
                         }
-                        //处理加班时长
-                        JSONObject otInfo = jsonObject.getJSONObject("ot_info");
-                        Integer s = otInfo.getIntValue("ot_status");
-                        Integer duration = otInfo.getInteger("ot_duration");//秒为单位
-                        if (s == 2 && duration == 0) {
-                            //加班时长不足,还是以加班单时长为准
-                            JSONArray array = otInfo.getJSONArray("exception_duration");
-                            if (array != null && array.size() > 0) {
-                                duration = array.getIntValue(0);
-                            }
-                        }
-                        ct.setOtStatus(s);
-                        //加班
-                        double otTime = convertDayTimeToHours(DateTimeUtil.getHoursFromSeconds(duration));
-                        if (showLog) System.out.println("加班时长:"+otTime);
-                        ct.setOtTime(otTime);
+
                         //校正请假时长
                         //校正请假时长
                         if (ct.getAskLeaveTime() != null && ct.getAskLeaveTime() == 24.0) {
                         if (ct.getAskLeaveTime() != null && ct.getAskLeaveTime() == 24.0) {
                             ct.setAskLeaveTime(8.0);//24小时为一天,修正为8小时
                             ct.setAskLeaveTime(8.0);//24小时为一天,修正为8小时
@@ -2117,7 +2125,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                                 if (showLog) System.out.println("更新考勤记录"+curUserid+", "+localDate);
                                 if (showLog) System.out.println("更新考勤记录"+curUserid+", "+localDate);
                                 userCorpwxTimeMapper.updateById(ct);
                                 userCorpwxTimeMapper.updateById(ct);
                             }
                             }
-                            if (corpInfo.getCompanyId() == 8555 || corpInfo.getCompanyId() == 8128) {
+                            if (corpInfo.getCompanyId() == Constant.XI_HE_CHAO_DAO_COMPANY_ID || corpInfo.getCompanyId() == Constant.XI_HE_CHAO_DAO_JIA_XING_COMPANY_ID || corpInfo.getCompanyId() == 8128) {
                                 handleAllowance(item, baseMorningStart, baseMorningEnd, baseAfternoonStart, baseAfternoonEnd, restTime);
                                 handleAllowance(item, baseMorningStart, baseMorningEnd, baseAfternoonStart, baseAfternoonEnd, restTime);
                             }
                             }
                         }
                         }
@@ -2125,7 +2133,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                         if (hasTimeRecord) {
                         if (hasTimeRecord) {
                             if (showLog) System.out.println("插入考勤记录"+curUserid+", "+localDate);
                             if (showLog) System.out.println("插入考勤记录"+curUserid+", "+localDate);
                             userCorpwxTimeMapper.insert(ct);
                             userCorpwxTimeMapper.insert(ct);
-                            if (corpInfo.getCompanyId() == 8555 || corpInfo.getCompanyId() == 8128) {
+                            if (corpInfo.getCompanyId() == Constant.XI_HE_CHAO_DAO_COMPANY_ID || corpInfo.getCompanyId() == Constant.XI_HE_CHAO_DAO_JIA_XING_COMPANY_ID || corpInfo.getCompanyId() == 8128) {
                                 handleAllowance(ct, baseMorningStart, baseMorningEnd, baseAfternoonStart, baseAfternoonEnd, restTime);
                                 handleAllowance(ct, baseMorningStart, baseMorningEnd, baseAfternoonStart, baseAfternoonEnd, restTime);
                             }
                             }
 
 
@@ -3156,5 +3164,256 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
         return mediaId;
         return mediaId;
     }
     }
 
 
+    /**
+     * 获取并保存当天的加班审批单列表(针对指定公司)
+     * @param companyId 公司ID
+     * @param userId 用户ID(可为null,为null时获取所有人)
+     * @param startDate 开始日期(yyyy-MM-dd)
+     * @param endDate 结束日期(yyyy-MM-dd)
+     * @return 加班审批详情列表
+     */
+    @Override
+    public JSONArray getAndSaveOvertimeApprovalList(Integer companyId, String userId, String startDate, String endDate) throws Exception {
+        // 构建过滤条件:record_type=5 表示加班审批
+        JSONArray filterArray = new JSONArray();
+        JSONObject filter = new JSONObject();
+        filter.put("key", "record_type");
+        filter.put("value", "5");
+        filterArray.add(filter);
+
+        // 如果指定了申请人
+        if (userId != null) {
+            User user = userMapper.selectById(userId);
+            if (user != null && user.getCorpwxUserid() != null) {
+                JSONObject creatorFilter = new JSONObject();
+                creatorFilter.put("key", "creator");
+                creatorFilter.put("value", user.getCorpwxUserid());
+                filterArray.add(creatorFilter);
+            }
+        }
+
+        // 调用service层方法获取审批单号列表
+        JSONArray approvalList = getApprovalInfo(companyId, startDate, endDate, "", filterArray);
+
+        JSONArray detailList = new JSONArray();
+        if (approvalList == null || approvalList.size() == 0) {
+            System.out.println("未查询到加班审批单号, companyId=" + companyId + ", startDate=" + startDate + ", endDate=" + endDate);
+            return detailList;
+        }
+
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+        for (int i = 0; i < approvalList.size(); i++) {
+            String spNo = approvalList.getString(i);
+            try {
+                // 获取审批单详情
+                JSONObject detail = getApprovalDetail(companyId, spNo);
+                if (detail == null) continue;
+
+                JSONObject result = new JSONObject();
+                result.put("sp_no", spNo);
+
+                // 提交人信息
+                JSONObject applyer = detail.getJSONObject("applyer");
+                if (applyer != null) {
+                    result.put("applyer_userid", applyer.getString("userid"));
+                    result.put("applyer_name", applyer.getString("partyname"));
+                }
+
+                // 审批申请数据
+                JSONObject applyData = detail.getJSONObject("apply_data");
+                if (applyData != null) {
+                    JSONArray contents = applyData.getJSONArray("contents");
+                    if (contents != null) {
+                        for (int j = 0; j < contents.size(); j++) {
+                            JSONObject content = contents.getJSONObject(j);
+                            String controlName = content.getString("control");
+                            System.out.println("content=" + content);
+                            JSONArray titleArray = content.getJSONArray("title");
+                            String title = null;
+                            if (titleArray != null) {
+                                for (int k = 0; k < titleArray.size(); k++) {
+                                    JSONObject titleItem = titleArray.getJSONObject(k);
+                                    if ("zh_CN".equals(titleItem.getString("lang"))) {
+                                        title = titleItem.getString("text");
+                                        break;
+                                    }
+                                }
+                            }
+                            // 加班时间信息 - 从Attendance控件中解析
+                            if ("Attendance".equals(controlName)) {
+                                JSONObject value = content.getJSONObject("value");
+                                if (value != null) {
+                                    JSONObject attendance = value.getJSONObject("attendance");
+                                    if (attendance != null) {
+                                        JSONObject dateRange = attendance.getJSONObject("date_range");
+                                        if (dateRange != null) {
+                                            Long startTimestamp = dateRange.getLong("new_begin");
+                                            LocalDateTime startDateTime = LocalDateTime.ofInstant(
+                                                    Instant.ofEpochSecond(startTimestamp),
+                                                    ZoneId.systemDefault()
+                                            );
+                                            result.put("start_time", startDateTime.format(formatter));
+
+                                            Long endTimestamp = dateRange.getLong("new_end");
+                                            LocalDateTime endDateTime = LocalDateTime.ofInstant(
+                                                    Instant.ofEpochSecond(endTimestamp),
+                                                    ZoneId.systemDefault()
+                                            );
+                                            result.put("end_time", endDateTime.format(formatter));
+                                            result.put("duration", dateRange.getLong("new_duration"));
+                                            result.put("duration_type", dateRange.getString("type"));
+                                        }
+                                        result.put("attendance_type", attendance.getInteger("type"));
+                                    }
+                                }
+                            } else if ("是否夜班".equals(title)) {
+                                JSONObject value = content.getJSONObject("value");
+                                if (value != null) {
+                                    JSONObject selector = value.getJSONObject("selector");
+                                    if (selector != null) {
+                                        JSONArray options = selector.getJSONArray("options");
+                                        if (options != null && options.size() > 0) {
+                                            JSONObject option = options.getJSONObject(0);
+                                            JSONArray valueArray = option.getJSONArray("value");
+                                            if (valueArray != null) {
+                                                for (int k = 0; k < valueArray.size(); k++) {
+                                                    JSONObject valueItem = valueArray.getJSONObject(k);
+                                                    if ("zh_CN".equals(valueItem.getString("lang"))) {
+                                                        String nightShiftText = valueItem.getString("text");
+                                                        result.put("is_night_shift", "是".equals(nightShiftText));
+                                                        break;
+                                                    }
+                                                }
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+
+                System.out.println("=== 加班审批单详情 ===");
+                System.out.println("审批单号: " + result.getString("sp_no"));
+                System.out.println("提交人ID: " + result.getString("applyer_userid"));
+                System.out.println("提交人姓名: " + result.getString("applyer_name"));
+                System.out.println("开始时间: " + result.getString("start_time"));
+                System.out.println("结束时间: " + result.getString("end_time"));
+                System.out.println("加班时长(秒): " + result.getLong("duration"));
+                System.out.println("时长类型: " + result.getString("duration_type"));
+                System.out.println("考勤类型: " + result.getInteger("attendance_type"));
+                System.out.println("=====================");
+
+                detailList.add(result);
+            } catch (Exception e) {
+                System.err.println("获取审批单 " + spNo + " 详情失败: " + e.getMessage());
+                e.printStackTrace();
+            }
+        }
+
+        // 保存或更新加班数据
+        saveOrUpdateOvertimeList(companyId, detailList);
+        return detailList;
+    }
+
+    /**
+     * 保存或更新加班数据
+     */
+    private void saveOrUpdateOvertimeList(Integer companyId, JSONArray array) {
+        if (array == null || array.isEmpty()) {
+            return;
+        }
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        for (int i = 0; i < array.size(); i++) {
+            JSONObject item = array.getJSONObject(i);
+            try {
+                String spNo = item.getString("sp_no");
+                if (org.springframework.util.StringUtils.isEmpty(spNo)) {
+                    System.err.println("审批单号为空,跳过该记录");
+                    continue;
+                }
+
+                // 根据审批单号查询是否已存在
+                com.management.platform.entity.Overtime existingOvertime = overtimeService.getOne(
+                        new QueryWrapper<com.management.platform.entity.Overtime>().eq("sp_no", spNo).eq("company_id", companyId));
+
+                com.management.platform.entity.Overtime overtime;
+                if (existingOvertime != null) {
+                    overtime = existingOvertime;
+                } else {
+                    overtime = new com.management.platform.entity.Overtime();
+                    overtime.setSpNo(spNo);
+                    overtime.setCompanyId(companyId);
+                    overtime.setStatus(3);//审核通过
+                }
+
+                // 设置企微用户ID
+                String applyerWxUserid = item.getString("applyer_userid");
+                if (!org.springframework.util.StringUtils.isEmpty(applyerWxUserid)) {
+                    overtime.setApplyerWxUserid(applyerWxUserid);
+                    QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
+                    if (companyId == 7) {
+                        userQueryWrapper.eq("corpwx_real_userid", applyerWxUserid).eq("company_id", companyId);
+                    } else {
+                        userQueryWrapper.eq("corpwx_userid", applyerWxUserid).eq("company_id", companyId);
+                    }
+                    User user = userMapper.selectOne(userQueryWrapper);
+                    if (user != null) {
+                        overtime.setUserId(user.getId());
+                    } else {
+                        System.err.println("未找到企微用户ID对应的系统用户: " + applyerWxUserid);
+                    }
+                }
+
+                // 设置加班开始时间
+                String startTimeStr = item.getString("start_time");
+                if (!org.springframework.util.StringUtils.isEmpty(startTimeStr)) {
+                    overtime.setStartTime(LocalDateTime.parse(startTimeStr, formatter));
+                    overtime.setDate(overtime.getStartTime().toLocalDate());
+                }
+
+                // 设置加班结束时间
+                String endTimeStr = item.getString("end_time");
+                if (!org.springframework.util.StringUtils.isEmpty(endTimeStr)) {
+                    overtime.setEndTime(LocalDateTime.parse(endTimeStr, formatter));
+                }
+
+                // 设置加班时长(秒)
+                Long duration = item.getLong("duration");
+                if (duration != null) {
+                    overtime.setDuration(duration.intValue());
+                }
+
+                // 设置时长类型
+                String durationType = item.getString("duration_type");
+                if (!org.springframework.util.StringUtils.isEmpty(durationType)) {
+                    overtime.setDurationType(durationType);
+                }
+
+                // 设置考勤类型
+                Integer attendanceType = item.getInteger("attendance_type");
+                if (attendanceType != null) {
+                    overtime.setAttendanceType(attendanceType);
+                }
+
+                // 设置是否夜班
+                Boolean isNightShift = item.getBoolean("is_night_shift");
+                if (isNightShift != null) {
+                    overtime.setIsNightShift(isNightShift);
+                }
+
+                boolean success = overtimeService.saveOrUpdate(overtime);
+                if (success) {
+                    System.out.println("成功保存加班记录,审批单号: " + spNo);
+                } else {
+                    System.err.println("保存加班记录失败,审批单号: " + spNo);
+                }
+            } catch (Exception e) {
+                System.err.println("处理加班记录时发生异常: " + e.getMessage());
+                e.printStackTrace();
+            }
+        }
+    }
 
 
 }
 }

+ 25 - 258
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java

@@ -263,7 +263,6 @@ public class TimingTask {
         List<Company> companyList = companyMapper.selectList(new QueryWrapper<Company>().in("id", compIds).ge("expiration_date", LocalDateTime.now()));
         List<Company> companyList = companyMapper.selectList(new QueryWrapper<Company>().in("id", compIds).ge("expiration_date", LocalDateTime.now()));
         for (Company company : companyList) {
         for (Company company : companyList) {
             Integer companyId = company.getId();
             Integer companyId = company.getId();
-            System.out.println("钉钉同步:companyId="+companyId);
             dingDingService.syncCardTime(companyId, null, yesStr, yesStr);
             dingDingService.syncCardTime(companyId, null, yesStr, yesStr);
         }
         }
     }
     }
@@ -283,7 +282,6 @@ public class TimingTask {
                 addList.add(participation);
                 addList.add(participation);
             }
             }
         }
         }
-        System.out.println("需要补参与人数据:"+addList.size());
         if (addList.size() > 0) {
         if (addList.size() > 0) {
             participationMapper.insertBatch(addList);
             participationMapper.insertBatch(addList);
         }
         }
@@ -311,7 +309,6 @@ public class TimingTask {
                     long t1 = System.currentTimeMillis();
                     long t1 = System.currentTimeMillis();
                     dingDingService.syncUserWorkData(dingdingList.get(i), null, startDate, endDate, false, false);
                     dingDingService.syncUserWorkData(dingdingList.get(i), null, startDate, endDate, false, false);
                     long t2 = System.currentTimeMillis();
                     long t2 = System.currentTimeMillis();
-                    System.out.println("同步 "+dingdingList.get(i).getCorpName()+", 总共耗时:"+(t2-t1)+"ms");
                 }
                 }
             }
             }
         }
         }
@@ -410,253 +407,6 @@ public class TimingTask {
         }
         }
     }
     }
 
 
-
-    //每天2:11 同步泛微用户前2天到未来30天时间段的打卡,请假,出差数据
-    @Scheduled(cron = "0 11 2 ? * *")
-    private void synFanWeiWorkData() {
-        if (isDev) return;
-        if(!isPrivateDeploy) return;
-        List<TimeType> timeTypeList = timeTypeMapper.selectList(new QueryWrapper<TimeType>().eq("sync_fanwei", 1));
-        List<Integer> compIds = timeTypeList.stream().map(TimeType::getCompanyId).collect(Collectors.toList());
-        if(compIds.isEmpty()){
-            return;
-        }
-        for (Integer compId : compIds) {
-            DockWithMLD dockWithMLD=new DockWithMLD();
-            JSONObject jsonObject=new JSONObject();
-            DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
-            DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
-            DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("HH:mm");
-            //需要修改************************************************  日期
-            LocalDateTime yesterday = LocalDateTime.now().minusDays(2);
-            String startDate = dtf.format(yesterday);
-            String endDate = dtf.format(yesterday.plusDays(30));
-            List<UserFvTime> oldUserFvTimeList = userFvTimeService.list(new QueryWrapper<UserFvTime>().eq("company_id", compId));
-            List<LeaveSheet> oldLeaveSheetList = leaveSheetService.list(new QueryWrapper<LeaveSheet>().eq("company_id", compId));
-            List<BusinessTrip> oldBusinessTripList = businessTripService.list(new QueryWrapper<BusinessTrip>().eq("company_id", compId));
-            /*jsonObject.put("startDate",startDate);
-            jsonObject.put("endDate",endDate);*/
-            jsonObject.put("workDate",startDate);
-            jsonObject.put("gmtFinished",startDate);
-            String jsonString = jsonObject.toJSONString();
-            List<UserFvTime> userFvTimeList=new ArrayList<>();
-            List<LeaveSheet> leaveSheetList=new ArrayList<>();
-            List<BusinessTrip> businessTripList=new ArrayList<>();
-            TimeType allDay = timeTypeMapper.selectOne(new QueryWrapper<TimeType>().eq("company_id", compId));
-            List<User> allUserList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", compId));
-            //获取休息设置
-            List<TimeAutoExclude> excludeTimeList = timeAutoExcludeMapper.selectList(new QueryWrapper<TimeAutoExclude>().eq("company_id", compId));
-
-            //Todo: 获取考勤打卡数据
-            HttpRespMsg workDataMsg = dockWithMLD.getResult("http://10.1.10.51:20175/api/cube/restful/interface/getModeDataPageList/getWorkData", jsonString);
-            List<Map<String,Object>> workDataList= (List<Map<String, Object>>) workDataMsg.data;
-            //Todo: 获取外出打卡数据
-            HttpRespMsg outWorkDataMsg = dockWithMLD.getResult("http://10.1.10.51:20175/api/cube/restful/interface/getModeDataPageList/getOutRecord", jsonString);
-            List<Map<String,Object>> outWorkDataList= (List<Map<String, Object>>) outWorkDataMsg.data;
-            //Todo: 获取考勤补卡数据
-            HttpRespMsg replaceWorkDataMsg = dockWithMLD.getResult("http://10.1.10.51:20175/api/cube/restful/interface/getModeDataPageList/getReplaceRecord", jsonString);
-            List<Map<String,Object>> replaceWorkDataList= (List<Map<String, Object>>) replaceWorkDataMsg.data;
-            List<String> userIds = workDataList.stream().map(map -> String.valueOf(map.get("userId"))).distinct().collect(Collectors.toList());
-            List<User> userList = userMapper.selectList(new QueryWrapper<User>().in("job_number", userIds));
-            List<LocalDateTime> dateTimeList = getDays(yesterday, yesterday.plusDays(2));
-            for (User user : userList) {
-                //按当前填报人所属部门或者全公司来匹配
-                excludeTimeList = excludeTimeList.stream().filter(ex->ex.getDId() == null || ex.getDId().equals(user.getDepartmentId())).collect(Collectors.toList());
-
-                for (LocalDateTime localDateTime : dateTimeList) {
-                    LocalDate workDate=localDateTime.toLocalDate();
-                    //当天的考勤记录
-                    List<Map<String, Object>> list = workDataList.stream().filter(wl -> wl.get("userId").equals(user.getJobNumber())&&wl.get("workDate").equals(workDate.format(dtf))).collect(Collectors.toList());
-                    UserFvTime userFvTime=new UserFvTime();
-                    userFvTime.setWorkDate(workDate);
-                    LocalTime startTime=null;
-                    LocalTime endTime=null;
-                    for (Map<String, Object> map : list) {
-                        if(String.valueOf(map.get("signtype")).equals("签到")&&!map.get("signtime").equals("")){
-                            startTime=LocalTime.parse(String.valueOf(map.get("signtime")), dtf2);
-                        }
-                        if(String.valueOf(map.get("signtype")).equals("签退")&&!map.get("signtime").equals("")){
-                            endTime=LocalTime.parse(String.valueOf(map.get("signtime")), dtf2);
-                        }
-                        //处理外出记录 有外出记录默认以默认规则作为考勤数据来源
-                        Optional<Map<String, Object>> outFirst = outWorkDataList.stream().filter(ol -> ol.get("ycbgkssj").equals(map.get("workDate")) && ol.get("rybh").equals(map.get("userId"))).findFirst();
-                        if(outFirst.isPresent()){
-                            if(startTime==null||LocalTime.parse(String.valueOf(outFirst.get().get("kssj")), dtf2).isBefore(startTime)){
-                                startTime=LocalTime.parse(String.valueOf(outFirst.get().get("kssj")), dtf2);
-                            }
-                            if(endTime==null||LocalTime.parse(String.valueOf(outFirst.get().get("jssj")), dtf2).isBefore(endTime)){
-                                endTime=LocalTime.parse(String.valueOf(outFirst.get().get("jssj")), dtf2);
-                            }
-                        }
-                        //处理补卡记录 有补卡记录以补卡记录作为考勤数据来源
-                        Optional<Map<String, Object>> replaceFirst = replaceWorkDataList.stream().filter(rl -> rl.get("kqrq").equals(map.get("workDate")) && rl.get("rybh").equals(map.get("userId"))).findFirst();
-                        if(replaceFirst.isPresent()){
-                            if(startTime==null||replaceFirst.get().get("bklx").equals("上班")){
-                                startTime=LocalTime.parse(String.valueOf(replaceFirst.get().get("bksj")), dtf2);
-                            }
-                            if(endTime==null||replaceFirst.get().get("bklx").equals("下班")){
-                                endTime=LocalTime.parse(String.valueOf(replaceFirst.get().get("bksj")), dtf2);
-                            }
-                        }
-                        }
-                    if(compIds.contains(user.getCompanyId())){
-                        if(startTime==null||endTime==null){
-                            continue;
-                        }
-                        Duration between = Duration.between(startTime, endTime);
-                        userFvTime.setStartTime(startTime.format(dtf2));
-                        userFvTime.setEndTime(endTime.format(dtf2));
-                        userFvTime.setCompanyId(user.getCompanyId());
-                        userFvTime.setUserId(user.getId());
-                        long workHours = between.toHours();
-                        long restHours = 0;
-                        //处理排除时间段
-                        for (TimeAutoExclude timeAutoExclude : excludeTimeList) {
-                            if(startTime.isBefore(LocalTime.parse(timeAutoExclude.getStartTime(),dtf2))
-                                    &&endTime.isAfter(LocalTime.parse(timeAutoExclude.getEndTime(),dtf2))){
-                                Duration bt = Duration.between(LocalTime.parse(timeAutoExclude.getStartTime(),dtf2), LocalTime.parse(timeAutoExclude.getEndTime(),dtf2));
-                                restHours += bt.toHours();
-                            }
-                        }
-
-                        userFvTime.setWorkHours(BigDecimal.valueOf(workHours).subtract(BigDecimal.valueOf(restHours)).floatValue());
-                        Optional<UserFvTime> first = oldUserFvTimeList.stream().filter(ol -> ol.getWorkDate().isEqual(userFvTime.getWorkDate()) && ol.getUserId().equals(userFvTime.getUserId())).findFirst();
-                        if(first.isPresent()){
-                            userFvTime.setId(first.get().getId());
-                        }
-                        if(endTime.isBefore(startTime)){
-                            continue;
-                        }
-                        userFvTimeList.add(userFvTime);
-                    }
-                }
-            }
-            if(userFvTimeList.size()>0){
-                userFvTimeService.saveOrUpdateBatch(userFvTimeList);
-            }
-            System.out.println(userFvTimeList);
-            //Todo: 获取请假数据
-            HttpRespMsg leaveRecordMsg = dockWithMLD.getResult("http://10.1.10.51:20175/api/cube/restful/interface/getModeDataPageList/getLeaveRecord", jsonString);
-            List<Map<String,Object>> leaveRecordList= (List<Map<String, Object>>) leaveRecordMsg.data;
-            for (Map<String, Object> map : leaveRecordList) {
-                Optional<User> optional=allUserList.stream().filter(al->al.getJobNumber()!=null&&al.getJobNumber().equals(map.get("rybh"))).findFirst();
-                if(!optional.isPresent()){
-                    continue;
-                }
-                User user=optional.get();
-                /*System.out.println("泛微同步人员请假数据----"+user.getName());*/
-                if(compIds.contains(user.getCompanyId())){
-                    LeaveSheet leaveSheet=new LeaveSheet();
-                    leaveSheet.setCompanyId(user.getCompanyId());
-                    leaveSheet.setStatus(0);
-                    leaveSheet.setOwnerId(user.getId());
-                    leaveSheet.setOwnerName(user.getName());
-                    leaveSheet.setStartDate(LocalDate.parse(String.valueOf(map.get("startDate")),dtf1));
-                    leaveSheet.setEndDate(LocalDate.parse(String.valueOf(map.get("endDate")),dtf1));
-                    Integer timeType=null;
-                    switch (String.valueOf(map.get("timeType"))){
-                        case "小时":timeType=1;
-                            break;
-                        case "天":timeType=0;
-                            break;
-                    }
-                    leaveSheet.setTimeType(timeType);
-                    leaveSheet.setTimeDays(Float.parseFloat(((String) map.get("timeDays")).equals("")?"0.00":((String) map.get("timeDays"))));
-                    if (timeType == 0){
-                        leaveSheet.setTimeHours(leaveSheet.getTimeDays()*allDay.getAllday());
-                    }else {
-                        leaveSheet.setTimeHours(Float.parseFloat(((String) map.get("timeHours")).equals("")?"0.00":((String) map.get("timeHours"))));
-                    }
-                    Integer leaveType;
-                    switch (String.valueOf(map.get("leaveType"))){
-                        case "事假":leaveType=0;
-                            break;
-                        case "病假":leaveType=1;
-                            break;
-                        case "年假":leaveType=2;
-                            break;
-                        case "产假":leaveType=3;
-                            break;
-                        case "婚假":leaveType=4;
-                            break;
-                        case "丧假":leaveType=5;
-                            break;
-                        case "调休":leaveType=6;
-                            break;
-                        case "陪产假":leaveType=7;
-                            break;
-                        default:leaveType=8;
-                    }
-                    leaveSheet.setLeaveType(leaveType);
-                    leaveSheet.setProcinstId(String.valueOf(map.get("id")));
-                    leaveSheet.setGmtFinished(String.valueOf(map.get("gmtFinished")));
-                    leaveSheetList.add(leaveSheet);
-                }
-            }
-            if(leaveSheetList.size()>0){
-                //删除老数据
-                leaveSheetMapper.delete(new QueryWrapper<LeaveSheet>().eq("company_id",compId));
-                leaveSheetService.saveBatch(leaveSheetList);
-            }
-            System.out.println("定时任务:共同步到"+leaveRecordList.size()+"条请假数据");
-            //Todo: 获取出差数据
-            HttpRespMsg travelRecordMsg = dockWithMLD.getResult("http://10.1.10.51:20175/api/cube/restful/interface/getModeDataPageList/getTravelRecord", jsonString);
-            List<Map<String,Object>> travelRecordList= (List<Map<String, Object>>) travelRecordMsg.data;
-            for (Map<String, Object> map : travelRecordList) {
-                Optional<User> optional=allUserList.stream().filter(al->al.getJobNumber()!=null&&al.getJobNumber().equals(map.get("rybh"))).findFirst();
-                if(!optional.isPresent()){
-                    continue;
-                }
-                User user=optional.get();
-                if(compIds.contains(user.getCompanyId())){
-                    BusinessTrip businessTrip=new BusinessTrip();
-                    businessTrip.setCompanyId(user.getCompanyId());
-                    businessTrip.setOwnerId(user.getId());
-                    businessTrip.setOwnerName(user.getName());
-                    businessTrip.setStartDate(LocalDate.parse(String.valueOf(map.get("startDate")),dtf1));
-                    businessTrip.setEndDate(LocalDate.parse(String.valueOf(map.get("endDate")),dtf1));
-                    Integer way=null;
-                    switch (String.valueOf(map.get("way"))){
-                        case "飞机":way=0;
-                            break;
-                        case "高铁/火车":way=1;
-                            break;
-                        case "汽车":way=2;
-                            break;
-                        case "轮船":way=3;
-                            break;
-                        case "其他":way=4;
-                            break;
-                    }
-                    businessTrip.setWay(way);
-                    businessTrip.setCityFrom((String) map.get("cityFrom"));
-                    businessTrip.setCityTo((String) map.get("cityTo"));
-                    Integer goBack=null;
-                    switch (String.valueOf(map.get("goBack"))){
-                        case "单程":goBack=0;
-                            break;
-                        case "往返":goBack=1;
-                            break;
-                    }
-                    businessTrip.setGoBack(goBack);
-                    Double dayCount =Double.valueOf(String.valueOf(map.get("dayCount")));
-                    businessTrip.setDayCount(dayCount.intValue());
-                    businessTrip.setProcinstId((String) map.get("id"));
-                    businessTrip.setGmtFinished((String)map.get("gmtFinished"));
-                    Optional<BusinessTrip> first = oldBusinessTripList.stream().filter(ol -> ol.getStartDate().isEqual(businessTrip.getStartDate())&&ol.getEndDate().isEqual(businessTrip.getEndDate())&& ol.getOwnerId().equals(businessTrip.getOwnerId())&&(ol.getProcinstId()!=null&& ol.getProcinstId().equals(businessTrip.getProcinstId()))).findFirst();
-                    if(first.isPresent()){
-                        businessTrip.setId(first.get().getId());
-                    }
-                    businessTripList.add(businessTrip);
-                }
-            }
-            if(businessTripList.size()>0){
-                businessTripService.saveOrUpdateBatch(businessTripList);
-            }
-        }
-    }
-
-
     //专门给明夷的定时任务
     //专门给明夷的定时任务
     @Scheduled(cron = "0 0 1 ? * *")
     @Scheduled(cron = "0 0 1 ? * *")
     private void synAttendanceDate() {
     private void synAttendanceDate() {
@@ -682,7 +432,6 @@ public class TimingTask {
             List<Map> list=new ArrayList<>();
             List<Map> list=new ArrayList<>();
             if (responseEntity.getStatusCode() == HttpStatus.OK) {
             if (responseEntity.getStatusCode() == HttpStatus.OK) {
                 String resp = responseEntity.getBody();
                 String resp = responseEntity.getBody();
-                System.out.println(resp);
                 JSONObject dataJson = JSONObject.parseObject(resp);
                 JSONObject dataJson = JSONObject.parseObject(resp);
                 if (dataJson.getString("code").equals("ok")) {
                 if (dataJson.getString("code").equals("ok")) {
                     JSONArray data = dataJson.getJSONArray("data");
                     JSONArray data = dataJson.getJSONArray("data");
@@ -1386,7 +1135,7 @@ public class TimingTask {
     }
     }
 
 
     //发送上周工时填报情况给部门主管
     //发送上周工时填报情况给部门主管
-    @Scheduled(cron = "0 55 8 ? * *")
+    @Scheduled(cron = "0 18 9 ? * *")
     private void lastWeekFillStatisticsToManager() {
     private void lastWeekFillStatisticsToManager() {
         if (isDev) return;
         if (isDev) return;
         LocalDate curDay = LocalDate.now();
         LocalDate curDay = LocalDate.now();
@@ -1403,16 +1152,18 @@ public class TimingTask {
                 Integer companyId = timeType.getCompanyId();
                 Integer companyId = timeType.getCompanyId();
                 Company company = companyMapper.selectById(companyId);
                 Company company = companyMapper.selectById(companyId);
                 if (company.getExpirationDate().isBefore(LocalDateTime.now())) continue;//跳过过期的公司
                 if (company.getExpirationDate().isBefore(LocalDateTime.now())) continue;//跳过过期的公司
-                //
                 List<Map<String, Object>> userList = reportService.getNotFullReportUserList(companyId, startDate, endDate);
                 List<Map<String, Object>> userList = reportService.getNotFullReportUserList(companyId, startDate, endDate);
-
+                List<String> userIds = new ArrayList<>();
                 List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId).isNotNull("manager_id"));
                 List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId).isNotNull("manager_id"));
                 for (Department d : departmentList) {
                 for (Department d : departmentList) {
                     //取上周下属员工的日报漏填,未提交的
                     //取上周下属员工的日报漏填,未提交的
                     int curDeptUserCount = 0;
                     int curDeptUserCount = 0;
                     for (Map<String, Object> user : userList) {
                     for (Map<String, Object> user : userList) {
                         if (d.getDepartmentId().intValue() == (Integer)user.get("deptId")) {
                         if (d.getDepartmentId().intValue() == (Integer)user.get("deptId")) {
-                            curDeptUserCount++;
+                            if (!userIds.contains((String)user.get("userId"))) {
+                                curDeptUserCount++;
+                                userIds.add((String)user.get("userId"));
+                            }
                         }
                         }
                     }
                     }
                     if (curDeptUserCount > 0) {
                     if (curDeptUserCount > 0) {
@@ -1420,12 +1171,11 @@ public class TimingTask {
                         if (corpInfo != null) {
                         if (corpInfo != null) {
                             //发送提醒给主管
                             //发送提醒给主管
                             User targetUser = userMapper.selectById(d.getManagerId());
                             User targetUser = userMapper.selectById(d.getManagerId());
-                            wxCorpInfoService.sendWXCorpMsg(corpInfo, targetUser.getCorpwxUserid(), "您上周有" + curDeptUserCount + "名下属员工未填报工时", null, (Integer)TEXT_CARD_MSG_MEMB_MISS_REPORT);
+                            System.out.println("发送提醒给主管:"+targetUser.getCorpwxUserid()+" 上周您有"+curDeptUserCount+"名下属员工未填报工时");
+                            wxCorpInfoService.sendWXCorpMsg(corpInfo, targetUser.getCorpwxUserid(), "上周您有" + curDeptUserCount + "名下属员工未填报工时", null, (Integer)TEXT_CARD_MSG_MEMB_MISS_REPORT);
                         }
                         }
-//                        pushLastWeekReportFillToManager(company, d, curDeptUserCount);
                     }
                     }
                 }
                 }
-
             }
             }
         }
         }
     }
     }
@@ -2441,4 +2191,21 @@ public class TimingTask {
         if (isDev) return;
         if (isDev) return;
         projectService.fixQingJianData();
         projectService.fixQingJianData();
     }
     }
+
+    /**
+     * 每6小时执行一次,获取当天提交的加班审批单并保存(针对曦合超导,companyId=8555)
+     */
+    @Scheduled(cron = "59 59 16-23 * * ?")
+    private void syncTodayOvertimeApproval() {
+        if (isDev) return;
+        Integer companyId = 8555;
+        String today = java.time.LocalDate.now().format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+        try {
+            log.info("开始同步当天加班审批单, companyId={}, date={}", companyId, today);
+            wxCorpInfoService.getAndSaveOvertimeApprovalList(companyId, null, today, today);
+            log.info("同步当天加班审批单完成, companyId={}, date={}", companyId, today);
+        } catch (Exception e) {
+            log.error("同步当天加班审批单失败, companyId={}, date={}, error={}", companyId, today, e.getMessage(), e);
+        }
+    }
 }
 }

+ 0 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/test/TestApplicationTests.java

@@ -30,8 +30,6 @@ public class TestApplicationTests {
             redisUtil.sSetJsonString("keyWords",keyWord);
             redisUtil.sSetJsonString("keyWords",keyWord);
         }
         }
 //
 //
-        Set<Object> keyWords = redisUtil.members("keyWords");
-        System.out.println(keyWords);
 //        System.out.println(redisUtil.existsKey(Parameter.ACCESS_TOKEN.getName()));
 //        System.out.println(redisUtil.existsKey(Parameter.ACCESS_TOKEN.getName()));
 //        for (Object keyWord : keyWords) {
 //        for (Object keyWord : keyWords) {
 //            JSONObject jsonMember = JSON.parseObject((String)keyWord);
 //            JSONObject jsonMember = JSON.parseObject((String)keyWord);

+ 0 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/AuthService.java

@@ -73,9 +73,7 @@ public class AuthService {
             /**
             /**
              * 返回结果示例
              * 返回结果示例
              */
              */
-            System.err.println("result:" + result);
             JSONObject jsonObject = new JSONObject(result);
             JSONObject jsonObject = new JSONObject(result);
-            System.out.println(jsonObject);
             String access_token = jsonObject.getString("access_token");
             String access_token = jsonObject.getString("access_token");
             Long expires_in = jsonObject.getLong("expires_in");
             Long expires_in = jsonObject.getLong("expires_in");
             Map<String,Object> mapResult = new HashMap<>();
             Map<String,Object> mapResult = new HashMap<>();

+ 0 - 9
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/CRC16Util.java

@@ -46,10 +46,8 @@ public class CRC16Util {
                 }
                 }
             }
             }
         }
         }
-        System.out.println("CRC"+CRC);
         //结果转换为16进制
         //结果转换为16进制
         String result = Integer.toHexString(CRC).toUpperCase();
         String result = Integer.toHexString(CRC).toUpperCase();
-        System.out.println("result"+result);
         if (result.length() != 4) {
         if (result.length() != 4) {
             StringBuffer sb = new StringBuffer("0000");
             StringBuffer sb = new StringBuffer("0000");
             result = sb.replace(4 - result.length(), 4, result).toString();
             result = sb.replace(4 - result.length(), 4, result).toString();
@@ -61,13 +59,6 @@ public class CRC16Util {
  
  
  
  
     public static void main(String[] args) {
     public static void main(String[] args) {
-        //01 03 20 7F FF 7F FF 7F FF 7F FF 7F FF 7F FF 7F FF 7F FF 7F FF 7F FF 7F FF 7F FF 7F FF 7F FF 7F FF 7F FF 8C 45
-        //01 03 00 00 00 08 44 0C
-        //01 03 10 00 8F 02 4E 00 91 02 44 00 92 02 5A 00 8B 02 47 40 D8
-//        System.out.println(getCRC("01 03 20 7F FF 7F FF 7F FF 7F FF 7F FF 7F FF 7F FF 7F FF 7F FF 7F FF 7F FF 7F FF 7F FF 7F FF 7F FF 7F FF"));
-//        System.out.println(getCRC("01 03 00 00 00 08"));
-//        System.out.println(getCRC("01 03 10 00 8F 02 4E 00 91 02 44 00 92 02 5A 00 8B 02 47"));
     	String crc = getCRC("FA AF 00 07 01 1e 78 1e 50 00 3C");
     	String crc = getCRC("FA AF 00 07 01 1e 78 1e 50 00 3C");
-        System.out.println(crc);
     }
     }
 }
 }

+ 0 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/CheckPicUtil.java

@@ -38,7 +38,6 @@ public class CheckPicUtil {
             String accessToken = token;
             String accessToken = token;
 
 
             String result = HttpUtil.post(url, accessToken, param);
             String result = HttpUtil.post(url, accessToken, param);
-            System.out.println(result);
             return result;
             return result;
         } catch (Exception e) {
         } catch (Exception e) {
             e.printStackTrace();
             e.printStackTrace();

+ 0 - 198
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/DockWithMLD.java

@@ -1,198 +0,0 @@
-package com.management.platform.util;
-
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
-import com.fasterxml.jackson.databind.DeserializationFeature;
-import com.fasterxml.jackson.databind.MapperFeature;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
-import com.management.platform.mapper.CompanyReportMapper;
-import org.apache.http.HttpEntity;
-import org.apache.http.client.entity.UrlEncodedFormEntity;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.HttpClients;
-import org.apache.http.message.BasicNameValuePair;
-import org.apache.http.util.EntityUtils;
-import org.apache.poi.ss.formula.functions.T;
-
-import javax.annotation.Resource;
-import java.io.InputStream;
-import java.math.BigInteger;
-import java.security.Key;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.sql.Timestamp;
-import java.time.LocalDateTime;
-import java.time.format.DateTimeFormatter;
-import java.util.*;
-
-public class DockWithMLD {
-    static String port="10.1.10.41:20170";
-
-    public static void main(String[] args) {
-        DockWithMLD dockWithMLD=new DockWithMLD();
-        JSONObject jsonObject=new JSONObject();
-        LocalDateTime startDate=LocalDateTime.parse("2022-08-01 00:00:00",DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
-        LocalDateTime endDate=LocalDateTime.parse("2022-08-31 00:00:00",DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
-        jsonObject.put("startDate",startDate);
-        jsonObject.put("endDate",endDate);
-        String jsonString = jsonObject.toJSONString();
-        dockWithMLD.getResult("http://"+port+"/api/cube/restful/interface/getModeDataPageList/getTravelRecord",jsonString);
-    }
-
-    public static HttpRespMsg  getResult(String url,String screenString){
-        HttpRespMsg httpRespMsg=new HttpRespMsg();
-        ObjectMapper objectMapper = new ObjectMapper();
-        objectMapper.configure(MapperFeature.AUTO_DETECT_CREATORS, true);
-        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
-        objectMapper.registerModule(new JavaTimeModule());
-        objectMapper.configure(com.fasterxml.jackson.databind.SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
-        Map<String,Object> map = null;
-        CloseableHttpResponse response;// 响应类
-        CloseableHttpClient httpClient = HttpClients.createDefault();
-        //restful 接口 url
-        HttpPost httpPost = new HttpPost(url);//ex:"http://ip:port/api/cube/restful/interface/getModeDataPageList/rpakeywordList"
-        //当前日期
-        String currentDate = getCurrentDate();
-        //当前时间
-        String currentTime = getCurrentTime();
-        //获取时间戳
-        String currentTimeTamp = getTimestamp();
-        Map params = new HashMap<>();
-        Map paramDatajson = new HashMap<>();
-        //header
-        Map header = new HashMap<>();
-        //系统标识
-        String systemid = "worktime";
-        //密码
-        String d_password = "BF4CDEF5ED4941CE93F19D234D366241";
-        //封装 header 里的参数
-        header.put("systemid",systemid);
-        header.put("currentDateTime",currentTimeTamp);
-        String md5Source = systemid+d_password+currentTimeTamp;
-        String md5OfStr = getMD5Str(md5Source).toLowerCase();
-        //Md5 是:系统标识+密码+时间戳 并且 md5 加密的结果
-        header.put("Md5",md5OfStr);
-        paramDatajson.put("header",header);
-        //分页参数 处理全部数据 不需要进行分页
-        JSONObject pageInfo = new JSONObject();
-        pageInfo.put("pageNo", 1);
-        pageInfo.put("pageSize",99999);
-        paramDatajson.put("pageInfo",pageInfo);
-        //封装 mainTable 参数
-        JSONObject mainTable  = JSON.parseObject(screenString==null?"{}":screenString);
-        paramDatajson.put("mainTable",mainTable);
-        //封装 operationinfo 参数
-        JSONObject operationinfo = new JSONObject();
-        operationinfo.put("operator", "MD10520");
-        paramDatajson.put("operationinfo",operationinfo);
-        System.out.println("===请求参数 datajson==="+paramDatajson);
-        params.put("datajson",paramDatajson);
-        //装填参数
-        List nvps = new ArrayList();
-        if(params!=null){
-            params.forEach((key, value) -> nvps.add(new BasicNameValuePair((String) key, JSONObject.toJSONString(value))));
-        }
-        try{
-            httpPost.addHeader("Content-Type","application/x-www-form-urlencoded;charset=utf-8");
-            httpPost.setEntity(new UrlEncodedFormEntity(nvps, "UTF-8"));
-            response = httpClient.execute(httpPost);
-            if (response != null && response.getEntity() != null) {
-                //返回信息
-                String resulString = EntityUtils.toString(response.getEntity(),"UTF-8");
-                //todo 反序列化 报文数值到Map
-                map= objectMapper.readValue(resulString,Map.class);
-                List<Map> list = JSON.parseArray(String.valueOf(map.get("result")), Map.class);
-                List<Map> resultList=new ArrayList<>();
-                for (Map item : list) {
-                    Map resultMap = (Map) item.get("mainTable");
-                    resultList.add(resultMap);
-                }
-                httpRespMsg.data=resultList;
-                //todo 这里处理返回信息
-                System.out.println("成功"+ (resulString.length()>100?resulString.substring(0,100)+"...":resulString));
-            }else{
-                System.out.println("获取数据失败,请查看日志"+currentDate+" "+currentTime);
-            }
-        }catch (Exception e){
-            e.printStackTrace();
-            httpRespMsg.setError("请求失败");
-            System.out.println("请求失败"+currentDate+" "+currentTime+"====error msg:"+e.getMessage());
-        }
-        return httpRespMsg;
-    }
-
-    public static String getMD5Str(String plainText) {
-        //定义一个字节数组
-        byte[] secretBytes = null;
-        try {
-        // 生成一个 MD5 加密计算摘要
-            MessageDigest md = MessageDigest.getInstance("MD5");
-        //对字符串进行加密
-            md.update(plainText.getBytes());
-        //获得加密后的数据
-            secretBytes = md.digest();
-        } catch (NoSuchAlgorithmException e) {
-            throw new RuntimeException("没有 md5 这个算法!");
-        }
-        //将加密后的数据转换为 16 进制数字
-        String md5code = new BigInteger(1, secretBytes).toString(16);
-        // 如果生成数字未满 32 位,需要前面补 0
-        // 不能把变量放到循环条件,值改变之后会导致条件变化。如果生成 30 位 只能生成 31位 md5
-        int tempIndex = 32 - md5code.length();
-        for (int i = 0; i < tempIndex; i++) {
-            md5code = "0" + md5code;
-
-        }
-        return md5code;
-    }
-
-    public static String getCurrentTime() {
-        Date newdate = new Date();
-        long datetime = newdate.getTime();
-        Timestamp timestamp = new Timestamp(datetime);
-        String currenttime = (timestamp.toString()).substring(11, 13) + ":" +
-                (timestamp.toString()).substring(14, 16) + ":"
-                + (timestamp.toString()).substring(17, 19);
-        return currenttime;
-    }
-    public static String getCurrentDate() {
-        Date newdate = new Date();
-        long datetime = newdate.getTime();
-        Timestamp timestamp = new Timestamp(datetime);
-        String currentdate = (timestamp.toString()).substring(0, 4) + "-" +
-                (timestamp.toString()).substring(5, 7) + "-"
-                + (timestamp.toString()).substring(8, 10);
-        return currentdate;
-    }
-    /**
-     * 获取当前日期时间。 YYYY-MM-DD HH:MM:SS
-     * @return 当前日期时间
-     */
-    public static String getCurDateTime() {
-        Date newdate = new Date();
-        long datetime = newdate.getTime();
-        Timestamp timestamp = new Timestamp(datetime);
-        return (timestamp.toString()).substring(0, 19);
-    }
-    /**
-     * 获取时间戳 格式如:1999010123595
-     * @return
-     */
-    public static String getTimestamp(){
-        return getCurDateTime().replace("-", "").replace(":", "").replace(" ",
-                "");
-    }
-    public static int getIntValue(String v, int def) {
-        try {
-            return Integer.parseInt(v);
-        } catch (Exception ex) {
-            return def;
-        }
-    }
-    public static String null2String(Object s) {
-        return s == null ? "" : s.toString();
-    }
-}

+ 1 - 5
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/HttpKit.java

@@ -268,11 +268,7 @@ public class HttpKit {
     }
     }
     
     
     public static void main(String[] args) {
     public static void main(String[] args) {
-     String fname = "dsasdas.mp4";
-     String s = fname.substring(0, fname.lastIndexOf("."));
-     String f = fname.substring(s.length()+1);
-  System.out.println(f);
- }
+    }
 }
 }
 
 
 /**
 /**

+ 0 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/TimeZoneConverter.java

@@ -106,8 +106,6 @@ public class TimeZoneConverter {
 
 
     // 测试示例
     // 测试示例
     public static void main(String[] args) {
     public static void main(String[] args) {
-        System.out.println("=== 时间转换示例 ===");
-
         // 示例1: 空时区(UTC 0时区)
         // 示例1: 空时区(UTC 0时区)
 //        System.out.println(convertToEast8("2025-12-12 12:12:12", ""));
 //        System.out.println(convertToEast8("2025-12-12 12:12:12", ""));
 //        // 输出: 2025-12-12 20:12:12
 //        // 输出: 2025-12-12 20:12:12

+ 0 - 13
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/WorkDayCalculateUtils.java

@@ -342,9 +342,7 @@ public class WorkDayCalculateUtils {
     public static boolean sameWeek(LocalDate date1, LocalDate date2) {
     public static boolean sameWeek(LocalDate date1, LocalDate date2) {
         WeekFields weekFields = WeekFields.of(Locale.getDefault());
         WeekFields weekFields = WeekFields.of(Locale.getDefault());
         int week1 = date1.get(weekFields.weekOfWeekBasedYear());
         int week1 = date1.get(weekFields.weekOfWeekBasedYear());
-        System.out.println(week1);
         int week2 = date2.get(weekFields.weekOfWeekBasedYear());
         int week2 = date2.get(weekFields.weekOfWeekBasedYear());
-        System.out.println(week2);
         return week1 == week2;
         return week1 == week2;
     }
     }
 
 
@@ -354,17 +352,6 @@ public class WorkDayCalculateUtils {
     }
     }
 
 
     public static void main(String[] args) {
     public static void main(String[] args) {
-        System.out.println(getWorkDaysCountInRange("2023-11-01","2023-11-04", 0));
-
-        LocalDate date1 = LocalDate.of(2023, 12, 1);
-        LocalDate date2 = LocalDate.of(2023, 11, 30);
-//        System.out.println(sameWeek(date1, date2));
-//        System.out.println(sameMonth(date1, date2));
-
-        double workHours = calculateLeaveWorkHours("09:00", "18:00", "12:00", "13:00");
-        System.out.println("leaveHours = " + workHours);
-        workHours = calculateLeaveWorkHours("14:00", "18:00", "12:00", "13:00");
-        System.out.println("leaveHours = " + workHours);
     }
     }
 
 
     public static List<String> getAllHolidays(String firstDay, String endDate) {
     public static List<String> getAllHolidays(String firstDay, String endDate) {

+ 5 - 5
fhKeeper/formulahousekeeper/management-platform/src/main/resources/application.yml

@@ -18,12 +18,12 @@ spring:
       location: C:/upload/
       location: C:/upload/
   datasource:
   datasource:
     driver-class-name: com.mysql.cj.jdbc.Driver
     driver-class-name: com.mysql.cj.jdbc.Driver
-    url: jdbc:mysql://1.94.62.58:17089/man_dev?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&useSSL=false
-    username: root
-    password: P011430@Huoshi*
-#    url: jdbc:mysql://47.100.37.243:7644/man_hour_manager?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true
+#    url: jdbc:mysql://1.94.62.58:17089/man_hour_manager?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&useSSL=false
 #    username: root
 #    username: root
-#    password: Ziyu20141026!@@
+#    password: P011430@Huoshi*
+    url: jdbc:mysql://47.100.37.243:7644/man_hour_manager?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true
+    username: root
+    password: Ziyu20141026!@@
 #    url: jdbc:mysql://localhost:3306/man_lg?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&useSSL=false&allowPublicKeyRetrieval=true
 #    url: jdbc:mysql://localhost:3306/man_lg?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&useSSL=false&allowPublicKeyRetrieval=true
 #    username: root
 #    username: root
 #    password: P011430@Huoshi*
 #    password: P011430@Huoshi*

+ 2 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/CompanyMapper.xml

@@ -28,11 +28,12 @@
         <result column="non_project_simple" property="nonProjectSimple" />
         <result column="non_project_simple" property="nonProjectSimple" />
         <result column="project_progress_mode" property="projectProgressMode" />
         <result column="project_progress_mode" property="projectProgressMode" />
         <result column="enable_ai" property="enableAi" />
         <result column="enable_ai" property="enableAi" />
+        <result column="package_overtime" property="packageOvertime" />
     </resultMap>
     </resultMap>
 
 
     <!-- 通用查询结果列 -->
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
     <sql id="Base_Column_List">
-        id, company_name, staff_count_max, expiration_date, set_meal, package_worktime, package_project, package_contract, package_oa, package_etimecard, package_expense, package_customer, package_engineering, package_simple, package_finance, package_provider, package_project_approval, package_device, is_international, create_date, reg_from, non_project_simple, project_progress_mode, enable_ai
+        id, company_name, staff_count_max, expiration_date, set_meal, package_worktime, package_project, package_contract, package_oa, package_etimecard, package_expense, package_customer, package_engineering, package_simple, package_finance, package_provider, package_project_approval, package_device, is_international, create_date, reg_from, non_project_simple, project_progress_mode, enable_ai, package_overtime
     </sql>
     </sql>
 
 
 </mapper>
 </mapper>

+ 47 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/OvertimeAllowanceMapper.xml

@@ -23,4 +23,51 @@
         id, corpwx_userid, start_time, end_time, date, overtime_duration, allowance, sp_no, company_id, type, on_duty_hours, work_hours
         id, corpwx_userid, start_time, end_time, date, overtime_duration, allowance, sp_no, company_id, type, on_duty_hours, work_hours
     </sql>
     </sql>
 
 
+    <!-- 按人员合计统计餐补数据的公共 WHERE 条件 -->
+    <sql id="Summary_Where">
+        WHERE company_id = #{companyId}
+        <choose>
+            <when test="isAllowance == true">
+                AND type &gt;= 0
+            </when>
+            <otherwise>
+                AND (type = -1 OR type = 0 OR type = 1 OR type = 4)
+            </otherwise>
+        </choose>
+        <if test="noRecords == true">
+            AND 1 = 0
+        </if>
+        <if test="corpwxUserid != null and corpwxUserid != ''">
+            AND corpwx_userid = #{corpwxUserid}
+        </if>
+        <if test="corpwxUserids != null and corpwxUserids.size() > 0">
+            AND corpwx_userid IN
+            <foreach collection="corpwxUserids" item="uid" open="(" separator="," close=")">
+                #{uid}
+            </foreach>
+        </if>
+        <if test="startDate != null and startDate != ''">
+            AND date &gt;= #{startDate}
+        </if>
+        <if test="endDate != null and endDate != ''">
+            AND date &lt;= #{endDate}
+        </if>
+    </sql>
+
+    <!-- 按人员合计统计餐补数据(GROUP BY corpwx_userid,带分页) -->
+    <select id="getSummaryList" resultMap="BaseResultMap">
+        SELECT
+            corpwx_userid,
+            company_id,
+            SUM(on_duty_hours)      AS on_duty_hours,
+            SUM(work_hours)         AS work_hours,
+            SUM(overtime_duration)  AS overtime_duration,
+            SUM(allowance)          AS allowance
+        FROM overtime_allowance
+        <include refid="Summary_Where"/>
+        GROUP BY corpwx_userid, company_id
+        ORDER BY corpwx_userid
+    </select>
+
+
 </mapper>
 </mapper>

+ 5 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/OvertimeMapper.xml

@@ -16,11 +16,15 @@
         <result column="applyer_wx_userid" property="applyerWxUserid" />
         <result column="applyer_wx_userid" property="applyerWxUserid" />
         <result column="company_id" property="companyId" />
         <result column="company_id" property="companyId" />
         <result column="date" property="date" />
         <result column="date" property="date" />
+        <result column="reason" property="reason" />
+        <result column="file" property="file" />
+        <result column="status" property="status" />
+        <result column="deny_reason" property="denyReason" />
     </resultMap>
     </resultMap>
 
 
     <!-- 通用查询结果列 -->
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
     <sql id="Base_Column_List">
-        id, user_id, start_time, end_time, duration, is_night_shift, duration_type, sp_no, attendance_type, applyer_wx_userid, company_id, date
+        id, user_id, start_time, end_time, duration, is_night_shift, duration_type, sp_no, attendance_type, applyer_wx_userid, company_id, date, reason, file, status, deny_reason
     </sql>
     </sql>
 
 
 </mapper>
 </mapper>

Разлика између датотеке није приказан због своје велике величине
+ 2 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TimeTypeMapper.xml