From e87846bfc7e467836d958632b15a22a901eb51d2 Mon Sep 17 00:00:00 2001
From: fuliqi <fuliqi@qq.com>
Date: 星期四, 09 一月 2025 15:33:56 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 src/components/Process/panel/TaskConfPanel.vue |  550 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 550 insertions(+), 0 deletions(-)

diff --git a/src/components/Process/panel/TaskConfPanel.vue b/src/components/Process/panel/TaskConfPanel.vue
new file mode 100644
index 0000000..9d93362
--- /dev/null
+++ b/src/components/Process/panel/TaskConfPanel.vue
@@ -0,0 +1,550 @@
+<template>
+  <div>
+    <el-form label-width="80px" size="small">
+      <el-form-item label="寮傛">
+        <el-switch v-model="bpmnFormData.async" active-text="鏄�" inactive-text="鍚�" @change="updateElementTask('async')"/>
+      </el-form-item>
+      <el-form-item label="鐢ㄦ埛绫诲瀷">
+        <el-select v-model="bpmnFormData.userType" placeholder="鐢ㄦ埛绫诲瀷" @change="updateUserType">
+          <el-option
+            v-for="item in userTypeOption"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          />
+        </el-select>
+      </el-form-item>
+
+      <el-form-item label="鎸囧畾浜哄憳" v-if="bpmnFormData.userType === 'assignee'">
+        <single-user ref="singleUser" :select-user="delegationUserSelect && delegationUserSelect.length > 0 ? delegationUserSelect[0].userId : null" :show="singleUserShow" @close="closeSingleUser" @submit="getSingleUserSelect" :key="singleUserKey"/>
+        <div v-if="expSelect">
+          <el-tag class="select-tag" :key="expSelect.id + 'kfc'" type="info" closable @close="removeExp">{{expSelect.expression}}</el-tag>
+        </div>
+        <div v-else>
+          <el-tag class="select-tag" v-for="user in delegationUserSelect" :key="user.userId + 'abc'" type="info" closable @close="removeSingleUser(user)">{{user.nickName}}</el-tag>
+        </div>
+        <el-button-group class="ml-4" style="margin-top: 4px">
+          <!--鎸囧畾浜哄憳-->
+          <el-tooltip class="box-item" effect="dark" content="鎸囧畾浜哄憳" :disabled="typeButDisable" placement="bottom">
+            <el-button size="mini" type="primary" icon="el-icon-user" :disabled="typeButDisable" @click="editSingleUser"/>
+          </el-tooltip>
+          <!--閫夋嫨琛ㄨ揪寮�-->
+          <el-tooltip class="box-item" effect="dark" content="閫夋嫨琛ㄨ揪寮�" :disabled="expButDisable" placement="bottom">
+            <el-button size="mini" type="warning" icon="el-icon-postcard" :disabled="expButDisable" @click="editExp"/>
+          </el-tooltip>
+        </el-button-group>
+      </el-form-item>
+
+      <el-form-item label="鍊欓�変汉鍛�" v-else-if="bpmnFormData.userType === 'candidateUsers'">
+        <mult-user ref="multUser" :select-user="delegationUserSelect" :show="multUserShow" @close="closeMultUser" @submit="getMultUserSelect" :key="multUserKey"/>
+        <div v-if="expSelect">
+          <el-tag class="select-tag" :key="expSelect.id + 'kfc'" type="info" closable @close="removeExp">{{expSelect.expression}}</el-tag>
+        </div>
+        <div v-else>
+          <el-tag class="select-tag" v-for="user in delegationUserSelect" :key="user.userId + 'qwe'" type="info" closable @close="removeMultUser(user)">{{user.nickName}}</el-tag>
+        </div>
+        <el-button-group class="ml-4" style="margin-top: 4px">
+          <!--鍊欓�変汉鍛�-->
+          <el-tooltip class="box-item" effect="dark" content="鍊欓�変汉鍛�" :disabled="typeButDisable" placement="bottom">
+            <el-button size="mini" type="primary" icon="el-icon-user" :disabled="typeButDisable" @click="editMultUser"/>
+          </el-tooltip>
+          <!--閫夋嫨琛ㄨ揪寮�-->
+          <el-tooltip class="box-item" effect="dark" content="閫夋嫨琛ㄨ揪寮�" :disabled="expButDisable" placement="bottom">
+            <el-button size="mini" type="warning" icon="el-icon-postcard" :disabled="expButDisable" @click="editExp"/>
+          </el-tooltip>
+        </el-button-group>
+      </el-form-item>
+
+      <el-form-item label="鍊欓�夎鑹�" v-else-if="bpmnFormData.userType === 'candidateGroups'">
+        <my-role ref="role" :select-values="delegationRoleSelect" :show="roleShow" @close="closeRole" @submit="getRoleSelect" :key="roleKey"/>
+        <div v-if="expSelect">
+          <el-tag class="select-tag" :key="expSelect.id + 'kfc'" type="info" closable @close="removeExp">{{expSelect.expression}}</el-tag>
+        </div>
+        <div v-else>
+          <el-tag class="select-tag" v-for="role in delegationRoleSelect" :key="role.roleId + 'rty'" type="info" closable @close="removeRole(role)">{{role.roleName}}</el-tag>
+        </div>
+        <el-button-group class="ml-4" style="margin-top: 4px">
+          <!--鍊欓�夎鑹�-->
+          <el-tooltip class="box-item" effect="dark" content="鍊欓�夎鑹�" :disabled="typeButDisable" placement="bottom">
+            <el-button size="mini" type="primary" icon="el-icon-user" :disabled="typeButDisable"  @click="editRole"/>
+          </el-tooltip>
+          <!--閫夋嫨琛ㄨ揪寮�-->
+          <el-tooltip class="box-item" effect="dark" content="閫夋嫨琛ㄨ揪寮�" :disabled="expButDisable" placement="bottom">
+            <el-button size="mini" type="warning" icon="el-icon-postcard" :disabled="expButDisable" @click="editExp"/>
+          </el-tooltip>
+        </el-button-group>
+      </el-form-item>
+
+      <el-form-item label="鍊欓�夐儴闂�" v-else>
+        <MyDept ref="dept" :checkeds="delegationDeptSelect" :show="deptShow" @close="closeDept" @submit="getDeptSelect" :key="deptKey"/>
+        <div v-if="expSelect">
+          <el-tag class="select-tag" :key="expSelect.id + 'kfc'" type="info" closable @close="removeExp">{{expSelect.expression}}</el-tag>
+        </div>
+        <div v-else>
+          <el-tag class="select-tag" v-for="dept in delegationDeptSelect" :key="dept.id + 'zxc'" type="info" closable @close="removeDept(dept)">{{dept.label}}</el-tag>
+        </div>
+        <el-button-group class="ml-4" style="margin-top: 4px">
+          <!--鍊欓�夐儴闂�-->
+          <el-tooltip class="box-item" effect="dark" content="鍊欓�夐儴闂�" :disabled="typeButDisable" placement="bottom">
+            <el-button size="mini" type="primary" icon="el-icon-user" :disabled="typeButDisable" @click="editDept"/>
+          </el-tooltip>
+          <!--閫夋嫨琛ㄨ揪寮�-->
+          <el-tooltip class="box-item" effect="dark" content="閫夋嫨琛ㄨ揪寮�" :disabled="expButDisable" placement="bottom">
+            <el-button size="mini" type="warning" icon="el-icon-postcard" :disabled="expButDisable" @click="editExp"/>
+          </el-tooltip>
+        </el-button-group>
+      </el-form-item>
+
+      <el-form-item label="浼樺厛绾�">
+        <el-input v-model="bpmnFormData.priority" @change="updateElementTask('priority')"/>
+      </el-form-item>
+      <el-form-item label="鍒版湡鏃堕棿">
+        <el-input v-model="bpmnFormData.dueDate" @change="updateElementTask('dueDate')"/>
+      </el-form-item>
+    </el-form>
+
+    <!--閫夋嫨琛ㄨ揪寮�-->
+    <el-dialog
+      title="閫夋嫨琛ㄨ揪寮�"
+      :visible.sync="expVisible"
+      width="60%"
+      :close-on-press-escape="false"
+      :destroy-on-close="true"
+      @close="closeExp"
+    >
+      <flow-exp :selectValues="expSelect" @handleSingleExpSelect="getExpSelect"></flow-exp>
+      <div slot="footer" class="dialog-footer">
+        <el-button size="small" type="primary" @click="checkExpComplete">纭� 瀹�</el-button>
+      </div>
+    </el-dialog>
+
+
+  </div>
+</template>
+
+<script>
+import FlowExp from '@/components/flow/Expression'
+import {StrUtil} from '@/utils/StrUtil'
+import MyDept from '@/components/flow/Dept/MyDept'
+import SingleUser from '@/components/flow/User/SingleUser'
+import MultUser from '@/components/flow/User/MultUser'
+import MyRole from '@/components/flow/Role/MyRole'
+
+
+export default {
+  name: "TaskConfPanel",
+  components: {
+    FlowExp,
+    MyRole,
+    MyDept,
+    SingleUser,
+    MultUser,
+  },
+  /** 缁勪欢浼犲��  */
+  props : {
+    id: {
+      type: String,
+      required: true
+    },
+  },
+  data() {
+    return {
+      typeButDisable: false, // 鐢ㄦ埛绫诲瀷閫夋嫨鎸夐挳鏄惁绂佺敤
+      expButDisable: false, // 鐢ㄦ埛绫诲瀷閫夋嫨鎸夐挳鏄惁绂佺敤
+      roleKey: 'role',
+      deptKey: 'dept',
+      multUserKey: 0,
+      singleUserKey: 'single',
+      roleShow: false, // 瑙掕壊缁勬樉绀�
+      delegationRoleSelect: [], // 閫変腑瑙掕壊
+      multUserShow: false, // 鐢ㄦ埛缁勬樉绀�
+      singleUserShow: false, // 鎸囧畾鐢ㄦ埛鏄剧ず
+      delegationUserSelect: [], // 閫変腑鐨勭敤鎴�
+      deptShow: false, // 閮ㄩ棬缁勬樉绀�
+      delegationDeptSelect: [], // 閫変腑閮ㄩ棬
+      expSelect: null,  // 閫変腑琛ㄨ揪寮�
+      num: 0, // 鐢ㄤ簬瑙﹀彂鐢ㄦ埛閫夋嫨鏇存柊
+      expVisible: false,
+      isIndeterminate: true,
+      checkType: 'single', // 閫夌被
+      userType: '',
+      userTypeOption: [
+        {label: '鎸囧畾浜哄憳', value: 'assignee'},
+        {label: '鍊欓�変汉鍛�', value: 'candidateUsers'},
+        {label: '鍊欓�夎鑹�', value: 'candidateGroups'},
+        {label: '鍊欓�夐儴闂�', value: 'candidateDeptGroups'},
+      ],
+      checkAll: false,
+      bpmnFormData: {
+        userType: "candidateDeptGroups",
+        assignee: "",
+        candidateUsers: "",
+        candidateGroups: "",
+        dueDate: "",
+        priority: "",
+        dataType: "",
+        expId: "",
+      },
+      // 鏁版嵁鍥炴樉
+      selectData: {
+        assignee: null,
+        candidateUsers: null,
+        candidateGroups: [],  // 瑙掕壊
+        candidateDeptGroups: [], // 閮ㄩ棬
+        exp: null,
+      },
+      otherExtensionList:[],
+    }
+  },
+
+  /** 浼犲�肩洃鍚� */
+  watch: {
+    id: {
+      handler(newVal) {
+        if (StrUtil.isNotBlank(newVal)) {
+          this.resetTaskForm();
+        }
+      },
+      immediate: true, // 绔嬪嵆鐢熸晥
+    },
+  },
+  created() {
+
+  },
+  methods: {
+    removeExp() {
+      this.getExpSelect(null)
+    },
+    removeDept(dept) {
+      let index = this.delegationDeptSelect.indexOf(dept);
+      if (index !== -1) {
+        this.delegationDeptSelect.splice(index, 1);
+      }
+      this.getDeptSelect(this.delegationDeptSelect)
+    },
+    removeRole(role) {
+      let index = this.delegationRoleSelect.indexOf(role);
+      if (index !== -1) {
+        this.delegationRoleSelect.splice(index, 1);
+      }
+      this.getRoleSelect(this.delegationRoleSelect)
+    },
+    removeMultUser(user) {
+      let index = this.delegationUserSelect.indexOf(user);
+      if (index !== -1) {
+        this.delegationUserSelect.splice(index, 1);
+      }
+      this.getMultUserSelect(this.delegationUserSelect)
+    },
+    removeSingleUser(user) {
+      // 鍥犱负鍙兘閫変竴涓敤鎴凤紝鎵�浠ュ垹浜嗗氨娌′簡
+      this.getSingleUserSelect(null)
+    },
+    editDept() {
+      this.$nextTick(() => {
+        this.deptKey += '1'
+        this.$refs.dept.setCheckList(this.delegationDeptSelect)
+      })
+      this.deptShow = true
+    },
+    editSingleUser() {
+      if (this.delegationUserSelect && this.delegationUserSelect.length > 0) {
+        this.singleUserKey += '1'
+        this.$nextTick(() => {
+          this.$refs.singleUser.setChecked(this.delegationUserSelect[0])
+        })
+      }
+      this.singleUserShow = true
+    },
+    editRole() {
+      if (this.delegationRoleSelect && this.delegationRoleSelect.length > 0) {
+        this.roleKey += '1'
+        this.$nextTick(() => {
+          this.$refs.role.setChecked(this.delegationRoleSelect)
+        })
+      }
+      this.roleShow = true
+    },
+    editMultUser() {
+      if (this.delegationUserSelect && this.delegationUserSelect.length > 0) {
+        this.multUserKey += '1'
+        this.$nextTick(() => {
+          this.$refs.multUser.setChecked(this.delegationUserSelect)
+        })
+      }
+      this.multUserShow = true
+    },
+    editExp() {
+      this.expVisible = true;
+    },
+    getDeptSelect(deptList) {
+      if (deptList && deptList.length > 0) {
+        this.deleteFlowAttar();
+        this.updateCustomElement('dataType', 'fixed');
+        this.updateCustomElement("candidateGroups", deptList.map(item => item.id).join(","));
+        this.delegationDeptSelect = deptList
+        this.expButDisable = true
+      } else {
+        this.delegationDeptSelect = []
+        this.expButDisable = false
+      }
+      this.deptShow = false
+      this.deptKey += '1'
+    },
+    getMultUserSelect(userList) {
+      if (userList && userList.length > 0) {
+        this.deleteFlowAttar();
+        this.updateCustomElement('dataType', 'fixed');
+        this.updateCustomElement(this.bpmnFormData.userType, userList.map(item => item.userId).join(","));
+        this.delegationUserSelect = userList
+        this.expButDisable = true
+      } else {
+        this.delegationUserSelect = []
+        this.expButDisable = false
+      }
+      this.multUserShow = false
+      this.multUserKey += 1;
+    },
+    getRoleSelect(roleList) {
+      if (roleList && roleList.length > 0) {
+        this.deleteFlowAttar();
+        this.updateCustomElement('dataType', 'fixed');
+        // userType = candidateGroups
+        this.updateCustomElement(this.bpmnFormData.userType, roleList.map(item => item.roleId).join(","));
+        this.delegationRoleSelect = roleList
+        this.expButDisable = true
+      } else {
+        this.delegationRoleSelect = []
+        this.expButDisable = false
+      }
+      this.roleShow = false
+      this.roleKey += '1'
+    },
+    getSingleUserSelect(user) {
+      if (user) {
+        this.deleteFlowAttar();
+        this.updateCustomElement('dataType', 'fixed');
+        this.updateCustomElement(this.bpmnFormData.userType, user.userId);
+        this.delegationUserSelect = [user]
+        this.expButDisable = true
+      } else {
+        this.delegationUserSelect = []
+        this.expButDisable = false
+        this.deleteFlowAttar();
+      }
+      this.singleUserShow = false
+      this.singleUserKey += '1'
+    },
+    getExpSelect(selection) {
+      console.log(selection, "閫変腑鐨勮〃杈惧紡")
+      if (selection) {
+        this.expSelect = selection
+        this.deleteFlowAttar();
+        this.bpmnFormData[this.bpmnFormData.userType] = selection.name;
+        this.updateCustomElement('dataType', selection.dataType);
+        this.updateCustomElement('expId', selection.id.toString());
+        const userType = this.bpmnFormData.userType === "candidateDeptGroups" ? "candidateGroups" : this.bpmnFormData.userType
+        this.updateCustomElement(userType, selection.expression);
+        this.handleSelectData("exp", selection.id);
+        this.typeButDisable = true
+      } else {
+        this.expSelect = null
+        this.typeButDisable = false
+        this.deleteFlowAttar();
+      }
+    },
+    closeExp() {
+      this.expVisible = false
+    },
+    closeDept() {
+      this.deptShow = false
+      this.deptKey += '1'
+    },
+    closeSingleUser() {
+      this.singleUserShow = false
+      this.singleUserKey += '1'
+    },
+    closeRole() {
+      this.roleShow = false
+      this.roleKey += '1'
+    },
+    closeMultUser() {
+      this.multUserShow = false
+      this.multUserKey += 1;
+    },
+
+    // 鍒濆鍖栬〃鍗�
+    resetTaskForm() {
+      // 鍒濆鍖栬涓虹┖鍊�
+      this.bpmnFormData = {
+        userType: "candidateDeptGroups",
+        assignee: "",
+        candidateUsers: "",
+        candidateGroups: "",
+        dueDate: "",
+        priority: "",
+        dataType: "",
+        expId: "",
+      }
+      this.selectData = {
+        assignee: null,
+        candidateUsers: null,
+        candidateGroups: null,
+        exp: null,
+      }
+      // 娴佺▼鑺傜偣淇℃伅涓婂彇鍊�
+      for (let key in this.bpmnFormData) {
+        const value = this.modelerStore.element?.businessObject[key] || this.bpmnFormData[key];
+        this.$set(this.bpmnFormData, key, value);
+      }
+      console.log(this.bpmnFormData, "鍒濆鍖栨暟鎹�")
+      // 浜哄憳銆佽鑹层�侀儴闂ㄤ俊鎭洖鏄�
+      this.checkValuesEcho(this.bpmnFormData);
+    },
+
+    // 鏇存柊鑺傜偣淇℃伅
+    updateElementTask(key) {
+      const taskAttr = Object.create(null);
+      taskAttr[key] = this.bpmnFormData[key] || "";
+      this.modelerStore.modeling.updateProperties(this.modelerStore.element, taskAttr);
+    },
+
+    // 鏇存柊鑷畾涔夋祦绋嬭妭鐐�/鍙傛暟淇℃伅
+    updateCustomElement(key, value) {
+      const taskAttr = Object.create(null);
+      taskAttr[key] = value;
+      this.modelerStore.modeling.updateProperties(this.modelerStore.element, taskAttr);
+    },
+
+    // 鏇存柊浜哄憳绫诲瀷
+    updateUserType(val) {
+      console.log(val, "浜哄憳绫诲瀷")
+      // 鍒犻櫎xml涓凡閫夋嫨鏁版嵁绫诲瀷鑺傜偣
+      this.deleteFlowAttar();
+      // 娓呴櫎宸查�変汉鍛樻暟鎹�
+      if (val === "candidateDeptGroups") {
+        val = "candidateGroups"
+        this.delegationDeptSelect = []  // 閮ㄩ棬
+      } else if (val === "candidateGroups") {
+        this.delegationRoleSelect = []  // 瑙掕壊
+      } else if (val === "assignee" || val === "candidateUsers") {
+        this.delegationUserSelect = []   // 鎸囧畾鐢ㄦ埛/鍊欓�夌敤鎴�
+      }
+      this.expSelect = null  // 琛ㄨ揪寮忛噸缃负绌�
+      this.selectData = {
+        assignee: null,
+        candidateUsers: null,
+        candidateGroups: null,
+        exp: null,
+      }
+      this.typeButDisable = false
+      this.expButDisable = false
+      // 鍐欏叆userType鑺傜偣淇℃伅鍒皒ml
+      this.updateCustomElement('userType', val);
+    },
+
+    // 璁捐鍣ㄥ彸渚ц〃鍗曟暟鎹洖鏄�
+    checkValuesEcho(formData) {
+      if (formData.expId) {
+        this.getExpList(formData.expId);
+        this.typeButDisable = true
+        this.expButDisable = false
+      } else {
+        this.typeButDisable = false
+        this.expSelect = null
+        if ("candidateGroups" === formData.userType || "candidateDeptGroups" === formData.userType) {
+          this.getRoleOrDeptReview(formData.candidateGroups)
+        } else {
+          this.getUserList(formData[formData.userType], formData.userType);
+        }
+      }
+    },
+
+    // 鑾峰彇琛ㄨ揪寮忎俊鎭�
+    getExpList(expId) {
+      this.expSelect = this.modelerStore.expList?.find(item => item.id.toString() === expId);
+    },
+
+    // 鑾峰彇浜哄憳淇℃伅
+    getUserList(val, key) {
+      if (StrUtil.isNotBlank(val)) {
+        this.expButDisable = true
+        this.typeButDisable = false
+        if ('assignee' === key) {
+          const uList = this.modelerStore.userList.filter(item => item.userId == val);
+          this.delegationUserSelect = uList
+        } else {
+          const newArr = this.modelerStore.userList?.filter(i => val.split(',').includes(i.userId.toString()))
+          this.delegationUserSelect = newArr
+        }
+      } else {
+        this.expButDisable = false
+        this.delegationUserSelect = []
+      }
+    },
+
+    // 鑾峰彇瑙掕壊淇℃伅
+    getRoleOrDeptReview(ids) {
+      this.delegationDeptSelect = []
+      this.delegationRoleSelect = []
+      if (StrUtil.isNotBlank(ids)) {
+        this.expButDisable = true
+        this.typeButDisable = false
+        // 鏍规嵁id绛涢�夊嚭鏄鑹茶繕鏄儴闂�
+        const roleAndDeptIds = ids.split(",");
+        const deptIds = roleAndDeptIds.filter(item => item.includes("dept"));
+        const roleIds = roleAndDeptIds.filter(item => !item.includes("dept"));
+
+        if (roleIds && roleIds.length > 0) {  // 瑙掕壊
+          const targetRoleList = this.modelerStore.roleList?.filter(i => roleIds.includes(i.roleId.toString()))
+          this.delegationRoleSelect = targetRoleList;
+          this.bpmnFormData.userType = "candidateGroups"
+        }
+        if (deptIds && deptIds.length > 0){ // 閮ㄩ棬
+          const targetDeptList = this.modelerStore.deptList?.filter(i => deptIds.includes(i.id))
+          this.delegationDeptSelect = targetDeptList
+          this.bpmnFormData.userType = "candidateDeptGroups"
+        }
+      } else {
+        this.expButDisable = false
+        this.delegationDeptSelect = []
+        this.delegationRoleSelect = []
+      }
+    },
+
+    // ------ 娴佺▼瀹℃壒浜哄憳淇℃伅寮瑰嚭妗� start---------
+
+
+    // 澶勭悊浜哄憳鍥炴樉
+    handleSelectData(key, value) {
+      for (let oldKey in this.selectData) {
+        if (key !== oldKey) {
+          this.$set(this.selectData, oldKey, null);
+        } else {
+          this.$set(this.selectData, oldKey, value);
+        }
+      }
+    },
+
+    /*琛ㄨ揪寮忛�変腑璧嬪��*/
+    checkExpComplete() {
+      this.expVisible = false;
+    },
+
+    // 鍒犻櫎鑺傜偣
+    deleteFlowAttar() {
+      delete this.modelerStore.element.businessObject[`dataType`]
+      delete this.modelerStore.element.businessObject[`expId`]
+      delete this.modelerStore.element.businessObject[`assignee`]
+      delete this.modelerStore.element.businessObject[`candidateUsers`]
+      delete this.modelerStore.element.businessObject[`candidateGroups`]
+    },
+
+  }
+}
+</script>
+<style scoped>
+.select-tag {
+  margin-right: 3px;
+}
+</style>

--
Gitblit v1.8.0