Selaa lähdekoodia

获取假期余额改成同步方式获取

seyason 3 vuotta sitten
vanhempi
commit
97635c2d4b
30 muutettua tiedostoa jossa 898 lisäystä ja 125 poistoa
  1. 6 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/DingDingController.java
  2. 21 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/LeaveQuotaNumController.java
  3. 21 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/LeaveTypeController.java
  4. 97 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectRequirementController.java
  5. 4 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportExtraDegreeController.java
  6. 15 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskGroupController.java
  7. 67 6
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserYearleaveSettingController.java
  8. 72 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/LeaveQuotaNum.java
  9. 48 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/LeaveType.java
  10. 53 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectRequirement.java
  11. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ReportExtraDegree.java
  12. 0 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/LeaveQuotaNum.java
  13. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/LeaveQuotaNumMapper.java
  14. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/LeaveTypeMapper.java
  15. 19 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectRequirementMapper.java
  16. 3 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/DingDingService.java
  17. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/LeaveQuotaNumService.java
  18. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/LeaveTypeService.java
  19. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectRequirementService.java
  20. 228 104
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java
  21. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/LeaveQuotaNumServiceImpl.java
  22. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/LeaveTypeServiceImpl.java
  23. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectRequirementServiceImpl.java
  24. 7 6
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  25. 3 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java
  26. 27 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/LeaveQuotaNumMapper.xml
  27. 19 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/LeaveTypeMapper.xml
  28. 44 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectRequirementMapper.xml
  29. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list.vue
  30. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list_import.vue

+ 6 - 4
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/DingDingController.java

@@ -19,6 +19,7 @@ import org.slf4j.LoggerFactory;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.time.format.DateTimeFormatter;
 import java.util.List;
 import java.util.List;
@@ -360,10 +361,11 @@ public class DingDingController {
         return new HttpRespMsg();
         return new HttpRespMsg();
     }
     }
 //
 //
-    @RequestMapping("/getCorpLeaveQuata")
-    public HttpRespMsg getCorpLeaveQuata(String leaveCode, Integer companyId, Integer departmentId, String userId, @RequestParam(required = false, defaultValue = "1") Integer pageIndex) {
-        CompanyDingding companyDingding = companyDingdingService.getOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
-        return dingDingService.getLeaveTypeList(leaveCode, companyId, departmentId, userId, pageIndex);
+    @RequestMapping("/syncLeaveQuotaData")
+    public HttpRespMsg syncLeaveQuotaData(Integer companyId, HttpServletRequest request) {
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+        return dingDingService.syncLeaveQuotaData(companyId);
     }
     }
 
 
     @RequestMapping("/testSendBusTripLink")
     @RequestMapping("/testSendBusTripLink")

+ 21 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/LeaveQuotaNumController.java

@@ -0,0 +1,21 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-05-24
+ */
+@RestController
+@RequestMapping("/leave-quota-num")
+public class LeaveQuotaNumController {
+
+}
+

+ 21 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/LeaveTypeController.java

@@ -0,0 +1,21 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-05-24
+ */
+@RestController
+@RequestMapping("/leave-type")
+public class LeaveTypeController {
+
+}
+

+ 97 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectRequirementController.java

@@ -0,0 +1,97 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.constant.Constant;
+import com.management.platform.entity.*;
+import com.management.platform.mapper.ProjectMapper;
+import com.management.platform.mapper.ProjectRequirementMapper;
+import com.management.platform.mapper.TaskGroupMapper;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.ProjectRequirementService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+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.stream.Collectors;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-05-24
+ */
+@RestController
+@RequestMapping("/project-requirement")
+public class ProjectRequirementController {
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private ProjectMapper projectMapper;
+    @Resource
+    private ProjectRequirementMapper projectRequirementMapper;
+    @Resource
+    private ProjectRequirementService projectRequirementService;
+    @Resource
+    private TaskGroupMapper taskGroupMapper;
+
+    @RequestMapping("/addOrMod")
+    public HttpRespMsg addOrMod(ProjectRequirement record) {
+        HttpRespMsg msg = new HttpRespMsg();
+        if (record.getProjectId() == null) {
+            msg.setError("项目不能为空");
+            return msg;
+        }
+        projectRequirementService.saveOrUpdate(record);
+
+        return msg;
+    }
+
+    @RequestMapping("/listByPage")
+    public HttpRespMsg listByPage(Integer pageIndex, Integer pageSize, Integer projectId, String groupName) {
+        HttpRespMsg msg = new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("TOKEN")).getCompanyId();
+        int startIndex = (pageIndex-1)*pageSize;
+        long total = projectMapper.selectCount(new QueryWrapper<Project>().eq("company_id", companyId));
+        LocalDate now = LocalDate.now();
+        now = now.minusDays(7);
+        String startDate = DateTimeFormatter.ofPattern("yyyy-MM-dd").format(now);
+        List<Integer> projectIds = new ArrayList<>();
+        if (!StringUtils.isEmpty(groupName)) {
+            List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().eq("company_id", companyId));
+            List<Integer> collect = projectList.stream().map(Project::getId).collect(Collectors.toList());
+            List<TaskGroup> taskGroups = taskGroupMapper.selectList(new QueryWrapper<TaskGroup>().eq("name", groupName).in("project_id", collect));
+            projectIds = taskGroups.stream().map(TaskGroup::getProjectId).collect(Collectors.toList());
+        }
+        List<ProjectRequirement> projectRequirements = projectRequirementMapper.customSelect(companyId, startDate, projectId, projectIds.size()==0?null:projectIds, startIndex, pageSize);
+        HashMap map = new HashMap();
+        map.put("total", total);
+        map.put("records", projectRequirements);
+        msg.data = map;
+
+        return msg;
+    }
+
+    @RequestMapping("/delete")
+    public HttpRespMsg delete(Integer id) {
+        HttpRespMsg msg = new HttpRespMsg();
+        projectRequirementMapper.deleteById(id);
+
+        return msg;
+    }
+
+}
+

+ 4 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportExtraDegreeController.java

@@ -145,7 +145,11 @@ public class ReportExtraDegreeController {
         HttpRespMsg msg = new HttpRespMsg();
         HttpRespMsg msg = new HttpRespMsg();
         String token = request.getHeader("TOKEN");
         String token = request.getHeader("TOKEN");
         User user = userMapper.selectById(token);
         User user = userMapper.selectById(token);
+        List<Project> allProjects = projectMapper.selectList(new QueryWrapper<Project>().eq("company_id", user.getCompanyId()));
         List<ReportExtraDegree> all = reportExtraDegreeMapper.getAll(user.getCompanyId());
         List<ReportExtraDegree> all = reportExtraDegreeMapper.getAll(user.getCompanyId());
+        for (ReportExtraDegree degree : all) {
+            degree.setProjects(allProjects.stream().filter(pro->pro.getAssociateDegreeNames().contains(degree.getName())).map(Project::getProjectName).collect(Collectors.joining(",")));
+        }
         msg.data = all;
         msg.data = all;
         return msg;
         return msg;
     }
     }

+ 15 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskGroupController.java

@@ -199,7 +199,22 @@ public class TaskGroupController {
         return msg;
         return msg;
     }
     }
 
 
+    @RequestMapping("/getGroupNames")
+    public HttpRespMsg getGroupNames() {
+        String token = request.getHeader("TOKEN");
+        Integer companyId = userMapper.selectById(token).getCompanyId();
+        List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().select("id").eq("company_id", companyId));
+        List<Integer> collect = projectList.stream().map(Project::getId).collect(Collectors.toList());
+        HttpRespMsg msg = new HttpRespMsg();
+        if (collect.size() > 0) {
+            msg.data = taskGroupService.list(new QueryWrapper<TaskGroup>().select("distinct name").in("project_id", collect));
+        } else {
+            msg.data = new ArrayList<>();
+        }
 
 
 
 
+        return msg;
+    }
+
 }
 }
 
 

+ 67 - 6
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserYearleaveSettingController.java

@@ -2,15 +2,14 @@ package com.management.platform.controller;
 
 
 
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 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.dingtalk.api.DefaultDingTalkClient;
 import com.dingtalk.api.DefaultDingTalkClient;
 import com.dingtalk.api.DingTalkClient;
 import com.dingtalk.api.DingTalkClient;
 import com.dingtalk.api.request.OapiAttendanceVacationTypeListRequest;
 import com.dingtalk.api.request.OapiAttendanceVacationTypeListRequest;
 import com.dingtalk.api.response.OapiAttendanceVacationTypeListResponse;
 import com.dingtalk.api.response.OapiAttendanceVacationTypeListResponse;
-import com.management.platform.entity.CompanyDingding;
-import com.management.platform.entity.User;
-import com.management.platform.entity.UserYearleaveSetting;
-import com.management.platform.mapper.UserMapper;
-import com.management.platform.mapper.UserYearleaveSettingMapper;
+import com.management.platform.entity.*;
+import com.management.platform.mapper.*;
 import com.management.platform.service.CompanyDingdingService;
 import com.management.platform.service.CompanyDingdingService;
 import com.management.platform.service.DingDingService;
 import com.management.platform.service.DingDingService;
 import com.management.platform.service.UserYearleaveSettingService;
 import com.management.platform.service.UserYearleaveSettingService;
@@ -25,7 +24,10 @@ 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.util.ArrayList;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
 
 
 /**
 /**
  * <p>
  * <p>
@@ -46,6 +48,12 @@ public class UserYearleaveSettingController {
     private DingDingService dingDingService;
     private DingDingService dingDingService;
     @Resource
     @Resource
     private CompanyDingdingService companyDingdingService;
     private CompanyDingdingService companyDingdingService;
+    @Resource
+    private LeaveQuotaNumMapper leaveQuotaNumMapper;
+    @Resource
+    private LeaveTypeMapper leaveTypeMapper;
+    @Resource
+    private DepartmentMapper departmentMapper;
 
 
     @Resource
     @Resource
     private HttpServletRequest request;
     private HttpServletRequest request;
@@ -105,7 +113,60 @@ public class UserYearleaveSettingController {
      */
      */
     @RequestMapping("/getDingDingLeaveQt")
     @RequestMapping("/getDingDingLeaveQt")
     public HttpRespMsg getDingDingLeaveQt(String leaveCode, Integer companyId, Integer departmentId, String userId,@RequestParam(required = false, defaultValue = "1") Integer pageIndex) {
     public HttpRespMsg getDingDingLeaveQt(String leaveCode, Integer companyId, Integer departmentId, String userId,@RequestParam(required = false, defaultValue = "1") Integer pageIndex) {
-        return dingDingService.getLeaveTypeList(leaveCode, companyId, departmentId, userId, pageIndex);
+        QueryWrapper<LeaveQuotaNum> quotaNumQueryWrapper = new QueryWrapper<>();
+        quotaNumQueryWrapper.eq("company_id", companyId);
+        HashMap map = new HashMap();
+        if (leaveCode == null) {
+            List<LeaveType> typeList = leaveTypeMapper.selectList(new QueryWrapper<LeaveType>().eq("company_id", companyId));
+            Optional<LeaveType> first = typeList.stream().filter(type -> type.getIsDefault() == 1).findFirst();
+            LeaveType defaultType = null;
+            if (first.isPresent()) {
+                defaultType = first.get();
+            } else {
+                defaultType = typeList.get(0);
+            }
+
+            leaveCode = defaultType.getLeaveCode();
+            map.put("leaveTypeList", typeList);
+            map.put("defaultLeaveType", defaultType);
+        }
+        quotaNumQueryWrapper.eq("leave_code", leaveCode);
+        if (userId != null) {
+            String dingdingUserid = userMapper.selectById(userId).getDingdingUserid();
+            quotaNumQueryWrapper.eq("user_dingding_id", dingdingUserid);
+        } else if (departmentId != null) {
+            //指定部门
+            Department dept = departmentMapper.selectById(departmentId);
+            List<Department> allDept = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
+            List<Department> allSubDepts = getSubDeptList(allDept, dept);
+            List<User> userList = userMapper.selectList(
+                    new QueryWrapper<User>()
+                            .in("department_id", allSubDepts.stream().map(Department::getDepartmentId).collect(Collectors.toList())));
+            List<String> userDDIds = userList.stream().map(User::getDingdingUserid).collect(Collectors.toList());
+            quotaNumQueryWrapper.in("user_dingding_id", userDDIds);
+        }
+        quotaNumQueryWrapper.orderByAsc("name").orderByAsc("start_time");
+        IPage<LeaveQuotaNum> leaveQuotaNumIPage = leaveQuotaNumMapper.selectPage(new Page<>(pageIndex, 50), quotaNumQueryWrapper);
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.data = map;
+
+        map.put("total", leaveQuotaNumIPage.getTotal());
+        map.put("records", leaveQuotaNumIPage.getRecords());
+
+        return msg;
+    }
+
+
+    //递归获取子部门
+    private List<Department> getSubDeptList(List<Department> allDeptList, Department department) {
+        List<Department> deptList = new ArrayList<>();
+        deptList.add(department);
+        //查找子部门的数据
+        List<Department> collect = allDeptList.stream().filter(sub -> sub.getSuperiorId() != null && sub.getSuperiorId().equals(department.getDepartmentId())).collect(Collectors.toList());
+        for (Department subItem : collect) {
+            deptList.addAll(getSubDeptList(allDeptList, subItem));
+        }
+        return deptList;
     }
     }
 }
 }
 
 

+ 72 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/LeaveQuotaNum.java

@@ -0,0 +1,72 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-05-24
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class LeaveQuotaNum extends Model<LeaveQuotaNum> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("company_id")
+    private Integer companyId;
+
+    @TableField("user_dingding_id")
+    private String userDingdingId;
+
+    @TableField("name")
+    private String name;
+
+    @TableField("leave_code")
+    private String leaveCode;
+
+    @TableField("start_time")
+    private String startTime;
+
+    @TableField("end_time")
+    private String endTime;
+
+    @TableField("quota_in_hours")
+    private String quotaInHours;
+
+    @TableField("quota_in_days")
+    private String quotaInDays;
+
+    @TableField("used_in_hours")
+    private String usedInHours;
+
+    @TableField("used_in_days")
+    private String usedInDays;
+
+    @TableField("left_in_hours")
+    private String leftInHours;
+
+    @TableField("left_in_days")
+    private String leftInDays;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 48 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/LeaveType.java

@@ -0,0 +1,48 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-05-24
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class LeaveType extends Model<LeaveType> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("company_id")
+    private Integer companyId;
+
+    @TableField("leave_code")
+    private String leaveCode;
+
+    @TableField("leave_name")
+    private String leaveName;
+
+    @TableField("is_default")
+    private Integer isDefault;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 53 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectRequirement.java

@@ -0,0 +1,53 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-05-24
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class ProjectRequirement extends Model<ProjectRequirement> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("project_id")
+    private Integer projectId;
+
+    @TableField("memb_req")
+    private String membReq;
+
+    @TableField("task_req")
+    private String taskReq;
+
+    @TableField(exist = false)
+    private String projectCode;
+    @TableField(exist = false)
+    private String projectName;
+
+    @TableField(exist = false)
+    private String activeUsers;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 2 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ReportExtraDegree.java

@@ -39,6 +39,8 @@ public class ReportExtraDegree extends Model<ReportExtraDegree> {
     @TableField("name")
     @TableField("name")
     private String name;
     private String name;
 
 
+    @TableField(exist = false)
+    private String projects;
 
 
     @Override
     @Override
     protected Serializable pkVal() {
     protected Serializable pkVal() {

+ 0 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/LeaveQuotaNum.java

@@ -3,7 +3,6 @@ package com.management.platform.entity.vo;
 public class LeaveQuotaNum {
 public class LeaveQuotaNum {
     public String userDingdingId;
     public String userDingdingId;
     public String name;//员工姓名
     public String name;//员工姓名
-    public String userId;
     public String leaveCode;//假期编码
     public String leaveCode;//假期编码
     public String startTime; //假期有效开始时间
     public String startTime; //假期有效开始时间
     public String endTime;//假期有效截止时间
     public String endTime;//假期有效截止时间

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

@@ -0,0 +1,16 @@
+package com.management.platform.mapper;
+
+import com.management.platform.entity.LeaveQuotaNum;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-05-24
+ */
+public interface LeaveQuotaNumMapper extends BaseMapper<LeaveQuotaNum> {
+
+}

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

@@ -0,0 +1,16 @@
+package com.management.platform.mapper;
+
+import com.management.platform.entity.LeaveType;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-05-24
+ */
+public interface LeaveTypeMapper extends BaseMapper<LeaveType> {
+
+}

+ 19 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectRequirementMapper.java

@@ -0,0 +1,19 @@
+package com.management.platform.mapper;
+
+import com.management.platform.entity.ProjectRequirement;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-05-24
+ */
+public interface ProjectRequirementMapper extends BaseMapper<ProjectRequirement> {
+
+    public List<ProjectRequirement> customSelect(Integer companyId, String startDate, Integer projectId, List<Integer> refProjectIdList, Integer startIndex, Integer pageSize);
+}

+ 3 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/DingDingService.java

@@ -32,5 +32,7 @@ public interface DingDingService {
 
 
     void getCorpSelfDefSmartReport(CompanyDingding dingding);
     void getCorpSelfDefSmartReport(CompanyDingding dingding);
 
 
-    public HttpRespMsg getLeaveTypeList(String leaveCode, Integer companyId, Integer departmentId, String userId, Integer pageIndex);
+//    public HttpRespMsg getLeaveTypeList(String leaveCode, Integer companyId, Integer departmentId, String userId, Integer pageIndex);
+
+    public HttpRespMsg syncLeaveQuotaData(Integer companyId);
 }
 }

+ 16 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/LeaveQuotaNumService.java

@@ -0,0 +1,16 @@
+package com.management.platform.service;
+
+import com.management.platform.entity.LeaveQuotaNum;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-05-24
+ */
+public interface LeaveQuotaNumService extends IService<LeaveQuotaNum> {
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/LeaveTypeService.java

@@ -0,0 +1,16 @@
+package com.management.platform.service;
+
+import com.management.platform.entity.LeaveType;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-05-24
+ */
+public interface LeaveTypeService extends IService<LeaveType> {
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectRequirementService.java

@@ -0,0 +1,16 @@
+package com.management.platform.service;
+
+import com.management.platform.entity.ProjectRequirement;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-05-24
+ */
+public interface ProjectRequirementService extends IService<ProjectRequirement> {
+
+}

+ 228 - 104
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java

@@ -15,7 +15,7 @@ import com.dingtalk.api.response.*;
 import com.google.gson.JsonObject;
 import com.google.gson.JsonObject;
 import com.management.platform.constant.Constant;
 import com.management.platform.constant.Constant;
 import com.management.platform.entity.*;
 import com.management.platform.entity.*;
-import com.management.platform.entity.vo.LeaveQuotaNum;
+//import com.management.platform.entity.vo.LeaveQuotaNum;
 import com.management.platform.entity.vo.LeaveTypeVO;
 import com.management.platform.entity.vo.LeaveTypeVO;
 import com.management.platform.entity.vo.UserVO;
 import com.management.platform.entity.vo.UserVO;
 import com.management.platform.mapper.*;
 import com.management.platform.mapper.*;
@@ -72,6 +72,8 @@ public class DingDingServiceImpl implements DingDingService {
     @Resource
     @Resource
     private SysModuleMapper sysModuleMapper;
     private SysModuleMapper sysModuleMapper;
     @Resource
     @Resource
+    private LeaveQuotaNumService leaveQuotaNumService;
+    @Resource
     private SysFunctionMapper sysFunctionMapper;
     private SysFunctionMapper sysFunctionMapper;
     @Resource
     @Resource
     private SysRoleModuleService sysRoleModuleService;
     private SysRoleModuleService sysRoleModuleService;
@@ -113,6 +115,8 @@ public class DingDingServiceImpl implements DingDingService {
     private LeaveSheetMapper leaveSheetMapper;
     private LeaveSheetMapper leaveSheetMapper;
     @Resource
     @Resource
     private LeaveSheetService leaveSheetService;
     private LeaveSheetService leaveSheetService;
+    @Resource
+    private LeaveTypeService leaveTypeService;
 
 
     @Value("${configEnv.isPrivateDeploy}")
     @Value("${configEnv.isPrivateDeploy}")
     private boolean isPrivateDeploy;//企业内部应用,私有化部署的情况
     private boolean isPrivateDeploy;//企业内部应用,私有化部署的情况
@@ -1346,120 +1350,121 @@ public class DingDingServiceImpl implements DingDingService {
         }
         }
     }
     }
 
 
-    public HttpRespMsg getLeaveTypeList(String leaveCode, Integer companyId, Integer departmentId, String userId, Integer pageIndex) {
+//    public HttpRespMsg getLeaveTypeList(String leaveCode, Integer companyId, Integer departmentId, String userId, Integer pageIndex) {
+//        CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
+//        HttpRespMsg msg = new HttpRespMsg();
+//        HashMap resultMap = new HashMap();
+//        DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/attendance/vacation/type/list");
+//        OapiAttendanceVacationTypeListRequest req = new OapiAttendanceVacationTypeListRequest();
+//        List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId).eq("role_name", "超级管理员"));
+////        String oaManagerDid = "2221645448842951";
+//        String oaManagerDid = userList.get(0).getDingdingUserid();
+//        if (leaveCode == null) {
+//            req.setOpUserid(oaManagerDid);
+//            req.setVacationSource("all");
+//            OapiAttendanceVacationTypeListResponse rsp = null;
+//            try {
+//                rsp = client.execute(req, getInnerCorpToken(dingding));
+//                System.out.println(rsp.getBody());
+//                JSONObject json = JSONObject.parseObject(rsp.getBody());
+//                JSONArray result = json.getJSONArray("result");
+//                List<LeaveTypeVO> typeList = new ArrayList<>();
+//                LeaveTypeVO defaultType = null;
+//                for (int i=0;i<result.size(); i++) {
+//                    JSONObject obj = result.getJSONObject(i);
+//                    LeaveTypeVO vo = new LeaveTypeVO();
+//                    vo.leaveCode = obj.getString("leave_code");
+//                    vo.leaveName = obj.getString("leave_name");
+//                    if (vo.leaveName.equals("调休")) {
+//                        defaultType = vo;
+//                    }
+//                    typeList.add(vo);
+//                }
+//                resultMap.put("leaveTypeList", typeList);
+//                if (defaultType == null) defaultType = typeList.get(0);
+//                leaveCode = defaultType.leaveCode;
+//                resultMap.put("defaultLeaveType", defaultType);
+//                System.out.println("本次请求的LeaveCode: "+leaveCode);
+//                reqQuotaList(companyId, dingding, leaveCode, oaManagerDid, departmentId, userId, pageIndex, resultMap);
+//            } catch (ApiException e) {
+//                e.printStackTrace();
+//            }
+//        } else {
+//            reqQuotaList(companyId, dingding, leaveCode, oaManagerDid, departmentId, userId, pageIndex, resultMap);
+//        }
+//        msg.data = resultMap;
+//        return msg;
+//    }
+
+    @Override
+    public HttpRespMsg syncLeaveQuotaData(Integer companyId) {
         CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
         CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
         HttpRespMsg msg = new HttpRespMsg();
         HttpRespMsg msg = new HttpRespMsg();
         HashMap resultMap = new HashMap();
         HashMap resultMap = new HashMap();
         DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/attendance/vacation/type/list");
         DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/attendance/vacation/type/list");
         OapiAttendanceVacationTypeListRequest req = new OapiAttendanceVacationTypeListRequest();
         OapiAttendanceVacationTypeListRequest req = new OapiAttendanceVacationTypeListRequest();
         List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId).eq("role_name", "超级管理员"));
         List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId).eq("role_name", "超级管理员"));
-//        String oaManagerDid = "2221645448842951";
         String oaManagerDid = userList.get(0).getDingdingUserid();
         String oaManagerDid = userList.get(0).getDingdingUserid();
-        if (leaveCode == null) {
-            req.setOpUserid(oaManagerDid);
-            req.setVacationSource("all");
-            OapiAttendanceVacationTypeListResponse rsp = null;
-            try {
-                rsp = client.execute(req, getInnerCorpToken(dingding));
-                System.out.println(rsp.getBody());
-                JSONObject json = JSONObject.parseObject(rsp.getBody());
-                JSONArray result = json.getJSONArray("result");
-                List<LeaveTypeVO> typeList = new ArrayList<>();
-                LeaveTypeVO defaultType = null;
-                for (int i=0;i<result.size(); i++) {
-                    JSONObject obj = result.getJSONObject(i);
-                    LeaveTypeVO vo = new LeaveTypeVO();
-                    vo.leaveCode = obj.getString("leave_code");
-                    vo.leaveName = obj.getString("leave_name");
-                    if (vo.leaveName.equals("调休")) {
-                        defaultType = vo;
-                    }
-                    typeList.add(vo);
+        req.setOpUserid(oaManagerDid);
+        req.setVacationSource("all");
+        OapiAttendanceVacationTypeListResponse rsp = null;
+        try {
+            rsp = client.execute(req, getInnerCorpToken(dingding));
+            JSONObject json = JSONObject.parseObject(rsp.getBody());
+            JSONArray result = json.getJSONArray("result");
+            List<LeaveType> typeList = new ArrayList<>();
+            leaveTypeService.remove(new QueryWrapper<LeaveType>().eq("company_id", dingding.getCompanyId()));
+            for (int i=0;i<result.size(); i++) {
+                JSONObject obj = result.getJSONObject(i);
+                LeaveType vo = new LeaveType();
+                vo.setLeaveCode(obj.getString("leave_code"));
+                vo.setLeaveName(obj.getString("leave_name"));
+                if (vo.getLeaveName().equals("调休")) {
+                    vo.setIsDefault(1);
                 }
                 }
-                resultMap.put("leaveTypeList", typeList);
-                if (defaultType == null) defaultType = typeList.get(0);
-                leaveCode = defaultType.leaveCode;
-                resultMap.put("defaultLeaveType", defaultType);
-                System.out.println("本次请求的LeaveCode: "+leaveCode);
-                reqQuotaList(companyId, dingding, leaveCode, oaManagerDid, departmentId, userId, pageIndex, resultMap);
-            } catch (ApiException e) {
-                e.printStackTrace();
+                vo.setCompanyId(dingding.getCompanyId());
+                typeList.add(vo);
             }
             }
-        } else {
-            reqQuotaList(companyId, dingding, leaveCode, oaManagerDid, departmentId, userId, pageIndex, resultMap);
+            leaveTypeService.saveBatch(typeList);
+            List<User> allUsers = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
+            int batchSize = 50;
+            int batchCount = allUsers.size()%50+allUsers.size()/50==0?0:1;
+            //删除老数据
+            leaveQuotaNumService.remove(new QueryWrapper<LeaveQuotaNum>().eq("company_id", companyId));
+            for (LeaveType type : typeList) {
+                //分批请求,50个一批
+                for (int i=0;i<batchCount; i++) {
+                    int startIndex = i*batchSize;
+                    int endIndex = (i+1)*batchSize;
+                    if (endIndex > allUsers.size()) endIndex = allUsers.size();
+                    List<User> curUserList = allUsers.subList(startIndex, endIndex);
+                    syncQuotaList(type.getLeaveCode(), oaManagerDid, dingding, curUserList, 0);
+                }
+            }
+        } catch (ApiException e) {
+            e.printStackTrace();
+            msg.setError(e.getMessage());
+            return msg;
         }
         }
-        msg.data = resultMap;
-        return msg;
-    }
 
 
-    //递归获取子部门
-    private List<Department> getSubDeptList(List<Department> allDeptList, Department department) {
-        List<Department> deptList = new ArrayList<>();
-        deptList.add(department);
-        //查找子部门的数据
-        List<Department> collect = allDeptList.stream().filter(sub -> sub.getSuperiorId() != null && sub.getSuperiorId().equals(department.getDepartmentId())).collect(Collectors.toList());
-        for (Department subItem : collect) {
-            deptList.addAll(getSubDeptList(allDeptList, subItem));
-        }
-        return deptList;
+        return new HttpRespMsg();
     }
     }
 
 
-    private void reqQuotaList(Integer companyId, CompanyDingding dingding,
-                                             String leaveCode, String oaManagerDid, Integer departmentId, String userId, Integer pageIndex, HashMap resultMap) {
-        //再调用查看假期余额的接口
+
+    //同步公司全部人员的假期余额
+    private void syncQuotaList(String leaveCode,String oaManagerDid, CompanyDingding dingding, List<User> userList, long offset) {
         long pageSize = 50L;
         long pageSize = 50L;
         DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/attendance/vacation/quota/list");
         DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/attendance/vacation/quota/list");
         OapiAttendanceVacationQuotaListRequest quoataReq = new OapiAttendanceVacationQuotaListRequest();
         OapiAttendanceVacationQuotaListRequest quoataReq = new OapiAttendanceVacationQuotaListRequest();
         quoataReq.setLeaveCode(leaveCode);
         quoataReq.setLeaveCode(leaveCode);
         quoataReq.setOpUserid(oaManagerDid);
         quoataReq.setOpUserid(oaManagerDid);
-        List<User> userList = null;
-        String userIds = null;
-        if (StringUtils.isEmpty(userId)) {
-            int total = 0;
-            if (departmentId == null) {
-                //全部员工,包括离职的
-                userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId).orderByAsc("id").last("limit " + (pageIndex-1)*pageSize+", "+pageSize));
-                total = userMapper.selectCount(new QueryWrapper<User>().eq("company_id", companyId));
-            } else {
-                //指定部门
-                Department dept = departmentMapper.selectById(departmentId);
-                List<Department> allDept = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
-                List<Department> allSubDepts = getSubDeptList(allDept, dept);
-                userList = userMapper.selectList(
-                        new QueryWrapper<User>()
-                                .in("department_id", allSubDepts.stream().map(Department::getDepartmentId).collect(Collectors.toList()))
-                                .orderByAsc("id").last("limit " + (pageIndex-1)*pageSize+", "+pageSize));
-                total = userMapper.selectCount(new QueryWrapper<User>()
-                        .in("department_id", allSubDepts.stream().map(Department::getDepartmentId).collect(Collectors.toList())));
-            }
-            String collect = userList.stream().map(User::getDingdingUserid).collect(Collectors.joining(","));
-            userIds = collect;
-            resultMap.put("total", total);
-        } else {
-            userList = new ArrayList<>();
-            userList.add(userMapper.selectById(userId));
-            userIds = userList.get(0).getDingdingUserid();
-            resultMap.put("total", 1);
-        }
-
+        String collect = userList.stream().map(User::getDingdingUserid).collect(Collectors.joining(","));
+        String userIds = collect;
         System.out.println("请求的size="+userList.size());
         System.out.println("请求的size="+userList.size());
         System.out.println("长度=="+userIds.length());
         System.out.println("长度=="+userIds.length());
         List<LeaveQuotaNum> quotaNumList = new ArrayList<>();
         List<LeaveQuotaNum> quotaNumList = new ArrayList<>();
-        for (User user : userList) {
-            LeaveQuotaNum quotaNum = new LeaveQuotaNum();
-            quotaNum.userId = user.getId();
-            quotaNum.userDingdingId = user.getDingdingUserid();
-            quotaNum.name = user.getName();
-            quotaNum.leaveCode = leaveCode;
-            quotaNumList.add(quotaNum);
-        }
-        resultMap.put("records", quotaNumList);
-        if (quotaNumList.size() == 0) {
-            //无员工数据了
-            return;
-        }
         quoataReq.setUserids(userIds);
         quoataReq.setUserids(userIds);
-        quoataReq.setOffset(0L);
+        quoataReq.setOffset(offset);
         quoataReq.setSize(pageSize);
         quoataReq.setSize(pageSize);
         OapiAttendanceVacationQuotaListResponse quotaListResponse = null;
         OapiAttendanceVacationQuotaListResponse quotaListResponse = null;
         try {
         try {
@@ -1467,7 +1472,7 @@ public class DingDingServiceImpl implements DingDingService {
         } catch (ApiException e) {
         } catch (ApiException e) {
             e.printStackTrace();
             e.printStackTrace();
         }
         }
-        System.out.println(quotaListResponse.getBody());
+        System.out.println(quotaListResponse.getBody()+":"+quotaListResponse.getErrmsg());
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         JSONObject json = JSONObject.parseObject(quotaListResponse.getBody());
         JSONObject json = JSONObject.parseObject(quotaListResponse.getBody());
         DecimalFormat df = new DecimalFormat("#0.0");
         DecimalFormat df = new DecimalFormat("#0.0");
@@ -1478,33 +1483,152 @@ public class DingDingServiceImpl implements DingDingService {
                 for (int i=0;i<leaveQuotas.size(); i++) {
                 for (int i=0;i<leaveQuotas.size(); i++) {
                     JSONObject jsonObject = leaveQuotas.getJSONObject(i);
                     JSONObject jsonObject = leaveQuotas.getJSONObject(i);
                     String userDDid = jsonObject.getString("userid");
                     String userDDid = jsonObject.getString("userid");
-                    LeaveQuotaNum quotaNum = quotaNumList.stream().filter(qu->qu.userDingdingId.equals(userDDid)).findFirst().get();
+                    LeaveQuotaNum quotaNum = new LeaveQuotaNum();
+                    quotaNum.setLeaveCode(leaveCode);
+                    quotaNum.setUserDingdingId(userDDid);
+                    String name = userList.stream().filter(u->u.getDingdingUserid().equals(userDDid)).findFirst().get().getName();
+                    quotaNum.setName(name);
+                    quotaNum.setCompanyId(dingding.getCompanyId());
                     Date startDate = new Date(jsonObject.getLongValue("start_time"));
                     Date startDate = new Date(jsonObject.getLongValue("start_time"));
-                    quotaNum.startTime = sdf.format(startDate);
+                    quotaNum.setStartTime(sdf.format(startDate));
                     Date endDate = new Date(jsonObject.getLongValue("end_time"));
                     Date endDate = new Date(jsonObject.getLongValue("end_time"));
-                    quotaNum.endTime = sdf.format(endDate);
+                    quotaNum.setEndTime(sdf.format(endDate));
                     Integer quota_num_per_hour = jsonObject.getInteger("quota_num_per_hour");
                     Integer quota_num_per_hour = jsonObject.getInteger("quota_num_per_hour");
                     if (quota_num_per_hour != null) {
                     if (quota_num_per_hour != null) {
                         //按小时为单位的情况
                         //按小时为单位的情况
-                        quotaNum.quotaInHours = df.format(quota_num_per_hour*1.0/100);
+                        quotaNum.setQuotaInHours(df.format(quota_num_per_hour*1.0/100));
                         Integer used_num_per_hour = jsonObject.getInteger("used_num_per_hour");
                         Integer used_num_per_hour = jsonObject.getInteger("used_num_per_hour");
-                        quotaNum.usedInHours = df.format(used_num_per_hour*1.0/100);
+                        quotaNum.setUsedInHours(df.format(used_num_per_hour*1.0/100));
                         //计算剩余
                         //计算剩余
-                        quotaNum.leftInHours = df.format((quota_num_per_hour - used_num_per_hour)*1.0/100);
+                        quotaNum.setLeftInHours(df.format((quota_num_per_hour - used_num_per_hour)*1.0/100));
                     } else {
                     } else {
                         //按天单位的情况
                         //按天单位的情况
                         Integer quota_num_per_day = jsonObject.getInteger("quota_num_per_day");
                         Integer quota_num_per_day = jsonObject.getInteger("quota_num_per_day");
-                        quotaNum.quotaInDays = df.format(quota_num_per_day*1.0/100);
+                        quotaNum.setQuotaInDays(df.format(quota_num_per_day*1.0/100));
                         Integer used_num_per_day = jsonObject.getInteger("used_num_per_day");
                         Integer used_num_per_day = jsonObject.getInteger("used_num_per_day");
-                        quotaNum.usedInDays = df.format(used_num_per_day*1.0/100);
+                        quotaNum.setUsedInDays(df.format(used_num_per_day*1.0/100));
                         //计算剩余
                         //计算剩余
-                        quotaNum.leftInDays = df.format((quota_num_per_day - used_num_per_day)*1.0/100);
+                        quotaNum.setLeftInDays(df.format((quota_num_per_day - used_num_per_day)*1.0/100));
                     }
                     }
+                    System.out.println(quotaNum.getName()+" 假期额度="+quotaNum.getQuotaInDays());
+                    quotaNumList.add(quotaNum);
                 }
                 }
+                leaveQuotaNumService.saveBatch(quotaNumList);
+            }
+            if (result.getBooleanValue("has_more")) {
+                //请求下一批
+                offset += pageSize;
+                System.out.println("请求下一批:offset="+offset);
+                syncQuotaList(leaveCode,oaManagerDid, dingding, userList, offset);
             }
             }
-
         }
         }
     }
     }
+//
+//    private void reqQuotaList(Integer companyId, CompanyDingding dingding,
+//                                             String leaveCode, String oaManagerDid, Integer departmentId, String userId, Integer pageIndex, HashMap resultMap) {
+//        //再调用查看假期余额的接口
+//        long pageSize = 50L;
+//        DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/attendance/vacation/quota/list");
+//        OapiAttendanceVacationQuotaListRequest quoataReq = new OapiAttendanceVacationQuotaListRequest();
+//        quoataReq.setLeaveCode(leaveCode);
+//        quoataReq.setOpUserid(oaManagerDid);
+//        List<User> userList = null;
+//        String userIds = null;
+//        if (StringUtils.isEmpty(userId)) {
+//            int total = 0;
+//            if (departmentId == null) {
+//                //全部员工,包括离职的
+//                QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
+//                queryWrapper.select("distinct dingding_userid, name").eq("company_id", companyId);
+//                userList = userMapper.selectList(queryWrapper);
+//                total = userList.size();
+//            } else {
+//                //指定部门
+//                Department dept = departmentMapper.selectById(departmentId);
+//                List<Department> allDept = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
+//                List<Department> allSubDepts = getSubDeptList(allDept, dept);
+//                userList = userMapper.selectList(
+//                        new QueryWrapper<User>().select("distinct dingding_userid, name")
+//                                .in("department_id", allSubDepts.stream().map(Department::getDepartmentId).collect(Collectors.toList())));
+//                total = userList.size();
+//            }
+//            String collect = userList.stream().map(User::getDingdingUserid).collect(Collectors.joining(","));
+//            userIds = collect;
+//            resultMap.put("total", total);
+//        } else {
+//            userList = new ArrayList<>();
+//            userList = userMapper.selectList(new QueryWrapper<User>().in("id", ListUtil.convertLongIdsArrayToList(userId)));
+//            userIds = userList.stream().map(User::getDingdingUserid).collect(Collectors.joining(","));
+//            resultMap.put("total", userList.size());
+//        }
+//
+//        System.out.println("请求的size="+userList.size());
+//        System.out.println("长度=="+userIds.length());
+//        List<LeaveQuotaNum> quotaNumList = new ArrayList<>();
+//        for (User user : userList) {
+//            LeaveQuotaNum quotaNum = new LeaveQuotaNum();
+//            quotaNum.userDingdingId = user.getDingdingUserid();
+//            quotaNum.name = user.getName();
+//            quotaNum.leaveCode = leaveCode;
+//            quotaNumList.add(quotaNum);
+//        }
+//
+//        if (quotaNumList.size() == 0) {
+//            //无员工数据了
+//            return;
+//        }
+//        quoataReq.setUserids(userIds);
+//        quoataReq.setOffset(0L);
+//        quoataReq.setSize(pageSize);
+//        OapiAttendanceVacationQuotaListResponse quotaListResponse = null;
+//        try {
+//            quotaListResponse = client.execute(quoataReq, getInnerCorpToken(dingding));
+//        } catch (ApiException e) {
+//            e.printStackTrace();
+//        }
+//        System.out.println(quotaListResponse.getBody()+":"+quotaListResponse.getErrmsg());
+//        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+//        JSONObject json = JSONObject.parseObject(quotaListResponse.getBody());
+//        DecimalFormat df = new DecimalFormat("#0.0");
+//        if (json.getInteger("errcode") == 0) {
+//            JSONObject result = json.getJSONObject("result");
+//            JSONArray leaveQuotas = result.getJSONArray("leave_quotas");
+//            if (leaveQuotas != null) {
+//                for (int i=0;i<leaveQuotas.size(); i++) {
+//                    JSONObject jsonObject = leaveQuotas.getJSONObject(i);
+//                    String userDDid = jsonObject.getString("userid");
+//                    for (LeaveQuotaNum quotaNum : quotaNumList) {
+//                        if (quotaNum.userDingdingId.equals(userDDid)) {
+//                            Date startDate = new Date(jsonObject.getLongValue("start_time"));
+//                            quotaNum.startTime = sdf.format(startDate);
+//                            Date endDate = new Date(jsonObject.getLongValue("end_time"));
+//                            quotaNum.endTime = sdf.format(endDate);
+//                            Integer quota_num_per_hour = jsonObject.getInteger("quota_num_per_hour");
+//                            if (quota_num_per_hour != null) {
+//                                //按小时为单位的情况
+//                                quotaNum.quotaInHours = df.format(quota_num_per_hour*1.0/100);
+//                                Integer used_num_per_hour = jsonObject.getInteger("used_num_per_hour");
+//                                quotaNum.usedInHours = df.format(used_num_per_hour*1.0/100);
+//                                //计算剩余
+//                                quotaNum.leftInHours = df.format((quota_num_per_hour - used_num_per_hour)*1.0/100);
+//                            } else {
+//                                //按天单位的情况
+//                                Integer quota_num_per_day = jsonObject.getInteger("quota_num_per_day");
+//                                quotaNum.quotaInDays = df.format(quota_num_per_day*1.0/100);
+//                                Integer used_num_per_day = jsonObject.getInteger("used_num_per_day");
+//                                quotaNum.usedInDays = df.format(used_num_per_day*1.0/100);
+//                                //计算剩余
+//                                quotaNum.leftInDays = df.format((quota_num_per_day - used_num_per_day)*1.0/100);
+//                            }
+//                            System.out.println(quotaNum.name+" 假期额度="+quotaNum.quotaInDays);
+//                            break;
+//                        }
+//                    }
+//                }
+//                resultMap.put("records", quotaNumList);
+//            }
+//        }
+//    }
 
 
     public void activateSuite(String authCorpid, String tmpAuthCode) throws ApiException {
     public void activateSuite(String authCorpid, String tmpAuthCode) throws ApiException {
         DingTalkClient client= new DefaultDingTalkClient("https://oapi.dingtalk.com/service/activate_suite?suite_access_token=" + getDDSuiteAccessToken());
         DingTalkClient client= new DefaultDingTalkClient("https://oapi.dingtalk.com/service/activate_suite?suite_access_token=" + getDDSuiteAccessToken());

+ 20 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/LeaveQuotaNumServiceImpl.java

@@ -0,0 +1,20 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.LeaveQuotaNum;
+import com.management.platform.mapper.LeaveQuotaNumMapper;
+import com.management.platform.service.LeaveQuotaNumService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-05-24
+ */
+@Service
+public class LeaveQuotaNumServiceImpl extends ServiceImpl<LeaveQuotaNumMapper, LeaveQuotaNum> implements LeaveQuotaNumService {
+
+}

+ 20 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/LeaveTypeServiceImpl.java

@@ -0,0 +1,20 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.LeaveType;
+import com.management.platform.mapper.LeaveTypeMapper;
+import com.management.platform.service.LeaveTypeService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-05-24
+ */
+@Service
+public class LeaveTypeServiceImpl extends ServiceImpl<LeaveTypeMapper, LeaveType> implements LeaveTypeService {
+
+}

+ 20 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectRequirementServiceImpl.java

@@ -0,0 +1,20 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.ProjectRequirement;
+import com.management.platform.mapper.ProjectRequirementMapper;
+import com.management.platform.service.ProjectRequirementService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-05-24
+ */
+@Service
+public class ProjectRequirementServiceImpl extends ServiceImpl<ProjectRequirementMapper, ProjectRequirement> implements ProjectRequirementService {
+
+}

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

@@ -577,7 +577,6 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     if (r.getGroupId() != null && r.getGroupId() != 0) {
                     if (r.getGroupId() != null && r.getGroupId() != 0) {
                         //直接获取分组的负责人作为审核人
                         //直接获取分组的负责人作为审核人
                         TaskGroup curGroup = taskGroups.stream().filter(tg->tg.getId().equals(r.getGroupId())).findFirst().get();
                         TaskGroup curGroup = taskGroups.stream().filter(tg->tg.getId().equals(r.getGroupId())).findFirst().get();
-                        System.out.println("选中的分组是=="+curGroup.getName());
                         if (curGroup.getInchargerId() != null) {
                         if (curGroup.getInchargerId() != null) {
                             User user = userMapper.selectById(curGroup.getInchargerId());
                             User user = userMapper.selectById(curGroup.getInchargerId());
                             HashMap map = new HashMap();
                             HashMap map = new HashMap();
@@ -618,7 +617,11 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             //顺便返回公司的工作时间设置
             //顺便返回公司的工作时间设置
             resultMap.put("timeType",timeType);
             resultMap.put("timeType",timeType);
             //返回公司的项目工时预警的成本项列表
             //返回公司的项目工时预警的成本项列表
-            List<ProjectBasecostSetting> timeBasecostList = projectBasecostSettingMapper.selectList(new QueryWrapper<ProjectBasecostSetting>().eq("company_id", companyId).eq("alarm_type", 1));
+            List<ProjectBasecostSetting> timeBasecostList = new ArrayList<>();
+            if (company.getPackageProject() == 1) {
+                timeBasecostList = projectBasecostSettingMapper.selectList(new QueryWrapper<ProjectBasecostSetting>().eq("company_id", companyId).eq("alarm_type", 1));
+            }
+
             resultMap.put("timeBasecostList",timeBasecostList);
             resultMap.put("timeBasecostList",timeBasecostList);
 
 
             httpRespMsg.data = resultMap;
             httpRespMsg.data = resultMap;
@@ -1559,10 +1562,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 //公司没有自定义流程,直接进行项目经理审核
                 //公司没有自定义流程,直接进行项目经理审核
                 reportMapper.update(new Report().setState(1).setProjectAuditTime(now),
                 reportMapper.update(new Report().setState(1).setProjectAuditTime(now),
                         new QueryWrapper<Report>().in("id", ids));
                         new QueryWrapper<Report>().in("id", ids));
-                if (oldState == -1) {
-                    allUsers = userMapper.selectList(new QueryWrapper<User>().eq("company_id", company.getId()));
-                    allReports = reportMapper.selectList(new QueryWrapper<Report>().in("id", ids));
-                }
+                allUsers = userMapper.selectList(new QueryWrapper<User>().eq("company_id", company.getId()));
+                allReports = reportMapper.selectList(new QueryWrapper<Report>().in("id", ids));
             } else {
             } else {
                 allUsers = userMapper.selectList(new QueryWrapper<User>().eq("company_id", company.getId()));
                 allUsers = userMapper.selectList(new QueryWrapper<User>().eq("company_id", company.getId()));
                 allReports = reportMapper.selectList(new QueryWrapper<Report>().in("id", ids));
                 allReports = reportMapper.selectList(new QueryWrapper<Report>().in("id", ids));

+ 3 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java

@@ -327,7 +327,9 @@ public class TimingTask {
                         json.put("template_id","tty9TkCAAAYoevY-40ciWD5lDncDfR5w");
                         json.put("template_id","tty9TkCAAAYoevY-40ciWD5lDncDfR5w");
                         json.put("url", "https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://mobworktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect");
                         json.put("url", "https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://mobworktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect");
                         json.put("content_item",dataJson);
                         json.put("content_item",dataJson);
-                        wxCorpInfoService.sendWXCorpTemplateMsg(cpList.get(0), corpUid, json);
+                        if (cpList.size() > 0) {
+                            wxCorpInfoService.sendWXCorpTemplateMsg(cpList.get(0), corpUid, json);
+                        }
                     } else if (u.get("wxOpenid") != null) {
                     } else if (u.get("wxOpenid") != null) {
                         push(u, t.getAlertMsg());
                         push(u, t.getAlertMsg());
                     }
                     }

+ 27 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/LeaveQuotaNumMapper.xml

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.management.platform.mapper.LeaveQuotaNumMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.LeaveQuotaNum">
+        <id column="id" property="id" />
+        <result column="company_id" property="companyId" />
+        <result column="user_dingding_id" property="userDingdingId" />
+        <result column="name" property="name" />
+        <result column="leave_code" property="leaveCode" />
+        <result column="start_time" property="startTime" />
+        <result column="end_time" property="endTime" />
+        <result column="quota_in_hours" property="quotaInHours" />
+        <result column="quota_in_days" property="quotaInDays" />
+        <result column="used_in_hours" property="usedInHours" />
+        <result column="used_in_days" property="usedInDays" />
+        <result column="left_in_hours" property="leftInHours" />
+        <result column="left_in_days" property="leftInDays" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, company_id, user_dingding_id, name, leave_code, start_time, end_time, quota_in_hours, quota_in_days, used_in_hours, used_in_days, left_in_hours, left_in_days
+    </sql>
+
+</mapper>

+ 19 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/LeaveTypeMapper.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.management.platform.mapper.LeaveTypeMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.LeaveType">
+        <id column="id" property="id" />
+        <result column="company_id" property="companyId" />
+        <result column="leave_code" property="leaveCode" />
+        <result column="leave_name" property="leaveName" />
+        <result column="is_default" property="isDefault" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, company_id, leave_code, leave_name, is_default
+    </sql>
+
+</mapper>

+ 44 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectRequirementMapper.xml

@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.management.platform.mapper.ProjectRequirementMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.ProjectRequirement">
+        <id column="id" property="id" />
+        <result column="project_id" property="projectId" />
+        <result column="memb_req" property="membReq" />
+        <result column="task_req" property="taskReq" />
+    </resultMap>
+
+    <resultMap id="RichMap" type="com.management.platform.entity.ProjectRequirement">
+        <id column="id" property="id" />
+        <result column="project_id" property="projectId" />
+        <result column="memb_req" property="membReq" />
+        <result column="task_req" property="taskReq" />
+        <result column="project_code" property="projectCode" />
+        <result column="project_name" property="projectName" />
+        <result column="active_users" property="activeUsers" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, project_id, memb_req, task_req
+    </sql>
+
+    <select id="customSelect" resultMap="RichMap">
+        SELECT project_requirement.id, project.id AS project_id, project.`project_name`, project.`project_code`, project_requirement.`memb_req`, project_requirement.`task_req`,
+        (SELECT GROUP_CONCAT(DISTINCT user.`name`) FROM report LEFT JOIN USER ON user.`id` = report.`creator_id` WHERE report.company_id=#{companyId} AND report.create_time >= #{startDate} AND report.`project_id` = project.id) AS active_users
+        FROM project LEFT JOIN project_requirement ON project.id = project_requirement.`project_id`
+        WHERE project.`company_id` = #{companyId}
+         <if test="projectId != null">
+             and project.id = #{projectId}
+         </if>
+         <if test="refProjectIdList != null">
+         and project.id in
+             <foreach collection="refProjectIdList" index="index" close=")" open="(" separator="," item="item">
+                 #{item}
+             </foreach>
+         </if>
+        order by project.id asc limit #{startIndex}, #{pageSize}
+    </select>
+</mapper>

+ 1 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list.vue

@@ -190,7 +190,7 @@
                     <el-table-column prop="date" label="员工/日期" width="200">
                     <el-table-column prop="date" label="员工/日期" width="200">
                         <template slot-scope="scope">
                         <template slot-scope="scope">
                             <div>
                             <div>
-                                <div v-if="scope.row.membdateList.length > 3">
+                                <div v-if="scope.row.membdateList.length > 1">
                                     <el-popover placement="top" width="400" trigger="hover">
                                     <el-popover placement="top" width="400" trigger="hover">
                                     <div>
                                     <div>
                                         <span v-for="(item, index) in scope.row.membdateList" :key="index">
                                         <span v-for="(item, index) in scope.row.membdateList" :key="index">

+ 1 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list_import.vue

@@ -161,7 +161,7 @@
                     <el-table-column prop="date" label="员工/日期" width="200">
                     <el-table-column prop="date" label="员工/日期" width="200">
                         <template slot-scope="scope">
                         <template slot-scope="scope">
                             <div>
                             <div>
-                                <div v-if="scope.row.membdateList.length > 3">
+                                <div v-if="scope.row.membdateList.length > 1">
                                     <el-popover placement="top" width="400" trigger="hover">
                                     <el-popover placement="top" width="400" trigger="hover">
                                     <div>
                                     <div>
                                         <span v-for="(item, index) in scope.row.membdateList" :key="index">
                                         <span v-for="(item, index) in scope.row.membdateList" :key="index">