zhangwencui
2026-10-31 e8dfe17e4afe9c065b25e2f8e5025b37cee5c4e1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
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
  });
}