feat(web): AI 工作台多 task 串行推进与会话适配

- useWorkbenchAiApplicationPreviewFlow/useWorkbenchAiActionRouter/useWorkbenchAiCommandIntents 支持 task1 完成后自动推进 task2,确认按钮直接拉起申请预览,草稿/提交成功后继续推进下一 task
- workbenchAiIntentPlannerModel/workbenchAiMessageModel/workbenchAiCommandIntentModel 适配多 task 意图规划与消息结构
- aiApplicationPreviewActions/aiApplicationPrecheckModel/aiExpenseDraftModel/aiWorkbenchConversationStore 草稿与会话存储适配
- PersonalWorkbenchAiMode 与样式适配,更新 preview-actions/expense-draft/conversation-store/fast-preview/action-router/command-intent/intent-planner 测试
This commit is contained in:
caoxiaozhu
2026-06-26 22:42:23 +08:00
parent 5753899eb3
commit c4b5fcc067
22 changed files with 1171 additions and 144 deletions

View File

@@ -292,8 +292,20 @@ export function normalizeApplicationPreview(preview = {}) {
...resolveApplicationValidationIssues(fields),
...resolveApplicationSourceValidationIssues(preview?.sourceText, fields, preview)
]
const editableFields = Array.isArray(preview?.editableFields)
? preview.editableFields
: Array.isArray(preview?.editable_fields)
? preview.editable_fields
: null
return {
...preview,
...(editableFields
? {
editableFields: editableFields
.map((field) => String(field || '').trim())
.filter(Boolean)
}
: {}),
fields,
missingFields,
validationIssues,
@@ -301,6 +313,37 @@ export function normalizeApplicationPreview(preview = {}) {
}
}
function resolveApplicationPreviewEditableFields(preview = {}) {
const source = Array.isArray(preview?.editableFields)
? preview.editableFields
: Array.isArray(preview?.editable_fields)
? preview.editable_fields
: null
if (!Array.isArray(source)) {
return null
}
const fields = new Set(
source
.map((field) => String(field || '').trim())
.filter(Boolean)
)
if (fields.has('time')) {
fields.add('time_return')
}
return fields
}
function isApplicationPreviewFieldEditable(preview = {}, item = {}, rowKey = '') {
if (item.editable === false) {
return false
}
const editableFields = resolveApplicationPreviewEditableFields(preview)
if (!editableFields) {
return true
}
return editableFields.has(rowKey)
}
export function applyApplicationBusinessTimeContext(preview = {}, businessTimeContext = null) {
if (!businessTimeContext || typeof businessTimeContext !== 'object') {
return normalizeApplicationPreview(preview)
@@ -394,7 +437,7 @@ export function buildApplicationPreviewRows(preview = {}) {
...item,
label: '出发时间',
value: tripDates.startDate || '待补充',
editable: item.editable !== false,
editable: isApplicationPreviewFieldEditable(normalized, item, 'time'),
highlight: Boolean(item.highlight),
missing
},
@@ -402,7 +445,7 @@ export function buildApplicationPreviewRows(preview = {}) {
key: 'time_return',
label: '返回时间',
value: tripDates.endDate || '待补充',
editable: item.editable !== false,
editable: isApplicationPreviewFieldEditable(normalized, item, 'time_return'),
highlight: Boolean(item.highlight),
missing
}
@@ -415,7 +458,7 @@ export function buildApplicationPreviewRows(preview = {}) {
...item,
label: resolveApplicationFieldLabel(item, fields),
value,
editable: item.editable !== false,
editable: isApplicationPreviewFieldEditable(normalized, item, item.key),
highlight: Boolean(item.highlight),
missing: item.required !== false && !isApplicationPreviewValueProvided(rawValue)
}]
@@ -484,6 +527,10 @@ export function buildApplicationTemplatePreview(currentUser = {}) {
export function buildLocalApplicationPreviewMessage(preview) {
const normalized = normalizeApplicationPreview(preview)
const modelReviewStatus = String(normalized.modelReviewStatus || '').trim()
const editMode = Boolean(normalized.applicationEditMode || normalized.application_edit_mode)
if (editMode) {
return '我已载入原申请信息。请只修改事由、时间、地点和出行方式;职级、负责人、标准和费用会按规则带入或重新测算。'
}
return [
modelReviewStatus === 'completed'
? '我已完成模型复核,并整理成下方表格。请核查识别结果;点击对应行即可直接编辑。'