feat(ai): issue verified application preview decisions

This commit is contained in:
caoxiaozhu
2026-07-14 14:37:53 +08:00
parent a662cfe6c3
commit 5b24630710
32 changed files with 1976 additions and 217 deletions

View File

@@ -8,6 +8,54 @@ import {
export const AI_APPLICATION_ACTION_SAVE_DRAFT = 'ai_application_save_draft'
export const AI_APPLICATION_ACTION_SUBMIT = 'ai_application_submit'
export function createAiApplicationRequestId(prefix = 'application') {
const normalizedPrefix = normalizeText(prefix) || 'application'
if (typeof globalThis.crypto?.randomUUID === 'function') {
return `${normalizedPrefix}:${globalThis.crypto.randomUUID()}`
}
return `${normalizedPrefix}:${Date.now()}:${Math.random().toString(16).slice(2)}`
}
export function resolveAiApplicationPreviewDecisionId(preview = {}) {
return normalizeText(preview?.decisionId || preview?.decision_id)
}
export async function registerAiApplicationPreviewDecision({
applicationPreview,
conversationId = '',
message = '',
requestId = ''
} = {}, options = {}) {
const normalizedPreview = normalizeApplicationPreview(applicationPreview || {})
const issueRequestId = normalizeText(requestId) || createAiApplicationRequestId('preview')
const payload = await apiRequest('/reimbursements/application-previews', {
method: 'POST',
body: JSON.stringify({
message: normalizeText(message),
conversation_id: normalizeText(conversationId) || null,
request_id: issueRequestId
}),
timeoutMs: 30000,
timeoutMessage: '申请预览校验超时,已切换为普通核对模式。',
...options
})
const serverPreview = payload?.application_preview && typeof payload.application_preview === 'object'
? payload.application_preview
: {}
return normalizeApplicationPreview({
...normalizedPreview,
...serverPreview,
fields: {
...(normalizedPreview.fields || {}),
...(serverPreview.fields || {})
},
decisionId: normalizeText(payload?.decision_id || serverPreview.decisionId),
decisionSource: normalizeText(payload?.decision_source || serverPreview.decisionSource),
decisionExpiresAt: normalizeText(payload?.expires_at || serverPreview.decisionExpiresAt),
decisionTrackingStatus: 'registered'
})
}
function normalizeText(value) {
return String(value || '').trim()
}
@@ -56,7 +104,8 @@ export function buildAiApplicationPreviewActionPayload({
applicationPreview,
currentUser = {},
conversationId = '',
draftPayload = null
draftPayload = null,
requestId = ''
} = {}) {
const normalizedPreview = normalizeApplicationPreview(applicationPreview || {})
const message = buildAiApplicationPreviewActionText(actionType, normalizedPreview)
@@ -72,6 +121,8 @@ export function buildAiApplicationPreviewActionPayload({
: []
const draftClaimId = normalizeText(draftPayload?.claim_id || draftPayload?.claimId)
const isSubmit = actionType === AI_APPLICATION_ACTION_SUBMIT
const decisionId = resolveAiApplicationPreviewDecisionId(normalizedPreview)
const actionRequestId = normalizeText(requestId || normalizedPreview.decisionActionRequestId)
const applicationEditableFields = Array.isArray(normalizedPreview.editableFields)
? normalizedPreview.editableFields.map((field) => normalizeText(field)).filter(Boolean)
: []
@@ -80,6 +131,9 @@ export function buildAiApplicationPreviewActionPayload({
source: 'user_message',
user_id: username,
conversation_id: normalizeText(conversationId) || null,
action_type: isSubmit ? 'submit' : 'save_draft',
...(decisionId ? { decision_id: decisionId } : {}),
...(decisionId && actionRequestId ? { request_id: actionRequestId } : {}),
message,
context_json: {
role_codes: roleCodes,