From d7e6523dadb931cda5f3919a6dbcbae993f088e2 Mon Sep 17 00:00:00 2001
From: jason <2667446@qq.com>
Date: Sat, 4 Jan 2025 15:24:38 +0800
Subject: [PATCH 01/86] =?UTF-8?q?=E3=80=90=E5=8A=9F=E8=83=BD=E4=BC=98?=
=?UTF-8?q?=E5=8C=96=E3=80=91=E5=BB=B6=E8=BF=9F=E5=99=A8=E8=8A=82=E7=82=B9?=
=?UTF-8?q?=E7=9A=84=E9=AB=98=E4=BA=AE=E6=98=BE=E7=A4=BA?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../detail/ProcessInstanceSimpleViewer.vue | 22 ++++++++++++-------
1 file changed, 14 insertions(+), 8 deletions(-)
diff --git a/src/views/bpm/processInstance/detail/ProcessInstanceSimpleViewer.vue b/src/views/bpm/processInstance/detail/ProcessInstanceSimpleViewer.vue
index 0808bec9..0017d3fe 100644
--- a/src/views/bpm/processInstance/detail/ProcessInstanceSimpleViewer.vue
+++ b/src/views/bpm/processInstance/detail/ProcessInstanceSimpleViewer.vue
@@ -82,7 +82,6 @@ const setSimpleModelNodeTaskStatus = (
}
return
}
-
// 审批节点
if (
simpleModel.type === NodeType.START_USER_NODE ||
@@ -98,26 +97,33 @@ const setSimpleModelNodeTaskStatus = (
}
// TODO 是不是还缺一个 cancel 的状态
}
-
// 抄送节点
if (simpleModel.type === NodeType.COPY_TASK_NODE) {
- // 抄送节点 只有通过和未执行状态
+ // 抄送节点,只有通过和未执行状态
if (finishedActivityIds.includes(simpleModel.id)) {
simpleModel.activityStatus = TaskStatusEnum.APPROVE
} else {
simpleModel.activityStatus = TaskStatusEnum.NOT_START
}
}
- // 条件节点 对应 SequenceFlow
+ // 延迟器节点
+ if (simpleModel.type === NodeType.DELAY_TIMER_NODE) {
+ // 延迟器节点,只有通过和未执行状态
+ if (finishedActivityIds.includes(simpleModel.id)) {
+ simpleModel.activityStatus = TaskStatusEnum.APPROVE
+ } else {
+ simpleModel.activityStatus = TaskStatusEnum.NOT_START
+ }
+ }
+ // 条件节点对应 SequenceFlow
if (simpleModel.type === NodeType.CONDITION_NODE) {
- // 条件节点。只有通过和未执行状态
+ // 条件节点,只有通过和未执行状态
if (finishedSequenceFlowActivityIds.includes(simpleModel.id)) {
simpleModel.activityStatus = TaskStatusEnum.APPROVE
} else {
simpleModel.activityStatus = TaskStatusEnum.NOT_START
}
}
-
// 网关节点
if (
simpleModel.type === NodeType.CONDITION_BRANCH_NODE ||
@@ -155,13 +161,13 @@ const setSimpleModelNodeTaskStatus = (
diff --git a/src/components/SimpleProcessDesignerV2/src/nodes/RouteNode.vue b/src/components/SimpleProcessDesignerV2/src/nodes/RouteNode.vue
new file mode 100644
index 00000000..76f7dbe9
--- /dev/null
+++ b/src/components/SimpleProcessDesignerV2/src/nodes/RouteNode.vue
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+ {{ currentNode.name }}
+
+
+
+
+ {{ currentNode.showText }}
+
+
+ {{ NODE_DEFAULT_TEXT.get(NodeType.ROUTE_BRANCH_NODE) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
From 0a15eca573ea5254a915b41d38384cc0cccf716d Mon Sep 17 00:00:00 2001
From: LesanOuO <1960681385@qq.com>
Date: Mon, 6 Jan 2025 12:49:55 +0800
Subject: [PATCH 03/86] =?UTF-8?q?feat:=20=E5=AE=A1=E6=89=B9=E4=BA=BA?=
=?UTF-8?q?=E8=AE=BE=E7=BD=AE=E4=B8=80=E8=A1=8C=E4=B8=89=E4=B8=AA?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../src/nodes-config/UserTaskNodeConfig.vue | 21 +++++++++----------
1 file changed, 10 insertions(+), 11 deletions(-)
diff --git a/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue b/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue
index fb5e780e..d4b1101f 100644
--- a/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue
+++ b/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue
@@ -3,7 +3,7 @@
:append-to-body="true"
v-model="settingVisible"
:show-close="false"
- :size="550"
+ :size="580"
:before-close="saveConfig"
class="justify-start"
>
@@ -46,14 +46,13 @@
v-model="configForm.candidateStrategy"
@change="changeCandidateStrategy"
>
-
- {{ dict.label }}
-
+
+
+
+ {{ dict.label }}
+
+
+
@@ -163,7 +162,7 @@
:key="idx"
:label="item.title"
:value="item.field"
- :disabled ="!item.required"
+ :disabled="!item.required"
/>
From 739a1c29a2eeeb27de96718d534fb63ccc0b846a Mon Sep 17 00:00:00 2001
From: Lesan <1960681385@qq.com>
Date: Mon, 6 Jan 2025 17:25:59 +0800
Subject: [PATCH 04/86] =?UTF-8?q?feat:=20Simple=E8=AE=BE=E8=AE=A1=E5=99=A8?=
=?UTF-8?q?-=E7=9B=91=E5=90=AC=E5=99=A8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../src/NodeHandler.vue | 5 +-
.../SimpleProcessDesignerV2/src/consts.ts | 27 +++
.../src/nodes-config/UserTaskNodeConfig.vue | 155 +++++++++++++++++-
3 files changed, 184 insertions(+), 3 deletions(-)
diff --git a/src/components/SimpleProcessDesignerV2/src/NodeHandler.vue b/src/components/SimpleProcessDesignerV2/src/NodeHandler.vue
index 4dfd51ad..13ce4387 100644
--- a/src/components/SimpleProcessDesignerV2/src/NodeHandler.vue
+++ b/src/components/SimpleProcessDesignerV2/src/NodeHandler.vue
@@ -120,7 +120,10 @@ const addNode = (type: number) => {
type: AssignEmptyHandlerType.APPROVE
},
assignStartUserHandlerType: AssignStartUserHandlerType.START_USER_AUDIT,
- childNode: props.childNode
+ childNode: props.childNode,
+ createTaskListener: {
+ enable: false
+ }
}
emits('update:childNode', data)
}
diff --git a/src/components/SimpleProcessDesignerV2/src/consts.ts b/src/components/SimpleProcessDesignerV2/src/consts.ts
index 10d8a21b..9a20d0f8 100644
--- a/src/components/SimpleProcessDesignerV2/src/consts.ts
+++ b/src/components/SimpleProcessDesignerV2/src/consts.ts
@@ -93,6 +93,8 @@ export interface SimpleFlowNode {
assignEmptyHandler?: AssignEmptyHandler
// 审批节点的审批人与发起人相同时,对应的处理类型
assignStartUserHandlerType?: number
+ // 创建任务监听器
+ createTaskListener: ListenerHandler
// 条件类型
conditionType?: ConditionType
// 条件表达式
@@ -222,6 +224,31 @@ export type AssignEmptyHandler = {
userIds?: number[]
}
+/**
+ * 监听器的结构定义
+ */
+export type ListenerHandler = {
+ enable: boolean
+ path: string
+ header: ListenerMap[]
+ body: ListenerMap[]
+}
+export type ListenerMap = {
+ key: string
+ type: number
+ value: string
+}
+export const LISTENER_MAP_TYPES = [
+ {
+ value: 1,
+ label: '固定值'
+ },
+ {
+ value: 2,
+ label: '表单'
+ }
+]
+
// 审批拒绝类型枚举
export enum RejectHandlerType {
/**
diff --git a/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue b/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue
index d4b1101f..82aecbe5 100644
--- a/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue
+++ b/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue
@@ -434,6 +434,133 @@
+
+
+
+
+ 创建任务
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 添加一行
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 添加一行
+
+
+
+
+
+ 指派任务执行人员
+
+
+
+
+
+
+ 完成任务
+
+
+
+
+
+
+
@@ -469,7 +596,8 @@ import {
ASSIGN_EMPTY_HANDLER_TYPES,
AssignEmptyHandlerType,
FieldPermissionType,
- ProcessVariableEnum
+ ProcessVariableEnum,
+ LISTENER_MAP_TYPES
} from '../consts'
import {
@@ -513,7 +641,7 @@ const { settingVisible, closeDrawer, openDrawer } = useDrawer()
// 节点名称配置
const { nodeName, showInput, clickIcon, blurEvent } = useNodeName(NodeType.USER_TASK_NODE)
// 激活的 Tab 标签页
-const activeTabName = ref('user')
+const activeTabName = ref('listener')
// 表单字段权限设置
const { formType, fieldsPermissionConfig, formFieldOptions, getNodeConfigFormFields } =
useFormFieldsPermission(FieldPermissionType.READ)
@@ -662,6 +790,13 @@ const saveConfig = async () => {
currentNode.value.fieldsPermission = fieldsPermissionConfig.value
// 设置按钮权限
currentNode.value.buttonsSetting = buttonsSetting.value
+ // 创建任务监听器
+ currentNode.value.createTaskListener = {
+ enable: configForm.value.createTaskListenerEnable,
+ path: configForm.value.createTaskListenerPath,
+ header: configForm.value.createTaskListenerHeader,
+ body: configForm.value.createTaskListenerBody
+ }
currentNode.value.showText = showText
settingVisible.value = false
@@ -713,6 +848,11 @@ const showUserTaskNodeConfig = (node: SimpleFlowNode) => {
buttonsSetting.value = cloneDeep(node.buttonsSetting) || DEFAULT_BUTTON_SETTING
// 4. 表单字段权限配置
getNodeConfigFormFields(node.fieldsPermission)
+ // 创建任务监听器
+ configForm.value.createTaskListenerEnable = node.createTaskListener.enable
+ configForm.value.createTaskListenerPath = node.createTaskListener.path
+ configForm.value.createTaskListenerHeader = node.createTaskListener.header ?? []
+ configForm.value.createTaskListenerBody = node.createTaskListener.body ?? []
}
defineExpose({ openDrawer, showUserTaskNodeConfig }) // 暴露方法给父组件
@@ -825,6 +965,17 @@ function useTimeoutHandler() {
cTimeoutMaxRemindCount
}
}
+
+const addTaskListenerMap = (arr) => {
+ arr.push({
+ key: '',
+ type: 1,
+ value: ''
+ })
+}
+const deleteTaskListenerMap = (arr, index) => {
+ arr.splice(index, 1)
+}
diff --git a/src/components/SimpleProcessDesignerV2/src/nodes-config/components/Condition.vue b/src/components/SimpleProcessDesignerV2/src/nodes-config/components/Condition.vue
new file mode 100644
index 00000000..ca4b9a39
--- /dev/null
+++ b/src/components/SimpleProcessDesignerV2/src/nodes-config/components/Condition.vue
@@ -0,0 +1,242 @@
+
+
+
+
+
+ {{ dict.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
From 2144034e1f2ff69631f1d14288cf45ae271713ac Mon Sep 17 00:00:00 2001
From: Lesan <1960681385@qq.com>
Date: Wed, 8 Jan 2025 10:18:12 +0800
Subject: [PATCH 15/86] =?UTF-8?q?fix:=20=E4=BD=BF=E7=94=A8ConditionType?=
=?UTF-8?q?=E6=9E=9A=E4=B8=BE=E7=B1=BB=E5=9E=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/components/SimpleProcessDesignerV2/src/consts.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/components/SimpleProcessDesignerV2/src/consts.ts b/src/components/SimpleProcessDesignerV2/src/consts.ts
index 4c8c67d4..47edc8bc 100644
--- a/src/components/SimpleProcessDesignerV2/src/consts.ts
+++ b/src/components/SimpleProcessDesignerV2/src/consts.ts
@@ -660,7 +660,7 @@ export const DELAY_TYPE = [
*/
export type RouteCondition = {
nodeId: string
- conditionType: number // TODO @lesan:ConditionType
+ conditionType: ConditionType
conditionExpression: string
conditionGroups: ConditionGroup
}
From 35a0e69cd4380324fb67593eb0374651d1f7b3ea Mon Sep 17 00:00:00 2001
From: Lesan <1960681385@qq.com>
Date: Wed, 8 Jan 2025 10:51:47 +0800
Subject: [PATCH 16/86] =?UTF-8?q?chore:=20=E9=83=A8=E5=88=86=E6=96=87?=
=?UTF-8?q?=E4=BB=B6=E6=9B=B4=E5=90=8D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../SimpleProcessDesignerV2/src/consts.ts | 10 ++++----
.../SimpleProcessDesignerV2/src/node.ts | 14 +++++------
.../src/nodes-config/RouteNodeConfig.vue | 24 +++++++++----------
.../src/nodes-config/UserTaskNodeConfig.vue | 22 ++++++++---------
4 files changed, 35 insertions(+), 35 deletions(-)
diff --git a/src/components/SimpleProcessDesignerV2/src/consts.ts b/src/components/SimpleProcessDesignerV2/src/consts.ts
index 47edc8bc..91f06322 100644
--- a/src/components/SimpleProcessDesignerV2/src/consts.ts
+++ b/src/components/SimpleProcessDesignerV2/src/consts.ts
@@ -116,7 +116,7 @@ export interface SimpleFlowNode {
// 延迟设置
delaySetting?: DelaySetting
// 路由分支
- routeGroups?: RouteCondition[]
+ routerGroups?: RouteCondition[]
defaultFlowId?: string
}
// 候选人策略枚举 ( 用于审批节点。抄送节点 )
@@ -241,15 +241,15 @@ export type AssignEmptyHandler = {
export type ListenerHandler = {
enable: boolean
path?: string
- header?: ListenerMap[]
- body?: ListenerMap[]
+ header?: ListenerParam[]
+ body?: ListenerParam[]
}
-export type ListenerMap = {
+export type ListenerParam = {
key: string
type: number
value: string
}
-export enum ListenerMapTypeEnum {
+export enum ListenerParamTypeEnum {
/**
* 固定值
*/
diff --git a/src/components/SimpleProcessDesignerV2/src/node.ts b/src/components/SimpleProcessDesignerV2/src/node.ts
index 4be76867..11f1f01f 100644
--- a/src/components/SimpleProcessDesignerV2/src/node.ts
+++ b/src/components/SimpleProcessDesignerV2/src/node.ts
@@ -15,7 +15,7 @@ import {
AssignStartUserHandlerType,
AssignEmptyHandlerType,
FieldPermissionType,
- ListenerMap
+ ListenerParam
} from './consts'
import { parseFormFields } from '@/components/FormCreate/src/utils/index'
export function useWatchNode(props: { flowNode: SimpleFlowNode }): Ref {
@@ -139,16 +139,16 @@ export type UserTaskFormType = {
buttonsSetting: any[]
taskCreateListenerEnable?: boolean
taskCreateListenerPath?: string
- taskCreateListenerHeader?: ListenerMap[]
- taskCreateListenerBody?: ListenerMap[]
+ taskCreateListenerHeader?: ListenerParam[]
+ taskCreateListenerBody?: ListenerParam[]
taskAssignListenerEnable?: boolean
taskAssignListenerPath?: string
- taskAssignListenerHeader?: ListenerMap[]
- taskAssignListenerBody?: ListenerMap[]
+ taskAssignListenerHeader?: ListenerParam[]
+ taskAssignListenerBody?: ListenerParam[]
taskCompleteListenerEnable?: boolean
taskCompleteListenerPath?: string
- taskCompleteListenerHeader?: ListenerMap[]
- taskCompleteListenerBody?: ListenerMap[]
+ taskCompleteListenerHeader?: ListenerParam[]
+ taskCompleteListenerBody?: ListenerParam[]
}
export type CopyTaskFormType = {
diff --git a/src/components/SimpleProcessDesignerV2/src/nodes-config/RouteNodeConfig.vue b/src/components/SimpleProcessDesignerV2/src/nodes-config/RouteNodeConfig.vue
index 79ad364e..42b3524e 100644
--- a/src/components/SimpleProcessDesignerV2/src/nodes-config/RouteNodeConfig.vue
+++ b/src/components/SimpleProcessDesignerV2/src/nodes-config/RouteNodeConfig.vue
@@ -25,7 +25,7 @@
-
+
路由{{ index + 1 }}
@@ -42,7 +42,7 @@
>
-
+
@@ -81,7 +81,7 @@ const { settingVisible, closeDrawer, openDrawer } = useDrawer()
const currentNode = useWatchNode(props)
// 节点名称
const { nodeName, showInput, clickIcon, blurEvent } = useNodeName(NodeType.ROUTE_BRANCH_NODE)
-const routeGroups = ref
([])
+const routerGroups = ref([])
const nodeOptions = ref()
// 保存配置
@@ -90,26 +90,26 @@ const saveConfig = async () => {
if (!showText) return false
currentNode.value.name = nodeName.value!
currentNode.value.showText = showText
- currentNode.value.routeGroups = routeGroups.value
+ currentNode.value.routerGroups = routerGroups.value
settingVisible.value = false
return true
}
// 显示路由分支节点配置, 由父组件传过来
const showRouteNodeConfig = (node: SimpleFlowNode) => {
getRoutableNode()
- routeGroups.value = []
+ routerGroups.value = []
nodeName.value = node.name
- if (node.routeGroups) {
- routeGroups.value = node.routeGroups
+ if (node.routerGroups) {
+ routerGroups.value = node.routerGroups
}
}
const getShowText = () => {
- if (!routeGroups.value || !Array.isArray(routeGroups.value) || routeGroups.value.length <= 0) {
+ if (!routerGroups.value || !Array.isArray(routerGroups.value) || routerGroups.value.length <= 0) {
message.warning('请配置路由!')
return ''
}
- for (const route of routeGroups.value) {
+ for (const route of routerGroups.value) {
if (!route.nodeId || !route.conditionType) {
message.warning('请完善路由配置项!')
return ''
@@ -129,11 +129,11 @@ const getShowText = () => {
}
}
}
- return `${routeGroups.value.length}条路由分支`
+ return `${routerGroups.value.length}条路由分支`
}
const addRouteGroup = () => {
- routeGroups.value.push({
+ routerGroups.value.push({
nodeId: '',
conditionType: ConditionType.RULE,
conditionExpression: '',
@@ -158,7 +158,7 @@ const addRouteGroup = () => {
}
const deleteRouteGroup = (index) => {
- routeGroups.value.splice(index, 1)
+ routerGroups.value.splice(index, 1)
}
const getRoutableNode = () => {
diff --git a/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue b/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue
index 962ce9cc..66887a7e 100644
--- a/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue
+++ b/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue
@@ -482,12 +482,12 @@
@@ -505,7 +505,7 @@
icon="ep:delete"
:size="18"
@click="
- deleteTaskListenerMap(
+ deleteTaskListenerParam(
configForm[`task${listener.type}ListenerHeader`],
index
)
@@ -516,7 +516,7 @@
添加一行
@@ -542,12 +542,12 @@
@@ -565,7 +565,7 @@
icon="ep:delete"
:size="18"
@click="
- deleteTaskListenerMap(
+ deleteTaskListenerParam(
configForm[`task${listener.type}ListenerBody`],
index
)
@@ -576,7 +576,7 @@
添加一行
@@ -623,7 +623,7 @@ import {
FieldPermissionType,
ProcessVariableEnum,
LISTENER_MAP_TYPES,
- ListenerMapTypeEnum
+ ListenerParamTypeEnum
} from '../consts'
import {
@@ -1032,14 +1032,14 @@ function useTimeoutHandler() {
}
}
-const addTaskListenerMap = (arr) => {
+const addTaskListenerParam = (arr) => {
arr.push({
key: '',
type: 1,
value: ''
})
}
-const deleteTaskListenerMap = (arr, index) => {
+const deleteTaskListenerParam = (arr, index) => {
arr.splice(index, 1)
}
From 5fa2a78e849558e30c4fdd9b45dbf65b659eb146 Mon Sep 17 00:00:00 2001
From: Lesan <1960681385@qq.com>
Date: Wed, 8 Jan 2025 15:03:06 +0800
Subject: [PATCH 17/86] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E7=9B=91?=
=?UTF-8?q?=E5=90=AC=E5=99=A8=E8=AF=B7=E6=B1=82=E5=9C=B0=E5=9D=80=E9=9D=9E?=
=?UTF-8?q?=E7=A9=BA=E6=A0=A1=E9=AA=8C?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../src/nodes-config/UserTaskNodeConfig.vue | 290 +++++++++---------
1 file changed, 148 insertions(+), 142 deletions(-)
diff --git a/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue b/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue
index 66887a7e..3e497b4a 100644
--- a/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue
+++ b/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue
@@ -436,155 +436,161 @@
-
-
-
-
- {{ listener.name }}
-
+
+
+
+ {{ listener.name }}
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
- 添加一行
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
-
-
-
-
-
-
+
-
- 添加一行
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+ 添加一行
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 添加一行
+
+
-
-
+
+
From 0c433552f994cc5bc9a00119c3ebd98ca739bef2 Mon Sep 17 00:00:00 2001
From: Lesan <1960681385@qq.com>
Date: Wed, 8 Jan 2025 16:58:14 +0800
Subject: [PATCH 18/86] =?UTF-8?q?feat:=20Simple=E8=AE=BE=E8=AE=A1=E5=99=A8?=
=?UTF-8?q?-userTask-=E6=B7=BB=E5=8A=A0=E6=98=AF=E5=90=A6=E9=9C=80?=
=?UTF-8?q?=E8=A6=81=E7=AD=BE=E5=90=8D=E5=AD=97=E6=AE=B5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../SimpleProcessDesignerV2/src/consts.ts | 2 ++
src/components/SimpleProcessDesignerV2/src/node.ts | 1 +
.../src/nodes-config/UserTaskNodeConfig.vue | 13 +++++++++++++
3 files changed, 16 insertions(+)
diff --git a/src/components/SimpleProcessDesignerV2/src/consts.ts b/src/components/SimpleProcessDesignerV2/src/consts.ts
index 91f06322..55808c96 100644
--- a/src/components/SimpleProcessDesignerV2/src/consts.ts
+++ b/src/components/SimpleProcessDesignerV2/src/consts.ts
@@ -118,6 +118,8 @@ export interface SimpleFlowNode {
// 路由分支
routerGroups?: RouteCondition[]
defaultFlowId?: string
+ // 签名
+ signEnable?: boolean
}
// 候选人策略枚举 ( 用于审批节点。抄送节点 )
export enum CandidateStrategy {
diff --git a/src/components/SimpleProcessDesignerV2/src/node.ts b/src/components/SimpleProcessDesignerV2/src/node.ts
index 11f1f01f..e5d51663 100644
--- a/src/components/SimpleProcessDesignerV2/src/node.ts
+++ b/src/components/SimpleProcessDesignerV2/src/node.ts
@@ -149,6 +149,7 @@ export type UserTaskFormType = {
taskCompleteListenerPath?: string
taskCompleteListenerHeader?: ListenerParam[]
taskCompleteListenerBody?: ListenerParam[]
+ signEnable: boolean
}
export type CopyTaskFormType = {
diff --git a/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue b/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue
index 3e497b4a..4cf7db35 100644
--- a/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue
+++ b/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue
@@ -356,6 +356,15 @@
+
+ 是否需要签名
+
+
+
@@ -858,6 +867,8 @@ const saveConfig = async () => {
header: configForm.value.taskCompleteListenerHeader,
body: configForm.value.taskCompleteListenerBody
}
+ // 签名
+ currentNode.value.signEnable = configForm.value.signEnable
currentNode.value.showText = showText
settingVisible.value = false
@@ -925,6 +936,8 @@ const showUserTaskNodeConfig = (node: SimpleFlowNode) => {
configForm.value.taskCompleteListenerPath = node.taskCompleteListener!.path
configForm.value.taskCompleteListenerHeader = node.taskCompleteListener?.header ?? []
configForm.value.taskCompleteListenerBody = node.taskCompleteListener?.body ?? []
+ // 6. 签名
+ configForm.value.signEnable = node.signEnable ?? false
}
defineExpose({ openDrawer, showUserTaskNodeConfig }) // 暴露方法给父组件
From 77938c38cab8683a19dbbaa967bd9be3eee716b0 Mon Sep 17 00:00:00 2001
From: YunaiV
Date: Wed, 8 Jan 2025 22:18:47 +0800
Subject: [PATCH 19/86] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E8=AF=84?=
=?UTF-8?q?=E5=AE=A1=E3=80=91BPM=EF=BC=9A=E7=AD=BE=E5=90=8D=E7=BB=84?=
=?UTF-8?q?=E4=BB=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../src/nodes-config/RouteNodeConfig.vue | 3 ++-
.../src/nodes-config/components/Condition.vue | 4 +++-
2 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/src/components/SimpleProcessDesignerV2/src/nodes-config/RouteNodeConfig.vue b/src/components/SimpleProcessDesignerV2/src/nodes-config/RouteNodeConfig.vue
index 42b3524e..62170fc0 100644
--- a/src/components/SimpleProcessDesignerV2/src/nodes-config/RouteNodeConfig.vue
+++ b/src/components/SimpleProcessDesignerV2/src/nodes-config/RouteNodeConfig.vue
@@ -157,10 +157,11 @@ const addRouteGroup = () => {
})
}
-const deleteRouteGroup = (index) => {
+const deleteRouteGroup = (index: number) => {
routerGroups.value.splice(index, 1)
}
+// TODO @lesan:还有一些 router 的命名,没改过来呢
const getRoutableNode = () => {
// TODO @lesan 还需要满足以下要求
// 并行分支、包容分支内部节点不能跳转到外部节点
diff --git a/src/components/SimpleProcessDesignerV2/src/nodes-config/components/Condition.vue b/src/components/SimpleProcessDesignerV2/src/nodes-config/components/Condition.vue
index ca4b9a39..560646d1 100644
--- a/src/components/SimpleProcessDesignerV2/src/nodes-config/components/Condition.vue
+++ b/src/components/SimpleProcessDesignerV2/src/nodes-config/components/Condition.vue
@@ -1,5 +1,7 @@
+
+
{
and: true,
rules: [
{
- type: 1,
+ type: 1, // TODO @lesan:枚举~
opName: '等于',
opCode: '==',
leftSide: '',
From 4741f3737fb0c3a61463d98b0e7bfd6c8c40e12a Mon Sep 17 00:00:00 2001
From: Lesan <1960681385@qq.com>
Date: Thu, 9 Jan 2025 09:04:22 +0800
Subject: [PATCH 20/86] =?UTF-8?q?fix:=20defaultFlowId=E7=94=B1=E5=90=8E?=
=?UTF-8?q?=E7=AB=AF=E7=94=9F=E6=88=90?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/components/SimpleProcessDesignerV2/src/NodeHandler.vue | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/src/components/SimpleProcessDesignerV2/src/NodeHandler.vue b/src/components/SimpleProcessDesignerV2/src/NodeHandler.vue
index 25e54f6b..b72c4cab 100644
--- a/src/components/SimpleProcessDesignerV2/src/NodeHandler.vue
+++ b/src/components/SimpleProcessDesignerV2/src/NodeHandler.vue
@@ -247,8 +247,7 @@ const addNode = (type: number) => {
name: NODE_DEFAULT_NAME.get(NodeType.ROUTE_BRANCH_NODE) as string,
showText: '',
type: NodeType.ROUTE_BRANCH_NODE,
- childNode: props.childNode,
- defaultFlowId: 'Flow_' + generateUUID()
+ childNode: props.childNode
}
emits('update:childNode', data)
}
From 777564673e474da006c28521fedd0c485af29897 Mon Sep 17 00:00:00 2001
From: Lesan <1960681385@qq.com>
Date: Thu, 9 Jan 2025 09:19:23 +0800
Subject: [PATCH 21/86] =?UTF-8?q?fix:=20=E6=A3=80=E6=9F=A5=E6=89=80?=
=?UTF-8?q?=E6=9C=89route->router?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../src/NodeHandler.vue | 8 +++----
.../src/ProcessNodeTree.vue | 6 ++---
.../SimpleProcessDesignerV2/src/consts.ts | 10 ++++----
...uteNodeConfig.vue => RouterNodeConfig.vue} | 23 +++++++++----------
.../nodes/{RouteNode.vue => RouterNode.vue} | 10 ++++----
.../detail/ProcessInstanceSimpleViewer.vue | 2 +-
6 files changed, 29 insertions(+), 30 deletions(-)
rename src/components/SimpleProcessDesignerV2/src/nodes-config/{RouteNodeConfig.vue => RouterNodeConfig.vue} (91%)
rename src/components/SimpleProcessDesignerV2/src/nodes/{RouteNode.vue => RouterNode.vue} (90%)
diff --git a/src/components/SimpleProcessDesignerV2/src/NodeHandler.vue b/src/components/SimpleProcessDesignerV2/src/NodeHandler.vue
index b72c4cab..1000e953 100644
--- a/src/components/SimpleProcessDesignerV2/src/NodeHandler.vue
+++ b/src/components/SimpleProcessDesignerV2/src/NodeHandler.vue
@@ -46,7 +46,7 @@
延迟器
-
+
@@ -241,12 +241,12 @@ const addNode = (type: number) => {
}
emits('update:childNode', data)
}
- if (type === NodeType.ROUTE_BRANCH_NODE) {
+ if (type === NodeType.ROUTER_BRANCH_NODE) {
const data: SimpleFlowNode = {
id: 'GateWay_' + generateUUID(),
- name: NODE_DEFAULT_NAME.get(NodeType.ROUTE_BRANCH_NODE) as string,
+ name: NODE_DEFAULT_NAME.get(NodeType.ROUTER_BRANCH_NODE) as string,
showText: '',
- type: NodeType.ROUTE_BRANCH_NODE,
+ type: NodeType.ROUTER_BRANCH_NODE,
childNode: props.childNode
}
emits('update:childNode', data)
diff --git a/src/components/SimpleProcessDesignerV2/src/ProcessNodeTree.vue b/src/components/SimpleProcessDesignerV2/src/ProcessNodeTree.vue
index 4c87d5b0..26ef13dd 100644
--- a/src/components/SimpleProcessDesignerV2/src/ProcessNodeTree.vue
+++ b/src/components/SimpleProcessDesignerV2/src/ProcessNodeTree.vue
@@ -45,8 +45,8 @@
@update:flow-node="handleModelValueUpdate"
/>
-
@@ -73,7 +73,7 @@ import ExclusiveNode from './nodes/ExclusiveNode.vue'
import ParallelNode from './nodes/ParallelNode.vue'
import InclusiveNode from './nodes/InclusiveNode.vue'
import DelayTimerNode from './nodes/DelayTimerNode.vue'
-import RouteNode from './nodes/RouteNode.vue'
+import RouterNode from './nodes/RouterNode.vue'
import { SimpleFlowNode, NodeType } from './consts'
import { useWatchNode } from './node'
defineOptions({
diff --git a/src/components/SimpleProcessDesignerV2/src/consts.ts b/src/components/SimpleProcessDesignerV2/src/consts.ts
index 55808c96..039c5349 100644
--- a/src/components/SimpleProcessDesignerV2/src/consts.ts
+++ b/src/components/SimpleProcessDesignerV2/src/consts.ts
@@ -48,7 +48,7 @@ export enum NodeType {
/**
* 路由分支节点
*/
- ROUTE_BRANCH_NODE = 54
+ ROUTER_BRANCH_NODE = 54
}
export enum NodeId {
@@ -116,7 +116,7 @@ export interface SimpleFlowNode {
// 延迟设置
delaySetting?: DelaySetting
// 路由分支
- routerGroups?: RouteCondition[]
+ routerGroups?: RouterCondition[]
defaultFlowId?: string
// 签名
signEnable?: boolean
@@ -471,7 +471,7 @@ NODE_DEFAULT_TEXT.set(NodeType.COPY_TASK_NODE, '请配置抄送人')
NODE_DEFAULT_TEXT.set(NodeType.CONDITION_NODE, '请设置条件')
NODE_DEFAULT_TEXT.set(NodeType.START_USER_NODE, '请设置发起人')
NODE_DEFAULT_TEXT.set(NodeType.DELAY_TIMER_NODE, '请设置延迟器')
-NODE_DEFAULT_TEXT.set(NodeType.ROUTE_BRANCH_NODE, '请设置路由节点')
+NODE_DEFAULT_TEXT.set(NodeType.ROUTER_BRANCH_NODE, '请设置路由节点')
export const NODE_DEFAULT_NAME = new Map()
NODE_DEFAULT_NAME.set(NodeType.USER_TASK_NODE, '审批人')
@@ -479,7 +479,7 @@ NODE_DEFAULT_NAME.set(NodeType.COPY_TASK_NODE, '抄送人')
NODE_DEFAULT_NAME.set(NodeType.CONDITION_NODE, '条件')
NODE_DEFAULT_NAME.set(NodeType.START_USER_NODE, '发起人')
NODE_DEFAULT_NAME.set(NodeType.DELAY_TIMER_NODE, '延迟器')
-NODE_DEFAULT_NAME.set(NodeType.ROUTE_BRANCH_NODE, '路由分支')
+NODE_DEFAULT_NAME.set(NodeType.ROUTER_BRANCH_NODE, '路由分支')
// 候选人策略。暂时不从字典中取。 后续可能调整。控制显示顺序
export const CANDIDATE_STRATEGY: DictDataVO[] = [
@@ -660,7 +660,7 @@ export const DELAY_TYPE = [
/**
* 路由分支结构定义
*/
-export type RouteCondition = {
+export type RouterCondition = {
nodeId: string
conditionType: ConditionType
conditionExpression: string
diff --git a/src/components/SimpleProcessDesignerV2/src/nodes-config/RouteNodeConfig.vue b/src/components/SimpleProcessDesignerV2/src/nodes-config/RouterNodeConfig.vue
similarity index 91%
rename from src/components/SimpleProcessDesignerV2/src/nodes-config/RouteNodeConfig.vue
rename to src/components/SimpleProcessDesignerV2/src/nodes-config/RouterNodeConfig.vue
index 62170fc0..d51e27be 100644
--- a/src/components/SimpleProcessDesignerV2/src/nodes-config/RouteNodeConfig.vue
+++ b/src/components/SimpleProcessDesignerV2/src/nodes-config/RouterNodeConfig.vue
@@ -37,7 +37,7 @@
:value="node.value"
/>
- 删除
@@ -46,7 +46,7 @@
-
+
新增路由分支
@@ -61,11 +61,11 @@
From 401481662fb9a3db7e1206f89f716d7503393d45 Mon Sep 17 00:00:00 2001
From: Lesan <1960681385@qq.com>
Date: Fri, 10 Jan 2025 14:33:59 +0800
Subject: [PATCH 26/86] =?UTF-8?q?feat:=20=E8=A1=A5=E5=85=85=E7=AD=89?=
=?UTF-8?q?=E5=BC=8F=E5=B7=A6=E5=8F=B3=E5=80=BCform=E6=A0=A1=E9=AA=8C?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../src/nodes-config/RouterNodeConfig.vue | 14 +++++-
.../src/nodes-config/components/Condition.vue | 46 +++++++++++++------
2 files changed, 45 insertions(+), 15 deletions(-)
diff --git a/src/components/SimpleProcessDesignerV2/src/nodes-config/RouterNodeConfig.vue b/src/components/SimpleProcessDesignerV2/src/nodes-config/RouterNodeConfig.vue
index 71192ae7..442cf337 100644
--- a/src/components/SimpleProcessDesignerV2/src/nodes-config/RouterNodeConfig.vue
+++ b/src/components/SimpleProcessDesignerV2/src/nodes-config/RouterNodeConfig.vue
@@ -42,7 +42,10 @@
>
-
+
@@ -84,8 +87,17 @@ const { nodeName, showInput, clickIcon, blurEvent } = useNodeName(NodeType.ROUTE
const routerGroups = ref([])
const nodeOptions = ref()
+const conditionRef = ref([])
// 保存配置
const saveConfig = async () => {
+ // 校验表单
+ let valid = true
+ for (const item of conditionRef.value) {
+ if (!(await item.validate())) {
+ valid = false
+ }
+ }
+ if (!valid) return false
const showText = getShowText()
if (!showText) return false
currentNode.value.name = nodeName.value!
diff --git a/src/components/SimpleProcessDesignerV2/src/nodes-config/components/Condition.vue b/src/components/SimpleProcessDesignerV2/src/nodes-config/components/Condition.vue
index e8fe1d76..85f6e4a0 100644
--- a/src/components/SimpleProcessDesignerV2/src/nodes-config/components/Condition.vue
+++ b/src/components/SimpleProcessDesignerV2/src/nodes-config/components/Condition.vue
@@ -59,15 +59,24 @@
-
-
-
+
+
+
+
+
@@ -80,7 +89,16 @@
-
+
+
+
@@ -122,8 +140,8 @@ import {
ConditionType,
ProcessVariableEnum
} from '../../consts'
-import {BpmModelFormType} from '@/utils/constants'
-import {useFormFields} from '../../node'
+import { BpmModelFormType } from '@/utils/constants'
+import { useFormFields } from '../../node'
const props = defineProps({
modelValue: {
@@ -202,10 +220,10 @@ const addConditionGroup = (conditions) => {
const validate = async () => {
if (!formRef) return false
- return await formRef.value.validate();
+ return await formRef.value.validate()
}
-defineExpose({validate})
+defineExpose({ validate })
diff --git a/src/views/bpm/simple/SimpleModelDesign.vue b/src/views/bpm/simple/SimpleModelDesign.vue
index eed00997..e07a04c9 100644
--- a/src/views/bpm/simple/SimpleModelDesign.vue
+++ b/src/views/bpm/simple/SimpleModelDesign.vue
@@ -23,7 +23,7 @@ const props = defineProps<{
modelId?: string
modelKey?: string
modelName?: string
- value?: string
+ value?: any
startUserIds?: number[]
}>()
@@ -34,7 +34,6 @@ const currentValue = ref('')
// 初始化或更新当前值
const initOrUpdateValue = async () => {
- console.log('initOrUpdateValue', props.value)
if (props.value) {
currentValue.value = props.value
// 如果设计器已经初始化,立即加载数据
From 3d8f1290c3c023f34567978d8eebb9985881dc98 Mon Sep 17 00:00:00 2001
From: zws <447643445@qq.com>
Date: Tue, 14 Jan 2025 08:46:08 +0800
Subject: [PATCH 30/86] =?UTF-8?q?perf:=20bpm=20=E6=B5=81=E7=A8=8B=E6=A8=A1?=
=?UTF-8?q?=E5=9E=8B=E8=A1=A8=E5=8D=95=E4=BB=A3=E7=A0=81=E4=BC=98=E5=8C=96?=
=?UTF-8?q?.=20=E5=8E=BB=E6=8E=89=E5=A4=A7=E9=87=8Fwatch=20=E4=BB=A3?=
=?UTF-8?q?=E7=A0=81.=20=E7=94=A8=E4=BE=9D=E8=B5=96=E6=B3=A8=E5=85=A5?=
=?UTF-8?q?=E6=9B=BF=E6=8D=A2props=20=E4=BC=A0=E9=80=92=E6=B5=81=E7=A8=8B?=
=?UTF-8?q?=E6=95=B0=E6=8D=AE.=20=E5=A2=9E=E5=8A=A0=E5=AF=BC=E5=85=A5?=
=?UTF-8?q?=E5=AF=BC=E5=87=BA?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../src/SimpleProcessDesigner.vue | 118 +----------
.../src/SimpleProcessModel.vue | 63 +++++-
.../package/designer/ProcessDesigner.vue | 23 +--
src/views/bpm/model/editor/index.vue | 190 +-----------------
src/views/bpm/model/form/BasicInfo.vue | 51 ++---
src/views/bpm/model/form/FormDesign.vue | 11 +-
src/views/bpm/model/form/ProcessDesign.vue | 166 +--------------
src/views/bpm/model/form/index.vue | 150 ++++----------
src/views/bpm/simple/SimpleModelDesign.vue | 113 +----------
9 files changed, 156 insertions(+), 729 deletions(-)
diff --git a/src/components/SimpleProcessDesignerV2/src/SimpleProcessDesigner.vue b/src/components/SimpleProcessDesignerV2/src/SimpleProcessDesigner.vue
index 22e6073f..ad42696b 100644
--- a/src/components/SimpleProcessDesignerV2/src/SimpleProcessDesigner.vue
+++ b/src/components/SimpleProcessDesignerV2/src/SimpleProcessDesigner.vue
@@ -40,7 +40,7 @@ defineOptions({
name: 'SimpleProcessDesigner'
})
-const emits = defineEmits(['success', 'init-finished']) // 保存成功事件
+const emits = defineEmits(['success']) // 保存成功事件
const props = defineProps({
modelId: {
@@ -59,13 +59,12 @@ const props = defineProps({
startUserIds : {
type: Array,
required: false
- },
- value: {
- type: [String, Object],
- required: false
}
})
+const processData = inject('processData') as Ref
+
+
const loading = ref(false)
const formFields = ref
([])
const formType = ref(20)
@@ -76,9 +75,6 @@ const deptOptions = ref([]) // 部门列表
const deptTreeOptions = ref()
const userGroupOptions = ref([]) // 用户组列表
-// 添加当前值的引用
-const currentValue = ref()
-
provide('formFields', formFields)
provide('formType', formType)
provide('roleList', roleOptions)
@@ -88,7 +84,8 @@ provide('deptList', deptOptions)
provide('userGroupList', userGroupOptions)
provide('deptTree', deptTreeOptions)
provide('startUserIds', props.startUserIds)
-
+provide('tasks', [])
+provide('processInstance', {})
const message = useMessage() // 国际化
const processNodeTree = ref()
const errorDialogVisible = ref(false)
@@ -112,70 +109,14 @@ const updateModel = () => {
}
}
-// 加载流程数据
-const loadProcessData = async (data: any) => {
- try {
- if (data) {
- const parsedData = typeof data === 'string' ? JSON.parse(data) : data
- processNodeTree.value = parsedData
- currentValue.value = parsedData
- // 确保数据加载后刷新视图
- await nextTick()
- if (simpleProcessModelRef.value?.refresh) {
- await simpleProcessModelRef.value.refresh()
- }
- }
- } catch (error) {
- console.error('加载流程数据失败:', error)
- }
-}
-
-// 监听属性变化
-watch(
- () => props.value,
- async (newValue, oldValue) => {
- if (newValue && newValue !== oldValue) {
- await loadProcessData(newValue)
- }
- },
- { immediate: true, deep: true }
-)
-
-// 监听流程节点树变化,自动保存
-watch(
- () => processNodeTree.value,
- async (newValue, oldValue) => {
- if (newValue && oldValue && JSON.stringify(newValue) !== JSON.stringify(oldValue)) {
- await saveSimpleFlowModel(newValue)
- }
- },
- { deep: true }
-)
const saveSimpleFlowModel = async (simpleModelNode: SimpleFlowNode) => {
if (!simpleModelNode) {
return
}
- // 校验节点
- errorNodes = []
- validateNode(simpleModelNode, errorNodes)
- if (errorNodes.length > 0) {
- errorDialogVisible.value = true
- return
- }
-
try {
- if (props.modelId) {
- // 编辑模式
- const data = {
- id: props.modelId,
- simpleModel: simpleModelNode
- }
- await updateBpmSimpleModel(data)
- }
- // 无论是编辑还是新建模式,都更新当前值并触发事件
- currentValue.value = simpleModelNode
+ processData.value = simpleModelNode
emits('success', simpleModelNode)
} catch (error) {
console.error('保存失败:', error)
@@ -246,61 +187,20 @@ onMounted(async () => {
deptTreeOptions.value = handleTree(deptOptions.value as DeptApi.DeptVO[], 'id')
// 获取用户组列表
userGroupOptions.value = await UserGroupApi.getUserGroupSimpleList()
-
// 加载流程数据
- if (props.modelId) {
- // 获取 SIMPLE 设计器模型
- const result = await getBpmSimpleModel(props.modelId)
- if (result) {
- await loadProcessData(result)
- } else {
- updateModel()
- }
- } else if (props.value) {
- await loadProcessData(props.value)
+ if (processData.value) {
+ processNodeTree.value = processData?.value
} else {
updateModel()
}
} finally {
loading.value = false
- emits('init-finished')
}
})
const simpleProcessModelRef = ref()
-/** 获取当前流程数据 */
-const getCurrentFlowData = async () => {
- try {
- if (simpleProcessModelRef.value) {
- const data = await simpleProcessModelRef.value.getCurrentFlowData()
- if (data) {
- currentValue.value = data
- return data
- }
- }
- return currentValue.value
- } catch (error) {
- console.error('获取流程数据失败:', error)
- return currentValue.value
- }
-}
-
-// 刷新方法
-const refresh = async () => {
- try {
- if (currentValue.value) {
- await loadProcessData(currentValue.value)
- }
- } catch (error) {
- console.error('刷新失败:', error)
- }
-}
defineExpose({
- getCurrentFlowData,
- updateModel,
- loadProcessData,
- refresh
})
diff --git a/src/components/SimpleProcessDesignerV2/src/SimpleProcessModel.vue b/src/components/SimpleProcessDesignerV2/src/SimpleProcessModel.vue
index ccd1f10d..b9a26475 100644
--- a/src/components/SimpleProcessDesignerV2/src/SimpleProcessModel.vue
+++ b/src/components/SimpleProcessDesignerV2/src/SimpleProcessModel.vue
@@ -3,11 +3,31 @@
+ 导出
+ 导入
+
+
{{ scaleValue }}%
+
+
+
+
+
+
+
+
+
@@ -33,7 +53,8 @@
import ProcessNodeTree from './ProcessNodeTree.vue'
import { SimpleFlowNode, NodeType, NODE_DEFAULT_TEXT } from './consts'
import { useWatchNode } from './node'
-import { ZoomOut, ZoomIn, ScaleToOriginal } from '@element-plus/icons-vue'
+import { ZoomOut, ZoomIn, ScaleToOriginal, Select } from '@element-plus/icons-vue'
+import { isString } from '@/utils/is'
defineOptions({
name: 'SimpleProcessModel'
@@ -85,6 +106,16 @@ const processReZoom = () => {
const errorDialogVisible = ref(false)
let errorNodes: SimpleFlowNode[] = []
+const saveSimpleFlowModel = async () => {
+ errorNodes = []
+ validateNode(processNodeTree.value, errorNodes)
+ if (errorNodes.length > 0) {
+ errorDialogVisible.value = true
+ return
+ }
+ emits('save', processNodeTree.value)
+}
+
// 校验节点设置。 暂时以 showText 为空 未节点错误配置
const validateNode = (node: SimpleFlowNode | undefined, errorNodes: SimpleFlowNode[]) => {
if (node) {
@@ -143,6 +174,36 @@ const getCurrentFlowData = async () => {
defineExpose({
getCurrentFlowData
})
+
+const exportJson = () => {
+ const blob = new Blob([JSON.stringify(processNodeTree.value)]);
+ const tempLink = document.createElement('a'); // 创建a标签
+ const href = window.URL.createObjectURL(blob); // 创建下载的链接
+ //filename
+ const fileName = `model.json`;
+ tempLink.href = href;
+ tempLink.target = '_blank';
+ tempLink.download = fileName;
+ document.body.appendChild(tempLink);
+ tempLink.click(); // 点击下载
+ document.body.removeChild(tempLink); // 下载完成移除元素
+ window.URL.revokeObjectURL(href); // 释放掉blob对象
+}
+const importJson = () => {
+ refFile.value.click()
+}
+const refFile = ref()
+// 加载本地文件
+const importLocalFile = () => {
+ const file = refFile.value.files[0]
+ const reader = new FileReader()
+ reader.readAsText(file)
+ reader.onload = function () {
+ if (isString(this.result)) {
+ processNodeTree.value = JSON.parse(this.result)
+ }
+ }
+}
diff --git a/src/components/bpmnProcessDesigner/package/designer/ProcessDesigner.vue b/src/components/bpmnProcessDesigner/package/designer/ProcessDesigner.vue
index 9d2fa5ba..5b3d14f4 100644
--- a/src/components/bpmnProcessDesigner/package/designer/ProcessDesigner.vue
+++ b/src/components/bpmnProcessDesigner/package/designer/ProcessDesigner.vue
@@ -308,28 +308,6 @@ const props = defineProps({
}
})
-// 监听value变化,重新加载流程图
-watch(
- () => props.value,
- (newValue) => {
- if (newValue && bpmnModeler) {
- createNewDiagram(newValue)
- }
- },
- { immediate: true }
-)
-
-// 监听processId和processName变化
-watch(
- [() => props.processId, () => props.processName],
- ([newId, newName]) => {
- if (newId && newName && !props.value) {
- createNewDiagram(null)
- }
- },
- { immediate: true }
-)
-
provide('configGlobal', props)
let bpmnModeler: any = null
const defaultZoom = ref(1)
@@ -480,6 +458,7 @@ const initModelListeners = () => {
emit('commandStack-changed', event)
emit('input', xml)
emit('change', xml)
+ emit('save', xml)
} catch (e: any) {
console.error(`[Process Designer Warn]: ${e.message || e}`)
}
diff --git a/src/views/bpm/model/editor/index.vue b/src/views/bpm/model/editor/index.vue
index 37eff739..512eb152 100644
--- a/src/views/bpm/model/editor/index.vue
+++ b/src/views/bpm/model/editor/index.vue
@@ -3,6 +3,7 @@
()
@@ -51,10 +52,11 @@ const formType = ref(20)
provide('formFields', formFields)
provide('formType', formType)
-const xmlString = ref('') // BPMN XML
+//注入 流程数据
+const xmlString = inject('processData') as Ref
+
const modeler = shallowRef() // BPMN Modeler
const processDesigner = ref()
-const isModelerReady = ref(false)
const controlForm = ref({
simulation: true,
labelEditing: false,
@@ -65,154 +67,27 @@ const controlForm = ref({
})
const model = ref() // 流程模型的信息
-// 初始化 bpmnInstances
-const initBpmnInstances = () => {
- if (!modeler.value) return false
- try {
- const instances = {
- modeler: modeler.value,
- modeling: modeler.value.get('modeling'),
- moddle: modeler.value.get('moddle'),
- eventBus: modeler.value.get('eventBus'),
- bpmnFactory: modeler.value.get('bpmnFactory'),
- elementFactory: modeler.value.get('elementFactory'),
- elementRegistry: modeler.value.get('elementRegistry'),
- replace: modeler.value.get('replace'),
- selection: modeler.value.get('selection')
- }
-
- // 检查所有实例是否都存在
- return Object.values(instances).every((instance) => instance)
- } catch (error) {
- console.error('初始化 bpmnInstances 失败:', error)
- return false
- }
-}
/** 初始化 modeler */
const initModeler = async (item) => {
- try {
- modeler.value = item
- // 等待 modeler 初始化完成
- await nextTick()
-
- // 确保 modeler 的所有实例都已经准备好
- if (initBpmnInstances()) {
- isModelerReady.value = true
- emit('init-finished')
-
- // 初始化完成后,设置初始值
- if (props.modelId) {
- // 编辑模式
- const data = await ModelApi.getModel(props.modelId)
- model.value = {
- ...data,
- bpmnXml: undefined // 清空 bpmnXml 属性
- }
- xmlString.value = data.bpmnXml || getDefaultBpmnXml(data.key, data.name)
- } else if (props.modelKey && props.modelName) {
- // 新建模式
- xmlString.value = props.value || getDefaultBpmnXml(props.modelKey, props.modelName)
- model.value = {
- key: props.modelKey,
- name: props.modelName
- } as ModelApi.ModelVO
- }
-
- // 导入XML并刷新视图
- await nextTick()
- try {
- await modeler.value.importXML(xmlString.value)
- if (processDesigner.value?.refresh) {
- processDesigner.value.refresh()
- }
- } catch (error) {
- console.error('导入XML失败:', error)
- }
- } else {
- console.error('modeler 实例未完全初始化')
- }
- } catch (error) {
- console.error('初始化 modeler 失败:', error)
- }
+ modeler.value = item
}
-/** 获取默认的BPMN XML */
-const getDefaultBpmnXml = (key: string, name: string) => {
- return `
-
-
-
-
-
-`
-}
/** 添加/修改模型 */
const save = async (bpmnXml: string) => {
try {
xmlString.value = bpmnXml
- if (props.modelId) {
- // 编辑模式
- const data = {
- ...model.value,
- bpmnXml: bpmnXml
- } as unknown as ModelApi.ModelVO
- await ModelApi.updateModelBpmn(data)
- emit('success')
- } else {
- // 新建模式,直接返回XML
- emit('success', bpmnXml)
- }
+ emit('success', bpmnXml)
} catch (error) {
console.error('保存失败:', error)
message.error('保存失败')
}
}
-// 监听 key、name 和 value 的变化
-watch(
- [() => props.modelKey, () => props.modelName, () => props.value],
- async ([newKey, newName, newValue]) => {
- if (!props.modelId && isModelerReady.value) {
- let shouldRefresh = false
-
- if (newKey && newName) {
- const newXml = newValue || getDefaultBpmnXml(newKey, newName)
- if (newXml !== xmlString.value) {
- xmlString.value = newXml
- shouldRefresh = true
- }
- model.value = {
- ...model.value,
- key: newKey,
- name: newName
- } as ModelApi.ModelVO
- } else if (newValue && newValue !== xmlString.value) {
- xmlString.value = newValue
- shouldRefresh = true
- }
-
- if (shouldRefresh) {
- // 确保更新后重新渲染
- await nextTick()
- if (processDesigner.value?.refresh) {
- try {
- await modeler.value?.importXML(xmlString.value)
- processDesigner.value.refresh()
- } catch (error) {
- console.error('导入XML失败:', error)
- }
- }
- }
- }
- },
- { deep: true }
-)
// 在组件卸载时清理
onBeforeUnmount(() => {
- isModelerReady.value = false
modeler.value = null
// 清理全局实例
const w = window as any
@@ -221,54 +96,7 @@ onBeforeUnmount(() => {
}
})
-/** 获取 XML 字符串 */
-const saveXML = async () => {
- if (!modeler.value) {
- return { xml: xmlString.value }
- }
- try {
- const result = await modeler.value.saveXML({ format: true })
- xmlString.value = result.xml
- return result
- } catch (error) {
- console.error('获取XML失败:', error)
- return { xml: xmlString.value }
- }
-}
-/** 获取SVG字符串 */
-const saveSVG = async () => {
- if (!modeler.value) {
- return { svg: undefined }
- }
- try {
- return await modeler.value.saveSVG()
- } catch (error) {
- console.error('获取SVG失败:', error)
- return { svg: undefined }
- }
-}
-
-/** 刷新视图 */
-const refresh = async () => {
- if (processDesigner.value?.refresh && modeler.value) {
- try {
- await modeler.value.importXML(xmlString.value)
- processDesigner.value.refresh()
- } catch (error) {
- console.error('刷新视图失败:', error)
- }
- }
-}
-
-// 暴露必要的属性和方法给父组件
-defineExpose({
- modeler,
- isModelerReady,
- saveXML,
- saveSVG,
- refresh
-})
From 42c1618202242bb193da1768fd0a9548ecee86c7 Mon Sep 17 00:00:00 2001
From: Lesan <1960681385@qq.com>
Date: Tue, 14 Jan 2025 09:12:53 +0800
Subject: [PATCH 31/86] =?UTF-8?q?fix:=20=E5=88=9B=E5=BB=BAUserTask?=
=?UTF-8?q?=E6=97=A0signEnable=E5=AD=97=E6=AE=B5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../src/nodes-config/UserTaskNodeConfig.vue | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue b/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue
index 131f7b9e..00ed6cfe 100644
--- a/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue
+++ b/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue
@@ -990,7 +990,7 @@ const showUserTaskNodeConfig = (node: SimpleFlowNode) => {
configForm.value.taskCompleteListenerHeader = node.taskCompleteListener?.header ?? []
configForm.value.taskCompleteListenerBody = node.taskCompleteListener?.body ?? []
// 6. 签名
- configForm.value.signEnable = node.signEnable ?? false
+ configForm.value.signEnable = node?.signEnable ?? false
}
defineExpose({ openDrawer, showUserTaskNodeConfig }) // 暴露方法给父组件
From 4fe158b2ec5d03bf5ca206c9e04e85bc1aa38bc7 Mon Sep 17 00:00:00 2001
From: zws <447643445@qq.com>
Date: Tue, 14 Jan 2025 12:00:08 +0800
Subject: [PATCH 32/86] =?UTF-8?q?perf:=20bpm=20=E4=BF=AE=E5=A4=8Dbpmn?=
=?UTF-8?q?=E8=AE=BE=E8=AE=A1=E5=99=A8=E4=B8=8D=E6=98=BE=E7=A4=BA=E9=97=AE?=
=?UTF-8?q?=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/views/bpm/model/editor/index.vue | 1 -
1 file changed, 1 deletion(-)
diff --git a/src/views/bpm/model/editor/index.vue b/src/views/bpm/model/editor/index.vue
index 512eb152..101ea1b8 100644
--- a/src/views/bpm/model/editor/index.vue
+++ b/src/views/bpm/model/editor/index.vue
@@ -3,7 +3,6 @@
Date: Wed, 15 Jan 2025 14:54:23 +0800
Subject: [PATCH 33/86] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=BB=84?=
=?UTF-8?q?=E4=BB=B6=E5=9C=A8keepAlive=E4=B8=8B=E5=88=B7=E6=96=B0=E4=B8=8D?=
=?UTF-8?q?=E8=A7=A6=E5=8F=91onActivated=E9=92=A9=E5=AD=90=E9=97=AE?=
=?UTF-8?q?=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/layout/components/TagsView/src/TagsView.vue | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/layout/components/TagsView/src/TagsView.vue b/src/layout/components/TagsView/src/TagsView.vue
index dcbb90fd..3bfb69df 100644
--- a/src/layout/components/TagsView/src/TagsView.vue
+++ b/src/layout/components/TagsView/src/TagsView.vue
@@ -243,7 +243,7 @@ const move = (to: number) => {
start()
}
-onMounted(() => {
+onBeforeMount(() => {
initTags()
addTags()
})
From 8df285aefb5abfbc1573988dc03da5718008738f Mon Sep 17 00:00:00 2001
From: zws <447643445@qq.com>
Date: Wed, 15 Jan 2025 14:57:23 +0800
Subject: [PATCH 34/86] =?UTF-8?q?fix:=20bpm=20=E7=94=A8onActivated?=
=?UTF-8?q?=E6=9B=BF=E6=8D=A2onMounted=20=E8=A7=A3=E5=86=B3=E6=96=B0?=
=?UTF-8?q?=E5=A2=9E=E6=A8=A1=E5=9E=8B=E8=BF=94=E5=9B=9E=E5=90=8E=E4=B8=8D?=
=?UTF-8?q?=E5=88=B7=E6=96=B0=E6=96=B0=E7=9A=84=E6=95=B0=E6=8D=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/views/bpm/model/index.vue | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/views/bpm/model/index.vue b/src/views/bpm/model/index.vue
index c7d94170..8132bf73 100644
--- a/src/views/bpm/model/index.vue
+++ b/src/views/bpm/model/index.vue
@@ -207,6 +207,8 @@ const getList = async () => {
/** 初始化 **/
onMounted(() => {
+})
+onActivated(()=>{
getList()
})
From b1174313185998677be5a7142a0f716563e0b478 Mon Sep 17 00:00:00 2001
From: zws <447643445@qq.com>
Date: Wed, 15 Jan 2025 15:04:23 +0800
Subject: [PATCH 35/86] =?UTF-8?q?feat:=20bpm=20=E6=B7=BB=E5=8A=A0=E6=B5=81?=
=?UTF-8?q?=E7=A8=8B=E6=A8=A1=E5=9E=8B=E5=A4=8D=E5=88=B6=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/router/modules/remaining.ts | 2 +-
src/views/bpm/model/CategoryDraggableModel.vue | 11 ++++++++++-
src/views/bpm/model/form/index.vue | 5 ++++-
3 files changed, 15 insertions(+), 3 deletions(-)
diff --git a/src/router/modules/remaining.ts b/src/router/modules/remaining.ts
index 806f954d..34466079 100644
--- a/src/router/modules/remaining.ts
+++ b/src/router/modules/remaining.ts
@@ -344,7 +344,7 @@ const remainingRouter: AppRouteRecordRaw[] = [
}
},
{
- path: 'manager/model/update/:id',
+ path: 'manager/model/:type/:id',
component: () => import('@/views/bpm/model/form/index.vue'),
name: 'BpmModelUpdate',
meta: {
diff --git a/src/views/bpm/model/CategoryDraggableModel.vue b/src/views/bpm/model/CategoryDraggableModel.vue
index f3b5a422..8fe6e14d 100644
--- a/src/views/bpm/model/CategoryDraggableModel.vue
+++ b/src/views/bpm/model/CategoryDraggableModel.vue
@@ -163,6 +163,15 @@
>
修改
+
+ 复制
+
{
} else {
push({
name: 'BpmModelUpdate',
- params: { id }
+ params: { id, type }
})
}
}
diff --git a/src/views/bpm/model/form/index.vue b/src/views/bpm/model/form/index.vue
index 3a45e716..6c5cb21a 100644
--- a/src/views/bpm/model/form/index.vue
+++ b/src/views/bpm/model/form/index.vue
@@ -162,7 +162,10 @@ const initData = async () => {
if (modelId) {
// 修改场景
formData.value = await ModelApi.getModel(modelId)
-
+ // 复制场景
+ if (route.params.type === 'copy') {
+ delete formData.value.id
+ }
} else {
// 新增场景
formData.value.managerUserIds.push(userStore.getUser.id)
From 6fba4b722805f742e0e6804827b6f34d8444bdac Mon Sep 17 00:00:00 2001
From: YunaiV
Date: Wed, 15 Jan 2025 20:25:07 +0800
Subject: [PATCH 36/86] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E8=AF=84?=
=?UTF-8?q?=E5=AE=A1=E3=80=91BPM=EF=BC=9A=E6=B5=81=E7=A8=8B=E7=BC=96?=
=?UTF-8?q?=E8=BE=91?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../src/SimpleProcessDesigner.vue | 7 +--
.../src/SimpleProcessModel.vue | 53 +++++++++----------
src/router/modules/remaining.ts | 1 +
src/views/bpm/model/editor/index.vue | 8 +--
src/views/bpm/model/form/ProcessDesign.vue | 10 ----
src/views/bpm/model/form/index.vue | 40 +++++++-------
src/views/bpm/model/index.vue | 4 +-
src/views/bpm/simple/SimpleModelDesign.vue | 14 +----
8 files changed, 51 insertions(+), 86 deletions(-)
diff --git a/src/components/SimpleProcessDesignerV2/src/SimpleProcessDesigner.vue b/src/components/SimpleProcessDesignerV2/src/SimpleProcessDesigner.vue
index 1125d8e7..70eade33 100644
--- a/src/components/SimpleProcessDesignerV2/src/SimpleProcessDesigner.vue
+++ b/src/components/SimpleProcessDesignerV2/src/SimpleProcessDesigner.vue
@@ -63,8 +63,6 @@ const props = defineProps({
})
const processData = inject('processData') as Ref
-
-
const loading = ref(false)
const formFields = ref([])
const formType = ref(20)
@@ -110,7 +108,6 @@ const updateModel = () => {
}
}
-
const saveSimpleFlowModel = async (simpleModelNode: SimpleFlowNode) => {
if (!simpleModelNode) {
return
@@ -201,7 +198,5 @@ onMounted(async () => {
const simpleProcessModelRef = ref()
-
-defineExpose({
-})
+defineExpose({})
diff --git a/src/components/SimpleProcessDesignerV2/src/SimpleProcessModel.vue b/src/components/SimpleProcessDesignerV2/src/SimpleProcessModel.vue
index b9a26475..23f2d791 100644
--- a/src/components/SimpleProcessDesignerV2/src/SimpleProcessModel.vue
+++ b/src/components/SimpleProcessDesignerV2/src/SimpleProcessModel.vue
@@ -3,10 +3,15 @@
- 导出
- 导入
+
+ 导出
+
+
+ 导入
+
{{ scaleValue }}%
-
-
-
-
-
-
-
-
-
@@ -53,7 +49,7 @@
import ProcessNodeTree from './ProcessNodeTree.vue'
import { SimpleFlowNode, NodeType, NODE_DEFAULT_TEXT } from './consts'
import { useWatchNode } from './node'
-import { ZoomOut, ZoomIn, ScaleToOriginal, Select } from '@element-plus/icons-vue'
+import { ZoomOut, ZoomIn, ScaleToOriginal } from '@element-plus/icons-vue'
import { isString } from '@/utils/is'
defineOptions({
@@ -73,7 +69,7 @@ const props = defineProps({
})
const emits = defineEmits<{
- 'save': [node: SimpleFlowNode | undefined]
+ save: [node: SimpleFlowNode | undefined]
}>()
const processNodeTree = useWatchNode(props)
@@ -175,25 +171,28 @@ defineExpose({
getCurrentFlowData
})
+/** 导出 JSON */
+// TODO @zws:增加一个 download 里面搞个 json 更好
const exportJson = () => {
- const blob = new Blob([JSON.stringify(processNodeTree.value)]);
- const tempLink = document.createElement('a'); // 创建a标签
- const href = window.URL.createObjectURL(blob); // 创建下载的链接
- //filename
- const fileName = `model.json`;
- tempLink.href = href;
- tempLink.target = '_blank';
- tempLink.download = fileName;
- document.body.appendChild(tempLink);
- tempLink.click(); // 点击下载
- document.body.removeChild(tempLink); // 下载完成移除元素
- window.URL.revokeObjectURL(href); // 释放掉blob对象
+ const blob = new Blob([JSON.stringify(processNodeTree.value)])
+ const tempLink = document.createElement('a') // 创建a标签
+ const href = window.URL.createObjectURL(blob) // 创建下载的链接
+ // filename
+ const fileName = `model.json`
+ tempLink.href = href
+ tempLink.target = '_blank'
+ tempLink.download = fileName
+ document.body.appendChild(tempLink)
+ tempLink.click() // 点击下载
+ document.body.removeChild(tempLink) // 下载完成移除元素
+ window.URL.revokeObjectURL(href) // 释放掉 blob 对象
}
+
+/** 导入 JSON */
+const refFile = ref()
const importJson = () => {
refFile.value.click()
}
-const refFile = ref()
-// 加载本地文件
const importLocalFile = () => {
const file = refFile.value.files[0]
const reader = new FileReader()
diff --git a/src/router/modules/remaining.ts b/src/router/modules/remaining.ts
index 34466079..4b177ae8 100644
--- a/src/router/modules/remaining.ts
+++ b/src/router/modules/remaining.ts
@@ -344,6 +344,7 @@ const remainingRouter: AppRouteRecordRaw[] = [
}
},
{
+ // TODO @zws:1)建议,在加一个路由。然后标题是“复制流程”,这样体验会好点;2)复制出来的数据,在名字前面,加“副本 ”,和钉钉保持一致!
path: 'manager/model/:type/:id',
component: () => import('@/views/bpm/model/form/index.vue'),
name: 'BpmModelUpdate',
diff --git a/src/views/bpm/model/editor/index.vue b/src/views/bpm/model/editor/index.vue
index 101ea1b8..b91c250e 100644
--- a/src/views/bpm/model/editor/index.vue
+++ b/src/views/bpm/model/editor/index.vue
@@ -51,7 +51,7 @@ const formType = ref(20)
provide('formFields', formFields)
provide('formType', formType)
-//注入 流程数据
+// 注入流程数据
const xmlString = inject('processData') as Ref
const modeler = shallowRef() // BPMN Modeler
@@ -66,13 +66,12 @@ const controlForm = ref({
})
const model = ref
() // 流程模型的信息
-
/** 初始化 modeler */
+// TODO @zws:需要初始化,不然首次创建后,无法发布!相当于说,key、name 要去赋值下
const initModeler = async (item) => {
modeler.value = item
}
-
/** 添加/修改模型 */
const save = async (bpmnXml: string) => {
try {
@@ -84,7 +83,6 @@ const save = async (bpmnXml: string) => {
}
}
-
// 在组件卸载时清理
onBeforeUnmount(() => {
modeler.value = null
@@ -94,8 +92,6 @@ onBeforeUnmount(() => {
w.bpmnInstances = null
}
})
-
-
From 9849a040c00fef3d6214876241a38549b2b881cb Mon Sep 17 00:00:00 2001
From: zws <447643445@qq.com>
Date: Thu, 16 Jan 2025 09:20:57 +0800
Subject: [PATCH 37/86] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0download.json()?=
=?UTF-8?q?=E6=96=B9=E6=B3=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/utils/download.ts | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/src/utils/download.ts b/src/utils/download.ts
index 5bbfb9fe..0820136f 100644
--- a/src/utils/download.ts
+++ b/src/utils/download.ts
@@ -33,6 +33,10 @@ const download = {
markdown: (data: Blob, fileName: string) => {
download0(data, fileName, 'text/markdown')
},
+ // 下载 Json 方法
+ json: (data: Blob, fileName: string) => {
+ download0(data, fileName, 'application/json')
+ },
// 下载图片(允许跨域)
image: ({
url,
From 2f7200abdb576ec8bebe0d222f18525c29bea52f Mon Sep 17 00:00:00 2001
From: zws <447643445@qq.com>
Date: Thu, 16 Jan 2025 09:26:38 +0800
Subject: [PATCH 38/86] =?UTF-8?q?feat:=20=E4=BB=8Evue-element-plus-admin?=
=?UTF-8?q?=E9=A1=B9=E7=9B=AE=20=E5=90=8C=E6=AD=A5TagsView=E4=BB=A3?=
=?UTF-8?q?=E7=A0=81=20=E5=AE=9E=E7=8E=B0=E8=AE=BE=E7=BD=AE=E8=B7=AF?=
=?UTF-8?q?=E7=94=B1=E6=A0=87=E9=A2=98=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../components/TagsView/src/TagsView.vue | 107 ++++++++++--------
src/store/modules/tagsView.ts | 26 ++++-
2 files changed, 84 insertions(+), 49 deletions(-)
diff --git a/src/layout/components/TagsView/src/TagsView.vue b/src/layout/components/TagsView/src/TagsView.vue
index 3bfb69df..ce041b2b 100644
--- a/src/layout/components/TagsView/src/TagsView.vue
+++ b/src/layout/components/TagsView/src/TagsView.vue
@@ -12,6 +12,11 @@ import { useDesign } from '@/hooks/web/useDesign'
import { useTemplateRefsList } from '@vueuse/core'
import { ElScrollbar } from 'element-plus'
import { useScrollTo } from '@/hooks/event/useScrollTo'
+import { useTagsView } from '@/hooks/web/useTagsView'
+import { cloneDeep } from 'lodash-es'
+
+
+defineOptions({ name: 'TagsView' })
const { getPrefixCls } = useDesign()
@@ -19,7 +24,9 @@ const prefixCls = getPrefixCls('tags-view')
const { t } = useI18n()
-const { currentRoute, push, replace } = useRouter()
+const { currentRoute, push } = useRouter()
+
+const { closeAll, closeLeft, closeRight, closeOther, closeCurrent, refreshPage } = useTagsView()
const permissionStore = usePermissionStore()
@@ -31,6 +38,10 @@ const visitedViews = computed(() => tagsViewStore.getVisitedViews)
const affixTagArr = ref([])
+const selectedTag = computed(() => tagsViewStore.getSelectedTag)
+
+const setSelectTag = tagsViewStore.setSelectedTag
+
const appStore = useAppStore()
const tagsViewImmerse = computed(() => appStore.getTagsViewImmerse)
@@ -45,66 +56,30 @@ const initTags = () => {
for (const tag of unref(affixTagArr)) {
// Must have tag name
if (tag.name) {
- tagsViewStore.addVisitedView(tag)
+ tagsViewStore.addVisitedView(cloneDeep(tag))
}
}
}
-const selectedTag = ref()
-
// 新增tag
const addTags = () => {
const { name } = unref(currentRoute)
if (name) {
- selectedTag.value = unref(currentRoute)
+ setSelectTag(unref(currentRoute))
tagsViewStore.addView(unref(currentRoute))
}
- return false
}
// 关闭选中的tag
const closeSelectedTag = (view: RouteLocationNormalizedLoaded) => {
- if (view?.meta?.affix) return
- tagsViewStore.delView(view)
- if (isActive(view)) {
- toLastView()
- }
-}
-
-// 关闭全部
-const closeAllTags = () => {
- tagsViewStore.delAllViews()
- toLastView()
-}
-
-// 关闭其它
-const closeOthersTags = () => {
- tagsViewStore.delOthersViews(unref(selectedTag) as RouteLocationNormalizedLoaded)
-}
-
-// 重新加载
-const refreshSelectedTag = async (view?: RouteLocationNormalizedLoaded) => {
- if (!view) return
- tagsViewStore.delCachedView()
- const { path, query } = view
- await nextTick()
- replace({
- path: '/redirect' + path,
- query: query
+ closeCurrent(view, () => {
+ if (isActive(view)) {
+ toLastView()
+ }
})
}
-// 关闭左侧
-const closeLeftTags = () => {
- tagsViewStore.delLeftViews(unref(selectedTag) as RouteLocationNormalizedLoaded)
-}
-
-// 关闭右侧
-const closeRightTags = () => {
- tagsViewStore.delRightViews(unref(selectedTag) as RouteLocationNormalizedLoaded)
-}
-
-// 跳转到最后一个
+// 去最后一个
const toLastView = () => {
const visitedViews = tagsViewStore.getVisitedViews
const latestView = visitedViews.slice(-1)[0]
@@ -118,11 +93,38 @@ const toLastView = () => {
addTags()
return
}
- // TODO: You can set another route
- push('/')
+ // You can set another route
+ push(permissionStore.getAddRouters[0].path)
}
}
+// 关闭全部
+const closeAllTags = () => {
+ closeAll(() => {
+ toLastView()
+ })
+}
+
+// 关闭其它
+const closeOthersTags = () => {
+ closeOther()
+}
+
+// 重新加载
+const refreshSelectedTag = async (view?: RouteLocationNormalizedLoaded) => {
+ refreshPage(view)
+}
+
+// 关闭左侧
+const closeLeftTags = () => {
+ closeLeft()
+}
+
+// 关闭右侧
+const closeRightTags = () => {
+ closeRight()
+}
+
// 滚动到选中的tag
const moveToCurrentTag = async () => {
await nextTick()
@@ -209,13 +211,14 @@ const isActive = (route: RouteLocationNormalizedLoaded): boolean => {
// 所有右键菜单组件的元素
const itemRefs = useTemplateRefsList>()
-// 右键菜单装填改变的时候
+// 右键菜单状态改变的时候
const visibleChange = (visible: boolean, tagItem: RouteLocationNormalizedLoaded) => {
if (visible) {
for (const v of unref(itemRefs)) {
const elDropdownMenuRef = v.elDropdownMenuRef
if (tagItem.fullPath !== v.tagItem.fullPath) {
elDropdownMenuRef?.handleClose()
+ setSelectTag(tagItem)
}
}
}
@@ -243,6 +246,16 @@ const move = (to: number) => {
start()
}
+const canShowIcon = (item: RouteLocationNormalizedLoaded) => {
+ if (
+ (item?.matched?.[1]?.meta?.icon && unref(tagsViewIcon)) ||
+ (item?.meta?.affix && unref(tagsViewIcon) && item?.meta?.icon)
+ ) {
+ return true
+ }
+ return false
+}
+
onBeforeMount(() => {
initTags()
addTags()
diff --git a/src/store/modules/tagsView.ts b/src/store/modules/tagsView.ts
index 4368efe0..f565ef95 100644
--- a/src/store/modules/tagsView.ts
+++ b/src/store/modules/tagsView.ts
@@ -4,16 +4,19 @@ import { getRawRoute } from '@/utils/routerHelper'
import { defineStore } from 'pinia'
import { store } from '../index'
import { findIndex } from '@/utils'
+import { useUserStoreWithOut } from './user'
export interface TagsViewState {
visitedViews: RouteLocationNormalizedLoaded[]
cachedViews: Set
+ selectedTag?: RouteLocationNormalizedLoaded
}
export const useTagsViewStore = defineStore('tagsView', {
state: (): TagsViewState => ({
visitedViews: [],
- cachedViews: new Set()
+ cachedViews: new Set(),
+ selectedTag: undefined
}),
getters: {
getVisitedViews(): RouteLocationNormalizedLoaded[] {
@@ -21,6 +24,9 @@ export const useTagsViewStore = defineStore('tagsView', {
},
getCachedViews(): string[] {
return Array.from(this.cachedViews)
+ },
+ getSelectedTag(): RouteLocationNormalizedLoaded | undefined {
+ return this.selectedTag
}
},
actions: {
@@ -98,8 +104,12 @@ export const useTagsViewStore = defineStore('tagsView', {
},
// 删除所有tag
delAllVisitedViews() {
+ const userStore = useUserStoreWithOut()
+
// const affixTags = this.visitedViews.filter((tag) => tag.meta.affix)
- this.visitedViews = []
+ this.visitedViews = userStore.getUser
+ ? this.visitedViews.filter((tag) => tag?.meta?.affix)
+ : []
},
// 删除其他
delOthersViews(view: RouteLocationNormalizedLoaded) {
@@ -145,6 +155,18 @@ export const useTagsViewStore = defineStore('tagsView', {
break
}
}
+ },
+ // 设置当前选中的tag
+ setSelectedTag(tag: RouteLocationNormalizedLoaded) {
+ this.selectedTag = tag
+ },
+ setTitle(title: string, path?: string) {
+ for (const v of this.visitedViews) {
+ if (v.path === (path ?? this.selectedTag?.path)) {
+ v.meta.title = title
+ break
+ }
+ }
}
},
persist: false
From e44f48c0c4bb371913242a00981e96e9f774a0f6 Mon Sep 17 00:00:00 2001
From: zws <447643445@qq.com>
Date: Thu, 16 Jan 2025 09:27:30 +0800
Subject: [PATCH 39/86] =?UTF-8?q?perf:=20bpm=E6=A8=A1=E5=9E=8B=E5=A4=8D?=
=?UTF-8?q?=E5=88=B6=E4=BC=98=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/views/bpm/model/CategoryDraggableModel.vue | 6 ++++++
src/views/bpm/model/form/index.vue | 2 ++
2 files changed, 8 insertions(+)
diff --git a/src/views/bpm/model/CategoryDraggableModel.vue b/src/views/bpm/model/CategoryDraggableModel.vue
index 8fe6e14d..9c5b9b13 100644
--- a/src/views/bpm/model/CategoryDraggableModel.vue
+++ b/src/views/bpm/model/CategoryDraggableModel.vue
@@ -254,6 +254,7 @@ import { checkPermi } from '@/utils/permission'
import { useUserStoreWithOut } from '@/store/modules/user'
import { useAppStore } from '@/store/modules/app'
import { cloneDeep } from 'lodash-es'
+import {useTagsView} from "@/hooks/web/useTagsView";
defineOptions({ name: 'BpmModel' })
@@ -474,6 +475,7 @@ const handleDeleteCategory = async () => {
} catch {}
}
+const tagsView = useTagsView();
/** 添加流程模型弹窗 */
const modelFormRef = ref()
const openModelForm = (type: string, id?: number) => {
@@ -483,6 +485,10 @@ const openModelForm = (type: string, id?: number) => {
push({
name: 'BpmModelUpdate',
params: { id, type }
+ }).then((_) => {
+ if (type === 'copy') {
+ tagsView.setTitle('复制流程')
+ }
})
}
}
diff --git a/src/views/bpm/model/form/index.vue b/src/views/bpm/model/form/index.vue
index 0d20e7ce..37fa6bf0 100644
--- a/src/views/bpm/model/form/index.vue
+++ b/src/views/bpm/model/form/index.vue
@@ -160,6 +160,8 @@ const initData = async () => {
// 复制场景
if (route.params.type === 'copy') {
delete formData.value.id
+ formData.value.name += '副本'
+ formData.value.key += '_copy'
}
} else {
// 新增场景
From 9febee7abe0f9a05714a6e54600a5b9a63111fd6 Mon Sep 17 00:00:00 2001
From: zws <447643445@qq.com>
Date: Thu, 16 Jan 2025 09:29:11 +0800
Subject: [PATCH 40/86] =?UTF-8?q?perf:=20=E7=94=A8download.json=20?=
=?UTF-8?q?=E6=9B=BF=E6=8D=A2=E6=A8=A1=E5=9E=8Bjson=E4=B8=8B=E8=BD=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../src/SimpleProcessModel.vue | 14 ++------------
1 file changed, 2 insertions(+), 12 deletions(-)
diff --git a/src/components/SimpleProcessDesignerV2/src/SimpleProcessModel.vue b/src/components/SimpleProcessDesignerV2/src/SimpleProcessModel.vue
index 23f2d791..5d3071b4 100644
--- a/src/components/SimpleProcessDesignerV2/src/SimpleProcessModel.vue
+++ b/src/components/SimpleProcessDesignerV2/src/SimpleProcessModel.vue
@@ -51,6 +51,7 @@ import { SimpleFlowNode, NodeType, NODE_DEFAULT_TEXT } from './consts'
import { useWatchNode } from './node'
import { ZoomOut, ZoomIn, ScaleToOriginal } from '@element-plus/icons-vue'
import { isString } from '@/utils/is'
+import download from "@/utils/download";
defineOptions({
name: 'SimpleProcessModel'
@@ -174,18 +175,7 @@ defineExpose({
/** 导出 JSON */
// TODO @zws:增加一个 download 里面搞个 json 更好
const exportJson = () => {
- const blob = new Blob([JSON.stringify(processNodeTree.value)])
- const tempLink = document.createElement('a') // 创建a标签
- const href = window.URL.createObjectURL(blob) // 创建下载的链接
- // filename
- const fileName = `model.json`
- tempLink.href = href
- tempLink.target = '_blank'
- tempLink.download = fileName
- document.body.appendChild(tempLink)
- tempLink.click() // 点击下载
- document.body.removeChild(tempLink) // 下载完成移除元素
- window.URL.revokeObjectURL(href) // 释放掉 blob 对象
+ download.json(new Blob([JSON.stringify(processNodeTree.value)]), 'model.json')
}
/** 导入 JSON */
From 84552a62533f8943f4a5ec8d86aaeacb3dc1edcb Mon Sep 17 00:00:00 2001
From: zws <447643445@qq.com>
Date: Thu, 16 Jan 2025 09:29:34 +0800
Subject: [PATCH 41/86] =?UTF-8?q?fix:=20=E8=A7=A3=E5=86=B3=E5=AF=BC?=
=?UTF-8?q?=E5=85=A5=E6=A8=A1=E5=9E=8Bjson=20=E6=95=B0=E6=8D=AE=E6=B2=A1?=
=?UTF-8?q?=E6=9C=89=E4=BF=9D=E5=AD=98=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../SimpleProcessDesignerV2/src/SimpleProcessModel.vue | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/components/SimpleProcessDesignerV2/src/SimpleProcessModel.vue b/src/components/SimpleProcessDesignerV2/src/SimpleProcessModel.vue
index 5d3071b4..ad0c7b19 100644
--- a/src/components/SimpleProcessDesignerV2/src/SimpleProcessModel.vue
+++ b/src/components/SimpleProcessDesignerV2/src/SimpleProcessModel.vue
@@ -190,6 +190,7 @@ const importLocalFile = () => {
reader.onload = function () {
if (isString(this.result)) {
processNodeTree.value = JSON.parse(this.result)
+ emits('save', processNodeTree.value)
}
}
}
From 66d8cf1233504e4a865264a47a368e8f68354df7 Mon Sep 17 00:00:00 2001
From: zws <447643445@qq.com>
Date: Thu, 16 Jan 2025 10:10:46 +0800
Subject: [PATCH 42/86] =?UTF-8?q?fix:=20=E8=A7=A3=E5=86=B3bpmn=E8=AE=BE?=
=?UTF-8?q?=E8=AE=A1=E5=99=A8=20=E5=88=9D=E6=AC=A1=E5=88=9B=E5=BB=BA?=
=?UTF-8?q?=E6=B5=81=E7=A8=8Bkey=E4=B8=8D=E4=B8=80=E8=87=B4=E9=97=AE?=
=?UTF-8?q?=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../package/penal/base/ElementBaseInfo.vue | 3 +++
src/views/bpm/model/editor/index.vue | 6 ++++++
src/views/bpm/model/form/index.vue | 1 +
3 files changed, 10 insertions(+)
diff --git a/src/components/bpmnProcessDesigner/package/penal/base/ElementBaseInfo.vue b/src/components/bpmnProcessDesigner/package/penal/base/ElementBaseInfo.vue
index 70ad4f8b..3172338d 100644
--- a/src/components/bpmnProcessDesigner/package/penal/base/ElementBaseInfo.vue
+++ b/src/components/bpmnProcessDesigner/package/penal/base/ElementBaseInfo.vue
@@ -152,6 +152,9 @@ watch(
handleKeyUpdate(props.model.key)
handleNameUpdate(props.model.name)
}
+ },
+ {
+ immediate: true
}
)
diff --git a/src/views/bpm/model/editor/index.vue b/src/views/bpm/model/editor/index.vue
index b91c250e..1076cf56 100644
--- a/src/views/bpm/model/editor/index.vue
+++ b/src/views/bpm/model/editor/index.vue
@@ -12,6 +12,8 @@
:additionalModel="controlForm.additionalModel"
:model="model"
@save="save"
+ :process-id="modelKey"
+ :process-name="modelName"
/>
() // 流程模型的信息
/** 初始化 modeler */
// TODO @zws:需要初始化,不然首次创建后,无法发布!相当于说,key、name 要去赋值下
const initModeler = async (item) => {
+ //先初始化模型数据
+ model.value = modelData.value
modeler.value = item
}
diff --git a/src/views/bpm/model/form/index.vue b/src/views/bpm/model/form/index.vue
index 37fa6bf0..43e5c0a7 100644
--- a/src/views/bpm/model/form/index.vue
+++ b/src/views/bpm/model/form/index.vue
@@ -145,6 +145,7 @@ const formData: any = ref({
const processData = ref()
provide('processData', processData)
+provide('modelData', formData)
// 数据列表
const formList = ref([])
From d52e77913125820fd3f198be5edcc2b3d95ed5cf Mon Sep 17 00:00:00 2001
From: zws <447643445@qq.com>
Date: Thu, 16 Jan 2025 10:18:20 +0800
Subject: [PATCH 43/86] =?UTF-8?q?fix:=20=E8=A7=A3=E5=86=B3=E5=AF=BC?=
=?UTF-8?q?=E5=85=A5=E6=A8=A1=E5=9E=8Bxml=20=E6=95=B0=E6=8D=AE=E6=B2=A1?=
=?UTF-8?q?=E6=9C=89=E4=BF=9D=E5=AD=98=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../bpmnProcessDesigner/package/designer/ProcessDesigner.vue | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/components/bpmnProcessDesigner/package/designer/ProcessDesigner.vue b/src/components/bpmnProcessDesigner/package/designer/ProcessDesigner.vue
index 5b3d14f4..83d40fbf 100644
--- a/src/components/bpmnProcessDesigner/package/designer/ProcessDesigner.vue
+++ b/src/components/bpmnProcessDesigner/package/designer/ProcessDesigner.vue
@@ -547,6 +547,7 @@ const importLocalFile = () => {
reader.onload = function () {
let xmlStr = this.result
createNewDiagram(xmlStr)
+ emit('save', xmlStr)
}
}
/* ------------------------------------------------ refs methods ------------------------------------------------------ */
From 8e5271a6d6724e6ad336634fea25d8ed65ec6189 Mon Sep 17 00:00:00 2001
From: YunaiV
Date: Thu, 16 Jan 2025 13:01:06 +0800
Subject: [PATCH 44/86] =?UTF-8?q?=E3=80=90=E5=8A=9F=E8=83=BD=E8=AF=84?=
=?UTF-8?q?=E5=AE=A1=E3=80=91Bpm=EF=BC=9A=E5=AE=A1=E6=89=B9=E7=AD=BE?=
=?UTF-8?q?=E5=90=8D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pnpm-lock.yaml | 103 ++++++-----------
src/api/bpm/processInstance/index.ts | 4 +-
.../src/nodes-config/RouterNodeConfig.vue | 11 +-
.../src/nodes-config/UserTaskNodeConfig.vue | 1 +
.../detail/ProcessInstanceOperationButton.vue | 104 ++++++++++--------
.../detail/ProcessInstanceTimeline.vue | 8 +-
.../bpm/processInstance/detail/SignDialog.vue | 39 +++----
7 files changed, 126 insertions(+), 144 deletions(-)
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 50e9bf96..ec016eb1 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -45,8 +45,8 @@ dependencies:
specifier: ^1.1.5
version: 1.1.5
bpmn-js-token-simulation:
- specifier: ^0.10.0
- version: 0.10.0
+ specifier: ^0.36.0
+ version: 0.36.0
camunda-bpmn-moddle:
specifier: ^7.0.1
version: 7.0.1
@@ -149,6 +149,9 @@ dependencies:
vue-types:
specifier: ^5.1.1
version: 5.1.3(vue@3.5.12)
+ vue3-signature:
+ specifier: ^0.2.4
+ version: 0.2.4(vue@3.5.12)
vuedraggable:
specifier: ^4.1.0
version: 4.1.0(vue@3.5.12)
@@ -4581,12 +4584,14 @@ packages:
min-dom: 4.2.1
dev: true
- /bpmn-js-token-simulation@0.10.0:
- resolution: {integrity: sha512-QuZQ/KVXKt9Vl+XENyOBoTW2Aw+uKjuBlKdCJL6El7AyM7DkJ5bZkSYURshId1SkBDdYg2mJ1flSmsrhGuSfwg==, tarball: https://registry.npmmirror.com/bpmn-js-token-simulation/-/bpmn-js-token-simulation-0.10.0.tgz}
+ /bpmn-js-token-simulation@0.36.0:
+ resolution: {integrity: sha512-vz+RHlbZCev/6dzk6FhJRz8M0aZ1GL7Xrza0ecWqeg4tHbgPozgyOm3tXTz75XdtOwRVVBzmCjcciXQX7A55wQ==, tarball: https://registry.npmmirror.com/bpmn-js-token-simulation/-/bpmn-js-token-simulation-0.36.0.tgz}
+ engines: {node: '>= 16'}
dependencies:
- min-dash: 3.8.1
- min-dom: 0.2.0
- svg.js: 2.7.1
+ inherits-browser: 0.1.0
+ min-dash: 4.2.2
+ min-dom: 4.2.1
+ randomcolor: 0.6.2
dev: false
/bpmn-js@17.11.1:
@@ -4927,51 +4932,13 @@ packages:
dot-prop: 5.3.0
dev: true
- /component-classes@1.2.6:
- resolution: {integrity: sha512-hPFGULxdwugu1QWW3SvVOCUHLzO34+a2J6Wqy0c5ASQkfi9/8nZcBB0ZohaEbXOQlCflMAEMmEWk7u7BVs4koA==, tarball: https://registry.npmmirror.com/component-classes/-/component-classes-1.2.6.tgz}
- dependencies:
- component-indexof: 0.0.3
- dev: false
-
- /component-closest@0.1.4:
- resolution: {integrity: sha512-NF9hMj6JKGM5sb6wP/dg7GdJOttaIH9PcTsUNdWcrvu7Kw/5R5swQAFpgaYEHlARrNMyn4Wf7O1PlRej+pt76Q==, tarball: https://registry.npmmirror.com/component-closest/-/component-closest-0.1.4.tgz}
- dependencies:
- component-matches-selector: 0.1.7
- dev: false
-
- /component-delegate@0.2.4:
- resolution: {integrity: sha512-OlpcB/6Fi+kXQPh/TfXnSvvmrU04ghz7vcJh/jgLF0Ni+I+E3WGlKJQbBGDa5X+kVUG8WxOgjP+8iWbz902fPg==, tarball: https://registry.npmmirror.com/component-delegate/-/component-delegate-0.2.4.tgz}
- dependencies:
- component-closest: 0.1.4
- component-event: 0.1.4
- dev: false
-
/component-emitter@1.3.1:
resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==, tarball: https://registry.npmmirror.com/component-emitter/-/component-emitter-1.3.1.tgz}
dev: true
- /component-event@0.1.4:
- resolution: {integrity: sha512-GMwOG8MnUHP1l8DZx1ztFO0SJTFnIzZnBDkXAj8RM2ntV2A6ALlDxgbMY1Fvxlg6WPQ+5IM/a6vg4PEYbjg/Rw==, tarball: https://registry.npmmirror.com/component-event/-/component-event-0.1.4.tgz}
- dev: false
-
/component-event@0.2.1:
resolution: {integrity: sha512-wGA++isMqiDq1jPYeyv2as/Bt/u+3iLW0rEa+8NQ82jAv3TgqMiCM+B2SaBdn2DfLilLjjq736YcezihRYhfxw==, tarball: https://registry.npmmirror.com/component-event/-/component-event-0.2.1.tgz}
- /component-indexof@0.0.3:
- resolution: {integrity: sha512-puDQKvx/64HZXb4hBwIcvQLaLgux8o1CbWl39s41hrIIZDl1lJiD5jc22gj3RBeGK0ovxALDYpIbyjqDUUl0rw==, tarball: https://registry.npmmirror.com/component-indexof/-/component-indexof-0.0.3.tgz}
- dev: false
-
- /component-matches-selector@0.1.7:
- resolution: {integrity: sha512-Yb2+pVBvrqkQVpPaDBF0DYXRreBveXJNrpJs9FnFu8PF6/5IIcz5oDZqiH9nB5hbD2/TmFVN5ZCxBzqu7yFFYQ==, tarball: https://registry.npmmirror.com/component-matches-selector/-/component-matches-selector-0.1.7.tgz}
- dependencies:
- component-query: 0.0.3
- global-object: 1.0.0
- dev: false
-
- /component-query@0.0.3:
- resolution: {integrity: sha512-VgebQseT1hz1Ps7vVp2uaSg+N/gsI5ts3AZUSnN6GMA2M82JH7o+qYifWhmVE/e8w/H48SJuA3nA9uX8zRe95Q==, tarball: https://registry.npmmirror.com/component-query/-/component-query-0.0.3.tgz}
- dev: false
-
/compute-scroll-into-view@1.0.20:
resolution: {integrity: sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==, tarball: https://registry.npmmirror.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz}
dev: false
@@ -5521,6 +5488,10 @@ packages:
resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, tarball: https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz}
dev: true
+ /default-passive-events@2.0.0:
+ resolution: {integrity: sha512-eMtt76GpDVngZQ3ocgvRcNCklUMwID1PaNbCNxfpDXuiOXttSh0HzBbda1HU9SIUsDc02vb7g9+3I5tlqe/qMQ==, tarball: https://registry.npmmirror.com/default-passive-events/-/default-passive-events-2.0.0.tgz}
+ dev: false
+
/define-data-property@1.1.4:
resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==, tarball: https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.4.tgz}
engines: {node: '>= 0.4'}
@@ -6674,10 +6645,6 @@ packages:
global-prefix: 3.0.0
dev: true
- /global-object@1.0.0:
- resolution: {integrity: sha512-mSPSkY6UsHv6hgW0V2dfWBWTS8TnPnLx3ECVNoWp6rBI2Bg66VYoqGoTFlH/l7XhAZ/l+StYlntXlt87BEeCcg==, tarball: https://registry.npmmirror.com/global-object/-/global-object-1.0.0.tgz}
- dev: false
-
/global-prefix@3.0.0:
resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==, tarball: https://registry.npmmirror.com/global-prefix/-/global-prefix-3.0.0.tgz}
engines: {node: '>=6'}
@@ -7899,10 +7866,6 @@ packages:
engines: {node: '>=18'}
dev: true
- /min-dash@3.8.1:
- resolution: {integrity: sha512-evumdlmIlg9mbRVPbC4F5FuRhNmcMS5pvuBUbqb1G9v09Ro0ImPEgz5n3khir83lFok1inKqVDjnKEg3GpDxQg==, tarball: https://registry.npmmirror.com/min-dash/-/min-dash-3.8.1.tgz}
- dev: false
-
/min-dash@4.2.2:
resolution: {integrity: sha512-qbhSYUxk6mBaF096B3JOQSumXbKWHenmT97cSpdNzgkWwGjhjhE/KZODCoDNhI2I4C9Cb6R/Q13S4BYkUSXoXQ==, tarball: https://registry.npmmirror.com/min-dash/-/min-dash-4.2.2.tgz}
@@ -7912,18 +7875,6 @@ packages:
dom-walk: 0.1.2
dev: false
- /min-dom@0.2.0:
- resolution: {integrity: sha512-VmxugbnAcVZGqvepjhOA4d4apmrpX8mMaRS+/jo0dI5Yorzrr4Ru9zc9KVALlY/+XakVCb8iQ+PYXljihQcsNw==, tarball: https://registry.npmmirror.com/min-dom/-/min-dom-0.2.0.tgz}
- dependencies:
- component-classes: 1.2.6
- component-closest: 0.1.4
- component-delegate: 0.2.4
- component-event: 0.1.4
- component-matches-selector: 0.1.7
- component-query: 0.0.3
- domify: 1.4.2
- dev: false
-
/min-dom@4.2.1:
resolution: {integrity: sha512-TMoL8SEEIhUWYgkj7XMSgxmwSyGI+4fP2KFFGnN3FbHfbGHVdsLYSz8LoIsgPhz4dWRmLvxWWSMgzZMJW5sZuA==, tarball: https://registry.npmmirror.com/min-dom/-/min-dom-4.2.1.tgz}
dependencies:
@@ -8714,6 +8665,10 @@ packages:
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, tarball: https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz}
dev: true
+ /randomcolor@0.6.2:
+ resolution: {integrity: sha512-Mn6TbyYpFgwFuQ8KJKqf3bqqY9O1y37/0jgSK/61PUxV4QfIMv0+K2ioq8DfOjkBslcjwSzRfIDEXfzA9aCx7A==, tarball: https://registry.npmmirror.com/randomcolor/-/randomcolor-0.6.2.tgz}
+ dev: false
+
/rd@2.0.1:
resolution: {integrity: sha512-/XdKU4UazUZTXFmI0dpABt8jSXPWcEyaGdk340KdHnsEOdkTctlX23aAK7ChQDn39YGNlAJr1M5uvaKt4QnpNw==, tarball: https://registry.npmmirror.com/rd/-/rd-2.0.1.tgz}
dependencies:
@@ -9128,6 +9083,10 @@ packages:
engines: {node: '>=14'}
dev: true
+ /signature_pad@3.0.0-beta.4:
+ resolution: {integrity: sha512-cOf2NhVuTiuNqe2X/ycEmizvCDXk0DoemhsEpnkcGnA4kS5iJYTCqZ9As7tFBbsch45Q1EdX61833+6sjJ8rrw==, tarball: https://registry.npmmirror.com/signature_pad/-/signature_pad-3.0.0-beta.4.tgz}
+ dev: false
+
/sirv@2.0.4:
resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==, tarball: https://registry.npmmirror.com/sirv/-/sirv-2.0.4.tgz}
engines: {node: '>= 10'}
@@ -9561,10 +9520,6 @@ packages:
resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==, tarball: https://registry.npmmirror.com/svg-tags/-/svg-tags-1.0.0.tgz}
dev: true
- /svg.js@2.7.1:
- resolution: {integrity: sha512-ycbxpizEQktk3FYvn/8BH+6/EuWXg7ZpQREJvgacqn46gIddG24tNNe4Son6omdXCnSOaApnpZw6MPCBA1dODA==, tarball: https://registry.npmmirror.com/svg.js/-/svg.js-2.7.1.tgz}
- dev: false
-
/svgo@2.8.0:
resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==, tarball: https://registry.npmmirror.com/svgo/-/svgo-2.8.0.tgz}
engines: {node: '>=10.13.0'}
@@ -10324,6 +10279,16 @@ packages:
vue: 3.5.12(typescript@5.3.3)
dev: false
+ /vue3-signature@0.2.4(vue@3.5.12):
+ resolution: {integrity: sha512-XFwwFVK9OG3F085pKIq2SlNVqx32WdFH+TXbGEWc5FfEKpx8oMmZuAwZZ50K/pH2FgmJSE8IRwU9DDhrLpd6iA==, tarball: https://registry.npmmirror.com/vue3-signature/-/vue3-signature-0.2.4.tgz}
+ peerDependencies:
+ vue: ^3.2.0
+ dependencies:
+ default-passive-events: 2.0.0
+ signature_pad: 3.0.0-beta.4
+ vue: 3.5.12(typescript@5.3.3)
+ dev: false
+
/vue@3.5.12(typescript@5.3.3):
resolution: {integrity: sha512-CLVZtXtn2ItBIi/zHZ0Sg1Xkb7+PU32bJJ8Bmy7ts3jxXTcbfsEfBivFYYWz1Hur+lalqGAh65Coin0r+HRUfg==, tarball: https://registry.npmmirror.com/vue/-/vue-3.5.12.tgz}
peerDependencies:
diff --git a/src/api/bpm/processInstance/index.ts b/src/api/bpm/processInstance/index.ts
index 06dc3f88..a0f263de 100644
--- a/src/api/bpm/processInstance/index.ts
+++ b/src/api/bpm/processInstance/index.ts
@@ -36,7 +36,7 @@ export type ApprovalTaskInfo = {
assigneeUser: User
status: number
reason: string
- sign: string
+ sign: string // TODO @lesan:字段改成 signPicUrl 签名照片。只有 sign 感觉是签名文本哈。
}
// 审批节点信息
@@ -90,7 +90,7 @@ export const getProcessInstanceCopyPage = async (params: any) => {
// 获取审批详情
export const getApprovalDetail = async (params: any) => {
- return await request.get({ url: 'bpm/process-instance/get-approval-detail' , params })
+ return await request.get({ url: 'bpm/process-instance/get-approval-detail', params })
}
// 获取表单字段权限
diff --git a/src/components/SimpleProcessDesignerV2/src/nodes-config/RouterNodeConfig.vue b/src/components/SimpleProcessDesignerV2/src/nodes-config/RouterNodeConfig.vue
index 442cf337..6748a736 100644
--- a/src/components/SimpleProcessDesignerV2/src/nodes-config/RouterNodeConfig.vue
+++ b/src/components/SimpleProcessDesignerV2/src/nodes-config/RouterNodeConfig.vue
@@ -37,9 +37,9 @@
:value="node.value"
/>
- 删除
+
+ 删除
+
([])
const nodeOptions = ref()
-
const conditionRef = ref([])
-// 保存配置
+
+/** 保存配置 */
const saveConfig = async () => {
// 校验表单
let valid = true
diff --git a/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue b/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue
index 00ed6cfe..64acc2c3 100644
--- a/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue
+++ b/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue
@@ -440,6 +440,7 @@
+
diff --git a/src/views/bpm/processInstance/detail/ProcessInstanceOperationButton.vue b/src/views/bpm/processInstance/detail/ProcessInstanceOperationButton.vue
index 7f0696cf..a4ecee65 100644
--- a/src/views/bpm/processInstance/detail/ProcessInstanceOperationButton.vue
+++ b/src/views/bpm/processInstance/detail/ProcessInstanceOperationButton.vue
@@ -44,14 +44,26 @@
:rows="4"
/>
-
+
点击签名
-
+
-
+
{{ getButtonDisplayName(OperationButtonType.APPROVE) }}
取消
@@ -92,7 +104,11 @@
/>
-
+
{{ getButtonDisplayName(OperationButtonType.REJECT) }}
取消
@@ -478,7 +494,8 @@
-
+
+
-
+
From 37964e740f8691a58f9a43f976fb9c047e034e28 Mon Sep 17 00:00:00 2001
From: Lesan <1960681385@qq.com>
Date: Thu, 16 Jan 2025 13:55:15 +0800
Subject: [PATCH 45/86] =?UTF-8?q?feat:=20=E5=AE=A1=E6=89=B9=E7=AD=BE?=
=?UTF-8?q?=E5=90=8D=E4=BB=A3=E7=A0=81=E8=AF=84=E5=AE=A1?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/api/bpm/processInstance/index.ts | 2 +-
src/utils/download.ts | 27 ++++++++++++++
.../detail/ProcessInstanceOperationButton.vue | 16 ++++-----
.../detail/ProcessInstanceTimeline.vue | 6 ++--
.../bpm/processInstance/detail/SignDialog.vue | 35 ++-----------------
5 files changed, 42 insertions(+), 44 deletions(-)
diff --git a/src/api/bpm/processInstance/index.ts b/src/api/bpm/processInstance/index.ts
index a0f263de..9a99a91e 100644
--- a/src/api/bpm/processInstance/index.ts
+++ b/src/api/bpm/processInstance/index.ts
@@ -36,7 +36,7 @@ export type ApprovalTaskInfo = {
assigneeUser: User
status: number
reason: string
- sign: string // TODO @lesan:字段改成 signPicUrl 签名照片。只有 sign 感觉是签名文本哈。
+ signPicUrl: string
}
// 审批节点信息
diff --git a/src/utils/download.ts b/src/utils/download.ts
index 5bbfb9fe..bd58845f 100644
--- a/src/utils/download.ts
+++ b/src/utils/download.ts
@@ -65,6 +65,33 @@ const download = {
a.download = 'image.png'
a.click()
}
+ },
+ base64ToFile: (base64, fileName) => {
+ // 将base64按照 , 进行分割 将前缀 与后续内容分隔开
+ const data = base64.split(',')
+ // 利用正则表达式 从前缀中获取图片的类型信息(image/png、image/jpeg、image/webp等)
+ const type = data[0].match(/:(.*?);/)[1]
+ // 从图片的类型信息中 获取具体的文件格式后缀(png、jpeg、webp)
+ const suffix = type.split('/')[1]
+ // 使用atob()对base64数据进行解码 结果是一个文件数据流 以字符串的格式输出
+ const bstr = window.atob(data[1])
+ // 获取解码结果字符串的长度
+ let n = bstr.length
+ // 根据解码结果字符串的长度创建一个等长的整形数字数组
+ // 但在创建时 所有元素初始值都为 0
+ const u8arr = new Uint8Array(n)
+ // 将整形数组的每个元素填充为解码结果字符串对应位置字符的UTF-16 编码单元
+ while (n--) {
+ // charCodeAt():获取给定索引处字符对应的 UTF-16 代码单元
+ u8arr[n] = bstr.charCodeAt(n)
+ }
+ // 利用构造函数创建File文件对象
+ // new File(bits, name, options)
+ const file = new File([u8arr], `${fileName}.${suffix}`, {
+ type: type
+ })
+ // 将File文件对象返回给方法的调用者
+ return file
}
}
diff --git a/src/views/bpm/processInstance/detail/ProcessInstanceOperationButton.vue b/src/views/bpm/processInstance/detail/ProcessInstanceOperationButton.vue
index a4ecee65..402644e9 100644
--- a/src/views/bpm/processInstance/detail/ProcessInstanceOperationButton.vue
+++ b/src/views/bpm/processInstance/detail/ProcessInstanceOperationButton.vue
@@ -47,15 +47,15 @@
点击签名
@@ -553,11 +553,11 @@ const signRef = ref()
const approveSignFormRef = ref()
const approveReasonForm = reactive({
reason: '',
- sign: ''
+ signPicUrl: ''
})
const approveReasonRule = reactive>({
reason: [{ required: true, message: '审批意见不能为空', trigger: 'blur' }],
- sign: [{ required: true, message: '签名不能为空', trigger: 'change' }]
+ signPicUrl: [{ required: true, message: '签名不能为空', trigger: 'change' }]
})
// 拒绝表单
const rejectFormRef = ref()
@@ -705,7 +705,7 @@ const handleAudit = async (pass: boolean, formRef: FormInstance | undefined) =>
}
// 签名
if (runningTask.value.signEnable) {
- data.sign = approveReasonForm.sign
+ data.signPicUrl = approveReasonForm.signPicUrl
}
// 多表单处理,并且有额外的 approveForm 表单,需要校验 + 拼接到 data 表单里提交
// TODO 芋艿 任务有多表单这里要如何处理,会和可编辑的字段冲突
@@ -1002,7 +1002,7 @@ const getUpdatedProcessInstanceVariables = () => {
/** 处理签名完成 */
const handleSignFinish = (url: string) => {
- approveReasonForm.sign = url
+ approveReasonForm.signPicUrl = url
approveSignFormRef.value.validate('change')
}
diff --git a/src/views/bpm/processInstance/detail/ProcessInstanceTimeline.vue b/src/views/bpm/processInstance/detail/ProcessInstanceTimeline.vue
index 1fd31dcf..fcd5ec89 100644
--- a/src/views/bpm/processInstance/detail/ProcessInstanceTimeline.vue
+++ b/src/views/bpm/processInstance/detail/ProcessInstanceTimeline.vue
@@ -124,14 +124,14 @@
审批意见:{{ task.reason }}
签名:
diff --git a/src/views/bpm/processInstance/detail/SignDialog.vue b/src/views/bpm/processInstance/detail/SignDialog.vue
index 211cfcda..744a3556 100644
--- a/src/views/bpm/processInstance/detail/SignDialog.vue
+++ b/src/views/bpm/processInstance/detail/SignDialog.vue
@@ -2,9 +2,8 @@
-
import Vue3Signature from 'vue3-signature'
import * as FileApi from '@/api/infra/file'
+import download from '@/utils/download'
const message = useMessage() // 消息弹窗
const signDialogVisible = ref(false)
@@ -40,40 +40,11 @@ const emits = defineEmits(['success'])
const submit = async () => {
message.success('签名上传中请稍等。。。')
const res = await FileApi.updateFile({
- file: base64ToFile(signature.value.save('image/png'), '签名')
+ file: download.base64ToFile(signature.value.save('image/png'), '签名')
})
emits('success', res.data)
signDialogVisible.value = false
}
-
-// TODO @lesan:这个要不抽到 download.js 里,让这个组件更简洁干净?
-const base64ToFile = (base64, fileName) => {
- // 将base64按照 , 进行分割 将前缀 与后续内容分隔开
- let data = base64.split(',')
- // 利用正则表达式 从前缀中获取图片的类型信息(image/png、image/jpeg、image/webp等)
- let type = data[0].match(/:(.*?);/)[1]
- // 从图片的类型信息中 获取具体的文件格式后缀(png、jpeg、webp)
- let suffix = type.split('/')[1]
- // 使用atob()对base64数据进行解码 结果是一个文件数据流 以字符串的格式输出
- const bstr = window.atob(data[1])
- // 获取解码结果字符串的长度
- let n = bstr.length
- // 根据解码结果字符串的长度创建一个等长的整形数字数组
- // 但在创建时 所有元素初始值都为 0
- const u8arr = new Uint8Array(n)
- // 将整形数组的每个元素填充为解码结果字符串对应位置字符的UTF-16 编码单元
- while (n--) {
- // charCodeAt():获取给定索引处字符对应的 UTF-16 代码单元
- u8arr[n] = bstr.charCodeAt(n)
- }
- // 利用构造函数创建File文件对象
- // new File(bits, name, options)
- const file = new File([u8arr], `${fileName}.${suffix}`, {
- type: type
- })
- // 将File文件对象返回给方法的调用者
- return file
-}
From 69ccd83af31c33a92def15100706fe336419d6c0 Mon Sep 17 00:00:00 2001
From: Lesan <1960681385@qq.com>
Date: Thu, 16 Jan 2025 14:40:14 +0800
Subject: [PATCH 46/86] =?UTF-8?q?feat:=20bpmn=E8=AE=BE=E8=AE=A1=E5=99=A8?=
=?UTF-8?q?=E6=B7=BB=E5=8A=A0UserTask=E7=AD=BE=E5=90=8D=E9=85=8D=E7=BD=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../plugins/descriptor/flowableDescriptor.json | 14 ++++++++++++++
.../package/penal/PropertiesPanel.vue | 2 +-
.../components/UserTaskCustomConfig.vue | 17 ++++++++++++++++-
3 files changed, 31 insertions(+), 2 deletions(-)
diff --git a/src/components/bpmnProcessDesigner/package/designer/plugins/descriptor/flowableDescriptor.json b/src/components/bpmnProcessDesigner/package/designer/plugins/descriptor/flowableDescriptor.json
index 7fe1fa79..e50d3ce3 100644
--- a/src/components/bpmnProcessDesigner/package/designer/plugins/descriptor/flowableDescriptor.json
+++ b/src/components/bpmnProcessDesigner/package/designer/plugins/descriptor/flowableDescriptor.json
@@ -1438,6 +1438,20 @@
"isBody": true
}
]
+ },
+ {
+ "name": "SignEnable",
+ "superClass": ["Element"],
+ "meta": {
+ "allowedIn": ["bpmn:UserTask"]
+ },
+ "properties": [
+ {
+ "name": "value",
+ "type": "Boolean",
+ "isBody": true
+ }
+ ]
}
],
"emumerations": []
diff --git a/src/components/bpmnProcessDesigner/package/penal/PropertiesPanel.vue b/src/components/bpmnProcessDesigner/package/penal/PropertiesPanel.vue
index e53ad994..ff08dd33 100644
--- a/src/components/bpmnProcessDesigner/package/penal/PropertiesPanel.vue
+++ b/src/components/bpmnProcessDesigner/package/penal/PropertiesPanel.vue
@@ -1,5 +1,5 @@
-
+
diff --git a/src/components/bpmnProcessDesigner/package/penal/custom-config/components/UserTaskCustomConfig.vue b/src/components/bpmnProcessDesigner/package/penal/custom-config/components/UserTaskCustomConfig.vue
index ba385145..206c3889 100644
--- a/src/components/bpmnProcessDesigner/package/penal/custom-config/components/UserTaskCustomConfig.vue
+++ b/src/components/bpmnProcessDesigner/package/penal/custom-config/components/UserTaskCustomConfig.vue
@@ -5,6 +5,7 @@
4. 操作按钮
5. 字段权限
6. 审批类型
+ 7. 是否需要签名
-->
@@ -161,6 +162,11 @@
+
+
是否需要签名
+
+
+
@@ -218,6 +224,9 @@ const { formType, fieldsPermissionConfig, getNodeConfigFormFields } = useFormFie
// 审批类型
const approveType = ref({ value: ApproveType.USER })
+// 是否需要签名
+const signEnable = ref({ value: false })
+
const elExtensionElements = ref()
const otherExtensions = ref()
const bpmnElement = ref()
@@ -325,6 +334,11 @@ const resetCustomConfigList = () => {
ex.$type !== `${prefix}:ApproveType`
) ?? []
+ // 是否需要签名
+ signEnable.value =
+ elExtensionElements.value.values?.filter((ex) => ex.$type === `${prefix}:SignEnable`)?.[0] ||
+ bpmnInstances().moddle.create(`${prefix}:SignEnable`, { value: false })
+
// 更新元素扩展属性,避免后续报错
updateElementExtensions()
}
@@ -373,7 +387,8 @@ const updateElementExtensions = () => {
assignEmptyUserIdsEl.value,
approveType.value,
...buttonsSettingEl.value,
- ...fieldsPermissionEl.value
+ ...fieldsPermissionEl.value,
+ signEnable.value
]
})
bpmnInstances().modeling.updateProperties(toRaw(bpmnElement.value), {
From 38578c3e50a707de073b6ff72ddfc62042717158 Mon Sep 17 00:00:00 2001
From: Lesan <1960681385@qq.com>
Date: Thu, 16 Jan 2025 14:55:32 +0800
Subject: [PATCH 47/86] =?UTF-8?q?feat:=20=E8=8E=B7=E5=8F=96=E5=88=86?=
=?UTF-8?q?=E6=94=AF=E4=B8=AD=E7=9A=84=E8=8A=82=E7=82=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../src/nodes-config/RouterNodeConfig.vue | 20 +++++++++++--------
1 file changed, 12 insertions(+), 8 deletions(-)
diff --git a/src/components/SimpleProcessDesignerV2/src/nodes-config/RouterNodeConfig.vue b/src/components/SimpleProcessDesignerV2/src/nodes-config/RouterNodeConfig.vue
index 6748a736..a7c4ac9b 100644
--- a/src/components/SimpleProcessDesignerV2/src/nodes-config/RouterNodeConfig.vue
+++ b/src/components/SimpleProcessDesignerV2/src/nodes-config/RouterNodeConfig.vue
@@ -86,7 +86,7 @@ const currentNode = useWatchNode(props)
// 节点名称
const { nodeName, showInput, clickIcon, blurEvent } = useNodeName(NodeType.ROUTER_BRANCH_NODE)
const routerGroups = ref([])
-const nodeOptions = ref()
+const nodeOptions = ref([])
const conditionRef = ref([])
/** 保存配置 */
@@ -94,7 +94,7 @@ const saveConfig = async () => {
// 校验表单
let valid = true
for (const item of conditionRef.value) {
- if (!(await item.validate())) {
+ if (item && !(await item.validate())) {
valid = false
}
}
@@ -109,7 +109,7 @@ const saveConfig = async () => {
}
// 显示路由分支节点配置, 由父组件传过来
const showRouteNodeConfig = (node: SimpleFlowNode) => {
- getRouterNode()
+ getRouterNode(processNodeTree?.value)
routerGroups.value = []
nodeName.value = node.name
if (node.routerGroups) {
@@ -172,15 +172,14 @@ const deleteRouterGroup = (index: number) => {
routerGroups.value.splice(index, 1)
}
-const getRouterNode = () => {
- // TODO @lesan 还需要满足以下要求
+// 递归获取所有节点
+const getRouterNode = (node) => {
+ // TODO 最好还需要满足以下要求
// 并行分支、包容分支内部节点不能跳转到外部节点
// 条件分支节点可以向上跳转到外部节点
- let node = processNodeTree?.value
- nodeOptions.value = []
while (true) {
if (!node) break
- if (node.type !== NodeType.ROUTER_BRANCH_NODE) {
+ if (node.type !== NodeType.ROUTER_BRANCH_NODE && node.type !== NodeType.CONDITION_NODE) {
nodeOptions.value.push({
label: node.name,
value: node.id
@@ -189,6 +188,11 @@ const getRouterNode = () => {
if (!node.childNode || node.type === NodeType.END_EVENT_NODE) {
break
}
+ if (node.conditionNodes && node.conditionNodes.length) {
+ node.conditionNodes.forEach((item) => {
+ getRouterNode(item)
+ })
+ }
node = node.childNode
}
}
From 9308eceb81d79bf924eea5fb6975d2fd792a22b1 Mon Sep 17 00:00:00 2001
From: Lesan <1960681385@qq.com>
Date: Thu, 16 Jan 2025 15:25:20 +0800
Subject: [PATCH 48/86] =?UTF-8?q?feat:=20=E6=8A=BD=E7=A6=BBUserTaskListene?=
=?UTF-8?q?r=E7=BB=84=E4=BB=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../src/nodes-config/UserTaskNodeConfig.vue | 248 +----------------
.../components/UserTaskListener.vue | 261 ++++++++++++++++++
2 files changed, 267 insertions(+), 242 deletions(-)
create mode 100644 src/components/SimpleProcessDesignerV2/src/nodes-config/components/UserTaskListener.vue
diff --git a/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue b/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue
index 64acc2c3..8e18b756 100644
--- a/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue
+++ b/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue
@@ -440,217 +440,8 @@
-
-
-
-
- {{ listener.name }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 添加一行
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 添加一行
-
-
-
-
-
+
@@ -687,9 +478,7 @@ import {
ASSIGN_EMPTY_HANDLER_TYPES,
AssignEmptyHandlerType,
FieldPermissionType,
- ProcessVariableEnum,
- LISTENER_MAP_TYPES,
- ListenerParamTypeEnum
+ ProcessVariableEnum
} from '../consts'
import {
@@ -703,6 +492,7 @@ import {
import { defaultProps } from '@/utils/tree'
import { cloneDeep } from 'lodash-es'
import { convertTimeUnit, getApproveTypeText } from '../utils'
+import UserTaskListener from './components/UserTaskListener.vue'
defineOptions({
name: 'UserTaskNodeConfig'
})
@@ -780,21 +570,6 @@ const formRules = reactive({
assignEmptyHandlerUserIds: [{ required: true, message: '用户不能为空', trigger: 'change' }],
assignStartUserHandlerType: [{ required: true }]
})
-// 监听器数组
-const taskListener = ref([
- {
- name: '创建任务',
- type: 'Create'
- },
- {
- name: '指派任务执行人员',
- type: 'Assign'
- },
- {
- name: '完成任务',
- type: 'Complete'
- }
-])
const {
configForm: tempConfigForm,
@@ -843,7 +618,7 @@ const {
cTimeoutMaxRemindCount
} = useTimeoutHandler()
-const listenerFormRef = ref()
+const userTaskListenerRef = ref()
// 保存配置
const saveConfig = async () => {
@@ -860,8 +635,8 @@ const saveConfig = async () => {
}
if (!formRef) return false
- if (!listenerFormRef) return false
- const valid = (await formRef.value.validate()) && (await listenerFormRef.value.validate())
+ if (!userTaskListenerRef) return false
+ const valid = (await formRef.value.validate()) && (await userTaskListenerRef.value.validate())
if (!valid) return false
const showText = getShowText()
if (!showText) return false
@@ -1104,17 +879,6 @@ function useTimeoutHandler() {
cTimeoutMaxRemindCount
}
}
-
-const addTaskListenerParam = (arr) => {
- arr.push({
- key: '',
- type: 1,
- value: ''
- })
-}
-const deleteTaskListenerParam = (arr, index) => {
- arr.splice(index, 1)
-}
diff --git a/src/views/bpm/model/index.vue b/src/views/bpm/model/index.vue
index 2af15014..08c9650b 100644
--- a/src/views/bpm/model/index.vue
+++ b/src/views/bpm/model/index.vue
@@ -85,8 +85,6 @@
-
-
@@ -99,7 +97,6 @@
import draggable from 'vuedraggable'
import { CategoryApi } from '@/api/bpm/category'
import * as ModelApi from '@/api/bpm/model'
-import ModelForm from './ModelForm.vue'
import CategoryForm from '../category/CategoryForm.vue'
import { cloneDeep } from 'lodash-es'
import CategoryDraggableModel from './CategoryDraggableModel.vue'
@@ -123,7 +120,6 @@ const handleQuery = () => {
}
/** 添加/修改操作 */
-const formRef = ref()
const openForm = (type: string, id?: number) => {
if (type === 'create') {
push({ name: 'BpmModelCreate' })
From 7349a0d080fbbacbeedcfd50e4616e33fd303736 Mon Sep 17 00:00:00 2001
From: YunaiV
Date: Sat, 18 Jan 2025 18:51:13 +0800
Subject: [PATCH 55/86] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E4=BC=98?=
=?UTF-8?q?=E5=8C=96=E3=80=91Bpm=EF=BC=9A=E7=BC=96=E8=BE=91=E6=B5=81?=
=?UTF-8?q?=E7=A8=8B=E6=97=B6=EF=BC=8C=E2=80=9C=E6=B5=81=E7=A8=8B=E7=AE=A1?=
=?UTF-8?q?=E7=90=86=E5=91=98=E2=80=9D=E9=BB=98=E8=AE=A4=E5=B0=B1=E6=98=AF?=
=?UTF-8?q?=E2=80=9C=E6=8C=87=E5=AE=9A=E4=BA=BA=E5=91=98=E2=80=9D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/views/bpm/model/form/BasicInfo.vue | 26 +++-----------------------
1 file changed, 3 insertions(+), 23 deletions(-)
diff --git a/src/views/bpm/model/form/BasicInfo.vue b/src/views/bpm/model/form/BasicInfo.vue
index b11331d9..591ccab1 100644
--- a/src/views/bpm/model/form/BasicInfo.vue
+++ b/src/views/bpm/model/form/BasicInfo.vue
@@ -77,7 +77,6 @@
>
-
- 选择人员
+ 选择人员
-
-
-
-
-
-
-
+
+
{
}
}
-/** 处理管理员类型变化 */
-const handleManagerUserTypeChange = (value: number) => {
- if (value !== 1) {
- modelData.value = {
- ...modelData.value,
- managerUserIds: []
- }
- }
-}
-
/** 移除发起人 */
const handleRemoveStartUser = (user: UserVO) => {
modelData.value = {
From fea238ef154738ab2e08d6f5c043c85e17b4355d Mon Sep 17 00:00:00 2001
From: YunaiV
Date: Sat, 18 Jan 2025 19:01:12 +0800
Subject: [PATCH 56/86] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E4=BC=98?=
=?UTF-8?q?=E5=8C=96=E3=80=91Bpm=EF=BC=9A=E7=BC=96=E8=BE=91=E6=B5=81?=
=?UTF-8?q?=E7=A8=8B=E6=97=B6=EF=BC=8C=E2=80=9C=E8=B0=81=E5=8F=AF=E4=BB=A5?=
=?UTF-8?q?=E5=8F=91=E8=B5=B7=E2=80=9D=E9=BB=98=E8=AE=A4=E5=B0=B1=E6=98=AF?=
=?UTF-8?q?=E2=80=9C=E5=85=A8=E4=BD=93=E2=80=9D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/views/bpm/model/form/BasicInfo.vue | 5 +++--
src/views/bpm/model/form/index.vue | 7 ++++---
2 files changed, 7 insertions(+), 5 deletions(-)
diff --git a/src/views/bpm/model/form/BasicInfo.vue b/src/views/bpm/model/form/BasicInfo.vue
index 591ccab1..cca91334 100644
--- a/src/views/bpm/model/form/BasicInfo.vue
+++ b/src/views/bpm/model/form/BasicInfo.vue
@@ -62,7 +62,7 @@
{{ dict.label }}
@@ -132,10 +132,11 @@
diff --git a/src/views/bpm/model/form/index.vue b/src/views/bpm/model/form/index.vue
index 5c8d06d1..d9d399e5 100644
--- a/src/views/bpm/model/form/index.vue
+++ b/src/views/bpm/model/form/index.vue
@@ -68,6 +68,11 @@
+
+
+
+
+
@@ -86,6 +91,7 @@ import BasicInfo from './BasicInfo.vue'
import FormDesign from './FormDesign.vue'
import ProcessDesign from './ProcessDesign.vue'
import { useTagsViewStore } from '@/store/modules/tagsView'
+import ExtraSettings from './ExtraSettings.vue'
const router = useRouter()
const { delView } = useTagsViewStore() // 视图操作
@@ -118,7 +124,8 @@ const currentStep = ref(-1) // 步骤控制。-1 用于,一开始全部不展
const steps = [
{ title: '基本信息', validator: validateBasic },
{ title: '表单设计', validator: validateForm },
- { title: '流程设计', validator: validateProcess }
+ { title: '流程设计', validator: validateProcess },
+ { title: '更多设置', validator: null }
]
// 表单数据
@@ -137,7 +144,8 @@ const formData: any = ref({
visible: true,
startUserType: undefined,
startUserIds: [],
- managerUserIds: []
+ managerUserIds: [],
+ allowCancelRunningProcess: true
})
//流程数据
From 70e6b5464269ae3e7d782a6cb6902a3efb0fca2f Mon Sep 17 00:00:00 2001
From: YunaiV
Date: Sun, 19 Jan 2025 18:28:45 +0800
Subject: [PATCH 60/86] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E4=BC=98?=
=?UTF-8?q?=E5=8C=96=E3=80=91Bpm=EF=BC=9A=E6=8F=90=E4=BA=A4=E4=BA=BA?=
=?UTF-8?q?=E6=9D=83=E9=99=90=E7=9A=84=20review?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/views/bpm/model/form/ExtraSettings.vue | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/src/views/bpm/model/form/ExtraSettings.vue b/src/views/bpm/model/form/ExtraSettings.vue
index 75da9576..af32516f 100644
--- a/src/views/bpm/model/form/ExtraSettings.vue
+++ b/src/views/bpm/model/form/ExtraSettings.vue
@@ -6,9 +6,7 @@
-
- 第一个审批节点通过后,提交人仍可撤销申请(配置前已发起的申请不生效)
-
+ 第一个审批节点通过后,提交人仍可撤销申请
From 42de3d91275cc1b3db029d3443bb888d0d034499 Mon Sep 17 00:00:00 2001
From: jason <2667446@qq.com>
Date: Sun, 19 Jan 2025 18:40:18 +0800
Subject: [PATCH 61/86] =?UTF-8?q?=E3=80=90=E5=8A=9F=E8=83=BD=E4=BC=98?=
=?UTF-8?q?=E5=8C=96=E3=80=91=E6=9D=A1=E4=BB=B6=E8=8A=82=E7=82=B9=E8=AE=BE?=
=?UTF-8?q?=E7=BD=AE=E4=BC=98=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../src/NodeHandler.vue | 20 +++++---
.../SimpleProcessDesignerV2/src/consts.ts | 24 ++++++---
.../SimpleProcessDesignerV2/src/node.ts | 2 -
.../src/nodes-config/ConditionNodeConfig.vue | 50 +++++++++++--------
.../src/nodes/InclusiveNode.vue | 2 +-
5 files changed, 59 insertions(+), 39 deletions(-)
diff --git a/src/components/SimpleProcessDesignerV2/src/NodeHandler.vue b/src/components/SimpleProcessDesignerV2/src/NodeHandler.vue
index 25e54f6b..c94998d5 100644
--- a/src/components/SimpleProcessDesignerV2/src/NodeHandler.vue
+++ b/src/components/SimpleProcessDesignerV2/src/NodeHandler.vue
@@ -163,8 +163,10 @@ const addNode = (type: number) => {
showText: '',
type: NodeType.CONDITION_NODE,
childNode: undefined,
- conditionType: 1,
- defaultFlow: false
+ conditionSetting: {
+ defaultFlow: false
+ },
+
},
{
id: 'Flow_' + generateUUID(),
@@ -172,8 +174,9 @@ const addNode = (type: number) => {
showText: '未满足其它条件时,将进入此分支',
type: NodeType.CONDITION_NODE,
childNode: undefined,
- conditionType: undefined,
- defaultFlow: true
+ conditionSetting: {
+ defaultFlow: true
+ }
}
]
}
@@ -217,7 +220,10 @@ const addNode = (type: number) => {
showText: '',
type: NodeType.CONDITION_NODE,
childNode: undefined,
- defaultFlow: false
+ conditionSetting: {
+ defaultFlow: false
+ }
+
},
{
id: 'Flow_' + generateUUID(),
@@ -225,7 +231,9 @@ const addNode = (type: number) => {
showText: '未满足其它条件时,将进入此分支',
type: NodeType.CONDITION_NODE,
childNode: undefined,
- defaultFlow: true
+ conditionSetting: {
+ defaultFlow: true
+ }
}
]
}
diff --git a/src/components/SimpleProcessDesignerV2/src/consts.ts b/src/components/SimpleProcessDesignerV2/src/consts.ts
index 55808c96..ffc37b80 100644
--- a/src/components/SimpleProcessDesignerV2/src/consts.ts
+++ b/src/components/SimpleProcessDesignerV2/src/consts.ts
@@ -103,14 +103,8 @@ export interface SimpleFlowNode {
taskAssignListener?: ListenerHandler
// 创建任务监听器
taskCompleteListener?: ListenerHandler
- // 条件类型
- conditionType?: ConditionType
- // 条件表达式
- conditionExpression?: string
- // 条件组
- conditionGroups?: ConditionGroup
- // 是否默认的条件
- defaultFlow?: boolean
+ // 条件设置
+ conditionSetting?: ConditionSetting
// 活动的状态,用于前端节点状态展示
activityStatus?: TaskStatusEnum
// 延迟设置
@@ -365,6 +359,20 @@ export enum TimeUnitType {
DAY = 3
}
+/**
+ * 条件节点设置结构定义,用于条件节点
+ */
+export type ConditionSetting = {
+ // 条件类型
+ conditionType?: ConditionType,
+ // 条件表达式
+ conditionExpression?: string,
+ // 条件组
+ conditionGroups?: ConditionGroup,
+ // 是否默认的条件
+ defaultFlow?: boolean
+}
+
// 条件配置类型 ( 用于条件节点配置 )
export enum ConditionType {
/**
diff --git a/src/components/SimpleProcessDesignerV2/src/node.ts b/src/components/SimpleProcessDesignerV2/src/node.ts
index 79bb5d38..ea983ce9 100644
--- a/src/components/SimpleProcessDesignerV2/src/node.ts
+++ b/src/components/SimpleProcessDesignerV2/src/node.ts
@@ -113,7 +113,6 @@ export function useFormFields() {
}
export type UserTaskFormType = {
- //candidateParamArray: any[]
candidateStrategy: CandidateStrategy
approveMethod: ApproveMethodType
roleIds?: number[] // 角色
@@ -152,7 +151,6 @@ export type UserTaskFormType = {
}
export type CopyTaskFormType = {
- // candidateParamArray: any[]
candidateStrategy: CandidateStrategy
roleIds?: number[] // 角色
deptIds?: number[] // 部门
diff --git a/src/components/SimpleProcessDesignerV2/src/nodes-config/ConditionNodeConfig.vue b/src/components/SimpleProcessDesignerV2/src/nodes-config/ConditionNodeConfig.vue
index ae931724..7c45e1bf 100644
--- a/src/components/SimpleProcessDesignerV2/src/nodes-config/ConditionNodeConfig.vue
+++ b/src/components/SimpleProcessDesignerV2/src/nodes-config/ConditionNodeConfig.vue
@@ -26,13 +26,16 @@
-
未满足其它条件时,将进入此分支(该分支不可编辑和删除)
+
+ 未满足其它条件时,将进入此分支(该分支不可编辑和删除)
+
-
+
-
+
-
+
From 9495c2c63a237d77b8815ff0890805c6224819c2 Mon Sep 17 00:00:00 2001
From: LesanOuO <1960681385@qq.com>
Date: Thu, 23 Jan 2025 12:05:52 +0800
Subject: [PATCH 73/86] =?UTF-8?q?feat:=20BPM-=E6=9B=B4=E5=A4=9A=E8=AE=BE?=
=?UTF-8?q?=E7=BD=AE-=E6=A0=87=E9=A2=98=E8=AE=BE=E7=BD=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../SimpleProcessDesignerV2/src/consts.ts | 10 ++-
src/views/bpm/model/form/ExtraSettings.vue | 85 +++++++++++++++++++
src/views/bpm/model/form/index.vue | 6 +-
3 files changed, 99 insertions(+), 2 deletions(-)
diff --git a/src/components/SimpleProcessDesignerV2/src/consts.ts b/src/components/SimpleProcessDesignerV2/src/consts.ts
index acf9409a..2ba4fb3f 100644
--- a/src/components/SimpleProcessDesignerV2/src/consts.ts
+++ b/src/components/SimpleProcessDesignerV2/src/consts.ts
@@ -653,7 +653,15 @@ export enum ProcessVariableEnum {
/**
* 发起用户 ID
*/
- START_USER_ID = 'PROCESS_START_USER_ID'
+ START_USER_ID = 'PROCESS_START_USER_ID',
+ /**
+ * 发起时间
+ */
+ START_TIME = 'PROCESS_START_TIME',
+ /**
+ * 流程定义名称
+ */
+ PROCESS_DEFINITION_NAME = 'PROCESS_DEFINITION_NAME'
}
/**
diff --git a/src/views/bpm/model/form/ExtraSettings.vue b/src/views/bpm/model/form/ExtraSettings.vue
index 42bbd4ac..8321d131 100644
--- a/src/views/bpm/model/form/ExtraSettings.vue
+++ b/src/views/bpm/model/form/ExtraSettings.vue
@@ -75,12 +75,48 @@
+
+
+ 标题设置
+
+
+
+
+ 系统默认 展示流程名称
+
+ 自定义标题
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/bpm/model/form/index.vue b/src/views/bpm/model/form/index.vue
index 84e74d89..2f90b3c0 100644
--- a/src/views/bpm/model/form/index.vue
+++ b/src/views/bpm/model/form/index.vue
@@ -154,7 +154,11 @@ const formData: any = ref({
postfix: '',
length: 5
},
- autoApprovalType: BpmAutoApproveType.NONE
+ autoApprovalType: BpmAutoApproveType.NONE,
+ customTitleSetting: {
+ enable: false,
+ title: ''
+ }
})
//流程数据
From 09e406618c9cba6b27aa03d0c9a2312a4fe7d8a6 Mon Sep 17 00:00:00 2001
From: YunaiV
Date: Thu, 23 Jan 2025 19:19:35 +0800
Subject: [PATCH 74/86] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E8=AF=84?=
=?UTF-8?q?=E5=AE=A1=E3=80=91Bpm=EF=BC=9A=E6=9B=B4=E5=A4=9A=E8=AE=BE?=
=?UTF-8?q?=E7=BD=AE-=E8=87=AA=E5=AE=9A=E4=B9=89=E6=A0=87=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/views/bpm/model/form/ExtraSettings.vue | 25 +++++++++++-----------
1 file changed, 13 insertions(+), 12 deletions(-)
diff --git a/src/views/bpm/model/form/ExtraSettings.vue b/src/views/bpm/model/form/ExtraSettings.vue
index 8321d131..0af79d9e 100644
--- a/src/views/bpm/model/form/ExtraSettings.vue
+++ b/src/views/bpm/model/form/ExtraSettings.vue
@@ -113,13 +113,14 @@
diff --git a/src/components/SimpleProcessDesignerV2/src/consts.ts b/src/components/SimpleProcessDesignerV2/src/consts.ts
index 2ba4fb3f..a74bd464 100644
--- a/src/components/SimpleProcessDesignerV2/src/consts.ts
+++ b/src/components/SimpleProcessDesignerV2/src/consts.ts
@@ -28,6 +28,11 @@ export enum NodeType {
*/
DELAY_TIMER_NODE = 14,
+ /**
+ * 触发器节点
+ */
+ TRIGGER_NODE = 15,
+
/**
* 条件节点
*/
@@ -498,6 +503,7 @@ NODE_DEFAULT_TEXT.set(NodeType.CONDITION_NODE, '请设置条件')
NODE_DEFAULT_TEXT.set(NodeType.START_USER_NODE, '请设置发起人')
NODE_DEFAULT_TEXT.set(NodeType.DELAY_TIMER_NODE, '请设置延迟器')
NODE_DEFAULT_TEXT.set(NodeType.ROUTER_BRANCH_NODE, '请设置路由节点')
+NODE_DEFAULT_TEXT.set(NodeType.TRIGGER_NODE, '请设置触发器')
export const NODE_DEFAULT_NAME = new Map()
NODE_DEFAULT_NAME.set(NodeType.USER_TASK_NODE, '审批人')
@@ -506,6 +512,7 @@ NODE_DEFAULT_NAME.set(NodeType.CONDITION_NODE, '条件')
NODE_DEFAULT_NAME.set(NodeType.START_USER_NODE, '发起人')
NODE_DEFAULT_NAME.set(NodeType.DELAY_TIMER_NODE, '延迟器')
NODE_DEFAULT_NAME.set(NodeType.ROUTER_BRANCH_NODE, '路由分支')
+NODE_DEFAULT_NAME.set(NodeType.TRIGGER_NODE, '触发器')
// 候选人策略。暂时不从字典中取。 后续可能调整。控制显示顺序
export const CANDIDATE_STRATEGY: DictDataVO[] = [
diff --git a/src/components/SimpleProcessDesignerV2/src/nodes/DelayTimerNode.vue b/src/components/SimpleProcessDesignerV2/src/nodes/DelayTimerNode.vue
index 94f9c413..7fbad1cd 100644
--- a/src/components/SimpleProcessDesignerV2/src/nodes/DelayTimerNode.vue
+++ b/src/components/SimpleProcessDesignerV2/src/nodes/DelayTimerNode.vue
@@ -10,7 +10,7 @@
>
-
+
-
-
-
+
+
2!?$Rx3%eLLWLS1GB1hg$s1vDU}tx#Km{-j+K
znh-YnV#Ov@H-^OYg&2%cLI~LS#{<6lzzYd4{zQVAK45$>Q4&M9o|(n0peEjX&zW=2
zch0%roVoLPWIn#wTn_hr1%L|xFnn}kWZLtba2
8c22tROEF6F@b@rlx@4l=0T&!jp|P8}VQ7L+B*AEbR`V&v2`#^5U9
zR3BoKBNL<1h7Sr?0OTMYI5s^sTRQl((*e+MngSNyxt`eW0VI=T`S#M;A*JvecnGI)
z_p{%>uRqty4&dIVy$hJ-rD5fH;6w0K;`j+dViqRme{$}T9d?TfqAPY
z);q3*YC`A3idqw50xS2*mZAhAWsfB+urxc%e&M3rH20HZ*m2uBWbGPvm)iv!VJ{59
z%K$C$))e*_m`k?Oj0-%?U|0>yn6!YrHPb3N)G$FUaSG~58mKWrW+}{5W{Sy-&@#c;
z98Y1kCqNki4P|U;Zso?@qMLKIwL5z^9Ul5_=UqM
zIWf~EuHF$9Mu|i*eK}SC?cz9f@`bEX%_(P0|_nqjHtGjUK
zi#}c~H@bUX-!XCIP>#l-BNIE`$h#v76N~5fo;fjIC>9IjC(i6WU-T}ELT1ymbJ@h?
zVo~%ku^}KN26lG)eBC<-5}rn$t6p;}J{Jynz12?zzv4Dl!TMBdUviV20bYne3v`14
zyWj*}fUJRO4TEwS>D_zcG6prwr1RON^DpFafO{0+gJCN?;In((ld&ILFcS*eAA?uW
z`X>AnnDDWAJ!j-}Tg}Q5nN~>GS1(zP@+0oBroHvISlV`In&^?VRCF`j+|<5qbFnGZ
zs&%fb?RpLNjsCE(p4%r!q7hkd*RucOTkX{InwB?mnwHzIx9hZ6w)(!SEC#~fNW>fP
zx3tdAZb(F%f+0yol^n@rk%j07hP7|Gi(HJX2sA?qo`h%M0A0c<`dcqjD}#JIxdpTN
zbT~wpr?n-82C7aCvDTqDuTpQ*24+)8eSU0H{%`1iAt4zBJ`uP6f~O;by%T5((0Wl+e2QqR{i5PmTrN`L&bl{O
zH?k~k6Jf4>P
zWxsS&^82Oguad%LS*Xd@xGY&*15IMBG;!&un@`!MO?IH}Jy7?)R5wRm58p{tq!$)9
zv=N=>Z&lGw;50@45HRd-ainOk>!~d^iN;8-R~X
zWw$zW{O|~AI^uDHv&*7PWIe-qe0^N!>%SZVudD&C%
m)K8wtMxN2+C3Rw8|H?VByB$$th$)t==|;Gd`STK)q4CUFA*
diff --git a/src/components/SimpleProcessDesignerV2/theme/iconfont.woff b/src/components/SimpleProcessDesignerV2/theme/iconfont.woff
index 94befbd1898e85a0687043275b23b0667e74fd29..f4b4f3de95d8fb8c727b52d9a06b18e22a566d85 100644
GIT binary patch
delta 2392
zcmV-e38(hN5UdsycTYw}00961000Xt01E&B000pPkrX|D7D~HgZDDW#00D>q005u>
z00K4(Q3t$dYL!nw|Wnp9h00{5^001ul001^Bk1@e$Xk}pl
z00|%f000~S001Nh-UEziZFG1500}$*000jF001m30001NZ)0Hq00~S0000;O000;b
zj1Qb`VRj000SO0000U0000W0U!XfZeeX@000Su0003%0007K5TiV>aBp*T000Wa
z0001J0001tSwsZ{lL!H50X&m&0Th1`4NZ8Q<&n(|!Y~X*U-}cE;=rZ!(h*p&5(8uu
zP8_;QcW@3JqS$e7lnHS3BKec;ME-ylsFjD(KzI|dc&QqSUegu5;i>tZn<`O|N=BI^
z$t+9m^N`nVgJ1eV1fBJL>^ChZeXXO?nhR&57RSRG{}tDAr#zGtpq<2bP$+hgaocAU1!#z`ME$rjqQ30t7umd!4-ECg1eth55UD^#+GW!V)Kutk6h
z{3xpxh-&x8vMNX*At8S7Q~`g1v;uzc2MNUk=T4luXyG3-H|L)FoqObSzkAM^5Emi;
zx<&s$=g0^-O4i83grtpZ0qPB~GFf~LuLoaAQ569)%ur)*SykAJrnG^Z>X`;;oLArq
zP(#lGCvdw~(2W9A>rr%wY9K&b&(d>#-cNl)dH2NF>e{c@R>vmX!$W@_S2XS`Rlq&d
zy0EdcaiKNihDwR=+~q}AoTJA+`RrO~fQpeY51t5@nrbghB_ZPR20ZYR9pOcv>z{mz
z|A!lVf;|Tx{9fC`$NlwB9D4NhNeiEoryo7^RLvg~IllS)(XET;r<%>F^B1>{KHm(!
z!h0)Y^P5$3<64ssaQuJ1sMlPa9Sw&^XBW*t+(YeKelhHW#bD6>t~Vn38y!Nt$lLen
z25pcaiIFrJB@Hr1E)oLO29!0B1i+Km4FMz#D&<-=f6>QBm0&Cu
zj7HMgOP2=CzJw%)R8SGfWSX2z0?6O5=na}eEk<-wAd}=lvV!^d7+?
z{GQ5tdK>&_7mmDZed$=SR4N`@S`UUo!IdKmmy^1lyu5#KFuho0)G@AchNLl0dW9KvXhzs|yf
zRxc8KE-y?p2|g6>`s4Hm^ck#`INmd1iQeEekTK`!ZYAte56+brz|;}#-%Ei8SJAOR
z*qS3tSDSyS4}JB8)%mUV*qM6$%;QYJ!=jXL=k4Ptq<+b4Eswyr8;>+3IJ5e~SDr{U
zuP(K>=Ha*9?I?B*O2YPVJD+b4ZwnIYh2@snc%+F7!g}I!^lx<2i8n{aS;Y56Nm)kEHOEY?m{tEb-21YEbzsLhytDi(tq
zv8D=Nler7_b}$vNKN}3fV}Voqj2nO40d$!*AsXzn(ZNwBIJQrCtJHY@Z?n}RG0h9ua3FsK{A-(BcddU#vpFK&kE`OLADfuO5%Sx
zL3&Y;ZcD;>W;^ewFZNb9`*Qc&a(y=)rCVcH=+Ed=*iT2v3FkI4Ea^jgvX6g(%Vq>l#t%QMQ;*3ml-}Ig7G+ta8%#32ztaDf
zzns)_i|e)4;|BmtV41MM+J6=0!Av|3rDMg+Axn!XgG0OM6*(!(nzF5k
zuj2OUN%Nh>>iYZu(Af{PN~bfWIYeI-mHFpHSrI2Lw#C{+HY(%)m)-Gil(tEhIy}x6sSUJ&T*QnQDJcgPy`B
zMjU+_LP1&Ud|s1-p`jArTsa`-b1pB)Lq-4eLo>oi4kRCip^~4OhC4aEsN;aM-8rkW
zNr!XrrkL=D!~TT$L;u{$1hrP?g*RPy0uQc?bM@tU;YY4F0<(zMmfP#-Q!qeRyYo?$
zMnNb42L1WDoB#j-c${NkWMF?_0OGCJ=5)pL+k9oN16cL9kcpp(Z-9BoiS6n0k8`?XqwAXrQl1|1B8sz=#PB
z9y0q004&o
z00Hz+!SeHGYaBp*T000N<
z000100001SzsN@PlL!H50X>s(0Th2v4NrKS?U6wWgFp;LUmUAYTy!IDJVMXps+aHv
z(v_!779PSTlR_!<2u*l1Wz0dUdM6bBiim&~ffV4-LoZb2P^xg?fP^?80RkZ*Rlr{m56rl3
z8j02J_kPVMz4zw5MHr!fU&nu6;Wtqj>1YHYurg4R44^~?Y{@_ja7*B204(Q0A#Ia;
zV?g{(yCh{z*J#=jn%*eKU;6msLUpZnV6jkGJR<;}Qb@X%W=A=Y7_loe1Mo%ZWQoAy
z!o`oy#>*SiwY4hz(mKvzXM)J}{#rU+>#xg%>zSE~T{>Cj2J-QI&*Oi8@M<&P6e^00
z_hgBA`d$fmN<9B|aI66Mi3X}$fV{(XD+!Lrb(i~ygr?SNwYB#IOy%c2Z~i#}u*nv+
za+J+Sqi`i!*5DH=onrNHJjC7!hvE59JPfD9(uEe2153839KZ)3Mx$(r6WJ4*Adii5
zvY<41VODRqk;Lm*_aT40&g-}zp>~NDv`)}qxE(riqAikux8N!}^6L+Cjrfo7CA$Jk
zH&)pn>^rs%emKt3=U#qI`i;GP7M9osyb9V5x_lX?KS%r#J^CHrz!hZh4rP#wP@Bp7
zl8f-pWKC*Xei|VvzqouZl8x|2B??f2ZZIGK$v{DTS^(RP>t=t^vWg}=&ED5-TbIW5
zo>8mV_|t}~``pf%eYk_wp6Qr`%?D;vNBaz`Xi4LoGHUCM>v~U*4o|X8?)>Z~{2cKq
zl@3Q?@s*ke+k#Aa`(y;61iO1moZZDrT
zbGzibVQLDkb=rT<;ty73N@a`4>@QnP)v5rSHDqFmz$*$Niq*>x?}5fjjnWKBQ~d#dAlurkgxTzfhPWb{r`v!xfkB!L#DIoV@=o<=(P=6z34x0Rh<1Lxg
zgfL+RZYf>CNF>;$d=or8dl2VltMV=1cIctmqEt_qsmkB_ZiXhgKR;7j=A4WLrq+@V
zbF?xh`VR)=51RmZoMT{QU|;~^+tHK1#`D{JW#DFE0D(tuS^E(5|9Tb%=58RDgMkSo
z3II{$3r&+B2^UEK07ni2ad@0#VPIfj!Gi$;U;rTi00000003A3ya4I}J^``ITc_Ih(YU&pf{Yd?>yXR6osgbX*cP(@001~;*XIBL
diff --git a/src/components/SimpleProcessDesignerV2/theme/iconfont.woff2 b/src/components/SimpleProcessDesignerV2/theme/iconfont.woff2
index e8f95c8c307663dec7a55cd4775adfc07a72de70..d66f968531f29868912969439cc3634ae976b9c1 100644
GIT binary patch
delta 2325
zcmV+w3F`LH444uacTYw#00961000RX01E&B000pP000Qfkr*9+gf3X9s}{8;uSl5oUx`LiUe@>`dc^A}U){L!tWd`QZXfzKSLqXNFSp@U%vI
ze`a?5#E~Xujp(IcBx-~Np?e~E^HS7HxGCDSJ&x#MNdrXmh{-ghVnBqLVKFCZOo`sL
ze%Cq>YdvBWcci9&A@3UBZ!NDx!bjCD%CjYpJ~#Uphh8R2u0oss-&(7>uOCh9Od6q4
zDyjV0J!E#z=6pHKJV6u-8A37fW+C!OR84_W0-*!yrfKnbstnPACbr3?h+2S|{kr1_
z^!5;-oQh7A0>*M-Qw?xL74{CAvawvDECiN@MOhGp)=+bQmn|S}0W;DK%6$ObEM7nU
zgV3-9k}896N9W7LCE)TjFnt4Kvlx&+0Q__fFnvOWj2$;-i-*gu2LP_{j)Lo_DpOqo
zz#^9Man--TG-cX(S~b0H`snmC6Whc!eKR`?nhX02i_t%LKvroKy(Dy6HBkd_qoA(m
z^!x&ehRiR23QMmp%KnigTknIlQRAII+416hR|}3@(f0!p5GvmT0JzP9poM|
z8lD<-k9GQ>B$_@ubt#R|YH@CMFUii-^sCiHba^X&>>hdN2zK~3ardZ#80y3NhY@lT
zpQsuQB`10e8#mXPPwC}OE*VWg?)jVxcoYx<{sPAq`kIDf?QU;4?R%elGbJ`gOh6Dm
zNsfbmQuPq0NINh%$}ZIOm+k)x5o0n;qak~Hajlk6t6K!wl3fNMHk7O|$l^m@{0#0>`3jVBrm*0c#5@F0lCBXrV2
zy-tTB0U6WpBb=`3Ooim{M5+6tes}nGz~d
zX15g;z(pzs@$f2ShF^Px(7_{d9#F9h2$Q@7!3YJre7{Da9K7Wv)9kb>kxO66WND;K
zq_TdxlOYI%Pgv8y137+89jwQ~q7h>tAHRgqp?1XF2=GK+URoHprB7W(_g~F1~P2`2X
z-uZR$)~ow`Ra$>cOs!g!vmi4&EHCVTbwF^z`=M5e18_~|f?&Mu|4=PRrgnud7bz>2
zR15w!7z}>7)Gm-5s{NmIJ#IBKe+8Eko6@$1PojC%w9NwFuWc+hQ{=W#f}8ko94nr6
z*i{S?Y_rOT(+3m3xB9BvX2D+xq&xY0LNwI<;`FkH)Bl3CcicWF3z9zzviEL(NN02z
zosC@#_V)qbN%-UAa^42KS@+oOOOhbz%Rm6IWJulyCI_?RmyO%0
z!bab12^G&iPpx6CahK3|3k7U2+d=nm@}NJ=Cg#wc^Nu?3ujm%#UA5N=yB?>bj;NDZ
zQ0`#0X~t$|lkFyxjcJo4prdGiJJW63ZL+nBh0~l()*~!|<>Mu_>ZS>CEu5@9+Rn&L
zW+j$bC*4X`v^m}<$uF}YJtQSKI3*$=z>}b(Z-Rie3&)VgG@88wxn-AuJtmZt`MUI6UINc82FIg}JLie~vdf@gb6WZe*
zC881s)FIM=mz+D_p-@za+T-?P=(VG-f1DF65&i4+@Wi{)GFqINv+LGHsT@m-+yWMT
zfmMu1rgBtfpo0uP!|nnv!{yMc3Z8cXCNhXF;&NeWWBOxcqEpU)Z7$4QFPApwsj&%}
z5IFV%t6@gDMKQAkS21Jjd>}FNl*`pXm#=p_esouag!$$t#OCu-MU+}`L>&+@(H!<8
z>*%jt0(B4eF>xEDPnHD&IH)F_8Ymnbif?u<^qr7ucVZSFox7WcH>RH1^f0uaEz7oPZ<hlMERnz45#LY!{zfFN^iaX+ELwS!VKXwRE{EA=@hqI8O%i5j?BJe6;+}9Hbwlcm
zpY`_i`Z=~%($>#4(xkB#=P7C(E}*taD}#Nw26a-}+fKalU``!?MX>^GvJ%oTZCsj6
zdX6)wTeyIKGD<6pOt=Ph;lK3WZ#=EzIbXc|4KS&^kF8cT*na9mV8M+Q~En(KW
v!K((A_xq$Qn#~DvH+W;`G%UC@A@0{b`^Mr9+XR2Z@y$%W;5M?bwXlZ+2aj$h
delta 1608
zcmV-O2DkZ`63`47cTYw#00961000J101E&B000a)000I7kr*9+gLDdtNQn;tHUcCA
zAPW)z1Rw>3X9sZ`s0tAkq^XkqOt5X?WLN6Z4Bg-(X-z&nZrc0#fl`814Jsy79V!!L
zO{c;%>>Orlm8m0V+MYY$4#4JynKlbx)2V0<%e3@8_KI(PWExqa0Ju0*%{&iC_FF85
zA=ztCG}Z-_0*$$Uu(g8s3baMND#J;-n*dYIUGD<|K#F7(f+?%0(?Kz5^sFiH2Maw-
zfHa>>8qbf0WT*k#f+LW~#q7Q;$SQ~c<}KzCfR*9J#pJDX3#hi4+?2rDvJ?+0958PQec1?2pljDygBGK
z=rj0@(^+bTgsjzsfAIhYEC^g6h6ofOVrYp>u!g7$Fu=HCgwjB$z(Q(-3Ix(OK?4_H
z&`Sj|q&`qV1nD=B;#omU_E7=w21q}^G(*eM9Sa3}cf?F=l*`q2JC#Z<4&g-Xa3YJ0
zOmo#l-fXvjJBn;J2v+M5v%7;}vsoMtlihAKA0Z@ENo6%2Ksc0VaVAb~8M6u_6Cvu@
z2&;uPV#!5h{$yFDJO@_d=0G7!znF&gmR3~|7c2oJHPdAgns>YPeYq7&1}$>>a|Ac
z;jDU;hLARg7fjLr9qVI62Ako8~}n=^;s+QDr_Nbc07Y)TWwLoPEe~
zdsVwm$Mo1X$Uc@o
zT|nA@Ok2EaB`2g=de(7j;8s3{9FIDypsOR#CU3nWtPVQ>i`{I4_8dMFhmo*`6+uT_>QJyy9~_otqJ6lcm?
z-_KxMQdEOeWVYPkVrnp81L8=+29lIoJ10VsQ>`y5_*kV6lpE}
zo*GG?(mq;D`j_@oy0Ji?)1?4F-(_b0_}0V2p=*B|sm%Y)-2ZXTr{9TIh}*e@#rCow
z0RzySpPFuE|SGMKm>0Lf*30N
z2U4^V`SCbJ62;iFfE69xKQx*ctd(mx>o@v`W2p-ML-GheHDz6le<47BHnBr~_N}TV
zE78-fe=#^0DM_4Qv>a5^sj6(96E<1-ZiE@r>npE6NkjY&cQ7f
G0002A{{j*K
diff --git a/src/components/SimpleProcessDesignerV2/theme/simple-process-designer.scss b/src/components/SimpleProcessDesignerV2/theme/simple-process-designer.scss
index 8cf2681d..f3d8b443 100644
--- a/src/components/SimpleProcessDesignerV2/theme/simple-process-designer.scss
+++ b/src/components/SimpleProcessDesignerV2/theme/simple-process-designer.scss
@@ -113,18 +113,21 @@
// 节点连线气泡卡片样式
.handler-item-wrapper {
+ width: 320px;
display: flex;
+ flex-wrap: wrap;
cursor: pointer;
.handler-item {
display: flex;
flex-direction: column;
align-items: center;
+ margin-top: 12px;
}
.handler-item-icon {
- width: 60px;
- height: 60px;
+ width: 50px;
+ height: 50px;
background: #fff;
border: 1px solid #e2e2e2;
border-radius: 50%;
@@ -138,13 +141,14 @@
.icon-size {
font-size: 25px;
- line-height: 60px;
+ line-height: 50px;
}
}
.approve {
color: #ff943e;
}
+
.copy {
color: #3296fa;
}
@@ -161,6 +165,18 @@
color: #345da2;
}
+ .delay {
+ color: #e47470;
+ }
+
+ .trigger {
+ color: #3373d2;
+ }
+
+ .router {
+ color: #ca3a31
+ }
+
.handler-item-text {
margin-top: 4px;
width: 80px;
@@ -266,6 +282,18 @@
&.start-user {
color: #676565;
}
+
+ &.delay-node {
+ color: #e47470;
+ }
+
+ &.trigger-node {
+ color: #3373d2;
+ }
+
+ &.router-node {
+ color: #ca3a31
+ }
}
.node-title {
@@ -711,45 +739,56 @@
// iconfont 样式
@font-face {
- font-family: 'iconfont'; /* Project id 4495938 */
- src:
- url('iconfont.woff2?t=1724339470412') format('woff2'),
- url('iconfont.woff?t=1724339470412') format('woff'),
- url('iconfont.ttf?t=1724339470412') format('truetype');
+ font-family: "iconfont"; /* Project id 4495938 */
+ src: url('iconfont.woff2?t=1737639517142') format('woff2'),
+ url('iconfont.woff?t=1737639517142') format('woff'),
+ url('iconfont.ttf?t=1737639517142') format('truetype');
}
.iconfont {
- font-family: 'iconfont' !important;
+ font-family: "iconfont" !important;
font-size: 16px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
+.icon-trigger:before {
+ content: "\e6d3";
+}
+
+.icon-router:before {
+ content: "\e6b2";
+}
+
+.icon-delay:before {
+ content: "\e600";
+}
+
.icon-start-user:before {
- content: '\e679';
+ content: "\e679";
}
.icon-inclusive:before {
- content: '\e602';
+ content: "\e602";
}
.icon-copy:before {
- content: '\e7eb';
+ content: "\e7eb";
}
.icon-handle:before {
- content: '\e61c';
+ content: "\e61c";
}
.icon-exclusive:before {
- content: '\e717';
+ content: "\e717";
}
.icon-approve:before {
- content: '\e715';
+ content: "\e715";
}
.icon-parallel:before {
- content: '\e688';
+ content: "\e688";
}
From 7f50584a0283563473d56146f71cb2e16bbcd579 Mon Sep 17 00:00:00 2001
From: GoldenZqqq <1361001127@qq.com>
Date: Fri, 24 Jan 2025 10:30:57 +0800
Subject: [PATCH 78/86] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E6=B5=81?=
=?UTF-8?q?=E7=A8=8B=E6=A8=A1=E5=9E=8B=E5=88=86=E7=B1=BB=E7=BB=84=E4=BB=B6?=
=?UTF-8?q?=E6=80=A7=E8=83=BD=E5=92=8C=E7=B1=BB=E5=9E=8B=E5=AE=9A=E4=B9=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../bpm/model/CategoryDraggableModel.vue | 147 ++++++++++++------
1 file changed, 101 insertions(+), 46 deletions(-)
diff --git a/src/views/bpm/model/CategoryDraggableModel.vue b/src/views/bpm/model/CategoryDraggableModel.vue
index ade1267b..5c8610ab 100644
--- a/src/views/bpm/model/CategoryDraggableModel.vue
+++ b/src/views/bpm/model/CategoryDraggableModel.vue
@@ -1,5 +1,5 @@
-
+
@@ -13,7 +13,7 @@
({{ categoryInfo.modelList?.length || 0 }})
-
+
-
+
-
- {{ scope.row.name }}
+
+ {{ row.name }}
-
-
+
+
全部可见
-
- {{ scope.row.startUsers[0].nickname }}
+
+ {{ row.startUsers[0].nickname }}
- {{ scope.row.startUsers[0].nickname }}等 {{ scope.row.startUsers.length }} 人可见
+ {{ row.startUsers[0].nickname }}等 {{ row.startUsers.length }} 人可见
@@ -248,7 +249,6 @@
From 4319d8697894b326db7b5b8ee66b5cc25882b5ff Mon Sep 17 00:00:00 2001
From: GoldenZqqq <1361001127@qq.com>
Date: Fri, 24 Jan 2025 11:13:09 +0800
Subject: [PATCH 79/86] =?UTF-8?q?Revert=20"fix:=20=E4=BC=98=E5=8C=96Simple?=
=?UTF-8?q?=E8=AE=BE=E8=AE=A1=E5=99=A8=E6=8E=A5=E5=8F=A3=E8=B0=83=E7=94=A8?=
=?UTF-8?q?=E9=80=BB=E8=BE=91=E4=B8=8E=E5=8E=BB=E9=99=A4loading=E6=95=88?=
=?UTF-8?q?=E6=9E=9C"?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This reverts commit b3a97b08897b42517e48c0aede8f3ab8871cb097.
---
.../src/SimpleProcessDesigner.vue | 46 +------------------
1 file changed, 2 insertions(+), 44 deletions(-)
diff --git a/src/components/SimpleProcessDesignerV2/src/SimpleProcessDesigner.vue b/src/components/SimpleProcessDesignerV2/src/SimpleProcessDesigner.vue
index 667c8500..70eade33 100644
--- a/src/components/SimpleProcessDesignerV2/src/SimpleProcessDesigner.vue
+++ b/src/components/SimpleProcessDesignerV2/src/SimpleProcessDesigner.vue
@@ -1,5 +1,5 @@
-
+
([]) // 用户列表
const deptOptions = ref([]) // 部门列表
const deptTreeOptions = ref()
const userGroupOptions = ref([]) // 用户组列表
-const isDataInitialized = ref(false) // 添加标记,用于判断数据是否已初始化
provide('formFields', formFields)
provide('formType', formType)
@@ -161,32 +160,9 @@ const validateNode = (node: SimpleFlowNode | undefined, errorNodes: SimpleFlowNo
}
}
-// 初始化数据的方法
-const initializeData = async () => {
- if (isDataInitialized.value) {
- return
- }
-
+onMounted(async () => {
try {
loading.value = true
-
- // 并行加载所有数据
- const [roleList, postList, userList, deptList, userGroupList] = await Promise.all([
- RoleApi.getSimpleRoleList(),
- PostApi.getSimplePostList(),
- UserApi.getSimpleUserList(),
- DeptApi.getSimpleDeptList(),
- UserGroupApi.getUserGroupSimpleList()
- ])
-
- // 更新数据
- roleOptions.value = roleList
- postOptions.value = postList
- userOptions.value = userList
- deptOptions.value = deptList
- deptTreeOptions.value = handleTree(deptList as DeptApi.DeptVO[], 'id')
- userGroupOptions.value = userGroupList
-
// 获取表单字段
if (props.modelId) {
const bpmnModel = await getModel(props.modelId)
@@ -215,27 +191,9 @@ const initializeData = async () => {
} else {
updateModel()
}
-
- isDataInitialized.value = true
- } catch (error) {
- console.error('初始化数据失败:', error)
} finally {
loading.value = false
}
-}
-
-onMounted(async () => {
- await initializeData()
-})
-
-// 添加 activated 生命周期钩子
-onActivated(() => {
- // 组件被激活时,只需要刷新视图
- if (isDataInitialized.value) {
- refresh()
- } else {
- initializeData()
- }
})
const simpleProcessModelRef = ref()
From 8ff63622ecac6c3523073804c12aa0950d72682c Mon Sep 17 00:00:00 2001
From: LesanOuO <1960681385@qq.com>
Date: Fri, 24 Jan 2025 13:11:12 +0800
Subject: [PATCH 80/86] =?UTF-8?q?feat:=20BPM-=E6=9B=B4=E5=A4=9A=E8=AE=BE?=
=?UTF-8?q?=E7=BD=AE-=E6=91=98=E8=A6=81=E8=AE=BE=E7=BD=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/views/bpm/model/form/ExtraSettings.vue | 89 +++++++++++++++++-----
src/views/bpm/model/form/index.vue | 6 +-
src/views/bpm/processInstance/index.vue | 9 +++
src/views/bpm/task/done/index.vue | 19 +++--
src/views/bpm/task/todo/index.vue | 15 +++-
5 files changed, 108 insertions(+), 30 deletions(-)
diff --git a/src/views/bpm/model/form/ExtraSettings.vue b/src/views/bpm/model/form/ExtraSettings.vue
index 0af79d9e..82f0ea67 100644
--- a/src/views/bpm/model/form/ExtraSettings.vue
+++ b/src/views/bpm/model/form/ExtraSettings.vue
@@ -75,12 +75,12 @@
-
+
标题设置
-
+
系统默认 展示流程名称
+
+
+ 摘要设置
+
+
+
+
+
+ 系统默认 展示表单前 3 个字段
+
+ 自定义摘要
+
+
+
+
+
+
+
@@ -174,21 +206,30 @@ const numberExample = computed(() => {
})
/** 表单选项 */
-const formField = ref>([])
-const formFieldOptions = computed(() => {
+const formField = ref>([])
+const formFieldOptions4Title = computed(() => {
+ let cloneFormField = formField.value.map((item) => {
+ return {
+ label: item.title,
+ value: item.field
+ }
+ })
// 固定添加发起人 ID 字段
- formField.value.unshift({
- field: ProcessVariableEnum.PROCESS_DEFINITION_NAME,
- title: '流程名称'
+ cloneFormField.unshift({
+ label: ProcessVariableEnum.PROCESS_DEFINITION_NAME,
+ value: '流程名称'
})
- formField.value.unshift({
- field: ProcessVariableEnum.START_TIME,
- title: '发起时间'
+ cloneFormField.unshift({
+ label: ProcessVariableEnum.START_TIME,
+ value: '发起时间'
})
- formField.value.unshift({
- field: ProcessVariableEnum.START_USER_ID,
- title: '发起人'
+ cloneFormField.unshift({
+ label: ProcessVariableEnum.START_USER_ID,
+ value: '发起人'
})
+ return cloneFormField
+})
+const formFieldOptions4Summary = computed(() => {
return formField.value.map((item) => {
return {
label: item.title,
@@ -211,12 +252,18 @@ const initData = () => {
if (!modelData.value.autoApprovalType) {
modelData.value.autoApprovalType = BpmAutoApproveType.NONE
}
- if (!modelData.value.customTitleSetting) {
- modelData.value.customTitleSetting = {
+ if (!modelData.value.titleSetting) {
+ modelData.value.titleSetting = {
enable: false,
title: ''
}
}
+ if (!modelData.value.summarySetting) {
+ modelData.value.summarySetting = {
+ enable: false,
+ summary: []
+ }
+ }
}
defineExpose({ initData })
@@ -224,9 +271,9 @@ defineExpose({ initData })
watch(
() => modelData.value.formId,
async (newFormId) => {
- if (newFormId && modelData.value.formType === BpmModelFormType.CUSTOM) {
+ if (newFormId && modelData.value.formType === BpmModelFormType.NORMAL) {
const data = await FormApi.getForm(newFormId)
- const result: Array<{ field: ProcessVariableEnum; title: string }> = []
+ const result: Array<{ field: string; title: string }> = []
if (data.fields) {
data.fields.forEach((fieldStr: string) => {
parseFormFields(JSON.parse(fieldStr), result)
diff --git a/src/views/bpm/model/form/index.vue b/src/views/bpm/model/form/index.vue
index 2f90b3c0..a7b20a5e 100644
--- a/src/views/bpm/model/form/index.vue
+++ b/src/views/bpm/model/form/index.vue
@@ -155,9 +155,13 @@ const formData: any = ref({
length: 5
},
autoApprovalType: BpmAutoApproveType.NONE,
- customTitleSetting: {
+ titleSetting: {
enable: false,
title: ''
+ },
+ summarySetting: {
+ enable: false,
+ summary: []
}
})
diff --git a/src/views/bpm/processInstance/index.vue b/src/views/bpm/processInstance/index.vue
index a47b8bf7..dc071996 100644
--- a/src/views/bpm/processInstance/index.vue
+++ b/src/views/bpm/processInstance/index.vue
@@ -130,6 +130,15 @@
+
+
+
+
+ {{ item.key }} : {{ item.value }}
+
+
+
+
-
+
@@ -77,9 +77,9 @@
>
- 高级筛选
+ 高级筛选
-
+
-
+
+
+
+
+
+ {{ item.key }} : {{ item.value }}
+
+
+
+
- 高级筛选
+ 高级筛选
-
+
-
+
+
+
+
+
+ {{ item.key }} : {{ item.value }}
+
+
+
+
Date: Fri, 24 Jan 2025 13:19:44 +0800
Subject: [PATCH 81/86] =?UTF-8?q?fix:=20label=E6=8B=BC=E5=86=99=E9=94=99?=
=?UTF-8?q?=E8=AF=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/views/bpm/model/form/ExtraSettings.vue | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/views/bpm/model/form/ExtraSettings.vue b/src/views/bpm/model/form/ExtraSettings.vue
index 82f0ea67..182218e3 100644
--- a/src/views/bpm/model/form/ExtraSettings.vue
+++ b/src/views/bpm/model/form/ExtraSettings.vue
@@ -134,7 +134,7 @@
From 0bbf4c91438adcab6cd6c28a1e9c7bdfc2ab2860 Mon Sep 17 00:00:00 2001
From: LesanOuO <1960681385@qq.com>
Date: Fri, 24 Jan 2025 13:58:52 +0800
Subject: [PATCH 82/86] =?UTF-8?q?fix:=20=E6=9C=8D=E5=8A=A1=E4=BB=BB?=
=?UTF-8?q?=E5=8A=A1=E6=97=A0=E6=B3=95=E5=90=AF=E5=8A=A8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../multi-instance/ElementMultiInstance.vue | 33 ++++++++++++-------
1 file changed, 21 insertions(+), 12 deletions(-)
diff --git a/src/components/bpmnProcessDesigner/package/penal/multi-instance/ElementMultiInstance.vue b/src/components/bpmnProcessDesigner/package/penal/multi-instance/ElementMultiInstance.vue
index de2fb0d7..99ee6f88 100644
--- a/src/components/bpmnProcessDesigner/package/penal/multi-instance/ElementMultiInstance.vue
+++ b/src/components/bpmnProcessDesigner/package/penal/multi-instance/ElementMultiInstance.vue
@@ -1,6 +1,10 @@
-
+
+
+ 除了UserTask以外节点的多实例待实现
+
@@ -301,19 +308,21 @@ const approveMethod = ref()
const approveRatio = ref(100)
const otherExtensions = ref()
const getElementLoopNew = () => {
- const extensionElements =
- bpmnElement.value.businessObject?.extensionElements ??
- bpmnInstances().moddle.create('bpmn:ExtensionElements', { values: [] })
- approveMethod.value = extensionElements.values.filter(
- (ex) => ex.$type === `${prefix}:ApproveMethod`
- )?.[0]?.value
+ if (props.type === 'UserTask') {
+ const extensionElements =
+ bpmnElement.value.businessObject?.extensionElements ??
+ bpmnInstances().moddle.create('bpmn:ExtensionElements', { values: [] })
+ approveMethod.value = extensionElements.values.filter(
+ (ex) => ex.$type === `${prefix}:ApproveMethod`
+ )?.[0]?.value
- otherExtensions.value =
- extensionElements.values.filter((ex) => ex.$type !== `${prefix}:ApproveMethod`) ?? []
+ otherExtensions.value =
+ extensionElements.values.filter((ex) => ex.$type !== `${prefix}:ApproveMethod`) ?? []
- if (!approveMethod.value) {
- approveMethod.value = ApproveMethodType.SEQUENTIAL_APPROVE
- updateLoopCharacteristics()
+ if (!approveMethod.value) {
+ approveMethod.value = ApproveMethodType.SEQUENTIAL_APPROVE
+ updateLoopCharacteristics()
+ }
}
}
const onApproveMethodChange = () => {
From 8e8475ffdc46df1988b360cad2c2f2ff705f6a0a Mon Sep 17 00:00:00 2001
From: YunaiV
Date: Fri, 24 Jan 2025 19:59:02 +0800
Subject: [PATCH 83/86] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E8=AF=84?=
=?UTF-8?q?=E5=AE=A1=E3=80=91Bpm=EF=BC=9A=E6=9B=B4=E5=A4=9A=E8=AE=BE?=
=?UTF-8?q?=E7=BD=AE-=E6=91=98=E8=A6=81=E8=AE=BE=E7=BD=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/components/SimpleProcessDesignerV2/src/node.ts | 9 +++++----
.../SimpleProcessDesignerV2/src/nodes/DelayTimerNode.vue | 1 -
src/views/bpm/task/copy/index.vue | 1 +
3 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/src/components/SimpleProcessDesignerV2/src/node.ts b/src/components/SimpleProcessDesignerV2/src/node.ts
index 51a956da..ccf8fee8 100644
--- a/src/components/SimpleProcessDesignerV2/src/node.ts
+++ b/src/components/SimpleProcessDesignerV2/src/node.ts
@@ -16,7 +16,8 @@ import {
FieldPermissionType,
ListenerParam
} from './consts'
-import { parseFormFields } from '@/components/FormCreate/src/utils/index'
+import { parseFormFields } from '@/components/FormCreate/src/utils'
+
export function useWatchNode(props: { flowNode: SimpleFlowNode }): Ref {
const node = ref(props.flowNode)
watch(
@@ -46,7 +47,7 @@ export function useFormFieldsPermission(defaultPermission: FieldPermissionType)
// 字段权限配置. 需要有 field, title, permissioin 属性
const fieldsPermissionConfig = ref>>([])
- const formType = inject[>('formType', ref()) // 表单类型
+ const formType = inject][>('formType', ref()) // 表单类型
const formFields = inject][>('formFields', ref([])) // 流程表单字段
@@ -108,7 +109,7 @@ export function useFormFieldsPermission(defaultPermission: FieldPermissionType)
* @description 获取表单的字段
*/
export function useFormFields() {
- const formFields = inject][>('formFields',ref([])) // 流程表单字段
+ const formFields = inject][>('formFields', ref([])) // 流程表单字段
return parseFormCreateFields(unref(formFields))
}
@@ -172,7 +173,7 @@ export function useNodeForm(nodeType: NodeType) {
const postOptions = inject][>('postList', ref([])) // 岗位列表
const userOptions = inject][>('userList', ref([])) // 用户列表
const deptOptions = inject][>('deptList', ref([])) // 部门列表
- const userGroupOptions = inject][>('userGroupList',ref([])) // 用户组列表
+ const userGroupOptions = inject][>('userGroupList', ref([])) // 用户组列表
const deptTreeOptions = inject('deptTree', ref()) // 部门树
const formFields = inject][>('formFields', ref([])) // 流程表单字段
const configForm = ref()
diff --git a/src/components/SimpleProcessDesignerV2/src/nodes/DelayTimerNode.vue b/src/components/SimpleProcessDesignerV2/src/nodes/DelayTimerNode.vue
index 7fbad1cd..ad6795aa 100644
--- a/src/components/SimpleProcessDesignerV2/src/nodes/DelayTimerNode.vue
+++ b/src/components/SimpleProcessDesignerV2/src/nodes/DelayTimerNode.vue
@@ -9,7 +9,6 @@
]"
>
]
-
+
Date: Fri, 24 Jan 2025 20:18:36 +0800
Subject: [PATCH 84/86] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E8=AF=84?=
=?UTF-8?q?=E5=AE=A1=E3=80=91Bpm=EF=BC=9A=E6=9B=B4=E5=A4=9A=E8=AE=BE?=
=?UTF-8?q?=E7=BD=AE-=E6=91=98=E8=A6=81=E8=AE=BE=E7=BD=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/views/bpm/model/CategoryDraggableModel.vue | 10 +---------
1 file changed, 1 insertion(+), 9 deletions(-)
diff --git a/src/views/bpm/model/CategoryDraggableModel.vue b/src/views/bpm/model/CategoryDraggableModel.vue
index 3e437343..bcbd47d2 100644
--- a/src/views/bpm/model/CategoryDraggableModel.vue
+++ b/src/views/bpm/model/CategoryDraggableModel.vue
@@ -94,9 +94,7 @@
-
- 全部可见
-
+ 全部可见
{{ row.startUsers[0].nickname }}
@@ -319,12 +317,6 @@ const tableCellStyle = computed(() => ({
paddingLeft: '10px'
}))
-// 使用 computed 优化可见性判断
-const isManagerUser = computed(() => {
- const userId = userStore.getUser?.id
- return (row: ModelInfo) => row.managerUserIds?.includes(userId)
-})
-
/** 权限校验:通过 computed 解决列表的卡顿问题 */
const hasPermiUpdate = computed(() => {
return checkPermi(['bpm:model:update'])
From b7329b0c44d90e5847c24608c1223164695cbea2 Mon Sep 17 00:00:00 2001
From: jason <2667446@qq.com>
Date: Fri, 24 Jan 2025 23:36:26 +0800
Subject: [PATCH 85/86] =?UTF-8?q?=E3=80=90=E5=8A=9F=E8=83=BD=E6=96=B0?=
=?UTF-8?q?=E5=A2=9E=E3=80=91Simple=20=E8=AE=BE=E8=AE=A1=E5=99=A8=E6=96=B0?=
=?UTF-8?q?=E5=A2=9E=E8=A7=A6=E5=8F=91=E5=99=A8=E8=8A=82=E7=82=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../src/NodeHandler.vue | 16 +-
.../src/ProcessNodeTree.vue | 7 +
.../SimpleProcessDesignerV2/src/consts.ts | 37 ++++
.../SimpleProcessDesignerV2/src/node.ts | 18 +-
.../src/nodes-config/TriggerNodeConfig.vue | 140 +++++++++++++
.../src/nodes-config/UserTaskNodeConfig.vue | 34 ++--
.../components/HttpRequestParamSetting.vue | 181 +++++++++++++++++
.../components/UserTaskListener.vue | 187 +-----------------
.../src/nodes/TriggerNode.vue | 97 +++++++++
9 files changed, 508 insertions(+), 209 deletions(-)
create mode 100644 src/components/SimpleProcessDesignerV2/src/nodes-config/TriggerNodeConfig.vue
create mode 100644 src/components/SimpleProcessDesignerV2/src/nodes-config/components/HttpRequestParamSetting.vue
create mode 100644 src/components/SimpleProcessDesignerV2/src/nodes/TriggerNode.vue
diff --git a/src/components/SimpleProcessDesignerV2/src/NodeHandler.vue b/src/components/SimpleProcessDesignerV2/src/NodeHandler.vue
index 3a50fe65..b3f62340 100644
--- a/src/components/SimpleProcessDesignerV2/src/NodeHandler.vue
+++ b/src/components/SimpleProcessDesignerV2/src/NodeHandler.vue
@@ -51,15 +51,13 @@
路由分支
-
-
+ 触发器
+
+
@@ -272,7 +270,7 @@ const addNode = (type: number) => {
if (type === NodeType.TRIGGER_NODE) {
const data: SimpleFlowNode = {
id: 'Activity_' + generateUUID(),
- name: NODE_DEFAULT_NAME.get(NodeType.ROUTER_BRANCH_NODE) as string,
+ name: NODE_DEFAULT_NAME.get(NodeType.TRIGGER_NODE) as string,
showText: '',
type: NodeType.TRIGGER_NODE,
childNode: props.childNode
diff --git a/src/components/SimpleProcessDesignerV2/src/ProcessNodeTree.vue b/src/components/SimpleProcessDesignerV2/src/ProcessNodeTree.vue
index 26ef13dd..048764c1 100644
--- a/src/components/SimpleProcessDesignerV2/src/ProcessNodeTree.vue
+++ b/src/components/SimpleProcessDesignerV2/src/ProcessNodeTree.vue
@@ -49,6 +49,12 @@
v-if="currentNode && currentNode.type === NodeType.ROUTER_BRANCH_NODE"
:flow-node="currentNode"
@update:flow-node="handleModelValueUpdate"
+ />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 确 定
+ 取 消
+
+
+
+
+
+
+
diff --git a/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue b/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue
index 6a76beeb..ced8c8fd 100644
--- a/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue
+++ b/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue
@@ -627,7 +627,7 @@ const userTaskListenerRef = ref()
// 保存配置
const saveConfig = async () => {
- activeTabName.value = 'user'
+ // activeTabName.value = 'user'
// 设置审批节点名称
currentNode.value.name = nodeName.value!
// 设置审批类型
@@ -684,22 +684,22 @@ const saveConfig = async () => {
currentNode.value.taskCreateListener = {
enable: configForm.value.taskCreateListenerEnable ?? false,
path: configForm.value.taskCreateListenerPath,
- header: configForm.value.taskCreateListenerHeader,
- body: configForm.value.taskCreateListenerBody
+ header: configForm.value.taskCreateListener?.header,
+ body: configForm.value.taskCreateListener?.body
}
// 指派任务监听器
currentNode.value.taskAssignListener = {
enable: configForm.value.taskAssignListenerEnable ?? false,
path: configForm.value.taskAssignListenerPath,
- header: configForm.value.taskAssignListenerHeader,
- body: configForm.value.taskAssignListenerBody
+ header: configForm.value.taskAssignListener?.header,
+ body: configForm.value.taskAssignListener?.body
}
// 完成任务监听器
currentNode.value.taskCompleteListener = {
enable: configForm.value.taskCompleteListenerEnable ?? false,
path: configForm.value.taskCompleteListenerPath,
- header: configForm.value.taskCompleteListenerHeader,
- body: configForm.value.taskCompleteListenerBody
+ header: configForm.value.taskCompleteListener?.header,
+ body: configForm.value.taskCompleteListener?.body
}
// 签名
currentNode.value.signEnable = configForm.value.signEnable
@@ -760,18 +760,24 @@ const showUserTaskNodeConfig = (node: SimpleFlowNode) => {
// 5.1 创建任务
configForm.value.taskCreateListenerEnable = node.taskCreateListener!.enable
configForm.value.taskCreateListenerPath = node.taskCreateListener!.path
- configForm.value.taskCreateListenerHeader = node.taskCreateListener?.header ?? []
- configForm.value.taskCreateListenerBody = node.taskCreateListener?.body ?? []
+ configForm.value.taskCreateListener = {
+ header: node.taskCreateListener?.header ?? [],
+ body: node.taskCreateListener?.body ?? []
+ }
// 5.2 指派任务
configForm.value.taskAssignListenerEnable = node.taskAssignListener!.enable
configForm.value.taskAssignListenerPath = node.taskAssignListener!.path
- configForm.value.taskAssignListenerHeader = node.taskAssignListener?.header ?? []
- configForm.value.taskAssignListenerBody = node.taskAssignListener?.body ?? []
- // 5.3 完成任务
+ configForm.value.taskAssignListener = {
+ header: node.taskAssignListener?.header ?? [],
+ body: node.taskAssignListener?.body ?? []
+ }
+ // 5.3 完成任务
configForm.value.taskCompleteListenerEnable = node.taskCompleteListener!.enable
configForm.value.taskCompleteListenerPath = node.taskCompleteListener!.path
- configForm.value.taskCompleteListenerHeader = node.taskCompleteListener?.header ?? []
- configForm.value.taskCompleteListenerBody = node.taskCompleteListener?.body ?? []
+ configForm.value.taskCompleteListener = {
+ header: node.taskCompleteListener?.header ?? [],
+ body: node.taskCompleteListener?.body ?? []
+ }
// 6. 签名
configForm.value.signEnable = node?.signEnable ?? false
// 7. 审批意见
diff --git a/src/components/SimpleProcessDesignerV2/src/nodes-config/components/HttpRequestParamSetting.vue b/src/components/SimpleProcessDesignerV2/src/nodes-config/components/HttpRequestParamSetting.vue
new file mode 100644
index 00000000..1c86e21a
--- /dev/null
+++ b/src/components/SimpleProcessDesignerV2/src/nodes-config/components/HttpRequestParamSetting.vue
@@ -0,0 +1,181 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 添加一行
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 添加一行
+
+
+
+
+
+
diff --git a/src/components/SimpleProcessDesignerV2/src/nodes-config/components/UserTaskListener.vue b/src/components/SimpleProcessDesignerV2/src/nodes-config/components/UserTaskListener.vue
index 6ab587c7..09b48e4e 100644
--- a/src/components/SimpleProcessDesignerV2/src/nodes-config/components/UserTaskListener.vue
+++ b/src/components/SimpleProcessDesignerV2/src/nodes-config/components/UserTaskListener.vue
@@ -31,181 +31,19 @@
>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 添加一行
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 添加一行
-
-
+
+
+
From 7db5ac81ae0376eb6629c2cd2ef5924b7d76514c Mon Sep 17 00:00:00 2001
From: YunaiV
Date: Sat, 25 Jan 2025 09:31:02 +0800
Subject: [PATCH 86/86] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E8=AF=84?=
=?UTF-8?q?=E5=AE=A1=E3=80=91Bpm=EF=BC=9A=E8=A7=A6=E5=8F=91=E5=99=A8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../src/nodes-config/TriggerNodeConfig.vue | 7 ++++---
.../nodes-config/components/HttpRequestParamSetting.vue | 6 +++---
.../src/nodes-config/components/UserTaskListener.vue | 4 ++--
3 files changed, 9 insertions(+), 8 deletions(-)
diff --git a/src/components/SimpleProcessDesignerV2/src/nodes-config/TriggerNodeConfig.vue b/src/components/SimpleProcessDesignerV2/src/nodes-config/TriggerNodeConfig.vue
index 01c6d8ab..ce5e82e1 100644
--- a/src/components/SimpleProcessDesignerV2/src/nodes-config/TriggerNodeConfig.vue
+++ b/src/components/SimpleProcessDesignerV2/src/nodes-config/TriggerNodeConfig.vue
@@ -70,6 +70,7 @@
import { SimpleFlowNode, NodeType, TriggerSetting, TRIGGER_TYPES, TriggerTypeEnum } from '../consts'
import { useWatchNode, useDrawer, useNodeName } from '../node'
import HttpRequestParamSetting from './components/HttpRequestParamSetting.vue'
+
defineOptions({
name: 'TriggerNodeConfig'
})
@@ -104,7 +105,7 @@ const configForm = ref({
}
})
-// 保存配置
+/** 保存配置 */
const saveConfig = async () => {
if (!formRef) return false
const valid = await formRef.value.validate()
@@ -116,7 +117,7 @@ const saveConfig = async () => {
settingVisible.value = false
return true
}
-// 获取节点展示内容
+/** 获取节点展示内容 */
const getShowText = (): string => {
let showText = ''
if (configForm.value.type === TriggerTypeEnum.HTTP_REQUEST) {
@@ -125,7 +126,7 @@ const getShowText = (): string => {
return showText
}
-// 显示触发器节点配置, 由父组件传过来
+/** 显示触发器节点配置, 由父组件传过来 */
const showTriggerNodeConfig = (node: SimpleFlowNode) => {
nodeName.value = node.name
if (node.triggerSetting) {
diff --git a/src/components/SimpleProcessDesignerV2/src/nodes-config/components/HttpRequestParamSetting.vue b/src/components/SimpleProcessDesignerV2/src/nodes-config/components/HttpRequestParamSetting.vue
index 1c86e21a..4a21af05 100644
--- a/src/components/SimpleProcessDesignerV2/src/nodes-config/components/HttpRequestParamSetting.vue
+++ b/src/components/SimpleProcessDesignerV2/src/nodes-config/components/HttpRequestParamSetting.vue
@@ -166,14 +166,14 @@ const props = defineProps({
const formFieldOptions = useFormFields()
-const addHttpRequestParam = (arr) => {
+const addHttpRequestParam = (arr: ListenerParam[]) => {
arr.push({
key: '',
- type: 1,
+ type: ListenerParamTypeEnum.FIXED_VALUE,
value: ''
})
}
-const deleteHttpRequestParam = (arr, index) => {
+const deleteHttpRequestParam = (arr: ListenerParam[], index: number) => {
arr.splice(index, 1)
}
diff --git a/src/components/SimpleProcessDesignerV2/src/nodes-config/components/UserTaskListener.vue b/src/components/SimpleProcessDesignerV2/src/nodes-config/components/UserTaskListener.vue
index 09b48e4e..728f5684 100644
--- a/src/components/SimpleProcessDesignerV2/src/nodes-config/components/UserTaskListener.vue
+++ b/src/components/SimpleProcessDesignerV2/src/nodes-config/components/UserTaskListener.vue
@@ -31,7 +31,7 @@
>
-