فهرست منبع

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

seyanew 2 روز پیش
والد
کامیت
29db43767b
15فایلهای تغییر یافته به همراه878 افزوده شده و 506 حذف شده
  1. 34 0
      fhKeeper/formulahousekeeper/management-platform-mld/src/main/java/com/management/platform/controller/ProjectController.java
  2. 4 0
      fhKeeper/formulahousekeeper/management-platform-mld/src/main/java/com/management/platform/service/ProjectService.java
  3. 228 79
      fhKeeper/formulahousekeeper/management-platform-mld/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  4. 57 6
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java
  5. 1 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java
  6. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ErpOrderInfoServiceImpl.java
  7. 9 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  8. 1 35
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/DataCollectTask.java
  9. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/i18n/zh.json
  10. 295 9
      fhKeeper/formulahousekeeper/timesheet/src/views/settings/timetype.vue
  11. 5 6
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue
  12. 18 4
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/weeklyCustomization.vue
  13. 8 0
      fhKeeper/formulahousekeeper/timesheet_h5/src/router/index.js
  14. 156 66
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/task/index.vue
  15. 59 297
      fhKeeper/formulahousekeeper/timesheet_mld/src/views/project/info.vue

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

@@ -221,6 +221,40 @@ public class ProjectController {
         ,deptIds,leaderIds);
     }
 
+    @RequestMapping("/editProjectMembs")
+    public HttpRespMsg editProjectMembs(Integer id, String[] userId, String inchargerId,
+                                   String[] leaderIds) {
+        try {
+            return projectService.editProjectMembs(id, userId, inchargerId,leaderIds, request);
+        } catch (Exception e) {
+            HttpRespMsg respMsg = new HttpRespMsg();
+            respMsg.setError(e.getMessage());
+            return respMsg;
+        }
+    }
+    @RequestMapping("/editProjectBasic")
+    public HttpRespMsg editProjectBasic(Integer id, @RequestParam String name, String code,
+                                   String planStartDate,
+                                   String planEndDate,
+                                   Integer level,
+                                   String associateDegrees,
+                                   String associateDegreeNames,
+                                   Integer category,
+                                   String projectDesc,
+                                   String plate1,
+                                   String plate2,
+                                   String plate3,
+                                   String plate4,
+                                   String plate5,
+                                   String plate6,
+                                   String plate7,
+                                   String plate8,
+                                   String plate9,
+                                   String plate10) {
+        return projectService.editProjectBasic(id, name, code, planStartDate, planEndDate, level, associateDegrees, associateDegreeNames, category, projectDesc,plate1,plate2,plate3,plate4,plate5,plate6,plate7,plate8,plate9,plate10);
+    }
+
+
     @RequestMapping("/adjustBase")
     public HttpRespMsg adjustBase(String baseCostData, Project project, String remark
     ) {

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

@@ -334,4 +334,8 @@ public interface ProjectService extends IService<Project> {
     HttpRespMsg initTaskGroups(Integer companyId);
 
     HttpRespMsg exportGanttData(Integer type, String startDate, String endDate, String userId, Integer projectId, String groupName, Integer taskType, Integer deptId, Integer taskStatus, HttpServletRequest request);
+
+    HttpRespMsg editProjectMembs(Integer id, String[] userId, String inchargerId, String[] leaderIds, HttpServletRequest request) throws Exception;
+
+    HttpRespMsg editProjectBasic(Integer id, String name, String code, String planStartDate, String planEndDate, Integer level, String associateDegrees, String associateDegreeNames, Integer category, String projectDesc, String plate1, String plate2, String plate3, String plate4, String plate5, String plate6, String plate7, String plate8, String plate9, String plate10);
 }

+ 228 - 79
fhKeeper/formulahousekeeper/management-platform-mld/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -1770,10 +1770,6 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         TimeType timeType = timeTypeMapper.selectById(user.getCompanyId());
         Company company = companyMapper.selectById(companyId);
         boolean isNew = true;
-        if (companyId== Constant.ZHE_ZHONG_COMPANY_ID&&projectMainId==null){
-            httpRespMsg.setError("请选择主项目");
-            return httpRespMsg;
-        }
         //检查负责人要在参与人中
         if (!StringUtils.isEmpty(inchargerId)) {
             if (userIds == null || userIds.length == 0) {
@@ -1847,18 +1843,6 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                             .setPlate8(plate8)
                             .setPlate9(plate9)
                             .setPlate10(plate10);
-                    if(companyId==862){
-                        project.setBuId(buId);
-                        if (project.getBuId()!=null&&!project.getBuId().equals("")) {
-                            String[] split = project.getBuId().split(",");
-                            int dpId = Integer.parseInt(split[split.length - 1]);
-                            Department department = departmentMapper.selectById(dpId);
-                            if(department.getManagerId()==null){
-                                httpRespMsg.setError("当前BU["+department.getDepartmentName()+"]不存在负责人,请设置");
-                                return httpRespMsg;
-                            }
-                        }
-                    }
                     if(timeType.getProjectManDay()==1){
                         project.setManDay(manDay);
                         if (!StringUtils.isEmpty(manDayStartDate)) {
@@ -2011,18 +1995,6 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         .setPlate8(plate8)
                         .setPlate9(plate9)
                         .setPlate10(plate10);
-                if(companyId==862){
-                    p.setBuId(buId);
-                    if (p.getBuId()!=null&&!p.getBuId().equals("")) {
-                        String[] split = p.getBuId().split(",");
-                        int dpId = Integer.parseInt(split[split.length - 1]);
-                        Department department = departmentMapper.selectById(dpId);
-                        if(department.getManagerId()==null){
-                            httpRespMsg.setError("当前BU["+department.getDepartmentName()+"]不存在负责人,请设置");
-                            return httpRespMsg;
-                        }
-                    }
-                }
                 if(timeType.getProjectManDay()==1){
                     EstimateTimeSetting estimateTimeSetting = estimateTimeSettingMapper.selectById(companyId);
                     p.setManDay(manDay);
@@ -2120,20 +2092,6 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 }else {
                     projectMapper.updateProjectCategoryToNull(p.getId());
                 }
-                ProjectSeparate oldSeparate = projectSeparateMapper.selectById(id);
-                if(companyId==936){
-                    //编辑之前的项目是否存在子表数据
-                    ProjectSeparate separate = projectSeparateMapper.selectById(id);
-                    projectSeparate.setId(id);
-                    if(separate!=null){
-                        if(!onlyChangeParticipate){
-                            projectSeparateMapper.updateById(projectSeparate);
-                        }
-                    }else {
-                        projectSeparateMapper.insert(projectSeparate);
-                    }
-
-                }
                 if (!StringUtils.isEmpty(planStartDate)) {
                     p.setPlanStartDate(LocalDate.parse(planStartDate));
                 } else if (oldProject.getPlanStartDate() != null){
@@ -2151,7 +2109,6 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 } else {
                     p.setCustomerName("");
                 }
-                System.out.println("p.getPlanStartDate() = " + p.getPlanStartDate());
                 if (projectMapper.updateById(p) == 0) {
                     //httpRespMsg.setError("操作失败");
                     httpRespMsg.setError(MessageUtils.message("other.operationFail"));
@@ -3499,6 +3456,20 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         } else {
             participator = participationMapper.getParticipator(id);
         }
+        //LA
+        List<ProjectLeader> leaderList = projectLeaderService.list(new QueryWrapper<ProjectLeader>().eq("project_id", id));
+        if (leaderList.size() > 0) {
+            List<User> userLeaderList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId).in("id", leaderList.stream().map(ProjectLeader::getLeaderId).collect(Collectors.toList())));
+            leaderList.forEach(l -> {
+                Optional<User> userOptional = userLeaderList.stream().filter(u -> u.getId().equals(l.getLeaderId())).findFirst();
+                if (userOptional.isPresent()) {
+                    User user1 = userOptional.get();
+                    l.setUserName(user1.getName());
+                }
+            });
+        }
+        project.setLeaderList(leaderList);
+
         //todo:计算项目预算工时
         if(project.getManDay()!=null){
             BigDecimal bigDecimal=new BigDecimal(project.getManDay());
@@ -7643,43 +7614,45 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     List<Participation> participationList = new ArrayList<>();
                     if(inchargerCell!=null){
                         String value = inchargerCell.getStringCellValue();
-                        String s1;
-                        if(value.startsWith("/")){
-                            s1=value.substring(1,value.length());
-                        }else s1=value;
-                        String s2;
-                        if(s1.endsWith("/")){
-                            s2=s1.substring(0,s1.length()-1);
-                        }else s2=s1;
-                        String[] split = s2.split("/");
-                        Optional<User> first;
-                        Integer exception=null;
-                        if(split.length==1){
-                            if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getContactNeedTranslate()==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()))||(u.getDingdingUserid()!=null&&u.getDingdingUserid().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();
-                            }
-                            exception=0;
-                        }else {
-                            if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getContactNeedTranslate()==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()))||(u.getDingdingUserid()!=null&&u.getDingdingUserid().equals(optional.get().getCorpwxUserid()))))).findFirst();
-                                exception=1;
+                        if (!StringUtils.isEmpty(value)) {
+                            String s1;
+                            if(value.startsWith("/")){
+                                s1=value.substring(1,value.length());
+                            }else s1=value;
+                            String s2;
+                            if(s1.endsWith("/")){
+                                s2=s1.substring(0,s1.length()-1);
+                            }else s2=s1;
+                            String[] split = s2.split("/");
+                            Optional<User> first;
+                            Integer exception=null;
+                            if(split.length==1){
+                                if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getContactNeedTranslate()==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()))||(u.getDingdingUserid()!=null&&u.getDingdingUserid().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();
+                                }
+                                exception=0;
                             }else {
-                                first= userList.stream().filter(u -> u.getName().equals(split[1])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
+                                if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getContactNeedTranslate()==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()))||(u.getDingdingUserid()!=null&&u.getDingdingUserid().equals(optional.get().getCorpwxUserid()))))).findFirst();
+                                    exception=1;
+                                }else {
+                                    first= userList.stream().filter(u -> u.getName().equals(split[1])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
+                                }
                             }
-                        }
-                        Participation p = new Participation();
-                        if (first.isPresent()) {
-                            p.setUserId(first.get().getId());
-                            p.setProjectId(project.getId());
-                            participationList.add(p);
-                        } else {
-                            switch (exception){
-                                case 0:throw new Exception("["+split[0]+"]在系统中不存在");
-                                case 1:throw new Exception("["+split[1]+"]在系统中不存在");
+                            Participation p = new Participation();
+                            if (first.isPresent()) {
+                                p.setUserId(first.get().getId());
+                                p.setProjectId(project.getId());
+                                participationList.add(p);
+                            } else {
+                                switch (exception){
+                                    case 0:throw new Exception("["+split[0]+"]在系统中不存在");
+                                    case 1:throw new Exception("["+split[1]+"]在系统中不存在");
+                                }
                             }
                         }
                     }
@@ -7915,7 +7888,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     if (projectAuditorList.size() > 0) {
                         //批量保存
                         List<ProjectAuditor> finalOldAuditorList = oldAuditorList;
-                        List<ProjectAuditor> addAuditorList = projectAuditorList.stream().filter(newP-> !finalOldAuditorList.stream().anyMatch(oldP->oldP.getAuditorId().equals(newP.getAuditorId()))).collect(Collectors.toList());
+                        List<ProjectAuditor> addAuditorList = projectAuditorList.stream().filter(newP-> !finalOldAuditorList.stream().anyMatch(oldP->oldP.getAuditorId()!=null&&oldP.getAuditorId().equals(newP.getAuditorId()))).collect(Collectors.toList());
                         if (addAuditorList.size() > 0) {
                             projectAuditorService.saveBatch(addAuditorList);
                         }
@@ -14051,6 +14024,182 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         return  msg;
     }
 
+    @Override
+    public HttpRespMsg editProjectMembs(Integer id, String[] userIds, String inchargerId, String[] leaderIds, HttpServletRequest request) throws Exception {
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        if (!StringUtils.isEmpty(inchargerId)) {
+            if (userIds == null || userIds.length == 0) {
+                userIds = new String[1];
+                userIds[0] = inchargerId;//自动加进去
+            } else {
+                boolean has = false;
+                for (int i=0;i<userIds.length; i++) {
+                    if (userIds[i].equals(inchargerId)) {
+                        has = true;
+                        break;
+                    }
+                }
+                if (!has) {
+                    String[] newArray = new String[userIds.length + 1];
+                    for (int i=0;i<userIds.length; i++) {
+                        newArray[i] = userIds[i];
+                    }
+                    newArray[newArray.length -1] = inchargerId;
+                    userIds = newArray;
+                }
+            }
+        }
+        Project oldProject = projectMapper.selectById(id);
+        boolean inchargerChanged = false;
+        String oldInchargerId = null;
+        User user = userMapper.selectById(request.getHeader("TOKEN"));
+        Integer companyId = user.getCompanyId();
+        TimeType timeType = timeTypeMapper.selectById(companyId);
+        //修改项目
+        //检查项目编号不能重复
+        if (inchargerId != null && !inchargerId.equals(oldProject.getInchargerId())) {
+            inchargerChanged = true;
+            oldInchargerId = oldProject.getInchargerId();
+        }
+        Project p = new Project();
+        p.setId(id).setInchargerId(inchargerId);
+        if (projectMapper.updateById(p) == 0) {
+            //httpRespMsg.setError("操作失败");
+            httpRespMsg.setError(MessageUtils.message("other.operationFail"));
+            return httpRespMsg;
+        } else {
+            //项目经理换人,对应任务计划的第一审核人得换
+            String inchargerId_old = oldProject.getInchargerId();
+            if (inchargerId != null && !inchargerId.equals(inchargerId_old)){
+                taskExecutorService.update(null, new UpdateWrapper<TaskExecutor>().eq("project_id", oldProject.getId()).set("first_auditor_id", inchargerId));
+            }
+        }
+        Project newProject = projectMapper.selectById(id);
+        BeanChangeUtil<Project> beanChangeUtil=new BeanChangeUtil();
+        String content = beanChangeUtil.contrastObj(oldProject, newProject);
+        OperationRecord operationRecord =new OperationRecord();
+        operationRecord.setOperatorName(user.getName());
+        operationRecord.setOperationTime(LocalDateTime.now());
+        operationRecord.setCompanyId(companyId);
+        projectLeaderService.remove(new QueryWrapper<ProjectLeader>().eq("project_id",p.getId()));
+        List<User> userManagers = userMapper.selectList(new QueryWrapper<User>()
+                .eq("role_name", "区域经理&PM").eq("company_id",companyId));
+        if (leaderIds!=null&&leaderIds.length>0) {
+            ArrayList<ProjectLeader> leaderArrayList = new ArrayList<>();
+            for (String leaderId : leaderIds) {
+                ProjectLeader leader = new ProjectLeader();
+                leader.setProjectId(p.getId());
+                leader.setLeaderId(leaderId);
+                leader.setCompanyId(companyId);
+                if (!userManagers.isEmpty()){
+                    boolean b = userManagers.stream().anyMatch(u -> u.getId().equals(leaderId));
+                    if (b){
+                        throw new Exception("区域经理不能担任小组长");
+                    }
+                }
+                leaderArrayList.add(leader);
+            }
+            projectLeaderService.saveBatch(leaderArrayList);
+        }
+        operationRecord.setContent(content);
+        //operationRecord.setModuleName("项目管理");
+        operationRecord.setModuleName(MessageUtils.message("Template.projectManage"));
+        operationRecord.setProjectName(newProject.getProjectName());
+        if(!StringUtils.isEmpty(content.trim())){
+            operationRecordService.save(operationRecord);
+        }
+
+        //编辑关系
+        participationMapper.delete(new QueryWrapper<Participation>().eq("project_id", id));
+        if (userIds != null) {
+            List<Participation> pList = new ArrayList<>();
+            for (String userId : userIds) {
+                Participation participation = new Participation();
+                participation.setProjectId(id);
+                participation.setUserId(userId);
+                pList.add(participation);
+            }
+            if (pList.size() > 0) {
+                //批量保存参与人
+                participationService.saveBatch(pList);
+            }
+        }
+        httpRespMsg.data = id;
+        //针对reportAuditType=2(先任务分组负责人审核再项目经理审核的情况),如果项目经理变更,需要把老项目经理负责的日报变成新项目经理负责
+        if (timeType.getReportAuditType() == 2) {
+            if (inchargerChanged && oldInchargerId != null) {
+                Report updateItem = new Report();
+                updateItem.setProjectAuditorId(inchargerId);
+                reportMapper.update(updateItem, new QueryWrapper<Report>()
+                        .eq("company_id", companyId)
+                        .eq("project_auditor_id", oldInchargerId)
+                        .eq("state", 0)
+                        .eq("group_audit_state", 1)//任务分组已审核,当前是项目经理审核
+                        .eq("project_id", id));
+            }
+        } else if (timeType.getReportAuditType() == 10) {
+            if (inchargerChanged) {
+                //项目经理变更,待审核的转移到新的项目经理身上
+                Report updateItem = new Report();
+                updateItem.setProjectAuditorId(inchargerId);
+                reportMapper.update(updateItem, new QueryWrapper<Report>()
+                        .eq("company_id", companyId)
+                        .eq("project_auditor_id", oldInchargerId)
+                        .eq("state", 0)
+                        .eq("project_id", id));
+            }
+        }
+        return httpRespMsg;
+    }
+
+    @Override
+    public HttpRespMsg editProjectBasic(Integer id, String name, String code, String planStartDate, String planEndDate, Integer level, String associateDegrees, String associateDegreeNames, Integer category, String projectDesc, String plate1, String plate2, String plate3, String plate4, String plate5, String plate6, String plate7, String plate8, String plate9, String plate10) {
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        User user = userMapper.selectById(request.getHeader("Token"));
+        Integer companyId = user.getCompanyId();
+        Project oldProject = projectMapper.selectById(id);
+        Project project = new Project();
+        project.setId(id);
+        project.setProjectName(name);
+        project.setProjectCode(code);
+        project.setLevel(level);
+        project.setAssociateDegrees(associateDegrees);
+        project.setAssociateDegreeNames(associateDegreeNames);
+        project.setProjectDesc(projectDesc);
+        project.setPlate1(plate1);
+        project.setPlate2(plate2);
+        project.setPlate3(plate3);
+        project.setPlate4(plate4);
+        project.setPlate5(plate5);
+        project.setPlate6(plate6);
+        project.setPlate7(plate7);
+        project.setPlate8(plate8);
+        project.setPlate9(plate9);
+        project.setPlate10(plate10);
+        if (category != null) {
+            ProjectCategory projectCategory = projectCategoryMapper.selectById(category);
+            if (projectCategory != null) {
+                project.setCategory(category);
+                project.setCategoryName(projectCategory.getName());
+            }
+        }else {
+            projectMapper.updateProjectCategoryToNull(project.getId());
+        }
+        if (!StringUtils.isEmpty(planStartDate)) {
+            project.setPlanStartDate(LocalDate.parse(planStartDate));
+        } else if (oldProject.getPlanStartDate() != null){
+            //置空项目开始日期
+            projectMapper.updateProjectStartDateToNull(id);
+        }
+        if (!StringUtils.isEmpty(planEndDate)) {
+            project.setPlanEndDate(LocalDate.parse(planEndDate));
+        } else if (oldProject.getPlanEndDate() != null){
+            //置空项目结束日期
+            projectMapper.updateProjectEndDateToNull(id);
+        }
+        return httpRespMsg;
+    }
+
     public static List<String> generateDateHeaders(LocalDate startDate, LocalDate endDate) {
         List<String> headers = new ArrayList<>();
         DateTimeFormatter dayFormatter = DateTimeFormatter.ofPattern("M.d");

+ 57 - 6
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java

@@ -123,6 +123,8 @@ public class ReportController {
     private CompanyDingdingService companyDingdingService;
     @Autowired
     private UserDingdingTimeMapper userDingdingTimeMapper;
+    @Resource
+    private MaskWordService maskWordService;
 
     //获取任务相关的日报列表
     @RequestMapping("/getTaskReportList")
@@ -637,7 +639,10 @@ public class ReportController {
 
         //针对物奇微,增加填报内容的关键字检查:
         if (company.getId() == 1071) {
-            String sensitiveWords = "客户支持";
+            // 从MaskWord表中获取当前公司的过滤词
+            List<MaskWord> maskWords = maskWordService.list(new LambdaQueryWrapper<MaskWord>()
+                    .eq(MaskWord::getCompanyId, company.getId()));
+            
             for (int i=0;i<projectId.length; i++) {
                 if (id[i] != null && id[i] != -1) {
                     Report oldReport = reportMapper.selectById(id[i]);
@@ -646,10 +651,57 @@ public class ReportController {
                         continue;
                     }
                 }
-                if (content[i] != null && content[i].indexOf(sensitiveWords) != -1) {
-                    HttpRespMsg msg = new HttpRespMsg();
-                    msg.setError("填报内容请不要出现“客户支持”类工作");
-                    return msg;
+                
+                if (content[i] != null) {
+                    // 检查每个过滤词
+                    for (MaskWord maskWord : maskWords) {
+                        // 检查范围类型:0-全公司,1-部分部门
+                        boolean shouldCheck = false;
+                        if (maskWord.getRangeType() == 0) {
+                            // 全公司适用
+                            shouldCheck = true;
+                        } else if (maskWord.getRangeType() == 1 && !StringUtils.isEmpty(maskWord.getTargetDepts())) {
+                            // 检查当前用户部门是否在适用范围内
+                            String[] deptIds = maskWord.getTargetDepts().split(",");
+                            String currentUserDeptId = user.getDepartmentId().toString();
+                            shouldCheck = Arrays.asList(deptIds).contains(currentUserDeptId);
+                        }
+                        
+                        if (shouldCheck && content[i].indexOf(maskWord.getWordName()) != -1) {
+                            HttpRespMsg msg = new HttpRespMsg();
+                            // 使用自定义的报错提示语,如果没有则使用默认提示
+                            String alertMsg = !StringUtils.isEmpty(maskWord.getAlertMsg()) 
+                                    ? maskWord.getAlertMsg() 
+                                    : "填报内容请不要出现\"" + maskWord.getWordName() + "\"类工作";
+                            msg.setError(alertMsg);
+                            return msg;
+                        }
+                    }
+                }
+            }
+            if (summary != null) {
+                for (MaskWord maskWord : maskWords) {
+                    // 检查范围类型:0-全公司,1-部分部门
+                    boolean shouldCheck = false;
+                    if (maskWord.getRangeType() == 0) {
+                        // 全公司适用
+                        shouldCheck = true;
+                    } else if (maskWord.getRangeType() == 1 && !StringUtils.isEmpty(maskWord.getTargetDepts())) {
+                        // 检查当前用户部门是否在适用范围内
+                        String[] deptIds = maskWord.getTargetDepts().split(",");
+                        String currentUserDeptId = user.getDepartmentId().toString();
+                        shouldCheck = Arrays.asList(deptIds).contains(currentUserDeptId);
+                    }
+
+                    if (shouldCheck && summary.indexOf(maskWord.getWordName()) != -1) {
+                        HttpRespMsg msg = new HttpRespMsg();
+                        // 使用自定义的报错提示语,如果没有则使用默认提示
+                        String alertMsg = !StringUtils.isEmpty(maskWord.getAlertMsg())
+                                ? maskWord.getAlertMsg()
+                                : "填报内容请不要出现\"" + maskWord.getWordName() + "\"类工作";
+                        msg.setError(alertMsg);
+                        return msg;
+                    }
                 }
             }
         }
@@ -3394,4 +3446,3 @@ public class ReportController {
         return reportService.updateJingYuOldReport(startDate, endDate);
     }
 }
-

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

@@ -2182,6 +2182,7 @@ public class DingDingServiceImpl implements DingDingService {
                 try {
                     rsp = client.execute(req, accessToken);
                     JSONArray array = JSONObject.parseObject(rsp.getBody()).getJSONObject("result").getJSONArray("columns");
+//                    System.out.println("获取到请假数据:"+array.toJSONString());
                     for (int i=0;i<array.size(); i++) {
                         JSONObject item = array.getJSONObject(i);
                         String leaveTypeName = item.getJSONObject("columnvo").getString("name");

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

@@ -23,6 +23,7 @@ import org.springframework.web.client.RestTemplate;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.time.YearMonth;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
@@ -131,6 +132,7 @@ public class ErpOrderInfoServiceImpl extends ServiceImpl<ErpOrderInfoMapper, Erp
      */
     @Override
     public HttpRespMsg syncData() {
+        System.out.println("==开始同步工单号=="+ LocalDateTime.now().toString());
         HttpRespMsg msg = new HttpRespMsg();
         RestTemplate restTemplate = new RestTemplate();
         String sumUrl = DataCollectTask.PREFIX_URL+"/dataCollect/getSqlServerDataSum";

+ 9 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -7097,7 +7097,13 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     }
                 }
                 if (exportType==0 || companyId == 1071) {
-                    item.add((String) map.get("content"));
+                    if (companyId == 1071) {
+                        //物奇
+                        item.add((String) map.get("project")+"-"+(String) map.get("content"));
+                    } else {
+                        item.add((String) map.get("content"));
+                    }
+
                 }
                 if(exportType==0 && (stateKey==1 || stateKey ==0 || stateKey==2)){
                     Integer state = (Integer) map.get("state");
@@ -9082,13 +9088,13 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         //加载这段时间内已填报过的项目
         List<Project> projectList = new ArrayList<>();
         if (collect.size() > 0) {
-            projectList = projectMapper.selectList(new QueryWrapper<Project>().in("id", collect));
+            projectList = projectMapper.selectList(new QueryWrapper<Project>().in("id", collect).eq("status", 1));
 			auditorList = userMapper.selectList(new QueryWrapper<User>().in("id", reportList.stream().map(Report::getProjectAuditorId).collect(Collectors.toList())));
         } else {
             //没有项目,默认加载最近填报过的项目
             List<Report> oldReport = reportMapper.selectList(new QueryWrapper<Report>().select("distinct project_id").eq("creator_id", userId).orderByDesc("id").last("limit 5"));
             if (oldReport.size() > 0) {
-                projectList = projectMapper.selectList(new QueryWrapper<Project>().in("id", oldReport.stream().map(Report::getProjectId).collect(Collectors.toList())));
+                projectList = projectMapper.selectList(new QueryWrapper<Project>().in("id", oldReport.stream().map(Report::getProjectId).collect(Collectors.toList())).eq("status", 1));
             }
         }
         if (projectList.size() > 0 && !sysFunctionService.hasPriviledge(user.getRoleId(), "可填报全部项目")) {

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

@@ -39,46 +39,16 @@ public class DataCollectTask {
     private LeaveSheetService leaveSheetService;
     @Resource
     private BusinessTripService businessTripService;
-
     @Resource
     private ErpOrderInfoService erpOrderInfoService;
-
-    @Resource
-    private GroupTemplateMapper groupTemplateMapper;
-
-    @Resource
-    private GroupTmpstagesMapper groupTmpstagesMapper;
-
-    @Resource
-    private StagesService stagesService;
-
-    @Resource
-    private GtemplateTaskMapper gtemplateTaskMapper;
-    @Resource
-    private TaskGroupMapper taskGroupMapper;
-
-    @Resource
-    private TaskService taskService;
-    @Resource
-    private ProjectMapper projectMapper;
-
-    @Resource
-    private ProjectCategoryMapper projectCategoryMapper;
-
-    @Resource
-    private UserMapper userMapper;
     @Resource
     private FmwDetailMapper fmwDetailMapper;
     @Resource
     private FinanceMonthlyWorktimeMapper financeMonthlyWorktimeMapper;
-    @Resource
-    private CompanyMapper companyMapper;
     @Autowired
     private UserFvTimeService userFvTimeService;
 
-
-    @Scheduled(cron = "0 0 1 * * ?")
-    @Async
+    @Scheduled(cron = "30 10 8,12,20 * * ?")
     public void sqlServerTask() {
         if(isDev){return;}
         if(isPrivateDeploy) return;
@@ -98,7 +68,6 @@ public class DataCollectTask {
     }
 
     @Scheduled(cron = "0 28 2 * * ?")
-    @Async
     public void leaveSheetTask(){
         if(isDev){return;}
         if(isPrivateDeploy) return;
@@ -106,14 +75,12 @@ public class DataCollectTask {
     }
 
     @Scheduled(cron = "0 0 3 * * ?")
-    @Async
     public void businessTripTask(){
         if(isDev){return;}
         if(isPrivateDeploy) return;
         businessTripService.syncHongHuData(HONGHU_COMP_ID);
     }
     @Scheduled(cron = "0 30 3 * * ?")
-    @Async
     public void sqlServerProjectTask() {
         if(isDev){return;}
         if(isPrivateDeploy) return;
@@ -125,7 +92,6 @@ public class DataCollectTask {
      * 发送工时数据到财务系统
      */
     @Scheduled(cron = "0 30 0 28-31 * ?")
-    @Async
     public void caDayTisTask(){
         if(isDev){return;}
         if(isPrivateDeploy) return;

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

@@ -1960,7 +1960,7 @@
   "youXiaoFanWei": "有效范围",
   "youXiaoBuMen": "有效部门",
   "quanGongSi": "全公司",
-  "buFenChengYuan": "部分成员",
+  "buFenChengYuan": "指定部门",
   "youXiaoRenYuan": "有效人员",
   "teShuJieJiaRiSheZhi": "特殊节假日设置",
   "qingShuRuMingZiSouSuo": "请输入名字搜索",

+ 295 - 9
fhKeeper/formulahousekeeper/timesheet/src/views/settings/timetype.vue

@@ -530,6 +530,12 @@
             <el-button size="small" type="primary" @click="holidaySeeting()">{{ $t('setup') }}</el-button>
             <span style="margin-left:10px;color:#999;">{{'设置部门或人员的特殊节假日'}}</span>
         </div>
+        <!-- 屏蔽词设置 -->
+        <div class="yanjiu" v-if="user.companyId == 1071">
+            <p style="margin: 0 68px 0 10px;color:#666;">{{'屏蔽词设置'}}</p>
+            <el-button size="small" type="primary" @click="maskWordSetting()" style="margin-left:28px;">{{ $t('setup') }}</el-button>
+            <span style="margin-left:10px;color:#999;">{{'针对日报设置屏蔽词'}}</span>
+        </div>
 
         <!-- 是否开启主项目管理 -->
         <!-- <div class="yanjiu">
@@ -791,16 +797,86 @@
             </div>
         </el-dialog>
 
+        <!-- 屏蔽词设置列表 -->
+        <el-dialog title="屏蔽词列表" show-header="false" :top="'10vh'" v-if="maskWordSettingDialog" :visible.sync="maskWordSettingDialog" :close-on-click-modal="false" customClass="customWidth" width="1000px">
+            <el-table :data="maskWordSettingDatas" highlight-current-row height="400" style="width: 100%;">
+                <el-table-column prop="wordName" width="150" label="屏蔽词名称">
+                </el-table-column>
+                <el-table-column prop="name" label="有效范围" width="120">
+                    <template slot-scope="scope">
+                        {{scope.row.rangeType==0?$t('quanGongSi'):$t('buFenChengYuan')}}
+                    </template>
+                </el-table-column>
+                <el-table-column prop="name" label="适用部门" width="300">
+                    <template slot-scope="scope">
+                        <div v-if="user.userNameNeedTranslate != '1'">{{ scope.row.targetDeptsNames }}</div>
+                        <div v-else>
+                            <span v-for="(v,i) in (scope.row.newDeptName || [])">
+                                <TranslationOpenDataText type='departmentName' :openid='v'></TranslationOpenDataText>
+                                <span v-if="i < (scope.row.newDeptName || []).length - 1">,</span>
+                            </span>
+                        </div>
+                    </template>
+                </el-table-column>
+                <el-table-column prop="alertMsg" label="报错提示语" width="200">
+                </el-table-column>
+                <el-table-column :label="$t('operation')" width="150" fixed="right">
+                    <template slot-scope="scope">
+                        <el-button size="small" type="primary" @click="addNewMaskWordSetting(scope.row)">{{ $t('bian-ji') }}</el-button>
+                        <el-button size="small" type="danger" @click="deleteMaskWordSetting(scope.row)">{{ $t('btn.delete') }}</el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+            <div slot="footer" class="dialog-footer">
+                <el-button type="primary" @click="maskWordSettingDialog = false">{{ $t('Shutdown') }}</el-button>
+                <el-button type="primary" @click="addNewMaskWordSetting()">{{ $t('addData') }}</el-button>
+            </div>
+        </el-dialog>
+        
+        <!-- 新增屏蔽词设置 -->
+        <el-dialog title="屏蔽词设置" show-header="false" v-if="addMaskWordSetting" :visible.sync="addMaskWordSetting" :top="'10vh'" :close-on-click-modal="false" customClass="customWidth" width="600px">
+            <el-form ref="maskWordForm" :model="maskWordSettingForm" label-width="100px">
+                <el-form-item label="屏蔽词名称" prop="wordName">
+                    <el-input v-model="maskWordSettingForm.wordName" placeholder="请输入屏蔽词名称" clearable></el-input>
+                </el-form-item>
+                <el-form-item label="报错提示语" prop="alertMsg">
+                    <el-input v-model="maskWordSettingForm.alertMsg" placeholder="请输入报错提示语" clearable></el-input>
+                </el-form-item>
+                <el-form-item :label="$t('youXiaoFanWei')">
+                    <el-radio v-model="maskWordSettingForm.rangeType" label="0">{{ $t('quanGongSi') }}</el-radio>
+                    <el-radio v-model="maskWordSettingForm.rangeType" label="1">{{ $t('buFenChengYuan') }}</el-radio>
+                </el-form-item>
+                <div style="height: 36vh" v-if="maskWordSettingForm.rangeType!=1"></div>
+                <div v-if="maskWordSettingForm.rangeType==1">
+                    <div class="specialHolidaysClass">
+                        <div class="titles">适用部门 <el-link type="primary" :underline="false" @click="showMaskWordSelection(1)">{{ $t('addTian') }}</el-link></div>
+                        <div class="contents">
+                            <el-tag style="margin:10px 0 0 10px" v-for="(item, index) in maskWordDept.labels" :key="item.id" closable @close="maskWordDelete('maskWordDept', index)">
+                                <span v-if="user.userNameNeedTranslate != '1'">{{item}}</span>
+                                <span v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='departmentName' :openid='item'></TranslationOpenDataText></span>
+                            </el-tag>
+                        </div>
+                    </div>
+                </div>
+            </el-form>
+            <div slot="footer" class="dialog-footer">
+                <el-button type="primary" @click="addMaskWordSetting = false">{{ $t('Shutdown') }}</el-button>
+                <el-button type="primary" @click="submitInsertMaskWordSetting()">{{ $t('save') }}</el-button>
+            </div>
+        </el-dialog>
+
         <!-- 特殊节假日设置 -->
         <el-dialog :title="specialHolidays == 1 ? $t('qing-xuan-ze-bu-men') : $t('pleaseselectpersonnel')" :top="'10vh'"  v-if="specialHolidaysDialog" :visible.sync="specialHolidaysDialog" :close-on-click-modal="false" customClass="customWidth" width="600px">
-            <div v-if="user.userNameNeedTranslate == '1'">
+            <!-- 只有在非屏蔽词设置时才显示搜索功能 -->
+            <div v-if="user.userNameNeedTranslate == '1' && !isMaskWordDialog">
                 <el-input :placeholder="$t('qingShuRuMingZiSouSuo')" v-model.trim="wxFilterText" @keyup.enter.native="echartDepartment()" clearable @clear="clearEchartDepartment()" class="input-with-select">
                     <el-button slot="append" icon="el-icon-search" @click="echartDepartment()"></el-button>
                 </el-input>
             </div>
             <div class="tree" style="height:400px">
                 <el-scrollbar style="height:100%">
-                    <el-input v-if="user.userNameNeedTranslate != '1'"
+                    <!-- 只有在非屏蔽词设置时才显示搜索功能 -->
+                    <el-input v-if="user.userNameNeedTranslate != '1' && !isMaskWordDialog"
                     :placeholder="$t('keywordfiltering')"
                     v-model="filterText">
                     </el-input>
@@ -825,7 +901,7 @@
             </div>
             <!-- <div>已选中&nbsp;{{chosenMembCount}}&nbsp;人</div>         :default-checked-keys="alreadyPartArray"  @check-change="onTreeItemChange" -->
             <div slot="footer" class="dialog-footer">
-                <el-button @click="specialHolidaysDialog = false">{{ $t('btn.cancel') }}</el-button>
+                <el-button @click="specialHolidaysDialog = false, isMaskWordDialog = false">{{ $t('btn.cancel') }}</el-button>
                 <el-button type="primary" @click="specialHolidaysChange()">{{ $t('btn.determine') }}</el-button>
             </div>
         </el-dialog>
@@ -1006,6 +1082,27 @@
                 },
                 mechanicalPersonnelList: [],
                 selectPersonnelType: 'personnel',
+                
+                // 屏蔽词设置相关数据
+                maskWordSettingDialog: false,
+                addMaskWordSetting: false,
+                maskWordSettingForm: {
+                    rangeType: "0",
+                    wordName: '',
+                    alertMsg: ''
+                },
+                maskWordSettingDatas: [],
+                
+                // 屏蔽词设置的部门和人员选择
+                maskWordDept: {
+                    values: [],
+                    labels: []
+                },
+                maskWordUser: {
+                    values: [],
+                    labels: []
+                },
+                isMaskWordDialog: false, // 标识是否为屏蔽词对话框
             };
         },
         watch: {
@@ -1110,10 +1207,20 @@
             setspecialHolidaysNodes() {
                 let key = []
                 if(this.specialHolidays == 1) {
-                    key = this.specialHolidaysDept.values || []
+                    // 判断是否为屏蔽词设置
+                    if(this.maskWordSettingDialog || this.addMaskWordSetting) {
+                        key = this.maskWordDept.values || []
+                    } else {
+                        key = this.specialHolidaysDept.values || []
+                    }
                 }
                 if(this.specialHolidays == 2) {
-                    key = this.specialHolidaysUser.values || []
+                    // 判断是否为屏蔽词设置
+                    if(this.maskWordSettingDialog || this.addMaskWordSetting) {
+                        key = this.maskWordUser.values || []
+                    } else {
+                        key = this.specialHolidaysUser.values || []
+                    }
                 }
                 console.log(key, '<=== 设置数据')
                 this.$refs.specialHolidaysTree.setCheckedKeys(key)
@@ -1127,14 +1234,25 @@
                 if(this.specialHolidays == 1) {
                     let values = selectList.map(item => item.id)
                     let labels = selectList.map(item => item.label)
-                    this.specialHolidaysDept = { values, labels }
+                    // 判断是否为屏蔽词设置
+                    if(this.maskWordSettingDialog || this.addMaskWordSetting) {
+                        this.maskWordDept = { values, labels }
+                    } else {
+                        this.specialHolidaysDept = { values, labels }
+                    }
                 }
                 if(this.specialHolidays == 2) {
                     let values = selectList.filter(item => !item.userList).map(item => item.id)
                     let labels = selectList.filter(item => !item.userList).map(item => item.label)
-                    this.specialHolidaysUser = { values, labels }
+                    // 判断是否为屏蔽词设置
+                    if(this.maskWordSettingDialog || this.addMaskWordSetting) {
+                        this.maskWordUser = { values, labels }
+                    } else {
+                        this.specialHolidaysUser = { values, labels }
+                    }
                 }
                 this.specialHolidaysDialog = false
+                this.isMaskWordDialog = false // 重置屏蔽词对话框标识
             },
             showSpecialHolidays(key) {
                 this.specialHolidays = key
@@ -1219,6 +1337,10 @@
                 this.holidaySeetingDialog=true,
                 this.getHolidaySeetingList()
             },  
+            maskWordSetting() {
+                this.maskWordSettingDialog=true,
+                this.getMaskWordSettingList()
+            },
             // 获取节假日设置列表
             getHolidaySeetingList(){
                 this.http.post('/holiday-setting/list',{
@@ -1718,7 +1840,8 @@
                 },res => {
                     if(res.code == 'ok'){
                         let list = res.data
-                        if(this.specialHolidays != 1) {
+                        // 如果是屏蔽词设置且选择部门,则不添加人员数据
+                        if(this.specialHolidays != 1 && !this.isMaskWordDialog) {
                             this.haveUsersList(list)
                         }
                         this.whiteListAll = JSON.parse(JSON.stringify(list))
@@ -2209,6 +2332,169 @@
                 this.whiteListAll = this.whiteListAllTwo
             },
 
+            // 屏蔽词设置相关方法
+            // 获取屏蔽词设置列表
+            getMaskWordSettingList() {
+                this.http.post('/mask-word/list', {}, res => {
+                    if(res.code == 'ok') {
+                        res.data.forEach((item) => {
+                            item.newDeptName = item.targetDeptsNames ? item.targetDeptsNames.split(',') : []
+                            item.newDeptId = item.targetDepts ? item.targetDepts.split(',') : []
+                        })
+                        this.maskWordSettingDatas = res.data
+                    } else {
+                        this.$message({
+                            message: res.msg,
+                            type: 'error'
+                        })
+                    }
+                }, err => {
+                    this.$message({
+                        message: err,
+                        type: 'error'
+                    })
+                })
+            },
+
+            // 新增/编辑屏蔽词设置
+            addNewMaskWordSetting(item) {
+                if(item) {
+                    this.maskWordSettingForm.wordName = item.wordName
+                    this.maskWordSettingForm.alertMsg = item.alertMsg
+                    this.maskWordSettingForm.id = item.id
+                    this.maskWordSettingForm.rangeType = item.rangeType + ""
+                    let newDeptForm = {
+                        values: item.newDeptId,
+                        labels: item.newDeptName
+                    }
+                    this.maskWordDept = newDeptForm
+                    this.maskWordUser = {
+                        values: [],
+                        labels: []
+                    }
+                } else {
+                    this.maskWordSettingForm.wordName = ""
+                    this.maskWordSettingForm.alertMsg = ""
+                    this.maskWordSettingForm.id = null
+                    this.maskWordSettingForm.rangeType = "0"
+                    this.maskWordDept = {
+                        values: [],
+                        labels: []
+                    }
+                    this.maskWordUser = {
+                        values: [],
+                        labels: []
+                    }
+                }
+                this.addMaskWordSetting = true
+            },
+
+            // 删除屏蔽词设置
+            deleteMaskWordSetting(item) {
+                this.$confirm('确定删除这条数据吗?', '删除', {
+                    confirmButtonText: this.$t('btn.determine'),
+                    cancelButtonText: this.$t('btn.cancel'),
+                    type: "warning"
+                })
+                .then(() => {
+                    this.listLoading = true;
+                    this.http.post('/mask-word/delete', { 
+                        id: item.id 
+                    }, res => {
+                        this.listLoading = false;
+                        if (res.code == "ok") {
+                            this.$message({
+                                message: this.$t('message.successfullyDeleted'),
+                                type: "success"
+                            });
+                            this.getMaskWordSettingList();
+                        } else {
+                            this.$message({
+                                message: res.msg,
+                                type: "error"
+                            });
+                        }
+                    }, error => {
+                        this.listLoading = false;
+                        this.$message({
+                            message: error,
+                            type: "error"
+                        });
+                    });
+                })
+                .catch(() => {});
+            },
+
+            // 提交屏蔽词设置
+            submitInsertMaskWordSetting() {
+                if(!this.maskWordSettingForm.wordName) {
+                    this.$message({
+                        message: '请输入屏蔽词名称',
+                        type: 'error'
+                    })
+                    return
+                }
+                if(!this.maskWordSettingForm.alertMsg) {
+                    this.$message({
+                        message: '请输入报错提示语',
+                        type: 'error'
+                    })
+                    return
+                }
+
+                let newForm = {
+                    ...this.maskWordSettingForm,
+                    targetDepts: this.maskWordDept.values.join(','),
+                }
+                this.http.post('/mask-word/maskWordSetting', {...newForm}, res => {
+                    if(res.code == 'ok') {
+                        this.$message({
+                            message: this.$t('savesuccess'),
+                            type: 'success'
+                        })
+                        this.addMaskWordSetting = false
+                        this.getMaskWordSettingList()
+                    } else {
+                        this.$message({
+                            message: res.msg,
+                            type: 'error'
+                        })
+                    }
+                }, err => {
+                    this.$message({
+                        message: err,
+                        type: 'error'
+                    })
+                })
+            },
+
+            // 显示屏蔽词部门选择对话框
+            showMaskWordSelection(key) {
+                this.specialHolidays = key
+                this.filterText = ''
+                this.isMaskWordDialog = true // 标识为屏蔽词对话框
+                this.getWhiteListAll()
+                this.specialHolidaysDialog = true
+            },
+
+            // 删除屏蔽词部门/人员标签
+            maskWordDelete(field, index) {
+                this[field].labels.splice(index, 1)
+                this[field].values.splice(index, 1)
+            },
+
+            // 设置屏蔽词选择的节点
+            setMaskWordNodes() {
+                let key = []
+                if(this.specialHolidays == 1) {
+                    key = this.maskWordDept.values || []
+                }
+                if(this.specialHolidays == 2) {
+                    key = this.maskWordUser.values || []
+                }
+                this.$refs.specialHolidaysTree.setCheckedKeys(key)
+            },
+
         },
     };
 </script>
@@ -2294,4 +2580,4 @@
         overflow-x: hidden;
     }
 }
-</style>
+</style>

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 5 - 6
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue


+ 18 - 4
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/weeklyCustomization.vue

@@ -38,9 +38,13 @@
                     </el-table-column>
                     <el-table-column prop="content" :label="user.companyId == wuqiId ? '日报' : $t('gongZuoNeiRong')" width="300">
                         <template slot-scope="scope">
-                            <el-input size="small" type="textarea" :rows="2" v-model="scope.row.content"
-                                :disabled="scope.row.state == 1 || scope.row.state == 0 || !scope.row.canFill"
-                                resize="none" :maxlength="user.companyId == wuqiId && 30" :show-word-limit="user.companyId == wuqiId" :placeholder="user.companyId == wuqiId ? '所在项目负责哪一模块(可重复填写),无需涉及技术细节。' : '' "></el-input>
+                            <div>
+                                <span>{{scope.row.projectName}}</span>
+                                <el-input size="small" type="textarea" :rows="2" v-model="scope.row.content"
+                                    :disabled="scope.row.state == 1 || scope.row.state == 0 || !scope.row.canFill"
+                                    resize="none" :maxlength="user.companyId == wuqiId && 30" :show-word-limit="user.companyId == wuqiId" :placeholder="user.companyId == wuqiId ? '所在项目负责哪一模块(可重复填写),无需涉及技术细节。' : '' ">                                
+                            </el-input>
+                            </div>
                         </template>
                     </el-table-column>
                     <el-table-column prop="workingTime" :label="$t('shiJianXiaoShi')" width="160">
@@ -344,8 +348,17 @@ export default {
             this.$set(this.weekTableData[index], 'projectAuditorId', '')
             this.$set(this.weekTableData[index], 'projectAuditorName', '')
             this.$set(this.weekTableData[index], 'groupId', '')
+            this.$set(this.weekTableData[index], 'projectName', '')
             if (projectId) {
+                var pName = this.projectList.filter(p=>p.id == projectId)[0].projectName + '-';
+                this.$set(this.weekTableData[index], 'projectName', pName)
                 this.getProjectGroup(projectId, index)
+                // if (this.user.companyId == this.wuqiId) {
+                //     //设置日报内容以项目名称开头,且不能删除
+                //     if (this.weekTableData[index].content == null || !this.weekTableData[index].content.startsWith(pName)) {
+                //         this.$set(this.weekTableData[index], 'content', pName);
+                //     }
+                // }
             }
         },
         // 分组切换事件
@@ -401,7 +414,8 @@ export default {
             const { dateList, projectList, sumTimeList, cardTimeList } = data;
             const weekTableData = dateList.flatMap(date => {
                 const { weekDayTxt, date: dateTime, reportList, canFill } = date;
-                const reports = reportList.map(report => ({ ...report, weekDayTxt, dateTime, canFill }));
+                const reports = reportList.map(report => ({ ...report, weekDayTxt, dateTime, canFill,projectName:projectList.filter(p=>p.id == report.projectId)[0].projectName }));
+
                 return reports.length > 0 ? reports : [{ weekDayTxt, dateTime, canFill }];
             });
             let sumSet = new Set();

+ 8 - 0
fhKeeper/formulahousekeeper/timesheet_h5/src/router/index.js

@@ -81,6 +81,14 @@ const router = new Router({
         },
         component: () => import("@/views/task/index")
     },
+    {
+        path: "/reviewFiles",
+        meta: {
+            title: "待办任务"
+        },
+        component: () => import("@/views/task/reviewFiles")
+    },
+    
     {
         path: "/expense",
         meta: {

+ 156 - 66
fhKeeper/formulahousekeeper/timesheet_h5/src/views/task/index.vue

@@ -9,72 +9,95 @@
             <van-tab title="全部任务" :name="0" v-if="viewAlltask"></van-tab>
             <van-tab title="我执行的" :name="1"></van-tab>
             <van-tab title="我创建的" :name="2"></van-tab>
+            <van-tab title="待审核文件" v-if="(user.timeType.taskFileCharge == 1 || user.timeType.taskFileCharge == 2) 
+            && user.functionList.filter(fun=>fun.name == '审核任务文件').length > 0" :name="3" ></van-tab>
         </van-tabs>
         <!-- 任务状态 -->
-        <van-cell title="任务状态" :value="select_state" @click="select_state_show = true"></van-cell>
-        <van-popup v-model="select_state_show" position="bottom">
-            <van-picker
-            show-toolbar
-            :columns="select_state_array"
-            @confirm="stateChange"
-            @cancel="select_state_show = false;$forceUpdate();"/>
-        </van-popup>
-        <!-- 任务类型 -->
-        <van-cell title="任务类型" :value="select_type" @click="select_type_show = true"></van-cell>
-        <van-popup v-model="select_type_show" position="bottom">
-            <van-picker
-            show-toolbar
-            :columns="select_type_array"
-            @confirm="typeChange"
-            @cancel="select_type_show = false;$forceUpdate();"/>
-        </van-popup>
-        <!-- 时间范围 -->
-        <van-cell class="dateSelectCell">
-            <template slot="title">
-                <van-popover
-                v-model="select_date_type_show"
-                trigger="click"
-                :actions="select_date_type_array"
-                @select="dateTypeChange"
-                placement="bottom-start">
-                    <template slot="reference">
-                        <span>{{select_date_type}}<van-icon name="arrow-down" size="10" style="margin-left:2px;" /></span>
-                    </template>
-                </van-popover>
-            </template>
-            <template slot="default">
-                <div style="width:100%;height:100%" @click="select_date_show = true">{{select_date.length == 0 ? '请选择日期区间' : select_date[0] + ' 至 ' + select_date[1]}}</div>
-            </template>
-            <template slot="extra">
-                <van-icon v-if="select_date.length != 0" name="close" style="line-height:0.64rem;position:relative;left:5px;" @click.stop="dateClear"/>
-            </template>
-        </van-cell>
-        <van-calendar v-model="select_date_show" type="range" @confirm="dateChange" :min-date="new Date(2010,0,1)" :max-date="new Date(2030,11,31)" />
-    </van-sticky>
-
-        <div class="taskList" v-if="taskList.length != 0">
-            <van-pull-refresh v-model="downLoading" @refresh="onDownRefresh">
-                <!-- 任务列表 -->
-                <van-list v-model="upLoading" :finished="upFinished" :immediate-check="false" :offset="100" finished-text="没有更多了" @load="onLoadList">
-                    <van-cell v-for="item in taskList" :key="item.id">
-                        <div style="line-height:0.8rem">任务名称:{{item.name}}</div>
-                        <div style="line-height:0.8rem">项目名称:{{item.projectName}}</div>
-                        <div style="line-height:0.8rem">起止时间:
-                            <span v-if="item.startDate && item.endDate">{{(item.startDate ? item.startDate : ' - ') + '\u3000至\u3000' + (item.endDate ? item.endDate : ' - ')}}</span>
-                            <span v-else></span>
-                        </div>
-                        <div class="task_button">
-                            <van-button size="small" type="info" @click="toEditask(item.id)" v-if="authorityEditing || (user.id == item.createrId || user.id == item.inchargerId)">编辑</van-button>
-                            <van-button size="small" type="primary" @click="taskStatus(item.id,0)" v-if="select_state == '进行中'">完成</van-button>
-                            <van-button size="small" color="#e6a23c" @click="taskStatus(item.id,1)" v-else>重启</van-button>
-                        </div>
-                    </van-cell>
-                </van-list>
-            </van-pull-refresh>
+        <div v-if="active != 3">
+            <van-cell title="任务状态" :value="select_state" @click="select_state_show = true" ></van-cell>
+            <van-popup v-model="select_state_show" position="bottom">
+                <van-picker
+                show-toolbar
+                :columns="select_state_array"
+                @confirm="stateChange"
+                @cancel="select_state_show = false;$forceUpdate();"/>
+            </van-popup>
+            <!-- 任务类型 -->
+            <van-cell title="任务类型" :value="select_type" @click="select_type_show = true" ></van-cell>
+            <van-popup v-model="select_type_show" position="bottom">
+                <van-picker
+                show-toolbar
+                :columns="select_type_array"
+                @confirm="typeChange"
+                @cancel="select_type_show = false;$forceUpdate();"/>
+            </van-popup>
+            <!-- 时间范围 -->
+            <van-cell class="dateSelectCell" >
+                <template slot="title">
+                    <van-popover
+                    v-model="select_date_type_show"
+                    trigger="click"
+                    :actions="select_date_type_array"
+                    @select="dateTypeChange"
+                    placement="bottom-start">
+                        <template slot="reference">
+                            <span>{{select_date_type}}<van-icon name="arrow-down" size="10" style="margin-left:2px;" /></span>
+                        </template>
+                    </van-popover>
+                </template>
+                <template slot="default">
+                    <div style="width:100%;height:100%" @click="select_date_show = true">{{select_date.length == 0 ? '请选择日期区间' : select_date[0] + ' 至 ' + select_date[1]}}</div>
+                </template>
+                <template slot="extra">
+                    <van-icon v-if="select_date.length != 0" name="close" style="line-height:0.64rem;position:relative;left:5px;" @click.stop="dateClear"/>
+                </template>
+            </van-cell>
+            <van-calendar v-model="select_date_show" type="range" @confirm="dateChange" :min-date="new Date(2010,0,1)" :max-date="new Date(2030,11,31)" />
+            <div class="taskList" v-if="taskList.length != 0">
+                <van-pull-refresh v-model="downLoading" @refresh="onDownRefresh" v-if="active != 3">
+                    <van-list v-model="upLoading" :finished="upFinished" :immediate-check="false" :offset="100" finished-text="没有更多了" @load="onLoadList">
+                        <van-cell v-for="item in taskList" :key="item.id">
+                            <div style="line-height:0.8rem">任务名称:{{item.name}}</div>
+                            <div style="line-height:0.8rem">项目名称:{{item.projectName}}</div>
+                            <div style="line-height:0.8rem">起止时间:
+                                <span v-if="item.startDate && item.endDate">{{(item.startDate ? item.startDate : ' - ') + '\u3000至\u3000' + (item.endDate ? item.endDate : ' - ')}}</span>
+                                <span v-else></span>
+                            </div>
+                            <div class="task_button">
+                                <van-button size="small" type="info" @click="toEditask(item.id)" v-if="authorityEditing || (user.id == item.createrId || user.id == item.inchargerId)">编辑</van-button>
+                                <van-button size="small" type="primary" @click="taskStatus(item.id,0)" v-if="select_state == '进行中'">完成</van-button>
+                                <van-button size="small" color="#e6a23c" @click="taskStatus(item.id,1)" v-else>重启</van-button>
+                            </div>
+                        </van-cell>
+                    </van-list>
+                </van-pull-refresh>
+            </div>
+            <div v-else style="text-align:center;font-size:16px;font-weight:500;color:#999;width:100%;margin-top:16px">暂无数据</div>
+        </div>  
+        <div v-else>
+            <van-list v-model="documentReviewLoading" :finished="finished" finished-text="没有更多了"  @load="getFilesAwaitingReview">
+                <van-cell v-for="item in documentReview" :key="item.id">
+                    <div style="line-height:0.8rem">项目名称:{{item.projectName}}</div>
+                    <div style="line-height:0.8rem">任务名称:{{item.taskName}}</div>
+                    <div style="line-height:0.8rem">执行人:
+                        <span v-for="(item2, index) in item.executorList" :key="index">
+                            <template v-if="user.userNameNeedTranslate == 1">
+                                <TranslationOpenDataText type='userName' :openid='item2.executorName'></TranslationOpenDataText>
+                            </template>
+                            <template v-if="user.userNameNeedTranslate != 1">
+                                {{ item2.executorName }}
+                            </template>
+                            <span v-if="index < item.executorList.length - 1">,</span>
+                        </span>
+                    </div>
+                    <div class="task_button">
+                        <van-button size="small" color="#e6a23c" @click="viewFilesAndReviewThem(item.id)" >查看文件并审核</van-button>
+                    </div>
+                </van-cell>
+            </van-list>
         </div>
-        <div v-else style="text-align:center;font-size:16px;font-weight:500;color:#999;width:100%;margin-top:16px">暂无数据</div>
         
-
+    </van-sticky>
     </div>
   </div>
 </template>
@@ -83,6 +106,8 @@
 export default {
     data() {
         return {
+            finished: false,
+            documentReview: [],
             active: 1,
             user: JSON.parse(localStorage.userInfo),
             viewAlltask: false,
@@ -108,7 +133,7 @@ export default {
             downLoading: false,     // 下拉刷新
             listReLoading: false,   // 是否重新加载列表数据
             authorityEditing: false, // 编辑项目内任务权限
-
+            documentReviewLoading: false,//文件待审核列表加载中
         }
     },
     mounted() {
@@ -124,9 +149,18 @@ export default {
                 this.authorityEditing = true
             }
         }
+        if ((this.user.timeType.taskFileCharge == 1 || this.user.timeType.taskFileCharge == 2) 
+            && this.user.functionList.filter(fun=>fun.name == '审核任务文件').length > 0) {
+            this.active = 3;
+        }
         this.getList()
     },
     methods: {
+        //跳转路由,查看待审核的文件
+        viewFilesAndReviewThem(taskId) {
+            sessionStorage.setItem('taskId',taskId)
+            this.$router.push("/reviewFiles");
+        },
         // 新建任务
         addTask() {
             let item = {
@@ -191,8 +225,12 @@ export default {
         },
         activeClick(){  // 导航点击
             // console.log(this.active);
-            this.listReLoading = true
-            this.onDownRefresh()
+            if (this.active == 3) {
+                this.getFilesAwaitingReview();
+            } else {
+                this.listReLoading = true
+                this.onDownRefresh()
+            }
         },
         stateChange(value,key){  // 任务状态筛选
             this.select_state = value
@@ -275,8 +313,60 @@ export default {
                 this.downLoading = false
                 this.upLoading = false
             });
-        }
+        },
 
+        //获取待审核的文件列表
+        getFilesAwaitingReview() {
+            this.documentReviewLoading = true;
+            let parameter = {
+                pageIndex: this.page,
+                pageSize: 100
+            }
+            this.$axios.post("/task/getTaskChargePage", parameter)
+            .then(res => {
+                if(res.code == "ok") {
+                    this.documentReviewLoading=false;
+                    this.finished = true;
+                    this.documentReview = (res.data.records || []).map((item) => {
+                        return {
+                            ...item,
+                            id: item.taskId
+                        }
+                    })
+                    console.log('222', this.documentReview);
+                    this.$forceUpdate();
+                } else {
+                    this.$message({
+                        message: res.msg,
+                        type: "error"
+                    });
+                }
+            }).catch(err=> {
+                this.documentReviewLoading = false;
+                this.$message({
+                    message: error,
+                    type: "error"
+                });
+            });
+        },
+        getViewFilesAndReviewThemList(taskId) {
+            this.$axios.post("/task-files/getUnChargedFilesByTaskId", {taskId:taskId})
+            .then(res => {
+                if(res.code == "ok") {
+                    
+                } else {
+                    this.$message({
+                        message: res.msg,
+                        type: "error"
+                    });
+                }
+            }).catch(err=> {
+                this.$message({
+                    message: error,
+                    type: "error"
+                });
+            });
+        }
     },
 }
 </script>

+ 59 - 297
fhKeeper/formulahousekeeper/timesheet_mld/src/views/project/info.vue

@@ -122,36 +122,17 @@
                     </div>
                     <div style="margin-top:10px;color:#999;">{{ $t('projectmanager') }}</div>
                     <div><el-link style="margin:10px" @click="showUser(project.inchargerId)">
-                        <span v-if="user.userNameNeedTranslate != 1">{{project.inchargerName}}</span>
-                        <span v-else><TranslationOpenDataText type='userName' :openid='project.inchargerName'></TranslationOpenDataText></span>
+                        <span>{{project.inchargerName}}</span>
                     </el-link></div>
-                    <div v-if="user.timeType.reportAuditType == 8" style="margin-top:10px;color:#999;">{{ $t('other.projectReviwer') }}</div>
-                    <div v-if="user.timeType.reportAuditType == 8"><el-link style="margin:10px" @click="showUser(project.reviwerId)">
-                        <span v-if="user.userNameNeedTranslate != 1">{{project.reviwerName}}</span>
-                        <span v-else><TranslationOpenDataText type='userName' :openid='project.reviwerName'></TranslationOpenDataText></span>
-                    </el-link></div>
-                    <!-- <div v-if="user.timeType.reportAuditType != 8" style="margin-top:10px;color:#999;"> -->
-                    <div v-if="user.timeType.reportAuditType == 0 || user.timeType.reportAuditType == 4 || user.timeType.reportAuditType == 6 || user.timeType.reportAuditType == 9" style="margin-top:10px;color:#999;">
-                        {{ user.timeType.reportCc == 1?'日报抄送人':$t('newspaperauditor') }}
-                    </div>
-                    <!-- <div v-if="user.timeType.reportAuditType != 8"> -->
-                    <div v-if="user.timeType.reportAuditType == 0 || user.timeType.reportAuditType == 4 || user.timeType.reportAuditType == 6 || user.timeType.reportAuditType == 9">
-                        <span v-if="project.auditorList.length == 0" style="margin:10px;">-</span>
-                        <el-link v-for="item in project.auditorList" :key="item.id" style="margin:10px;" @click="showUser(item.auditorId)">
-                            <span v-if="user.userNameNeedTranslate != 1">
-                                {{item.auditorName}}
-                            </span>
-                            <span v-if="user.userNameNeedTranslate == 1">
-                                <TranslationOpenDataText type='userName' :openid='item.auditorName'></TranslationOpenDataText>
-                            </span>
-                        </el-link>
-                    </div>
-                   
+                    
+                    <div style="margin-top:10px;color:#999;" v-if="user.companyId == 876">LA</div>
+                    <div v-if="user.companyId == 876"><el-link v-for="item in project.leaderList" :key="item.id" style="margin:10px;" @click="showUser(item.leaderId)">
+                            <span >{{item.userName}}</span>
+                        </el-link></div>
                     <div v-show="project.isPublic == 0" style="color:#999;">{{ $t('participantin') }}</div>
                     <div v-show="project.isPublic == 0" >
                         <el-link v-for="item in project.participationList" :key="item.id" style="margin:10px;" @click="showUser(item.id)">
-                            <span v-if="user.userNameNeedTranslate != 1">{{item.name}}</span>
-                            <span v-else><TranslationOpenDataText type='userName' :openid='item.name'></TranslationOpenDataText></span>
+                            <span >{{item.name}}</span>
                         </el-link>
                         <el-button class="el-icon-plus" @click="addMembVisible=true" size="mini"></el-button>
                     </div>
@@ -356,7 +337,13 @@
         <!--编辑基本信息界面-->
         <el-dialog :title="$t('jiebnxx')" v-if="addFormVisible" :visible.sync="addFormVisible" :close-on-click-modal="false" customClass="customWidth" width="960px">
             <el-form ref="basicInfoForm" :model="addForm" :rules="rules" label-width="120px">
-                <el-form-item :label="user.companyId == '7030' ? '项目令号' : $t('Itemno')" >
+                <el-form-item :label="$t('projectclassification')" v-if="user.timeType.mainProjectState != '1'">
+                    <!-- <el-select v-model="addForm.category"  style="width:32%;" clearable :disabled="!permissions.projectManagement && addForm.creatorId != user.id"> -->
+                    <el-select v-model="addForm.category"  style="width:32%;" clearable filterable :disabled="canOnlyModParticipator">
+                        <el-option v-for="(item) in baseClfList" :key="item.id" :value="item.id" :label="item.name"></el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item :label="$t('Itemno')" >
                     <el-input v-model="addForm.code"  :placeholder="$t('peaseenterthe')" clearable :disabled="(!permissions.projectManagement && addForm.creatorId != user.id && !permissions.projectCodeAndName) || isShowProjectName"></el-input> 
                 </el-form-item>
                 <el-form-item :label="$t('headerTop.projectName')" prop="name">
@@ -517,7 +504,7 @@
         </el-dialog>
 
         <!--编辑参与人界面-->
-        <el-dialog :title="$t('editParticipants')" v-if="pVisible" :visible.sync="pVisible" :close-on-click-modal="false" customClass="customWidth" width="600px">
+        <el-dialog title="编辑相关人员" v-if="pVisible" :visible.sync="pVisible" :close-on-click-modal="false" customClass="customWidth" width="600px">
             <el-form ref="participForm" :model="addForm" :rules="rules" label-width="120px">
                 <el-form-item :label="$t('Allparticipants')">
                     <el-select v-model="addForm.userId" multiple filterable :placeholder="$t('defaultText.pleaseChoose')" style="width:100%;" @change="changeParticipator" v-if="user.userNameNeedTranslate != 1">
@@ -532,14 +519,10 @@
                     </el-select>
                     <selectCat v-if="user.userNameNeedTranslate == 1" :filterable="true" :widthStr="'430'" :size="'medium'" :subject="project.participationList" :subjectId="addForm.inchargerId" :distinction="'1'" @selectCal="selectCal" :disabled="isShowProjectName"></selectCat>
                 </el-form-item>
-                <el-form-item :label="$t('other.projectReviwer')" v-if="user.timeType.reportAuditType == 8">
-                    <el-select v-if="user.userNameNeedTranslate != 1" v-model="addForm.reviwerId"  filterable :placeholder="$t('defaultText.pleaseChoose')" style="width:100%;" :disabled="isShowProjectName">
-                        <el-option v-for="item in users" :key="item.id" :label="item.name" :value="item.id">
-                            <span style="float: left">{{ item.name }}</span>
-                            <span style="float: right; color: #8492a6;">{{ item.jobNumber }}</span>
-                        </el-option>
+                <el-form-item label="LA" v-if="user.companyId == 876">
+                    <el-select v-model="addForm.leaderId" multiple filterable placeholder="请选择LA" style="width:100%;" :disabled="isShowProjectName" @change="$forceUpdate();">
+                        <el-option v-for="item in (project.participationList || []).filter(em => em.id != addForm.inchargerId)" :key="item.id" :label="item.name" :value="item.id"></el-option>
                     </el-select>
-                    <selectCat v-if="user.userNameNeedTranslate == 1" :filterable="true" :widthStr="'430'" :size="'medium'" :subject="users" :subjectId="addForm.reviwerId" :distinction="'1'" @selectCal="selectCal" :disabled="isShowProjectName"></selectCat>
                 </el-form-item>
             </el-form>
             <div slot="footer" class="dialog-footer">
@@ -564,151 +547,10 @@
                 <el-button type="primary" @click="submitAddMemb" :loading="addLoading">{{ $t('btn.submit') }}</el-button>
             </div>
         </el-dialog>
-
-        <!--修改工程专业界面-->
-        <el-dialog :title="$t('engineering')" v-if="editProfessionDialog" :visible.sync="editProfessionDialog" 
-        :close-on-click-modal="false" customClass="customWidth" width="1000px">
-        <div class="gongcheng">
-            <el-table :data="projectProfessionList" size="small" height="500" :key="Math.random()">
-                <el-table-column prop="professionId" width="200">
-                                   <template slot-scope="scope">
-                                       <el-select v-model="scope.row.professionId" >
-                                           <el-option v-for="item in professionList" :key="item.id" :label="item.name" :value="item.id"/>
-                                       </el-select>
-                                   </template>
-                                   <template slot="header" >
-                                       <span style="font-size:14px;font-weight:normal;">{{ $t('nameprofessional') }}</span>
-                                   </template>
-                               </el-table-column>
-                               <el-table-column prop="percentage" width="100" :label="$t('Accountedfor')">
-                                   <template slot-scope="scope">
-                                       <el-input type="number" v-model="scope.row.percentage"></el-input>
-                                   </template>
-                               </el-table-column>
-                               
-                               <el-table-column prop="membNames" :label="$t('personnelproportion')">
-                                   <template slot-scope="scope">
-                                       <span style="margin:0 5px;" v-for="item in scope.row.membList" :key="item.membId">
-                                            <span v-if="user.userNameNeedTranslate != 1">{{item.membName}}({{item.percentage}}%)</span>
-                                            <span v-if="user.userNameNeedTranslate == 1">
-                                                <TranslationOpenDataText type='userName' :openid='item.membName'></TranslationOpenDataText>({{item.percentage}}%)
-                                            </span>
-                                        </span>
-                                       <el-link @click="showEditPpMembs(scope.row)">
-                                            {{(scope.row.membList == null || scope.row.membList.length == 0)?$t('professionalparticipants'):$t('setup')}}
-                                       </el-link>
-                                   </template>
-                               </el-table-column>
-                               <el-table-column prop="inchargerName" width="200" :label="$t('head')">
-                                   <template slot-scope="scope">
-                                       <el-select v-model="scope.row.inchargerId" v-if="user.userNameNeedTranslate != 1">
-                                           <el-option v-for="item in participator" :key="item.id" :label="item.name" :value="item.id">
-                                           </el-option>
-                                       </el-select>
-                                       <selectCat v-if="user.userNameNeedTranslate == 1" :size="'mini'" :subject="participator" :subjectId="scope.row.inchargerId" :other="scope.$index" :distinction="'2'" @selectCal="selectCal"></selectCat>
-                                   </template>
-                               </el-table-column>
-                               <el-table-column  width="80">
-                                   <template slot-scope="scope">
-                                       <el-button icon="el-icon-delete" size="mini" style="margin-left:10px;" @click.stop.native="deleteItem(scope.$index)"></el-button>
-                                   </template>
-                                   <template slot="header" >
-                                       <el-link type="primary" :underline="false" @click="addItem">{{ $t('addTian') }}</el-link>
-                                   </template>
-                               </el-table-column>
-            </el-table>
-            <div slot="footer" class="dialog-footer">
-                <el-button @click.native="editProfessionDialog = false">{{ $t('btn.cancel') }}</el-button>
-                <el-button type="primary" @click="saveProjectProfessions" :loading="addLoading">{{ $t('btn.submit') }}</el-button>
-            </div>
-        </div>
-        </el-dialog>
-
-        <!-- 项目专业人员的设置 -->
-        <el-dialog :title="$t('setupprojectprofessionals')"  v-if="editPpMembDialog" :visible.sync="editPpMembDialog" :close-on-click-modal="false" customClass="customWidth" width="600px">
-            <div class="gongcheng">
-            <el-table :data="curProfessionRow.membList" height="400">
-                <el-table-column prop="name" :label="$t('professionals')">
-                    <template slot-scope="scope">
-                        <el-select v-if="user.userNameNeedTranslate != 1" v-model="scope.row.membId"  filterable :placeholder="$t('professionaladdsparticipant')" style="width:100%;" >
-                            <el-option v-for="item in participator" :key="item.id" :label="item.name" :value="item.id">
-                            </el-option>
-                        </el-select>
-                        <selectCat v-if="user.userNameNeedTranslate == 1" :size="'medium'" :subject="participator" :subjectId="scope.row.membId" :distinction="'3'" :other="scope.$index" @selectCal="selectCal"></selectCat>
-                    </template>
-                </el-table-column>
-                <el-table-column prop="percentage" width="120" :label="$t('zhan-bi')">
-                    <template slot-scope="scope">
-                        <el-input type="number" v-model="scope.row.percentage"></el-input>
-                    </template>
-                </el-table-column>
-                <el-table-column  width="80">
-                    <template slot-scope="scope">
-                        <el-button icon="el-icon-delete" size="mini" style="margin-left:10px;" @click.stop.native="deleteMembItem(scope.$index)"></el-button>
-                    </template>
-                    <template slot="header" >
-                        <el-link @click="addMembItem">{{ $t('addTian') }}</el-link>
-                    </template>
-                </el-table-column>
-            </el-table>
-            <div slot="footer" class="dialog-footer">
-                <el-button  @click="editPpMembDialog = false" >{{ $t('btn.cancel') }}</el-button>
-                <el-button type="primary" @click="addPpMemb" >{{ $t('btn.determine') }}</el-button>
-            </div>
-            </div>
-        </el-dialog>
-        <!-- 编辑项目关键节点 -->
-        <el-dialog :title="$t('editkeyprojectnodes')" :visible.sync="keyNodeIsShow" width="960px" :before-close="handleClose">
-            <div>
-                <!--新版 -->
-                <div class="keyNodes">
-                    <div class="keyNodesName">{{ $t('nameofthenode') }}</div>
-                    <div class="keyNodesTime">{{ $t('plannedcompletiontime') }}</div>
-                    <div class="keyNodesTime">{{ $t('actualcompletiontime') }}</div>
-                    <div class="keyNodesTime">{{ $t('state.states') }}</div>
-                </div>
-                <div class="keyNodes" v-for="item in projectKeyNodesData" :key="item.nodesId">
-                    <div class="keyNodesName">{{item.nodesName}}</div>
-                    <div class="keyNodesTime">
-                        <el-date-picker v-model="item.planCompleteDate" clearable style="width: 80%" size="small" :editable="false" format="yyyy-MM-dd"  value-format="yyyy-MM-dd" type="date"  :placeholder="$t('optiondate')"></el-date-picker>
-                    </div>
-                    <div class="keyNodesTime">
-                        <el-date-picker v-model="item.actualCompleteDate" clearable style="width: 80%" size="small" :editable="false" format="yyyy-MM-dd"  value-format="yyyy-MM-dd" type="date"  :placeholder="$t('optiondate')"></el-date-picker>
-                    </div>
-                    <div class="keyNodesTime">
-                        <el-select v-model="item.states" :placeholder="$t('defaultText.pleaseChoose')" style="width: 80%" size="small">
-                            <el-option :label="$t('zheng-chang')" value="0"></el-option>
-                            <el-option :label="$t('yu-qi')" value="1"></el-option>
-                            <el-option :label="$t('wan-cheng')" value="2"></el-option>
-                        </el-select>
-                    </div>
-                </div>
-            </div>
-            <span slot="footer" class="dialog-footer">
-                <el-button @click="keyNodeIsShow = false">{{ $t('btn.cancel') }}</el-button>
-                <el-button type="primary" @click="submitKeyNodeaddForm()">{{ $t('btn.determine') }}</el-button>
-            </span>
-        </el-dialog>
         <!-- 图片放大弹窗 -->
         <el-dialog :visible.sync="imgUrlListFlg" width="70%" :before-close="xhutDown">
             <img width="100%" :src="imgUrlLists" alt="">
         </el-dialog>
-        
-        <!-- 按部门选择相关领导,弃用 -->
-        <!-- <el-dialog title="选择相关领导"  v-if="chooseLeaderVisible" :visible.sync="chooseLeaderVisible" :close-on-click-modal="false" customClass="customWidth" width="500px">
-            <div class="tree" style="height:400px">
-                <el-scrollbar style="height:100%">
-                <el-tree :data="deptMembData" show-checkbox :props="defaultProps" node-key="id"
-                    ref="chooseLeaderTree" @check-change="onLeaderTreeItemChange" :default-checked-keys="addForm.notifyUserIds"
-                    highlight-current ></el-tree>
-                </el-scrollbar>
-            </div>
-            <div>已选中&nbsp;{{chosenMembCount}}&nbsp;人</div>
-            <div slot="footer" class="dialog-footer">
-                <el-button  @click="chooseLeaderVisible = false" >取消</el-button>
-                <el-button type="primary" @click="chooseLeader()" >确定</el-button>
-            </div>
-        </el-dialog> -->
     </div>
 </template>
 <style scoped>
@@ -831,8 +673,7 @@
                 yonghuUser: [],
                 ause: [], // 研究中心总数据
                 auseList: [], // 选中的研究中心
-
-
+                baseClfList: [],
                 contractDialog: false,
                 contractData: {},
                 contractRecordDialog: false,
@@ -1157,6 +998,30 @@
                         });
                     });
             },
+            // 获取分类条目
+            getClfConfigList() {
+                this.http.get('/project-category/list',
+                    res => {
+                        if (res.code == "ok") {
+                           this.baseClfList = res.data;
+                        //    console.log("获取分类条目",res.data);
+                           this.$forceUpdate();
+                        } else {
+                            this.$message({
+                                message: res.msg,
+                                type: "error"
+                            });
+                        }
+                    },
+                    error => {
+                        this.$message({
+                            message: error,
+                            type: "error"
+                        });
+                        }
+                    );
+                
+            },
             showChooseLeaderTree() {
                 this.chosenMembCount = this.chosenLeaders.length;
                 this.chooseLeaderVisible = true;
@@ -1380,70 +1245,7 @@
                         });
                     });
             },
-            //保存项目专业
-            saveProjectProfessions() {
-                if (!this.checkProjectProfession()) {//检查不通过,直接返回
-                    return;
-                }
-                let projectId = this.curProjectId;
-                var list = this.projectProfessionList.filter(p=>p.professionId != null);
-                list.forEach(p=>p.inchargerName = this.participator.filter(m=>m.id == p.inchargerId)[0].name);
-                list.forEach(p=>p.professionName = this.professionList.filter(m=>m.id == p.professionId)[0].name);
-                this.http.post("/project-profession/modify", {projectId: projectId, json: JSON.stringify(list)},
-                res => {
-                    if (res.code == "ok") {
-                        this.editProfessionDialog = false;
-                        this.projectProfessionListOnPage = res.data;
-                        this.$message({
-                            message: this.$t('message.modifyTheSuccess'),
-                            type: "success"
-                        });
-                    } else {
-                        this.$message({
-                            message: res.msg,
-                            type: "error"
-                        });
-                    }
-                },
-                error => {
-                    this.$message({
-                        message: error,
-                        type: "error"
-                    });
-                });
-            },
-            //删除项目专业
-            deleteItem(index) {
-                this.projectProfessionList.splice(index,1);
-            },
-            //添加项目专业
-            addItem() {
-                let p = 0;
-                this.projectProfessionList.forEach(m=>{
-                    p += parseInt(m.percentage);
-                });
-                this.projectProfessionList.push( { professionId:null, inchargerId:null,membIds:[], percentage: 100-p});
-            },
-            getProfessionList() {
-                this.http.post("/profession/getAll", {},
-                res => {
-                    if (res.code == "ok") {
-                        var list = res.data;
-                        this.professionList = list;
-                    } else {
-                        this.$message({
-                            message: res.msg,
-                            type: "error"
-                        });
-                    }
-                },
-                error => {
-                    this.$message({
-                        message: error,
-                        type: "error"
-                    });
-                });
-            },
+            
             getProjectBaseData(projectId) {
                 this.http.post('/project-basecost/get',{projectId: projectId},
                         res => {
@@ -1632,9 +1434,12 @@
                 if(this.addForm.inchargerId != null) {
                     formData.append("inchargerId", this.addForm.inchargerId);
                 }
-                formData.append("onlyChangeParticipate", 'true');
-                
-                this.http.uploadFile(this.port.project.add,formData,
+                if (this.addForm.leaderId.length != 0) {
+                    for(var j in this.addForm.leaderId) {
+                        formData.append("leaderIds", this.addForm.leaderId[j]);
+                    }
+                }
+                this.http.uploadFile('/project/editProjectMembs',formData,
                 res => {
                     this.addLoading = false;
                     if (res.code == "ok") {
@@ -1670,13 +1475,8 @@
                         if(this.addForm.id != null) {
                             formData.append("id", this.addForm.id);
                         }
-                        if(this.addForm.userId.length != 0) {
-                            for(var j in this.addForm.userId) {
-                                formData.append("userId", this.addForm.userId[j]);
-                            }
-                        }
-                        if(this.addForm.inchargerId != null) {
-                            formData.append("inchargerId", this.addForm.inchargerId);
+                        if(this.addForm.category != null) {
+                            formData.append("category", this.addForm.category);
                         }
                         if(this.addForm.code != null) {
                             formData.append("code", this.addForm.code);
@@ -1696,9 +1496,6 @@
                         if(this.addForm.projectDesc != null) {
                             formData.append("projectDesc", this.addForm.projectDesc);
                         }
-                        if(this.user.timeType.outputValueStatus == 1){
-                            formData.append("outputValue", this.addForm.outputValue ? this.addForm.outputValue : 0)
-                        }
                         var listId = []
                         var listName = []
                         if(this.auseList.length > 0) {
@@ -1717,18 +1514,6 @@
                         // console.log(listId, listName)
                         formData.append("associateDegrees", listId)
                         formData.append("associateDegreeNames", listName)
-                        // 判断公司id是否等于 936
-                        if(this.user.companyId == '936') {
-                             formData.append("contractCode", this.addForm.projectSeparate.contractCode ? this.addForm.projectSeparate.contractCode : '');
-                             formData.append("warrantyStartDate", this.addForm.projectSeparate.warrantyStartDate ? this.addForm.projectSeparate.warrantyStartDate : '');
-                             formData.append("warrantyEndDate", this.addForm.projectSeparate.warrantyEndDate ? this.addForm.projectSeparate.warrantyEndDate : '');
-                             formData.append("projectCategorySub", this.addForm.projectSeparate.projectCategorySub ? this.addForm.projectSeparate.projectCategorySub : '');
-                             formData.append("region", this.addForm.projectSeparate.region ? this.addForm.projectSeparate.region : '');
-                             formData.append("bu", this.addForm.projectSeparate.bu ? this.addForm.projectSeparate.bu : '');
-                        }
-                        // if(this.user.companyId == '428') {
-                        //      formData.append("projectCategorySub", this.addForm.projectSeparate.projectCategorySub ? this.addForm.projectSeparate.projectCategorySub : '');
-                        // }
                         if(this.user.timeType.projectWithDept) {
                             if(this.addForm.deptId != null && this.addForm.deptId != '') {
                                 formData.append("deptId", this.addForm.deptId[this.addForm.deptId.length - 1]);
@@ -1745,7 +1530,7 @@
                          }
                          
                         // return
-                        this.http.uploadFile(this.port.project.add,formData,
+                        this.http.uploadFile('/project/editProjectBasic',formData,
                         res => {
                             this.addLoading = false;
                             if (res.code == "ok") {
@@ -1776,8 +1561,6 @@
             showEdit() {
                 this.addForm = JSON.parse(JSON.stringify(this.project));
                 this.dataList = JSON.parse(JSON.stringify(this.dataListTwo));
-                // console.log('---'+this.project);
-                // console.log(this.addForm.projectCode);
                 
                 var list = this.project.participationList , arr = [];
                 for(var j in list) {
@@ -1789,7 +1572,6 @@
                 this.addForm.userId = arr
 
                 this.addFormVisible = true;
-                // console.log(this.addForm, 123)
                 var arr = []
                 // if(this.addForm.associateDegrees != null) {
                     if(this.addForm.associateDegrees.length > 0) {
@@ -1835,6 +1617,11 @@
                     arr.push(list[j].id)
                 }
                 this.addForm.userId = arr;
+                var laArray = [];
+                for (var j in this.project.leaderList) {
+                    laArray.push(this.project.leaderList[j].leaderId);
+                }
+                this.addForm.leaderId = laArray;
                 // console.log(this.addForm.userId );
 
                 this.pVisible = true;
@@ -1993,32 +1780,6 @@
                     this.listLoading = false;
                     if (res.code == "ok") {
                         this.project = res.data;
-                        if(this.user.companyId == '936' || this.user.companyId == '428') {
-                            if(res.data.projectSeparate) {
-                                this.project = res.data;
-                            } else {
-                                if(this.user.companyId == '936') {
-                                    var obj = {
-                                        contractCode: '',
-                                        warrantyStartDate: '',
-                                        warrantyEndDate: '',
-                                        projectCategorySub: '',
-                                        region: '',
-                                        bu: '',
-                                    }
-                                    res.data.projectSeparate = obj
-                                    this.project = res.data;
-                                } else {
-                                    var obj = {
-                                        projectCategorySub: '',
-                                    }
-                                    res.data.projectSeparate = obj
-                                    this.project = res.data;
-                                }
-                            }
-                        } else {
-                            this.project = res.data;
-                        }
                         this.participator = this.project.participationList;
                         if(this.user.timeType.projectCustom) {
                             this.chulishuju(this.project)
@@ -2259,6 +2020,7 @@
             this.userssHu()
             this.yanjiuzx()
             this.getProjectLevel()
+            this.getClfConfigList();
             // if(this.user.timeType.projectWithDept) {
             //     this.getProjectLevel()
             // }