feat(bpm): 新增任务分配规则支持自定义用户选择
- 在任务分配规则中增加 userSelects 类型支持 - 新增 TaskSelectAssigneeForm 组件用于选择任务候选人 - 更新 UserSelect 组件导出 Column 接口- 调整任务分配表单逻辑以适配新的用户选择类型- 优化任务分配规则获取与展示逻辑
This commit is contained in:
105
src/components/BpmTaskAssign/TaskSelectAssigneeForm.vue
Normal file
105
src/components/BpmTaskAssign/TaskSelectAssigneeForm.vue
Normal file
@@ -0,0 +1,105 @@
|
|||||||
|
<template>
|
||||||
|
<ContentWrap>
|
||||||
|
<el-form ref="formRef" :model="formData" :rules="formRules" label-width="80px">
|
||||||
|
<div v-for="taskAssignRule in props?.taskAssignRules" :key="taskAssignRule.taskDefinitionKey">
|
||||||
|
<el-divider content-position="left">{{ taskAssignRule?.taskDefinitionName }}</el-divider>
|
||||||
|
<el-form-item :label="taskAssignRule.taskDefinitionName+'候选人'"
|
||||||
|
:prop="taskAssignRule.taskDefinitionKey"
|
||||||
|
label-width="200">
|
||||||
|
<UserSelect
|
||||||
|
v-model="formData[taskAssignRule.taskDefinitionKey]"
|
||||||
|
:column="userSelectColumn"
|
||||||
|
:prop="taskAssignRule.taskDefinitionKey"
|
||||||
|
type="edit"
|
||||||
|
:func="(value)=>{console.log(JSON.stringify(value))}"
|
||||||
|
>
|
||||||
|
</UserSelect>
|
||||||
|
</el-form-item>
|
||||||
|
</div>
|
||||||
|
</el-form>
|
||||||
|
</ContentWrap>
|
||||||
|
</template>
|
||||||
|
<script lang="ts" setup>
|
||||||
|
// 从 UserSelect 组件导入 Column 类型
|
||||||
|
import type {Column} from '@/components/LowDesign/src/shareControl/UserSelect.vue'
|
||||||
|
|
||||||
|
// 定义组件选项
|
||||||
|
defineOptions({
|
||||||
|
name: "BpmTaskSelectAssigneeForm"
|
||||||
|
})
|
||||||
|
|
||||||
|
interface TaskAssignRule {
|
||||||
|
id: number
|
||||||
|
modelId: string
|
||||||
|
processDefinitionId: string
|
||||||
|
taskDefinitionKey: string
|
||||||
|
taskDefinitionName: string
|
||||||
|
type: number
|
||||||
|
options: number[]
|
||||||
|
}
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
taskAssignRules: TaskAssignRule[]
|
||||||
|
modelValue: {}
|
||||||
|
}>()
|
||||||
|
|
||||||
|
const formRef = ref()
|
||||||
|
const formData = ref(props.modelValue)
|
||||||
|
const formRules = ref({})
|
||||||
|
const userSelectColumn: Column = {
|
||||||
|
label: '候选人',
|
||||||
|
findType: 'all',
|
||||||
|
multiple: false,
|
||||||
|
columnKey: ['sex', 'post', 'deptName']
|
||||||
|
}
|
||||||
|
|
||||||
|
const emit = defineEmits(['updateModelValue'])
|
||||||
|
|
||||||
|
watch(
|
||||||
|
() => props.modelValue,
|
||||||
|
(val: {}) => {
|
||||||
|
formData.value = val
|
||||||
|
},
|
||||||
|
{
|
||||||
|
deep: true,
|
||||||
|
immediate: true,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
watch(
|
||||||
|
() => formData.value,
|
||||||
|
(val: {}) => {
|
||||||
|
emit('updateModelValue', val)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
deep: true,
|
||||||
|
immediate: true,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
const validateAssignee = (successCallBack: () => void, failCallback: () => void) => {
|
||||||
|
formRef.value.validate((valid: boolean) => {
|
||||||
|
if (valid) successCallBack()
|
||||||
|
else failCallback()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
defineExpose({validateAssignee})
|
||||||
|
|
||||||
|
// 初始化 formData
|
||||||
|
onMounted(() => {
|
||||||
|
if (props.taskAssignRules) {
|
||||||
|
props.taskAssignRules.forEach(rule => {
|
||||||
|
formData.value[rule.taskDefinitionKey] = ''
|
||||||
|
formRules.value[rule.taskDefinitionKey] = [
|
||||||
|
{
|
||||||
|
required: true,
|
||||||
|
message: '请选择候选人',
|
||||||
|
trigger: 'blur'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
</script>
|
||||||
@@ -217,7 +217,7 @@ defineOptions({ name: 'UserSelect' })
|
|||||||
* all_sub 所有下级
|
* all_sub 所有下级
|
||||||
*/
|
*/
|
||||||
|
|
||||||
interface Column {
|
export interface Column {
|
||||||
label: string
|
label: string
|
||||||
findType: 'all' | 'now' | 'sub' | 'all_sub' | 'direct_sub' //查询类型
|
findType: 'all' | 'now' | 'sub' | 'all_sub' | 'direct_sub' //查询类型
|
||||||
columnKey: Array<'mobile' | 'email' | 'sex' | 'post' | 'deptName'> //扩展显示列
|
columnKey: Array<'mobile' | 'email' | 'sex' | 'post' | 'deptName'> //扩展显示列
|
||||||
|
|||||||
@@ -32,22 +32,22 @@
|
|||||||
</ContentWrap>
|
</ContentWrap>
|
||||||
</template>
|
</template>
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
|
import {DICT_TYPE, getIntDictOptions} from '@/utils/dict'
|
||||||
import * as TaskAssignRuleApi from '@/api/bpm/taskAssignRule'
|
import * as TaskAssignRuleApi from '@/api/bpm/taskAssignRule'
|
||||||
import * as RoleApi from '@/api/system/role'
|
import * as RoleApi from '@/api/system/role'
|
||||||
import * as PostApi from '@/api/system/post'
|
import * as PostApi from '@/api/system/post'
|
||||||
import * as UserGroupApi from '@/api/bpm/userGroup'
|
import * as UserGroupApi from '@/api/bpm/userGroup'
|
||||||
import { setUserAndDeptName } from '@/components/LowDesign/src/utils/getName'
|
import {setUserAndDeptName} from '@/components/LowDesign/src/utils/getName'
|
||||||
import { useLowStoreWithOut } from '@/store/modules/low'
|
import {useLowStoreWithOut} from '@/store/modules/low'
|
||||||
|
|
||||||
const message = useMessage() // 消息弹窗
|
const message = useMessage() // 消息弹窗
|
||||||
const { t } = useI18n() // 国际化
|
const {t} = useI18n() // 国际化
|
||||||
const { getCurrPermi } = useCrudPermi()
|
const {getCurrPermi} = useCrudPermi()
|
||||||
const lowStore = useLowStoreWithOut()
|
const lowStore = useLowStoreWithOut()
|
||||||
|
|
||||||
defineOptions({ name: 'BpmTaskAssignRule' })
|
defineOptions({name: 'BpmTaskAssignRule'})
|
||||||
|
|
||||||
const { query } = useRoute() // 查询参数
|
const {query} = useRoute() // 查询参数
|
||||||
|
|
||||||
const loading = ref(true)
|
const loading = ref(true)
|
||||||
const getRules = (label) => {
|
const getRules = (label) => {
|
||||||
@@ -65,6 +65,7 @@ const getUserKey = (val) => {
|
|||||||
else if ([20, 21].includes(val)) key = 'deptIds'
|
else if ([20, 21].includes(val)) key = 'deptIds'
|
||||||
else if (val == 22) key = 'postIds'
|
else if (val == 22) key = 'postIds'
|
||||||
else if ([30, 31, 32].includes(val)) key = 'userIds'
|
else if ([30, 31, 32].includes(val)) key = 'userIds'
|
||||||
|
else if (val == 35) key = 'userSelects'
|
||||||
else if (val == 40) key = 'userGroupIds'
|
else if (val == 40) key = 'userGroupIds'
|
||||||
else if (val == 50) key = 'scripts'
|
else if (val == 50) key = 'scripts'
|
||||||
return key
|
return key
|
||||||
@@ -81,8 +82,8 @@ const tableOption = reactive({
|
|||||||
delBtn: false,
|
delBtn: false,
|
||||||
calcHeight: 20,
|
calcHeight: 20,
|
||||||
column: {
|
column: {
|
||||||
taskDefinitionName: { label: '任务名', disabled: true },
|
taskDefinitionName: {label: '任务名', disabled: true},
|
||||||
taskDefinitionKey: { label: '任务标识', disabled: true },
|
taskDefinitionKey: {label: '任务标识', disabled: true},
|
||||||
type: {
|
type: {
|
||||||
label: '规则类型',
|
label: '规则类型',
|
||||||
type: 'select',
|
type: 'select',
|
||||||
@@ -90,12 +91,13 @@ const tableOption = reactive({
|
|||||||
rules: getRules('规则类型'),
|
rules: getRules('规则类型'),
|
||||||
control: (val) => {
|
control: (val) => {
|
||||||
const columnObj = {
|
const columnObj = {
|
||||||
roleIds: { display: false },
|
roleIds: {display: false},
|
||||||
deptIds: { display: false },
|
deptIds: {display: false},
|
||||||
postIds: { display: false },
|
postIds: {display: false},
|
||||||
userIds: { display: false },
|
userIds: {display: false},
|
||||||
userGroupIds: { display: false },
|
userGroupIds: {display: false},
|
||||||
scripts: { display: false }
|
scripts: {display: false},
|
||||||
|
userSelects: {display: false},
|
||||||
}
|
}
|
||||||
const key = getUserKey(val)
|
const key = getUserKey(val)
|
||||||
if (key) columnObj[key].display = true
|
if (key) columnObj[key].display = true
|
||||||
@@ -112,6 +114,7 @@ const tableOption = reactive({
|
|||||||
let arr = row.options.map((id) => {
|
let arr = row.options.map((id) => {
|
||||||
if (key == 'deptIds') return lowStore.dicObj.deptSelect?.[id] || id
|
if (key == 'deptIds') return lowStore.dicObj.deptSelect?.[id] || id
|
||||||
else if (key == 'userIds') return lowStore.dicObj.userSelect?.[id] || id
|
else if (key == 'userIds') return lowStore.dicObj.userSelect?.[id] || id
|
||||||
|
else if (key == 'userSelects') return ''
|
||||||
else return dicObj.value[key][id]
|
else return dicObj.value[key][id]
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -198,7 +201,7 @@ const rowUpdate = async (form, index, done, loading) => {
|
|||||||
const delKey = ['roleIds', 'deptIds', 'postIds', 'userIds', 'userGroupIds', 'scripts']
|
const delKey = ['roleIds', 'deptIds', 'postIds', 'userIds', 'userGroupIds', 'scripts']
|
||||||
if (key) {
|
if (key) {
|
||||||
if (typeof form[key] == 'number') form[key] = form[key] + ''
|
if (typeof form[key] == 'number') form[key] = form[key] + ''
|
||||||
const value = form[key]
|
const value = key === 'userSelects' ? '' : form[key]
|
||||||
form.options = typeof value == 'string' ? value.split(',') : value
|
form.options = typeof value == 'string' ? value.split(',') : value
|
||||||
}
|
}
|
||||||
delKey.forEach((prop) => delete form[prop])
|
delKey.forEach((prop) => delete form[prop])
|
||||||
@@ -228,14 +231,14 @@ const getDicData = () => {
|
|||||||
const id = item.id + ''
|
const id = item.id + ''
|
||||||
const name = item.name
|
const name = item.name
|
||||||
dicObj.value[key][id] = name
|
dicObj.value[key][id] = name
|
||||||
return { label: name, value: id }
|
return {label: name, value: id}
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
dicObj.value.scripts = {}
|
dicObj.value.scripts = {}
|
||||||
tableOption.column.scripts.dicData = getIntDictOptions(DICT_TYPE.BPM_TASK_ASSIGN_SCRIPT).map(
|
tableOption.column.scripts.dicData = getIntDictOptions(DICT_TYPE.BPM_TASK_ASSIGN_SCRIPT).map(
|
||||||
(item) => {
|
(item) => {
|
||||||
dicObj.value.scripts[item.value] = item.label
|
dicObj.value.scripts[item.value] = item.label
|
||||||
return { value: item.value + '', label: item.label }
|
return {value: item.value + '', label: item.label}
|
||||||
}
|
}
|
||||||
) as never[]
|
) as never[]
|
||||||
dicObj.value.type = {}
|
dicObj.value.type = {}
|
||||||
@@ -262,7 +265,7 @@ const formattingTableData = (data): Promise<any[]> => {
|
|||||||
}
|
}
|
||||||
return item
|
return item
|
||||||
})
|
})
|
||||||
await setUserAndDeptName({ userIdList, deptIdList })
|
await setUserAndDeptName({userIdList, deptIdList})
|
||||||
resolve(data)
|
resolve(data)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user