feat(web): update composables

- useAppShell.js: update app shell composable
- useNavigation.js: update navigation composable
- useRequests.js: update requests composable
This commit is contained in:
caoxiaozhu
2026-05-13 03:29:10 +00:00
parent 478c2a0e09
commit 2bf133d232
3 changed files with 516 additions and 51 deletions

View File

@@ -18,8 +18,19 @@ export function useAppShell() {
const smartEntrySessionId = ref(0)
const { activeView, currentView, setView } = useNavigation()
const { requests, search, filters, ranges, activeRange, filteredRequests, approveRequest, rejectRequest } =
useRequests()
const {
requests,
loading: requestsLoading,
error: requestsError,
search,
filters,
ranges,
activeRange,
filteredRequests,
approveRequest,
rejectRequest,
reload: reloadRequests
} = useRequests()
const {
messages,
draft,
@@ -32,22 +43,23 @@ export function useAppShell() {
handleUpload,
openChat,
openNewChat
} =
useChat(activeView)
} = useChat(activeView)
const { toast } = useToast()
const docSearch = ref('')
const customRange = ref({ start: '2024-07-06', end: '2024-07-12' })
const travelPrompts = ['生成差旅摘要', '识别报销风险', '核对审批链', '提取随附票据', '生成沟通建议']
const selectedTravelRequest = computed(() => {
const selectedRequest = computed(() => {
const requestId = String(route.params.requestId || '')
if (!requestId) {
return null
}
const rawRequest = requests.value.find((item) => String(item.id) === requestId)
const rawRequest = requests.value.find(
(item) => String(item.claimId || '').trim() === requestId || String(item.id || '').trim() === requestId
)
return normalizeRequestForUi(rawRequest)
})
@@ -56,14 +68,40 @@ export function useAppShell() {
const topBarView = computed(() => {
if (detailMode.value) {
return {
title: '差旅申请详情',
desc: '查看申请单、票据、审批意见与风提示。'
title: '报销单详情',
desc: '查看报销明细、票据材料、审批进度与风提示。'
}
}
return currentView.value
})
const requestSummary = computed(() =>
requests.value.reduce(
(summary, item) => {
const request = normalizeRequestForUi(item)
if (!request) {
return summary
}
summary.total += 1
if (request.approvalKey === 'draft') {
summary.draft += 1
} else if (request.approvalKey === 'in_progress') {
summary.inProgress += 1
} else if (request.approvalKey === 'supplement') {
summary.supplement += 1
} else if (request.approvalKey === 'completed') {
summary.completed += 1
}
return summary
},
{ total: 0, draft: 0, inProgress: 0, supplement: 0, completed: 0 }
)
)
const filteredDocuments = computed(() => {
const key = docSearch.value.trim().toLowerCase()
return documents.filter((doc) => !key || `${doc.id}${doc.applicant}${doc.destination}${doc.type}`.toLowerCase().includes(key))
@@ -104,7 +142,7 @@ export function useAppShell() {
smartEntryContext.value = {
prompt: payload.prompt ?? '',
source: payload.source ?? 'workbench',
request: payload.request ?? selectedTravelRequest.value,
request: payload.request ?? selectedRequest.value,
files: Array.isArray(payload.files) ? payload.files : [],
conversation: payload.conversation ?? null
}
@@ -115,10 +153,18 @@ export function useAppShell() {
smartEntryOpen.value = false
}
async function handleDraftSaved(payload = {}) {
const claimNo = String(payload.claimNo || payload.claim_no || '').trim()
smartEntryOpen.value = false
await reloadRequests()
toast(`${claimNo || '该'}单据已保存到草稿,请到报销页面查看。`)
router.push({ name: 'app-requests' })
}
function openRequestDetail(request) {
router.push({
name: 'app-request-detail',
params: { requestId: request.id }
params: { requestId: request.claimId || request.id }
})
}
@@ -126,6 +172,15 @@ export function useAppShell() {
router.push({ name: 'app-requests' })
}
async function handleRequestUpdated() {
await reloadRequests()
}
async function handleRequestDeleted() {
await reloadRequests()
router.push({ name: 'app-requests' })
}
return {
activeCase,
activeRange,
@@ -141,9 +196,12 @@ export function useAppShell() {
filteredRequests,
filters,
handleApprove,
handleDraftSaved,
handleNavigate,
handleOpenChat,
handleReject,
handleRequestDeleted,
handleRequestUpdated,
handleUpload,
messageList,
messages,
@@ -155,9 +213,13 @@ export function useAppShell() {
openTravelCreate,
prompts,
ranges,
requestSummary,
requestsError,
requestsLoading,
reloadRequests,
requests,
search,
selectedTravelRequest,
selectedRequest,
sendMessage,
sending,
setView,