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:
1 parent
eafd3c7d9e
commit
4641d333e6
7 files changed
+6871
-4719
No files matched your search
@@ -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%;
|
||||
|
||||
Reference in new issue
Block a user