feat 搭建架构骨架

This commit is contained in:
Ironsp
2026-09-24 09:09:47 +08:00
parent dd9f6b77a4
commit 7a2efa3fea
180 changed files with 18967 additions and 9 deletions

View File

@@ -0,0 +1,106 @@
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<ProjectQuery>(createDefaultQuery())
const list = ref<Project[]>([])
const total = ref(0)
const current = ref<Project | null>(null)
async function fetchList(): Promise<void> {
const result: PageResult<Project> = await getProjectList(query.value)
list.value = result.list
total.value = result.total
}
async function fetchDetail(id: string): Promise<void> {
current.value = await getProjectDetail(id)
}
function setQuery(next: ProjectQuery): void {
query.value = next
}
/** 确定筛选(重置页码后取数) */
async function search(): Promise<void> {
query.value = { ...query.value, page: 1 }
await fetchList()
}
/** 重置全部条件 */
async function resetQuery(): Promise<void> {
query.value = createDefaultQuery()
await fetchList()
}
async function changePage(page: number): Promise<void> {
query.value = { ...query.value, page }
await fetchList()
}
/** 上传项目文件(追加到当前详情) */
async function uploadFile(file: File): Promise<void> {
const info = await uploadProjectFile(file)
current.value?.files.push(info)
}
/** 删除当前详情中的项目文件 */
async function deleteFile(index: number): Promise<void> {
await deleteProjectFile(index)
current.value?.files.splice(index, 1)
}
/** 提交售后工单 */
async function submitAfterSales(payload: AfterSalesPayload): Promise<void> {
if (!current.value) return
current.value.afterSales = await submitAfterSalesApi(current.value.id, payload)
ElMessage.success('已提交售后工单')
}
/** 取消售后工单 */
async function cancelAfterSales(): Promise<void> {
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,
}
})