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 所有下级 | ||||
|  */ | ||||
|  | ||||
| interface Column { | ||||
| export interface Column { | ||||
|   label: string | ||||
|   findType: 'all' | 'now' | 'sub' | 'all_sub' | 'direct_sub' //查询类型 | ||||
|   columnKey: Array<'mobile' | 'email' | 'sex' | 'post' | 'deptName'> //扩展显示列 | ||||
|   | ||||
| @@ -65,6 +65,7 @@ const getUserKey = (val) => { | ||||
|   else if ([20, 21].includes(val)) key = 'deptIds' | ||||
|   else if (val == 22) key = 'postIds' | ||||
|   else if ([30, 31, 32].includes(val)) key = 'userIds' | ||||
|   else if (val == 35) key = 'userSelects' | ||||
|   else if (val == 40) key = 'userGroupIds' | ||||
|   else if (val == 50) key = 'scripts' | ||||
|   return key | ||||
| @@ -95,7 +96,8 @@ const tableOption = reactive({ | ||||
|           postIds: {display: false}, | ||||
|           userIds: {display: false}, | ||||
|           userGroupIds: {display: false}, | ||||
|           scripts: { display: false } | ||||
|           scripts: {display: false}, | ||||
|           userSelects: {display: false}, | ||||
|         } | ||||
|         const key = getUserKey(val) | ||||
|         if (key) columnObj[key].display = true | ||||
| @@ -112,6 +114,7 @@ const tableOption = reactive({ | ||||
|         let arr = row.options.map((id) => { | ||||
|           if (key == 'deptIds') return lowStore.dicObj.deptSelect?.[id] || id | ||||
|           else if (key == 'userIds') return lowStore.dicObj.userSelect?.[id] || id | ||||
|           else if (key == 'userSelects') return '' | ||||
|           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'] | ||||
|   if (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 | ||||
|   } | ||||
|   delKey.forEach((prop) => delete form[prop]) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user