Преглед изворни кода

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

cs пре 2 година
родитељ
комит
bb1af1666f
34 измењених фајлова са 2550 додато и 10444 уклоњено
  1. 65 10
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java
  2. 78 86
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java
  3. 3 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Report.java
  4. 7 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TimeType.java
  5. 11 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/User.java
  6. 1 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/DepartmentMasterVO.java
  7. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ReportMapper.java
  8. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ReportService.java
  9. 9 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/WxCorpInfoService.java
  10. 3 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DepartmentServiceImpl.java
  11. 22 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ExpenseSheetServiceImpl.java
  12. 70 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  13. 29 5
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  14. 126 6
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java
  15. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/application.yml
  16. 18 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml
  17. 3 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TimeTypeMapper.xml
  18. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/UserMapper.xml
  19. 1397 10200
      fhKeeper/formulahousekeeper/management-platform/workTime.log
  20. 1 1
      fhKeeper/formulahousekeeper/octopus/src/views/workReport/review.vue
  21. 93 14
      fhKeeper/formulahousekeeper/timesheet/src/components/select.vue
  22. 4 1
      fhKeeper/formulahousekeeper/timesheet/src/i18n/en.json
  23. 5 2
      fhKeeper/formulahousekeeper/timesheet/src/i18n/zh.json
  24. 40 10
      fhKeeper/formulahousekeeper/timesheet/src/views/awayOffice/awayOffice.vue
  25. 3 1
      fhKeeper/formulahousekeeper/timesheet/src/views/corpreport/list.vue
  26. 58 9
      fhKeeper/formulahousekeeper/timesheet/src/views/leave/list.vue
  27. 21 18
      fhKeeper/formulahousekeeper/timesheet/src/views/project/cost.vue
  28. 8 1
      fhKeeper/formulahousekeeper/timesheet/src/views/project/fileCenter.vue
  29. 43 11
      fhKeeper/formulahousekeeper/timesheet/src/views/project/info.vue
  30. 145 31
      fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue
  31. 209 19
      fhKeeper/formulahousekeeper/timesheet/src/views/project/projectInside.vue
  32. 14 0
      fhKeeper/formulahousekeeper/timesheet/src/views/settings/timetype.vue
  33. 3 2
      fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue
  34. 54 6
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

+ 65 - 10
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java

@@ -175,7 +175,8 @@ public class ReportController {
                                   String[] projectAuditorId,
                                   Double[] overtimeHours, //加班时长
                                   String[] customText,
-                                  Integer[] basecostId //成本基线项的id
+                                  Integer[] basecostId, //成本基线项的id
+                                  String[] auditorSettingArray
                                     ) {
         List<Report> reportList = new ArrayList<>();
         String token = request.getHeader("Token");
@@ -269,7 +270,6 @@ public class ReportController {
                     }
                 }
             }
-
         }
 
 
@@ -314,12 +314,46 @@ public class ReportController {
                 }
             }
         }
-
-        //自动填充项目审核人
-        for (int i=0;i<projectAuditorId.length; i++) {
-            if (projectAuditorId[i] == null) {
-                final int index = i;
-                projectAuditorId[i] = projectList.stream().filter(p->p.getId().equals(projectId[index])).findFirst().get().getInchargerId();
+        TimeType comTimeType = timeTypeMapper.selectById(user.getCompanyId());
+        List<ReportAuditorSetting> auditorSettingList = null;
+        if (comTimeType.getReportAuditType() == 3) {
+            //员工自由选择审批人
+            if (auditorSettingArray == null) {
+                HttpRespMsg msg = new HttpRespMsg();
+                msg.setError("请设置审批人");
+                return msg;
+            } else {
+                for (int i=0;i<auditorSettingArray.length; i++) {
+                    String str = auditorSettingArray[i];
+                    ReportAuditorSetting reportAuditorSetting = JSONObject.parseObject(str, ReportAuditorSetting.class);
+                    auditorSettingList.add(reportAuditorSetting);
+                    //检查审核人层级是否设置满
+                    if (comTimeType.getAuditLevel() == 1 && reportAuditorSetting.getAuditorFirst() == null) {
+                        HttpRespMsg msg = new HttpRespMsg();
+                        msg.setError("请设置审核人");
+                        return msg;
+                    } else if (comTimeType.getAuditLevel() == 2 && (reportAuditorSetting.getAuditorFirst() == null || reportAuditorSetting.getAuditorSec() == null)) {
+                        HttpRespMsg msg = new HttpRespMsg();
+                        msg.setError("请设置审核人");
+                        return msg;
+                    }else if (comTimeType.getAuditLevel() == 3 && (reportAuditorSetting.getAuditorFirst() == null || reportAuditorSetting.getAuditorSec() == null
+                                                                    || reportAuditorSetting.getAuditorThird() == null)) {
+                        HttpRespMsg msg = new HttpRespMsg();
+                        msg.setError("请设置审核人");
+                        return msg;
+                    }
+                    //设置审核人为第一审核人
+                    projectAuditorId = new String[auditorSettingArray.length];
+                    projectAuditorId[i] = reportAuditorSetting.getAuditorFirst();
+                }
+            }
+        } else {
+            //自动填充项目审核人
+            for (int i=0;i<projectAuditorId.length; i++) {
+                if (projectAuditorId[i] == null) {
+                    final int index = i;
+                    projectAuditorId[i] = projectList.stream().filter(p->p.getId().equals(projectId[index])).findFirst().get().getInchargerId();
+                }
             }
         }
 
@@ -337,7 +371,7 @@ public class ReportController {
         LocalDate now = LocalDate.now();
         DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
         BigDecimal hourCost = null;
-        TimeType comTimeType = timeTypeMapper.selectById(user.getCompanyId());
+
         //自己填写的情况,计算个人自己的时薪
         if (targetUidList == null) {
             if (user.getCostApplyDate() != null) {
@@ -519,7 +553,10 @@ public class ReportController {
                             report.setTaskFinish(taskFinish[i]);
                             report.setCustomText(customText[i]);
                             report.setBasecostId(basecostId[i]);
-
+                            //如果是员工自由选择审批流程的方式,需要处理一下
+                            if (comTimeType.getReportAuditType() == 3) {
+                                report.setAuditorSetting(auditorSettingList.get(i));
+                            }
                             if (auditWorkflowList.size() == 0) {
                                 //没有自定义审核流,默认的直接是项目负责人审核
                                 report.setIsDeptAudit(0);
@@ -577,6 +614,10 @@ public class ReportController {
                                 report.setTaskFinish(taskFinish[i]);
                                 report.setCustomText(customText[i]);
                                 report.setBasecostId(basecostId[i]);
+                                //如果是员工自由选择审批流程的方式,需要处理一下
+                                if (comTimeType.getReportAuditType() == 3) {
+                                    report.setAuditorSetting(auditorSettingList.get(i));
+                                }
                                 if (auditWorkflowList.size() == 0) {
                                     //没有自定义审核流,默认的直接是项目负责人审核
                                     report.setIsDeptAudit(0);
@@ -636,6 +677,10 @@ public class ReportController {
                         report.setTaskFinish(taskFinish[i]);
                         report.setCustomText(customText[i]);
                         report.setBasecostId(basecostId[i]);
+                        //如果是员工自由选择审批流程的方式,需要处理一下
+                        if (comTimeType.getReportAuditType() == 3) {
+                            report.setAuditorSetting(auditorSettingList.get(i));
+                        }
                         if (auditWorkflowList.size() == 0) {
                             //没有自定义审核流,默认的直接是项目负责人审核
                             report.setIsDeptAudit(0);
@@ -700,6 +745,10 @@ public class ReportController {
                             report.setTaskFinish(taskFinish[i]);
                             report.setCustomText(customText[i]);
                             report.setBasecostId(basecostId[i]);
+                            //如果是员工自由选择审批流程的方式,需要处理一下
+                            if (comTimeType.getReportAuditType() == 3) {
+                                report.setAuditorSetting(auditorSettingList.get(i));
+                            }
                             if (auditWorkflowList.size() == 0) {
                                 //没有自定义审核流,直接代填的,就算审核通过
                                 report.setIsDeptAudit(0);
@@ -1355,5 +1404,11 @@ public class ReportController {
     public HttpRespMsg getProcessErrorData() {
         return reportService.getProcessErrorData();
     }
+
+    //todo 获取成本数据 上传到 第三方
+    @RequestMapping("/getUploadThirdReportData")
+    public HttpRespMsg getUploadThirdReportData(String yearMonth){
+        return reportService.getUploadThirdReportData(yearMonth,request);
+    }
 }
 

+ 78 - 86
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java

@@ -73,6 +73,8 @@ public class WeiXinCorpController {
     private String suitId;
     @Value("${suitSecret}")
     private String suitSecret;
+    @Value("${providerSecret}")
+    private String providerSecret;
 
     //自己公司的企业微信通讯录secret
     private String concactSecret="irf7s8fy16wLhWGb8IxvGL2Nkm0sTB6dludpe_3VP6k";
@@ -821,6 +823,7 @@ public class WeiXinCorpController {
                         managerRole = sysRoleService.generateDefaultRoles(company.getId());
                     }
                     data.setCompanyId(company.getId());
+                    data.setSaasSyncContact(enableNewVersion?1:0);
                     wxCorpInfoMapper.insert(data);
                     //默认普通员工的角色
                     SysRole defaultUserRole = sysRoleService.getOne(new QueryWrapper<SysRole>().eq("company_id", company.getId()).eq("is_default", 1));
@@ -857,60 +860,8 @@ public class WeiXinCorpController {
 
                     int companyId = company.getId();
                     //获取公司根部门人员,也就是没有分配部门的人员
-                    int companyRootDeptId = 1;
                     if (enableNewVersion) {
-//                    获取部门
-                        JSONObject deptObj = getDepartments(curCorpAccessToken);
-                        JSONArray deptObjJSONArray = deptObj.getJSONArray("department");
-                        Integer sysDeptId = null;
-                        List<Department> sysDeptList = new ArrayList<>();
-                        for (int i=0;i<deptObjJSONArray.size(); i++) {
-                            int deptId = deptObjJSONArray.getJSONObject(i).getIntValue("id");
-                            if (deptId != companyRootDeptId) {
-                                int parentId = deptObjJSONArray.getJSONObject(i).getIntValue("parentid");
-                                Department department = new Department();
-                                department.setCorpwxDeptid(deptId);
-                                department.setCorpwxDeptpid(parentId);
-                                department.setDepartmentName(deptObjJSONArray.getJSONObject(i).getString("name"));
-                                department.setCompanyId(companyId);
-                                departmentMapper.insert(department);
-                                sysDeptList.add(department);
-                                sysDeptId = department.getDepartmentId();
-                            }
-                            deptObjJSONArray.getJSONObject(i).put("sys_dept_id", sysDeptId);
-                            Integer departmentId = sysDeptId;
-                            JSONArray userList = getDeptUserSimple(curCorpAccessToken, deptId);
-                            for (int m=0;m<userList.size(); m++) {
-                                JSONObject userJson = userList.getJSONObject(m);
-                                String curUserid = userJson.getString("userid");
-                                log.info("userid="+curUserid+", name=" + userJson.getString("name")+", mobile="+userJson.getString("mobile"));
-                                //不存在的人员, 进行插入
-                                User user = new User();
-
-                                user.setId(SnowFlake.nextId()+"")
-                                        .setRoleId(defaultUserRole.getId())//默认普通员工
-                                        .setRoleName(defaultUserRole.getRolename())
-                                        .setCompanyId(companyId)
-                                        .setDepartmentId(departmentId == companyRootDeptId?null:departmentId)
-                                        .setName(userJson.getString("name"))
-                                        .setCorpwxUserid(curUserid)
-                                        .setColor(ColorUtil.randomColor())
-                                        .setJobNumber(userId);//工号就是企业微信的用户ID
-
-                                //检查用户是否已经存在
-                                if (userMapper.selectCount(new QueryWrapper<User>().eq("corpwx_userid", curUserid)) == 0) {
-                                    userMapper.insert(user);
-                                } else {
-                                    //更新信息
-                                    User oldUser = userMapper.selectList(new QueryWrapper<User>().eq("corpwx_userid", curUserid).eq("company_id", companyId).orderByDesc("create_time")).get(0);
-                                    oldUser.setName(userJson.getString("name"));
-                                    oldUser.setDepartmentId(departmentId);
-                                    userMapper.updateById(oldUser);
-                                }
-                            }
-                        }
-//                    再来更新部门的层级关系
-                        updateDeptHierachyByCorpWx(companyId);
+                        getCorpMembsFromPlatform(companyId);
                     }
                 } else {
                     //企业已经存在
@@ -1448,7 +1399,6 @@ public class WeiXinCorpController {
     //改造老版的接口,从平台获取客户通讯录
     @RequestMapping("/getCorpMembsFromPlatform")
     public HttpRespMsg getCorpMembsFromPlatform(Integer companyId) {
-        Company company = companyMapper.selectById(companyId);
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
         if (wxCorpInfo == null) {
             HttpRespMsg msg = new HttpRespMsg();
@@ -1465,8 +1415,38 @@ public class WeiXinCorpController {
         //默认普通员工的角色
         //获取公司根部门人员,也就是没有分配部门的人员
         int companyRootDeptId = 1;
+        JSONArray allCorpWxUserJsonArray = getDeptUserInfo(curCorpAccessToken, companyRootDeptId);
+        System.out.println("获取到公司下的员工数量="+allCorpWxUserJsonArray.size());
         SysRole defaultRole = sysRoleMapper.selectOne(
                 new QueryWrapper<SysRole>().eq("company_id", companyId).eq("is_default", 1));
+        List<User> allCorpWxUserList = new ArrayList<>();
+        for (int m=0;m<allCorpWxUserJsonArray.size(); m++) {
+            JSONObject userJson = allCorpWxUserJsonArray.getJSONObject(m);
+            String curUserid = userJson.getString("userid");
+            //跳过非激活状态的员工
+            if (userJson.getInteger("status") != 1) continue;
+            //不存在的人员, 进行插入
+            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())
+                    .setCompanyId(companyId)
+                    .setName(userJson.getString("name"))
+                    .setPhone(userJson.getString("mobile"))
+                    .setCorpwxUserid(curUserid)
+                    .setColor(ColorUtil.randomColor())
+                    .setJobNumber(curUserid)
+                    .setCorpwxDeptid(maxDeptId);
+            System.out.println("姓名=="+user.getName());
+            allCorpWxUserList.add(user);
+        }
 
         //获取部门
         JSONObject deptObj = getAllDepartments(curCorpAccessToken);
@@ -1490,45 +1470,57 @@ public class WeiXinCorpController {
                 } else {
                     //
                     System.out.println("找到了已有部门== name=="+curDept.getDepartmentName());
-                }
-            }
+                    if (parentId != 1 && curDept.getCorpwxDeptpid() == null) {
+                        //有父部门需要更新
+                        curDept.setCorpwxDeptpid(parentId);
+                        departmentMapper.updateById(curDept);
 
-            JSONArray userList = getDeptUserSimple(curCorpAccessToken, deptId);
-            for (int m=0;m<userList.size(); m++) {
-                JSONObject userJson = userList.getJSONObject(m);
-                String curUserid = userJson.getString("userid");
-                System.out.println("userid="+curUserid+", name=" + userJson.getString("name")+", mobile="+userJson.getString("mobile"));
-                //不存在的人员, 进行插入
-                User user = new User();
-
-                user.setId(SnowFlake.nextId()+"")
-                        .setRoleId(defaultRole.getId())//默认普通员工
-                        .setRoleName(defaultRole.getRolename())
-                        .setCompanyId(companyId)
-                        .setDepartmentId(deptId == companyRootDeptId?null:curDept.getDepartmentId())
-                        .setName(userJson.getString("name"))
-                        .setCorpwxUserid(curUserid)
-                        .setColor(ColorUtil.randomColor())
-                        .setJobNumber(curUserid);
-
-                //检查用户是否已经存在
-                if (userMapper.selectCount(new QueryWrapper<User>().eq("corpwx_userid", curUserid).eq("company_id", companyId)) == 0) {
-                    userMapper.insert(user);
-                } else {
-                    //更新信息
-                    System.out.println("更新人员信息== 部门id=="+curDept.getDepartmentId());
-                    User oldUser = userMapper.selectList(new QueryWrapper<User>().eq("corpwx_userid", curUserid).eq("company_id", companyId)).get(0);
-                    oldUser.setName(userJson.getString("name"));
-                    oldUser.setDepartmentId(curDept.getDepartmentId());
-                    userMapper.updateById(oldUser);
+                    }
                 }
             }
         }
         //更新部门层级关系
         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) {
+                int deptId = allDeptList.stream().filter(all->all.getCorpwxDeptid().equals(newItem.getCorpwxDeptid())).findFirst().get().getDepartmentId();
+                newItem.setDepartmentId(deptId);
+                newItem.setDepartmentCascade(convertDepartmentIdToCascade(deptId, allDeptList));
+            }
+        });
+        userService.saveBatch(newUserList);
+        List<User> updateUserList = allCorpWxUserList.stream().filter(newItem->existingUsers.stream().anyMatch(existingItem->newItem.getCorpwxUserid().equals(existingItem.getCorpwxUserid())
+                                            && (!newItem.getName().equals(existingItem.getName()) || (newItem.getCorpwxDeptid() != null && !newItem.getCorpwxDeptid().equals(existingItem.getCorpwxDeptid()))))).collect(Collectors.toList());
+        List<Integer> corpWxDeptIds = updateUserList.stream().map(User::getCorpwxDeptid).collect(Collectors.toList());
+        List<Department> departmentList = null;
+        if (corpWxDeptIds.size() > 0) {
+            //
+            departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId).in("corpwx_deptid", corpWxDeptIds));
+        }
+        final  List<Department> fDeptList = departmentList;
+        updateUserList.forEach(u->{
+            if (u.getCorpwxDeptid() != 1) {
+                if (fDeptList != null) {
+                    u.setDepartmentId(fDeptList.stream().filter(d->d.getCorpwxDeptid().equals(u.getCorpwxDeptid())).findFirst().get().getDepartmentId());
+                }
+                //设置层级部门
+                u.setDepartmentCascade(convertDepartmentIdToCascade(u.getDepartmentId(), allDeptList));
+            } else {
+                u.setDepartmentId(0);
+                u.setDepartmentCascade("0");
+            }
+
+        });
+
         return new HttpRespMsg();
     }
 
+
     //新版本, 由于是第三方服务商,需要先获取授权范围内的组织架构(没有部门和人员的名称),再从中转服务器去获取名称
     @RequestMapping("/getCorpMembs")
     public HttpRespMsg getCorpMembs(String corpId, @RequestParam(required = false, defaultValue = "1") Integer syncMembs) {
@@ -1897,10 +1889,10 @@ public class WeiXinCorpController {
         List<Department> allDbDeptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
         for (Department department : allDbDeptList) {
             Integer corpwxpid = department.getCorpwxDeptpid();
-            if (corpwxpid != null && corpwxpid == 1) {
+            if (corpwxpid == null || corpwxpid == 1) {
 
             } else {
-                Optional<Department> first = allDbDeptList.stream().filter(all -> all.getCorpwxDeptid().intValue() == corpwxpid).findFirst();
+                Optional<Department> first = allDbDeptList.stream().filter(all -> all.getCorpwxDeptid() != null && all.getCorpwxDeptid().intValue() == corpwxpid).findFirst();
                 if (first.isPresent()) {
                     //按照企业微信的部门父部门找到了
                     Integer sysPid = first.get().getDepartmentId();

+ 3 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Report.java

@@ -352,6 +352,9 @@ public class Report extends Model<Report> {
     private Integer reportAutoApprove;
 
 
+    @TableField(exist = false)
+    private ReportAuditorSetting auditorSetting;
+
     @Override
     protected Serializable pkVal() {
         return this.id;

+ 7 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TimeType.java

@@ -17,7 +17,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2022-09-06
+ * @since 2022-09-27
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -365,6 +365,12 @@ public class TimeType extends Model<TimeType> {
     @TableField("max_report_time")
     private Float maxReportTime;
 
+    /**
+     * 员工自由选择审核人的方式下的审核层级:默认为2
+     */
+    @TableField("audit_level")
+    private Integer auditLevel;
+
 
     @Override
     protected Serializable pkVal() {

+ 11 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/User.java

@@ -21,7 +21,7 @@ import org.springframework.format.annotation.DateTimeFormat;
  * </p>
  *
  * @author Seyason
- * @since 2022-08-09
+ * @since 2022-09-28
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -236,6 +236,16 @@ public class User extends Model<User> {
     @TableField(exist = false)
     private Integer userNameNeedTranslate = 0;
 
+    /**
+     * 员工在企业微信中的部门id
+     */
+    @TableField("corpwx_deptid")
+    private Integer corpwxDeptid;
+
+    @TableField(exist = false)
+    private String type;
+
+
     @Override
     protected Serializable pkVal() {
         return this.id;

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

@@ -14,4 +14,5 @@ public class DepartmentMasterVO extends Department {
     private Double costTime;
     private BigDecimal costMoney;
     private boolean hasSubDept;
+    private String type;
 }

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

@@ -145,4 +145,6 @@ public interface ReportMapper extends BaseMapper<Report> {
             "AND NOT EXISTS(SELECT 1 FROM report r WHERE r.id <> report.id AND r.`creator_id` = report.`creator_id` AND r.`create_date` = report.`create_date` AND r.project_audit_state = 0)\n" +
             "AND EXISTS (SELECT 1 FROM report r WHERE r.id <> report.id AND r.`creator_id` = report.`creator_id` AND r.`create_date` = report.`create_date`)\n")
     List<Map<String, Object>> getProcessErrorData();
+
+    List<Map<String, Object>> getUploadThirdReportData(Integer companyId,@Param("startDate") LocalDate startDate, @Param("endDate") LocalDate endDate);
 }

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

@@ -92,4 +92,6 @@ public interface ReportService extends IService<Report> {
     HttpRespMsg getWeeklyWorkTime(String dateStr, HttpServletRequest request);
 
     HttpRespMsg getProcessErrorData();
+
+    HttpRespMsg getUploadThirdReportData(String yearMonth,HttpServletRequest request);
 }

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

@@ -6,6 +6,7 @@ import com.management.platform.entity.LeaveSheet;
 import com.management.platform.entity.WxCorpInfo;
 import com.management.platform.util.HttpRespMsg;
 
+import java.io.File;
 import java.time.LocalDateTime;
 import java.util.List;
 
@@ -32,4 +33,12 @@ public interface WxCorpInfoService extends IService<WxCorpInfo> {
     HttpRespMsg syncMembByCardTime(WxCorpInfo wxCorpInfo);
 
     public List<LeaveSheet> WxLeaveNumber(String startTime,String endTime,List<WxCorpInfo> wxCorpInfos) throws Exception;
+
+    public String getProviderAccessToken() throws Exception;
+
+    public String getTranslationMediaId(String fileName) throws Exception;
+
+    public String syncTranslation(String authCorpid,String mediaId,String outPutFileName,String outputFileFormat) throws Exception;
+
+    public String getSyncTranslationResult(String jobId) throws Exception;
 }

+ 3 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DepartmentServiceImpl.java

@@ -425,6 +425,7 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
                 totalCostMoney = totalCostMoney.add(money);
                 departmentMasterVO.setCostTime(time);
                 departmentMasterVO.setCostMoney(money);
+                departmentMasterVO.setType("departmentName");
                 //检查是否有子部门
                 if (allDeptList.stream().anyMatch(dept->department.getDepartmentId().equals(dept.getSuperiorId()))) {
                     departmentMasterVO.setHasSubDept(true);
@@ -522,6 +523,7 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
                     user.setId((String)map.get(("id")));
                     user.setName((String)map.get("user"));
                     user.setJobNumber((String)map.get("jobNumber"));
+                    user.setType("userName");
                     userList.add(user);
                     //这个名字尚未装进数组中
                     List<Map<String, Object>> tempList = new ArrayList<>();
@@ -544,6 +546,7 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
                 Map<String, Object> map = new HashMap<>();
                 map.put("name", key);
                 map.put("project", tempMap.get(key));
+                map.put("type","userName");
                 finalList.add(map);
             }
             finalMap.put("totalCostMoney", totalCostMoney);

+ 22 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ExpenseSheetServiceImpl.java

@@ -314,6 +314,28 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
                 BigDecimal bigDecimal = new BigDecimal(0);
                 List<ExpenseItem> expenseItemList = new ArrayList<>();
                 int i=0;
+                String errorAboutProject="";
+                for (int rowIndex = 5; rowIndex <= rowNum; rowIndex++) {
+                    XSSFRow row = sheet.getRow(rowIndex);
+                    if (row == null) {
+                        continue;
+                    }
+                    //跳过空行
+                    if (ExcelUtil.isRowEmpty(row)) {
+                        continue;
+                    }
+                    //项目编号 费用日期 发拍种类 费用类型 费用金额 发票号 税率 税额 备注
+                    XSSFCell codeCell = row.getCell(0);
+                    if (codeCell != null) codeCell.setCellType(CellType.STRING);
+                    Optional<Project> project = projectList.stream().filter(pro ->(StringUtils.isEmpty(pro.getProjectCode())?"":pro.getProjectCode()).equals(codeCell.getStringCellValue())
+                            || (StringUtils.isEmpty(pro.getProjectName())?"":pro.getProjectName()).equals(codeCell.getStringCellValue())).findFirst();
+                    if (!project.isPresent()) {
+                        errorAboutProject+=codeCell.getStringCellValue()+"/";
+                    }
+                }
+                if(!errorAboutProject.equals("")){
+                    throw new Exception("项目编号/项目名称为[" +errorAboutProject+"]的项目不存在");
+                }
                 for (int rowIndex = 5; rowIndex <= rowNum; rowIndex++) {
                     XSSFRow row = sheet.getRow(rowIndex);
                     if (row == null) {
@@ -351,8 +373,6 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
                             || (StringUtils.isEmpty(pro.getProjectName())?"":pro.getProjectName()).equals(codeCell.getStringCellValue())).findFirst();
                     if (project.isPresent()) {
                         expenseItem.setProjectId(project.get().getId());
-                    } else {
-                        throw new Exception("项目编号/项目名称为[" + codeCell.getStringCellValue() + "]的项目不存在");
                     }
                     expenseItem.setExpenseId(expenseSheet.getId());
                     if(happenDateCell!=null && !happenDateCell.toString().trim().equals("")){

+ 70 - 4
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -143,6 +143,10 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     @Resource
     private TaskService taskService;
     @Resource
+    private ReportAuditorSettingService reportAuditorSettingService;
+    @Resource
+    private ReportAuditorSettingMapper reportAuditorSettingMapper;
+    @Resource
     private UserRecentTaskMapper userRecentTaskMapper;
     @Resource
     private PpMembsMapper ppMembsMapper;
@@ -592,7 +596,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                             r.setProjectAuditorName(auItem.get().getAuditorName());
                         }
                     }
-                } else {
+                } else if (reportAuditType == 1 || reportAuditType == 2) {
                     if (r.getGroupId() != null && r.getGroupId() != 0) {
                         //直接获取分组的负责人作为审核人
                         Optional<TaskGroup> tgoup = taskGroups.stream().filter(tg->tg.getId().equals(r.getGroupId())).findFirst();
@@ -612,6 +616,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                             }
                         }
                     }
+                } else if (reportAuditType == 3) {
+
                 }
 
             });
@@ -796,6 +802,14 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         //异步下载图片
         loadPicFromCorpWXServer(companyId, reportList);
         saveFillReportLog(reportList);
+        //处理审批流程
+        if (timeType.getReportAuditType() == 3) {
+            reportList.forEach(r->r.getAuditorSetting().setReportId(r.getId()));
+            List<ReportAuditorSetting> collect = reportList.stream().map(Report::getAuditorSetting).collect(Collectors.toList());
+            if (collect.size() > 0) {
+                reportAuditorSettingService.saveOrUpdateBatch(collect);
+            }
+        }
         return httpRespMsg;
     }
 
@@ -1332,6 +1346,40 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 }
                 //批量更新
                 updateBatchById(reportList);
+            } else if (timeType.getReportAuditType() == 3) {
+                //员工自由选择的审批人
+                String auditorId = user.getId();
+                List<ReportAuditorSetting> auditorSettingList = reportAuditorSettingMapper.selectList(new QueryWrapper<ReportAuditorSetting>().in("report_id", ids));
+
+                for (Integer rid : ids) {
+                    Report r = new Report();
+                    r.setId(rid);
+                    ReportAuditorSetting auditorItem = auditorSettingList.stream().filter(a -> a.getReportId().equals(rid)).findFirst().get();
+                    if (auditorId.equals(auditorItem.getAuditorFirst())) {
+                        if (auditorItem.getAuditorSec() != null) {
+                            //进入到第二审批人
+                            r.setProjectAuditorId(auditorItem.getAuditorSec());
+                        } else {
+                            r.setProjectAuditState(1);
+                            r.setProjectAuditTime(LocalDateTime.now());
+                            r.setState(1);
+                        }
+                    } else if (auditorId.equals(auditorItem.getAuditorSec())) {
+                        if (auditorItem.getAuditorThird() != null) {
+                            //进入到第三审批人
+                            r.setProjectAuditorId(auditorItem.getAuditorThird());
+                        } else {
+                            r.setProjectAuditState(1);
+                            r.setProjectAuditTime(LocalDateTime.now());
+                            r.setState(1);
+                        }
+                    } else if (auditorId.equals(auditorItem.getAuditorThird())) {
+                        //目前最多三层,第三个审批人审批后结束
+                        r.setProjectAuditState(1);
+                        r.setProjectAuditTime(LocalDateTime.now());
+                        r.setState(1);
+                    }
+                }
             } else {
                 //之前的流程逻辑,综合了一层项目审核,或者一层任务分组审核。 可叠加部门审批流
                 List<AuditWorkflowTimeSetting> settings = auditWorkflowTimeSettingMapper.selectList(
@@ -1720,9 +1768,12 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 upR.setGroupAuditState(0);
                 System.out.println("groupId=="+r.getGroupId());
                 if (r.getGroupId() != 0) {
-                    String inchargerId = taskGroupMapper.selectById(r.getGroupId()).getInchargerId();
-                    upR.setProjectAuditorId(inchargerId);
-                    upR.setProjectAuditorName(userMapper.selectById(inchargerId).getName());
+                    TaskGroup oldGroup = taskGroupMapper.selectById(r.getGroupId());
+                    if (oldGroup != null) {
+                        String inchargerId = taskGroupMapper.selectById(r.getGroupId()).getInchargerId();
+                        upR.setProjectAuditorId(inchargerId);
+                        upR.setProjectAuditorName(userMapper.selectById(inchargerId).getName());
+                    }
                 }
                 newList.add(upR);
             }
@@ -3903,6 +3954,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
         //获取企业微信同步数据
         List<Map> userCorpwxTimeMapList = userCorpwxTimeMapper.selectByAsk(companyId,startDate,endDate);
+        //请假人员名单
 
         DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
@@ -4407,6 +4459,20 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         return msg;
     }
 
+    @Override
+    public HttpRespMsg getUploadThirdReportData(String yearMonth,HttpServletRequest request) {
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        String dateStr = yearMonth+"-01";
+        LocalDate startDate = LocalDate.parse(dateStr,df);
+        LocalDate endDate = LocalDate.parse(dateStr,df);
+        endDate=endDate.plusMonths(1);
+        List<Map<String,Object>> resultList=reportMapper.getUploadThirdReportData(companyId,startDate,endDate);
+        httpRespMsg.data=resultList;
+        return httpRespMsg;
+    }
+
     private void selfUpdateToNextWorkFlow(Integer companyId, User auditTargetUser, List<Integer> targetRids, List<Department> allDepts) {
         List<AuditWorkflowTimeSetting> settings = auditWorkflowTimeSettingMapper.selectList(
                 new QueryWrapper<AuditWorkflowTimeSetting>().eq("company_id", companyId)

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

@@ -1378,7 +1378,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
         try {
             String userId = request.getHeader("Token");
             User user = userMapper.selectById(userId);
-
+            WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
             //准备导出
             HSSFWorkbook workbook = new HSSFWorkbook();
             //HSSFSheet sheet = workbook.createSheet("全部员工列表");
@@ -1467,10 +1467,18 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                 }
                 HSSFRow row = sheet.createRow(rowNum);
                 row.createCell(0).setCellValue(rowNum);
-                row.createCell(1).setCellValue(item.getName());
+                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                    row.createCell(1).setCellValue("$userName="+item.getCorpwxUserid()==null?"":item.getCorpwxUserid()+"$");
+                }else {
+                    row.createCell(1).setCellValue(item.getName());
+                }
                 row.createCell(2).setCellValue(item.getRoleName());
                 row.createCell(3).setCellValue(item.getPhone());
-                row.createCell(4).setCellValue(item.getDepartmentName());
+                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                    row.createCell(4).setCellValue("$departmentName="+item.getCorpwxDeptid()==null?"":item.getCorpwxDeptid()+"$");
+                }else {
+                    row.createCell(4).setCellValue(item.getDepartmentName());
+                }
                 row.createCell(5).setCellValue(item.getMonthCost()==null? 0 : item.getMonthCost().intValue());
                 row.createCell(6).setCellValue(item.getCost() == null?0.0 : item.getCost().doubleValue());
                 List<UserCert> certList = userCertList.stream().distinct().filter(uc -> uc.getUserId().equals(item.getId())).collect(Collectors.toList());
@@ -1497,8 +1505,22 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             workbook.write(fos);
             fos.flush();
             fos.close();
-            //返回生成的文件地址/upload文件夹下
-            httpRespMsg.data = "/upload/" + fileUrlSuffix;
+            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                String mediaId = wxCorpInfoService.getTranslationMediaId(fileUrlSuffix);
+                String jobId = wxCorpInfoService.syncTranslation(wxCorpInfo.getCorpid(),mediaId,fileUrlSuffix, null);
+            /*if(jobId!=null&&!jobId.equals("")){
+                File file=new File(path + fileUrlSuffix);
+                if(file.exists()){
+                    file.delete();
+                }
+            }*/
+                Thread.sleep(3000);
+                String syncTranslationResult = wxCorpInfoService.getSyncTranslationResult(jobId);
+                //返回生成的文件地址/upload文件夹下
+                httpRespMsg.data = syncTranslationResult;
+            }else {
+                httpRespMsg.data = "/upload/" + fileUrlSuffix;
+            }
         } catch (NullPointerException e) {
             e.printStackTrace();
             //httpRespMsg.setError("验证失败或缺少数据");
@@ -1509,6 +1531,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             //httpRespMsg.setError("文件生成错误");
             httpRespMsg.setError(MessageUtils.message("file.generateError"));
             return httpRespMsg;
+        } catch (Exception e) {
+            e.printStackTrace();
         }
         return httpRespMsg;
     }

+ 126 - 6
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java

@@ -1,9 +1,11 @@
 package com.management.platform.service.impl;
 
+import com.alibaba.fastjson.JSON;
 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.JsonObject;
 import com.management.platform.controller.WeiXinCorpController;
 import com.management.platform.entity.*;
 import com.management.platform.mapper.SysConfigMapper;
@@ -13,23 +15,28 @@ import com.management.platform.mapper.WxCorpInfoMapper;
 import com.management.platform.service.WxCorpInfoService;
 import com.management.platform.util.*;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.http.client.utils.HttpClientUtils;
+import org.json.HTTP;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.core.io.FileSystemResource;
 import org.springframework.http.*;
 import org.springframework.stereotype.Service;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
 import org.springframework.web.client.RestTemplate;
+import org.springframework.web.util.UriComponentsBuilder;
+import sun.net.www.http.HttpClient;
 
 import javax.annotation.Resource;
-import java.io.File;
-import java.io.FileOutputStream;
+import java.io.*;
 import java.lang.reflect.Array;
+import java.net.URI;
 import java.text.SimpleDateFormat;
 import java.time.*;
 import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
+import java.util.*;
+import java.util.concurrent.Executors;
 import java.util.stream.Collectors;
 
 /**
@@ -55,6 +62,11 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
     @Value("${suitSecret}")
     private String suitSecret;
 
+    @Value("${corpId}")
+    private String corpId;
+    @Value("${providerSecret}")
+    private String providerSecret;
+
     @Value(value = "${upload.path}")
     private String path;
 
@@ -75,6 +87,114 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
     @Resource
     UserCorpwxTimeMapper userCorpwxTimeMapper;
 
+
+    //获取服务商provider_access_token
+    @Override
+    public String getProviderAccessToken() throws Exception {
+        String access_token="";
+        String url = "https://qyapi.weixin.qq.com/cgi-bin/service/get_provider_token";
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_JSON);
+        JSONObject jsonObject=new JSONObject();
+        jsonObject.put("corpid",corpId);
+        jsonObject.put("provider_secret",providerSecret);
+        HttpEntity<String> requestEntity = new HttpEntity<String>(jsonObject.toJSONString(), headers);
+        ResponseEntity<String> responseEntity = this.restTemplate.exchange(url,
+                HttpMethod.POST, requestEntity, String.class);
+        if (responseEntity.getStatusCode() == HttpStatus.OK) {
+            String resp = responseEntity.getBody();
+            JSONObject json = JSONObject.parseObject(resp);
+            if(json.getIntValue("errcode")>0){
+                throw new Exception(json.toJSONString());
+            }
+            access_token= json.getString("provider_access_token");
+        }
+        return access_token;
+    }
+
+    //获取上传转移文件 获得的media_ia
+    @Override
+    public String getTranslationMediaId(String fileName) throws Exception {
+        String media_id="";
+        URI url = UriComponentsBuilder.fromHttpUrl("https://qyapi.weixin.qq.com/cgi-bin/service/media/upload")
+                .queryParam("provider_access_token", getProviderAccessToken())
+                .queryParam("type", "file")
+                .build().toUri();
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.MULTIPART_FORM_DATA);
+        //然后处理文件 通讯录id转译
+        FileSystemResource fileSystemResource = new FileSystemResource(path+fileName);
+        ContentDisposition build = ContentDisposition.builder("form-data").filename(fileSystemResource.getFilename()).build();
+        headers.setContentDisposition(build);
+        MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
+        params.add("media", fileSystemResource);
+        HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<MultiValueMap<String, Object>>(params, headers);
+        ResponseEntity<String> responseEntity = this.restTemplate.exchange(url,
+                HttpMethod.POST, requestEntity, String.class);
+        if (responseEntity.getStatusCode() == HttpStatus.OK) {
+            String resp = responseEntity.getBody();
+            JSONObject json = JSONObject.parseObject(resp);
+            if(json.getIntValue("errcode")==0){
+                media_id= json.getString("media_id");
+            }else {
+                throw new Exception(json.toJSONString());
+            }
+        }
+        return media_id;
+    }
+
+    //异步通讯录id转译
+    @Override
+    public String syncTranslation(String authCorpid, String mediaId,String outPutFileName,String outputFileFormat) throws Exception {
+        String url = "https://qyapi.weixin.qq.com/cgi-bin/service/contact/id_translate?provider_access_token=ACCESS_TOKEN".replaceAll("ACCESS_TOKEN",getProviderAccessToken());
+        HttpHeaders headers = new HttpHeaders();
+        List<String> list=new ArrayList<>();
+        list.add(mediaId);
+        String jobid="";
+        headers.setContentType(MediaType.APPLICATION_JSON);
+        JSONObject jsonObject=new JSONObject();
+        jsonObject.put("auth_corpid",authCorpid);
+        jsonObject.put("media_id_list",list);
+        /*jsonObject.put("output_file_name",outPutFileName);*/
+        /*jsonObject.put("output_file_format",outputFileFormat);*/
+        HttpEntity<String> requestEntity = new HttpEntity<String>(jsonObject.toJSONString(), headers);
+        ResponseEntity<String> responseEntity = this.restTemplate.exchange(url,
+                HttpMethod.POST, requestEntity, String.class);
+        if (responseEntity.getStatusCode() == HttpStatus.OK) {
+            String resp = responseEntity.getBody();
+            JSONObject json = JSONObject.parseObject(resp);
+            if(json.getIntValue("errcode")==0){
+                jobid= json.getString("jobid");
+            }else {
+                throw new Exception(json.toJSONString());
+            }
+        }
+        return jobid;
+    }
+
+    //获取异步任务结果
+    @Override
+    public String getSyncTranslationResult(String jobId) throws Exception {
+        String url = "https://qyapi.weixin.qq.com/cgi-bin/service/batch/getresult?provider_access_token=ACCESS_TOKEN&jobid=JOBID"
+                .replaceAll("ACCESS_TOKEN",getProviderAccessToken()).replaceAll("JOBID",jobId);
+        HttpHeaders headers = new HttpHeaders();
+        String resultUrl="";
+        HttpEntity<String> requestEntity = new HttpEntity<String>(null, headers);
+        ResponseEntity<String> responseEntity = this.restTemplate.exchange(url,
+                HttpMethod.GET, requestEntity, String.class);
+        String resp = responseEntity.getBody();
+        System.out.println(resp);
+        JSONObject json = JSONObject.parseObject(resp);
+        if(json.getIntValue("errcode")==0){
+            JSONObject result = (JSONObject) json.get("result");
+            JSONObject contact_id_translate = (JSONObject) result.get("contact_id_translate");
+            resultUrl = contact_id_translate.getString("url");
+        }else {
+            throw new Exception(json.toJSONString());
+        }
+        System.out.println(resultUrl);
+        return resultUrl;
+    }
     @Override
     public void sendWXCorpMsg(WxCorpInfo corpInfo, String corpUserid, String msg) {
         try {

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/resources/application.yml

@@ -15,7 +15,7 @@ spring:
       location: C:/upload/
   datasource:
     driver-class-name: com.mysql.cj.jdbc.Driver
-    url: jdbc:mysql://47.101.180.183:3306/man_dev?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&useSSL=false
+    url: jdbc:mysql://47.101.180.183:3306/man_hour_manager?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&useSSL=false
     username: root
     password: HuoshiDB@2022
     hikari:

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

@@ -550,6 +550,24 @@
         </if>
         GROUP BY project_id, report.creator_id;
     </select>
+
+    <select id="getUploadThirdReportData" resultType="java.util.Map">
+        select IFNULL(p.project_code,'其他') as projectCode,IFNULL(tg.task_group_code,'其他')as taskGroupCode,DATE_FORMAT(r.create_date, '%Y') as ofyear,
+        DATE_FORMAT(r.create_date, '%m') as ofmonth,u.name as userName,u.job_number as jobNumber,d.department_name as departmentName,SUM(r.cost) as cost
+        from report r
+        left join project p  on p.id=r.project_id
+        left join task_group tg on tg.project_id=p.id and  r.group_id=tg.id
+        left join user u on u.id=r.creator_id
+        left join department d on d.department_id=u.department_id
+        where p.company_id=#{companyId}
+        <if test="startDate != null">
+            AND r.create_date &gt;= #{startDate}
+        </if>
+        <if test="endDate != null">
+            AND r.create_date &lt; #{endDate}
+        </if>
+        group by p.id,u.id,tg.id
+    </select>
     <select id="getReportFillStatus" resultType="java.util.Map">
         SELECT DATE_FORMAT(create_date,'%Y-%m-%d') as createDate, MAX(state) AS state FROM report
         WHERE create_date BETWEEN #{startDate} AND #{endDate} AND creator_id = #{userId} GROUP BY create_date

Разлика између датотеке није приказан због своје велике величине
+ 3 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TimeTypeMapper.xml


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

@@ -39,6 +39,7 @@
         <result column="plate5" property="plate5" />
         <result column="is_ops" property="isOps" />
         <result column="job_number" property="jobNumber" />
+        <result column="corpwx_deptid" property="corpwxDeptid" />
     </resultMap>
     <resultMap id="BaseResultMap2" type="com.management.platform.entity.User">
         <id column="id" property="id" />
@@ -48,7 +49,7 @@
     </resultMap>
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, name, phone, password, portrait_url, create_time, role, company_id, department_id, department_cascade, cost, month_cost, salary_type, manage_dept_id, color, is_active, wx_openid, role_id, role_name, cost_apply_date, dingding_userid, dingding_unionid, corpwx_userid, induction_date, inactive_date, position, report_status, superior_id, plate1, plate2, plate3, plate4, plate5, is_ops, job_number
+        id, name, phone, password, portrait_url, create_time, role, company_id, department_id, department_cascade, cost, month_cost, salary_type, manage_dept_id, color, is_active, wx_openid, role_id, role_name, cost_apply_date, dingding_userid, dingding_unionid, corpwx_userid, induction_date, inactive_date, position, report_status, superior_id, plate1, plate2, plate3, plate4, plate5, is_ops, job_number, corpwx_deptid
     </sql>
     <!--单独分页获取人员-->
     <select id="getUserByDepartment" resultType="java.util.Map">

Разлика између датотеке није приказан због своје велике величине
+ 1397 - 10200
fhKeeper/formulahousekeeper/management-platform/workTime.log


+ 1 - 1
fhKeeper/formulahousekeeper/octopus/src/views/workReport/review.vue

@@ -138,7 +138,7 @@
                 return string.split('\n')
             },
 
-            handleSizeChange(){
+            handleSizeChange(val){
                 this.size = val;
                 this.page = 1
                 this.getTableList();

+ 93 - 14
fhKeeper/formulahousekeeper/timesheet/src/components/select.vue

@@ -1,11 +1,15 @@
 <template>
   <div tabindex="0" @blur="selectClihide()" style="display: inline-block;">  
-    <div :style="'width:' + selectWidth + 'px;height:' + selectHeight + 'px'" :class="classDiv ? 'select selectDiv' : 'select'" @click="selectCli" ref="selectDiv">
-        <div :class="selectName == $t('defaultText.pleaseChoose') ? 'selecttex selecttexXuan' : 'selecttex'">
-            <ww-open-data type='userName' :openid='selectName'></ww-open-data>
-            <!-- {{selectName}} -->
+    <!-- <div :style="'width:' + selectWidth + 'px;height:' + selectHeight + 'px'" :class="classDiv ? 'select selectDiv' : 'select'" @click="selectCli" :ref="disabled ? '' : 'selectDiv'"> -->
+    <div :class="disabled ? 'disabledTrue' : 'disabledFalse'" @mouseenter="moveIonDiv" @mouseleave="outIonDiv">
+        <div :style="`width:${selectWidth}px;height:${selectHeight}px`" :class="classDiv ? 'select selectDiv' : 'select'" @click="selectCli" :ref="disabled ? '' : 'selectDiv'">
+            <div :style="'line-height: '+selectHeight+'px'" :class="selectName == $t('defaultText.pleaseChoose') ? 'selecttex selecttexXuan' : 'selecttex'">
+                <ww-open-data type='userName' :openid='selectName'></ww-open-data>
+                <!-- {{selectName}} -->
+            </div>
+            <i :class=" move ? 'el-icon-arrow-down iostu iostuHover' : 'el-icon-arrow-down iostu'" v-if="!moveIon"></i>
+            <i v-if="moveIon" class="el-icon-circle-close iostu" @click="clearDelete"></i>
         </div>
-        <i class="el-icon-arrow-down iostu"></i>
     </div>
     <transition name="el-zoom-in-top">
       <div v-show="show" style="position: relative;z-index: 99;">
@@ -13,7 +17,6 @@
             <ul class="transitionBoxUl">
                 <li :class="transitionBoxLiIdx == index ? 'liHover' : ''" v-for="(item, index) in options" :key="index" @mouseover="liMouseOver(index)" @click="liClick(item)"> 
                     <span v-if="item.name">
-                        <!-- {{item.name || item.auditorName}} -->
                         <ww-open-data type='userName' :openid='item.name'></ww-open-data>
                     </span> 
                     <span v-if="item.auditorName">
@@ -35,11 +38,12 @@ export default {
             type: Array
         },
         size: {
-            type: String
+            type: String,
         },
         subjectId: {
-            type: String
+            type: [String, Number]
         },
+        // 当前页面用到的第几个
         distinction: {
             type: String,
             default: '1',
@@ -52,9 +56,29 @@ export default {
             type: Boolean,
             default: false, // 默认值,不是填写日报
         },
-        // 针对查任务的处理
+        // 剩下统一索引
         index: {
             type: String
+        },
+        // 是否禁用
+        disabled: {
+            type: Boolean,
+            default: false
+        },
+        // 是否可清空
+        clearable: {
+            type: Boolean,
+            default: false
+        },
+        // 是否可搜索
+        filterable: {
+            type: Boolean,
+            default: false
+        },
+        // 其他数据
+        other: {
+            type: [String, Number, Boolean],
+            default: false
         }
     },
     components: {
@@ -73,6 +97,8 @@ export default {
             optionsOId: '', // 选中人的id
             dailyListObj: null, // 填写日报的数据
             dailyListIndex: null, // 日报点的索引
+            move: false,
+            moveIon: false
         };
     },
     computed: {},
@@ -94,6 +120,19 @@ export default {
                 console.log(newValue, oldValue)
                 this.dailyListIndex = newValue
             },
+        },
+        subjectId: {
+            handler(newValue, oldValue) {
+                console.log(newValue, oldValue)
+                this.optionsOId = newValue
+                if(this.optionsOId) {
+                    for(let i in this.options) {
+                        if(this.options[i].id == this.optionsOId || this.options[i].auditorId == this.optionsOId) {
+                            this.selectName = this.options[i].name || this.options[i].auditorName
+                        }
+                    }
+                }
+            },
         }
     },
     created() {},
@@ -116,20 +155,25 @@ export default {
                 }
             }
         }
-        console.log(this.options, this.optionsOId)
+        console.log(this.subjectId)
         this.dailyListIndex = this.idx
+        // this.moveIon = JSON.parse(JSON.stringify(this.clearable))
     },
     methods: {
         selectCli() {
-            this.$refs.selectDiv.focus()
-            this.classDiv = !this.classDiv
-            this.show = !this.show
+            if(!this.disabled) {
+                this.$refs.selectDiv.focus()
+                this.classDiv = !this.classDiv
+                this.show = !this.show
+                this.move = !this.move
+            }
         },
         selectClihide() {
             if(this.classDiv) {
                 this.transitionBoxLiIdx = ''
                 this.show = !this.show
                 this.classDiv = false
+                this.move = false
             }
         },
         liMouseOver(index) {
@@ -148,6 +192,7 @@ export default {
                     id: nameId,
                     distinction: this.distinction,
                     index: this.index, // 选中的索引
+                    other: this.other
                 }
                 this.$emit("selectCal", obj)
             }
@@ -155,7 +200,26 @@ export default {
             this.transitionBoxLiIdx = ''
             this.show = !this.show
             this.classDiv = false
+            this.move = false
+        },
+        moveIonDiv() {
+            if(this.clearable) {
+                this.moveIon = true
+            }
         },
+        outIonDiv() {
+            if(this.clearable) {
+                this.moveIon = false
+            }
+        },
+        clearDelete() {
+            this.selectName = this.$t('defaultText.pleaseChoose')
+            let obj = {
+                name: this.$t('defaultText.pleaseChoose'),
+                id: ''
+            }
+            this.liClick(obj)
+        }
     },
     triggerOption(){
 
@@ -171,9 +235,19 @@ export default {
     .selectDiv {
         border-color: #409EFF !important;
     }
+    .disabledTrue {
+        background: #F5F7FA !important;
+        border-radius: 4px;
+        cursor: not-allowed !important;
+        position: relative;
+    }
+    .disabledTrue {
+        background: #FFF;
+        border-radius: 4px;
+    }
     .select {
         -webkit-appearance: none;
-        background-color: #FFF;
+        // background-color: #FFF;
         background-image: none;
         border-radius: 4px;
         border: 1px solid #DCDFE6;
@@ -204,6 +278,10 @@ export default {
         margin-top: -4px;
         right: 8px;
         color: #C0C4CC;
+        transition: All 0.2s ease-in-out;
+    }
+    .iostuHover {
+        transform: rotate(-180deg);
     }
     .transitionBox {
         background: #FFF;
@@ -218,6 +296,7 @@ export default {
         box-shadow: 0 2px 12px #dfdfdf;
         max-height: 274px;
         overflow: auto;
+        z-index: 500 !important;
     }
     .transitionBoxUl {
         list-style: none;

+ 4 - 1
fhKeeper/formulahousekeeper/timesheet/src/i18n/en.json

@@ -1390,5 +1390,8 @@
   "wanttodeletefirst": "Please select the record to delete first",
   "xuan-ze": "choose",
   "dui-yi-you-xiang-mu-jin-hang-xin-xi-geng-xin": "Update information on existing projects",
-  "dao-chu-qing-jia-dan": "Export leave request"
+  "dao-chu-qing-jia-dan": "Export leave request",
+  "suixiangmuzidongchuangjian": "Automatically created with project",
+  "ren-wu-lie-biao-ming-cheng": "task list name",
+  "yu-suan-gong-shi": "budgeted hours"
 }

+ 5 - 2
fhKeeper/formulahousekeeper/timesheet/src/i18n/zh.json

@@ -1234,7 +1234,7 @@
   "deletethegroup": "删除分组",
   "groupdetails": "分组详情",
   "shi-tu": "视图",
-  "renamingalist": "重命名列表",
+  "renamingalist": "修改列表",
   "jie-zhi": "截止",
   "ren-ling": "认领",
   "creatingTaskList": "新建任务列表",
@@ -1390,5 +1390,8 @@
   "li-run-shuai": "利润率(%)",
   "bai-fen-bi": "百分比",
   "dui-yi-you-xiang-mu-jin-hang-xin-xi-geng-xin": "对已有项目进行信息更新",
-  "dao-chu-qing-jia-dan": "导出请假单"
+  "dao-chu-qing-jia-dan": "导出请假单",
+  "suixiangmuzidongchuangjian": "随项目自动创建",
+  "ren-wu-lie-biao-ming-cheng": "任务列表名称",
+  "yu-suan-gong-shi": "预算工时"
 }

+ 40 - 10
fhKeeper/formulahousekeeper/timesheet/src/views/awayOffice/awayOffice.vue

@@ -157,14 +157,17 @@
             <div class="ctons">
         <!-- 出差列表筛选 -->
                 <div class="flex">
-                    <div><el-select v-model="ownerIds" :placeholder="$t('pleaseselectbusinesstraveler')" clearable @change="billss(1)" style="width: 140px" size="small" filterable="true">
+                    <div>
+                        <el-select v-if="user.userNameNeedTranslate != 1" v-model="ownerIds" :placeholder="$t('pleaseselectbusinesstraveler')" clearable @change="billss(1)" style="width: 140px" size="small" filterable="true">
                             <el-option
                             v-for="item in users"
                             :key="item.id"
                             :label="item.name"
                             :value="item.id">
                             </el-option>
-                    </el-select></div>
+                        </el-select>
+                        <selectCat v-if="user.userNameNeedTranslate == 1" :size="'small'" :subject="users" :subjectId="ownerIds" :clearable="true" :filterable="true" :distinction="'1'" :other="'1'" @selectCal="selectCal"></selectCat>
+                    </div>
                     <div><span style="color: #606266">{{ $t('traffictools') }}</span>
                         <el-select v-model="type" :placeholder="$t('defaultText.pleaseChoose')" clearable @change="billss(1)" style="width: 140px;" size="small" filterable="true">
                             <el-option :label="$t('plane')" :value="0"></el-option>
@@ -201,7 +204,10 @@
                 <el-table :data="tableList" style="width: 100%" height="90%" :loading="tableListLoading">
                     <el-table-column prop="ownerName" :label="$t('businesspersonnel')" width="100" fixed="left" align="center">
                         <template slot-scope="scope">
-                            <span :style="scope.row.dayCount >= 10 ? 'color:#e62412' : ''">{{scope.row.ownerName}}</span>
+                            <span :style="scope.row.dayCount >= 10 ? 'color:#e62412' : ''">
+                                <span v-if="user.userNameNeedTranslate != 1">{{scope.row.ownerName}}</span>
+                                <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='scope.row.ownerName'></ww-open-data></span>
+                            </span>
                         </template>
                     </el-table-column>
                     <!-- <el-table-column prop="reason" label="出差事由" width="150" header-align="center"></el-table-column> -->
@@ -317,7 +323,8 @@
                     <el-table-column prop="ownerName" :label="$t('lable.name')" width="300">
                         <template slot-scope="scope">
                             <div v-if="scope.row.ownerName">
-                            {{scope.row.ownerName}}
+                                <span v-if="user.userNameNeedTranslate != 1">{{scope.row.ownerName}}</span>
+                                <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='scope.row.ownerName'></ww-open-data></span>
                             </div>
                             <div v-else>
                             <span>{{ $t('nostatisticsonbusinesstripsatpresent') }}</span>
@@ -325,9 +332,10 @@
                         </template>
                     </el-table-column>
                     <el-table-column prop="departmentName" :label="$t('lable.department')" width="300">
-                        <!-- <template slot-scope="scope">
-                            {{scope.row.departmentName}}/天
-                        </template> -->
+                        <template slot-scope="scope">
+                            <span v-if="user.userNameNeedTranslate != 1">{{scope.row.departmentName}}</span>
+                                <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='departmentName' :openid='scope.row.departmentName'></ww-open-data></span>
+                        </template>
                     </el-table-column>
                     <el-table-column prop="dayCount" :label="$t('cumulativebusinesstripdays')" width="300">
                         <template slot-scope="scope">
@@ -506,7 +514,14 @@
             <!-- <el-table-column prop="date" label="日期" width="150"></el-table-column>
             <el-table-column prop="name" label="姓名" width="200"></el-table-column>
             <el-table-column prop="address" label="地址"></el-table-column> -->
-            <el-table-column prop="ownerName" :label="$t('businesspersonnel')" width="100" fixed="left"></el-table-column>
+            <el-table-column prop="ownerName" :label="$t('businesspersonnel')" width="100" fixed="left">
+                <template slot-scope="scope">
+                    <div>
+                        <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='scope.row.ownerName'></ww-open-data></span>
+                        <span v-if="user.userNameNeedTranslate != 1">{{scope.row.ownerName}}</span>
+                    </div>
+                </template>
+            </el-table-column>
             <el-table-column prop="reason" :label="$t('travelreason')" width="150" header-align="center"></el-table-column>
             <el-table-column prop="projectName" :label="$t('screening.inputProject')" width="150" align="center"></el-table-column>
             <el-table-column :label="$t('traffictools')" width="120" align="center">
@@ -621,10 +636,11 @@
         <div>
             <div class="dingdingtongbu">
                 <span>{{ $t('screening.selectPeople') }}</span>
-                <el-select v-model="ownerIdsId" :placeholder="$t('pleaseselectpersonnel')" style="width:280px" size="small" filterable="true">
+                <el-select v-if="user.userNameNeedTranslate != 1" v-model="ownerIdsId" :placeholder="$t('pleaseselectpersonnel')" style="width:280px" size="small" filterable="true">
                     <el-option v-for="item in users" :key="item.id" :label="item.name" :value="item.id">
                     </el-option>
                 </el-select>
+                <selectCat v-if="user.userNameNeedTranslate == 1" :size="'small'" :subject="users" :subjectId="ownerIdsId" :distinction="'2'" :filterable="true" @selectCal="selectCal"></selectCat>
             </div>
             <div class="dingdingtongbu" style="margin-top: 20px">
                 <span>{{ $t('message.period') }}</span>
@@ -641,8 +657,13 @@
 </template>
 
 <script>
+// 自定义select组件
+import selectCat from "@/components/select.vue"
 import citys from '../../assets/citys/shju.json'
 export default {
+    components: {
+        selectCat
+    },
     name: "awayOffice",
     data(){
         // 验证手机号
@@ -696,6 +717,7 @@ export default {
             projectList: [],
             wuduList: [],
             wuduData: JSON.parse(sessionStorage.getItem("user")).timeType,
+            user: JSON.parse(sessionStorage.getItem("user")),
 
             tableList: [],
             isAuditList: false,
@@ -707,7 +729,6 @@ export default {
             // },
             editDialog: false,
             users: null,
-            user: null,
 
 
             total:0,
@@ -800,6 +821,15 @@ export default {
         // console.log("session",this.wuduData);
     },
     methods: {
+        // 自定义事件
+        selectCal(obj) {
+            if(obj.distinction == '1') {
+                this.ownerIds = obj.id
+                this.billss(obj.other)
+            } else if(obj.distinction == '2') {
+                this.ownerIdsId = obj.id
+            }
+        },
         dingdingListExport(){
             let parameter = {
                 keyword: ''

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

@@ -366,10 +366,12 @@
                     {{scope.row.projectName}}
                   </template>
                 </el-table-column>
-                <el-table-column v-for="(item,indexs) in stages" :label="item" min-width="150" :key="indexs" align="right" show-overflow-tooltip="true" >
+                <el-table-column v-for="(item,indexs) in stages" :label="item + '(实际|预算)'" min-width="150" :key="indexs" align="right" show-overflow-tooltip="true" >
                   <template slot-scope="scope" >
                     {{scope.row.stageCostList.filter(s=>s.stageName == item).length == 0?'0':scope.row.stageCostList.filter(s=>s.stageName == item)[0].workingTime.toFixed(1)}}h
                     <span v-if="permissions.reportPhaseCost">/¥{{scope.row.stageCostList.filter(s=>s.stageName == item).length == 0?'0':scope.row.stageCostList.filter(s=>s.stageName == item)[0].cost.toFixed(1)}}</span>
+                    <span> | </span>
+                    <span>{{scope.row.stageCostList.filter(s=>s.stageName == item).length == 0?'0':scope.row.stageCostList.filter(s=>s.stageName == item)[0].stagesTime.toFixed(1)}}h</span>
                   </template>
                 </el-table-column>
             </el-table>

+ 58 - 9
fhKeeper/formulahousekeeper/timesheet/src/views/leave/list.vue

@@ -106,11 +106,14 @@
                 <!-- 请假人 -->
                 <el-form-item :label="$t('leavepeople')" prop="ownerId"  style="width: 300px">
                     <!--普通员工只能自己填报自己的 -->
-                    <el-select v-model="addForm.ownerId" @change="txselts(addForm.leaveType,addForm.ownerId)" :placeholder="$t('defaultText.pleaseChoose')" style="width: 240px" :disabled="true" filterable="true">
+                    <el-select v-if="user.userNameNeedTranslate != 1" v-model="addForm.ownerId" @change="txselts(addForm.leaveType,addForm.ownerId)" :placeholder="$t('defaultText.pleaseChoose')" style="width: 240px" :disabled="true" filterable="true">
                         <span v-for="(item, index) in users" :key="index">
                         <el-option :label="item.name" :value="item.id"></el-option>
                         </span> 
                     </el-select>
+
+                    <selectCat v-if="user.userNameNeedTranslate == 1" :size="'small'" :subject="users" :subjectId="addForm.ownerId" :distinction="'1'" :disabled="true" @selectCal="selectCal"></selectCat>
+
                 </el-form-item>
                 <!-- 电话 -->
                 <el-form-item :label="$t('phone')" prop="tel" style="margin-right:300px">
@@ -133,6 +136,8 @@
                       :value="item.id"
                       ></el-option>
                     </el-select>
+
+                    <!-- <selectCat v-if="user.userNameNeedTranslate != 1" :size="'small'" :subject="users" :subjectId="addForm.ownerId" :distinction="'1'" :disabled="false" @selectCal="selectCal"></selectCat> -->
                 </el-form-item>
                 <!-- 时间选择 -->
                 <el-form-item :label="flg ? $t('optiondate') : $t('other.timeSelection')" style="width: 100%;">
@@ -175,11 +180,12 @@
         <div class="ctons" style="width: 98%;">
           <div class="flex">
             <div>
-              <el-select v-model="ownerIds" :placeholder="$t('pleaseselectthepersonaskingforleave')" clearable @change="chufas()" style="width: 160px" size="small" v-show="permissions.leaveAll" filterable="true">
+              <el-select v-if="user.userNameNeedTranslate != 1" v-model="ownerIds" :placeholder="$t('pleaseselectthepersonaskingforleave')" clearable @change="chufas()" style="width: 160px" size="small" v-show="permissions.leaveAll" filterable="true">
                   <span v-for="(item, index) in users" :key="index">
                   <el-option :label="item.name" :value="item.id"></el-option>
                   </span> 
               </el-select>
+              <selectCat v-if="user.userNameNeedTranslate == 1" :size="'small'" :subject="users" :subjectId="ownerIds" :distinction="'3'" :disabled="false" :clearable="true" @selectCal="selectCal" v-show="permissions.leaveAll"></selectCat>
             </div>
             <div>
               <span style="color: #606266">{{ $t('leavetype') }}</span>
@@ -213,7 +219,16 @@
             </div>
           </div>
             <el-table v-loading="loading" :data="tableData" style="width: 100%" height="94%">
-                <el-table-column prop="ownerName" :label="$t('leavepeople')" min-width="120" fixed="left"></el-table-column>
+                <el-table-column prop="ownerName" :label="$t('leavepeople')" min-width="120" fixed="left">
+                  <template slot-scope="scope">
+                    <div>
+                      <span v-if="user.userNameNeedTranslate != 1">{{scope.row.ownerName}}</span>
+                      <span v-if="user.userNameNeedTranslate == 1">
+                        <ww-open-data type='userName' :openid='scope.row.ownerName'></ww-open-data>
+                      </span>
+                    </div>
+                  </template>
+                </el-table-column>
                 <el-table-column prop="tel" :label="$t('phone')" min-width="120"></el-table-column>
                 <el-table-column prop="leaveType" :label="$t('leavetype')" min-width="120">
                   <template slot-scope="scope">
@@ -345,7 +360,8 @@
               <el-table-column prop="ownerName" :label="$t('lable.name')" width="300">
                 <template slot-scope="scope">
                     <div v-if="scope.row.ownerName">
-                      {{scope.row.ownerName}}
+                      <span v-if="user.userNameNeedTranslate != 1">{{scope.row.ownerName}}</span>
+                      <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='scope.row.ownerName'></ww-open-data></span>
                     </div>
                     <div v-else>
                       <span>{{ $t('Nstatisticpresent') }}</span>
@@ -468,13 +484,23 @@
               <el-table-column prop="userName" :label="$t('lable.name')" width="200">
                 <template slot-scope="scope">
                   <div v-if="scope.row.userName">
-                    {{scope.row.userName}}
+                    <span v-if="user.userNameNeedTranslate != 1">
+                      {{scope.row.userName}}
+                    </span>
+                    <span v-if="user.userNameNeedTranslate == 1">
+                      <ww-open-data type='userName' :openid='scope.row.userName'></ww-open-data>
+                    </span>
                   </div>
                 </template>
               </el-table-column>
               <el-table-column prop="department" :label="$t('departmentsuod')" width="200">
                 <template slot-scope="scope">
-                  {{scope.row.department}}
+                  <span v-if="user.userNameNeedTranslate != 1">
+                    {{scope.row.department}}
+                  </span>
+                  <span v-if="user.userNameNeedTranslate == 1">
+                    <ww-open-data type='departmentName' :openid='scope.row.department'></ww-open-data>
+                  </span>
                 </template>
               </el-table-column>
               <el-table-column prop="yearDays" :label="$t('annualleaveperyear')" width="200">
@@ -592,11 +618,12 @@
         <!-- 请假人 -->
         <el-form-item :label="$t('leavepeople')" prop="ownerId"  style="width: 300px;display: inline-block;">
             <!--普通员工只能自己填报自己的 -->
-            <el-select v-model="addForm.ownerId" @change="selts()" :placeholder="$t('pleaseselectthepersonaskingforleave')" style="width: 240px" :disabled="true" filterable="true">
+            <!-- <el-select v-if="user.userNameNeedTranslate != 1" v-model="addForm.ownerId" @change="selts()" :placeholder="$t('pleaseselectthepersonaskingforleave')" style="width: 240px" :disabled="true" filterable="true">
                 <span v-for="(item, index) in users" :key="index">
                 <el-option :label="item.name" :value="item.id"></el-option>
                 </span>
-            </el-select>
+            </el-select> -->
+            <selectCat v-if="user.userNameNeedTranslate == 1" :size="'mini'" :subject="users" :subjectId="addForm.ownerId" :disabled="true" :distinction="'4'" :filterable="true" @selectCal="selectCal"></selectCat>
         </el-form-item>
         <!-- 电话 -->
         <el-form-item :label="$t('phone')" prop="tel" style="width: 300px;display: inline-block;">
@@ -648,9 +675,16 @@
 
 <script>
 import { config, error } from 'dingtalk-jsapi';
+// 自定义select组件
+import selectCat from "@/components/select.vue"
+import Select from '../../components/select.vue';
+
 export default {
   name: "expense",
-  components: {},
+  components: {
+    selectCat,
+    Select
+  },
   props: {},
   data() {
     //验证手机号
@@ -1847,6 +1881,21 @@ export default {
         remark: ''
       }
       this.getUsers()
+    },
+    // 自定义组件事件
+    selectCal(obj) {
+      if(obj.distinction == '1') {
+        this.addForm.ownerId = obj.id
+        this.txselts(obj.other, obj.id)
+      } else if(obj.distinction == '2') {
+
+      } else if(obj.distinction == '3') {
+        this.ownerIds = obj.id
+        this.chufas()
+      } else if(obj.distinction == '4') {
+        this.addForm.ownerId = obj.id
+        this.selts()
+      }
     }
   }
 };

+ 21 - 18
fhKeeper/formulahousekeeper/timesheet/src/views/project/cost.vue

@@ -204,7 +204,9 @@
             };
         },
         methods: {
-            echartsCurrentChange(){
+            echartsCurrentChange(val){
+                this.page = val
+                // console.log('CurrentChange');
                 if(this.radio == this.$t('ren-yuan')){
                     this.gtff()
                 }else{
@@ -269,10 +271,10 @@
                 },
             
             showExportDialog() {
-                console.log(12345)
+                // console.log(12345)
                 this.exportDialog = true;
                 this.exportParam.dateRange = this.dateRange;
-                console.log(this.hasReportUserList)
+                // console.log(this.hasReportUserList)
                 if (this.radio == this.$t('ren-yuan')) {
                     // this.exportParam.userIds = [];
                 }
@@ -309,7 +311,7 @@
                  var url = "/project/exportTimeCost";
                  var fileName = this.$t('projectmanhourcoststatistics')+ '.xls';
                  if (this.radio == this.$t('ren-yuan') ) {
-                     console.log(this.exportParam.userIds);
+                    //  console.log(this.exportParam.userIds);
                      fileName = this.$t('labortimecoststatistics')+ '.xls';
                      url = '/department/exportUserStatistic';
                      if (this.exportParam.userIds != null && this.exportParam.userIds.length > 0) {
@@ -409,9 +411,9 @@
             //获取人员成本统计列表
             getUserCostList() {
                 this.listLoading = true;
-                console.log(this.port.project.userCost, '获取人员成本统计列表')
-                console.log(this.user.timeType.fixMonthcost)
-                console.log(Boolean(this.dateRange))
+                // console.log(this.port.project.userCost, '获取人员成本统计列表')
+                // console.log(this.user.timeType.fixMonthcost)
+                // console.log(Boolean(this.dateRange))
                 let startDateNum = ''
                 let endDateNum = ''
                 if(this.dateRange) {
@@ -456,6 +458,7 @@
                 let data = this.allListData
                 var _this = this;
                 this.hasReportUserList = data.userList;
+                this.total = data.list.length
                 var xList = [] , yList = [] , list = data.list.slice(0+50*(this.page-1),49+50*(this.page-1)), array = [] , series = [];
                 var totalMoneyCost = data.totalCostMoney;
                 var totalHours = 0.0;
@@ -468,7 +471,7 @@
                 }
                 if (list.length > 0) {
                     var num = list.length==0?0:list[0].project.length;
-                    console.log('for 1');
+                    // console.log('for 1');
                     for(var i in list) {
                         xList.push(list[i].name);
                         var pro = list[i].project;
@@ -478,15 +481,15 @@
                             }
                         }
                     }
-                    console.log('for 2');
+                    // console.log('for 2');
                     for(var i in array) {
                         yList.push(array[i]);
                         var dataList = [];
-                        console.log('for 2 1');
+                        // console.log('for 2 1');
                         for(var j in list) {
                             var project = list[j].project , num = 0;
                             if(project.length != 0) {
-                                console.log('for 2 1 1');
+                                // console.log('for 2 1 1');
                                 for(var k in project) {
                                     if(project[k].project == array[i]) {
                                         let item = {
@@ -537,7 +540,7 @@
                     myChart.resize({
                         width: this.widthHtval
                     })
-                    console.log('设置宽度');
+                    // console.log('设置宽度');
                     // 设置宽度
                     _this.myChart = myChart;
                     var option = { 
@@ -622,11 +625,11 @@
                         }],
                         series: series,
                     };
-                    console.log('setoption');
+                    // console.log('setoption');
                     myChart.setOption(option,{notMerge:true});
             },
             yanjiu() {
-                console.log('触发')
+                // console.log('触发')
             },
             getEchart(e){
                 var that = this
@@ -734,7 +737,7 @@
                     // param.subCustomName = this.customName
                     param.customId = this.theCustomListId
                     param.fieldName = this.theCustomListPlant
-                    console.log(param, '要传的数据')
+                    // console.log(param, '要传的数据')
                 }
                 this.http.post(url, param,
                 res => {
@@ -924,7 +927,7 @@
                                         ((_this.permissions.countCost) ? _this.$t('workcost')+" : " + params[0].data.money 
                                         + _this.$t('yuan')+"<br/>" : '') + 
                                         ((_this.permissions.countHours) ? _this.$t('screening.workTime')+" : " + params[0].data.cost + _this.$t('time.hour') : '');
-                                        console.log(res, '将要渲染的数据')
+                                        // console.log(res, '将要渲染的数据')
                                         return res;
                                     }
                                     // trigger:'axis',
@@ -1013,7 +1016,7 @@
                         myChart.getZr().on('click', params => {
                             const pointInPixel = [params.offsetX, params.offsetY];
                             if (myChart.containPixel('grid', pointInPixel)) {
-                                console.log(_this.params)
+                                // console.log(_this.params)
                                 if(_this.radio==this.$t('other.project')) {
                                     if (_this.dateRange != null) {
                                         if (this.user.timeType.fixMonthcost == 0) {
@@ -1072,7 +1075,7 @@
             getZDY() {
                 this.http.post('/user-custom/getUserCustomTitle',{},res => {
                     if(res.code == 'ok'){
-                        console.log(res, '数据来源')
+                        // console.log(res, '数据来源')
                         this.theCustomList = res.data.result
                         this.theCustomListPlantLIst = res.data.field
                     }else {

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

@@ -66,7 +66,14 @@
                         {{scope.row.isFolder==0?scope.row.size:"-"}}
                     </template>
                 </el-table-column>
-                <el-table-column prop="creatorName" :label="$t('creator')" width="100"></el-table-column>
+                <el-table-column prop="creatorName" :label="$t('creator')" width="100">
+                    <template slot-scope="scope">
+                        <div>
+                            <span v-if="user.userNameNeedTranslate != 1">{{scope.row.creatorName}}</span>
+                            <span v-else><ww-open-data type='userName' :openid='scope.row.creatorName'></ww-open-data></span>
+                        </div>
+                    </template>
+                </el-table-column>
                 <el-table-column prop="indate" :label="$t('creationtime')" sortable="true" width="100"></el-table-column>
                 <el-table-column width="140">
                     <template slot-scope="scope" >

+ 43 - 11
fhKeeper/formulahousekeeper/timesheet/src/views/project/info.vue

@@ -15,7 +15,10 @@
                     </el-row>
                     <el-row :gutter="10" v-if="user.timeType.projectWithDept">
                         <el-col :span="5" ><span class="gray_label">{{ $t('subordinatedepartments') }}:</span></el-col><el-col :span="7" ></el-col>
-                        <el-col :span="18" ><span>{{project.departmentName}}</span></el-col>
+                        <el-col :span="18" >
+                            <span v-if="user.userNameNeedTranslate != 1">{{project.departmentName}}</span>
+                            <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='departmentName' :openid='project.departmentName'></ww-open-data></span>
+                        </el-col>
                     </el-row>
                     <el-row :gutter="10">
                         <el-col :span="5" ><span class="gray_label">{{ $t('state.states') }}:</span></el-col><el-col :span="7" ><span >{{project.status==null?'-':statusTxt[project.status]}}</span></el-col>
@@ -95,7 +98,10 @@
                     <el-link v-if="user.id == project.creatorId || user.id == project.inchargerId || permissions.projectManagement" @click="showEditPar" style="float:right;"><i class="el-icon-edit"  ></i></el-link>
                     </div>
                     <div style="margin-top:10px;color:#999;">{{ $t('projectmanager') }}</div>
-                    <div><el-link style="margin:10px" @click="showUser(project.inchargerId)">{{project.inchargerName}}</el-link></div>
+                    <div><el-link style="margin:10px" @click="showUser(project.inchargerId)">
+                        <span v-if="user.userNameNeedTranslate != 1">{{project.inchargerName}}</span>
+                        <span v-else><ww-open-data type='userName' :openid='project.inchargerName'></ww-open-data></span>
+                    </el-link></div>
                     <div style="margin-top:10px;color:#999;">{{ $t('newspaperauditor') }}</div>
                     <div>
                         <span v-if="project.auditorList.length == 0" style="margin:10px;">-</span>
@@ -104,7 +110,10 @@
                    
                     <div v-show="project.isPublic == 0" style="color:#999;">{{ $t('participantin') }}</div>
                     <div v-show="project.isPublic == 0" >
-                        <el-link v-for="item in project.participationList" :key="item.id" style="margin:10px;" @click="showUser(item.id)">{{item.name}}</el-link>
+                        <el-link v-for="item in project.participationList" :key="item.id" style="margin:10px;" @click="showUser(item.id)">
+                            <span v-if="user.userNameNeedTranslate != 1">{{item.name}}</span>
+                            <span v-else><ww-open-data type='userName' :openid='item.name'></ww-open-data></span>
+                        </el-link>
                         <el-button class="el-icon-plus" @click="addMembVisible=true" size="mini"></el-button>
                     </div>
                 </div>
@@ -237,11 +246,17 @@
         </div>
         <!--用户详细信息弹出框-->
         <el-dialog :title="$t('Checkthedetails')" v-if="userDetailVisible" :visible.sync="userDetailVisible" :close-on-click-modal="false" customClass="customWidth" width="500px">
-            <div class="line"><span>{{ $t('lable.name') }}</span><span>{{userDetail.name}}</span></div>
+            <div class="line"><span>{{ $t('lable.name') }}</span>
+                <span v-if="user.userNameNeedTranslate != 1">{{userDetail.name}}</span>
+                <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='userDetail.name'></ww-open-data></span>
+            </div>
             <div class="line"><span>{{ $t('Worknumber') }}</span><span>{{userDetail.jobNumber}}</span></div>
             <div class="line"><span>{{ $t('lable.phone') }}</span><span>{{userDetail.phone}}</span></div>
             <div class="line"><span>{{ $t('jiao-se') }}</span><span>{{roleArray[userDetail.role]}}</span></div>
-            <div class="line"><span>{{ $t('lable.department') }}</span><span>{{userDetail.departmentName}}</span></div>
+            <div class="line"><span>{{ $t('lable.department') }}</span>
+                <span v-if="user.userNameNeedTranslate != 1">{{userDetail.departmentName}}</span>
+                <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='departmentName' :openid='userDetail.departmentName'></ww-open-data></span>
+            </div>
             <div slot="footer" class="dialog-footer">
                 <el-button type="primary" @click="userDetailVisible = false" >{{ $t('btn.determine') }}</el-button>
             </div>
@@ -273,8 +288,8 @@
             <el-table :data="contractRecordData" height="500px" :loading="contractRecordLoading" :default-sort="{prop: 'date', order: 'descending'}">
                 <el-table-column :label="$t('other.operator')" prop="name" min-width="100">
                     <template slot-scope="scope">
-                        <!-- <span>{{users.filter(item => item.id == scope.row.editUserId)[0].name}}</span> -->
-                        <span>{{filterUserContract(scope.row.editUserId)}}</span>
+                        <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='filterUserContract(scope.row.editUserId)'></ww-open-data></span>
+                        <span v-else>{{filterUserContract(scope.row.editUserId)}}</span>
                     </template>
                 </el-table-column>
                 <el-table-column :label="$t('xiu-gai-shi-jian')" prop="date" min-width="120">
@@ -431,9 +446,10 @@
                     </el-select>
                 </el-form-item>
                 <el-form-item :label="$t('projectmanager')" >
-                    <el-select v-model="addForm.inchargerId"  filterable :placeholder="$t('defaultText.pleaseChoose')" style="width:100%;" >
+                    <el-select v-if="user.userNameNeedTranslate != 1" v-model="addForm.inchargerId"  filterable :placeholder="$t('defaultText.pleaseChoose')" style="width:100%;" >
                         <el-option v-for="item in project.participationList" :key="item.id" :label="item.name" :value="item.id"></el-option>
                     </el-select>
+                    <selectCat v-if="user.userNameNeedTranslate == 1" :size="'mini'" :subject="project.participationList" :subjectId="addForm.inchargerId" :distinction="'1'" @selectCal="selectCal"></selectCat>
                 </el-form-item>
             </el-form>
             <div slot="footer" class="dialog-footer">
@@ -479,15 +495,21 @@
                                
                                <el-table-column prop="membNames" :label="$t('personnelproportion')">
                                    <template slot-scope="scope">
-                                       <span style="margin:0 5px;" v-for="item in scope.row.membList" :key="item.membId">{{item.membName}}({{item.percentage}}%)</span>
-                                       <el-link @click="showEditPpMembs(scope.row)">{{(scope.row.membList == null || scope.row.membList.length == 0)?$t('professionalparticipants'):$t('setup')}}</el-link>
+                                       <span style="margin:0 5px;" v-for="item in scope.row.membList" :key="item.membId">
+                                            <span v-if="user.userNameNeedTranslate != 1">{{item.membName}}({{item.percentage}}%)</span>
+                                            <span v-if="user.userNameNeedTranslate == 1">
+                                                <ww-open-data type='userName' :openid='item.membName'></ww-open-data>({{item.percentage}}%)
+                                            </span>
+                                        </span>
+                                       <el-link @click="showEditPpMembs(scope.row)">
+                                            {{(scope.row.membList == null || scope.row.membList.length == 0)?$t('professionalparticipants'):$t('setup')}}
+                                       </el-link>
                                    </template>
                                </el-table-column>
                                <el-table-column prop="inchargerName" width="120" :label="$t('head')">
                                    <template slot-scope="scope">
                                        <el-select v-model="scope.row.inchargerId" >
                                            <el-option v-for="item in participator" :key="item.id" :label="item.name" :value="item.id">
-                                               
                                            </el-option>
                                        </el-select>
                                    </template>
@@ -634,8 +656,13 @@
 }
 </style>
 <script>
+    // 自定义select组件
+    import selectCat from "@/components/select.vue"
     import util from "../../common/js/util";
     export default {
+        components: {
+            selectCat
+        },
         data() {
             return {
                 permissions: JSON.parse(sessionStorage.getItem("permissions")),
@@ -1944,6 +1971,11 @@
                         type: "error"
                     });
                 });
+            },
+            selectCal(obj) {
+                if(obj.distinction == '1' ) {
+                    this.addForm.inchargerId = obj.id
+                }
             }
         },
         created() {

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

@@ -107,21 +107,29 @@
                 <!-- 项目经理筛选 -->
                 <el-form-item>
                     <span style="margin-left:5px;margin-right:5px;color:#606266;">{{ $t('projectmanager') }}</span>
-                    <el-select v-model="inchagerId" style="width:140px;" :placeholder="$t('defaultText.pleaseChoose')" clearable @change="manageSelect" size="small" filterable popper-class="managePopperClass">
+
+                    <el-select v-if="user.userNameNeedTranslate != 1" v-model="inchagerId" style="width:140px;" :placeholder="$t('defaultText.pleaseChoose')" clearable @change="manageSelect" size="small" filterable popper-class="managePopperClass">
                         <el-option v-for="item in users" :key="item.id" :label="user.companyId == 936 ? item.name + '\u3000' + item.jobNumber : item.name" :value="item.id">
                             <span style="float: left">{{ item.name }}</span>
                             <span style="float: right; color: #8492a6;" v-if="user.companyId == 936">{{ item.jobNumber }}</span>
                         </el-option>
                     </el-select>
+
+                    <selectCat v-if="user.userNameNeedTranslate == 1" :size="'mini'" :subject="users" :subjectId="inchagerId" :distinction="'1'" @selectCal="selectCal"></selectCat>
+
                 </el-form-item>
                 <el-form-item>
                     <span style="margin-left:25px;margin-right:5px;color:#606266;">{{ $t('participantin') }}</span>
-                    <el-select v-model="participationId" style="width:140px;" :placeholder="$t('defaultText.pleaseChoose')" clearable @change="participationSelect" size="small" filterable popper-class="managePopperClass">
+
+                    <el-select v-if="user.userNameNeedTranslate != 1" v-model="participationId" style="width:140px;" :placeholder="$t('defaultText.pleaseChoose')" clearable @change="participationSelect" size="small" filterable popper-class="managePopperClass">
                         <el-option v-for="item in users" :key="item.id" :label="user.companyId == 936 ? item.name + '\u3000' + item.jobNumber : item.name" :value="item.id">
                             <span style="float: left">{{ item.name }}</span>
                             <span style="float: right; color: #8492a6;" v-if="user.companyId == 936">{{ item.jobNumber }}</span>
                         </el-option>
                     </el-select>
+
+                    <selectCat v-if="user.userNameNeedTranslate == 1" :size="'mini'" :subject="users" :subjectId="inchagerId" :distinction="'2'" @selectCal="selectCal"></selectCat>
+
                 </el-form-item>
                 <!-- 部门筛选 -->
                 <el-form-item v-if="user.timeType.projectWithDept">
@@ -208,7 +216,14 @@
             </el-table-column>
             <el-table-column prop="inchargerName" :label="$t('projectmanager')" sortable="custom" min-width="150">
                 <template slot-scope="scope">
-                    <el-link type="primary" :underline="false" @click="showUser(scope.row.inchargerId)">{{scope.row.inchargerName}}</el-link>
+                    <el-link type="primary" :underline="false" @click="showUser(scope.row.inchargerId)">
+                        <span v-if="user.userNameNeedTranslate != 1">
+                            {{scope.row.inchargerName}}
+                        </span>
+                        <span v-if="user.userNameNeedTranslate == 1">
+                            <ww-open-data type='userName' :openid='scope.row.inchargerName'></ww-open-data>
+                        </span>
+                    </el-link>
                 </template>
             </el-table-column>
 
@@ -239,11 +254,25 @@
                     <div v-if="scope.row.participator.length > 5">
                         <el-popover placement="top" width="500" trigger="hover" v-if="scope.row.participator.length > 0">
                             <span v-for="par in scope.row.participator" :key="par.id">
-                                <el-link style="margin-right:10px;" :underline="false" type="primary" @click="showUser(par.id)">{{par.name}}</el-link>
+                                <el-link style="margin-right:10px;" :underline="false" type="primary" @click="showUser(par.id)">
+                                    <span v-if="user.userNameNeedTranslate != 1">
+                                        {{par.name}}
+                                    </span>
+                                    <span v-if="user.userNameNeedTranslate == 1">
+                                        <ww-open-data type='userName' :openid='par.name'></ww-open-data>
+                                    </span>
+                                </el-link>
                             </span>
                             <div slot="reference" class="addss">
                                 <span v-for="par in scope.row.participator" :key="par.id">
-                                    <el-link style="margin-right:10px;" :underline="false" type="primary" @click="showUser(par.id)">{{par.name}}</el-link>
+                                    <el-link style="margin-right:10px;" :underline="false" type="primary" @click="showUser(par.id)">
+                                        <span v-if="user.userNameNeedTranslate != 1">
+                                            {{par.name}}
+                                        </span>
+                                        <span v-if="user.userNameNeedTranslate == 1">
+                                            <ww-open-data type='userName' :openid='par.name'></ww-open-data>
+                                        </span>
+                                    </el-link>
                                 </span>
                             </div>
                         </el-popover>
@@ -373,11 +402,11 @@
         <!--新增界面-->
         <el-dialog :title="title" v-if="addFormVisible" :visible.sync="addFormVisible" :close-on-click-modal="false" customClass="customWidth" width="960px">
             <el-form ref="form1" :model="addForm" :rules="rules" label-width="120px">
-                <el-form-item :label="$t('Itemno')" >
+                <el-form-item :label="$t('Itemno')" :class="title == $t('newproject') && user.companyId == 936 ? 'wpgCssClass' : ''">
                     <!-- <el-input v-model="addForm.code" :disabled="!permissions.projectManagement && addForm.creatorId != user.id" placeholder="请输入项目编号" clearable></el-input> -->
                     <el-input v-model="addForm.code" :placeholder="$t('peaseenterthe')" clearable></el-input>
                 </el-form-item>
-                 <el-form-item :label="$t('zhu-xiang-mu')" v-if="user.timeType.mainProjectState == '1'">
+                 <el-form-item :label="$t('zhu-xiang-mu')" :class="title == $t('newproject') && user.companyId == 936 ? 'wpgCssClass' : ''" v-if="user.timeType.mainProjectState == '1'">
                     <!-- <el-select v-model="addForm.projectMainId" clearable :disabled="!permissions.projectManagement && addForm.creatorId != user.id" @change="projectManagementChange"> -->
                     <el-select v-model="addForm.projectMainId" clearable @change="projectManagementChange">
                         <el-option v-for="(item) in mainProjectList" :key="item.id" :value="item.id" :label="item.name + '\u3000' + item.code">
@@ -400,7 +429,7 @@
                     <!-- <el-input v-model="addForm.projectDesc" :disabled="!permissions.projectManagement && addForm.creatorId != user.id" placeholder="请输入项目描述" clearable maxlength="4000"></el-input> -->
                     <el-input v-model="addForm.projectDesc" :placeholder="$t('peaseenterthe')" clearable maxlength="4000"></el-input>
                 </el-form-item>
-                <el-form-item :label="$t('projecttype')" prop="isPublic">
+                <el-form-item :label="$t('projecttype')" :class="title == $t('newproject') && user.companyId == 936 ? 'wpgCssClass' : ''" prop="isPublic">
                     <!-- <el-select v-model="addForm.isPublic" style="width:32%;" @change="selectPublic" :disabled="!permissions.projectManagement && addForm.creatorId != user.id"> -->
                     <el-select v-model="addForm.isPublic" style="width:32%;" @change="selectPublic">
                         <el-option :value="0" :label="$t('commonproject')"></el-option>
@@ -417,7 +446,7 @@
                     </div>
                 </el-form-item>
 
-                <el-form-item :label="$t('subordinatedepartments')" v-if="user.timeType.projectWithDept">
+                <el-form-item :label="$t('subordinatedepartments')" :class="title == $t('newproject') && user.companyId == 936 ? 'wpgCssClass' : ''" v-if="user.timeType.projectWithDept">
                     <el-cascader v-model="addForm.deptId" :options="departmentList" :placeholder="$t('defaultText.pleaseChoose')"
                         :props="{ checkStrictly: true, expandTrigger: 'hover' }" clearable filterable @change="cascaderChange" style="width: 100%"
                     ></el-cascader>
@@ -450,17 +479,37 @@
                         <el-option v-for="item in customerList" :key="item.id" :label="item.customerName" :value="item.id"></el-option>
                     </el-select>
                 </el-form-item> -->
-                <el-form-item :label="$t('Allparticipants')" v-show="addForm.isPublic == 0">
-                    <el-tooltip placement="top" effect="light">
+                <el-form-item :label="$t('Allparticipants')" v-show="addForm.isPublic == 0" :class="title == $t('newproject') && user.companyId == 936 ? 'wpgCssClass' : ''">
+                    <el-tooltip placement="top" effect="light" v-if="user.userNameNeedTranslate != 1">
+
                         <div slot="content" style="width:780px">{{addForm.userNames}}</div>
-                    <el-input  @focus="showChooseMembTree" v-model="addForm.userNames"></el-input>
+                        <el-input  @focus="showChooseMembTree" v-model="addForm.userNames"></el-input>
+                    </el-tooltip>
+                    <el-tooltip placement="top" effect="light" v-if="user.userNameNeedTranslate == 1">
+                        <div slot="content" style="width:780px">
+                            <span v-for="(item, index) in addFormUserNames" :key="index">
+                                <!-- {{item}} -->
+                                <ww-open-data type='userName' :openid='item'></ww-open-data>
+                                <span v-if="index < addFormUserNames.length - 1">,</span>
+                            </span>
+                        </div>
+                        <div @click="showChooseMembTree" style="width: 800px;overflow:hidden;white-space:nowrap;height:40px;border: 1px solid #DCDFE6;border-radius: 4px;box-sizing: border-box;padding: 0 10px">
+                            <span v-for="(item, index) in addFormUserNames" :key="index">
+                                <!-- {{item}} -->
+                                <ww-open-data type='userName' :openid='item'></ww-open-data>
+                                <span v-if="index < addFormUserNames.length - 1">,</span>
+                            </span>
+                        </div>
                     </el-tooltip>
                 </el-form-item>
-                <el-form-item :label="$t('projectmanager')" >
+                <el-form-item :label="$t('projectmanager')" :class="title == $t('newproject') && user.companyId == 936 ? 'wpgCssClass' : ''">
                     <!-- <el-select v-model="addForm.inchargerId"  :disabled="(addForm.userId.length==0 && addForm.isPublic == 0) || (!permissions.projectManagement && user.id != addForm.creatorId)" filterable placeholder="请选择项目经理" style="width:32%;" > -->
-                    <el-select v-model="addForm.inchargerId" filterable :placeholder="$t('defaultText.pleaseChoose')" style="width:32%;" >
+                    <el-select v-if="user.userNameNeedTranslate != 1" v-model="addForm.inchargerId" filterable :placeholder="$t('defaultText.pleaseChoose')" style="width:32%;" >
                         <el-option v-for="item in participator" :key="item.id" :label="item.name" :value="item.id"></el-option>
                     </el-select>
+
+                    <selectCat v-if="user.userNameNeedTranslate == 1" :size="'small'" :subject="participator" :subjectId="addForm.inchargerId" :distinction="'3'"></selectCat>
+
                 </el-form-item>
                 <el-form-item :label="$t('newspaperauditor')" v-show="user.timeType.reportAuditType==0">
                     <el-select v-model="addForm.auditUserIds" multiple="true" :disabled=" !(permissions.projectManagement|| user.id == addForm.inchargerId || user.id == addForm.creatorId)" filterable :placeholder="$t('defaultistheprojectleader')" style="width:100%;" >
@@ -468,7 +517,7 @@
                     </el-select>
                 </el-form-item>
                 <!--专业项目协作版本功能 -->
-                <el-form-item :label="$t('ji-bie')" v-if="user.company.packageProject==1">
+                <el-form-item :label="$t('ji-bie')" :class="title == $t('newproject') && user.companyId == 936 ? 'wpgCssClass' : ''" v-if="user.company.packageProject==1">
                     <el-select v-model="addForm.level"  :placeholder="$t('defaultText.pleaseChoose')" style="width:32%;" v-if="user.timeType.projectLevelState == 1">
                         <el-option v-for="item in levelList" :key="item.id" :label="item.projectLevelName" :value="item.id"></el-option>
                     </el-select>
@@ -514,7 +563,7 @@
 
                 <!-- 单个公司的固定字段 -->
                 <div v-if="user.companyId == '936'">
-                <el-form-item :label="$t('contractno')" >
+                <el-form-item :label="$t('contractno')" :class="title == $t('newproject') && user.companyId == 936 ? 'wpgCssClass' : ''">
                     <el-input v-model="addForm.contractCode" maxlength="50" show-word-limit :placeholder="$t('peaseenterthe')" clearable></el-input>
                 </el-form-item>
                 <el-form-item :label="$t('warrantystartime')">
@@ -533,7 +582,7 @@
                      :clearable="false" type="date" 
                      placeholder="$t('optiondate')"></el-date-picker>
                 </el-form-item>
-                <el-form-item :label="$t('IndependentProject')" >
+                <el-form-item :label="$t('IndependentProject')" :class="title == $t('newproject') && user.companyId == 936 ? 'wpgCssClass' : ''">
                     <!-- <el-input v-model="addForm.projectCategorySub" placeholder="请输入自主项目类别" clearable></el-input> -->
                     <el-select v-model="addForm.projectCategorySub" :placeholder="$t('defaultText.pleaseChoose')" clearable>
                         <el-option :value="$t('softwareproject')" :label="$t('softwareproject')"></el-option>
@@ -541,7 +590,7 @@
                         <el-option :value="$t('integrationproject')" :label="$t('integrationproject')"></el-option>
                     </el-select>
                 </el-form-item>
-                <el-form-item :label="$t('region')" >
+                <el-form-item :label="$t('region')" :class="title == $t('newproject') && user.companyId == 936 ? 'wpgCssClass' : ''">
                     <el-input v-model="addForm.region" :placeholder="$t('peaseenterthe')" clearable></el-input>
                 </el-form-item>
                 <el-form-item :label="$t('subordinateBU')" >
@@ -622,17 +671,21 @@
                                
                                <el-table-column prop="membNames" :label="$t('personnelproportion')">
                                    <template slot-scope="scope">
-                                       <span style="margin:0 5px;" v-for="item in scope.row.membList" :key="item.membId">{{item.membName}}({{item.percentage}}%)</span>
+                                       <span style="margin:0 5px;" v-for="item in scope.row.membList" :key="item.membId">
+                                            <span v-if="user.userNameNeedTranslate != 1">{{item.membName}}({{item.percentage}}%)</span>
+                                            <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='item.membName'></ww-open-data>({{item.percentage}}%)</span>
+                                        </span>
                                        <el-link @click="showEditPpMembs(scope.row)">{{(scope.row.membList == null || scope.row.membList.length == 0)?$t('professionalparticipants'):$t('setup')}}</el-link>
                                    </template>
                                </el-table-column>
                                <el-table-column prop="inchargerName" width="120" :label="$t('head')">
                                    <template slot-scope="scope">
-                                       <el-select v-model="scope.row.inchargerId" >
-                                           <el-option v-for="item in participator" :key="item.id" :label="item.name" :value="item.id">
-                                               
-                                           </el-option>
+                                       <el-select v-model="scope.row.inchargerId" v-if="user.userNameNeedTranslate != 1">
+                                           <el-option v-for="item in participator" :key="item.id" :label="item.name" :value="item.id"></el-option>
                                        </el-select>
+
+                                       <!-- <selectCat :size="'mini'" :subject="participator" :subjectId="scope.row.inchargerId" :index="scope.index" :distinction="'4'" style="position: relative;z-index:99999999999 !important;"></selectCat> -->
+
                                    </template>
                                </el-table-column>
                                <el-table-column  width="80">
@@ -664,11 +717,18 @@
 
         <!--用户详细信息弹出框-->
         <el-dialog :title="$t('Checkthedetails')" v-if="userDetailVisible" :visible.sync="userDetailVisible" :close-on-click-modal="false" customClass="customWidth" width="400px">
-            <div class="line"><span>{{ $t('lable.name') }}</span><span>{{userDetail.name}}</span></div>
+            <div class="line"><span>{{ $t('lable.name') }}</span>
+                <span v-if="user.userNameNeedTranslate != 1">{{userDetail.name}}</span>
+                <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='userDetail.name'></ww-open-data></span>
+            </div>
             <div class="line"><span>{{ $t('Worknumber') }}</span><span>{{userDetail.jobNumber}}</span></div>
             <div class="line"><span>{{ $t('lable.phone') }}</span><span>{{userDetail.phone}}</span></div>
             <div class="line"><span>{{ $t('jiao-se') }}</span><span>{{roleArray[userDetail.role]}}</span></div>
-            <div class="line"><span>{{ $t('lable.department') }}</span><span>{{userDetail.departmentName}}</span></div>
+            <div class="line"><span>{{ $t('lable.department') }}</span>
+
+                <span v-if="user.userNameNeedTranslate != 1">{{userDetail.departmentName}}</span>
+                <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='departmentName' :openid='userDetail.departmentName'></ww-open-data></span>
+            </div>
             <div slot="footer" class="dialog-footer">
                 <el-button type="primary" @click="userDetailVisible = false" >{{ $t('btn.determine') }}</el-button>
             </div>
@@ -1027,13 +1087,31 @@
             </div>
         </el-dialog>
         <!-- 批量添加参与人 -->
-        <el-dialog :title="isAddGroupPerson ? $t('groupparticipantsinbatches') : $t('projectparticipantsinbatches')" v-if="addGroupPersonDialog" :visible.sync="addGroupPersonDialog" width="40%">
+        <el-dialog :title="isAddGroupPerson ? $t('groupparticipantsinbatches') : $t('projectparticipantsinbatches')" v-if="addGroupPersonDialog" :visible.sync="addGroupPersonDialog" width="600px">
             <el-form label-width="20%">
                 <el-form-item :label="$t('screening.selectPeople')">
-                    <el-tooltip placement="top" effect="light">
+                    <el-tooltip placement="top" effect="light" v-if="user.userNameNeedTranslate != '1'">
                         <div slot="content" style="width:450px">{{addGroupPersonData.personNames}}</div>
                         <el-input  @focus="addGroupPersonP" v-model="addGroupPersonData.personNames"></el-input>
                     </el-tooltip>
+
+                    <el-tooltip placement="top" effect="light" v-if="user.userNameNeedTranslate == '1'">
+                        <div slot="content" style="width:580px">
+                            <span v-for="(item, index) in addGroupPersonDataPersonNames" :key="index">
+                                <!-- {{item}} -->
+                                <ww-open-data type='userName' :openid='item'></ww-open-data>
+                                <span v-if="index < addGroupPersonDataPersonNames.length - 1">,</span>
+                            </span>
+                        </div>
+                        <div @click="addGroupPersonP" style="width: 450px;overflow:hidden;white-space:nowrap;height:40px;border: 1px solid #DCDFE6;border-radius: 4px;box-sizing: border-box;padding: 0 10px">
+                            <span v-for="(item, index) in addGroupPersonDataPersonNames" :key="index">
+                                <!-- {{item}} -->
+                                <ww-open-data type='userName' :openid='item'></ww-open-data>
+                                <span v-if="index < addGroupPersonDataPersonNames.length - 1">,</span>
+                            </span>
+                        </div>
+                    </el-tooltip>
+
                 </el-form-item>
                 <el-form-item :label="$t('xuan-ze-fen-zu')" v-if="isAddGroupPerson">
                     <el-select v-model="addGroupPersonData.group" multiple :placeholder="$t('selectagroup')" style="width:100%">
@@ -1070,15 +1148,16 @@
             </el-dialog>
         </el-dialog>
         <!-- 批量设置项目经理 -->
-        <el-dialog :title="$t('projectmanagersinbatches')" v-if="batchInchargerDialog" :visible.sync="batchInchargerDialog" width="30%">
+        <el-dialog :title="$t('projectmanagersinbatches')" v-if="batchInchargerDialog" :visible.sync="batchInchargerDialog" width="500px">
             <el-form model="" label-width="120px">
                 <el-form-item :label="$t('setupprojectmanager')">
-                    <el-select v-model="paramInchargerId" :placeholder="$t('defaultText.pleaseChoose')" style="width: 80%" filterable clearable>
+                    <el-select v-if="user.userNameNeedTranslate != '1'" v-model="paramInchargerId" :placeholder="$t('defaultText.pleaseChoose')" style="width: 80%" filterable clearable>
                         <el-option v-for="item in users" :key="item.id" :label="item.name" :value="item.id">
                             <span style="float: left">{{item.name}}</span>
                             <span style="float: right; color: #8492a6;" v-if="user.companyId == 936">{{ item.jobNumber }}</span>
                         </el-option>
                     </el-select>
+                    <!-- <selectCat :size="'small'" :subject="users" :subjectId="paramInchargerId" :distinction="'5'" @selectCal="selectCal"></selectCat> -->
                 </el-form-item>
             </el-form>
             <div slot="footer" class="dialog-footer">
@@ -1133,8 +1212,13 @@ a {
 <script>
     import util from "../../common/js/util";
     import projectgantt from "./project_gantt.vue"
+    // 自定义select组件
+    import selectCat from "@/components/select.vue"
     export default {
-        components:{projectgantt},
+        components:{
+            projectgantt,
+            selectCat
+        },
         data() {
             return {
                 addFlgmainProjectDialog: false,
@@ -1218,6 +1302,7 @@ a {
                     projectDesc: '',
                     alarmType: 0
                 },
+                addFormUserNames: [],
                 temaddForm: {},
                 rules: {
                     name: [{ required: true, message: this.$t('pleaseentername'), trigger: "blur" }],
@@ -1812,12 +1897,16 @@ a {
                 let list = chosenList.filter(item=>item.isUser == 1);
                 let listIDs = []
                 let listNames = ''
+                let listNamesList = []
                 for(let i=0;i<list.length;i++){
                     listIDs.push(list[i].id)
                     listNames += list[i].label + ','
+                    listNamesList.push(list[i].label)
                 }
                 this.addGroupPersonData.person = listIDs
                 this.addGroupPersonData.personNames = listNames
+                this.addGroupPersonDataPersonNames = listNamesList
+                console.log('触发', this.addGroupPersonDataPersonNames)
             },
             addGroupPersonSure(){
                 if(this.addGroupPersonData.group.length == 0 || this.addGroupPersonData.person == null){
@@ -2484,16 +2573,19 @@ a {
                 var chosenList = this.$refs.chooseMembTree.getCheckedNodes();
                 this.chosenMembList = chosenList.filter(item=>item.isUser == 1);
                 this.addForm.userNames = '';
+                this.addFormUserNames = []
                 this.addForm.userId = [];
                 this.participator = [];
                 for (var i=0;i<this.chosenMembList.length; i++) {
                     this.addForm.userId.push(this.chosenMembList[i].id);
                     this.addForm.userNames += this.chosenMembList[i].label+',';
+                    this.addFormUserNames.push(this.chosenMembList[i].label)
                     var item = {id:this.chosenMembList[i].id, name:this.chosenMembList[i].label};
                     this.participator.push(item);
                 }
                 if (this.addForm.userNames.length > 0) {
                     this.addForm.userNames = this.addForm.userNames.substring(0, this.addForm.userNames.length-1);
+                    // this.addFormUserNames = this.addFormUserNames.substring(0, this.addFormUserNames.length-1);
                 }
             },
 
@@ -2960,7 +3052,7 @@ a {
                 });
             },
             importProjectBefore(){
-                this.paramData1 = true
+                this.paramData1 = false
                 this.importProjectBeforeDialog = true
             },
             importProject(item) {
@@ -3355,13 +3447,16 @@ a {
                     }
                     var arr = [];
                     var names = '';
+                    let namesLiss = [] // 企业微信用到的参与者
                     for(var j in list) {
                         arr.push(list[j].id)
                         names += list[j].name+',';
+                        namesLiss.push(list[j].name)
                     }
                     if (names.length > 0) {
                         names = names.substring(0, names.length -1);
                     }
+                    this.addFormUserNames = namesLiss
                     var listList = JSON.parse(JSON.stringify(item)),
                     arrList = [],
                     array = [];
@@ -3934,6 +4029,22 @@ a {
                 }
                 return arr;
             },
+            // 自定义组件事件
+            selectCal(obj) {
+                if(obj.distinction == '1') {
+                    this.inchagerId = obj.id
+                    this.manageSelect()
+                } else if(obj.distinction == '2') {
+                    this.participationId = obj.id
+                    this.participationSelect()
+                } else if(obj.distinction == '3') {
+                    this.addForm.inchargerId = obj.id
+                } else if(obj.distinction =='4') {
+                    this.projectProfessionList[obj.index].inchargerId == obj.id
+                } else if(obj.distinction =='5') {
+                    this.paramInchargerId = obj.id
+                }
+            }
         },
         created() {
             let height = window.innerHeight;
@@ -4058,4 +4169,7 @@ a {
 .toolbar_formitem_n1{
     margin-right: 0 !important;
 }
+.wpgCssClass .el-form-item__label{
+    font-weight: 600;
+}
 </style>

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

@@ -92,11 +92,20 @@
                         <div>
                             <el-form label-width="80px">
                                 <el-form-item :label="$t('head') + ':'">
-                                    {{groupDetailData.incharger}}
+                                    <span v-if="user.userNameNeedTranslate != '1'">{{groupDetailData.incharger}}</span>
+                                    <span v-if="user.userNameNeedTranslate == '1'">
+                                        <ww-open-data type='userName' :openid='groupDetailData.incharger'></ww-open-data>
+                                    </span>
                                 </el-form-item>
                                 <el-form-item :label="$t('participantin') + ':'">
                                     <span v-for="(item, index) in groupDetailData.participators" :key="index">
-                                        {{item.userName}} <span v-if="index < groupDetailData.participators.length - 1">、</span>
+                                        <span v-if="user.userNameNeedTranslate != '1'">
+                                            {{item.userName}} 
+                                        </span>
+                                        <span v-if="user.userNameNeedTranslate == '1'"> 
+                                            <ww-open-data type='userName' :openid='item.userName'></ww-open-data>
+                                        </span>
+                                        <span v-if="index < groupDetailData.participators.length - 1">、</span>
                                     </span>
                                 </el-form-item>
                             </el-form>
@@ -190,7 +199,14 @@
                                                             <span v-if="element.endDate >= times || element.taskStatus == 1"><i v-if="element.endDate != null" class="el-icon-date" style="margin-left:5px">&nbsp;&nbsp;{{element.endDate}}</i></span>
                                                             <span v-else><em v-if="element.endDate != null" style="display: inline-block;padding:3px 5px"><i v-if="element.endDate != null" class="el-icon-date"><span  class="element_span"> &nbsp;&nbsp;{{element.endDate}}{{ $t('jie-zhi') }}</span></i></em></span>
                                                             <span v-if="element.executorName">
-                                                            <span v-for="(exeItem, exeIndex) in element.executorName.split(',')" :key="exeIndex" :style="element.executorColor ? 'background:' + element.executorColor.split(',')[exeIndex] : ''" class="user_name_icon">{{exeItem.length>2?exeItem.substring(exeItem.length-2, exeItem.length):exeItem}}</span>
+                                                            <span v-for="(exeItem, exeIndex) in element.executorName.split(',')" :key="exeIndex" :style="element.executorColor ? 'background:' + element.executorColor.split(',')[exeIndex] : ''" class="user_name_icon">
+                                                                <span v-if="user.userNameNeedTranslate != '1'">
+                                                                    {{exeItem.length>2?exeItem.substring(exeItem.length-2, exeItem.length):exeItem}}
+                                                                </span>
+                                                                <span v-if="user.userNameNeedTranslate == '1'">
+                                                                    <ww-open-data type='userName' :openid='exeItem'></ww-open-data>
+                                                                </span>
+                                                            </span>
                                                             </span>
                                                             <el-button v-if="!element.executorName" type="primary" @click.stop.native="addAsMyTask(element)" size="mini" style="float:right;width:38px;padding:5px;position: absolute;z-index: 5;right: 5px;">{{ $t('ren-ling') }}</el-button>
                                                         </div>
@@ -256,7 +272,17 @@
                             </el-table-column>
                             <el-table-column prop="executorName" :label="$t('zhi-hang-ren')" width="100" >
                                 <template slot-scope="scope">
-                                    {{scope.row.executorName == null?$t('dai-fen-pei'):scope.row.executorName}}
+                                    <span v-if="user.userNameNeedTranslate != '1'">
+                                        {{scope.row.executorName == null?$t('dai-fen-pei'):scope.row.executorName}}
+                                    </span>
+                                    <span v-if="user.userNameNeedTranslate == '1'">
+                                        <span v-if="scope.row.executorName == null">
+                                            {{$t('dai-fen-pei')}}
+                                        </span>
+                                        <span v-else>
+                                            <ww-open-data type='userName' :openid='scope.row.executorName'></ww-open-data>
+                                        </span>
+                                    </span>
                                 </template>
                             </el-table-column>
                             <!-- <el-table-column prop="endDate" label="截止时间" width="100" ></el-table-column> -->
@@ -355,12 +381,17 @@
 
                 <div style="border: 1px solid #ddd;margin:5px 0;padding:5px 0;">
                 <el-form-item :label="$t('zhi-hang-ren') + (index+1)" v-for="(executorItem, index) in addForm.executorListFront" :key="index">
-                    <el-select v-model="executorItem.executorId" :disabled="(addForm.id != null && user.id != addForm.createrId && currentProject.inchargerId != user.id) && !permissions.projectManagement && !(groupResponsibleId == user.id)" size="small" filterable clearable :placeholder="$t('pleaseselectanexecutor')" style="width:40%;" @change="$forceUpdate()">
+
+                    <el-select v-if="user.userNameNeedTranslate != 1" v-model="executorItem.executorId" :disabled="(addForm.id != null && user.id != addForm.createrId && currentProject.inchargerId != user.id) && !permissions.projectManagement && !(groupResponsibleId == user.id)" size="small" filterable clearable :placeholder="$t('pleaseselectanexecutor')" style="width:40%;" @change="$forceUpdate()">
                         <el-option v-for="item in users" :key="item.id" :label="item.name" :value="item.id">
                              <span style="float: left">{{ item.name }}</span>
                              <span style="float: right; color: #8492a6; font-size: 13px;margin-left: 20px" v-if="item.jobNumber">{{ item.jobNumber }}</span>
                         </el-option>
                     </el-select>
+
+                    <selectCat v-if="user.userNameNeedTranslate == 1" :size="'mini'" :subject="users" :subjectId="executorItem.executorId" :distinction="'1'" @selectCal="selectCal" :index="index" :disabled="(addForm.id != null && user.id != addForm.createrId && currentProject.inchargerId != user.id) && !permissions.projectManagement && !(groupResponsibleId == user.id)"></selectCat>
+
+
                     <span style="margin-left:30px;margin-right:10px;">{{ $t('plantime') }}</span>
                     <el-input-number size="small" :disabled="(addForm.id != null && user.id != addForm.createrId && currentProject.inchargerId != user.id) && !permissions.projectManagement && !(groupResponsibleId == user.id)" v-model="gstimday[index]" style="width:16%;" :min="1" :max="100"  :placeholder="$t('danweitian')" @change="chggstim(0,index)"></el-input-number ><span style="margin-left:5px;">{{ $t('time.day') }}</span>
                     <el-input-number size="small" :disabled="(addForm.id != null && user.id != addForm.createrId && currentProject.inchargerId != user.id) && !permissions.projectManagement && !(groupResponsibleId == user.id)" v-model="gstimhour[index]" style="width:16%;" :min="1" :max="100"  :placeholder="$t('pleaseentertheplannedworking')" @change="chggstim(1,index)"></el-input-number ><span style="margin-left:5px;">{{ $t('time.hour') }}</span>
@@ -548,7 +579,17 @@
                             </el-table-column>
                             <el-table-column prop="executorName" :label="$t('zhi-hang-ren')" width="100" >
                                 <template slot-scope="scope">
-                                    {{scope.row.executorName == null?$t('dai-fen-pei'):scope.row.executorName}}
+                                    <span v-if="user.userNameNeedTranslate != 1">
+                                        {{scope.row.executorName == null?$t('dai-fen-pei'):scope.row.executorName}}
+                                    </span>
+                                    <span v-if="user.userNameNeedTranslate == 1">
+                                        <span v-if="scope.row.executorName == null">
+                                            {{$t('dai-fen-pei')}}
+                                        </span>
+                                        <span v-else>
+                                            <ww-open-data type='userName' :openid='scope.row.executorName'></ww-open-data>
+                                        </span>
+                                    </span>
                                 </template>
                             </el-table-column>
                             <el-table-column prop="endDate" :label="$t('deadline')" width="100" >
@@ -588,7 +629,16 @@
                     </el-table-column>
                     <el-table-column :label="$t('filenames')" prop="documentName" min-width="180"></el-table-column>
                     <el-table-column :label="$t('filesize')" prop="size" min-width="60" align="center"></el-table-column>
-                    <el-table-column :label="$t('founder')" prop="creatorName" min-width="60" align="center"></el-table-column>
+                    <el-table-column :label="$t('founder')" prop="creatorName" min-width="60" align="center">
+                        <template slot-scope="scope">
+                            <div>
+                                <span v-if="user.userNameNeedTranslate != 1">{{scope.row.creatorName}}</span>
+                                <span v-if="user.userNameNeedTranslate == 1">
+                                    <ww-open-data type='departmentName' :openid='scope.row.creatorName'></ww-open-data>
+                                </span>
+                            </div>
+                        </template>
+                    </el-table-column>
                     <el-table-column :label="$t('creationtime')" prop="indate" min-width="120" align="center">
                         <template slot-scope="scope">
                             <span>{{scope.row.indate[0] + '-' + scope.row.indate[1] + '-' + scope.row.indate[2] + '\u0020\u0020' + scope.row.indate[3] + ':' + scope.row.indate[4] + ':' + scope.row.indate[5]}}</span>
@@ -657,7 +707,10 @@
                         <div class="player" v-if="pl">
                             <p>{{ $t('participantin') }}</p>
                             <div class="bj">
-                                <span style="background: #778899">{{pl.length > 2 ? pl.substring(pl.length - 2, pl.length) : pl}}</span>
+                                <span style="background: #778899" v-if="user.userNameNeedTranslate != 1">{{pl.length > 2 ? pl.substring(pl.length - 2, pl.length) : pl}}</span>
+                                <span v-if="user.userNameNeedTranslate == 1">
+                                    <ww-open-data type='userName' :openid='pl'></ww-open-data>
+                                </span>
                                 <!-- <span style="background: #778899">{{pl.length}}</span> -->
                             </div>
                         </div>
@@ -676,11 +729,23 @@
                                     <!-- <el-image style="width: 30px; height: 30px" :src="url" :fit="fit"></el-image> -->
                                     <!-- <i :style="'background' + item.userColor"> -->
                                     <i :style="'background' + item.userColor">
-                                        {{item.userName.length > 2 ? item.userName.substring(item.userName.length - 2, item.userName.length) : item.userName}}
+                                        <i v-if="user.userNameNeedTranslate != 1">
+                                            {{item.userName.length > 2 ? item.userName.substring(item.userName.length - 2, item.userName.length) : item.userName}}
+                                        </i>   
+                                        <i v-if="user.userNameNeedTranslate == 1">
+                                            <ww-open-data type='userName' :openid='item.userName'></ww-open-data>
+                                        </i>
                                     </i>
                                     <div>
                                         <!-- <p>{{item.userName}}</p> -->
-                                        <p>{{item.userName}}</p>
+                                        <!-- <p> -->
+                                            <p v-if="user.userNameNeedTranslate != 1">
+                                                {{item.userName}}
+                                            </p>
+                                            <p v-if="user.userNameNeedTranslate == 1">
+                                                <ww-open-data type='userName' :openid='item.userName'></ww-open-data>
+                                            </p>
+                                        <!-- </p> -->
                                         <em>{{item.content}}</em>
                                     </div>
                                     <span>{{item.createTime | relativeTime}}</span>
@@ -727,7 +792,17 @@
                 </el-table-column>
                 <el-table-column prop="executorName" :label="$t('zhi-hang-ren')" width="100" >
                     <template slot-scope="scope">
-                        {{scope.row.executorName == null?$t('dai-fen-pei'):scope.row.executorName}}
+                        <span v-if="user.userNameNeedTranslate != 1">
+                            {{scope.row.executorName == null?$t('dai-fen-pei'):scope.row.executorName}}
+                        </span>
+                        <span v-if="user.userNameNeedTranslate == 1">
+                            <span v-if="scope.row.executorName == null">
+                                {{$t('dai-fen-pei')}}
+                            </span>
+                            <span v-else>
+                                <ww-open-data type='userName' :openid='scope.row.executorName'></ww-open-data>
+                            </span>
+                        </span>
                     </template>
                 </el-table-column>
                 <el-table-column prop="endDate" :label="$t('deadline')" width="100" ></el-table-column>
@@ -735,10 +810,16 @@
         </el-dialog>
         <!--用户详细信息弹出框-->
         <el-dialog :title="$t('Checkthedetails')" v-if="userDetailVisible" :visible.sync="userDetailVisible" :close-on-click-modal="false" customClass="customWidth" width="400px">
-            <div class="line"><span>{{ $t('lable.name') }}</span><span>{{userDetail.name}}</span></div>
+            <div class="line"><span>{{ $t('lable.name') }}</span>
+                <span v-if="user.userNameNeedTranslate != 1">{{userDetail.name}}</span>
+                <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='userDetail.name'></ww-open-data></span>
+            </div>
             <div class="line"><span>{{ $t('Worknumber') }}</span><span>{{userDetail.jobNumber}}</span></div>
             <div class="line"><span>{{ $t('lable.phone') }}</span><span>{{userDetail.phone}}</span></div>
-            <div class="line"><span>{{ $t('lable.department') }}</span><span>{{userDetail.departmentName}}</span></div>
+            <div class="line"><span>{{ $t('lable.department') }}</span>
+                <span v-if="user.userNameNeedTranslate != 1">{{userDetail.departmentName}}</span>
+                <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='departmentName' :openid='userDetail.departmentName'></ww-open-data></span>
+            </div>
             <div class="line"><span>{{ $t('costof') }}</span><span>{{userDetail.cost}}{{ $t('Yuananhour') }}</span></div>
             <div slot="footer" class="dialog-footer">
                 <el-button type="primary" @click="userDetailVisible = false" >{{ $t('btn.determine') }}</el-button>
@@ -763,6 +844,9 @@
                         <el-row >
                             <el-col :span="22">
                                 <div><span>{{t.name}}</span>
+                                <el-link :underline="false" type="primary" style="color:#aaa;margin-left:10px;"
+                                 @click="setTemplate(t)"><i class="el-icon-setting" v-show="t.isSystem == 0" ></i>
+                                </el-link>
                                 <el-link :underline="false" type="primary" style="color:#aaa;margin-left:10px;"
                                  @click="deleteTemplate(t)"><i class="el-icon-delete" v-show="t.isSystem == 0" ></i>
                                 </el-link>
@@ -785,13 +869,31 @@
                 </el-tab-pane>
                 </el-tabs>
             </div>
+            <el-dialog title="编辑模板" append-to-body v-if="setTemplateDialog" :visible.sync="setTemplateDialog" width="500px">
+                <el-form label-width="20%">
+                    <el-form-item label="模板名称"><el-input v-model="setTemplateData.name" style="width:80%" clearable></el-input></el-form-item>
+                    <el-form-item label=""><el-checkbox v-model="setTemplateData.creWithPro">随项目自动创建</el-checkbox></el-form-item>
+                    <el-form-item v-for="item,index in setTemplateData.stagesList" :key="item.id" :label="index == 0 ? '任务列表' : ''">
+                        <el-input v-model="item.stagesName"  style="width:70%" clearable></el-input>
+                        <el-link :underline="false" type="primary" style="color:#aaa;" @click="deleteStages(item,index)"  v-if="index != 0">
+                            <i class="el-icon-delete"></i>
+                        </el-link>
+                    </el-form-item>
+                    <el-link style="margin-left:20%" :underline="false" type="primary" @click="addStages()">新增任务列表</el-link>
+                </el-form>
+                <div slot="footer" class="dialog-footer">
+                    <el-button type="primary" @click="setTemplateDialog = false">取消</el-button>
+                    <el-button type="primary" @click="setTemplateSave()">{{ $t('save') }}</el-button>
+                </div>
+            </el-dialog>
         </el-dialog>
         <el-dialog :title="$t('taskgroupleader')" v-if="setInchargerDialog" :visible.sync="setInchargerDialog" :close-on-click-modal="false" customClass="customWidth" width="300px">
             <el-form ref="formIncharger" :model="groupForm" :rules="rules" style="margin-top:10px;">
                     <el-form-item prop="taskGpIncharge">
-                        <el-select v-model="groupForm.inchargerId" :placeholder="$t('defaultText.pleaseChoose')" style="width:100%;" clearable filterable>
+                        <el-select v-if="user.userNameNeedTranslate != 1" v-model="groupForm.inchargerId" :placeholder="$t('defaultText.pleaseChoose')" style="width:100%;" clearable filterable>
                             <el-option v-for="item in joinMembList" :key="item.id" :value="item.id" :label="item.name"></el-option>
                         </el-select>
+                        <selectCat v-if="user.userNameNeedTranslate == 1" :size="'mini'" @selectCal="selectCal" :subject="joinMembList" :subjectId="groupForm.inchargerId" :clearable="true" :distinction="'2'"></selectCat>
                     </el-form-item>
                 </el-form>
             <div slot="footer" class="dialog-footer">
@@ -824,6 +926,7 @@
                                 <el-checkbox v-model="templateForm.saveTask" :label="$t('other.task')"></el-checkbox>
                                 <el-checkbox v-model="templateForm.saveMileStone" :label="$t('other.milestone')"></el-checkbox>
                                 <el-checkbox v-model="templateForm.saveRisk" :label="$t('risk')"></el-checkbox>
+                                <el-checkbox v-model="templateForm.automatically" :label="$t('suixiangmuzidongchuangjian')"></el-checkbox>
                             </div>
                     </el-form-item>
             </el-form>
@@ -837,7 +940,15 @@
             <el-form ref="form2" :model="stageForm" :rules="rules2" >
                 <el-form-item prop="stagesName">
                     <el-input v-model="stageForm.stagesName" :placeholder="$t('pleaseenteratasklistname')" maxlength="60"
-                        show-word-limit clearable></el-input>
+                        show-word-limit clearable>
+                        <template slot="prepend">
+                            <div style="width:90px">{{ $t('ren-wu-lie-biao-ming-cheng') }}</div>
+                        </template></el-input>
+                    <el-input id="stageForm_ysgs" v-model="stageForm.stagesTime" style="margin-top:5px" @keyup.native="restrictNumber('stageForm_ysgs')">
+                        <template slot="prepend">
+                            <div style="width:90px">{{ $t('yu-suan-gong-shi') }}<span>(h)</span></div>
+                        </template>
+                    </el-input>
                 </el-form-item>
             </el-form>
             <div slot="footer" class="dialog-footer">
@@ -883,6 +994,8 @@
     </section>
 </template>
 <script>
+    // 自定义select组件
+    import selectCat from "@/components/select.vue"
     import util from "../../common/js/util";
     import draggable from 'vuedraggable';
     import tinymce from 'tinymce/tinymce'
@@ -915,7 +1028,8 @@ import delete$ from 'dingtalk-jsapi/api/biz/cspace/delete';
             Summary,
             CostBaseline,
             Earning,
-            quillEditor // 富文本
+            quillEditor, // 富文本
+            selectCat
         },
         
         data() {
@@ -1106,7 +1220,9 @@ import delete$ from 'dingtalk-jsapi/api/biz/cspace/delete';
                 groupResponsibleId: '', // 分组负责人的id
                 groupDetailsShow: false,
                 groupDetailData: {},
-                groupDetailTil: ''
+                groupDetailTil: '',
+                setTemplateData: {},
+                setTemplateDialog: false
             };
             
         },
@@ -1116,7 +1232,16 @@ import delete$ from 'dingtalk-jsapi/api/biz/cspace/delete';
             }
         },
         methods: {
-
+            restrictNumber(targetId) {
+                let inpu = document.getElementById(targetId)
+                inpu.value = inpu.value.replace(/[^\d.]/g, "");  //仅保留数字和"."
+                inpu.value = inpu.value.replace(/\.{2,}/g, "."); //两个连续的"."仅保留第一个"."
+                inpu.value = inpu.value.replace(".", "$#*").replace(/\./g,'').replace('$#*','.');//去除其他"."
+                inpu.value = inpu.value.replace(/^(\d+)\.(\d\d).*$/, '$1.$2');;//限制只能输入两个小数
+                if (inpu.value.indexOf(".") < 0 && inpu.value != "") { //首位是0的话去掉
+                    inpu.value = parseFloat(inpu.value);
+                }
+            },
             test(item){
                 // let pro = this.$route
                 console.log('test',this.projectList);
@@ -1566,6 +1691,63 @@ import delete$ from 'dingtalk-jsapi/api/biz/cspace/delete';
                     );
                 
             },
+            // 编辑模板
+            setTemplate(t){
+                console.log(t);
+                this.setTemplateData = t
+                this.setTemplateData.needDelete = []
+                this.setTemplateDialog = true
+            },
+            setTemplateSave(){
+                if(this.setTemplateData.name == '' || this.setTemplateData.name == null){
+                    this.$message({
+                        message: '模板名称不能为空',
+                        type: 'error'
+                    })
+                    return
+                }
+                for(let i in this.setTemplateData.stagesList){
+                    if(this.setTemplateData.stagesList[i].stagesName == '' || this.setTemplateData.stagesList[i].stagesName == null){
+                        this.$message({
+                            message: '任务列表名称不能为空',
+                            type: 'error'
+                        })
+                        return
+                    }
+                }
+                this.http.post('/task-group/setTemplate',this.setTemplateData,
+                res => {
+                    if(res.code == 'ok'){
+                        this.$message({
+                            message: '修改成功',
+                            type: 'success'
+                        })
+                        this.getGroupTemplate()
+                        this.setTemplateDialog = false
+                    }else{
+                        this.$message({
+                            message: res.msg,
+                            type: 'error'
+                        })
+                    }
+                },err => {
+                    this.$message({
+                        message: err,
+                        type: 'error'
+                    })
+                })
+            },
+            deleteStages(item,index){
+                this.setTemplateData.needDelete.push(item.id)
+                this.setTemplateData.stagesList.splice(index,1)
+                console.log('deletestages',item.id);
+            },
+            addStages(){
+                this.setTemplateData.stagesList.push({
+                    stagesName: '',
+                    templateId: this.setTemplateData.id
+                })
+            },
             //删除模板
             deleteTemplate(t) {
                 var that = this;
@@ -2436,7 +2618,7 @@ import delete$ from 'dingtalk-jsapi/api/biz/cspace/delete';
             },
             addStage() {
                 this.addStageDialog = true;
-                this.stageForm = {groupId: this.selectedGroup.id, projectId: this.curProjectId};
+                this.stageForm = {groupId: this.selectedGroup.id, projectId: this.curProjectId, stagesTime: 0};
             },
             viewChange(index, indexPath) {
                 this.groupType = 1;
@@ -3025,6 +3207,14 @@ import delete$ from 'dingtalk-jsapi/api/biz/cspace/delete';
                 console.log('pro',pro.creatorId);
                 this.projectCreatorId = pro.creatorId
                 this.projectInchargerId = pro.inchargerId
+            },
+            // 自定义组件事件
+            selectCal(obj) {
+                if(obj.distinction == '1') {
+                    this.addForm.executorListFront[obj.index].executorId = obj.id
+                } else if(obj.distinction == '2') {
+                    this.groupForm.inchargerId = obj.id
+                }
             }
         },
         created() {

+ 14 - 0
fhKeeper/formulahousekeeper/timesheet/src/views/settings/timetype.vue

@@ -163,6 +163,20 @@
         </div>
         </el-col>
         </el-row>
+
+        <template v-if="timeType.reportAuditType == 3">
+        <p style="margin-left:10px;color:#666;">审批层级设置</p>
+        <el-row :gutter="20" style="padding-top:10px;width:100%;margin:0 auto;padding-left:10px;padding-right:10px;">
+            <el-col :span="24">
+                <el-select v-model="timeType.auditLevel">
+                    <el-option :value="1" label="1层"></el-option>
+                    <el-option :value="2" label="2层"></el-option>
+                    <el-option :value="3" label="3层"></el-option>
+                </el-select>
+            </el-col>
+        </el-row>
+        </template>
+
         <!--设置时长样式内容-->
         <p style="margin-left:10px;color:#666;">{{ $t('reminderSettings') }}</p>
         <el-row :gutter="20" style="padding-top:10px;width:100%;margin:0 auto;padding-left:10px;padding-right:10px;">

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

@@ -84,7 +84,7 @@
                         <el-link type="primary" :underline="false" @click="openInsertDialog(null)">{{ $t('addpersonnel') }}</el-link>
                     </el-form-item>
                     
-                    <el-form-item style="float:right;" v-if="user.dingdingUserid == null && permissions.structureImport">
+                    <el-form-item style="float:right;" v-if="user.dingdingUserid == null && permissions.structureImport && user.userNameNeedTranslate != '1'">
                         <el-link type="primary" :underline="false" @click="importUserC">{{ $t('bulkimport') }}</el-link>
                     </el-form-item>
                     <el-form-item style="float:right;" v-if="user.corpwxUserid != null && permissions.structureImport && user.companyId==469">
@@ -173,7 +173,7 @@
                       <div v-if="user.userNameNeedTranslate == 1">
                         <ww-open-data type='departmentName' :openid='scope.row.departmentName'></ww-open-data>
                       </div>
-                      <div v-else>{{scope.row.name}}</div>
+                      <div v-else>{{scope.row.departmentName}}</div>
                     </div>
                   </template>
                 </el-table-column>
@@ -1088,6 +1088,7 @@ export default {
               message: '同步成功',
               type: "success",
             });
+            this.getDepartment();
             this.getUser();
             this.getUsers();
           } else {

+ 54 - 6
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

@@ -112,13 +112,13 @@
                                     <span v-if="targetUid == null">
                                     <!-- - 已提交 -->
                                     -{{$t('state.hasBeenSubmitted')}}
-                                    <el-link :underline="false" @click="showMembList(1)"><span style="margin-left:5px;margin-right:5px;color:green;">{{reportList.filter(item => item.state != 3).length}}</span></el-link>{{$t('other.people')}},
+                                    <el-link :underline="false" @click="showMembList(1)"><span style="margin-left:5px;margin-right:5px;color:green;">{{fillList.filter(item => item.state != 3).length}}</span></el-link>{{$t('other.people')}},
                                     <!-- 待提交 -->
                                     {{$t('state.waitingsubmit')}}
-                                    <el-link :underline="false" @click="showMembList(2)"><span style="margin-left:5px;margin-right:5px;color:green;">{{reportList.filter(item => item.state == 3).length}}</span></el-link>{{$t('other.people')}},
+                                    <el-link :underline="false" @click="showMembList(2)"><span style="margin-left:5px;margin-right:5px;color:green;">{{fillList.filter(item => item.state == 3).length}}</span></el-link>{{$t('other.people')}},
                                     <!-- 未填写 -->
                                     {{$t('state.DidNotFillIn')}}
-                                    <el-link :underline="false" @click="showMembList(0)"><span style="margin-left:5px;margin-right:5px;color:red;">{{(depData == null?data[0].membCount:(depData.isUser == 1?1:depData.membCount))-reportList.length | numbers}}</span></el-link>{{$t('other.people')}}
+                                    <el-link :underline="false" @click="showMembList(0)"><span style="margin-left:5px;margin-right:5px;color:red;">{{unFillList.length | numbers}}</span></el-link>{{$t('other.people')}}
                                     <span v-if="leaveAllNum">{{'(全天请假' + leaveAllNum + '人)'}}</span>
                                     </span>
                                     </span>
@@ -450,6 +450,28 @@
                         <selectCat v-if="user.userNameNeedTranslate == '1'" :size="'small'" :subject="domain.auditUserList" :idx="index" :subjectId="domain.projectAuditorId" ref="selectCat" :flg="true" @selectCatCli="selectCatCli"></selectCat>
 
                     </el-form-item>
+                    <!-- 111111 -->
+                    <!-- <el-form-item label="审核人" v-if="user.timeType.reportAuditType == 3">
+                        <el-select v-model="domain.auditorSettingArray.auditorFirst">
+                            <el-option v-for="item in allUsersList" :key="item.id" :label="item.name" :value="item.id"></el-option>
+                        </el-select>
+
+                        <i class="el-icon-right"></i>
+                        <el-select v-model="domain.auditorSettingArray.auditorSec">
+                            <el-option v-for="item in allUsersList" :key="item.id" :label="item.name" :value="item.id"></el-option>
+                        </el-select>
+
+                        <i class="el-icon-right"></i>
+                        <el-select v-model="domain.auditorSettingArray.auditorThird">
+                            <el-option v-for="item in allUsersList" :key="item.id" :label="item.name" :value="item.id"></el-option>
+                        </el-select>
+                    </el-form-item>
+                    <el-form-item label="抄送人" v-if="user.timeType.reportAuditType == 3">
+                        <el-select v-model="domain.auditorSettingArray.ccUserid">
+                            <el-option v-for="item in allUsersList" :key="item.id" :label="item.name" :value="item.id"></el-option>
+                        </el-select>
+                    </el-form-item> -->
+
                     <!-- 相关维度/自定义维度 -->
                     <el-form-item :label="yonghuUser.customDegreeName" v-if="domain.projectId && yonghuUser.customDegreeActive == 1" :rules="user.timeType.customDegreeStatus == 1 && domain.wuduList != undefined && domain.wuduList.length != 0 ? { required: true, message: $t('defaultText.pleaseChoose') + yonghuUser.customDegreeName, trigger: ['change','blur'] } : null" :prop="'domains.' + index + '.degreeId'">
                         <el-select v-model="domain.degreeId" clearable :placeholder="$t('defaultText.pleaseChoose')" :disabled="!domain.canEdit">
@@ -1550,6 +1572,7 @@
                 membCount:0,
                 selectState:"-1",
                 user: JSON.parse(sessionStorage.getItem("user")),
+                allUsersList: [],
                 showAddMore:false,
                 allDate: [],
                 typeList:[this.$t('other.allDay'),this.$t('other.morning'),this.$t('other.afternoon')],
@@ -1742,6 +1765,9 @@
             
         },
         methods: {
+            test(){
+                console.log('test',this.depData,this.data[0].membCount,this.reportList.length);
+            },
             weeklyFilledTimeClick(parameterDate){ //按周填报-已填工时-点击
                 this.weeklyFilledTimeDialog = true
                 this.weeklyFilledTimeLoading = true
@@ -3495,7 +3521,7 @@
                         for(let i in this.unFillList){
                             if(this.unFillList[i].leaveDays >= 1 || this.unFillList[i].leaveTimes >= this.user.timeType.allday){
                                 this.leaveAllNum += 1
-                            }
+                            } 
                         }
                         this.stateChange()
                     } else {
@@ -3998,7 +4024,7 @@
                     });
                 
             },
-            // 获取个人某天的日报 000000
+            // 获取个人某天的日报 111111
             getReport() {
                 this.http.post( this.port.report.getPort, {
                     date: this.workForm.createDate
@@ -5206,7 +5232,7 @@
                 return true
             },
 
-            // 保存日报
+            // 保存日报111111
             submitReport(isDraft) {
                 this.isDraft = isDraft;
                 this.$refs.workForm.validate(valid => {
@@ -5738,6 +5764,25 @@
                 this.toViewForm.pageSize = val;
                 this.getToView();
             },
+
+            getAllUsersList(){
+                this.http.post('/user/getSimpleActiveUserList',{
+                },res => {
+                    if(res.code == 'ok'){
+                        this.allUsersList = res.data
+                    }else{
+                        this.$message({
+                            message: res.msg,
+                            type: 'error'
+                        })
+                    }
+                },err => {
+                    this.$message({
+                        message: err,
+                        type: 'error'
+                    })
+                })
+            }
         },
         created() {
             let height = window.innerHeight;
@@ -5797,6 +5842,9 @@
             this.getDepartment();
             this.scrollFunction()
             this.userssHu();
+            if(this.user.timeType.reportAuditType == 3){
+                this.getAllUsersList()
+            }
             if (this.user.company.packageProject == 1) {
                 this.getBasecostItemList();
             }