Bladeren bron

工作计划需求编写1

yusm 2 maanden geleden
bovenliggende
commit
3c22d8e5a0

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

@@ -1622,5 +1622,20 @@ public class ProjectController {
     public HttpRespMsg getProjectByLeader(HttpServletRequest request){
         return projectService.getProjectByLeader(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,Integer departmentId ,HttpServletRequest request){
+        return projectService.exportTaskPlanFTEData(monthStart,monthEnd,area,departmentId,request);
+    }
 }
 

+ 59 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskController.java

@@ -14,6 +14,7 @@ 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 com.sun.org.apache.xpath.internal.operations.Bool;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.poi.hssf.usermodel.*;
@@ -192,6 +193,7 @@ public class TaskController {
         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;
@@ -202,6 +204,7 @@ public class TaskController {
             task.setCompanyId(user.getCompanyId());
 
             if (user.getCompanyId()==Constant.MLD_COMPANY_ID&&task.getIsTaskPlan()==1){
+                task.setTaskPlan(1);
                 task.setTaskStatus(3);
             }
 //            TimeType timeType = timeTypeMapper.selectById(user.getCompanyId());
@@ -460,19 +463,24 @@ public class TaskController {
                     && 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()==5||task.getTaskStatus()==6)
+                    &&(!userId.equals(task.getCheckFirstId())&&!userId.equals(task.getCheckSecondId()))
+                    ){
+                isUpdate=3;
                 task.setTaskStatus(3);//待第一审核人审核
             }
         }
@@ -492,6 +500,47 @@ public class TaskController {
                             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);
+                }
+            }
         }
         if (task.getExecutorId() == null) {
             //清空执行人
@@ -1812,5 +1861,13 @@ public class TaskController {
     }
 
 
+    //工作计划的通过或者驳回
+    //通过 type=true ,驳回 type=false
+    @RequestMapping("/taskPlanPassOrReject")
+    public HttpRespMsg taskPlanPassOrReject(Integer taskId, boolean type){
+        return taskService.taskPlanPassOrReject(taskId,type,request);
+    }
+
+
 }
 

+ 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
      */

+ 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;
 
     //模块菜单的访问权限

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

@@ -74,6 +74,22 @@ public interface ProjectMapper extends BaseMapper<Project> {
     List<Map> getTaskPlanByProject(@Param("projectIds") List<Integer> projectIds, @Param("startDate") String startDate,
                                 @Param("endDate") String endDate, @Param("companyId") Integer companyId);
 
+    List<Map> getTaskPlanByGeneralMemb(@Param("userIds") List<String> userIds, @Param("startDate") String startDate,
+                                @Param("endDate") String endDate, @Param("companyId") Integer companyId,@Param("creatorId") String creatorId);
+
+    List<Map> getTaskPlanByProManager(@Param("userIds") List<String> userIds, @Param("startDate") String startDate,
+                                      @Param("endDate") String endDate, @Param("companyId") Integer companyId,@Param("managerId") String managerId);
+    List<Map> getTaskPlanByAreaManager(@Param("userIds") List<String> userIds, @Param("startDate") String startDate,
+                                      @Param("endDate") String endDate, @Param("companyId") Integer companyId,@Param("managerId") String managerId);
+
+    List<Map> getTaskPlanByProjectGeneralMemb(@Param("projectIds") List<Integer> projectIds, @Param("startDate") String startDate,
+                                   @Param("endDate") String endDate, @Param("companyId") Integer companyId,@Param("creatorId") String creatorId);
+
+    List<Map> getTaskPlanByProjectManager(@Param("projectIds") List<Integer> projectIds, @Param("startDate") String startDate,
+                                              @Param("endDate") String endDate, @Param("companyId") Integer companyId,@Param("managerId") String managerId);
+    List<Map> getTaskPlanByProjectAreaManager(@Param("projectIds") List<Integer> projectIds, @Param("startDate") String startDate,
+                                          @Param("endDate") String endDate, @Param("companyId") Integer companyId,@Param("managerId") String managerId);
+
     List<ProjectWithStage> selectWithStage(Integer companyId, Integer startIndex, Integer endIndex, Integer projectId,String inchargerId,String startDate,String endDate);
 
     List<Map<String, Object>> getTimeCostReport(@Param("companyId") Integer companyId, @Param("startDate") String startDate, @Param("endDate") String endDate,
@@ -238,4 +254,7 @@ 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);
+
 }

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

@@ -326,4 +326,8 @@ public interface ProjectService extends IService<Project> {
     HttpRespMsg transferProjectReviwer(String userId, String targetAuditorId);
 
     HttpRespMsg getProjectByLeader(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, 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);
 }

+ 215 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -4759,6 +4759,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         //根据人员权限来获取,
         String token = request.getHeader("TOKEN");
         User user = userMapper.selectById(token);
+
         List<String> userIds = new ArrayList<>();
         List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "查看全部项目");
         List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", user.getCompanyId()));
@@ -4814,6 +4815,41 @@ 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<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");
+                        List<Map> taskPlanByGeneralMemb = projectMapper.getTaskPlanByGeneralMemb(collectUserIdList, startDate, endDate, user.getCompanyId(), user.getId());
+                        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<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");
+                        List<Map> getTaskPlanByProManager = projectMapper.getTaskPlanByProManager(collectUserIdList, startDate, endDate, user.getCompanyId(),user.getId());
+                        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");
+                        List<Map> getTaskPlanByProManager = projectMapper.getTaskPlanByAreaManager(collectUserIdList, startDate, endDate, user.getCompanyId(),user.getId());
+                        ganttData.addAll(getTaskPlanByProManager);
+                    }
+                }
                 QueryWrapper<LeaveSheet> lsQueryWrapper=new QueryWrapper();
                 lsQueryWrapper.in("owner_id", userIds);
                 if (startDate != null && endDate != null) {
@@ -5003,6 +5039,35 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     }
                 }
                 ganttData = projectMapper.getTaskPlanByProject(projectIds, 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<Map> taskPlanByGeneralMemb = projectMapper.getTaskPlanByProjectGeneralMemb(projectIdList,startDate ,endDate, user.getCompanyId(),user.getId());
+                        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());
+                        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());
+                        ganttData.addAll(taskPlanByProjectAreaManager);
+                    }
+                }
                 QueryWrapper<BusinessTrip> btQueryWrapper =new QueryWrapper<>();
                 QueryWrapper<BustripProject> bpQueryWrapper =new QueryWrapper<>();
                 btQueryWrapper.in("owner_id", userIds);
@@ -5058,7 +5123,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");
@@ -5115,7 +5180,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     curItem.setObjType(2);
                     itemList.add(curItem);
                     lastItemId = userId;
-                } else {
+                }
+                else {
                     if (!projectId.equals(lastItemId)) {
                         //抽取父级对象,项目名称
                         GanttDataItem parent = new GanttDataItem();
@@ -13512,6 +13578,153 @@ 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) map.get("planHours");
+            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, 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();
+        List<Map<String, Object>> list = projectMapper.getFTETaskPlanData(user.getCompanyId(), startDate, endDate, null, null, area, user.getId(), 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?"":list.get(i).get("planHours").toString());
+            item.add(list.get(i).get("FTE")==null?"":list.get(i).get("FTE").toString());
+        }
+
+        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}")
@@ -1074,6 +1077,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);

+ 21 - 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;
+        }
+
     }
 
     //获取用户信息

+ 154 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml

@@ -2712,5 +2712,159 @@
             </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
+        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.creater_id=#{creatorId}
+        AND project.`status` = 1
+        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
+        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
+        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
+        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
+        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,
+        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
+        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>
+        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.creater_id=#{creatorId}
+        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,
+        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
+        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>
+        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,
+        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
+        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>
+        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
+        <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>
 
 </mapper>