Skip to content

Commit e8e357b

Browse files
YunaiVgitee-org
authored andcommitted
!659 BPM:签名功能完善
Merge pull request !659 from Lesan/feature/bpm-n
2 parents 8e5271a + 9308ece commit e8e357b

File tree

11 files changed

+352
-296
lines changed

11 files changed

+352
-296
lines changed

src/api/bpm/processInstance/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ export type ApprovalTaskInfo = {
3636
assigneeUser: User
3737
status: number
3838
reason: string
39-
sign: string // TODO @lesan:字段改成 signPicUrl 签名照片。只有 sign 感觉是签名文本哈。
39+
signPicUrl: string
4040
}
4141

4242
// 审批节点信息

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

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -86,15 +86,15 @@ const currentNode = useWatchNode(props)
8686
// 节点名称
8787
const { nodeName, showInput, clickIcon, blurEvent } = useNodeName(NodeType.ROUTER_BRANCH_NODE)
8888
const routerGroups = ref<RouterCondition[]>([])
89-
const nodeOptions = ref()
89+
const nodeOptions = ref<any>([])
9090
const conditionRef = ref([])
9191
9292
/** 保存配置 */
9393
const saveConfig = async () => {
9494
// 校验表单
9595
let valid = true
9696
for (const item of conditionRef.value) {
97-
if (!(await item.validate())) {
97+
if (item && !(await item.validate())) {
9898
valid = false
9999
}
100100
}
@@ -109,7 +109,7 @@ const saveConfig = async () => {
109109
}
110110
// 显示路由分支节点配置, 由父组件传过来
111111
const showRouteNodeConfig = (node: SimpleFlowNode) => {
112-
getRouterNode()
112+
getRouterNode(processNodeTree?.value)
113113
routerGroups.value = []
114114
nodeName.value = node.name
115115
if (node.routerGroups) {
@@ -172,15 +172,14 @@ const deleteRouterGroup = (index: number) => {
172172
routerGroups.value.splice(index, 1)
173173
}
174174
175-
const getRouterNode = () => {
176-
// TODO @lesan 还需要满足以下要求
175+
// 递归获取所有节点
176+
const getRouterNode = (node) => {
177+
// TODO 最好还需要满足以下要求
177178
// 并行分支、包容分支内部节点不能跳转到外部节点
178179
// 条件分支节点可以向上跳转到外部节点
179-
let node = processNodeTree?.value
180-
nodeOptions.value = []
181180
while (true) {
182181
if (!node) break
183-
if (node.type !== NodeType.ROUTER_BRANCH_NODE) {
182+
if (node.type !== NodeType.ROUTER_BRANCH_NODE && node.type !== NodeType.CONDITION_NODE) {
184183
nodeOptions.value.push({
185184
label: node.name,
186185
value: node.id
@@ -189,6 +188,11 @@ const getRouterNode = () => {
189188
if (!node.childNode || node.type === NodeType.END_EVENT_NODE) {
190189
break
191190
}
191+
if (node.conditionNodes && node.conditionNodes.length) {
192+
node.conditionNodes.forEach((item) => {
193+
getRouterNode(item)
194+
})
195+
}
192196
node = node.childNode
193197
}
194198
}

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

Lines changed: 6 additions & 242 deletions
Original file line numberDiff line numberDiff line change
@@ -440,217 +440,8 @@
440440
</div>
441441
</div>
442442
</el-tab-pane>
443-
<!-- TODO @lesan:要不抽成 Listener 小组件?类似 Condition.vue -->
444443
<el-tab-pane label="监听器" name="listener">
445-
<el-form ref="listenerFormRef" :model="configForm" label-position="top">
446-
<div v-for="(listener, listenerIdx) in taskListener" :key="listenerIdx">
447-
<el-divider content-position="left">
448-
<el-text tag="b" size="large">{{ listener.name }}</el-text>
449-
</el-divider>
450-
<el-form-item>
451-
<el-switch
452-
v-model="configForm[`task${listener.type}ListenerEnable`]"
453-
active-text="开启"
454-
inactive-text="关闭"
455-
/>
456-
</el-form-item>
457-
<div v-if="configForm[`task${listener.type}ListenerEnable`]">
458-
<el-form-item>
459-
<el-alert
460-
title="仅支持 POST 请求,以请求体方式接收参数"
461-
type="warning"
462-
show-icon
463-
:closable="false"
464-
/>
465-
</el-form-item>
466-
<el-form-item
467-
label="请求地址"
468-
:prop="`task${listener.type}ListenerPath`"
469-
:rules="{
470-
required: true,
471-
message: '请求地址不能为空',
472-
trigger: 'blur'
473-
}"
474-
>
475-
<el-input v-model="configForm[`task${listener.type}ListenerPath`]" />
476-
</el-form-item>
477-
<el-form-item label="请求头">
478-
<div
479-
class="flex pt-2"
480-
v-for="(item, index) in configForm[`task${listener.type}ListenerHeader`]"
481-
:key="index"
482-
>
483-
<div class="mr-2">
484-
<el-form-item
485-
:prop="`task${listener.type}ListenerHeader.${index}.key`"
486-
:rules="{
487-
required: true,
488-
message: '参数名不能为空',
489-
trigger: 'blur'
490-
}"
491-
>
492-
<el-input class="w-160px" v-model="item.key" />
493-
</el-form-item>
494-
</div>
495-
<div class="mr-2">
496-
<el-select class="w-100px!" v-model="item.type">
497-
<el-option
498-
v-for="types in LISTENER_MAP_TYPES"
499-
:key="types.value"
500-
:label="types.label"
501-
:value="types.value"
502-
/>
503-
</el-select>
504-
</div>
505-
<div class="mr-2">
506-
<el-form-item
507-
:prop="`task${listener.type}ListenerHeader.${index}.value`"
508-
:rules="{
509-
required: true,
510-
message: '参数值不能为空',
511-
trigger: 'blur'
512-
}"
513-
>
514-
<el-input
515-
v-if="item.type === ListenerParamTypeEnum.FIXED_VALUE"
516-
class="w-160px"
517-
v-model="item.value"
518-
/>
519-
</el-form-item>
520-
<el-form-item
521-
:prop="`task${listener.type}ListenerHeader.${index}.value`"
522-
:rules="{
523-
required: true,
524-
message: '参数值不能为空',
525-
trigger: 'change'
526-
}"
527-
>
528-
<el-select
529-
v-if="item.type === ListenerParamTypeEnum.FROM_FORM"
530-
class="w-160px!"
531-
v-model="item.value"
532-
>
533-
<el-option
534-
v-for="(field, fIdx) in formFieldOptions"
535-
:key="fIdx"
536-
:label="field.title"
537-
:value="field.field"
538-
:disabled="!field.required"
539-
/>
540-
</el-select>
541-
</el-form-item>
542-
</div>
543-
<div class="mr-1 flex items-center">
544-
<Icon
545-
icon="ep:delete"
546-
:size="18"
547-
@click="
548-
deleteTaskListenerParam(
549-
configForm[`task${listener.type}ListenerHeader`],
550-
index
551-
)
552-
"
553-
/>
554-
</div>
555-
</div>
556-
<el-button
557-
type="primary"
558-
text
559-
@click="addTaskListenerParam(configForm[`task${listener.type}ListenerHeader`])"
560-
>
561-
<Icon icon="ep:plus" class="mr-5px" />添加一行
562-
</el-button>
563-
</el-form-item>
564-
<el-form-item label="请求体">
565-
<div
566-
class="flex pt-2"
567-
v-for="(item, index) in configForm[`task${listener.type}ListenerBody`]"
568-
:key="index"
569-
>
570-
<div class="mr-2">
571-
<el-form-item
572-
:prop="`task${listener.type}ListenerBody.${index}.key`"
573-
:rules="{
574-
required: true,
575-
message: '参数名不能为空',
576-
trigger: 'blur'
577-
}"
578-
>
579-
<el-input class="w-160px" v-model="item.key" />
580-
</el-form-item>
581-
</div>
582-
<div class="mr-2">
583-
<el-select class="w-100px!" v-model="item.type">
584-
<el-option
585-
v-for="types in LISTENER_MAP_TYPES"
586-
:key="types.value"
587-
:label="types.label"
588-
:value="types.value"
589-
/>
590-
</el-select>
591-
</div>
592-
<div class="mr-2">
593-
<el-form-item
594-
:prop="`task${listener.type}ListenerBody.${index}.value`"
595-
:rules="{
596-
required: true,
597-
message: '参数值不能为空',
598-
trigger: 'blur'
599-
}"
600-
>
601-
<el-input
602-
v-if="item.type === ListenerParamTypeEnum.FIXED_VALUE"
603-
class="w-160px"
604-
v-model="item.value"
605-
/>
606-
</el-form-item>
607-
<el-form-item
608-
:prop="`task${listener.type}ListenerBody.${index}.value`"
609-
:rules="{
610-
required: true,
611-
message: '参数值不能为空',
612-
trigger: 'change'
613-
}"
614-
>
615-
<el-select
616-
v-if="item.type === ListenerParamTypeEnum.FROM_FORM"
617-
class="w-160px!"
618-
v-model="item.value"
619-
>
620-
<el-option
621-
v-for="(field, fIdx) in formFieldOptions"
622-
:key="fIdx"
623-
:label="field.title"
624-
:value="field.field"
625-
:disabled="!field.required"
626-
/>
627-
</el-select>
628-
</el-form-item>
629-
</div>
630-
<div class="mr-1 flex items-center">
631-
<Icon
632-
icon="ep:delete"
633-
:size="18"
634-
@click="
635-
deleteTaskListenerParam(
636-
configForm[`task${listener.type}ListenerBody`],
637-
index
638-
)
639-
"
640-
/>
641-
</div>
642-
</div>
643-
<el-button
644-
type="primary"
645-
text
646-
@click="addTaskListenerParam(configForm[`task${listener.type}ListenerBody`])"
647-
>
648-
<Icon icon="ep:plus" class="mr-5px" />添加一行
649-
</el-button>
650-
</el-form-item>
651-
</div>
652-
</div>
653-
</el-form>
444+
<UserTaskListener ref="userTaskListenerRef" v-model="configForm" :form-field-options="formFieldOptions" />
654445
</el-tab-pane>
655446
</el-tabs>
656447
<template #footer>
@@ -687,9 +478,7 @@ import {
687478
ASSIGN_EMPTY_HANDLER_TYPES,
688479
AssignEmptyHandlerType,
689480
FieldPermissionType,
690-
ProcessVariableEnum,
691-
LISTENER_MAP_TYPES,
692-
ListenerParamTypeEnum
481+
ProcessVariableEnum
693482
} from '../consts'
694483
695484
import {
@@ -703,6 +492,7 @@ import {
703492
import { defaultProps } from '@/utils/tree'
704493
import { cloneDeep } from 'lodash-es'
705494
import { convertTimeUnit, getApproveTypeText } from '../utils'
495+
import UserTaskListener from './components/UserTaskListener.vue'
706496
defineOptions({
707497
name: 'UserTaskNodeConfig'
708498
})
@@ -780,21 +570,6 @@ const formRules = reactive({
780570
assignEmptyHandlerUserIds: [{ required: true, message: '用户不能为空', trigger: 'change' }],
781571
assignStartUserHandlerType: [{ required: true }]
782572
})
783-
// 监听器数组
784-
const taskListener = ref([
785-
{
786-
name: '创建任务',
787-
type: 'Create'
788-
},
789-
{
790-
name: '指派任务执行人员',
791-
type: 'Assign'
792-
},
793-
{
794-
name: '完成任务',
795-
type: 'Complete'
796-
}
797-
])
798573
799574
const {
800575
configForm: tempConfigForm,
@@ -843,7 +618,7 @@ const {
843618
cTimeoutMaxRemindCount
844619
} = useTimeoutHandler()
845620
846-
const listenerFormRef = ref()
621+
const userTaskListenerRef = ref()
847622
848623
// 保存配置
849624
const saveConfig = async () => {
@@ -860,8 +635,8 @@ const saveConfig = async () => {
860635
}
861636
862637
if (!formRef) return false
863-
if (!listenerFormRef) return false
864-
const valid = (await formRef.value.validate()) && (await listenerFormRef.value.validate())
638+
if (!userTaskListenerRef) return false
639+
const valid = (await formRef.value.validate()) && (await userTaskListenerRef.value.validate())
865640
if (!valid) return false
866641
const showText = getShowText()
867642
if (!showText) return false
@@ -1104,17 +879,6 @@ function useTimeoutHandler() {
1104879
cTimeoutMaxRemindCount
1105880
}
1106881
}
1107-
1108-
const addTaskListenerParam = (arr) => {
1109-
arr.push({
1110-
key: '',
1111-
type: 1,
1112-
value: ''
1113-
})
1114-
}
1115-
const deleteTaskListenerParam = (arr, index) => {
1116-
arr.splice(index, 1)
1117-
}
1118882
</script>
1119883

1120884
<style lang="scss" scoped>

0 commit comments

Comments
 (0)