Selaa lähdekoodia

提交FTE工作计划

Lijy 1 kuukausi sitten
vanhempi
commit
06d53bc1bb
48 muutettua tiedostoa jossa 1842 lisäystä ja 146 poistoa
  1. 3 3
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/WeiXinCorpController.java
  2. 4 1
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/SalesOrderServiceImpl.java
  3. 1 1
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/TaskServiceImpl.java
  4. 3 3
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  5. 23 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java
  6. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/StagesController.java
  7. 185 56
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskController.java
  8. 18 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserController.java
  9. 37 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ErpOrderInfo.java
  10. 4 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Task.java
  11. 6 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/UserFvTime.java
  12. 10 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/GanttDataItem.java
  13. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/UserVO.java
  14. 5 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/BusinessTripMapper.java
  15. 15 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ErpOrderInfoMapper.java
  16. 4 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/LeaveSheetMapper.java
  17. 29 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectMapper.java
  18. 4 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/UserFvTimeMapper.java
  19. 6 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectService.java
  20. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/TaskService.java
  21. 4 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/UserService.java
  22. 310 13
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  23. 102 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/TaskServiceImpl.java
  24. 44 5
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  25. 5 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java
  26. 327 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/DataCollectTask.java
  27. 15 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/BusinessTripMapper.xml
  28. 18 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ErpOrderInfoMapper.xml
  29. 14 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/LeaveSheetMapper.xml
  30. 246 3
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml
  31. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TaskExecutorMapper.xml
  32. 10 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/UserFvTimeMapper.xml
  33. 116 31
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/CompanyController.java
  34. 23 23
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/entity/Project.java
  35. 25 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/mapper/ProjectBasecostMapper.java
  36. 17 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/mapper/ProjectBasecostSettingMapper.java
  37. 17 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/mapper/ProjectDocfolderMapper.java
  38. 17 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/mapper/ProjectDocumentMapper.java
  39. 17 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/mapper/ProjectNotifyUserMapper.java
  40. 16 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/mapper/ProjectPercentageMapper.java
  41. 17 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/mapper/ProjectProfessionMapper.java
  42. 16 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/mapper/ProjectTimerMapper.java
  43. 17 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/mapper/ProjectUserSalaryMapper.java
  44. 17 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/mapper/ReportAuditLogMapper.java
  45. 17 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/mapper/ReportExtraDegreeMapper.java
  46. 17 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/mapper/ReportImportLogMapper.java
  47. 17 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/mapper/ReportProfessionProgressMapper.java
  48. 17 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/mapper/SubProjectMapper.java

+ 3 - 3
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/WeiXinCorpController.java

@@ -1625,11 +1625,11 @@ public class WeiXinCorpController {
         stages.add(stage2);
         Stage stage3 = new Stage().setName("无效").setPlan("0%").setSeq(6).setIsFinish(1).setCompanyId(company.getId()).setColor("#F4F5F7");
         stages.add(stage3);
-        Stage stage4 = new Stage().setName("验证客户").setPlan("10%").setSeq(1).setIsFinish(1).setCompanyId(company.getId()).setColor("#075985");
+        Stage stage4 = new Stage().setName("验证客户").setPlan("10%").setSeq(1).setIsFinish(0).setCompanyId(company.getId()).setColor("#075985");
         stages.add(stage4);
-        Stage stage5 = new Stage().setName("需求分析").setPlan("30%").setSeq(2).setIsFinish(1).setCompanyId(company.getId()).setColor("#075985");
+        Stage stage5 = new Stage().setName("需求分析").setPlan("30%").setSeq(2).setIsFinish(0).setCompanyId(company.getId()).setColor("#075985");
         stages.add(stage5);
-        Stage stage6 = new Stage().setName("方案/报价").setPlan("80%").setSeq(3).setIsFinish(1).setCompanyId(company.getId()).setColor("#075985");
+        Stage stage6 = new Stage().setName("方案/报价").setPlan("80%").setSeq(3).setIsFinish(0).setCompanyId(company.getId()).setColor("#075985");
         stages.add(stage6);
         return stages;
     }

+ 4 - 1
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/SalesOrderServiceImpl.java

@@ -1031,7 +1031,10 @@ public class SalesOrderServiceImpl extends ServiceImpl<SalesOrderMapper, SalesOr
         SysForm sysForm = sysFormMapper.selectOne(new LambdaQueryWrapper<SysForm>().eq(SysForm::getCompanyId, user.getCompanyId()).eq(SysForm::getCode, "Order").eq(SysForm::getIsCurrent, 1));
         WxCorpInfo wxCorpInfo = wxCorpInfoService.getOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, user.getCompanyId()));
         String config = sysForm.getConfig();
-        JSONObject configOb = JSON.parseObject(config);
+        System.out.println("==>:"+config);
+        // 定位并替换
+        String fixedConfig = config.replace("\"pattern\":\"/^\\d+$/\"", "\"pattern\":\"/^\\\\d+$/\"");
+        JSONObject configOb = JSON.parseObject(fixedConfig); // 现在不会报错
         JSONArray configObJSONArray = configOb.getJSONArray("list");
         List<List<String>> dataList=new ArrayList<>();
         List<String> titleList=new ArrayList<>();

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

@@ -1737,7 +1737,7 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
                         value = String.valueOf(aClass.getMethod("getTaskName").invoke(tasKVo)).equals("null") ? "" : String.valueOf(aClass.getMethod("getTaskName").invoke(tasKVo));
                     } else if (model.equals("priority")) {
 //                    0-低 1-中 2-高
-                        Integer priority = tasKVo.getPriority();
+                        int priority = tasKVo.getPriority()==null?3:tasKVo.getPriority();
                         switch (priority) {
                             case 0:
                                 value = "低";

+ 3 - 3
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/UserServiceImpl.java

@@ -1367,11 +1367,11 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
         stages.add(stage2);
         Stage stage3 = new Stage().setName("无效").setPlan("0%").setSeq(6).setIsFinish(1).setCompanyId(company.getId()).setColor("#F4F5F7");
         stages.add(stage3);
-        Stage stage4 = new Stage().setName("验证客户").setPlan("10%").setSeq(1).setIsFinish(1).setCompanyId(company.getId()).setColor("#075985");
+        Stage stage4 = new Stage().setName("验证客户").setPlan("10%").setSeq(1).setIsFinish(0).setCompanyId(company.getId()).setColor("#075985");
         stages.add(stage4);
-        Stage stage5 = new Stage().setName("需求分析").setPlan("30%").setSeq(2).setIsFinish(1).setCompanyId(company.getId()).setColor("#075985");
+        Stage stage5 = new Stage().setName("需求分析").setPlan("30%").setSeq(2).setIsFinish(0).setCompanyId(company.getId()).setColor("#075985");
         stages.add(stage5);
-        Stage stage6 = new Stage().setName("方案/报价").setPlan("80%").setSeq(3).setIsFinish(1).setCompanyId(company.getId()).setColor("#075985");
+        Stage stage6 = new Stage().setName("方案/报价").setPlan("80%").setSeq(3).setIsFinish(0).setCompanyId(company.getId()).setColor("#075985");
         stages.add(stage6);
         return stages;
     }

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

@@ -1612,5 +1612,28 @@ public class ProjectController {
     public HttpRespMsg transferProjectReviwer(String userId, String targetAuditorId){
         return projectService.transferProjectReviwer(userId,targetAuditorId);
     }
+
+    /**
+     * 添加任务计划的时候 项目是小组长参与的项目
+     */
+    @RequestMapping("/getProjectByLeader")
+    public HttpRespMsg getProjectByLeader(Integer projectId, HttpServletRequest request){
+        return projectService.getProjectByLeader(projectId,request);
+    }
+
+
+
+
+    //FTE报表
+    @RequestMapping("/getProjectTaskPlanFTEData")
+    public HttpRespMsg getProjectTaskPlanFTEData(@RequestParam Integer pageIndex, @RequestParam Integer pageSize,String monthStart,String monthEnd,String area,String userId,String sortProp, Integer sortOrder,Integer departmentId,HttpServletRequest request){
+        return projectService.getProjectTaskPlanFTEData(pageIndex,pageSize,monthStart,monthEnd,area,userId,sortProp,sortOrder,departmentId,request);
+    }
+
+    //导出FTE报表
+    @RequestMapping("/exportTaskPlanFTEData")
+    public HttpRespMsg exportTaskPlanFTEData(String monthStart,String monthEnd,String area,String userId,Integer departmentId ,HttpServletRequest request){
+        return projectService.exportTaskPlanFTEData(monthStart,monthEnd,area,userId,departmentId,request);
+    }
 }
 

+ 2 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/StagesController.java

@@ -191,6 +191,7 @@ public class StagesController {
         //按任务分组查看
         queryWrapper.eq("group_id", item.getGroupId());
         queryWrapper.isNull("parent_tid");
+        queryWrapper.eq("is_task_plan",0);
         //排序根据前端传过来的字段
         if (isDesc) {
             queryWrapper.orderByDesc(order);
@@ -210,7 +211,7 @@ public class StagesController {
         List<Task> subTasks = new ArrayList<>();
         if (tasks.size() > 0) {
             List<Integer> collect = tasks.stream().map(Task::getId).collect(Collectors.toList());
-            List<Task> subLists = taskService.simpleList(new QueryWrapper<Task>().in("parent_tid", collect),null,null);
+            List<Task> subLists = taskService.simpleList(new QueryWrapper<Task>().in("parent_tid", collect).eq("is_task_plan",0),null,null);
             if (functionList.size() == 0 && !userId.equals(project.getInchargerId())) {
                 subLists = subLists.stream().filter(t->t.getExecutorId() == null || t.getExecutorId().contains(userId) || userId.equals(t.getCreaterId())).collect(Collectors.toList());
             }

+ 185 - 56
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskController.java

@@ -5,13 +5,16 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.constant.Constant;
 import com.management.platform.entity.*;
 import com.management.platform.entity.bo.QueryTaskChargePage;
 import com.management.platform.entity.vo.SysRichFunction;
 import com.management.platform.mapper.*;
 import com.management.platform.service.*;
+import com.management.platform.service.impl.WxCorpInfoServiceImpl;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.MessageUtils;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.poi.hssf.usermodel.*;
 import org.assertj.core.util.Lists;
@@ -46,6 +49,7 @@ import java.util.stream.Collectors;
  */
 @RestController
 @RequestMapping("/task")
+@Slf4j
 public class TaskController {
     @Resource
     private HttpServletRequest request;
@@ -187,13 +191,34 @@ public class TaskController {
         User user = userMapper.selectById(userId);
         HttpRespMsg msg = new HttpRespMsg();
         WxCorpInfo wxCorpInfo = wxCorpInfoService.getOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+        int isInsert=0;
+        int isUpdate=0;
         //新建的任务,需要设置创建人,创建时间
         if (task.getId() == null) {
+            isInsert=1;
             task.setCreateDate(LocalDate.now());
             task.setCreaterId(userId);
             task.setCreaterName(user.getName());
             task.setCreatorColor(user.getColor());
             task.setCompanyId(user.getCompanyId());
+
+            if (user.getCompanyId()==Constant.MLD_COMPANY_ID&&task.getIsTaskPlan()==0&&task.getCheckFirstId()==null){
+                if (task.getProjectId()!=null){
+                    Project project = projectMapper.selectById(task.getProjectId());
+                    task.setCheckFirstId(project.getInchargerId());
+                }
+            }
+
+            if (user.getCompanyId()==Constant.MLD_COMPANY_ID&&task.getIsTaskPlan()==1){
+                task.setTaskPlan(1);
+                task.setTaskStatus(3);
+                //状态是请假 直接变成任务
+                if (task.getTaskPlanType()==3){
+                    task.setIsTaskPlan(0);
+                    task.setTaskStatus(0);
+                    task.setTaskPlan(1);
+                }
+            }
 //            TimeType timeType = timeTypeMapper.selectById(user.getCompanyId());
 //            Integer taskFileCharge = timeType.getTaskFileCharge();
 //            if(1 == taskFileCharge){
@@ -304,7 +329,9 @@ public class TaskController {
                         Participation participation=new Participation();
                         participation.setUserId(executor.getExecutorId());
                         participation.setProjectId(task.getProjectId());
-                        participationMapper.insert(participation);
+                        if (participation.getProjectId()!=null) {
+                            participationMapper.insert(participation);
+                        }
                     }
                 }
             }
@@ -342,7 +369,7 @@ public class TaskController {
             if (task.getExecutorId() != null) {
                 msgRecepientList = task.getExecutorList().stream().filter(exe->!StringUtils.isEmpty(exe.getExecutorId())).map(TaskExecutor::getExecutorId).collect(Collectors.toList());
             }
-            if (task.getTaskType() == 1) {
+            if (task.getTaskType()!=null&&task.getTaskType() == 1) {
                 needRecalculateProgress = true;
             }
         } else {
@@ -444,8 +471,91 @@ public class TaskController {
             if ((oldTask.getTaskType() == 1 && task.getTaskType() != 1) || (oldTask.getTaskType() != 1 && task.getTaskType() == 1)) {
                 needRecalculateProgress = true;
             }
+            // 未驳回之前 第一审核人 修改工作计划
+            if (user.getCompanyId()==Constant.MLD_COMPANY_ID
+                    &&task.getIsTaskPlan()==1
+                    && org.apache.commons.lang3.StringUtils.isNotEmpty(task.getCheckFirstId())
+                    &&task.getCheckFirstId().equals(userId)
+                    &&task.getTaskStatus()==3){
+                isUpdate=1;
+                task.setTaskStatus(4);//待第二审核人审核
+            } else if (user.getCompanyId() == Constant.MLD_COMPANY_ID
+                    && task.getIsTaskPlan() == 1
+                    && org.apache.commons.lang3.StringUtils.isNotEmpty(task.getCheckSecondId())
+                    && task.getCheckSecondId().equals(userId)
+                    &&task.getTaskStatus()==4) {
+                isUpdate=2;
+                task.setTaskStatus(0);//变化为进行中
+                task.setIsTaskPlan(0);//不再是计划
+            }
+            // 驳回后,小组长对计划进行修改
+            if (user.getCompanyId()==Constant.MLD_COMPANY_ID
+                    &&task.getIsTaskPlan()==1
+                    &&(task.getTaskStatus()==5||task.getTaskStatus()==6)
+                    &&(!userId.equals(task.getCheckFirstId())&&!userId.equals(task.getCheckSecondId()))
+                    ){
+                isUpdate=3;
+                task.setTaskStatus(3);//待第一审核人审核
+            }
+        }
+        boolean saved = taskService.saveOrUpdate(task);
+        //新增成功,给第一审核人发送信息提醒
+        if (saved&&isInsert==1){
+            if (user.getCompanyId()==Constant.MLD_COMPANY_ID&&task.getIsTaskPlan()==1&& org.apache.commons.lang3.StringUtils.isNotEmpty(task.getCheckFirstId())){
+                //给第一审核人发送信息提醒
+                log.info("添加工作计划,给第一审核人发送信息提醒");
+                User owner = userMapper.selectById(task.getCheckFirstId());
+                if (wxCorpInfo != null) {
+                    //推送到企业微信
+                    StringBuilder stringBuilder = new StringBuilder();
+                    stringBuilder.append("$userName="+owner.getCorpwxUserid()+"$")
+                            .append(":有新的工作计划待审核");
+                    wxCorpInfoService.sendWXCorpMsg(wxCorpInfo,owner.getCorpwxUserid(), stringBuilder.toString(), "task",
+                            WxCorpInfoServiceImpl.TEXT_CARD_MSG_TASK_PLAN_NEED_CHECK);
+                }
+            }
+        } else if (saved && isUpdate > 0) {
+            //第一审核人修改后, 变成待第二审核人审核
+            if (isUpdate==1){
+                User owner = userMapper.selectById(task.getCheckSecondId());
+                if (wxCorpInfo != null) {
+                    //推送到企业微信
+                    StringBuilder stringBuilder = new StringBuilder();
+                    stringBuilder.append("$userName="+owner.getCorpwxUserid()+"$")
+                            .append(":有新的工作计划待审核");
+                    wxCorpInfoService.sendWXCorpMsg(wxCorpInfo,owner.getCorpwxUserid(), stringBuilder.toString(), "task",
+                            WxCorpInfoServiceImpl.TEXT_CARD_MSG_TASK_PLAN_NEED_CHECK);
+                }
+            }else if(isUpdate==2){
+                List<TaskExecutor> taskExecutorList = taskExecutorMapper.selectList(new QueryWrapper<TaskExecutor>().eq("task_id", task.getId()));
+                if(CollectionUtils.isNotEmpty(taskExecutorList)){
+                    for (TaskExecutor taskExecutor : taskExecutorList) {
+                        //给任务的执行人发送信息提醒
+                        User owner = userMapper.selectById(taskExecutor.getExecutorId());
+                        if (wxCorpInfo != null) {
+                            //推送到企业微信
+                            StringBuilder stringBuilder = new StringBuilder();
+                            stringBuilder.append("$userName="+owner.getCorpwxUserid()+"$")
+                                    .append(":有新的任务,请及时查看");
+                            wxCorpInfoService.sendWXCorpMsg(wxCorpInfo,owner.getCorpwxUserid(), stringBuilder.toString(), "task",
+                                    WxCorpInfoServiceImpl.TEXT_CARD_MSG_TASK_PLAN_NEED_CHECK);
+                        }
+                    }
+                }
+            } else if (isUpdate==3) {
+                //给第一审核人发送信息提醒
+                log.info("驳回后小组长修改,给第一审核人发送信息提醒");
+                User owner = userMapper.selectById(task.getCheckFirstId());
+                if (wxCorpInfo != null) {
+                    //推送到企业微信
+                    StringBuilder stringBuilder = new StringBuilder();
+                    stringBuilder.append("$userName="+owner.getCorpwxUserid()+"$")
+                            .append(":有工作计划待审核");
+                    wxCorpInfoService.sendWXCorpMsg(wxCorpInfo,owner.getCorpwxUserid(), stringBuilder.toString(), "task",
+                            WxCorpInfoServiceImpl.TEXT_CARD_MSG_TASK_PLAN_NEED_CHECK);
+                }
+            }
         }
-        taskService.saveOrUpdate(task);
         if (task.getExecutorId() == null) {
             //清空执行人
             if (!isNew) {
@@ -482,30 +592,32 @@ public class TaskController {
                 informationService.save(new Information().setType(1).setContent(String.valueOf(task.getProjectId())).setUserId(msgRecepient));
             });
             List<User> recpUserList = userMapper.selectList(new QueryWrapper<User>().in("id", msgRecepientList));
-            if (recpUserList.size() > 0) {
-                if (recpUserList.get(0).getDingdingUserid() != null) {
-                    //钉钉用户
-                    CompanyDingding dingding = companyDingdingService.getOne(new QueryWrapper<CompanyDingding>().eq("company_id", user.getCompanyId()));
-                    LocalDate endDate = task.getEndDate();
-                    String endStr = "";
-                    if (endDate != null) {
-                        endStr = DateTimeFormatter.ofPattern("yyyy-MM-dd").format(endDate);
+            if(user.getCompanyId()!=Constant.MLD_COMPANY_ID||task.getIsTaskPlan()!=1) {
+                if (recpUserList.size() > 0) {
+                    if (recpUserList.get(0).getDingdingUserid() != null) {
+                        //钉钉用户
+                        CompanyDingding dingding = companyDingdingService.getOne(new QueryWrapper<CompanyDingding>().eq("company_id", user.getCompanyId()));
+                        LocalDate endDate = task.getEndDate();
+                        String endStr = "";
+                        if (endDate != null) {
+                            endStr = DateTimeFormatter.ofPattern("yyyy-MM-dd").format(endDate);
+                        }
+                        companyDingdingService.sendNewTaskMsg(dingding, recpUserList.stream().map(User::getDingdingUserid).collect(Collectors.joining(",")),
+                                task.getName(), endStr);
+                    } else if (recpUserList.get(0).getCorpwxUserid() != null) {
+                        String corpUid = recpUserList.stream().map(User::getCorpwxUserid).distinct().collect(Collectors.joining("|"));
+                        JSONObject json = new JSONObject();
+                        JSONArray dataJson = new JSONArray();
+                        JSONObject jsonObj = new JSONObject();
+                        jsonObj.put("key", "任务内容");
+                        jsonObj.put("value", task.getName());
+                        dataJson.add(jsonObj);
+                        json.put("template_id", "tty9TkCAAAovv416zsWtn0e06CJ635HA");
+                        json.put("url", "https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://worktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=task#wechat_redirect");
+                        json.put("content_item", dataJson);
+                        //todo:发送消息提醒任务
+                        wxCorpInfoService.sendWXCorpTemplateMsg(wxCorpInfo, corpUid, json);
                     }
-                    companyDingdingService.sendNewTaskMsg(dingding, recpUserList.stream().map(User::getDingdingUserid).collect(Collectors.joining(",")),
-                            task.getName(), endStr);
-                } else if (recpUserList.get(0).getCorpwxUserid() != null) {
-                    String corpUid = recpUserList.stream().map(User::getCorpwxUserid).distinct().collect(Collectors.joining("|"));
-                    JSONObject json=new JSONObject();
-                    JSONArray dataJson=new JSONArray();
-                    JSONObject jsonObj=new JSONObject();
-                    jsonObj.put("key", "任务内容");
-                    jsonObj.put("value",task.getName());
-                    dataJson.add(jsonObj);
-                    json.put("template_id","tty9TkCAAAovv416zsWtn0e06CJ635HA");
-                    json.put("url", "https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://worktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=task#wechat_redirect");
-                    json.put("content_item",dataJson);
-                    //todo:发送消息提醒任务
-                    wxCorpInfoService.sendWXCorpTemplateMsg(wxCorpInfo, corpUid, json);
                 }
             }
         }
@@ -759,6 +871,7 @@ public class TaskController {
             //已超期的任务,未完成的任务
             queryWrapper.lt("end_date", LocalDate.now()).eq("task_status", 0);
         }
+        queryWrapper.eq("is_task_plan",0);
         List<Task> list = taskService.simpleList(queryWrapper,start,size);
         int total = taskMapper.selectCount(queryWrapper);
         //没有权限只能看到自己创建的,负责的和待分配的任务
@@ -920,6 +1033,7 @@ public class TaskController {
                     if(first.isPresent()){
                         e.setServiceName(first.get().getServiceName());
                         e.setServiceCode(first.get().getServiceCode());
+                        e.setId(first.get().getId());
                     }
                 }
             });
@@ -930,6 +1044,7 @@ public class TaskController {
                     if(first.isPresent()){
                         e.setServiceName(first.get().getServiceName());
                         e.setServiceCode(first.get().getServiceCode());
+                        e.setId(first.get().getId());
                     }
                 }
             });
@@ -947,45 +1062,47 @@ public class TaskController {
             userList = userMapper.selectList(new QueryWrapper<User>().select("id, name, phone, job_number, department_id, is_active").eq("company_id", user.getCompanyId()).eq("is_active", 1));
         }
         t.setUserList(userList);
-        //查询项目负责人id以及所属任务分组负责人id
-        Project project = projectService.getOne(new QueryWrapper<Project>().eq("id", t.getProjectId()));
-        TaskGroup group = taskGroupService.getOne(new QueryWrapper<TaskGroup>().eq("id", t.getGroupId()));
-        t.setProjectInchargerId(project.getInchargerId()==null?"":project.getInchargerId());
-        t.setGroupInchargerId(group.getInchargerId()==null?"":group.getInchargerId());
-        //判断当前用户是否有权限创建任务: 有权限的包括管理全部项目,项目创建人,项目PM, 分组负责人,分组参与人
-        List<SysRichFunction> manageAllProjects = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "管理全部项目");
-        boolean canAddTask = false;
-        Integer companyId = user.getCompanyId();
-        TaskAddCtrl taskAddCtrl = taskAddCtrlMapper.selectById(companyId);
-        if (taskAddCtrl == null) {
-            //没有的话,默认生成一个
-            taskAddCtrl = new TaskAddCtrl();
-            taskAddCtrl.setCompanyId(companyId);
-            taskAddCtrl.setCtrlType(1);//0-普通项目参与人不可添加任务,1-项目参与人可添加,2-仅分组参与人可添加
-            taskAddCtrlMapper.insert(taskAddCtrl);
-        }
-        if (manageAllProjects.size() > 0 || userId.equals(project.getCreatorId()) || userId.equals(project.getInchargerId())) {
-            canAddTask = true;
-        }
-        if (!canAddTask) {
-            //进一步判断是否是分组的负责人,参与人
-            if (userId.equals(group.getInchargerId())) {
+        if (t.getTaskPlanType()==null||t.getTaskPlanType()!=3) {
+            //查询项目负责人id以及所属任务分组负责人id
+            Project project = projectService.getOne(new QueryWrapper<Project>().eq("id", t.getProjectId()));
+            TaskGroup group = taskGroupService.getOne(new QueryWrapper<TaskGroup>().eq("id", t.getGroupId()));
+            t.setProjectInchargerId(project.getInchargerId() == null ? "" : project.getInchargerId());
+            t.setGroupInchargerId(group.getInchargerId() == null ? "" : group.getInchargerId());
+            //判断当前用户是否有权限创建任务: 有权限的包括管理全部项目,项目创建人,项目PM, 分组负责人,分组参与人
+            List<SysRichFunction> manageAllProjects = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "管理全部项目");
+            boolean canAddTask = false;
+            Integer companyId = user.getCompanyId();
+            TaskAddCtrl taskAddCtrl = taskAddCtrlMapper.selectById(companyId);
+            if (taskAddCtrl == null) {
+                //没有的话,默认生成一个
+                taskAddCtrl = new TaskAddCtrl();
+                taskAddCtrl.setCompanyId(companyId);
+                taskAddCtrl.setCtrlType(1);//0-普通项目参与人不可添加任务,1-项目参与人可添加,2-仅分组参与人可添加
+                taskAddCtrlMapper.insert(taskAddCtrl);
+            }
+            if (manageAllProjects.size() > 0 || userId.equals(project.getCreatorId()) || userId.equals(project.getInchargerId())) {
                 canAddTask = true;
             }
             if (!canAddTask) {
-                Integer ctrlType = taskAddCtrl.getCtrlType();
-                if (ctrlType == 1) {
+                //进一步判断是否是分组的负责人,参与人
+                if (userId.equals(group.getInchargerId())) {
                     canAddTask = true;
-                } else if (ctrlType == 2) {
-                    //分组参与人可以创建任务
-                    int count = groupParticipatorMapper.selectCount(new QueryWrapper<GroupParticipator>().eq("user_id", userId).eq("group_id", group.getId()));
-                    if (count > 0) {
+                }
+                if (!canAddTask) {
+                    Integer ctrlType = taskAddCtrl.getCtrlType();
+                    if (ctrlType == 1) {
                         canAddTask = true;
+                    } else if (ctrlType == 2) {
+                        //分组参与人可以创建任务
+                        int count = groupParticipatorMapper.selectCount(new QueryWrapper<GroupParticipator>().eq("user_id", userId).eq("group_id", group.getId()));
+                        if (count > 0) {
+                            canAddTask = true;
+                        }
                     }
                 }
             }
+            t.setCanAddTask(canAddTask);
         }
-        t.setCanAddTask(canAddTask);
         msg.data = t;
         return msg;
     }
@@ -1410,6 +1527,10 @@ public class TaskController {
         if(pageIndex!=null&&pageSize!=null){
             pageStart = (pageIndex - 1) * pageSize;
         }
+        if (companyId==Constant.MLD_COMPANY_ID){
+            //美莱德 任务计划状态是1
+            queryWrapper.ne("is_task_plan",1);
+        }
         List<Task> list = taskMapper.getTaskWithProjectName(queryWrapper,pageStart, pageSize,companyId,branchDepartment);
         List<Integer> collect = list.stream().map(l -> l.getId()).distinct().collect(Collectors.toList());
         collect.add(-1);
@@ -1759,5 +1880,13 @@ public class TaskController {
     }
 
 
+    //工作计划的通过或者驳回
+    //通过 type=true ,驳回 type=false
+    @RequestMapping("/taskPlanPassOrReject")
+    public HttpRespMsg taskPlanPassOrReject(Integer taskId, boolean type){
+        return taskService.taskPlanPassOrReject(taskId,type,request);
+    }
+
+
 }
 

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

@@ -174,12 +174,30 @@ public class UserController {
     public HttpRespMsg getFirstCheckUserList() {
         return userService.getFirstCheckUserList(request);
     }
+    @RequestMapping("/getChargeUserByProjectId")
+    public HttpRespMsg getChargeUserByProjectId(Integer projectId){
+        return userService.getChargeUserByProjectId(projectId,request);
+    }
 
+    /**
+     * mld工作计划二级审核人
+     * @return
+     */
     @RequestMapping("/getSecondCheckUser")
     public HttpRespMsg getSecondCheckUser() {
         return userService.getSecondCheckUserList(request);
     }
 
+    /**
+     *获取项目参与者信息
+     * @param projectId
+     * @return
+     */
+    @RequestMapping("/getUserByProject")
+    public HttpRespMsg getUserByProject(Integer projectId) {
+        return userService.getUserByProject(projectId,request);
+    }
+
     @RequestMapping("/getSimpleActiveUserListPage")
     public HttpRespMsg getSimpleActiveUserListPage(@RequestParam Integer pageIndex, @RequestParam Integer pageSize,Integer departmentId,String keyword,String cursor,@RequestParam(required = false) String userIds) throws Exception {
         return userService.getSimpleActiveUserListPage(pageIndex,pageSize,departmentId,request,keyword,cursor,userIds);

+ 37 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ErpOrderInfo.java

@@ -0,0 +1,37 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class ErpOrderInfo extends Model<ErpOrderInfo> {
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("order_id")
+    private String orderId;
+
+    @TableField("project_id")
+    private String projectId;
+
+    @TableField("project_name")
+    private String projectName;
+
+    @TableField("line")
+    private Integer line;
+
+    @TableField("status")
+    private Integer status;
+
+    @TableField("moDId")
+    private String MoDId;
+}

+ 4 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Task.java

@@ -85,7 +85,7 @@ public class Task extends Model<Task> {
     private Integer taskLevel;
 
     /**
-     * 任务状态,0-进行中 1-已完成 2-已撤销 3-待第一审核人审核 4-待第二审核人审核 5-驳回
+     * 任务状态,0-进行中 1-已完成 2-已撤销 3-待第一审核人审核 4-待第二审核人审核 5-第一审核人驳回  6-第二审核人驳回
      */
     @TableField("task_status")
     private Integer taskStatus;
@@ -225,6 +225,9 @@ public class Task extends Model<Task> {
     @TableField("is_task_plan")
     private Integer isTaskPlan;
 
+    @TableField("task_plan")
+    private Integer taskPlan;
+
     /**
      * 任务计划第一审核人id
      */

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

@@ -54,6 +54,12 @@ public class UserFvTime extends Model<UserFvTime> {
 //    @TableField("overtime_hours")
 //    private Float overTimeHours;
 
+    @TableField("overtime_seconds")
+    private Long overTimeSeconds;
+
+    @TableField("procinst_id")
+    private String procinstId;
+
     /**
      * 是否被标记排除异常范围
      */

+ 10 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/GanttDataItem.java

@@ -1,9 +1,10 @@
 package com.management.platform.entity.vo;
 
+
 import lombok.Data;
 
 import java.util.List;
-import java.util.logging.Level;
+
 
 @Data
 public class GanttDataItem {
@@ -24,4 +25,12 @@ public class GanttDataItem {
     public Integer level;
     public List<GanttDataItem> children;
     public Integer objType;//对象类型:0是人员,1是部门,2是项目
+    private Integer taskPlanType;
+    private Integer isTaskPlan;
+    private String checkFirstId;
+    private String checkSecondId;
+    private Integer taskStatus;
+    private Integer taskId;
+    private Integer leaderOrManager;
+    private Integer taskPlan;
 }

+ 2 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/UserVO.java

@@ -16,8 +16,8 @@ public class UserVO extends User {
     private Long remainingTime;
     //是否是项目经理
     private boolean isLeader;
-    //是否是项目小组长
-    private boolean isProjectLeader;
+    // 组员0, 小组长1,审核人2
+    private int projectLeaderType;
     private Company company;
 
     //模块菜单的访问权限

+ 5 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/BusinessTripMapper.java

@@ -2,6 +2,7 @@ package com.management.platform.mapper;
 
 import com.management.platform.entity.BusinessTrip;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 import java.util.Map;
@@ -19,4 +20,8 @@ public interface BusinessTripMapper extends BaseMapper<BusinessTrip> {
     public List<BusinessTrip> summaryData(String keyword, String startDate, String endDate, Integer companyId);
 
     List<Map<String,Object>> selectBusiness(String startDate, String endDate,String deptId);
+
+    void batchInsert(@Param("resList") List<BusinessTrip> resList);
+
+    List<String> getExistIds(@Param("procinstIds") List<String> procinstIds);
 }

+ 15 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ErpOrderInfoMapper.java

@@ -0,0 +1,15 @@
+package com.management.platform.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.management.platform.entity.ErpOrderInfo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface ErpOrderInfoMapper extends BaseMapper<ErpOrderInfo> {
+    void batchInsert(@Param("resList") List<ErpOrderInfo> resList);
+
+    List<String> getExistIds(@Param("moIds") List<String> moIds);
+}

+ 4 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/LeaveSheetMapper.java

@@ -27,4 +27,8 @@ public interface LeaveSheetMapper extends BaseMapper<LeaveSheet> {
     List<Map<String,Object>> selectLeaveAll(Integer companyId, String startDate, String endDate,List<Integer> branchDepartment,List<Integer> deptIds);
 
     List<UserRestTimeVO> getCompanyUserRestTimeHours(@Param("companyId") Integer companyId,@Param("userId")String userId);
+
+    void batchInsert(@Param("resList") List<LeaveSheet> resList);
+
+    List<String> getExistIds(@Param("procinstIds") List<String> procinstIds);
 }

+ 29 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectMapper.java

@@ -72,7 +72,28 @@ public interface ProjectMapper extends BaseMapper<Project> {
                                     @Param("endDate") String endDate, @Param("companyId") Integer companyId);
 
     List<Map> getTaskPlanByProject(@Param("projectIds") List<Integer> projectIds, @Param("startDate") String startDate,
-                                @Param("endDate") String endDate, @Param("companyId") Integer companyId);
+                                @Param("endDate") String endDate, @Param("companyId") Integer companyId,@Param("groupName")String groupName,@Param("taskType")Integer taskType);
+    List<Map> getTaskPlanWithLeave(@Param("userIds") List<String> userIds, @Param("startDate") String startDate,
+                                   @Param("endDate") String endDate, @Param("companyId") Integer companyId,@Param("creatorId") String creatorId,@Param("targetUserId") String targetUserId);
+
+    List<Map> getTaskPlanByGeneralMemb(@Param("userIds") List<String> userIds, @Param("startDate") String startDate,
+                                @Param("endDate") String endDate, @Param("companyId") Integer companyId,@Param("creatorId") String creatorId,@Param("targetUserId") String targetUserId);
+
+    List<Map> getTaskPlanByProManager(@Param("userIds") List<String> userIds, @Param("startDate") String startDate,
+                                      @Param("endDate") String endDate, @Param("companyId") Integer companyId,@Param("managerId") String managerId,@Param("targetUserId") String targetUserId);
+    List<Map> getTaskPlanByAreaManager(@Param("userIds") List<String> userIds, @Param("startDate") String startDate,
+                                      @Param("endDate") String endDate, @Param("companyId") Integer companyId,@Param("managerId") String managerId,@Param("targetUserId") String targetUserId);
+
+    List<Map> getTaskPlanByProjectGeneralMemb(@Param("projectIds") List<Integer> projectIds, @Param("startDate") String startDate,
+                                   @Param("endDate") String endDate, @Param("companyId") Integer companyId,@Param("creatorId") String creatorId,
+                                              @Param("groupName")String groupName,@Param("taskType")Integer taskType,@Param("targetProjectId")Integer targetProjectId);
+
+    List<Map> getTaskPlanByProjectManager(@Param("projectIds") List<Integer> projectIds, @Param("startDate") String startDate,
+                                              @Param("endDate") String endDate, @Param("companyId") Integer companyId,@Param("managerId") String managerId,
+                                          @Param("groupName")String groupName,@Param("taskType")Integer taskType,@Param("targetProjectId")Integer targetProjectId);
+    List<Map> getTaskPlanByProjectAreaManager(@Param("projectIds") List<Integer> projectIds, @Param("startDate") String startDate,
+                                          @Param("endDate") String endDate, @Param("companyId") Integer companyId,@Param("managerId") String managerId,
+                                              @Param("groupName")String groupName,@Param("taskType")Integer taskType,@Param("targetProjectId")Integer targetProjectId);
 
     List<ProjectWithStage> selectWithStage(Integer companyId, Integer startIndex, Integer endIndex, Integer projectId,String inchargerId,String startDate,String endDate);
 
@@ -238,4 +259,11 @@ public interface ProjectMapper extends BaseMapper<Project> {
     List<Map<String, Object>> getParticipatedProjectWithMainProjectId(@Param("userId") String userId, @Param("companyId") Integer companyId,@Param("projectMainId") Integer projectMainId);
 
     int getProjectInAndOutTotal(Integer companyId, Integer projectId, List<Integer> inchagerIds,Integer projectMainId);
+
+    List<Map<String, Object>> getFTETaskPlanData(Integer companyId, String startDate, String endDate, Integer start, Integer size, String area,String userId,String sortProp, Integer sortOrder, List<Integer> branchDepartment, List<Integer> deptIds,Integer departmentId);
+
+    public List<Integer> getRelatedProjectIds(@Param("userId")String userId,@Param("companyId") Integer companyId);
+
+
+
 }

+ 4 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/UserFvTimeMapper.java

@@ -17,4 +17,8 @@ import java.util.List;
 public interface UserFvTimeMapper extends BaseMapper<UserFvTime> {
 
     void batchInsert(@Param("toAddList") List<UserFvTime> toAddList);
+
+    void batchInsertCollect(@Param("resList") List<UserFvTime> resList);
+
+    List<String> getExistIds(@Param("procinstIds") List<String> procinstIds);
 }

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

@@ -324,4 +324,10 @@ public interface ProjectService extends IService<Project> {
     HttpRespMsg exportProjectTaskPlanAndRealCost(Integer projectId, HttpServletRequest request, Integer taskType);
 
     HttpRespMsg transferProjectReviwer(String userId, String targetAuditorId);
+
+    HttpRespMsg getProjectByLeader(Integer projectId, HttpServletRequest request);
+
+    HttpRespMsg getProjectTaskPlanFTEData(Integer pageIndex, Integer pageSize, String monthStart, String monthEnd, String area, String userId, String sortProp, Integer sortOrder, Integer departmentId, HttpServletRequest request);
+
+    HttpRespMsg exportTaskPlanFTEData(String monthStart, String monthEnd, String area, String userId, Integer departmentId, HttpServletRequest request);
 }

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

@@ -64,4 +64,6 @@ public interface TaskService extends IService<Task> {
     HttpRespMsg getOtherTaskChargePage(QueryTaskChargePage queryBO, HttpServletRequest request);
 
     HttpRespMsg sendMsgToChargers(String ids, HttpServletRequest request);
+
+    HttpRespMsg taskPlanPassOrReject(Integer taskId,boolean type, HttpServletRequest request);
 }

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

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

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

@@ -1236,6 +1236,29 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         return msg;
     }
 
+    @Override
+    public HttpRespMsg getProjectByLeader(Integer projectId, HttpServletRequest request) {
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        User user = userMapper.selectById(request.getHeader("Token"));
+        Integer companyId = user.getCompanyId();
+        List<ProjectLeader> leaderList = projectLeaderService.list(new QueryWrapper<ProjectLeader>()
+                .eq("company_id", companyId).eq("leader_id", user.getId()));
+        List<Integer> projectIds=new ArrayList<>();
+        projectIds= leaderList.stream().map(ProjectLeader::getProjectId).distinct().collect(Collectors.toList());
+        projectIds.add(-1);
+
+        if (projectId!=null) {
+            boolean b = projectIds.stream().anyMatch(p -> p.equals(projectId));
+            if (!b) {
+                projectIds.add(projectId);
+            }
+        }
+        List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>()
+                .in("id", projectIds).eq("status",1));
+        httpRespMsg.setData(projectList);
+        return httpRespMsg;
+    }
+
     public HttpRespMsg getProjectEstimatedWork(Integer pageIndex, Integer pageSize, Integer projectId, HttpServletRequest request) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         //通过公司id获取该公司所有的项目列表
@@ -4741,7 +4764,9 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         //根据人员权限来获取,
         String token = request.getHeader("TOKEN");
         User user = userMapper.selectById(token);
+
         List<String> userIds = new ArrayList<>();
+        List<String> userIdsExtra = new ArrayList<>();
         List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "查看全部项目");
         List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", user.getCompanyId()));
         List<User> AllUser = userMapper.selectList(new QueryWrapper<User>().eq("company_id", user.getCompanyId()));
@@ -4782,6 +4807,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         } else {
             if (functionList.size() == 0) {
                 //普通员工只看自己相关的
+                userIds.add("-1");
                 List<Participation> participationList
                         = participationMapper.selectList(new QueryWrapper<Participation>().in("user_id", userIds));
                 projectIds = participationList.stream().map(Participation::getProjectId).collect(Collectors.toList());
@@ -4796,6 +4822,59 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 String btLastItemId = null;
                 //按人员获取
                 ganttData = projectMapper.getTaskPlanByMemb(userIds, startDate ,endDate, user.getCompanyId());
+                if (user.getCompanyId()==Constant.MLD_COMPANY_ID){
+                    List<ProjectLeader> leaderList = projectLeaderService.list(new QueryWrapper<ProjectLeader>().eq("leader_id", user.getId()).eq("company_id", user.getCompanyId()));
+                    //是小组长
+                    if (!leaderList.isEmpty()){
+                        List<Integer> projectIdList = leaderList.stream().map(ProjectLeader::getProjectId).collect(Collectors.toList());
+                        projectIdList.add(-1);
+                        List<Participation> participations = participationMapper.selectList(new QueryWrapper<Participation>().in("project_id", projectIdList));
+                        List<String> userProjectIds = participations.stream().distinct().map(Participation::getUserId).collect(Collectors.toList());
+                        userProjectIds.add("-1");
+                        userProjectIds.removeAll(userIds);
+                        userIdsExtra.addAll(userProjectIds);
+                        List<Map> taskPlanByGeneralMemb = projectMapper.getTaskPlanByGeneralMemb(userProjectIds, startDate, endDate, user.getCompanyId(), user.getId(),targetUserId);
+                        for (Map map : taskPlanByGeneralMemb) {
+                            map.put("leaderOrManager",1);
+                        }
+                        List<Map> taskPlanWithLeave = projectMapper.getTaskPlanWithLeave(null, startDate, endDate, user.getCompanyId(), user.getId(), targetUserId);
+                        for (Map map : taskPlanWithLeave) {
+                            map.put("leaderOrManager",1);
+                        }
+                        ganttData.addAll(taskPlanByGeneralMemb);
+                        ganttData.addAll(taskPlanWithLeave);
+                    }
+                    //找到自己担任项目经理的项目,: is_task_plan==1 ,checkFirstId=自己的id 并且 task_status=3
+                    List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().eq("incharger_id", user.getId()));
+                    if (!projectList.isEmpty()){
+                        List<Integer> projectIdList = projectList.stream().map(Project::getId).collect(Collectors.toList());
+                        projectIdList.add(-1);
+                        List<TaskExecutor> executorList = taskExecutorService.list(new QueryWrapper<TaskExecutor>().in("project_id", projectIdList).isNotNull("executor_id"));
+                        List<String> collectUserIdList = executorList.stream().distinct().map(TaskExecutor::getExecutorId).collect(Collectors.toList());
+                        collectUserIdList.add("-1");
+                        userIdsExtra.addAll(collectUserIdList);
+                        List<Map> getTaskPlanByProManager = projectMapper.getTaskPlanByProManager(collectUserIdList, startDate, endDate, user.getCompanyId(),user.getId(),targetUserId);
+                        for (Map map : getTaskPlanByProManager) {
+                            map.put("leaderOrManager",2);
+                        }
+                        ganttData.addAll(getTaskPlanByProManager);
+                    }
+
+                    if (user.getRoleName().equals("区域经理&PM")){
+                        List<Task> taskList = taskService.list(new QueryWrapper<Task>().eq("check_second_id", user.getId()));
+                        List<Integer> taskIdList = taskList.stream().map(Task::getId).collect(Collectors.toList());
+                        taskIdList.add(-1);
+                        List<TaskExecutor> executorList = taskExecutorService.list(new QueryWrapper<TaskExecutor>().in("task_id", taskIdList).isNotNull("executor_id"));
+                        List<String> collectUserIdList = executorList.stream().distinct().map(TaskExecutor::getExecutorId).collect(Collectors.toList());
+                        collectUserIdList.add("-1");
+                        userIdsExtra.addAll(collectUserIdList);
+                        List<Map> getTaskPlanByProManager = projectMapper.getTaskPlanByAreaManager(collectUserIdList, startDate, endDate, user.getCompanyId(),user.getId(),targetUserId);
+                        for (Map map : getTaskPlanByProManager) {
+                            map.put("leaderOrManager",2);
+                        }
+                        ganttData.addAll(getTaskPlanByProManager);
+                    }
+                }
                 QueryWrapper<LeaveSheet> lsQueryWrapper=new QueryWrapper();
                 lsQueryWrapper.in("owner_id", userIds);
                 if (startDate != null && endDate != null) {
@@ -4839,6 +4918,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         extraUidList.add(uid);
                     }
                 }
+                extraUidList.addAll(userIdsExtra);
                 if (extraUidList.size() > 0) {
                     List<User> userList = userMapper.selectList(new QueryWrapper<User>().in("id", extraUidList).eq("is_active", 1));
                     for (User u : userList) {
@@ -4867,7 +4947,6 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         if(first.isPresent()){
                             departmentId=first.get().getDepartmentId();
                         }
-                        System.out.println("====================="+departmentId+"======================");
                         GanttDataItem parent = new GanttDataItem();
                         parent.id = leaveSheetList.get(i).getOwnerId();
                         parent.userId = leaveSheetList.get(i).getOwnerId();
@@ -4954,6 +5033,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     itemList.add(curItem);
                     btLastItemId = businessTripList.get(i).getOwnerId();
                 }
+
             }
             else {
                 //按照项目获取
@@ -4983,7 +5063,40 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         }
                     }
                 }
-                ganttData = projectMapper.getTaskPlanByProject(projectIds, startDate ,endDate, user.getCompanyId());
+                ganttData = projectMapper.getTaskPlanByProject(projectIds, startDate ,endDate, user.getCompanyId(),groupName,taskType);
+                System.out.println("ganttData1:"+ganttData.size());
+                if (user.getCompanyId()==Constant.MLD_COMPANY_ID){
+                    List<ProjectLeader> leaderList = projectLeaderService.list(new QueryWrapper<ProjectLeader>().eq("leader_id", user.getId()).eq("company_id", user.getCompanyId()));
+                    //是小组长
+                    if (!leaderList.isEmpty()){
+                        List<Integer> projectIdList = leaderList.stream().map(ProjectLeader::getProjectId).collect(Collectors.toList());
+                        projectIdList.add(-1);
+                        List<Map> taskPlanByGeneralMemb = projectMapper.getTaskPlanByProjectGeneralMemb(projectIdList,startDate ,endDate, user.getCompanyId(),user.getId(),groupName,taskType,targetProjectId);
+                        System.out.println("ganttData2:"+taskPlanByGeneralMemb.size());
+                        ganttData.addAll(taskPlanByGeneralMemb);
+                    }
+                    //找到自己担任项目经理的项目,: is_task_plan==1 ,checkFirstId=自己的id 并且 task_status=3
+                    List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().eq("incharger_id", user.getId()));
+                    if (!projectList.isEmpty()){
+                        List<Integer> projectIdList = projectList.stream().map(Project::getId).collect(Collectors.toList());
+                        projectIdList.add(-1);
+                        List<Map> taskPlanByProjectManager = projectMapper.getTaskPlanByProjectManager(projectIdList,startDate ,endDate, user.getCompanyId(),user.getId(),groupName,taskType,targetProjectId);
+                        System.out.println("ganttData2:"+taskPlanByProjectManager.size());
+                        ganttData.addAll(taskPlanByProjectManager);
+                    }
+
+                    if (user.getRoleName().equals("区域经理&PM")){
+                        List<Task> taskList = taskService.list(new QueryWrapper<Task>().eq("check_second_id", user.getId()));
+                        List<Integer> taskIdList = taskList.stream().map(Task::getId).collect(Collectors.toList());
+                        taskIdList.add(-1);
+                        List<TaskExecutor> executorList = taskExecutorService.list(new QueryWrapper<TaskExecutor>().in("task_id", taskIdList).isNotNull("executor_id"));
+                        List<Integer> projectIdList = executorList.stream().distinct().map(TaskExecutor::getProjectId).collect(Collectors.toList());
+                        projectIdList.add(-1);
+                        List<Map> taskPlanByProjectAreaManager = projectMapper.getTaskPlanByProjectAreaManager(projectIdList, startDate, endDate, user.getCompanyId(),user.getId(),groupName,taskType,targetProjectId);
+                        System.out.println("ganttData2:"+taskPlanByProjectAreaManager.size());
+                        ganttData.addAll(taskPlanByProjectAreaManager);
+                    }
+                }
                 QueryWrapper<BusinessTrip> btQueryWrapper =new QueryWrapper<>();
                 QueryWrapper<BustripProject> bpQueryWrapper =new QueryWrapper<>();
                 btQueryWrapper.in("owner_id", userIds);
@@ -5039,7 +5152,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 }
             }
 
-            ganttData.forEach(System.out::println);
+//            ganttData.forEach(System.out::println);
             String lastItemId = null;
             GanttDataItem lastParentItem = null;
             SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
@@ -5056,7 +5169,6 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 String start_date = sdf.format((Date) map.get("start_date"));
                 String end_date = sdf.format((Date) map.get("end_date"));
                 String projectId = ""+ (Integer) map.get("id");
-                System.out.println(map);
                 //String exeId = "任务_"+map.get("task_id") +"_"+ (type==0?(Integer) map.get("exe_id"):userId);
                 String exeId = MessageUtils.message("excel.task") + "_"+map.get("task_id") +"_"+ (type==0?(Integer) map.get("exe_id"):userId);
                 String taskId = ""+ (Integer) map.get("task_id");
@@ -5082,16 +5194,29 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
 
                     curItem.id = exeId;
                     curItem.userId = (String) map.get("user_id");
-                    curItem.text = (String) map.get("project_name")+"/"+(String)map.get("task_name");
+                    if (map.get("taskPlanType")!=null&&(Integer)map.get("taskPlanType")==3){
+                        curItem.text ="请假";
+                    }else {
+                        curItem.text = (String) map.get("project_name")+"/"+(String)map.get("task_name");
+                        curItem.setCheckFirstId(map.get("checkFirstId")==null?null:(String) map.get("checkFirstId"));
+                        curItem.setCheckSecondId(map.get("checkSecondId")==null?null:(String) map.get("checkSecondId"));
+                    }
                     curItem.start_date = start_date;
 
+                    curItem.setTaskPlanType(map.get("taskPlanType")==null?null:(Integer)map.get("taskPlanType"));
+                    curItem.setIsTaskPlan(map.get("isTaskPlan")==null?null:(Integer)map.get("isTaskPlan"));
+                    curItem.setTaskStatus(map.get("taskStatus")==null?null:(Integer)map.get("taskStatus"));
+                    curItem.setTaskId(map.get("taskId")==null?null:(Integer)map.get("taskId"));
+                    curItem.setLeaderOrManager(map.get("leaderOrManager")==null?null:(Integer)map.get("leaderOrManager"));
+                    curItem.setTaskPlan(map.get("taskPlan")==null?null:(Integer)map.get("taskPlan"));
                     curItem.end_date = end_date;
                     curItem.time = (Integer)map.get("duration");
                     curItem.parent = lastItemId;
                     curItem.setObjType(2);
                     itemList.add(curItem);
                     lastItemId = userId;
-                } else {
+                }
+                else {
                     if (!projectId.equals(lastItemId)) {
                         //抽取父级对象,项目名称
                         GanttDataItem parent = new GanttDataItem();
@@ -5110,6 +5235,14 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     curItem.id = projectId+"_"+exeId;
                     curItem.userId = (String) map.get("user_id");
                     curItem.text = (String) map.get("name")+"/"+(String)map.get("task_name");
+                    curItem.setTaskPlanType(map.get("taskPlanType")==null?null:(Integer)map.get("taskPlanType"));
+                    curItem.setIsTaskPlan(map.get("isTaskPlan")==null?null:(Integer)map.get("isTaskPlan"));
+                    curItem.setCheckFirstId(map.get("checkFirstId")==null?null:(String) map.get("checkFirstId"));
+                    curItem.setCheckSecondId(map.get("checkSecondId")==null?null:(String) map.get("checkSecondId"));
+                    curItem.setTaskStatus(map.get("taskStatus")==null?null:(Integer)map.get("taskStatus"));
+                    curItem.setTaskId(map.get("taskId")==null?null:(Integer)map.get("taskId"));
+                    curItem.setLeaderOrManager(map.get("leaderOrManager")==null?null:(Integer)map.get("leaderOrManager"));
+                    curItem.setTaskPlan(map.get("taskPlan")==null?null:(Integer)map.get("taskPlan"));
                     curItem.start_date = start_date;
                     curItem.end_date = end_date;
                     curItem.time = (Integer)map.get("duration");
@@ -5130,7 +5263,6 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         }
 
         msg.data = itemList;
-
         return msg;
     }
 
@@ -8623,12 +8755,17 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             List<Project> projectList = projectMapper.selectList(
                     new QueryWrapper<Project>().eq("incharger_id", user.getId()).eq("status", 1));
             List<String> userIds = new ArrayList<>();
-            userIds.add("0");
-            if (projectList.size() > 0) {
-                List<Integer> proIds = projectList.stream().map(Project::getId).collect(Collectors.toList());
-                List<Participation> pList = participationMapper.selectList(new QueryWrapper<Participation>().in("project_id", proIds));
-                userIds = pList.stream().map(Participation::getUserId).collect(Collectors.toList());
+
+            List<Integer> proIds = projectList.stream().map(Project::getId).collect(Collectors.toList());
+            if (Constant.MLD_COMPANY_ID==user.getCompanyId()){
+                List<Integer> projectSelect =projectMapper.getRelatedProjectIds(user.getId(), user.getCompanyId());
+                proIds.addAll(projectSelect);
             }
+
+            proIds.add(-1);
+            List<Participation> pList = participationMapper.selectList(new QueryWrapper<Participation>().in("project_id", proIds));
+            userIds = pList.stream().map(Participation::getUserId).collect(Collectors.toList());
+
             QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
             if (deptIds.size() > 0) {
                 queryWrapper.in("department_id", deptIds).or().in("id", userIds);
@@ -12789,7 +12926,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         }
                     }
                 }
-                ganttData = projectMapper.getTaskPlanByProject(projectIds, startDate ,endDate, user.getCompanyId());
+                ganttData = projectMapper.getTaskPlanByProject(projectIds, startDate ,endDate, user.getCompanyId(),null,null);
                 QueryWrapper<BusinessTrip> btQueryWrapper =new QueryWrapper<>();
                 QueryWrapper<BustripProject> bpQueryWrapper =new QueryWrapper<>();
                 btQueryWrapper.in("owner_id", userIds);
@@ -13483,6 +13620,166 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         return httpRespMsg;
     }
 
+    @Override
+    public HttpRespMsg getProjectTaskPlanFTEData(Integer pageIndex, Integer pageSize, String monthStart, String monthEnd, String area, String userId, String sortProp, Integer sortOrder, Integer departmentId, HttpServletRequest request) {
+        HttpRespMsg httpRespMsg =new HttpRespMsg();
+        User targetUser = userMapper.selectById(request.getHeader("token"));
+        List<SysRichFunction> functionAllList = sysFunctionMapper.getRoleFunctions(targetUser.getRoleId(), "全部部门FTE计划报表");
+        List<SysRichFunction> functionDeptList = sysFunctionMapper.getRoleFunctions(targetUser.getRoleId(), "负责部门FTE计划报表");
+        List<Integer> deptIds=null;
+        List<Department> allDepartmentList=departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id",targetUser.getCompanyId()));
+        List<Department> userDepartmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("manager_id", targetUser.getId()).eq("company_id",targetUser.getCompanyId()));
+        List<DepartmentOtherManager> departmentOtherManagerList = departmentOtherManagerMapper.selectList(new QueryWrapper<DepartmentOtherManager>().eq("other_manager_id", targetUser.getId()));
+        //判断查看权限
+        if(functionAllList.size()==0){
+            deptIds=new ArrayList<>();
+            deptIds.add(-1);
+            if(functionDeptList.size()>0){
+                List<Integer> collect = userDepartmentList.stream().map(dm -> dm.getDepartmentId()).distinct().collect(Collectors.toList());
+                List<Integer> otherCollect = departmentOtherManagerList.stream().map(dom -> dom.getDepartmentId()).distinct().collect(Collectors.toList());
+                collect.addAll(otherCollect);
+                //将该用户管理的所有部门以及部门的子部门id添加到deptIds集合中
+                for (Integer integer : collect) {
+                    List<Integer> branchDepartment = getBranchDepartment(integer, allDepartmentList);
+                    deptIds.addAll(branchDepartment);
+                }
+            }
+        }
+        if(departmentId!=null){
+            deptIds=new ArrayList<>();
+            List<Integer> branchDepartment = getBranchDepartment(departmentId, allDepartmentList);
+            deptIds.addAll(branchDepartment);
+        }
+        long total  = 0;
+        List<Map<String,Object>> resultList = null;
+        String startDate = null;
+        String endDate = null;
+        LocalDate timeStart = LocalDate.parse(monthStart, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+        LocalDate timeEnd = LocalDate.parse(monthEnd, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+        startDate = timeStart.with(TemporalAdjusters.firstDayOfMonth()).toString();
+        endDate = timeEnd.with(TemporalAdjusters.lastDayOfMonth()).toString();
+        int days = WorkDayCalculateUtils.getWorkDaysListInRange(startDate, endDate, 0).size();
+        TimeType allDay = timeTypeMapper.selectOne(new QueryWrapper<TimeType>().eq("company_id", targetUser.getCompanyId()));
+        Float monthTime = days * allDay.getAllday();
+        if(pageIndex!=null&&pageSize!=null){
+            Integer size=pageSize;
+            Integer start=(pageIndex-1)*size;
+            resultList=projectMapper.getFTETaskPlanData(targetUser.getCompanyId(),startDate,endDate,start,size,area,userId,sortProp,sortOrder,null,deptIds,departmentId);
+            total=projectMapper.getFTETaskPlanData(targetUser.getCompanyId(),startDate,endDate,null,null,area,userId,sortProp,sortOrder,null,deptIds,departmentId).size();
+        }else{
+            resultList=projectMapper.getFTETaskPlanData(targetUser.getCompanyId(),startDate,endDate,null,null,area,userId,sortProp,sortOrder,null,deptIds,departmentId);
+        }
+
+
+        //计算日期区间一共几个月
+        Period period = Period.between(timeStart, timeEnd);
+        for (Map<String, Object> map : resultList) {
+            Float planHours = Float.parseFloat( map.get("planHours").toString());
+            map.put("FTE",Float.parseFloat(planHours == null?"0":planHours.toString())/monthTime);
+
+        }
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", targetUser.getCompanyId()));
+        if (wxCorpInfo != null && wxCorpInfo.getSaasSyncContact().equals(1)){
+            for (Map<String, Object> map : resultList) {
+                map.put("userName",map.get("wxUserId"));
+                map.put("corpwx_userid","$userName=" + map.get("wxUserId") + "$");
+            }
+        }
+        HashMap<String, Object> map = new HashMap<>();
+        map.put("resultList",resultList);
+        map.put("total",total);
+        map.put("monthTime",monthTime);
+        httpRespMsg.data = map;
+        return httpRespMsg;
+    }
+
+    @Override
+    public HttpRespMsg exportTaskPlanFTEData(String monthStart, String monthEnd, String area,String userId, Integer departmentId, HttpServletRequest request) {
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        User user = userMapper.selectById(request.getHeader("token"));
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+        CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", user.getCompanyId()));
+        List<UserCustom> userCustoms = userCustomMapper.selectList(new QueryWrapper<UserCustom>().eq("company_id", user.getCompanyId()).orderByAsc("id"));
+        List<SysRichFunction> functionAllList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "全部部门FTE计划报表");
+        List<SysRichFunction> functionDeptList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "负责部门FTE计划报表");
+        List<Integer> deptIds=null;
+        List<Department> allDepartmentList=departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id",user.getCompanyId()));
+        List<Department> userDepartmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("manager_id", user.getId()).eq("company_id",user.getCompanyId()));
+        List<DepartmentOtherManager> departmentOtherManagerList = departmentOtherManagerMapper.selectList(new QueryWrapper<DepartmentOtherManager>().eq("other_manager_id", user.getId()));
+        //判断查看权限
+        if(functionAllList.size()==0){
+            deptIds=new ArrayList<>();
+            deptIds.add(-1);
+            if(functionDeptList.size()>0){
+                List<Integer> collect = userDepartmentList.stream().map(dm -> dm.getDepartmentId()).distinct().collect(Collectors.toList());
+                List<Integer> otherCollect = departmentOtherManagerList.stream().map(dom -> dom.getDepartmentId()).distinct().collect(Collectors.toList());
+                collect.addAll(otherCollect);
+                //将该用户管理的所有部门以及部门的子部门id添加到deptIds集合中
+                for (Integer integer : collect) {
+                    List<Integer> branchDepartment = getBranchDepartment(integer, allDepartmentList);
+                    deptIds.addAll(branchDepartment);
+                }
+            }
+        }
+        if(departmentId!=null){
+            deptIds=new ArrayList<>();
+            List<Integer> branchDepartment = getBranchDepartment(departmentId, allDepartmentList);
+            deptIds.addAll(branchDepartment);
+        }
+        String startDate = null;
+        String endDate = null;
+        LocalDate timeStart = LocalDate.parse(monthStart, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+        LocalDate timeEnd = LocalDate.parse(monthEnd, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+        startDate = timeStart.with(TemporalAdjusters.firstDayOfMonth()).toString();
+        endDate = timeEnd.with(TemporalAdjusters.lastDayOfMonth()).toString();
+        int days = WorkDayCalculateUtils.getWorkDaysListInRange(startDate, endDate, 0).size();
+        TimeType allDay = timeTypeMapper.selectOne(new QueryWrapper<TimeType>().eq("company_id", user.getCompanyId()));
+        Float monthTime = days * allDay.getAllday();
+        List<Map<String, Object>> list = projectMapper.getFTETaskPlanData(user.getCompanyId(), startDate, endDate, null, null, area, userId, null, null, null, deptIds, departmentId);
+        List<List<String>> dataList=new ArrayList<>();
+        List<String> titleList=new ArrayList<>();
+        List<String> subtitle=new ArrayList<>();
+
+        titleList.add("序号");
+        titleList.add("岗位");
+        titleList.add("项目编号");
+        titleList.add("项目名称");
+        titleList.add("姓名");
+        titleList.add("计划工时(H)");
+        titleList.add("FTE(计划工时/当月计划工时基数)");
+        dataList.add(titleList);
+
+        for (int i = 0; i < list.size(); i++) {
+            List<String> item=new ArrayList<>();
+            item.add((i+1)+"");
+            item.add(list.get(i).get("area")==null?"":list.get(i).get("area").toString());
+            item.add(list.get(i).get("projectCode")==null?"":list.get(i).get("projectCode").toString());
+            item.add(list.get(i).get("projectName")==null?"":list.get(i).get("projectName").toString());
+            item.add(list.get(i).get("userName")==null?"":list.get(i).get("userName").toString());
+            item.add(list.get(i).get("planHours")==null?"": String.valueOf(new BigDecimal(list.get(i).get("planHours").toString()).setScale(2,BigDecimal.ROUND_HALF_UP)));
+            item.add(
+                    list.get(i).get("planHours") == null ? "" :
+                            new BigDecimal(list.get(i).get("planHours").toString())
+                                    .divide(
+                                            BigDecimal.valueOf(monthTime),
+                                            2,                  // 保留2位小数
+                                            RoundingMode.HALF_UP // 四舍五入
+                                    )
+                                    .toString()
+            );
+            dataList.add(item);
+        }
+
+        String fileName = "FTE计划报表"+System.currentTimeMillis();
+        try {
+            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding,fileName, dataList, path);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        httpRespMsg.data =  pathPrefix + fileName+".xlsx";
+        return httpRespMsg;
+    }
+
     //导出FTE报表数据
     @Override
     public HttpRespMsg exportFTEData(String monthStart,String monthEnd, String area,Integer departmentId,HttpServletRequest request) {

+ 102 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/TaskServiceImpl.java

@@ -16,7 +16,9 @@ import com.management.platform.service.*;
 import com.management.platform.util.ExcelUtil;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.MessageUtils;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.hssf.usermodel.*;
 import org.apache.poi.ss.usermodel.CellType;
 import org.apache.poi.xssf.usermodel.XSSFCell;
@@ -49,6 +51,7 @@ import java.util.stream.Collectors;
  */
 @Service
 @Transactional
+@Slf4j
 public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements TaskService {
 
     @Value(value = "${upload.path}")
@@ -1050,6 +1053,105 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
         return msg;
     }
 
+    @Override
+    public HttpRespMsg taskPlanPassOrReject(Integer taskId,boolean type, HttpServletRequest request) {
+        HttpRespMsg msg = new HttpRespMsg();
+        String userId = request.getHeader("Token");
+        User user = userMapper.selectById(userId);
+        WxCorpInfo wxCorpInfo = wxCorpInfoService.getOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+
+        Task task = taskMapper.selectById(taskId);
+        if (!userId.equals(task.getCheckFirstId())&&!userId.equals(task.getCheckSecondId())){
+            msg.setError("当前人员不是审核人,不能审核");
+            return msg;
+        }
+        //通过
+        if (type){
+            //第一审核人通过
+            if (task.getIsTaskPlan()==1&&task.getTaskStatus()==3
+                    && StringUtils.isNotEmpty(task.getCheckFirstId())
+                    &&userId.equals(task.getCheckFirstId())){
+                task.setTaskStatus(4);
+                taskMapper.updateById(task);
+                //给第二审核人发送信息提醒
+                User owner = userMapper.selectById(task.getCheckSecondId());
+                if (wxCorpInfo != null) {
+                    //推送到企业微信
+                    StringBuilder stringBuilder = new StringBuilder();
+                    stringBuilder.append("$userName="+owner.getCorpwxUserid()+"$")
+                            .append(":有新的工作计划待审核");
+                    wxCorpInfoService.sendWXCorpMsg(wxCorpInfo,owner.getCorpwxUserid(), stringBuilder.toString(), "task",
+                            WxCorpInfoServiceImpl.TEXT_CARD_MSG_TASK_PLAN_NEED_CHECK);
+                }
+            }
+            //第二审核人通过
+            else if (task.getIsTaskPlan() == 1 && task.getTaskStatus() == 4
+                    && StringUtils.isNotEmpty(task.getCheckSecondId())
+                    && userId.equals(task.getCheckSecondId())) {
+
+                task.setTaskStatus(0);
+                task.setIsTaskPlan(0);
+                taskMapper.updateById(task);
+
+                List<TaskExecutor> taskExecutorList = taskExecutorMapper.selectList(new QueryWrapper<TaskExecutor>().eq("task_id", taskId));
+                if(CollectionUtils.isNotEmpty(taskExecutorList)){
+                    for (TaskExecutor taskExecutor : taskExecutorList) {
+                        //给任务的执行人发送信息提醒
+                        User owner = userMapper.selectById(taskExecutor.getExecutorId());
+                        if (wxCorpInfo != null) {
+                            //推送到企业微信
+                            StringBuilder stringBuilder = new StringBuilder();
+                            stringBuilder.append("$userName="+owner.getCorpwxUserid()+"$")
+                                    .append(":有新的任务,请及时查看");
+                            wxCorpInfoService.sendWXCorpMsg(wxCorpInfo,owner.getCorpwxUserid(), stringBuilder.toString(), "task",
+                                    WxCorpInfoServiceImpl.TEXT_CARD_MSG_TASK_PLAN_NEED_CHECK);
+                        }
+                    }
+                }
+            }
+        }
+        //驳回
+        else {
+            //第一审核人驳回
+            if (task.getIsTaskPlan()==1&&task.getTaskStatus()==3
+                    && StringUtils.isNotEmpty(task.getCheckFirstId())
+                    &&userId.equals(task.getCheckFirstId())){
+                task.setTaskStatus(5);
+                taskMapper.updateById(task);
+                //给小组长发送信息提醒
+                User owner = userMapper.selectById(task.getCreaterId());
+                if (wxCorpInfo != null) {
+                    //推送到企业微信
+                    StringBuilder stringBuilder = new StringBuilder();
+                    stringBuilder.append("$userName="+owner.getCorpwxUserid()+"$")
+                            .append(":有工作计划被驳回,请查看");
+                    wxCorpInfoService.sendWXCorpMsg(wxCorpInfo,owner.getCorpwxUserid(), stringBuilder.toString(), "task",
+                            WxCorpInfoServiceImpl.TEXT_CARD_MSG_TASK_PLAN_NEED_CHECK);
+                }
+            }
+            //第二审核人驳回
+            else if (task.getIsTaskPlan() == 1 && task.getTaskStatus() == 4
+                    && StringUtils.isNotEmpty(task.getCheckSecondId())
+                    && userId.equals(task.getCheckSecondId())) {
+
+                task.setTaskStatus(6);
+                taskMapper.updateById(task);
+
+                //给小组长发送信息提醒
+                User owner = userMapper.selectById(task.getCreaterId());
+                if (wxCorpInfo != null) {
+                    //推送到企业微信
+                    StringBuilder stringBuilder = new StringBuilder();
+                    stringBuilder.append("$userName="+owner.getCorpwxUserid()+"$")
+                            .append(":有工作计划被驳回,请查看");
+                    wxCorpInfoService.sendWXCorpMsg(wxCorpInfo,owner.getCorpwxUserid(), stringBuilder.toString(), "task",
+                            WxCorpInfoServiceImpl.TEXT_CARD_MSG_TASK_PLAN_NEED_CHECK);
+                }
+            }
+        }
+        return msg;
+    }
+
     private List<Integer> getBranchDepartment(Integer departmentId, List<Department> departmentList) {
         List<Integer> list = new ArrayList<>();
         list.add(departmentId);

+ 44 - 5
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java

@@ -297,8 +297,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                 userVO.setLeader(judgeIsLeader(userVO.getId()));
 
                 if(company.getId()==Constant.MLD_COMPANY_ID) {
-                    //检测是否是项目小组长,有没有权限进行添加计划
-                    userVO.setProjectLeader(judgeIsProjectLeader(userVO.getId(),company.getId()));
+                    //检测项目角色
+                    userVO.setProjectLeaderType(judgeIsProjectLeader(userVO.getId(),company.getId()));
                 }
 
                 userVO.setTimeType(timeTypeMapper.selectById(company.getId()));
@@ -763,9 +763,25 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
         return cnt>0;
     }
 
-    private boolean judgeIsProjectLeader(String userId,Integer companyId) {
-        int cnt = projectLeaderService.count(new QueryWrapper<ProjectLeader>().eq("leader_id", userId).eq("company_id", companyId));
-        return cnt>0;
+    private int judgeIsProjectLeader(String userId,Integer companyId) {
+        int LeaderCount = projectLeaderService.count(new QueryWrapper<ProjectLeader>().eq("leader_id", userId).eq("company_id", companyId));
+        int firstCheckCount = taskMapper.selectCount(
+                new QueryWrapper<Task>()
+                        .eq("company_id", companyId)
+                        .and(wrapper ->
+                                wrapper.eq("check_first_id", userId)
+                                        .or()
+                                        .eq("check_second_id", userId)
+                        )
+        );
+        if(LeaderCount > 0){
+            return 1;
+        } else if (firstCheckCount > 0) {
+            return 2;
+        }else {
+            return 0;
+        }
+
     }
 
     //获取用户信息
@@ -2825,7 +2841,30 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
         }
     }
 
+    @Override
+    public HttpRespMsg getUserByProject(Integer projectId, HttpServletRequest request) {
+        HttpRespMsg msg = new HttpRespMsg();
+        List<Map<String, Object>> mapList = participationMapper.getParticipator(projectId);
+        msg.setData(mapList);
+        return msg;
+    }
 
+    @Override
+    public HttpRespMsg getChargeUserByProjectId(Integer projectId, HttpServletRequest request) {
+        HttpRespMsg msg = new HttpRespMsg();
+
+        Project project = projectMapper.selectById(projectId);
+        if (project!=null&&project.getInchargerId()!=null){
+            User user = userMapper.selectById(project.getInchargerId());
+            HashMap<String, Object> map = new HashMap<>();
+            map.put("id",user.getId());
+            map.put("name",user.getName());
+            msg.setData(map);
+        }else {
+            msg.setData(new HashMap<>());
+        }
+        return msg;
+    }
 
 
     @Override

+ 5 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java

@@ -120,6 +120,8 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
 
     public static final int TEXT_CARD_MSG_TASK_FILE_CHECK = 28;//任务文件驳回
 
+    public static final int TEXT_CARD_MSG_TASK_PLAN_NEED_CHECK = 29;//工作计划待审核
+
     private static Object userLock = new Object();
 
     @Value("${suitId}")
@@ -403,6 +405,9 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                 else if ("task".equals(pageRouter)) {
                     //费用报销
                     title = "工时管家:任务到期通知";
+                    if (msgType.equals(TEXT_CARD_MSG_TASK_PLAN_NEED_CHECK)) {
+                        title = "工作计划待审核";
+                    }
                 }
                 else if (pageRouter.contains("projectInside")) {
                     //预估工时审核

+ 327 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/DataCollectTask.java

@@ -0,0 +1,327 @@
+package com.management.platform.task;
+
+import com.management.platform.entity.BusinessTrip;
+import com.management.platform.entity.ErpOrderInfo;
+import com.management.platform.entity.LeaveSheet;
+import com.management.platform.entity.UserFvTime;
+import com.management.platform.mapper.BusinessTripMapper;
+import com.management.platform.mapper.ErpOrderInfoMapper;
+import com.management.platform.mapper.LeaveSheetMapper;
+import com.management.platform.mapper.UserFvTimeMapper;
+import org.springframework.core.ParameterizedTypeReference;
+import org.springframework.http.*;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.client.RestTemplate;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@EnableScheduling
+@Component
+public class DataCollectTask {
+
+    @Resource
+    private UserFvTimeMapper userFvTimeMapper;
+    @Resource
+    private BusinessTripMapper businessTripMapper;
+    @Resource
+    private LeaveSheetMapper leaveSheetMapper;
+
+    @Resource
+    private ErpOrderInfoMapper erpOrderInfoMapper;
+
+    private static final String PREFIX_URL = "http://58.210.104.138:10020";
+
+
+
+    @Scheduled(cron = "0 0 1 * * ?")
+    public void sqlServerTask() {
+        System.out.println("开始测试任务定时=======================");
+        RestTemplate restTemplate = new RestTemplate();
+        String sumUrl = PREFIX_URL+"/dataCollect/getSqlServerDataSum";
+        String listUrl = PREFIX_URL+"/dataCollect/getSqlServerDataList";
+
+        try {
+            ResponseEntity<String> sumResponse = restTemplate.exchange(
+                    sumUrl,
+                    HttpMethod.GET,
+                    null,
+                    String.class
+            );
+            Integer totalNum = 0;
+            if (sumResponse.getStatusCode() == HttpStatus.OK) {
+                totalNum = Integer.parseInt(sumResponse.getBody());
+            } else {
+                System.out.println("请求失败,状态码: " + sumResponse.getStatusCode());
+            }
+            System.out.println("总数量为==== "+totalNum);
+            if(totalNum > 0){
+                int pageSize = 1000;
+                int offset = 0;
+                List<ErpOrderInfo> toAddList = new ArrayList<>();
+                List<ErpOrderInfo> toUpdateList = new ArrayList<>();
+                while (offset < totalNum) {
+                    HttpHeaders headers = new HttpHeaders();
+                    headers.setContentType(MediaType.APPLICATION_JSON);
+                    Map<String, Object> requestBody = new HashMap<>();
+                    requestBody.put("pageNo", offset);
+                    requestBody.put("pageSize", pageSize);
+                    HttpEntity<Object> requestEntity = new HttpEntity<>(requestBody, headers);
+                    ResponseEntity<List<ErpOrderInfo>> listResponse = restTemplate.exchange(
+                            listUrl,
+                            HttpMethod.POST,
+                            requestEntity,
+                            new  ParameterizedTypeReference<List<ErpOrderInfo>>(){}
+                    );
+                    if (listResponse.getStatusCode() == HttpStatus.OK) {
+                        List<ErpOrderInfo> dataList = listResponse.getBody();
+                        if(org.apache.commons.collections.CollectionUtils.isNotEmpty(dataList)){
+                            List<String> collect = dataList.stream().map(ErpOrderInfo::getMoDId).distinct().collect(Collectors.toList());
+                            List<String> existIds = erpOrderInfoMapper.getExistIds(collect);
+                            if(!CollectionUtils.isEmpty(existIds)){
+                                toUpdateList.addAll(dataList.stream().filter(t -> existIds.contains(t.getMoDId())).collect(Collectors.toList()));
+                                toAddList.addAll(dataList.stream().filter(t -> !existIds.contains(t.getMoDId())).collect(Collectors.toList()));
+                            }else{
+                                toAddList.addAll(dataList);
+                            }
+                            if(!CollectionUtils.isEmpty(toAddList)){
+                                erpOrderInfoMapper.batchInsert(toAddList);
+                            }
+                            if(!CollectionUtils.isEmpty(toUpdateList)){
+                                for (ErpOrderInfo orderInfo : toUpdateList) {
+                                    erpOrderInfoMapper.updateById(orderInfo);
+                                }
+                            }
+                            toUpdateList.clear();
+                            toAddList.clear();
+                        }
+                    }
+                    offset += pageSize;
+                }
+            }
+        } catch (Exception e) {
+            System.out.println("请求发生异常: " + e.getMessage());
+            e.printStackTrace();
+        }
+
+    }
+
+    @Scheduled(cron = "0 21 11 * * ?")
+    public void workDayTask(){
+        RestTemplate restTemplate = new RestTemplate();
+        String sumUrl = PREFIX_URL+"/dataCollect/getWorkDayDataSum";
+        String listUrl = PREFIX_URL+"/dataCollect/getWorkDayDataList";
+
+        try {
+            ResponseEntity<String> sumResponse = restTemplate.exchange(
+                    sumUrl,
+                    HttpMethod.GET,
+                    null,
+                    String.class
+            );
+            Integer totalNum = 0;
+            if (sumResponse.getStatusCode() == HttpStatus.OK) {
+                totalNum = Integer.parseInt(sumResponse.getBody());
+            } else {
+                System.out.println("请求失败,状态码: " + sumResponse.getStatusCode());
+            }
+            if(totalNum > 0){
+                int pageSize = 1000;
+                int offset = 0;
+                List<UserFvTime> toAddList = new ArrayList<>();
+                List<UserFvTime> toUpdateList = new ArrayList<>();
+                while (offset < totalNum) {
+                    HttpHeaders headers = new HttpHeaders();
+                    headers.setContentType(MediaType.APPLICATION_JSON);
+                    Map<String, Object> requestBody = new HashMap<>();
+                    requestBody.put("pageNo", offset);
+                    requestBody.put("pageSize", pageSize);
+                    HttpEntity<Object> requestEntity = new HttpEntity<>(requestBody, headers);
+                    ResponseEntity<List<UserFvTime>> listResponse = restTemplate.exchange(
+                            listUrl,
+                            HttpMethod.POST,
+                            requestEntity,
+                            new  ParameterizedTypeReference<List<UserFvTime>>(){}
+                    );
+                    if (listResponse.getStatusCode() == HttpStatus.OK) {
+                        List<UserFvTime> dataList = listResponse.getBody();
+                        if(org.apache.commons.collections.CollectionUtils.isNotEmpty(dataList)){
+                            List<String> collect = dataList.stream().map(UserFvTime::getProcinstId).distinct().collect(Collectors.toList());
+                            List<String> existIds = userFvTimeMapper.getExistIds(collect);
+                            if(!CollectionUtils.isEmpty(existIds)){
+                                toUpdateList.addAll(dataList.stream().filter(t -> existIds.contains(t.getProcinstId())).collect(Collectors.toList()));
+                                toAddList.addAll(dataList.stream().filter(t -> !existIds.contains(t.getProcinstId())).collect(Collectors.toList()));
+                            }else{
+                                toAddList.addAll(dataList);
+                            }
+                            if(!CollectionUtils.isEmpty(toAddList)){
+                                userFvTimeMapper.batchInsertCollect(toAddList);
+                            }
+                            if(!CollectionUtils.isEmpty(toUpdateList)){
+                                for (UserFvTime tmp : toUpdateList) {
+                                    userFvTimeMapper.updateById(tmp);
+                                }
+                            }
+                            toUpdateList.clear();
+                            toAddList.clear();
+                        }
+
+                    }
+                    offset += pageSize;
+                }
+            }
+        } catch (Exception e) {
+            System.out.println("请求发生异常: " + e.getMessage());
+            e.printStackTrace();
+        }
+
+    }
+
+    @Scheduled(cron = "0 0 2 * * ?")
+    public void leaveSheetTask(){
+        RestTemplate restTemplate = new RestTemplate();
+        String sumUrl = PREFIX_URL + "/dataCollect/getLeaveSheetDataSum";
+        String listUrl = PREFIX_URL + "/dataCollect/getLeaveSheetDataList";
+
+        try {
+            ResponseEntity<String> sumResponse = restTemplate.exchange(
+                    sumUrl,
+                    HttpMethod.GET,
+                    null,
+                    String.class
+            );
+            Integer totalNum = 0;
+            if (sumResponse.getStatusCode() == HttpStatus.OK) {
+                totalNum = Integer.parseInt(sumResponse.getBody());
+            } else {
+                System.out.println("请求失败,状态码: " + sumResponse.getStatusCode());
+            }
+            if(totalNum > 0){
+                int pageSize = 1000;
+                int offset = 0;
+                List<LeaveSheet> toAddList = new ArrayList<>();
+                List<LeaveSheet> toUpdateList = new ArrayList<>();
+                while (offset < totalNum) {
+                    HttpHeaders headers = new HttpHeaders();
+                    headers.setContentType(MediaType.APPLICATION_JSON);
+                    Map<String, Object> requestBody = new HashMap<>();
+                    requestBody.put("pageNo", offset);
+                    requestBody.put("pageSize", pageSize);
+                    HttpEntity<Object> requestEntity = new HttpEntity<>(requestBody, headers);
+                    ResponseEntity<List<LeaveSheet>> listResponse = restTemplate.exchange(
+                            listUrl,
+                            HttpMethod.POST,
+                            requestEntity,
+                            new  ParameterizedTypeReference<List<LeaveSheet>>(){}
+                    );
+                    if (listResponse.getStatusCode() == HttpStatus.OK) {
+                        List<LeaveSheet> dataList = listResponse.getBody();
+                        if(org.apache.commons.collections.CollectionUtils.isNotEmpty(dataList)){
+                            List<String> collect = dataList.stream().map(LeaveSheet::getProcinstId).distinct().collect(Collectors.toList());
+                            List<String> existIds = leaveSheetMapper.getExistIds(collect);
+                            if(!CollectionUtils.isEmpty(existIds)){
+                                toUpdateList.addAll(dataList.stream().filter(t -> existIds.contains(t.getProcinstId())).collect(Collectors.toList()));
+                                toAddList.addAll(dataList.stream().filter(t -> !existIds.contains(t.getProcinstId())).collect(Collectors.toList()));
+                            }else{
+                                toAddList.addAll(dataList);
+                            }
+                            if(!CollectionUtils.isEmpty(toAddList)){
+                                leaveSheetMapper.batchInsert(toAddList);
+                            }
+                            if(!CollectionUtils.isEmpty(toUpdateList)){
+                                for (LeaveSheet tmp : toUpdateList) {
+                                    leaveSheetMapper.updateById(tmp);
+                                }
+                            }
+                            toUpdateList.clear();
+                            toAddList.clear();
+                        }
+
+                    }
+                    offset += pageSize;
+                }
+            }
+        } catch (Exception e) {
+            System.out.println("请求发生异常: " + e.getMessage());
+            e.printStackTrace();
+        }
+    }
+
+    @Scheduled(cron = "0 30 2 * * ?")
+    public void businessTripTask(){
+        RestTemplate restTemplate = new RestTemplate();
+        String sumUrl = PREFIX_URL+"/dataCollect/getBusinessTripDataSum";
+        String listUrl = PREFIX_URL+"/dataCollect/getBusinessTripDataList";
+
+        try {
+            ResponseEntity<String> sumResponse = restTemplate.exchange(
+                    sumUrl,
+                    HttpMethod.GET,
+                    null,
+                    String.class
+            );
+            Integer totalNum = 0;
+            if (sumResponse.getStatusCode() == HttpStatus.OK) {
+                totalNum = Integer.parseInt(sumResponse.getBody());
+            } else {
+                System.out.println("请求失败,状态码: " + sumResponse.getStatusCode());
+            }
+            if(totalNum > 0){
+                int pageSize = 1000;
+                int offset = 0;
+                List<BusinessTrip> toAddList = new ArrayList<>();
+                List<BusinessTrip> toUpdateList = new ArrayList<>();
+                while (offset < totalNum) {
+                    HttpHeaders headers = new HttpHeaders();
+                    headers.setContentType(MediaType.APPLICATION_JSON);
+                    Map<String, Object> requestBody = new HashMap<>();
+                    requestBody.put("pageNo", offset);
+                    requestBody.put("pageSize", pageSize);
+                    HttpEntity<Object> requestEntity = new HttpEntity<>(requestBody, headers);
+                    ResponseEntity<List<BusinessTrip>> listResponse = restTemplate.exchange(
+                            listUrl,
+                            HttpMethod.POST,
+                            requestEntity,
+                            new  ParameterizedTypeReference<List<BusinessTrip>>(){}
+                    );
+                    if (listResponse.getStatusCode() == HttpStatus.OK) {
+                        List<BusinessTrip> dataList = listResponse.getBody();
+                        if(org.apache.commons.collections.CollectionUtils.isNotEmpty(dataList)){
+                            List<String> collect = dataList.stream().map(BusinessTrip::getProcinstId).distinct().collect(Collectors.toList());
+                            List<String> existIds = businessTripMapper.getExistIds(collect);
+                            if(!CollectionUtils.isEmpty(existIds)){
+                                toUpdateList.addAll(dataList.stream().filter(t -> existIds.contains(t.getProcinstId())).collect(Collectors.toList()));
+                                toAddList.addAll(dataList.stream().filter(t -> !existIds.contains(t.getProcinstId())).collect(Collectors.toList()));
+                            }else{
+                                toAddList.addAll(dataList);
+                            }
+                            if(!CollectionUtils.isEmpty(toAddList)){
+                                businessTripMapper.batchInsert(toAddList);
+                            }
+                            if(!CollectionUtils.isEmpty(toUpdateList)){
+                                for (BusinessTrip tmp : toUpdateList) {
+                                    businessTripMapper.updateById(tmp);
+                                }
+                            }
+                            toUpdateList.clear();
+                            toAddList.clear();
+                        }
+
+                    }
+                    offset += pageSize;
+                }
+            }
+        } catch (Exception e) {
+            System.out.println("请求发生异常: " + e.getMessage());
+            e.printStackTrace();
+        }
+    }
+
+}

+ 15 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/BusinessTripMapper.xml

@@ -38,6 +38,15 @@
     <sql id="Base_Column_List">
         id, company_id, owner_id, owner_name, reason, start_date, end_date, way, city_from, city_to, go_back, day_count, remark, status, deny_reason, indate, is_linked, procinst_id, gmt_finished, auditor_id, auditor_name, auditor_type, cur_audit_setting_id
     </sql>
+    <insert id="batchInsert">
+        insert into business_trip(company_id, owner_id, owner_name, reason, start_date, end_date
+        , way, city_from, city_to,day_count, status, indate,  procinst_id)
+        VALUES
+        <foreach collection="resList" separator="," item="res">
+            (#{res.companyId},#{res.ownerId},#{res.ownerName},#{res.reason},#{res.startDate},#{res.endDate}
+            ,#{res.way},#{res.cityFrom},#{res.cityTo},#{res.dayCount},#{res.status},#{res.indate},#{res.procinstId})
+        </foreach>
+    </insert>
 
     <select id="summaryData"  resultMap="BaseResultMap1">
         select owner_id, owner_name, sum(day_count) as day_count, department.department_name as department_name from business_trip
@@ -65,4 +74,10 @@
             and business_trip.start_date &lt;= #{endDate} and business_trip.end_date >= #{startDate}
         </if>
     </select>
+    <select id="getExistIds" resultType="java.lang.String">
+        select procinst_id
+        from business_trip
+        where procinst_id in
+        <foreach collection="procinstIds" item="procinstId" separator="," open="(" close=")">#{procinstId}</foreach>
+    </select>
 </mapper>

+ 18 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ErpOrderInfoMapper.xml

@@ -0,0 +1,18 @@
+<?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.ErpOrderInfoMapper">
+
+    <insert id="batchInsert">
+        insert into erp_order_info(order_id, project_id, project_name, line, status)
+        VALUES
+            <foreach collection="resList" separator="," item="res">
+                (#{res.orderId},#{res.projectId},#{res.projectName},#{res.line},#{res.status})
+            </foreach>
+    </insert>
+    <select id="getExistIds" resultType="java.lang.String">
+        select moDId
+        from erp_order_info
+        where moDId in <foreach collection="moIds" item="moId" separator="," open="(" close=")">#{moId}</foreach>
+    </select>
+</mapper>

+ 14 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/LeaveSheetMapper.xml

@@ -31,6 +31,15 @@
     <sql id="Base_Column_List">
         id, company_id, owner_id, owner_name, start_date, end_date, leave_type, status, remark, operator_id, time_hours, time_days, indate, time_type, tel, auditor_id, auditor_name, auditor_type, procinst_id, gmt_finished, cur_audit_setting_id
     </sql>
+    <insert id="batchInsert">
+        insert into leave_sheet(company_id, owner_id, owner_name,start_date, end_date, leave_type, status, remark
+        , operator_id, time_hours, time_days, indate, time_type, tel, procinst_id) VALUES
+        <foreach collection="resList" separator="," item="res">
+            (#{res.companyId},#{res.ownerId},#{res.ownerName},#{res.startDate},#{res.endDate}
+            ,#{res.leaveType},#{res.status},#{res.remark},#{res.operatorId},#{res.timeHours},#{res.timeDays}
+            ,#{res.indate},#{res.timeType},#{res.tel},#{res.procinstId})
+        </foreach>
+    </insert>
     <select id="summaryData"  resultMap="BaseResultMap">
         select owner_id, owner_name, sum(time_hours) as time_hours, sum(time_days) as time_days from leave_sheet
         where start_date &gt;= #{startDate} and end_date &lt;= #{endDate}
@@ -99,4 +108,9 @@
                 group by owner_id
             ) tmp2 on tmp1.id = tmp2.userId
     </select>
+    <select id="getExistIds" resultType="java.lang.String">
+        select procinst_id
+        from leave_sheet
+        where procinst_id in <foreach collection="procinstIds" item="procinstId" separator="," open="(" close=")">#{procinstId}</foreach>
+    </select>
 </mapper>

+ 246 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml

@@ -731,7 +731,10 @@
 
     <select id="getTaskPlanByMemb" resultType="java.util.Map">
         SELECT user.`id` as user_id, user.`name`,project.id, project.`project_name`,task.id as task_id, task.name as task_name,task_executor.id as exe_id,
-        IFNULL(task.`start_date`, task.end_date) as start_date, task.`end_date`, task_executor.plan_hours as duration, task.task_level as level FROM user
+        IFNULL(task.`start_date`, task.end_date) as start_date, task.`end_date`, task_executor.plan_hours as duration, task.task_level as level ,
+        task.task_plan_type as taskPlanType,task.is_task_plan as isTaskPlan,task.check_first_id as checkFirstId,task.check_second_id as checkSecondId,
+        task.task_status as taskStatus,task.id as taskId,task.task_plan taskPlan
+        FROM user
         LEFT JOIN task_executor ON user.id = task_executor.`executor_id`
         left join task on task.id = task_executor.task_id
         LEFT JOIN project ON project.`id` = task.`project_id`
@@ -740,15 +743,20 @@
             #{item}
         </foreach>
         and ((IFNULL(task.start_date , task.end_date) between #{startDate} and #{endDate}) or (task.end_date between #{startDate} and #{endDate}))
-        and task.end_date is not null
+        and task.end_date is not null and task.task_plan =0
         AND project.`status` = 1
         ORDER BY user.id, task.start_date
     </select>
 
     <select id="getTaskPlanByProject" resultType="java.util.Map">
         SELECT task.executor_id as user_id, task.executor_name as `name`,project.id, project.`project_name`,task.id as task_id, task.name as task_name,
+        task.task_plan_type as taskPlanType,task.is_task_plan as isTaskPlan,task.check_first_id as checkFirstId,task.check_second_id as checkSecondId
+        ,task.task_status as taskStatus,task.id as taskId,task.task_plan taskPlan,
         IFNULL(task.`start_date`, task.end_date) as start_date, task.`end_date`, task.plan_hours as duration FROM project
         LEFT JOIN task ON task.project_id = project.id
+        <if test="groupName !=null and groupName !='' ">
+            LEFT JOIN task_group tg ON tg.project_id = project.id
+        </if>
         WHERE project.company_id = #{companyId}
         <if test="projectIds != null">
             and project.`id` IN
@@ -756,8 +764,14 @@
                 #{item}
             </foreach>
         </if>
+        <if test="groupName !=null and groupName !='' ">
+            and tg.name = #{groupName} and task.group_id=tg.id
+        </if>
+        <if test="taskType !=null  ">
+            and task.task_type = #{taskType}
+        </if>
         and ((IFNULL(task.start_date , task.end_date) between #{startDate} and #{endDate}) or (task.end_date between #{startDate} and #{endDate}))
-        and task.end_date is not null
+        and task.end_date is not null and task.task_plan =0
         AND project.`status` = 1
         ORDER BY project.id, task.start_date
     </select>
@@ -2707,5 +2721,234 @@
             </foreach>
         </if>
     </select>
+    <select id="getTaskPlanByGeneralMemb" resultType="java.util.Map">
+        SELECT user.`id` as user_id, user.`name`,project.id, project.`project_name`,task.id as task_id, task.name as task_name,task_executor.id as exe_id,
+        IFNULL(task.`start_date`, task.end_date) as start_date, task.`end_date`, task_executor.plan_hours as duration, task.task_level as level ,
+        task.task_plan_type as taskPlanType,task.is_task_plan as isTaskPlan,task.check_first_id as checkFirstId,task.check_second_id as checkSecondId,
+        task.task_status as taskStatus,task.id as taskId,task.task_plan taskPlan
+        FROM user
+        LEFT JOIN task_executor ON user.id = task_executor.`executor_id`
+        left join task on task.id = task_executor.task_id
+        LEFT JOIN project ON project.`id` = task.`project_id`
+        WHERE user.`id` IN
+        <foreach collection="userIds" close=")" open="(" separator="," index="" item="item">
+            #{item}
+        </foreach>
+        and ((IFNULL(task.start_date , task.end_date) between #{startDate} and #{endDate}) or (task.end_date between #{startDate} and #{endDate}))
+        and task.end_date is not null
+        <if test="targetUserId !=null and targetUserId !='' ">
+            and user.`id`=#{targetUserId}
+        </if>
+        AND project.`status` = 1
+        ORDER BY user.id, task.start_date
+    </select>
+    <select id="getTaskPlanWithLeave" resultType="java.util.Map">
+        SELECT user.`id` as user_id, user.`name`,task.id as task_id, task.name as task_name,task_executor.id as exe_id,
+        IFNULL(task.`start_date`, task.end_date) as start_date, task.`end_date`, task_executor.plan_hours as duration, task.task_level as level ,
+        task.task_plan_type as taskPlanType,task.is_task_plan as isTaskPlan,task.check_first_id as checkFirstId,task.check_second_id as checkSecondId,
+        task.task_status as taskStatus,task.id as taskId,task.task_plan taskPlan
+        FROM user
+        LEFT JOIN task_executor ON user.id = task_executor.`executor_id`
+        left join task on task.id = task_executor.task_id
+        WHERE
+        ((IFNULL(task.start_date , task.end_date) between #{startDate} and #{endDate}) or (task.end_date between #{startDate} and #{endDate}))
+        and task.end_date is not null and task.task_plan_type=3 and task.task_plan=1
+        <if test="targetUserId !=null and targetUserId !='' ">
+            and user.`id`=#{targetUserId}
+        </if>
+        ORDER BY user.id, task.start_date
+    </select>
+    <select id="getTaskPlanByProManager" resultType="java.util.Map">
+        SELECT user.`id` as user_id, user.`name`,project.id, project.`project_name`,task.id as task_id, task.name as task_name,task_executor.id as exe_id,
+        IFNULL(task.`start_date`, task.end_date) as start_date, task.`end_date`, task_executor.plan_hours as duration, task.task_level as level ,
+        task.task_plan_type as taskPlanType,task.is_task_plan as isTaskPlan,task.check_first_id as checkFirstId,task.check_second_id as checkSecondId,
+        task.task_status as taskStatus,task.id as taskId,task.task_plan taskPlan
+        FROM user
+        LEFT JOIN task_executor ON user.id = task_executor.`executor_id`
+        left join task on task.id = task_executor.task_id
+        LEFT JOIN project ON project.`id` = task.`project_id`
+        WHERE user.`id` IN
+        <foreach collection="userIds" close=")" open="(" separator="," index="" item="item">
+            #{item}
+        </foreach>
+        and ((IFNULL(task.start_date , task.end_date) between #{startDate} and #{endDate}) or (task.end_date between #{startDate} and #{endDate}))
+        and task.end_date is not null and task.is_task_plan=1 and task.task_status=3 and task.check_first_id=#{managerId}
+        AND project.`status` = 1
+        <if test="targetUserId !=null and targetUserId !='' ">
+            and user.`id`=#{targetUserId}
+        </if>
+        ORDER BY user.id, task.start_date
+    </select>
+    <select id="getTaskPlanByAreaManager" resultType="java.util.Map">
+        SELECT user.`id` as user_id, user.`name`,project.id, project.`project_name`,task.id as task_id, task.name as task_name,task_executor.id as exe_id,
+        IFNULL(task.`start_date`, task.end_date) as start_date, task.`end_date`, task_executor.plan_hours as duration, task.task_level as level ,
+        task.task_plan_type as taskPlanType,task.is_task_plan as isTaskPlan,task.check_first_id as checkFirstId,task.check_second_id as checkSecondId,
+        task.task_status as taskStatus,task.id as taskId,task.task_plan taskPlan
+        FROM user
+        LEFT JOIN task_executor ON user.id = task_executor.`executor_id`
+        left join task on task.id = task_executor.task_id
+        LEFT JOIN project ON project.`id` = task.`project_id`
+        WHERE user.`id` IN
+        <foreach collection="userIds" close=")" open="(" separator="," index="" item="item">
+            #{item}
+        </foreach>
+        and ((IFNULL(task.start_date , task.end_date) between #{startDate} and #{endDate}) or (task.end_date between #{startDate} and #{endDate}))
+        and task.end_date is not null and task.is_task_plan=1 and task.task_status=4 and task.check_second_id=#{managerId}
+        AND project.`status` = 1
+        <if test="targetUserId !=null and targetUserId !='' ">
+            and user.`id`=#{targetUserId}
+        </if>
+        ORDER BY user.id, task.start_date
+    </select>
+    <select id="getTaskPlanByProjectGeneralMemb" resultType="java.util.Map">
+        SELECT task.executor_id as user_id, task.executor_name as `name`,project.id, project.`project_name`,task.id as task_id, task.name as task_name,
+        task.task_plan_type as taskPlanType,task.is_task_plan as isTaskPlan,task.check_first_id as checkFirstId,task.check_second_id as checkSecondId
+        ,task.task_status as taskStatus,task.id as taskId,task.task_plan taskPlan,
+        IFNULL(task.`start_date`, task.end_date) as start_date, task.`end_date`, task.plan_hours as duration FROM project
+        LEFT JOIN task ON task.project_id = project.id
+        <if test="groupName !=null and groupName !='' ">
+            LEFT JOIN task_group tg ON tg.project_id = project.id
+        </if>
+        WHERE project.company_id = #{companyId}
+        <if test="projectIds != null">
+            and project.`id` IN
+            <foreach collection="projectIds" close=")" open="(" separator="," index="" item="item">
+                #{item}
+            </foreach>
+        </if>
+        <if test="groupName !=null and groupName !='' ">
+            and tg.name = #{groupName} and task.group_id=tg.id
+        </if>
+        <if test="taskType !=null  ">
+            and task.task_type = #{taskType}
+        </if>
+        <if test="targetProjectId !=null  ">
+            and project.`id` = #{targetProjectId}
+        </if>
+        and ((IFNULL(task.start_date , task.end_date) between #{startDate} and #{endDate}) or (task.end_date between #{startDate} and #{endDate}))
+        and task.end_date is not null
+        AND project.`status` = 1
+        ORDER BY project.id, task.start_date
+    </select>
+    <select id="getTaskPlanByProjectManager" resultType="java.util.Map">
+        SELECT task.executor_id as user_id, task.executor_name as `name`,project.id, project.`project_name`,task.id as task_id, task.name as task_name,
+        task.task_plan_type as taskPlanType,task.is_task_plan as isTaskPlan,task.check_first_id as checkFirstId,task.check_second_id as checkSecondId
+        ,task.task_status as taskStatus,task.id as taskId,task.task_plan taskPlan,
+        IFNULL(task.`start_date`, task.end_date) as start_date, task.`end_date`, task.plan_hours as duration FROM project
+        LEFT JOIN task ON task.project_id = project.id
+        <if test="groupName !=null and groupName !='' ">
+            LEFT JOIN task_group tg ON tg.project_id = project.id
+        </if>
+        WHERE project.company_id = #{companyId}
+        <if test="projectIds != null">
+            and project.`id` IN
+            <foreach collection="projectIds" close=")" open="(" separator="," index="" item="item">
+                #{item}
+            </foreach>
+        </if>
+        <if test="groupName !=null and groupName !='' ">
+            and tg.name = #{groupName} and task.group_id=tg.id
+        </if>
+        <if test="taskType !=null  ">
+            and task.task_type = #{taskType}
+        </if>
+        <if test="targetProjectId !=null  ">
+            and project.`id` = #{targetProjectId}
+        </if>
+        and ((IFNULL(task.start_date , task.end_date) between #{startDate} and #{endDate}) or (task.end_date between #{startDate} and #{endDate}))
+        and task.end_date is not null and task.is_task_plan=1 and task.task_status=3 and task.check_first_id=#{managerId}
+        AND project.`status` = 1
+        ORDER BY project.id, task.start_date
+    </select>
+    <select id="getTaskPlanByProjectAreaManager" resultType="java.util.Map">
+        SELECT task.executor_id as user_id, task.executor_name as `name`,project.id, project.`project_name`,task.id as task_id, task.name as task_name,
+        task.task_plan_type as taskPlanType,task.is_task_plan as isTaskPlan,task.check_first_id as checkFirstId,task.check_second_id as checkSecondId
+        ,task.task_status as taskStatus,task.id as taskId,task.task_plan taskPlan,
+        IFNULL(task.`start_date`, task.end_date) as start_date, task.`end_date`, task.plan_hours as duration FROM project
+        LEFT JOIN task ON task.project_id = project.id
+        <if test="groupName !=null and groupName !='' ">
+            LEFT JOIN task_group tg ON tg.project_id = project.id
+        </if>
+        WHERE project.company_id = #{companyId}
+        <if test="projectIds != null">
+            and project.`id` IN
+            <foreach collection="projectIds" close=")" open="(" separator="," index="" item="item">
+                #{item}
+            </foreach>
+        </if>
+        <if test="groupName !=null and groupName !='' ">
+            and tg.name = #{groupName} and task.group_id=tg.id
+        </if>
+        <if test="taskType !=null  ">
+            and task.task_type = #{taskType}
+        </if>
+        <if test="targetProjectId !=null  ">
+            and project.`id` = #{targetProjectId}
+        </if>
+        and ((IFNULL(task.start_date , task.end_date) between #{startDate} and #{endDate}) or (task.end_date between #{startDate} and #{endDate}))
+        and task.end_date is not null and task.is_task_plan=1 and task.task_status=4 and task.check_second_id=#{managerId}
+        AND project.`status` = 1
+        ORDER BY project.id, task.start_date
+    </select>
+    <select id="getFTETaskPlanData" resultType="java.util.Map">
+        select t.id,  u.plate1 area, p.project_code projectCode,p.project_name projectName,u.name userName, t.plan_hours planHours   from task t
+          left join project p on t.project_id=p.id
+          LEFT JOIN task_executor te on t.id=te.task_id
+          INNER JOIN user u on u.id=te.executor_id
+        WHERE u.company_id=#{companyId} and t.task_plan=1 and t.task_status &lt;3 and t.task_plan_type !=3
+        <if test="area!=null and area != '' ">
+            and u.plate1 = #{area}
+        </if>
+        <if test="userId!=null and userId != '' ">
+            and u.id = #{userId}
+        </if>
+        <if test="deptIds!=null and deptIds.size()>0">
+            and u.department_id in
+            <foreach collection="deptIds" open="(" item="item" close=")" separator=",">
+                #{item}
+            </foreach>
+        </if>
+        <if test=" startDate!= null and endDate!= null">
+            AND
+            (
+            (
+            (t.start_date IS NULL OR t.start_date &lt;= #{startDate}) AND (t.end_date &gt;= #{startDate} AND t.end_date &lt;= #{endDate})
+            )
+            OR
+            (
+            (t.end_date IS NULL OR t.end_date &gt;= #{endDate}) AND (t.start_date &gt;= #{startDate} AND t.start_date &lt;= #{endDate})
+            )
+            OR
+            (
+            t.start_date IS NOT NULL AND t.end_date IS NOT NULL AND t.start_date &gt;= #{startDate}
+            AND t.start_date &lt;= #{endDate} AND t.end_date &gt;= #{startDate} AND t.end_date &lt;= #{endDate}
+            )
+            OR
+            (
+            t.start_date IS NOT NULL AND t.end_date IS NOT NULL AND t.start_date &lt;= #{startDate} AND t.end_date &gt; #{endDate}
+            )
+            )
+        </if>
+        <if test=" startDate != null and endDate == null">
+            AND (t.end_date IS NOT NULL and t.end_date &gt;= #{startDate})
+        </if>
+        <if test=" startDate == null and endDate != null">
+            AND (t.start_date IS NOT NULL and t.start_date &lt;= #{endDate})
+        </if>
+    </select>
+    <select id="findRelatedProjectIds" resultType="java.lang.Integer">
+        SELECT DISTINCT pl.project_id
+        FROM project_leader pl
+        WHERE pl.leader_id = #{userId}
+
+        UNION
+
+        SELECT DISTINCT p.id
+        FROM project p
+        INNER JOIN task t ON t.project_id = p.id
+        WHERE p.company_id = #{companyId}
+        AND (t.check_first_id = #{userId} OR t.check_second_id = #{userId})
+    </select>
+
 
 </mapper>

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

@@ -20,7 +20,7 @@
         id, task_id, executor_id, executor_name, executor_color, plan_hours, project_id, service_id, real_cost, file_charge_one_id, file_charge_two_id
     </sql>
     <select id="getInfoWithFileCharge" resultType="com.management.platform.entity.TaskExecutor">
-        select task_id, executor_id, executor_name, executor_color, plan_hours, project_id
+        select te.id as id,   task_id, executor_id, executor_name, executor_color, plan_hours, project_id
              , service_id, real_cost, file_charge_one_id, file_charge_two_id
              , u1.name as fileChargeOneName,u1.corpwx_userid as chargeOneWxId
              ,u2.name as fileChargeTwoName,u2.corpwx_userid  as chargeTwoWxId

+ 10 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/UserFvTimeMapper.xml

@@ -26,5 +26,15 @@
             (#{toAdd.workDate},#{toAdd.userId},#{toAdd.companyId},#{toAdd.startTime},#{toAdd.endTime},#{toAdd.workHours},#{toAdd.overTimeHours})
             </foreach>
     </insert>
+    <insert id="batchInsertCollect">
+        insert into user_fv_time(work_date, user_id, company_id, start_time, end_time,work_hours,overtime_seconds,procinst_id) VALUES
+        <foreach collection="resList" separator="," item="res">
+            (#{res.workDate},#{res.userId},#{res.companyId},#{res.startTime},#{res.endTime},#{res.workHours},#{res.overTimeSeconds},#{res.procinstId})
+        </foreach>
+    </insert>
+    <select id="getExistIds" resultType="java.lang.String">
+        select procinst_id from user_fv_time where procinst_id in
+        <foreach collection="procinstIds" item="procinstId" separator="," open="(" close=")">#{procinstId}</foreach>
+    </select>
 
 </mapper>

+ 116 - 31
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/CompanyController.java

@@ -29,10 +29,7 @@ import java.time.Duration;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Optional;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -110,6 +107,52 @@ public class CompanyController {
     @Resource
     private UserCorpwxTimeMapper userCorpwxTimeMapper;
 
+    @Resource
+    private ProjectAuditorMapper projectAuditorMapper;
+
+    @Resource
+    private ProjectBasecostMapper projectBasecostMapper;
+
+    @Resource
+    private ProjectBasecostSettingMapper projectBasecostSettingMapper;
+
+    @Resource
+    private ProjectDocfolderMapper projectDocfolderMapper;
+
+    @Resource
+    private ProjectDocumentMapper projectDocumentMapper;
+
+    @Resource
+    private ProjectNotifyUserMapper projectNotifyUserMapper;
+
+    @Resource
+    private ProjectPercentageMapper projectPercentageMapper;
+
+    @Resource
+    private ProjectProfessionMapper projectProfessionMapper;
+
+    @Resource
+    private ProjectTimerMapper projectTimerMapper;
+
+    @Resource
+    private ProjectUserSalaryMapper projectUserSalaryMapper;
+
+    @Resource
+    private SubProjectMapper subProjectMapper;
+
+    @Resource
+    private ReportAuditLogMapper reportAuditLogMapper;
+
+    @Resource
+    private ReportExtraDegreeMapper reportExtraDegreeMapper;
+
+    @Resource
+    private ReportImportLogMapper reportImportLogMapper;
+
+    @Resource
+    private ReportProfessionProgressMapper reportProfessionProgressMapper;
+
+
 
 
 
@@ -315,34 +358,76 @@ public class CompanyController {
             return msg;
         }
         QueryWrapper<Company> queryWrapper = new QueryWrapper<Company>();
-        String[] strings = companyIds.split(",");
-        List<String> companyIdList = Arrays.asList(strings);
-        queryWrapper.in("id",companyIdList);
+        LocalDateTime localDateTime = LocalDateTime.now().plusYears(-2L);
+        queryWrapper.eq("set_meal",0).le("expiration_date",localDateTime).orderByAsc("expiration_date");
         List<Company> companyList = companyMapper.selectList(queryWrapper);
-        List<Integer> companyIdCollect = companyList.stream().map(Company::getId).collect(Collectors.toList());
-        companySigningMapper.delete(new QueryWrapper<CompanySigning>().in("company_id",companyIdCollect));
-        auditWorkflowTimeSettingMapper.delete(new QueryWrapper<AuditWorkflowTimeSetting>().in("company_id",companyIdCollect));
-        companyCustomerContactMapper.delete(new QueryWrapper<CompanyCustomerContact>().in("company_id",companyIdCollect));
-        companyDingdingMapper.delete(new QueryWrapper<CompanyDingding>().in("company_id",companyIdCollect));
-        companyReportMapper.delete(new QueryWrapper<CompanyReport>().in("company_id",companyIdCollect));
-        customerInfoMapper.delete(new QueryWrapper<CustomerInfo>().in("company_id",companyIdCollect));
-        departmentMapper.delete(new QueryWrapper<Department>().in("company_id",companyIdCollect));
-        operationRecordMapper.delete(new QueryWrapper<OperationRecord>().in("company_id",companyIdCollect));
-        projectMapper.delete(new QueryWrapper<Project>().in("company_id",companyIdCollect));
-        projectCategoryMapper.delete(new QueryWrapper<ProjectCategory>().in("company_id",companyIdCollect));
-        reportMapper.delete(new QueryWrapper<Report>().in("company_id",companyIdCollect));
-
-        sysRoleModuleMapper.deleteNeedToDel(companyIdCollect);
-        sysRoleFunctionMapper.deleteNeedToDel(companyIdCollect);
-        sysRoleMapper.delete(new QueryWrapper<SysRole>().in("company_id",companyIdCollect));
-
-        taskMapper.delete(new QueryWrapper<Task>().in("company_id",companyIdCollect));
-        timeTypeMapper.delete(new QueryWrapper<TimeType>().in("company_id",companyIdCollect));
-        userMapper.delete(new QueryWrapper<User>().in("company_id",companyIdCollect));
-        userCorpwxTimeMapper.delete(new QueryWrapper<UserCorpwxTime>().in("company_id",companyIdCollect));
-        wxCorpInfoMapper.delete(new QueryWrapper<WxCorpInfo>().in("company_id",companyIdCollect));
-
-        feishuInfoService.remove(new QueryWrapper<FeishuInfo>().in("company_id",companyIdCollect));
+        List<Integer> eligibleCompanyIds = companyList.stream().map(Company::getId).collect(Collectors.toList());
+
+        // 解析传入的公司ID
+        String[] strings = companyIds.split(",");
+        List<String> companyIdCollect = Arrays.asList(strings);
+        List<Integer> companyIdsToDelete = new ArrayList<>();
+
+        // 校验传入的公司ID是否都在符合条件的公司列表中
+        for (String idStr : companyIdCollect) {
+            try {
+                Integer id = Integer.parseInt(idStr);
+                if (!eligibleCompanyIds.contains(id)) {
+                    msg.setError("公司ID " + id + " 不符合删除条件(套餐为0且过期时间超过2年)");
+                    return msg;
+                }
+                companyIdsToDelete.add(id);
+            } catch (NumberFormatException e) {
+                msg.setError("公司ID格式不正确: " + idStr);
+                return msg;
+            }
+        }
+        companySigningMapper.delete(new QueryWrapper<CompanySigning>().in("company_id",companyIdsToDelete));
+        auditWorkflowTimeSettingMapper.delete(new QueryWrapper<AuditWorkflowTimeSetting>().in("company_id",companyIdsToDelete));
+        companyCustomerContactMapper.delete(new QueryWrapper<CompanyCustomerContact>().in("company_id",companyIdsToDelete));
+        companyDingdingMapper.delete(new QueryWrapper<CompanyDingding>().in("company_id",companyIdsToDelete));
+        companyReportMapper.delete(new QueryWrapper<CompanyReport>().in("company_id",companyIdsToDelete));
+        customerInfoMapper.delete(new QueryWrapper<CustomerInfo>().in("company_id",companyIdsToDelete));
+        departmentMapper.delete(new QueryWrapper<Department>().in("company_id",companyIdsToDelete));
+        operationRecordMapper.delete(new QueryWrapper<OperationRecord>().in("company_id",companyIdsToDelete));
+
+        List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().in("company_id", companyIdsToDelete));
+        if (!projectList.isEmpty()){
+            List<Integer> projectIdList = projectList.stream().distinct().map(Project::getId).collect(Collectors.toList());
+            projectAuditorMapper.delete(new QueryWrapper<ProjectAuditor>().in("project_id", projectIdList));
+            projectBasecostMapper.delete(new QueryWrapper<ProjectBasecost>().in("project_id", projectIdList));
+            projectDocfolderMapper.delete(new QueryWrapper<ProjectDocfolder>().in("project_id", projectIdList));
+            projectDocumentMapper.delete(new QueryWrapper<ProjectDocument>().in("project_id", projectIdList));
+            projectNotifyUserMapper.delete(new QueryWrapper<ProjectNotifyUser>().in("project_id", projectIdList));
+            projectProfessionMapper.delete(new QueryWrapper<ProjectProfession>().in("project_id", projectIdList));
+            projectTimerMapper.delete(new QueryWrapper<ProjectTimer>().in("project_id", projectIdList));
+            projectUserSalaryMapper.delete(new QueryWrapper<ProjectUserSalary>().in("project_id", projectIdList));
+            reportProfessionProgressMapper.delete(new QueryWrapper<ReportProfessionProgress>().in("project_id", projectIdList));
+        }
+        projectMapper.delete(new QueryWrapper<Project>().in("company_id",companyIdsToDelete));
+        projectBasecostSettingMapper.delete(new QueryWrapper<ProjectBasecostSetting>().in("company_id",companyIdsToDelete));
+        projectPercentageMapper.delete(new QueryWrapper<ProjectPercentage>().in("company_id",companyIdsToDelete));
+        subProjectMapper.delete(new QueryWrapper<SubProject>().in("company_id",companyIdsToDelete));
+        projectCategoryMapper.delete(new QueryWrapper<ProjectCategory>().in("company_id",companyIdsToDelete));
+
+        reportMapper.delete(new QueryWrapper<Report>().in("company_id",companyIdsToDelete));
+        reportAuditLogMapper.delete(new QueryWrapper<ReportAuditLog>().in("company_id",companyIdsToDelete));
+        reportExtraDegreeMapper.delete(new QueryWrapper<ReportExtraDegree>().in("company_id",companyIdsToDelete));
+        reportImportLogMapper.delete(new QueryWrapper<ReportImportLog>().in("company_id",companyIdsToDelete));
+
+        sysRoleModuleMapper.deleteNeedToDel(companyIdsToDelete);
+        sysRoleFunctionMapper.deleteNeedToDel(companyIdsToDelete);
+        sysRoleMapper.delete(new QueryWrapper<SysRole>().in("company_id",companyIdsToDelete));
+
+        taskMapper.delete(new QueryWrapper<Task>().in("company_id",companyIdsToDelete));
+        timeTypeMapper.delete(new QueryWrapper<TimeType>().in("company_id",companyIdsToDelete));
+        userMapper.delete(new QueryWrapper<User>().in("company_id",companyIdsToDelete));
+        userCorpwxTimeMapper.delete(new QueryWrapper<UserCorpwxTime>().in("company_id",companyIdsToDelete));
+        wxCorpInfoMapper.delete(new QueryWrapper<WxCorpInfo>().in("company_id",companyIdsToDelete));
+
+        feishuInfoService.remove(new QueryWrapper<FeishuInfo>().in("company_id",companyIdsToDelete));
+
+        companyMapper.delete(new QueryWrapper<Company>().in("id",companyIdsToDelete));
         return msg;
     }
 }

+ 23 - 23
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/entity/Project.java

@@ -167,29 +167,29 @@ public class Project extends Model<Project> {
     @TableField("base_fee")
     private Integer baseFee;
 
-    /**
-     * 一般费用
-     */
-    @TableField("fee_normal")
-    private Double feeNormal;
-
-    /**
-     * 差旅费
-     */
-    @TableField("fee_travel")
-    private Double feeTravel;
-
-    /**
-     * 外包费用
-     */
-    @TableField("fee_outsourcing")
-    private Double feeOutsourcing;
-
-    /**
-     * 人工成本
-     */
-    @TableField("fee_man")
-    private Double feeMan;
+//    /**
+//     * 一般费用
+//     */
+//    @TableField("fee_normal")
+//    private Double feeNormal;
+
+//    /**
+//     * 差旅费
+//     */
+//    @TableField("fee_travel")
+//    private Double feeTravel;
+
+//    /**
+//     * 外包费用
+//     */
+//    @TableField("fee_outsourcing")
+//    private Double feeOutsourcing;
+
+//    /**
+//     * 人工成本
+//     */
+//    @TableField("fee_man")
+//    private Double feeMan;
 
     @TableField(exist = false)
     private String inchargerName;

+ 25 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/mapper/ProjectBasecostMapper.java

@@ -0,0 +1,25 @@
+package com.management.platform.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.management.platform.entity.Project;
+import com.management.platform.entity.ProjectBasecost;
+import com.management.platform.entity.vo.CustomerProject;
+import com.management.platform.entity.vo.ProjectWithStage;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Update;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * Mapper 接口
+ * </p>
+ *
+ * @author 吴涛涛
+ * @since 2020-01-03
+ */
+public interface ProjectBasecostMapper extends BaseMapper<ProjectBasecost> {
+
+}

+ 17 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/mapper/ProjectBasecostSettingMapper.java

@@ -0,0 +1,17 @@
+package com.management.platform.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.management.platform.entity.ProjectBasecost;
+import com.management.platform.entity.ProjectBasecostSetting;
+
+/**
+ * <p>
+ * Mapper 接口
+ * </p>
+ *
+ * @author 吴涛涛
+ * @since 2020-01-03
+ */
+public interface ProjectBasecostSettingMapper extends BaseMapper<ProjectBasecostSetting> {
+
+}

+ 17 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/mapper/ProjectDocfolderMapper.java

@@ -0,0 +1,17 @@
+package com.management.platform.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.management.platform.entity.ProjectBasecost;
+import com.management.platform.entity.ProjectDocfolder;
+
+/**
+ * <p>
+ * Mapper 接口
+ * </p>
+ *
+ * @author 吴涛涛
+ * @since 2020-01-03
+ */
+public interface ProjectDocfolderMapper extends BaseMapper<ProjectDocfolder> {
+
+}

+ 17 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/mapper/ProjectDocumentMapper.java

@@ -0,0 +1,17 @@
+package com.management.platform.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.management.platform.entity.ProjectDocfolder;
+import com.management.platform.entity.ProjectDocument;
+
+/**
+ * <p>
+ * Mapper 接口
+ * </p>
+ *
+ * @author 吴涛涛
+ * @since 2020-01-03
+ */
+public interface ProjectDocumentMapper extends BaseMapper<ProjectDocument> {
+
+}

+ 17 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/mapper/ProjectNotifyUserMapper.java

@@ -0,0 +1,17 @@
+package com.management.platform.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.management.platform.entity.ProjectDocument;
+import com.management.platform.entity.ProjectNotifyUser;
+
+/**
+ * <p>
+ * Mapper 接口
+ * </p>
+ *
+ * @author 吴涛涛
+ * @since 2020-01-03
+ */
+public interface ProjectNotifyUserMapper extends BaseMapper<ProjectNotifyUser> {
+
+}

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

@@ -0,0 +1,16 @@
+package com.management.platform.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.management.platform.entity.ProjectPercentage;
+
+/**
+ * <p>
+ * Mapper 接口
+ * </p>
+ *
+ * @author 吴涛涛
+ * @since 2020-01-03
+ */
+public interface ProjectPercentageMapper extends BaseMapper<ProjectPercentage> {
+
+}

+ 17 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/mapper/ProjectProfessionMapper.java

@@ -0,0 +1,17 @@
+package com.management.platform.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.management.platform.entity.ProjectPercentage;
+import com.management.platform.entity.ProjectProfession;
+
+/**
+ * <p>
+ * Mapper 接口
+ * </p>
+ *
+ * @author 吴涛涛
+ * @since 2020-01-03
+ */
+public interface ProjectProfessionMapper extends BaseMapper<ProjectProfession> {
+
+}

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

@@ -0,0 +1,16 @@
+package com.management.platform.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.management.platform.entity.ProjectTimer;
+
+/**
+ * <p>
+ * Mapper 接口
+ * </p>
+ *
+ * @author 吴涛涛
+ * @since 2020-01-03
+ */
+public interface ProjectTimerMapper extends BaseMapper<ProjectTimer> {
+
+}

+ 17 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/mapper/ProjectUserSalaryMapper.java

@@ -0,0 +1,17 @@
+package com.management.platform.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.management.platform.entity.ProjectTimer;
+import com.management.platform.entity.ProjectUserSalary;
+
+/**
+ * <p>
+ * Mapper 接口
+ * </p>
+ *
+ * @author 吴涛涛
+ * @since 2020-01-03
+ */
+public interface ProjectUserSalaryMapper extends BaseMapper<ProjectUserSalary> {
+
+}

+ 17 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/mapper/ReportAuditLogMapper.java

@@ -0,0 +1,17 @@
+package com.management.platform.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.management.platform.entity.ProjectBasecost;
+import com.management.platform.entity.ReportAuditLog;
+
+/**
+ * <p>
+ * Mapper 接口
+ * </p>
+ *
+ * @author 吴涛涛
+ * @since 2020-01-03
+ */
+public interface ReportAuditLogMapper extends BaseMapper<ReportAuditLog> {
+
+}

+ 17 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/mapper/ReportExtraDegreeMapper.java

@@ -0,0 +1,17 @@
+package com.management.platform.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.management.platform.entity.ReportAuditLog;
+import com.management.platform.entity.ReportExtraDegree;
+
+/**
+ * <p>
+ * Mapper 接口
+ * </p>
+ *
+ * @author 吴涛涛
+ * @since 2020-01-03
+ */
+public interface ReportExtraDegreeMapper extends BaseMapper<ReportExtraDegree> {
+
+}

+ 17 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/mapper/ReportImportLogMapper.java

@@ -0,0 +1,17 @@
+package com.management.platform.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.management.platform.entity.ReportExtraDegree;
+import com.management.platform.entity.ReportImportLog;
+
+/**
+ * <p>
+ * Mapper 接口
+ * </p>
+ *
+ * @author 吴涛涛
+ * @since 2020-01-03
+ */
+public interface ReportImportLogMapper extends BaseMapper<ReportImportLog> {
+
+}

+ 17 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/mapper/ReportProfessionProgressMapper.java

@@ -0,0 +1,17 @@
+package com.management.platform.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.management.platform.entity.ProjectDocument;
+import com.management.platform.entity.ReportProfessionProgress;
+
+/**
+ * <p>
+ * Mapper 接口
+ * </p>
+ *
+ * @author 吴涛涛
+ * @since 2020-01-03
+ */
+public interface ReportProfessionProgressMapper extends BaseMapper<ReportProfessionProgress> {
+
+}

+ 17 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/mapper/SubProjectMapper.java

@@ -0,0 +1,17 @@
+package com.management.platform.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.management.platform.entity.ProjectUserSalary;
+import com.management.platform.entity.SubProject;
+
+/**
+ * <p>
+ * Mapper 接口
+ * </p>
+ *
+ * @author 吴涛涛
+ * @since 2020-01-03
+ */
+public interface SubProjectMapper extends BaseMapper<SubProject> {
+
+}