Explorar el Código

Merge remote-tracking branch 'origin/master'

yusm hace 1 año
padre
commit
c8516151b0
Se han modificado 36 ficheros con 955 adiciones y 851 borrados
  1. 1 1
      fhKeeper/formulahousekeeper/inva_4_tivo/dynamic.html
  2. BIN
      fhKeeper/formulahousekeeper/inva_4_tivo/image/journal/dongtaiFou.jpeg
  3. BIN
      fhKeeper/formulahousekeeper/inva_4_tivo/image/journal/dongtaiThree.jpeg
  4. BIN
      fhKeeper/formulahousekeeper/inva_4_tivo/image/journal/dongtaiTwo.jpeg
  5. BIN
      fhKeeper/formulahousekeeper/inva_4_tivo/image/journal/dongtaiba.jpeg
  6. BIN
      fhKeeper/formulahousekeeper/inva_4_tivo/image/journal/dongtaijiu.jpeg
  7. BIN
      fhKeeper/formulahousekeeper/inva_4_tivo/image/journal/dongtailiu.jpeg
  8. BIN
      fhKeeper/formulahousekeeper/inva_4_tivo/image/journal/dongtaione.jpeg
  9. BIN
      fhKeeper/formulahousekeeper/inva_4_tivo/image/journal/dongtaishi.jpeg
  10. BIN
      fhKeeper/formulahousekeeper/inva_4_tivo/image/journal/dongtaishiyi.jpeg
  11. BIN
      fhKeeper/formulahousekeeper/inva_4_tivo/image/journal/gongshi.jpg
  12. BIN
      fhKeeper/formulahousekeeper/inva_4_tivo/image/journal/haiwai.jpg
  13. BIN
      fhKeeper/formulahousekeeper/inva_4_tivo/images/dongtaione.jpeg
  14. 90 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/GroupBudgetReviewController.java
  15. 6 6
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java
  16. 97 64
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java
  17. 51 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskController.java
  18. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskGroupController.java
  19. 17 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserController.java
  20. 0 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectMapper.java
  21. 4 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/UserMapper.java
  22. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectService.java
  23. 269 90
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  24. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  25. 5 6
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  26. 19 51
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml
  27. 14 13
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml
  28. 5 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/UserMapper.xml
  29. 3 4
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/PlanServiceImpl.java
  30. 20 19
      fhKeeper/formulahousekeeper/timesheet/src/components/taskComponent.vue
  31. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/permissions.js
  32. 38 12
      fhKeeper/formulahousekeeper/timesheet/src/views/corpreport/list.vue
  33. 242 564
      fhKeeper/formulahousekeeper/timesheet/src/views/project/budgetReview.vue
  34. 10 1
      fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue
  35. 42 5
      fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue
  36. 1 1
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/index.vue

+ 1 - 1
fhKeeper/formulahousekeeper/inva_4_tivo/dynamic.html

@@ -175,7 +175,7 @@
                             title: '',
                             text: '增加全球化网络访问的支持,方便在海外工作的客户使用。',
                             date: '2024.01.15',
-                            img: './image/journal/dongtaiOne.jpeg'
+                            img: './image/journal/haiwai.jpg'
                         },
                         {
                             title: '',

BIN
fhKeeper/formulahousekeeper/inva_4_tivo/image/journal/dongtaiFou.jpeg


BIN
fhKeeper/formulahousekeeper/inva_4_tivo/image/journal/dongtaiThree.jpeg


BIN
fhKeeper/formulahousekeeper/inva_4_tivo/image/journal/dongtaiTwo.jpeg


BIN
fhKeeper/formulahousekeeper/inva_4_tivo/image/journal/dongtaiba.jpeg


BIN
fhKeeper/formulahousekeeper/inva_4_tivo/image/journal/dongtaijiu.jpeg


BIN
fhKeeper/formulahousekeeper/inva_4_tivo/image/journal/dongtailiu.jpeg


BIN
fhKeeper/formulahousekeeper/inva_4_tivo/image/journal/dongtaione.jpeg


BIN
fhKeeper/formulahousekeeper/inva_4_tivo/image/journal/dongtaishi.jpeg


BIN
fhKeeper/formulahousekeeper/inva_4_tivo/image/journal/dongtaishiyi.jpeg


BIN
fhKeeper/formulahousekeeper/inva_4_tivo/image/journal/gongshi.jpg


BIN
fhKeeper/formulahousekeeper/inva_4_tivo/image/journal/haiwai.jpg


BIN
fhKeeper/formulahousekeeper/inva_4_tivo/images/dongtaione.jpeg


+ 90 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/GroupBudgetReviewController.java

@@ -6,9 +6,13 @@ import com.management.platform.entity.*;
 import com.management.platform.mapper.ProjectMapper;
 import com.management.platform.mapper.TaskGroupMapper;
 import com.management.platform.mapper.UserMapper;
+import com.management.platform.mapper.WxCorpInfoMapper;
+import com.management.platform.service.ExcelExportService;
 import com.management.platform.service.GroupBudgetReviewService;
 import com.management.platform.service.TaskService;
 import com.management.platform.util.HttpRespMsg;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.RequestMapping;
 
 import org.springframework.web.bind.annotation.RestController;
@@ -16,7 +20,10 @@ import org.springframework.web.bind.annotation.RestController;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import java.math.BigDecimal;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 import java.util.stream.Collectors;
 
 /**
@@ -43,6 +50,12 @@ public class GroupBudgetReviewController {
     private ProjectMapper projectMapper;
     @Resource
     private TaskService taskService;
+    @Value(value = "${upload.path}")
+    private String path;
+    @Resource
+    private WxCorpInfoMapper wxCorpInfoMapper;
+    @Resource
+    private ExcelExportService excelExportService;
 
     @RequestMapping("/add")
     public HttpRespMsg add(Integer groupId,Integer oldManDay,Integer changeManDay,Integer nowManDay,String remark){
@@ -100,14 +113,89 @@ public class GroupBudgetReviewController {
     }
 
     @RequestMapping("/list")
-    public HttpRespMsg list(){
+    public HttpRespMsg list(String startDate,String endDate,Integer projectId,Integer status,String submitUserId){
         HttpRespMsg httpRespMsg=new HttpRespMsg();
         Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
-        List<GroupBudgetReview> list = groupBudgetReviewService.list(new LambdaQueryWrapper<GroupBudgetReview>().eq(GroupBudgetReview::getCompanyId, companyId).orderByDesc(GroupBudgetReview::getCreateTime));
+        LambdaQueryWrapper<GroupBudgetReview> queryWrapper = new LambdaQueryWrapper<GroupBudgetReview>().eq(GroupBudgetReview::getCompanyId, companyId).orderByDesc(GroupBudgetReview::getCreateTime);
+        if(startDate!=null && endDate!=null){
+            queryWrapper.between(GroupBudgetReview::getCreateTime,startDate,endDate);
+        }
+        if(projectId!=null){
+            queryWrapper.eq(GroupBudgetReview::getProjectId,projectId);
+        }
+        if(status!=null){
+            queryWrapper.eq(GroupBudgetReview::getStatus,status-1);
+        }
+        if(!StringUtils.isEmpty(submitUserId)){
+            queryWrapper.eq(GroupBudgetReview::getCreatorId,submitUserId);
+        }
+        List<GroupBudgetReview> list = groupBudgetReviewService.list(queryWrapper);
         httpRespMsg.setData(list);
         return httpRespMsg;
     }
 
+    @RequestMapping("/export")
+    public HttpRespMsg export(String startDate,String endDate,Integer projectId,Integer status,String submitUserId){
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        DateTimeFormatter df=DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, companyId));
+        List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getCompanyId, companyId));
+        LambdaQueryWrapper<GroupBudgetReview> queryWrapper = new LambdaQueryWrapper<GroupBudgetReview>().eq(GroupBudgetReview::getCompanyId, companyId).orderByDesc(GroupBudgetReview::getCreateTime);
+        if(startDate!=null && endDate!=null){
+            queryWrapper.between(GroupBudgetReview::getCreateTime,startDate,endDate);
+        }
+        if(projectId!=null){
+            queryWrapper.eq(GroupBudgetReview::getProjectId,projectId);
+        }
+        if(status!=null){
+            queryWrapper.eq(GroupBudgetReview::getStatus,status);
+        }
+        if(!StringUtils.isEmpty(submitUserId)){
+            queryWrapper.eq(GroupBudgetReview::getCreatorId,submitUserId);
+        }
+        List<GroupBudgetReview> list = groupBudgetReviewService.list(queryWrapper);
+        List<List<String>> dataList=new ArrayList<>();
+        List<String> titleList=new ArrayList<>();
+        titleList.add("项目名称");
+        titleList.add("分组名称");
+        titleList.add("提交人");
+        titleList.add("提交时间");
+        titleList.add("变更前预估工时");
+        titleList.add("预估工时变更");
+        titleList.add("变更后预估工时");
+        titleList.add("变更理由");
+        titleList.add("状态");
+        dataList.add(titleList);
+        for (GroupBudgetReview groupBudgetReview : list) {
+            List<String> item=new ArrayList<>();
+            item.add(groupBudgetReview.getProjectName());
+            item.add(groupBudgetReview.getGroupName());
+            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                Optional<User> first = userList.stream().filter(u -> u.getId().equals(groupBudgetReview.getCreatorId())).findFirst();
+                if(first.isPresent()){
+                    item.add("$userName="+first.get().getName()+"$");
+                }else {
+                    item.add("");
+                }
+            }
+            item.add(df.format(groupBudgetReview.getCreateTime()));
+            item.add(String.valueOf(groupBudgetReview.getOldManDay()));
+            item.add(String.valueOf(groupBudgetReview.getChangeManDay()));
+            item.add(String.valueOf(groupBudgetReview.getNowManDay()));
+            item.add(String.valueOf(groupBudgetReview.getRemark()));
+            item.add(groupBudgetReview.getStatus()==0?"待审核":groupBudgetReview.getStatus()==1?"审核通过":"已驳回");
+            dataList.add(item);
+        }
+        String fileUrlSuffix = "预估工时审核表_" + System.currentTimeMillis();
+        try {
+            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileUrlSuffix,dataList,path);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return httpRespMsg;
+    }
+
 
 
 }

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

@@ -511,8 +511,8 @@ public class ProjectController {
 
     @RequestMapping("/importData")
     @Transactional(rollbackFor = Exception.class)
-    public HttpRespMsg importData(String userId, MultipartFile file,@RequestParam(defaultValue = "0") Integer key,HttpServletRequest request) {
-        return projectService.importData(userId, file,key, request);
+    public HttpRespMsg importData(String userId, MultipartFile file,@RequestParam(defaultValue = "0") Integer key,@RequestParam(defaultValue = "0") Integer changeParticipation,HttpServletRequest request) {
+        return projectService.importData(userId, file,key,changeParticipation, request);
     }
 
     @RequestMapping("/getGanttData")
@@ -1465,8 +1465,8 @@ public class ProjectController {
 
     //依斯倍定制 分组耗用进度表
     @RequestMapping("/groupExpendProcessList")
-    public HttpRespMsg groupExpendProcessList(String startDate,String endDate){
-        return projectService.groupExpendProcessList(startDate,endDate);
+    public HttpRespMsg groupExpendProcessList(String startDate,String endDate,Integer pageIndex,Integer pageSize){
+        return projectService.groupExpendProcessList(startDate,endDate,pageIndex,pageSize);
     }
 
     //依斯倍定制 导出分组耗用进度表
@@ -1487,13 +1487,13 @@ public class ProjectController {
         return projectService.exportProjectExpendProcessList(projectId,categoryId,userId);
     }
 
-    //依斯倍定制 员工任务完成
+    //依斯倍定制 员工任务进度
     @RequestMapping("/userTaskProcessList")
     public HttpRespMsg userTaskProcessList(Integer deptId,String userId,Integer projectId,String startDate,String endDate,Integer pageIndex,Integer pageSize){
         return projectService.userTaskProcessList(deptId,userId,projectId,startDate,endDate,pageIndex,pageSize);
     }
 
-    //依斯倍定制 导出员工项目进度表
+    //依斯倍定制 导出员工任务进度表
     @RequestMapping("/exportUserTaskProcessList")
     public HttpRespMsg exportUserTaskProcessList(Integer deptId,String userId,Integer projectId,String startDate,String endDate){
         return projectService.exportUserTaskProcessList(deptId,userId,projectId,startDate,endDate);

+ 97 - 64
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java

@@ -4,6 +4,7 @@ package com.management.platform.controller;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.github.pagehelper.util.StringUtil;
 import com.management.platform.config.LimitRequest;
@@ -1192,7 +1193,6 @@ public class ReportController {
                             decimalFormat.format(report.getWorkingTime())));
                     return httpRespMsg;
                 }
-
             }
         }
         //如果开启了加班时长校验
@@ -1218,77 +1218,88 @@ public class ReportController {
         String warningGroupLack = "";
         EstimateTimeSetting estimateTimeSetting = null;
         if(comTimeType.getProjectManDay()==1){
-            Collection<Integer> projectIds = reportList.stream().map(Report::getProjectId).distinct().collect(Collectors.toList());
-            List<Report> needCheckReportList = reportMapper.selectList(new QueryWrapper<Report>().in("project_id", projectIds).and(wrapper->wrapper.eq("state",0).or().eq("state",1).or().eq("state",3)));
-            List<Project> targetProjectList = projectList.stream().filter(pl -> projectIds.contains(pl.getId())).collect(Collectors.toList());
-            estimateTimeSetting = estimateTimeSettingMapper.selectById(company.getId());
-            //如果没有设置过项目人天,就初始化一下
-            if (estimateTimeSetting == null) {
-                estimateTimeSetting = new EstimateTimeSetting();
-                estimateTimeSetting.setCompanyId(company.getId());
-                estimateTimeSettingMapper.insert(estimateTimeSetting);
-                estimateTimeSetting = estimateTimeSettingMapper.selectById(company.getId());
+            //剔除其中已通过的日报
+            List<Integer> filledReportIds = reportList.stream().filter(r->r.getId() != null).map(Report::getId).collect(Collectors.toList());
+            List<Report> targetCheckList = reportList;
+            if (filledReportIds.size() > 0) {
+                List<Report> passedReportList = reportMapper.selectList(new QueryWrapper<Report>().select("id").in("id", filledReportIds).eq("state", 1));
+                if (passedReportList.size() > 0) {
+                    targetCheckList = reportList.stream().filter(r->!passedReportList.stream().map(Report::getId).collect(Collectors.toList()).contains(r.getId())).collect(Collectors.toList());
+                }
             }
-            for (Report report : reportList) {
-                HttpRespMsg httpRespMsg = new HttpRespMsg();
-                Optional<Project> first = targetProjectList.stream().filter(tl -> tl.getId().equals(report.getProjectId())).findFirst();
-                if(first.isPresent()){
-                    double nowReport = reportList.stream().filter(rl -> rl.getCreateDate().equals(report.getCreateDate()) && rl.getCreatorId().equals(report.getCreatorId())).mapToDouble(Report::getWorkingTime).sum();
-                    if(first.get().getManDay()!=null){
-                        //已填报的工时情况
-                        double sum;
-                        if(first.get().getManDayStartDate()!=null){
-                            sum = needCheckReportList.stream().filter(npl -> npl.getProjectId().equals(first.get().getId()) &&(npl.getCreateDate().isAfter(first.get().getManDayStartDate())||npl.getCreateDate().isEqual(first.get().getManDayStartDate()))&& (npl.getState() == 0 || npl.getState() == 1)).mapToDouble(Report::getWorkingTime).sum();
-                        }else {
-                            sum = needCheckReportList.stream().filter(npl -> npl.getProjectId().equals(first.get().getId()) && (npl.getState() == 0 || npl.getState() == 1)).mapToDouble(Report::getWorkingTime).sum();
-                        }
-                        BigDecimal hasReport = new BigDecimal(sum).add(new BigDecimal(nowReport));
-                        BigDecimal multiply = new BigDecimal(first.get().getManDay()).multiply(new BigDecimal(comTimeType.getAllday()));
-                        if(hasReport.doubleValue()>multiply.doubleValue()){
-                            if (estimateTimeSetting.getProjectFronzeOnLack() == 1) {
-                                httpRespMsg.setError("超过当前项目["+first.get().getProjectName()+"]预算工时,无法继续提交工时");
-                                return httpRespMsg;
-                            } else {
-                                //仅提醒
-                                warningLackProjects += first.get().getProjectName() + ",";
-                            }
-                        } else {
-                            //检查是否超过预设的提醒百分比;设置的数值是剩余的百分比
-                            if (hasReport.divide(multiply, 2, RoundingMode.HALF_UP).multiply(new BigDecimal(100)).compareTo(new BigDecimal(100-estimateTimeSetting.getProjectWarningPercent()))>0) {
-                                warningPercentProjects += first.get().getProjectName() + ",";
+            if (targetCheckList.size() > 0) {
+                Collection<Integer> projectIds = targetCheckList.stream().map(Report::getProjectId).distinct().collect(Collectors.toList());
+                List<Report> oldRelatedReportList = reportMapper.selectList(new QueryWrapper<Report>().in("project_id", projectIds).and(wrapper->wrapper.eq("state",0).or().eq("state",1).or().eq("state",3)));
+                List<Project> targetProjectList = projectList.stream().filter(pl -> projectIds.contains(pl.getId())).collect(Collectors.toList());
+                estimateTimeSetting = estimateTimeSettingMapper.selectById(company.getId());
+                //如果没有设置过项目人天,就初始化一下
+                if (estimateTimeSetting == null) {
+                    estimateTimeSetting = new EstimateTimeSetting();
+                    estimateTimeSetting.setCompanyId(company.getId());
+                    estimateTimeSettingMapper.insert(estimateTimeSetting);
+                    estimateTimeSetting = estimateTimeSettingMapper.selectById(company.getId());
+                }
+                for (Report report : targetCheckList) {
+                    HttpRespMsg httpRespMsg = new HttpRespMsg();
+                    Optional<Project> first = targetProjectList.stream().filter(tl -> tl.getId().equals(report.getProjectId())).findFirst();
+                    if(first.isPresent()){
+                        double nowReport = targetCheckList.stream().filter(rl -> rl.getCreateDate().equals(report.getCreateDate()) && rl.getCreatorId().equals(report.getCreatorId())).mapToDouble(Report::getWorkingTime).sum();
+                        if(first.get().getManDay()!=null){
+                            //已填报的工时情况
+                            double sum;
+                            if(first.get().getManDayStartDate()!=null){
+                                sum = oldRelatedReportList.stream().filter(npl -> npl.getProjectId().equals(first.get().getId()) &&(npl.getCreateDate().isAfter(first.get().getManDayStartDate())||npl.getCreateDate().isEqual(first.get().getManDayStartDate()))&& (npl.getState() == 0 || npl.getState() == 1)).mapToDouble(Report::getWorkingTime).sum();
+                            }else {
+                                sum = oldRelatedReportList.stream().filter(npl -> npl.getProjectId().equals(first.get().getId()) && (npl.getState() == 0 || npl.getState() == 1)).mapToDouble(Report::getWorkingTime).sum();
                             }
-                            //检查分组工时
-                            Integer targetGpId = report.getGroupId();
-                            if (targetGpId != null) {
-                                double groupSum = 0;
-                                if(first.get().getManDayStartDate()!=null){
-                                    groupSum = needCheckReportList.stream().filter(npl -> npl.getGroupId().equals(targetGpId) &&(npl.getCreateDate().isAfter(first.get().getManDayStartDate())||npl.getCreateDate().isEqual(first.get().getManDayStartDate()))&& (npl.getState() == 0 || npl.getState() == 1)).mapToDouble(Report::getWorkingTime).sum();
-                                }else {
-                                    groupSum = needCheckReportList.stream().filter(npl -> npl.getGroupId().equals(targetGpId) && (npl.getState() == 0 || npl.getState() == 1)).mapToDouble(Report::getWorkingTime).sum();
+                            BigDecimal hasReport = new BigDecimal(sum).add(new BigDecimal(nowReport));
+                            BigDecimal multiply = new BigDecimal(first.get().getManDay()).multiply(new BigDecimal(comTimeType.getAllday()));
+                            if(hasReport.doubleValue()>multiply.doubleValue()){
+                                if (estimateTimeSetting.getProjectFronzeOnLack() == 1) {
+                                    httpRespMsg.setError("超过当前项目["+first.get().getProjectName()+"]预算工时,无法继续提交工时");
+                                    return httpRespMsg;
+                                } else {
+                                    //仅提醒
+                                    warningLackProjects += first.get().getProjectName() + ",";
+                                }
+                            } else {
+                                //检查是否超过预设的提醒百分比;设置的数值是剩余的百分比
+                                if (hasReport.divide(multiply, 2, RoundingMode.HALF_UP).multiply(new BigDecimal(100)).compareTo(new BigDecimal(100-estimateTimeSetting.getProjectWarningPercent()))>0) {
+                                    warningPercentProjects += first.get().getProjectName() + ",";
                                 }
-                                nowReport = reportList.stream().filter(rl -> rl.getCreateDate().equals(report.getCreateDate()) && rl.getCreatorId().equals(report.getCreatorId()) && targetGpId.equals(rl.getGroupId())).mapToDouble(Report::getWorkingTime).sum();
-                                hasReport = new BigDecimal(groupSum).add(new BigDecimal(nowReport));
-                                TaskGroup tgp = taskGroupService.getById(targetGpId);
-                                //设置的数值大于0时检查是否超额
-                                if (tgp != null && tgp.getManDay() != null && tgp.getManDay() > 0) {
-                                    multiply = new BigDecimal(tgp.getManDay()).multiply(new BigDecimal(comTimeType.getAllday()));
-                                    if (hasReport.doubleValue() > multiply.doubleValue()) {
-                                        if (estimateTimeSetting.getGroupFronzeOnLack() == 1) {
-                                            httpRespMsg.setError("超过当前项目["+first.get().getProjectName()+"]分组["+tgp.getName()+"]预算工时,无法继续提交工时");
-                                            return httpRespMsg;
+                                //检查分组工时
+                                Integer targetGpId = report.getGroupId();
+                                if (targetGpId != null) {
+                                    double groupSum = 0;
+                                    if(first.get().getManDayStartDate()!=null){
+                                        groupSum = oldRelatedReportList.stream().filter(npl -> npl.getGroupId().equals(targetGpId) &&(npl.getCreateDate().isAfter(first.get().getManDayStartDate())||npl.getCreateDate().isEqual(first.get().getManDayStartDate()))&& (npl.getState() == 0 || npl.getState() == 1)).mapToDouble(Report::getWorkingTime).sum();
+                                    }else {
+                                        groupSum = oldRelatedReportList.stream().filter(npl -> npl.getGroupId().equals(targetGpId) && (npl.getState() == 0 || npl.getState() == 1)).mapToDouble(Report::getWorkingTime).sum();
+                                    }
+                                    nowReport = targetCheckList.stream().filter(rl -> rl.getCreateDate().equals(report.getCreateDate()) && rl.getCreatorId().equals(report.getCreatorId()) && targetGpId.equals(rl.getGroupId())).mapToDouble(Report::getWorkingTime).sum();
+                                    hasReport = new BigDecimal(groupSum).add(new BigDecimal(nowReport));
+                                    TaskGroup tgp = taskGroupService.getById(targetGpId);
+                                    //设置的数值大于0时检查是否超额
+                                    if (tgp != null && tgp.getManDay() != null && tgp.getManDay() > 0) {
+                                        multiply = new BigDecimal(tgp.getManDay()).multiply(new BigDecimal(comTimeType.getAllday()));
+                                        if (hasReport.doubleValue() > multiply.doubleValue()) {
+                                            if (estimateTimeSetting.getGroupFronzeOnLack() == 1) {
+                                                httpRespMsg.setError("超过当前项目["+first.get().getProjectName()+"]分组["+tgp.getName()+"]预算工时,无法继续提交工时");
+                                                return httpRespMsg;
+                                            } else {
+                                                //仅提醒
+                                                warningGroupLack += (tgp.getTaskGroupCode() != null?tgp.getTaskGroupCode():"")+"-"+tgp.getName() + ",";
+                                            }
                                         } else {
-                                            //仅提醒
-                                            warningGroupLack += (tgp.getTaskGroupCode() != null?tgp.getTaskGroupCode():"")+"-"+tgp.getName() + ",";
-                                        }
-                                    } else {
-                                        //检查是否超过预设的提醒百分比;设置的数值是剩余的百分比
-                                        if (hasReport.divide(multiply, 2, RoundingMode.HALF_UP).multiply(new BigDecimal(100)).compareTo(new BigDecimal(100 - estimateTimeSetting.getGroupWarningPercent())) > 0) {
-                                            warningGroupPercent += (tgp.getTaskGroupCode() != null?tgp.getTaskGroupCode():"")+"-"+tgp.getName() + ",";
+                                            //检查是否超过预设的提醒百分比;设置的数值是剩余的百分比
+                                            if (hasReport.divide(multiply, 2, RoundingMode.HALF_UP).multiply(new BigDecimal(100)).compareTo(new BigDecimal(100 - estimateTimeSetting.getGroupWarningPercent())) > 0) {
+                                                warningGroupPercent += (tgp.getTaskGroupCode() != null?tgp.getTaskGroupCode():"")+"-"+tgp.getName() + ",";
+                                            }
                                         }
                                     }
                                 }
-                            }
 
+                            }
                         }
                     }
                 }
@@ -2450,5 +2461,27 @@ public class ReportController {
     public HttpRespMsg getCustomDataWithDate(String startDate,String endDate,HttpServletRequest request){
         return reportService.getCustomDataWithDate(startDate,endDate,request);
     }
+
+    @RequestMapping("/denyByCheckId")
+    public HttpRespMsg denyByCheckId(String userId){
+        HttpRespMsg msg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        LambdaQueryWrapper<Report> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(Report::getState,0);
+        queryWrapper.eq(Report::getCompanyId,companyId);
+        queryWrapper.and(wrapper->wrapper.and(wr->wr.eq(Report::getAuditDeptManagerid,userId).eq(Report::getIsDeptAudit,1)).or(wr1->wr1.eq(Report::getProjectAuditorId,userId).eq(Report::getIsDeptAudit,0)));
+        List<Report> reportList = reportMapper.selectList(queryWrapper);
+        reportList.forEach(r->{
+            r.setState(2);
+        });
+        if(!reportService.updateBatchById(reportList)){
+            msg.setError("验证失败");
+            return msg;
+        }
+        User user = userMapper.selectById(userId);
+        user.setIsActive(0);
+        userMapper.updateById(user);
+        return msg;
+    }
 }
 

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

@@ -108,7 +108,7 @@ public class TaskController {
         //当前用户
         User user = userMapper.selectById(userId);
         HttpRespMsg msg = new HttpRespMsg();
-
+        WxCorpInfo wxCorpInfo = wxCorpInfoService.getOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
         //新建的任务,需要设置创建人,创建时间
         if (task.getId() == null) {
             task.setCreateDate(LocalDate.now());
@@ -217,6 +217,7 @@ public class TaskController {
         boolean needRecalculateProgress = false;
         List<String> msgRecepientList = new ArrayList<>();
         List<Task> needReOrderList = new ArrayList<>();
+        StringBuilder taskCommentString=new StringBuilder();
         //新建的任务需要计算排序
         if (task.getId() == null) {
             isNew = true;
@@ -256,15 +257,63 @@ public class TaskController {
             //计算需要移除的执行人
             List<Integer> ids = oldExeList.stream().filter(old->!task.getExecutorList().stream().anyMatch(newT->newT.getId()!=null&&newT.getId().equals(old.getId())))
                         .map(TaskExecutor::getId).collect(Collectors.toList());
+            List<TaskExecutor> hasRemoveExecutor = oldExeList.stream().filter(old -> !task.getExecutorList().stream().anyMatch(newT -> newT.getId() != null && newT.getId().equals(old.getId()))).collect(Collectors.toList());
+            if(hasRemoveExecutor.size()>0){
+                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                    taskCommentString.append(",移除了执行人"+hasRemoveExecutor.stream().map(h->{
+                        if(!h.getExecutorId().equals(user.getId())){
+                            return "$userName="+h.getExecutorName()+"$";
+                        }else {
+                            return h.getExecutorName();
+                        }
+                    }).collect(Collectors.joining(",")));
+                }else {
+                    taskCommentString.append(",移除了执行人"+hasRemoveExecutor.stream().map(TaskExecutor::getExecutorName).collect(Collectors.joining(",")));
+                }
+
+            }
             if (ids.size() > 0) {
                 taskExecutorService.removeByIds(ids);
             }
             if (task.getExecutorList().size() > 0) {
                 task.getExecutorList().forEach(exe->exe.setTaskId(task.getId()));
+                //之前就存在的执行人数据
+                List<TaskExecutor> oldHas = task.getExecutorList().stream().filter(t -> t.getId() != null).collect(Collectors.toList());
                 taskExecutorService.saveOrUpdateBatch(task.getExecutorList());
                 //新增的执行人
                 msgRecepientList = task.getExecutorList().stream().filter(newT->!StringUtils.isEmpty(newT.getExecutorId()) && !oldExeList.stream().anyMatch(old->newT.getExecutorId().equals(old.getExecutorId())))
                         .map(TaskExecutor::getExecutorId).collect(Collectors.toList());
+                List<TaskExecutor> newAddExecutor = task.getExecutorList().stream().filter(newT -> !StringUtils.isEmpty(newT.getExecutorId()) && !oldExeList.stream().anyMatch(old -> newT.getExecutorId().equals(old.getExecutorId()))).collect(Collectors.toList());
+                if(newAddExecutor.size()>0){
+                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                        taskCommentString.append(",新增了执行人"+newAddExecutor.stream().map(h->{
+                            if(!h.getExecutorId().equals(user.getId())){
+                                return "$userName="+h.getExecutorName()+"$";
+                            }else {
+                                return h.getExecutorName();
+                            }
+                        }).collect(Collectors.joining(",")));
+                    }else {
+                        taskCommentString.append(",新增了执行人"+newAddExecutor.stream().map(TaskExecutor::getExecutorName).collect(Collectors.joining(",")));
+                    }
+                }
+                for (TaskExecutor oldHa : oldHas) {
+                    Optional<TaskExecutor> first = oldExeList.stream().filter(o -> o.getId().equals(oldHa.getId())).findFirst();
+                    if(first.isPresent()){
+                        if(!oldHa.getPlanHours().equals(first.get().getPlanHours())){
+                            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                if(oldHa.getExecutorId().equals(user.getId())){
+                                    taskCommentString.append(",修改了执行人"+oldHa.getExecutorName()+"计划工时为"+oldHa.getPlanHours()+"小时");
+                                }else {
+                                    taskCommentString.append(",修改了执行人"+"$userName"+oldHa.getExecutorName()+"$"+"计划工时为"+oldHa.getPlanHours()+"小时");
+                                }
+                            }else {
+                                taskCommentString.append(",修改了执行人"+oldHa.getExecutorName()+"计划工时为"+oldHa.getPlanHours()+"小时");
+                            }
+                        }
+                    }
+                }
+
             }
             if(task.getStartDate()==null){
                 taskMapper.updateStartDate(task.getId());
@@ -303,7 +352,7 @@ public class TaskController {
         comment.setUserName(user.getName());
         comment.setType(isNew?1:2);
         //comment.setContent(user.getName()+(isNew?"创建":"编辑")+"了任务");
-        comment.setContent(user.getName()+(isNew?MessageUtils.message("entry.create"):MessageUtils.message("entry.editedTask"))+MessageUtils.message("entry.task"));
+        comment.setContent(user.getName()+(isNew?MessageUtils.message("entry.create"):MessageUtils.message("entry.editedTask"))+MessageUtils.message("entry.task")+(isNew?"":taskCommentString.toString()));
         taskCommentMapper.insert(comment);
 
         //需要重新计算项目进度
@@ -328,8 +377,6 @@ public class TaskController {
                     companyDingdingService.sendNewTaskMsg(dingding, recpUserList.stream().map(User::getDingdingUserid).collect(Collectors.joining(",")),
                             task.getName(), endStr);
                 } else if (recpUserList.get(0).getCorpwxUserid() != null) {
-                    //企业微信用户
-                    WxCorpInfo wxCorpInfo = wxCorpInfoService.getOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
                     String corpUid = recpUserList.stream().map(User::getCorpwxUserid).distinct().collect(Collectors.joining("|"));
                     JSONObject json=new JSONObject();
                     JSONArray dataJson=new JSONArray();

+ 16 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskGroupController.java

@@ -68,6 +68,8 @@ public class TaskGroupController {
     private TaskExecutorService taskExecutorService;
     @Resource
     private GroupParticipatorService groupParticipatorService;
+    @Resource
+    private ParticipationService participationService;
     /**
      * 保存任务分组
      */
@@ -273,6 +275,7 @@ public class TaskGroupController {
         String[] projectIdArr = projectIds.split(",");
         List<String> list = Arrays.asList(projectIdArr);
         List<Integer> projectIdList = list.stream().map(Integer::parseInt).collect(Collectors.toList());
+        List<Participation> participationList = participationService.list(new LambdaQueryWrapper<Participation>().in(Participation::getProjectId, projectIdList));
         List<TaskGroup> taskGroups = taskGroupService.list(new QueryWrapper<TaskGroup>().in("project_id", projectIdList).eq("name",taskGroupName));
         taskGroups.forEach(t->{
             t.setInchargerId(inchargerId);
@@ -281,6 +284,7 @@ public class TaskGroupController {
         ids.add(-1);
         List<GroupParticipator> participatorList = groupParticipatorMapper.selectList(new QueryWrapper<GroupParticipator>().in("group_id", ids));
         List<GroupParticipator> add=new ArrayList<>();
+        List<Participation> addParticipationList=new ArrayList<>();
         for (TaskGroup taskGroup : taskGroups) {
             GroupParticipator groupParticipator=new GroupParticipator();
             groupParticipator.setGroupId(taskGroup.getId()).setUserId(inchargerId);
@@ -288,6 +292,13 @@ public class TaskGroupController {
             if(!first.isPresent()){
                 add.add(groupParticipator);
             }
+            boolean match = participationList.stream().anyMatch(p -> p.getProjectId().equals(taskGroup.getProjectId()) && p.getUserId().equals(inchargerId));
+            if(!match){
+                Participation participation=new Participation();
+                participation.setUserId(inchargerId);
+                participation.setProjectId(taskGroup.getProjectId());
+                addParticipationList.add(participation);
+            }
         }
         if(!groupParticipatorService.saveBatch(add)){
             msg.setError("验证失败");
@@ -295,6 +306,11 @@ public class TaskGroupController {
         if(!taskGroupService.updateBatchById(taskGroups)){
             msg.setError("验证失败");
         }
+        if(addParticipationList.size()>0){
+            if(!participationService.saveBatch(addParticipationList)){
+                msg.setError("验证失败");
+            }
+        }
         return msg;
     }
 

+ 17 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserController.java

@@ -81,7 +81,8 @@ public class UserController {
     private ExpenseMainTypeService expenseMainTypeService;
     @Resource
     private ExpenseTypeService expenseTypeService;
-
+    @Resource
+    private ReportMapper reportMapper;
     @Value("${spring.ldap.urls}")
     private String ldapUrl;
     @Value("${spring.ldap.base.dcFirst}")
@@ -273,9 +274,23 @@ public class UserController {
 
     @RequestMapping("/deactiveUser")
     public HttpRespMsg deactiveUser(User user) {
+        HttpRespMsg msg = new HttpRespMsg();
+        Integer companyId = userService.getById(request.getHeader("token")).getCompanyId();
+        //针对美莱德,飞锐特,湾创在对人员进行停用操作时,需要检查待他审核的日报
+        if(companyId==876||companyId==877||companyId==878){
+            LambdaQueryWrapper<Report> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.eq(Report::getState,0);
+            queryWrapper.eq(Report::getCompanyId,companyId);
+            queryWrapper.and(wrapper->wrapper.and(wr->wr.eq(Report::getAuditDeptManagerid,user.getId()).eq(Report::getIsDeptAudit,1)).or(wr1->wr1.eq(Report::getProjectAuditorId,user.getId()).eq(Report::getIsDeptAudit,0)));
+            Integer count = reportMapper.selectCount(queryWrapper);
+            if(count>0){
+                msg.setError("当前员工有待审核日报,确认停用并驳回日报吗?");
+                return msg;
+            }
+        }
         user.setIsActive(0);
         userService.updateById(user);
-        return new HttpRespMsg();
+        return msg;
     }
 
 

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

@@ -175,8 +175,6 @@ public interface ProjectMapper extends BaseMapper<Project> {
 
     List<Map<String, Object>> groupExpendProcessList(String userId, Integer companyId,String startDate,String endDate,@Param("list") List<Integer> deptIds);
 
-    Long groupExpendProcessListCount(String userId, Integer companyId,String startDate,String endDate,@Param("list") List<Integer> deptIds);
-
     List<Map<String, Object>> projectExpendProcessList(Integer projectId, Integer categoryId, String userId, Integer companyId, @Param("list") List<Integer> deptIds, Integer start, Integer size);
 
     Long projectExpendProcessListCount(Integer projectId, Integer categoryId, String userId, Integer companyId, @Param("list") List<Integer> deptIds);

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

@@ -24,7 +24,10 @@ import java.util.Map;
 public interface UserMapper extends BaseMapper<User> {
     List<Map<String, Object>> getUserByDepartment(Page page,
                                                   @Param("companyId") Integer companyId,
-                                                  @Param("departmentId") Integer departmentId,Integer matchingType, String keyword, Integer status, @Param("roleId") Integer roleId);
+                                                  @Param("departmentId") Integer departmentId,Integer matchingType,
+                                                  String keyword, Integer status, @Param("roleId") Integer roleId,
+                                                  List<String> corpwxUserIds
+                                                  );
 
     List<Map<String, Object>> getUserByDepartmentList(Page page,
                                                       @Param("companyId") Integer companyId,

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

@@ -106,7 +106,7 @@ public interface ProjectService extends IService<Project> {
 
     HttpRespMsg exportProjectInAndOut(HttpServletRequest request);
 
-    HttpRespMsg importData(String userId, MultipartFile file,Integer key, HttpServletRequest request);
+    HttpRespMsg importData(String userId, MultipartFile file,Integer key,@RequestParam(defaultValue = "0") Integer changeParticipation, HttpServletRequest request);
 
     HttpRespMsg getCustomerProjectInAndOut(Integer pageIndex, Integer pageSize, HttpServletRequest request,Integer customerId,Integer projectId);
 
@@ -277,7 +277,7 @@ public interface ProjectService extends IService<Project> {
 
     HttpRespMsg exportUserProjectProcessList(Integer deptId, String userId, Integer projectId);
 
-    HttpRespMsg groupExpendProcessList(String startDate, String endDate);
+    HttpRespMsg groupExpendProcessList(String startDate, String endDate,Integer pageIndex,Integer pageSize);
 
     HttpRespMsg exportGroupExpendProcessList(String startDate, String endDate);
 

+ 269 - 90
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -943,7 +943,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         p.setManDayStartDate(LocalDate.parse(manDayStartDate));
                     }
                     //检查项目人天是否超过已经填报的项目工时
-                    Report report = reportMapper.selectOne(new QueryWrapper<Report>().select("sum(working_time) as working_time").eq("project_id", id).and(i->i.eq("state", 0).or().eq("state", 1)));
+                    Report report = reportMapper.selectOne(new QueryWrapper<Report>().select("sum(working_time) as working_time").ge(!StringUtils.isEmpty(p.getManDayStartDate()),"create_date",p.getManDayStartDate()).eq("project_id", id).and(i->i.eq("state", 0).or().eq("state", 1)));
                     if(report!=null){
                         DecimalFormat df = new DecimalFormat("0.0");
                         if (estimateTimeSetting.getProjectManDayFillMode() == 0) {
@@ -4296,7 +4296,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
 
 
     @Override
-    public HttpRespMsg importData(String userId, MultipartFile multipartFile,Integer key, HttpServletRequest request) {
+    public HttpRespMsg importData(String userId, MultipartFile multipartFile,Integer key,@RequestParam(defaultValue = "0") Integer changeParticipation, HttpServletRequest request) {
         HttpRespMsg msg = new HttpRespMsg();
         User user = userMapper.selectById(userId);
         TimeType timeType = timeTypeMapper.selectById(user.getCompanyId());
@@ -4610,9 +4610,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         project.setId(updateProject.getId());
                         projectMapper.updateById(project);
                     }else {
-                        if(projectMapper.insert(project)>0){
-
-                        }
+                        projectMapper.insert(project);
                     }
                     importCount++;
                     //处理子项目
@@ -4790,6 +4788,10 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         //批量保存
                         List<Participation> finalOldPartList = oldPartList;
                         List<Participation> addPartList = participationList.stream().filter(newP-> !finalOldPartList.stream().anyMatch(oldP->oldP.getUserId().equals(newP.getUserId()))).collect(Collectors.toList());
+                        if(changeParticipation==1){
+                            participationService.remove(new LambdaQueryWrapper<Participation>().eq(project.getId()!=null,Participation::getProjectId,project.getId()));
+                            addPartList = participationList;
+                        }
                         if (addPartList.size() > 0) {
                             participationService.saveBatch(addPartList);
                         }
@@ -6024,6 +6026,10 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         //批量保存
                         List<Participation> finalOldPartList = oldPartList;
                         List<Participation> addPartList = participationList.stream().filter(newP-> !finalOldPartList.stream().anyMatch(oldP->oldP.getUserId().equals(newP.getUserId()))).collect(Collectors.toList());
+                        if(changeParticipation==1){
+                            participationService.remove(new LambdaQueryWrapper<Participation>().eq(project.getId()!=null,Participation::getProjectId,project.getId()));
+                            addPartList = participationList;
+                        }
                         if (addPartList.size() > 0) {
                             participationService.saveBatch(addPartList);
                         }
@@ -12624,7 +12630,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     }
 
     @Override
-    public HttpRespMsg groupExpendProcessList(String startDate, String endDate) {
+    public HttpRespMsg groupExpendProcessList(String startDate, String endDate,Integer pageIndex,Integer pageSize) {
         HttpRespMsg msg=new HttpRespMsg();
         User user = userMapper.selectById(request.getHeader("token"));
         NumberFormat percentFormat = NumberFormat.getPercentInstance();
@@ -12635,12 +12641,42 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         List<Department> allDeptList = departmentMapper.selectList(new LambdaQueryWrapper<Department>().eq(Department::getCompanyId, companyId));
         List<Map<String,Object>> resultList;
         Long total;
+        Integer size=null;
+        Integer start=null;
+        if(pageIndex!=null&&pageSize!=null){
+            size=pageSize;
+            start=(pageIndex-1)*size;
+        }
+        //需要统计的部门
+        List<Integer> targetDeptIds=new ArrayList<>();
+        targetDeptIds.add(7458);
+        targetDeptIds.add(7459);
+        targetDeptIds.add(7460);
+        //需要统计的分组名称
+        List<String> targetGroupNameList=new ArrayList<>();
+        targetGroupNameList.add("生产部电气");
+        targetGroupNameList.add("生产部车间");
+        targetGroupNameList.add("工程部现场安装施工");
+        targetGroupNameList.add("工程部配合调试");
+        targetGroupNameList.add("研发部工艺设计");
+        targetGroupNameList.add("研发部结构设计");
+        targetGroupNameList.add("研发部BIM设计");
+        targetGroupNameList.add("研发部电气设计");
+        targetGroupNameList.add("研发部工艺调试验收");
+        targetGroupNameList.add("研发部电气调试验收");
+        List<TaskGroup> taskGroupList = taskGroupMapper.selectList(new LambdaQueryWrapper<TaskGroup>().in(TaskGroup::getName, targetGroupNameList).inSql(TaskGroup::getProjectId, "select id from project where company_id=" + companyId));
+        List<Integer> projectIds = taskGroupList.stream().map(TaskGroup::getProjectId).distinct().collect(Collectors.toList());
+        if(pageIndex==null&&pageSize==null){
+            pageIndex=-1;
+            pageSize=-1;
+        }
+        IPage<Project> projectIPage = projectMapper.selectPage(new Page<>(pageIndex, pageSize), new LambdaQueryWrapper<Project>().in(Project::getId, projectIds).eq(Project::getCompanyId, companyId));
+        List<Project> projectList = projectIPage.getRecords();
         //是否具有查看全部数据的权限
         if(!viewAll){
             if(!incharger){
                 //只能查看本人的数据
                 resultList=projectMapper.groupExpendProcessList(user.getId(),companyId,startDate,endDate,null);
-                total=projectMapper.groupExpendProcessListCount(user.getId(),companyId,startDate,endDate,null);
             }else {
                 List<Department> departmentList = departmentMapper.selectList(new LambdaQueryWrapper<Department>().select(Department::getDepartmentId).eq(Department::getManagerId, user.getId()));
                 List<DepartmentOtherManager> departmentOtherManagerList = departmentOtherManagerMapper.selectList(new QueryWrapper<DepartmentOtherManager>().eq("other_manager_id", user.getId()));
@@ -12655,49 +12691,152 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     deptIds.addAll(branchDepartment);
                 }
                 resultList=projectMapper.groupExpendProcessList(null,companyId,startDate,endDate,deptIds);
-                total=projectMapper.groupExpendProcessListCount(null,companyId,startDate,endDate,deptIds);
             }
         }else {
             resultList=projectMapper.groupExpendProcessList(null,companyId,startDate,endDate,null);
-            total=projectMapper.groupExpendProcessListCount(null,companyId,startDate,endDate,null);
         }
-        Map<String, List<Map<String, Object>>> listMapGroupList = resultList.stream().collect(Collectors.groupingBy(m -> String.valueOf(m.get("corpwxDeptId"))));
-        List<String> departmentNameList = resultList.stream().map(m -> String.valueOf(m.get("corpwxDeptId"))).distinct().collect(Collectors.toList());
-        List<Map<String,Object>> lastList=new ArrayList<>();
-        for (String deptName : departmentNameList) {
-            List<Map<String, Object>> maps = listMapGroupList.get(deptName);
-            //再根据每个部门下员工数据长度合并人员名称列
-            Map<String, List<Map<String, Object>>> listMapGroupList2 = maps.stream().collect(Collectors.groupingBy(m -> String.valueOf(m.get("groupName"))));
-            List<String> groupNameList = maps.stream().map(m -> String.valueOf(m.get("groupName"))).distinct().collect(Collectors.toList());
-            for (String groupName : groupNameList) {
-                List<Map<String, Object>> mapList1 = listMapGroupList2.get(groupName);
-                double planHour = mapList1.stream().mapToDouble(m -> Double.valueOf(String.valueOf(m.get("planHour")))).sum();
-                double normalHour = mapList1.stream().mapToDouble(m -> Double.valueOf(String.valueOf(m.get("normalHour")))).sum();
-                double overHour = mapList1.stream().mapToDouble(m -> Double.valueOf(String.valueOf(m.get("overHour")))).sum();
-                double realHour = mapList1.stream().mapToDouble(m -> Double.valueOf(String.valueOf(m.get("realHour")))).sum();
-                double realCost = mapList1.stream().mapToDouble(m -> Double.valueOf(String.valueOf(m.get("realCost")))).sum();
-                double planHourNum = new BigDecimal(planHour).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
-                double normalHourNum = new BigDecimal(normalHour).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
-                double overHourNum = new BigDecimal(overHour).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
-                double realHourNum = new BigDecimal(realHour).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
-                double realCostNum = new BigDecimal(realCost).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
-                BigDecimal decimal = new BigDecimal(realHourNum);
-                decimal=decimal.divide(new BigDecimal(planHourNum),4,BigDecimal.ROUND_HALF_UP);
-                Map<String,Object> item=new HashMap<>();
-                item.put("deptId",deptName);
-                item.put("corpwxDeptId",maps.get(0).get("corpwxDeptId"));
-                item.put("groupName",groupName);
-                item.put("planHour",planHourNum);
-                item.put("normalHour",normalHourNum);
-                item.put("overHour",overHourNum);
-                item.put("realHour",realHourNum);
-                item.put("realCost",realCostNum);
-                item.put("process",percentFormat.format(decimal.doubleValue()));
-                lastList.add(item);
+        List<Department> departmentList = departmentMapper.selectList(new LambdaQueryWrapper<Department>().eq(Department::getCompanyId, companyId));
+        List<Map<String,Object>> itemList=new ArrayList<>();
+        for (Project project : projectList) {
+            for (Integer deptId : targetDeptIds) {
+                List<String> groupNames;
+                Optional<Department> department = departmentList.stream().filter(d -> d.getDepartmentId().equals(deptId)).findFirst();
+                Integer corpwxDeptid = department.get().getCorpwxDeptid();
+                String departmentName = department.get().getDepartmentName();
+                switch (deptId){
+                    case 7459:
+                        groupNames=new ArrayList<>();
+                        groupNames.add("生产部电气");
+                        groupNames.add("生产部车间");
+                        for (String groupName : groupNames) {
+                            Optional<TaskGroup> taskGroup = taskGroupList.stream().filter(f -> f.getName().equals(groupName) && f.getProjectId().equals(project.getId())).findFirst();
+                            Map<String,Object> item=new HashMap<>();
+                            item.put("projectId",project.getId());
+                            item.put("projectName",project.getProjectName());
+                            item.put("groupName",groupName);
+                            item.put("corpwxDeptId",corpwxDeptid);
+                            item.put("department_name",departmentName);
+                            if(!taskGroup.isPresent()){
+                                item.put("planHour",0);
+                                item.put("realHour",0);
+                                item.put("realCost",0);
+                                item.put("overHour",0);
+                                item.put("normalHour",0);
+                                item.put("process","0%");
+                            }else {
+                                Optional<Map<String, Object>> first = resultList.stream().filter(r -> Integer.valueOf(String.valueOf(r.get("projectId"))).equals(project.getId())
+                                        && Integer.valueOf(String.valueOf(r.get("groupId"))).equals(taskGroup.get().getId()) && Integer.valueOf(String.valueOf(r.get("deptId"))).equals(7458)).findFirst();
+                                if(first.isPresent()){
+                                    item.put("planHour",first.get().get("planHour"));
+                                    item.put("realHour",first.get().get("realHour"));
+                                    item.put("realCost",first.get().get("realCost"));
+                                    item.put("overHour",first.get().get("overHour"));
+                                    item.put("normalHour",first.get().get("normalHour"));
+                                    item.put("process",first.get().get("process"));
+                                }else {
+                                    item.put("planHour",0);
+                                    item.put("realHour",0);
+                                    item.put("realCost",0);
+                                    item.put("overHour",0);
+                                    item.put("normalHour",0);
+                                    item.put("process","0%");
+                                }
+                            }
+                            itemList.add(item);
+                        }
+                        break;
+                    case 7460:
+                        groupNames=new ArrayList<>();
+                        groupNames.add("工程部现场安装施工");
+                        groupNames.add("工程部配合调试");
+                        for (String groupName : groupNames) {
+                            Optional<TaskGroup> taskGroup = taskGroupList.stream().filter(f -> f.getName().equals(groupName) && f.getProjectId().equals(project.getId())).findFirst();
+                            Map<String,Object> item=new HashMap<>();
+                            item.put("projectId",project.getId());
+                            item.put("projectName",project.getProjectName());
+                            item.put("groupName",groupName);
+                            item.put("corpwxDeptId",corpwxDeptid);
+                            item.put("department_name",departmentName);
+                            if(!taskGroup.isPresent()){
+                                item.put("planHour",0);
+                                item.put("realHour",0);
+                                item.put("realCost",0);
+                                item.put("overHour",0);
+                                item.put("normalHour",0);
+                                item.put("process","0%");
+                            }else {
+                                Optional<Map<String, Object>> first = resultList.stream().filter(r -> Integer.valueOf(String.valueOf(r.get("projectId"))).equals(project.getId())
+                                        && Integer.valueOf(String.valueOf(r.get("groupId"))).equals(taskGroup.get().getId()) && Integer.valueOf(String.valueOf(r.get("deptId"))).equals(7458)).findFirst();
+                                if(first.isPresent()){
+                                    item.put("planHour",first.get().get("planHour"));
+                                    item.put("realHour",first.get().get("realHour"));
+                                    item.put("realCost",first.get().get("realCost"));
+                                    item.put("overHour",first.get().get("overHour"));
+                                    item.put("normalHour",first.get().get("normalHour"));
+                                    item.put("process",first.get().get("process"));
+                                }else {
+                                    item.put("planHour",0);
+                                    item.put("realHour",0);
+                                    item.put("realCost",0);
+                                    item.put("overHour",0);
+                                    item.put("normalHour",0);
+                                    item.put("process","0%");
+                                }
+                            }
+                            itemList.add(item);
+                        }
+                        break;
+                    case 7458:
+                        groupNames=new ArrayList<>();
+                        groupNames.add("研发部工艺设计");
+                        groupNames.add("研发部结构设计");
+                        groupNames.add("研发部BIM设计");
+                        groupNames.add("研发部电气设计");
+                        groupNames.add("研发部工艺调试验收");
+                        groupNames.add("研发部电气调试验收");
+                        for (String groupName : groupNames) {
+                            Optional<TaskGroup> taskGroup = taskGroupList.stream().filter(f -> f.getName().equals(groupName) && f.getProjectId().equals(project.getId())).findFirst();
+                            Map<String,Object> item=new HashMap<>();
+                            item.put("projectId",project.getId());
+                            item.put("projectName",project.getProjectName());
+                            item.put("groupName",groupName);
+                            item.put("corpwxDeptId",corpwxDeptid);
+                            item.put("department_name",departmentName);
+                            if(!taskGroup.isPresent()){
+                                item.put("planHour",0);
+                                item.put("realHour",0);
+                                item.put("realCost",0);
+                                item.put("overHour",0);
+                                item.put("normalHour",0);
+                                item.put("process","0%");
+                            }else {
+                                Optional<Map<String, Object>> first = resultList.stream().filter(r -> Integer.valueOf(String.valueOf(r.get("projectId"))).equals(project.getId())
+                                        && Integer.valueOf(String.valueOf(r.get("groupId"))).equals(taskGroup.get().getId()) && Integer.valueOf(String.valueOf(r.get("deptId"))).equals(7458)).findFirst();
+                                if(first.isPresent()){
+                                    item.put("planHour",first.get().get("planHour"));
+                                    item.put("realHour",first.get().get("realHour"));
+                                    item.put("realCost",first.get().get("realCost"));
+                                    item.put("overHour",first.get().get("overHour"));
+                                    item.put("normalHour",first.get().get("normalHour"));
+                                    item.put("process",first.get().get("process"));
+                                }else {
+                                    item.put("planHour",0);
+                                    item.put("realHour",0);
+                                    item.put("realCost",0);
+                                    item.put("overHour",0);
+                                    item.put("normalHour",0);
+                                    item.put("process","0%");
+                                }
+                            }
+                            itemList.add(item);
+                        }
+                        break;
+                }
             }
         }
         Map<String,Object> resultMap=new HashMap<>();
-        resultMap.put("record",lastList);
+        resultMap.put("record",itemList);
+        resultMap.put("total",projectIPage.getTotal());
         msg.setData(resultMap);
         return msg;
     }
@@ -12707,7 +12846,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         HttpRespMsg httpRespMsg=new HttpRespMsg();
         NumberFormat percentFormat = NumberFormat.getPercentInstance();
         percentFormat.setMaximumFractionDigits(2);
-        HttpRespMsg resultMsg = groupExpendProcessList(startDate,endDate);
+        HttpRespMsg resultMsg = groupExpendProcessList(startDate,endDate,null,null);
         Map<String, Object> msgData = (Map<String, Object>) resultMsg.getData();
         List<Map<String, Object>> mapList = (List<Map<String, Object>>) msgData.get("record");
         Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
@@ -12792,6 +12931,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         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("计划工时(财务)");
@@ -12805,11 +12945,12 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             tempCell.setCellValue(row_first.get(i));
             tempCell.setCellStyle(headStyle);
         }
-        sheet.addMergedRegion(new CellRangeAddress(0,0,3,6));
+        sheet.addMergedRegion(new CellRangeAddress(0,0,4,7));
         sheet.addMergedRegion(new CellRangeAddress(0,1,0,0));
         sheet.addMergedRegion(new CellRangeAddress(0,1,1,1));
         sheet.addMergedRegion(new CellRangeAddress(0,1,2,2));
-        sheet.addMergedRegion(new CellRangeAddress(0,1,7,7));
+        sheet.addMergedRegion(new CellRangeAddress(0,1,3,3));
+        sheet.addMergedRegion(new CellRangeAddress(0,1,8,8));
         //第二行
         SXSSFRow row1 = sheet.createRow(rowNum++);
         row1.setHeight((short)500);
@@ -12817,6 +12958,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         row_second.add("");
         row_second.add("");
         row_second.add("");
+        row_second.add("");
         row_second.add("正常工时");
         row_second.add("加班工时");
         row_second.add("合计工时");
@@ -12828,50 +12970,43 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             tempCell.setCellStyle(headStyle);
         }
         List<String> list=new ArrayList<>();
-        Map<String, List<Map<String, Object>>> listMapGroupList = mapList.stream().collect(Collectors.groupingBy(m -> String.valueOf(m.get("corpwxDeptId"))));
-        List<String> departmentNameList = mapList.stream().map(m -> String.valueOf(m.get("corpwxDeptId"))).distinct().collect(Collectors.toList());
-        //根据每个部门下数据长度合并部门名称列
-        int deptIndex=rowNum;
-        int allRowNum=0;
-        for (String deptName : departmentNameList) {
-            List<Map<String, Object>> maps = listMapGroupList.get(deptName);
-            //再根据每个部门下员工数据长度合并人员名称列
-            Map<String, List<Map<String, Object>>> listMapGroupList2 = maps.stream().collect(Collectors.groupingBy(m -> String.valueOf(m.get("groupName"))));
-            List<String> groupNameList = maps.stream().map(m -> String.valueOf(m.get("groupName"))).distinct().collect(Collectors.toList());
-            if(groupNameList.size()>1){
-                sheet.addMergedRegion(new CellRangeAddress(deptIndex,deptIndex+groupNameList.size()-1,0,0));
-            }
-            deptIndex+=groupNameList.size();
-            for (String groupName : groupNameList) {
-                List<Map<String, Object>> mapList1 = listMapGroupList2.get(groupName);
-                list.add("$departmentName="+deptName+"$");
-                list.add(groupName);
-                double planHour = mapList1.stream().mapToDouble(m -> Double.valueOf(String.valueOf(m.get("planHour")))).sum();
-                double normalHour = mapList1.stream().mapToDouble(m -> Double.valueOf(String.valueOf(m.get("normalHour")))).sum();
-                double overHour = mapList1.stream().mapToDouble(m -> Double.valueOf(String.valueOf(m.get("overHour")))).sum();
-                double realHour = mapList1.stream().mapToDouble(m -> Double.valueOf(String.valueOf(m.get("realHour")))).sum();
-                double realCost = mapList1.stream().mapToDouble(m -> Double.valueOf(String.valueOf(m.get("realCost")))).sum();
-                double planHourNum = new BigDecimal(planHour).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
-                double normalHourNum = new BigDecimal(normalHour).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
-                double overHourNum = new BigDecimal(overHour).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
-                double realHourNum = new BigDecimal(realHour).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
-                double realCostNum = new BigDecimal(realCost).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
-                list.add(String.valueOf(planHourNum));
-                list.add(String.valueOf(normalHourNum));
-                list.add(String.valueOf(overHourNum));
-                list.add(String.valueOf(realHourNum));
-                list.add(String.valueOf(realCostNum));
-                BigDecimal decimal = new BigDecimal(realHourNum);
-                decimal=decimal.divide(new BigDecimal(planHourNum),4,BigDecimal.ROUND_HALF_UP);
-                list.add(percentFormat.format(decimal.doubleValue()));
-            }
-            allRowNum+=groupNameList.size();
+        Map<String, List<Map<String, Object>>> listMapGroupList = mapList.stream().collect(Collectors.groupingBy(m -> String.valueOf(m.get("projectId"))));
+        List<String> projectIdList = mapList.stream().map(m -> String.valueOf(m.get("projectId"))).distinct().collect(Collectors.toList());
+        //根据每个项目合并项目列表
+        Integer projectNum=rowNum;
+        for (String projectId : projectIdList) {
+            List<Map<String, Object>> maps = listMapGroupList.get(projectId);
+            if(maps.size()>1){
+                sheet.addMergedRegion(new CellRangeAddress(projectNum,projectNum+maps.size()-1,0,0));
+            }
+            Map<String, List<Map<String, Object>>> listMapGroupDeptList = maps.stream().collect(Collectors.groupingBy(m -> String.valueOf(m.get("corpwxDeptId"))));
+            List<String> deptIdList = maps.stream().map(m -> String.valueOf(m.get("corpwxDeptId"))).distinct().collect(Collectors.toList());
+            Integer deptNum=projectNum;
+            for (String deptId : deptIdList) {
+                List<Map<String, Object>> maps1 = listMapGroupDeptList.get(deptId);
+                if(maps1.size()>1){
+                    sheet.addMergedRegion(new CellRangeAddress(deptNum,deptNum+maps1.size()-1,1,1));
+                }
+                deptNum+=maps1.size();
+            }
+            projectNum+=maps.size();
+        }
+        for (Map<String, Object> map : mapList) {
+            list.add(String.valueOf(map.get("projectName")));
+            list.add(String.valueOf(map.get("corpwxDeptId")));
+            list.add(String.valueOf(map.get("groupName")));
+            list.add(String.valueOf(map.get("planHour")));
+            list.add(String.valueOf(map.get("normalHour")));
+            list.add(String.valueOf(map.get("overHour")));
+            list.add(String.valueOf(map.get("realHour")));
+            list.add(String.valueOf(map.get("realCost")));
+            list.add(String.valueOf(map.get("process")));
         }
         int k=0;
-        for(int i = 0;i<allRowNum;i++){
+        for(int i = 0;i<mapList.size();i++){
             SXSSFRow tempRow = sheet.createRow(rowNum++);
             tempRow.setHeight((short)500);
-            for(int j=0;j<8;j++){
+            for(int j=0;j<9;j++){
                 SXSSFCell tempCell = tempRow.createCell(j);
                 String cellValue = "";
                 tempCell.setCellStyle(cellStyle);
@@ -12984,6 +13119,17 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             }
             map.put("userProgress",targetLsit);
         }
+        //处理项目下的负责组长
+        List<Integer> needProjectIds = resultList.stream().map(m -> Integer.valueOf(String.valueOf(m.get("projectId")))).collect(Collectors.toList());
+        List<Participation> participationList = participationMapper.selectList(new LambdaQueryWrapper<Participation>().in(Participation::getProjectId, needProjectIds));
+        List<String> needUserIds = participationList.stream().map(m -> String.valueOf(m.getUserId())).collect(Collectors.toList());
+        List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().in(User::getId, needUserIds));
+        resultList.forEach(r->{
+            List<Participation> targetParticipationList = participationList.stream().filter(p -> p.getProjectId().equals(Integer.valueOf(String.valueOf(r.get("projectId"))))).collect(Collectors.toList());
+            List<String> targetUserIds = targetParticipationList.stream().map(m -> String.valueOf(m.getUserId())).collect(Collectors.toList());
+            List<User> users = userList.stream().filter(u -> targetUserIds.contains(u.getId()) && u.getRoleId().equals(30770)).collect(Collectors.toList());
+            r.put("teamLeader",users);
+        });
         Map<String,Object> resultMap=new HashMap<>();
         resultMap.put("record",resultList);
         resultMap.put("total",total);
@@ -13006,10 +13152,13 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         titleList.add("项目名称");
         titleList.add("项目分类");
         titleList.add("项目编号");
+        titleList.add("开始时间");
+        titleList.add("截止时间");
         titleList.add("分配工时");
         titleList.add("已消耗工时");
         titleList.add("已消耗工时成本");
         titleList.add("剩余工时");
+        titleList.add("负责组长");
         titleList.add("参与员工");
         dataList.add(titleList);
         for (Map<String, Object> map : mapList) {
@@ -13017,10 +13166,31 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             item.add(String.valueOf(map.get("projectName")));
             item.add(String.valueOf(map.get("categoryName")));
             item.add(String.valueOf(map.get("projectCode")));
+            item.add(String.valueOf(map.get("planStartDate")));
+            item.add(String.valueOf(map.get("planEndDate")));
             item.add(String.valueOf(map.get("planHour")));
             item.add(String.valueOf(map.get("realHour")));
             item.add(String.valueOf(map.get("realCost")));
             item.add(String.valueOf(map.get("residueHour")));
+            StringBuilder sb1=new StringBuilder();
+            List<User> teamLeaders = (List<User>) map.get("teamLeader");
+            for (int i = 0; i < teamLeaders.size(); i++) {
+                if(i==teamLeaders.size()-1){
+                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                        sb1.append("$userName="+String.valueOf(teamLeaders.get(i).getName())+"$");
+                    }else {
+                        sb1.append(String.valueOf(teamLeaders.get(i).getName()));
+                    }
+
+                }else {
+                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                        sb1.append("$userName="+String.valueOf(teamLeaders.get(i).getName())+"$"+",");
+                    }else {
+                        sb1.append(String.valueOf(teamLeaders.get(i).getName())+",");
+                    }
+                }
+            }
+            item.add(sb1.toString());
             List<Map<String, Object>> userProgress = (List<Map<String, Object>>) map.get("userProgress");
             StringBuilder sb=new StringBuilder();
             for (int i = 0; i < userProgress.size(); i++) {
@@ -13056,8 +13226,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         HttpRespMsg msg=new HttpRespMsg();
         User user = userMapper.selectById(request.getHeader("token"));
         Integer companyId = user.getCompanyId();
-        boolean viewAll = sysFunctionService.hasPriviledge(user.getRoleId(), "全部员工项目进度表");
-        boolean incharger = sysFunctionService.hasPriviledge(user.getRoleId(), "负责部门员工项目进度表");
+        boolean viewAll = sysFunctionService.hasPriviledge(user.getRoleId(), "全部员工任务进度表");
+        boolean incharger = sysFunctionService.hasPriviledge(user.getRoleId(), "负责部门员工任务进度表");
         List<Department> allDeptList = departmentMapper.selectList(new LambdaQueryWrapper<Department>().eq(Department::getCompanyId, companyId));
         List<Map<String,Object>> resultList;
         Long total;
@@ -13195,12 +13365,15 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         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,0,2,6));
+        sheet.addMergedRegion(new CellRangeAddress(0,0,2,9));
         sheet.addMergedRegion(new CellRangeAddress(0,1,0,0));
         sheet.addMergedRegion(new CellRangeAddress(0,1,1,1));
         //第二行
@@ -13214,6 +13387,9 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         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));
@@ -13249,13 +13425,16 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 list.add(String.valueOf(maps.get(i).get("taskName")));
                 list.add(String.valueOf(maps.get(i).get("planHour")));
                 list.add(String.valueOf(maps.get(i).get("consumeTime")));
+                list.add(String.valueOf(maps.get(i).get("residue")));
+                list.add(String.valueOf(maps.get(i).get("planStartDate")));
+                list.add(String.valueOf(maps.get(i).get("planEndDate")));
             }
         }
         int k=0;
         for(int i = 0;i<mapList.size();i++){
             SXSSFRow tempRow = sheet.createRow(rowNum++);
             tempRow.setHeight((short)500);
-            for(int j=0;j<7;j++){
+            for(int j=0;j<10;j++){
                 SXSSFCell tempCell = tempRow.createCell(j);
                 String cellValue = "";
                 tempCell.setCellStyle(cellStyle);

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

@@ -675,6 +675,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
 
             //获取当前项目的子项目列表,任务分组,任务列表,项目相关维度列表
             reports.forEach(r->{
+                //设置项目名称
+                r.setProjectName(allProjectList.stream().filter(p->p.getId().equals(r.getProjectId())).findFirst().get().getProjectName());
                 r.setSubProjectList(subProjectList.stream().filter(s->s.getProjectId().equals(r.getProjectId())).collect(Collectors.toList()));
                 r.setTaskList(taskMapper.recentSimpleList(r.getProjectId(), userId, r.getStage(), r.getGroupId()));
                 //获取当前项目的工程专业进度

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

@@ -845,8 +845,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             status = 0;
             flag = true;
         }
-        Integer WXCompanyId = userMapper.selectById(request.getHeader("Token")).getCompanyId();
-        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", WXCompanyId));
+        Integer companyId = userMapper.selectById(request.getHeader("Token")).getCompanyId();
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
         HashMap<String, Object> data = new HashMap<>();
         httpRespMsg.data=data;
         //企业微信同步方式下,按姓名查找,需要去调用企微通讯录搜索接口
@@ -855,7 +855,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             HashMap<String, List> result = wxCorpInfoService.getOpenId(wxCorpInfo.getCorpid(), keyword, cursor,1,200);
             List users = result.get("user");
             if (users.size() > 0){
-                List<User> realUser = userMapper.selectList(new QueryWrapper<User>().in("corpwx_userid", users));
+                List<User> realUser = userMapper.getUserByDepartment(null, companyId, null,null, null, null, null, users);
                 long total = realUser.size();
                 data.put("records",realUser);
                 data.put("nextCursor",result.get("nextCursor").get(0));
@@ -872,18 +872,17 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             return httpRespMsg;
         }else {
             try {
-                Integer companyId = userMapper.selectById(request.getHeader("Token")).getCompanyId();
                 TimeType timeType = timeTypeMapper.selectById(companyId);
                 long total;
                 List<Map<String, Object>> list;
                 Page<User> page = new Page<>(pageIndex, pageSize);
                 if (departmentId == -1) {
                     //单独查找全部
-                    list = userMapper.getUserByDepartment(page, companyId, null,matchingType, keyword, status, roleId);
+                    list = userMapper.getUserByDepartment(page, companyId, null,matchingType, keyword, status, roleId, null);
                     total = page.getTotal();
                 } else if (departmentId == 0) {
                     //单独查找0, 未分配的
-                    list = userMapper.getUserByDepartment(page, companyId, departmentId,matchingType, keyword, status, roleId);
+                    list = userMapper.getUserByDepartment(page, companyId, departmentId,matchingType, keyword, status, roleId, null);
                     total = page.getTotal();
                 } else {
                     //范围查找

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

@@ -1843,53 +1843,22 @@
     </select>
 
     <select id="groupExpendProcessList" resultType="java.util.Map">
-        select d.department_name,d.corpwx_deptid as corpwxDeptId,tg.name as groupName,IFNULL(SUM(te.plan_hours),0) as planHour,
-        IFNULL(IFNULL((select SUM(working_time) from report where group_id=tg.id and state=1 <if test="startDate!=null and endDate!=null">
-          and  create_date between #{startDate} and #{endDate}
-        </if> ),0)-IFNULL((select SUM(overtime_hours) from report where group_id=tg.id and state=1 <if test="startDate!=null and endDate!=null">
-          and create_date between #{startDate} and #{endDate}
-        </if>),0),0) as normalHour,
-        IFNULL((select SUM(overtime_hours) from report where group_id=tg.id and state=1 <if test="startDate!=null and endDate!=null">
-          and create_date between #{startDate} and #{endDate}
-        </if>),0) as overHour,
-        IFNULL((select SUM(working_time) from report where group_id=tg.id and state=1 <if test="startDate!=null and endDate!=null">
-          and create_date between #{startDate} and #{endDate}
-        </if>),0) as realHour,
-        IFNULL((select SUM(cost) from report where group_id=tg.id and state=1 <if test="startDate!=null and endDate!=null">
-          and create_date between #{startDate} and #{endDate}
-        </if>),0) as realCost
-        from task_executor te
-        left join  user u on u.id=te.executor_id
-        left join task t on t.id=te.task_id
-        left join task_group tg on tg.id=t.group_id
-        left join department d on d.department_id=u.department_id
-        where u.company_id=#{companyId} and te.project_id is not null and d.department_name in ('4','12','14')
-        and tg.name in ('生产部电气','生产部车间','工程部现场安装施工','工程部配合调试','研发部工艺设计','研发部结构设计','研发部BIM设计','研发部电气设计','研发部工艺调试验收','研发部电气调试验收')
-        <if test="userId!=null and userId!=''">
-            and te.executor_id=#{userId}
-        </if>
-        <if test="list!=null and list.size()>0">
-            and d.department_id in
-            <foreach collection="list" open="(" close=")" item="item" separator=",">
-                #{item}
-            </foreach>
-        </if>
-        group by t.group_id
-        order by d.department_id
-    </select>
-
-    <select id="groupExpendProcessListCount" resultType="java.lang.Long">
-        select count(1) from (
-        select d.department_name,tg.name as groupName
-        from task_executor te
-        left join  user u on u.id=te.executor_id
-        left join task t on t.id=te.task_id
-        left join task_group tg on tg.id=t.group_id
-        left join department d on d.department_id=u.department_id
-        where u.company_id=#{companyId} and te.project_id is not null and d.department_name in ('4','12','14')
-        and tg.name in ('生产部电气','生产部车间','工程部现场安装施工','工程部配合调试','研发部工艺设计','研发部结构设计','研发部BIM设计','研发部电气设计','研发部工艺调试验收','研发部电气调试验收')
+        SELECT p.project_name AS projectName,p.id as projectId,tg.id as groupId,d.department_name,d.department_id as deptId,d.corpwx_deptid AS corpwxDeptId,tg.name AS groupName,
+        IFNULL(SUM(CASE WHEN (r.create_date BETWEEN #{startDate} AND #{endDate} AND r.state=1 AND r.project_id IS NOT NULL) THEN r.working_time ELSE NULL END),0) AS realHour,
+        IFNULL(SUM(CASE WHEN (r.create_date BETWEEN #{startDate} AND #{endDate} AND r.state=1 AND r.project_id IS NOT NULL) THEN r.cost ELSE NULL END),0) AS realCost,
+        IFNULL(SUM(CASE WHEN (r.create_date BETWEEN #{startDate} AND #{endDate} AND r.state=1 AND r.project_id IS NOT NULL) THEN r.overtime_hours ELSE NULL END),0) AS overHour,
+        IFNULL(SUM(CASE WHEN (r.create_date BETWEEN #{startDate} AND #{endDate} AND r.state=1 AND r.project_id IS NOT NULL) THEN r.working_time ELSE NULL END)
+              -SUM(CASE WHEN (r.create_date BETWEEN #{startDate} AND #{endDate} AND r.state=1 AND r.project_id IS NOT NULL) THEN r.overtime_hours ELSE NULL END),0) AS normalHour,
+        IFNULL(tg.man_day*8,0) AS planHour,
+        CONCAT(ROUND((IFNULL(SUM(CASE WHEN (r.create_date BETWEEN #{startDate} AND #{endDate} AND r.state=1 AND r.project_id IS NOT NULL) THEN r.working_time ELSE NULL END),0)/IFNULL(tg.man_day*8,0))*100,2),'%') as process
+        FROM  task_group tg
+        LEFT JOIN task t ON t.group_id=tg.id
+        LEFT JOIN report r  ON r.task_id=t.id
+        LEFT JOIN project p ON p.id=r.project_id
+        LEFT JOIN department d ON d.department_id=r.dept_id
+        WHERE r.company_id=#{companyId} AND r.dept_id IN (7458,7459,7460)  AND tg.name IN ('生产部电气','生产部车间','工程部现场安装施工','工程部配合调试','研发部工艺设计','研发部结构设计','研发部BIM设计','研发部电气设计','研发部工艺调试验收','研发部电气调试验收')
         <if test="userId!=null and userId!=''">
-            and te.executor_id=#{userId}
+            and r.creator_id=#{userId}
         </if>
         <if test="list!=null and list.size()>0">
             and d.department_id in
@@ -1897,13 +1866,11 @@
                 #{item}
             </foreach>
         </if>
-        group by t.group_id
-        order by d.department_id
-        ) as total
+        GROUP BY tg.id ORDER BY p.id,d.department_id
     </select>
 
     <select id="projectExpendProcessList" resultType="java.util.Map">
-        select p.project_name as projectName,pc.name as categoryName,p.project_code as projectCode,IFNULL(SUM(te.plan_hours),0) as planHour,
+        select p.id AS projectId,p.project_name as projectName,DATE_FORMAT(p.`plan_start_date`,'%Y-%m-%d') AS planStartDate,DATE_FORMAT(p.`plan_end_date`,'%Y-%m-%d') AS planEndDate,pc.name as categoryName,p.project_code as projectCode,IFNULL(SUM(te.plan_hours),0) as planHour,
         IFNULL((select SUM(working_time) from report where project_id=p.id and state=1),0) as realHour, IFNULL((select SUM(cost) from report where project_id=p.id and state=1),0) as realCost,
         IFNULL(IFNULL(SUM(te.plan_hours),0)-IFNULL((select SUM(working_time) from report where project_id=p.id and state=1),0),0) as residueHour,
         GROUP_CONCAT(CONCAT_WS('|',te.executor_name,IFNULL((select SUM(working_time) from report where creator_id=te.executor_id and project_id=p.id and state=1),0))) as executorString
@@ -1966,7 +1933,8 @@
 
     <select id="userTaskProcessList" resultType="java.util.Map">
         select d.department_name as departmentName,d.corpwx_deptid as corpwxDeptId,u.corpwx_userid as corpwxUserId,t.name as taskName,IFNULL(t.plan_hours,0) as planHour,u.name as userName,u.job_number as jobNumber,p.project_name as projectName,p.project_code as projectCode,
-        IFNULL((select SUM(working_time) from report where task_id=te.task_id and state=1),0)as consumeTime
+        IFNULL((select SUM(working_time) from report where task_id=te.task_id and state=1),0)as consumeTime,IF((IFNULL(t.plan_hours,0)-IFNULL((SELECT SUM(working_time) FROM report WHERE task_id=te.task_id AND state=1),0))&lt;0,0,(IFNULL(t.plan_hours,0)-IFNULL((SELECT SUM(working_time) FROM report WHERE task_id=te.task_id AND state=1),0))) AS residue
+        ,DATE_FORMAT(p.`plan_start_date`,'%Y-%m-%d') AS planStartDate,DATE_FORMAT(p.`plan_end_date`,'%Y-%m-%d') AS planEndDate
         from task_executor te
         left join  user u on u.id=te.executor_id
         left join department d on d.department_id=u.department_id

+ 14 - 13
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml

@@ -1059,21 +1059,22 @@
 
     <select id="getProjectTimeCost" resultType="java.util.Map">
         select p.project_code as projectCode,p.id as projectId,pm.id as pmId,p.project_name as projectName,DATE_FORMAT(p.plan_start_date,'%Y-%m-%d') as planStartDate,DATE_FORMAT(p.plan_end_date,'%Y-%m-%d') as planEndDate,u.job_number as inchargerId,
-               pm.name as projectMainName,p.status,p.category_name as categoryName,pl.project_level_name as levelString,p.contract_amount as contractAmount,
-               ps.contract_code as contractCode,ps.project_category_sub as projectCategorySub,ps.region,DATE_FORMAT(p.create_date,'%Y-%m-%d') as createDate,DATE_FORMAT(ps.warranty_start_date,'%Y-%m-%d') as warrantyStartDate,
-               DATE_FORMAT(ps.warranty_end_date,'%Y-%m-%d') as warrantyEndDate,DATE_FORMAT(p.finish_date,'%Y-%m-%d') as finishDate,ps.bu,IFNULL(p.man_day*8,0) as planTime,IFNULL(SUM(r.working_time),0) as realityTime,
-               case  when p.man_day*8-SUM(r.working_time) &gt;= 0 then '否' else '是' end as isOver ,case when p.man_day*8-SUM(r.working_time) &gt; 0 then (p.man_day*8-SUM(r.working_time)) else '0' end as remaining,
-               (select GROUP_CONCAT(CONCAT(u.job_number,'/',u.name)) from participation pa
-                                                                              left join user u on pa.user_id=u.id
-                where pa.project_id=p.id ) as participations
+        pm.name as projectMainName,p.status,p.category_name as categoryName,pl.project_level_name as levelString,p.contract_amount as contractAmount,
+        ps.contract_code as contractCode,ps.project_category_sub as projectCategorySub,ps.region,DATE_FORMAT(p.create_date,'%Y-%m-%d') as createDate,DATE_FORMAT(ps.warranty_start_date,'%Y-%m-%d') as warrantyStartDate,
+        DATE_FORMAT(ps.warranty_end_date,'%Y-%m-%d') as warrantyEndDate,DATE_FORMAT(p.finish_date,'%Y-%m-%d') as finishDate,ps.bu,IFNULL(p.man_day*8,0) as planTime,IFNULL(SUM(r.working_time),0) as realityTime,
+        case  when p.man_day*8-SUM(r.working_time) &gt;= 0 then '否' else '是' end as isOver ,case when p.man_day*8-SUM(r.working_time) &gt; 0 then (p.man_day*8-SUM(r.working_time)) else '0' end as remaining,
+        (select GROUP_CONCAT(CONCAT(u.job_number,'/',u.name)) from participation pa
+        left join user u on pa.user_id=u.id
+        where pa.project_id=p.id ) as participations
         from project p
-                 left join project_main pm on p.project_main_id=pm.id
-                 left join project_level pl on p.level=pl.id
-                 left join project_separate ps on p.id=ps.id
-                 left join user u on u.id=p.incharger_id
-                 left join report r on r.project_id=p.id
+        left join project_main pm on p.project_main_id=pm.id
+        left join project_level pl on p.level=pl.id
+        left join project_separate ps on p.id=ps.id
+        left join user u on u.id=p.incharger_id
+        left join report r on r.project_id=p.id
         where p.company_id=#{companyId}
-          and p.id=#{projectId}
+        and p.id=#{projectId}
+        AND (r.state=1 or r.state=0)
         group by p.id
     </select>
 

+ 5 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/UserMapper.xml

@@ -67,6 +67,11 @@
         LEFT JOIN department AS b ON a.department_id = b.department_id
         left join user c on c.id = a.superior_id and c.company_id = #{companyId}
         WHERE a.company_id = #{companyId}
+          <if test="corpwxUserIds != null">
+              AND a.corpwx_userid in
+                <foreach collection="corpwxUserIds" item="corpwxUserid" open="(" close=")" separator=",">
+                    #{corpwxUserid}</foreach>
+          </if>
         <if test="departmentId != null and companyId != ''">
             AND a.department_id = #{departmentId}
         </if>

+ 3 - 4
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/PlanServiceImpl.java

@@ -139,10 +139,9 @@ public class PlanServiceImpl extends ServiceImpl<PlanMapper, Plan> implements Pl
         }else {
             LocalDate now = LocalDate.now();
             if(planType==0&&isMob==1){
-                queryWrapper.and(wrapper->wrapper.eq(Plan::getStartDate,now).or().inSql(Plan::getId,"select ppt1.plan_id \n" +
-                        "from  plan_procedure_total ppt1\n" +
-                        "left join prod_procedure_team  ppt on ppt.plan_procedure_id=ppt1.id\n" +
-                        "where ppt.progress IS NULL OR ppt.progress<100")).lt(Plan::getStartDate,now.plusDays(1)).eq(Plan::getHideState,0);
+                queryWrapper.and(wrapper->wrapper.eq(Plan::getStartDate,now).or().inSql(Plan::getId,"select ppt.plan_id \n" +
+                        "from  plan_procedure_total ppt\n" +
+                        "where ppt.total_progress IS NULL OR ppt.total_progress<100")).lt(Plan::getStartDate,now.plusDays(1)).eq(Plan::getHideState,0);
             }else {
                 queryWrapper.eq(Plan::getStartDate,(planType==0||planType==2)?now:now.plusDays(1));
             }

+ 20 - 19
fhKeeper/formulahousekeeper/timesheet/src/components/taskComponent.vue

@@ -460,11 +460,13 @@
                                     </p>
                                 <!-- </p> -->
                                 <em>
-                                    <!-- {{item.content}} -->
                                     <p style="display: inline-block;padding: 0;margin: 0;" v-if="user.userNameNeedTranslate == 1">
-                                        {{item.content.msg1}}
-                                        <ww-open-data type='userName' :openid='item.content.msg2'></ww-open-data>
-                                        {{item.content.msg3}}
+                                        <template v-for="listItem in item.newContent">
+                                            <template v-if="listItem.type == 'user'">
+                                                <ww-open-data type='userName' :openid='listItem.value'></ww-open-data>
+                                            </template>
+                                            <template v-if="listItem.type == 'text'">{{ listItem.value }}</template>
+                                        </template>
                                     </p>
                                     <p style="display: inline-block;padding: 0;margin: 0;" v-if="user.userNameNeedTranslate != 1">{{item.content}}</p>
                                     <!-- 重启原因和责任人 -->
@@ -1172,23 +1174,22 @@ export default {
         this.http.post('/task-comment/getList', {taskId: e == 1 ? task.taskId : task.id},
         res => {
             if (res.code == "ok") {
-                for(var i in res.data) {
-                    if(res.data[i].content.indexOf('$userName=') != '-1') {
-                        let obj = {
-                            msg1: res.data[i].content.split('$')[0],
-                            msg2: res.data[i].content.split('$')[1].split('=')[1],
-                            msg3: res.data[i].content.split('$')[2]
-                        }
-                        res.data[i].content = obj
-                    } else {
-                        if(this.user.userNameNeedTranslate == 1) {
-                            let obj = {
-                                msg1: res.data[i].content,
-                                msg2: '',
-                                msg3: ''
+                if(this.user.userNameNeedTranslate == 1) {
+                    for (let i = 0; i < res.data.length; i++) {
+                        const originalString = res.data[i].content;
+                        const regex = /\$userName=[^$]*\$|[^$]+/g;
+                        const parts = originalString.match(regex);
+                        let newArrList = [];
+                        for (let j = 0; j < parts.length; j++) {
+                            const newStr = parts[j];
+                            if (newStr.startsWith('$userName=')) {
+                                const userName = newStr.slice(10, -1);
+                                newArrList.push({ type: 'user', value: userName });
+                            } else {
+                                newArrList.push({ type: 'text', value: newStr });
                             }
-                            res.data[i].content = obj
                         }
+                        res.data[i].newContent = newArrList;
                     }
                 }
                 this.commentList = res.data

+ 1 - 1
fhKeeper/formulahousekeeper/timesheet/src/permissions.js

@@ -260,7 +260,7 @@ const StringUtil = {
         arr[i] == '全部员工项目进度表' || arr[i] == '负责部门员工项目进度表' ? obj.reportStaffProject = true : ''
         arr[i] == '全部分组耗用进度表' || arr[i] == '负责部门分组耗用进度表' ? obj.reportProjectConsumptionFirst = true : ''
         arr[i] == '全部项目耗用进度表' || arr[i] == '负责部门项目耗用进度表' ? obj.reportProjectConsumptionTwo = true : ''
-        arr[i] == '全部员工任务完成表' || arr[i] == '负责部门员工任务完成表' ? obj.reportStaffTaskAccomplished = true : ''
+        arr[i] == '全部员工任务进度表' || arr[i] == '负责部门员工任务进度表' ? obj.reportStaffTaskAccomplished = true : ''
     }
     return obj
   }

+ 38 - 12
fhKeeper/formulahousekeeper/timesheet/src/views/corpreport/list.vue

@@ -46,7 +46,7 @@
                   <el-menu-item index="1-24" v-if="permissions.reportStaffProject" @click="ssl(23)"><p>员工项目进度表</p></el-menu-item>
                   <el-menu-item index="1-25" v-if="permissions.reportProjectConsumptionFirst" @click="ssl(24)"><p>分组耗用进度表</p></el-menu-item>
                   <el-menu-item index="1-26" v-if="permissions.reportProjectConsumptionTwo" @click="ssl(25)"><p>项目耗用进度表</p></el-menu-item>
-                  <el-menu-item index="1-27" v-if="permissions.reportStaffTaskAccomplished" @click="ssl(26)"><p>员工任务完成表</p></el-menu-item>
+                  <el-menu-item index="1-27" v-if="permissions.reportStaffTaskAccomplished" @click="ssl(26)"><p>员工任务进度表</p></el-menu-item>
                   <el-menu-item index="1-28" v-if="permissions.reportProjectEstimated" @click="ssl(27)"><p>项目预估工时表</p></el-menu-item>
                 </el-submenu>
               </el-menu>
@@ -1104,7 +1104,8 @@
             </el-table>
 
             <!-- 分组耗用进度表 -->
-            <el-table  v-if="ins == 24" :key="24" border :data="isbeCustomReport.consumptionSchedule" highlight-current-row v-loading="listLoading" :height="(+tableHeight + 50) - 1" style="width: 100%;" :span-method="objectSpanMethod">
+            <el-table  v-if="ins == 24" :key="24" border :data="isbeCustomReport.consumptionSchedule" highlight-current-row v-loading="listLoading" :height="(+tableHeight - 0) - 1" style="width: 100%;" :span-method="objectSpanMethod">
+              <el-table-column align="center" prop="projectName" label="项目名称" min-width="200"></el-table-column>
               <el-table-column align="center" prop="department_name" label="负责部门" min-width="150">
                 <template slot-scope="scope">
                   <div>
@@ -1134,10 +1135,27 @@
               <el-table-column align="center" prop="projectName" label="项目名称" min-width="220"></el-table-column>
               <el-table-column align="center" prop="categoryName" label="项目分类" min-width="150"></el-table-column>
               <el-table-column align="center" prop="projectCode" label="项目编号" min-width="150"></el-table-column>
+              <el-table-column align="center" prop="planStartDate" label="开始时间" min-width="150"></el-table-column>
+              <el-table-column align="center" prop="planEndDate" label="截止时间" min-width="150"></el-table-column>
               <el-table-column align="center" prop="planHour" label="分配工时(h)" width="100"></el-table-column>
               <el-table-column align="center" prop="realHour" label="已消耗工时(h)" width="120"></el-table-column>
               <el-table-column align="center" prop="realCost" label="已消耗工时成本(¥)" width="150"></el-table-column>
               <el-table-column align="center" prop="residueHour" label="剩余工时(h)" width="100"></el-table-column>
+              <el-table-column align="center"  label="负责组长" width="100">
+                <template slot-scope="scope">
+                  <div class="participatingEmployee">
+                    <div v-for="(item,index) in scope.row.teamLeader" :key="index">
+                      <span v-if="user.userNameNeedTranslate == '1'">
+                        <ww-open-data type='userName' :openid='item.name'></ww-open-data> 
+                      </span>
+                      <span v-if="user.userNameNeedTranslate != '1'">
+                        {{item.name}}
+                      </span>
+                      <span v-if="index < scope.row.teamLeader.length - 1">,</span>
+                    </div>
+                  </div>
+                </template>
+              </el-table-column>
               <el-table-column align="center" label="参与员工" min-width="150">
                 <template slot-scope="scope">
                   <div class="participatingEmployee">
@@ -1157,7 +1175,7 @@
               </el-table-column>
             </el-table>
 
-            <!-- 员工任务完成表 -->
+            <!-- 员工任务进度表 -->
             <el-table  v-if="ins == 26" :key="26" border :data="isbeCustomReport.taskCompletionSheet" highlight-current-row v-loading="listLoading" :height="(+tableHeight) - 1" style="width: 100%;" :span-method="objectSpanMethod">
               <el-table-column align="center" prop="departmentName" label="部门" min-width="150">
                 <template slot-scope="scope">
@@ -1190,6 +1208,9 @@
               <el-table-column align="center" prop="taskName" label="项目任务" min-width="150"></el-table-column>
               <el-table-column align="center" prop="planHour" label="计划工时(h)" min-width="150"></el-table-column>
               <el-table-column align="center" prop="consumeTime" label="消耗工时(h)" min-width="150"></el-table-column>
+              <el-table-column align="center" prop="residue" label="剩余工时(h)" min-width="150"></el-table-column>
+              <el-table-column align="center" prop="planStartDate" label="项目开始时间" min-width="150"></el-table-column>
+              <el-table-column align="center" prop="planEndDate" label="项目截止时间" min-width="150"></el-table-column>
             </el-table>
 
              <!-- 项目预估工时表 -->
@@ -1200,7 +1221,7 @@
               <el-table-column align="center" prop="workTime" label="实际工时" min-width="150"></el-table-column>
             </el-table>
         <!--工具条-->
-        <el-col :span="24" class="toolbar" v-if="ins != 6 && ins != 20 && ins != 21 && ins != 24">
+        <el-col :span="24" class="toolbar" v-if="ins != 6 && ins != 20 && ins != 21">
           <el-pagination
                 v-if="ins == 12"
                 @size-change="groupSizeChange"
@@ -1524,14 +1545,14 @@ export default {
       this.$t('statisticsofovertimework'),this.$t('timecostearlywarningtable'),this.$t('personneltimeallocationtable'),
       this.$t('statisticsofstafffillingintimerate'),this.$t('dailyreporttobereviewedstatistics'),this.$t('statisticsofpersonnelhours'),this.$t('taskgrouptimesheet'),this.$t('projectcostbaselinetable'),
       this.$t('ren-yuan-yue-du-gong-shi-biao'), this.$t('bumenchanyuqingkuang'), this.$t('ge-fen-zu-yu-jie-duan-gong-shi-biao'), '子项目工时成本表', '任务重启表', 'FTE报表', '有效工时率表', '项目分类工时占比表', '分类工时明细表',
-      '员工项目进度表', '分组耗用进度表', '项目耗用进度表', '员工任务完成表', '项目预估工时表'],
+      '员工项目进度表', '分组耗用进度表', '项目耗用进度表', '员工任务进度表', '项目预估工时表'],
 
       shuzArr: [this.$t('projectreport'),this.$t('projectTaskReport'),this.$t('projectcoststatement'),
       this.$t('projectbalancesheet'),this.$t('customerprojectincomestatement'),this.$t('projectphasetimesheet'),
       this.$t('statisticsofovertimework'),this.$t('timecostearlywarningtable'),this.$t('personneltimeallocationtable'),
       this.$t('employeereporttimelinessrate'),this.$t('dailyreporttobereviewedstatistics'),this.$t('statisticsofpersonnelhours'),this.$t('taskgrouptimesheet'),this.$t('projectcostbaselinetable'),
       this.$t('ren-yuan-yue-du-gong-shi-biao'), this.$t('bumenchanyuqingkuang'), this.$t('ge-fen-zu-yu-jie-duan-gong-shi-biao'), '子项目工时成本表', '任务重启表', 'FTE报表','有效工时率表', '项目分类工时占比表', '分类工时明细表',
-      '员工项目进度表', '分组耗用进度表', '项目耗用进度表', '员工任务完成表', '项目预估工时表'],
+      '员工项目进度表', '分组耗用进度表', '项目耗用进度表', '员工任务进度表', '项目预估工时表'],
 
       ins: 10000,
       user: JSON.parse(sessionStorage.user),
@@ -1659,7 +1680,7 @@ export default {
         projectSchedule: [], // 员工项目进度表
         consumptionSchedule: [], // 分组耗用进度表
         consumptionScheduleTwo: [], // 项目耗用进度表
-        taskCompletionSheet: [], // 员工任务完成
+        taskCompletionSheet: [], // 员工任务进度
       },
       projectEstimatedWorkData: [], // 项目预估工时表
     };
@@ -1770,14 +1791,16 @@ export default {
       if(this.permissions.reportProjectEstimated) {this.ssl(27);this.reportProjectEstimated = '1-28';return} else
       {this.allWrong = false}
     },
-    rowspan(spanArr,position,spanName,dataItem = []){
+    rowspan(spanArr,position,spanName,dataItem = [],fields=false){
       let newArray = dataItem.length > 0 ? dataItem : this.list1
       newArray.forEach((item,index) => {
         if(index == 0){
           spanArr.push(1)
           position = 0
         }else {
-          if(newArray[index][spanName] == newArray[index-1][spanName]){
+          let newArrFlag = newArray[index][spanName] == newArray[index-1][spanName] && (!fields || newArray[index][fields] == newArray[index-1][fields]);
+          // if(newArray[index][spanName] == newArray[index-1][spanName]){
+          if(newArrFlag){
             spanArr[position] += 1
             spanArr.push(0)
           }else {
@@ -2274,7 +2297,7 @@ export default {
           this.userId ? sl.userId = this.userId : ''
           this.projectSortIdTwo ? sl.categoryId = this.projectSortIdTwo : ''
         } else if(this.ins == 26) {
-          fName = '员工任务完成表' + '.xlsx'
+          fName = '员工任务进度表' + '.xlsx'
           url = "/project/exportUserTaskProcessList"
           let dept = this.departmentIdArray[this.departmentIdArray.length - 1]
           this.proJuctId ? sl.projectId = this.proJuctId : ''
@@ -3759,13 +3782,16 @@ export default {
       let parameter = {
         startDate: this.rangeDatas[0],
         endDate: this.rangeDatas[1],
+        pageIndex: this.page,
+        pageSize: this.size,
       }
       this.listLoading = true
       let { data } = await this.postData('/project/groupExpendProcessList', {
         ...parameter
       }) 
       this.resetMerge()
-      this.rowspan(this.listArr1, this.listPosition1, 'corpwxDeptId', data.record)
+      this.rowspan(this.listArr1, this.listPosition1, 'projectId', data.record)
+      this.rowspan(this.listArr2, this.listPosition2, 'corpwxDeptId', data.record, 'projectId')
       this.isbeCustomReport.consumptionSchedule = data.record
       this.total = data.total
       this.listLoading = false
@@ -3787,7 +3813,7 @@ export default {
       this.total = data.total
       this.listLoading = false
     },
-    // 员工任务完成
+    // 员工任务进度
     async getTaskCompletionSheet() {
       let parameter = {
         pageIndex: this.page,

+ 242 - 564
fhKeeper/formulahousekeeper/timesheet/src/views/project/budgetReview.vue

@@ -1,84 +1,125 @@
 <template>
     <section>
+        <div class="budgetReviewHeader">
+            <div class="budgetReviewHeader_Form">
+                <!-- 日期 -->
+                <div class="budgetReviewHeader_FormItem">
+                    <el-date-picker size="small" v-model="screeningConditionForm.dateRange" :editable="false"
+                        format="yyyy-MM-dd" value-format="yyyy-MM-dd" :clearable="false" :range-separator="'至'"
+                        type="daterange" :start-placeholder="'开始日期'" :end-placeholder="'结束日期'" style="width: 260px"
+                        @change="getList"></el-date-picker>
+                </div>
+                <!-- 项目 -->
+                <div class="budgetReviewHeader_FormItem">
+                    <div class="budgetReviewHeader_FormItemText">项目:</div>
+                    <el-select v-model="screeningConditionForm.projectId" filterable placeholder="请选择项目" clearable
+                        size="small" @change="getList">
+                        <el-option v-for="item in projectList" :key="item.id"
+                            :label="item.projectName + '\u3000' + item.projectCode" :value="item.id">
+                            <span class="selectProRight">{{ item.projectCode }}</span>
+                            <span class="selectProleft">{{ item.projectName }}</span>
+                        </el-option>
+                    </el-select>
+                </div>
+                <!-- 审核人 -->
+                <div class="budgetReviewHeader_FormItem">
+                    <div class="budgetReviewHeader_FormItemText">审核人:</div>
+                    <el-select v-model="screeningConditionForm.submitUserId" filterable placeholder="请选择审核人" clearable
+                        size="small" v-if="user.userNameNeedTranslate != 1" style="width: 130px;" @change="getList">
+                        <el-option v-for="item in usersList" :key="item.id" :label="item.name + '\u3000' + item.jobNumber"
+                            :value="item.id">
+                            <span class="selectProRight">{{ item.jobNumber }}</span>
+                            <span class="selectProleft">{{ item.name }}</span>
+                        </el-option>
+                    </el-select>
+                    <selectCat :size="'small'" :subject="usersList" :subjectId="screeningConditionForm.submitUserId"
+                        :clearable="true" :filterable="true" :searchBoxTop="1" stinction="'1'" @selectCal="selectCal"
+                        v-if="user.userNameNeedTranslate == 1" :widthStr="'130'"></selectCat>
+                </div>
+                <!-- 审核状态 -->
+                <div class="budgetReviewHeader_FormItem">
+                    <div class="budgetReviewHeader_FormItemText">审核状态:</div>
+                    <el-select v-model="screeningConditionForm.status" filterable placeholder="请选择状态" clearable size="small"
+                        style="width: 120px;" @change="getList">
+                        <el-option v-for="item in auditStatus" :key="item.id" :label="item.label" :value="item.id">
+                        </el-option>
+                    </el-select>
+                </div>
+            </div>
+            <div class="budgetReviewHeader_btn">
+                <el-button type="primary" size="small" @click="exportReport" :loading="exporListLoading">导出</el-button>
+            </div>
+        </div>
         <!--列表-->
-        <el-table :data="list" ref="multipleTable" v-if="showTable" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;"
-             :default-expand-all="defaultExpandAllFlg" >
-            <el-table-column type="selection" width="55"></el-table-column>
-            <el-table-column type="expand" :label="''">
-                <!-- <template slot-scope="props">
-                    <el-timeline>
-                    
-                    </el-timeline>
-                </template> -->
-            </el-table-column>
-
-            <el-table-column prop="projectName" :label="'项目名称'" sortable>
+        <el-table :data="list" ref="multipleTable" highlight-current-row v-loading="listLoading" :height="tableHeight"
+            style="width: 100%;">
+            <el-table-column prop="projectName" :label="'项目名称'" sortable min-width="200px">
                 <template slot-scope="scope">
                     <div>
                         <span>
-                            {{scope.row.projectName}}
+                            {{ scope.row.projectName }}
                         </span>
                     </div>
                 </template>
             </el-table-column>
 
-            <el-table-column prop="groupName" :label="'分组名称'" sortable>
+            <el-table-column prop="groupName" :label="'分组名称'" sortable min-width="180px">
                 <template slot-scope="scope">
                     <div>
                         <span>
-                            {{scope.row.groupName}}
+                            {{ scope.row.groupName }}
                         </span>
                     </div>
                 </template>
             </el-table-column>
-            
-            <el-table-column prop="creator" :label="'提交人'" sortable>
+
+            <el-table-column prop="creator" :label="'提交人'" sortable min-width="120px">
                 <template slot-scope="scope">
                     <div>
                         <span v-if="user.userNameNeedTranslate == '1'">
                             <ww-open-data type='userName' :openid='scope.row.creator'></ww-open-data>
                         </span>
                         <span v-else>
-                            {{scope.row.creator}}
+                            {{ scope.row.creator }}
                         </span>
                     </div>
                 </template>
             </el-table-column>
 
-            <el-table-column prop="createTime" :label="'提交时间'" sortable>
+            <el-table-column prop="createTime" :label="'提交时间'" sortable min-width="120px">
                 <template slot-scope="scope">
                     <div>
                         <span>
-                            {{scope.row.createTime}}
+                            {{ scope.row.createTime }}
                         </span>
                     </div>
                 </template>
             </el-table-column>
-            <el-table-column prop="oldManDay" :label="'变更前预估工时'" sortable>
+            <el-table-column prop="oldManDay" :label="'变更前预估工时'" sortable min-width="150px">
                 <template slot-scope="scope">
                     <div>
                         <span>
-                            {{scope.row.oldManDay}}
+                            {{ scope.row.oldManDay }}
                         </span>
                     </div>
                 </template>
             </el-table-column>
 
-            <el-table-column prop="changeManDay" :label="'预估工时变更'" sortable>
+            <el-table-column prop="changeManDay" :label="'预估工时变更'" sortable min-width="150px">
                 <template slot-scope="scope">
                     <div>
                         <span>
-                            {{scope.row.changeManDay}}
+                            {{ scope.row.changeManDay }}
                         </span>
                     </div>
                 </template>
             </el-table-column>
 
-            <el-table-column prop="nowManDay" :label="'变更后预估工时'" sortable>
+            <el-table-column prop="nowManDay" :label="'变更后预估工时'" sortable min-width="150px">
                 <template slot-scope="scope">
                     <div>
                         <span>
-                            {{scope.row.nowManDay}}
+                            {{ scope.row.nowManDay }}
                         </span>
                     </div>
                 </template>
@@ -89,428 +130,116 @@
                     <div>
                         <div v-if="scope.row.remark && scope.row.remark.length > 11">
                             <el-tooltip class="remarkClassItem" effect="dark" :content="scope.row.remark" placement="top">
-                                <div class="remarkClass">{{scope.row.remark}}</div>
+                                <div class="remarkClass">{{ scope.row.remark }}</div>
                             </el-tooltip>
                         </div>
                         <div v-else>
-                            {{scope.row.remark}}
+                            {{ scope.row.remark }}
                         </div>
                     </div>
                 </template>
             </el-table-column>
-            
+
             <el-table-column prop="status" :label="$t('state.states')" sortable>
                 <template slot-scope="scope">
-                    <span v-if="scope.row.status == 0" style="color:#DAA520;">{{ '待审核'}}</span>
+                    <span v-if="scope.row.status == 0" style="color:#DAA520;">{{ '待审核' }}</span>
                     <span v-else-if="scope.row.status == 1" style="color:#32CD32;">{{ $t('state.alreadyPassed') }}</span>
                     <span v-else-if="scope.row.status == 2" style="color:#FF0000;">{{ $t('state.rejected') }}</span>
                 </template>
             </el-table-column>
-            <el-table-column :label="$t('operation')" width="220">
+            <el-table-column :label="$t('operation')" width="220" fixed="right">
                 <template slot-scope="scope">
-                    <el-button v-if="scope.row.status==0"  type="primary" :loading="logining" size="small" @click="review(scope.row.id,1)">{{ $t('btn.through') }}</el-button>
-                    <el-button v-if="scope.row.status==0"  type="danger" :loading="logining" size="small" @click="review(scope.row.id,2)">{{ $t('btn.rejected') }}</el-button>
+                    <el-button v-if="scope.row.status == 0" type="primary" :loading="logining" size="small"
+                        @click="review(scope.row.id, 1)">{{ $t('btn.through') }}</el-button>
+                    <el-button v-if="scope.row.status == 0" type="danger" :loading="logining" size="small"
+                        @click="review(scope.row.id, 2)">{{ $t('btn.rejected') }}</el-button>
                 </template>
             </el-table-column>
         </el-table>
-        <!--工具条-->
-        <!-- <el-col v-if="search.value != -1" :span="24" class="toolbar">
-            <el-pagination
-                @size-change="handleSizeChange"
-                @current-change="handleCurrentChange"
-                :page-sizes="[20 , 50 , 80 , 100]"
-                :page-size="20"
-                layout="total, sizes, prev, pager, next"
-                :total="total"
-                style="float:right;"
-            ></el-pagination>
-        </el-col> -->
     </section>
 </template>
 
 <script>
-    import util from "../../common/js/util";
+// 引入自定义组件
+import selectCat from "@/components/select.vue"
 
-    // 引入自定义组件
-    import selectCat from "@/components/select.vue"
+export default {
+    components: {
+        selectCat,
+    },
+    data() {
+        return {
+            list: [],
+            tableHeight: 0,
+            listLoading: false,
+            defaultExpandAllFlg: false,
+            exporListLoading: false,
+            user: JSON.parse(sessionStorage.getItem("user")),
 
-    // 引入自定义级联组件
-    import vueCascader from "@/components/cascader.vue"
-    import cascaderOption from "@/components/cascaderOption.vue"
-
-    export default {
-        components: {
-            selectCat,
-            vueCascader,
-            cascaderOption
-        },
-        data() {
-            return {
-                yuzhongCompId: 3385,
-                roleList:[{value: 1,label: 'CRC&LM'},{value: 2,label: 'PM'}],
-                batchDenyLoading: false,
-                batchDenyDialog: false,
-                batchDenyData: {ids:'',reason:''},
-                batchApproveLoading: false,
-                denyForm:null,
-                denyReasonDialog:false,
-                isAllSelect:false,
-                user: JSON.parse(sessionStorage.getItem("user")),
-                permissions: JSON.parse(sessionStorage.getItem("permissions")),
-                search: {
-                    projectId:null,
-                    departmentIdArray: null,
-                    departmentId:null,
-                    // date: null,
-                    startDate: null,
-                    endDate: null,
-                    state:0,
-                    userId: null,
-                    userIdArray: []
-                },
+            usersList: [],
+            searchUsersList: [],
+            projectList: [],
+            auditStatus: [
+                { id: 1, label: '待审核' },
+                { id: 2, label: '审核通过' },
+                { id: 3, label: '已驳回' }
+            ],
 
-                users: [],
-                option:[],
-                tableHeight: 0,
-                listLoading: false,
-                total: 0,
-                page: 1,
-                size: 20,
-                list: [],
-                logining: false,
-                multipleSelection: [],
-                usersList: [],
-                searchUsersList: [],
-                dataTime: [],
-                recordDialogVisible: false,
-                recordLists: [],
-                totals: 0,
-                pageIndexList: 1,
-                pageSizeList: 20,
-                undoForm: {
-                    // reason: '',
-                    // userId: '',
-                    // createDate: ''
-                },
-                undoFormDialog: false,
-                detailsDialog: false,
-                idx: 0, // 详情索引
-                detailsList: [],
-                undoFormLoading: false,
-
-                approveinData: null,
-                approveinDialog: false,
-                isbatch: false,
-                defaultExpandAllFlg: false,
-                showTable: true
-            };
-        },
-        filters: {
-            // 过滤
-            amounts(value) {
-                var zhi = +value + 0
-                return zhi.toFixed(1)
+            screeningConditionForm: {
+                projectId: '',
+                dateRange: '',
+                submitUserId: '',
+                status: ''
             }
-        },
-        methods: {
-            viewOneReport(r) {
-                this.http.post("/report/getAuditWorkflowList", {reportId:r.id},
-                    res => {
-                        if (res.code == "ok") {
-                            this.$set(r,'auditorList', res.data);
-                        } 
-                    },
-                    error => {
-                        this.undoFormLoading = false
-                        this.$message({
-                            message: error,
-                            type: "error"
-                        });
-                    });
-            },
-            expandChange(row, expandedRows) {
-                var reportList = row.data;
-                for (var i=0;i<reportList.length; i++) {
-                    var r = reportList[i];
-                    if (r.auditorList) continue;
-                    this.http.post("/report/getAuditWorkflowList", {reportId:r.id},
-                    res => {
-                        if (res.code == "ok") {
-                            this.$set(r,'auditorList', res.data);
-                        } 
-                    },
-                    error => {
-                        this.undoFormLoading = false
-                        this.$message({
-                            message: error,
-                            type: "error"
-                        });
-                    });
-                }
-            },
-            detailsClick(item, i) {
-                this.detailsDialog = true
-                this.detailsList = item.membdateList
-                this.idx = i
-            },
-            // 审核记录撤销点击确定
-            clickCancel() {
-                this.undoFormLoading = true
-                this.http.post('/report/denyHisReport', this.undoForm,
-                res => {
-                    this.undoFormLoading = false
-                    if (res.code == "ok") {
-                        this.$message({
-                            message: this.$t('Revocationofsuccess'),
-                            type: "success"
-                        });
-                        this.undoFormDialog = false
-                        this.recordList()
-                    } else {
-                        this.$message({
-                            message: res.msg,
-                            type: "error"
-                        });
-                    }
-                },
-                error => {
-                    this.undoFormLoading = false
-                    this.$message({
-                        message: error,
-                        type: "error"
-                    });
-                });
-            },
-            undoCli(item, i) {
-                // console.log(item)
-                this.undoFormDialog = true
-                this.undoForm = {reason: ''}
-                // this.undoForm.reason = ''
-                if(i){
-                    this.undoForm.hisId = item.id
-                }else{
-                    this.undoForm.hisId = item.membdateList[0].id
-                }
-                
-                this.ioss = i
-                // if(i == 0) {    
-                //     this.undoForm.createDate = item.indate.split(' ')[0]
-                //     this.undoForm.userId = item.userId
-                // } else {
-                //     this.undoForm.hisId = item.id
-                // }
-            },
-            // 获取审核记录
-            recordList() {
-                // this.recordDialogVisible = true
-                // return
-                this.http.post( '/report-audit-log/getProjectReportAuditLog', {
-                    companyId: this.user.companyId,
-                    pageIndex: this.pageIndexList,
-                    pageSize: this.pageSizeList
-                },
-                res => {
-                    if (res.code == "ok") {
-                        for (var i in res.data.records) {
-                            res.data.records[i].result.indexOf(this.$t('btn.through')) == '-1' ? res.data.records[i].flg = false : res.data.records[i].flg = true
-                        }
-                        this.recordLists = res.data.records
-                        this.totals = res.data.total
-                        if(this.recordLists.length != 0){
-                            this.detailsList = this.recordLists[this.idx].membdateList
-                        }
-                        
-                    } else {
-                        this.$message({
-                            message: res.msg,
-                            type: "error"
-                        });
-                    }
-                },
-                error => {
+        };
+    },
+    filters: {
+        manHourText(value) {
+            return value == 0 ? 0 : value + 'h';
+        }
+    },
+    methods: {
+
+        review(id,checkType){
+            this.http.post("/group-budget-review/check", {id:id,checkType:checkType},
+            res => {
+                if (res.code == "ok") {
                     this.$message({
-                        message: error,
-                        type: "error"
+                        message:"操作成功",
+                        type: "success"
                     });
-                });
-            },
-            // 获取部门列表
-            getDepartment() {
-                this.http.post( this.port.manage.depList, {},
-                res => {
-                    if (res.code == "ok") {
-                        var list1 = JSON.parse(JSON.stringify(res.data));
-                        
-                        this.option = this.changeArr(list1);
-                        console.log(this.option, '部门')
-                    } else {
-                        this.$message({
-                            message: res.msg,
-                            type: "error"
-                        });
-                    }
-                },
-                error => {
+                    this.getList();
+                } else {
                     this.$message({
-                        message: error,
+                        message: res.msg,
                         type: "error"
                     });
-                });
-            },
-
-            handleSelectionChange(val) {
-                this.multipleSelection = val;
-            },
-            batchApprove(isPass) {
-                var ids = '';
-                for (var i=0;i<this.multipleSelection.length; i++) {
-                    var line = this.multipleSelection[i];
-                    var array = line.data;
-                    if (this.user.company.companyName == '成都明夷电子科技有限公司') {
-                        ids += line.reportIds+',';
-                    } else {
-                        for (var m=0;m<array.length; m++) {
-                            ids += array[m].id+',';
-                        }
-                    }
                 }
-                if (ids.length > 0) {
-                    ids = ids.substring(0, ids.length-1);
-                }
-                //等待
-                if(isPass){
-                    this.isbatch = true
-                    this.approveinData = {
-                        ids: ids
-                    }
-                    if(this.user.timeType.needEvaluate == 1){
-                        this.$set(this.approveinData,'evaluate','')
-                        this.approveinDialog = true
-                    }else{
-                        this.batchApproveLoading = true
-                        this.listLoading = true;
-                        this.batchApproveinfun()
-                    }
-                }else{
-                    this.batchDenyDialog = true
-                    this.batchDenyData.ids = ids
-                    this.batchDenyData.reason = ''
-                }
-            },
-            batchApproveinfun(){
-                this.http.post('/report/batchApproveReport', this.approveinData,
-                    res => {
-                        this.batchApproveLoading = false
-                        this.listLoading = false;
-                        if (res.code == "ok") {
-                            this.approveinDialog = false
-                            this.getList();
-                        } else {
-                            this.$message({
-                            message: res.msg,
-                            type: "error"
-                            });
-                        }
-                    },
-                    error => {
-                        this.listLoading = false;
-                        this.$message({
-                            message: error,
-                            type: "error"
-                        });
-                    });
-            },
-            batchDenyClick(){
-                this.batchDenyLoading = true
-                    this.listLoading = true;
-                    this.http.post('/report/batchDenyReport', this.batchDenyData,
-                    res => {
-                        this.batchDenyLoading = false;
-                        this.batchDenyDialog = false
-                        this.listLoading = false;
-                        if (res.code == "ok") {
-                            this.getList();
-                        } else {
-                            this.$message({
-                            message: res.msg,
-                            type: "error"
-                            });
-                        }
-                    },
-                    error => {
-                        this.listLoading = false;
-                        this.$message({
-                            message: error,
-                            type: "error"
-                        });
-                    });
-            },
-            //分页
-            handleCurrentChange(val) {
-                this.page = val;
-                this.getList();
-            },
-
-            handleSizeChange(val) {
-                this.size = val;
-                this.getList();
-            },
-
-            //分页
-            handleCurrentChangeList(val) {
-                this.pageIndexList = val;
-                this.recordList();
             },
-
-            handleSizeChangeList(val) {
-                this.pageSizeList = val;
-                this.recordList();
-            },
-
-            test(){
-                console.log(this.search.userId);
-            },
-            searchUserIds(deptId){
-                this.searchUsersList = this.usersList.filter(item => deptId == item.departmentId)
-            },
-            usersSearch(e){
-                if(e == false){
-                    this.getList()
-                }
+            error => {
+                this.$message({
+                    message: error,
+                    type: "error"
+                });
+            });
+        },
+        //获取待审核的数据列表
+        getList() {
+            this.listLoading = true;
+            const { projectId, dateRange, submitUserId, status } = this.screeningConditionForm;
+            const params = {
+                ...(projectId && { projectId }),
+                ...(dateRange && { startTime: dateRange[0], endTime: dateRange[1] }),
+                ...(submitUserId && { submitUserId }),
+                ...(status && { status }),
+            };
+            this.http.post("/group-budget-review/list", {
+                ...params
             },
-            //获取待审核的数据列表
-            getList(e) {
-                this.listLoading = true;
-                this.http.post("/group-budget-review/list",{},
                 res => {
                     this.listLoading = false;
                     if (res.code == "ok") {
                         this.list = res.data;
-                    } else {
-                        this.$message({
-                        message: res.msg,
-                        type: "error"
-                        });
-                    }
-                },
-                error => {
-                    this.listLoading = false;
-                    this.$message({
-                        message: error,
-                        type: "error"
-                    });
-                });
-            },
-
-            review(id,checkType){
-                this.http.post("/group-budget-review/check", {id:id,checkType:checkType},
-                res => {
-                    if (res.code == "ok") {
-                        this.$message({
-                            message:"操作成功",
-                            type: "success"
-                        });
-                        this.getList();
                     } else {
                         this.$message({
                             message: res.msg,
@@ -519,24 +248,19 @@
                     }
                 },
                 error => {
+                    this.listLoading = false;
                     this.$message({
                         message: error,
                         type: "error"
                     });
                 });
-            },
-
-            approveinfun(){
-                this.http.post(this.port.report.approve, this.approveinData,
+        },
+        //获取项目列表
+        getProjectList() {
+            this.http.post(this.port.project.list, {},
                 res => {
-                    this.logining = false;
                     if (res.code == "ok") {
-                        this.approveinDialog = false
-                        this.$message({
-                            message: this.$t('message.Reviewsucceeded'),
-                            type: "success"
-                        });
-                        this.getList();
+                        this.projectList = res.data;
                     } else {
                         this.$message({
                             message: res.msg,
@@ -545,38 +269,19 @@
                     }
                 },
                 error => {
-                    this.logining = false;
                     this.$message({
                         message: error,
                         type: "error"
                     });
                 });
-            },
-// 修改数组
-            changeArr(arr) {
-                for (var i = 0; i < arr.length; i++) {
-                    if(arr[i].id != -1 && arr[i].id != 0) {
-                        if (arr[i].children != null && arr[i].children.length>0) {
-                            arr[i].children = this.changeArr(arr[i].children);
-                        }
-                        arr[i].id && (arr[i].value = arr[i].id);
-                        delete arr[i].id;
-                    }
-                }
-                for(var i in arr) {
-                    if(arr[i].id == -1 || arr[i].id == 0) {
-                        arr.splice(i,1)
-                    }    
-                }
-                return arr;
-            },
-            
-            //获取项目列表
-            getProjectList() {
-                this.http.post( this.port.project.list, {},
+        },
+        // 获取所有人员
+        getUsers() {
+            this.http.post('/user/getSimpleActiveUserList', {},
                 res => {
                     if (res.code == "ok") {
-                        this.projectList = res.data;
+                        this.usersList = res.data;
+                        this.searchUsersList = this.usersList
                     } else {
                         this.$message({
                             message: res.msg,
@@ -590,35 +295,46 @@
                         type: "error"
                     });
                 });
+        },
+        selectCal(obj) {
+            console.log(obj, '过来的数据')
+            if (obj.distinction == 1) {
+                this.screeningConditionForm.submitUserId = obj.id
+                this.getList()
+            }
+        },
+        // 获取当月第一天到现在的日期
+        getNowMonth() {
+            let date = new Date();
+            let year = date.getFullYear();
+            let month = date.getMonth() + 1;
+            let day = date.getDate();
+            let now = year + '-' + (month < 10 ? '0' + month : month) + '-' + (day < 10 ? '0' + day : day);
+            let firstDay = year + '-' + (month < 10 ? '0' + month : month) + '-01';
+            this.screeningConditionForm.dateRange = [firstDay, now]
+        },
+        // 导出
+        exportReport() {
+            const { projectId, dateRange, submitUserId, status } = this.screeningConditionForm;
+            const params = {
+                ...(projectId && { projectId }),
+                ...(dateRange && { startTime: dateRange[0], endTime: dateRange[1] }),
+                ...(submitUserId && { submitUserId }),
+                ...(status && { status }),
+            };
+            this.exporListLoading = true;
+            this.http.post('group-budget-review/export', {
+                ...params
             },
-            showDenyDialog(id,i, date, item) {
-                this.denyReasonDialog = true;
-                var ids = '';
-                if (this.user.company.companyName == '成都明夷电子科技有限公司') {
-                    ids = item.reportIds;
-                } else {
-                    var data = item.data;
-                    data.forEach(element => {
-                        ids +=(element.id+',');
-                    });
-                }
-                
-                this.denyForm = {id: id ,i:i, date: date, reportIds: ids, reason:null};
-            },
-
-            // 未通过日报
-            deny() {
-                this.logining = true;
-                this.http.post( this.port.report.deny, this.denyForm,
                 res => {
-                    this.logining = false;
+                    this.exporListLoading = false
                     if (res.code == "ok") {
-                        this.$message({
-                            message: this.denyForm.i==0?this.$t('message.rejectedsuccessfully'):this.$t('Revocationofsuccess'),
-                            type: "success"
-                        });
-                        this.getList();
-                        this.denyReasonDialog = false;
+                        var filePath = res.data;
+                        const a = document.createElement('a'); // 创建a标签
+                        a.setAttribute('download', '预估工时审核');// download属性
+                        a.setAttribute('href', filePath);// href链接
+                        a.click(); //自执行点击事件
+                        a.remove();
                     } else {
                         this.$message({
                             message: res.msg,
@@ -627,103 +343,29 @@
                     }
                 },
                 error => {
-                    this.logining = false;
-                    this.$message({
-                        message: error,
-                        type: "error"
-                    });
-                });
-            },
-            // 获取所有人员
-            getUsers() {
-                // this.http.post(this.port.manage.list, {
-                //     departmentId: -1,
-                //     pageIndex: 1,
-                //     // pageSize: 99999
-                //     pageSize: -1
-                // },
-                this.http.post('/user/getSimpleActiveUserList', {},
-                res => {
-                    if (res.code == "ok") {
-                        this.usersList = res.data;
-                        this.searchUsersList = this.usersList
-                    } else {
-                        this.$message({
-                        message: res.msg,
-                        type: "error"
-                        });
-                    }
-                },
-                error => {
+                    this.exporListLoading = false
                     this.$message({
                         message: error,
                         type: "error"
                     });
                 });
-            },
-            // 选择日期后触发
-            dataTimes() {
-                // console.log(this.dataTime)
-                if(this.dataTime){
-                    this.search.startDate = this.dataTime[0]
-                    this.search.endDate = this.dataTime[1]
-                }else{
-                    this.search.startDate = null
-                    this.search.endDate = null
-                }
-                this.getList()
-            },
-            // 自定义部门选择
-            vueCasader(obj) {
-                console.log(obj, '组件传过来的')
-                if(obj.distinction == '1') {
-                    if(obj.id != '') {
-                        let arr = []
-                        arr.push(obj.id)
-                        this.search.departmentIdArray = arr
-                    } else {
-                        this.search.departmentIdArray = []
-                    }
-                    this.getList(1)
-                }
-            },
-            selectCal(obj) {
-                console.log(obj, '过来的数据')
-                // search.userIdArray
-                let userListId = obj.arrUserList
-                let arr = []
-                for(var i in userListId) {
-                    arr.push(userListId[i].id)
-                }
-                this.search.userIdArray = arr
-                console.log(this.search.userIdArray, '数据看看')
-                this.usersSearch(false)
-            },
-            defaultExpandAllFlgCli() {
-                this.defaultExpandAllFlg = !this.defaultExpandAllFlg
-                this.list = JSON.parse(JSON.stringify(this.list))
-                this.$nextTick(()=>{this.$refs.multipleTable.doLayout()})
-                this.showTable = false
-                this.$nextTick(() => {
-                    this.showTable = true
-                })
-            }
-        },
-        created() {
-            let height = window.innerHeight;
-            this.tableHeight = height - 125;
-            const that = this;
-            window.onresize = function temp() {
-                that.tableHeight = window.innerHeight - 125;
-            };
-        },
-        mounted() {
-            this.getList();
-            // this.getDepartment();
-            // this.getProjectList();
-            // this.getUsers()
         }
-    };
+    },
+    created() {
+        let height = window.innerHeight;
+        this.tableHeight = height - 125;
+        const that = this;
+        window.onresize = function temp() {
+            that.tableHeight = window.innerHeight - 125;
+        };
+    },
+    mounted() {
+        this.getNowMonth()
+        this.getUsers();
+        this.getProjectList()
+        this.getList();
+    }
+};
 </script>
 
 <style lang="scss" scoped>
@@ -731,9 +373,45 @@
     display: inline-block;
     padding-left: 20px;
 }
+
 .remarkClass {
     overflow: hidden;
     text-overflow: ellipsis;
     white-space: nowrap;
 }
+
+.selectProRight {
+    float: right;
+    color: #8492a6;
+    font-size: 13px;
+    margin-left: 10px;
+}
+
+.selectProleft {
+    float: left;
+}
+
+.budgetReviewHeader {
+    padding: 10px 20px;
+    background: #F2F2F2;
+    display: flex;
+    justify-content: space-between;
+    flex-wrap: wrap;
+}
+
+.budgetReviewHeader_Form {
+    display: flex;
+
+    .budgetReviewHeader_FormItem {
+        display: flex;
+        align-items: center;
+        margin-right: 20px;
+
+        .budgetReviewHeader_FormItemText {
+            margin-right: 10px;
+            font-size: 14px;
+            color: #333;
+        }
+    }
+}
 </style>

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

@@ -1442,6 +1442,7 @@
 
         <el-dialog :title="$t('importproject')" v-if="importProjectBeforeDialog" :visible.sync="importProjectBeforeDialog" width="30%">
             <el-checkbox v-model="paramData1" style="margin-left:10px">{{ $t('dui-yi-you-xiang-mu-jin-hang-xin-xi-geng-xin') }}</el-checkbox>
+            <el-checkbox v-model="changeParticipation" @change="changeParticipationValue(changeParticipation)" style="margin-left:10px" >{{ '根据文件中参与人对现有的进行删减' }}</el-checkbox>
             <div slot="footer" class="dialog-footer" style="text-algin:center;">
                 <el-upload ref="upload" action="#" :limit="1" :http-request="importProject" :show-file-list="false">
                     <el-button type="primary">{{ $t('importproject') }}</el-button>
@@ -1629,7 +1630,7 @@
                             <span style="float: right; color: #8492a6;" v-if="user.companyId == 936">{{ item.jobNumber }}</span>
                         </el-option>
                     </el-select>
-                    <selectCat :size="'small'" :widthStr="'272'" v-if="user.userNameNeedTranslate == '1'" :subject="users" :subjectId="paramInchargerId" :distinction="'5'" @selectCal="selectCal"></selectCat>
+                    <selectCat :size="'small'" :widthStr="'272'" v-if="user.userNameNeedTranslate == '1'" :subject="users" :subjectId="hasSetGroupInchargerId" :distinction="'6'" @selectCal="selectCal"></selectCat>
                 </el-form-item>
             </el-form>
             <div slot="footer" class="dialog-footer">
@@ -2046,6 +2047,7 @@ a {
                 groupForm:{},
                 setTemplateDialog: false,
                 selectedGroup:{},
+                changeParticipation:false,
             };
         },
         // 过滤器
@@ -4509,8 +4511,12 @@ a {
             },
             importProjectBefore(){
                 this.paramData1 = false
+                this.changeParticipation = false
                 this.importProjectBeforeDialog = true
             },
+            changeParticipationValue(value){
+                this.paramData1=value
+            },
             importProject(item) {
                 //首先判断文件类型
                 let str = item.file.name.split(".");
@@ -4526,6 +4532,7 @@ a {
                     formData.append("file", item.file);
                     formData.append("userId", this.user.id);
                     formData.append('key',this.paramData1 ? 1 : 0)
+                    formData.append('changeParticipation',this.changeParticipation ? 1 : 0)
                     this.http.uploadFile('/project/importData', formData,
                     res => {
                         this.$refs.upload.clearFiles();
@@ -5709,6 +5716,8 @@ a {
                     this.projectProfessionList[obj.other].inchargerId = obj.id
                 } else if(obj.distinction =='5') {
                     this.paramInchargerId = obj.id
+                }else if(obj.distinction =='6') {
+                    this.hasSetGroupInchargerId = obj.id
                 } else if(obj.distinction == '10') {
                     let userList = obj.arrUserList
                     let arr = []

+ 42 - 5
fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue

@@ -2125,13 +2125,50 @@ export default {
               message: this.$t('stopsuccess'),
               type: "success",
             });
-            // this.getUsers();
             this.getUser();
           } else {
-            this.$message({
-              message: res.msg,
-              type: "error",
-            });
+            if(this.user.companyId==876||this.user.companyId==877||this.user.companyId==878){
+                this.$confirm('当前员工有待审核日报,确认停用并驳回日报吗?', '提示', {
+                confirmButtonText: '确定',
+                cancelButtonText: '取消',
+                type: 'warning'
+                }).then(() => {
+                  this.http.post(
+                    "/report/denyByCheckId",
+                    { userId:this.deactiveUser.id },
+                    (res) => {
+                      if (res.code == "ok") {
+                        this.$message({
+                          message: this.$t('stopsuccess'),
+                          type: "success",
+                        });
+                      } else {
+                        this.$message({
+                          message: res.msg,
+                          type: "error",
+                        });
+                      }
+                    },
+                    (error) => {
+                      this.listLoading = false;
+                      this.$message({
+                        message: error,
+                        type: "error",
+                      });
+                    }
+                  );
+                }).catch(() => {
+                  this.$message({
+                    type: 'info',
+                    message: '已取消'
+                  });          
+              });
+            }else{
+              this.$message({
+                message: error,
+                type: "error",
+              });
+            }
           }
         },
         (error) => {

+ 1 - 1
fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/index.vue

@@ -1509,7 +1509,7 @@ export default {
                             this.canDeleteReport = true
                             let array = [];
                             for (var i in list) {
-                                var projectName = "";
+                                var projectName = list[i].projectName;
                                 var flg = (list[i].isOvertime == 1);
                                 for (var j in this.project) {
                                     if (this.project[j].id == list[i].projectId) {