Skip to content

Commit 47f1f13

Browse files
committed
【代码评审修改】审批人为表单用户
1 parent 24e1374 commit 47f1f13

File tree

4 files changed

+77
-68
lines changed

4 files changed

+77
-68
lines changed

src/components/FormCreate/src/utils/index.ts

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,46 @@ export const localeProps = (t, prefix, rules) => {
1616
return rule
1717
})
1818
}
19+
20+
/**
21+
* 解析表单组件的 field, title 等字段(递归,如果组件包含子组件)
22+
*
23+
* @param rule 组件的生成规则 https://www.form-create.com/v3/guide/rule
24+
* @param fields 解析后表单组件字段
25+
* @param parentTitle 如果是子表单,子表单的标题,默认为空
26+
*/
27+
export const parseFormFields = (
28+
rule: Record<string, any>,
29+
fields: Array<Record<string, any>> = [],
30+
parentTitle: string = ''
31+
) => {
32+
const { type, field, $required, title: tempTitle, children } = rule
33+
if (field && tempTitle) {
34+
let title = tempTitle
35+
if (parentTitle) {
36+
title = `${parentTitle}.${tempTitle}`
37+
}
38+
let required = false
39+
if ($required) {
40+
required = true
41+
}
42+
fields.push({
43+
field,
44+
title,
45+
type,
46+
required
47+
})
48+
// TODO 子表单 需要处理子表单字段
49+
// if (type === 'group' && rule.props?.rule && Array.isArray(rule.props.rule)) {
50+
// // 解析子表单的字段
51+
// rule.props.rule.forEach((item) => {
52+
// parseFields(item, fieldsPermission, title)
53+
// })
54+
// }
55+
}
56+
if (children && Array.isArray(children)) {
57+
children.forEach((rule) => {
58+
parseFormFields(rule, fields)
59+
})
60+
}
61+
}

src/components/SimpleProcessDesignerV2/src/node.ts

Lines changed: 11 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import {
1717
FieldPermissionType,
1818
ProcessVariableEnum
1919
} from './consts'
20+
import { parseFormFields } from '@/components/FormCreate/src/utils/index'
2021
export function useWatchNode(props: { flowNode: SimpleFlowNode }): Ref<SimpleFlowNode> {
2122
const node = ref<SimpleFlowNode>(props.flowNode)
2223
watch(
@@ -33,7 +34,7 @@ const parseFormCreateFields = (formFields?: string[]) => {
3334
const result: Array<Record<string, any>> = []
3435
if (formFields) {
3536
formFields.forEach((fieldStr: string) => {
36-
parseFields(JSON.parse(fieldStr), result)
37+
parseFormFields(JSON.parse(fieldStr), result)
3738
})
3839
}
3940
// 固定添加发起人 ID 字段
@@ -46,44 +47,6 @@ const parseFormCreateFields = (formFields?: string[]) => {
4647
return result
4748
}
4849

49-
// TODO @jason:parse 方法,是不是搞到 formCreate.ts。统一维护管理
50-
const parseFields = (
51-
rule: Record<string, any>,
52-
fields: Array<Record<string, any>>,
53-
parentTitle: string = ''
54-
) => {
55-
const { type, field, $required, title: tempTitle, children } = rule
56-
if (field && tempTitle) {
57-
let title = tempTitle
58-
if (parentTitle) {
59-
title = `${parentTitle}.${tempTitle}`
60-
}
61-
// TODO @jason:按照微信讨论的,非 $required 显示,但是 disable 不可选择
62-
let required = false
63-
if ($required) {
64-
required = true
65-
}
66-
fields.push({
67-
field,
68-
title,
69-
type,
70-
required
71-
})
72-
// TODO 子表单 需要处理子表单字段
73-
// if (type === 'group' && rule.props?.rule && Array.isArray(rule.props.rule)) {
74-
// // 解析子表单的字段
75-
// rule.props.rule.forEach((item) => {
76-
// parseFields(item, fieldsPermission, title)
77-
// })
78-
// }
79-
}
80-
if (children && Array.isArray(children)) {
81-
children.forEach((rule) => {
82-
parseFields(rule, fields)
83-
})
84-
}
85-
}
86-
8750
/**
8851
* @description 表单数据权限配置,用于发起人节点 、审批节点、抄送节点
8952
*/
@@ -144,8 +107,8 @@ export type UserTaskFormType = {
144107
userGroups?: number[] // 用户组
145108
postIds?: number[] // 岗位
146109
expression?: string // 流程表达式
147-
userFieldOnForm?: string // 表单内用户字段
148-
deptFieldOnForm?: string // 表单内部门字段
110+
formUser?: string // 表单内用户字段
111+
formDept?: string // 表单内部门字段
149112
approveRatio?: number
150113
rejectHandlerType?: RejectHandlerType
151114
returnNodeId?: string
@@ -168,8 +131,8 @@ export type CopyTaskFormType = {
168131
userIds?: number[] // 用户
169132
userGroups?: number[] // 用户组
170133
postIds?: number[] // 岗位
171-
userFieldOnForm?: string // 表单内用户字段
172-
deptFieldOnForm?: string // 表单内部门字段
134+
formUser?: string // 表单内用户字段
135+
formDept?: string // 表单内部门字段
173136
expression?: string // 流程表达式
174137
}
175138

@@ -282,7 +245,7 @@ export function useNodeForm(nodeType: NodeType) {
282245
// 表单内用户字段
283246
if (configForm.value?.candidateStrategy === CandidateStrategy.FORM_USER) {
284247
const formFieldOptions = parseFormCreateFields(unref(formFields))
285-
const item = formFieldOptions.find((item) => item.field === configForm.value?.userFieldOnForm)
248+
const item = formFieldOptions.find((item) => item.field === configForm.value?.formUser)
286249
showText = `表单用户:${item?.title}`
287250
}
288251

@@ -338,7 +301,7 @@ export function useNodeForm(nodeType: NodeType) {
338301
candidateParam = configForm.value.userGroups!.join(',')
339302
break
340303
case CandidateStrategy.FORM_USER:
341-
candidateParam = configForm.value.userFieldOnForm!
304+
candidateParam = configForm.value.formUser!
342305
break
343306
case CandidateStrategy.EXPRESSION:
344307
candidateParam = configForm.value.expression!
@@ -362,7 +325,7 @@ export function useNodeForm(nodeType: NodeType) {
362325
// 表单内部门的负责人
363326
case CandidateStrategy.FORM_DEPT_LEADER: {
364327
// 候选人参数格式: | 分隔 。左边为表单内部门字段。 右边为部门层级
365-
const deptFieldOnForm = configForm.value.deptFieldOnForm!
328+
const deptFieldOnForm = configForm.value.formDept!
366329
candidateParam = deptFieldOnForm.concat('|' + configForm.value.deptLevel + '')
367330
break
368331
}
@@ -396,7 +359,7 @@ export function useNodeForm(nodeType: NodeType) {
396359
configForm.value.userGroups = candidateParam.split(',').map((item) => +item)
397360
break
398361
case CandidateStrategy.FORM_USER:
399-
configForm.value.userFieldOnForm = candidateParam
362+
configForm.value.formUser = candidateParam
400363
break
401364
case CandidateStrategy.EXPRESSION:
402365
configForm.value.expression = candidateParam
@@ -422,7 +385,7 @@ export function useNodeForm(nodeType: NodeType) {
422385
case CandidateStrategy.FORM_DEPT_LEADER: {
423386
// 候选人参数格式: | 分隔 。左边为表单内的部门字段。 右边为部门层级
424387
const paramArray = candidateParam.split('|')
425-
configForm.value.deptFieldOnForm = paramArray[0]
388+
configForm.value.formDept = paramArray[0]
426389
configForm.value.deptLevel = +paramArray[1]
427390
break
428391
}

src/components/SimpleProcessDesignerV2/src/nodes-config/CopyTaskNodeConfig.vue

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -126,28 +126,30 @@
126126
<el-form-item
127127
v-if="configForm.candidateStrategy === CandidateStrategy.FORM_USER"
128128
label="表单内用户字段"
129-
prop="userFieldOnForm"
129+
prop="formUser"
130130
>
131-
<el-select v-model="configForm.userFieldOnForm" clearable style="width: 100%">
131+
<el-select v-model="configForm.formUser" clearable style="width: 100%">
132132
<el-option
133133
v-for="(item, idx) in userFieldOnFormOptions"
134134
:key="idx"
135135
:label="item.title"
136136
:value="item.field"
137+
:disabled ="!item.required"
137138
/>
138139
</el-select>
139140
</el-form-item>
140141
<el-form-item
141142
v-if="configForm.candidateStrategy === CandidateStrategy.FORM_DEPT_LEADER"
142143
label="表单内部门字段"
143-
prop="deptFieldOnForm"
144+
prop="formDept"
144145
>
145-
<el-select v-model="configForm.deptFieldOnForm" clearable style="width: 100%">
146+
<el-select v-model="configForm.formDept" clearable style="width: 100%">
146147
<el-option
147148
v-for="(item, idx) in deptFieldOnFormOptions"
148149
:key="idx"
149150
:label="item.title"
150151
:value="item.field"
152+
:disabled ="!item.required"
151153
/>
152154
</el-select>
153155
</el-form-item>
@@ -293,11 +295,11 @@ const { formType, fieldsPermissionConfig, formFieldOptions, getNodeConfigFormFie
293295
useFormFieldsPermission(FieldPermissionType.READ)
294296
// 表单内用户字段选项, 必须是必填和用户选择器
295297
const userFieldOnFormOptions = computed(() => {
296-
return formFieldOptions.filter((item) => item.required && item.type === 'UserSelect')
298+
return formFieldOptions.filter((item) => item.type === 'UserSelect')
297299
})
298300
// 表单内部门字段选项, 必须是必填和部门选择器
299301
const deptFieldOnFormOptions = computed(() => {
300-
return formFieldOptions.filter((item) => item.required && item.type === 'DeptSelect')
302+
return formFieldOptions.filter((item) => item.type === 'DeptSelect')
301303
})
302304
// 抄送人表单配置
303305
const formRef = ref() // 表单 Ref
@@ -309,8 +311,8 @@ const formRules = reactive({
309311
deptIds: [{ required: true, message: '部门不能为空', trigger: 'change' }],
310312
userGroups: [{ required: true, message: '用户组不能为空', trigger: 'change' }],
311313
postIds: [{ required: true, message: '岗位不能为空', trigger: 'change' }],
312-
userFieldOnForm: [{ required: true, message: '表单内用户字段不能为空', trigger: 'change' }],
313-
deptFieldOnForm: [{ required: true, message: '表单内部门字段不能为空', trigger: 'change' }],
314+
formUser: [{ required: true, message: '表单内用户字段不能为空', trigger: 'change' }],
315+
formDept: [{ required: true, message: '表单内部门字段不能为空', trigger: 'change' }],
314316
expression: [{ required: true, message: '流程表达式不能为空', trigger: 'blur' }]
315317
})
316318
@@ -338,7 +340,7 @@ const changeCandidateStrategy = () => {
338340
configForm.value.postIds = []
339341
configForm.value.userGroups = []
340342
configForm.value.deptLevel = 1
341-
configForm.value.userFieldOnForm = ''
343+
configForm.value.formUser = ''
342344
}
343345
// 保存配置
344346
const saveConfig = async () => {

src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -140,28 +140,30 @@
140140
<el-form-item
141141
v-if="configForm.candidateStrategy === CandidateStrategy.FORM_USER"
142142
label="表单内用户字段"
143-
prop="userFieldOnForm"
143+
prop="formUser"
144144
>
145-
<el-select v-model="configForm.userFieldOnForm" clearable style="width: 100%">
145+
<el-select v-model="configForm.formUser" clearable style="width: 100%">
146146
<el-option
147147
v-for="(item, idx) in userFieldOnFormOptions"
148148
:key="idx"
149149
:label="item.title"
150150
:value="item.field"
151+
:disabled ="!item.required"
151152
/>
152153
</el-select>
153154
</el-form-item>
154155
<el-form-item
155156
v-if="configForm.candidateStrategy === CandidateStrategy.FORM_DEPT_LEADER"
156157
label="表单内部门字段"
157-
prop="deptFieldOnForm"
158+
prop="formDept"
158159
>
159-
<el-select v-model="configForm.deptFieldOnForm" clearable style="width: 100%">
160+
<el-select v-model="configForm.formDept" clearable style="width: 100%">
160161
<el-option
161162
v-for="(item, idx) in deptFieldOnFormOptions"
162163
:key="idx"
163164
:label="item.title"
164165
:value="item.field"
166+
:disabled ="!item.required"
165167
/>
166168
</el-select>
167169
</el-form-item>
@@ -517,11 +519,11 @@ const { formType, fieldsPermissionConfig, formFieldOptions, getNodeConfigFormFie
517519
useFormFieldsPermission(FieldPermissionType.READ)
518520
// 表单内用户字段选项, 必须是必填和用户选择器
519521
const userFieldOnFormOptions = computed(() => {
520-
return formFieldOptions.filter((item) => item.required && item.type === 'UserSelect')
522+
return formFieldOptions.filter((item) => item.type === 'UserSelect')
521523
})
522524
// 表单内部门字段选项, 必须是必填和部门选择器
523525
const deptFieldOnFormOptions = computed(() => {
524-
return formFieldOptions.filter((item) => item.required && item.type === 'DeptSelect')
526+
return formFieldOptions.filter((item) => item.type === 'DeptSelect')
525527
})
526528
// 操作按钮设置
527529
const { buttonsSetting, btnDisplayNameEdit, changeBtnDisplayName, btnDisplayNameBlurEvent } =
@@ -536,8 +538,8 @@ const formRules = reactive({
536538
roleIds: [{ required: true, message: '角色不能为空', trigger: 'change' }],
537539
deptIds: [{ required: true, message: '部门不能为空', trigger: 'change' }],
538540
userGroups: [{ required: true, message: '用户组不能为空', trigger: 'change' }],
539-
userFieldOnForm: [{ required: true, message: '表单内用户字段不能为空', trigger: 'change' }],
540-
deptFieldOnForm: [{ required: true, message: '表单内部门字段不能为空', trigger: 'change' }],
541+
formUser: [{ required: true, message: '表单内用户字段不能为空', trigger: 'change' }],
542+
formDept: [{ required: true, message: '表单内部门字段不能为空', trigger: 'change' }],
541543
postIds: [{ required: true, message: '岗位不能为空', trigger: 'change' }],
542544
expression: [{ required: true, message: '流程表达式不能为空', trigger: 'blur' }],
543545
approveMethod: [{ required: true, message: '多人审批方式不能为空', trigger: 'change' }],
@@ -573,9 +575,8 @@ const changeCandidateStrategy = () => {
573575
configForm.value.postIds = []
574576
configForm.value.userGroups = []
575577
configForm.value.deptLevel = 1
576-
// TODO @jason:是不是 userFieldOnForm => formUser;deptFieldOnForm => formDeptLeader;原因是:想通前缀,好管理点
577-
configForm.value.userFieldOnForm = ''
578-
configForm.value.deptFieldOnForm = ''
578+
configForm.value.formUser = ''
579+
configForm.value.formDept = ''
579580
configForm.value.approveMethod = ApproveMethodType.SEQUENTIAL_APPROVE
580581
}
581582

0 commit comments

Comments
 (0)