diff --git a/web/src/views/TravelReimbursementCreateView.vue b/web/src/views/TravelReimbursementCreateView.vue index 88b20c4..080cef7 100644 --- a/web/src/views/TravelReimbursementCreateView.vue +++ b/web/src/views/TravelReimbursementCreateView.vue @@ -3,6 +3,40 @@
+
+ + + +
+
@@ -11,39 +45,6 @@

个人工作台、发起报销、智能录入统一走这里,右侧会根据你的意图实时切换状态视图。

- -
- - - -
@@ -882,22 +883,6 @@ @confirm="confirmDeleteCurrentSession" /> - -
-
-
-
{{ profile.avatar }}
-
-

{{ profile.name }}

-

{{ profile.position }}

-
-
- {{ item.label }} - {{ item.value }} +
+
+
+
+ +
+
+
+

{{ profile.name }}

+ {{ profile.identity }} +
+
+ 部门{{ profile.department }} + 职级{{ profile.grade }} + 直属上司{{ profile.manager }}
-
-
-
- {{ stat.label }} - {{ stat.value }} - {{ stat.value }} +
+
+
+ + {{ item.label }} +
+ {{ item.value }} +
+
-
-
-
- - {{ item.label }} -
- {{ item.value }} -
-
- +

{{ isTravelRequest ? '差旅进度' : '报销进度' }}

diff --git a/web/src/views/scripts/TravelReimbursementCreateView.js b/web/src/views/scripts/TravelReimbursementCreateView.js index 0142d21..f6251cc 100644 --- a/web/src/views/scripts/TravelReimbursementCreateView.js +++ b/web/src/views/scripts/TravelReimbursementCreateView.js @@ -1976,10 +1976,8 @@ export default { const reviewCancelDialogOpen = ref(false) const reviewEditDialogOpen = ref(false) const deleteSessionDialogOpen = ref(false) - const leaveKnowledgeDialogOpen = ref(false) const reviewActionBusy = ref(false) const deleteSessionBusy = ref(false) - const leaveKnowledgeBusy = ref(false) const reviewEditFields = ref([]) const reviewActionMessageId = ref('') const reviewInlineForm = ref(createEmptyInlineReviewState()) @@ -2035,6 +2033,7 @@ export default { } return labels[currentInsight.value.intent] ?? 'AI 处理中' }) + let knowledgeSessionResetPromise = Promise.resolve() const canDeleteCurrentSession = computed( () => Boolean(conversationId.value) || messages.value.some((item) => item.role === 'user') ) @@ -2190,6 +2189,27 @@ export default { return buildEmptySessionState(targetSessionType) } + function resetKnowledgeSessionSnapshot() { + const emptyKnowledgeState = buildEmptySessionState(SESSION_TYPE_KNOWLEDGE) + sessionSnapshots.value[SESSION_TYPE_KNOWLEDGE] = emptyKnowledgeState + + if (activeSessionType.value === SESSION_TYPE_KNOWLEDGE) { + applySessionState(emptyKnowledgeState) + } + } + + function clearKnowledgeSessionOnEntry() { + resetKnowledgeSessionSnapshot() + knowledgeSessionResetPromise = clearUserConversations(resolveCurrentUserId(), SESSION_TYPE_KNOWLEDGE) + .catch((error) => { + console.warn('Failed to clear knowledge session on entry:', error) + }) + .finally(() => { + resetKnowledgeSessionSnapshot() + }) + return knowledgeSessionResetPromise + } + async function switchSessionType(targetSessionType) { const normalizedTarget = String(targetSessionType || '').trim() || SESSION_TYPE_EXPENSE if (normalizedTarget === activeSessionType.value || sessionSwitchBusy.value) { @@ -2257,6 +2277,7 @@ export default { ) onMounted(() => { + void clearKnowledgeSessionOnEntry() currentInsight.value = currentInsight.value || buildWelcomeInsight(props.entrySource, linkedRequest.value, activeSessionType.value) if (props.initialPrompt?.trim() || props.initialFiles.length) { const initialMerge = mergeFilesWithLimit([], Array.from(props.initialFiles), MAX_ATTACHMENTS) @@ -2585,15 +2606,6 @@ export default { } function requestCloseWorkbench() { - if (submitting.value || reviewActionBusy.value || deleteSessionBusy.value || leaveKnowledgeBusy.value || sessionSwitchBusy.value) { - return - } - - if (isKnowledgeSession.value) { - leaveKnowledgeDialogOpen.value = true - return - } - emit('close') } @@ -2663,31 +2675,6 @@ export default { } } - function closeLeaveKnowledgeDialog() { - if (leaveKnowledgeBusy.value) { - return - } - leaveKnowledgeDialogOpen.value = false - } - - async function confirmLeaveKnowledgeSession() { - if (leaveKnowledgeBusy.value || sessionSwitchBusy.value) { - return - } - - leaveKnowledgeBusy.value = true - try { - await clearUserConversations(resolveCurrentUserId(), SESSION_TYPE_KNOWLEDGE) - sessionSnapshots.value[SESSION_TYPE_KNOWLEDGE] = buildEmptySessionState(SESSION_TYPE_KNOWLEDGE) - leaveKnowledgeDialogOpen.value = false - emit('close') - } catch (error) { - toast(error?.message || '清理知识问答会话失败,请稍后重试。') - } finally { - leaveKnowledgeBusy.value = false - } - } - async function saveInlineReviewChanges() { if (!activeReviewPayload.value || !reviewHasUnsavedChanges.value || reviewActionBusy.value) return @@ -3092,10 +3079,8 @@ export default { reviewCancelDialogOpen, reviewEditDialogOpen, deleteSessionDialogOpen, - leaveKnowledgeDialogOpen, reviewActionBusy, deleteSessionBusy, - leaveKnowledgeBusy, reviewEditFields, documentPreviewDialog, shortcuts, @@ -3144,8 +3129,6 @@ export default { openDeleteSessionDialog, closeDeleteSessionDialog, confirmDeleteCurrentSession, - closeLeaveKnowledgeDialog, - confirmLeaveKnowledgeSession, openInlineReviewEditor, closeInlineReviewEditor, commitInlineReviewEditor, diff --git a/web/src/views/scripts/TravelRequestDetailView.js b/web/src/views/scripts/TravelRequestDetailView.js index d8c5233..e246adb 100644 --- a/web/src/views/scripts/TravelRequestDetailView.js +++ b/web/src/views/scripts/TravelRequestDetailView.js @@ -452,11 +452,6 @@ export default { department: request.value.profileDepartment, grade: request.value.profileGrade, manager: request.value.profileManager, - facts: [ - { label: '部门', value: request.value.profileDepartment }, - { label: '职级', value: request.value.profileGrade }, - { label: '直属上司', value: request.value.profileManager } - ], avatar: request.value.profileAvatar })) @@ -484,43 +479,44 @@ export default { { immediate: true } ) - const heroStats = computed(() => [ + const heroFactItems = computed(() => [ { + key: 'document', + label: '报销单号', + value: request.value.documentNo || request.value.id, + icon: 'mdi mdi-camera-outline', + valueClass: '' + }, + { + key: 'date', + label: '日期', + value: request.value.applyTime || request.value.occurredDisplay, + icon: 'mdi mdi-calendar-month-outline', + valueClass: '' + }, + { + key: 'amount', label: '报销金额', value: request.value.amountDisplay, - kind: 'text', - emphasis: true + icon: '', + valueClass: 'amount' }, { - label: '报销类型', + key: 'type', + label: isTravelRequest.value ? '差旅类型' : '报销类型', value: request.value.typeLabel, - kind: 'text' + icon: '', + valueClass: '' }, { - label: '当前节点', + key: 'status', + label: '当前状态', value: request.value.node, - kind: 'pill', - className: 'state-pill', - tone: request.value.approvalTone - }, - { - label: '审批状态', - value: request.value.approval, - kind: 'pill', - className: 'approval-pill', - tone: request.value.approvalTone + icon: '', + valueClass: 'status' } ]) - const heroSummaryItems = computed(() => { - return [ - { label: '单号', value: request.value.id, icon: 'mdi mdi-pound-box-outline' }, - { label: '发生时间', value: request.value.occurredDisplay, icon: 'mdi mdi-calendar-month-outline' }, - { label: '费用明细', value: `${expenseItems.value.length} 条`, icon: 'mdi mdi-format-list-bulleted-square' }, - { label: '申请时间', value: request.value.applyTime, icon: 'mdi mdi-timer-sand' } - ] - }) - const progressSteps = computed(() => Array.isArray(request.value.progressSteps) && request.value.progressSteps.length ? request.value.progressSteps @@ -1136,8 +1132,7 @@ export default { handleExpenseFileChange, handleSubmit, hasExpenseRiskColumn, - heroStats, - heroSummaryItems, + heroFactItems, isDraftRequest, isTravelRequest, locationInputPlaceholder,