Pārlūkot izejas kodu

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

ggooalice 2 gadi atpakaļ
vecāks
revīzija
7ff2cacd83
24 mainītis faili ar 50143 papildinājumiem un 9098 dzēšanām
  1. 4 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java
  2. 8 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java
  3. 181 177
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java
  4. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/LeaveSheetMapper.java
  5. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectService.java
  6. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/WxCorpInfoService.java
  7. 5 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ExcelExportServiceImpl.java
  8. 4 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceImportServiceImpl.java
  9. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceServiceImpl.java
  10. 153 74
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  11. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  12. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/SimpleReportServiceImpl.java
  13. 3 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/TaskServiceImpl.java
  14. 7 5
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  15. 174 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java
  16. 18 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java
  17. 12 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/i18n/messages.properties
  18. 12 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/i18n/messages_en_US.properties
  19. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/LeaveSheetMapper.xml
  20. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml
  21. 49545 8815
      fhKeeper/formulahousekeeper/management-platform/workTime.log
  22. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/views/project/finance.vue
  23. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue
  24. 3 0
      fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue

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

@@ -429,14 +429,14 @@ public class ProjectController {
 
     //分页查询员工月度工时表
     @RequestMapping("/getEmpMonthHours")
-    public HttpRespMsg getEmpMonthHours(@RequestParam Integer pageIndex, @RequestParam Integer pageSize, String month,Integer departmentId,String userId) {
-        return projectService.getEmpMonthHours(pageIndex, pageSize, month,departmentId,userId, request);
+    public HttpRespMsg getEmpMonthHours(@RequestParam Integer pageIndex, @RequestParam Integer pageSize, String month,Integer departmentId,String userId,Integer whether) {
+        return projectService.getEmpMonthHours(pageIndex, pageSize, month,departmentId,userId,whether,request);
     }
 
     //导出员工月度工时表
     @RequestMapping("/exportEmpMonthHours")
-    public HttpRespMsg exportEmpMonthHours(String month,String userId,Integer departmentId) {
-        return projectService.exportEmpMonthHours(month,request,userId,departmentId);
+    public HttpRespMsg exportEmpMonthHours(String month,String userId,Integer departmentId,Integer whether) {
+        return projectService.exportEmpMonthHours(month,request,userId,departmentId,whether);
     }
 
     //分页查询项目收支平衡表

+ 8 - 4
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java

@@ -320,7 +320,8 @@ public class ReportController {
             //员工自由选择审批人
             if (auditorSettingArray == null) {
                 HttpRespMsg msg = new HttpRespMsg();
-                msg.setError("请设置审批人");
+                //msg.setError("请设置审批人");
+                msg.setError(MessageUtils.message("profession.approver"));
                 return msg;
             } else {
                 auditorSettingList = new ArrayList<>();
@@ -335,16 +336,19 @@ public class ReportController {
                     //检查审核人层级是否设置满
                     if (comTimeType.getAuditLevel() == 1 && reportAuditorSetting.getAuditorFirst() == null) {
                         HttpRespMsg msg = new HttpRespMsg();
-                        msg.setError("请设置审核人");
+                        //msg.setError("请设置审核人");
+                        msg.setError(MessageUtils.message("profession.checker"));
                         return msg;
                     } else if (comTimeType.getAuditLevel() == 2 && (reportAuditorSetting.getAuditorFirst() == null || reportAuditorSetting.getAuditorSec() == null)) {
                         HttpRespMsg msg = new HttpRespMsg();
-                        msg.setError("请设置审核人");
+                        //msg.setError("请设置审核人");
+                        msg.setError(MessageUtils.message("profession.checker"));
                         return msg;
                     }else if (comTimeType.getAuditLevel() == 3 && (reportAuditorSetting.getAuditorFirst() == null || reportAuditorSetting.getAuditorSec() == null
                                                                     || reportAuditorSetting.getAuditorThird() == null)) {
                         HttpRespMsg msg = new HttpRespMsg();
-                        msg.setError("请设置审核人");
+                        //msg.setError("请设置审核人");
+                        msg.setError(MessageUtils.message("profession.checker"));
                         return msg;
                     }
                     //设置审核人为第一审核人

+ 181 - 177
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java

@@ -533,6 +533,7 @@ public class WeiXinCorpController {
                         JSONObject userObj = getUserInfo(getCorpAccessToken(wxCorpInfo), corpWxUserId);
                         //成功获取到通讯录的个人详情
                         Long id = SnowFlake.nextId();
+                        //通过getUserInfo接口获取到的json key是小写的
                         JSONArray department = userObj.getJSONArray("department");
                         Integer curUserWXDeptid = getMaxDeptIdFromArray(department);
                         Department sysDept = departmentMapper.selectOne(new QueryWrapper<Department>().eq("company_id", companyId).eq("corpwx_deptid", curUserWXDeptid));
@@ -556,11 +557,20 @@ public class WeiXinCorpController {
                             userMapper.insert(user);
                         }
                     } else if (!StringUtils.isEmpty(wxCorpInfo.getContactSecret()) && !StringUtils.isEmpty(wxCorpInfo.getContactServer())) {
-                        //通过通讯录secret获取到员工姓名
+                        //通过通讯录secret获取到员工姓名;这是从内部通讯录的
                         String remoteCorpConcactAccessToken = getRemoteCorpConcactAccessToken(wxCorpInfo);
                         String curCorpAccessToken = getCorpAccessToken(wxCorpInfo);
-                        org.json.JSONArray departmentArray = jsonObject.getJSONArray("department");
-                        Integer curUserWXDeptid = departmentArray.getInt(departmentArray.length() - 1);
+                        Integer curUserWXDeptid = 1;
+                        if (jsonObject.has("Department")) {
+                            if (jsonObject.get("Department") instanceof String) {
+                                String jsonObject1 = jsonObject.getString("Department");
+                                curUserWXDeptid = Integer.parseInt(jsonObject1);
+                            } else if (jsonObject.get("Department") instanceof org.json.JSONArray) {
+                                org.json.JSONArray departmentArray = jsonObject.getJSONArray("Department");
+                                curUserWXDeptid = getMaxDeptIdFromArray(departmentArray);
+                            }
+                        }
+
                         JSONObject userObj = remoteGetUserDetail(wxCorpInfo, remoteCorpConcactAccessToken, corpWxUserId, curUserWXDeptid, curCorpAccessToken);
                         if (userObj != null) {
                             //成功获取到通讯录的个人详情
@@ -580,17 +590,13 @@ public class WeiXinCorpController {
                                     .setCorpwxRealUserid(corpWxUserId)
                                     .setJobNumber(userObj.getString("userid"))
                                     .setColor(ColorUtil.randomColor())
+                                    .setCorpwxDeptid(curUserWXDeptid)
                                     .setCompanyId(companyId);
                             if (sysDept != null) {
                                 user.setDepartmentId(sysDept.getDepartmentId());
+                                List<Department> allDeptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
+                                user.setDepartmentCascade(convertDepartmentIdToCascade(user.getDepartmentId(), allDeptList));
                             }
-//                            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) {
-//                                    user.setSuperiorId(leader.getId());
-//                                }
-//                            }
                             userMapper.insert(user);
                         }
                     }
@@ -656,7 +662,7 @@ public class WeiXinCorpController {
                                 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 user = userMapper.selectOne(new QueryWrapper<User>().eq("company_id", companyId).eq("corpwx_userid", openUserId));
                                 User changeUser = new User();
                                 changeUser.setId(user.getId());
 
@@ -1699,6 +1705,10 @@ public class WeiXinCorpController {
                     changeUser.setId(oldUser.getId());
                     changeUser.setJobNumber(userItem.getJobNumber());
                 }
+                if (userItem.getCorpwxRealUserid() != null && !userItem.getCorpwxRealUserid().equals(oldUser.getCorpwxRealUserid())) {
+                    changeUser.setId(oldUser.getId());
+                    changeUser.setCorpwxRealUserid(userItem.getCorpwxRealUserid());
+                }
                 if (!userItem.getName().equals(oldUser.getName())) {
                     changeUser.setId(oldUser.getId());
                     changeUser.setName(userItem.getName());
@@ -1766,14 +1776,13 @@ public class WeiXinCorpController {
             return msg;
         }
         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;
+        List<User> allCorpWxUserList = new ArrayList<>();
         if (syncMembs == 1) {
-            JSONArray rootCorpUserJsonArray = getDeptUserInfo(curCorpAccessToken, companyRootDeptId);
+            JSONArray rootCorpUserJsonArray = getDeptUserSimple(curCorpAccessToken, companyRootDeptId);
             //获取远程的带姓名的详情,通过企业通讯录的token获取
             JSONArray remoteUnAUserList = null;
             if (rootCorpUserJsonArray.size() > 0) {
@@ -1805,9 +1814,6 @@ public class WeiXinCorpController {
                     return msg;
                 }
             }
-
-            List<User> updateUserList = new ArrayList<>();
-
             for (int m=0;m<rootCorpUserJsonArray.size(); m++) {
                 JSONObject userJson = rootCorpUserJsonArray.getJSONObject(m);
                 String curUserid = userJson.getString("userid");
@@ -1816,7 +1822,13 @@ public class WeiXinCorpController {
                 System.out.println("userid="+curUserid+", name=" + userJson.getString("name")+", department="+userJson.getJSONArray("department"));
                 //不存在的人员, 进行插入
                 User user = new User();
-
+                JSONArray userDeptArray = userJson.getJSONArray("department");
+                //取最末级的,也就是最大的deptId
+                int maxDeptId = 1;
+                for (int i=0;i<userDeptArray.size(); i++) {
+                    int curId = userDeptArray.getInteger(i);
+                    if (curId > maxDeptId) maxDeptId = curId;
+                }
                 user.setId(SnowFlake.nextId()+"")
                         .setRoleId(defaultRole.getId())//默认普通员工
                         .setRoleName(defaultRole.getRolename())
@@ -1824,6 +1836,7 @@ public class WeiXinCorpController {
                         .setName(userJson.getString("name"))
                         .setPhone(userJson.getString("mobile"))
                         .setCorpwxUserid(curUserid)
+                        .setCorpwxDeptid(maxDeptId)
                         .setColor(ColorUtil.randomColor());
                 //获取姓名
                 if (remoteUnAUserList != null) {
@@ -1833,47 +1846,21 @@ public class WeiXinCorpController {
                             user.setName(remoteUserJson.getString("name"));
                             user.setJobNumber(remoteUserJson.getString("userid"));
                             user.setPhone(remoteUserJson.getString("mobile"));
+                            //设置实际的企业内部UserID
+                            user.setCorpwxRealUserid(remoteUserJson.getString("userid"));
                             break;
                         }
                     }
                 }
-                //检查用户是否已经存在
-                User oldUser = userMapper.selectOne(new QueryWrapper<User>().select("id, name, job_number, phone").eq("corpwx_userid", curUserid).eq("company_id", companyId));
-                if (oldUser == null) {
-                    updateUserList.add(user);
-                } else {
-                    boolean hasChange = false;
-                    User updateUser = new User();
-                    updateUser.setId(oldUser.getId());
-                    //工号或者手机号更新了
-                    if (user.getJobNumber() != null && !user.getJobNumber().equals(oldUser.getJobNumber())) {
-                        hasChange = true;
-                        updateUser.setJobNumber(user.getJobNumber());
-                    }
-                    if (user.getPhone() != null && !user.getPhone().equals(oldUser.getPhone())) {
-                        hasChange = true;
-                        updateUser.setPhone(user.getPhone());
-                    }
-                    if (user.getName() != null && !user.getName().equals(oldUser.getName())) {
-                        hasChange = true;
-                        updateUser.setName(user.getName());
-                    }
-                    if (hasChange) {
-                        //需要更新
-                        updateUserList.add(updateUser);
-                    }
-                }
-            }
-            if (updateUserList.size() > 0) {
-                userService.saveOrUpdateBatch(updateUserList);
+                allCorpWxUserList.add(user);
             }
         }
 
         //获取公司全部部门,不需要递归
         JSONObject deptObj = getAllDepartments(curCorpAccessToken);
         JSONArray deptObjJSONArray = deptObj.getJSONArray("department");
+        List<Department> oldDeptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
 
-//        List<Department> sysDeptList = new ArrayList<>();
         for (int i=0;i<deptObjJSONArray.size(); i++) {
             int deptId = deptObjJSONArray.getJSONObject(i).getIntValue("id");
             Department department = new Department();
@@ -1881,7 +1868,8 @@ public class WeiXinCorpController {
             //设置企业微信的部门id
             JSONObject cutDeptJson = deptObjJSONArray.getJSONObject(i);
             department.setCorpwxDeptid(cutDeptJson.getInteger("id"));
-            department.setCorpwxDeptpid(cutDeptJson.getInteger("parentid"));
+            Integer parentId = cutDeptJson.getInteger("parentid");
+            department.setCorpwxDeptpid(parentId);
             System.out.println("开始远程获取部门详情=====");
             String url = TRANSMIT_SERVER_GET_DEPTDETAIL.replace(TRANSMIT_SERVER_STR, wxCorpInfo.getContactServer()).replace("ACCESS_TOKEN", corpContactAccessToken).replace("DEPTID", ""+deptId);
             String result = restTemplate.getForObject(url, String.class);
@@ -1896,166 +1884,182 @@ public class WeiXinCorpController {
             }
 
             //检查是否已经有了
-            Department oldDept = departmentMapper.selectOne(new QueryWrapper<Department>().eq("company_id", companyId).eq("corpwx_deptid", department.getCorpwxDeptid()).last("limit 1"));
-            if (oldDept == null) {
+            Optional<Department> first = oldDeptList.stream().filter(old -> old.getCorpwxDeptid() != null && old.getCorpwxDeptid().equals(deptId)).findFirst();
+            if (!first.isPresent()) {
                 if (deptId != 1) {
                     //忽略根,根是公司名称
                     departmentMapper.insert(department);
                 }
             } 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());
+                Department oldDept = first.get();
+                if (oldDept.getCorpwxDeptpid() == null || !oldDept.getCorpwxDeptpid().equals(department.getCorpwxDeptpid())) {
+                    //有父部门需要更新
+                    oldDept.setCorpwxDeptpid(parentId);
                     departmentMapper.updateById(oldDept);
                 }
                 department = oldDept;
             }
 
-            deptObjJSONArray.getJSONObject(i).put("sys_dept_id", department.getDepartmentId());
             Integer departmentId = department.getDepartmentId();
             if (syncMembs == 1) {
-                JSONArray userList = getDeptUserInfo(curCorpAccessToken, deptId);
+                JSONArray userList = getDeptUserSimple(curCorpAccessToken, deptId);
                 JSONArray remoteDeptUserList = null;
                 if (userList.size() > 0) {
-                    remoteDeptUserList = remoteGetDeptUserDetail(wxCorpInfo, corpContactAccessToken, deptId);
-                    //做id转化
-                    List<String> corpUserIds = new ArrayList<>();
-                    for (int p=0;p<remoteDeptUserList.size(); p++) {
-                        corpUserIds.add(remoteDeptUserList.getJSONObject(p).getString("userid"));
+                    //检查该部门下的人员是否已经存在
+                    boolean hasOneNotExist = false;
+                    for (int m = 0; m<userList.size(); m++) {
+                        JSONObject jsonObject = userList.getJSONObject(m);
+                        String openUserid = jsonObject.getString("open_userid");
+                        boolean match = allCorpWxUserList.stream().anyMatch(all->all.getCorpwxUserid().equals(openUserid));
+                        if (!match) {
+                            hasOneNotExist = true;
+                            break;
+                        }
                     }
-                    try {
-                        JSONArray array = convertUserIdToOpenUserId(curCorpAccessToken, corpUserIds);
-                        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("openUserid", openUserid);
-                                    break;
+                    //至少存在一个不存在的,需要重新获取该部门的成员
+                    if (hasOneNotExist) {
+                        remoteDeptUserList = remoteGetDeptUserDetail(wxCorpInfo, corpContactAccessToken, deptId);
+                        //做id转化
+                        List<String> corpUserIds = new ArrayList<>();
+                        for (int p=0;p<remoteDeptUserList.size(); p++) {
+                            corpUserIds.add(remoteDeptUserList.getJSONObject(p).getString("userid"));
+                        }
+                        try {
+                            JSONArray array = convertUserIdToOpenUserId(curCorpAccessToken, corpUserIds);
+                            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("openUserid", openUserid);
+                                        break;
+                                    }
                                 }
                             }
+                        } catch (Exception exception) {
+                            exception.printStackTrace();
+                            //msg.setError("同步失败:"+exception.getMessage());
+                            msg.setError(MessageUtils.message("wx.synError",exception.getMessage()));
+                            return msg;
                         }
-                    } catch (Exception exception) {
-                        exception.printStackTrace();
-                        //msg.setError("同步失败:"+exception.getMessage());
-                        msg.setError(MessageUtils.message("wx.synError",exception.getMessage()));
-                        return msg;
-                    }
-                }
-                List<User> updateUserList = new ArrayList<>();
-                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("openUserid").equals(curUserid)) {
-                                //匹配到了。设置姓名
-                                System.out.println("远程的用户匹配到了:"+remoteUserJson.getString("name"));
-                                user.setName(remoteUserJson.getString("name"));
-                                user.setJobNumber(remoteUserJson.getString("userid"));
-                                user.setPhone(remoteUserJson.getString("mobile"));
-                                break;
+                        for (int m=0;m<userList.size(); m++) {
+                            JSONObject userJson = userList.getJSONObject(m);
+                            String curUserid = userJson.getString("userid");
+                            String openUserid = userJson.getString("open_userid");
+                            //跳过已经获取过的
+                            if (allCorpWxUserList.stream().anyMatch(item->item.getCorpwxUserid().equals(openUserid))) {
+                                continue;
                             }
-                        }
-                    }
-                    //检查用户是否已经存在
-                    User oldUser = userMapper.selectOne(new QueryWrapper<User>().select("id, name, job_number, phone").eq("corpwx_userid", curUserid).eq("company_id", companyId));
-                    if (oldUser == null) {
-                        updateUserList.add(user);
-                    } else {
-                        boolean hasChange = false;
-                        User updateUser = new User();
-                        updateUser.setId(oldUser.getId());
-                        //工号或者手机号更新了
-                        if (user.getJobNumber() != null && !user.getJobNumber().equals(oldUser.getJobNumber())) {
-                            hasChange = true;
-                            updateUser.setJobNumber(user.getJobNumber());
-                        }
-                        if (user.getPhone() != null && !user.getPhone().equals(oldUser.getPhone())) {
-                            hasChange = true;
-                            updateUser.setPhone(user.getPhone());
-                        }
-                        if (user.getName() != null && !user.getName().equals(oldUser.getName())) {
-                            hasChange = true;
-                            updateUser.setName(user.getName());
-                        }
-                        if (hasChange) {
-                            //需要更新
-                            updateUserList.add(updateUser);
+                            log.info("userid="+curUserid+", name=" + userJson.getString("name")+", mobile="+userJson.getString("mobile"));
+                            //不存在的人员, 进行插入
+                            User user = new User();
+                            JSONArray userDeptArray = userJson.getJSONArray("department");
+                            //取最末级的,也就是最大的deptId
+                            int maxDeptId = 1;
+                            for (int t=0;t<userDeptArray.size(); t++) {
+                                int curId = userDeptArray.getInteger(t);
+                                if (curId > maxDeptId) maxDeptId = curId;
+                            }
+                            user.setId(SnowFlake.nextId()+"")
+                                    .setRoleId(defaultRole.getId())
+                                    .setRoleName(defaultRole.getRolename())
+                                    .setCompanyId(companyId)
+                                    .setDepartmentId(departmentId)
+                                    .setPhone(userJson.getString("mobile"))
+                                    .setName(userJson.getString("name"))
+                                    .setCorpwxUserid(openUserid)
+                                    .setCorpwxDeptid(maxDeptId)
+                                    .setColor(ColorUtil.randomColor());
+                            //获取姓名
+                            if (remoteDeptUserList != null) {
+                                for (int t=0;t<remoteDeptUserList.size(); t++) {
+                                    JSONObject remoteUserJson = remoteDeptUserList.getJSONObject(t);
+                                    if (remoteUserJson.getString("openUserid").equals(curUserid)) {
+                                        //匹配到了。设置姓名
+                                        System.out.println("远程的用户匹配到了:"+remoteUserJson.getString("name"));
+                                        user.setName(remoteUserJson.getString("name"));
+                                        user.setJobNumber(remoteUserJson.getString("userid"));
+                                        user.setPhone(remoteUserJson.getString("mobile"));
+                                        user.setCorpwxRealUserid(remoteUserJson.getString("userid"));
+                                        break;
+                                    }
+                                }
+                            }
+                            allCorpWxUserList.add(user);
                         }
                     }
                 }
-                if (updateUserList.size() > 0) {
-                    userService.saveOrUpdateBatch(updateUserList);
-                }
+
             }
         }
 
-        //再来更新部门的层级关系
-        List<Department> needUpdateDepts = new ArrayList<>();
-        List<Department> allDbDeptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
-        for (Department department : allDbDeptList) {
-            int corpwxpid = department.getCorpwxDeptpid();
-            if (corpwxpid == 1) {
-                //父部门是根部门
-//                if (department.getSuperiorId() != null) {
-//                    department.setSuperiorId(0);
-//                    needUpdateDepts.add(department);
-//                }
-            } else {
-                Optional<Department> first = allDbDeptList.stream().filter(all -> all.getCorpwxDeptid().intValue() == corpwxpid).findFirst();
-                if (first.isPresent()) {
-                    //按照企业微信的部门父部门找到了
-                    Integer sysPid = first.get().getDepartmentId();
-                    if (!sysPid.equals(department.getSuperiorId())) {
-                        department.setSuperiorId(sysPid);
-                        needUpdateDepts.add(department);
+        //更新部门层级关系
+        updateDeptHierachyByCorpWx(companyId);
+
+        //设置人员所属部门
+        List<Department> allDeptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
+        List<User> existingUsers = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
+        List<User> newUserList = allCorpWxUserList.stream().filter(newItem -> !existingUsers.stream().anyMatch(existingItem -> newItem.getCorpwxUserid().equals(existingItem.getCorpwxUserid()))).collect(Collectors.toList());
+        newUserList.forEach(newItem->{
+            if (newItem.getCorpwxDeptid() != 1) {
+                Integer deptId = allDeptList.stream().filter(all->all.getCorpwxDeptid() != null && all.getCorpwxDeptid().equals(newItem.getCorpwxDeptid())).findFirst().get().getDepartmentId();
+                newItem.setDepartmentId(deptId);
+                newItem.setDepartmentCascade(convertDepartmentIdToCascade(deptId, allDeptList));
+            }
+        });
+        if (newUserList.size() > 0) {
+            userService.saveBatch(newUserList);
+        }
+        //姓名,部门,账号的同步更新
+        List<User> finalUpdateUserList = new ArrayList<>();
+        for (User userItem : allCorpWxUserList) {
+            Optional<User> first = existingUsers.stream().filter(ex -> userItem.getCorpwxUserid().equals(ex.getCorpwxUserid())).findFirst();
+            if (first.isPresent()) {
+                User oldUser = first.get();
+                User changeUser = new User();
+                if (!userItem.getJobNumber().equals(oldUser.getJobNumber())) {
+                    changeUser.setId(oldUser.getId());
+                    changeUser.setJobNumber(userItem.getJobNumber());
+                }
+                if (userItem.getCorpwxRealUserid() != null && !userItem.getCorpwxRealUserid().equals(oldUser.getCorpwxRealUserid())) {
+                    changeUser.setId(oldUser.getId());
+                    changeUser.setCorpwxRealUserid(userItem.getCorpwxRealUserid());
+                }
+                if (!userItem.getName().equals(oldUser.getName())) {
+                    changeUser.setId(oldUser.getId());
+                    changeUser.setName(userItem.getName());
+                }
+                if (!userItem.getCorpwxDeptid().equals(oldUser.getCorpwxDeptid())) {
+                    changeUser.setId(oldUser.getId());
+                    if (userItem.getCorpwxDeptid() != 1) {
+                        changeUser.setDepartmentId(allDeptList.stream().filter(d->d.getCorpwxDeptid() != null && d.getCorpwxDeptid().equals(userItem.getCorpwxDeptid())).findFirst().get().getDepartmentId());
+                        //设置层级部门
+                        changeUser.setDepartmentCascade(convertDepartmentIdToCascade(changeUser.getDepartmentId(), allDeptList));
+                    } else {
+                        changeUser.setDepartmentId(0);
+                        changeUser.setDepartmentCascade("0");
                     }
                 }
+                if (oldUser.getCorpwxRealUserid() == null || !userItem.getCorpwxRealUserid().equals(oldUser.getCorpwxRealUserid())) {
+                    changeUser.setId(oldUser.getId());
+                    changeUser.setCorpwxRealUserid(userItem.getCorpwxRealUserid());
+                }
+                if (changeUser.getId() != null) {
+                    //有变动
+                    finalUpdateUserList.add(changeUser);
+                }
+            } else {
+                System.out.println("没找到用户:"+userItem.getName()+", "+userItem.getCorpwxUserid());
             }
         }
 
-        if (needUpdateDepts.size() > 0) {
-            departmentService.updateBatchById(needUpdateDepts);
+        if (finalUpdateUserList.size() > 0) {
+            userService.updateBatchById(finalUpdateUserList);
         }
-        //更新人员的deptcascade
-        updateUserDeptCascade(companyId);
-
         return new HttpRespMsg();
     }
 

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

@@ -21,5 +21,5 @@ public interface LeaveSheetMapper extends BaseMapper<LeaveSheet> {
 
     List<LeaveSheet> selectApprovalList();
 
-    List<LeaveSheet> selectLeave(String userId, String startDate, String endDate);
+    List<LeaveSheet> selectLeave(Integer companyId, String startDate, String endDate);
 }

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

@@ -201,7 +201,7 @@ public interface ProjectService extends IService<Project> {
 
     HttpRespMsg testAdd(String jobId);
 
-    HttpRespMsg getEmpMonthHours(Integer pageIndex, Integer pageSize, String month,Integer departmentId,String userId, HttpServletRequest request);
+    HttpRespMsg getEmpMonthHours(Integer pageIndex, Integer pageSize, String month,Integer departmentId,String userId,Integer whether,HttpServletRequest request);
 
-    HttpRespMsg exportEmpMonthHours(String month, HttpServletRequest request, String userId, Integer departmentId);
+    HttpRespMsg exportEmpMonthHours(String month, HttpServletRequest request, String userId, Integer departmentId,Integer whether);
 }

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

@@ -41,4 +41,6 @@ public interface WxCorpInfoService extends IService<WxCorpInfo> {
     public String syncTranslation(String authCorpid,String mediaId,String outPutFileName,String outputFileFormat) throws Exception;
 
     public String getSyncTranslationResult(String jobId) throws Exception;
+
+    public HttpRespMsg getUserPunchRecord(int companyId, String userId, LocalDateTime startDateTime, LocalDateTime endDateTime, boolean showLog);
 }

+ 5 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ExcelExportServiceImpl.java

@@ -7,6 +7,7 @@ import com.management.platform.service.ExcelExportService;
 import com.management.platform.service.WxCorpInfoService;
 import com.management.platform.util.ExcelUtil;
 import com.management.platform.util.HttpRespMsg;
+import com.management.platform.util.MessageUtils;
 import org.apache.poi.hssf.usermodel.*;
 import org.apache.poi.ss.usermodel.BorderStyle;
 import org.apache.poi.ss.usermodel.CellStyle;
@@ -89,7 +90,8 @@ public class ExcelExportServiceImpl implements ExcelExportService {
             if (syncTranslationResult != null) {
                 httpRespMsg.data = syncTranslationResult;
             } else {
-                httpRespMsg.setError("处理超时...");
+                //httpRespMsg.setError("处理超时...");
+                httpRespMsg.setError(MessageUtils.message("request.outTime"));
             }
         }else {
             httpRespMsg.data = resp;
@@ -129,7 +131,8 @@ public class ExcelExportServiceImpl implements ExcelExportService {
             if (syncTranslationResult != null) {
                 httpRespMsg.data = syncTranslationResult;
             } else {
-                httpRespMsg.setError("处理超时...");
+                //httpRespMsg.setError("处理超时...");
+                httpRespMsg.setError(MessageUtils.message("request.outTime"));
             }
         }else {
             httpRespMsg.data = resp;

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

@@ -128,7 +128,8 @@ public class FinanceImportServiceImpl extends ServiceImpl<FinanceImportMapper, F
                 String name = nameCell.getStringCellValue().trim().replaceAll("\\u00a0", "");
                 Finance finance = new Finance();
 
-                if (name.equals("姓名") && rowIndex == 0) {
+                //if (name.equals("姓名") && rowIndex == 0) {
+                if ((name.equals("姓名") || name.equals("name")) && rowIndex == 0) {
                     continue;
                 }
                 finance.setName(name);
@@ -347,7 +348,8 @@ public class FinanceImportServiceImpl extends ServiceImpl<FinanceImportMapper, F
                     String name = nameCell.getStringCellValue().trim().replaceAll("\\u00a0", "");
                     Finance finance = new Finance();
 
-                    if (name.equals("姓名") && rowIndex == 0) {
+                    //if (name.equals("姓名") && rowIndex == 0) {
+                    if ((name.equals("姓名") || name.equals("name")) && rowIndex == 0) {
                         continue;
                     }
                     Cell houseFundCell = row.getCell(8);

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

@@ -342,7 +342,7 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
                         User localUser = new User();
                         localUser.setId(finance.getUserId());
                         localUser.setMonthCost(total);
-                        if (companyId == 936 || companyId == 10) {
+                        if (companyId == 936) {
                             //威派格导入薪资时,按照每月设置的工作天数来计算时薪
                             BigDecimal db = timeType.getMonthDays().multiply(new BigDecimal(timeType.getAllday()));
                             localUser.setCost(total.divide(db, 6, BigDecimal.ROUND_HALF_UP));

+ 153 - 74
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -212,8 +212,12 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     //只能看本人参与的项目
                     httpRespMsg.data = projectMapper.getOnlyJoinProjects(user.getId(), user.getCompanyId());
                 } else {
-                    //有权限的填报全部的
-                    httpRespMsg.data = projectMapper.selectList(new QueryWrapper<Project>().eq("company_id", user.getCompanyId()).orderByDesc("is_public").orderByAsc("id"));
+                    //有权限的填报全部的进行中或者暂停的项目
+                    QueryWrapper<Project> queryWrapper = new QueryWrapper<>();
+                    queryWrapper.eq("company_id", user.getCompanyId())
+                            .and(wrapper->wrapper.eq("status", 1).or().eq("status", 4))
+                            .orderByDesc("is_public").orderByAsc("id");
+                    httpRespMsg.data = projectMapper.selectList(queryWrapper);
                 }
             } else {
                 if (!sysFunctionService.hasPriviledge(user.getRoleId(), "查看全部项目")) {
@@ -397,7 +401,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                             if(providerCategory.isPresent()){
                                 map.put("providerCateGoryName",providerCategory.get().getProviderCategoryName());
                             }else {
-                                map.put("providerCateGoryName","未分类");
+                                //map.put("providerCateGoryName","未分类");
+                                map.put("providerCateGoryName",MessageUtils.message("excel.unclassified"));
                             }
                             map.put("providerInfoName",providerInfo.get().getProviderName());
                         }
@@ -441,7 +446,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 list.add(projectVO);
             }
             List<String> stringList = providerCategoryList.stream().distinct().map(ProviderCategory::getProviderCategoryName).collect(Collectors.toList());
-            stringList.add("未分类");
+            //stringList.add("未分类");
+            stringList.add(MessageUtils.message("excel.unclassified"));
             Long total = projectIPage.getTotal();
             Map<String, Object> map = new HashMap<>();
             map.put("records", list);
@@ -2327,7 +2333,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         itemList.add(parent);
                         btLastItemId =businessTripList.get(i).getOwnerId();
                     }
-                    curItem.id = "出差_"+businessTripList.get(i).getId();
+                    //curItem.id = "出差_"+businessTripList.get(i).getId();
+                    curItem.id = MessageUtils.message("leave.busTra") + "_" + businessTripList.get(i).getId();
                     curItem.userId = businessTripList.get(i).getOwnerId();
                     //curItem.text = "出差";
                     curItem.text = MessageUtils.message("leave.busTra");
@@ -2405,7 +2412,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                 itemList.add(parent);
                                 btLastItemId = String.valueOf(bustripProject.getProjectId());
                             }
-                            curItem.id = "出差_" + businessTrip.getId();
+                            //curItem.id = "出差_" + businessTrip.getId();
+                            curItem.id = MessageUtils.message("leave.busTra") + "_" + businessTrip.getId();
                             curItem.userId = businessTrip.getOwnerId();
                             //curItem.text = "出差/" + businessTrip.getOwnerName();
                             curItem.text = MessageUtils.message("leave.busTra")+"/" + businessTrip.getOwnerName();
@@ -2435,7 +2443,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 String end_date = sdf.format((Date) map.get("end_date"));
                 String projectId = ""+ (Integer) map.get("id");
                 System.out.println(map);
-                String exeId = "任务_"+map.get("task_id") +"_"+ (type==0?(Integer) map.get("exe_id"):userId);
+                //String exeId = "任务_"+map.get("task_id") +"_"+ (type==0?(Integer) map.get("exe_id"):userId);
+                String exeId = MessageUtils.message("excel.task") + "_"+map.get("task_id") +"_"+ (type==0?(Integer) map.get("exe_id"):userId);
                 String taskId = ""+ (Integer) map.get("task_id");
 
                 GanttDataItem curItem = new GanttDataItem();;
@@ -3062,9 +3071,10 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     boolean exists=false;
                     if (codeCell != null) {
                         String code = codeCell.getStringCellValue().trim().replaceAll("\\u00a0", "");
-                        if (code.equals("项目编号") && rowIndex == 0) {
+                        if ((code.equals("项目编号") || code.equals("project No")) && rowIndex == 0) {
                             //检查是否有子项目列
-                            if (!subNameCell.getStringCellValue().trim().startsWith("子项目")) {
+                            //if (!subNameCell.getStringCellValue().trim().startsWith("子项目")) {
+                            if (!subNameCell.getStringCellValue().trim().startsWith(MessageUtils.message("Template.subProject"))) {
                                 throw new Exception("缺少子项目列,请下载最新模板");
                             }
                             //跳过第一行标题
@@ -3134,7 +3144,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         project.setContractAmount(Double.parseDouble(amountCell.getStringCellValue()));
                     }
                     if (isPublicCell != null && !StringUtils.isEmpty(isPublicCell.getStringCellValue())) {
-                        project.setIsPublic("是".equals(isPublicCell.getStringCellValue())?1:0);
+                        project.setIsPublic(MessageUtils.message("excel.yes").equals(isPublicCell.getStringCellValue())?1:0);
                     }
                     if(exists){
                         Project updateProject = projectMapper.selectList(new QueryWrapper<Project>().eq("project_code", project.getProjectCode()).eq("company_id", user.getCompanyId())).get(0);
@@ -3492,14 +3502,15 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     boolean exists=false;
                     if (codeCell != null) {
                         String code = codeCell.getStringCellValue().trim().replaceAll("\\u00a0", "");
-                        if (code.equals("项目编号") && rowIndex == 0) {
+                        if ((code.equals("项目编号") || code.equals("project No")) && rowIndex == 0) {
                             //检查是否有子项目列
-                            if (subNameCell!=null&&!subNameCell.getStringCellValue().trim().startsWith("子项目")&&timeType.getMainProjectState()!=1) {
+                            //if (subNameCell!=null&&!subNameCell.getStringCellValue().trim().startsWith("子项目")&&timeType.getMainProjectState()!=1) {
+                            if (subNameCell!=null&&!subNameCell.getStringCellValue().trim().startsWith(MessageUtils.message("Template.subProject"))&&timeType.getMainProjectState()!=1) {
                                 //throw new Exception("缺少子项目列,请下载最新模板");
                                 throw new Exception(MessageUtils.message("Template.lackSonProject"));
                             }
                             //检查是否有主项目列
-                            if (mainNameCell!=null&&!mainNameCell.getStringCellValue().trim().startsWith("主项目")&&timeType.getMainProjectState()==1) {
+                            if (mainNameCell!=null&&!mainNameCell.getStringCellValue().trim().startsWith(MessageUtils.message("entry.mainProject"))&&timeType.getMainProjectState()==1) {
                                 //throw new Exception("缺少主项目列,请下载最新模板");
                                 throw new Exception(MessageUtils.message("Template.lackMasterRow"));
                             }
@@ -3694,7 +3705,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         project.setContractAmount(Double.parseDouble(amountCell.getStringCellValue()));
                     }
                     if (isPublicCell != null && !StringUtils.isEmpty(isPublicCell.getStringCellValue())) {
-                        project.setIsPublic("是".equals(isPublicCell.getStringCellValue())?1:0);
+                        project.setIsPublic(MessageUtils.message("excel.yes").equals(isPublicCell.getStringCellValue())?1:0);
                     }
                     if(timeType.getMainProjectState()!=1){
                         //处理子项目
@@ -4350,7 +4361,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         }
         List<List<String>> allList = new ArrayList<List<String>>();
         allList.add(headList);
-        String[] levelArray = new String[]{"正常","紧急","重要","重要且紧急","低风险","中风险","高风险"};
+        //String[] levelArray = new String[]{"正常","紧急","重要","重要且紧急","低风险","中风险","高风险"};
+        String[] levelArray = new String[]{MessageUtils.message("excel.normal"), MessageUtils.message("excel.urgent"),MessageUtils.message("excel.important"),MessageUtils.message("excel.impAndUrg"),MessageUtils.message("excel.lowRisk"),MessageUtils.message("excel.MedRisk"),MessageUtils.message("excel.highRisk")};
         LocalDateTime c=LocalDateTime.now();
         //获取项目级别数据
         List<ProjectLevel> projectLevelList = projectLevelMapper.selectList(new QueryWrapper<ProjectLevel>().eq("company_id", user.getCompanyId()));
@@ -6725,7 +6737,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
 
                 if (codeCell != null) {
                     String code = codeCell.getStringCellValue().trim().replaceAll("\\u00a0", "");
-                    if (code.equals("项目编号") && rowIndex == 0) {
+                    if ((code.equals("项目编号") || code.equals("project No")) && rowIndex == 0) {
                         //跳过第一行标题
                         continue;
                     }
@@ -7216,44 +7228,11 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         return result;
     }
 
-    //分页查询员工月度工时表
-    @Override
-    public HttpRespMsg getEmpMonthHours(Integer pageIndex, Integer pageSize, String month,Integer departmentId,String userId, HttpServletRequest request) {
-        HttpRespMsg httpRespMsg =new HttpRespMsg();
-        User targetUser = userMapper.selectById(request.getHeader("token"));
-        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()));
-        List<DepartmentOtherManager> departmentOtherManagerList = departmentOtherManagerMapper.selectList(new QueryWrapper<DepartmentOtherManager>().eq("other_manager_id", targetUser.getId()));
-        //判断查看权限
-        if(functionAllList.size()==0){
-            deptIds=new ArrayList<>();
-            deptIds.add(-1);
-            if(functionDeptList.size()>0){
-                List<Integer> collect = userDepartmentList.stream().distinct().map(dm -> dm.getDepartmentId()).collect(Collectors.toList());
-                List<Integer> otherCollect = departmentOtherManagerList.stream().distinct().map(dom -> dom.getDepartmentId()).collect(Collectors.toList());
-                collect.addAll(otherCollect);
-                //将该用户管理的所有部门以及部门的子部门id添加到deptIds集合中
-                for (Integer integer : collect) {
-                    List<Integer> branchDepartment = getBranchDepartment(integer, allDepartmentList);
-                    deptIds.addAll(branchDepartment);
-                }
-            }
-        }
+    //人员月度分页功能
+    private HashMap<String,List> EmpMonthHoursPage(Integer pageIndex, Integer pageSize,User targetUser,String userId,String startDate,String endDate,List<Integer> branchDepartment,List<Integer> deptIds){
+        HashMap<String, List> resultMap = new HashMap<>();
         long total;
         List<Map<String,Object>> resultList;
-        List<Integer> branchDepartment =null;
-        //若用户传入departmentId参数,则查询该部门所有子部门,添加到branchDepartment集合中
-        if(departmentId!=null){
-            branchDepartment = getBranchDepartment(departmentId, allDepartmentList);
-        }
-        String startDate = null;
-        String endDate = null;
-        LocalDate time = LocalDate.parse(month, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
-        startDate = time.with(TemporalAdjusters.firstDayOfMonth()).toString();
-        endDate = time.with(TemporalAdjusters.lastDayOfMonth()).toString();
         int days = WorkDayCalculateUtils.getWorkDaysListInRange(startDate, endDate, 0).size();
         //分页查询用户计划工时和实际工时
         if(pageIndex!=null&&pageSize!=null){
@@ -7270,11 +7249,20 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             float standardHours = Float.parseFloat(resultList.get(0).get("allday").toString())*days;
             LocalDate localStartDate = LocalDate.parse(startDate, dateTimeFormatter);
             LocalDate localEndDate = LocalDate.parse(endDate, dateTimeFormatter);
+            List<LeaveSheet> sumLeave = leaveSheetMapper.selectLeave(targetUser.getCompanyId(), startDate, endDate);
             for (Map<String, Object> map : resultList) {
                 //计算算请假时间
+                standardHours = new BigDecimal(standardHours).setScale(1,BigDecimal.ROUND_HALF_UP).floatValue();
                 map.put("standardHours",standardHours);
-                map.put("workingTime",map.get("workingTime")==null?0:map.get("workingTime"));
-                List<LeaveSheet> leaveSheets = leaveSheetMapper.selectLeave(map.get("userId").toString(),startDate,endDate);
+                float workingTime = map.get("workingTime")==null?0:Float.parseFloat(map.get("workingTime").toString());
+                workingTime = new BigDecimal(workingTime).setScale(1,BigDecimal.ROUND_HALF_UP).floatValue();
+                map.put("workingTime",workingTime);
+                List<LeaveSheet> leaveSheets = new ArrayList<>();
+                for (LeaveSheet leaveSheet : sumLeave) {
+                    if (map.get("userId").toString().equals(leaveSheet.getOwnerId())){
+                        leaveSheets.add(leaveSheet);
+                    }
+                }
                 float leaveTime = 0;
                 for (LeaveSheet leaveSheet : leaveSheets) {
                     //当请假时间在当前月内的
@@ -7300,15 +7288,99 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         }
                     }
                 }
+                leaveTime = new BigDecimal(leaveTime).setScale(1,BigDecimal.ROUND_HALF_UP).floatValue();
                 map.put("leaveTime",leaveTime);
                 //是否满足工时
-                if (Float.parseFloat(map.get("workingTime").toString()) < standardHours){
+                if (workingTime + leaveTime < standardHours){
                     map.put("whether",0);
                 }else{
                     map.put("whether",1);
                 }
             }
         }
+        resultMap.put("resultList",resultList);
+        ArrayList<Long> totalList = new ArrayList<>();
+        totalList.add(total);
+        resultMap.put("totalList",totalList);
+        return resultMap;
+    }
+
+    //分页查询人员月度工时表
+    @Override
+    public HttpRespMsg getEmpMonthHours(Integer pageIndex, Integer pageSize, String month,Integer departmentId,String userId,Integer whether,HttpServletRequest request) {
+        HttpRespMsg httpRespMsg =new HttpRespMsg();
+        User targetUser = userMapper.selectById(request.getHeader("token"));
+        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()));
+        List<DepartmentOtherManager> departmentOtherManagerList = departmentOtherManagerMapper.selectList(new QueryWrapper<DepartmentOtherManager>().eq("other_manager_id", targetUser.getId()));
+        //判断查看权限
+        if(functionAllList.size()==0){
+            deptIds=new ArrayList<>();
+            deptIds.add(-1);
+            if(functionDeptList.size()>0){
+                List<Integer> collect = userDepartmentList.stream().distinct().map(dm -> dm.getDepartmentId()).collect(Collectors.toList());
+                List<Integer> otherCollect = departmentOtherManagerList.stream().distinct().map(dom -> dom.getDepartmentId()).collect(Collectors.toList());
+                collect.addAll(otherCollect);
+                //将该用户管理的所有部门以及部门的子部门id添加到deptIds集合中
+                for (Integer integer : collect) {
+                    List<Integer> branchDepartment = getBranchDepartment(integer, allDepartmentList);
+                    deptIds.addAll(branchDepartment);
+                }
+            }
+        }
+        long total  = 0;
+        List<Map<String,Object>> resultList = null;
+        List<Integer> branchDepartment =null;
+        //若用户传入departmentId参数,则查询该部门所有子部门,添加到branchDepartment集合中
+        if(departmentId!=null){
+            branchDepartment = getBranchDepartment(departmentId, allDepartmentList);
+        }
+        String startDate = null;
+        String endDate = null;
+        LocalDate time = LocalDate.parse(month, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+        startDate = time.with(TemporalAdjusters.firstDayOfMonth()).toString();
+        endDate = time.with(TemporalAdjusters.lastDayOfMonth()).toString();
+        //是否传入筛选条件(满不满足工时)
+        if (whether==null){
+            Map<String, List> resultMap = EmpMonthHoursPage(pageIndex,pageSize,targetUser,userId,startDate,endDate,branchDepartment,deptIds);
+            resultList = resultMap.get("resultList");
+            total = Long.parseLong(resultMap.get("totalList").get(0).toString());
+        }else {
+            Map<String, List> whetherMap = EmpMonthHoursPage(null,null,targetUser,userId,startDate,endDate,branchDepartment,deptIds);
+            resultList = whetherMap.get("resultList");
+            if (whether == 1){
+                ArrayList<Map<String, Object>> yes = new ArrayList<>();
+                for (Map<String, Object> stringObjectMap : resultList) {
+                    if ("1".equals(stringObjectMap.get("whether").toString())){
+                        yes.add(stringObjectMap);
+                    }
+                }
+                //计算总页数
+                total = yes.size();
+                if (pageIndex!=null && pageSize!=null){
+                    resultList = yes.stream().skip((pageIndex - 1) * pageSize).limit(pageSize).collect(Collectors.toList());
+                }else {
+                    resultList = yes;
+                }
+            }else{
+                ArrayList<Map<String, Object>> no = new ArrayList<>();
+                for (Map<String, Object> stringObjectMap : resultList) {
+                    if ("0".equals(stringObjectMap.get("whether").toString())){
+                        no.add(stringObjectMap);
+                    }
+                }
+                //计算总页数
+                total = no.size();
+                if (pageIndex!=null && pageSize!=null){
+                    resultList = no.stream().skip((pageIndex - 1) * pageSize).limit(pageSize).collect(Collectors.toList());
+                }else {
+                    resultList = no;
+                }
+            }
+        }
         Map<String,Object> map=new HashMap<>();
         map.put("result",resultList);
         map.put("total",total);
@@ -7318,50 +7390,57 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
 
     //导出员工月度工时表
     @Override
-    public HttpRespMsg exportEmpMonthHours(String month, HttpServletRequest request, String userId, Integer departmentId){
+    public HttpRespMsg exportEmpMonthHours(String month, HttpServletRequest request, String userId, Integer departmentId,Integer whether){
         HttpRespMsg msg=new HttpRespMsg();
         Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
-        String startDate = null;
-        String endDate = null;
         LocalDate time = LocalDate.parse(month, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
-        startDate = time.with(TemporalAdjusters.firstDayOfMonth()).toString();
-        endDate = time.with(TemporalAdjusters.lastDayOfMonth()).toString();
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
-        HttpRespMsg httpRespMsg = getEmpMonthHours(null, null,month,departmentId,userId,request);
+        HttpRespMsg httpRespMsg = getEmpMonthHours(null, null,month,departmentId,userId,whether,request);
         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("请假工时");
-        titleList.add("是否满足工时");
+//        titleList.add("姓名");
+//        titleList.add("部门");
+//        titleList.add("工号");
+//        titleList.add("标准工时");
+//        titleList.add("实际工时");
+//        titleList.add("请假工时");
+//        titleList.add("是否满足工时");
+        titleList.add(MessageUtils.message("entry.name"));
+        titleList.add(MessageUtils.message("excel.department"));
+        titleList.add(MessageUtils.message("entry.No"));
+        titleList.add(MessageUtils.message("excel.standard"));
+        titleList.add(MessageUtils.message("excel.actual"));
+        titleList.add(MessageUtils.message("excel.leave"));
+        titleList.add(MessageUtils.message("excel.leave"));
+        titleList.add(MessageUtils.message("excel.workWeather"));
         dataList.add(titleList);
         for (Map<String, Object> map : resultList) {
             List<String> item=new ArrayList<>();
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                 item.add("$userName="+(map.get("corwxUserId")==null?"":map.get("corwxUserId"))+"$");
-                item.add(String.valueOf(StringUtils.isEmpty(map.get("jobNumber"))?"":map.get("jobNumber")));
-                //item.add("$deprtmentName="+(map.get("corpwxDeptId")==null?"":map.get("corpwxDeptId"))+"$");
+                item.add("$deprtmentName="+(map.get("corpwxDeptId")==null?"":map.get("corpwxDeptId"))+"$");
             }else {
                 item.add((String) map.get("name"));
-                item.add(String.valueOf(StringUtils.isEmpty(map.get("jobNumber"))?"":map.get("jobNumber")));
-                //item.add((String) map.get("departmentName")==null?"":(String) map.get("departmentName"));
+                item.add((String) map.get("departmentName")==null?"":(String) map.get("departmentName"));
             }
+            item.add(String.valueOf(StringUtils.isEmpty(map.get("jobNumber"))?"":map.get("jobNumber")));
             item.add(String.valueOf(map.get("standardHours")).equals("null")?"":String.valueOf(map.get("standardHours")));
             item.add(String.valueOf(map.get("workingTime")).equals("null")?"":String.valueOf(map.get("workingTime")));
             item.add(String.valueOf(map.get("leaveTime")).equals("null")?"":String.valueOf(map.get("leaveTime")));
             if (map.get("whether").toString().equals("1")){
-                item.add("是");
+                //item.add("是");
+                item.add(MessageUtils.message("excel.yes"));
             }else{
-                item.add("否");
+                //item.add("否");
+                item.add(MessageUtils.message("excel.no"));
             }
             dataList.add(item);
         }
         //生成excel文件导出
-        String fileName = "员工"+time.getMonthValue()+"月工时表"+System.currentTimeMillis();
+        //String fileName = "人员"+time.getMonthValue()+"月度工时表"+System.currentTimeMillis();
+        String fileName = MessageUtils.message("entry.personnel") +time.getMonthValue()+MessageUtils.message("fileName.monthWork")+System.currentTimeMillis();
         try {
             return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , dataList, path);
         } catch (Exception e) {

+ 2 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -3954,7 +3954,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 if (syncTranslationResult != null) {
                     httpRespMsg.data = syncTranslationResult;
                 } else {
-                    httpRespMsg.setError("处理超时...");
+                    //httpRespMsg.setError("处理超时...");
+                    httpRespMsg.setError(MessageUtils.message("request.outTime"));
                 }
             }else {
                 httpRespMsg.data = "/upload/" + fileUrlSuffix;

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

@@ -166,7 +166,7 @@ public class SimpleReportServiceImpl extends ServiceImpl<SimpleReportMapper, Sim
 
                     String name = nameCell.getStringCellValue().trim().replaceAll("\\u00a0", "");
                     SimpleFinance finance = new SimpleFinance();
-                    if (name.equals("姓名") && rowIndex == 0) {
+                    if ((name.equals("姓名") || name.equals("name")) && rowIndex == 0) {
                         //跳过第一行标题
                         continue;
                     }

+ 3 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/TaskServiceImpl.java

@@ -357,7 +357,8 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
                 if (syncTranslationResult != null) {
                     httpRespMsg.data = syncTranslationResult;
                 } else {
-                    httpRespMsg.setError("处理超时...");
+                    //httpRespMsg.setError("处理超时...");
+                    httpRespMsg.setError(MessageUtils.message("request.outTime"));
                 }
             }else {
                 httpRespMsg.data = "/upload/" + fileUrlSuffix;
@@ -455,7 +456,7 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
                 String name = nameCell.getStringCellValue();
                 String type = typeCell.getStringCellValue();
                 //忽略表头
-                if (name.equals("任务内容") && type.equals("类型") && rowIndex == 0) {
+                if ((name.equals("任务内容") || name.equals("Task content")) && (type.equals("类型") || type.equals("type")) && rowIndex == 0) {
                     continue;
                 }
                 Task task = new Task();

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

@@ -334,7 +334,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
         //开启了自定义日报列表的情况下,需要菜单上有
         if (timeType.getCustomDegreeActive() == 1 && moduleList.stream().anyMatch(mod->mod.getName().equals("系统基础设置"))) {
             SysModule centerManageModule = new SysModule();
-            centerManageModule.setName(timeType.getCustomDegreeName()+"管理");
+            //centerManageModule.setName(timeType.getCustomDegreeName()+"管理");
+            centerManageModule.setName(timeType.getCustomDegreeName()+MessageUtils.message("project.manage"));
             centerManageModule.setPath("/centerManage");
             centerManageModule.setId(0);
             //加到组织架构前面
@@ -496,7 +497,6 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             ResponseEntity<String> ResponseEntity = restTemplate.postForEntity(url, entity, String.class);
             if (ResponseEntity.getStatusCode() == HttpStatus.OK) {
                 String resp = ResponseEntity.getBody();
-                System.err.println(resp);
                 JSONObject respJson = JSONObject.parseObject(resp);
                 if (respJson.getInteger("errcode")==0){
                     JSONObject queryResult = respJson.getJSONObject("query_result");
@@ -1217,7 +1217,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                 }
 
                 if (rowIndex == 0) {
-                    if (!"工号".equals(jobNumber)) {
+                    if ((!"工号".equals(jobNumber)) || (!"Job No".equals(jobNumber))) {
                         //httpRespMsg.setError("缺少部门列,请下载最新模板进行导入");
                         httpRespMsg.setError(MessageUtils.message("Template.lackJobNumber"));
                         return httpRespMsg;
@@ -1663,7 +1663,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                 if (syncTranslationResult != null) {
                     httpRespMsg.data = syncTranslationResult;
                 } else {
-                    httpRespMsg.setError("处理超时...");
+                    //httpRespMsg.setError("处理超时...");
+                    httpRespMsg.setError(MessageUtils.message("request.outTime"));
                 }
             }else {
                 httpRespMsg.data = "/upload/" + fileUrlSuffix;
@@ -1874,7 +1875,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                 if (syncTranslationResult != null) {
                     httpRespMsg.data = syncTranslationResult;
                 } else {
-                    httpRespMsg.setError("处理超时...");
+                    //httpRespMsg.setError("处理超时...");
+                    httpRespMsg.setError(MessageUtils.message("request.outTime"));
                 }
             }else {
                 httpRespMsg.data = "/upload/" + fileUrlSuffix;

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

@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.gson.JsonArray;
 import com.google.gson.JsonObject;
 import com.management.platform.controller.WeiXinCorpController;
 import com.management.platform.entity.*;
@@ -14,6 +15,7 @@ import com.management.platform.util.*;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.http.client.utils.HttpClientUtils;
+import org.apache.tomcat.jni.Local;
 import org.json.HTTP;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -22,6 +24,7 @@ import org.springframework.http.*;
 import org.springframework.stereotype.Service;
 import org.springframework.util.LinkedMultiValueMap;
 import org.springframework.util.MultiValueMap;
+import org.springframework.util.unit.DataUnit;
 import org.springframework.web.client.RestTemplate;
 import org.springframework.web.util.UriComponentsBuilder;
 import sun.net.www.http.HttpClient;
@@ -29,6 +32,7 @@ import sun.net.www.http.HttpClient;
 import javax.annotation.Resource;
 import java.io.*;
 import java.lang.reflect.Array;
+import java.math.BigDecimal;
 import java.net.URI;
 import java.text.SimpleDateFormat;
 import java.time.*;
@@ -55,6 +59,10 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
 
     public static final String GET_CHECKIN_DAYDATA = "https://qyapi.weixin.qq.com/cgi-bin/checkin/getcheckin_daydata?access_token=ACCESS_TOKEN";
 
+    public static final String GET_CHECKIN_DATA = "https://qyapi.weixin.qq.com/cgi-bin/checkin/getcheckindata?access_token=ACCESS_TOKEN";
+
+    public static final String GET_CHECKIN_OPTION = "https://qyapi.weixin.qq.com/cgi-bin/checkin/getcheckinoption?access_token=ACCESS_TOKEN";
+
 
     @Value("${suitId}")
     private String suitId;
@@ -452,6 +460,153 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
         return msg;
     }
 
+    @Override
+    public HttpRespMsg getUserPunchRecord(int companyId, String userId, LocalDateTime startDateTime, LocalDateTime endDateTime, boolean showLog) {
+        HttpRespMsg msg = new HttpRespMsg();
+        WxCorpInfo corpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+        if (corpInfo == null) {
+            //msg.setError("该企业未对接企业微信");
+            msg.setError(MessageUtils.message("wx.dockError"));
+            return msg;
+        }
+        String url = null;
+        try {
+            startDateTime = startDateTime.withHour(0).withMinute(0).withSecond(0).withNano(0);
+            long startTime = startDateTime.toEpochSecond(ZoneOffset.of("+8"));
+            endDateTime = endDateTime.withHour(23).withMinute(59).withSecond(0).withNano(0);
+            long endTime = endDateTime.toEpochSecond(ZoneOffset.of("+8"));
+            System.out.println("startTime=" + startTime + ",endTime=" + endTime);
+
+            int batchCount = 1;
+            int batchSize = 100;
+            int totalLength = 1;
+            List<String> corpwxUserIds = new ArrayList<>();
+            if (userId == null) {
+                //获取企业下的全部员工
+                List<User> users = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId).isNotNull("corpwx_userid").eq("is_active", 1));
+                System.out.println("获取考勤记录users size==" + users.size());
+                corpwxUserIds = users.stream().map(User::getCorpwxUserid).collect(Collectors.toList());
+                totalLength = corpwxUserIds.size();
+                batchCount = totalLength / batchSize + (totalLength % batchSize == 0 ? 0 : 1);
+            } else {
+                //指定获取员工
+                User user = userMapper.selectById(userId);
+                corpwxUserIds.add(user.getCorpwxUserid());
+                System.out.println("获取corpwxuserid==" + user.getCorpwxUserid() + "的考勤记录");
+            }
+            //按批调用
+            for (int i = 0; i < batchCount; i++) {
+                int fromIndex = i * batchSize;
+                int toIndex = (i + 1) * batchSize;
+                if (toIndex > totalLength) toIndex = totalLength;
+                Object[] objects = corpwxUserIds.subList(fromIndex, toIndex).toArray(new String[0]);
+                reqPunchRecord(corpInfo, startTime, endTime, objects, showLog);
+            }
+        } catch (Exception exception) {
+            exception.printStackTrace();
+        }
+
+        return msg;
+    }
+
+    public void reqPunchRecord(WxCorpInfo corpInfo, long startTime, long endTime, Object[] objects, boolean showLog)throws Exception {
+        DateTimeFormatter mdFormat = DateTimeFormatter.ofPattern("yyyy/M/d");
+        LocalDateTime needDataTime = LocalDateTime.now().withHour(0).withMinute(0).withSecond(0).withNano(0);
+        long dataTime = needDataTime.toEpochSecond(ZoneOffset.of("+8"));
+        String checkinOption = getCheckinOption(corpInfo, dataTime, objects);
+        JSONObject optionObject = JSONObject.parseObject(checkinOption);
+        JSONArray  optionDatas= optionObject.getJSONArray("info");
+        String url = GET_CHECKIN_DATA.replace("ACCESS_TOKEN", getCorpAccessToken(corpInfo));
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_JSON);
+        System.out.println("" + objects.toString());
+        JSONObject reqParam = new JSONObject();
+        reqParam.put("starttime", startTime);
+        reqParam.put("endtime", endTime);
+        reqParam.put("useridlist", objects);
+        reqParam.put("opencheckindatatype", 3);
+        HttpEntity<String> requestEntity = new HttpEntity<String>(reqParam.toJSONString(), headers);
+        ResponseEntity<String> responseEntity = this.restTemplate.exchange(url,
+                HttpMethod.POST, requestEntity, String.class);
+
+        if (responseEntity.getStatusCode() == HttpStatus.OK) {
+            String resp = responseEntity.getBody();
+            if (showLog) System.out.println(resp);
+            JSONObject json = JSONObject.parseObject(resp);
+            DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+            if (json.getIntValue("errcode") == 0) {
+                JSONArray checkindata = json.getJSONArray("checkindata");
+                System.out.println(checkindata);
+                for (int i = 0; i < objects.length; i++) {
+                    List<Integer> upList=new ArrayList<>();
+                    List<Integer> downList=new ArrayList<>();
+                    for (int j = 0; j < checkindata.size(); j++) {
+                        JSONObject jsonObject = checkindata.getJSONObject(j);
+                        if (jsonObject.get("userid").equals(objects[i])) {
+                            //todo: 获取最早上班打卡时间以及最晚下班打卡时间
+                            Integer time = (Integer) jsonObject.get("checkin_time");
+                            if (jsonObject.get("checkin_type").equals("上班打卡")) {
+                                upList.add(time);
+                            } else if(jsonObject.get("checkin_type").equals("下班打卡")) downList.add(time);
+                        }
+                    }
+                    double restTime = 0.0;//小时为单位
+                    for (int k = 0; k < optionDatas.size(); k++) {
+                        if(optionDatas.getJSONObject(k).get("userid").equals(objects[i])){
+                            JSONObject group = optionDatas.getJSONObject(k).getJSONObject("group");
+                            JSONArray workRules = group.getJSONArray("checkindate").getJSONObject(0).getJSONArray("checkintime");
+                            if (workRules.size() <= 1) {
+                                restTime = 1.0;//一个小时午休
+                            } else {
+                                restTime = 1.0 * (workRules.getJSONObject(1).getIntValue("work_sec") - workRules.getJSONObject(0).getIntValue("off_work_sec")) / 3600;
+                            }
+                        }
+                    }
+                    UserCorpwxTime userCorpwxTime=new UserCorpwxTime();
+                    userCorpwxTime.setCorpwxUserid((String) objects[i]);
+                    userCorpwxTime.setCompanyId(corpInfo.getCompanyId());
+                    for (Integer integer : upList) {
+                        if(objects[i].equals("woy9TkCAAArkpTq76GOJYsbYGgzk1g1w")){
+                            System.out.println("上班"+DateTimeUtil.getTimeFromSeconds(integer));
+                        }
+                    }
+                    for (Integer integer : downList) {
+                        if(objects[i].equals("woy9TkCAAArkpTq76GOJYsbYGgzk1g1w")){
+                            System.out.println("下班"+DateTimeUtil.getTimeFromSeconds(integer));
+                        }
+                    }
+                    if(upList.isEmpty()||downList.isEmpty()){
+                        continue;
+                    }
+                    Integer min = Collections.min(upList);
+                    Integer max = Collections.max(downList);
+                    String minTime = DateTimeUtil.getTimeFromSeconds(min);
+                    String maxTime = DateTimeUtil.getTimeFromSeconds(max);
+                    DateTimeFormatter df = DateTimeFormatter.ofPattern("HH:mm");
+                    userCorpwxTime.setStartTime(LocalTime.parse(minTime,df).plusHours(8).format(df));
+                    userCorpwxTime.setEndTime(LocalTime.parse(maxTime,df).plusHours(8).format(df));
+                    userCorpwxTime.setCreateDate(LocalDate.now());
+                    userCorpwxTime.setWxCorpid(corpInfo.getCorpid());
+                    userCorpwxTime.setWeekDay(LocalDate.now().getDayOfWeek().getValue());
+                    userCorpwxTime.setWeekDayTxt(DateTimeUtil.getWeekDayTxt(userCorpwxTime.getWeekDay()));
+                    BigDecimal bigDecimal=new BigDecimal(Duration.between(LocalTime.parse(minTime,df).plusHours(8),LocalTime.parse(maxTime,df).plusHours(8)).toMinutes());
+                    bigDecimal=bigDecimal.divide(BigDecimal.valueOf(60),1,BigDecimal.ROUND_HALF_UP).subtract(new BigDecimal(restTime));
+                    userCorpwxTime.setWorkHours(bigDecimal.doubleValue());
+                    System.out.println(userCorpwxTime);
+                    UserCorpwxTime item = userCorpwxTimeMapper.selectOne(new QueryWrapper<UserCorpwxTime>().eq("corpwx_userid", (String) objects[i])
+                            .eq("create_date", LocalDate.now()));
+                    if (item != null) {
+                        userCorpwxTime.setId(item.getId());
+                        //已存在记录,进行更新
+                        userCorpwxTimeMapper.updateById(userCorpwxTime);
+                    } else {
+                        userCorpwxTimeMapper.insert(userCorpwxTime);
+                    }
+                }
+            }
+        }
+    }
+
     @Override
     public HttpRespMsg syncMembByCardTime(WxCorpInfo wxCorpInfo) {
         HttpRespMsg msg = new HttpRespMsg();
@@ -527,6 +682,25 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
         return msg;
     }
 
+    private String getCheckinOption(WxCorpInfo corpInfo,long dataTime,Object[] objects) throws  Exception{
+        String url = GET_CHECKIN_OPTION.replace("ACCESS_TOKEN", getCorpAccessToken(corpInfo));
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_JSON);
+        System.out.println("" + objects.toString());
+        JSONObject reqParam = new JSONObject();
+        reqParam.put("datetime", dataTime);
+        reqParam.put("useridlist", objects);
+        HttpEntity<String> requestEntity = new HttpEntity<String>(reqParam.toJSONString(), headers);
+        ResponseEntity<String> responseEntity = this.restTemplate.exchange(url,
+                HttpMethod.POST, requestEntity, String.class);
+
+        if (responseEntity.getStatusCode() == HttpStatus.OK) {
+            String resp = responseEntity.getBody();
+            return resp;
+        }
+        return "";
+    }
+
 
     private void reqOnceCardTime(WxCorpInfo corpInfo, long startTime, long endTime, Object[] objects, boolean showLog) throws Exception {
         DateTimeFormatter mdFormat = DateTimeFormatter.ofPattern("yyyy/M/d");

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

@@ -472,8 +472,21 @@ public class TimingTask {
         }
     }
 
+    @Scheduled(cron = "0 30,0/5 17-19 * * ?")
+    public void  getClockRecordWithCorpWx(){
+        /*if(isDev) return;*/
+        //todo: 有限制无考勤不填报的情况才获取
+        LocalDateTime start = LocalDateTime.of(LocalDate.now(), LocalTime.MIN);
+        LocalDateTime end = LocalDateTime.of(LocalDate.now(), LocalTime.MAX).withSecond(0).withNano(0);
+        List<TimeType> typeList = timeTypeMapper.selectList(new QueryWrapper<TimeType>().eq("not_allowed_no_attendance", 1));
+        for (TimeType type : typeList) {
+            Integer companyId = type.getCompanyId();
+            wxCorpInfoService.getUserPunchRecord(companyId, null, start, end, false);
+        }
+    }
+
     public static void main(String[] args) {
-        int passwordLength = 30;
+        /*int passwordLength = 30;
         List<String> stringList=new ArrayList<>();
         new SecureRandom().ints(passwordLength, 0, VALID_TOKEN_CHARS.size())
                 .map(VALID_TOKEN_CHARS::get).forEach(v->stringList.add(String.valueOf((char) v)));
@@ -481,7 +494,10 @@ public class TimingTask {
         for (String s : stringList) {
             token+=s;
         }
-        System.out.println(token);
+        System.out.println(token);*/
+        LocalDateTime start = LocalDateTime.of(LocalDate.now(), LocalTime.MIN);
+        LocalDateTime end = LocalDateTime.of(LocalDate.now(), LocalTime.MAX);
+        System.out.println(start+"  "+end);
     }
 
     //发送上周填写的工时统计

+ 12 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/i18n/messages.properties

@@ -78,6 +78,7 @@ other.phoneNull=手机号不能为空
 request.countLimit=接口访问次数超过限制,请1分钟后重试。
 request.illegal=请求非法
 request.frequently=请求过于频繁,请稍后再试
+request.outTime=处理超时...
 # 部门相关
 department.duplicateError=保存失败: 部门[{0}]存在重复。
 department.reviewedError=当前部门存在待审核报告,无法操作!
@@ -152,6 +153,8 @@ finance.masterProfessional=只有专业负责人才能进行专业审核
 finance.choiceDaily=请选择需要审核的日报
 finance.skipData=跳过以下已审核数据:"{0}"。
 finance.importErrorByAllAdopt=本次数据全部已审核通过,无法导入。
+finance.review=专业审核
+finance.dept=部门审核
 # pdf相关
 pdf.previewError=该格式不支持在线预览
 # 日报相关
@@ -173,6 +176,8 @@ profession.TypeError=操作错误,日报状态不对:{0}
 profession.alreadyRevoke=该日报已被撤销,无法重复操作
 profession.impProReject=您{0}导入的日报中{1}项目被[{2}]驳回。原因:{3},请重新导入。
 profession.fillProReject=您{0}填写的日报中{1}项目被[{2}]驳回。原因:{3}。
+profession.approver=请设置审批人
+profession.checker=请设置审核人
 # 项目相关
 project.deleteErrorByProject=删除失败,已绑定项目
 project.deleteErrorByMaster=删除失败,已绑定主项目
@@ -216,6 +221,7 @@ project.alreadyRelation={0}已被以下项目关联:{1}
 project.storesReserve=立项准备材料
 project.processDocuments=项目过程文档
 project.deliverable=项目交付件
+project.manage = 管理
 # 供货相关
 provider.noRepeat=供货商编号已存在
 provider.classNameRepeat=该分类下供货商名称已存在
@@ -312,6 +318,7 @@ report.dailyReject=您{0}填写的日报中{1}项目被[{2}]驳回。原因:{3}
 report.reportApp=审核通过了日报
 report.hourReportNoFilled=您{0}的工时报告还未填写
 #模板相关
+Template.subProject=子项目
 Template.AlreadyExists=该模板名称已存在
 Template.lackSonProject=缺少子项目列,请下载最新模板
 Template.lackMasterRow=缺少主项目列,请下载最新模板
@@ -510,6 +517,7 @@ fileName.supStat=供应商统计_
 fileName.dailyManHour=人员每日工时统计_{0}至{1}
 fileName.perNoFill=未填人员统计_
 fileName.laborHour=工时对比
+fileName.monthWork=月度工时表
 #excel
 excel.publicProject=是否为公共项目
 excel.projectName=项目名称必填
@@ -652,6 +660,10 @@ excel.peopleList=员工列表
 excel.perList=人员列表
 excel.Filled=已填
 excel.notFilled=未填
+excel.standard=标准工时
+excel.actual=实际工时
+excel.leave=请假工时
+excel.workWeather=是否满足工时
 #推送
 push.fillIn=您今天的工时填报还未完成
 push.name=屈跃庭

+ 12 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/i18n/messages_en_US.properties

@@ -78,6 +78,7 @@ other.phoneNull=Mobile number cannot be empty
 request.countLimit=The number of interface accesses exceeds the limit. Please try again in 1 minute.
 request.illegal=Illegal request
 request.frequently=Too many requests, please try again later.
+request.outTime=Processing timeout...
 # 部门相关
 department.duplicateError=save fail: department [{0}] already exists
 department.reviewedError=The current department has a report to be approved, unable to operate!
@@ -152,6 +153,8 @@ finance.masterProfessional=Only the person in charge of the discipline can condu
 finance.choiceDaily=Please select the daily report to be approved.
 finance.skipData=Skipping the following audited data: '{0}'.
 finance.importErrorByAllAdopt=This data has been approved and cannot be imported.
+finance.review=Professional review
+finance.dept=Department review
 # pdf相关
 pdf.previewError=This format does not support online preview.
 # 日报相关
@@ -173,6 +176,8 @@ profession.TypeError=Operation error, the daily report status is incorrect: {0}.
 profession.alreadyRevoke=The daily report has been canceled, and you cannot repeat the operation.
 profession.impProReject=The {1} project in the daily report you {0} imported was rejected by [{2}]. Reason: {3}, please import again.
 profession.fillProReject=The {1} project in the daily report you filled in by {0} was rejected by [{2}]. Reason: {3}.
+profession.approver=Please set approver
+profession.checker=Please set reviewer
 # 项目相关
 project.deleteErrorByProject=Failed to delete, bound item.
 project.deleteErrorByMaster=Failed to delete, the master project has been bound.
@@ -216,6 +221,7 @@ project.alreadyRelation={0} is already associated with the following project: {1
 project.storesReserve=Project preparation materials
 project.processDocuments=Project process documents
 project.deliverable=Project Deliverable
+project.manage = manage
 # 供货相关
 provider.noRepeat=Vendor No. already exists.
 provider.classNameRepeat=The supplier name under this category already exists.
@@ -312,6 +318,7 @@ report.dailyReject=The {1} project in the daily report you filled in by {0} was
 report.reportApp=Daily report approved
 report.hourReportNoFilled=Your work hour report for {0} has not been completed.
 #模板相关
+Template.subProject=subproject
 Template.AlreadyExists=The template name already exists.
 Template.lackSonProject=The sub item column is missing. Please download the latest template.
 Template.lackMasterRow=The main item column is missing. Please download the latest template.
@@ -510,6 +517,7 @@ fileName.supStat=Supplier statistics_
 fileName.dailyManHour=Daily man hour statistics_ {0} to {1}
 fileName.perNoFill=Personnel statistics not filled_
 fileName.laborHour=Labor hour comparison
+fileName.monthWork=Monthly man hour table
 #excel
 excel.publicProject=Whether it is a public project
 excel.projectName=Project name is required
@@ -652,6 +660,10 @@ excel.peopleList=Employee List
 excel.perList=Personnel list
 excel.Filled=Filled
 excel.notFilled=Not filled
+excel.standard=Standard working hours
+excel.actual=Actual working time
+excel.leave=Time of leave
+excel.workWeather=Whether the working hours are met
 #推送
 push.fillIn=Your work hour report for today has not been completed.
 push.name=Qu Yue ting

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

@@ -51,7 +51,7 @@
     <!-- 查询某段时间内的请假列表 -->
     <select id="selectLeave" resultType="com.management.platform.entity.LeaveSheet">
         select * from leave_sheet
-        where owner_id = #{userId} and leave_sheet.status=0
+        where company_id = #{companyId} and leave_sheet.status=0
         and leave_sheet.start_date &lt;=#{endDate} and leave_sheet.end_date &gt;=#{startDate}
     </select>
 </mapper>

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

@@ -115,12 +115,12 @@
     <select id="getOnlyJoinProjects" resultType="java.util.Map">
         SELECT id, project_code AS projectCode, project_name AS projectName, status, task_gp_incharge as taskGpIncharge, project_desc as projectDesc
         FROM project
-        WHERE id IN (
+        WHERE (status = 1 or status = 4) and (id IN (
             SELECT project_id
             FROM participation
             WHERE user_id = #{userId}
         )
-        or (is_public = 1 and company_id = #{companyId})
+        or (is_public = 1 and company_id = #{companyId}))
         ORDER BY is_public DESC, id ASC
     </select>
     <!--获取查询者所在公司每个项目的工时成本-->

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 49545 - 8815
fhKeeper/formulahousekeeper/management-platform/workTime.log


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

@@ -293,7 +293,7 @@
             <el-form ref="form3" :model="importParam" >
                 <el-form-item :label="$t('Itheimport')" >
                     <!-- <div style="color:orange;">{{date}}</div> -->
-                    <el-date-picker v-model="date" type="month" placeholder="$t('Selectmonth')" format="yyyy-MM" value-format="yyyy-MM"></el-date-picker>
+                    <el-date-picker v-model="date" type="month" :placeholder="$t('Selectmonth')" format="yyyy-MM" value-format="yyyy-MM"></el-date-picker>
                 </el-form-item>
                 <el-form-item prop="syncHistoryReport"  >
                     <el-checkbox :label="$t('Recalculatereportedcostsforthemonth')" v-model="importParam.syncHistoryReport"></el-checkbox>

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

@@ -417,7 +417,7 @@
                 </el-form-item>
                 <el-form-item :label="$t('projectclassification')" v-if="user.timeType.mainProjectState != '1'">
                     <!-- <el-select v-model="addForm.category"  style="width:32%;" clearable :disabled="!permissions.projectManagement && addForm.creatorId != user.id"> -->
-                    <el-select v-model="addForm.category"  style="width:32%;" clearable>
+                    <el-select v-model="addForm.category"  style="width:32%;" clearable filterable>
                         <el-option v-for="(item) in baseClfList" :key="item.id" :value="item.id" :label="item.name"></el-option>
                     </el-select>
                 </el-form-item>

+ 3 - 0
fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue

@@ -939,6 +939,7 @@ export default {
       insertFormPlates: [],
       saveBtnLoading: false,
       onlyDirect: false,
+      nextCursor: ''
     };
   },
   filters: {
@@ -2036,12 +2037,14 @@ export default {
           // role: this.role
           roleId: this.roleId,
           onlyDirect: this.onlyDirect ? "1" : "0",
+          cursor: this.nextCursor, // 游标
         },
         (res) => {
           this.listLoading = false;
           if (res.code == "ok") {
             this.list = res.data.records;
             this.total = res.data.total;
+            this.nextCursor = this.data.nextCursor
           } else {
             this.$message({
               message: res.msg,