225 lines
5.7 KiB
TypeScript
225 lines
5.7 KiB
TypeScript
import { parseUploadResponse, request } from "../utils/request";
|
|
import { buildAuthHeaders } from "../utils/auth";
|
|
import { resolveApiBaseUrl } from "../utils/env";
|
|
import { resolveOrderSourceChannel } from "../utils/order-source";
|
|
import type { PaymentLaunchInfo } from "./app";
|
|
|
|
export interface CatalogOption {
|
|
brand_id?: number;
|
|
brand_name?: string;
|
|
brand_en_name?: string;
|
|
}
|
|
|
|
export interface CategoryOption {
|
|
category_id: number;
|
|
category_name: string;
|
|
category_code: string;
|
|
}
|
|
|
|
export interface UploadItem {
|
|
item_code: string;
|
|
item_name: string;
|
|
guide_text: string;
|
|
sample_image_url: string;
|
|
is_required: boolean;
|
|
quality_status: string;
|
|
quality_message: string;
|
|
files?: UploadFileAsset[];
|
|
}
|
|
|
|
export interface UploadFileAsset {
|
|
file_id: string;
|
|
file_url: string;
|
|
thumbnail_url: string;
|
|
name?: string;
|
|
}
|
|
|
|
export interface DraftDetail {
|
|
draft_id: number;
|
|
service_provider: string;
|
|
service_mode: string;
|
|
price_package_id: number;
|
|
price_package_name: string;
|
|
price_package_code: string;
|
|
price_package_price: number;
|
|
current_step: number;
|
|
product_info: Record<string, any>;
|
|
extra_info: Record<string, any>;
|
|
upload_info?: {
|
|
items: UploadItem[];
|
|
};
|
|
}
|
|
|
|
export interface PreviewData {
|
|
service_summary: {
|
|
service_provider: string;
|
|
service_provider_text: string;
|
|
price_package_id: number;
|
|
price_package_name: string;
|
|
price_package_code: string;
|
|
};
|
|
product_summary: {
|
|
product_name: string;
|
|
category_name: string;
|
|
brand_name: string;
|
|
price: number;
|
|
};
|
|
upload_summary: {
|
|
uploaded_count: number;
|
|
};
|
|
fee_detail: {
|
|
service_fee: number;
|
|
discount_fee: number;
|
|
pay_amount: number;
|
|
};
|
|
agreements: Array<{
|
|
code: string;
|
|
title: string;
|
|
desc: string;
|
|
target_url: string;
|
|
}>;
|
|
}
|
|
|
|
export interface AppraisalServicePackage {
|
|
id: number;
|
|
service_provider: string;
|
|
service_provider_text: string;
|
|
package_name: string;
|
|
package_code: string;
|
|
price: number;
|
|
description: string;
|
|
is_enabled: boolean;
|
|
is_default: boolean;
|
|
sort_order: number;
|
|
sla_hours: number;
|
|
}
|
|
|
|
export interface AppraisalServiceConfig {
|
|
service_provider: string;
|
|
service_provider_text: string;
|
|
price: number;
|
|
sla_hours: number;
|
|
default_package_id: number;
|
|
default_package: AppraisalServicePackage | null;
|
|
packages: AppraisalServicePackage[];
|
|
}
|
|
|
|
export interface SubmitResult {
|
|
order_id: number;
|
|
order_no: string;
|
|
appraisal_no: string;
|
|
pay_amount: number;
|
|
next_status: string;
|
|
payment: PaymentLaunchInfo | null;
|
|
payment_launch_failed?: boolean;
|
|
payment_error?: string;
|
|
}
|
|
|
|
export const appraisalApi = {
|
|
createDraft(serviceProvider: string, pricePackageId?: number, pricePackageCode?: string) {
|
|
return request<{
|
|
draft_id: number;
|
|
service_provider: string;
|
|
service_mode: string;
|
|
price_package_id: number;
|
|
price_package_name: string;
|
|
price_package_code: string;
|
|
price_package_price: number;
|
|
}>(
|
|
"/api/app/appraisal/draft/create",
|
|
{
|
|
method: "POST",
|
|
data: {
|
|
service_provider: serviceProvider,
|
|
service_mode: "physical",
|
|
price_package_id: pricePackageId || undefined,
|
|
price_package_code: pricePackageCode || undefined,
|
|
},
|
|
},
|
|
);
|
|
},
|
|
getDraft(draftId: number) {
|
|
return request<DraftDetail>("/api/app/appraisal/draft", {
|
|
params: { draft_id: draftId },
|
|
});
|
|
},
|
|
saveDraft(payload: Record<string, unknown>) {
|
|
return request<{ draft_id: number; current_step: number }>("/api/app/appraisal/draft/save", {
|
|
method: "POST",
|
|
data: payload,
|
|
});
|
|
},
|
|
getBrands(categoryId: number) {
|
|
return request<{ list: CatalogOption[] }>("/api/app/catalog/brands", {
|
|
params: { category_id: categoryId },
|
|
});
|
|
},
|
|
getCategories() {
|
|
return request<{ list: CategoryOption[] }>("/api/app/catalog/categories");
|
|
},
|
|
getServiceConfigs() {
|
|
return request<{ list: AppraisalServiceConfig[] }>("/api/app/appraisal/service-configs");
|
|
},
|
|
getUploadTemplate(categoryId: number, serviceProvider: string) {
|
|
return request<{ template_id: number; required_items: UploadItem[]; optional_items: UploadItem[] }>(
|
|
"/api/app/appraisal/upload-template",
|
|
{
|
|
params: { category_id: categoryId, service_provider: serviceProvider },
|
|
},
|
|
);
|
|
},
|
|
preview(draftId: number) {
|
|
return request<PreviewData>("/api/app/appraisal/preview", {
|
|
method: "POST",
|
|
data: { draft_id: draftId },
|
|
});
|
|
},
|
|
submit(draftId: number, returnAddressId?: number) {
|
|
return request<SubmitResult>("/api/app/appraisal/submit", {
|
|
method: "POST",
|
|
data: {
|
|
draft_id: draftId,
|
|
return_address_id: returnAddressId,
|
|
source_channel: resolveOrderSourceChannel(),
|
|
},
|
|
});
|
|
},
|
|
uploadFile(payload: {
|
|
draftId: number;
|
|
itemCode: string;
|
|
itemName: string;
|
|
filePath: string;
|
|
}) {
|
|
const baseUrl = resolveApiBaseUrl().replace(/\/$/, "");
|
|
return new Promise<UploadFileAsset>((resolve, reject) => {
|
|
uni.uploadFile({
|
|
url: `${baseUrl}/api/app/appraisal/file/upload`,
|
|
filePath: payload.filePath,
|
|
name: "file",
|
|
header: buildAuthHeaders(),
|
|
formData: {
|
|
draft_id: payload.draftId,
|
|
item_code: payload.itemCode,
|
|
item_name: payload.itemName,
|
|
},
|
|
success: (response) => {
|
|
try {
|
|
resolve(parseUploadResponse<UploadFileAsset>(response, "图片上传失败"));
|
|
} catch (error) {
|
|
reject(error);
|
|
}
|
|
},
|
|
fail: (error) => reject(error),
|
|
});
|
|
});
|
|
},
|
|
deleteFile(fileUrl: string) {
|
|
return request<{ file_url: string }>("/api/app/appraisal/file/delete", {
|
|
method: "POST",
|
|
data: {
|
|
file_url: fileUrl,
|
|
},
|
|
});
|
|
},
|
|
};
|