Skip to content

Commit 8f7a75b

Browse files
committed
Merge branch 'feature/bpm' of https://github.com/GoldenZqqq/yudao-ui-admin-vue3 into feature/bpm
2 parents 29a0c69 + 24e1374 commit 8f7a75b

File tree

18 files changed

+450
-173
lines changed

18 files changed

+450
-173
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@
144144
"url": "https://gitee.com/yudaocode/yudao-ui-admin-vue3/issues"
145145
},
146146
"homepage": "https://gitee.com/yudaocode/yudao-ui-admin-vue3",
147+
"web-types": "./web-types.json",
147148
"engines": {
148149
"node": ">= 16.0.0",
149150
"pnpm": ">=8.6.0"

src/api/login/oauth2/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ export const authorize = (
2727
return request.post({
2828
url: '/system/oauth2/authorize',
2929
headers: {
30-
'Content-type': 'application/x-www-form-urlencoded'
30+
'Content-Type': 'application/x-www-form-urlencoded'
3131
},
3232
params: {
3333
response_type: responseType,

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

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

src/components/SimpleProcessDesignerV2/src/consts.ts

Lines changed: 22 additions & 2 deletions
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
// 审批任务拒绝处理
@@ -97,7 +97,7 @@ export interface SimpleFlowNode {
9797
// 是否默认的条件
9898
defaultFlow?: boolean
9999
// 活动的状态,用于前端节点状态展示
100-
activityStatus? : TaskStatusEnum
100+
activityStatus?: TaskStatusEnum
101101
}
102102
// 候选人策略枚举 ( 用于审批节点。抄送节点 )
103103
export enum CandidateStrategy {
@@ -145,6 +145,14 @@ export enum CandidateStrategy {
145145
* 指定用户组
146146
*/
147147
USER_GROUP = 40,
148+
/**
149+
* 表单内用户字段
150+
*/
151+
FORM_USER = 50,
152+
/**
153+
* 表单内部门负责人
154+
*/
155+
FORM_DEPT_LEADER = 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.FORM_USER },
436+
{ label: '表单内部门负责人', value: CandidateStrategy.FORM_DEPT_LEADER },
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: 116 additions & 86 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,68 @@ 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+
// 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+
3087
/**
3188
* @description 表单数据权限配置,用于发起人节点 、审批节点、抄送节点
3289
*/
3390
export function useFormFieldsPermission(defaultPermission: FieldPermissionType) {
3491
// 字段权限配置. 需要有 field, title, permissioin 属性
35-
const fieldsPermissionConfig = ref<Array<Record<string, string>>>([])
92+
const fieldsPermissionConfig = ref<Array<Record<string, any>>>([])
3693

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

@@ -45,100 +102,35 @@ export function useFormFieldsPermission(defaultPermission: FieldPermissionType)
45102
}
46103
// 默认的表单权限: 获取表单的所有字段,设置字段默认权限为只读
47104
const getDefaultFieldsPermission = (formFields?: string[]) => {
48-
const defaultFieldsPermission: Array<Record<string, string>> = []
105+
let defaultFieldsPermission: Array<Record<string, any>> = []
49106
if (formFields) {
50-
formFields.forEach((fieldStr: string) => {
51-
parseFieldsSetDefaultPermission(JSON.parse(fieldStr), defaultFieldsPermission)
107+
defaultFieldsPermission = parseFormCreateFields(formFields).map((item) => {
108+
return {
109+
field: item.field,
110+
title: item.title,
111+
permission: defaultPermission
112+
}
52113
})
53114
}
54115
return defaultFieldsPermission
55116
}
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-
}
117+
118+
// 获取表单的所有字段,作为下拉框选项
119+
const formFieldOptions = parseFormCreateFields(unref(formFields))
87120

88121
return {
89122
formType,
90123
fieldsPermissionConfig,
124+
formFieldOptions,
91125
getNodeConfigFormFields
92126
}
93127
}
94128
/**
95129
* @description 获取表单的字段
96130
*/
97131
export function useFormFields() {
98-
// 解析后的表单字段
99132
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()
133+
return parseFormCreateFields(unref(formFields))
142134
}
143135

144136
export type UserTaskFormType = {
@@ -152,6 +144,8 @@ export type UserTaskFormType = {
152144
userGroups?: number[] // 用户组
153145
postIds?: number[] // 岗位
154146
expression?: string // 流程表达式
147+
userFieldOnForm?: string // 表单内用户字段
148+
deptFieldOnForm?: string // 表单内部门字段
155149
approveRatio?: number
156150
rejectHandlerType?: RejectHandlerType
157151
returnNodeId?: string
@@ -174,6 +168,8 @@ export type CopyTaskFormType = {
174168
userIds?: number[] // 用户
175169
userGroups?: number[] // 用户组
176170
postIds?: number[] // 岗位
171+
userFieldOnForm?: string // 表单内用户字段
172+
deptFieldOnForm?: string // 表单内部门字段
177173
expression?: string // 流程表达式
178174
}
179175

@@ -187,6 +183,7 @@ export function useNodeForm(nodeType: NodeType) {
187183
const deptOptions = inject<Ref<DeptApi.DeptVO[]>>('deptList') // 部门列表
188184
const userGroupOptions = inject<Ref<UserGroupApi.UserGroupVO[]>>('userGroupList') // 用户组列表
189185
const deptTreeOptions = inject('deptTree') // 部门树
186+
const formFields = inject<Ref<string[]>>('formFields') // 流程表单字段
190187
const configForm = ref<UserTaskFormType | CopyTaskFormType>()
191188
if (nodeType === NodeType.USER_TASK_NODE) {
192189
configForm.value = {
@@ -282,6 +279,18 @@ export function useNodeForm(nodeType: NodeType) {
282279
}
283280
}
284281

282+
// 表单内用户字段
283+
if (configForm.value?.candidateStrategy === CandidateStrategy.FORM_USER) {
284+
const formFieldOptions = parseFormCreateFields(unref(formFields))
285+
const item = formFieldOptions.find((item) => item.field === configForm.value?.userFieldOnForm)
286+
showText = `表单用户:${item?.title}`
287+
}
288+
289+
// 表单内部门负责人
290+
if (configForm.value?.candidateStrategy === CandidateStrategy.FORM_DEPT_LEADER) {
291+
showText = `表单内部门负责人`
292+
}
293+
285294
// 发起人自选
286295
if (configForm.value?.candidateStrategy === CandidateStrategy.START_USER_SELECT) {
287296
showText = `发起人自选`
@@ -328,6 +337,9 @@ export function useNodeForm(nodeType: NodeType) {
328337
case CandidateStrategy.USER_GROUP:
329338
candidateParam = configForm.value.userGroups!.join(',')
330339
break
340+
case CandidateStrategy.FORM_USER:
341+
candidateParam = configForm.value.userFieldOnForm!
342+
break
331343
case CandidateStrategy.EXPRESSION:
332344
candidateParam = configForm.value.expression!
333345
break
@@ -347,6 +359,13 @@ export function useNodeForm(nodeType: NodeType) {
347359
candidateParam = deptIds.concat('|' + configForm.value.deptLevel + '')
348360
break
349361
}
362+
// 表单内部门的负责人
363+
case CandidateStrategy.FORM_DEPT_LEADER: {
364+
// 候选人参数格式: | 分隔 。左边为表单内部门字段。 右边为部门层级
365+
const deptFieldOnForm = configForm.value.deptFieldOnForm!
366+
candidateParam = deptFieldOnForm.concat('|' + configForm.value.deptLevel + '')
367+
break
368+
}
350369
default:
351370
break
352371
}
@@ -376,6 +395,9 @@ export function useNodeForm(nodeType: NodeType) {
376395
case CandidateStrategy.USER_GROUP:
377396
configForm.value.userGroups = candidateParam.split(',').map((item) => +item)
378397
break
398+
case CandidateStrategy.FORM_USER:
399+
configForm.value.userFieldOnForm = candidateParam
400+
break
379401
case CandidateStrategy.EXPRESSION:
380402
configForm.value.expression = candidateParam
381403
break
@@ -396,6 +418,14 @@ export function useNodeForm(nodeType: NodeType) {
396418
configForm.value.deptLevel = +paramArray[1]
397419
break
398420
}
421+
// 表单内的部门负责人
422+
case CandidateStrategy.FORM_DEPT_LEADER: {
423+
// 候选人参数格式: | 分隔 。左边为表单内的部门字段。 右边为部门层级
424+
const paramArray = candidateParam.split('|')
425+
configForm.value.deptFieldOnForm = paramArray[0]
426+
configForm.value.deptLevel = +paramArray[1]
427+
break
428+
}
399429
default:
400430
break
401431
}
@@ -481,22 +511,22 @@ export function useNodeName2(node: Ref<SimpleFlowNode>, nodeType: NodeType) {
481511
/**
482512
* @description 根据节点任务状态,获取节点任务状态样式
483513
*/
484-
export function useTaskStatusClass(taskStatus: TaskStatusEnum | undefined) : string {
514+
export function useTaskStatusClass(taskStatus: TaskStatusEnum | undefined): string {
485515
if (!taskStatus) {
486516
return ''
487517
}
488-
if (taskStatus === TaskStatusEnum.APPROVE ) {
518+
if (taskStatus === TaskStatusEnum.APPROVE) {
489519
return 'status-pass'
490520
}
491-
if (taskStatus === TaskStatusEnum.RUNNING ) {
521+
if (taskStatus === TaskStatusEnum.RUNNING) {
492522
return 'status-running'
493523
}
494-
if (taskStatus === TaskStatusEnum.REJECT ) {
524+
if (taskStatus === TaskStatusEnum.REJECT) {
495525
return 'status-reject'
496526
}
497-
if (taskStatus === TaskStatusEnum.CANCEL ) {
527+
if (taskStatus === TaskStatusEnum.CANCEL) {
498528
return 'status-cancel'
499529
}
500-
501-
return '';
530+
531+
return ''
502532
}

0 commit comments

Comments
 (0)