瀏覽代碼

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

Min 1 年之前
父節點
當前提交
ce1d9c21de

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

@@ -347,6 +347,7 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract> i
                 }
             }
             contract.setPayment(bg);
+            contractMapper.updateById(contract);
         }
 
         ContractLog contractLog = new ContractLog();

+ 5 - 1
fhKeeper/formulahousekeeper/management-workshop/pom.xml

@@ -226,7 +226,11 @@
             <artifactId>spring-boot-devtools</artifactId>
             <version>2.0.1.RELEASE</version>
         </dependency>
-
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-compress</artifactId>
+            <version>1.18</version>
+        </dependency>
     </dependencies>
 
     <build>

+ 39 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/CommonUploadController.java

@@ -23,6 +23,9 @@ public class CommonUploadController {
     @Value(value = "${upload.path}")
     private String path;
 
+    @Value(value = "${upload.tempUpdatePath}")
+    private String tempUpdatePath;
+
     @RequestMapping(value="uploadFile")
     public HttpRespMsg uploadFile(MultipartFile multipartFile) {
         HttpRespMsg msg = new HttpRespMsg();
@@ -58,4 +61,40 @@ public class CommonUploadController {
 
         return msg;
     }
+
+    @RequestMapping(value="uploadUpdateFile")
+    public HttpRespMsg uploadUpdateFile(MultipartFile multipartFile) {
+        HttpRespMsg msg = new HttpRespMsg();
+
+        //然后处理文件
+        String fileName = multipartFile.getOriginalFilename();
+        String[] split = fileName.split("\\.");
+        String serverName = UUID.randomUUID().toString().replaceAll("-", "") + "."+split[split.length-1];
+
+        //检查目录
+        File dir = new File(tempUpdatePath);
+        if (!dir.exists()) {
+            dir.mkdir();
+        }
+        File file = new File(dir, serverName);
+        InputStream inputStream = null;
+        OutputStream outputStream = null;
+        try {
+            inputStream = multipartFile.getInputStream();
+            outputStream = new FileOutputStream(file);
+            byte[] buffer = new byte[4096];
+            int temp = 0;
+            while ((temp = inputStream.read(buffer, 0, 4096)) != -1) {
+                outputStream.write(buffer, 0, temp);
+            }
+            inputStream.close();
+            outputStream.close();
+            msg.data = serverName;
+        } catch (Exception exception) {
+            exception.printStackTrace();
+            logger.error(exception.getMessage());
+        }
+
+        return msg;
+    }
 }

+ 12 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/util/FileUtil.java

@@ -1,9 +1,11 @@
 package com.management.platform.util;
 
 import com.fasterxml.jackson.annotation.ObjectIdGenerators;
+import org.apache.commons.io.FileUtils;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.*;
+import java.util.Arrays;
 
 /**
  * 文件读取工具类
@@ -138,4 +140,14 @@ public class FileUtil {
             }
         }
     }
+
+    public static void main(String[] args) {
+        String file = "C:\\gitproject\\manHourHousekeeper\\fhKeeper\\formulahousekeeper\\timesheet-workshop-h5\\dist";
+        String target = "D:\\www\\staticproject\\workshop_h5";
+        try {
+            FileUtils.copyDirectory(new File(file), new File(target));
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
 }

+ 150 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/util/ZipUtils.java

@@ -0,0 +1,150 @@
+package com.management.platform.util;
+
+import com.alibaba.excel.util.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.*;
+import java.util.Enumeration;
+import java.util.zip.*;
+
+/**
+ * @Description 压缩与解压工具
+ * @Author      yanghanwei
+ * @Date        18:42 2019-11-20
+ * @Version     v1
+ **/
+public class ZipUtils {
+
+    private static final Logger logger = LoggerFactory.getLogger(ZipUtils.class);
+
+    /**
+     * 压缩 zip
+     * @param filePath  文件夹 全路径
+     * @param fileName  文件夹名称
+     * @param outPath   压缩文件保存路径
+     */
+    public static void zipFile(String filePath, String fileName, String outPath) {
+        logger.info("filePath:{}, fileName:{}, outPath:{}", filePath, fileName, outPath);
+        try {
+            //创建Test.zip文件
+            OutputStream is = new FileOutputStream(outPath);
+            //检查输出流,采用CRC32算法,保证文件的一致性
+            CheckedOutputStream cos = new CheckedOutputStream(is, new CRC32());
+            //创建zip文件的输出流
+            ZipOutputStream zos = new ZipOutputStream(cos);
+            //需要压缩的文件或文件夹对象
+            File file = new File(filePath);
+            //压缩文件的具体实现函数
+            zipFilePost(zos,file,filePath,fileName,outPath);
+            zos.close();
+            cos.close();
+            is.close();
+            System.out.println("压缩完成");
+        } catch (Exception e) {
+            logger.error("压缩失败zipFile,Exception:" + e);
+        }
+    }
+
+    /**
+     * 压缩文件
+     * @param zos       zip文件的输出流
+     * @param file      需要压缩的文件或文件夹对象
+     * @param filePath  压缩的文件路径
+     * @param fileName  需要压缩的文件夹名
+     * @param outPath   缩完成后保存为Test.zip文件
+     */
+    private static void zipFilePost(ZipOutputStream zos, File file, String filePath, String fileName, String outPath){
+
+        try{
+            String path = file.getPath();
+            String zosName = "";
+            if(!StringUtils.isEmpty(path)){
+                zosName = path.substring(path.indexOf(fileName));
+            }
+            File[] files = file.listFiles();
+            if(file.isDirectory() && files != null && files.length > 0) {
+                // 创建压缩文件的目录结构
+                zos.putNextEntry(new ZipEntry(zosName + File.separator));
+                for(File f : files) {
+                    zipFilePost(zos, f, filePath, fileName, outPath);
+                }
+            } else {
+                logger.info("正在压缩文件:{}",file.getName());
+                // 创建压缩文件
+                zos.putNextEntry(new ZipEntry(zosName));
+                // 用字节方式读取源文件
+                InputStream is = new FileInputStream(file.getPath());
+                // 创建一个缓存区
+                BufferedInputStream bis = new BufferedInputStream(is);
+                // 字节数组,每次读取1024个字节
+                byte [] b = new byte[1024];
+                // 循环读取,边读边写
+                while(bis.read(b)!=-1) {
+                    // 写入压缩文件
+                    zos.write(b);
+                }
+                //关闭流
+                bis.close();
+                is.close();
+            }
+        } catch (Exception e) {
+            logger.error("压缩文件失败zipFilePost,Exception:" + e);
+        }
+    }
+
+    public static void unzip(String sourcePath, String targetPath) {
+        //targetPath输出文件路径
+        File targetFile = new File(targetPath);
+        // 如果目录不存在,则创建
+        if (!targetFile.exists()) {
+            targetFile.mkdirs();
+        }
+        //sourcePath压缩包文件路径
+        try (ZipFile zipFile = new ZipFile(new File(sourcePath))) {
+            System.out.println("file nums:" + zipFile.size());
+            Enumeration enumeration = zipFile.entries();
+            while (enumeration.hasMoreElements()) {
+                //依次获取压缩包内的文件实体对象
+                ZipEntry entry = (ZipEntry) enumeration.nextElement();
+                String name = entry.getName();
+                if (entry.isDirectory()) {
+                    continue;
+                }
+                try (BufferedInputStream inputStream = new BufferedInputStream(zipFile.getInputStream(entry))) {
+                    // 需要判断文件所在的目录是否存在,处理压缩包里面有文件夹的情况
+                    String outName = targetPath + "/" + name;
+                    File outFile = new File(outName);
+                    File tempFile = new File(outName.substring(0, outName.lastIndexOf("/")));
+                    if (!tempFile.exists()) {
+                        tempFile.mkdirs();
+                    }
+                    try (BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(outFile))) {
+                        int len;
+                        byte[] buffer = new byte[1024];
+                        while ((len = inputStream.read(buffer)) > 0) {
+                            outputStream.write(buffer, 0, len);
+                        }
+                    }
+
+                }
+
+            }
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    public static void main(String[] args) throws Exception{
+//        String filePath = "/var/folders/88/jh37h0fj59l1f302jdryz4780000gn/T/201908月小微平台消耗-1574300435525/";
+//        // 需要压缩的文件夹名
+//        String fileName = "201908月小微平台消耗-1574300435525";
+//        // 压缩完成后保存为Test.zip文件,名字随意
+//        String outPath = "/var/folders/88/jh37h0fj59l1f302jdryz4780000gn/T/Test3.zip";
+//        zipFile(filePath, fileName, outPath);
+
+        String sourcePath = "C:\\gitproject\\manHourHousekeeper\\fhKeeper\\formulahousekeeper\\timesheet-workshop\\distPC.zip";
+        String targetPath = "C:\\文档资料\\distPC";
+        unzip(sourcePath, targetPath);
+    }
+}

+ 3 - 2
fhKeeper/formulahousekeeper/management-workshop/src/main/resources/application.yml

@@ -10,8 +10,8 @@ spring:
       # 配置上传文件的大小设置
 
       # Single file max size  即单个文件大小
-      max-file-size: 100MB
-      max-request-size: 100MB
+      max-file-size: 200MB
+      max-request-size: 200MB
       location: C:/upload/
   datasource:
     driver-class-name: com.mysql.cj.jdbc.Driver
@@ -86,6 +86,7 @@ mybatis:
 #####配置图片上传路径####
 upload:
   path: C:/upload/
+  tempUpdatePath: C:/tempUpdate/
 picrecongnize:
   browser: C:/picrecongnize/browser/
   develop: C:/picrecongnize/develop/

+ 9 - 6
fhKeeper/formulahousekeeper/timesheet-workshop/src/views/plan/orderInsert.vue

@@ -39,7 +39,7 @@
 
       <div class="left-laowang" style="flex: 0 0 180px; overflow: hidden;">
         <div class="left-laowangText">
-          {{ currentDepartmentText }}
+          {{ currentDepartmentText && currentDepartmentText.text }}
         </div>
         <div class="left-laowangTree">
           <el-tree :data="departmentList" @node-click="treeChange" :props="defaultProps" :draggable="adjustPosition"
@@ -359,7 +359,10 @@ export default {
           { required: true, message: "分类名称", trigger: "blur" },
         ],
       },
-      currentDepartmentText: ''
+      currentDepartmentText: {
+        id: '',
+        text: ''
+      }
     };
   },
   computed: {},
@@ -433,7 +436,7 @@ export default {
             this.departmentList = this.changeArr(dptlist);
             if(this.departmentList[0]) {
               const { value, label } = this.departmentList[0]
-              this.currentDepartmentText = label
+              this.currentDepartmentText = { id: value, text: label }
               this.getTableData(value)
             }
           } else {
@@ -453,7 +456,7 @@ export default {
     },
     treeChange(item) {
       const { value, label } = item
-      this.currentDepartmentText = label
+      this.currentDepartmentText = { id: value, text: label }
       this.getTableData(value)
     },
     changeArr(arr) {
@@ -574,12 +577,12 @@ export default {
     },
     // 获取车间数据
     getTableData(departmentId) {
-      console.log(this.planDate);
+      console.log(this.planDate, departmentId);
       this.tableDataLoading = true;
       this.http.post(
         "/plan/list",
         {
-          deptId: departmentId,
+          deptId: departmentId || this.currentDepartmentText.id,
           planType: this.planType,
           date: this.planDate,
           steelStampNumber: this.steelStampNumber,

+ 9 - 6
fhKeeper/formulahousekeeper/timesheet-workshop/src/views/plan/planComponent.vue

@@ -45,7 +45,7 @@
       </div> -->
       <div class="left-laowang" style="flex: 0 0 180px; overflow: hidden;">
         <div class="left-laowangText">
-          {{ currentDepartmentText }}
+          {{ currentDepartmentText && currentDepartmentText.text }}
         </div>
         <div class="left-laowangTree">
           <el-tree :data="departmentList" @node-click="treeChange" :props="defaultProps" :draggable="adjustPosition" :allow-drop="allowDrop"
@@ -491,7 +491,7 @@ export default {
             this.departmentList = this.changeArr(dptlist);
             if(this.departmentList[0]) {
               const { value, label } = this.departmentList[0]
-              this.currentDepartmentText = label
+              this.currentDepartmentText = { id: value, text: label }
               this.getTableData(value)
             }
           } else {
@@ -511,7 +511,7 @@ export default {
     },
     treeChange(item) {
       const { value, label } = item
-      this.currentDepartmentText = label
+      this.currentDepartmentText = { id: value, text: label }
       this.getTableData(value)
     },
     changeArr(arr) {
@@ -677,12 +677,12 @@ export default {
     },
     // 获取车间数据
     getTableData(departmentId) {
-      console.log(this.planDate);
+      console.log(this.planDate, departmentId);
       this.tableDataLoading = true;
       this.http.post(
         "/plan/list",
         {
-          deptId: departmentId,
+          deptId: departmentId || this.currentDepartmentText.id,
           planType: this.planType,
           date: this.planDate,
           steelStampNumber: this.steelStampNumber,
@@ -756,7 +756,10 @@ export default {
             steelStampNumberEnd: ''
           }
         ],
-        currentDepartmentText: ''
+        currentDepartmentText: {
+          id: '',
+          text: ''
+        }
       }
     },
     addPlanData(formName) {

+ 177 - 0
fhKeeper/formulahousekeeper/timesheet-workshop/src/views/settings/settings.vue

@@ -30,6 +30,31 @@
         <div style="width:80px;margin:0 auto;padding:20px;">
             <el-button  type="primary" @click="submitInsert" :loading="addLoading">{{ $t('save') }}</el-button>
         </div>
+        <el-divider ></el-divider>
+        <div style="width:400px;margin:0 auto;padding:20px;">
+            <h3>系统部署</h3>
+            <el-form style="padding:35px;">
+                <el-form-item label="前端H5安装包" >
+                    <span>{{ param.h5Url }}</span>
+                    <el-upload ref="upload" action="#" :limit="1" :http-request="importH5" :show-file-list="false">
+                        <el-button type="primary" :underline="false" style="width:100%;" :loading="loadingExport" size="small">{{ $t('uoloadFiles') }}</el-button>
+                    </el-upload>
+                </el-form-item>
+                <el-form-item label="前端PC安装包" >
+                    <span>{{ param.pcUrl }}</span>
+                    <el-upload ref="upload2" action="#" :limit="1" :http-request="importPC" :show-file-list="false">
+                        <el-button type="primary" :underline="false" style="width:100%;" :loading="loadingExport2" size="small">{{ $t('uoloadFiles') }}</el-button>
+                    </el-upload>
+                </el-form-item>
+                <el-form-item label="后端jar安装包" >
+                    <span>{{ param.serverPackUrl }}</span>
+                    <el-upload ref="upload3" action="#" :limit="1" :http-request="importServer" :show-file-list="false">
+                        <el-button type="primary" :underline="false" style="width:100%;" :loading="loadingExport3" size="small">{{ $t('uoloadFiles') }}</el-button>
+                    </el-upload>
+                </el-form-item>
+            </el-form>
+        </div>
+        <div style="width:80px;margin:0 auto;padding:20px;"><el-button  type="primary" @click="startDeploy" :loading="startDeployLoading" >开始部署</el-button></div>
     </section>
 </template>
 <script>
@@ -43,6 +68,12 @@
         },
         data() {
             return {
+                param:{},
+                startDeployLoading: false,
+                loadingExport: false,
+                loadingExport2: false,
+                loadingExport3: false,
+                fileList:[],
                 appName: null,
                 appLogo: null,
             };
@@ -64,6 +95,152 @@
             this.getSettings();
         },
          methods: {
+            importH5(item) {
+                this.loadingExport = true;
+                let str = item.file.name.split(".");
+                let format = str[str.length - 1];
+                if (format != "zip") {
+                    this.loadingExport = false
+                    this.$message({
+                        message: '请上传zip文件',
+                        type: "error"
+                    });
+                } else {
+                    let formData = new FormData();
+                    formData.append("multipartFile", item.file);
+                    this.http.uploadFile('/common/uploadUpdateFile', formData,
+                    res => {
+                        this.loadingExport = false
+                        this.$refs.upload.clearFiles();
+                        if (res.code == "ok") {
+                            this.$message({
+                                message:'上传成功',
+                                type: "success"
+                            });
+                            this.param.h5Url=res.data;
+                        } else {
+                            this.$message({
+                                message: res.msg,
+                                type: "error"
+                            });
+                        }
+                    },
+                    error => {
+                        this.$refs.upload.clearFiles();
+                        this.loadingExport = false
+                        this.$message({
+                            message: error,
+                            type: "error"
+                        });
+                    });
+                }
+            },
+            importPC(item) {
+                this.loadingExport2 = true;
+                let str = item.file.name.split(".");
+                let format = str[str.length - 1];
+                if (format != "zip") {
+                    this.loadingExport2 = false
+                    this.$message({
+                        message: '请上传zip文件',
+                        type: "error"
+                    });
+                } else {
+                    let formData = new FormData();
+                    formData.append("multipartFile", item.file);
+                    this.http.uploadFile('/common/uploadUpdateFile', formData,
+                    res => {
+                        this.loadingExport2 = false
+                        this.$refs.upload2.clearFiles();
+                        if (res.code == "ok") {
+                            this.$message({
+                                message:'上传成功',
+                                type: "success"
+                            });
+                            this.param.pcUrl=res.data;
+                        } else {
+                            this.$message({
+                                message: res.msg,
+                                type: "error"
+                            });
+                        }
+                    },
+                    error => {
+                        this.$refs.upload.clearFiles();
+                        this.loadingExport = false
+                        this.$message({
+                            message: error,
+                            type: "error"
+                        });
+                    });
+                }
+            },
+            importServer(item) {
+                this.loadingExport3 = true;
+                let str = item.file.name.split(".");
+                let format = str[str.length - 1];
+                if (format != "jar") {
+                    this.loadingExport3 = false
+                    this.$message({
+                        message: '请上传jar文件',
+                        type: "error"
+                    });
+                } else {
+                    let formData = new FormData();
+                    formData.append("multipartFile", item.file);
+                    this.http.uploadFile('/common/uploadUpdateFile', formData,
+                    res => {
+                        this.loadingExport3 = false
+                        this.$refs.upload3.clearFiles();
+                        if (res.code == "ok") {
+                            this.$message({
+                                message:'上传成功',
+                                type: "success"
+                            });
+                            this.param.serverPackUrl=res.data;
+                        } else {
+                            this.$message({
+                                message: res.msg,
+                                type: "error"
+                            });
+                        }
+                    },
+                    error => {
+                        this.$refs.upload.clearFiles();
+                        this.loadingExport = false
+                        this.$message({
+                            message: error,
+                            type: "error"
+                        });
+                    });
+                }
+            },
+            startDeploy() {
+                //开始部署
+                this.startDeployLoading = true;
+                this.http.post('/update-pack/save', this.param,
+                res => {
+                    if (res.code == "ok") {
+                        //上传中
+                        this.startDeployLoading = false;
+                        this.$message({
+                            message: res,
+                            type: "success"
+                        });
+                    } else {
+                        this.$message({
+                            message: res.msg,
+                            type: "error"
+                        });
+                    }
+                },
+                error => {
+                    this.$message({
+                        message: error,
+                        type: "error"
+                    });
+                });
+            },
             addImg(e) {
                 let formData = new FormData()
                 formData.append('multipartFile', e.file)

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

@@ -98,10 +98,10 @@ const StringUtil = {
         reportSortScaleTable: false, // 项目分类工时占比表 // 
         reportSortDetailTable: false, // 分类全部工时明细表 // 
         reportSortSectionDetailTable: false, // 分类负责部门工时明细表 //
-        reportStaffProject: true, // 员工项目进度表 //
-        reportProjectConsumptionFirst: true, // 项目耗用进度表1 //
-        reportProjectConsumptionTwo: true, // 项目耗用进度表2 //
-        reportStaffTaskAccomplished: true, // 员工任务完成表 //
+        reportStaffProject: false, // 员工项目进度表 //
+        reportProjectConsumptionFirst: false, // 分组耗用进度表 //
+        reportProjectConsumptionTwo: false, // 项目耗用进度表 //
+        reportStaffTaskAccomplished: false, // 员工任务完成表 //
 
         // 请假模块
         leaveFil : false, // 请假填报 // 
@@ -256,10 +256,10 @@ const StringUtil = {
         arr[i] == '分类全部工时明细表' ? obj.reportSortDetailTable = true : ''
         arr[i] == '分类负责部门工时明细表' ? obj.reportSortSectionDetailTable = true : ''
 
-        arr[i] == '员工项目进度表' ? obj.reportStaffProject = true : ''
-        arr[i] == '项目耗用进度表1' ? obj.reportProjectConsumptionFirst = true : ''
-        arr[i] == '项目耗用进度表2' ? obj.reportProjectConsumptionTwo = true : ''
-        arr[i] == '员工任务完成表' ? obj.reportStaffTaskAccomplished = true : ''
+        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 : ''
     }
     return obj
   }

+ 319 - 26
fhKeeper/formulahousekeeper/timesheet/src/views/corpreport/list.vue

@@ -44,8 +44,8 @@
                   <el-menu-item index="1-22" v-if="permissions.reportSortScaleTable" @click="ssl(21)"><p>项目分类工时占比表</p></el-menu-item>
                   <el-menu-item index="1-23" v-if="permissions.reportSortDetailTable || permissions.reportSortSectionDetailTable" @click="ssl(22)"><p>分类工时明细表</p></el-menu-item>
                   <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>项目耗用进度表1</p></el-menu-item>
-                  <el-menu-item index="1-26" v-if="permissions.reportProjectConsumptionTwo" @click="ssl(25)"><p>项目耗用进度表2</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-submenu>
               </el-menu>
@@ -78,8 +78,8 @@
             </el-option>
           </el-select>
         </template>
-        <!-- 时间段筛选 -->
-        <template v-if="ins == 6 || ins == 8 || ins == 9 || ins == 10 || ins == 11 || ins == 12 || ins == 5 || ins == 16 || ins == 17 || ins == 18 || ins == 20 || ins == 21 || ins == 22">
+        <!-- 时间段筛选 ins == 6 || ins == 8 || ins == 9 || ins == 10 || ins == 11 || ins == 12 || ins == 5 || ins == 16 || ins == 17 || ins == 18 || ins == 20 || ins == 21 || ins == 22 -->
+        <template v-if="screeningCondition.timePeriod.includes(ins)">
           <span>
             <span class="demonstration" style="color:#999;padding:0 10px">
               {{ ins == 15 ? $t('xiang-mu-chuang-jian-shi-jian-duan') : $t('message.period') }}
@@ -95,7 +95,17 @@
               项目分类
             </span>
             <el-select v-model="projectSortId" placeholder="请选择" @change="picks()" size="small">
-              <el-option v-for="item in projectSortList" :key="item.id" :label="item.name" :value="item.id"></el-option>
+              <el-option v-for="item in projectSortList" :key="item.id" :label="item.name" :value="item.id" ></el-option>
+            </el-select>
+          </span>
+        </template>
+        <template v-if="ins == 25">
+          <span>
+            <span class="demonstration" style="color:#999;padding:0 10px">
+              项目分类
+            </span>
+            <el-select v-model="projectSortIdTwo" placeholder="请选择" @change="picks()" size="small" clearable>
+              <el-option v-for="item in projectSortListTwo" :key="item.id" :label="item.name" :value="item.id" ></el-option>
             </el-select>
           </span>
         </template>
@@ -106,7 +116,8 @@
           <el-option label="查看部门审核人" :value="0"></el-option>
         </el-select> -->
         <!-- 项目筛选 -->
-        <el-select v-if="ins != 4 && ins != 8 && ins != 9 && ins != 19 && ins != 10 && ins != 11 && ins != 14 && ins != 15 && ins != 17 && ins != 20 && ins != 21 && ins != 22" v-model="proJuctId" :placeholder="$t('defaultText.pleaseSelectSnItem')" clearable filterable size="small" @change="projectChange()" style="margin-left:10px">
+        <!-- <el-select v-if="ins != 4 && ins != 8 && ins != 9 && ins != 19 && ins != 10 && ins != 11 && ins != 14 && ins != 15 && ins != 17 && ins != 20 && ins != 21 && ins != 22" v-model="proJuctId" :placeholder="$t('defaultText.pleaseSelectSnItem')" clearable filterable size="small" @change="projectChange()" style="margin-left:10px"> -->
+        <el-select v-if="!screeningCondition.project.includes(ins)" v-model="proJuctId" :placeholder="$t('defaultText.pleaseSelectSnItem')" clearable filterable size="small" @change="projectChange()" style="margin-left:10px">
           <el-option v-for="(item) in proListOvertime" :key="item.id" :label="item.projectName + (item.projectCode ? item.projectCode : '')" :value="item.id">
             <span style="float: left;color: #8492a6;">{{ item.projectCode }}</span>
             <span style="float: right;font-size: 13px;margin-left: 20px">{{ item.projectName }}</span>
@@ -125,17 +136,17 @@
         <el-select v-if="ins == 16" multiple v-model="groupNames" @change="onGroupSelectChange" clearable size="small" filterable collapse-tags placeholder="请选择任务分组" style="margin-left:10px;">
           <el-option v-for="item in taskgroupList" :key="item.name" :label="item.name" :value="item.name"></el-option>
         </el-select>
-        <!-- 月份选择 -->
-        <el-date-picker v-if="ins == 14 || ins == 15 || ins == 19" value-format="yyyy-MM" v-model="monthPersonnel" type="month" :placeholder="$t('Selectmonth')" :clearable="false" @change="selcts()" size="small"></el-date-picker>
+        <!-- 月份选择 v-if="ins == 14 || ins == 15 || ins == 19" -->
+        <el-date-picker v-if="screeningCondition.months.includes(ins)" value-format="yyyy-MM" v-model="monthPersonnel" type="month" :placeholder="$t('Selectmonth')" :clearable="false" @change="selcts()" size="small"></el-date-picker>
           
-          <!-- 部门筛选 -->
-          <el-cascader v-if="(ins == 15 || (ins == 9 && permissions.reportAllTimely) || (ins == 8 && permissions.reportAllTimeDivide) || (ins == 6 && permissions.reportAllOvertime) || (ins == 11 && permissions.reportPersonnel) || (ins == 14)) && user.userNameNeedTranslate != 1" v-model="departmentIdArray" :options="departmentList" :placeholder="$t('qing-xuan-ze-bu-men')"
+          <!-- 部门筛选 ins == 15 || (ins == 9 && permissions.reportAllTimely) || (ins == 8 && permissions.reportAllTimeDivide) || (ins == 6 && permissions.reportAllOvertime) || (ins == 11 && permissions.reportPersonnel) || (ins == 14) -->
+          <el-cascader v-if="(screeningCondition.departments.includes(ins)  || (ins == 9 && permissions.reportAllTimely) || (ins == 8 && permissions.reportAllTimeDivide) || (ins == 6 && permissions.reportAllOvertime) || (ins == 11 && permissions.reportPersonnel)) && user.userNameNeedTranslate != 1" v-model="departmentIdArray" :options="departmentList" :placeholder="$t('qing-xuan-ze-bu-men')"
             :props="{ checkStrictly: true,expandTrigger: 'hover',multiple: ins == 6 ? true : false }" collapse-tags :show-all-levels="false" clearable
             @change="selcts(9)" size="small" style="margin-left:10px"
           ></el-cascader>
 
           <!-- 部门筛选 -->
-          <vueCascader :size="'small'" :widthStr="'125'" :clearable="true" :subject="departmentList" :radios="true" :distinction="'1'" @vueCasader="vueCasader" v-if="((ins == 15 || (ins == 9 && permissions.reportAllTimely) || (ins == 8 && permissions.reportAllTimeDivide) || (ins == 6 && permissions.reportAllOvertime) || (ins == 11 && permissions.reportPersonnel) || (ins == 14)) && user.userNameNeedTranslate == 1)" :selectNameChuan="$t('qing-xuan-ze-bu-men')"></vueCascader>
+          <vueCascader :size="'small'" :widthStr="'125'" :clearable="true" :subject="departmentList" :radios="true" :distinction="'1'" @vueCasader="vueCasader" v-if="(screeningCondition.departments.includes(ins)  || (ins == 9 && permissions.reportAllTimely) || (ins == 8 && permissions.reportAllTimeDivide) || (ins == 6 && permissions.reportAllOvertime) || (ins == 11 && permissions.reportPersonnel)) && user.userNameNeedTranslate == 1" :selectNameChuan="$t('qing-xuan-ze-bu-men')"></vueCascader>
           <!-- <vueCascader :size="'small'" :widthStr="'125'" :clearable="true" :subject="departmentList" :radios="true" :distinction="'1'" @vueCasader="vueCasader" v-if="((ins == 15 || (ins == 9 && permissions.reportAllTimely) || (ins == 8 && permissions.reportAllTimeDivide) || (ins == 6 && permissions.reportAllOvertime) || (ins == 11 && permissions.reportPersonnel) || (ins == 14)) && user.userNameNeedTranslate != 1)" :selectNameChuan="$t('qing-xuan-ze-bu-men')"></vueCascader> -->
 
           <!-- 任务筛选 -->
@@ -155,12 +166,12 @@
             <el-option :label="item" :value="item" v-for="item,index in areaList" :key="index"></el-option>
           </el-select>
 
-          <!-- 人员筛选 -->
-          <el-select v-if="(ins == 6 || ins == 8 || ins == 9 || ins == 10 || ins == 11 || ins == 14 || ins == 18)  && user.userNameNeedTranslate != '1'" v-model="userId" :placeholder="$t('pleaseselectpersonnel')" @change="selcts()" clearable filterable size="small" style="width:100px">
+          <!-- 人员筛选 ins == 6 || ins == 8 || ins == 9 || ins == 10 || ins == 11 || ins == 14 || ins == 18 -->
+          <el-select v-if="(screeningCondition.staff.includes(ins))  && user.userNameNeedTranslate != '1'" v-model="userId" :placeholder="$t('pleaseselectpersonnel')" @change="selcts()" clearable filterable size="small" style="width:100px">
             <el-option v-for="(item, index) in selUserList" :key="index" :label="item.name" :value="item.id"></el-option>
           </el-select>
 
-          <selectCat :subject="selUserList" :filterable="true" :searchBoxTop="'1'" :subjectId="userId" :clearable="true" :size="mini" @selectCal="selectCal" v-if="(ins == 6 || ins == 8 || ins == 9 || ins == 10 || ins == 11 || ins == 14 || ins == 18) && user.userNameNeedTranslate == '1'"></selectCat>
+          <selectCat :subject="selUserList" :filterable="true" :searchBoxTop="'1'" :subjectId="userId" :clearable="true" :size="mini" @selectCal="selectCal" v-if="(screeningCondition.staff.includes(ins)) && user.userNameNeedTranslate == '1'"></selectCat>
           
 
           <!-- 待审核筛选切换 -->
@@ -1027,7 +1038,7 @@
                       <ww-open-data type='departmentName' :openid='scope.row.deptName'></ww-open-data>
                     </span>
                     <span v-if="user.userNameNeedTranslate != '1'">
-                      {{scope.row.userName}}
+                      {{scope.row.deptName}}
                     </span>
                   </div>
                 </template>
@@ -1057,8 +1068,130 @@
               </el-table-column>
 
             </el-table>
+
+            <!-- 员工项目进度表 -->
+            <el-table  v-if="ins == 23" :key="23" border :data="isbeCustomReport.projectSchedule" highlight-current-row v-loading="listLoading" :height="(+tableHeight) - 1" style="width: 100%;" :span-method="objectSpanMethod">
+              <el-table-column align="center" prop="departmentName" label="部门" width="150">
+                <template slot-scope="scope">
+                  <div>
+                    <span v-if="user.userNameNeedTranslate == '1'">
+                      <ww-open-data type='departmentName' :openid='scope.row.departmentName'></ww-open-data>
+                    </span>
+                    <span v-if="user.userNameNeedTranslate != '1'">
+                      {{scope.row.deptName}}
+                    </span>
+                    <!-- {{ scope.row.departmentName }} -->
+                  </div>
+                </template>
+              </el-table-column>
+              <el-table-column align="center" prop="userName" label="人员" width="150">
+                <template slot-scope="scope">
+                  <div>
+                    <span v-if="user.userNameNeedTranslate == '1'">
+                      <ww-open-data type='userName' :openid='scope.row.userName'></ww-open-data>
+                    </span>
+                    <span v-if="user.userNameNeedTranslate != '1'">
+                      {{scope.row.userName}}
+                    </span>
+                    <!-- {{scope.row.userName}} -->
+                  </div>
+                </template>
+              </el-table-column>
+              <el-table-column align="center" prop="projectName" label="项目名称"></el-table-column>
+              <el-table-column align="center" prop="projectCode" label="项目编号"></el-table-column>
+              <el-table-column align="center" prop="residueTime" label="剩余工时(h)" width="150"></el-table-column>
+            </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-column align="center" prop="department_name" label="负责部门" min-width="150">
+                <template slot-scope="scope">
+                  <div>
+                    <span v-if="user.userNameNeedTranslate == '1'">
+                      <ww-open-data type='departmentName' :openid='scope.row.corpwxDeptId'></ww-open-data>
+                    </span>
+                    <span v-if="user.userNameNeedTranslate != '1'">
+                      {{scope.row.departmentName}}
+                    </span>
+                    <!-- {{ scope.row.corpwxDeptId }} -->
+                  </div>
+                </template>
+              </el-table-column>
+              <el-table-column align="center" prop="groupName" label="任务分组" min-width="150"></el-table-column>
+              <el-table-column align="center" prop="planHour" label="计划工时(财务)" width="120"></el-table-column>
+              <el-table-column align="center" label="实际工时成本">
+                <el-table-column align="center" prop="normalHour" label="正常工时(h)" width="100"></el-table-column>
+                <el-table-column align="center" prop="overHour" label="加班工时(h)" width="100"></el-table-column>
+                <el-table-column align="center" prop="realHour" label="合计工时(h)" width="100"></el-table-column>
+                <el-table-column align="center" prop="realCost" label="合计工时成本" width="140"></el-table-column>
+              </el-table-column>
+              <el-table-column align="center" prop="process" label="工时耗用率" width="150"></el-table-column>
+            </el-table>
+
+            <!-- 项目耗用进度表 -->
+            <el-table  v-if="ins == 25" :key="25" border :data="isbeCustomReport.consumptionScheduleTwo" highlight-current-row v-loading="listLoading" :height="(+tableHeight) - 1" style="width: 100%;" >
+              <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="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="参与员工" min-width="150">
+                <template slot-scope="scope">
+                  <div class="participatingEmployee">
+                    <div v-for="(item,index) in scope.row.userProgress" :key="index">
+                      <span v-if="user.userNameNeedTranslate == '1'">
+                        <ww-open-data type='userName' :openid='item.userName'></ww-open-data> 
+                        {{item.progress}}%
+                      </span>
+                      <span v-if="user.userNameNeedTranslate != '1'">
+                        {{item.userName}} {{item.progress}}%
+                      </span>
+                      <!-- {{item.userName}} {{item.progress}}% -->
+                      <span v-if="index < scope.row.userProgress.length - 1">,</span>
+                    </div>
+                  </div>
+                </template>
+              </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">
+                  <div>
+                    <span v-if="user.userNameNeedTranslate == '1'">
+                      <ww-open-data type='departmentName' :openid='scope.row.departmentName'></ww-open-data>
+                    </span>
+                    <span v-if="user.userNameNeedTranslate != '1'">
+                      {{scope.row.departmentName}}
+                    </span>
+                    <!-- {{ scope.row.departmentName }} -->
+                  </div>
+                </template>
+              </el-table-column>
+              <el-table-column align="center" prop="w" label="人员" min-width="150">
+                <template slot-scope="scope">
+                  <div>
+                    <span v-if="user.userNameNeedTranslate == '1'">
+                      <ww-open-data type='userName' :openid='scope.row.userName'></ww-open-data>
+                    </span>
+                    <span v-if="user.userNameNeedTranslate != '1'">
+                      {{scope.row.userName}}
+                    </span>
+                    <!-- {{scope.row.userName}} -->
+                  </div>
+                </template>
+              </el-table-column>
+              <el-table-column align="center" prop="projectName" 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="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>
         <!--工具条-->
-        <el-col :span="24" class="toolbar" v-if="ins != 6 && ins != 20 && ins != 21">
+        <el-col :span="24" class="toolbar" v-if="ins != 6 && ins != 20 && ins != 21 && ins != 24">
           <el-pagination
                 v-if="ins == 12"
                 @size-change="groupSizeChange"
@@ -1318,7 +1451,13 @@ export default {
   props: {},
   data() {
     return {
-      
+      screeningCondition: { // 筛选条件的判断
+        project: [4, 8, 9, 10, 11, 14, 15, 17, 19, 20, 21, 22, 24], // 项目筛选条件 (不等于)
+        months: [14, 15, 19], // 月份筛选条件 (等于)
+        staff: [6, 8, 9, 19, 11, 14, 18, 23, 25, 26], // 人员筛选条件 (等于)
+        departments: [14, 15, 23, 26], // 部门筛选条件 (等于)
+        timePeriod: [5, 6, 8, 9, 10, 11, 12, 16, 17, 18, 20, 21, 22, 24, 26], // 时间段筛选条件 (等于)
+      },
       efficentList:[],
       groupNames: [],
       taskgroupList: [],
@@ -1376,14 +1515,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报表', '有效工时率表', '项目分类工时占比表', '分类工时明细表',
-      '员工项目进度表', '项目耗用进度表1', '项目耗用进度表2', '员工任务完成表'],
+      '员工项目进度表', '分组耗用进度表', '项目耗用进度表', '员工任务完成表'],
 
       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报表','有效工时率表', '项目分类工时占比表', '分类工时明细表',
-      '员工项目进度表', '项目耗用进度表1', '项目耗用进度表2', '员工任务完成表'],
+      '员工项目进度表', '分组耗用进度表', '项目耗用进度表', '员工任务完成表'],
 
       ins: 10000,
       user: JSON.parse(sessionStorage.user),
@@ -1499,11 +1638,20 @@ export default {
       projectSortId: '', // 项目分类选中的id
       projectSortName: '', // 项目分类选中的Name
       projectSortList: [], // 项目分类
+      projectSortListTwo: [],
+      projectSortIdTwo: '',
 
       projectTaskgroupList: [], // 选择项目的任务分组
       projectGroupId: '', // 选择项目的任务分组id
 
       detailProjectId:null,//报销费用详情项目id
+
+      isbeCustomReport: { // 依斯倍定制报表数据
+        projectSchedule: [], // 员工项目进度表
+        consumptionSchedule: [], // 分组耗用进度表
+        consumptionScheduleTwo: [], // 项目耗用进度表
+        taskCompletionSheet: [], // 员工任务完成表
+      }
     };
   },
   computed: {},
@@ -1611,13 +1759,14 @@ export default {
       if(this.permissions.reportStaffTaskAccomplished) {this.ssl(26);this.defaultActive = '1-27';return} else
       {this.allWrong = false}
     },
-    rowspan(spanArr,position,spanName){
-      this.list1.forEach((item,index) => {
+    rowspan(spanArr,position,spanName,dataItem = []){
+      let newArray = dataItem.length > 0 ? dataItem : this.list1
+      newArray.forEach((item,index) => {
         if(index == 0){
           spanArr.push(1)
           position = 0
         }else {
-          if(this.list1[index][spanName] == this.list1[index-1][spanName]){
+          if(newArray[index][spanName] == newArray[index-1][spanName]){
             spanArr[position] += 1
             spanArr.push(0)
           }else {
@@ -1629,7 +1778,7 @@ export default {
     },
     objectSpanMethod({ row, column, rowIndex, columnIndex }){
       const { companyId } = this.user
-      if(columnIndex == 0){
+      if(columnIndex == 0 && this.listArr1.length > 0){
         const _row = this.listArr1[rowIndex]
         const _col = _row > 0 ? 1 : 0
         return {
@@ -1637,7 +1786,7 @@ export default {
           colspan: _col
         }
       }
-      if(columnIndex == 1){
+      if(columnIndex == 1 && this.listArr2.length > 0){
         const _row = this.listArr2[rowIndex]
         const _col = _row > 0 ? 1 : 0
         return {
@@ -1645,7 +1794,7 @@ export default {
           colspan: _col
         }
       }
-      if(columnIndex == 2 && companyId == '3092') {
+      if(columnIndex == 2 && companyId == '3092' && this.listArr3.length > 0) {
         const _row = this.listArr3[rowIndex]
         const _col = _row > 0 ? 1 : 0
         return {
@@ -1859,7 +2008,7 @@ export default {
                 this.getGroupWorktimeAll()
             },
             getList(e) {
-              let noUserList = [16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26]
+              let noUserList = [16, 17, 18, 19, 20, 21, 22, 24, 25, 26]
               if(this.ins == 15) {
                 this.rangeDatas = null
               } else if(!e){
@@ -1926,6 +2075,19 @@ export default {
                 if(this.ins == 22) {
                   this.getHoursDetailClass()
                 }
+
+                if(this.ins == 23) {
+                  this.getProjectSchedule()
+                }
+                if(this.ins == 24) {
+                  this.getConsumptionSchedule()
+                }
+                if(this.ins == 25) {
+                  this.getConsumptionScheduleTwo()
+                }
+                if(this.ins == 26) {
+                  this.getTaskCompletionSheet()
+                }
             },
       exportExcel() {
         var url = "/project";
@@ -2074,6 +2236,33 @@ export default {
           sl.categoryId = this.projectSortId
           sl.startDate = this.rangeDatas[0]
           sl.endDate = this.rangeDatas[1]
+        } else if(this.ins == 23) {
+          fName = '员工项目进度表' + '.xlsx'
+          url = "/project/exportUserProjectProcessList"
+          let dept = this.departmentIdArray[this.departmentIdArray.length - 1]
+          this.proJuctId ? sl.projectId = this.proJuctId : ''
+          this.userId ? sl.userId = this.userId : ''
+          dept ? sl.deptId = dept : ''
+        } else if(this.ins == 24) {
+          fName = '分组耗用进度表' + '.xlsx'
+          url = "/project/exportGroupExpendProcessList"
+          sl.startDate = this.rangeDatas[0]
+          sl.endDate = this.rangeDatas[1]
+        } else if(this.ins == 25) {
+          fName = '项目耗用进度表' + '.xlsx'
+          url = "/project/exportProjectExpendProcessList"
+          this.proJuctId ? sl.projectId = this.proJuctId : ''
+          this.userId ? sl.userId = this.userId : ''
+          this.projectSortIdTwo ? sl.categoryId = this.projectSortIdTwo : ''
+        } else if(this.ins == 26) {
+          fName = '员工任务完成表' + '.xlsx'
+          url = "/project/exportUserTaskProcessList"
+          let dept = this.departmentIdArray[this.departmentIdArray.length - 1]
+          this.proJuctId ? sl.projectId = this.proJuctId : ''
+          this.userId ? sl.userId = this.userId : ''
+          dept ? sl.deptId = dept : ''
+          sl.startDate = this.rangeDatas[0]
+          sl.endDate = this.rangeDatas[1]
         }
           this.http.post(url, sl,
             res => {
@@ -3168,6 +3357,19 @@ export default {
         console.log(this.projectSortName)
         this.getHoursDetailClass()
       }
+
+      if(this.ins == 23) {
+        this.getProjectSchedule()
+      }
+      if(this.ins == 24) {
+        this.getConsumptionSchedule()
+      }
+      if(this.ins == 25) {
+        this.getConsumptionScheduleTwo()
+      }
+      if(this.ins == 26) {
+        this.getTaskCompletionSheet()
+      }
     },
     // 任务重启表
     taskRestart() {
@@ -3488,6 +3690,7 @@ export default {
       let dataList = data || []
       dataList.push({id: 0, name: '未分类'})
       this.projectSortList = dataList
+      this.projectSortListTwo = dataList.filter((item) => item.name == '报价项目' || item.name == '售后工程项目' || item.name == '售后报价项目')
       this.projectSortId = dataList[0].id
       this.projectSortName = dataList[0].name
     },
@@ -3498,10 +3701,100 @@ export default {
       })
       this.projectTaskgroupList = data
     },
+    // 合并重置数据
+    resetMerge() {
+      this.listArr1 = []
+      this.listArr2 = []
+      this.listArr3 = []
+      this.listPosition1 = 0
+      this.listPosition2 = 0
+      this.listPosition3 = 0
+    },
+    // 获取员工项目进度表
+    async getProjectSchedule() {
+      let parameter = {
+        pageIndex: this.page,
+        pageSize: this.size,
+      }
+      let dept = this.departmentIdArray[this.departmentIdArray.length - 1]
+      this.proJuctId ? parameter.projectId = this.proJuctId : ''
+      this.userId ? parameter.userId = this.userId : ''
+      dept ? parameter.deptId = dept : ''
+      this.listLoading = true
+      let { data } = await this.postData('/project/userProjectProcessList', {
+        ...parameter
+      })
+      this.resetMerge()
+      this.rowspan(this.listArr1, this.listPosition1, 'corpwxDeptId', data.record)
+      this.rowspan(this.listArr2, this.listPosition2, 'corpwxUserId', data.record)
+      this.isbeCustomReport.projectSchedule = data.record
+      this.total = data.total
+      this.listLoading = false
+    },
+    // 分组耗用进度表
+    async getConsumptionSchedule() {
+      let parameter = {
+        startDate: this.rangeDatas[0],
+        endDate: this.rangeDatas[1],
+      }
+      this.listLoading = true
+      let { data } = await this.postData('/project/groupExpendProcessList', {
+        ...parameter
+      }) 
+      this.resetMerge()
+      this.rowspan(this.listArr1, this.listPosition1, 'corpwxDeptId', data.record)
+      this.isbeCustomReport.consumptionSchedule = data.record
+      this.total = data.total
+      this.listLoading = false
+    },
+    // 项目耗用进度表
+    async getConsumptionScheduleTwo() {
+      let parameter = {
+        pageIndex: this.page,
+        pageSize: this.size,
+      }
+      this.proJuctId ? parameter.projectId = this.proJuctId : ''
+      this.userId ? parameter.userId = this.userId : ''
+      this.projectSortIdTwo ? parameter.categoryId = this.projectSortIdTwo : ''
+      this.listLoading = true
+      let { data } = await this.postData('/project/projectExpendProcessList', {
+        ...parameter
+      }) 
+      this.isbeCustomReport.consumptionScheduleTwo = data.record
+      this.total = data.total
+      this.listLoading = false
+    },
+    // 员工任务完成表
+    async getTaskCompletionSheet() {
+      let parameter = {
+        pageIndex: this.page,
+        pageSize: this.size,
+        startDate: this.rangeDatas[0],
+        endDate: this.rangeDatas[1],
+      }
+      let dept = this.departmentIdArray[this.departmentIdArray.length - 1]
+      this.proJuctId ? parameter.projectId = this.proJuctId : ''
+      this.userId ? parameter.userId = this.userId : ''
+      dept ? parameter.deptId = dept : ''
+      this.listLoading = true
+      let { data } = await this.postData('/project/userTaskProcessList', {
+        ...parameter
+      })
+      this.resetMerge()
+      this.rowspan(this.listArr1, this.listPosition1, 'corpwxDeptId', data.record)
+      this.rowspan(this.listArr2, this.listPosition2, 'corpwxUserId', data.record)
+      this.isbeCustomReport.taskCompletionSheet = data.record
+      this.total = data.total
+      this.listLoading = false
+    }
   },
 };
 </script>
 <style scoped>
+.participatingEmployee {
+  display: flex;
+  flex-wrap: wrap;
+}
 .sliderSetup {
   display: flex;
   align-items: center;