Sfoglia il codice sorgente

Merge branch 'master' of http://47.100.37.243:10080/wutt/manHourHousekeeper

ggooalice 2 anni fa
parent
commit
a7826dd2ab
36 ha cambiato i file con 918 aggiunte e 335 eliminazioni
  1. 10 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/AuthRedirectController.java
  2. 3 5
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/DingDingController.java
  3. 15 8
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java
  4. 260 194
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java
  5. 1 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/ProjectVO.java
  6. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectMapper.java
  7. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/TaskMapper.java
  8. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/DingDingService.java
  9. 8 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectService.java
  10. 10 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DepartmentServiceImpl.java
  11. 12 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java
  12. 207 56
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  13. 15 5
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  14. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  15. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java
  16. 66 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml
  17. 6 3
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml
  18. 6 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TaskMapper.xml
  19. 2 0
      fhKeeper/formulahousekeeper/timesheet/src/main.js
  20. 4 0
      fhKeeper/formulahousekeeper/timesheet/src/permissions.js
  21. 112 2
      fhKeeper/formulahousekeeper/timesheet/src/views/awayOffice/awayOffice.vue
  22. 112 17
      fhKeeper/formulahousekeeper/timesheet/src/views/corpreport/list.vue
  23. 2 1
      fhKeeper/formulahousekeeper/timesheet/src/views/expense/expense.vue
  24. 2 1
      fhKeeper/formulahousekeeper/timesheet/src/views/leave/list.vue
  25. 2 1
      fhKeeper/formulahousekeeper/timesheet/src/views/project/cost.vue
  26. 2 1
      fhKeeper/formulahousekeeper/timesheet/src/views/project/custom_data.vue
  27. 2 1
      fhKeeper/formulahousekeeper/timesheet/src/views/project/fileCenter.vue
  28. 2 1
      fhKeeper/formulahousekeeper/timesheet/src/views/project/finance.vue
  29. 15 2
      fhKeeper/formulahousekeeper/timesheet/src/views/project/info.vue
  30. 6 2
      fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue
  31. 2 2
      fhKeeper/formulahousekeeper/timesheet/src/views/project/projectInside.vue
  32. 13 6
      fhKeeper/formulahousekeeper/timesheet/src/views/task/list.vue
  33. 4 2
      fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue
  34. 2 1
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list.vue
  35. 5 1
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/error/index.vue
  36. 2 1
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/project/index.vue

+ 10 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/AuthRedirectController.java

@@ -65,16 +65,23 @@ public class AuthRedirectController {
         } else {
             state = 1;
         }
-        System.out.println("code="+code);
+        System.out.println("企微用户登录 code="+code);
         String url = WeiXinCorpController.GET_CORP_USERINFO_URL.replace("SUITE_ACCESS_TOKEN", getSuiteAccessToken()).replace("CODE", code);
         String forObject = this.restTemplate.getForObject(url, String.class);
         JSONObject obj = JSONObject.parseObject(forObject);
+        System.out.println("企微身份:"+obj.toString());
         String wxUserId = obj.getString("UserId");
-        List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("corpwx_userid", wxUserId).eq("is_active", 1));
+
+        List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("corpwx_userid", wxUserId));
         if (userList.size() > 0) {
             //该用户已存在
             User curUser = userList.get(0);
-            reqParam.put("userId", curUser.getId());
+            if (curUser.getIsActive() == 1) {
+                reqParam.put("userId", curUser.getId());
+            } else {
+                //提示账号已停用
+                reqParam.put("errorMsg", "您的账号已停用,无法登录");
+            }
         }
         reqParam.put("hasTriedAutoLogin", 1);
         String redirecUrl = null;

+ 3 - 5
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/DingDingController.java

@@ -219,10 +219,8 @@ public class DingDingController {
                                         } else {
                                             System.out.println("===未授权启用===");
                                         }
-
                                     } else {
                                         System.out.println("==Push 推送授权类型 ==="+syncAction);
-
                                     }
                                 } else if (bizType == 7) {
                                     JSONObject biz_data = JSONObject.parseObject(bizItem.getString("biz_data"));
@@ -366,7 +364,7 @@ public class DingDingController {
 //    }
 
     @RequestMapping("/syncUserWorkData")
-    public HttpRespMsg syncUserWorkData(Integer companyId, String startDate, String endDate) {
+    public HttpRespMsg syncUserWorkData(Integer companyId, String userId, String startDate, String endDate) {
         CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId).isNotNull("inner_appkey"));
         HttpRespMsg msg = new HttpRespMsg();
         if (startDate.compareTo(endDate) > 0) {
@@ -380,7 +378,7 @@ public class DingDingController {
                 return msg;
             } else {
                 long t1 = System.currentTimeMillis();
-                dingDingService.syncUserWorkData(dingding, startDate, endDate, true);
+                dingDingService.syncUserWorkData(dingding, userId, startDate, endDate, true);
                 long t2 = System.currentTimeMillis();
                 System.out.println("总共耗时:"+(t2-t1)+"ms");
             }
@@ -397,7 +395,7 @@ public class DingDingController {
             } else {
                 long t1 = System.currentTimeMillis();
                 for (int i=0;i<dingdingList.size(); i++) {
-                    dingDingService.syncUserWorkData(dingdingList.get(i), startDate, endDate, true);
+                    dingDingService.syncUserWorkData(dingdingList.get(i), userId, startDate, endDate, true);
                 }
                 long t2 = System.currentTimeMillis();
                 System.out.println("总共耗时:"+(t2-t1)+"ms");

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

@@ -325,8 +325,8 @@ public class ProjectController {
 
     //分页查询项目任务报表
     @RequestMapping("/getProjectTask")
-    public HttpRespMsg getProjectTask(@RequestParam Integer pageIndex, @RequestParam Integer pageSize, Integer projectId) {
-        return projectService.getProjectTask(pageIndex, pageSize, projectId, request);
+    public HttpRespMsg getProjectTask(@RequestParam Integer pageIndex, @RequestParam Integer pageSize, Integer projectId,Integer taskType) {
+        return projectService.getProjectTask(pageIndex, pageSize, projectId, request,taskType);
     }
 
     //分页查询项目各个阶段的汇总工时成本
@@ -340,8 +340,8 @@ public class ProjectController {
     }
     //导出项目任务报表
     @RequestMapping("/exportProjectTask")
-    public HttpRespMsg exportProjectTask() {
-        return projectService.exportProjectTask(request);
+    public HttpRespMsg exportProjectTask(Integer taskType) {
+        return projectService.exportProjectTask(request,taskType);
     }
 
     //分页查询项目成本报表
@@ -565,13 +565,16 @@ public class ProjectController {
         List<ProviderCategory> providerCategoryList = providerCategoryMapper.selectList(new QueryWrapper<ProviderCategory>().eq("company_id", companyId));
         List<String> collect = providerCategoryList.stream().distinct().map(pc -> pc.getProviderCategoryName()).collect(Collectors.toList());
         TimeType timeType = timeTypeMapper.selectById(companyId);
+        if(timeType.getMainProjectState()==1){
+            heads.add("主项目");
+        }
         heads.add("项目编号");
-        heads.add("项目分类");
+        if(timeType.getMainProjectState()!=1){
+            heads.add("项目分类");
+        }
         heads.add("是否为公共项目");
         heads.add("项目名称");
-        if(timeType.getMainProjectState()==1){
-            heads.add("主项目");
-        }else {
+        if(timeType.getMainProjectState()!=1){
             heads.add("子项目(多个用,隔开)");
         }
         heads.add("参与人");
@@ -811,5 +814,9 @@ public class ProjectController {
     public HttpRespMsg getUserWorkingTimeStatic(String startDate,String endDate,Integer pageIndex,Integer pageSize,String userId,Integer departmentId){
         return projectService.getUserWorkingTimeStatic(startDate,endDate,pageIndex,pageSize,request,userId,departmentId);
     }
+    @RequestMapping("/exportUserWorkingTimeStatic")
+    public HttpRespMsg exportUserWorkingTimeStatic(String startDate,String endDate,String userId,Integer departmentId){
+        return projectService.exportUserWorkingTimeStatic(startDate,endDate,request,userId,departmentId);
+    }
 }
 

+ 260 - 194
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java

@@ -423,42 +423,45 @@ public class WeiXinCorpController {
                             } else {
                                 curUserWXDeptid = Integer.valueOf(department);
                             }
-                        } else {
+                        } else if (jsonObject.has("MainDepartment")) {
                             //取主部门
                             curUserWXDeptid = jsonObject.getInt("MainDepartment");
+                        } else {
+                            System.out.println("部门未变更,不处理");
                         }
-
-                        JSONObject userObj = remoteGetUserDetail(remoteCorpConcactAccessToken, corpWxUserId, curUserWXDeptid, curCorpAccessToken);
-                        if (userObj != null) {
-                            //成功获取到通讯录的个人详情
-                            JSONArray department = userObj.getJSONArray("department");
-                            curUserWXDeptid = getMaxDeptIdFromArray(department);
-                            Department sysDept = departmentMapper.selectOne(new QueryWrapper<Department>().eq("company_id", companyId).eq("corpwx_deptid", curUserWXDeptid));
-
-                            User user = userMapper.selectOne(new QueryWrapper<User>().eq("company_id", companyId).eq("corpwx_userid", corpWxUserId));
-                            User changeUser = new User();
-                            changeUser.setId(user.getId());
-
-                            boolean change = false;
-                            //姓名变化
-                            if (!user.getName().equals(userObj.getString("name"))) {
-                                changeUser.setName(userObj.getString("name"));
-                                change = true;
-                            }
-                            if (sysDept != null && !user.getDepartmentId().equals(sysDept.getDepartmentId())) {
-                                changeUser.setDepartmentId(sysDept.getDepartmentId());
-                                change = true;
-                            }
-                            if (userObj.containsKey("direct_leader") && userObj.getJSONArray("direct_leader").size() > 0) {
-                                String directLeader = userObj.getJSONArray("direct_leader").getString(0);
-                                User leader = userMapper.selectOne(new QueryWrapper<User>().eq("company_id", companyId).eq("corpwx_userid", directLeader));
-                                if (leader != null && !leader.equals(user.getSuperiorId())) {
-                                    changeUser.setSuperiorId(leader.getId());
+                        if (curUserWXDeptid != 0) {
+                            JSONObject userObj = remoteGetUserDetail(remoteCorpConcactAccessToken, corpWxUserId, curUserWXDeptid, curCorpAccessToken);
+                            if (userObj != null) {
+                                //成功获取到通讯录的个人详情
+                                JSONArray department = userObj.getJSONArray("department");
+                                curUserWXDeptid = getMaxDeptIdFromArray(department);
+                                Department sysDept = departmentMapper.selectOne(new QueryWrapper<Department>().eq("company_id", companyId).eq("corpwx_deptid", curUserWXDeptid));
+
+                                User user = userMapper.selectOne(new QueryWrapper<User>().eq("company_id", companyId).eq("corpwx_userid", corpWxUserId));
+                                User changeUser = new User();
+                                changeUser.setId(user.getId());
+
+                                boolean change = false;
+                                //姓名变化
+                                if (!user.getName().equals(userObj.getString("name"))) {
+                                    changeUser.setName(userObj.getString("name"));
                                     change = true;
                                 }
-                            }
-                            if (change) {
-                                userMapper.updateById(changeUser);
+                                if (sysDept != null && !user.getDepartmentId().equals(sysDept.getDepartmentId())) {
+                                    changeUser.setDepartmentId(sysDept.getDepartmentId());
+                                    change = true;
+                                }
+                                if (userObj.containsKey("direct_leader") && userObj.getJSONArray("direct_leader").size() > 0) {
+                                    String directLeader = userObj.getJSONArray("direct_leader").getString(0);
+                                    User leader = userMapper.selectOne(new QueryWrapper<User>().eq("company_id", companyId).eq("corpwx_userid", directLeader));
+                                    if (leader != null && !leader.equals(user.getSuperiorId())) {
+                                        changeUser.setSuperiorId(leader.getId());
+                                        change = true;
+                                    }
+                                }
+                                if (change) {
+                                    userMapper.updateById(changeUser);
+                                }
                             }
                         }
                     }
@@ -487,6 +490,45 @@ public class WeiXinCorpController {
                             departmentMapper.insert(department);
                         }
                     }
+                } else if ("update_party".equals(changeType)) {
+                    //变更部门,父部门变化
+                    String corpId = jsonObject.getString("AuthCorpId");
+                    Integer deptId = jsonObject.getInt("Id");
+                    Integer parentDeptId = jsonObject.getInt("ParentId");
+                    WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectById(corpId);
+                    if (wxCorpInfo != null && !StringUtils.isEmpty(wxCorpInfo.getContactSecret())) {
+                        if (parentDeptId != null) {
+                            //发生父部门的结构变化了
+                            Department department = departmentMapper.selectOne(new QueryWrapper<Department>().eq("company_id", wxCorpInfo.getCompanyId()).eq("corpwx_deptid", deptId));
+                            if (department != null) {
+                                Department parentDept = departmentMapper.selectOne(new QueryWrapper<Department>().eq("company_id", wxCorpInfo.getCompanyId()).eq("corpwx_deptid", parentDeptId));
+                                if (parentDept != null) {
+                                    department.setSuperiorId(parentDept.getDepartmentId());
+                                    departmentMapper.updateById(department);
+                                }
+                            }
+                        }
+                        if (jsonObject.getString("Name") != null) {
+                            //发生了部门名称变化
+                            System.out.println("部门名称变化了,请处理==企业微信部门id="+deptId);
+                            String remoteCorpConcactAccessToken = getRemoteCorpConcactAccessToken(wxCorpInfo);
+                            String url = TRANSMIT_SERVER_GET_DEPTDETAIL.replace("ACCESS_TOKEN", remoteCorpConcactAccessToken).replace("DEPTID", ""+deptId);
+                            String result = restTemplate.getForObject(url, String.class);
+                            System.out.println("部门返回数据:"+result);
+                            JSONObject resultObj = JSONObject.parseObject(JSONObject.parseObject(result).getString("data"));
+                            if (resultObj.getInteger("errcode") == 0) {
+                                JSONObject serverDept = resultObj.getJSONObject("department");
+                                String name = serverDept.getString("name");
+                                Department department = departmentMapper.selectOne(new QueryWrapper<Department>().eq("company_id", wxCorpInfo.getCompanyId()).eq("corpwx_deptid", deptId));
+                                department.setDepartmentName(name);
+                                departmentMapper.updateById(department);
+                            } else {
+                                System.err.println("同步获取部门详情报错:"+resultObj.toString());
+                            }
+                        }
+
+                    }
+
                 }
             }
         } catch (Exception e) {
@@ -1342,7 +1384,7 @@ public class WeiXinCorpController {
 
     //新版本, 由于是第三方服务商,需要先获取授权范围内的组织架构(没有部门和人员的名称),再从中转服务器去获取名称
     @RequestMapping("/getCorpMembs")
-    public HttpRespMsg getCorpMembs(String corpId) {
+    public HttpRespMsg getCorpMembs(String corpId, @RequestParam(required = false, defaultValue = "1") Integer syncMembs) {
         System.out.println("============新版getCorpMembs=========");
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectById(corpId);
         HttpRespMsg msg = new HttpRespMsg();
@@ -1370,93 +1412,97 @@ public class WeiXinCorpController {
         }
         int companyId = company.getId();
         //获取公司根部门人员,也就是没有分配部门的人员
+        List<JSONObject> hasDirectLdMembs = new ArrayList<>();
+        SysRole defaultRole = sysRoleMapper.selectOne(
+                new QueryWrapper<SysRole>().eq("company_id", companyId).eq("is_default", 1));
+
         int companyRootDeptId = 1;
-        JSONArray unAssignedUserList = getDeptUserInfo(curCorpAccessToken, companyRootDeptId);
-        //获取远程的带姓名的详情,通过企业通讯录的token获取
-        JSONArray remoteUnAUserList = null;
-        if (unAssignedUserList.size() > 0) {
-            remoteUnAUserList = remoteGetDeptUserDetail(corpContactAccessToken, companyRootDeptId);
-            //做id转化
-            List<String> userIds = new ArrayList<>();
-            for (int i=0;i<remoteUnAUserList.size(); i++) {
-                userIds.add(remoteUnAUserList.getJSONObject(i).getString("userid"));
-            }
-            try {
-                JSONArray array = convertUserIdToOpenUserId(curCorpAccessToken, userIds);
-                for (int i=0;i<array.size(); i++) {
-                    JSONObject jsonObject = array.getJSONObject(i);
-                    String userid = jsonObject.getString("userid");
-                    String openUserid = jsonObject.getString("open_userid");
-                    //替换userid
-                    for (int m=0;m<remoteUnAUserList.size(); m++) {
-                        JSONObject remoteUser = remoteUnAUserList.getJSONObject(m);
-                        if (remoteUser.getString("userid").equals(userid)) {
-                            remoteUser.put("userid", openUserid);
-                            break;
+        if (syncMembs == 1) {
+            JSONArray unAssignedUserList = getDeptUserInfo(curCorpAccessToken, companyRootDeptId);
+            //获取远程的带姓名的详情,通过企业通讯录的token获取
+            JSONArray remoteUnAUserList = null;
+            if (unAssignedUserList.size() > 0) {
+                remoteUnAUserList = remoteGetDeptUserDetail(corpContactAccessToken, companyRootDeptId);
+                //做id转化
+                List<String> userIds = new ArrayList<>();
+                for (int i=0;i<remoteUnAUserList.size(); i++) {
+                    userIds.add(remoteUnAUserList.getJSONObject(i).getString("userid"));
+                }
+                try {
+                    JSONArray array = convertUserIdToOpenUserId(curCorpAccessToken, userIds);
+                    for (int i=0;i<array.size(); i++) {
+                        JSONObject jsonObject = array.getJSONObject(i);
+                        String userid = jsonObject.getString("userid");
+                        String openUserid = jsonObject.getString("open_userid");
+                        //替换userid
+                        for (int m=0;m<remoteUnAUserList.size(); m++) {
+                            JSONObject remoteUser = remoteUnAUserList.getJSONObject(m);
+                            if (remoteUser.getString("userid").equals(userid)) {
+                                remoteUser.put("userid", openUserid);
+                                break;
+                            }
                         }
                     }
+                } catch (Exception exception) {
+                    exception.printStackTrace();
+                    msg.setError("同步失败:"+exception.getMessage());
+                    return msg;
                 }
-            } catch (Exception exception) {
-                exception.printStackTrace();
-                msg.setError("同步失败:"+exception.getMessage());
-                return msg;
             }
-        }
 
-        SysRole defaultRole = sysRoleMapper.selectOne(
-                new QueryWrapper<SysRole>().eq("company_id", companyId).eq("is_default", 1));
-        List<JSONObject> hasDirectLdMembs = new ArrayList<>();
-        for (int m=0;m<unAssignedUserList.size(); m++) {
-            JSONObject userJson = unAssignedUserList.getJSONObject(m);
-            String curUserid = userJson.getString("userid");
-            //跳过非激活状态的员工
-            if (userJson.getInteger("status") != 1) continue;
-            System.out.println("userid="+curUserid+", name=" + userJson.getString("name")+", department="+userJson.getJSONArray("department"));
-            if (userJson.getJSONArray("direct_leader").size() > 0) {
-                hasDirectLdMembs.add(userJson);
-            }
-            //不存在的人员, 进行插入
-            User user = new User();
 
-            user.setId(SnowFlake.nextId()+"")
-                    .setRoleId(defaultRole.getId())//默认普通员工
-                    .setRoleName(defaultRole.getRolename())
-                    .setCompanyId(companyId)
-                    .setName(userJson.getString("name"))
-                    .setPhone(userJson.getString("mobile"))
-                    .setCorpwxUserid(curUserid)
-                    .setColor(ColorUtil.randomColor());
-            //获取姓名
-            if (remoteUnAUserList != null) {
-                for (int i=0;i<remoteUnAUserList.size(); i++) {
-                    JSONObject remoteUserJson = remoteUnAUserList.getJSONObject(i);
-                    if (remoteUserJson.getString("userid").equals(curUserid)) {
-                        user.setName(remoteUserJson.getString("name"));
-                        break;
+            for (int m=0;m<unAssignedUserList.size(); m++) {
+                JSONObject userJson = unAssignedUserList.getJSONObject(m);
+                String curUserid = userJson.getString("userid");
+                //跳过非激活状态的员工
+                if (userJson.getInteger("status") != 1) continue;
+                System.out.println("userid="+curUserid+", name=" + userJson.getString("name")+", department="+userJson.getJSONArray("department"));
+                if (userJson.getJSONArray("direct_leader").size() > 0) {
+                    hasDirectLdMembs.add(userJson);
+                }
+                //不存在的人员, 进行插入
+                User user = new User();
+
+                user.setId(SnowFlake.nextId()+"")
+                        .setRoleId(defaultRole.getId())//默认普通员工
+                        .setRoleName(defaultRole.getRolename())
+                        .setCompanyId(companyId)
+                        .setName(userJson.getString("name"))
+                        .setPhone(userJson.getString("mobile"))
+                        .setCorpwxUserid(curUserid)
+                        .setColor(ColorUtil.randomColor());
+                //获取姓名
+                if (remoteUnAUserList != null) {
+                    for (int i=0;i<remoteUnAUserList.size(); i++) {
+                        JSONObject remoteUserJson = remoteUnAUserList.getJSONObject(i);
+                        if (remoteUserJson.getString("userid").equals(curUserid)) {
+                            user.setName(remoteUserJson.getString("name"));
+                            break;
+                        }
                     }
                 }
-            }
-            //检查用户是否已经存在
-            User oldUser = userMapper.selectOne(new QueryWrapper<User>().select("id, name, role_name").eq("corpwx_userid", curUserid).eq("company_id", companyId));
-
-            if (oldUser == null) {
-                //先检查姓名+手机号是否存在,如果存在,则更新corpwxId
-                User sameNameUser = userMapper.selectOne(new QueryWrapper<User>().eq("name", user.getName()).eq("phone", user.getPhone()).eq("company_id", companyId).isNull("corpwx_userid").last("limit 1"));
-                if (sameNameUser != null) {
-                    User upUser = new User();
-                    upUser.setId(sameNameUser.getId());
-                    upUser.setCorpwxUserid(user.getCorpwxUserid());
-                    userMapper.updateById(upUser);
+                //检查用户是否已经存在
+                User oldUser = userMapper.selectOne(new QueryWrapper<User>().select("id, name, role_name").eq("corpwx_userid", curUserid).eq("company_id", companyId));
+
+                if (oldUser == null) {
+                    //先检查姓名+手机号是否存在,如果存在,则更新corpwxId
+                    User sameNameUser = userMapper.selectOne(new QueryWrapper<User>().eq("name", user.getName()).eq("phone", user.getPhone()).eq("company_id", companyId).isNull("corpwx_userid").last("limit 1"));
+                    if (sameNameUser != null) {
+                        User upUser = new User();
+                        upUser.setId(sameNameUser.getId());
+                        upUser.setCorpwxUserid(user.getCorpwxUserid());
+                        userMapper.updateById(upUser);
+                    } else {
+                        userMapper.insert(user);
+                    }
                 } else {
-                    userMapper.insert(user);
-                }
-            } else {
-                if (oldUser.getRoleName().equals("超级管理员") && !oldUser.getName().equals(user.getName())) {
-                    //姓名不一致,需要更新
-                    System.out.println("===更新超管姓名==="+user.getName());
-                    user.setId(oldUser.getId());
-                    oldUser.setName(user.getName());
-                    userMapper.updateById(oldUser);
+                    if (oldUser.getRoleName().equals("超级管理员") && !oldUser.getName().equals(user.getName())) {
+                        //姓名不一致,需要更新
+                        System.out.println("===更新超管姓名==="+user.getName());
+                        user.setId(oldUser.getId());
+                        oldUser.setName(user.getName());
+                        userMapper.updateById(oldUser);
+                    }
                 }
             }
         }
@@ -1504,106 +1550,126 @@ public class WeiXinCorpController {
 //                    }
                 }
             } else {
+                //比较是否有更新
+                boolean hasChange = false;
+                if (!oldDept.getDepartmentName().equals(department.getDepartmentName())) {
+                    oldDept.setDepartmentName(department.getDepartmentName());
+                    hasChange = true;
+                }
+                if (!department.getCorpwxDeptpid().equals(oldDept.getCorpwxDeptpid())) {
+                    oldDept.setCorpwxDeptpid(department.getCorpwxDeptpid());
+                    Department newParentDept = departmentMapper.selectOne(new QueryWrapper<Department>().eq("company_id", companyId).eq("corpwx_deptid", oldDept.getCorpwxDeptpid()));
+                    if (newParentDept != null) {
+                        oldDept.setSuperiorId(newParentDept.getDepartmentId());
+                    }
+                    hasChange = true;
+                }
+                if (hasChange) {
+                    System.out.println("更新部门结构=="+oldDept.getDepartmentName());
+                    departmentMapper.updateById(oldDept);
+                }
                 department = oldDept;
             }
 
 //            sysDeptList.add(department);
             deptObjJSONArray.getJSONObject(i).put("sys_dept_id", department.getDepartmentId());
             Integer departmentId = department.getDepartmentId();
-            JSONArray userList = getDeptUserInfo(curCorpAccessToken, deptId);
-            JSONArray remoteDeptUserList = null;
-            if (userList.size() > 0) {
-                remoteDeptUserList = remoteGetDeptUserDetail(corpContactAccessToken, deptId);
-                //做id转化
-                List<String> userIds = new ArrayList<>();
-                for (int p=0;p<remoteDeptUserList.size(); p++) {
-                    userIds.add(remoteDeptUserList.getJSONObject(p).getString("userid"));
-                }
-                try {
-                    JSONArray array = convertUserIdToOpenUserId(curCorpAccessToken, userIds);
-                    for (int w=0;w<array.size(); w++) {
-                        JSONObject jsonObject = array.getJSONObject(w);
-                        String userid = jsonObject.getString("userid");
-                        String openUserid = jsonObject.getString("open_userid");
-                        //替换userid
-                        for (int m=0;m<remoteDeptUserList.size(); m++) {
-                            JSONObject remoteUser = remoteDeptUserList.getJSONObject(m);
-                            if (remoteUser.getString("userid").equals(userid)) {
-                                remoteUser.put("userid", openUserid);
-                                break;
+            if (syncMembs == 1) {
+                JSONArray userList = getDeptUserInfo(curCorpAccessToken, deptId);
+                JSONArray remoteDeptUserList = null;
+                if (userList.size() > 0) {
+                    remoteDeptUserList = remoteGetDeptUserDetail(corpContactAccessToken, deptId);
+                    //做id转化
+                    List<String> userIds = new ArrayList<>();
+                    for (int p=0;p<remoteDeptUserList.size(); p++) {
+                        userIds.add(remoteDeptUserList.getJSONObject(p).getString("userid"));
+                    }
+                    try {
+                        JSONArray array = convertUserIdToOpenUserId(curCorpAccessToken, userIds);
+                        for (int w=0;w<array.size(); w++) {
+                            JSONObject jsonObject = array.getJSONObject(w);
+                            String userid = jsonObject.getString("userid");
+                            String openUserid = jsonObject.getString("open_userid");
+                            //替换userid
+                            for (int m=0;m<remoteDeptUserList.size(); m++) {
+                                JSONObject remoteUser = remoteDeptUserList.getJSONObject(m);
+                                if (remoteUser.getString("userid").equals(userid)) {
+                                    remoteUser.put("userid", openUserid);
+                                    break;
+                                }
                             }
                         }
+                    } catch (Exception exception) {
+                        exception.printStackTrace();
+                        msg.setError("同步失败:"+exception.getMessage());
+                        return msg;
                     }
-                } catch (Exception exception) {
-                    exception.printStackTrace();
-                    msg.setError("同步失败:"+exception.getMessage());
-                    return msg;
                 }
-            }
 
-            for (int m=0;m<userList.size(); m++) {
-                JSONObject userJson = userList.getJSONObject(m);
-                String curUserid = userJson.getString("userid");
-                if (userJson.getInteger("status") != 1) continue;
-                log.info("userid="+curUserid+", name=" + userJson.getString("name")+", mobile="+userJson.getString("mobile"));
-                if (userJson.getJSONArray("direct_leader").size() > 0) {
-                    hasDirectLdMembs.add(userJson);
-                }
-                //不存在的人员, 进行插入
-                User user = new User();
-
-                user.setId(SnowFlake.nextId()+"")
-                        .setRoleId(defaultRole.getId())
-                        .setRoleName(defaultRole.getRolename())
-                        .setCompanyId(companyId)
-                        .setDepartmentId(departmentId)
-                        .setPhone(userJson.getString("mobile"))
-                        .setName(userJson.getString("name"))
-                        .setCorpwxUserid(curUserid)
-                        .setColor(ColorUtil.randomColor());
-                //获取姓名
-                if (remoteDeptUserList != null) {
-                    for (int t=0;t<remoteDeptUserList.size(); t++) {
-                        JSONObject remoteUserJson = remoteDeptUserList.getJSONObject(t);
-                        if (remoteUserJson.getString("userid").equals(curUserid)) {
-                            //匹配到了。设置姓名
-                            System.out.println("远程的用户匹配到了:"+remoteUserJson.getString("name"));
-                            user.setName(remoteUserJson.getString("name"));
-                            break;
+                for (int m=0;m<userList.size(); m++) {
+                    JSONObject userJson = userList.getJSONObject(m);
+                    String curUserid = userJson.getString("userid");
+                    if (userJson.getInteger("status") != 1) continue;
+                    log.info("userid="+curUserid+", name=" + userJson.getString("name")+", mobile="+userJson.getString("mobile"));
+                    if (userJson.getJSONArray("direct_leader").size() > 0) {
+                        hasDirectLdMembs.add(userJson);
+                    }
+                    //不存在的人员, 进行插入
+                    User user = new User();
+
+                    user.setId(SnowFlake.nextId()+"")
+                            .setRoleId(defaultRole.getId())
+                            .setRoleName(defaultRole.getRolename())
+                            .setCompanyId(companyId)
+                            .setDepartmentId(departmentId)
+                            .setPhone(userJson.getString("mobile"))
+                            .setName(userJson.getString("name"))
+                            .setCorpwxUserid(curUserid)
+                            .setColor(ColorUtil.randomColor());
+                    //获取姓名
+                    if (remoteDeptUserList != null) {
+                        for (int t=0;t<remoteDeptUserList.size(); t++) {
+                            JSONObject remoteUserJson = remoteDeptUserList.getJSONObject(t);
+                            if (remoteUserJson.getString("userid").equals(curUserid)) {
+                                //匹配到了。设置姓名
+                                System.out.println("远程的用户匹配到了:"+remoteUserJson.getString("name"));
+                                user.setName(remoteUserJson.getString("name"));
+                                break;
+                            }
                         }
                     }
-                }
-                //检查用户是否已经存在
-                User oldUser = userMapper.selectOne(new QueryWrapper<User>().eq("corpwx_userid", curUserid).eq("company_id", companyId));
-                if (oldUser == null) {
-                    //先检查姓名是否存在,如果存在,则更新corpwxId
-                    User sameNameUser = userMapper.selectOne(new QueryWrapper<User>().eq("name", user.getName()).eq("phone", user.getPhone()).eq("company_id", companyId).isNull("corpwx_userid").last("limit 1"));
-                    if (sameNameUser != null) {
-                        User upUser = new User();
-                        upUser.setId(sameNameUser.getId());
-                        upUser.setCorpwxUserid(user.getCorpwxUserid());
-                        userMapper.updateById(upUser);
+                    //检查用户是否已经存在
+                    User oldUser = userMapper.selectOne(new QueryWrapper<User>().eq("corpwx_userid", curUserid).eq("company_id", companyId));
+                    if (oldUser == null) {
+                        //先检查姓名是否存在,如果存在,则更新corpwxId
+                        User sameNameUser = userMapper.selectOne(new QueryWrapper<User>().eq("name", user.getName()).eq("phone", user.getPhone()).eq("company_id", companyId).isNull("corpwx_userid").last("limit 1"));
+                        if (sameNameUser != null) {
+                            User upUser = new User();
+                            upUser.setId(sameNameUser.getId());
+                            upUser.setCorpwxUserid(user.getCorpwxUserid());
+                            userMapper.updateById(upUser);
+                        } else {
+                            //姓名也不存在,则插入新记录
+                            userMapper.insert(user);
+                        }
                     } else {
-                        //姓名也不存在,则插入新记录
-                        userMapper.insert(user);
-                    }
-                } else {
-                    boolean shouldUpdate = false;
-                    if (oldUser.getRoleName().equals("超级管理员") && !oldUser.getName().equals(user.getName())) {
-                        //姓名不一致,需要更新
-                        System.out.println("===更新超管姓名==="+user.getName());
-                        user.setId(oldUser.getId());
-                        oldUser.setName(user.getName());
-                        shouldUpdate = true;
-                    }
-                    if (!oldUser.getDepartmentId().equals(user.getDepartmentId())) {
-                        oldUser.setDepartmentId(user.getDepartmentId());
-                        shouldUpdate = true;
-                    }
-                    if (shouldUpdate) {
-                        userMapper.updateById(oldUser);
-                    }
+                        boolean shouldUpdate = false;
+                        if (oldUser.getRoleName().equals("超级管理员") && !oldUser.getName().equals(user.getName())) {
+                            //姓名不一致,需要更新
+                            System.out.println("===更新超管姓名==="+user.getName());
+                            user.setId(oldUser.getId());
+                            oldUser.setName(user.getName());
+                            shouldUpdate = true;
+                        }
+                        if (!oldUser.getDepartmentId().equals(user.getDepartmentId())) {
+                            oldUser.setDepartmentId(user.getDepartmentId());
+                            shouldUpdate = true;
+                        }
+                        if (shouldUpdate) {
+                            userMapper.updateById(oldUser);
+                        }
 
+                    }
                 }
             }
         }

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

@@ -16,5 +16,6 @@ public class ProjectVO extends Project {
     String inchargerName;
     String inchargerPhone;
     String statusName;
+    String projectMainName;
     List<Map<String,Object>> providerInfoList;
 }

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

@@ -104,7 +104,7 @@ public interface ProjectMapper extends BaseMapper<Project> {
     @Update("update project set status=4 where id=#{id}")
     void suspendProject(Integer id);
 
-    List<Map<String, Object>> getUserWorkingTimeStatic(String startDate, String endDate, Integer pageIndex, Integer pageSize, String userId, Integer departmentId, List<Integer> deptIds);
+    List<Map<String, Object>> getUserWorkingTimeStatic(Integer companyId,String startDate, String endDate, Integer start, Integer size, String userId, Integer departmentId, List<Integer> deptIds);
 
-    long findCountWithUserWorkingTime(String startDate, String endDate, Integer pageIndex, Integer pageSize, String userId, Integer departmentId, List<Integer> deptIds);
+    long findCountWithUserWorkingTime(Integer companyId,String startDate, String endDate, Integer start, Integer size, String userId, Integer departmentId, List<Integer> deptIds);
 }

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

@@ -31,9 +31,9 @@ public interface TaskMapper extends BaseMapper<Task> {
 
     List<TimeTask> getTaskWithWorktime(Integer projectId, Integer taskType);
 
-    List getProjectTask(Integer companyId, Integer pageStart, Integer pageSize, Integer projectId);
+    List getProjectTask(Integer companyId, Integer pageStart, Integer pageSize, Integer projectId,Integer taskType);
 
-    Integer getProjectTaskCount(Integer companyId, Integer projectId);
+    Integer getProjectTaskCount(Integer companyId, Integer projectId,Integer taskType);
 
     List getTaskWithProjectName(@Param(Constants.WRAPPER) Wrapper wrapper, Integer pageStart, Integer pageSize);
 

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

@@ -33,7 +33,7 @@ public interface DingDingService {
 
     void syncLeaveTime(Integer companyId, String userId, String startDate, String endDate);
 
-    void syncUserWorkData(CompanyDingding dingding, String startDate, String endDate, boolean showLog);
+    void syncUserWorkData(CompanyDingding dingding,String userId, String startDate, String endDate, boolean showLog);
 
     void getCorpSelfDefSmartReport(CompanyDingding dingding);
 

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

@@ -73,9 +73,9 @@ public interface ProjectService extends IService<Project> {
 
     HttpRespMsg exportProject(HttpServletRequest request);
 
-    HttpRespMsg getProjectTask(Integer pageIndex, Integer pageSize, Integer projectId, HttpServletRequest request);
+    HttpRespMsg getProjectTask(Integer pageIndex, Integer pageSize, Integer projectId, HttpServletRequest request,Integer taskType);
 
-    HttpRespMsg exportProjectTask(HttpServletRequest request);
+    HttpRespMsg exportProjectTask(HttpServletRequest request,Integer taskType);
 
     HttpRespMsg getAllProjectCost(Integer pageIndex, Integer pageSize, Integer projectId,HttpServletRequest request);
 
@@ -150,6 +150,10 @@ public interface ProjectService extends IService<Project> {
     HttpRespMsg batchSetParticipation(HttpServletRequest request,String projectIdArray , String userIds);
 
     HttpRespMsg suspendProject(Integer id);
-	HttpRespMsg getUserWorkingTimeStatic(String startDate, String endDate, Integer pageIndex, Integer pageSize, HttpServletRequest request,String userId,Integer departmentId);
 
-	HttpRespMsg batchDeleteProject(String projectIdArray, HttpServletRequest request);}
+    HttpRespMsg getUserWorkingTimeStatic(String startDate, String endDate, Integer pageIndex, Integer pageSize, HttpServletRequest request,String userId,Integer departmentId);
+
+    HttpRespMsg exportUserWorkingTimeStatic(String startDate, String endDate, HttpServletRequest request, String userId, Integer departmentId);
+
+    HttpRespMsg batchDeleteProject(String projectIdArray, HttpServletRequest request);
+}

+ 10 - 4
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DepartmentServiceImpl.java

@@ -306,6 +306,7 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
                     }
                 }else {
                     deptIds=new ArrayList<>();
+                    //是不是要加
                     deptIds.add(-1);
                 }
             }
@@ -315,13 +316,12 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
                 if (deptIds == null) {
                     //查看全公司的
                     queryWrapper.isNull("superior_id");
+                }else {
+                    queryWrapper.in("department_id",deptIds);
                 }
             } else {
                 queryWrapper.eq("superior_id", parentDeptId);
             }
-            if(deptIds != null){
-                queryWrapper.in("department_id",deptIds);
-            }
             //获取第一级部门
             System.out.println(deptIds);
             List<Department> masterList = departmentMapper.selectList(queryWrapper);
@@ -380,6 +380,7 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
             Map<String, Object> resultMap = new HashMap<>();
             //当前用户管理部门
             List<Integer> deptIds=null;
+            List<Department> allDepartmentList=departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id",companyId));
             List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("manager_id", targetUser.getId()).eq("company_id", companyId));
             List<SysRichFunction> functionAllList = sysFunctionMapper.getRoleFunctions(targetUser.getRoleId(), "查看全公司");
             List<SysRichFunction> functionDpartList = sysFunctionMapper.getRoleFunctions(targetUser.getRoleId(), "查看负责部门");
@@ -388,8 +389,13 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
             //判断查看权限
             if(functionAllList.size()==0){
                 if(functionDpartList.size()>0){
+                    deptIds=new ArrayList<>();
                     if(functionTimeList.size()>0||functionCostList.size()>0){
-                        deptIds = departmentList.stream().map(dp -> dp.getDepartmentId()).distinct().collect(Collectors.toList());
+                        List<Integer> collect = departmentList.stream().distinct().map(dm -> dm.getDepartmentId()).collect(Collectors.toList());
+                        for (Integer integer : collect) {
+                            List<Integer> branchDepartment = getBranchDepartment(integer, allDepartmentList);
+                            deptIds.addAll(branchDepartment);
+                        }
                     }
                 }else {
                     deptIds=new ArrayList<>();

+ 12 - 4
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java

@@ -1084,7 +1084,7 @@ public class DingDingServiceImpl implements DingDingService {
 
     //获取当天的员工考勤数据,包括打卡,请假/出差申请单; 仅企业内部应用有权限
     @Override
-    public void syncUserWorkData(CompanyDingding dingding, String startDate, String endDate, boolean showLog) {
+    public void syncUserWorkData(CompanyDingding dingding, String userId, String startDate, String endDate, boolean showLog) {
         DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
         LocalDate sDate = LocalDate.parse(startDate, dateTimeFormatter);
         LocalDate eDate = LocalDate.parse(endDate, dateTimeFormatter);
@@ -1094,7 +1094,7 @@ public class DingDingServiceImpl implements DingDingService {
             LocalDate workDate = sDate.plusDays(i);
             String wDate = dateTimeFormatter.format(workDate);
             System.out.println("同步钉钉考勤假期出差第:"+i+"天, " + wDate);
-            sycUserOneDayWorkData(dingding, wDate, showLog);
+            sycUserOneDayWorkData(dingding, userId, wDate, showLog);
             //到达结束日期,结束了
             if (workDate.isEqual(eDate)) {
                 break;
@@ -1103,8 +1103,16 @@ public class DingDingServiceImpl implements DingDingService {
         }
     }
 
-    private void sycUserOneDayWorkData(CompanyDingding dingding, String workDate, boolean showLog) {
-        List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", dingding.getCompanyId()));
+    private void sycUserOneDayWorkData(CompanyDingding dingding, String userId, String workDate, boolean showLog) {
+        List<User> userList = null;
+        if (StringUtils.isEmpty(userId)) {
+            userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", dingding.getCompanyId()));
+        } else {
+            //指定某个员工进行同步
+            userList = new ArrayList<>();
+            userList.add(userMapper.selectById(userId));
+        }
+
         String accessToken = null;
         try {
             accessToken = getInnerCorpToken(dingding);

+ 207 - 56
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -244,6 +244,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
             List<ProviderInfo> providerInfoList = providerInfoMapper.selectList(new QueryWrapper<ProviderInfo>().eq("company_id", companyId));
             List<ProviderCategory> providerCategoryList = providerCategoryMapper.selectList(new QueryWrapper<ProviderCategory>().eq("company_id", companyId));
+            List<ProjectMain> projectMainList = projectMainMapper.selectList(new QueryWrapper<ProjectMain>().eq("company_id", companyId));
             List<ProjectVO> list = new ArrayList<>();
             for (Project project : projectList) {
                 ProjectVO projectVO = new ProjectVO();
@@ -255,6 +256,10 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     projectVO.setInchargerName(incharger.getName());
                     projectVO.setInchargerPhone(incharger.getPhone());
                 }
+                Optional<ProjectMain> projectMain = projectMainList.stream().filter(pm -> pm.getId().equals(project.getProjectMainId())).findFirst();
+                if(projectMain.isPresent()){
+                    projectVO.setProjectMainName(projectMain.get().getName());
+                }
                 List<Map<String,Object>> mapList=new ArrayList<>();
                 if(!StringUtils.isEmpty(project.getProviderIds())){
                     String[] providerIdString = project.getProviderIds().split(",");
@@ -718,6 +723,18 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         String endDate = "2021-01-31";
     }
 
+    private List<Integer> getBranchDepartment(Integer departmentId, List<Department> departmentList) {
+        List<Integer> list = new ArrayList<>();
+        list.add(departmentId);
+        //搜到子部门进行添加
+        for (Department department : departmentList) {
+            if (departmentId.equals(department.getSuperiorId())) {
+                list.addAll(getBranchDepartment(department.getDepartmentId(), departmentList));
+            }
+        }
+        return list;
+    }
+
     //获取查询者所在公司每个项目的工时成本
     @Override
     public HttpRespMsg getTimeCost(String startDate, String endDate, String userId, HttpServletRequest request) {
@@ -729,6 +746,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             Map<String, Object> resultMap = new HashMap<>();
             //当前用户管理部门
             List<Integer> deptIds=null;
+            List<Department> allDepartmentList=departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id",companyId));
             List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("manager_id", targetUser.getId()).eq("company_id", companyId));
             List<SysRichFunction> functionAllList = sysFunctionMapper.getRoleFunctions(targetUser.getRoleId(), "查看全公司");
             List<SysRichFunction> functionDpartList = sysFunctionMapper.getRoleFunctions(targetUser.getRoleId(), "查看负责部门");
@@ -737,8 +755,13 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             //判断查看权限
             if(functionAllList.size()==0){
                 if(functionDpartList.size()>0){
+                    deptIds=new ArrayList<>();
                     if(functionTimeList.size()>0||functionCostList.size()>0){
-                        deptIds = departmentList.stream().map(dp -> dp.getDepartmentId()).distinct().collect(Collectors.toList());
+                        List<Integer> collect = departmentList.stream().distinct().map(dm -> dm.getDepartmentId()).collect(Collectors.toList());
+                        for (Integer integer : collect) {
+                            List<Integer> branchDepartment = getBranchDepartment(integer, allDepartmentList);
+                            deptIds.addAll(branchDepartment);
+                        }
                     }
                 }else {
                     deptIds=new ArrayList<>();
@@ -849,6 +872,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 httpRespMsg.data = resultMap;
             }
         } catch (NullPointerException e) {
+            e.printStackTrace();
             httpRespMsg.setError("验证失败");
             return httpRespMsg;
         }
@@ -1384,12 +1408,12 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     }
 
     @Override
-    public HttpRespMsg getProjectTask(Integer pageIndex, Integer pageSize, Integer projectId, HttpServletRequest request) {
+    public HttpRespMsg getProjectTask(Integer pageIndex, Integer pageSize, Integer projectId, HttpServletRequest request,Integer taskType) {
         User user = userMapper.selectById(request.getHeader("Token"));
         Integer companyId = user.getCompanyId();
-        int total = taskMapper.getProjectTaskCount(companyId, projectId);
+        int total = taskMapper.getProjectTaskCount(companyId, projectId,taskType);
         int pageStart = (pageIndex -1) * pageSize;
-        List projectTask = taskMapper.getProjectTask(companyId, pageStart, pageSize, projectId);
+        List projectTask = taskMapper.getProjectTask(companyId, pageStart, pageSize, projectId,taskType);
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         Map<String, Object> map = new HashMap<>();
         map.put("records", projectTask);
@@ -1399,7 +1423,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     }
 
     @Override
-    public HttpRespMsg exportProjectTask(HttpServletRequest request) {
+    public HttpRespMsg exportProjectTask(HttpServletRequest request,Integer taskType) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
 
         User user = userMapper.selectById(request.getHeader("Token"));
@@ -1407,7 +1431,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
 
         QueryWrapper<Project> queryWrapper = new QueryWrapper<Project>().eq("company_id", companyId);
         DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd");
-        List<Map> projectList = taskMapper.getProjectTask(companyId, null, null, null);
+        List<Map> projectList = taskMapper.getProjectTask(companyId, null, null, null,taskType);
         List<ProjectVO> list = new ArrayList<>();
         String[] statusNames = {"进行中","已完成","已撤销"};
         String[] typeList = {"任务","里程碑","风险"};
@@ -2089,12 +2113,17 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         List<SysRichFunction> functionAllList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "全公司加班情况");
         List<SysRichFunction> functionDeptList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "负责部门加班情况");
         List<Integer> deptIds=null;
+        List<Department> allDepartmentList=departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id",user.getCompanyId()));
         List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("manager_id", user.getId()).eq("company_id",user.getCompanyId()));
         //判断查看权限
         if(functionAllList.size()==0){
             if(functionDeptList.size()>0){
-                deptIds = departmentList.stream().map(dp -> dp.getDepartmentId()).distinct().collect(Collectors.toList());
-                deptIds.add(user.getDepartmentId());
+                deptIds=new ArrayList<>();
+                List<Integer> collect = departmentList.stream().distinct().map(dm -> dm.getDepartmentId()).collect(Collectors.toList());
+                for (Integer integer : collect) {
+                    List<Integer> branchDepartment = getBranchDepartment(integer, allDepartmentList);
+                    deptIds.addAll(branchDepartment);
+                }
             }else {
                 deptIds=new ArrayList<>();
                 deptIds.add(-1);
@@ -2124,11 +2153,17 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             List<SysRichFunction> functionAllList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "全公司加班情况");
             List<SysRichFunction> functionDeptList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "负责部门加班情况");
             List<Integer> deptIds=null;
+            List<Department> allDepartmentList=departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id",user.getCompanyId()));
             List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("manager_id", user.getId()).eq("company_id",user.getCompanyId()));
             //判断查看权限
             if(functionAllList.size()==0){
                 if(functionDeptList.size()>0){
-                    deptIds = departmentList.stream().map(dp -> dp.getDepartmentId()).distinct().collect(Collectors.toList());
+                    deptIds=new ArrayList<>();
+                    List<Integer> collect = departmentList.stream().distinct().map(dm -> dm.getDepartmentId()).collect(Collectors.toList());
+                    for (Integer integer : collect) {
+                        List<Integer> branchDepartment = getBranchDepartment(integer, allDepartmentList);
+                        deptIds.addAll(branchDepartment);
+                    }
                 }else {
                     deptIds=new ArrayList<>();
                     deptIds.add(-1);
@@ -2460,39 +2495,68 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         continue;
                     }
                     //项目编号	项目名称 参与人 负责人 级别 开始日期 截止日期 合同金额
-                    HSSFCell codeCell = row.getCell(0);
-                    HSSFCell categoryCell = row.getCell(1);
-                    HSSFCell isPublicCell = row.getCell(2);
-                    HSSFCell nameCell = row.getCell(3);
                     HSSFCell subNameCell=null;
                     HSSFCell mainNameCell=null;
-                    if(timeType.getMainProjectState()==1){
-                        mainNameCell = row.getCell(4);
-                    }else {
-                        subNameCell = row.getCell(4);
-                    }
-                    HSSFCell participatorCell = row.getCell(5);
-                    HSSFCell inchargerCell = row.getCell(6);
-                    HSSFCell levelCell = row.getCell(7);
+                    HSSFCell codeCell=null;
+                    HSSFCell isPublicCell=null;
+                    HSSFCell nameCell=null;
+                    HSSFCell participatorCell=null;
+                    HSSFCell inchargerCell=null;
+                    HSSFCell levelCell=null;
                     HSSFCell customerCell=null;
+                    HSSFCell startDateCell=null;
+                    HSSFCell endDateCell=null;
+                    HSSFCell amountCell=null;
+                    HSSFCell categoryCell=null;
                     int i=0;
                     int k=0;
-                    if(company.getPackageCustomer()==1){
-                        customerCell=row.getCell(8);
-                        i++;
-                    }
-                    if(company.getPackageProvider()==1){
-                        for (int j = 0; j < providerCategoryList.size(); j++) {
-                            if(company.getPackageProvider()==1){
-                                k++;
+                    if(timeType.getMainProjectState()==1){
+                        mainNameCell = row.getCell(0);
+                        codeCell = row.getCell(1);
+                        isPublicCell = row.getCell(2);
+                        nameCell = row.getCell(3);
+                        participatorCell = row.getCell(4);
+                        inchargerCell = row.getCell(5);
+                        levelCell = row.getCell(6);
+                        if(company.getPackageCustomer()==1){
+                            customerCell=row.getCell(7);
+                            i++;
+                        }
+                        if(company.getPackageProvider()==1){
+                            for (int j = 0; j < providerCategoryList.size(); j++) {
+                                if(company.getPackageProvider()==1){
+                                    k++;
+                                }
+                            }
+                        }
+                        startDateCell = row.getCell(7+i+k);
+                        endDateCell = row.getCell(8+i+k);
+                        amountCell = row.getCell(9+i+k);
+                    }else {
+                        codeCell = row.getCell(0);
+                        categoryCell = row.getCell(1);
+                        isPublicCell = row.getCell(2);
+                        nameCell = row.getCell(3);
+                        subNameCell = row.getCell(4);
+                        participatorCell = row.getCell(5);
+                        inchargerCell = row.getCell(6);
+                        levelCell = row.getCell(7);
+                        customerCell=null;
+                        if(company.getPackageCustomer()==1){
+                            customerCell=row.getCell(8);
+                            i++;
+                        }
+                        if(company.getPackageProvider()==1){
+                            for (int j = 0; j < providerCategoryList.size(); j++) {
+                                if(company.getPackageProvider()==1){
+                                    k++;
+                                }
                             }
                         }
+                        startDateCell = row.getCell(8+i+k);
+                        endDateCell = row.getCell(9+i+k);
+                        amountCell = row.getCell(10+i+k);
                     }
-                    HSSFCell startDateCell = row.getCell(8+i+k);
-                    HSSFCell endDateCell = row.getCell(9+i+k);
-                    HSSFCell amountCell = row.getCell(10+i+k);
-
-
                     if (codeCell != null)codeCell.setCellType(CellType.STRING);
                     if (nameCell != null)nameCell.setCellType(CellType.STRING);
                     if (categoryCell != null)categoryCell.setCellType(CellType.STRING);
@@ -2527,7 +2591,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         //检查项目是否存在
                         List<ProjectCategory> projectCategoryList = projectCategoryMapper.selectList(new QueryWrapper<ProjectCategory>().eq("company_id", user.getCompanyId()));
                         if (categoryCell != null && !StringUtils.isEmpty(categoryCell.getStringCellValue())) {
-                            Optional<ProjectCategory> category = projectCategoryList.stream().filter(pc -> pc.getName().equals(categoryCell.getStringCellValue())).findFirst();
+                            HSSFCell finalCategoryCell = categoryCell;
+                            Optional<ProjectCategory> category = projectCategoryList.stream().filter(pc -> pc.getName().equals(finalCategoryCell.getStringCellValue())).findFirst();
                             if(!category.isPresent()){
                                 throw  new Exception("项目分类["+categoryCell.getStringCellValue()+"]不存在");
                             }
@@ -2593,8 +2658,13 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         for (int j = 0; j < providerCategoryList.size(); j++) {
                             String nameSb = "";
                             String idSb = "";
-                            providerCell=row.getCell(8+i);
-                            HSSFCell cell = row.getCell(10);
+                            if(timeType.getMainProjectState()==1){
+                                providerCell=row.getCell(7+i);
+                                HSSFCell cell = row.getCell(9);
+                            }else {
+                                providerCell=row.getCell(8+i);
+                                HSSFCell cell = row.getCell(10);
+                            }
                             System.out.println("当前分类:"+providerCategoryList.get(j).getProviderCategoryName()+", categoryId="+providerCategoryList.get(j).getId());
                             String categoryName = providerCategoryList.get(j).getProviderCategoryName();
                             Integer categoryId = providerCategoryList.get(j).getId();
@@ -2865,12 +2935,14 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     }
                 }
             }
+            if(company.getPackageCustomer()==1){
+                rowData.add(projectVO.getCustomerName());
+            }
             if (company.getPackageProject() == 1) {
                 Integer level = projectVO.getLevel();
                 if (level == null) {
                     level = 1;
                 }
-                rowData.add(projectVO.getCustomerName());
                 rowData.add(levelArray[level-1]);
                 rowData.add(df.format((Double)projectVO.getContractAmount()));
             }
@@ -3074,12 +3146,18 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         List<SysRichFunction> functionAllList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "全公司加班情况");
         List<SysRichFunction> functionDeptList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "负责部门加班情况");
         List<Integer> deptIds=null;
+        List<Department> allDepartmentList=departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id",user.getCompanyId()));
         List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("manager_id", user.getId()).eq("company_id",user.getCompanyId()));
         //判断查看权限
         if(functionAllList.size()==0){
             if(functionDeptList.size()>0){
-                deptIds = departmentList.stream().map(dp -> dp.getDepartmentId()).distinct().collect(Collectors.toList());
-                deptIds.add(user.getDepartmentId());
+                deptIds=new ArrayList<>();
+                List<Integer> collect = departmentList.stream().distinct().map(dm -> dm.getDepartmentId()).collect(Collectors.toList());
+                for (Integer integer : collect) {
+                    List<Integer> branchDepartment = getBranchDepartment(integer, allDepartmentList);
+                    deptIds.addAll(branchDepartment);
+                }
+
             }else {
                 deptIds=new ArrayList<>();
                 deptIds.add(-1);
@@ -3462,6 +3540,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             Map<String, Object> resultMap = new HashMap<>();
             //当前用户管理部门
             List<Integer> deptIds=null;
+            List<Department> allDepartmentList=departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id",companyId));
             List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("manager_id", targetUser.getId()).eq("company_id", companyId));
             List<SysRichFunction> functionAllList = sysFunctionMapper.getRoleFunctions(targetUser.getRoleId(), "查看全公司");
             List<SysRichFunction> functionDpartList = sysFunctionMapper.getRoleFunctions(targetUser.getRoleId(), "查看负责部门");
@@ -3470,8 +3549,13 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             //判断查看权限
             if(functionAllList.size()==0){
                 if(functionDpartList.size()>0){
+                    deptIds=new ArrayList<>();
                     if(functionTimeList.size()>0||functionCostList.size()>0){
-                        deptIds = departmentList.stream().map(dp -> dp.getDepartmentId()).distinct().collect(Collectors.toList());
+                        List<Integer> collect = departmentList.stream().distinct().map(dm -> dm.getDepartmentId()).collect(Collectors.toList());
+                        for (Integer integer : collect) {
+                            List<Integer> branchDepartment = getBranchDepartment(integer, allDepartmentList);
+                            deptIds.addAll(branchDepartment);
+                        }
                     }
                 }else {
                     deptIds=new ArrayList<>();
@@ -3746,12 +3830,17 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         List<SysRichFunction> functionAllList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "全公司工时分配");
         List<SysRichFunction> functionDeptList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "负责部门工时分配");
         List<Integer> deptIds=null;
+        List<Department> allDepartmentList=departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id",user.getCompanyId()));
         List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("manager_id", user.getId()).eq("company_id",user.getCompanyId()));
         //判断查看权限
         if(functionAllList.size()==0){
             if(functionDeptList.size()>0){
-                    deptIds = departmentList.stream().map(dp -> dp.getDepartmentId()).distinct().collect(Collectors.toList());
-
+                deptIds=new ArrayList<>();
+                List<Integer> collect = departmentList.stream().distinct().map(dm -> dm.getDepartmentId()).collect(Collectors.toList());
+                for (Integer integer : collect) {
+                    List<Integer> branchDepartment = getBranchDepartment(integer, allDepartmentList);
+                    deptIds.addAll(branchDepartment);
+                }
             }else {
                 deptIds=new ArrayList<>();
                 deptIds.add(-1);
@@ -3782,12 +3871,17 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         List<SysRichFunction> functionAllList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "全公司工时分配");
         List<SysRichFunction> functionDeptList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "负责部门工时分配");
         List<Integer> deptIds=null;
+        List<Department> allDepartmentList=departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id",user.getCompanyId()));
         List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("manager_id", user.getId()).eq("company_id",user.getCompanyId()));
         //判断查看权限
         if(functionAllList.size()==0){
             if(functionDeptList.size()>0){
-                deptIds = departmentList.stream().map(dp -> dp.getDepartmentId()).distinct().collect(Collectors.toList());
-                deptIds.add(user.getDepartmentId());
+                deptIds=new ArrayList<>();
+                List<Integer> collect = departmentList.stream().distinct().map(dm -> dm.getDepartmentId()).collect(Collectors.toList());
+                for (Integer integer : collect) {
+                    List<Integer> branchDepartment = getBranchDepartment(integer, allDepartmentList);
+                    deptIds.addAll(branchDepartment);
+                }
             }else {
                 deptIds=new ArrayList<>();
                 deptIds.add(-1);
@@ -3831,11 +3925,18 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         List<SysRichFunction> functionAllList = sysFunctionMapper.getRoleFunctions(targetUser.getRoleId(), "全公司工时分配");
         List<SysRichFunction> functionDeptList = sysFunctionMapper.getRoleFunctions(targetUser.getRoleId(), "负责部门工时分配");
         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()));
         //判断查看权限
         if(functionAllList.size()==0){
             if(functionDeptList.size()>0){
-                deptIds = userDepartmentList.stream().map(dp -> dp.getDepartmentId()).distinct().collect(Collectors.toList());
+                deptIds=new ArrayList<>();
+                List<Integer> collect = userDepartmentList.stream().distinct().map(dm -> dm.getDepartmentId()).collect(Collectors.toList());
+                for (Integer integer : collect) {
+                    List<Integer> branchDepartment = getBranchDepartment(integer, allDepartmentList);
+                    deptIds.addAll(branchDepartment);
+                }
+
             }else {
                 deptIds=new ArrayList<>();
                 deptIds.add(-1);
@@ -3931,9 +4032,6 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         }
                     }
                 }
-                System.out.println(user.getName());
-                System.out.println(days);
-                System.out.println(num);
                 BigDecimal bigDecimal=new BigDecimal(num);
                 BigDecimal divide;
                 if(days!=0){
@@ -4058,31 +4156,84 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
 
 	@Override
     public HttpRespMsg getUserWorkingTimeStatic(String startDate, String endDate, Integer pageIndex, Integer pageSize, HttpServletRequest request,String userId,Integer departmentId) {
+        HttpRespMsg httpRespMsg =new HttpRespMsg();
+        DecimalFormat dft =  new DecimalFormat("0%");
         User targetUser = userMapper.selectById(request.getHeader("token"));
-        List<SysRichFunction> functionAllList = sysFunctionMapper.getRoleFunctions(targetUser.getRoleId(), "查看全部人员工时统计");
-        List<SysRichFunction> functionDeptList = sysFunctionMapper.getRoleFunctions(targetUser.getRoleId(), "查看负责部门人员工时统计");
+        List<SysRichFunction> functionAllList = sysFunctionMapper.getRoleFunctions(targetUser.getRoleId(), "全公司工时统计");
+        List<SysRichFunction> functionDeptList = sysFunctionMapper.getRoleFunctions(targetUser.getRoleId(), "负责部门工时统计");
         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()));
         //判断查看权限
         if(functionAllList.size()==0){
             if(functionDeptList.size()>0){
-                deptIds = userDepartmentList.stream().map(dp -> dp.getDepartmentId()).distinct().collect(Collectors.toList());
+                deptIds=new ArrayList<>();
+                List<Integer> collect = userDepartmentList.stream().distinct().map(dm -> dm.getDepartmentId()).collect(Collectors.toList());
+                for (Integer integer : collect) {
+                    List<Integer> branchDepartment = getBranchDepartment(integer, allDepartmentList);
+                    deptIds.addAll(branchDepartment);
+                }
             }else {
                 deptIds=new ArrayList<>();
                 deptIds.add(-1);
             }
         }
         long total;
-        List<Map<String,Object>> resultList=projectMapper.getUserWorkingTimeStatic(startDate,endDate,pageIndex,pageSize,userId,departmentId,deptIds);
+        List<Map<String,Object>> resultList;
         if(pageIndex!=null&&pageSize!=null){
-            total=projectMapper.findCountWithUserWorkingTime(startDate,endDate,pageIndex,pageSize,userId,departmentId,deptIds);
+            Integer size=pageSize;
+            Integer start=(pageIndex-1)*size;
+            resultList=projectMapper.getUserWorkingTimeStatic(targetUser.getCompanyId(),startDate,endDate,start,size,userId,departmentId,deptIds);
+            total=projectMapper.findCountWithUserWorkingTime(targetUser.getCompanyId(),startDate,endDate,start,size,userId,departmentId,deptIds);
         }else{
-            total=projectMapper.findCountWithUserWorkingTime(startDate,endDate,null,null,userId,departmentId,deptIds);
+            resultList=projectMapper.getUserWorkingTimeStatic(targetUser.getCompanyId(),startDate,endDate,null,null,userId,departmentId,deptIds);
+            total=projectMapper.findCountWithUserWorkingTime(targetUser.getCompanyId(),startDate,endDate,null,null,userId,departmentId,deptIds);
+        }
+        for (Map<String, Object> map : resultList) {
+            BigDecimal phBigDecimal =new BigDecimal(String.valueOf(map.get("planHours")==null?0:map.get("planHours")));
+            BigDecimal wtBigDecimal =new BigDecimal(String.valueOf(map.get("workingTime")==null?0:map.get("workingTime")));
+            if(phBigDecimal.compareTo(BigDecimal.ZERO)==0||wtBigDecimal.compareTo(BigDecimal.ZERO)==0){
+                map.put("proportion",dft.format(0));
+            }else{
+                BigDecimal divide = wtBigDecimal.divide(phBigDecimal, 2, BigDecimal.ROUND_HALF_UP);
+                map.put("proportion",dft.format(divide));
+            }
         }
         Map<String,Object> map=new HashMap<>();
         map.put("result",resultList);
         map.put("total",total);
-        return null;
+        httpRespMsg.data=map;
+        return httpRespMsg;
+    }
+
+    @Override
+    public HttpRespMsg exportUserWorkingTimeStatic(String startDate, String endDate, HttpServletRequest request, String userId, Integer departmentId) {
+        HttpRespMsg msg=new HttpRespMsg();
+        HttpRespMsg httpRespMsg = getUserWorkingTimeStatic(startDate, endDate, null, null, request, userId, departmentId);
+        Map<String,Object> data = (Map<String, Object>) httpRespMsg.data;
+        List<Map<String,Object>> resultList= (List<Map<String, Object>>) data.get("result");
+        List<List<String>> dataList=new ArrayList<>();
+        List<String> titleList=new ArrayList<>();
+        titleList.add("姓名");
+        titleList.add("部门");
+        titleList.add("计划工时");
+        titleList.add("实际工时");
+        titleList.add("实际用时占比");
+        dataList.add(titleList);
+        for (Map<String, Object> map : resultList) {
+            List<String> item=new ArrayList<>();
+            item.add((String) map.get("name"));
+            item.add((String) map.get("departmentName")==null?"":(String) map.get("departmentName"));
+            item.add(String.valueOf(map.get("planHours")).equals("null")?"":String.valueOf(map.get("planHours")));
+            item.add(String.valueOf(map.get("workingTime")).equals("null")?"":String.valueOf(map.get("workingTime")));
+            item.add(String.valueOf(map.get("proportion")).equals("null")?"":String.valueOf(map.get("proportion")));
+            dataList.add(item);
+        }
+        //生成excel文件导出
+        String fileName = "人员工时统计_"+System.currentTimeMillis();
+        String resp = ExcelUtil.exportGeneralExcelByTitleAndList(fileName , dataList, path);
+        msg.data = resp;
+        return msg;
     }
 
 

+ 15 - 5
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -2797,10 +2797,16 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             HSSFSheet sheet = workbook.createSheet("工作日报");
             sheet.createFreezePane(0,1);
             List<String> titles = new ArrayList<String>();
-            titles.addAll(Arrays.asList(new String[]{
-                    "序号","员工","所在部门","项目名称","项目分类","子项目名称"
-            }));
-
+            titles.add("序号");
+            titles.add("员工");
+            titles.add("所在部门");
+            titles.add("项目名称");
+            titles.add("项目分类");
+            if(timeType.getMainProjectState()==1){
+                titles.add("主项目名称");
+            }else {
+                titles.add("子项目名称");
+            }
             //项目管理专业版以上,包括任务
             if (company.getPackageProject() == 1) {
                 titles.add("关联任务");
@@ -2984,7 +2990,11 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 row.createCell(2).setCellValue((String) map.get("departmentName"));
                 row.createCell(3).setCellValue((String) map.get("project"));
                 row.createCell(4).setCellValue((String) map.get("categoryName"));
-                row.createCell(5).setCellValue((String) map.get("subProjectName"));
+                if(timeType.getMainProjectState()==1){
+                    row.createCell(5).setCellValue((String) map.get("projectMainName"));
+                }else {
+                    row.createCell(5).setCellValue((String) map.get("subProjectName"));
+                }
                 int index = 6;
                 if (company.getPackageProject() == 1) {
                     row.createCell(6).setCellValue((String) map.get("taskName"));

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

@@ -407,6 +407,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             long total;
             List<Map<String, Object>> list;
             Page<User> page = new Page<>(pageIndex, pageSize);
+            System.out.println("pageSize==="+pageSize);
             if (departmentId == -1) {
                 //单独查找全部
                 list = userMapper.getUserByDepartment(page, companyId, null, keyword, status, roleId);
@@ -911,6 +912,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                 XSSFCell deptCell = row.getCell(2);
 //                XSSFCell monthCostCell = row.getCell(3);
 //                XSSFCell costCell = row.getCell(4);
+                if (nameCell == null) continue;//存在空行的情况
                 nameCell.setCellType(CellType.STRING);
                 phoneCell.setCellType(CellType.STRING);
 

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

@@ -170,7 +170,7 @@ public class TimingTask {
             for (int i=0;i<dingdingList.size(); i++) {
                 System.out.println("钉钉公司:"+dingdingList.get(i).getCorpName());
                 long t1 = System.currentTimeMillis();
-                dingDingService.syncUserWorkData(dingdingList.get(i), startDate, endDate, false);
+                dingDingService.syncUserWorkData(dingdingList.get(i), null, startDate, endDate, false);
                 long t2 = System.currentTimeMillis();
                 System.out.println("同步 "+dingdingList.get(i).getCorpName()+", 总共耗时:"+(t2-t1)+"ms");
             }

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

@@ -743,6 +743,71 @@
     </select>
 
     <select id="getUserWorkingTimeStatic" resultType="java.util.Map">
-
+        select us.name,dp.department_name as departmentName,
+        (select SUM(te.plan_hours) from task_executor te
+        left join task on task.id=te.task_id
+        where te.executor_id=us.id
+        <if test="startDate!=null and endDate!=null">
+            and task.create_date &gt;=#{startDate} and task.create_date &lt;=#{endDate}
+        </if>) as planHours,
+        (select SUM(report.working_time) from report
+        left join task on task.id=report.task_id
+        where report.creator_id=us.id and task_id is not null and report.state=1
+        <if test="startDate!=null and endDate!=null">
+            and report.create_date &gt;=#{startDate} and report.create_date &lt;=#{endDate}
+        </if>) as workingTime
+        from user us
+        left join  department dp on dp.department_id=us.department_id
+        where us.company_id=#{companyId}
+        <if test="userId!=null and userId!=''">
+            and us.id=#{userId}
+        </if>
+        <if test="departmentId!=null">
+            and us.department_id=#{departmentId}
+        </if>
+        <if test="deptIds!=null and deptIds.size()>0">
+            and us.department_id in
+            <foreach collection="deptIds" open="(" item="item" close=")" separator=",">
+                #{item}
+            </foreach>
+        </if>
+        group by us.id
+        order  by us.department_id
+        <if test="start!=null and size!=null">
+            limit #{start},#{size}
+        </if>
+    </select>
+    <select id="findCountWithUserWorkingTime" resultType="java.lang.Long">
+        select count(1)
+        from(select us.name,dp.department_name  as departmentName,
+        (select SUM(te.plan_hours) from task_executor te
+        left join task on task.id=te.task_id
+        where te.executor_id=us.id
+        <if test="startDate!=null and endDate!=null">
+            and task.create_date &gt;=#{startDate} and task.create_date &lt;=#{endDate}
+        </if>) as planHours,
+        (select SUM(report.working_time) from report
+        left join task on task.id=report.task_id
+        where report.creator_id=us.id and task_id is not null
+        <if test="startDate!=null and endDate!=null">
+            and task.create_date &gt;=#{startDate} and task.create_date &lt;=#{endDate}
+        </if>) as workingTime
+        from user us
+        left join  department dp on dp.department_id=us.department_id
+        where us.company_id=#{companyId}
+        <if test="userId!=null and userId!=''">
+            and us.id=#{userId}
+        </if>
+        <if test="departmentId!=null">
+            and us.department_id=#{departmentId}
+        </if>
+        <if test="deptIds!=null and deptIds.size()>0">
+            and us.department_id in
+            <foreach collection="deptIds" open="(" item="item" close=")" separator=",">
+                #{item}
+            </foreach>
+        </if>
+        group by us.id
+        order  by us.department_id)as total
     </select>
 </mapper>

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

@@ -59,7 +59,7 @@
         a.end_time as endTime, d.name as subProjectName,a.task_id as taskId, task.name as taskName, a.is_overtime as isOvertime,a.progress as progress,
         a.department_audit_state as departmentAuditState, a.stage, a.pic_str as picStr, multi_worktime as multiWorktime
         , reject_reason as rejectReason, reject_username as rejectUsername, reject_userid as rejectUserid, degree_id as degree_id,report_extra_degree.name as degreeName,task_group.name as groupName,a.group_id as groupId, a.custom_data as customData
-        ,u.name as projectAuditorName, a.project_auditor_id as projectAuditorId, department.department_name as departmentName, a.overtime_hours as overtimeHours, a.custom_text as customText, a.project_audit_time as projectAuditTime
+        ,u.name as projectAuditorName, a.project_auditor_id as projectAuditorId, department.department_name as departmentName, a.overtime_hours as overtimeHours, a.custom_text as customText, a.project_audit_time as projectAuditTime,project_main.name as projectMainName
         FROM report AS a
         JOIN project AS b ON a.project_id=b.id
         LEFT JOIN user AS c ON a.creator_id=c.id
@@ -69,6 +69,7 @@
         left join task_group on task_group.id = a.group_id
         left join user u on u.id = a.project_auditor_id
         left join department on department.department_id = c.department_id
+        left join project_main on b.project_main_id=project_main.id
         WHERE (a.state = 1
         <if test="stateKey!=null and stateKey==1">
             or a.state =0
@@ -132,7 +133,7 @@
         a.custom_data as customData
         ,u.name as projectAuditorName, a.project_auditor_id as projectAuditorId, department.department_name as
         departmentName, a.overtime_hours as overtimeHours, a.custom_text as customText, a.project_audit_time as
-        projectAuditTime
+        projectAuditTime,project_main.name as projectMainName
         FROM report AS a
         JOIN project AS b ON a.project_id=b.id
         LEFT JOIN user AS c ON a.creator_id=c.id
@@ -142,6 +143,7 @@
         left join task_group on task_group.id = a.group_id
         left join user u on u.id = a.project_auditor_id
         left join department on department.department_id = c.department_id
+        left join project_main on project_main.id=b.project_main_id
         WHERE
         (a.state = 1
         <if test="stateKey!=null and stateKey==1">
@@ -171,7 +173,7 @@
         a.end_time as endTime, d.name as subProjectName,a.task_id as taskId, task.name as taskName, a.is_overtime as isOvertime,a.progress as progress,
         a.department_audit_state as departmentAuditState,a.stage, a.pic_str as picStr, multi_worktime as multiWorktime
         , reject_reason as rejectReason, reject_username as rejectUsername, reject_userid as rejectUserid, degree_id as degree_id,report_extra_degree.name as degreeName,task_group.name as groupName,a.group_id as groupId, a.custom_data as customData
-        ,u.name as projectAuditorName, a.project_auditor_id as projectAuditorId, department.department_name as departmentName, a.overtime_hours as overtimeHours, a.custom_text as customText, a.project_audit_time as projectAuditTime
+        ,u.name as projectAuditorName, a.project_auditor_id as projectAuditorId, department.department_name as departmentName, a.overtime_hours as overtimeHours, a.custom_text as customText, a.project_audit_time as projectAuditTime,project_main.name as projectMainName
         FROM report AS a
         JOIN project AS b ON a.project_id=b.id
         LEFT JOIN user AS c ON a.creator_id=c.id
@@ -181,6 +183,7 @@
         left join task_group on task_group.id = a.group_id
         left join user u on u.id = a.project_auditor_id
         left join department on department.department_id = c.department_id
+        left join project_main on project_main.id=b.project_main_id
         WHERE (a.state = 1
         <if test="stateKey!=null and stateKey==1">
             or a.state=0

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

@@ -165,6 +165,9 @@
         <if test="projectId != null">
             and task.project_id = #{projectId}
         </if>
+        <if test="taskType!=null">
+            and task.task_type=#{taskType}
+        </if>
         ORDER BY project.is_public desc, project.id ASC, task.stages_id asc, task.seq asc
         <if test="pageStart != null and pageSize != null">
             limit #{pageStart}, #{pageSize}
@@ -176,6 +179,9 @@
         <if test="projectId != null">
             and task.project_id = #{projectId}
         </if>
+        <if test="taskType!=null">
+            and task.task_type=#{taskType}
+        </if>
     </select>
 
     <select id="getTaskWithProjectName" resultMap="RichResultMap">

+ 2 - 0
fhKeeper/formulahousekeeper/timesheet/src/main.js

@@ -23,6 +23,8 @@ import VDistPicker from 'v-distpicker'
 Vue.component('v-distpicker',VDistPicker)
 
 import './day.js' // 加载 dayjs 初始化配置
+import dayjs from 'dayjs';
+Vue.prototype.dayjs = dayjs;
 
 import Viewer from 'v-viewer' // 图片预览
 import 'viewerjs/dist/viewer.css'

+ 4 - 0
fhKeeper/formulahousekeeper/timesheet/src/permissions.js

@@ -58,6 +58,8 @@ const StringUtil = {
         reportAllTimely: false, // 全公司填报及时率 //
         reportTimely: false, // 负责部门填报及时率 //
         reportAuditRate: false, // 查看日报待审核统计 // 
+        reportPersonnel: false, // 全公司工时统计 //
+        reportResponsible: false, // 负责部门工时统计 //
 
         // 请假模块
         leaveFil : false, // 请假填报 // 
@@ -158,6 +160,8 @@ const StringUtil = {
         arr[i] == '项目报表' ? obj.reportProject = true : ''
         arr[i] == '批量填报' ? obj.reportBatch = true : ''
         arr[i] == '项目阶段管理' ? obj.projectPhase = true : ''
+        arr[i] == '全公司工时统计' ? obj.reportPersonnel = true : ''
+        arr[i] == '负责部门工时统计' ? obj.reportResponsible = true : ''
     }
 
     return obj

+ 112 - 2
fhKeeper/formulahousekeeper/timesheet/src/views/awayOffice/awayOffice.vue

@@ -186,6 +186,10 @@
                     <div><span style="color: #606266">时间段</span>
                         <el-date-picker v-model="createDate" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" @change="billss()" value-format="yyyy-MM-dd" placeholder="选择日期" size="small" clearable style="width:280px"></el-date-picker>
                     </div>
+                    <!-- 从顶顶同步按钮 -->
+                    <div style="margin: 0 0 0 20px">
+                        <el-button size="small" type="primary" @click="dingdingClick()">从钉钉同步</el-button>
+                    </div>
                 </div>
         <!-- 出差列表 -->
                 <el-table :data="tableList" style="width: 100%" height="90%">
@@ -600,6 +604,27 @@
             </div>
         </el-dialog>
     </el-dialog>
+    <!-- 点击钉钉同步弹窗 -->
+    <el-dialog title="从钉钉同步" :visible.sync="synchronizationDaying" width="480px" :before-close="handleClose">
+        <div>
+            <div class="dingdingtongbu">
+                <span>选择人员</span>
+                <el-select v-model="ownerIdsId" placeholder="请选择人员" style="width:280px" size="small" filterable="true">
+                    <el-option v-for="item in users" :key="item.id" :label="item.name" :value="item.id">
+                    </el-option>
+                </el-select>
+            </div>
+            <div class="dingdingtongbu" style="margin-top: 20px">
+                <span>时间段</span>
+                <el-date-picker v-model="createDateList" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" value-format="yyyy-MM-dd" placeholder="选择日期" size="small" clearable style="width:280px"></el-date-picker>
+                <span style="width: 300px;color: #E6A23C;font-size: 10px;padding-left: 105px;margin-top: 10px"> <i class="el-icon-warning-outline"></i> 从钉钉同步 时间段不能超过七天</span>
+            </div>
+        </div>
+        <span slot="footer" class="dialog-footer">
+            <el-button @click="synchronizationDaying = false">取 消</el-button>
+            <el-button type="primary" @click="listSynchronize()" :loading="synchronizeLoading">同 步</el-button>
+        </span>
+    </el-dialog>
 </section>
 </template>
 
@@ -628,6 +653,7 @@ export default {
             // userdata: JSON.parse(sessionStorage.getItem("user")),
 
             permissions: JSON.parse(sessionStorage.getItem("permissions")),
+            userComLis: JSON.parse(sessionStorage.getItem("user")),
             addform: {
                 reason: null, //出差事由
                 startDate: null,  //开始时间
@@ -730,7 +756,11 @@ export default {
                 endDate:[{required: true,message: '请选择结束日期',trigger: 'change'}],
                 projectId:[{required: true,message: '请选择要关联的项目',trigger: 'change'}],
             },
-            relationItemTemporaryDate: {}
+            relationItemTemporaryDate: {},
+            synchronizeLoading: false,
+            synchronizationDaying:false,
+            createDateList: [],
+            ownerIdsId: ''
         }
     },
     created(){
@@ -756,6 +786,80 @@ export default {
         // console.log("session",this.wuduData);
     },
     methods: {
+        dingdingClick() {
+            this.synchronizationDaying = true
+            this.ownerIdsId = this.users[0].id
+            let startDates = this.dayjs().add('-7','day').format("YYYY-MM-DD")
+            let endDates = this.dayjs().format("YYYY-MM-DD")
+            let arr = []
+            arr.push(startDates)
+            arr.push(endDates)
+            this.createDateList = arr
+        },
+        // 判断日期
+        determineDate(startDate, endDate) {
+            let startTime = new Date(Date.parse(startDate.replace(/-/g, "/"))).getTime();
+            let endTime = new Date(Date.parse(endDate.replace(/-/g, "/"))).getTime();
+            let dates = Math.abs((startTime - endTime)) / (1000 * 60 * 60 * 24);
+            let flg = dates > 7 ? false : true
+            return flg ;
+        },
+        // 从钉钉同步假期剩余表
+        listSynchronize(){
+            // 判断日期
+            let flgs = this.determineDate(this.createDateList[0], this.createDateList[1])
+            if(flgs) {
+                this.synchronizeLoading = true
+                let transmissionObj = {}
+                transmissionObj.userId = this.ownerIdsId
+                transmissionObj.companyId = this.userComLis.companyId
+                console.log(this.createDateList, '俺看')
+                if(this.createDateList != 'null' && this.createDateList != null) {
+                    if(this.createDateList.length > 0) {
+                        transmissionObj.startDate = this.createDateList[0]
+                        transmissionObj.endDate = this.createDateList[1]
+                    } else {
+                        transmissionObj.startDate = this.dayjs().add('-7','day').format("YYYY-MM-DD")
+                        transmissionObj.endDate = this.dayjs().format("YYYY-MM-DD")
+                    }
+                    
+                } else {
+                    transmissionObj.startDate = ''
+                    transmissionObj.endDate = ''
+                }
+                this.http.post('/dingding/syncUserWorkData',transmissionObj,
+                res => {
+                    if(res.code == 'ok'){
+                        this.synchronizeLoading = false
+                        this.synchronizationDaying = false
+                        this.$message({
+                            message: '同步成功',
+                            type: 'success'
+                        })
+                        // this.ownerIdsId = ''
+                        // this.createDateList = []
+                        this.getTableList()
+                    }else {
+                        this.synchronizeLoading = false
+                        this.$message({
+                            message: res.msg,
+                            type: 'error'
+                        })
+                    }
+                },err => {
+                    this.synchronizeLoading = false
+                    this.$message({
+                        message: err,
+                        type: 'error'
+                    })
+                })
+            } else {
+                this.$message({
+                    message: '从钉钉同步消息时间段不能超过七天',
+                    type: 'warning'
+                });
+            }
+        },
         // 钉钉环境交互
         DingdingEditor(e){
             console.log(e);
@@ -1464,7 +1568,8 @@ export default {
             this.http.post(this.port.manage.list, {
                 departmentId: -1,
                 pageIndex: 1,
-                pageSize: 99999
+                // pageSize: 99999
+                pageSize: -1
             },
             res => {
                 if (res.code == "ok") {
@@ -1690,4 +1795,9 @@ export default {
     width: 35%;
     text-align: left;
 }
+.dingdingtongbu span {
+    display: inline-block;
+    width: 80px;
+    padding-left: 20px;
+}
 </style>

+ 112 - 17
fhKeeper/formulahousekeeper/timesheet/src/views/corpreport/list.vue

@@ -31,6 +31,8 @@
 
                   <el-menu-item index="1-10" v-if="permissions.reportAllTimely || permissions.reportTimely"><p @click="ssl(9)">员工填报及时率</p></el-menu-item>
                   <el-menu-item index="1-11" v-if="permissions.reportAuditRate"><p @click="ssl(10)">日报待审核统计</p></el-menu-item>
+                  <el-menu-item index="1-12" v-if="permissions.reportPersonnel || permissions.reportResponsible"><p @click="ssl(11)">人员工时统计表</p></el-menu-item>
+                  <!-- <el-menu-item index="1-12"><p @click="ssl(11)">人员工时统计表</p></el-menu-item> -->
                 </el-submenu>
               </el-menu>
           </el-col>
@@ -63,7 +65,7 @@
           </el-select>
         </template>
         <!-- 时间段筛选 -->
-          <template v-if="ins == 6 || ins == 8 || ins == 9 || ins == 10">
+          <template v-if="ins == 6 || ins == 8 || ins == 9 || ins == 10 || ins == 11">
             <span class="demonstration" style="color:#999;padding:0 10px">时间段</span>
             <el-date-picker v-model="rangeDatas" type="daterange" value-format="yyyy-MM-dd" placeholder="选择开始日期" @change="picks()" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" style="width:300px" :clearable="false" size="small"> </el-date-picker>
           </template>
@@ -74,7 +76,7 @@
           <el-option label="查看部门审核人" :value="0"></el-option>
         </el-select> -->
         <!-- 项目筛选 -->
-        <el-select v-if="ins != 4 && ins != 8 && ins != 9 && ins != 10" v-model="proJuctId" placeholder="请选择项目" clearable filterable size="small" @change="selcts()" style="margin-left:10px">
+        <el-select v-if="ins != 4 && ins != 8 && ins != 9 && ins != 10 && ins != 11" v-model="proJuctId" placeholder="请选择项目" clearable filterable size="small" @change="selcts()" style="margin-left:10px">
           <el-option v-for="(item) in proListOvertime" :key="item.id" :label="item.projectName + (item.projectCode ? item.projectCode : '')" :value="item.id">
             <span style="float: left;color: #8492a6;">{{ item.projectCode }}</span>
             <span style="float: right;font-size: 13px;margin-left: 20px">{{ item.projectName }}</span>
@@ -82,13 +84,19 @@
         </el-select>
           
           <!-- 部门筛选 -->
-          <el-cascader v-if="(ins == 9 && permissions.reportAllTimely) || (ins == 8 && permissions.reportAllTimeDivide) || (ins == 6 && permissions.reportAllOvertime)" v-model="departmentIdArray" :options="departmentList" placeholder="请选择部门"
+          <el-cascader v-if="(ins == 9 && (permissions.reportAllTimely || permissions.reportTimely)) || (ins == 8 && (permissions.reportAllTimeDivide || permissions.reportTimeDivide)) || (ins == 6 && (permissions.reportAllOvertime || permissions.reportOvertime)) || (ins == 11 && (permissions.reportPersonnel || permissions.reportResponsible))" v-model="departmentIdArray" :options="departmentList" placeholder="请选择部门"
             :props="{ checkStrictly: false,expandTrigger: 'hover' }" :show-all-levels="false" clearable
             @change="selcts(9)" size="small" style="margin-left:10px"
           ></el-cascader>
 
+          <!-- 任务筛选 -->
+          <el-select v-if="ins == 1" v-model="taskTypeId" placeholder="请选择类型" clearable filterable size="small" @change="selcts()" style="margin-left:10px">
+            <el-option v-for="(item) in taskTypeObj" :key="item.id" :label="item.value" :value="item.id">
+            </el-option>
+          </el-select>
+
           <!-- 人员筛选 -->
-          <el-select v-if="ins == 6 || ins == 8 || ins == 9 || ins == 10" v-model="userId" placeholder="请选择人员" @change="selcts()" clearable filterable size="small" style="margin-left:10px;width:150px">
+          <el-select v-if="ins == 6 || ins == 8 || ins == 9 || ins == 10 || ins == 11" v-model="userId" placeholder="请选择人员" @change="selcts()" clearable filterable size="small" style="margin-left:10px;width:150px">
             <el-option v-for="(item, index) in selUserList" :key="index" :label="item.name" :value="item.id"></el-option>
           </el-select>
       </div>
@@ -456,6 +464,27 @@
                 <el-table-column prop="departmentName" label="所属部门" min-width="200" align="center"></el-table-column>
                 <el-table-column prop="num" label="待审核条数" min-width="200" align="center"></el-table-column>
             </el-table>
+
+            <!-- 人员工时统计表 -->
+            <el-table v-if="ins == 11" key="11" border :data="personnelList" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
+                <el-table-column prop="name" label="姓名" min-width="200" align="center"></el-table-column>
+                <el-table-column prop="departmentName" label="部门" min-width="200" align="center"></el-table-column>
+                <el-table-column prop="planHours" label="计划工时" min-width="200" align="center">
+                  <template slot-scope="scope">
+                    <div v-if="scope.row.planHours">
+                      {{scope.row.planHours == null ? 0 : scope.row.planHours.toFixed(1)}}h
+                    </div>
+                  </template>
+                </el-table-column>
+                <el-table-column prop="workingTime" label="实际工时" min-width="200" align="center">
+                  <template slot-scope="scope">
+                    <div v-if="scope.row.workingTime">
+                      {{scope.row.workingTime == null ? 0 : scope.row.workingTime.toFixed(1)}}h
+                    </div>
+                  </template>
+                </el-table-column>
+                <el-table-column prop="proportion" label="实际用时占比" min-width="200" align="center"></el-table-column>
+            </el-table>
             
 
         <!--工具条-->
@@ -609,6 +638,8 @@ export default {
       title:'',
       childrenList:[],
       taskTypeTxt:["任务", "里程碑", "风险"],
+      taskTypeObj: [{id: '0',value: '任务'},{id: '1',value: '里程碑'},{id: '2',value: '风险'}],
+      taskTypeId: null,
       taskStatusTxt:["进行中","已完成","已撤销"],
       statusTxt:["-","进行中","已完成","已撤销"],
       importanceList:[{id:1,label:'正常'},{id:2,label:'紧急'},{id:3,label:'重要'},{id:4,label:'重要且紧急'}],
@@ -670,7 +701,9 @@ export default {
       departmentOrProject: 1,
 
       allWrong: true,
-      defaultActive: '1-1'
+      defaultActive: '1-1',
+
+      personnelList: [], //'人员工时统计表'
     };
   },
   computed: {},
@@ -725,14 +758,15 @@ export default {
       if(this.permissions.reportProject) {this.ssl(0);this.defaultActive = '1-1';return} else
       if(this.permissions.reportTask) {this.ssl(1);this.defaultActive = '1-2';return} else
       if(this.permissions.reportCostOf) {this.ssl(2);this.defaultActive = '1-3';return} else
-      if(this.permissions.reportTimeDivide) {this.ssl(8);this.defaultActive = '1-9';return} else
+      if(this.permissions.reportTimeDivide || this.permissions.reportAllTimeDivide) {this.ssl(8);this.defaultActive = '1-9';return} else
       if(this.permissions.reportCostWarning) {this.ssl(7);this.defaultActive = '1-4';return} else
       if(this.permissions.reportBalance) {this.ssl(3);this.defaultActive = '1-5';return} else
       if(this.permissions.reportProfits) {this.ssl(4);this.defaultActive = '1-6';return} else
       if(this.permissions.reportPhase) {this.ssl(5);this.defaultActive = '1-7';return} else
-      if(this.permissions.reportOvertime) {this.ssl(6);this.defaultActive = '1-8';return} else
-      if(this.permissions.reportTimely) {this.ssl(9);this.defaultActive = '1-10';return} else
-      if(this.permissions.reportAuditRate) {this.ssl(10);this.defaultActive = '1-11';return} else {this.allWrong = false}
+      if(this.permissions.reportOvertime || this.permissions.reportAllOvertime) {this.ssl(6);this.defaultActive = '1-8';return} else
+      if(this.permissions.reportTimely || this.permissions.reportAllTimely) {this.ssl(9);this.defaultActive = '1-10';return} else
+      if(this.permissions.reportAuditRate) {this.ssl(10);this.defaultActive = '1-11';return} else 
+      if(this.permissions.reportPersonnel || this.permissions.reportResponsible) {this.ssl(11);this.defaultActive = '1-12';return}{this.allWrong = false}
     },
     rowspan(spanArr,position,spanName){
       this.list1.forEach((item,index) => {
@@ -775,7 +809,8 @@ export default {
       this.http.post('/user/getEmployeeList', {
         departmentId: -1,
         pageIndex: 1,
-        pageSize: 99999
+        // pageSize: 99999
+        pageSize: -1
       },
       res => {
           if (res.code == "ok") {
@@ -934,6 +969,8 @@ export default {
                     this.getReportTimelyList()
                 } else if (this.ins == 10) {
                     this.getAuditRateList()
+                } else if(this.ins == 11) {
+                    this.getPersonnelList()
                 }
             },
       exportExcel() {
@@ -946,6 +983,9 @@ export default {
         } else if (this.ins == 1) {
           fName = "项目任务报表.xls";
           url += "/exportProjectTask";
+          if(this.taskTypeId != 'null' && this.taskTypeId != null && this.taskTypeId != '') {
+            sl.taskType = this.taskTypeId
+          }
         } else if (this.ins == 2) {
           fName = "项目成本报表.xls";
           url += "/exportAllProjectCost";
@@ -986,6 +1026,17 @@ export default {
           if(this.userId){
             sl.userId = this.userId
           }
+        } else if(this.ins == 11){
+          fName = "人员工时统计.xls"
+          url += "/exportUserWorkingTimeStatic"
+          sl.startDate = this.rangeDatas[0]
+          sl.endDate = this.rangeDatas[1]
+          if(this.userId){
+            sl.userId = this.userId
+          }
+          if(this.departmentIdArray.length != 0){
+            sl.departmentId = this.departmentIdArray[this.departmentIdArray.length - 1]
+          }
         }
           this.http.post(url, sl,
             res => {
@@ -1035,6 +1086,41 @@ export default {
       this.selUserList = this.userList
       this.getList();
     },
+    // 获取人员工时统计表
+    getPersonnelList() {
+      let parameter = {
+        startDate: this.rangeDatas[0],
+        endDate: this.rangeDatas[1],
+        pageIndex: this.page,
+        pageSize: this.size
+      }
+      if(this.userId){
+        parameter.userId = this.userId
+      }
+      if(this.departmentIdArray.length != 0){
+        parameter.departmentId = this.departmentIdArray[this.departmentIdArray.length - 1]
+      }
+      this.listLoading = true;
+      this.http.post('/project/getUserWorkingTimeStatic', parameter,
+        res => {
+            if (res.code == "ok") {
+                this.personnelList = res.data.result;
+                this.total = res.data.total;
+                this.listLoading = false; 
+            } else {
+                this.$message({
+                message: res.msg,
+                type: "error"
+                });
+            }
+        },
+        error => {
+            this.$message({
+                message: error,
+                type: "error"
+            });
+        });
+    },
     getCustomerProjectInAndOut() {
       this.listLoading = true;
       this.http.post('/project/getCustomerProjectInAndOut', {
@@ -1150,11 +1236,16 @@ export default {
     },
     getProjectTask() {
       this.listLoading = true;
-      this.http.post('/project/getProjectTask', {
-                    pageIndex: this.page,
-                    pageSize: this.size,
-                    projectId: this.proJuctId
-                    },
+      let ginseng = {
+        pageIndex: this.page,
+        pageSize: this.size,
+        projectId: this.proJuctId
+      }
+      console.log(this.taskTypeId)
+      if(this.taskTypeId != 'null' && this.taskTypeId != null && this.taskTypeId != '') {
+        ginseng.taskType = this.taskTypeId
+      }
+      this.http.post('/project/getProjectTask', ginseng,
         res => {
             if (res.code == "ok") {
               for(var i in res.data.records) {
@@ -1410,8 +1501,9 @@ export default {
     // 加班情况获取项目
     getProjectListOvertime() {
         this.http.post('/project/getProjectPage', {
-                    pageIndex: 1,
-                    pageSize: 9999,
+            pageIndex: 1,
+            // pageSize: 9999,
+            pageSize: -1,
         },
         res => {
             if (res.code == "ok") {
@@ -1511,6 +1603,9 @@ export default {
       if(this.ins == 10){
         this.getAuditRateList()
       }
+      if(this.ins == 11){
+        this.getPersonnelList()
+      }
     },
     // 日期
     getCurrentRangeTime() {

+ 2 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/expense/expense.vue

@@ -787,7 +787,8 @@ export default {
         this.http.post(this.port.manage.list, {
             departmentId: -1,
             pageIndex: 1,
-            pageSize: 99999
+            // pageSize: 99999
+            pageSize: -1
         },
         res => {
             if (res.code == "ok") {

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

@@ -1300,7 +1300,8 @@ export default {
       this.http.post(this.port.manage.list, {
             departmentId: -1,
             pageIndex: 1,
-            pageSize: 99999
+            // pageSize: 99999
+            pageSize: -1
         },
         res => {
             if (res.code == "ok") {

+ 2 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/project/cost.vue

@@ -197,7 +197,8 @@
                 this.http.post(this.port.manage.list, {
                         departmentId: -1,
                         pageIndex: 1,
-                        pageSize: 99999
+                        // pageSize: 99999
+                        pageSize: -1
                     },
                     res => {
                         if (res.code == "ok") {

+ 2 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/project/custom_data.vue

@@ -140,7 +140,8 @@
                 this.http.post(this.port.manage.list, {
                         departmentId: -1,
                         pageIndex: 1,
-                        pageSize: 99999
+                        // pageSize: 99999
+                        pageSize: -1
                     },
                     res => {
                         if (res.code == "ok") {

+ 2 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/project/fileCenter.vue

@@ -360,7 +360,8 @@
                 this.http.post(this.port.manage.list, {
                     departmentId: -1,
                     pageIndex: 1,
-                    pageSize: 99999
+                    // pageSize: 99999
+                    pageSize: -1
                 },
                 res => {
                     if (res.code == "ok") {

+ 2 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/project/finance.vue

@@ -654,7 +654,8 @@ import { error } from 'dingtalk-jsapi';
                 this.http.post('/user/getEmployeeList', {
                     departmentId: '-1',
                     pageIndex: 1,
-                    pageSize: 99999
+                    // pageSize: 99999
+                    pageSize: -1
                 },res =>{
                     if(res.code == 'ok') {
                         this.people = res.data.records

+ 15 - 2
fhKeeper/formulahousekeeper/timesheet/src/views/project/info.vue

@@ -975,11 +975,20 @@
                 this.addLoading = true;
                 let formData = new FormData();
                 formData.append("id", this.curProjectId);
+                console.log(this.addMembForm.userId, '要传过去的数据')
                 if(this.addMembForm.userId.length != 0) {
                     for(var j in this.addMembForm.userId) {
                         formData.append("userId", this.addMembForm.userId[j]);
                     }
+                } else {
+                    this.addLoading = false;
+                    this.$message({
+                        message: '请选择参与者',
+                        type: 'warning'
+                    });
+                    return
                 }
+                // return
                 this.http.uploadFile('/project/addMemb',formData,
                 res => {
                     this.addLoading = false;
@@ -988,8 +997,10 @@
                             message: "添加成功",
                             type: "success"
                         });
+                        this.addMembForm.userId = []
                         this.addMembVisible = false;
                         this.getProjectInfo();
+                        this.$parent.$parent.$parent.getDetail(); // 调用父级页面的方法
                     } else {
                         this.$message({
                             message: res.msg,
@@ -1046,7 +1057,8 @@
                 this.http.post(this.port.manage.list, {
                     departmentId: -1,
                     pageIndex: 1,
-                    pageSize: 99999
+                    pageSize: -1
+                    // pageSize: 99999
                 },
                 res => {
                     if (res.code == "ok") {
@@ -1342,7 +1354,8 @@
                 this.http.post(this.port.manage.list, {
                     departmentId: -1,
                     pageIndex: 1,
-                    pageSize: 99999
+                    // pageSize: 99999
+                    pageSize: -1
                 },
                 res => {
                     if (res.code == "ok") {

+ 6 - 2
fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue

@@ -144,6 +144,8 @@
                      </div>
                 </template>
             </el-table-column>
+            <el-table-column prop="projectMainName" label="主项目" sortable="custom" min-width="250" v-if="user.timeType.mainProjectState == '1'">
+            </el-table-column>
             <el-table-column prop="inchargerName" label="负责人" sortable="custom" min-width="150">
                 <template slot-scope="scope">
                     <el-link type="primary" :underline="false" @click="showUser(scope.row.inchargerId)">{{scope.row.inchargerName}}</el-link>
@@ -1138,7 +1140,8 @@ a {
             getSupplierList() {
                 this.http.post('/provider-info/list', {
                     pageIndex: 1,
-                    pageSize: 999,
+                    // pageSize: 999,
+                    pageSize: -1,
                     keyword: ''
                 },
                 res => {
@@ -2552,7 +2555,8 @@ a {
                 this.http.post(this.port.manage.list, {
                     departmentId: -1,
                     pageIndex: 1,
-                    pageSize: 99999
+                    // pageSize: 99999
+                    pageSize: -1
                 },
                 res => {
                     if (res.code == "ok") {

+ 2 - 2
fhKeeper/formulahousekeeper/timesheet/src/views/project/projectInside.vue

@@ -2710,7 +2710,7 @@ import delete$ from 'dingtalk-jsapi/api/biz/cspace/delete';
                 this.http.post(this.port.manage.list, {
                     departmentId: -1,
                     pageIndex: 1,
-                    pageSize: 99999
+                    pageSize: -1
                 },
                 res => {
                     if (res.code == "ok") {
@@ -2904,7 +2904,7 @@ import delete$ from 'dingtalk-jsapi/api/biz/cspace/delete';
                 })
                 .catch(() => {});
             },
-
+ 
             detail(i) {
                 this.$router.push("/list/" + this.list[i].id + "/" + this.list[i].projectName);
             },

+ 13 - 6
fhKeeper/formulahousekeeper/timesheet/src/views/task/list.vue

@@ -29,10 +29,13 @@
                 <el-form-item >
                     <div style="margin-left: 8px">
                     <!-- <el-input style="float:left;" v-model="keyword" class="input-with-select" placeholder="请输入项目名称关键字" clearable="true"> -->
-                        <el-select v-model="typeField" style="width:120px;"  slot="prepend" placeholder="请选择">
-                            <el-option label="任务" value="0" @click.native="hiddens()"></el-option>
+                        <el-select v-model="typeField" style="width:120px;"  slot="prepend" placeholder="请选择" clearable @change="hiddens()">
+                            <!-- <el-option label="任务" value="0" @click.native="hiddens()"></el-option>
                             <el-option label="里程碑" value="1" @click.native="hiddens()"></el-option>
-                            <el-option label="风险" value="2" @click.native="hiddens()"></el-option>
+                            <el-option label="风险" value="2" @click.native="hiddens()"></el-option> -->
+                            <el-option label="任务" value="0"></el-option>
+                            <el-option label="里程碑" value="1"></el-option>
+                            <el-option label="风险" value="2"></el-option>
                         </el-select>
                         <!-- <el-button slot="append" @click="searchList" icon="el-icon-search"></el-button> -->
                     <!-- </el-input> -->
@@ -673,7 +676,7 @@ import { error } from 'dingtalk-jsapi';
         },
         data() {
             return {
-                typeField: '0',
+                typeField: null,
                 searchField: '0',
                 keyword:null,
                 user: JSON.parse(sessionStorage.getItem("user")),
@@ -909,7 +912,8 @@ import { error } from 'dingtalk-jsapi';
                 this.http.post(this.port.manage.list, {
                     departmentId: -1,
                     pageIndex: 1,
-                    pageSize: 99999
+                    // pageSize: 99999
+                    pageSize: -1
                 },
                 res => {
                     if (res.code == "ok") {
@@ -970,7 +974,10 @@ import { error } from 'dingtalk-jsapi';
                     viewId: this.idx,
                     pageIndex: this.page,
                     pageSize: this.size,
-                    type: this.typeField
+                    // type: this.typeField
+                }
+                if(this.typeField != 'null' && this.typeField != null && this.typeField != '') {
+                    parameter.type = this.typeField
                 }
                 if(this.dateSelect.length != 0){
                     parameter.dateType = this.dateType

+ 4 - 2
fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue

@@ -1649,7 +1649,8 @@ export default {
         {
           departmentId: -1,
           pageIndex: 1,
-          pageSize: 99999,
+          // pageSize: 99999,
+          pageSize: -1,
         },
         (res) => {
           if (res.code == "ok") {
@@ -1734,7 +1735,8 @@ export default {
         {
           departmentId: -1,
           pageIndex: 1,
-          pageSize: 99999,
+          // pageSize: 99999,
+          pageSize: -1,
           keyword: this.keyword,
         },
         (res) => {

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

@@ -695,7 +695,8 @@
                 this.http.post(this.port.manage.list, {
                     departmentId: -1,
                     pageIndex: 1,
-                    pageSize: 99999
+                    // pageSize: 99999
+                    pageSize: -1
                 },
                 res => {
                     if (res.code == "ok") {

+ 5 - 1
fhKeeper/formulahousekeeper/timesheet_h5/src/views/error/index.vue

@@ -6,6 +6,7 @@
             <p><img src="../../assets/img/kf.jpg" style="width:100%;" /></p>
             <p>QQ:3052894409</p>
             <p>电话:<a href="tel://15895914665">15895914665</a></p>
+            <p v-if="errorMsg == '账号不存在'" style="text-align:center;"><van-button @click="clearAccount" type="info">清空重试</van-button></p>
         </div>
     </div>
 </template>
@@ -31,7 +32,10 @@
         created() {
         },
         methods: {
-            
+            clearAccount() {
+                localStorage.removeItem('userInfo');
+                alert('清除成功,请关闭后重新进入系统');
+            }
 
         },
 

+ 2 - 1
fhKeeper/formulahousekeeper/timesheet_h5/src/views/project/index.vue

@@ -199,7 +199,8 @@
                 this.$axios.post("/user/getEmployeeList", {
                     departmentId: -1,
                     pageIndex: 1,
-                    pageSize: 99999
+                    // pageSize: 99999
+                    pageSize: -1
                 })
                 .then(res => {
                     if(res.code == "ok") {