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