zhangwencui
6 天以前 9af9d62696a57a8ac8603e41931afbe63ae05cb8
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
import { API_BASE_URL, request, type ApiResponse } from './request';
import type { PageResult, UserSimple } from './purchase';
 
export interface DictData { dictType: string; label: string; value: string; status?: number; sort?: number; }
export interface DictTypeSimple { id?: number; name?: string; type?: string; status?: number; }
export interface Area { id: number; name: string; parentId?: number; children?: Area[]; }
export interface StorageFile { id: number; name?: string; url?: string; previewURL?: string; downloadURL?: string; }
export interface Clue { id?: number; name: string; source?: number; mobile?: string; telephone?: string; email?: string; wechat?: string; qq?: string; industryId?: number; level?: number; areaId?: number; areaName?: string; detailAddress?: string; contactNextTime?: string; remark?: string; ownerUserId?: number; ownerUserName?: string; ownerUserDeptName?: string; transformStatus?: boolean; followUpStatus?: boolean; contactLastTime?: string; contactLastContent?: string; creatorName?: string; createTime?: string; updateTime?: string; }
export interface CrmCustomerSimple { id: number; name: string; }
export interface CrmCustomer { id?: number; name: string; mobile?: string; telephone?: string; qq?: string; wechat?: string; email?: string; areaId?: number; areaName?: string; detailAddress?: string; industryId?: number; level?: number; source?: number; remark?: string; ownerUserId?: number; ownerUserName?: string; ownerUserDeptName?: string; lockStatus?: boolean; dealStatus?: boolean; followUpStatus?: boolean; contactStatus?: number; contactLastTime?: string; contactLastContent?: string; contactNextTime?: string; poolDay?: number; creatorName?: string; createTime?: string; updateTime?: string; }
export interface CrmContact { id?: number; name: string; customerId?: number; customerName?: string; businessId?: number; ownerUserId?: number; mobile?: string; telephone?: string; email?: string; wechat?: string; qq?: string | number; post?: string; master?: boolean; contactLastTime?: string; contactLastContent?: string; contactNextTime?: string; ownerUserName?: string; ownerUserDeptName?: string; areaId?: number; areaName?: string; detailAddress?: string; sex?: number; parentId?: number; parentName?: string; remark?: string; creatorName?: string; createTime?: string; updateTime?: string; }
export interface ContractProduct { id?: number; itemId?: number; itemName?: string; itemCode?: string; itemSpecification?: string; itemUnitId?: number; itemUnitName?: string; itemPrice?: number; contractPrice?: number; count?: number; totalPrice?: number; }
export interface CrmContract { id?: number; name: string; no?: string; customerId?: number; customerName?: string; businessId?: number; businessName?: string; contactId?: number; contactName?: string; contactLastTime?: string; contactNextTime?: string; ownerUserId?: number; ownerUserName?: string; ownerUserDeptName?: string; processInstanceId?: number; auditStatus?: number; orderDate?: string; startTime?: string; endTime?: string; totalProductPrice?: number; discountPercent?: number; totalPrice?: number; depositPrice?: number; totalReceivablePrice?: number; totalInvoicePrice?: number; unInvoicePrice?: number; signContactId?: number; signContactName?: string; signUserId?: number; signUserName?: string; remark?: string; creatorName?: string; createTime?: string; updateTime?: string; products?: ContractProduct[]; }
export interface CrmInvoiceSimple { id: number; no?: string; invoiceNo?: string; price?: number; contractId?: number; customerId?: number; }
export interface CrmInvoice { id?: number; no?: string; contractId?: number; contract?: { id?: number; no?: string; name?: string }; customerId?: number; customerName?: string; invoiceType?: number; invoiceNo?: string; invoiceTitle?: string; price?: number; invoiceTime?: string; auditStatus?: number; remark?: string; ownerUserId?: number; ownerUserName?: string; ownerUserDeptName?: string; processInstanceId?: string; attachmentList?: StorageFile[]; blobIds?: number[]; hasAttachment?: boolean; remainingInvoicePrice?: number; creatorName?: string; createTime?: string; updateTime?: string; }
export interface SaleQuotationItem { id?: number; itemId?: number; itemName?: string; itemCode?: string; itemSpecification?: string; itemUnitName?: string; itemUnitName2?: string; itemUnitName3?: string; itemPrice?: number; quotationPrice?: number; count?: number; totalPrice?: number; taxPercent?: number; taxPrice?: number; remark?: string; }
export interface SaleQuotation { id?: number; name: string; no?: string; customerId?: number; customerName?: string; businessId?: number; businessName?: string; contactId?: number; contactName?: string; quotationTime?: string; validUntil?: string; totalProductPrice?: number; discountPercent?: number; totalPrice?: number; taxRate?: number; blobIds?: number[]; attachmentList?: StorageFile[]; remark?: string; status?: number; contractId?: number; contractNo?: string; ownerUserId?: number; ownerUserName?: string; creatorName?: string; createTime?: string; updateTime?: string; items?: SaleQuotationItem[]; }
export interface CrmReceivable { id?: number; no?: string; customerId?: number; customerName?: string; contractId?: number; contractNo?: string; invoiceId?: number; planId?: number; ownerUserId?: number; returnTime?: string; price?: number; returnType?: number; auditStatus?: number; ownerUserName?: string; remark?: string; }
export interface CrmReceivablePlan { id?: number; period?: number; customerId?: number; customerName?: string; contractId?: number; contractNo?: string; ownerUserId?: number; returnTime?: string; returnType?: number; price?: number; remindDays?: number; receivableId?: number; ownerUserName?: string; remark?: string; }
export interface BusinessStatusType { id: number; name: string; percent?: number; sort?: number; }
export interface BusinessStatusGroup { id: number; name: string; statuses?: BusinessStatusType[]; }
export interface BusinessProduct { id?: number; itemId?: number; name?: string; code?: string; specification?: string; unitMeasureId?: number; unitMeasureName?: string; salesPrice?: number; itemName?: string; itemCode?: string; itemSpecification?: string; itemUnitId?: number; itemUnitName?: string; itemPrice?: number; businessPrice?: number; count?: number; totalPrice?: number; }
export interface Business { id?: number; name: string; customerId?: number; customerName?: string; ownerUserId?: number; ownerUserName?: string; ownerUserDeptName?: string; statusTypeId?: number; statusTypeName?: string; statusId?: number; statusName?: string; contactNextTime?: string; dealTime?: string; discountPercent?: number; totalProductPrice?: number; totalPrice?: number; endRemark?: string; remark?: string; followUpStatus?: boolean; contactLastTime?: string; contactLastContent?: string; creatorName?: string; createTime?: string; updateTime?: string; products?: BusinessProduct[]; }
export interface FollowUpRecord { id?: number; bizType: number; bizId: number; type?: number; content: string; nextTime?: string; picUrls?: string[]; blobIds?: number[]; attachmentList?: StorageFile[]; creatorName?: string; createTime?: string; }
export interface CrmPermission { id?: number; ids?: number[]; userId?: number; nickname?: string; deptName?: string; postNames?: string[]; level: number; bizType: number; bizId: number; createTime?: string; }
export interface OperateLog { id: number; type?: number; content?: string; creatorName?: string; createTime?: string; }
export interface OperationRecord { id?: number; type?: number; content?: string; creatorName?: string; createTime?: string; operationType?: number; operationTypeDesc?: string; operationDetail?: string; action?: string; beforeStatus?: string; afterStatus?: string; beforeData?: unknown; afterData?: unknown; operatorName?: string; operateTime?: string; recordNo?: string; recordId?: number | string; }
export interface CustomerPoolConfig { enabled?: boolean; contactExpireDays?: number; dealExpireDays?: number; notifyEnabled?: boolean; notifyDays?: number; }
export interface DeptSimple { id: number; name: string; parentId?: number; children?: DeptSimple[]; }
export interface CustomerLimitConfig { id?: number; type?: number; userIds?: number[]; deptIds?: number[]; maxCount?: number; dealCountEnabled?: boolean; users?: UserSimple[]; depts?: DeptSimple[]; createTime?: string; }
export interface BusinessStatusConfigItem { id?: number; name: string; percent?: number; sort?: number; }
export interface BusinessStatusConfig { id?: number; name: string; deptIds?: number[]; deptNames?: string[]; creator?: string; createTime?: string; statuses: BusinessStatusConfigItem[]; }
export interface ContractConfig { notifyEnabled?: boolean; notifyDays?: number; }
export interface ClueTransfer { id: number; newOwnerUserId: number; oldOwnerHandler: boolean; oldOwnerPermissionLevel?: number; toBizTypes?: number[]; }
export interface OwnerTransfer { id: number; newOwnerUserId: number; oldOwnerPermissionLevel?: number; toBizTypes?: number[]; }
export interface ApproveProcess { key: string; name: string; }
 
const header = (accessToken: string) => ({ Authorization: `Bearer ${accessToken}` });
function query(params: Record<string, string | number | boolean | undefined>) { const content = Object.entries(params).filter(([, value]) => value !== undefined && value !== '').map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`).join('&'); return content ? `?${content}` : ''; }
export function getSimpleDictDataList(accessToken: string) { return request<DictData[]>('/system/dict-data/simple-list', { header: header(accessToken) }); }
/** 字典类型精简列表(对齐 web 端 getSimpleDictTypeList) */
export function getSimpleDictTypeList(accessToken: string) { return request<DictTypeSimple[]>('/system/dict-type/list-all-simple', { header: header(accessToken) }); }
export function getAreaTree(accessToken: string) { return request<Area[]>('/system/area/tree', { header: header(accessToken) }); }
export function getCrmUserList(accessToken: string) { return request<UserSimple[]>('/system/user/simple-list', { header: header(accessToken) }); }
export function getDeptSimpleList(accessToken: string) { return request<DeptSimple[]>('/system/dept/simple-list', { header: header(accessToken) }); }
export function getCustomerPage(accessToken: string, params: { pageNo: number; pageSize: number; sceneType?: number; name?: string; pool?: boolean; followUpStatus?: boolean; contactStatus?: number }) { return request<PageResult<CrmCustomer>>(`/crm/customer/page${query(params)}`, { header: header(accessToken) }); }
export function getPutPoolRemindCustomerPage(accessToken: string, params: { pageNo: number; pageSize: number; sceneType?: number }) { return request<PageResult<CrmCustomer>>(`/crm/customer/put-pool-remind-page${query(params)}`, { header: header(accessToken) }); }
export function getPutPoolRemindCustomerCount(accessToken: string) { return request<number>('/crm/customer/put-pool-remind-count', { header: header(accessToken) }); }
export function getTodayContactCustomerCount(accessToken: string) { return request<number>('/crm/customer/today-contact-count', { header: header(accessToken) }); }
export function getFollowCustomerCount(accessToken: string) { return request<number>('/crm/customer/follow-count', { header: header(accessToken) }); }
export function getCustomer(accessToken: string, id: number) { return request<CrmCustomer>(`/crm/customer/get${query({ id })}`, { header: header(accessToken) }); }
export function createCustomer(accessToken: string, data: CrmCustomer) { return request<number>('/crm/customer/create', { method: 'POST', data, header: header(accessToken) }); }
export function updateCustomer(accessToken: string, data: CrmCustomer) { return request<boolean>('/crm/customer/update', { method: 'PUT', data, header: header(accessToken) }); }
export function deleteCustomer(accessToken: string, id: number) { return request<boolean>(`/crm/customer/delete${query({ id })}`, { method: 'DELETE', header: header(accessToken) }); }
export function transferCustomer(accessToken: string, data: OwnerTransfer) { return request<boolean>('/crm/customer/transfer', { method: 'PUT', data, header: header(accessToken) }); }
export function lockCustomer(accessToken: string, id: number, lockStatus: boolean) { return request<boolean>('/crm/customer/lock', { method: 'PUT', data: { id, lockStatus }, header: header(accessToken) }); }
export function updateCustomerDealStatus(accessToken: string, id: number, dealStatus: boolean) { return request<boolean>(`/crm/customer/update-deal-status${query({ id, dealStatus })}`, { method: 'PUT', header: header(accessToken) }); }
export function receiveCustomer(accessToken: string, ids: number[]) { return request<boolean>(`/crm/customer/receive${query({ ids: ids.join(',') })}`, { method: 'PUT', header: header(accessToken) }); }
export function distributeCustomer(accessToken: string, ids: number[], ownerUserId: number) { return request<boolean>('/crm/customer/distribute', { method: 'PUT', data: { ids, ownerUserId }, header: header(accessToken) }); }
export function putCustomerPool(accessToken: string, id: number) { return request<boolean>(`/crm/customer/put-pool${query({ id })}`, { method: 'PUT', header: header(accessToken) }); }
export function getCustomerPoolConfig(accessToken: string) { return request<CustomerPoolConfig>('/crm/customer-pool-config/get', { header: header(accessToken) }); }
export function saveCustomerPoolConfig(accessToken: string, data: CustomerPoolConfig) { return request<boolean>('/crm/customer-pool-config/save', { method: 'PUT', data, header: header(accessToken) }); }
export function getCustomerLimitConfigPage(accessToken: string, params: { pageNo: number; pageSize: number; type?: number }) { return request<PageResult<CustomerLimitConfig>>(`/crm/customer-limit-config/page${query(params)}`, { header: header(accessToken) }); }
export function getCustomerLimitConfig(accessToken: string, id: number) { return request<CustomerLimitConfig>(`/crm/customer-limit-config/get${query({ id })}`, { header: header(accessToken) }); }
export function createCustomerLimitConfig(accessToken: string, data: CustomerLimitConfig) { return request<number>('/crm/customer-limit-config/create', { method: 'POST', data, header: header(accessToken) }); }
export function updateCustomerLimitConfig(accessToken: string, data: CustomerLimitConfig) { return request<boolean>('/crm/customer-limit-config/update', { method: 'PUT', data, header: header(accessToken) }); }
export function deleteCustomerLimitConfig(accessToken: string, id: number) { return request<boolean>(`/crm/customer-limit-config/delete${query({ id })}`, { method: 'DELETE', header: header(accessToken) }); }
export function getCustomerSimpleList(accessToken: string) { return request<CrmCustomerSimple[]>('/crm/customer/simple-list', { header: header(accessToken) }); }
export function getContactPage(accessToken: string, params: { pageNo: number; pageSize: number; sceneType?: number; name?: string; customerId?: number; businessId?: number }) { return request<PageResult<CrmContact>>(`/crm/contact/page${query(params)}`, { header: header(accessToken) }); }
export function getContact(accessToken: string, id: number) { return request<CrmContact>(`/crm/contact/get${query({ id})}`, { header: header(accessToken) }); }
export function createContact(accessToken: string, data: CrmContact) { return request<number>('/crm/contact/create', { method: 'POST', data, header: header(accessToken) }); }
export function updateContact(accessToken: string, data: CrmContact) { return request<boolean>('/crm/contact/update', { method: 'PUT', data, header: header(accessToken) }); }
export function deleteContact(accessToken: string, id: number) { return request<boolean>(`/crm/contact/delete${query({ id })}`, { method: 'DELETE', header: header(accessToken) }); }
export function transferContact(accessToken: string, data: OwnerTransfer) { return request<boolean>('/crm/contact/transfer', { method: 'PUT', data, header: header(accessToken) }); }
export function getContactPageByCustomer(accessToken: string, params: { pageNo: number; pageSize: number; customerId: number }) { return request<PageResult<CrmContact>>(`/crm/contact/page-by-customer${query(params)}`, { header: header(accessToken) }); }
export function getContactPageByBusiness(accessToken: string, params: { pageNo: number; pageSize: number; businessId: number }) { return request<PageResult<CrmContact>>(`/crm/contact/page-by-business${query(params)}`, { header: header(accessToken) }); }
export function getContractPageByCustomer(accessToken: string, params: { pageNo: number; pageSize: number; customerId: number }) { return request<PageResult<CrmContract>>(`/crm/contract/page-by-customer${query(params)}`, { header: header(accessToken) }); }
export function getContractPageByBusiness(accessToken: string, params: { pageNo: number; pageSize: number; businessId: number }) { return request<PageResult<CrmContract>>(`/crm/contract/page-by-business${query(params)}`, { header: header(accessToken) }); }
export function getInvoiceSimpleList(accessToken: string, contractId: number) { return request<CrmInvoiceSimple[]>(`/crm/invoice/simple-list${query({ contractId })}`, { header: header(accessToken) }); }
export function getInvoicePage(accessToken: string, params: { pageNo: number; pageSize: number; sceneType?: number; no?: string; customerId?: number }) { return request<PageResult<CrmInvoice>>(`/crm/invoice/page${query(params)}`, { header: header(accessToken) }); }
export function getInvoice(accessToken: string, id: number) { return request<CrmInvoice>(`/crm/invoice/get${query({ id })}`, { header: header(accessToken) }); }
export function createInvoice(accessToken: string, data: CrmInvoice) { return request<number>('/crm/invoice/create', { method: 'POST', data, header: header(accessToken) }); }
export function updateInvoice(accessToken: string, data: CrmInvoice) { return request<boolean>('/crm/invoice/update', { method: 'PUT', data, header: header(accessToken) }); }
export function deleteInvoice(accessToken: string, id: number) { return request<boolean>(`/crm/invoice/delete${query({ id })}`, { method: 'DELETE', header: header(accessToken) }); }
export function submitInvoice(accessToken: string, id: number) { return request<boolean>(`/crm/invoice/submit${query({ id })}`, { method: 'PUT', header: header(accessToken) }); }
export function getSaleQuotationPage(accessToken: string, params: { pageNo: number; pageSize: number; sceneType?: number; no?: string; name?: string; customerId?: number; status?: number }) { return request<PageResult<SaleQuotation>>(`/crm/sale-quotation/page${query(params)}`, { header: header(accessToken) }); }
export function getSaleQuotation(accessToken: string, id: number) { return request<SaleQuotation>(`/crm/sale-quotation/get${query({ id })}`, { header: header(accessToken) }); }
export function createSaleQuotation(accessToken: string, data: SaleQuotation) { return request<number>('/crm/sale-quotation/create', { method: 'POST', data, header: header(accessToken) }); }
export function updateSaleQuotation(accessToken: string, data: SaleQuotation) { return request<boolean>('/crm/sale-quotation/update', { method: 'PUT', data, header: header(accessToken) }); }
export function deleteSaleQuotation(accessToken: string, id: number) { return request<boolean>(`/crm/sale-quotation/delete${query({ id })}`, { method: 'DELETE', header: header(accessToken) }); }
export function convertSaleQuotationToContract(accessToken: string, id: number) { return request<number>(`/crm/sale-quotation/convert-contract${query({ id })}`, { method: 'POST', header: header(accessToken) }); }
export function getReceivable(accessToken: string, id: number) { return request<CrmReceivable>(`/crm/receivable/get${query({ id })}`, { header: header(accessToken) }); }
export function createReceivable(accessToken: string, data: CrmReceivable) { return request<number>('/crm/receivable/create', { method: 'POST', data, header: header(accessToken) }); }
export function updateReceivable(accessToken: string, data: CrmReceivable) { return request<boolean>('/crm/receivable/update', { method: 'PUT', data, header: header(accessToken) }); }
export function deleteReceivable(accessToken: string, id: number) { return request<boolean>(`/crm/receivable/delete${query({ id })}`, { method: 'DELETE', header: header(accessToken) }); }
export function updateReceivableStatus(accessToken: string, id: number, status: number) { return request<boolean>(`/crm/receivable/update-status${query({ id, status })}`, { method: 'PUT', header: header(accessToken) }); }
export function getReceivablePlan(accessToken: string, id: number) { return request<CrmReceivablePlan>(`/crm/receivable-plan/get${query({ id })}`, { header: header(accessToken) }); }
export function createReceivablePlan(accessToken: string, data: CrmReceivablePlan) { return request<number>('/crm/receivable-plan/create', { method: 'POST', data, header: header(accessToken) }); }
export function updateReceivablePlan(accessToken: string, data: CrmReceivablePlan) { return request<boolean>('/crm/receivable-plan/update', { method: 'PUT', data, header: header(accessToken) }); }
export function deleteReceivablePlan(accessToken: string, id: number) { return request<boolean>(`/crm/receivable-plan/delete${query({ id})}`, { method: 'DELETE', header: header(accessToken) }); }
export function getReceivablePageByCustomer(accessToken: string, params: { pageNo: number; pageSize: number; customerId: number; contractId?: number }) { return request<PageResult<CrmReceivable>>(`/crm/receivable/page-by-customer${query(params)}`, { header: header(accessToken) }); }
export function getReceivablePage(accessToken: string, params: { pageNo: number; pageSize: number; sceneType?: number; no?: string; contractId?: number; customerId?: number; auditStatus?: number }) { return request<PageResult<CrmReceivable>>(`/crm/receivable/page${query(params)}`, { header: header(accessToken) }); }
export function getAuditReceivableCount(accessToken: string) { return request<number>('/crm/receivable/audit-count', { header: header(accessToken) }); }
export function getReceivablePlanPage(accessToken: string, params: { pageNo: number; pageSize: number; sceneType?: number; customerId?: number; contractNo?: string; remindType?: number }) { return request<PageResult<CrmReceivablePlan>>(`/crm/receivable-plan/page${query(params)}`, { header: header(accessToken) }); }
export function getReceivablePlanRemindCount(accessToken: string) { return request<number>('/crm/receivable-plan/remind-count', { header: header(accessToken) }); }
export function getReceivablePlanSimpleList(accessToken: string, customerId: number, contractId: number) { return request<CrmReceivablePlan[]>(`/crm/receivable-plan/simple-list${query({ customerId, contractId })}`, { header: header(accessToken) }); }
export function getReceivablePlanPageByCustomer(accessToken: string, params: { pageNo: number; pageSize: number; customerId: number; contractId?: number }) { return request<PageResult<CrmReceivablePlan>>(`/crm/receivable-plan/page-by-customer${query(params)}`, { header: header(accessToken) }); }
export function getContractPage(accessToken: string, params: { pageNo: number; pageSize: number; sceneType?: number; name?: string; no?: string; auditStatus?: number; expiryType?: number }) { return request<PageResult<CrmContract>>(`/crm/contract/page${query(params)}`, { header: header(accessToken) }); }
export function getAuditContractCount(accessToken: string) { return request<number>('/crm/contract/audit-count', { header: header(accessToken) }); }
export function getRemindContractCount(accessToken: string) { return request<number>('/crm/contract/remind-count', { header: header(accessToken) }); }
export function getContract(accessToken: string, id: number) { return request<CrmContract>(`/crm/contract/get${query({ id })}`, { header: header(accessToken) }); }
export function createContract(accessToken: string, data: CrmContract) { return request<number>('/crm/contract/create', { method: 'POST', data, header: header(accessToken) }); }
export function updateContract(accessToken: string, data: CrmContract) { return request<boolean>('/crm/contract/update', { method: 'PUT', data, header: header(accessToken) }); }
export function deleteContract(accessToken: string, id: number) { return request<boolean>(`/crm/contract/delete${query({ id})}`, { method: 'DELETE', header: header(accessToken) }); }
export function transferContract(accessToken: string, data: OwnerTransfer) { return request<boolean>('/crm/contract/transfer', { method: 'PUT', data, header: header(accessToken) }); }
export function getContractApproveProcessList(accessToken: string) { return request<ApproveProcess[]>('/crm/contract/approve-process-list', { header: header(accessToken) }); }
export function submitContract(accessToken: string, id: number, processDefinitionKey: string) { return request<boolean>(`/crm/contract/submit${query({ id, processDefinitionKey })}`, { method: 'PUT', header: header(accessToken) }); }
export function getBusinessPage(accessToken: string, params: { pageNo: number; pageSize: number; sceneType?: number; name?: string; customerId?: number }) { return request<PageResult<Business>>(`/crm/business/page${query(params)}`, { header: header(accessToken) }); }
export function getBusinessPageByCustomer(accessToken: string, params: { pageNo: number; pageSize: number; customerId: number }) { return request<PageResult<Business>>(`/crm/business/page-by-customer${query(params)}`, { header: header(accessToken) }); }
export function getBusinessPageByContact(accessToken: string, params: { pageNo: number; pageSize: number; contactId: number }) { return request<PageResult<Business>>(`/crm/business/page-by-contact${query(params)}`, { header: header(accessToken) }); }
export function getBusiness(accessToken: string, id: number) { return request<Business>(`/crm/business/get${query({ id})}`, { header: header(accessToken) }); }
export function createBusiness(accessToken: string, data: Business) { return request<number>('/crm/business/create', { method: 'POST', data, header: header(accessToken) }); }
export function updateBusiness(accessToken: string, data: Business) { return request<boolean>('/crm/business/update', { method: 'PUT', data, header: header(accessToken) }); }
export function updateBusinessStatus(accessToken: string, data: { id: number; statusId: number }) { return request<boolean>('/crm/business/update-status', { method: 'PUT', data, header: header(accessToken) }); }
export function deleteBusiness(accessToken: string, id: number) { return request<boolean>(`/crm/business/delete${query({ id })}`, { method: 'DELETE', header: header(accessToken) }); }
export function transferBusiness(accessToken: string, data: OwnerTransfer) { return request<boolean>('/crm/business/transfer', { method: 'PUT', data, header: header(accessToken) }); }
export function getBusinessStatusTypeSimpleList(accessToken: string) { return request<BusinessStatusGroup[]>('/crm/business-status/type-simple-list', { header: header(accessToken) }); }
export function getBusinessStatusSimpleList(accessToken: string, typeId: number) { return request<BusinessStatusType[]>(`/crm/business-status/status-simple-list${query({ typeId })}`, { header: header(accessToken) }); }
export function getBusinessStatusConfigPage(accessToken: string, params: { pageNo: number; pageSize: number; name?: string }) { return request<PageResult<BusinessStatusConfig>>(`/crm/business-status/page${query(params)}`, { header: header(accessToken) }); }
export function getBusinessStatusConfig(accessToken: string, id: number) { return request<BusinessStatusConfig>(`/crm/business-status/get${query({ id })}`, { header: header(accessToken) }); }
export function createBusinessStatusConfig(accessToken: string, data: BusinessStatusConfig) { return request<number>('/crm/business-status/create', { method: 'POST', data, header: header(accessToken) }); }
export function updateBusinessStatusConfig(accessToken: string, data: BusinessStatusConfig) { return request<boolean>('/crm/business-status/update', { method: 'PUT', data, header: header(accessToken) }); }
export function deleteBusinessStatusConfig(accessToken: string, id: number) { return request<boolean>(`/crm/business-status/delete${query({ id })}`, { method: 'DELETE', header: header(accessToken) }); }
export function getContractConfig(accessToken: string) { return request<ContractConfig>('/crm/contract-config/get', { header: header(accessToken) }); }
export function saveContractConfig(accessToken: string, data: ContractConfig) { return request<boolean>('/crm/contract-config/save', { method: 'PUT', data, header: header(accessToken) }); }
export function getMaterialSimpleList(accessToken: string) { return request<BusinessProduct[]>('/mdm/item/simple-list', { header: header(accessToken) }); }
export function getCluePage(accessToken: string, params: { pageNo: number; pageSize: number; sceneType?: number; name?: string; transformStatus?: boolean; followUpStatus?: boolean }) { return request<PageResult<Clue>>(`/crm/clue/page${query(params)}`, { header: header(accessToken) }); }
export function getFollowClueCount(accessToken: string) { return request<number>('/crm/clue/follow-count', { header: header(accessToken) }); }
export function getClue(accessToken: string, id: number) { return request<Clue>(`/crm/clue/get${query({ id })}`, { header: header(accessToken) }); }
export function createClue(accessToken: string, data: Clue) { return request<number>('/crm/clue/create', { method: 'POST', data, header: header(accessToken) }); }
export function updateClue(accessToken: string, data: Clue) { return request<boolean>('/crm/clue/update', { method: 'PUT', data, header: header(accessToken) }); }
export function deleteClue(accessToken: string, id: number) { return request<boolean>(`/crm/clue/delete${query({ id})}`, { method: 'DELETE', header: header(accessToken) }); }
export function transformClue(accessToken: string, id: number) { return request<boolean>(`/crm/clue/transform${query({ id})}`, { method: 'PUT', header: header(accessToken) }); }
export function transferClue(accessToken: string, data: ClueTransfer) { return request<boolean>('/crm/clue/transfer', { method: 'PUT', data, header: header(accessToken) }); }
export function getFollowUpPage(accessToken: string, params: { pageNo: number; pageSize: number; bizType: number; bizId: number }) { return request<PageResult<FollowUpRecord>>(`/crm/follow-up-record/page${query(params)}`, { header: header(accessToken) }); }
export function createFollowUp(accessToken: string, data: FollowUpRecord) { return request<number>('/crm/follow-up-record/create', { method: 'POST', data, header: header(accessToken) }); }
export function deleteFollowUp(accessToken: string, id: number) { return request<boolean>(`/crm/follow-up-record/delete${query({ id })}`, { method: 'DELETE', header: header(accessToken) }); }
export function getPermissionList(accessToken: string, bizId: number, bizType = 1) { return request<CrmPermission[]>(`/crm/permission/list${query({ bizId, bizType})}`, { header: header(accessToken) }); }
export function createPermission(accessToken: string, data: CrmPermission) { return request<number>('/crm/permission/create', { method: 'POST', data, header: header(accessToken) }); }
export function updatePermission(accessToken: string, data: CrmPermission) { return request<boolean>('/crm/permission/update', { method: 'PUT', data, header: header(accessToken) }); }
export function deletePermission(accessToken: string, ids: number[]) { return request<boolean>(`/crm/permission/delete${query({ ids: ids.join(',') })}`, { method: 'DELETE', header: header(accessToken) }); }
export function deleteSelfPermission(accessToken: string, id: number) { return request<boolean>(`/crm/permission/delete-self${query({ id })}`, { method: 'DELETE', header: header(accessToken) }); }
export function getOperateLogPage(accessToken: string, bizId: number, bizType = 1) { return request<PageResult<OperationRecord>>(`/crm/operate-log/page${query({ bizType, bizId, pageNo: 1, pageSize: 100 })}`, { header: header(accessToken) }); }
export function listOperationLog(accessToken: string, contractNo: string) {
  return new Promise<OperationRecord[]>((resolve, reject) => {
    uni.request({
      url: `${API_BASE_URL}/mes/operation/detail`,
      method: 'POST',
      data: { contractNo },
      header: { 'content-type': 'application/json', ...header(accessToken) },
      success: response => {
        const result = response.data as ApiResponse<OperationRecord[]>;
        if (result?.code === 0 || result?.code === 200) {
          resolve(result.data || []);
          return;
        }
        if (response.statusCode === 401 || result?.code === 401) {
          uni.$emit('auth-expired');
          reject(new Error('登录已过期,请重新登录'));
          return;
        }
        reject(new Error(result?.msg || '操作记录加载失败'));
      },
      fail: () => reject(new Error('网络连接失败,请检查网络后重试')),
    });
  });
}
export function uploadCrmFile(accessToken: string, filePath: string) {
  return new Promise<StorageFile>((resolve, reject) =>
    uni.uploadFile({
      url: `${API_BASE_URL}/system/storage-blob/upload`,
      filePath,
      name: 'files',
      header: header(accessToken),
      success: response => {
        try {
          const data = JSON.parse(response.data) as ApiResponse<StorageFile[]>;
          if (data.code === 0 && data.data?.[0]) {
            resolve(data.data[0]);
          } else {
            reject(new Error(data.msg || '文件上传失败'));
          }
        } catch {
          reject(new Error('文件上传响应解析失败'));
        }
      },
      fail: () => reject(new Error('文件上传失败,请检查网络后重试')),
    }),
  );
}