107 lines
2.8 KiB
TypeScript
107 lines
2.8 KiB
TypeScript
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,
|
|
}
|
|
})
|