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