Skip to content

Commit 756addd

Browse files
committed
【功能优化】条件节点:条件增加发起人选项
1 parent 0924f50 commit 756addd

File tree

4 files changed

+85
-101
lines changed

4 files changed

+85
-101
lines changed

src/components/SimpleProcessDesignerV2/src/consts.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ export enum CandidateStrategy {
147147
USER_GROUP = 40,
148148

149149
/**
150-
* 表单内成员字段
150+
* 表单内用户字段
151151
*/
152152
USER_FIELD_ON_FORM = 50,
153153
/**
@@ -429,7 +429,7 @@ export const CANDIDATE_STRATEGY: DictDataVO[] = [
429429
{ label: '发起人部门负责人', value: CandidateStrategy.START_USER_DEPT_LEADER },
430430
{ label: '发起人连续部门负责人', value: CandidateStrategy.START_USER_MULTI_LEVEL_DEPT_LEADER },
431431
{ label: '用户组', value: CandidateStrategy.USER_GROUP },
432-
{ label: '表单内成员字段', value: CandidateStrategy.USER_FIELD_ON_FORM },
432+
{ label: '表单内用户字段', value: CandidateStrategy.USER_FIELD_ON_FORM },
433433
{ label: '流程表达式', value: CandidateStrategy.EXPRESSION }
434434
]
435435
// 审批节点 的审批类型
@@ -554,3 +554,13 @@ export const MULTI_LEVEL_DEPT: DictDataVO = [
554554
{ label: '第 14 级部门', value: 14 },
555555
{ label: '第 15 级部门', value: 15 }
556556
]
557+
558+
/**
559+
* 流程实例的变量枚举
560+
*/
561+
export enum ProcessVariableEnum {
562+
/**
563+
* 发起用户 ID
564+
*/
565+
START_USER_ID = 'PROCESS_START_USER_ID'
566+
}

src/components/SimpleProcessDesignerV2/src/node.ts

Lines changed: 67 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ import {
1414
NODE_DEFAULT_NAME,
1515
AssignStartUserHandlerType,
1616
AssignEmptyHandlerType,
17-
FieldPermissionType
17+
FieldPermissionType,
18+
ProcessVariableEnum
1819
} from './consts'
1920
export function useWatchNode(props: { flowNode: SimpleFlowNode }): Ref<SimpleFlowNode> {
2021
const node = ref<SimpleFlowNode>(props.flowNode)
@@ -27,6 +28,61 @@ export function useWatchNode(props: { flowNode: SimpleFlowNode }): Ref<SimpleFlo
2728
return node
2829
}
2930

31+
// 解析 formCreate 所有表单字段, 并返回
32+
const parseFormCreateFields = (formFields?: string[]) => {
33+
const result: Array<Record<string, any>> = []
34+
if (formFields) {
35+
formFields.forEach((fieldStr: string) => {
36+
parseFields(JSON.parse(fieldStr), result)
37+
})
38+
}
39+
// 固定添加发起人 ID 字段
40+
result.unshift( {
41+
field: ProcessVariableEnum.START_USER_ID,
42+
title: '发起人',
43+
type: 'UserSelect',
44+
required: true
45+
})
46+
return result
47+
}
48+
49+
const parseFields = (
50+
rule: Record<string, any>,
51+
fields: Array<Record<string, any>>,
52+
parentTitle: string = ''
53+
) => {
54+
const { type, field, $required, title: tempTitle, children } = rule
55+
if (field && tempTitle) {
56+
let title = tempTitle
57+
if (parentTitle) {
58+
title = `${parentTitle}.${tempTitle}`
59+
}
60+
let required = false;
61+
if($required) {
62+
required = true;
63+
}
64+
fields.push({
65+
field,
66+
title,
67+
type,
68+
required
69+
})
70+
// TODO 子表单 需要处理子表单字段
71+
// if (type === 'group' && rule.props?.rule && Array.isArray(rule.props.rule)) {
72+
// // 解析子表单的字段
73+
// rule.props.rule.forEach((item) => {
74+
// parseFields(item, fieldsPermission, title)
75+
// })
76+
// }
77+
}
78+
if (children && Array.isArray(children)) {
79+
children.forEach((rule) => {
80+
parseFields(rule, fields)
81+
})
82+
}
83+
}
84+
85+
3086
/**
3187
* @description 表单数据权限配置,用于发起人节点 、审批节点、抄送节点
3288
*/
@@ -57,51 +113,8 @@ export function useFormFieldsPermission(defaultPermission: FieldPermissionType)
57113
}
58114
return defaultFieldsPermission
59115
}
60-
// 解析 formCreate 所有表单字段, 并返回
61-
const parseFormCreateFields = (formFields?: string[]) => {
62-
const result: Array<Record<string, any>> = []
63-
if (formFields) {
64-
formFields.forEach((fieldStr: string) => {
65-
parseFields(JSON.parse(fieldStr), result)
66-
})
67-
}
68-
return result
69-
}
70-
const parseFields = (
71-
rule: Record<string, any>,
72-
fields: Array<Record<string, any>>,
73-
parentTitle: string = ''
74-
) => {
75-
const { type, field, $required, title: tempTitle, children } = rule
76-
if (field && tempTitle) {
77-
let title = tempTitle
78-
if (parentTitle) {
79-
title = `${parentTitle}.${tempTitle}`
80-
}
81-
let required = false;
82-
if($required) {
83-
required = true;
84-
}
85-
fields.push({
86-
field,
87-
title,
88-
type,
89-
required
90-
})
91-
// TODO 子表单 需要处理子表单字段
92-
// if (type === 'group' && rule.props?.rule && Array.isArray(rule.props.rule)) {
93-
// // 解析子表单的字段
94-
// rule.props.rule.forEach((item) => {
95-
// parseFields(item, fieldsPermission, title)
96-
// })
97-
// }
98-
}
99-
if (children && Array.isArray(children)) {
100-
children.forEach((rule) => {
101-
parseFields(rule, fields)
102-
})
103-
}
104-
}
116+
117+
105118

106119
// 获取表单的所有字段,作为下拉框选项
107120
const formFieldOptions = parseFormCreateFields(unref(formFields))
@@ -117,50 +130,8 @@ export function useFormFieldsPermission(defaultPermission: FieldPermissionType)
117130
* @description 获取表单的字段
118131
*/
119132
export function useFormFields() {
120-
// 解析后的表单字段
121133
const formFields = inject<Ref<string[]>>('formFields') // 流程表单字段
122-
const parseFormFields = () => {
123-
const parsedFormFields: Array<Record<string, string>> = []
124-
if (formFields) {
125-
formFields.value.forEach((fieldStr: string) => {
126-
parseField(JSON.parse(fieldStr), parsedFormFields)
127-
})
128-
}
129-
return parsedFormFields
130-
}
131-
// 解析字段。
132-
const parseField = (
133-
rule: Record<string, any>,
134-
parsedFormFields: Array<Record<string, string>>,
135-
parentTitle: string = ''
136-
) => {
137-
const { field, title: tempTitle, children, type } = rule
138-
if (field && tempTitle) {
139-
let title = tempTitle
140-
if (parentTitle) {
141-
title = `${parentTitle}.${tempTitle}`
142-
}
143-
parsedFormFields.push({
144-
field,
145-
title,
146-
type
147-
})
148-
// TODO 子表单 需要处理子表单字段
149-
// if (type === 'group' && rule.props?.rule && Array.isArray(rule.props.rule)) {
150-
// // 解析子表单的字段
151-
// rule.props.rule.forEach((item) => {
152-
// parseFieldsSetDefaultPermission(item, fieldsPermission, title)
153-
// })
154-
// }
155-
}
156-
if (children && Array.isArray(children)) {
157-
children.forEach((rule) => {
158-
parseField(rule, parsedFormFields)
159-
})
160-
}
161-
}
162-
163-
return parseFormFields()
134+
return parseFormCreateFields(unref(formFields))
164135
}
165136

166137
export type UserTaskFormType = {
@@ -174,7 +145,7 @@ export type UserTaskFormType = {
174145
userGroups?: number[] // 用户组
175146
postIds?: number[] // 岗位
176147
expression?: string // 流程表达式
177-
userFieldOnForm?: string // 表单内成员字段
148+
userFieldOnForm?: string // 表单内用户字段
178149
approveRatio?: number
179150
rejectHandlerType?: RejectHandlerType
180151
returnNodeId?: string
@@ -197,7 +168,7 @@ export type CopyTaskFormType = {
197168
userIds?: number[] // 用户
198169
userGroups?: number[] // 用户组
199170
postIds?: number[] // 岗位
200-
userFieldOnForm?: string // 表单内成员字段
171+
userFieldOnForm?: string // 表单内用户字段
201172
expression?: string // 流程表达式
202173
}
203174

@@ -211,6 +182,7 @@ export function useNodeForm(nodeType: NodeType) {
211182
const deptOptions = inject<Ref<DeptApi.DeptVO[]>>('deptList') // 部门列表
212183
const userGroupOptions = inject<Ref<UserGroupApi.UserGroupVO[]>>('userGroupList') // 用户组列表
213184
const deptTreeOptions = inject('deptTree') // 部门树
185+
const formFields = inject<Ref<string[]>>('formFields') // 流程表单字段
214186
const configForm = ref<UserTaskFormType | CopyTaskFormType>()
215187
if (nodeType === NodeType.USER_TASK_NODE) {
216188
configForm.value = {
@@ -306,9 +278,11 @@ export function useNodeForm(nodeType: NodeType) {
306278
}
307279
}
308280

309-
// 表单内成员字段
281+
// 表单内用户字段
310282
if (configForm.value?.candidateStrategy === CandidateStrategy.USER_FIELD_ON_FORM) {
311-
showText = `表单内用户字段`
283+
const formFieldOptions = parseFormCreateFields(unref(formFields))
284+
const item = formFieldOptions.find((item) => item.field === configForm.value?.userFieldOnForm)
285+
showText = `表单用户:${item?.title}`
312286
}
313287

314288
// 发起人自选

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@
124124
</el-form-item>
125125
<el-form-item
126126
v-if="configForm.candidateStrategy === CandidateStrategy.USER_FIELD_ON_FORM"
127-
label="表单内成员字段"
127+
label="表单内用户字段"
128128
prop="userFieldOnForm"
129129
>
130130
<el-select v-model="configForm.userFieldOnForm" clearable style="width: 100%">
@@ -246,7 +246,7 @@ const activeTabName = ref('user')
246246
const { formType, fieldsPermissionConfig, formFieldOptions, getNodeConfigFormFields } = useFormFieldsPermission(
247247
FieldPermissionType.READ
248248
)
249-
// 表单内成员字段选项, 必须是必填和用户选择器
249+
// 表单内用户字段选项, 必须是必填和用户选择器
250250
const userFieldOnFormOptions = computed(() => {
251251
return formFieldOptions.filter(
252252
(item) => item.required && item.type === 'UserSelect'
@@ -262,7 +262,7 @@ const formRules = reactive({
262262
deptIds: [{ required: true, message: '部门不能为空', trigger: 'change' }],
263263
userGroups: [{ required: true, message: '用户组不能为空', trigger: 'change' }],
264264
postIds: [{ required: true, message: '岗位不能为空', trigger: 'change' }],
265-
userFieldOnForm: [{ required: true, message: '表单内成员字段为空', trigger: 'change' }],
265+
userFieldOnForm: [{ required: true, message: '表单内用户字段不能为空', trigger: 'change' }],
266266
expression: [{ required: true, message: '流程表达式不能为空', trigger: 'blur' }]
267267
})
268268

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@
159159
</el-form-item>
160160
<el-form-item
161161
v-if="configForm.candidateStrategy === CandidateStrategy.USER_FIELD_ON_FORM"
162-
label="表单内成员字段"
162+
label="表单内用户字段"
163163
prop="userFieldOnForm"
164164
>
165165
<el-select v-model="configForm.userFieldOnForm" clearable style="width: 100%">
@@ -499,7 +499,7 @@ const activeTabName = ref('user')
499499
const { formType, fieldsPermissionConfig, formFieldOptions, getNodeConfigFormFields } = useFormFieldsPermission(
500500
FieldPermissionType.READ
501501
)
502-
// 表单内成员字段选项, 必须是必填和用户选择器
502+
// 表单内用户字段选项, 必须是必填和用户选择器
503503
const userFieldOnFormOptions = computed(() => {
504504
return formFieldOptions.filter(
505505
(item) => item.required && item.type === 'UserSelect'
@@ -518,7 +518,7 @@ const formRules = reactive({
518518
roleIds: [{ required: true, message: '角色不能为空', trigger: 'change' }],
519519
deptIds: [{ required: true, message: '部门不能为空', trigger: 'change' }],
520520
userGroups: [{ required: true, message: '用户组不能为空', trigger: 'change' }],
521-
userFieldOnForm: [{ required: true, message: '表单内成员字段为空', trigger: 'change' }],
521+
userFieldOnForm: [{ required: true, message: '表单内用户字段不能为空', trigger: 'change' }],
522522
postIds: [{ required: true, message: '岗位不能为空', trigger: 'change' }],
523523
expression: [{ required: true, message: '流程表达式不能为空', trigger: 'blur' }],
524524
approveMethod: [{ required: true, message: '多人审批方式不能为空', trigger: 'change' }],

0 commit comments

Comments
 (0)