From ee15398472acb5686be991b6445bab3db3cf229b Mon Sep 17 00:00:00 2001 From: xiangpei <xiangpei@timesnew.cn> Date: 星期六, 30 十一月 2024 01:25:41 +0800 Subject: [PATCH] 任务分配支持选部门 --- src/api/system/user.js | 8 ++ src/views/projectProcess/components/RunProcess.vue | 5 + src/components/Process/panel/taskPanel.vue | 87 ++++++++++++++++++--- src/components/flow/Dept/index.vue | 87 +++++++++++++++++++++ src/components/Process/common/global.js | 1 src/components/Process/designer.vue | 2 src/views/flowable/definition/model.vue | 4 + src/api/system/dept.js | 10 ++ 8 files changed, 191 insertions(+), 13 deletions(-) diff --git a/src/api/system/dept.js b/src/api/system/dept.js index 0c4e4b6..c94c5fa 100644 --- a/src/api/system/dept.js +++ b/src/api/system/dept.js @@ -9,6 +9,16 @@ }) } +// flowable鏌ヨ鎵�鏈夐儴闂� +export function flowableGetAllDept() { + return request({ + url: '/system/dept/flowable/all', + method: 'get' + }) +} + + + // 鏌ヨ閮ㄩ棬鍒楄〃锛堟帓闄よ妭鐐癸級 export function listDeptExcludeChild(deptId) { return request({ diff --git a/src/api/system/user.js b/src/api/system/user.js index f2f76ef..711b43e 100644 --- a/src/api/system/user.js +++ b/src/api/system/user.js @@ -133,3 +133,11 @@ method: 'get' }) } + +// 鏌ヨ閮ㄩ棬涓嬫媺鏍戠粨鏋�(flowable涓撶敤) +export function flowableDeptTreeSelect() { + return request({ + url: '/system/user/flowable/deptTree', + method: 'get' + }) +} diff --git a/src/components/Process/common/global.js b/src/components/Process/common/global.js index 5b93847..bdc0d9a 100644 --- a/src/components/Process/common/global.js +++ b/src/components/Process/common/global.js @@ -2,6 +2,7 @@ const modelerStore = { 'userList': [], 'roleList': [], + 'deptList': [], 'expList': [], 'modeler': null, 'modeling': null, diff --git a/src/components/Process/designer.vue b/src/components/Process/designer.vue index 715784f..e3fd0a7 100644 --- a/src/components/Process/designer.vue +++ b/src/components/Process/designer.vue @@ -138,7 +138,7 @@ }); // 鐩戝惉閫夋嫨浜嬩欢锛屼慨鏀瑰綋鍓嶆縺娲荤殑鍏冪礌浠ュ強琛ㄥ崟 this.modelerStore.modeler.on("selection.changed", ({newSelection}) => { - console.log("鏁版嵁鏀瑰彉1") + console.log("鏁版嵁鏀瑰彉1", newSelection) this.initFormOnChanged(newSelection[0] || null); }); this.modelerStore.modeler.on("element.changed", ({element}) => { diff --git a/src/components/Process/panel/taskPanel.vue b/src/components/Process/panel/taskPanel.vue index 9bfe14a..59063a2 100644 --- a/src/components/Process/panel/taskPanel.vue +++ b/src/components/Process/panel/taskPanel.vue @@ -43,12 +43,26 @@ </el-button-group> </el-form-item> - <el-form-item label="鍊欓�夎鑹�" v-else> + <el-form-item label="鍊欓�夎鑹�" v-else-if="bpmnFormData.userType === 'candidateGroups'"> <el-input-tag v-model="bpmnFormData.candidateGroups" :value="bpmnFormData.candidateGroups"/> <el-button-group class="ml-4" style="margin-top: 4px"> <!--鍊欓�夎鑹�--> <el-tooltip class="box-item" effect="dark" content="鍊欓�夎鑹�" placement="bottom"> <el-button size="mini" type="primary" icon="el-icon-user" @click="multipleRoleCheck"/> + </el-tooltip> + <!--閫夋嫨琛ㄨ揪寮�--> + <el-tooltip class="box-item" effect="dark" content="閫夋嫨琛ㄨ揪寮�" placement="bottom"> + <el-button size="mini" type="warning" icon="el-icon-postcard" @click="singleExpCheck"/> + </el-tooltip> + </el-button-group> + </el-form-item> + + <el-form-item label="鍊欓�夐儴闂�" v-else> + <el-input-tag v-model="bpmnFormData.candidateGroups" :value="bpmnFormData.candidateGroups"/> + <el-button-group class="ml-4" style="margin-top: 4px"> + <!--鍊欓�夐儴闂�--> + <el-tooltip class="box-item" effect="dark" content="鍊欓�夐儴闂�" placement="bottom"> + <el-button size="mini" type="primary" icon="el-icon-user" @click="deptVisible = true"/> </el-tooltip> <!--閫夋嫨琛ㄨ揪寮�--> <el-tooltip class="box-item" effect="dark" content="閫夋嫨琛ㄨ揪寮�" placement="bottom"> @@ -95,6 +109,8 @@ </div> </el-dialog> + <flow-dept :checkeds="selectData.candidateGroups" :show="deptVisible" @close="closeDept" @submit="submitDept"/> + <!--閫夋嫨琛ㄨ揪寮�--> <el-dialog title="閫夋嫨琛ㄨ揪寮�" @@ -119,6 +135,7 @@ import FlowRole from '@/components/flow/Role' import FlowExp from '@/components/flow/Expression' import ElInputTag from '@/components/flow/ElInputTag' +import FlowDept from '@/components/flow/Dept' import {StrUtil} from '@/utils/StrUtil' export default { @@ -127,7 +144,8 @@ FlowUser, FlowRole, FlowExp, - ElInputTag + ElInputTag, + FlowDept }, /** 缁勪欢浼犲�� */ props : { @@ -141,13 +159,15 @@ userVisible: false, roleVisible: false, expVisible: false, + deptVisible: false, isIndeterminate: true, checkType: 'single', // 閫夌被 userType: '', userTypeOption: [ {label: '鎸囧畾浜哄憳', value: 'assignee'}, {label: '鍊欓�変汉鍛�', value: 'candidateUsers'}, - {label: '鍊欓�夎鑹�', value: 'candidateGroups'} + {label: '鍊欓�夎鑹�', value: 'candidateGroups'}, + {label: '鍊欓�夐儴闂�', value: 'candidateDeptGroups'}, ], checkAll: false, bpmnFormData: { @@ -164,7 +184,8 @@ selectData: { assignee: null, candidateUsers: null, - candidateGroups: null, + candidateGroups: null, // 瑙掕壊 + candidateDeptGroups: [], // 閮ㄩ棬 exp: null, }, otherExtensionList:[], @@ -186,6 +207,11 @@ }, methods: { + closeDept() { + this.deptVisible = false + this.selectData.candidateGroups = [] + }, + // 鍒濆鍖栬〃鍗� resetTaskForm() { // 鍒濆鍖栬涓虹┖鍊� @@ -210,7 +236,7 @@ const value = this.modelerStore.element?.businessObject[key] || this.bpmnFormData[key]; this.$set(this.bpmnFormData, key, value); } - // 浜哄憳淇℃伅鍥炴樉 + // 浜哄憳銆佽鑹层�侀儴闂ㄤ俊鎭洖鏄� this.checkValuesEcho(this.bpmnFormData); }, @@ -239,6 +265,7 @@ assignee: null, candidateUsers: null, candidateGroups: null, + candidateDeptGroups: null, exp: null, } // 鍐欏叆userType鑺傜偣淇℃伅鍒皒ml @@ -250,8 +277,9 @@ if (StrUtil.isNotBlank(formData.expId)) { this.getExpList(formData.expId, formData.userType); } else { - if ("candidateGroups" === formData.userType) { - this.getRoleList(formData[formData.userType], formData.userType); + console.log("鎴戝幓", formData.userType) + if ("candidateGroups" === formData.userType || "candidateDeptGroups" === formData.userType) { + this.getRoleList(formData["candidateGroups"], "candidateGroups"); } else { this.getUserList(formData[formData.userType], formData.userType); } @@ -282,13 +310,33 @@ // 鑾峰彇瑙掕壊淇℃伅 getRoleList(val, key) { if (StrUtil.isNotBlank(val)) { - const newArr = this.modelerStore.roleList?.filter(i => val.split(',').includes(i.roleId.toString())) - this.bpmnFormData[key] = newArr.map(item => item.roleName).join(','); - if ('assignee' === key) { - this.selectData[key] = newArr.find(item => item.roleId.toString() === val).roleId; + + // 鏍规嵁id绛涢�夊嚭鏄鑹茶繕鏄儴闂� + const roleAndDeptIds = val.split(","); + const deptIds = roleAndDeptIds.filter(item => item.includes("dept")); + const roleIds = roleAndDeptIds.filter(item => !item.includes("dept")); + // 璋佹湁鍊煎氨鏄皝 + if (roleIds && roleIds.length > 0) { + console.log("鎴戝幓1", roleIds) + const newArr = this.modelerStore.roleList?.filter(i => roleIds.includes(i.roleId.toString())) + this.bpmnFormData[key] = newArr.map(item => item.roleName).join(','); + if ('assignee' === key) { + this.selectData[key] = newArr.find(item => item.roleId.toString() === val).roleId; + } else { + this.selectData[key] = newArr.map(item => item.roleId); + } } else { - this.selectData[key] = newArr.map(item => item.roleId); + console.log("鎴戝幓2", deptIds) + const newArr = this.modelerStore.deptList?.filter(i => deptIds.includes(i.id)) + this.bpmnFormData[key] = newArr.map(item => item.label).join(','); + if ('assignee' === key) { + this.selectData[key] = newArr.find(item => item.id === val).id; + } else { + this.selectData[key] = newArr.map(item => item.id); + } } + + } }, @@ -367,6 +415,21 @@ } }, + // 閮ㄩ棬閫変腑鏁版嵁 + submitDept(checkList, names) { + this.deptVisible = false + // this.selectData.candidateDeptGroups = checkList + if (checkList && names) { + this.deleteFlowAttar(); + this.bpmnFormData["candidateGroups"] = names; + this.updateCustomElement('dataType', 'fixed'); + // userType = candidateGroups + // 杩欓噷鍙兘鍐欐涓猴細candidateGroups锛屽洜涓篺lowable鐢ㄦ埛缁勭殑鍏抽敭瀛楀氨鏄畠 + this.updateCustomElement("candidateGroups", checkList); + this.handleSelectData("candidateGroups", checkList); + } + }, + // 澶勭悊浜哄憳鍥炴樉 handleSelectData(key, value) { for (let oldKey in this.selectData) { diff --git a/src/components/flow/Dept/index.vue b/src/components/flow/Dept/index.vue new file mode 100644 index 0000000..2d8278e --- /dev/null +++ b/src/components/flow/Dept/index.vue @@ -0,0 +1,87 @@ +<template> + <div> + <el-dialog + :title="`閫夋嫨鍊欓�夐儴闂╜" + :visible.sync="show" + width="65%" + :destroy-on-close="true" + :close-on-click-modal="false" + :before-close="close"> + <el-tree + :data="deptTree" + show-checkbox + node-key="id" + :check-strictly="true" + :default-expanded-keys="['dept:100']" + @check-change="handleCheckChange" + :default-checked-keys="checkeds"> + </el-tree> + <span slot="footer" class="dialog-footer"> + <el-button @click="close">鍙� 娑�</el-button> + <el-button type="primary" @click="submit">纭� 瀹�</el-button> + </span> + </el-dialog> + </div> +</template> + +<script> +import {flowableDeptTreeSelect} from "@/api/system/user"; + +export default { + name: "index", + props: { + show: { + required: true, + type: Boolean + }, + checkeds: { + required: true, + type: Array + } + }, + // watch: { + // checkeds: { + // handler(newV) { + // if (newV) { + // console.log("djjdjdjdjdjdjj") + // this.checkedAfterHandler = newV.map(item => {const arr = item.split(':'); return parseInt(arr[1])}) + // } + // }, + // deep: true + // } + // }, + data() { + return { + deptTree: [], + checkList: [], + } + }, + created() { + flowableDeptTreeSelect().then(res => { + this.deptTree = res.data + }) + }, + methods: { + handleCheckChange(data, checked, indeterminate) { + if (checked) { + this.checkList.push(data) + } else { + this.checkList = this.checkList.filter(item => item !== data) + } + console.log(data, checked, indeterminate); + }, + close() { + this.$emit("close") + }, + submit() { + const checkedIds = this.checkList.map(item => item.id).join(",") + const names = this.checkList.map(item => item.label).join(",") + this.$emit("submit", checkedIds, names) + } + } +} +</script> + +<style scoped> + +</style> diff --git a/src/views/flowable/definition/model.vue b/src/views/flowable/definition/model.vue index 16250dd..bead3c6 100644 --- a/src/views/flowable/definition/model.vue +++ b/src/views/flowable/definition/model.vue @@ -22,6 +22,7 @@ import vkBeautify from 'vkbeautify' import hljs from 'highlight.js' import 'highlight.js/styles/atelier-savanna-dark.css' +import {flowableGetAllDept} from "@/api/system/dept"; export default { name: "Model", components: { @@ -109,6 +110,9 @@ roleList().then(res => { this.modelerStore.roleList = res.data; }) + flowableGetAllDept().then(res => { + this.modelerStore.deptList = res.data; + }) expList().then(res => { this.modelerStore.expList = res.data; this.dataExit = true; diff --git a/src/views/projectProcess/components/RunProcess.vue b/src/views/projectProcess/components/RunProcess.vue index 92c6530..4331c69 100644 --- a/src/views/projectProcess/components/RunProcess.vue +++ b/src/views/projectProcess/components/RunProcess.vue @@ -31,6 +31,11 @@ > </el-table-column> <el-table-column + prop="version" + label="娴佺▼鐗堟湰" + > + </el-table-column> + <el-table-column prop="category" label="娴佺▼绫诲瀷" > -- Gitblit v1.8.0