浏览代码

Merge remote-tracking branch 'origin/master'

Guo1B0 10 月之前
父节点
当前提交
f93877e491

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

@@ -1520,5 +1520,17 @@ public class ProjectController {
                                         @RequestParam String stageName,HttpServletRequest request) {
         return projectService.batchChangeStage(projectIdArray, stageId, stageName, request);
     }
+
+    /**
+    * @Description:批量设置项目任务执行人
+    * @Param: [projectIds, userIds]
+    * @return: java.lang.Object
+    * @Author: yurk
+    * @Date: 2024/7/15
+    */
+    @RequestMapping("/batchSetProjectTaskExecutor")
+    public HttpRespMsg batchSetProjectTaskExecutor(@RequestParam String projectIds,@RequestParam String userIds){
+        return projectService.batchSetProjectTaskExecutor(projectIds,userIds);
+    }
 }
 

+ 4 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java

@@ -1984,10 +1984,12 @@ public class ReportController {
     }
 
     private void setReportWorkflowAuditor(List<AuditWorkflowTimeSetting> auditWorkflowList, List<Department> allDeptList, Report report, TimeType comTimeType) {
-        if (auditWorkflowList.size() == 0) {
+        if (comTimeType.getReportAuditType() > 1 || auditWorkflowList.size() == 0) {
             //没有自定义审核流,默认的直接是项目负责人审核
             report.setIsDeptAudit(0);
-            report.setIsFinalAudit(1);
+            if (comTimeType.getReportAuditType() != 8) {
+                report.setIsFinalAudit(1);
+            }
         } else {
             //取第一个审核节点
             AuditWorkflowTimeSetting firstNode = auditWorkflowList.get(0);

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

@@ -296,4 +296,6 @@ public interface ProjectService extends IService<Project> {
     HttpRespMsg exportEffectiveLaborHourRate(String startDate, String endDate);
 
     HttpRespMsg batchChangeStage(String projectIdArray, Integer stageId, String stageName, HttpServletRequest request);
+
+    HttpRespMsg batchSetProjectTaskExecutor(String projectIds, String userIds);
 }

+ 65 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -29,6 +29,7 @@ import org.apache.poi.hssf.usermodel.HSSFRow;
 import org.apache.poi.hssf.usermodel.HSSFSheet;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
+import org.apache.poi.ss.formula.functions.T;
 import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.ss.util.CellRangeAddress;
 import org.apache.poi.xssf.streaming.SXSSFCell;
@@ -6822,6 +6823,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         headList.add(MessageUtils.message("entry.projectType"));
         headList.add(MessageUtils.message("entry.publicProject"));
         headList.add(MessageUtils.message("entry.projectName"));
+        headList.add(MessageUtils.message("entry.projectStage"));
         headList.add(MessageUtils.message("excel.charge"));
         headList.add(MessageUtils.message("entry.Participants"));
         headList.add(MessageUtils.message("entry.startData"));
@@ -6922,6 +6924,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             //rowData.add(("1".equals(projectVO.getIsPublic())?"是":"否"));
             rowData.add(("1".equals(projectVO.getIsPublic())?MessageUtils.message("excel.yes"):MessageUtils.message("excel.no")));
             rowData.add(projectVO.getProjectName());
+            rowData.add(projectVO.getCurrentStageName());
             if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getContactNeedTranslate()==1)){
                 if(projectVO.getInchargerId()!=null){
                     User us = userList.stream().filter(ul -> ul.getId().equals(projectVO.getInchargerId())).findFirst().get();
@@ -14278,4 +14281,66 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         httpRespMsg.data ="/upload/"+fileName;
         return httpRespMsg;
     }
+
+    @Override
+    public HttpRespMsg batchSetProjectTaskExecutor(String projectIds, String userIds) {
+        HttpRespMsg msg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getCompanyId, companyId));
+        if(!StringUtils.isEmpty(projectIds)){
+            String[] split = projectIds.split(",");
+            List<Integer> projectIdList = Arrays.asList(split).stream().map(i -> Integer.valueOf(i)).collect(Collectors.toList());
+            List<Task> taskList = taskService.list(new LambdaQueryWrapper<Task>().in(Task::getProjectId, projectIdList).eq(Task::getTaskStatus,0));
+            List<TaskExecutor> taskExecutorList=new ArrayList<>();
+            List<Task> tasks=new ArrayList<>();
+            for (Integer projectId : projectIdList) {
+                List<Task> targetTaskList = taskList.stream().filter(t -> t.getProjectId().equals(projectId)).collect(Collectors.toList());
+                if(!StringUtils.isEmpty(userIds)){
+                    String[] split1 = userIds.split(",");
+                    targetTaskList.forEach(t->{
+                        //获取到原有的执行人
+                        StringBuilder executorId =new StringBuilder( t.getExecutorId()==null?"":t.getExecutorId());
+                        StringBuilder executorName = new StringBuilder( t.getExecutorName()==null?"":t.getExecutorName());
+                        StringBuilder executorColor = new StringBuilder( t.getExecutorColor()==null?"":t.getExecutorColor());
+                        for (String userId : split1) {
+                            List<String> list = Arrays.asList(executorId.toString().split(","));
+                            if(list.contains(userId)){
+                                continue;
+                            }
+                            Optional<User> first = userList.stream().filter(u -> u.getId().equals(userId)).findFirst();
+                            if(first.isPresent()){
+                                TaskExecutor taskExecutor=new TaskExecutor();
+                                taskExecutor.setExecutorColor(first.get().getColor());
+                                taskExecutor.setExecutorId(first.get().getId());
+                                taskExecutor.setExecutorName(first.get().getName());
+                                taskExecutor.setProjectId(projectId);
+                                taskExecutor.setTaskId(t.getId());
+                                if(executorId.length()>0){
+                                    executorId.append(",").append(taskExecutor.getExecutorId());
+                                    executorName.append(",").append(taskExecutor.getExecutorName());
+                                    executorColor.append(",").append(taskExecutor.getExecutorColor());
+                                }else {
+                                    executorId.append(taskExecutor.getExecutorId());
+                                    executorName.append(taskExecutor.getExecutorName());
+                                    executorColor.append(taskExecutor.getExecutorColor());
+                                }
+                                taskExecutorList.add(taskExecutor);
+                            }
+                        }
+                        t.setExecutorId(executorId.toString());
+                        t.setExecutorName(executorName.toString());
+                        t.setExecutorColor(executorColor.toString());
+                        tasks.add(t);
+                    });
+                }
+            }
+            if(tasks.size()>0){
+                taskService.saveOrUpdateBatch(tasks);
+            }
+            if(taskExecutorList.size()>0){
+                taskExecutorService.saveBatch(taskExecutorList);
+            }
+        }
+        return msg;
+    }
 }

+ 3 - 3
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/WxCorpInfoController.java

@@ -109,11 +109,11 @@ public class WxCorpInfoController {
         JSONArray jsonArrayFilter = new JSONArray();
         JSONObject filter1 = new JSONObject();
         filter1.put("key","record_type");
-        filter1.put("value",1);
+        filter1.put("value","1");
         jsonArrayFilter.add(filter1);
         JSONObject filter2 = new JSONObject();
         filter2.put("key","sp_status");
-        filter2.put("value",2);
+        filter2.put("value","2");
         jsonArrayFilter.add(filter2);
         List<String> approvalInfo = wxCorpInfoService.getApprovalInfo(7, startDate, endDate, "", jsonArrayFilter);
         List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getCompanyId,7));
@@ -219,7 +219,7 @@ public class WxCorpInfoController {
         jsonArrayFilter.add(filter1);
         JSONObject filter2 = new JSONObject();
         filter2.put("key","sp_status");
-        filter2.put("value",2);
+        filter2.put("value","2");
         jsonArrayFilter.add(filter2);
         List<String> approvalInfo = wxCorpInfoService.getApprovalInfo(7, startDate, endDate, "", jsonArrayFilter);
         List<Department> departmentList = departmentService.list(new LambdaQueryWrapper<Department>().eq(Department::getCompanyId, 7));

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

@@ -2031,6 +2031,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
         requestMap.put("new_cursor",newCursor);
         requestMap.put("size",100);
         requestMap.put("filters",filterArray);
+        System.out.println("Print Request:"+requestMap);
         HttpEntity<JSONObject> entity = new HttpEntity<>(requestMap, headers);
         ResponseEntity<String> ResponseEntity = restTemplate.postForEntity(url, entity, String.class);
         if (ResponseEntity.getStatusCode() == HttpStatus.OK) {

+ 3 - 3
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/task/TimingTask.java

@@ -242,11 +242,11 @@ public class TimingTask {
         JSONArray jsonArrayFilter = new JSONArray();
         JSONObject filter1 = new JSONObject();
         filter1.put("key","record_type");
-        filter1.put("value",1);
+        filter1.put("value","1");
         jsonArrayFilter.add(filter1);
         JSONObject filter2 = new JSONObject();
         filter2.put("key","sp_status");
-        filter2.put("value",2);
+        filter2.put("value","2");
         for (WxCorpInfo wxCorpInfo : list) {
             List<String> approvalInfo = wxCorpInfoService.getApprovalInfo(wxCorpInfo.getCompanyId(), df.format(start), df.format(end), "", jsonArrayFilter);
             List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getCompanyId, wxCorpInfo.getCompanyId()));
@@ -361,7 +361,7 @@ public class TimingTask {
         jsonArrayFilter.add(filter1);
         JSONObject filter2 = new JSONObject();
         filter2.put("key","sp_status");
-        filter2.put("value",2);
+        filter2.put("value","2");
         jsonArrayFilter.add(filter2);
         List<String> approvalInfo = wxCorpInfoService.getApprovalInfo(7, df.format(start), df.format(end), "", jsonArrayFilter);
         List<Department> departmentList = departmentService.list(new LambdaQueryWrapper<Department>().eq(Department::getCompanyId, 7));

+ 204 - 0
fhKeeper/formulahousekeeper/timesheet/src/components/departmentSelectionPersonnel.vue

@@ -0,0 +1,204 @@
+<template>
+    <el-dialog :title="$t('selectingParticipants')" :visible.sync="participantsVisible" :close-on-click-modal="false"
+        customClass="customWidth" width="500px" :before-close="changeVisable">
+        <div class="tree" style="height:400px">
+            <el-scrollbar style="height:100%">
+                <el-input v-if="user.userNameNeedTranslate != 1" :placeholder="$t('keywordfiltering')"
+                    v-model="participantsFilterText">
+                </el-input>
+
+                <div v-if="user.userNameNeedTranslate == '1'">
+                    <el-input :placeholder="$t('qingShuShuRuGuanJianZiGuoLv')" v-model.trim="participantsFilterText"
+                        class="input-with-select" @keyup.enter.native="echartDepartment()">
+                        <el-button slot="append" icon="el-icon-search" @click="echartDepartment()"></el-button>
+                    </el-input>
+                </div>
+
+                <el-tree :data="deptMembData" show-checkbox :props="defaultProps" node-key="id" ref="chooseMembTree2"
+                    @check-change="onTreeItemChange" :default-checked-keys="alreadyPartArray" highlight-current
+                    :filter-node-method="filterNode" v-loading="filterNodeFlag">
+                    <span class="custom-tree-node" slot-scope="{ node, data }">
+                        <span v-if="user.userNameNeedTranslate == '1'">
+                            <span v-if="node.data.children">
+                                <TranslationOpenDataText type='departmentName' :openid='node.label'>
+                                </TranslationOpenDataText>
+                            </span>
+                            <span v-else>
+                                <TranslationOpenDataText type='userName' :openid='node.label'></TranslationOpenDataText>
+                            </span>
+                        </span>
+                        <span v-if="user.userNameNeedTranslate != '1'">
+                            {{ node.label }}
+                        </span>
+                    </span>
+                </el-tree>
+            </el-scrollbar>
+        </div>
+        <div>{{ $t('btn.choose') }}&nbsp;{{ chosenMembCount }}&nbsp;{{ $t('other.people') }}</div>
+        <div slot="footer" class="dialog-footer">
+            <el-button @click="changeVisable()">{{ $t('btn.cancel') }}</el-button>
+            <el-button type="primary" @click="submitData()">{{ $t('btn.determine') }}</el-button>
+        </div>
+    </el-dialog>
+</template>
+
+<script>
+export default {
+    name: '',
+    components: {},
+    props: {
+        visible: {
+            type: Boolean,
+            default: false
+        }
+    },
+    data() {
+        return {
+            participantsFilterText: '',
+            participantsVisible: false,
+            filterNodePersonnel: [],
+            chosenMembCount: 0,
+            alreadyPartArray: [], // 已参与的人员
+            filterNodeFlag: false,
+            user: JSON.parse(sessionStorage.getItem("user")),
+            permissions: JSON.parse(sessionStorage.getItem("permissions")),
+            deptMembData: [
+                {
+                    id: 0,
+                    label: this.$t('lable.unassigned'),
+                }
+            ],
+            defaultProps: {
+                children: 'children',
+                label: 'label'
+            },
+        }
+    },
+    computed: {},
+    watch: {
+        visible(val) {
+            console.log('执行')
+            this.participantsVisible = val
+        },
+        participantsFilterText(val) {
+            let { userNameNeedTranslate } = JSON.parse(sessionStorage.getItem("user"))
+            if (userNameNeedTranslate != 1) {
+                this.$refs.chooseMembTree2.filter(val);
+            }
+            if (!val) {
+                this.$refs.chooseMembTree2.filter(val);
+            }
+        }
+    },
+    created() { },
+    mounted() {
+        this.getDepartmentList()
+    },
+    methods: {
+        submitData() {
+            let chosenList = this.$refs.chooseMembTree2.getCheckedNodes();
+            let chose2 = chosenList.filter(item => item.isUser == 1)
+            if((chose2 || []).length == 0) {
+                this.$message({
+                    message: this.$t('pleaseselectpersonnel'),
+                    type: "error"
+                });
+                return
+            }
+            this.$refs.chooseMembTree2.setCheckedKeys([]);
+            this.$emit("submitParticipant", chose2)
+        },
+        changeVisable(done) {
+            this.$refs.chooseMembTree2.setCheckedKeys([]);
+            this.$emit("changeParticipant", false)
+            if (done) {
+                done()
+            }
+        },
+        // 筛选逻辑
+        filterNode(value, data) {
+            let { userNameNeedTranslate } = this.user
+            if (!value) return true;
+            if (userNameNeedTranslate != '1') {
+                return data.label.indexOf(value) !== -1;
+            } else {
+                return this.filterNodePersonnel.some(item => item.includes(data.label))
+            }
+        },
+        // 选中改变
+        onTreeItemChange() {
+            var chosenList = this.$refs.chooseMembTree2.getCheckedNodes();
+            var list = chosenList.filter(item => item.isUser == 1);
+            this.chosenMembCount = list.length;
+        },
+        echartDepartment() {
+            if (this.participantsFilterText != '') {
+                this.filterNodeFlag = true
+                this.http.post("/user/getEmployeeList", {
+                    keyword: this.participantsFilterText,
+                    cursor: '',
+                    departmentId: -1,
+                    pageIndex: 1,
+                    pageSize: 1000
+                },
+                    res => {
+                        if (res.code == "ok") {
+                            this.filterNodePersonnel = res.data.records.map(item => item.name)
+                            this.$refs.chooseMembTree2.filter(this.participantsFilterText);
+                        } else {
+                            this.$message({
+                                message: res.msg,
+                                type: "error"
+                            });
+                        }
+                        this.filterNodeFlag = false
+                    },
+                    error => {
+                        this.filterNodeFlag = false
+                        this.$message({
+                            message: error,
+                            type: "error"
+                        });
+                    });
+            }
+        },
+        getDepartmentList() {
+            this.http.post('/department/listAllMemb', {
+            }, res => {
+                if (res.code == 'ok') {
+                    let list = res.data
+                    this.haveUsersList(list)
+                    this.deptMembData = JSON.parse(JSON.stringify(list))
+                } else {
+                    this.$message({
+                        message: res.msg,
+                        type: 'error'
+                    })
+                }
+            }, error => {
+                this.$message({
+                    message: error,
+                    type: 'error'
+                })
+            })
+        },
+        haveUsersList(list) {
+            for (var i in list) {
+                if (list[i].children != null) {
+                    this.haveUsersList(list[i].children);
+                }
+                if (list[i].userList != null) {
+                    if (list[i].children == null) {
+                        list[i].children = [];
+                    }
+                    list[i].userList.forEach(element => {
+                        var obj = { id: element.id, label: element.name, parentId: element.departmentId, isUser: 1 };
+                        list[i].children.push(obj);
+                    });
+                }
+            }
+        },
+    },
+}
+</script>
+<style scoped lang='scss'></style>

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

@@ -2164,5 +2164,6 @@
   "xiangMuFuWu": "Project Services",
   "buShuYuNingDeQuanXianNei": "Not within your permission",
   "piLiangXiuGaiXiangMuJieDuan": "Batch modification project phase",
-  "piLiangCaoZuo": "Batch operation"
+  "piLiangCaoZuo": "Batch operation",
+  "piLiangTianJiaRenWuChanYuRen": "Batch add task participants"
 }

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

@@ -2164,5 +2164,6 @@
   "tongYiGeZhiHangRenFuWuBuNengXiangTong": "同一个执行人,服务不能相同",
   "piLiangXiuGaiXiangMuJieDuan": "批量修改项目阶段",
   "buShuYuNingDeQuanXianNei": "不属于您的权限内",
-  "piLiangCaoZuo": "批量操作"
+  "piLiangCaoZuo": "批量操作",
+  "piLiangTianJiaRenWuChanYuRen": "批量添加任务参与人"
 }

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

@@ -409,6 +409,7 @@
                         <el-dropdown-item><el-button type="text" @click="addGroupPerson()" :loading="addGroupPersonBtnLoading">{{ $t('groupparticipantsinbatches') }}</el-button></el-dropdown-item>
                     </template>
                     <template v-if="(showColumnWidth != '0' || permissions.projectManagement)">
+                        <el-dropdown-item><el-button type="text" @click="batchProjectTaskParticipant()">{{ $t('piLiangTianJiaRenWuChanYuRen') }}</el-button></el-dropdown-item>
                         <el-dropdown-item><el-button type="text" @click="addProPreson()">{{ $t('projectparticipantsinbatches') }}</el-button></el-dropdown-item>
                         <el-dropdown-item><el-button type="text" v-if="permissions.projectManagement" @click="batchIncharger()">{{ $t('projectmanagersinbatches') }}</el-button></el-dropdown-item>
                         <el-dropdown-item><el-button type="text" v-if="user.company.packageProject" @click="batchProjectStage()">{{ $t('piLiangXiuGaiXiangMuJieDuan') }}</el-button></el-dropdown-item>
@@ -571,13 +572,13 @@
 
                         <!--项目复审人-->
                         <span v-if="user.timeType.reportAuditType == 8" style="margin-left:63px;margin-right:10px;" >{{ $t('other.projectReviwer') }}</span>
-                        <el-select v-if="user.userNameNeedTranslate != 1" v-model="addForm.reviwerId" clearable filterable :placeholder="$t('defaultText.pleaseChoose')" style="width:32%;" :disabled="canOnlyModParticipator || projectManagerEdit">
+                        <el-select v-if="user.timeType.reportAuditType == 8 && user.userNameNeedTranslate != 1" v-model="addForm.reviwerId" clearable filterable :placeholder="$t('defaultText.pleaseChoose')" style="width:32%;" :disabled="canOnlyModParticipator || projectManagerEdit">
                             <el-option v-for="item in users" :key="item.id" :label="item.name" :value="item.id">
                                 <span style="float: left">{{ item.name }}</span>
                                 <span style="float: right; color: #8492a6;">{{ item.jobNumber }}</span>
                             </el-option>
                         </el-select>
-                        <selectCat v-if="user.userNameNeedTranslate == 1" :filterable="true" :size="'medium'" :subject="users" :subjectId="addForm.reviwerId" :distinction="'4'" @selectCal="selectCal" :disabled="canOnlyModParticipator || projectManagerEdit || isShowProjectName"></selectCat>
+                        <selectCat v-if="user.timeType.reportAuditType == 8 && user.userNameNeedTranslate == 1" :filterable="true" :size="'medium'" :subject="users" :subjectId="addForm.reviwerId" :distinction="'4'" @selectCal="selectCal" :disabled="canOnlyModParticipator || projectManagerEdit || isShowProjectName"></selectCat>
                     </el-form-item>
 
                     <span v-if="user.companyId != 469">
@@ -1770,6 +1771,8 @@
                 </el-link>
             </div>
         </el-dialog>
+        <!-- 选择人 -->
+        <DepartmentSelectionPersonnel :visible="batchProjectTaskParticipantVisible" @changeParticipant="changeTaskParticipantVisible" @submitParticipant="addProjectTaskParticipant"></DepartmentSelectionPersonnel>
     </section>
 </template>
 <style scoped>
@@ -1806,12 +1809,14 @@ a {
     import selectCat from "@/components/select.vue"
     import vueCascader from "@/components/cascader.vue"
     import vueCascadeSelection from "@/components/cascadeSelection.vue"
+    import DepartmentSelectionPersonnel from "@/components/departmentSelectionPersonnel.vue"
     export default {
         components:{
             projectgantt,
             selectCat,
             vueCascader,
-            vueCascadeSelection
+            vueCascadeSelection,
+            DepartmentSelectionPersonnel
         },
         data() {
             return {
@@ -2083,7 +2088,8 @@ a {
                 participatorVisible: false,
                 participatorValue: [],
                 batchChangeStageDialogVisible: false,
-                batchChangeStageLoading: false
+                batchChangeStageLoading: false,
+                batchProjectTaskParticipantVisible: false
             };
         },
         // 过滤器
@@ -2135,6 +2141,40 @@ a {
             })
         },
         methods: {
+            addProjectTaskParticipant(userList) {
+                const userIds = userList.map(item => item.id).join(',')
+                const projectIds = this.checkedProjectArr.map(a => a.id).join(',')
+                this.http.post('/project/batchSetProjectTaskExecutor', {
+                    userIds, projectIds
+                },
+                res => {
+                    if (res.code == "ok") {
+                        this.getList()
+                        this.changeTaskParticipantVisible(false);
+                    } else {
+                        this.$message({
+                            message: res.msg,
+                            type: "error"
+                        });
+                    }
+                },
+                error => {
+                    this.$message({
+                        message: error,
+                        type: "error"
+                    });
+                });
+            },
+            batchProjectTaskParticipant() {
+                if (this.checkedProjectArr.length == 0) {
+                    this.$message(this.$t('defaultText.pleaseSelectSnItem'))
+                    return
+                }
+                this.changeTaskParticipantVisible(true)
+            },
+            changeTaskParticipantVisible(flag) {
+                this.batchProjectTaskParticipantVisible = flag
+            },
             showAllparticipator(item) {
                 this.participatorVisibleTitle = item.projectName + ' -- '+this.$t('participantin')
                 this.participatorValue = item.participator || []