cs 2 years ago
parent
commit
b07a5da007
24 changed files with 808 additions and 109 deletions
  1. 6 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/AuditWorkflowSettingController.java
  2. 2 5
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java
  3. 8 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java
  4. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ReportMapper.java
  5. 3 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ReportService.java
  6. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/WxCorpInfoService.java
  7. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/AuditWorkflowSettingServiceImpl.java
  8. 23 7
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ExpenseSheetServiceImpl.java
  9. 158 33
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  10. 39 14
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  11. 74 16
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java
  12. 1 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/i18n/messages.properties
  13. 1 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/i18n/messages_en_US.properties
  14. 22 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml
  15. 4 1
      fhKeeper/formulahousekeeper/timesheet/src/i18n/en.json
  16. 4 1
      fhKeeper/formulahousekeeper/timesheet/src/i18n/zh.json
  17. 46 6
      fhKeeper/formulahousekeeper/timesheet/src/views/awayOffice/awayOffice.vue
  18. 9 1
      fhKeeper/formulahousekeeper/timesheet/src/views/leave/list.vue
  19. 3 3
      fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue
  20. 187 7
      fhKeeper/formulahousekeeper/timesheet/src/views/project/projectInside.vue
  21. 182 4
      fhKeeper/formulahousekeeper/timesheet/src/views/task/list.vue
  22. 14 2
      fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue
  23. 8 2
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/review/department_list.vue
  24. 8 2
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/review/profession_list.vue

+ 6 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/AuditWorkflowSettingController.java

@@ -12,6 +12,7 @@ import com.management.platform.mapper.*;
 import com.management.platform.service.AuditWorkflowSettingService;
 import com.management.platform.service.AuditWorkflowSettingService;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.MessageUtils;
 import com.management.platform.util.MessageUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 
 
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RequestParam;
@@ -114,8 +115,12 @@ public class AuditWorkflowSettingController {
     }
     }
 
 
     @RequestMapping("/get")
     @RequestMapping("/get")
-    public HttpRespMsg get(Integer deptId, @RequestParam Integer type) {
+    public HttpRespMsg get(String userId, Integer deptId, @RequestParam Integer type) {
         HttpRespMsg msg = new HttpRespMsg();
         HttpRespMsg msg = new HttpRespMsg();
+        //按照传入的用户取他的部门
+        if (!StringUtils.isEmpty(userId)) {
+            deptId = userMapper.selectById(userId).getDepartmentId();
+        }
         msg.data = auditWorkflowSettingService.get(deptId, type);
         msg.data = auditWorkflowSettingService.get(deptId, type);
         return msg;
         return msg;
     }
     }

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

@@ -667,7 +667,6 @@ public class ProjectController {
         HttpRespMsg msg = new HttpRespMsg();
         HttpRespMsg msg = new HttpRespMsg();
         List<String> heads = new ArrayList<>();
         List<String> heads = new ArrayList<>();
         Company company = companyMapper.selectById(companyId);
         Company company = companyMapper.selectById(companyId);
-        WxCorpInfo wxCorpInfo=wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id",companyId));
         List<ProjectStage> projectStageList = projectStageMapper.selectList(new QueryWrapper<ProjectStage>().eq("company_id", company.getId()));
         List<ProjectStage> projectStageList = projectStageMapper.selectList(new QueryWrapper<ProjectStage>().eq("company_id", company.getId()));
         List<ProviderCategory> providerCategoryList = providerCategoryMapper.selectList(new QueryWrapper<ProviderCategory>().eq("company_id", companyId));
         List<ProviderCategory> providerCategoryList = providerCategoryMapper.selectList(new QueryWrapper<ProviderCategory>().eq("company_id", companyId));
         List<ProjectLevel> projectLevelList = projectLevelMapper.selectList(new QueryWrapper<ProjectLevel>().eq("company_id", companyId));
         List<ProjectLevel> projectLevelList = projectLevelMapper.selectList(new QueryWrapper<ProjectLevel>().eq("company_id", companyId));
@@ -930,8 +929,7 @@ public class ProjectController {
                                 case "Participants":
                                 case "Participants":
                                     comment = drawing.createCellComment(anchor);
                                     comment = drawing.createCellComment(anchor);
                                     // 输入批注信息
                                     // 输入批注信息
-                                    comment.setString(
-                                            wxCorpInfo.getSaasSyncContact()!=1? new HSSFRichTextString(MessageUtils.message("excel.manyPeople")):new HSSFRichTextString(MessageUtils.message("excel.manyPeoplePlus")));
+                                    comment.setString(new HSSFRichTextString(MessageUtils.message("excel.manyPeople")));
                                     cell.setCellComment(comment);
                                     cell.setCellComment(comment);
                                     break;
                                     break;
                                 case "项目经理":
                                 case "项目经理":
@@ -939,8 +937,7 @@ public class ProjectController {
                                     comment = drawing.createCellComment(anchor);
                                     comment = drawing.createCellComment(anchor);
                                     // 输入批注信息
                                     // 输入批注信息
                                     //comment.setString(new HSSFRichTextString("项目经理需存在于参与人中"));
                                     //comment.setString(new HSSFRichTextString("项目经理需存在于参与人中"));
-                                    comment.setString(
-                                            wxCorpInfo.getSaasSyncContact()!=1?new HSSFRichTextString(MessageUtils.message("excel.projectManager")):new HSSFRichTextString(MessageUtils.message("excel.projectManagerPlus")));
+                                    comment.setString(new HSSFRichTextString(MessageUtils.message("excel.projectManager")));
                                     cell.setCellComment(comment);
                                     cell.setCellComment(comment);
                                     break;
                                     break;
                                 case "开始日期":
                                 case "开始日期":

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

@@ -82,6 +82,14 @@ public class ReportController {
     private UserCorpwxTimeMapper userCorpwxTimeMapper;
     private UserCorpwxTimeMapper userCorpwxTimeMapper;
 
 
 
 
+    //获取任务相关的日报列表
+    @RequestMapping("/getTaskReportList")
+    public HttpRespMsg getTaskReportList(Integer taskId) {
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.data = reportService.getTaskReportList(taskId);
+        return msg;
+    }
+
 
 
     /**
     /**
      * 根据时间 按照人分类 获取报告信息
      * 根据时间 按照人分类 获取报告信息

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

@@ -67,6 +67,8 @@ public interface ReportMapper extends BaseMapper<Report> {
 
 
     List<Map<String, Object>> getUserReportByDate(@Param("date") String date, @Param("userIds") List<String> userIds);
     List<Map<String, Object>> getUserReportByDate(@Param("date") String date, @Param("userIds") List<String> userIds);
 
 
+    List<Map<String, Object>> getReportByTask(@Param("taskId") Integer taskId);
+
     List<Map<String, Object>> getReportNameByDate(@Param("date") String date, @Param("companyId") Integer companyId, @Param("leaderId") String leaderId);
     List<Map<String, Object>> getReportNameByDate(@Param("date") String date, @Param("companyId") Integer companyId, @Param("leaderId") String leaderId);
 
 
     List<Map<String, Object>> getReportNameByDateAndDept(@Param("date") String date,
     List<Map<String, Object>> getReportNameByDateAndDept(@Param("date") String date,

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

@@ -11,6 +11,7 @@ import org.springframework.web.multipart.MultipartFile;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequest;
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 import java.util.List;
 import java.util.List;
+import java.util.Map;
 
 
 /**
 /**
  * <p>
  * <p>
@@ -96,4 +97,6 @@ public interface ReportService extends IService<Report> {
     HttpRespMsg uploadThirdReportData(String yearMonth,HttpServletRequest request);
     HttpRespMsg uploadThirdReportData(String yearMonth,HttpServletRequest request);
 
 
     HttpRespMsg pushReportDataToThird(String yearMonth,HttpServletRequest request);
     HttpRespMsg pushReportDataToThird(String yearMonth,HttpServletRequest request);
+
+    List<Map<String, Object>> getTaskReportList(Integer taskId);
 }
 }

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

@@ -7,8 +7,6 @@ import com.management.platform.entity.User;
 import com.management.platform.entity.WxCorpInfo;
 import com.management.platform.entity.WxCorpInfo;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.HttpRespMsg;
 
 
-import javax.servlet.http.HttpServletRequest;
-import java.io.File;
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
 import java.util.List;
 import java.util.List;
 
 
@@ -57,4 +55,6 @@ public interface WxCorpInfoService extends IService<WxCorpInfo> {
     String getUserInfoWithDepartment(String accessToken, Integer wxDeptid);
     String getUserInfoWithDepartment(String accessToken, Integer wxDeptid);
 
 
     User generateUserInfo(Integer companyId, String corpwxOpenId);
     User generateUserInfo(Integer companyId, String corpwxOpenId);
+
+    HttpRespMsg getBatchSearchUserInfo(WxCorpInfo wxCorpInfo, List<String> userNameList) throws Exception;
 }
 }

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

@@ -3,6 +3,7 @@ package com.management.platform.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.management.platform.entity.AuditWorkflowSetting;
 import com.management.platform.entity.AuditWorkflowSetting;
 import com.management.platform.entity.Department;
 import com.management.platform.entity.Department;
+import com.management.platform.entity.User;
 import com.management.platform.mapper.AuditWorkflowSettingMapper;
 import com.management.platform.mapper.AuditWorkflowSettingMapper;
 import com.management.platform.mapper.DepartmentMapper;
 import com.management.platform.mapper.DepartmentMapper;
 import com.management.platform.mapper.ReportMapper;
 import com.management.platform.mapper.ReportMapper;
@@ -10,6 +11,7 @@ import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.AuditWorkflowSettingService;
 import com.management.platform.service.AuditWorkflowSettingService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.HttpRespMsg;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
@@ -32,8 +34,6 @@ public class AuditWorkflowSettingServiceImpl extends ServiceImpl<AuditWorkflowSe
     @Resource
     @Resource
     AuditWorkflowSettingMapper auditWorkflowSettingMapper;
     AuditWorkflowSettingMapper auditWorkflowSettingMapper;
     @Resource
     @Resource
-    UserMapper userMapper;
-    @Resource
     DepartmentMapper departmentMapper;
     DepartmentMapper departmentMapper;
 
 
     @Override
     @Override

+ 23 - 7
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ExpenseSheetServiceImpl.java

@@ -321,7 +321,22 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
                 XSSFCell reportDateCell = firstRow.getCell(1);
                 XSSFCell reportDateCell = firstRow.getCell(1);
                 XSSFCell expenseTypeCell = firstRow.getCell(2);
                 XSSFCell expenseTypeCell = firstRow.getCell(2);
                 XSSFCell remarksCell = firstRow.getCell(3);
                 XSSFCell remarksCell = firstRow.getCell(3);
-
+                List<String> userNameList=new ArrayList<>();
+                String value = reimburserCell.getStringCellValue();
+                if(userNameList.contains(value)){
+                    continue;
+                }
+                userNameList.add(value);
+                System.out.println("参与搜素的人员列表"+userNameList);
+                HttpRespMsg respMsg=new HttpRespMsg();
+                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                    respMsg = wxCorpInfoService.getBatchSearchUserInfo(wxCorpInfo, userNameList);
+                    if(respMsg.code.equals("0")){
+                        msg.setError("姓名为["+String.valueOf(respMsg.data)+"]的人员存在重复,请使用工号!");
+                        return msg;
+                    }
+                }
+                List<User> targetUserList= (List<User>) respMsg.data;
                 if (reimburserCell != null) reimburserCell.setCellType(CellType.STRING);
                 if (reimburserCell != null) reimburserCell.setCellType(CellType.STRING);
                 if (reportDateCell != null) reportDateCell.setCellType(CellType.NUMERIC);
                 if (reportDateCell != null) reportDateCell.setCellType(CellType.NUMERIC);
                 if (expenseTypeCell != null) expenseTypeCell.setCellType(CellType.STRING);
                 if (expenseTypeCell != null) expenseTypeCell.setCellType(CellType.STRING);
@@ -362,19 +377,20 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
                         .atZone(ZoneId.systemDefault()).toLocalDate();
                         .atZone(ZoneId.systemDefault()).toLocalDate();
                 expenseSheet.setCreateDate(localDate);
                 expenseSheet.setCreateDate(localDate);
                 Optional<User> first;
                 Optional<User> first;
-                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()!=1){
-                    first = userList.stream().filter(us -> us.getName().equals(reimburserCell.getStringCellValue())).findFirst();
+                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                    Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(reimburserCell.getStringCellValue())).findFirst();
+                    first = userList.stream().filter(us -> us.getName().equals(reimburserCell.getStringCellValue())||(us.getJobNumber()!=null&&us.getJobNumber().equals(reimburserCell.getStringCellValue()))||(optional.isPresent()&&us.getCorpwxUserid()!=null&&us.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
                 }else {
                 }else {
-                    first = userList.stream().filter(us -> us.getName().equals(reimburserCell.getStringCellValue())||(us.getJobNumber()!=null&&us.getJobNumber().equals(reimburserCell.getStringCellValue()))).findFirst();
+                    first = userList.stream().filter(us -> us.getName().equals(reimburserCell.getStringCellValue())).findFirst();
                 }
                 }
                 if (first.isPresent()) {
                 if (first.isPresent()) {
                     expenseSheet.setOwnerId(first.get().getId());
                     expenseSheet.setOwnerId(first.get().getId());
                     expenseSheet.setOwnerName(first.get().getName());
                     expenseSheet.setOwnerName(first.get().getName());
                 } else {
                 } else {
-                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()!=1){
-                        throw new Exception("报销人[" +reimburserCell+"]不存在");
-                    }else {
+                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                         throw new Exception("报销人/工号[" +reimburserCell+"]不存在");
                         throw new Exception("报销人/工号[" +reimburserCell+"]不存在");
+                    }else {
+                        throw new Exception("报销人[" +reimburserCell+"]不存在");
                     }
                     }
                 }
                 }
                 expenseSheet.setOperatorId(user.getId());
                 expenseSheet.setOperatorId(user.getId());

+ 158 - 33
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -191,6 +191,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     GroupTemplateMapper GroupTemplateMapper;
     GroupTemplateMapper GroupTemplateMapper;
     @Resource
     @Resource
     WxCorpInfoMapper wxCorpInfoMapper;
     WxCorpInfoMapper wxCorpInfoMapper;
+    @Resource
+    WxCorpInfoService wxCorpInfoService;
 
 
     @Resource
     @Resource
     private HttpServletResponse response;
     private HttpServletResponse response;
@@ -3095,7 +3097,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         HttpRespMsg msg = new HttpRespMsg();
         HttpRespMsg msg = new HttpRespMsg();
         User user = userMapper.selectById(userId);
         User user = userMapper.selectById(userId);
         TimeType timeType = timeTypeMapper.selectById(user.getCompanyId());
         TimeType timeType = timeTypeMapper.selectById(user.getCompanyId());
-        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id",user.getCompanyId()));
         //然后处理文件
         //然后处理文件
         String fileName = multipartFile.getOriginalFilename();
         String fileName = multipartFile.getOriginalFilename();
         File file = new File(fileName == null ? "file" : fileName);
         File file = new File(fileName == null ? "file" : fileName);
@@ -3144,6 +3146,37 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 projectLevelMap.put(MessageUtils.message("excel.MedRisk"), 6);
                 projectLevelMap.put(MessageUtils.message("excel.MedRisk"), 6);
                 projectLevelMap.put(MessageUtils.message("excel.highRisk"), 7);
                 projectLevelMap.put(MessageUtils.message("excel.highRisk"), 7);
                 List<String> existCodeList = new ArrayList<>();
                 List<String> existCodeList = new ArrayList<>();
+                List<String> userNameList=new ArrayList<>();
+                for (int rowIndex = 0; rowIndex <= rowNum; rowIndex++) {
+                    XSSFRow row = sheet.getRow(rowIndex);
+                    if (row == null) {
+                        continue;
+                    }
+                    //跳过空行
+                    if (ExcelUtil.isRowEmpty(row)) {
+                        continue;
+                    }
+                    XSSFCell participatorCell = row.getCell(5);
+                    if (participatorCell!=null)participatorCell.setCellType(CellType.STRING);
+                    String part = participatorCell.getStringCellValue().trim();
+                    String[] partSplit = part.split("\\,|\\,");
+                    for (String s : partSplit) {
+                        if(userNameList.contains(s)){
+                            continue;
+                        }
+                        userNameList.add(s);
+                    }
+                }
+                System.out.println("参与搜素的人员列表"+userNameList);
+                HttpRespMsg respMsg=new HttpRespMsg();
+                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                    respMsg = wxCorpInfoService.getBatchSearchUserInfo(wxCorpInfo, userNameList);
+                    if(respMsg.code.equals("0")){
+                        msg.setError("姓名为["+String.valueOf(respMsg.data)+"]的人员存在重复,请使用工号!");
+                        return msg;
+                    }
+                }
+                List<User> targetUserList= (List<User>) respMsg.data;
                 int importCount = 0;
                 int importCount = 0;
                 for (int rowIndex = 0; rowIndex <= rowNum; rowIndex++) {
                 for (int rowIndex = 0; rowIndex <= rowNum; rowIndex++) {
                     XSSFRow row = sheet.getRow(rowIndex);
                     XSSFRow row = sheet.getRow(rowIndex);
@@ -3243,15 +3276,21 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                             Optional<User> first;
                             Optional<User> first;
                             Integer exception=null;
                             Integer exception=null;
                             if(split.length==1){
                             if(split.length==1){
-                                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()!=1){
+                                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                    Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(split[0])).findFirst();
+                                    first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
+                                }else {
                                     first= userList.stream().filter(u -> u.getName().equals(split[0])||(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();
                                     first= userList.stream().filter(u -> u.getName().equals(split[0])||(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();
-                                }else {first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();}
+                                }
                                 exception=0;
                                 exception=0;
                             }else {
                             }else {
-                                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()!=1){
-                                    first= userList.stream().filter(u -> u.getName().equals(split[0])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
+                                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                    Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(split[1])).findFirst();
+                                    first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
                                     exception=1;
                                     exception=1;
-                                }else first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
+                                }else {
+                                    first= userList.stream().filter(u -> u.getName().equals(split[0])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
+                                }
                             }
                             }
                             if (first.isPresent()) {
                             if (first.isPresent()) {
                                 project.setInchargerId(first.get().getId());
                                 project.setInchargerId(first.get().getId());
@@ -3339,15 +3378,21 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         Optional<User> first;
                         Optional<User> first;
                         Integer exception=null;
                         Integer exception=null;
                         if(split.length==1){
                         if(split.length==1){
-                            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()!=1){
+                            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(split[0])).findFirst();
+                                first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
+                            }else {
                                 first= userList.stream().filter(u -> u.getName().equals(split[0])||(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();
                                 first= userList.stream().filter(u -> u.getName().equals(split[0])||(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();
-                            }else {first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();}
+                            }
                             exception=0;
                             exception=0;
                         }else {
                         }else {
-                            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()!=1){
-                                first= userList.stream().filter(u -> u.getName().equals(split[0])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
+                            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(split[1])).findFirst();
+                                first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
                                 exception=1;
                                 exception=1;
-                            }else first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
+                            }else {
+                                first= userList.stream().filter(u -> u.getName().equals(split[0])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
+                            }
                         }
                         }
                         Participation p = new Participation();
                         Participation p = new Participation();
                         if (first.isPresent()) {
                         if (first.isPresent()) {
@@ -3379,15 +3424,21 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                 Optional<User> first;
                                 Optional<User> first;
                                 Integer exception=null;
                                 Integer exception=null;
                                 if(split.length==1){
                                 if(split.length==1){
-                                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()!=1){
+                                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                        Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(split[0])).findFirst();
+                                        first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
+                                    }else {
                                         first= userList.stream().filter(u -> u.getName().equals(split[0])||(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();
                                         first= userList.stream().filter(u -> u.getName().equals(split[0])||(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();
-                                    }else {first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();}
+                                    }
                                     exception=0;
                                     exception=0;
                                 }else {
                                 }else {
-                                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()!=1){
-                                        first= userList.stream().filter(u -> u.getName().equals(split[0])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
+                                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                        Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(split[1])).findFirst();
+                                        first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
                                         exception=1;
                                         exception=1;
-                                    }else first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
+                                    }else {
+                                        first= userList.stream().filter(u -> u.getName().equals(split[0])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
+                                    }
                                 }
                                 }
                                 if (first.isPresent()) {
                                 if (first.isPresent()) {
                                     User partMemb = first.get();
                                     User partMemb = first.get();
@@ -3482,6 +3533,46 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     projectLevelMap.put(MessageUtils.message("excel.MedRisk"), 6);
                     projectLevelMap.put(MessageUtils.message("excel.MedRisk"), 6);
                     projectLevelMap.put(MessageUtils.message("excel.highRisk"), 7);
                     projectLevelMap.put(MessageUtils.message("excel.highRisk"), 7);
                 }
                 }
+                List<String> userNameList=new ArrayList<>();
+                for (int rowIndex = 0; rowIndex <= rowNum; rowIndex++) {
+                    HSSFRow row = sheet.getRow(rowIndex);
+                    if (row == null) {
+                        continue;
+                    }
+                    //跳过空行
+                    if (ExcelUtil.isRowEmpty(row)) {
+                        continue;
+                    }
+                    HSSFCell participatorCell=null;
+                    int c=0;
+                    if(company.getId()==936){
+                        c++;
+                    }
+                    if(timeType.getMainProjectState()==1){
+                        participatorCell = row.getCell(4+c);
+                    }else {
+                        participatorCell = row.getCell(5+c);
+                    }
+                    if (participatorCell!=null)participatorCell.setCellType(CellType.STRING);
+                    String part = participatorCell.getStringCellValue().trim();
+                    String[] partSplit = part.split("\\,|\\,");
+                    for (String s : partSplit) {
+                        if(userNameList.contains(s)){
+                            continue;
+                        }
+                        userNameList.add(s);
+                    }
+                }
+                System.out.println("参与搜素的人员列表"+userNameList);
+                HttpRespMsg respMsg=new HttpRespMsg();
+                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                    respMsg = wxCorpInfoService.getBatchSearchUserInfo(wxCorpInfo, userNameList);
+                    if(respMsg.code.equals("0")){
+                        msg.setError("姓名为["+String.valueOf(respMsg.data)+"]的人员存在重复,请使用工号!");
+                        return msg;
+                    }
+                }
+                List<User> targetUserList= (List<User>) respMsg.data;
                 List<String> existCodeList = new ArrayList<>();
                 List<String> existCodeList = new ArrayList<>();
                 int importCount = 0;
                 int importCount = 0;
                 for (int rowIndex = 0; rowIndex <= rowNum; rowIndex++) {
                 for (int rowIndex = 0; rowIndex <= rowNum; rowIndex++) {
@@ -3754,22 +3845,28 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                             Optional<User> first;
                             Optional<User> first;
                             Integer exception=null;
                             Integer exception=null;
                             if(split.length==1){
                             if(split.length==1){
-                                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()!=1){
+                                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                    Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(split[0])).findFirst();
+                                    first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
+                                }else {
                                     first= userList.stream().filter(u -> u.getName().equals(split[0])||(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();
                                     first= userList.stream().filter(u -> u.getName().equals(split[0])||(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();
-                                }else {first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();}
+                                }
                                 exception=0;
                                 exception=0;
                             }else {
                             }else {
-                                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()!=1){
-                                    first= userList.stream().filter(u -> u.getName().equals(split[0])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
+                                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                    Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(split[1])).findFirst();
+                                    first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
                                     exception=1;
                                     exception=1;
-                                }else first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
+                                }else {
+                                    first= userList.stream().filter(u -> u.getName().equals(split[0])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
+                                }
                             }
                             }
                             if (first.isPresent()) {
                             if (first.isPresent()) {
                                 project.setInchargerId(first.get().getId());
                                 project.setInchargerId(first.get().getId());
                                 project.setInchargerName(first.get().getName());
                                 project.setInchargerName(first.get().getName());
                             } else {
                             } else {
                                 switch (exception){
                                 switch (exception){
-                                    case 0:throw new Exception(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1?"项目负责人工号为["+split[0]+"]的人员不存在":"项目负责人姓名/工号为["+split[0]+"]的人员不存在");
+                                    case 0:throw new Exception((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)?"项目负责人工号为["+split[0]+"]的人员不存在":"项目负责人姓名/工号为["+split[0]+"]的人员不存在");
                                     case 1:throw new Exception("项目负责人["+split[0]+"]姓名与工号不匹配");
                                     case 1:throw new Exception("项目负责人["+split[0]+"]姓名与工号不匹配");
                                 }
                                 }
                             }
                             }
@@ -4330,15 +4427,21 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         Optional<User> first;
                         Optional<User> first;
                         Integer exception=null;
                         Integer exception=null;
                         if(split.length==1){
                         if(split.length==1){
-                            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()!=1){
+                            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(split[0])).findFirst();
+                                first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
+                            }else {
                                 first= userList.stream().filter(u -> u.getName().equals(split[0])||(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();
                                 first= userList.stream().filter(u -> u.getName().equals(split[0])||(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();
-                            }else {first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();}
+                            }
                             exception=0;
                             exception=0;
                         }else {
                         }else {
-                            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()!=1){
-                                first= userList.stream().filter(u -> u.getName().equals(split[0])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
+                            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(split[1])).findFirst();
+                                first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
                                 exception=1;
                                 exception=1;
-                            }else first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
+                            }else {
+                                first= userList.stream().filter(u -> u.getName().equals(split[0])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
+                            }
                         }
                         }
                         Participation p = new Participation();
                         Participation p = new Participation();
                         if (first.isPresent()) {
                         if (first.isPresent()) {
@@ -4369,15 +4472,21 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                 Optional<User> first;
                                 Optional<User> first;
                                 Integer exception=null;
                                 Integer exception=null;
                                 if(split.length==1){
                                 if(split.length==1){
-                                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()!=1){
+                                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                        Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(split[0])).findFirst();
+                                        first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
+                                    }else {
                                         first= userList.stream().filter(u -> u.getName().equals(split[0])||(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();
                                         first= userList.stream().filter(u -> u.getName().equals(split[0])||(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();
-                                    }else {first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();}
+                                    }
                                     exception=0;
                                     exception=0;
                                 }else {
                                 }else {
-                                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()!=1){
-                                        first= userList.stream().filter(u -> u.getName().equals(split[0])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
+                                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                        Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(split[1])).findFirst();
+                                        first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
                                         exception=1;
                                         exception=1;
-                                    }else first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
+                                    }else {
+                                        first= userList.stream().filter(u -> u.getName().equals(split[0])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
+                                    }
                                 }
                                 }
                                 Participation p = new Participation();
                                 Participation p = new Participation();
                                 if (first.isPresent()) {
                                 if (first.isPresent()) {
@@ -4565,6 +4674,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         List<String> nameList= (List<String>) resultMap.get("nameList");
         List<String> nameList= (List<String>) resultMap.get("nameList");
         Company company = companyMapper.selectById(user.getCompanyId());
         Company company = companyMapper.selectById(user.getCompanyId());
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", company.getId()));
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", company.getId()));
+        TimeType timeType = timeTypeMapper.selectById(user.getCompanyId());
         List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", company.getId()));
         List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", company.getId()));
         List<String> headList = new ArrayList<String>();
         List<String> headList = new ArrayList<String>();
 //        headList.add("项目编号");
 //        headList.add("项目编号");
@@ -4577,6 +4687,10 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
 //        headList.add("结束日期");
 //        headList.add("结束日期");
 //        headList.add("创建人");
 //        headList.add("创建人");
 //        headList.add("创建日期");
 //        headList.add("创建日期");
+        if(timeType.getMainProjectState()==1){
+            headList.add(MessageUtils.message("entry.mainProject"));
+            headList.add(MessageUtils.message("entry.mainProjectCode"));
+        }
         headList.add(MessageUtils.message("entry.projectId"));
         headList.add(MessageUtils.message("entry.projectId"));
         headList.add(MessageUtils.message("entry.projectType"));
         headList.add(MessageUtils.message("entry.projectType"));
         headList.add(MessageUtils.message("entry.publicProject"));
         headList.add(MessageUtils.message("entry.publicProject"));
@@ -4588,7 +4702,6 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         headList.add(MessageUtils.message("entry.creator"));
         headList.add(MessageUtils.message("entry.creator"));
         headList.add(MessageUtils.message("entry.creDate"));
         headList.add(MessageUtils.message("entry.creDate"));
         //自定义维度
         //自定义维度
-        TimeType timeType = timeTypeMapper.selectById(user.getCompanyId());
         if (timeType.getCustomDegreeActive() == 1) {
         if (timeType.getCustomDegreeActive() == 1) {
             headList.add(timeType.getCustomDegreeName());
             headList.add(timeType.getCustomDegreeName());
         }
         }
@@ -4652,11 +4765,23 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         collect.add(-1);
         collect.add(-1);
         List<ProjectSeparate> projectSeparateList= projectSeparateMapper.selectList(new QueryWrapper<ProjectSeparate>().in("id", collect));
         List<ProjectSeparate> projectSeparateList= projectSeparateMapper.selectList(new QueryWrapper<ProjectSeparate>().in("id", collect));
         List<ProjectKeyNodes> nodesList = projectKeyNodesMapper.selectList(new QueryWrapper<ProjectKeyNodes>().in("project_id", collect));
         List<ProjectKeyNodes> nodesList = projectKeyNodesMapper.selectList(new QueryWrapper<ProjectKeyNodes>().in("project_id", collect));
+        List<ProjectMain> projectMainList = projectMainMapper.selectList(new QueryWrapper<ProjectMain>().eq("company_id", company.getId()));
         LocalDateTime d=LocalDateTime.now();
         LocalDateTime d=LocalDateTime.now();
         Duration between1 = Duration.between(c, d);
         Duration between1 = Duration.between(c, d);
         System.out.println("此处耗时----------------"+between1.toMillis());
         System.out.println("此处耗时----------------"+between1.toMillis());
         for (ProjectVO projectVO : projectVOList) {
         for (ProjectVO projectVO : projectVOList) {
             List<String> rowData = new ArrayList<>();
             List<String> rowData = new ArrayList<>();
+            if(timeType.getMainProjectState()==1){
+                Optional<ProjectMain> first = projectMainList.stream().filter(pl -> pl.getId().equals(projectVO.getProjectMainId())).findFirst();
+                if(first.isPresent()){
+                    rowData.add(first.get().getName());
+                    rowData.add(first.get().getCode());
+                }else {
+                    rowData.add("");
+                    rowData.add("");
+                }
+
+            }
             rowData.add(projectVO.getProjectCode());
             rowData.add(projectVO.getProjectCode());
             rowData.add(projectVO.getCategoryName());
             rowData.add(projectVO.getCategoryName());
             //rowData.add(("1".equals(projectVO.getIsPublic())?"是":"否"));
             //rowData.add(("1".equals(projectVO.getIsPublic())?"是":"否"));

+ 39 - 14
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -861,14 +861,6 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 reportAuditorSettingService.saveOrUpdateBatch(collect);
                 reportAuditorSettingService.saveOrUpdateBatch(collect);
             }
             }
         }
         }
-        //插入所有动态和任务进展
-        ArrayList<TaskComment> taskComments = new ArrayList<>();
-        ArrayList<TaskProgress> taskProgresses = new ArrayList<>();
-        for (Report report : reportList) {
-            TaskComment taskComment = new TaskComment();
-            taskComment.setCreateTime(LocalDateTime.now());
-//            taskComment.setUserName(report.get);
-        }
 
 
         return httpRespMsg;
         return httpRespMsg;
     }
     }
@@ -3523,6 +3515,32 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             List<Report> reportList = new ArrayList<>();
             List<Report> reportList = new ArrayList<>();
             int projectNameStartIndex = (withCheckIn==null?2:6);
             int projectNameStartIndex = (withCheckIn==null?2:6);
             int dataCount = 0;
             int dataCount = 0;
+            List<String> userNameList=new ArrayList<>();
+            for (int rowIndex = 0; rowIndex <= rowNum; rowIndex++) {
+                Row row = sheet.getRow(rowIndex);
+                if (row == null) {
+                    continue;
+                }
+                if (ExcelUtil.isRowEmpty(row)) {
+                    continue;
+                }
+                dataCount++;
+                String username = withCheckIn==null?row.getCell(1).getStringCellValue().trim():row.getCell(2).getStringCellValue().trim();
+                if(userNameList.contains(username)){
+                    continue;
+                }
+                userNameList.add(username);
+            }
+            System.out.println("参与搜素的人员列表"+userNameList);
+            HttpRespMsg respMsg=new HttpRespMsg();
+            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                respMsg = wxCorpInfoService.getBatchSearchUserInfo(wxCorpInfo, userNameList);
+                if(respMsg.code.equals("0")){
+                    msg.setError("姓名为["+String.valueOf(respMsg.data)+"]的人员存在重复,请使用工号!");
+                    return msg;
+                }
+            }
+            List<User> targetUserList= (List<User>) respMsg.data;
             for (int rowIndex = 0; rowIndex <= rowNum; rowIndex++) {
             for (int rowIndex = 0; rowIndex <= rowNum; rowIndex++) {
                 Row row = sheet.getRow(rowIndex);
                 Row row = sheet.getRow(rowIndex);
                 if (row == null) {
                 if (row == null) {
@@ -3595,17 +3613,18 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     String username = withCheckIn==null?row.getCell(1).getStringCellValue().trim():row.getCell(2).getStringCellValue().trim();
                     String username = withCheckIn==null?row.getCell(1).getStringCellValue().trim():row.getCell(2).getStringCellValue().trim();
                     //检查人员是否存在
                     //检查人员是否存在
                     Optional<User> any;
                     Optional<User> any;
-                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()!=1){
-                        any = allUserList.stream().filter(u -> u.getName().equals(username)).findAny();
+                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                        Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(username)).findFirst();
+                        any = allUserList.stream().filter(u -> u.getName().equals(username)||(u.getJobNumber()!=null&&u.getJobNumber().equals(username))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findAny();
                     }else {
                     }else {
-                        any = allUserList.stream().filter(u -> u.getName().equals(username)||(u.getJobNumber()!=null&&u.getJobNumber().equals(username))).findAny();
+                        any = allUserList.stream().filter(u -> u.getName().equals(username)).findAny();
                     }
                     }
                     if (!any.isPresent()) {
                     if (!any.isPresent()) {
                         //msg.setError("人员["+username+"]不存在,请先在组织结构中添加或者通过钉钉同步导入");
                         //msg.setError("人员["+username+"]不存在,请先在组织结构中添加或者通过钉钉同步导入");
-                        if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()!=1){
-                            msg.setError(MessageUtils.message("staff.peopleNullAndAdd",username));
-                        }else {
+                        if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                             msg.setError(MessageUtils.message("staff.peopleNullAndAddPlus",username));
                             msg.setError(MessageUtils.message("staff.peopleNullAndAddPlus",username));
+                        }else {
+                            msg.setError(MessageUtils.message("staff.peopleNullAndAdd",username));
                         }
                         }
                         return msg;
                         return msg;
                     }
                     }
@@ -5171,6 +5190,12 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         return msg;
         return msg;
     }
     }
 
 
+    @Override
+    public List<Map<String, Object>> getTaskReportList(Integer taskId) {
+        List<Map<String, Object>> reportList = reportMapper.getReportByTask(taskId);
+        return reportList;
+    }
+
     private void selfUpdateToNextWorkFlow(Integer companyId, User auditTargetUser, List<Integer> targetRids, List<Department> allDepts) {
     private void selfUpdateToNextWorkFlow(Integer companyId, User auditTargetUser, List<Integer> targetRids, List<Department> allDepts) {
         List<AuditWorkflowTimeSetting> settings = auditWorkflowTimeSettingMapper.selectList(
         List<AuditWorkflowTimeSetting> settings = auditWorkflowTimeSettingMapper.selectList(
                 new QueryWrapper<AuditWorkflowTimeSetting>().eq("company_id", companyId)
                 new QueryWrapper<AuditWorkflowTimeSetting>().eq("company_id", companyId)

+ 74 - 16
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java

@@ -1,29 +1,14 @@
 package com.management.platform.service.impl;
 package com.management.platform.service.impl;
 
 
-import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.dingtalk.api.DefaultDingTalkClient;
-import com.dingtalk.api.DingTalkClient;
-import com.dingtalk.api.request.OapiAuthScopesRequest;
-import com.dingtalk.api.request.OapiV2DepartmentGetRequest;
-import com.dingtalk.api.request.OapiV2DepartmentListsubRequest;
-import com.dingtalk.api.response.OapiAuthScopesResponse;
-import com.dingtalk.api.response.OapiV2DepartmentGetResponse;
-import com.dingtalk.api.response.OapiV2DepartmentListsubResponse;
-import com.google.gson.JsonArray;
-import com.google.gson.JsonObject;
-import com.management.platform.constant.Constant;
 import com.management.platform.controller.WeiXinCorpController;
 import com.management.platform.controller.WeiXinCorpController;
 import com.management.platform.entity.*;
 import com.management.platform.entity.*;
 import com.management.platform.mapper.*;
 import com.management.platform.mapper.*;
-import com.management.platform.service.SysRoleService;
 import com.management.platform.service.WxCorpInfoService;
 import com.management.platform.service.WxCorpInfoService;
 import com.management.platform.util.*;
 import com.management.platform.util.*;
-import com.taobao.api.ApiException;
-import javafx.scene.effect.Light;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.http.client.utils.HttpClientUtils;
 import org.apache.http.client.utils.HttpClientUtils;
@@ -83,12 +68,16 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
 
 
     public static final String GET_USER_INFO_WITHDP = "https://qyapi.weixin.qq.com/cgi-bin/user/list?access_token=ACCESS_TOKEN&department_id=DEPARTMENT_ID";
     public static final String GET_USER_INFO_WITHDP = "https://qyapi.weixin.qq.com/cgi-bin/user/list?access_token=ACCESS_TOKEN&department_id=DEPARTMENT_ID";
 
 
+    public static final String GET_BATCH_SEARCH_USER_INFO = "https://qyapi.weixin.qq.com/cgi-bin/service/contact/batchsearch?provider_access_token=ACCESS_TOKEN";
+
     public static final int TEXT_CARD_MSG_BUSTRIP_WAITING_AUDIT = 0;//出差待审核
     public static final int TEXT_CARD_MSG_BUSTRIP_WAITING_AUDIT = 0;//出差待审核
     public static final int TEXT_CARD_MSG_BUSTRIP_AGREE = 1;//出差审核通过
     public static final int TEXT_CARD_MSG_BUSTRIP_AGREE = 1;//出差审核通过
     public static final int TEXT_CARD_MSG_BUSTRIP_DENY = 2;//出差审核驳回
     public static final int TEXT_CARD_MSG_BUSTRIP_DENY = 2;//出差审核驳回
     public static final int TEXT_CARD_MSG_REPORT_DENY = 10;//日报驳回
     public static final int TEXT_CARD_MSG_REPORT_DENY = 10;//日报驳回
     public static final int TEXT_CARD_MSG_REPORT_AGREE = 11; //日报审核通过
     public static final int TEXT_CARD_MSG_REPORT_AGREE = 11; //日报审核通过
 
 
+    public static final HashMap CURSOR=new HashMap();
+
     @Value("${suitId}")
     @Value("${suitId}")
     private String suitId;
     private String suitId;
     @Value("${suitSecret}")
     @Value("${suitSecret}")
@@ -261,17 +250,30 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
             String jumpUrl = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://worktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect";
             String jumpUrl = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://worktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect";
 
 
             if (StringUtils.isEmpty(pageRouter)) {
             if (StringUtils.isEmpty(pageRouter)) {
-                title = "通知";
+                title = "消息通知";
                 jumpUrl = jumpUrl.replace("STATE", "0");
                 jumpUrl = jumpUrl.replace("STATE", "0");
+                if (msgType.equals(TEXT_CARD_MSG_REPORT_DENY)) {
+                    title = "日报驳回";
+                } else if (msgType.equals(TEXT_CARD_MSG_REPORT_AGREE)) {
+                    title = "日报审核通过";
+                }
             } else {
             } else {
                 jumpUrl = jumpUrl.replace("STATE", pageRouter);
                 jumpUrl = jumpUrl.replace("STATE", pageRouter);
                 if ("awayOffice".equals(pageRouter)) {
                 if ("awayOffice".equals(pageRouter)) {
                     //出差
                     //出差
                     title = "出差通知";
                     title = "出差通知";
+                    if (msgType.equals(TEXT_CARD_MSG_BUSTRIP_WAITING_AUDIT)) {
+                        title = "出差待审核";
+                    } else if (msgType.equals(TEXT_CARD_MSG_BUSTRIP_AGREE)) {
+                        title = "出差审核通过";
+                    } else if (msgType.equals(TEXT_CARD_MSG_BUSTRIP_DENY)) {
+                        title = "出差审核驳回";
+                    }
                 }
                 }
             }
             }
             cardJson.put("title", title);
             cardJson.put("title", title);
             cardJson.put("description", msg);
             cardJson.put("description", msg);
+            cardJson.put("url", jumpUrl);
             reqParam.put("textcard", cardJson);
             reqParam.put("textcard", cardJson);
 
 
             HttpEntity<String> requestEntity = new HttpEntity<String>(reqParam.toJSONString(), headers);
             HttpEntity<String> requestEntity = new HttpEntity<String>(reqParam.toJSONString(), headers);
@@ -643,6 +645,62 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
         }
         }
         return result;
         return result;
     }
     }
+    @Override
+    public HttpRespMsg getBatchSearchUserInfo(WxCorpInfo wxCorpInfo, List<String> userNameList)throws Exception{
+        HttpRespMsg msg=new HttpRespMsg();
+        List<User> userList=new ArrayList<>();
+        String url = GET_BATCH_SEARCH_USER_INFO.replace("ACCESS_TOKEN",getProviderAccessToken());
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_JSON);
+        JSONObject jsonObject=new JSONObject();
+        jsonObject.put("auth_corpid",wxCorpInfo.getCorpid());
+        jsonObject.put("agentid",wxCorpInfo.getAgentid());
+        JSONArray jsonArray=new JSONArray();
+        for (String s : userNameList) {
+            JSONObject item=new JSONObject();
+            item.put("query_word",s);
+            item.put("query_type",1);
+            item.put("query_range",1);
+            item.put("limit",50);
+            item.put("full_match_field",1);
+            item.put("cursor",CURSOR.get("cursor"));
+            jsonArray.add(item);
+        }
+        jsonObject.put("query_request_list",jsonArray);
+        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());
+            }
+            JSONArray resultList = json.getJSONArray("query_result_list");
+            for (int i = 0; i < resultList.size(); i++) {
+                User user=new User();
+                JSONObject item = resultList.getJSONObject(i);
+                JSONObject result = item.getJSONObject("query_result");
+                JSONObject request = item.getJSONObject("query_request");
+                String userName= request.getString("query_word");
+                user.setName(userName);
+                JSONObject userOb = result.getJSONObject("user");
+                if(userOb==null){
+                    continue;
+                }
+                List<String> openUseridList = (List<String>) userOb.get("open_userid");
+                if(openUseridList.size()>1){
+                    msg.data=userName;
+                    msg.code="0";
+                    return msg;
+                }
+                user.setCorpwxUserid(openUseridList.get(0));
+                userList.add(user);
+            }
+        }
+        msg.data=userList;
+        return msg;
+    }
 
 
     @Override
     @Override
     public synchronized User generateUserInfo(Integer companyId, String corpwxOpenId) {
     public synchronized User generateUserInfo(Integer companyId, String corpwxOpenId) {

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

@@ -397,6 +397,7 @@ entry.projectCost=项目外包费
 entry.labourCost=劳务外包费
 entry.labourCost=劳务外包费
 entry.OtherOutsourceCost=其他外包费
 entry.OtherOutsourceCost=其他外包费
 entry.mainProject=主项目
 entry.mainProject=主项目
+entry.mainProjectCode=主项目编号
 entry.projectId=项目编号
 entry.projectId=项目编号
 entry.contractNo=合同编号
 entry.contractNo=合同编号
 entry.projectType=项目分类
 entry.projectType=项目分类

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

@@ -397,6 +397,7 @@ entry.projectCost=Project outsourcing fee
 entry.labourCost=Labor outsourcing fee
 entry.labourCost=Labor outsourcing fee
 entry.OtherOutsourceCost=Other outsourcing fees
 entry.OtherOutsourceCost=Other outsourcing fees
 entry.mainProject=Main project
 entry.mainProject=Main project
+entry.mainProjectCode=Main project code
 entry.projectId=project No
 entry.projectId=project No
 entry.contractNo=Contract No
 entry.contractNo=Contract No
 entry.projectType=Project classification
 entry.projectType=Project classification

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

@@ -284,6 +284,28 @@
         ORDER BY a.creator_id ASC
         ORDER BY a.creator_id ASC
     </select>
     </select>
 
 
+    <!--根据任务id,全部报告信息-->
+    <select id="getReportByTask" resultType="java.util.Map">
+        SELECT a.id,my.id as userId,  my.name as userName, a.project_id as projectId,b.project_name AS project, a.working_time AS time, a.content, a.state, a.time_type as timeType, a.cost, a.report_time_type as reportTimeType, a.start_time as startTime,
+        a.end_time as endTime, b.incharger_id as inchargerId,b.project_code as projectCode,
+        a.creator_id as creatorId, d.name as subProjectName,a.task_id as taskId, task.name as taskName, a.is_overtime as isOvertime,a.progress as progress,
+        a.department_audit_state as departmentAuditState, a.stage, a.pic_str as picStr, multi_worktime as multiWorktime
+        , reject_reason as rejectReason, reject_username as rejectUsername, reject_userid as rejectUserid, degree_id as degree_id,report_extra_degree.name as degreeName,
+        department.department_name as auditDeptName, a.is_dept_audit as isDeptAudit, a.project_audit_state as projectAuditState,task_group.name as groupName,a.group_id as groupId, a.custom_data as customData
+        ,u.name as projectAuditorName, a.project_auditor_id as projectAuditorId, a.overtime_hours as overtimeHours, a.custom_text as customText,a.evaluate as evaluate,a.report_auto_approve as reportAutoApprove
+        FROM report AS a
+        JOIN project AS b ON a.project_id=b.id
+        left join sub_project as d on d.id = a.sub_project_id
+        left join task on task.id = a.task_id
+        left join report_extra_degree on report_extra_degree.id = a.degree_id
+        left join department on department.department_id = a.audit_deptid
+        left join task_group on task_group.id = a.group_id
+        left join user u on u.id = a.project_auditor_id
+        left join user my on my.id = a.creator_id
+        WHERE a.task_id=#{taskId}
+        ORDER BY a.id desc
+    </select>
+
     <!--根据项目经理id,日期获取相关项目的全部报告信息-->
     <!--根据项目经理id,日期获取相关项目的全部报告信息-->
     <select id="getInchargeReportByDate" resultType="java.util.Map">
     <select id="getInchargeReportByDate" resultType="java.util.Map">
         SELECT a.id, a.project_id as projectId, b.project_name AS project, a.working_time AS time, a.content, a.state, a.time_type as timeType,
         SELECT a.id, a.project_id as projectId, b.project_name AS project, a.working_time AS time, a.content, a.state, a.time_type as timeType,

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

@@ -1479,5 +1479,8 @@
   "xuan-ze-ji-du": "Choose a quarter",
   "xuan-ze-ji-du": "Choose a quarter",
   "xuan-ze-nian": "Choose the Year",
   "xuan-ze-nian": "Choose the Year",
   "xuan-ze-nian-fen": "Choose the Month",
   "xuan-ze-nian-fen": "Choose the Month",
-  "zheng-shi-xiang-mu-gong-shi": "Official project hours"
+  "zheng-shi-xiang-mu-gong-shi": "Official project hours",
+  "lai-zi-ri-bao": "From Daily",
+  "tian-bao-ren": "Applicant",
+  "xiang-guan-ri-bao": "Related Daily News"
 }
 }

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

@@ -1479,5 +1479,8 @@
   "di-si-ji-du": "第四季度",
   "di-si-ji-du": "第四季度",
   "ge-fen-zu-yu-jie-duan-gong-shi-biao": "各分组与阶段工时表",
   "ge-fen-zu-yu-jie-duan-gong-shi-biao": "各分组与阶段工时表",
   "ge-fen-zu-jie-duan-gong-shi-biao": "各分组阶段工时表",
   "ge-fen-zu-jie-duan-gong-shi-biao": "各分组阶段工时表",
-  "di": "第"
+  "di": "第",
+  "lai-zi-ri-bao": "来自日报",
+  "tian-bao-ren": "填报人",
+  "xiang-guan-ri-bao": "相关日报"
 }
 }

+ 46 - 6
fhKeeper/formulahousekeeper/timesheet/src/views/awayOffice/awayOffice.vue

@@ -28,7 +28,7 @@
                     <template slot="title">
                     <template slot="title">
                         <i class="iconfont firerock-iconliucheng"></i>
                         <i class="iconfont firerock-iconliucheng"></i>
                         <span slot="title">{{ $t('businesstriApprovalProcess') }}</span>
                         <span slot="title">{{ $t('businesstriApprovalProcess') }}</span>
-                    </template>
+                    </template> 
                 </el-menu-item>
                 </el-menu-item>
             </el-menu>
             </el-menu>
         </el-col>
         </el-col>
@@ -333,6 +333,7 @@
                     <el-input style="float:left;" v-if="user.userNameNeedTranslate != 1" v-model="searchWord" class="input-with-select" :placeholder="$t('pleaseenterstaffsearch')" clearable="true" size="small">
                     <el-input style="float:left;" v-if="user.userNameNeedTranslate != 1" v-model="searchWord" class="input-with-select" :placeholder="$t('pleaseenterstaffsearch')" clearable="true" size="small">
                         <el-button slot="append" @click="statistical()" icon="el-icon-search"></el-button>
                         <el-button slot="append" @click="statistical()" icon="el-icon-search"></el-button>
                     </el-input>
                     </el-input>
+                    <selectCat v-if="user.userNameNeedTranslate == 1" :size="'small'" :widthStr="'240'" :subject="users" :subjectId="addForm.ownerId" :distinction="'11'" :disabled="false" @selectCal="selectCal" :clearable="true"></selectCat>
                 </div>
                 </div>
                 <div style="display: inline-block;width: 700px;margin-left: 100px">
                 <div style="display: inline-block;width: 700px;margin-left: 100px">
                     <span style="display: inline-block;margin: 0 15px 0 20px;color: rgb(96, 98, 102);">{{ $t('message.period') }}</span>
                     <span style="display: inline-block;margin: 0 15px 0 20px;color: rgb(96, 98, 102);">{{ $t('message.period') }}</span>
@@ -391,14 +392,30 @@
                 <el-col :span="6" >
                 <el-col :span="6" >
                     <el-scrollbar style="height:100%;border:1px solid #dddddd;margin-left:15px;" >
                     <el-scrollbar style="height:100%;border:1px solid #dddddd;margin-left:15px;" >
                         <div class="tree" :style="'height:'+ (tableHeight-120) + 'px'">
                         <div class="tree" :style="'height:'+ (tableHeight-120) + 'px'">
-                            <el-tree :data="sdata" :props="sdefaultProps" @node-click="handleNodeClick" accordion></el-tree>
+                            <el-tree :data="sdata" :props="sdefaultProps" @node-click="handleNodeClick" accordion>
+                                <!-- 添加试试看 -->
+                                <span class="custom-tree-node" slot-scope="{ node, data }">
+                                    <!-- <span>{{ node.label }}</span> -->
+                                    <span v-if="user.userNameNeedTranslate == '1'">
+                                        <ww-open-data type='departmentName' :openid='node.label'></ww-open-data>
+                                    </span>
+                                    <span v-else>
+                                        {{ node.label }}
+                                        <span v-if="false">{{data}}</span>
+                                    </span>
+                                </span>
+                            </el-tree>
                         </div>
                         </div>
                     </el-scrollbar>
                     </el-scrollbar>
                 </el-col>
                 </el-col>
                 <el-col :span="18" >
                 <el-col :span="18" >
                     <el-scrollbar style="height:100%;border:1px solid #dddddd;margin-right:20px;" >
                     <el-scrollbar style="height:100%;border:1px solid #dddddd;margin-right:20px;" >
                         <div class="tree" :style="'height:'+ (tableHeight-120) + 'px'">
                         <div class="tree" :style="'height:'+ (tableHeight-120) + 'px'">
-                            <div style="padding:5px;color:#333;" v-if="depData != null">{{ $t('setup') }} &lt;<span style="color:#20a0ff;">{{depData.label}}&gt;</span> {{ $t('approvalprocessforbusiness') }}
+                            <div style="padding:5px;color:#333;" v-if="depData != null">{{ $t('setup') }} &lt;<span style="color:#20a0ff;">
+                                <!-- {{depData.label}} -->
+                                <span v-if="user.userNameNeedTranslate != 1">{{depData.label}}</span>
+                                <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='departmentName' :openid='depData.label'></ww-open-data></span>
+                                &gt;</span> {{ $t('approvalprocessforbusiness') }}
                                 <el-tooltip effect="dark" v-if="depData != null && depData.children!=null" :content="$t('onlyapplicabletotheimmediatestaffofthecurrentdepartment')" placement="top-start">
                                 <el-tooltip effect="dark" v-if="depData != null && depData.children!=null" :content="$t('onlyapplicabletotheimmediatestaffofthecurrentdepartment')" placement="top-start">
                                     <i class="el-icon-question"></i>
                                     <i class="el-icon-question"></i>
                                 </el-tooltip>
                                 </el-tooltip>
@@ -410,9 +427,22 @@
                                 <icon class="iconfont firerock-iconInsertLine addNode" @click="showNodeDialog(0)"></icon>
                                 <icon class="iconfont firerock-iconInsertLine addNode" @click="showNodeDialog(0)"></icon>
                                 <icon class="iconfont firerock-iconright"></icon>
                                 <icon class="iconfont firerock-iconright"></icon>
                                 <span v-for="(item, index) in dataArray" :key="item.seq" >
                                 <span v-for="(item, index) in dataArray" :key="item.seq" >
-                                    <el-button type="primary" v-if="item.auditorType == 1" @click="editNodeDialog(index, item)">{{item.auditDeptName}}</el-button>
+                                    <!-- <el-button type="primary" v-if="item.auditorType == 1" @click="editNodeDialog(index, item)">{{item.auditDeptName}}</el-button> -->
+                                    
+                                    <!-- <el-button type="primary" v-if="item.auditorType == 2" @click="editNodeDialog(index, item)">{{item.userName}}</el-button> -->
+                                    <el-button type="primary" v-if="item.auditorType == 1 && user.userNameNeedTranslate == 1" @click="editNodeDialog(index, item)">
+                                        <ww-open-data type='departmentName' :openid='item.auditDeptName'></ww-open-data>
+                                    </el-button>
+                                    <el-button type="primary" v-if="item.auditorType == 2 && user.userNameNeedTranslate == 1" @click="editNodeDialog(index, item)">
+                                        <ww-open-data type='userName' :openid='item.userName'></ww-open-data>
+                                    </el-button>
                                     <el-button type="primary" v-if="item.auditorType == 0" >{{ $t('projectLeader') }}</el-button>
                                     <el-button type="primary" v-if="item.auditorType == 0" >{{ $t('projectLeader') }}</el-button>
-                                    <el-button type="primary" v-if="item.auditorType == 2" @click="editNodeDialog(index, item)">{{item.userName}}</el-button>
+                                    <el-button type="primary" v-if="item.auditorType == 1 && user.userNameNeedTranslate != 1" @click="editNodeDialog(index, item)">
+                                        {{item.auditDeptName}}
+                                    </el-button>
+                                    <el-button type="primary" v-if="item.auditorType == 2 && user.userNameNeedTranslate != 1" @click="editNodeDialog(index, item)">
+                                        {{item.userName}}
+                                    </el-button>
                                     <icon class="iconfont firerock-iconright"></icon>
                                     <icon class="iconfont firerock-iconright"></icon>
                                     <icon class="iconfont firerock-iconInsertLine addNode" @click="showNodeDialog(index+1)"></icon>
                                     <icon class="iconfont firerock-iconInsertLine addNode" @click="showNodeDialog(index+1)"></icon>
                                     <icon class="iconfont firerock-iconright"></icon>
                                     <icon class="iconfont firerock-iconright"></icon>
@@ -865,6 +895,7 @@ export default {
             curWorkflowList:{},
             curWorkflowList:{},
             denyReasonVisible : false,
             denyReasonVisible : false,
             auditLogList:[],
             auditLogList:[],
+            selectedAuuid: ''
         }
         }
     },
     },
     created(){
     created(){
@@ -896,11 +927,18 @@ export default {
                 this.billss(obj.other)
                 this.billss(obj.other)
             } else if(obj.distinction == '2') {
             } else if(obj.distinction == '2') {
                 this.ownerIdsId = obj.id
                 this.ownerIdsId = obj.id
+            } else if(obj.distinction == '11') {
+                if(obj.name != this.$t('defaultText.pleaseChoose')) {
+                this.keyword = obj.name
+                } else {
+                this.keyword = ''
+                }
+                this.statistical()
             }
             }
         },
         },
         //获取添加出差单时的审批流
         //获取添加出差单时的审批流
         getAuditWorkflow() {
         getAuditWorkflow() {
-            this.http.post('/audit-workflow-setting/get',{deptId: this.user.departmentId, type: 2},
+            this.http.post('/audit-workflow-setting/get',{userId: this.user.id, type: 2},
                 res => {
                 res => {
                 if(res.code == 'ok'){
                 if(res.code == 'ok'){
                     this.curWorkflowList = res.data;
                     this.curWorkflowList = res.data;
@@ -1749,6 +1787,7 @@ export default {
                     if (arr[i].children != null && arr[i].children.length>0) {
                     if (arr[i].children != null && arr[i].children.length>0) {
                         arr[i].children = this.changeArr(arr[i].children);
                         arr[i].children = this.changeArr(arr[i].children);
                     }
                     }
+                    arr[i].type = 'dep'
                     arr[i].id && (arr[i].value = arr[i].id);
                     arr[i].id && (arr[i].value = arr[i].id);
                     delete arr[i].id;
                     delete arr[i].id;
                 }
                 }
@@ -1800,6 +1839,7 @@ export default {
                     this.curUserId = item.userId;
                     this.curUserId = item.userId;
                     this.dialogVisible = true;
                     this.dialogVisible = true;
                     this.curDeptId = item.auditDeptId;
                     this.curDeptId = item.auditDeptId;
+                    this.selectedAuuid = item.userId || item.auditDeptId
                 } else {
                 } else {
                     this.$message({
                     this.$message({
                         message: res.msg,
                         message: res.msg,

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

@@ -330,6 +330,7 @@
               <el-input style="float:left;" v-if="user.userNameNeedTranslate != 1" v-model="keyword" class="input-with-select" :placeholder="$t('pleaseenterstaffsearch')" clearable="true" size="small">
               <el-input style="float:left;" v-if="user.userNameNeedTranslate != 1" v-model="keyword" class="input-with-select" :placeholder="$t('pleaseenterstaffsearch')" clearable="true" size="small">
                   <el-button slot="append" @click="statistical()" icon="el-icon-search"></el-button>
                   <el-button slot="append" @click="statistical()" icon="el-icon-search"></el-button>
               </el-input>
               </el-input>
+              <selectCat v-if="user.userNameNeedTranslate == 1" :size="'small'" :widthStr="'240'" :subject="users" :subjectId="addForm.ownerId" :distinction="'11'" :disabled="false" @selectCal="selectCal" :clearable="true"></selectCat>
             </div>
             </div>
             <div style="display: inline-block;width: 340px">
             <div style="display: inline-block;width: 340px">
               <span style="display: inline-block;margin: 0 15px 0 20px;color: rgb(96, 98, 102);">{{ $t('time.startDate') }}</span>
               <span style="display: inline-block;margin: 0 15px 0 20px;color: rgb(96, 98, 102);">{{ $t('time.startDate') }}</span>
@@ -980,7 +981,7 @@ export default {
     },
     },
     //获取添加请假单时的审批流
     //获取添加请假单时的审批流
     getAuditWorkflow() {
     getAuditWorkflow() {
-      this.http.post('/audit-workflow-setting/get',{deptId: this.user.departmentId, type: 1},
+      this.http.post('/audit-workflow-setting/get',{userId: this.user.id, type: 1},
         res => {
         res => {
           if(res.code == 'ok'){
           if(res.code == 'ok'){
             this.curWorkflowList = res.data;
             this.curWorkflowList = res.data;
@@ -2167,6 +2168,13 @@ export default {
       } else if(obj.distinction == '4') {
       } else if(obj.distinction == '4') {
         this.addForm.ownerId = obj.id
         this.addForm.ownerId = obj.id
         this.selts()
         this.selts()
+      } else if(obj.distinction == '11') {
+        if(obj.name != this.$t('defaultText.pleaseChoose')) {
+          this.keyword = obj.name
+        } else {
+          this.keyword = ''
+        }
+        this.statistical()
       }
       }
     },
     },
     vueCasader(obj) {
     vueCasader(obj) {

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

@@ -49,13 +49,13 @@
                         <el-link type="primary" :underline="false">{{ $t('viewmore') }}<i class="el-icon-arrow-down el-icon--right"></i></el-link>
                         <el-link type="primary" :underline="false">{{ $t('viewmore') }}<i class="el-icon-arrow-down el-icon--right"></i></el-link>
                         
                         
                         <el-dropdown-menu slot="dropdown">
                         <el-dropdown-menu slot="dropdown">
-                            <el-dropdown-item v-if="permissions.projectImport && user.userNameNeedTranslate != 1">
+                            <el-dropdown-item v-if="permissions.projectImport">
                                 <el-link type="primary" :underline="false" @click="importProjectBefore">{{ $t('importproject') }}</el-link>
                                 <el-link type="primary" :underline="false" @click="importProjectBefore">{{ $t('importproject') }}</el-link>
                                 <!-- <el-upload ref="upload" action="#" :limit="1" :http-request="importProject" :show-file-list="false">
                                 <!-- <el-upload ref="upload" action="#" :limit="1" :http-request="importProject" :show-file-list="false">
                                     <el-link type="primary" :underline="false" >{{ $t('importproject') }}</el-link>
                                     <el-link type="primary" :underline="false" >{{ $t('importproject') }}</el-link>
                                 </el-upload> -->
                                 </el-upload> -->
                             </el-dropdown-item>
                             </el-dropdown-item>
-                            <el-dropdown-item v-if="permissions.projectImport && user.userNameNeedTranslate != 1">
+                            <el-dropdown-item v-if="permissions.projectImport">
                                 <el-link type="primary" :underline="false" @click="downloadmb" v-if="user.company.packageCustomer == 1 || user.company.packageProvider == 1 || user.timeType.mainProjectState == 1 || user.companyId == '936'">{{ $t('Downloadthetemplate') }}</el-link>
                                 <el-link type="primary" :underline="false" @click="downloadmb" v-if="user.company.packageCustomer == 1 || user.company.packageProvider == 1 || user.timeType.mainProjectState == 1 || user.companyId == '936'">{{ $t('Downloadthetemplate') }}</el-link>
                                 <el-link type="primary" :underline="false" href="./upload/项目导入模板.xlsx" :download="$t('importtemplateproject') + '.xlsx'" v-else>{{ $t('Downloadthetemplate') }}</el-link>
                                 <el-link type="primary" :underline="false" href="./upload/项目导入模板.xlsx" :download="$t('importtemplateproject') + '.xlsx'" v-else>{{ $t('Downloadthetemplate') }}</el-link>
                             </el-dropdown-item>
                             </el-dropdown-item>
@@ -850,7 +850,7 @@
             <el-table :data="baseClfList" highlight-current-row  height="400" style="width: 100%;">
             <el-table :data="baseClfList" highlight-current-row  height="400" style="width: 100%;">
             <el-table-column type="index" width="60" :label="$t('headerTop.serialNumber')">
             <el-table-column type="index" width="60" :label="$t('headerTop.serialNumber')">
                 <template slot-scope="scope" >
                 <template slot-scope="scope" >
-                        {{scope.$index+1+(page-1)*size}}
+                        {{scope.$index+1}}
                     </template>
                     </template>
             </el-table-column>
             </el-table-column>
             <el-table-column prop="name" :label="$t('names')" ></el-table-column>
             <el-table-column prop="name" :label="$t('names')" ></el-table-column>

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

@@ -242,7 +242,7 @@
                         <!--列表-->
                         <!--列表-->
                         <el-table v-if="displayTable" :data="taskDataList" 
                         <el-table v-if="displayTable" :data="taskDataList" 
                         :header-cell-style="{'font-weight':'normal'}" border
                         :header-cell-style="{'font-weight':'normal'}" border
-                        highlight-current-row v-loading="listLoading" :height="tableHeight - 20" style="width: 100%;margin-top:10px;" @row-click="taskLineClick">
+                        highlight-current-row v-loading="listLoading" :height="tableHeight - 85" style="width: 100%;margin-top:10px;" @row-click="taskLineClick">
                             <el-table-column fixed :label="$t('wan-cheng')"  width="50">
                             <el-table-column fixed :label="$t('wan-cheng')"  width="50">
                                 <template slot-scope="scope">
                                 <template slot-scope="scope">
                                     <el-checkbox :disabled="scope.row.taskStatus==2" v-model="scope.row.isFinish" size="large" class="cb"  
                                     <el-checkbox :disabled="scope.row.taskStatus==2" v-model="scope.row.isFinish" size="large" class="cb"  
@@ -768,8 +768,7 @@
             <!-- 评论 -->
             <!-- 评论 -->
             <div class="remark" v-show="addForm.id != null">
             <div class="remark" v-show="addForm.id != null">
                 <span class="zh">
                 <span class="zh">
-                    
-                        <div class="player" v-if="critic.length > 0">
+                        <div class="player">
                             <p>{{ $t('participantin') }}</p>
                             <p>{{ $t('participantin') }}</p>
                             <div class="bj">
                             <div class="bj">
                                 <span  v-for="(pl, i) in critic" :key="i">
                                 <span  v-for="(pl, i) in critic" :key="i">
@@ -782,8 +781,11 @@
                             </div>
                             </div>
                         </div>
                         </div>
                     <div class="subject">
                     <div class="subject">
-                        <div class="sub-all">{{ $t('alldynamic') }}</div>
-                        <div class="sub-details" ref="main">
+                        <div class="sub-all">
+                            <div :class="dynamicTab ? 'subOn' : ''" @click="dynamicTab = true">{{ $t('alldynamic') }}</div>
+                            <div :class="dynamicTab ? '' : 'subOn'" @click="dynamicTab = false">{{ $t('xiang-guan-ri-bao') }}</div>
+                        </div>
+                        <div class="sub-details" ref="main" v-if="dynamicTab">
                             <ul class="infinite-list" v-infinite-scroll="load" ref="contRoll">
                             <ul class="infinite-list" v-infinite-scroll="load" ref="contRoll">
                                 <div style="width: 100%" v-if="commentList.length <= 0">
                                 <div style="width: 100%" v-if="commentList.length <= 0">
                                     <img src="../../assets/image/xiao.png" alt="">
                                     <img src="../../assets/image/xiao.png" alt="">
@@ -826,8 +828,133 @@
                                 </li>
                                 </li>
                             </ul>
                             </ul>
                         </div>
                         </div>
+
+                        <div class="Daily" v-if="!dynamicTab">
+                            <div class="one_daily_body DailyBody">
+                                <el-card shadow="never" v-for="(item2,index2) in dailyList" :key="index2" style="margin-bottom: 20px;">
+                                    <p>
+                                        {{ $t('tian-bao-ren') }}: <span v-if="user.userNameNeedTranslate != 1">{{item2.userName}}</span>
+                                        <span v-if="user.userNameNeedTranslate == 1">
+                                            <ww-open-data type='userName' :openid='item2.userName'></ww-open-data>
+                                        </span>
+                                        <span style="float: right;">{{item2.createDate}}</span>
+                                    </p>
+                                    <p>{{ $t('other.approvalStatus') }}:
+                                        <span v-if="user.company.packageEngineering == 0">
+                                            <span style="margin-left:15px;color:#DAA520;"  v-if="item2.state == 0">
+                                                <span v-if="item2.isDeptAudit==0">
+                                                    <span v-if="item2.projectAuditState==0">
+                                                        <!-- 待项目审核人 --> {{$t('other.waitForTheProjectReviewer')}}
+                                                        <span v-if="item2.projectAuditorName != null">(
+                                                            <span v-if="user.userNameNeedTranslate == '1'">
+                                                                <ww-open-data type='userName' :openid='item2.projectAuditorName'></ww-open-data>
+                                                            </span>
+                                                            <span v-if="user.userNameNeedTranslate != '1'">{{item2.projectAuditorName}}</span>
+                                                            )</span> 
+                                                        <!-- 审核 --> {{$t('other.audit')}}
+                                                    </span>
+                                                    <span style="color:#32CD32;" v-else-if="item2.projectAuditState==1">
+                                                        <!-- 项目审核人 --> {{$t('other.projectAuditor')}}
+                                                        <span v-if="item2.projectAuditorName != null">(
+                                                            <!-- {{item2.projectAuditorName}} -->
+                                                            <span v-if="user.userNameNeedTranslate == '1'">
+                                                                <ww-open-data type='userName' :openid='item2.projectAuditorName'></ww-open-data>
+                                                            </span>
+                                                            <span v-if="user.userNameNeedTranslate != '1'">{{item2.projectAuditorName}}</span>
+                                                            )</span>
+                                                        <!-- 审核通过 --> {{$t('state.approved')}}
+                                                    </span>
+                                                </span>
+                                                <span v-else-if="item2.isDeptAudit==1">
+                                                    ({{$t('other.await')}}
+                                                    <span v-if="user.userNameNeedTranslate == '1'">
+                                                        <ww-open-data type='departmentName' :openid='item2.auditDeptName'></ww-open-data>
+                                                    </span>
+                                                    <span v-if="user.userNameNeedTranslate != '1'">{{item2.auditDeptName}}</span>
+                                                    {{$t('other.audit')}})
+                                                </span>
+                                                </span> 
+                                            <span style="margin-left:15px;color:#DAA520;" v-else-if="item2.state == -1">{{$t('other.importWaitingForReview')}}</span>
+                                            <span style="margin-left:15px;color:#32CD32;" v-else-if="item2.state == 1">{{$t('state.alreadyPassed')}}
+                                                <span style="color:#c7e944" v-if="item2.reportAutoApprove == 1">{{$t('other.automaticReview')}}</span>
+                                            </span>
+                                            
+                                            <span style="margin-left:15px;color:#FF0000;" v-else-if="item2.state == 2">{{$t('state.rejected')}} {{$t('other.reason')}}:{{item2.rejectReason}}</span>
+                                            <span style="margin-left:15px;color:#FF0000;" v-else-if="item2.state == 3">{{$t('state.waitingsubmit')}}</span>
+                                        </span>
+                                        <span v-if="user.company.packageEngineering == 1">
+                                            <span style="margin-left:15px;color:#DAA520;" v-if="item2.state == -1">{{$t('other.importWaitingForReview')}}</span>
+                                            <span style="margin-left:15px;color:#DAA520;" v-if="item2.state == 0 && item2.departmentAuditState == -1">{{$t('other.waitingForProfessionalReview')}}</span>
+                                            <span style="margin-left:15px;color:#DAA520;" v-if="item2.state == 0 && item2.departmentAuditState == 0">{{$t('other.waitingForDepartmentReview')}}</span>
+                                            <span style="margin-left:15px;color:#DAA520;" v-if="item2.state == 0 && item2.departmentAuditState == 1">{{$t('other.waitForTheProjectReviewer')}}<span v-if="item2.projectAuditorName != null">
+                                                (
+                                                    <span v-if="user.userNameNeedTranslate != 1">
+                                                        {{item2.projectAuditorName}}
+                                                    </span>
+                                                    <span v-if="user.userNameNeedTranslate == 1">
+                                                        <ww-open-data type='userName' :openid='item2.projectAuditorName'></ww-open-data>
+                                                    </span>
+                                                )
+                                            </span>{{$t('other.audit')}}</span>
+                                            <span style="margin-left:15px;color:#32CD32;" v-else-if="item2.state == 1">{{$t('state.alreadyPassed')}}</span>
+                                            <span style="margin-left:15px;color:#FF0000;" v-else-if="item2.state == 2">{{$t('state.rejected')}} {{$t('other.reason')}}:{{item2.rejectReason}}</span>
+                                            <span style="margin-left:15px;color:#FF0000;" v-else-if="item2.state == 3">{{$t('state.waitingsubmit')}}</span>
+                                        </span>
+                                    </p>
+                                    <p v-if="user.timeType.customDegreeActive==1 && item2.degree_id != null && item2.degree_id != -1">{{user.timeType.customDegreeName}}:{{item2.degreeName}}</p>
+                                    <p v-if="user.timeType.customDataActive==1">{{user.timeType.customDataName}}:{{item2.customData}}</p>
+                                    <!-- 自定义日报文本 -->
+                                    <p v-if="user.timeType.customTextActive==1">{{user.timeType.customTextName}}:{{item2.customText}}</p>
+                                    <p v-if="user.company.packageEngineering == 1">
+                                        {{$t('other.professionalProgress')}}:
+                                        <span style="margin-right:10px;" v-for="progressItem in item2.professionProgress" :key="progressItem.id">{{progressItem.professionName}}({{progressItem.progress}}%) 
+                                            <el-tooltip v-if="progressItem.auditState == 0"  :content="$t('state.WaitingAudit')" effect="light" placement="top">
+                                            <i class="iconfont firerock-icondaibandengdaishenhe"></i>
+                                            </el-tooltip>
+                                            <el-tooltip v-if="progressItem.auditState == 1" :content="$t('state.alreadyPassed')" effect="light" placement="top">
+                                            <i  class="iconfont firerock-iconshenhetongguo"></i>
+                                            </el-tooltip>
+                                            <el-tooltip v-if="progressItem.auditState == 2" :content="$t('state.notThrough')" effect="light" placement="top">
+                                            <i  class="iconfont firerock-iconshenhebohui"></i>
+                                            </el-tooltip>
+                                            </span>
+                                    </p>
+                                    <div v-if="item2.multiWorktime==0">
+                                    <p style="display: inline-block;">{{$t('time.duration')}}:
+                                        <span v-if="item2.reportTimeType == 0" style="margin-right:10px;">{{typeList[item2.timeType]}}</span>
+                                        <span v-if="item2.reportTimeType == 2" style="margin-right:10px;">{{item2.startTime+'-'+item2.endTime}}</span>
+                                    {{item2.time.toFixed(1)}}h  
+                                    <el-tag type="danger" size="mini" style="margin-left: 65px" v-if="item2.isOvertime === 1">{{$t('other.WorkOvertime')}}<span v-if="item2.overtimeHours">{{item2.overtimeHours.toFixed(1)}}h</span></el-tag>
+                                    </p>
+                                    <p>{{$t('other.matters')}}:<span v-html="item2.content"></span></p>
+                                    </div>
+                                    <div v-if="item2.multiWorktime==1" >
+                                        <p>{{$t('other.projectDuration')}}:{{item2.time.toFixed(1)}}h  <el-tag type="danger" size="mini" style="margin-left: 65px" v-if="item2.isOvertime === 1">{{ $t('other.WorkOvertime') }}<span v-if="item2.overtimeHours">{{item2.overtimeHours.toFixed(1)}}h</span></el-tag></p>
+                                        <div v-for="(timeItem, tIndex) in item2.worktimeList" :key="tIndex"
+                                            style="border: 0.5px #ddd solid;margin-bottom:5px;padding:5px;">
+                                            <p style="display: inline-block;">{{$t('time.duration')}}:
+                                                <span v-if="item2.reportTimeType == 2" style="margin-right:10px;">{{timeItem.startTime+'-'+timeItem.endTime}}</span>
+                                            {{timeItem.time.toFixed(1)}}h  
+                                            </p>
+                                            <p>{{$t('other.matters')}}:<span v-html="timeItem.content"></span></p>
+                                        </div>
+                                    </div>
+                                    <p v-if="item2.state == 1 && user.timeType.needEvaluate == 1">{{$t('other.evaluation')}}:<span v-html="item2.evaluate"></span></p>
+                                    
+                                    <!--照片的显示 -->
+                                    <p v-if="item2.pics != null && item2.pics.length > 0"> 
+                                        <el-image v-for="(pic, index) in item2.pics" :key="index"
+                                            style="width: 100px; height: 100px; margin-right:10px;"
+                                            :src="pic" 
+                                            :preview-src-list="item2.pics">
+                                        </el-image>
+                                    </p>
+                                </el-card>
+                            </div>
+                        </div>
+
                     </div>
                     </div>
-                    <div class="issue">
+                    <div class="issue" v-if="dynamicTab">
                         <!-- <el-input type="textarea" class="textareays" label-width="100%" label-height="140px"></el-input> -->
                         <!-- <el-input type="textarea" class="textareays" label-width="100%" label-height="140px"></el-input> -->
                         <div class="issue_fixation">
                         <div class="issue_fixation">
                             <div class="inputDeep"><el-input
                             <div class="inputDeep"><el-input
@@ -1307,7 +1434,9 @@
                 
                 
                 taskListPage: 1,
                 taskListPage: 1,
                 taskListSize: 20,
                 taskListSize: 20,
-                taskListTotal: 0
+                taskListTotal: 0,
+                dynamicTab: true,
+                dailyList: []
             };
             };
             
             
         },
         },
@@ -1317,6 +1446,29 @@
             }
             }
         },
         },
         methods: {
         methods: {
+            // 获取来自日报
+            getDailyList(id) {
+                this.http.post('/report/getTaskReportList',{ 
+                    // taskId: '22131'
+                    taskId: id
+                },
+                res => {
+                    if (res.code == "ok") {
+                        this.dailyList = res.data
+                    } else {
+                        this.$message({
+                            message: res.msg,
+                            type: "error"
+                        });
+                    }
+                },
+                error => {
+                    this.$message({
+                        message: error,
+                        type: "error"
+                    });
+                });
+            },
             restrictNumber(targetId) {
             restrictNumber(targetId) {
                 let inpu = document.getElementById(targetId)
                 let inpu = document.getElementById(targetId)
                 inpu.value = inpu.value.replace(/[^\d.]/g, "");  //仅保留数字和"."
                 inpu.value = inpu.value.replace(/[^\d.]/g, "");  //仅保留数字和"."
@@ -2472,6 +2624,7 @@
                 this.getTaskProgressList(task.id); // 获取任务进展列表 
                 this.getTaskProgressList(task.id); // 获取任务进展列表 
                 this.getUsers(); // 获取名单数据
                 this.getUsers(); // 获取名单数据
                 this.gain(task); // 获取评论列表
                 this.gain(task); // 获取评论列表
+                this.getDailyList(task.id) // 获取来自日报
                 this.getRelationTaskList(1, task.id)
                 this.getRelationTaskList(1, task.id)
                 this.getTaskFileList(1,task.id)
                 this.getTaskFileList(1,task.id)
             },  
             },  
@@ -2540,6 +2693,7 @@
                     sk.push(e.userName)
                     sk.push(e.userName)
                 })
                 })
                 this.critic = new Set(sk)
                 this.critic = new Set(sk)
+                console.log(this.critic, '参与人',this.critic.length)
             },
             },
 
 
             // 点击发布
             // 点击发布
@@ -3403,6 +3557,30 @@
     };
     };
 </script>
 </script>
 
 
+<style lang="scss" scoped>
+    .Daily p {
+        margin: 0 !important;
+        padding: 0 0 10px 0 !important;
+    }
+    .sub-all {
+        div {
+            display: inline-block;
+            padding: 0 20px;
+            font-size: 20px;
+            cursor: pointer;
+        }
+        .subOn {
+            color: #66b1ff;
+        }
+    }
+    .DailyBody {
+        margin: 0 20px;
+    }
+    .Daily{
+        height: 120%;
+        overflow: auto;
+    }
+</style>
 
 
 <style >
 <style >
 .taskCardCircleBox{
 .taskCardCircleBox{
@@ -3916,6 +4094,8 @@ overflow: auto;
 }
 }
 .integrity {
 .integrity {
     padding: 15px;
     padding: 15px;
+    overflow-y: auto;
+    max-height: 300px;
 }
 }
 .write {
 .write {
     float: right;
     float: right;

+ 182 - 4
fhKeeper/formulahousekeeper/timesheet/src/views/task/list.vue

@@ -432,8 +432,11 @@
                         </div>
                         </div>
                     <!-- </span> -->
                     <!-- </span> -->
                     <div class="subject">
                     <div class="subject">
-                        <div class="sub-all">{{ $t('alldynamic') }}</div>
-                        <div class="sub-details" ref="main">
+                        <div class="sub-all">
+                            <div :class="dynamicTab ? 'subOn' : ''" @click="dynamicTab = true">{{ $t('alldynamic') }}</div>
+                            <div :class="dynamicTab ? '' : 'subOn'" @click="dynamicTab = false">{{ $t('xiang-guan-ri-bao') }}</div>
+                        </div>
+                        <div class="sub-details" ref="main" v-if="dynamicTab">
                             <ul class="infinite-list" v-infinite-scroll="load" ref="contRoll">
                             <ul class="infinite-list" v-infinite-scroll="load" ref="contRoll">
                                 <div style="width: 100%" v-if="commentList.length <= 0">
                                 <div style="width: 100%" v-if="commentList.length <= 0">
                                     <img src="../../assets/image/xiao.png" alt="">
                                     <img src="../../assets/image/xiao.png" alt="">
@@ -470,8 +473,132 @@
                                 </li>
                                 </li>
                             </ul>
                             </ul>
                         </div>
                         </div>
+
+                        <div class="Daily" v-if="!dynamicTab">
+                            <div class="one_daily_body DailyBody">
+                                <el-card shadow="never" v-for="(item2,index2) in dailyList" :key="index2" style="margin-bottom: 20px;">
+                                    <p>
+                                        {{ $t('tian-bao-ren') }}: <span v-if="user.userNameNeedTranslate != 1">{{item2.userName}}</span>
+                                        <span v-if="user.userNameNeedTranslate == 1">
+                                            <ww-open-data type='userName' :openid='item2.userName'></ww-open-data>
+                                        </span>
+                                        <span style="float: right;">{{item2.createDate}}</span>
+                                    </p>
+                                    <p>{{ $t('other.approvalStatus') }}:
+                                        <span v-if="user.company.packageEngineering == 0">
+                                            <span style="margin-left:15px;color:#DAA520;"  v-if="item2.state == 0">
+                                                <span v-if="item2.isDeptAudit==0">
+                                                    <span v-if="item2.projectAuditState==0">
+                                                        <!-- 待项目审核人 --> {{$t('other.waitForTheProjectReviewer')}}
+                                                        <span v-if="item2.projectAuditorName != null">(
+                                                            <span v-if="user.userNameNeedTranslate == '1'">
+                                                                <ww-open-data type='userName' :openid='item2.projectAuditorName'></ww-open-data>
+                                                            </span>
+                                                            <span v-if="user.userNameNeedTranslate != '1'">{{item2.projectAuditorName}}</span>
+                                                            )</span> 
+                                                        <!-- 审核 --> {{$t('other.audit')}}
+                                                    </span>
+                                                    <span style="color:#32CD32;" v-else-if="item2.projectAuditState==1">
+                                                        <!-- 项目审核人 --> {{$t('other.projectAuditor')}}
+                                                        <span v-if="item2.projectAuditorName != null">(
+                                                            <!-- {{item2.projectAuditorName}} -->
+                                                            <span v-if="user.userNameNeedTranslate == '1'">
+                                                                <ww-open-data type='userName' :openid='item2.projectAuditorName'></ww-open-data>
+                                                            </span>
+                                                            <span v-if="user.userNameNeedTranslate != '1'">{{item2.projectAuditorName}}</span>
+                                                            )</span>
+                                                        <!-- 审核通过 --> {{$t('state.approved')}}
+                                                    </span>
+                                                </span>
+                                                <span v-else-if="item2.isDeptAudit==1">
+                                                    ({{$t('other.await')}}
+                                                    <span v-if="user.userNameNeedTranslate == '1'">
+                                                        <ww-open-data type='departmentName' :openid='item2.auditDeptName'></ww-open-data>
+                                                    </span>
+                                                    <span v-if="user.userNameNeedTranslate != '1'">{{item2.auditDeptName}}</span>
+                                                    {{$t('other.audit')}})
+                                                </span>
+                                                </span> 
+                                            <span style="margin-left:15px;color:#DAA520;" v-else-if="item2.state == -1">{{$t('other.importWaitingForReview')}}</span>
+                                            <span style="margin-left:15px;color:#32CD32;" v-else-if="item2.state == 1">{{$t('state.alreadyPassed')}}
+                                                <span style="color:#c7e944" v-if="item2.reportAutoApprove == 1">{{$t('other.automaticReview')}}</span>
+                                            </span>
+                                            
+                                            <span style="margin-left:15px;color:#FF0000;" v-else-if="item2.state == 2">{{$t('state.rejected')}} {{$t('other.reason')}}:{{item2.rejectReason}}</span>
+                                            <span style="margin-left:15px;color:#FF0000;" v-else-if="item2.state == 3">{{$t('state.waitingsubmit')}}</span>
+                                        </span>
+                                        <span v-if="user.company.packageEngineering == 1">
+                                            <span style="margin-left:15px;color:#DAA520;" v-if="item2.state == -1">{{$t('other.importWaitingForReview')}}</span>
+                                            <span style="margin-left:15px;color:#DAA520;" v-if="item2.state == 0 && item2.departmentAuditState == -1">{{$t('other.waitingForProfessionalReview')}}</span>
+                                            <span style="margin-left:15px;color:#DAA520;" v-if="item2.state == 0 && item2.departmentAuditState == 0">{{$t('other.waitingForDepartmentReview')}}</span>
+                                            <span style="margin-left:15px;color:#DAA520;" v-if="item2.state == 0 && item2.departmentAuditState == 1">{{$t('other.waitForTheProjectReviewer')}}<span v-if="item2.projectAuditorName != null">
+                                                (
+                                                    <span v-if="user.userNameNeedTranslate != 1">
+                                                        {{item2.projectAuditorName}}
+                                                    </span>
+                                                    <span v-if="user.userNameNeedTranslate == 1">
+                                                        <ww-open-data type='userName' :openid='item2.projectAuditorName'></ww-open-data>
+                                                    </span>
+                                                )
+                                            </span>{{$t('other.audit')}}</span>
+                                            <span style="margin-left:15px;color:#32CD32;" v-else-if="item2.state == 1">{{$t('state.alreadyPassed')}}</span>
+                                            <span style="margin-left:15px;color:#FF0000;" v-else-if="item2.state == 2">{{$t('state.rejected')}} {{$t('other.reason')}}:{{item2.rejectReason}}</span>
+                                            <span style="margin-left:15px;color:#FF0000;" v-else-if="item2.state == 3">{{$t('state.waitingsubmit')}}</span>
+                                        </span>
+                                    </p>
+                                    <p v-if="user.timeType.customDegreeActive==1 && item2.degree_id != null && item2.degree_id != -1">{{user.timeType.customDegreeName}}:{{item2.degreeName}}</p>
+                                    <p v-if="user.timeType.customDataActive==1">{{user.timeType.customDataName}}:{{item2.customData}}</p>
+                                    <!-- 自定义日报文本 -->
+                                    <p v-if="user.timeType.customTextActive==1">{{user.timeType.customTextName}}:{{item2.customText}}</p>
+                                    <p v-if="user.company.packageEngineering == 1">
+                                        {{$t('other.professionalProgress')}}:
+                                        <span style="margin-right:10px;" v-for="progressItem in item2.professionProgress" :key="progressItem.id">{{progressItem.professionName}}({{progressItem.progress}}%) 
+                                            <el-tooltip v-if="progressItem.auditState == 0"  :content="$t('state.WaitingAudit')" effect="light" placement="top">
+                                            <i class="iconfont firerock-icondaibandengdaishenhe"></i>
+                                            </el-tooltip>
+                                            <el-tooltip v-if="progressItem.auditState == 1" :content="$t('state.alreadyPassed')" effect="light" placement="top">
+                                            <i  class="iconfont firerock-iconshenhetongguo"></i>
+                                            </el-tooltip>
+                                            <el-tooltip v-if="progressItem.auditState == 2" :content="$t('state.notThrough')" effect="light" placement="top">
+                                            <i  class="iconfont firerock-iconshenhebohui"></i>
+                                            </el-tooltip>
+                                            </span>
+                                    </p>
+                                    <div v-if="item2.multiWorktime==0">
+                                    <p style="display: inline-block;">{{$t('time.duration')}}:
+                                        <span v-if="item2.reportTimeType == 0" style="margin-right:10px;">{{typeList[item2.timeType]}}</span>
+                                        <span v-if="item2.reportTimeType == 2" style="margin-right:10px;">{{item2.startTime+'-'+item2.endTime}}</span>
+                                    {{item2.time.toFixed(1)}}h  
+                                    <el-tag type="danger" size="mini" style="margin-left: 65px" v-if="item2.isOvertime === 1">{{$t('other.WorkOvertime')}}<span v-if="item2.overtimeHours">{{item2.overtimeHours.toFixed(1)}}h</span></el-tag>
+                                    </p>
+                                    <p>{{$t('other.matters')}}:<span v-html="item2.content"></span></p>
+                                    </div>
+                                    <div v-if="item2.multiWorktime==1" >
+                                        <p>{{$t('other.projectDuration')}}:{{item2.time.toFixed(1)}}h  <el-tag type="danger" size="mini" style="margin-left: 65px" v-if="item2.isOvertime === 1">{{ $t('other.WorkOvertime') }}<span v-if="item2.overtimeHours">{{item2.overtimeHours.toFixed(1)}}h</span></el-tag></p>
+                                        <div v-for="(timeItem, tIndex) in item2.worktimeList" :key="tIndex"
+                                            style="border: 0.5px #ddd solid;margin-bottom:5px;padding:5px;">
+                                            <p style="display: inline-block;">{{$t('time.duration')}}:
+                                                <span v-if="item2.reportTimeType == 2" style="margin-right:10px;">{{timeItem.startTime+'-'+timeItem.endTime}}</span>
+                                            {{timeItem.time.toFixed(1)}}h  
+                                            </p>
+                                            <p>{{$t('other.matters')}}:<span v-html="timeItem.content"></span></p>
+                                        </div>
+                                    </div>
+                                    <p v-if="item2.state == 1 && user.timeType.needEvaluate == 1">{{$t('other.evaluation')}}:<span v-html="item2.evaluate"></span></p>
+                                    
+                                    <!--照片的显示 -->
+                                    <p v-if="item2.pics != null && item2.pics.length > 0"> 
+                                        <el-image v-for="(pic, index) in item2.pics" :key="index"
+                                            style="width: 100px; height: 100px; margin-right:10px;"
+                                            :src="pic" 
+                                            :preview-src-list="item2.pics">
+                                        </el-image>
+                                    </p>
+                                </el-card>
+                            </div>
+                        </div>
                     </div>
                     </div>
-                    <div class="issue">
+                    <div class="issue" v-if="dynamicTab">
                         <!-- <el-input type="textarea" class="textareays" label-width="100%" label-height="140px"></el-input> -->
                         <!-- <el-input type="textarea" class="textareays" label-width="100%" label-height="140px"></el-input> -->
                         <div class="issue_fixation">
                         <div class="issue_fixation">
                             <div class="inputDeep"><el-input
                             <div class="inputDeep"><el-input
@@ -804,10 +931,35 @@ import { error } from 'dingtalk-jsapi';
                 groupName: '',
                 groupName: '',
                 groupNameList: [],
                 groupNameList: [],
                 departmentList: [],
                 departmentList: [],
-                deptId: []
+                deptId: [],
+                dynamicTab: true,
+                dailyList: []
             };
             };
         },
         },
         methods: {
         methods: {
+            // 获取来自日报
+            getDailyList(id) {
+                this.http.post('/report/getTaskReportList',{ 
+                    // taskId: '22131'
+                    taskId: id
+                },
+                res => {
+                    if (res.code == "ok") {
+                        this.dailyList = res.data
+                    } else {
+                        this.$message({
+                            message: res.msg,
+                            type: "error"
+                        });
+                    }
+                },
+                error => {
+                    this.$message({
+                        message: error,
+                        type: "error"
+                    });
+                });
+            },
             judgedate(itemD){
             judgedate(itemD){
                 let nowdate = new Date()
                 let nowdate = new Date()
                 let idate = new Date(itemD + " 23:59:59")
                 let idate = new Date(itemD + " 23:59:59")
@@ -1248,6 +1400,8 @@ import { error } from 'dingtalk-jsapi';
                 this.getTaskProgressList(task.id); // 获取任务进展列表 
                 this.getTaskProgressList(task.id); // 获取任务进展列表 
                 this.getUsers(); // 获取名单数据
                 this.getUsers(); // 获取名单数据
                 this.gain(task); // 获取评论列表
                 this.gain(task); // 获取评论列表
+                this.dynamicTab = true
+                this.getDailyList(task.id) // 获取来自日报
                 // this.getStageList()
                 // this.getStageList()
             }, 
             }, 
             addExecutorLine() {
             addExecutorLine() {
@@ -1819,6 +1973,7 @@ import { error } from 'dingtalk-jsapi';
         mounted() {
         mounted() {
             this.getList();
             this.getList();
             this.getUsers();
             this.getUsers();
+            // this.getDailyList()
             if(this.user.timeType.projectWithDept) {
             if(this.user.timeType.projectWithDept) {
                 this.getDepartmentList()
                 this.getDepartmentList()
             }
             }
@@ -1830,6 +1985,29 @@ import { error } from 'dingtalk-jsapi';
 </script>
 </script>
 
 
 <style lang="scss" scoped>
 <style lang="scss" scoped>
+    .Daily p {
+        margin: 0 !important;
+        padding: 0 0 10px 0 !important;
+    }
+    .sub-all {
+        // display: flex;
+        div {
+            display: inline-block;
+            padding: 0 20px;
+            font-size: 20px;
+            cursor: pointer;
+        }
+        .subOn {
+            color: #66b1ff;
+        }
+    }
+    .DailyBody {
+        margin: 0 20px;
+    }
+    .Daily{
+        height: 120%;
+        overflow: auto;
+    }
 // .classification {
 // .classification {
 //     width: 120px;
 //     width: 120px;
 //     // height: 100%;
 //     // height: 100%;

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

@@ -114,8 +114,10 @@
                         <el-link type="primary" :underline="false" @click="syncMembByCardTime">{{ $t('associateenterprisemicroidentity') }}</el-link>
                         <el-link type="primary" :underline="false" @click="syncMembByCardTime">{{ $t('associateenterprisemicroidentity') }}</el-link>
                     </el-form-item>
                     </el-form-item>
                     <el-form-item style="float:right;" v-if="user.corpwxUserid != null && permissions.structureImport && user.companyId!=469">
                     <el-form-item style="float:right;" v-if="user.corpwxUserid != null && permissions.structureImport && user.companyId!=469">
+                        <!-- <el-link type="primary" v-if="user.userNameNeedTranslate != '1'" :underline="false" @click="syncWithCorpWxDayload">{{ $t('synchronizetheenterprisemicrodirectory') }}</el-link>
+                        <el-link type="primary" v-if="user.userNameNeedTranslate == '1'" :underline="false" @click="newSyncWithCorpWx">{{ $t('synchronizetheenterprisemicrodirectory') }}</el-link> -->
                         <el-link type="primary" v-if="user.userNameNeedTranslate != '1'" :underline="false" @click="syncWithCorpWx">{{ $t('synchronizetheenterprisemicrodirectory') }}</el-link>
                         <el-link type="primary" v-if="user.userNameNeedTranslate != '1'" :underline="false" @click="syncWithCorpWx">{{ $t('synchronizetheenterprisemicrodirectory') }}</el-link>
-                        <el-link type="primary" v-if="user.userNameNeedTranslate == '1'" :underline="false" @click="newSyncWithCorpWx">{{ $t('synchronizetheenterprisemicrodirectory') }}</el-link>
+                        <el-link type="primary" v-if="user.userNameNeedTranslate == '1'" :underline="false" @click="newSyncWithCorpWxDayload = true">{{ $t('synchronizetheenterprisemicrodirectory') }}</el-link>
                     </el-form-item>
                     </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">
                         <el-link type="primary" :underline="false" @click="syncWithCorpDingding">{{ $t('synchronizetheaddressbook') }}</el-link>
                         <el-link type="primary" :underline="false" @click="syncWithCorpDingding">{{ $t('synchronizetheaddressbook') }}</el-link>
@@ -723,6 +725,15 @@
               <el-col :span="18">{{recordMsg.msg}}</el-col>
               <el-col :span="18">{{recordMsg.msg}}</el-col>
             </el-row>
             </el-row>
         </el-dialog>
         </el-dialog>
+        <el-dialog :title="$t('synchronizetheenterprisemicrodirectory')" :visible.sync="dialogVisible" width="400px" :before-close="handleClose">
+        <span>
+          同步前请联系企业微信管理员检查应用授权的可见范围 <br/>
+          路径:管理企业-应用管理-工时管家-可见范围
+        </span>
+        <span slot="footer" class="dialog-footer">
+          <el-button type="primary" @click="newSyncWithCorpWx">开始同步</el-button>
+        </span>
+      </el-dialog>
     </div>
     </div>
   </div>
   </div>
 </template>
 </template>
@@ -1006,7 +1017,8 @@ export default {
       insertFormPlates: [],
       insertFormPlates: [],
       saveBtnLoading: false,
       saveBtnLoading: false,
       onlyDirect: false,
       onlyDirect: false,
-      nextCursor: ''
+      nextCursor: '',
+      newSyncWithCorpWxDayload: false
     };
     };
   },
   },
   filters: {
   filters: {

+ 8 - 2
fhKeeper/formulahousekeeper/timesheet_h5/src/views/review/department_list.vue

@@ -5,8 +5,8 @@
             <van-skeleton  v-for="(item,index) in report" :key="index" title avatar :row="3" :loading="false">
             <van-skeleton  v-for="(item,index) in report" :key="index" title avatar :row="3" :loading="false">
                 <van-panel class="one_report" :title="item.name" status="待部门审核">
                 <van-panel class="one_report" :title="item.name" status="待部门审核">
                     <template #header>
                     <template #header>
-                        <span v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='userName' :openid='item.name'></ww-open-data></span>
-                        <span v-else>{{item.name}}</span>
+                        <span class="report_name" v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='userName' :openid='item.name'></ww-open-data></span>
+                        <span class="report_name" v-else>{{item.name}}</span>
                     </template>
                     </template>
                     <div class="form_text">
                     <div class="form_text">
                         <span style="margin-left:5px;">工作日期: {{item.dateStr}}</span>
                         <span style="margin-left:5px;">工作日期: {{item.dateStr}}</span>
@@ -226,6 +226,12 @@
     .one_report {
     .one_report {
         margin-bottom: 15px;
         margin-bottom: 15px;
         font-size:14px;
         font-size:14px;
+        .report_name{
+            padding-top: .26667rem;
+            margin-left: 0.32rem;
+            padding-left: 5px;
+            display: block;
+        }
     }
     }
 
 
     .form_text {
     .form_text {

+ 8 - 2
fhKeeper/formulahousekeeper/timesheet_h5/src/views/review/profession_list.vue

@@ -6,8 +6,8 @@
             <van-skeleton  v-for="(item,index) in report" :key="index" title avatar :row="3" :loading="false">
             <van-skeleton  v-for="(item,index) in report" :key="index" title avatar :row="3" :loading="false">
                 <van-panel class="one_report" :title="item.name" status="待专业审核">
                 <van-panel class="one_report" :title="item.name" status="待专业审核">
                     <template #header>
                     <template #header>
-                        <span v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='userName' :openid='item.name'></ww-open-data></span>
-                        <span v-else>{{item.name}}</span>
+                        <span class="report_name" v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='userName' :openid='item.name'></ww-open-data></span>
+                        <span class="report_name" v-else>{{item.name}}</span>
                     </template>
                     </template>
                     <div class="form_text">
                     <div class="form_text">
                         <span style="margin-left:5px;">工作日期: {{item.dateStr}}</span>
                         <span style="margin-left:5px;">工作日期: {{item.dateStr}}</span>
@@ -223,6 +223,12 @@
     .one_report {
     .one_report {
         margin-bottom: 15px;
         margin-bottom: 15px;
         font-size:14px;
         font-size:14px;
+        .report_name{
+            padding-top: .26667rem;
+            margin-left: 0.32rem;
+            padding-left: 5px;
+            display: block;
+        }
     }
     }
 
 
     .form_text {
     .form_text {