Skip to content

Commit 42f5223

Browse files
committed
2 parents 1b2c7ce + 8855b77 commit 42f5223

File tree

7 files changed

+587
-202
lines changed

7 files changed

+587
-202
lines changed

src/components/SimpleProcessDesignerV2/src/SimpleProcessDesigner.vue

Lines changed: 106 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,15 @@ const props = defineProps({
5454
modelName: {
5555
type: String,
5656
required: false
57+
},
58+
// 可发起流程的人员编号
59+
startUserIds : {
60+
type: Array,
61+
required: false
62+
},
63+
value: {
64+
type: [String, Object],
65+
required: false
5766
}
5867
})
5968
@@ -66,6 +75,10 @@ const userOptions = ref<UserApi.UserVO[]>([]) // 用户列表
6675
const deptOptions = ref<DeptApi.DeptVO[]>([]) // 部门列表
6776
const deptTreeOptions = ref()
6877
const userGroupOptions = ref<UserGroupApi.UserGroupVO[]>([]) // 用户组列表
78+
79+
// 添加当前值的引用
80+
const currentValue = ref<SimpleFlowNode | undefined>()
81+
6982
provide('formFields', formFields)
7083
provide('formType', formType)
7184
provide('roleList', roleOptions)
@@ -74,17 +87,18 @@ provide('userList', userOptions)
7487
provide('deptList', deptOptions)
7588
provide('userGroupList', userGroupOptions)
7689
provide('deptTree', deptTreeOptions)
90+
provide('startUserIds', props.startUserIds)
7791
7892
const message = useMessage() // 国际化
7993
const processNodeTree = ref<SimpleFlowNode | undefined>()
8094
const errorDialogVisible = ref(false)
8195
let errorNodes: SimpleFlowNode[] = []
8296
8397
// 添加更新模型的方法
84-
const updateModel = (key?: string, name?: string) => {
98+
const updateModel = () => {
8599
if (!processNodeTree.value) {
86100
processNodeTree.value = {
87-
name: name || '发起人',
101+
name: '发起人',
88102
type: NodeType.START_USER_NODE,
89103
id: NodeId.START_USER_NODE_ID,
90104
childNode: {
@@ -93,45 +107,78 @@ const updateModel = (key?: string, name?: string) => {
93107
type: NodeType.END_EVENT_NODE
94108
}
95109
}
96-
} else if (name) {
97-
// 更新现有模型的名称
98-
processNodeTree.value.name = name
110+
// 初始化时也触发一次保存
111+
saveSimpleFlowModel(processNodeTree.value)
99112
}
100113
}
101114
102-
// 监听属性变化
103-
watch([() => props.modelKey, () => props.modelName], ([newKey, newName]) => {
104-
if (!props.modelId && newKey && newName) {
105-
updateModel(newKey, newName)
115+
// 加载流程数据
116+
const loadProcessData = async (data: any) => {
117+
try {
118+
if (data) {
119+
const parsedData = typeof data === 'string' ? JSON.parse(data) : data
120+
processNodeTree.value = parsedData
121+
currentValue.value = parsedData
122+
// 确保数据加载后刷新视图
123+
await nextTick()
124+
if (simpleProcessModelRef.value?.refresh) {
125+
await simpleProcessModelRef.value.refresh()
126+
}
127+
}
128+
} catch (error) {
129+
console.error('加载流程数据失败:', error)
106130
}
107-
}, { immediate: true, deep: true })
131+
}
132+
133+
// 监听属性变化
134+
watch(
135+
() => props.value,
136+
async (newValue, oldValue) => {
137+
if (newValue && newValue !== oldValue) {
138+
await loadProcessData(newValue)
139+
}
140+
},
141+
{ immediate: true, deep: true }
142+
)
143+
144+
// 监听流程节点树变化,自动保存
145+
watch(
146+
() => processNodeTree.value,
147+
async (newValue, oldValue) => {
148+
if (newValue && oldValue && JSON.stringify(newValue) !== JSON.stringify(oldValue)) {
149+
await saveSimpleFlowModel(newValue)
150+
}
151+
},
152+
{ deep: true }
153+
)
108154
109155
const saveSimpleFlowModel = async (simpleModelNode: SimpleFlowNode) => {
110156
if (!simpleModelNode) {
111-
message.error('模型数据为空')
112157
return
113158
}
159+
160+
// 校验节点
161+
errorNodes = []
162+
validateNode(simpleModelNode, errorNodes)
163+
if (errorNodes.length > 0) {
164+
errorDialogVisible.value = true
165+
return
166+
}
167+
114168
try {
115-
loading.value = true
116169
if (props.modelId) {
117170
// 编辑模式
118171
const data = {
119172
id: props.modelId,
120173
simpleModel: simpleModelNode
121174
}
122-
const result = await updateBpmSimpleModel(data)
123-
if (result) {
124-
message.success('修改成功')
125-
emits('success')
126-
} else {
127-
message.alert('修改失败')
128-
}
129-
} else {
130-
// 新建模式,直接返回数据
131-
emits('success', simpleModelNode)
175+
await updateBpmSimpleModel(data)
132176
}
133-
} finally {
134-
loading.value = false
177+
// 无论是编辑还是新建模式,都更新当前值并触发事件
178+
currentValue.value = simpleModelNode
179+
emits('success', simpleModelNode)
180+
} catch (error) {
181+
console.error('保存失败:', error)
135182
}
136183
}
137184
@@ -196,31 +243,23 @@ onMounted(async () => {
196243
userOptions.value = await UserApi.getSimpleUserList()
197244
// 获得部门列表
198245
deptOptions.value = await DeptApi.getSimpleDeptList()
199-
200246
deptTreeOptions.value = handleTree(deptOptions.value as DeptApi.DeptVO[], 'id')
201247
// 获取用户组列表
202248
userGroupOptions.value = await UserGroupApi.getUserGroupSimpleList()
203249
250+
// 加载流程数据
204251
if (props.modelId) {
205-
//获取 SIMPLE 设计器模型
252+
// 获取 SIMPLE 设计器模型
206253
const result = await getBpmSimpleModel(props.modelId)
207254
if (result) {
208-
processNodeTree.value = result
209-
}
210-
}
211-
212-
// 如果没有现有模型,创建初始模型
213-
if (!processNodeTree.value) {
214-
processNodeTree.value = {
215-
name: props.modelName || '发起人',
216-
type: NodeType.START_USER_NODE,
217-
id: NodeId.START_USER_NODE_ID,
218-
childNode: {
219-
id: NodeId.END_EVENT_NODE_ID,
220-
name: '结束',
221-
type: NodeType.END_EVENT_NODE
222-
}
255+
await loadProcessData(result)
256+
} else {
257+
updateModel()
223258
}
259+
} else if (props.value) {
260+
await loadProcessData(props.value)
261+
} else {
262+
updateModel()
224263
}
225264
} finally {
226265
loading.value = false
@@ -231,14 +270,36 @@ const simpleProcessModelRef = ref()
231270
232271
/** 获取当前流程数据 */
233272
const getCurrentFlowData = async () => {
234-
if (simpleProcessModelRef.value) {
235-
return await simpleProcessModelRef.value.getCurrentFlowData()
273+
try {
274+
if (simpleProcessModelRef.value) {
275+
const data = await simpleProcessModelRef.value.getCurrentFlowData()
276+
if (data) {
277+
currentValue.value = data
278+
return data
279+
}
280+
}
281+
return currentValue.value
282+
} catch (error) {
283+
console.error('获取流程数据失败:', error)
284+
return currentValue.value
285+
}
286+
}
287+
288+
// 刷新方法
289+
const refresh = async () => {
290+
try {
291+
if (currentValue.value) {
292+
await loadProcessData(currentValue.value)
293+
}
294+
} catch (error) {
295+
console.error('刷新失败:', error)
236296
}
237-
return undefined
238297
}
239298
240299
defineExpose({
241300
getCurrentFlowData,
242-
updateModel
301+
updateModel,
302+
loadProcessData,
303+
refresh
243304
})
244305
</script>

src/components/SimpleProcessDesignerV2/src/node.ts

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import {
1414
NODE_DEFAULT_NAME,
1515
AssignStartUserHandlerType,
1616
AssignEmptyHandlerType,
17-
FieldPermissionType,
17+
FieldPermissionType
1818
} from './consts'
1919
import { parseFormFields } from '@/components/FormCreate/src/utils/index'
2020
export function useWatchNode(props: { flowNode: SimpleFlowNode }): Ref<SimpleFlowNode> {
@@ -52,9 +52,33 @@ export function useFormFieldsPermission(defaultPermission: FieldPermissionType)
5252

5353
const getNodeConfigFormFields = (nodeFormFields?: Array<Record<string, string>>) => {
5454
nodeFormFields = toRaw(nodeFormFields)
55-
fieldsPermissionConfig.value =
56-
cloneDeep(nodeFormFields) || getDefaultFieldsPermission(unref(formFields))
55+
if (!nodeFormFields || nodeFormFields.length === 0) {
56+
fieldsPermissionConfig.value = getDefaultFieldsPermission(unref(formFields))
57+
} else {
58+
fieldsPermissionConfig.value = mergeFieldsPermission(nodeFormFields, unref(formFields))
59+
}
5760
}
61+
// 合并已经设置的表单字段权限,当前流程表单字段 (可能新增,或删除了字段)
62+
const mergeFieldsPermission = (
63+
formFieldsPermisson: Array<Record<string, string>>,
64+
formFields?: string[]
65+
) => {
66+
let mergedFieldsPermission: Array<Record<string, any>> = []
67+
if (formFields) {
68+
mergedFieldsPermission = parseFormCreateFields(formFields).map((item) => {
69+
const found = formFieldsPermisson.find(
70+
(fieldPermission) => fieldPermission.field == item.field
71+
)
72+
return {
73+
field: item.field,
74+
title: item.title,
75+
permission: found ? found.permission : defaultPermission
76+
}
77+
})
78+
}
79+
return mergedFieldsPermission
80+
}
81+
5882
// 默认的表单权限: 获取表单的所有字段,设置字段默认权限为只读
5983
const getDefaultFieldsPermission = (formFields?: string[]) => {
6084
let defaultFieldsPermission: Array<Record<string, any>> = []

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

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,20 @@
2525
</template>
2626
<el-tabs type="border-card" v-model="activeTabName">
2727
<el-tab-pane label="权限" name="user">
28-
<div> 待实现 </div>
28+
<el-text v-if="!startUserIds || startUserIds.length === 0"> 全部成员可以发起流程 </el-text>
29+
<el-text v-else-if="startUserIds.length == 1">
30+
{{ getUserNicknames(startUserIds) }} 可发起流程
31+
</el-text>
32+
<el-text v-else>
33+
<el-tooltip
34+
class="box-item"
35+
effect="dark"
36+
placement="top"
37+
:content="getUserNicknames(startUserIds)"
38+
>
39+
{{ getUserNicknames(startUserIds.slice(0,2)) }} 等 {{ startUserIds.length }} 人可发起流程
40+
</el-tooltip>
41+
</el-text>
2942
</el-tab-pane>
3043
<el-tab-pane label="表单字段权限" name="fields" v-if="formType === 10">
3144
<div class="field-setting-pane">
@@ -86,7 +99,7 @@
8699
<script setup lang="ts">
87100
import { SimpleFlowNode, NodeType, FieldPermissionType, START_USER_BUTTON_SETTING } from '../consts'
88101
import { useWatchNode, useDrawer, useNodeName, useFormFieldsPermission } from '../node'
89-
102+
import * as UserApi from '@/api/system/user'
90103
defineOptions({
91104
name: 'StartUserNodeConfig'
92105
})
@@ -96,6 +109,10 @@ const props = defineProps({
96109
required: true
97110
}
98111
})
112+
// 可发起流程的用户编号
113+
const startUserIds = inject<Ref<any[]>>('startUserIds')
114+
// 用户列表
115+
const userOptions = inject<Ref<UserApi.UserVO[]>>('userList')
99116
// 抽屉配置
100117
const { settingVisible, closeDrawer, openDrawer } = useDrawer()
101118
// 当前节点
@@ -108,12 +125,23 @@ const activeTabName = ref('user')
108125
const { formType, fieldsPermissionConfig, getNodeConfigFormFields } = useFormFieldsPermission(
109126
FieldPermissionType.WRITE
110127
)
111-
128+
const getUserNicknames = (userIds: number[]): string => {
129+
if (!userIds || userIds.length === 0) {
130+
return ''
131+
}
132+
const nicknames: string[] = []
133+
userIds.forEach((userId) => {
134+
const found = userOptions?.value.find((item) => item.id === userId)
135+
if (found && found.nickname) {
136+
nicknames.push(found.nickname)
137+
}
138+
})
139+
return nicknames.join(',')
140+
}
112141
// 保存配置
113142
const saveConfig = async () => {
114143
activeTabName.value = 'user'
115144
currentNode.value.name = nodeName.value!
116-
// TODO 暂时写死。后续可以显示谁有权限可以发起
117145
currentNode.value.showText = '已设置'
118146
// 设置表单权限
119147
currentNode.value.fieldsPermission = fieldsPermissionConfig.value

0 commit comments

Comments
 (0)