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