Skip to content

Commit 67769c2

Browse files
committed
【功能新增】候选人策略:新增表单内成员字段
1 parent 8f32dce commit 67769c2

File tree

5 files changed

+101
-17
lines changed

5 files changed

+101
-17
lines changed

src/components/FormCreate/src/components/useApiSelect.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ export const useApiSelect = (option: ApiSelectProps) => {
185185
</el-select>
186186
)
187187
}
188-
debugger
188+
// debugger
189189
return (
190190
<el-select
191191
class="w-1/1"

src/components/SimpleProcessDesignerV2/src/consts.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ export interface SimpleFlowNode {
7979
// 审批按钮设置
8080
buttonsSetting?: any[]
8181
// 表单权限
82-
fieldsPermission?: Array<Record<string, string>>
82+
fieldsPermission?: Array<Record<string, any>>
8383
// 审批任务超时处理
8484
timeoutHandler?: TimeoutHandler
8585
// 审批任务拒绝处理
@@ -145,6 +145,11 @@ export enum CandidateStrategy {
145145
* 指定用户组
146146
*/
147147
USER_GROUP = 40,
148+
149+
/**
150+
* 表单内成员字段
151+
*/
152+
USER_FIELD_ON_FORM = 50,
148153
/**
149154
* 流程表达式
150155
*/
@@ -424,6 +429,7 @@ export const CANDIDATE_STRATEGY: DictDataVO[] = [
424429
{ label: '发起人部门负责人', value: CandidateStrategy.START_USER_DEPT_LEADER },
425430
{ label: '发起人连续部门负责人', value: CandidateStrategy.START_USER_MULTI_LEVEL_DEPT_LEADER },
426431
{ label: '用户组', value: CandidateStrategy.USER_GROUP },
432+
{ label: '表单内成员字段', value: CandidateStrategy.USER_FIELD_ON_FORM },
427433
{ label: '流程表达式', value: CandidateStrategy.EXPRESSION }
428434
]
429435
// 审批节点 的审批类型

src/components/SimpleProcessDesignerV2/src/node.ts

Lines changed: 47 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ export function useWatchNode(props: { flowNode: SimpleFlowNode }): Ref<SimpleFlo
3232
*/
3333
export function useFormFieldsPermission(defaultPermission: FieldPermissionType) {
3434
// 字段权限配置. 需要有 field, title, permissioin 属性
35-
const fieldsPermissionConfig = ref<Array<Record<string, string>>>([])
35+
const fieldsPermissionConfig = ref<Array<Record<string, any>>>([])
3636

3737
const formType = inject<Ref<number>>('formType') // 表单类型
3838

@@ -45,49 +45,71 @@ export function useFormFieldsPermission(defaultPermission: FieldPermissionType)
4545
}
4646
// 默认的表单权限: 获取表单的所有字段,设置字段默认权限为只读
4747
const getDefaultFieldsPermission = (formFields?: string[]) => {
48-
const defaultFieldsPermission: Array<Record<string, string>> = []
48+
let defaultFieldsPermission: Array<Record<string, any>> = []
49+
if (formFields) {
50+
defaultFieldsPermission = parseFormCreateFields(formFields).map( item => {
51+
return {
52+
field: item.field,
53+
title: item.title,
54+
permission: defaultPermission
55+
}
56+
});
57+
}
58+
return defaultFieldsPermission
59+
}
60+
// 解析 formCreate 所有表单字段, 并返回
61+
const parseFormCreateFields = (formFields?: string[]) => {
62+
const result: Array<Record<string, any>> = []
4963
if (formFields) {
5064
formFields.forEach((fieldStr: string) => {
51-
parseFieldsSetDefaultPermission(JSON.parse(fieldStr), defaultFieldsPermission)
65+
parseFields(JSON.parse(fieldStr), result)
5266
})
5367
}
54-
return defaultFieldsPermission
68+
return result
5569
}
56-
// 解析字段。赋给默认权限
57-
const parseFieldsSetDefaultPermission = (
70+
const parseFields = (
5871
rule: Record<string, any>,
59-
fieldsPermission: Array<Record<string, string>>,
72+
fields: Array<Record<string, any>>,
6073
parentTitle: string = ''
6174
) => {
62-
const { /**type,*/ field, title: tempTitle, children } = rule
75+
const { type, field, $required, title: tempTitle, children } = rule
6376
if (field && tempTitle) {
6477
let title = tempTitle
6578
if (parentTitle) {
6679
title = `${parentTitle}.${tempTitle}`
6780
}
68-
fieldsPermission.push({
81+
let required = false;
82+
if($required) {
83+
required = true;
84+
}
85+
fields.push({
6986
field,
7087
title,
71-
permission: defaultPermission
88+
type,
89+
required
7290
})
7391
// TODO 子表单 需要处理子表单字段
7492
// if (type === 'group' && rule.props?.rule && Array.isArray(rule.props.rule)) {
7593
// // 解析子表单的字段
7694
// rule.props.rule.forEach((item) => {
77-
// parseFieldsSetDefaultPermission(item, fieldsPermission, title)
95+
// parseFields(item, fieldsPermission, title)
7896
// })
7997
// }
8098
}
8199
if (children && Array.isArray(children)) {
82100
children.forEach((rule) => {
83-
parseFieldsSetDefaultPermission(rule, fieldsPermission)
101+
parseFields(rule, fields)
84102
})
85103
}
86104
}
105+
106+
// 获取表单的所有字段,作为下拉框选项
107+
const formFieldOptions = parseFormCreateFields(unref(formFields))
87108

88109
return {
89110
formType,
90111
fieldsPermissionConfig,
112+
formFieldOptions,
91113
getNodeConfigFormFields
92114
}
93115
}
@@ -152,6 +174,7 @@ export type UserTaskFormType = {
152174
userGroups?: number[] // 用户组
153175
postIds?: number[] // 岗位
154176
expression?: string // 流程表达式
177+
userFieldOnForm?: string // 表单内成员字段
155178
approveRatio?: number
156179
rejectHandlerType?: RejectHandlerType
157180
returnNodeId?: string
@@ -174,6 +197,7 @@ export type CopyTaskFormType = {
174197
userIds?: number[] // 用户
175198
userGroups?: number[] // 用户组
176199
postIds?: number[] // 岗位
200+
userFieldOnForm?: string // 表单内成员字段
177201
expression?: string // 流程表达式
178202
}
179203

@@ -282,6 +306,11 @@ export function useNodeForm(nodeType: NodeType) {
282306
}
283307
}
284308

309+
// 表单内成员字段
310+
if (configForm.value?.candidateStrategy === CandidateStrategy.USER_FIELD_ON_FORM) {
311+
showText = `表单内用户字段`
312+
}
313+
285314
// 发起人自选
286315
if (configForm.value?.candidateStrategy === CandidateStrategy.START_USER_SELECT) {
287316
showText = `发起人自选`
@@ -328,6 +357,9 @@ export function useNodeForm(nodeType: NodeType) {
328357
case CandidateStrategy.USER_GROUP:
329358
candidateParam = configForm.value.userGroups!.join(',')
330359
break
360+
case CandidateStrategy.USER_FIELD_ON_FORM:
361+
candidateParam = configForm.value.userFieldOnForm!
362+
break
331363
case CandidateStrategy.EXPRESSION:
332364
candidateParam = configForm.value.expression!
333365
break
@@ -376,6 +408,9 @@ export function useNodeForm(nodeType: NodeType) {
376408
case CandidateStrategy.USER_GROUP:
377409
configForm.value.userGroups = candidateParam.split(',').map((item) => +item)
378410
break
411+
case CandidateStrategy.USER_FIELD_ON_FORM:
412+
configForm.value.userFieldOnForm = candidateParam
413+
break
379414
case CandidateStrategy.EXPRESSION:
380415
configForm.value.expression = candidateParam
381416
break

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

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,20 @@
122122
/>
123123
</el-select>
124124
</el-form-item>
125-
125+
<el-form-item
126+
v-if="configForm.candidateStrategy === CandidateStrategy.USER_FIELD_ON_FORM"
127+
label="表单内成员字段"
128+
prop="userFieldOnForm"
129+
>
130+
<el-select v-model="configForm.userFieldOnForm" clearable style="width: 100%">
131+
<el-option
132+
v-for="(item,idx) in userFieldOnFormOptions"
133+
:key="idx"
134+
:label="item.title"
135+
:value="item.field"
136+
/>
137+
</el-select>
138+
</el-form-item>
126139
<el-form-item
127140
v-if="configForm.candidateStrategy === CandidateStrategy.EXPRESSION"
128141
label="流程表达式"
@@ -230,9 +243,15 @@ const { nodeName, showInput, clickIcon, blurEvent } = useNodeName(NodeType.COPY_
230243
// 激活的 Tab 标签页
231244
const activeTabName = ref('user')
232245
// 表单字段权限配置
233-
const { formType, fieldsPermissionConfig, getNodeConfigFormFields } = useFormFieldsPermission(
246+
const { formType, fieldsPermissionConfig, formFieldOptions, getNodeConfigFormFields } = useFormFieldsPermission(
234247
FieldPermissionType.READ
235248
)
249+
// 表单内成员字段选项, 必须是必填和用户选择器
250+
const userFieldOnFormOptions = computed(() => {
251+
return formFieldOptions.filter(
252+
(item) => item.required && item.type === 'UserSelect'
253+
)
254+
})
236255
// 抄送人表单配置
237256
const formRef = ref() // 表单 Ref
238257
// 表单校验规则
@@ -243,6 +262,7 @@ const formRules = reactive({
243262
deptIds: [{ required: true, message: '部门不能为空', trigger: 'change' }],
244263
userGroups: [{ required: true, message: '用户组不能为空', trigger: 'change' }],
245264
postIds: [{ required: true, message: '岗位不能为空', trigger: 'change' }],
265+
userFieldOnForm: [{ required: true, message: '表单内成员字段为空', trigger: 'change' }],
246266
expression: [{ required: true, message: '流程表达式不能为空', trigger: 'blur' }]
247267
})
248268
@@ -272,6 +292,7 @@ const changeCandidateStrategy = () => {
272292
configForm.value.postIds = []
273293
configForm.value.userGroups = []
274294
configForm.value.deptLevel = 1
295+
configForm.value.userFieldOnForm = ''
275296
}
276297
// 保存配置
277298
const saveConfig = async () => {

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

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,20 @@
157157
/>
158158
</el-select>
159159
</el-form-item>
160+
<el-form-item
161+
v-if="configForm.candidateStrategy === CandidateStrategy.USER_FIELD_ON_FORM"
162+
label="表单内成员字段"
163+
prop="userFieldOnForm"
164+
>
165+
<el-select v-model="configForm.userFieldOnForm" clearable style="width: 100%">
166+
<el-option
167+
v-for="(item,idx) in userFieldOnFormOptions"
168+
:key="idx"
169+
:label="item.title"
170+
:value="item.field"
171+
/>
172+
</el-select>
173+
</el-form-item>
160174
<!-- TODO @jason:后续要支持选择已经存好的表达式 -->
161175
<el-form-item
162176
v-if="configForm.candidateStrategy === CandidateStrategy.EXPRESSION"
@@ -482,9 +496,15 @@ const { nodeName, showInput, clickIcon, blurEvent } = useNodeName(NodeType.USER_
482496
// 激活的 Tab 标签页
483497
const activeTabName = ref('user')
484498
// 表单字段权限设置
485-
const { formType, fieldsPermissionConfig, getNodeConfigFormFields } = useFormFieldsPermission(
499+
const { formType, fieldsPermissionConfig, formFieldOptions, getNodeConfigFormFields } = useFormFieldsPermission(
486500
FieldPermissionType.READ
487501
)
502+
// 表单内成员字段选项, 必须是必填和用户选择器
503+
const userFieldOnFormOptions = computed(() => {
504+
return formFieldOptions.filter(
505+
(item) => item.required && item.type === 'UserSelect'
506+
)
507+
})
488508
// 操作按钮设置
489509
const { buttonsSetting, btnDisplayNameEdit, changeBtnDisplayName, btnDisplayNameBlurEvent } =
490510
useButtonsSetting()
@@ -498,6 +518,7 @@ const formRules = reactive({
498518
roleIds: [{ required: true, message: '角色不能为空', trigger: 'change' }],
499519
deptIds: [{ required: true, message: '部门不能为空', trigger: 'change' }],
500520
userGroups: [{ required: true, message: '用户组不能为空', trigger: 'change' }],
521+
userFieldOnForm: [{ required: true, message: '表单内成员字段为空', trigger: 'change' }],
501522
postIds: [{ required: true, message: '岗位不能为空', trigger: 'change' }],
502523
expression: [{ required: true, message: '流程表达式不能为空', trigger: 'blur' }],
503524
approveMethod: [{ required: true, message: '多人审批方式不能为空', trigger: 'change' }],
@@ -533,6 +554,7 @@ const changeCandidateStrategy = () => {
533554
configForm.value.postIds = []
534555
configForm.value.userGroups = []
535556
configForm.value.deptLevel = 1
557+
configForm.value.userFieldOnForm = ''
536558
configForm.value.approveMethod = ApproveMethodType.SEQUENTIAL_APPROVE
537559
}
538560

0 commit comments

Comments
 (0)