Min 1 year ago
parent
commit
f331261d6b
12 changed files with 716 additions and 91 deletions
  1. 10 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/GroupBudgetReviewController.java
  2. 5 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java
  3. 17 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskController.java
  4. 80 27
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskGroupController.java
  5. 3 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TaskGroup.java
  6. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/LaborHourRateVo.java
  7. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectService.java
  8. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/TaskGroupService.java
  9. 189 12
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  10. 93 44
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/TaskGroupServiceImpl.java
  11. 5 0
      fhKeeper/formulahousekeeper/timesheet/src/views/corpreport/list.vue
  12. 309 5
      fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue

+ 10 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/GroupBudgetReviewController.java

@@ -7,6 +7,7 @@ import com.management.platform.mapper.ProjectMapper;
 import com.management.platform.mapper.TaskGroupMapper;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.GroupBudgetReviewService;
+import com.management.platform.service.TaskService;
 import com.management.platform.util.HttpRespMsg;
 import org.springframework.web.bind.annotation.RequestMapping;
 
@@ -16,6 +17,7 @@ import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import java.math.BigDecimal;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -39,6 +41,8 @@ public class GroupBudgetReviewController {
     private TaskGroupMapper taskGroupMapper;
     @Resource
     private ProjectMapper projectMapper;
+    @Resource
+    private TaskService taskService;
 
     @RequestMapping("/add")
     public HttpRespMsg add(Integer groupId,Integer oldManDay,Integer changeManDay,Integer nowManDay,String remark){
@@ -51,6 +55,12 @@ public class GroupBudgetReviewController {
         GroupBudgetReview groupBudgetReview=new GroupBudgetReview();
         TaskGroup taskGroup = taskGroupMapper.selectById(groupId);
         Project project = projectMapper.selectById(taskGroup.getProjectId());
+        List<Task> taskList = taskService.list(new LambdaQueryWrapper<Task>().select(Task::getPlanHours,Task::getGroupId).isNotNull(Task::getPlanHours).eq(Task::getGroupId, groupId));
+        int sum = taskList.stream().mapToInt(Task::getPlanHours).sum();
+        if(sum>((nowManDay==null?0:nowManDay)*8)){
+            httpRespMsg.setError("任务分组["+taskGroup.getName()+"]的预估工时需大于等于已分配任务的总计划工时["+sum+"]小时");
+            return httpRespMsg;
+        }
         groupBudgetReview.setGroupId(groupId).setGroupName(taskGroup.getName())
                 .setOldManDay(oldManDay)
                 .setChangeManDay(changeManDay)

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

@@ -1440,6 +1440,11 @@ public class ProjectController {
         return projectService.getEffectiveLaborHourRate(startDate,endDate);
     }
 
+    @RequestMapping("/exportEffectiveLaborHourRate")
+    public HttpRespMsg exportEffectiveLaborHourRate(String startDate,String endDate){
+        return projectService.exportEffectiveLaborHourRate(startDate,endDate);
+    }
+
 
     @RequestMapping("/getMembProjectCateRatio")
     public HttpRespMsg getMembProjectCateRatio(String startDate,String endDate, Integer onlyShowWarning){

+ 17 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskController.java

@@ -169,7 +169,23 @@ public class TaskController {
                     }
                 }
             }
-
+            //针对依斯呗的校验
+            if(user.getCompanyId()==3092){
+                if(task.getGroupId()!=null){
+                    TaskGroup taskGroup = taskGroupService.getById(task.getGroupId());
+                    if(taskGroup.getManDay()==null){
+                        msg.setError("创建失败,请先分配任务分组的预估工时");
+                        return msg;
+                    }
+                    //计算当前分组下的所有任务的计划工时
+                    List<Task> taskList = taskMapper.selectList(new LambdaQueryWrapper<Task>().select(Task::getPlanHours).eq(Task::getGroupId, taskGroup.getId()).isNotNull(Task::getPlanHours).ne(task.getId()!=null,Task::getId,task.getId()));
+                    int sum = taskList.stream().mapToInt(Task::getPlanHours).sum();
+                    if((sum+(task.getPlanHours()==null?0:task.getPlanHours()))>(taskGroup.getManDay()*8)){
+                        msg.setError("任务分组的预估工时不足,请增加预估工时");
+                        return msg;
+                    }
+                }
+            }
             //检查执行人是否在当前分组的参与人当中
             List<GroupParticipator> groupParticipatorList = groupParticipatorMapper.selectList(new QueryWrapper<GroupParticipator>().eq("group_id", task.getGroupId()));
             List<Participation> participationList = participationMapper.selectList(new QueryWrapper<Participation>().eq("project_id", task.getProjectId()));

+ 80 - 27
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskGroupController.java

@@ -3,13 +3,16 @@ package com.management.platform.controller;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.management.platform.entity.*;
 import com.management.platform.entity.vo.setTemplate;
 import com.management.platform.mapper.*;
 import com.management.platform.service.*;
 import com.management.platform.util.HttpRespMsg;
+import com.management.platform.util.ListUtil;
 import com.management.platform.util.MessageUtils;
+import org.springframework.beans.BeanUtils;
 import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -94,32 +97,74 @@ public class TaskGroupController {
                 return msg;
             }
         }
-        boolean hasSameName = false;
-        if (item.getId() == null) {
-            item.setNew(true);
-            int cnt = taskGroupService.count(new QueryWrapper<TaskGroup>().eq("project_id", item.getProjectId()).eq("name", item.getName()));
-            hasSameName = cnt>0;
-        } else {
-            int cnt = taskGroupService.count(new QueryWrapper<TaskGroup>()
-                    .eq("project_id", item.getProjectId()).eq("name", item.getName())
-                    .ne("id", item.getId()));
-            hasSameName = cnt>0;
-        }
-        //检查是否有同名的分组
-        if (hasSameName) {
-            //msg.setError("分组存在重名");
-            msg.setError(MessageUtils.message("group.RepeatName"));
-        } else {
-            taskGroupService.saveOrUpdate(item);
-            QueryWrapper<TaskGroup> queryWrapper = new QueryWrapper<TaskGroup>();
-            queryWrapper.eq("project_id", item.getProjectId());
-            List<TaskGroup> groupList = taskGroupService.list(queryWrapper);
-            groupList.stream().forEach(g->{
-                if (g.getId().equals(item.getId())) {
-                    g.setNew(item.isNew());
+        if(StringUtils.isEmpty(item.getProjectIds())){
+            boolean hasSameName = false;
+            if (item.getId() == null) {
+                item.setNew(true);
+                int cnt = taskGroupService.count(new QueryWrapper<TaskGroup>().eq("project_id", item.getProjectId()).eq("name", item.getName()));
+                hasSameName = cnt>0;
+            } else {
+                int cnt = taskGroupService.count(new QueryWrapper<TaskGroup>()
+                        .eq("project_id", item.getProjectId()).eq("name", item.getName())
+                        .ne("id", item.getId()));
+                hasSameName = cnt>0;
+            }
+            //检查是否有同名的分组
+            if (hasSameName) {
+                //msg.setError("分组存在重名");
+                msg.setError(MessageUtils.message("group.RepeatName"));
+            } else {
+                taskGroupService.saveOrUpdate(item);
+                QueryWrapper<TaskGroup> queryWrapper = new QueryWrapper<TaskGroup>();
+                queryWrapper.eq("project_id", item.getProjectId());
+                List<TaskGroup> groupList = taskGroupService.list(queryWrapper);
+                groupList.stream().forEach(g->{
+                    if (g.getId().equals(item.getId())) {
+                        g.setNew(item.isNew());
+                    }
+                });
+                msg.data = groupList;
+            }
+        }else {
+            List<Integer> list = ListUtil.convertIntegerIdsArrayToList(item.getProjectIds());
+            List<TaskGroup> taskGroupList=new ArrayList<>();
+            for (Integer projectId : list) {
+                boolean hasSameName = false;
+                if (item.getId() == null) {
+                    item.setNew(true);
+                    int cnt = taskGroupService.count(new QueryWrapper<TaskGroup>().eq("project_id", projectId).eq("name", item.getName()));
+                    hasSameName = cnt>0;
+                } else {
+                    int cnt = taskGroupService.count(new QueryWrapper<TaskGroup>()
+                            .eq("project_id", projectId).eq("name", item.getName())
+                            .ne("id", item.getId()));
+                    hasSameName = cnt>0;
                 }
-            });
-            msg.data = groupList;
+                //检查是否有同名的分组
+                if (hasSameName) {
+                    //msg.setError("分组存在重名");
+                    msg.setError(MessageUtils.message("group.RepeatName"));
+                    return msg;
+                } else {
+                    TaskGroup targetItem=new TaskGroup();
+                    BeanUtils.copyProperties(item,targetItem);
+                    targetItem.setProjectId(projectId);
+                    taskGroupList.add(targetItem);
+                    QueryWrapper<TaskGroup> queryWrapper = new QueryWrapper<TaskGroup>();
+                    queryWrapper.eq("project_id", projectId);
+                    List<TaskGroup> groupList = taskGroupService.list(queryWrapper);
+                    groupList.stream().forEach(g->{
+                        if (g.getId().equals(item.getId())) {
+                            g.setNew(item.isNew());
+                        }
+                    });
+                }
+            }
+            if(taskGroupList.size()>0){
+                if(!taskGroupService.saveOrUpdateBatch(taskGroupList)){
+                    msg.setError("验证失败");
+                }
+            }
         }
         return msg;
     }
@@ -130,8 +175,16 @@ public class TaskGroupController {
         List<TaskGroup> groupList = JSON.parseArray(data, TaskGroup.class);
         List<TaskGroup> addList = new ArrayList<>();
         int totalManDay = 0;
+        List<Integer> groupIds = groupList.stream().map(TaskGroup::getId).collect(Collectors.toList());
+        List<Task> taskList = taskService.list(new LambdaQueryWrapper<Task>().select(Task::getPlanHours,Task::getGroupId).isNotNull(Task::getPlanHours).in(Task::getGroupId, groupIds));
         for (TaskGroup taskGroup : groupList) {
             TaskGroup item = new TaskGroup();
+            List<Task> targetTaskList = taskList.stream().filter(t -> t.getGroupId() != null && t.getGroupId().equals(taskGroup.getId())).collect(Collectors.toList());
+            int sum = targetTaskList.stream().mapToInt(Task::getPlanHours).sum();
+            if(sum>((taskGroup.getManDay()==null?0:taskGroup.getManDay())*8)){
+                msg.setError("任务分组["+taskGroup.getName()+"]的预估工时需大于等于已分配任务的总计划工时["+sum+"]小时");
+                return msg;
+            }
             item.setId(taskGroup.getId());
             if (taskGroup.getManDay() == null) {
                 item.setManDay(0);
@@ -466,8 +519,8 @@ public class TaskGroupController {
 
 
     @RequestMapping("/createFromTemplate")
-    public HttpRespMsg createFromTemplate(String templateJson, Integer projectId) {
-        return taskGroupService.createFromTemplate(templateJson, projectId);
+    public HttpRespMsg createFromTemplate(String templateJson, Integer projectId,String projectIds) {
+        return taskGroupService.createFromTemplate(templateJson, projectId,projectIds);
     }
 
 

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

@@ -67,6 +67,9 @@ public class TaskGroup extends Model<TaskGroup> {
     @TableField(exist = false)
     private String uuid;
 
+    @TableField(exist = false)
+    private String projectIds;
+
 
     @Override
     protected Serializable pkVal() {

+ 2 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/LaborHourRateVo.java

@@ -3,6 +3,7 @@ package com.management.platform.entity.vo;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
+import org.springframework.util.StringUtils;
 
 import java.util.List;
 
@@ -18,5 +19,5 @@ public class LaborHourRateVo {
     private Integer date_count;//应报工时天数
     private Integer day_time;//日标准工时
     private Long total_time;//应报工时
-    private Double rate;//比率
+    private String rate;//比率
 }

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

@@ -288,4 +288,6 @@ public interface ProjectService extends IService<Project> {
     HttpRespMsg userTaskProcessList(Integer deptId, String userId, Integer projectId,String startDate,String endDate, Integer pageIndex, Integer pageSize);
 
     HttpRespMsg exportUserTaskProcessList(Integer deptId, String userId, Integer projectId,String startDate,String endDate);
+
+    HttpRespMsg exportEffectiveLaborHourRate(String startDate, String endDate);
 }

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

@@ -21,5 +21,5 @@ public interface TaskGroupService extends IService<TaskGroup> {
 
     void saveGroupIncharger(TaskGroup taskGroup, User user);
 
-    HttpRespMsg createFromTemplate(String templateJson, Integer projectId);
+    HttpRespMsg createFromTemplate(String templateJson, Integer projectId,String projectIds);
 }

+ 189 - 12
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -11953,7 +11953,9 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     @Override
     public HttpRespMsg getEffectiveLaborHourRate(String startDate, String endDate) {
         LambdaQueryWrapper<Department> lqw = new LambdaQueryWrapper<>();
-        lqw.in(Department::getDepartmentId,7526,7560,7539,7643,7645,7536,7547,7388,7578);
+        NumberFormat numberFormat=NumberFormat.getPercentInstance();
+        numberFormat.setMaximumFractionDigits(2);
+        lqw.in(Department::getDepartmentId,7526,7560,7539,7643,7645,7536,7547,7388,7578,7558,7608,7611,7613,7631,7894,7896);
         List<Department> departments = departmentMapper.selectList(lqw);
 
         ArrayList<LaborHourRateVo> laborHourRateVos = new ArrayList<>();
@@ -12027,18 +12029,15 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             int v = 8 * inActiveDays + idStrings.size() * 8 * dayCount;
             if (v== 0) {
                 laborHourRateVo.setTotal_time(0L);
-                laborHourRateVo.setRate(0.0);
+                laborHourRateVo.setRate(numberFormat.format(0));
                 laborHourRateVos.add(laborHourRateVo);
             } else {
                 laborHourRateVo.setTotal_time((long) (v));//应报工时还少了在职的加上可能辞职的
-                BigDecimal bd = new BigDecimal(timeSum/(v)*100);
-                bd = bd.setScale(2, RoundingMode.HALF_UP);
-                laborHourRateVo.setRate(bd.doubleValue());
+                BigDecimal bd = new BigDecimal(timeSum/(v));
+                bd = bd.setScale(4, RoundingMode.HALF_UP);
+                laborHourRateVo.setRate(numberFormat.format(bd.doubleValue()));
                 laborHourRateVos.add(laborHourRateVo);
             }
-
-//            System.out.println("============="+inActiveDays);
-//            System.out.println("============="+isActiveCount);
             laborHourRateVo.setDay_time(8);
 
 
@@ -12056,11 +12055,11 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         laborHourRateVo.setDate_count(dayCount);
 
         if (sumTotalTime > 0) {
-            BigDecimal bd = new BigDecimal(totalWorkTime/sumTotalTime*100);
-            bd = bd.setScale(2, RoundingMode.HALF_UP);
-            laborHourRateVo.setRate(bd.doubleValue());
+            BigDecimal bd = new BigDecimal(totalWorkTime/sumTotalTime);
+            bd = bd.setScale(4, RoundingMode.HALF_UP);
+            laborHourRateVo.setRate(numberFormat.format(bd.doubleValue()));
         } else {
-            laborHourRateVo.setRate(0.0);
+            laborHourRateVo.setRate(numberFormat.format(0));
         }
 
         laborHourRateVos.add(laborHourRateVo);
@@ -12070,6 +12069,184 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         return msg;
     }
 
+    @Override
+    public HttpRespMsg exportEffectiveLaborHourRate(String startDate, String endDate) {
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        HttpRespMsg msgData = getEffectiveLaborHourRate(startDate, endDate);
+        List<LaborHourRateVo> resultList= (List<LaborHourRateVo>) msgData.getData();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, companyId));
+        Company company = companyMapper.selectById(companyId);
+        //1.创建一个workbook,对应一个excel文件
+        SXSSFWorkbook workBook = new SXSSFWorkbook();
+        //2.在workbook中添加一个sheet,对应Excel中的sheet
+        SXSSFSheet sheet = workBook.createSheet("有效工时率报表");
+        //设置每一列的列宽
+        sheet.setColumnWidth(0,256*15);
+        sheet.setColumnWidth(1,256*15);
+        //3.设置样式以及字体样式
+        //设置冻结
+        sheet.createFreezePane(0, 2);
+        sheet.setDefaultColumnWidth(16);
+        //设置字体样式
+        Font headFont = workBook.createFont();
+        headFont.setBold(true);
+        headFont.setFontHeightInPoints((short) 10);
+        headFont.setFontName("黑体");
+
+        Font titleFont = workBook.createFont();
+        titleFont.setBold(true);
+        titleFont.setFontHeightInPoints((short) 10);
+        titleFont.setFontName("黑体");
+
+        Font font = workBook.createFont();
+        font.setFontHeightInPoints((short) 10);
+        font.setFontName("宋体");
+
+        //设置单元格样式
+        XSSFCellStyle headStyle = (XSSFCellStyle) workBook.createCellStyle();
+        headStyle.setFont(headFont);
+        headStyle.setAlignment(HorizontalAlignment.CENTER);
+        headStyle.setVerticalAlignment(org.apache.poi.ss.usermodel.VerticalAlignment.CENTER);
+        headStyle.setWrapText(true);
+        headStyle.setBorderBottom(BorderStyle.THIN); //下边框
+        headStyle.setBorderLeft(BorderStyle.THIN);//左边框
+        headStyle.setBorderTop(BorderStyle.THIN);//上边框
+        headStyle.setBorderRight(BorderStyle.THIN);//右边框
+
+        String color = "c0c0c0";    //此处得到的color为16进制的字符串
+        //转为RGB码
+        int r = Integer.parseInt((color.substring(0,2)),16);   //转为16进制
+        int g = Integer.parseInt((color.substring(2,4)),16);
+        int b = Integer.parseInt((color.substring(4,6)),16);
+
+        //设置自定义颜色
+        XSSFColor xssfColor = new XSSFColor();
+        byte[] colorRgb = { (short)9, (byte) r, (byte) g, (byte) b };
+        xssfColor.setRGB(colorRgb);
+
+        headStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.index);
+        headStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);// 填充模式(和背景颜色成对使用)
+        /*headStyle.setFillForegroundColor(IndexedColors.AQUA.getIndex());*/ //设置自带的颜色
+
+        CellStyle titleStyle = workBook.createCellStyle();
+        titleStyle.setFont(titleFont);
+        titleStyle.setAlignment(HorizontalAlignment.CENTER);
+        titleStyle.setVerticalAlignment(org.apache.poi.ss.usermodel.VerticalAlignment.CENTER);
+        titleStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);  //填充单元格
+        titleStyle.setFillForegroundColor((short)9);    //填色
+        titleStyle.setWrapText(true);
+        titleStyle.setBorderBottom(BorderStyle.THIN); //下边框
+        titleStyle.setBorderLeft(BorderStyle.THIN);//左边框
+        titleStyle.setBorderTop(BorderStyle.THIN);//上边框
+        titleStyle.setBorderRight(BorderStyle.THIN);//右边框
+
+        CellStyle cellStyle = workBook.createCellStyle();
+        cellStyle.setFont(font);
+        cellStyle.setAlignment(HorizontalAlignment.CENTER);
+        cellStyle.setVerticalAlignment(org.apache.poi.ss.usermodel.VerticalAlignment.CENTER);
+        cellStyle.setWrapText(true);
+        cellStyle.setBorderBottom(BorderStyle.THIN); //下边框
+        cellStyle.setBorderLeft(BorderStyle.THIN);//左边框
+        cellStyle.setBorderTop(BorderStyle.THIN);//上边框
+        cellStyle.setBorderRight(BorderStyle.THIN);//右边框
+        //行号
+        int rowNum = 0;
+        //第一行
+        SXSSFRow row0 = sheet.createRow(rowNum++);
+        row0.setHeight((short)500);
+        List<String> row_first =new ArrayList<>();
+        row_first.add("所属部门");
+        row_first.add("实报工时(小时)");
+        row_first.add("应工时(小时)");
+        row_first.add("");
+        row_first.add("");
+        row_first.add("");
+        row_first.add("有效工时率");
+        for (int i = 0; i < row_first.size(); i++) {
+            SXSSFCell tempCell = row0.createCell(i);
+            tempCell.setCellValue(row_first.get(i));
+            tempCell.setCellStyle(headStyle);
+        }
+        sheet.addMergedRegion(new CellRangeAddress(0,1,0,0));
+        sheet.addMergedRegion(new CellRangeAddress(0,1,1,1));
+        sheet.addMergedRegion(new CellRangeAddress(0,1,6,6));
+        sheet.addMergedRegion(new CellRangeAddress(0,0,2,5));
+        //第二行
+        SXSSFRow row1 = sheet.createRow(rowNum++);
+        row1.setHeight((short)500);
+        List<String> row_second =new ArrayList<>();
+        row_second.add("");
+        row_second.add("");
+        row_second.add("在职人数");
+        row_second.add("应报工时天数");
+        row_second.add("日标准工时");
+        row_second.add("应报工时");
+        row_second.add("");
+        for (int i = 0; i < row_second.size(); i++) {
+            SXSSFCell tempCell = row1.createCell(i);
+            tempCell.setCellValue(row_second.get(i));
+            tempCell.setCellStyle(headStyle);
+        }
+        List<String> list=new ArrayList<>();
+        for (LaborHourRateVo laborHourRateVo : resultList) {
+            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                list.add(laborHourRateVo.getDepartment_name());
+            }else {
+                list.add("$departmentName="+laborHourRateVo.getDepartment_name()+"$");
+            }
+            list.add(String.valueOf(laborHourRateVo.getWorking_time()));
+            list.add(String.valueOf(laborHourRateVo.getCount()));
+            list.add(String.valueOf(laborHourRateVo.getDate_count()));
+            list.add(String.valueOf(laborHourRateVo.getDay_time()));
+            list.add(String.valueOf(laborHourRateVo.getTotal_time()));
+            list.add(String.valueOf(laborHourRateVo.getRate()));
+        }
+        int k=0;
+        for(int i = 0;i<resultList.size();i++){
+            SXSSFRow tempRow = sheet.createRow(rowNum++);
+            tempRow.setHeight((short)500);
+            for(int j=0;j<7;j++){
+                SXSSFCell tempCell = tempRow.createCell(j);
+                String cellValue = "";
+                tempCell.setCellStyle(cellStyle);
+                if(k>=list.size()){
+                    continue;
+                }
+                cellValue=list.get(k);
+                tempCell.setCellValue(cellValue);
+                k++;
+            }
+        }
+
+        //导出excel
+        String result="系统提示:Excel文件导出成功!";
+        String title= "有效工时率报表_"+company.getCompanyName()+System.currentTimeMillis();
+        String fileName= title+".xlsx";
+        try {
+            File dir = null;
+            dir = new File(path);
+            if (!dir.exists()) {
+                dir.mkdirs();
+            }
+            FileOutputStream os = new FileOutputStream(path+fileName);//保存到本地
+            workBook.write(os);
+            os.flush();
+            os.close();
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        if(wxCorpInfo != null && wxCorpInfo.getSaasSyncContact() == 1){
+            try {
+                return excelExportService.exportTranForwx(wxCorpInfo, title);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        httpRespMsg.data ="/upload/"+fileName;
+        return null;
+    }
+
     @Override
     public HttpRespMsg getProjectFillTime(HttpServletRequest request, Integer projectId) {
         //待审核和已通过的总工时

+ 93 - 44
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/TaskGroupServiceImpl.java

@@ -8,6 +8,7 @@ import com.management.platform.mapper.*;
 import com.management.platform.service.*;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.management.platform.util.HttpRespMsg;
+import com.management.platform.util.ListUtil;
 import com.management.platform.util.MessageUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -77,59 +78,60 @@ public class TaskGroupServiceImpl extends ServiceImpl<TaskGroupMapper, TaskGroup
 
     @Override
     @Transactional
-    public HttpRespMsg createFromTemplate(String templateJson, Integer projectId) {
+    public HttpRespMsg createFromTemplate(String templateJson, Integer projectId,String projectIds) {
+        HttpRespMsg msg = new HttpRespMsg();
         String token = request.getHeader("TOKEN");
         User user = userMapper.selectById(token);
         List<GroupTemplate> groupTemplates = JSONArray.parseArray(templateJson, GroupTemplate.class);
         List<TaskGroup> list=new ArrayList<>();
-        Project project = projectMapper.selectById(projectId);
-        String inchargerId = project.getInchargerId();
-        User inchargerUser = userMapper.selectById(inchargerId);
-        for(GroupTemplate template:groupTemplates){
-            TaskGroup taskGroup = new TaskGroup();
-            taskGroup.setName(template.getName());
-            taskGroup.setProjectId(projectId);
-            save(taskGroup);
-            list.add(taskGroup);
-
-            //从模板创建任务列表
-            List<GroupTmpstages> stages = groupTmpstagesMapper.selectList(new QueryWrapper<GroupTmpstages>().eq("template_id", template.getId()));
-            List<Stages> batchList = new ArrayList<>();
-            stages.forEach(s->{
-                Stages item = new Stages();
-                item.setGroupId(taskGroup.getId());
-                item.setStagesName(s.getStagesName());
-                item.setSequence(s.getSequence());
-                item.setProjectId(projectId);
-                batchList.add(item);
-            });
-            stagesService.saveBatch(batchList);
-            //阶段的任务,里程碑,风险
-            List<GtemplateTask> gtemplateTaskList = gtemplateTaskMapper.selectList(
-                    new QueryWrapper<GtemplateTask>().eq("gtemplate_id", template.getId())
-                            .orderByAsc("seq"));
-            if (gtemplateTaskList.size() > 0) {
-                List<Task> taskList = new ArrayList<>();
+        if(StringUtils.isEmpty(projectIds)){
+            Project project = projectMapper.selectById(projectId);
+            String inchargerId = project.getInchargerId();
+            User inchargerUser = userMapper.selectById(inchargerId);
+            for(GroupTemplate template:groupTemplates){
+                TaskGroup taskGroup = new TaskGroup();
+                taskGroup.setName(template.getName());
+                taskGroup.setProjectId(projectId);
+                save(taskGroup);
+                list.add(taskGroup);
+                //从模板创建任务列表
+                List<GroupTmpstages> stages = groupTmpstagesMapper.selectList(new QueryWrapper<GroupTmpstages>().eq("template_id", template.getId()));
+                List<Stages> batchList = new ArrayList<>();
+                stages.forEach(s->{
+                    Stages item = new Stages();
+                    item.setGroupId(taskGroup.getId());
+                    item.setStagesName(s.getStagesName());
+                    item.setSequence(s.getSequence());
+                    item.setProjectId(projectId);
+                    batchList.add(item);
+                });
+                stagesService.saveBatch(batchList);
+                //阶段的任务,里程碑,风险
+                List<GtemplateTask> gtemplateTaskList = gtemplateTaskMapper.selectList(
+                        new QueryWrapper<GtemplateTask>().eq("gtemplate_id", template.getId())
+                                .orderByAsc("seq"));
+                if (gtemplateTaskList.size() > 0) {
+                    List<Task> taskList = new ArrayList<>();
 //                List<TaskExecutor> taskExecutorList = new ArrayList<>();
-                gtemplateTaskList.forEach(gt->{
-                    Task task = gt.toTask();
-                    task.setProjectId(projectId);
-                    task.setGroupId(taskGroup.getId());
-                    String sName = stages.stream().filter(s->s.getId().equals(gt.getTstagesId())).findFirst().get().getStagesName();
-                    Integer realStageId = batchList.stream().filter(bat->bat.getStagesName().equals(sName)).findFirst().get().getId();
-                    task.setStagesId(realStageId);
-                    task.setCreaterId(user.getId());
-                    task.setCreaterName(user.getName());
-                    task.setCreatorColor(user.getColor());
+                    gtemplateTaskList.forEach(gt->{
+                        Task task = gt.toTask();
+                        task.setProjectId(projectId);
+                        task.setGroupId(taskGroup.getId());
+                        String sName = stages.stream().filter(s->s.getId().equals(gt.getTstagesId())).findFirst().get().getStagesName();
+                        Integer realStageId = batchList.stream().filter(bat->bat.getStagesName().equals(sName)).findFirst().get().getId();
+                        task.setStagesId(realStageId);
+                        task.setCreaterId(user.getId());
+                        task.setCreaterName(user.getName());
+                        task.setCreatorColor(user.getColor());
 //                    if(task.getTaskType()==1 && inchargerUser != null){
 //                        task.setExecutorId(inchargerUser.getId());
 //                        task.setExecutorName(inchargerUser.getName());
 //                        task.setExecutorColor(inchargerUser.getColor());
 //                    }
 
-                    taskList.add(task);
-                });
-                taskService.saveBatch(taskList);
+                        taskList.add(task);
+                    });
+                    taskService.saveBatch(taskList);
 //                taskList.forEach(tl->{
 //                    TaskExecutor taskExecutor=new TaskExecutor();
 //                    //当为里程碑任务时
@@ -143,10 +145,57 @@ public class TaskGroupServiceImpl extends ServiceImpl<TaskGroupMapper, TaskGroup
 //                    }
 //                });
 //                taskExecutorService.saveBatch(taskExecutorList);
+                }
+            }
+        }else {
+            List<Integer> projectIdList = ListUtil.convertIntegerIdsArrayToList(projectIds);
+            for (Integer targetProjectId : projectIdList) {
+                for(GroupTemplate template:groupTemplates){
+                    TaskGroup taskGroup = new TaskGroup();
+                    taskGroup.setName(template.getName());
+                    taskGroup.setProjectId(targetProjectId);
+                    int cnt = count(new QueryWrapper<TaskGroup>()
+                            .eq("project_id", targetProjectId).eq("name",template.getName()));
+                    if(cnt>0){
+                        //存在重复的分组 跳过
+                        continue;
+                    }
+                    save(taskGroup);
+                    //从模板创建任务列表
+                    List<GroupTmpstages> stages = groupTmpstagesMapper.selectList(new QueryWrapper<GroupTmpstages>().eq("template_id", template.getId()));
+                    List<Stages> batchList = new ArrayList<>();
+                    stages.forEach(s->{
+                        Stages item = new Stages();
+                        item.setGroupId(taskGroup.getId());
+                        item.setStagesName(s.getStagesName());
+                        item.setSequence(s.getSequence());
+                        item.setProjectId(targetProjectId);
+                        batchList.add(item);
+                    });
+                    stagesService.saveBatch(batchList);
+                    //阶段的任务,里程碑,风险
+                    List<GtemplateTask> gtemplateTaskList = gtemplateTaskMapper.selectList(
+                            new QueryWrapper<GtemplateTask>().eq("gtemplate_id", template.getId())
+                                    .orderByAsc("seq"));
+                    if (gtemplateTaskList.size() > 0) {
+                        List<Task> taskList = new ArrayList<>();
+                        gtemplateTaskList.forEach(gt->{
+                            Task task = gt.toTask();
+                            task.setProjectId(targetProjectId);
+                            task.setGroupId(taskGroup.getId());
+                            String sName = stages.stream().filter(s->s.getId().equals(gt.getTstagesId())).findFirst().get().getStagesName();
+                            Integer realStageId = batchList.stream().filter(bat->bat.getStagesName().equals(sName)).findFirst().get().getId();
+                            task.setStagesId(realStageId);
+                            task.setCreaterId(user.getId());
+                            task.setCreaterName(user.getName());
+                            task.setCreatorColor(user.getColor());
+                            taskList.add(task);
+                        });
+                        taskService.saveBatch(taskList);
+                    }
+                }
             }
         }
-
-        HttpRespMsg msg = new HttpRespMsg();
         msg.data = list;
         return msg;
     }

+ 5 - 0
fhKeeper/formulahousekeeper/timesheet/src/views/corpreport/list.vue

@@ -2230,6 +2230,11 @@ export default {
           url += "/exportFTEData"
           sl.month = this.monthPersonnel + '-01'
           sl.area = this.areaName || null
+        }else if(this.ins == 20) {
+          fName = '有效工时率表' + '.xlsx'
+          url = "/project/exportEffectiveLaborHourRate"
+          sl.startDate = this.rangeDatas[0]
+          sl.endDate = this.rangeDatas[1]
         } else if(this.ins == 22) {
           fName = '分类工时明细表' + '.xlsx'
           url = "/report/exportUserWorkTimeByCategory"

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

@@ -1598,7 +1598,7 @@
             </div>
         </el-dialog>
         <!-- 批量增加任务分组 -->
-        <el-dialog :title="'批量增加任务分组'" v-if="addTaskGroupDig" :visible.sync="addTaskGroupDig" width="40%">
+        <!-- <el-dialog :title="'批量增加任务分组'" v-if="addTaskGroupDig" :visible.sync="addTaskGroupDig" width="40%">
             <el-form label-width="20%">
                 <el-form-item :label="'分组名称:'">
                      <el-input v-model="batchAddTaskGroupName" placeholder="请输入内容"></el-input>
@@ -1608,7 +1608,7 @@
                 <el-button @click="addTaskGroupDig = false,this.batchAddTaskGroupName=null">{{ $t('btn.cancel') }}</el-button>
                 <el-button type="primary" @click="batchAddTaskGroup()">{{ $t('btn.determine') }}</el-button>
             </div>
-        </el-dialog>
+        </el-dialog> -->
         <!-- 批量设置任务分组负责人 -->
         <el-dialog :title="'批量设置任务分组负责人'" v-if="addTaskGroupInchargerDig" :visible.sync="addTaskGroupInchargerDig" width="40%">
             <el-form label-width="20%">
@@ -1678,6 +1678,69 @@
                 </el-upload>
             </div>
         </el-dialog>
+
+        <!-- 新增任务分组弹出框 -->
+        <el-dialog v-if="addTaskGroupDig" :visible.sync="addTaskGroupDig" :close-on-click-modal="false" customClass="customWidth" width="600px">
+            <div slot="title" >
+                <el-tabs v-model="createGroupWay">
+                <el-tab-pane :label="$t('newgrouping')" name="new">
+                    <el-form ref="formGrouping" :model="groupForm" :rules="formGrouping" style="margin-top:40px;">
+                        <el-form-item prop="name">
+                            <el-input v-model.trim="groupForm.name" :placeholder="$t('pleaseenteragroupname')" maxlength="50"
+                                show-word-limit clearable></el-input>
+                        </el-form-item>
+                        <el-button type="primary" @click="addGroup('formGrouping')" style="width:100%;" >{{ $t('create') }}</el-button>
+                    </el-form>
+                </el-tab-pane>
+                <el-tab-pane :label="$t('creatintemplate')" name="template">
+                    <el-card class="template_box" :style="t.selected?'border: 1px solid #409eff;':''" v-for="(t,tIndex) in groupTemplateList" :key="t.id"  @click.native="choseTemplate(tIndex)">
+                        <div>
+                        <el-row >
+                            <el-col :span="22">
+                                <div><span>{{t.name}}</span>
+                                <el-link :underline="false" type="primary" style="color:#aaa;margin-left:10px;"
+                                 @click="setTemplate(t)"><i class="el-icon-setting" v-show="t.isSystem == 0" ></i>
+                                </el-link>
+                                <el-link :underline="false" type="primary" style="color:#aaa;margin-left:10px;"
+                                 @click="deleteTemplate(t)"><i class="el-icon-delete" v-show="t.isSystem == 0" ></i>
+                                </el-link>
+                                </div>
+                                <div style="margin-top:10px;">
+                                    <span style="color:#8c8c8c;font-size:12px;" v-for="(s,index) in t.stagesList" :key="s.id">
+                                    <i class="el-icon-arrow-right" v-if="index>0"></i>
+                                    {{s.stagesName}}</span>
+                                </div>
+                            </el-col>
+                            <el-col :span="2">
+                                <i class="el-icon-check" v-show="t.selected" style="font-size:20px;color:#409eff;margin-top:12px;"></i>
+                            </el-col>
+                            
+                        </el-row>
+                        
+                        </div>
+                    </el-card>
+                    <el-button type="primary" @click="addTemplateGroup" style="width:100%;" >{{ $t('create') }}</el-button>
+                </el-tab-pane>
+                </el-tabs>
+            </div>
+            <el-dialog :title="$t('bian-ji-mo-ban')" append-to-body v-if="setTemplateDialog" :visible.sync="setTemplateDialog" width="500px">
+                <el-form label-width="20%">
+                    <el-form-item :label="$t('mo-ban-ming-cheng')"><el-input v-model="setTemplateData.name" style="width:80%" clearable></el-input></el-form-item>
+                    <el-form-item label=""><el-checkbox v-model="setTemplateData.creWithPro">{{ $t('suixiangmuzidongchuangjian') }}</el-checkbox></el-form-item>
+                    <el-form-item v-for="item,index in setTemplateData.stagesList" :key="item.id" :label="index == 0 ? '任务列表' : ''">
+                        <el-input v-model="item.stagesName"  style="width:70%" clearable></el-input>
+                        <el-link :underline="false" type="primary" style="color:#aaa;" @click="deleteStages(item,index)"  v-if="index != 0">
+                            <i class="el-icon-delete"></i>
+                        </el-link>
+                    </el-form-item>
+                    <el-link style="margin-left:20%" :underline="false" type="primary" @click="addStages()">{{ $t('xin-zeng-ren-wu-lie-biao') }}</el-link>
+                </el-form>
+                <div slot="footer" class="dialog-footer">
+                    <el-button type="primary" @click="setTemplateDialog = false">{{ $t('btn.cancel') }}</el-button>
+                    <el-button type="primary" @click="setTemplateSave()">{{ $t('save') }}</el-button>
+                </div>
+            </el-dialog>
+        </el-dialog>
     </section>
 </template>
 <style scoped>
@@ -1977,7 +2040,12 @@ a {
                 allProjectList:[],
                 hasChooseProjectCode:[],
                 synchronizationVal: '0',
-                synchronizationInputVal: ''
+                synchronizationInputVal: '',
+                groupTemplateList:[],
+                createGroupWay:'new',
+                groupForm:{},
+                setTemplateDialog: false,
+                selectedGroup:{},
             };
         },
         // 过滤器
@@ -2707,6 +2775,50 @@ a {
                 }
                 this.addTaskGroupDig=true
             },
+            // 重新定义了 addGroup 方法
+            addGroup(formName) {
+                // return
+                let proArr = []
+                for(let i=0;i<this.checkedProjectArr.length;i++){
+                    proArr.push(this.checkedProjectArr[i].id)
+                }
+                this.groupForm={
+                    ...this.groupForm,
+                    projectIds:proArr.join(',')
+                }
+                this.$refs[formName].validate((valid) => {
+                    if (valid) {
+                        this.http.post('/task-group/save',this.groupForm,
+                        res => {
+                            if (res.code == "ok") {
+                                this.$message({
+                                message: "操作成功",
+                                type: "success"
+                                });
+                            } else {
+                                this.$message({
+                                message: res.msg,
+                                type: "error"
+                                });
+                            }
+                        },
+                        error => {
+                            this.$message({
+                                message: error,
+                                type: "error"
+                            });
+                        });
+                    } else {
+                        console.log('error submit!!');
+                        return false;
+                    }
+                });
+            },
+
+            createGroup() {
+                this.addGroupDialog = true;
+                this.groupForm = {projectId: this.curProjectId};
+            },
             batchAddTaskGroup(){
                 if(!this.batchAddTaskGroupName){
                     this.$message({
@@ -3201,6 +3313,121 @@ a {
                     }
                 );
             },
+            // 编辑模板
+            setTemplate(t){
+                console.log(t);
+                this.setTemplateData = t
+                this.setTemplateData.needDelete = []
+                this.setTemplateDialog = true
+            },
+            choseTemplate(tIndex) {
+                // this.groupTemplateList.forEach((g)=>{
+                //     g.selected = false;
+                // })
+                this.sidebarIndex = tIndex
+                // this.groupTemplateList[tIndex].selected = true;
+                this.groupTemplateList.forEach((g, i)=>{
+                    if(tIndex == i) {
+                        g.selected = !g.selected;
+                    }
+                })
+            },
+            //删除模板
+            deleteTemplate(t) {
+                var that = this;
+                this.$confirm(this.$t('que-ren-yao-shan-chu')+"["+t.name+"]"+this.$t('ma'), this.$t('other.prompts'), {
+                    //type: 'warning'
+                }).then(() => {
+                    this.http.post('/group-template/deleteTemplate', {id: t.id},
+                        res => {
+                            if (res.code == "ok") {
+                                this.getGroupTemplate();
+                                this.$message({
+                                    message: this.$t('deletingTemplateSuccessfully'),
+                                    type: "success"
+                                });
+                            } else {
+                                this.$message({
+                                    message: res.msg,
+                                    type: "error"
+                                });
+                            }
+                        }
+                    );
+                });
+            },
+            //创建模板
+            createTemplate() {
+                this.saveTemplateLoading = true;
+                this.http.post('/group-template/addTemplate', this.templateForm,
+                    res => {
+                        this.saveTemplateLoading = false;
+                        if (res.code == "ok") {
+                            this.addToTmpDialog = false;
+                            this.getGroupTemplate();
+                            this.$message({
+                                message: this.$t('addTemplateSuccessfully'),
+                                type: "success"
+                            });
+                        } else {
+                            this.$message({
+                                message: res.msg,
+                                type: "error"
+                            });
+                        }
+                    }
+                );
+            },
+            setTemplateSave(){
+                if(this.setTemplateData.name == '' || this.setTemplateData.name == null){
+                    this.$message({
+                        message: this.$t('mo-ban-ming-cheng-bu-neng-wei-kong'),
+                        type: 'error'
+                    })
+                    return
+                }
+                for(let i in this.setTemplateData.stagesList){
+                    if(this.setTemplateData.stagesList[i].stagesName == '' || this.setTemplateData.stagesList[i].stagesName == null){
+                        this.$message({
+                            message: this.$t('ren-wu-lie-biao-ming-cheng-bu-neng-wei-kong'),
+                            type: 'error'
+                        })
+                        return
+                    }
+                }
+                this.http.post('/task-group/setTemplate',this.setTemplateData,
+                res => {
+                    if(res.code == 'ok'){
+                        this.$message({
+                            message: this.$t('message.modifyTheSuccess'),
+                            type: 'success'
+                        })
+                        this.getGroupTemplate()
+                        this.setTemplateDialog = false
+                    }else{
+                        this.$message({
+                            message: res.msg,
+                            type: 'error'
+                        })
+                    }
+                },err => {
+                    this.$message({
+                        message: err,
+                        type: 'error'
+                    })
+                })
+            },
+            addStages(){
+                this.setTemplateData.stagesList.push({
+                    stagesName: '',
+                    templateId: this.setTemplateData.id
+                })
+            },
+            deleteStages(item,index){
+                this.setTemplateData.needDelete.push(item.id)
+                this.setTemplateData.stagesList.splice(index,1)
+                console.log('deletestages',item.id);
+            },
             exportProjectGroup() {
                 //导出项目分组
                 this.http.post('/project/exportGroupData',{projectCategorySubId:this.projectCategorySubId},
@@ -3372,6 +3599,62 @@ a {
                         });
                     });
             },
+            addTemplateGroup() {
+                var param = JSON.parse(JSON.stringify(this.groupTemplateList.filter(g=>g.selected)))
+                console.log(param, '你看看啊')
+                for(var i in param) {
+                    delete param[i].stagesList
+                }
+                if(param.length < 1) {
+                    this.$message({
+                        message: this.$t('qngxuanz'),
+                        type: "error"
+                    });
+                    return
+                }
+                var s = null
+                var k = ''
+                if (s){ 
+                    this.addGroupDialog = false;
+                    this.$message({
+                        message: this.$t('projectalreadyhasgroup')+'['+k+'],'+this.$t('changethegroupname'),
+                        type: "error"
+                        });
+                    return 
+                }
+                console.log('将要闯过去的值', param)
+                let proArr = []
+                for(let i=0;i<this.checkedProjectArr.length;i++){
+                    proArr.push(this.checkedProjectArr[i].id)
+                }
+                // return
+                // this.http.post('/task-group/createFromTemplate',param,
+                this.http.post('/task-group/createFromTemplate',{
+                    templateJson: JSON.stringify(param),
+                    projectId: this.curProjectId,
+                    projectIds:proArr.join(",")
+                },
+                res => {
+                    if (res.code == "ok") {
+                        this.$message({
+                        message: "操作成功",
+                        type: "success"
+                        });
+                        this.addTaskGroupDig = false;
+                    } else {
+                        this.$message({
+                        message: res.msg,
+                        type: "error"
+                        });
+                    }
+                },
+                error => {
+                    this.$message({
+                        message: error,
+                        type: "error"
+                    });
+                });
+            },
             getProjectProfessions(projectId) {
                 this.http.post("/project-profession/get", {projectId: projectId},
                     res => {
@@ -4568,8 +4851,28 @@ a {
                     this.addForm.changeContractReason = ''
                 }
             },
-
-
+            //获取分组模板列表
+            getGroupTemplate() {
+                this.http.post('/group-template/getList',{},
+                    res => {
+                        if (res.code == "ok") {
+                            this.groupTemplateList = res.data;
+                            this.groupTemplateList[0].selected = true;
+                        } else {
+                            this.$message({
+                            message: res.msg,
+                            type: "error"
+                            });
+                        }
+                    },
+                    error => {
+                        this.$message({
+                            message: error,
+                            type: "error"
+                        });
+                    });
+                
+            },
             // 处理数据
             chulishuju(data) {
                 console.log(data, 12345)
@@ -5792,6 +6095,7 @@ a {
             this.yanjiuzx()
             this.getObtain()
             this.getProjectList()
+            this.getGroupTemplate()
             // this.getRoleList()
 
             // 判断是否有供应商字段