|
@@ -1,85 +1,183 @@
|
|
<template>
|
|
<template>
|
|
- <div style="margin-top: 16px">
|
|
|
|
- <!-- <el-form-item label="处理用户">-->
|
|
|
|
- <!-- <el-select v-model="userTaskForm.assignee" @change="updateElementTask('assignee')">-->
|
|
|
|
- <!-- <el-option v-for="ak in mockData" :key="'ass-' + ak" :label="`用户${ak}`" :value="`user${ak}`" />-->
|
|
|
|
- <!-- </el-select>-->
|
|
|
|
- <!-- </el-form-item>-->
|
|
|
|
- <!-- <el-form-item label="候选用户">-->
|
|
|
|
- <!-- <el-select v-model="userTaskForm.candidateUsers" multiple collapse-tags @change="updateElementTask('candidateUsers')">-->
|
|
|
|
- <!-- <el-option v-for="uk in mockData" :key="'user-' + uk" :label="`用户${uk}`" :value="`user${uk}`" />-->
|
|
|
|
- <!-- </el-select>-->
|
|
|
|
- <!-- </el-form-item>-->
|
|
|
|
- <!-- <el-form-item label="候选分组">-->
|
|
|
|
- <!-- <el-select v-model="userTaskForm.candidateGroups" multiple collapse-tags @change="updateElementTask('candidateGroups')">-->
|
|
|
|
- <!-- <el-option v-for="gk in mockData" :key="'ass-' + gk" :label="`分组${gk}`" :value="`group${gk}`" />-->
|
|
|
|
- <!-- </el-select>-->
|
|
|
|
- <!-- </el-form-item>-->
|
|
|
|
- <el-form-item label="到期时间">
|
|
|
|
- <el-input v-model="userTaskForm.dueDate" clearable @change="updateElementTask('dueDate')" />
|
|
|
|
|
|
+ <el-form label-width="100px">
|
|
|
|
+ <el-form-item label="规则类型" prop="assignType">
|
|
|
|
+ <el-select
|
|
|
|
+ v-model="userTaskForm.assignType"
|
|
|
|
+ clearable
|
|
|
|
+ style="width: 100%"
|
|
|
|
+ @change="changeAssignType"
|
|
|
|
+ >
|
|
|
|
+ <el-option
|
|
|
|
+ v-for="dict in getIntDictOptions(DICT_TYPE.BPM_TASK_ASSIGN_RULE_TYPE)"
|
|
|
|
+ :key="dict.value"
|
|
|
|
+ :label="dict.label"
|
|
|
|
+ :value="dict.value"
|
|
|
|
+ />
|
|
|
|
+ </el-select>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
- <el-form-item label="跟踪时间">
|
|
|
|
- <el-input
|
|
|
|
- v-model="userTaskForm.followUpDate"
|
|
|
|
|
|
+ <el-form-item v-if="userTaskForm.assignType == 10" label="指定角色" prop="assignOptions">
|
|
|
|
+ <el-select
|
|
|
|
+ v-model="userTaskForm.assignOptions"
|
|
clearable
|
|
clearable
|
|
- @change="updateElementTask('followUpDate')"
|
|
|
|
|
|
+ multiple
|
|
|
|
+ style="width: 100%"
|
|
|
|
+ @change="updateElementTask"
|
|
|
|
+ >
|
|
|
|
+ <el-option v-for="item in roleOptions" :key="item.id" :label="item.name" :value="item.id" />
|
|
|
|
+ </el-select>
|
|
|
|
+ </el-form-item>
|
|
|
|
+ <el-form-item
|
|
|
|
+ v-if="userTaskForm.assignType == 20 || userTaskForm.assignType == 21"
|
|
|
|
+ label="指定部门"
|
|
|
|
+ prop="assignOptions"
|
|
|
|
+ span="24"
|
|
|
|
+ >
|
|
|
|
+ <el-tree-select
|
|
|
|
+ ref="treeRef"
|
|
|
|
+ v-model="userTaskForm.assignOptions"
|
|
|
|
+ :data="deptTreeOptions"
|
|
|
|
+ :props="defaultProps"
|
|
|
|
+ empty-text="加载中,请稍后"
|
|
|
|
+ multiple
|
|
|
|
+ node-key="id"
|
|
|
|
+ show-checkbox
|
|
|
|
+ @change="updateElementTask"
|
|
/>
|
|
/>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
- <el-form-item label="优先级">
|
|
|
|
- <el-input v-model="userTaskForm.priority" clearable @change="updateElementTask('priority')" />
|
|
|
|
|
|
+ <el-form-item
|
|
|
|
+ v-if="userTaskForm.assignType == 22"
|
|
|
|
+ label="指定岗位"
|
|
|
|
+ prop="assignOptions"
|
|
|
|
+ span="24"
|
|
|
|
+ >
|
|
|
|
+ <el-select
|
|
|
|
+ v-model="userTaskForm.assignOptions"
|
|
|
|
+ clearable
|
|
|
|
+ multiple
|
|
|
|
+ style="width: 100%"
|
|
|
|
+ @change="updateElementTask"
|
|
|
|
+ >
|
|
|
|
+ <el-option v-for="item in postOptions" :key="item.id" :label="item.name" :value="item.id" />
|
|
|
|
+ </el-select>
|
|
|
|
+ </el-form-item>
|
|
|
|
+ <el-form-item
|
|
|
|
+ v-if="
|
|
|
|
+ userTaskForm.assignType == 30 ||
|
|
|
|
+ userTaskForm.assignType == 31 ||
|
|
|
|
+ userTaskForm.assignType == 32
|
|
|
|
+ "
|
|
|
|
+ label="指定用户"
|
|
|
|
+ prop="assignOptions"
|
|
|
|
+ span="24"
|
|
|
|
+ >
|
|
|
|
+ <el-select
|
|
|
|
+ v-model="userTaskForm.assignOptions"
|
|
|
|
+ clearable
|
|
|
|
+ multiple
|
|
|
|
+ style="width: 100%"
|
|
|
|
+ @change="updateElementTask"
|
|
|
|
+ >
|
|
|
|
+ <el-option
|
|
|
|
+ v-for="item in userOptions"
|
|
|
|
+ :key="item.id"
|
|
|
|
+ :label="item.nickname"
|
|
|
|
+ :value="item.id"
|
|
|
|
+ />
|
|
|
|
+ </el-select>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
- 友情提示:任务的分配规则,使用
|
|
|
|
- <router-link target="_blank" :to="{ path: '/bpm/manager/model' }"
|
|
|
|
- ><el-link type="danger">流程模型</el-link>
|
|
|
|
- </router-link>
|
|
|
|
- 下的【分配规则】替代,提供指定角色、部门负责人、部门成员、岗位、工作组、自定义脚本等 7
|
|
|
|
- 种维护的任务分配维度,更加灵活!
|
|
|
|
- </div>
|
|
|
|
|
|
+ <el-form-item v-if="userTaskForm.assignType === 40" label="指定用户组" prop="assignOptions">
|
|
|
|
+ <el-select
|
|
|
|
+ v-model="userTaskForm.assignOptions"
|
|
|
|
+ clearable
|
|
|
|
+ multiple
|
|
|
|
+ style="width: 100%"
|
|
|
|
+ @change="updateElementTask"
|
|
|
|
+ >
|
|
|
|
+ <el-option
|
|
|
|
+ v-for="item in userGroupOptions"
|
|
|
|
+ :key="item.id"
|
|
|
|
+ :label="item.name"
|
|
|
|
+ :value="item.id"
|
|
|
|
+ />
|
|
|
|
+ </el-select>
|
|
|
|
+ </el-form-item>
|
|
|
|
+ <el-form-item v-if="userTaskForm.assignType === 50" label="指定脚本" prop="assignOptions">
|
|
|
|
+ <el-select
|
|
|
|
+ v-model="userTaskForm.assignOptions"
|
|
|
|
+ clearable
|
|
|
|
+ multiple
|
|
|
|
+ style="width: 100%"
|
|
|
|
+ @change="updateElementTask"
|
|
|
|
+ >
|
|
|
|
+ <el-option
|
|
|
|
+ v-for="dict in taskAssignScriptDictDatas"
|
|
|
|
+ :key="dict.value"
|
|
|
|
+ :label="dict.label"
|
|
|
|
+ :value="dict.value"
|
|
|
|
+ />
|
|
|
|
+ </el-select>
|
|
|
|
+ </el-form-item>
|
|
|
|
+ </el-form>
|
|
</template>
|
|
</template>
|
|
|
|
|
|
<script lang="ts" setup>
|
|
<script lang="ts" setup>
|
|
|
|
+import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
|
|
|
|
+import { defaultProps, handleTree } from '@/utils/tree'
|
|
|
|
+import * as RoleApi from '@/api/system/role'
|
|
|
|
+import * as DeptApi from '@/api/system/dept'
|
|
|
|
+import * as PostApi from '@/api/system/post'
|
|
|
|
+import * as UserApi from '@/api/system/user'
|
|
|
|
+import * as UserGroupApi from '@/api/bpm/userGroup'
|
|
|
|
+
|
|
defineOptions({ name: 'UserTask' })
|
|
defineOptions({ name: 'UserTask' })
|
|
const props = defineProps({
|
|
const props = defineProps({
|
|
id: String,
|
|
id: String,
|
|
type: String
|
|
type: String
|
|
})
|
|
})
|
|
-const defaultTaskForm = ref({
|
|
|
|
- assignee: '',
|
|
|
|
- candidateUsers: [],
|
|
|
|
- candidateGroups: [],
|
|
|
|
- dueDate: '',
|
|
|
|
- followUpDate: '',
|
|
|
|
- priority: ''
|
|
|
|
|
|
+const userTaskForm = ref({
|
|
|
|
+ assignType: undefined, // 分配规则
|
|
|
|
+ assignOptions: [] // 分配选项
|
|
})
|
|
})
|
|
-const userTaskForm = ref<any>({})
|
|
|
|
// const mockData=ref([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
|
// const mockData=ref([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
|
const bpmnElement = ref()
|
|
const bpmnElement = ref()
|
|
const bpmnInstances = () => (window as any)?.bpmnInstances
|
|
const bpmnInstances = () => (window as any)?.bpmnInstances
|
|
|
|
|
|
|
|
+const roleOptions = ref<RoleApi.RoleVO[]>([]) // 角色列表
|
|
|
|
+const deptTreeOptions = ref() // 部门树
|
|
|
|
+const postOptions = ref<PostApi.PostVO[]>([]) // 岗位列表
|
|
|
|
+const userOptions = ref<UserApi.UserVO[]>([]) // 用户列表
|
|
|
|
+const userGroupOptions = ref<UserGroupApi.UserGroupVO[]>([]) // 用户组列表
|
|
|
|
+const taskAssignScriptDictDatas = getIntDictOptions(DICT_TYPE.BPM_TASK_ASSIGN_SCRIPT)
|
|
|
|
+
|
|
const resetTaskForm = () => {
|
|
const resetTaskForm = () => {
|
|
- for (let key in defaultTaskForm.value) {
|
|
|
|
- let value
|
|
|
|
- if (key === 'candidateUsers' || key === 'candidateGroups') {
|
|
|
|
- value = bpmnElement.value?.businessObject[key]
|
|
|
|
- ? bpmnElement.value.businessObject[key].split(',')
|
|
|
|
- : []
|
|
|
|
- } else {
|
|
|
|
- value = bpmnElement.value?.businessObject[key] || defaultTaskForm.value[key]
|
|
|
|
- }
|
|
|
|
- userTaskForm.value[key] = value
|
|
|
|
|
|
+ const businessObject = bpmnElement.value.businessObject
|
|
|
|
+ if (!businessObject) {
|
|
|
|
+ return
|
|
}
|
|
}
|
|
-}
|
|
|
|
-const updateElementTask = (key) => {
|
|
|
|
- const taskAttr = Object.create(null)
|
|
|
|
- if (key === 'candidateUsers' || key === 'candidateGroups') {
|
|
|
|
- taskAttr[key] =
|
|
|
|
- userTaskForm.value[key] && userTaskForm.value[key].length
|
|
|
|
- ? userTaskForm.value[key].join()
|
|
|
|
- : null
|
|
|
|
|
|
+ if (businessObject.assignType != undefined) {
|
|
|
|
+ userTaskForm.value.assignType = parseInt(businessObject.assignType) as any
|
|
|
|
+ } else {
|
|
|
|
+ userTaskForm.value.assignType = undefined
|
|
|
|
+ }
|
|
|
|
+ if (businessObject.assignOptions && businessObject.assignOptions.length > 0) {
|
|
|
|
+ userTaskForm.value.assignOptions = businessObject.assignOptions?.split(',').map((item) => +item)
|
|
} else {
|
|
} else {
|
|
- taskAttr[key] = userTaskForm.value[key] || null
|
|
|
|
|
|
+ userTaskForm.value.assignOptions = []
|
|
}
|
|
}
|
|
- bpmnInstances().modeling.updateProperties(toRaw(bpmnElement.value), taskAttr)
|
|
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/** 更新 assignType 字段时,需要清空 assignOptions,并触发 bpmn 图更新 */
|
|
|
|
+const changeAssignType = () => {
|
|
|
|
+ userTaskForm.value.assignOptions = []
|
|
|
|
+ updateElementTask()
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/** 选中某个 options 时候,更新 bpmn 图 */
|
|
|
|
+const updateElementTask = () => {
|
|
|
|
+ bpmnInstances().modeling.updateProperties(toRaw(bpmnElement.value), {
|
|
|
|
+ assignType: userTaskForm.value.assignType,
|
|
|
|
+ assignOptions: userTaskForm.value.assignOptions.join(',')
|
|
|
|
+ })
|
|
}
|
|
}
|
|
|
|
|
|
watch(
|
|
watch(
|
|
@@ -92,6 +190,21 @@ watch(
|
|
},
|
|
},
|
|
{ immediate: true }
|
|
{ immediate: true }
|
|
)
|
|
)
|
|
|
|
+
|
|
|
|
+onMounted(async () => {
|
|
|
|
+ // 获得角色列表
|
|
|
|
+ roleOptions.value = await RoleApi.getSimpleRoleList()
|
|
|
|
+ // 获得部门列表
|
|
|
|
+ const deptOptions = await DeptApi.getSimpleDeptList()
|
|
|
|
+ deptTreeOptions.value = handleTree(deptOptions, 'id')
|
|
|
|
+ // 获得岗位列表
|
|
|
|
+ postOptions.value = await PostApi.getSimplePostList()
|
|
|
|
+ // 获得用户列表
|
|
|
|
+ userOptions.value = await UserApi.getSimpleUserList()
|
|
|
|
+ // 获得用户组列表
|
|
|
|
+ userGroupOptions.value = await UserGroupApi.getSimpleUserGroupList()
|
|
|
|
+})
|
|
|
|
+
|
|
onBeforeUnmount(() => {
|
|
onBeforeUnmount(() => {
|
|
bpmnElement.value = null
|
|
bpmnElement.value = null
|
|
})
|
|
})
|