yeg
2026-09-09 528d52f2c7c6f911c54cae6e3f25500eab4384fe
src/stores/todos.ts
@@ -1,16 +1,26 @@
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 }
}