| | |
| | | import { ref } from 'vue' |
| | | import { listTodos, createTodo as createTodoApi, handleTodo as handleTodoApi, removeTodo as removeTodoApi } from '@/api/todos' |
| | | import { computed, ref } from 'vue' |
| | | import { listTodos, createTodo as createTodoApi, handleTodo as handleTodoApi, removeTodo as removeTodoApi, type TodoDto } from '@/api/todos' |
| | | import { getAuthToken } from '@/api/request' |
| | | import { formatBusinessTime } from '@/utils/businessTime' |
| | | |
| | | export type TodoStatus = '待处理' | '已处理' |
| | | export interface TodoRecord { id:number; content:string; ownerId:number; owner:string; status:TodoStatus; creator:string; createdAt:string; operatedAt:string; handleRemark:string } |
| | | export interface TodoPayload { content:string; ownerId:number; owner:string } |
| | | const records = ref<TodoRecord[]>([]) |
| | | const loaded = ref(false) |
| | | function map(item: any): TodoRecord { return {...item, createdAt: formatBusinessTime(item.createdAt), operatedAt: formatBusinessTime(item.operatedAt)} } |
| | | export interface TodoRecord extends Omit<TodoDto, 'createdAt' | 'operatedAt' | 'handleRemark'> { createdAt: string; operatedAt: string; handleRemark: string } |
| | | const cache = ref<TodoRecord[]>([]) |
| | | const session = ref<string | null>(null) |
| | | let requestNo = 0 |
| | | // 缓存仅属于当前登录会话;切换账号及退出登录后不能重用其他负责人的记录。 |
| | | const records = computed(() => session.value === getAuthToken() ? cache.value : []) |
| | | function map(item: TodoDto): TodoRecord { return { ...item, createdAt: formatBusinessTime(item.createdAt), operatedAt: formatBusinessTime(item.operatedAt), handleRemark: item.handleRemark ?? '' } } |
| | | export function clearTodos() { requestNo++; cache.value = []; session.value = '' } |
| | | export function useTodos() { |
| | | async function load(){ records.value=(await listTodos()).map(map); loaded.value=true } |
| | | async function createTodo(payload:TodoPayload){ const item=await createTodoApi({content:payload.content,ownerId:payload.ownerId,ownerName:payload.owner}); records.value.unshift(map(item)) } |
| | | async function handleTodo(id:number,remark:string){ await handleTodoApi(id,remark); await load() } |
| | | async function removeTodo(id:number){ await removeTodoApi(id); records.value=records.value.filter(item=>item.id!==id) } |
| | | return {records,loaded,load,createTodo,handleTodo,removeTodo} |
| | | async function load() { |
| | | const token = getAuthToken(); const current = ++requestNo |
| | | if (session.value !== token) { cache.value = []; session.value = token } |
| | | try { const rows = await listTodos(); if (current === requestNo && token === getAuthToken()) cache.value = rows.map(map) } |
| | | catch (error) { if (current === requestNo) cache.value = []; throw error } |
| | | } |
| | | async function createTodo(payload: { content: string; ownerId: number }) { await createTodoApi(payload); await load() } |
| | | async function handleTodo(id: number, remark: string) { await handleTodoApi(id, remark); await load() } |
| | | async function removeTodo(id: number) { await removeTodoApi(id); cache.value = cache.value.filter(item => item.id !== id) } |
| | | return { records, load, createTodo, handleTodo, removeTodo } |
| | | } |