From 67769c299ed0a65b4b2979b4d124718db6425430 Mon Sep 17 00:00:00 2001 From: jason <2667446@qq.com> Date: Sun, 17 Nov 2024 10:49:57 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E5=8A=9F=E8=83=BD=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E3=80=91=E5=80=99=E9=80=89=E4=BA=BA=E7=AD=96=E7=95=A5=EF=BC=9A?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=A1=A8=E5=8D=95=E5=86=85=E6=88=90=E5=91=98?= =?UTF-8?q?=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/useApiSelect.tsx | 2 +- .../SimpleProcessDesignerV2/src/consts.ts | 8 ++- .../SimpleProcessDesignerV2/src/node.ts | 61 +++++++++++++++---- .../src/nodes-config/CopyTaskNodeConfig.vue | 25 +++++++- .../src/nodes-config/UserTaskNodeConfig.vue | 24 +++++++- 5 files changed, 102 insertions(+), 18 deletions(-) diff --git a/src/components/FormCreate/src/components/useApiSelect.tsx b/src/components/FormCreate/src/components/useApiSelect.tsx index 29cd3027..741b1d48 100644 --- a/src/components/FormCreate/src/components/useApiSelect.tsx +++ b/src/components/FormCreate/src/components/useApiSelect.tsx @@ -185,7 +185,7 @@ export const useApiSelect = (option: ApiSelectProps) => { ) } - debugger + // debugger return ( > + fieldsPermission?: Array> // 审批任务超时处理 timeoutHandler?: TimeoutHandler // 审批任务拒绝处理 @@ -145,6 +145,11 @@ export enum CandidateStrategy { * 指定用户组 */ USER_GROUP = 40, + + /** + * 表单内成员字段 + */ + USER_FIELD_ON_FORM = 50, /** * 流程表达式 */ @@ -424,6 +429,7 @@ export const CANDIDATE_STRATEGY: DictDataVO[] = [ { label: '发起人部门负责人', value: CandidateStrategy.START_USER_DEPT_LEADER }, { label: '发起人连续部门负责人', value: CandidateStrategy.START_USER_MULTI_LEVEL_DEPT_LEADER }, { label: '用户组', value: CandidateStrategy.USER_GROUP }, + { label: '表单内成员字段', value: CandidateStrategy.USER_FIELD_ON_FORM }, { label: '流程表达式', value: CandidateStrategy.EXPRESSION } ] // 审批节点 的审批类型 diff --git a/src/components/SimpleProcessDesignerV2/src/node.ts b/src/components/SimpleProcessDesignerV2/src/node.ts index d10173bb..64e5fef8 100644 --- a/src/components/SimpleProcessDesignerV2/src/node.ts +++ b/src/components/SimpleProcessDesignerV2/src/node.ts @@ -32,7 +32,7 @@ export function useWatchNode(props: { flowNode: SimpleFlowNode }): Ref>>([]) + const fieldsPermissionConfig = ref>>([]) const formType = inject>('formType') // 表单类型 @@ -45,49 +45,71 @@ export function useFormFieldsPermission(defaultPermission: FieldPermissionType) } // 默认的表单权限: 获取表单的所有字段,设置字段默认权限为只读 const getDefaultFieldsPermission = (formFields?: string[]) => { - const defaultFieldsPermission: Array> = [] + let defaultFieldsPermission: Array> = [] if (formFields) { - formFields.forEach((fieldStr: string) => { - parseFieldsSetDefaultPermission(JSON.parse(fieldStr), defaultFieldsPermission) - }) + defaultFieldsPermission = parseFormCreateFields(formFields).map( item => { + return { + field: item.field, + title: item.title, + permission: defaultPermission + } + }); } return defaultFieldsPermission } - // 解析字段。赋给默认权限 - const parseFieldsSetDefaultPermission = ( + // 解析 formCreate 所有表单字段, 并返回 + const parseFormCreateFields = (formFields?: string[]) => { + const result: Array> = [] + if (formFields) { + formFields.forEach((fieldStr: string) => { + parseFields(JSON.parse(fieldStr), result) + }) + } + return result + } + const parseFields = ( rule: Record, - fieldsPermission: Array>, + fields: Array>, parentTitle: string = '' ) => { - const { /**type,*/ field, title: tempTitle, children } = rule + const { type, field, $required, title: tempTitle, children } = rule if (field && tempTitle) { let title = tempTitle if (parentTitle) { title = `${parentTitle}.${tempTitle}` } - fieldsPermission.push({ + let required = false; + if($required) { + required = true; + } + fields.push({ field, title, - permission: defaultPermission + type, + required }) // TODO 子表单 需要处理子表单字段 // if (type === 'group' && rule.props?.rule && Array.isArray(rule.props.rule)) { // // 解析子表单的字段 // rule.props.rule.forEach((item) => { - // parseFieldsSetDefaultPermission(item, fieldsPermission, title) + // parseFields(item, fieldsPermission, title) // }) // } } if (children && Array.isArray(children)) { children.forEach((rule) => { - parseFieldsSetDefaultPermission(rule, fieldsPermission) + parseFields(rule, fields) }) } } + + // 获取表单的所有字段,作为下拉框选项 + const formFieldOptions = parseFormCreateFields(unref(formFields)) return { formType, fieldsPermissionConfig, + formFieldOptions, getNodeConfigFormFields } } @@ -152,6 +174,7 @@ export type UserTaskFormType = { userGroups?: number[] // 用户组 postIds?: number[] // 岗位 expression?: string // 流程表达式 + userFieldOnForm?: string // 表单内成员字段 approveRatio?: number rejectHandlerType?: RejectHandlerType returnNodeId?: string @@ -174,6 +197,7 @@ export type CopyTaskFormType = { userIds?: number[] // 用户 userGroups?: number[] // 用户组 postIds?: number[] // 岗位 + userFieldOnForm?: string // 表单内成员字段 expression?: string // 流程表达式 } @@ -282,6 +306,11 @@ export function useNodeForm(nodeType: NodeType) { } } + // 表单内成员字段 + if (configForm.value?.candidateStrategy === CandidateStrategy.USER_FIELD_ON_FORM) { + showText = `表单内用户字段` + } + // 发起人自选 if (configForm.value?.candidateStrategy === CandidateStrategy.START_USER_SELECT) { showText = `发起人自选` @@ -328,6 +357,9 @@ export function useNodeForm(nodeType: NodeType) { case CandidateStrategy.USER_GROUP: candidateParam = configForm.value.userGroups!.join(',') break + case CandidateStrategy.USER_FIELD_ON_FORM: + candidateParam = configForm.value.userFieldOnForm! + break case CandidateStrategy.EXPRESSION: candidateParam = configForm.value.expression! break @@ -376,6 +408,9 @@ export function useNodeForm(nodeType: NodeType) { case CandidateStrategy.USER_GROUP: configForm.value.userGroups = candidateParam.split(',').map((item) => +item) break + case CandidateStrategy.USER_FIELD_ON_FORM: + configForm.value.userFieldOnForm = candidateParam + break case CandidateStrategy.EXPRESSION: configForm.value.expression = candidateParam break diff --git a/src/components/SimpleProcessDesignerV2/src/nodes-config/CopyTaskNodeConfig.vue b/src/components/SimpleProcessDesignerV2/src/nodes-config/CopyTaskNodeConfig.vue index c3006afc..422ac992 100644 --- a/src/components/SimpleProcessDesignerV2/src/nodes-config/CopyTaskNodeConfig.vue +++ b/src/components/SimpleProcessDesignerV2/src/nodes-config/CopyTaskNodeConfig.vue @@ -122,7 +122,20 @@ /> - + + + + + { + return formFieldOptions.filter( + (item) => item.required && item.type === 'UserSelect' + ) +}) // 抄送人表单配置 const formRef = ref() // 表单 Ref // 表单校验规则 @@ -243,6 +262,7 @@ const formRules = reactive({ deptIds: [{ required: true, message: '部门不能为空', trigger: 'change' }], userGroups: [{ required: true, message: '用户组不能为空', trigger: 'change' }], postIds: [{ required: true, message: '岗位不能为空', trigger: 'change' }], + userFieldOnForm: [{ required: true, message: '表单内成员字段为空', trigger: 'change' }], expression: [{ required: true, message: '流程表达式不能为空', trigger: 'blur' }] }) @@ -272,6 +292,7 @@ const changeCandidateStrategy = () => { configForm.value.postIds = [] configForm.value.userGroups = [] configForm.value.deptLevel = 1 + configForm.value.userFieldOnForm = '' } // 保存配置 const saveConfig = async () => { diff --git a/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue b/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue index 899d7045..7d8d7708 100644 --- a/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue +++ b/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue @@ -157,6 +157,20 @@ /> + + + + + { + return formFieldOptions.filter( + (item) => item.required && item.type === 'UserSelect' + ) +}) // 操作按钮设置 const { buttonsSetting, btnDisplayNameEdit, changeBtnDisplayName, btnDisplayNameBlurEvent } = useButtonsSetting() @@ -498,6 +518,7 @@ const formRules = reactive({ roleIds: [{ required: true, message: '角色不能为空', trigger: 'change' }], deptIds: [{ required: true, message: '部门不能为空', trigger: 'change' }], userGroups: [{ required: true, message: '用户组不能为空', trigger: 'change' }], + userFieldOnForm: [{ required: true, message: '表单内成员字段为空', trigger: 'change' }], postIds: [{ required: true, message: '岗位不能为空', trigger: 'change' }], expression: [{ required: true, message: '流程表达式不能为空', trigger: 'blur' }], approveMethod: [{ required: true, message: '多人审批方式不能为空', trigger: 'change' }], @@ -533,6 +554,7 @@ const changeCandidateStrategy = () => { configForm.value.postIds = [] configForm.value.userGroups = [] configForm.value.deptLevel = 1 + configForm.value.userFieldOnForm = '' configForm.value.approveMethod = ApproveMethodType.SEQUENTIAL_APPROVE }