Skip to content

Commit 158708c

Browse files
committed
Merge branch 'feature/bpm' of https://gitee.com/yudaocode/yudao-ui-admin-vue3 into feature/bpm
2 parents 6304a8e + 2fe28af commit 158708c

File tree

5 files changed

+278
-108
lines changed

5 files changed

+278
-108
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: 21 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,14 @@ export enum CandidateStrategy {
145145
* 指定用户组
146146
*/
147147
USER_GROUP = 40,
148+
/**
149+
* 表单内用户字段
150+
*/
151+
USER_FIELD_ON_FORM = 50,
152+
/**
153+
* 表单内部门负责人
154+
*/
155+
DEPT_LEADER_ON_FORM = 51,
148156
/**
149157
* 流程表达式
150158
*/
@@ -424,6 +432,8 @@ export const CANDIDATE_STRATEGY: DictDataVO[] = [
424432
{ label: '发起人部门负责人', value: CandidateStrategy.START_USER_DEPT_LEADER },
425433
{ label: '发起人连续部门负责人', value: CandidateStrategy.START_USER_MULTI_LEVEL_DEPT_LEADER },
426434
{ label: '用户组', value: CandidateStrategy.USER_GROUP },
435+
{ label: '表单内用户字段', value: CandidateStrategy.USER_FIELD_ON_FORM },
436+
{ label: '表单内部门负责人', value: CandidateStrategy.DEPT_LEADER_ON_FORM },
427437
{ label: '流程表达式', value: CandidateStrategy.EXPRESSION }
428438
]
429439
// 审批节点 的审批类型
@@ -548,3 +558,13 @@ export const MULTI_LEVEL_DEPT: DictDataVO = [
548558
{ label: '第 14 级部门', value: 14 },
549559
{ label: '第 15 级部门', value: 15 }
550560
]
561+
562+
/**
563+
* 流程实例的变量枚举
564+
*/
565+
export enum ProcessVariableEnum {
566+
/**
567+
* 发起用户 ID
568+
*/
569+
START_USER_ID = 'PROCESS_START_USER_ID'
570+
}

src/components/SimpleProcessDesignerV2/src/node.ts

Lines changed: 111 additions & 80 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,12 +28,67 @@ 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
*/
3389
export function useFormFieldsPermission(defaultPermission: FieldPermissionType) {
3490
// 字段权限配置. 需要有 field, title, permissioin 属性
35-
const fieldsPermissionConfig = ref<Array<Record<string, string>>>([])
91+
const fieldsPermissionConfig = ref<Array<Record<string, any>>>([])
3692

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

@@ -45,100 +101,37 @@ export function useFormFieldsPermission(defaultPermission: FieldPermissionType)
45101
}
46102
// 默认的表单权限: 获取表单的所有字段,设置字段默认权限为只读
47103
const getDefaultFieldsPermission = (formFields?: string[]) => {
48-
const defaultFieldsPermission: Array<Record<string, string>> = []
104+
let defaultFieldsPermission: Array<Record<string, any>> = []
49105
if (formFields) {
50-
formFields.forEach((fieldStr: string) => {
51-
parseFieldsSetDefaultPermission(JSON.parse(fieldStr), defaultFieldsPermission)
52-
})
106+
defaultFieldsPermission = parseFormCreateFields(formFields).map( item => {
107+
return {
108+
field: item.field,
109+
title: item.title,
110+
permission: defaultPermission
111+
}
112+
});
53113
}
54114
return defaultFieldsPermission
55115
}
56-
// 解析字段。赋给默认权限
57-
const parseFieldsSetDefaultPermission = (
58-
rule: Record<string, any>,
59-
fieldsPermission: Array<Record<string, string>>,
60-
parentTitle: string = ''
61-
) => {
62-
const { /**type,*/ field, title: tempTitle, children } = rule
63-
if (field && tempTitle) {
64-
let title = tempTitle
65-
if (parentTitle) {
66-
title = `${parentTitle}.${tempTitle}`
67-
}
68-
fieldsPermission.push({
69-
field,
70-
title,
71-
permission: defaultPermission
72-
})
73-
// TODO 子表单 需要处理子表单字段
74-
// if (type === 'group' && rule.props?.rule && Array.isArray(rule.props.rule)) {
75-
// // 解析子表单的字段
76-
// rule.props.rule.forEach((item) => {
77-
// parseFieldsSetDefaultPermission(item, fieldsPermission, title)
78-
// })
79-
// }
80-
}
81-
if (children && Array.isArray(children)) {
82-
children.forEach((rule) => {
83-
parseFieldsSetDefaultPermission(rule, fieldsPermission)
84-
})
85-
}
86-
}
116+
117+
118+
119+
// 获取表单的所有字段,作为下拉框选项
120+
const formFieldOptions = parseFormCreateFields(unref(formFields))
87121

88122
return {
89123
formType,
90124
fieldsPermissionConfig,
125+
formFieldOptions,
91126
getNodeConfigFormFields
92127
}
93128
}
94129
/**
95130
* @description 获取表单的字段
96131
*/
97132
export function useFormFields() {
98-
// 解析后的表单字段
99133
const formFields = inject<Ref<string[]>>('formFields') // 流程表单字段
100-
const parseFormFields = () => {
101-
const parsedFormFields: Array<Record<string, string>> = []
102-
if (formFields) {
103-
formFields.value.forEach((fieldStr: string) => {
104-
parseField(JSON.parse(fieldStr), parsedFormFields)
105-
})
106-
}
107-
return parsedFormFields
108-
}
109-
// 解析字段。
110-
const parseField = (
111-
rule: Record<string, any>,
112-
parsedFormFields: Array<Record<string, string>>,
113-
parentTitle: string = ''
114-
) => {
115-
const { field, title: tempTitle, children, type } = rule
116-
if (field && tempTitle) {
117-
let title = tempTitle
118-
if (parentTitle) {
119-
title = `${parentTitle}.${tempTitle}`
120-
}
121-
parsedFormFields.push({
122-
field,
123-
title,
124-
type
125-
})
126-
// TODO 子表单 需要处理子表单字段
127-
// if (type === 'group' && rule.props?.rule && Array.isArray(rule.props.rule)) {
128-
// // 解析子表单的字段
129-
// rule.props.rule.forEach((item) => {
130-
// parseFieldsSetDefaultPermission(item, fieldsPermission, title)
131-
// })
132-
// }
133-
}
134-
if (children && Array.isArray(children)) {
135-
children.forEach((rule) => {
136-
parseField(rule, parsedFormFields)
137-
})
138-
}
139-
}
140-
141-
return parseFormFields()
134+
return parseFormCreateFields(unref(formFields))
142135
}
143136

144137
export type UserTaskFormType = {
@@ -152,6 +145,8 @@ export type UserTaskFormType = {
152145
userGroups?: number[] // 用户组
153146
postIds?: number[] // 岗位
154147
expression?: string // 流程表达式
148+
userFieldOnForm?: string // 表单内用户字段
149+
deptFieldOnForm?: string // 表单内部门字段
155150
approveRatio?: number
156151
rejectHandlerType?: RejectHandlerType
157152
returnNodeId?: string
@@ -174,6 +169,8 @@ export type CopyTaskFormType = {
174169
userIds?: number[] // 用户
175170
userGroups?: number[] // 用户组
176171
postIds?: number[] // 岗位
172+
userFieldOnForm?: string // 表单内用户字段
173+
deptFieldOnForm?: string // 表单内部门字段
177174
expression?: string // 流程表达式
178175
}
179176

@@ -187,6 +184,7 @@ export function useNodeForm(nodeType: NodeType) {
187184
const deptOptions = inject<Ref<DeptApi.DeptVO[]>>('deptList') // 部门列表
188185
const userGroupOptions = inject<Ref<UserGroupApi.UserGroupVO[]>>('userGroupList') // 用户组列表
189186
const deptTreeOptions = inject('deptTree') // 部门树
187+
const formFields = inject<Ref<string[]>>('formFields') // 流程表单字段
190188
const configForm = ref<UserTaskFormType | CopyTaskFormType>()
191189
if (nodeType === NodeType.USER_TASK_NODE) {
192190
configForm.value = {
@@ -282,6 +280,18 @@ export function useNodeForm(nodeType: NodeType) {
282280
}
283281
}
284282

283+
// 表单内用户字段
284+
if (configForm.value?.candidateStrategy === CandidateStrategy.USER_FIELD_ON_FORM) {
285+
const formFieldOptions = parseFormCreateFields(unref(formFields))
286+
const item = formFieldOptions.find((item) => item.field === configForm.value?.userFieldOnForm)
287+
showText = `表单用户:${item?.title}`
288+
}
289+
290+
// 表单内部门负责人
291+
if (configForm.value?.candidateStrategy === CandidateStrategy.DEPT_LEADER_ON_FORM) {
292+
showText = `表单内部门负责人`
293+
}
294+
285295
// 发起人自选
286296
if (configForm.value?.candidateStrategy === CandidateStrategy.START_USER_SELECT) {
287297
showText = `发起人自选`
@@ -328,6 +338,9 @@ export function useNodeForm(nodeType: NodeType) {
328338
case CandidateStrategy.USER_GROUP:
329339
candidateParam = configForm.value.userGroups!.join(',')
330340
break
341+
case CandidateStrategy.USER_FIELD_ON_FORM:
342+
candidateParam = configForm.value.userFieldOnForm!
343+
break
331344
case CandidateStrategy.EXPRESSION:
332345
candidateParam = configForm.value.expression!
333346
break
@@ -347,6 +360,13 @@ export function useNodeForm(nodeType: NodeType) {
347360
candidateParam = deptIds.concat('|' + configForm.value.deptLevel + '')
348361
break
349362
}
363+
// 表单内部门的负责人
364+
case CandidateStrategy.DEPT_LEADER_ON_FORM: {
365+
// 候选人参数格式: | 分隔 。左边为表单内部门字段。 右边为部门层级
366+
const deptFieldOnForm = configForm.value.deptFieldOnForm!
367+
candidateParam = deptFieldOnForm.concat('|' + configForm.value.deptLevel + '')
368+
break
369+
}
350370
default:
351371
break
352372
}
@@ -376,6 +396,9 @@ export function useNodeForm(nodeType: NodeType) {
376396
case CandidateStrategy.USER_GROUP:
377397
configForm.value.userGroups = candidateParam.split(',').map((item) => +item)
378398
break
399+
case CandidateStrategy.USER_FIELD_ON_FORM:
400+
configForm.value.userFieldOnForm = candidateParam
401+
break
379402
case CandidateStrategy.EXPRESSION:
380403
configForm.value.expression = candidateParam
381404
break
@@ -396,6 +419,14 @@ export function useNodeForm(nodeType: NodeType) {
396419
configForm.value.deptLevel = +paramArray[1]
397420
break
398421
}
422+
// 表单内的部门负责人
423+
case CandidateStrategy.DEPT_LEADER_ON_FORM: {
424+
// 候选人参数格式: | 分隔 。左边为表单内的部门字段。 右边为部门层级
425+
const paramArray = candidateParam.split('|')
426+
configForm.value.deptFieldOnForm = paramArray[0]
427+
configForm.value.deptLevel = +paramArray[1]
428+
break
429+
}
399430
default:
400431
break
401432
}

0 commit comments

Comments
 (0)