import { defineStore } from 'pinia' import { ref } from 'vue' import { ElMessage } from 'element-plus' import type { PageResult } from '@/types/api' import type { AfterSalesPayload, Project, ProjectQuery } from '@/types/business/project' import { cancelAfterSales as cancelAfterSalesApi, deleteProjectFile, getProjectDetail, getProjectList, submitAfterSales as submitAfterSalesApi, uploadProjectFile, } from '@/api/project' function createDefaultQuery(): ProjectQuery { return { keyword: '', businessType: 'all', status: 'all', timeShortcut: 'all', page: 1, pageSize: 8, } } /** 项目中心数据(列表 / 筛选 / 分页 / 详情 / 文件 / 售后) */ export const useProjectStore = defineStore('project', () => { const query = ref(createDefaultQuery()) const list = ref([]) const total = ref(0) const current = ref(null) async function fetchList(): Promise { const result: PageResult = await getProjectList(query.value) list.value = result.list total.value = result.total } async function fetchDetail(id: string): Promise { current.value = await getProjectDetail(id) } function setQuery(next: ProjectQuery): void { query.value = next } /** 确定筛选(重置页码后取数) */ async function search(): Promise { query.value = { ...query.value, page: 1 } await fetchList() } /** 重置全部条件 */ async function resetQuery(): Promise { query.value = createDefaultQuery() await fetchList() } async function changePage(page: number): Promise { query.value = { ...query.value, page } await fetchList() } /** 上传项目文件(追加到当前详情) */ async function uploadFile(file: File): Promise { const info = await uploadProjectFile(file) current.value?.files.push(info) } /** 删除当前详情中的项目文件 */ async function deleteFile(index: number): Promise { await deleteProjectFile(index) current.value?.files.splice(index, 1) } /** 提交售后工单 */ async function submitAfterSales(payload: AfterSalesPayload): Promise { if (!current.value) return current.value.afterSales = await submitAfterSalesApi(current.value.id, payload) ElMessage.success('已提交售后工单') } /** 取消售后工单 */ async function cancelAfterSales(): Promise { if (!current.value) return current.value.afterSales = await cancelAfterSalesApi(current.value.id) ElMessage.success('已取消售后工单') } return { query, list, total, current, fetchList, fetchDetail, setQuery, search, resetQuery, changePage, uploadFile, deleteFile, submitAfterSales, cancelAfterSales, } })