import { API_BASE_URL, request, type ApiResponse } from "./request";
|
import type { PageResult } from "./purchase";
|
|
export interface AftersalesAttachment { id: number; name?: string; url?: string; path?: string }
|
export interface TicketItem {
|
id?: number; ticketId?: number; saleOrderItemId?: number; itemId?: number; itemCode?: string; itemName?: string;
|
batchId?: number; batchCode?: string; saleQuantity?: number; returnQuantity?: number; needRepair?: boolean;
|
needReturn?: boolean; remark?: string;
|
}
|
export interface AftersalesTicket {
|
id?: number; no?: string; name: string; customerId?: number; customerName?: string; contactId?: number;
|
contactName?: string; saleOrderId?: number; saleOrderNo?: string; contractId?: number; issueType?: number;
|
issueCategory?: string; issueDescription?: string; severityLevel?: number; status?: number; ownerUserId?: number;
|
ownerUserName?: string; handlerUserId?: number; handlerUserName?: string; processInstanceId?: string;
|
returnId?: number; repairId?: number; resolvedTime?: string; closedTime?: string; visitStatus?: number;
|
lastVisitTime?: string; lastVisitSatisfied?: boolean; lastVisitRecurred?: boolean; problemId?: number;
|
problemNo?: string; remark?: string; creator?: string; createTime?: string; updater?: string; updateTime?: string;
|
blobIds?: number[]; attachmentList?: AftersalesAttachment[]; items?: TicketItem[];
|
}
|
export interface ReturnItem {
|
id?: number; returnId?: number; ticketItemId?: number; itemId?: number; itemCode?: string; itemName?: string;
|
batchId?: number; batchCode?: string; returnQuantity?: number; unitPrice?: number; returnPrice?: number; remark?: string;
|
}
|
export interface AftersalesReturn {
|
id?: number; no?: string; ticketId?: number; customerId?: number; customerName?: string; saleOrderId?: number;
|
returnType?: number; returnReason?: string; defectCategory?: string; totalReturnPrice?: number;
|
actualRefundPrice?: number; status?: number; auditUserId?: number; auditTime?: string; mesReturnId?: number;
|
mesReturnCode?: string; qualityResult?: string; qualityReportUrl?: string; returnInboundTime?: string;
|
refundTime?: string; remark?: string; creator?: string; createTime?: string; updater?: string; updateTime?: string;
|
items?: ReturnItem[];
|
}
|
export interface AftersalesProblem {
|
id?: number; no?: string; title?: string; sourceTicketId?: number; sourceTicketNo?: string; customerId?: number;
|
customerName?: string; itemId?: number; itemCode?: string; itemName?: string; batchId?: number; batchCode?: string;
|
issueType?: number; issueCategory?: string; severityLevel?: number; description?: string; rootCauseCategory?: number;
|
rootCause?: string; solution?: string; status?: number; ownerUserId?: number; ownerUserName?: string;
|
publishTime?: string; remark?: string; creator?: string; createTime?: string; updater?: string; updateTime?: string;
|
blobIds?: number[]; attachmentList?: AftersalesAttachment[];
|
}
|
export interface AftersalesVisit {
|
id?: number; ticketId?: number; visitType?: number; visitorUserId?: number; visitorUserName?: string;
|
content?: string; satisfied?: boolean; recurred?: boolean; visitTime?: string; remark?: string;
|
creator?: string; createTime?: string; attachmentList?: AftersalesAttachment[];
|
}
|
export interface CreateAftersalesVisit {
|
ticketId: number; visitType: number; content?: string; satisfied: boolean; recurred: boolean;
|
remark?: string; blobIds?: number[];
|
}
|
|
const header = (token: string) => ({ Authorization: `Bearer ${token}` });
|
function query(params: Record<string, string | number | boolean | undefined>) {
|
const value = Object.entries(params).filter(([, item]) => item !== undefined && item !== "")
|
.map(([key, item]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(item))}`).join("&");
|
return value ? `?${value}` : "";
|
}
|
|
export function getTicketPage(token: string, params: { pageNo: number; pageSize: number; no?: string; name?: string; customerId?: number; status?: number; sceneType?: number | string }) {
|
return request<PageResult<AftersalesTicket>>(`/aftersales/ticket/page${query(params)}`, { header: header(token) });
|
}
|
export function getTicket(token: string, id: number) { return request<AftersalesTicket>(`/aftersales/ticket/get${query({ id })}`, { header: header(token) }); }
|
export function createTicket(token: string, data: AftersalesTicket) { return request<number>("/aftersales/ticket/create", { method: "POST", data: data as unknown as Record<string, unknown>, header: header(token) }); }
|
export function updateTicket(token: string, data: AftersalesTicket) { return request<boolean>("/aftersales/ticket/update", { method: "PUT", data: data as unknown as Record<string, unknown>, header: header(token) }); }
|
export function deleteTicket(token: string, id: number) { return request<boolean>(`/aftersales/ticket/delete${query({ id })}`, { method: "DELETE", header: header(token) }); }
|
export function assignTicket(token: string, id: number, handlerUserId: number) { return request<boolean>(`/aftersales/ticket/assign${query({ id, handlerUserId })}`, { method: "POST", header: header(token) }); }
|
export function classifyTicket(token: string, params: { id: number; issueType: number; issueCategory?: string; severityLevel?: number }) { return request<boolean>(`/aftersales/ticket/classify${query(params)}`, { method: "POST", header: header(token) }); }
|
export function resolveTicket(token: string, id: number) { return request<boolean>(`/aftersales/ticket/resolve${query({ id })}`, { method: "PUT", header: header(token) }); }
|
export function closeTicket(token: string, id: number) { return request<boolean>(`/aftersales/ticket/close${query({ id })}`, { method: "PUT", header: header(token) }); }
|
export function cancelTicket(token: string, id: number) { return request<boolean>(`/aftersales/ticket/cancel${query({ id })}`, { method: "PUT", header: header(token) }); }
|
|
export function getReturnPage(token: string, params: { pageNo: number; pageSize: number; no?: string; ticketId?: number; customerId?: number; status?: number }) { return request<PageResult<AftersalesReturn>>(`/aftersales/return/page${query(params)}`, { header: header(token) }); }
|
export function getReturn(token: string, id: number) { return request<AftersalesReturn>(`/aftersales/return/get${query({ id })}`, { header: header(token) }); }
|
export function createReturn(token: string, data: AftersalesReturn) { return request<number>("/aftersales/return/create", { method: "POST", data: data as unknown as Record<string, unknown>, header: header(token) }); }
|
export function approveReturn(token: string, id: number) { return request<boolean>(`/aftersales/return/approve${query({ id })}`, { method: "PUT", header: header(token) }); }
|
|
export function getProblemPage(token: string, params: { pageNo: number; pageSize: number; keyword?: string; itemCode?: string; issueCategory?: string; issueType?: number; rootCauseCategory?: number; status?: number }) { return request<PageResult<AftersalesProblem>>(`/aftersales/problem/page${query(params)}`, { header: header(token) }); }
|
export function getProblem(token: string, id: number) { return request<AftersalesProblem>(`/aftersales/problem/get${query({ id })}`, { header: header(token) }); }
|
export function createProblem(token: string, data: AftersalesProblem) { return request<number>("/aftersales/problem/create", { method: "POST", data: data as unknown as Record<string, unknown>, header: header(token) }); }
|
export function updateProblem(token: string, data: AftersalesProblem) { return request<boolean>("/aftersales/problem/update", { method: "PUT", data: data as unknown as Record<string, unknown>, header: header(token) }); }
|
export function deleteProblem(token: string, id: number) { return request<boolean>(`/aftersales/problem/delete${query({ id })}`, { method: "DELETE", header: header(token) }); }
|
export function publishProblem(token: string, id: number) { return request<boolean>(`/aftersales/problem/publish${query({ id })}`, { method: "PUT", header: header(token) }); }
|
export function disableProblem(token: string, id: number) { return request<boolean>(`/aftersales/problem/disable${query({ id })}`, { method: "PUT", header: header(token) }); }
|
export function referenceProblem(token: string, params: { itemId?: number; issueCategory?: string; issueType?: number; rootCauseCategory?: number; keyword?: string }) {
|
return request<AftersalesProblem[]>(`/aftersales/problem/reference${query(params)}`, { header: header(token) });
|
}
|
|
export function createVisit(token: string, data: CreateAftersalesVisit) {
|
return request<number>("/aftersales/visit/create", { method: "POST", data: data as unknown as Record<string, unknown>, header: header(token) });
|
}
|
export function getVisit(token: string, id: number) { return request<AftersalesVisit>(`/aftersales/visit/get${query({ id })}`, { header: header(token) }); }
|
export function getVisitListByTicketId(token: string, ticketId: number) { return request<AftersalesVisit[]>(`/aftersales/visit/list${query({ ticketId })}`, { header: header(token) }); }
|
export function getVisitPage(token: string, params: { pageNo: number; pageSize: number; ticketId?: number }) { return request<PageResult<AftersalesVisit>>(`/aftersales/visit/page${query(params)}`, { header: header(token) }); }
|
|
export function uploadAftersalesFile(token: string, filePath: string) {
|
return new Promise<AftersalesAttachment>((resolve, reject) => {
|
uni.uploadFile({ url: `${API_BASE_URL}/system/storage-blob/upload`, filePath, name: "files", header: header(token),
|
formData: { directory: "aftersales" }, success: response => {
|
try {
|
const result = JSON.parse(response.data) as ApiResponse<AftersalesAttachment[]>;
|
if (result.code === 0 && result.data?.[0]) resolve(result.data[0]);
|
else reject(new Error(result.msg || "文件上传失败"));
|
} catch { reject(new Error("文件上传响应解析失败")); }
|
}, fail: reject });
|
});
|
}
|
export function chooseAftersalesFiles(count = 10): Promise<Array<{ path: string; name?: string }>> {
|
return new Promise((resolve, reject) => {
|
const done = (files: Array<{ path: string; name?: string }>) => resolve(files.filter(item => Boolean(item.path)));
|
// #ifdef MP-WEIXIN
|
uni.chooseMessageFile({ count, type: "file", success: result => done((result.tempFiles || []).map(item => ({ path: item.path, name: item.name }))), fail: reject });
|
// #endif
|
// #ifndef MP-WEIXIN
|
uni.chooseFile({ count, success: result => done((result.tempFiles || []).map(item => ({ path: item.path, name: item.name }))), fail: reject });
|
// #endif
|
});
|
}
|