This commit is contained in:
zlwu committed 2026-08-13 14:31:57 +08:00
1 parent 0e1b750457
commit 8c49021d38
93 files changed
+22731 -12107

No files matched your search

@@ -129,6 +129,12 @@
listTripKits,
TRIP_MANUAL_PREFIX
} from '@/utils/oa-trip-kit-runtime'
import {
buildFlowPreviewRequestKey,
collectConditionFields,
shouldShowFlowPreviewSpinner,
shouldSkipFlowPreviewRequest
} from '@/utils/oa-flow-preview-refresh'
import { useUserStore } from '@/store/modules/user'
defineOptions({ name: 'OaStartFormDialog' })
@@ -162,6 +168,12 @@
const flowPendingMessage = ref('必填信息填写后,流程将自动显示')
const previewLoading = ref(false)
let previewTimer: ReturnType<typeof setTimeout> | null = null
/** 流程条件字段:仅这些 formData 变化才重拉预览 */
let flowConditionFields: string[] = []
let lastFlowPreviewRequestKey: string | null = null
let inFlightFlowPreviewKey: string | null = null
let hasCompletedFlowPreview = false
let flowPreviewReqSeq = 0
/** 避免时长自动回写再次触发手改判定 */
let leaveKitSyncing = false
let leaveKitPrevSnapshot: Record<string, unknown> = {}
@@ -242,23 +254,56 @@
}
async function loadFlowPreview(appId: string) {
previewLoading.value = true
if (!appId) return
const requestKey = buildFlowPreviewRequestKey({
formData: formData.value,
initiatorSelectByNode: initiatorSelectByNode.value,
conditionFields: flowConditionFields
})
if (
shouldSkipFlowPreviewRequest(lastFlowPreviewRequestKey, requestKey, {
inFlightKey: inFlightFlowPreviewKey
})
) {
return
}
const seq = ++flowPreviewReqSeq
inFlightFlowPreviewKey = requestKey
const showSpinner = shouldShowFlowPreviewSpinner({
hasCompletedPreview: hasCompletedFlowPreview
})
if (showSpinner) previewLoading.value = true
try {
const preview = await fetchOaFlowPreview(appId, {
formData: { ...formData.value },
initiatorSelectByNode: { ...initiatorSelectByNode.value }
})
if (seq !== flowPreviewReqSeq) return
lastFlowPreviewRequestKey = requestKey
flowResolved.value = preview?.resolved !== false
flowPendingMessage.value = preview?.message || '必填信息填写后,流程将自动显示'
flowSteps.value = flowResolved.value ? preview?.steps || [] : []
} catch {
if (seq !== flowPreviewReqSeq) return
flowSteps.value = []
flowResolved.value = true
} finally {
previewLoading.value = false
if (seq === flowPreviewReqSeq) {
inFlightFlowPreviewKey = null
hasCompletedFlowPreview = true
previewLoading.value = false
}
}
}
function resetFlowPreviewState(flowRoot: unknown) {
flowConditionFields = collectConditionFields(flowRoot)
lastFlowPreviewRequestKey = null
inFlightFlowPreviewKey = null
hasCompletedFlowPreview = false
flowPreviewReqSeq += 1
}
function scheduleFlowPreview() {
if (!dlgVisible.value || !picked.value?.id) return
if (previewTimer) clearTimeout(previewTimer)
@@ -335,6 +380,7 @@
void syncOvertimeKitDurations()
const flow = detail?.flowTreeJson || {}
const root = flow.root || flow
resetFlowPreviewState(root)
needInitiatorSelect.value = flowNeedsInitiatorSelect(root)
if (needInitiatorSelect.value && !userOptions.value.length) {
await loadUsers()