feat(oa): wire start dialog to per-node initiator select in flow preview

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
zlwuandCursor committed 2026-07-23 16:20:06 +08:00
1 parent eafd3c7d9e
commit 4641d333e6
7 files changed
+6871 -4719

No files matched your search

+17 -52
View File
@@ -98,27 +98,6 @@
:close-on-click-modal="false"
>
<div v-loading="detailLoading">
<el-form v-if="needInitiatorSelect" label-position="top" class="oa-start__meta">
<el-form-item label="自选审批人" required>
<el-select
v-model="initiatorSelectUserIds"
multiple
filterable
collapse-tags
collapse-tags-tooltip
placeholder="请选择审批人"
style="width: 100%"
:loading="userLoading"
>
<el-option
v-for="u in userOptions"
:key="u.id"
:label="`${u.nickName}(${u.userNo})`"
:value="u.id"
/>
</el-select>
</el-form-item>
</el-form>
<form-create
v-if="formRule.length"
v-model="formData"
@@ -129,10 +108,13 @@
<p v-else-if="!detailLoading" class="oa-start__tip">该模板暂无表单字段,仍可直接提交。</p>
<OaFlowPreview
v-if="!detailLoading"
v-model:select-by-node="initiatorSelectByNode"
:steps="flowSteps"
:loading="previewLoading"
:resolved="flowResolved"
:pending-message="flowPendingMessage"
:user-options="userOptions"
@select-change="scheduleFlowPreview"
/>
</div>
<template #footer>
@@ -195,8 +177,7 @@
const fapi = ref<any>(null)
const submitting = ref(false)
const needInitiatorSelect = ref(false)
const initiatorSelectUserIds = ref<string[]>([])
const userLoading = ref(false)
const initiatorSelectByNode = ref<Record<string, string[]>>({})
const userOptions = ref<Array<{ id: string; nickName: string; userNo: string }>>([])
const flowSteps = ref<OaFlowPreviewStep[]>([])
const flowResolved = ref(true)
@@ -254,7 +235,6 @@
}
async function loadUsers() {
userLoading.value = true
try {
const pageSize = MAX_ADMIN_LIST_PAGE_SIZE
const raw: any[] = []
@@ -272,8 +252,8 @@
nickName: u.nickName || '',
userNo: u.userNo || ''
}))
} finally {
userLoading.value = false
} catch {
userOptions.value = []
}
}
@@ -282,8 +262,7 @@
try {
const preview = await fetchOaFlowPreview(appId, {
formData: { ...formData.value },
// Task 4: API 已切到按节点 map;完整 UI 见 Task 5–6
initiatorSelectByNode: {}
initiatorSelectByNode: { ...initiatorSelectByNode.value }
})
flowResolved.value = preview?.resolved !== false
flowPendingMessage.value =
@@ -310,7 +289,7 @@
formData.value = {}
formRule.value = []
needInitiatorSelect.value = false
initiatorSelectUserIds.value = []
initiatorSelectByNode.value = {}
flowSteps.value = []
flowResolved.value = false
flowPendingMessage.value = '必填信息填写后,流程将自动显示'
@@ -366,21 +345,16 @@
{ deep: true }
)
watch(
initiatorSelectUserIds,
() => {
if (dlgVisible.value && picked.value?.id && needInitiatorSelect.value) {
scheduleFlowPreview()
}
},
{ deep: true }
)
async function submit() {
if (!picked.value?.id) return
if (needInitiatorSelect.value && !initiatorSelectUserIds.value.length) {
ElMessage.warning('请选择自选审批人')
return
for (const s of flowSteps.value) {
if (s.type === 'approval' && s.assigneeType === 'initiator_select') {
const ids = initiatorSelectByNode.value[s.id] || []
if (!ids.length) {
ElMessage.warning(`请为「${s.name || '审批人'}」选择审批人`)
return
}
}
}
if (fapi.value?.validate) {
try {
@@ -395,8 +369,7 @@
const data: any = await fetchStartOaInstance({
appId: picked.value.id,
formData: { ...formData.value },
// Task 4: API 已切到按节点 map;完整 UI 见 Task 5–6
initiatorSelectByNode: {}
initiatorSelectByNode: { ...initiatorSelectByNode.value }
})
dlgVisible.value = false
if (data?.id) {
@@ -673,14 +646,6 @@
font-size: 13px;
}
.oa-start__meta {
margin-bottom: 8px;
:deep(.el-form-item) {
margin-bottom: 12px;
}
}
@media (max-width: 640px) {
.oa-app-card {
width: 100%;