Compare commits
2 Commits
8f6727ae75
...
89d7d78ccc
| Author | SHA1 | Date |
|---|---|---|
|
|
89d7d78ccc | |
|
|
e024d8752d |
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -7,7 +7,6 @@ import {
|
|||
CancelFulfillmentDTO,
|
||||
CreateReviewDTO,
|
||||
CreateWebhookDTO,
|
||||
FulfillmentDTO,
|
||||
UnifiedCustomerDTO,
|
||||
UnifiedCustomerPaginationDTO,
|
||||
UnifiedMediaPaginationDTO,
|
||||
|
|
@ -106,7 +105,7 @@ export class SiteApiController {
|
|||
this.logger.debug(`[Site API] 更新评论开始, siteId: ${siteId}, id: ${id}, body: ${JSON.stringify(body)}`);
|
||||
try {
|
||||
const adapter = await this.siteApiService.getAdapter(siteId);
|
||||
const data = await adapter.updateReview(id, body);
|
||||
const data = await adapter.updateReview({ id }, body);
|
||||
this.logger.debug(`[Site API] 更新评论成功, siteId: ${siteId}, id: ${id}`);
|
||||
return successResponse(data);
|
||||
} catch (error) {
|
||||
|
|
@ -124,7 +123,7 @@ export class SiteApiController {
|
|||
this.logger.debug(`[Site API] 删除评论开始, siteId: ${siteId}, id: ${id}`);
|
||||
try {
|
||||
const adapter = await this.siteApiService.getAdapter(siteId);
|
||||
const data = await adapter.deleteReview(id);
|
||||
const data = await adapter.deleteReview({ id });
|
||||
this.logger.debug(`[Site API] 删除评论成功, siteId: ${siteId}, id: ${id}`);
|
||||
return successResponse(data);
|
||||
} catch (error) {
|
||||
|
|
@ -160,7 +159,7 @@ export class SiteApiController {
|
|||
this.logger.debug(`[Site API] 获取单个webhook开始, siteId: ${siteId}, id: ${id}`);
|
||||
try {
|
||||
const adapter = await this.siteApiService.getAdapter(siteId);
|
||||
const data = await adapter.getWebhook(id);
|
||||
const data = await adapter.getWebhook({ id });
|
||||
this.logger.debug(`[Site API] 获取单个webhook成功, siteId: ${siteId}, id: ${id}`);
|
||||
return successResponse(data);
|
||||
} catch (error) {
|
||||
|
|
@ -199,7 +198,7 @@ export class SiteApiController {
|
|||
this.logger.debug(`[Site API] 更新webhook开始, siteId: ${siteId}, id: ${id}, body: ${JSON.stringify(body)}`);
|
||||
try {
|
||||
const adapter = await this.siteApiService.getAdapter(siteId);
|
||||
const data = await adapter.updateWebhook(id, body);
|
||||
const data = await adapter.updateWebhook({ id }, body);
|
||||
this.logger.debug(`[Site API] 更新webhook成功, siteId: ${siteId}, id: ${id}`);
|
||||
return successResponse(data);
|
||||
} catch (error) {
|
||||
|
|
@ -217,7 +216,7 @@ export class SiteApiController {
|
|||
this.logger.debug(`[Site API] 删除webhook开始, siteId: ${siteId}, id: ${id}`);
|
||||
try {
|
||||
const adapter = await this.siteApiService.getAdapter(siteId);
|
||||
const data = await adapter.deleteWebhook(id);
|
||||
const data = await adapter.deleteWebhook({ id });
|
||||
this.logger.debug(`[Site API] 删除webhook成功, siteId: ${siteId}, id: ${id}`);
|
||||
return successResponse(data);
|
||||
} catch (error) {
|
||||
|
|
@ -327,7 +326,7 @@ export class SiteApiController {
|
|||
if (site.type === 'woocommerce') {
|
||||
const page = query.page || 1;
|
||||
const perPage = (query.per_page) || 100;
|
||||
const res = await this.siteApiService.wpService.getProducts(site, page, perPage);
|
||||
const res = await this.siteApiService.wpService.getProducts(site, { page, per_page: perPage });
|
||||
const header = ['id', 'name', 'type', 'status', 'sku', 'regular_price', 'sale_price', 'stock_status', 'stock_quantity'];
|
||||
const rows = (res.items || []).map((p: any) => [p.id, p.name, p.type, p.status, p.sku, p.regular_price, p.sale_price, p.stock_status, p.stock_quantity]);
|
||||
const toCsvValue = (val: any) => {
|
||||
|
|
@ -360,7 +359,7 @@ export class SiteApiController {
|
|||
this.logger.info(`[Site API] 获取单个产品开始, siteId: ${siteId}, productId: ${id}`);
|
||||
try {
|
||||
const adapter = await this.siteApiService.getAdapter(siteId);
|
||||
const data = await adapter.getProduct(id);
|
||||
const data = await adapter.getProduct({ id });
|
||||
|
||||
// 如果获取到商品数据,则增强ERP产品信息
|
||||
if (data) {
|
||||
|
|
@ -485,7 +484,7 @@ export class SiteApiController {
|
|||
this.logger.info(`[Site API] 更新产品开始, siteId: ${siteId}, productId: ${id}`);
|
||||
try {
|
||||
const adapter = await this.siteApiService.getAdapter(siteId);
|
||||
const data = await adapter.updateProduct(id, body);
|
||||
const data = await adapter.updateProduct({ id }, body);
|
||||
this.logger.info(`[Site API] 更新产品成功, siteId: ${siteId}, productId: ${id}`);
|
||||
return successResponse(data);
|
||||
} catch (error) {
|
||||
|
|
@ -540,7 +539,7 @@ export class SiteApiController {
|
|||
this.logger.info(`[Site API] 删除产品开始, siteId: ${siteId}, productId: ${id}`);
|
||||
try {
|
||||
const adapter = await this.siteApiService.getAdapter(siteId);
|
||||
const success = await adapter.deleteProduct(id);
|
||||
const success = await adapter.deleteProduct({ id });
|
||||
this.logger.info(`[Site API] 删除产品成功, siteId: ${siteId}, productId: ${id}`);
|
||||
return successResponse(success);
|
||||
} catch (error) {
|
||||
|
|
@ -585,7 +584,7 @@ export class SiteApiController {
|
|||
for (const item of body.update) {
|
||||
try {
|
||||
const id = item.id;
|
||||
const data = await adapter.updateProduct(id, item);
|
||||
const data = await adapter.updateProduct({ id }, item);
|
||||
updated.push(data);
|
||||
} catch (e) {
|
||||
errors.push({
|
||||
|
|
@ -598,7 +597,7 @@ export class SiteApiController {
|
|||
if (body.delete?.length) {
|
||||
for (const id of body.delete) {
|
||||
try {
|
||||
const ok = await adapter.deleteProduct(id);
|
||||
const ok = await adapter.deleteProduct({ id });
|
||||
if (ok) deleted.push(id);
|
||||
else errors.push({
|
||||
identifier: String(id),
|
||||
|
|
@ -772,7 +771,7 @@ export class SiteApiController {
|
|||
this.logger.info(`[Site API] 获取单个订单开始, siteId: ${siteId}, orderId: ${id}`);
|
||||
try {
|
||||
const adapter = await this.siteApiService.getAdapter(siteId);
|
||||
const data = await adapter.getOrder(id);
|
||||
const data = await adapter.getOrder({ id });
|
||||
this.logger.info(`[Site API] 获取单个订单成功, siteId: ${siteId}, orderId: ${id}`);
|
||||
return successResponse(data);
|
||||
} catch (error) {
|
||||
|
|
@ -844,7 +843,7 @@ export class SiteApiController {
|
|||
this.logger.info(`[Site API] 更新订单开始, siteId: ${siteId}, orderId: ${id}`);
|
||||
try {
|
||||
const adapter = await this.siteApiService.getAdapter(siteId);
|
||||
const ok = await adapter.updateOrder(id, body);
|
||||
const ok = await adapter.updateOrder({ id }, body);
|
||||
this.logger.info(`[Site API] 更新订单成功, siteId: ${siteId}, orderId: ${id}`);
|
||||
return successResponse(ok);
|
||||
} catch (error) {
|
||||
|
|
@ -862,7 +861,7 @@ export class SiteApiController {
|
|||
this.logger.info(`[Site API] 删除订单开始, siteId: ${siteId}, orderId: ${id}`);
|
||||
try {
|
||||
const adapter = await this.siteApiService.getAdapter(siteId);
|
||||
const ok = await adapter.deleteOrder(id);
|
||||
const ok = await adapter.deleteOrder({ id });
|
||||
this.logger.info(`[Site API] 删除订单成功, siteId: ${siteId}, orderId: ${id}`);
|
||||
return successResponse(ok);
|
||||
} catch (error) {
|
||||
|
|
@ -902,7 +901,7 @@ export class SiteApiController {
|
|||
for (const item of body.update) {
|
||||
try {
|
||||
const id = item.id;
|
||||
const ok = await adapter.updateOrder(id, item);
|
||||
const ok = await adapter.updateOrder({ id }, item);
|
||||
if (ok) updated.push(item);
|
||||
else errors.push({
|
||||
identifier: String(item.id || 'unknown'),
|
||||
|
|
@ -919,7 +918,7 @@ export class SiteApiController {
|
|||
if (body.delete?.length) {
|
||||
for (const id of body.delete) {
|
||||
try {
|
||||
const ok = await adapter.deleteOrder(id);
|
||||
const ok = await adapter.deleteOrder({ id });
|
||||
if (ok) deleted.push(id);
|
||||
else errors.push({
|
||||
identifier: String(id),
|
||||
|
|
@ -986,25 +985,6 @@ export class SiteApiController {
|
|||
}
|
||||
}
|
||||
|
||||
@Post('/:siteId/orders/:id/fulfill')
|
||||
@ApiOkResponse({ type: Object })
|
||||
async fulfillOrder(
|
||||
@Param('siteId') siteId: number,
|
||||
@Param('id') id: string,
|
||||
@Body() body: FulfillmentDTO
|
||||
) {
|
||||
this.logger.info(`[Site API] 订单履约开始, siteId: ${siteId}, orderId: ${id}`);
|
||||
try {
|
||||
const adapter = await this.siteApiService.getAdapter(siteId);
|
||||
const data = await adapter.fulfillOrder(id, body);
|
||||
this.logger.info(`[Site API] 订单履约成功, siteId: ${siteId}, orderId: ${id}`);
|
||||
return successResponse(data);
|
||||
} catch (error) {
|
||||
this.logger.error(`[Site API] 订单履约失败, siteId: ${siteId}, orderId: ${id}, 错误信息: ${error.message}`);
|
||||
return errorResponse(error.message);
|
||||
}
|
||||
}
|
||||
|
||||
@Post('/:siteId/orders/:id/cancel-fulfill')
|
||||
@ApiOkResponse({ type: Object })
|
||||
async cancelFulfillment(
|
||||
|
|
@ -1455,7 +1435,7 @@ export class SiteApiController {
|
|||
this.logger.info(`[Site API] 获取单个客户开始, siteId: ${siteId}, customerId: ${id}`);
|
||||
try {
|
||||
const adapter = await this.siteApiService.getAdapter(siteId);
|
||||
const data = await adapter.getCustomer(id);
|
||||
const data = await adapter.getCustomer({ id });
|
||||
this.logger.info(`[Site API] 获取单个客户成功, siteId: ${siteId}, customerId: ${id}`);
|
||||
return successResponse(data);
|
||||
} catch (error) {
|
||||
|
|
@ -1527,7 +1507,7 @@ export class SiteApiController {
|
|||
this.logger.info(`[Site API] 更新客户开始, siteId: ${siteId}, customerId: ${id}`);
|
||||
try {
|
||||
const adapter = await this.siteApiService.getAdapter(siteId);
|
||||
const data = await adapter.updateCustomer(id, body);
|
||||
const data = await adapter.updateCustomer({ id }, body);
|
||||
this.logger.info(`[Site API] 更新客户成功, siteId: ${siteId}, customerId: ${id}`);
|
||||
return successResponse(data);
|
||||
} catch (error) {
|
||||
|
|
@ -1545,7 +1525,7 @@ export class SiteApiController {
|
|||
this.logger.info(`[Site API] 删除客户开始, siteId: ${siteId}, customerId: ${id}`);
|
||||
try {
|
||||
const adapter = await this.siteApiService.getAdapter(siteId);
|
||||
const success = await adapter.deleteCustomer(id);
|
||||
const success = await adapter.deleteCustomer({ id });
|
||||
this.logger.info(`[Site API] 删除客户成功, siteId: ${siteId}, customerId: ${id}`);
|
||||
return successResponse(success);
|
||||
} catch (error) {
|
||||
|
|
@ -1581,7 +1561,7 @@ export class SiteApiController {
|
|||
for (const item of body.update) {
|
||||
try {
|
||||
const id = item.id;
|
||||
const data = await adapter.updateCustomer(id, item);
|
||||
const data = await adapter.updateCustomer({ id }, item);
|
||||
updated.push(data);
|
||||
} catch (e) {
|
||||
failed.push({ action: 'update', item, error: (e as any).message });
|
||||
|
|
@ -1591,7 +1571,7 @@ export class SiteApiController {
|
|||
if (body.delete?.length) {
|
||||
for (const id of body.delete) {
|
||||
try {
|
||||
const ok = await adapter.deleteCustomer(id);
|
||||
const ok = await adapter.deleteCustomer({ id });
|
||||
if (ok) deleted.push(id);
|
||||
else failed.push({ action: 'delete', id, error: 'delete failed' });
|
||||
} catch (e) {
|
||||
|
|
|
|||
|
|
@ -20,50 +20,70 @@ import { UnifiedPaginationDTO, UnifiedSearchParamsDTO } from '../dto/api.dto';
|
|||
import { BatchOperationDTO, BatchOperationResultDTO } from '../dto/batch.dto';
|
||||
|
||||
export interface ISiteAdapter {
|
||||
// ========== 客户映射方法 ==========
|
||||
/**
|
||||
* 获取产品列表
|
||||
* 将平台客户数据转换为统一客户数据格式
|
||||
* @param data 平台特定客户数据
|
||||
* @returns 统一客户数据格式
|
||||
*/
|
||||
getProducts(params: UnifiedSearchParamsDTO): Promise<UnifiedPaginationDTO<UnifiedProductDTO>>;
|
||||
mapPlatformToUnifiedCustomer(data: any): UnifiedCustomerDTO;
|
||||
|
||||
/**
|
||||
* 获取所有产品
|
||||
* 将统一客户数据格式转换为平台客户数据
|
||||
* @param data 统一客户数据格式
|
||||
* @returns 平台特定客户数据
|
||||
*/
|
||||
getAllProducts(params?: UnifiedSearchParamsDTO): Promise<UnifiedProductDTO[]>;
|
||||
mapUnifiedToPlatformCustomer(data: Partial<UnifiedCustomerDTO>): any;
|
||||
|
||||
/**
|
||||
* 获取单个产品
|
||||
* 获取单个客户
|
||||
*/
|
||||
getProduct(id: string | number): Promise<UnifiedProductDTO>;
|
||||
getCustomer(where: Partial<Pick<UnifiedCustomerDTO, 'id' | 'email' | 'phone'>>): Promise<UnifiedCustomerDTO>;
|
||||
|
||||
/**
|
||||
* 获取订单列表
|
||||
* 获取客户列表
|
||||
*/
|
||||
getOrders(params: UnifiedSearchParamsDTO): Promise<UnifiedPaginationDTO<UnifiedOrderDTO>>;
|
||||
getCustomers(params: UnifiedSearchParamsDTO): Promise<UnifiedPaginationDTO<UnifiedCustomerDTO>>;
|
||||
|
||||
/**
|
||||
* 获取订单总数
|
||||
* 获取所有客户
|
||||
*/
|
||||
countOrders(params: Record<string,any>): Promise<number>;
|
||||
getAllCustomers(params?: UnifiedSearchParamsDTO): Promise<UnifiedCustomerDTO[]>;
|
||||
|
||||
/**
|
||||
* 获取所有订单
|
||||
* 创建客户
|
||||
*/
|
||||
getAllOrders(params?: UnifiedSearchParamsDTO): Promise<UnifiedOrderDTO[]>;
|
||||
createCustomer(data: Partial<UnifiedCustomerDTO>): Promise<UnifiedCustomerDTO>;
|
||||
|
||||
/**
|
||||
* 获取单个订单
|
||||
* 更新客户
|
||||
*/
|
||||
getOrder(id: string | number): Promise<UnifiedOrderDTO>;
|
||||
updateCustomer(where: Partial<Pick<UnifiedCustomerDTO, 'id' | 'email' | 'phone'>>, data: Partial<UnifiedCustomerDTO>): Promise<UnifiedCustomerDTO>;
|
||||
|
||||
/**
|
||||
* 获取订阅列表
|
||||
* 删除客户
|
||||
*/
|
||||
getSubscriptions(params: UnifiedSearchParamsDTO): Promise<UnifiedPaginationDTO<UnifiedSubscriptionDTO>>;
|
||||
deleteCustomer(where: Partial<Pick<UnifiedCustomerDTO, 'id' | 'email' | 'phone'>>): Promise<boolean>;
|
||||
|
||||
/**
|
||||
* 获取所有订阅
|
||||
* 批量处理客户
|
||||
*/
|
||||
getAllSubscriptions(params?: UnifiedSearchParamsDTO): Promise<UnifiedSubscriptionDTO[]>;
|
||||
batchProcessCustomers?(data: BatchOperationDTO): Promise<BatchOperationResultDTO>;
|
||||
|
||||
// ========== 媒体映射方法 ==========
|
||||
/**
|
||||
* 将平台媒体数据转换为统一媒体数据格式
|
||||
* @param data 平台特定媒体数据
|
||||
* @returns 统一媒体数据格式
|
||||
*/
|
||||
mapPlatformToUnifiedMedia(data: any): UnifiedMediaDTO;
|
||||
|
||||
/**
|
||||
* 将统一媒体数据格式转换为平台媒体数据
|
||||
* @param data 统一媒体数据格式
|
||||
* @returns 平台特定媒体数据
|
||||
*/
|
||||
mapUnifiedToPlatformMedia(data: Partial<UnifiedMediaDTO>): any;
|
||||
|
||||
/**
|
||||
* 获取媒体列表
|
||||
|
|
@ -80,75 +100,69 @@ export interface ISiteAdapter {
|
|||
*/
|
||||
createMedia(file: any): Promise<UnifiedMediaDTO>;
|
||||
|
||||
// ========== 订单映射方法 ==========
|
||||
/**
|
||||
* 获取评论列表
|
||||
* 将平台订单数据转换为统一订单数据格式
|
||||
* @param data 平台特定订单数据
|
||||
* @returns 统一订单数据格式
|
||||
*/
|
||||
getReviews(params: UnifiedSearchParamsDTO): Promise<UnifiedPaginationDTO<UnifiedReviewDTO>>;
|
||||
mapPlatformToUnifiedOrder(data: any): UnifiedOrderDTO;
|
||||
|
||||
/**
|
||||
* 获取所有评论
|
||||
* 将统一订单数据格式转换为平台订单数据
|
||||
* @param data 统一订单数据格式
|
||||
* @returns 平台特定订单数据
|
||||
*/
|
||||
getAllReviews(params?: UnifiedSearchParamsDTO): Promise<UnifiedReviewDTO[]>;
|
||||
mapUnifiedToPlatformOrder(data: Partial<UnifiedOrderDTO>): any;
|
||||
|
||||
/**
|
||||
* 创建评论
|
||||
* 将统一订单创建参数转换为平台订单创建参数
|
||||
* @param data 统一订单创建参数
|
||||
* @returns 平台订单创建参数
|
||||
*/
|
||||
createReview(data: CreateReviewDTO): Promise<UnifiedReviewDTO>;
|
||||
mapCreateOrderParams(data: Partial<UnifiedOrderDTO>): any;
|
||||
|
||||
/**
|
||||
* 更新评论
|
||||
* 将统一订单更新参数转换为平台订单更新参数
|
||||
* @param data 统一订单更新参数
|
||||
* @returns 平台订单更新参数
|
||||
*/
|
||||
updateReview(id: number, data: UpdateReviewDTO): Promise<UnifiedReviewDTO>;
|
||||
mapUpdateOrderParams(data: Partial<UnifiedOrderDTO>): any;
|
||||
|
||||
/**
|
||||
* 删除评论
|
||||
* 获取单个订单
|
||||
*/
|
||||
deleteReview(id: number): Promise<boolean>;
|
||||
getOrder(where: Partial<Pick<UnifiedOrderDTO, 'id'>>): Promise<UnifiedOrderDTO>;
|
||||
|
||||
/**
|
||||
* 创建产品
|
||||
* 获取订单列表
|
||||
*/
|
||||
createProduct(data: Partial<UnifiedProductDTO>): Promise<UnifiedProductDTO>;
|
||||
getOrders(params: UnifiedSearchParamsDTO): Promise<UnifiedPaginationDTO<UnifiedOrderDTO>>;
|
||||
|
||||
/**
|
||||
* 更新产品
|
||||
* 获取所有订单
|
||||
*/
|
||||
updateProduct(id: string | number, data: Partial<UnifiedProductDTO>): Promise<boolean>;
|
||||
getAllOrders(params?: UnifiedSearchParamsDTO): Promise<UnifiedOrderDTO[]>;
|
||||
|
||||
/**
|
||||
* 删除产品
|
||||
* 获取订单总数
|
||||
*/
|
||||
deleteProduct(id: string | number): Promise<boolean>;
|
||||
countOrders(params: Record<string, any>): Promise<number>;
|
||||
|
||||
/**
|
||||
* 获取产品变体列表
|
||||
* 创建订单
|
||||
*/
|
||||
getVariations(productId: string | number, params: UnifiedSearchParamsDTO): Promise<UnifiedVariationPaginationDTO>;
|
||||
createOrder(data: Partial<UnifiedOrderDTO>): Promise<UnifiedOrderDTO>;
|
||||
|
||||
/**
|
||||
* 获取所有产品变体
|
||||
* 更新订单
|
||||
*/
|
||||
getAllVariations(productId: string | number, params?: UnifiedSearchParamsDTO): Promise<UnifiedProductVariationDTO[]>;
|
||||
updateOrder(where: Partial<Pick<UnifiedOrderDTO, 'id'>>, data: Partial<UnifiedOrderDTO>): Promise<boolean>;
|
||||
|
||||
/**
|
||||
* 获取单个产品变体
|
||||
* 删除订单
|
||||
*/
|
||||
getVariation(productId: string | number, variationId: string | number): Promise<UnifiedProductVariationDTO>;
|
||||
|
||||
/**
|
||||
* 创建产品变体
|
||||
*/
|
||||
createVariation(productId: string | number, data: CreateVariationDTO): Promise<UnifiedProductVariationDTO>;
|
||||
|
||||
/**
|
||||
* 更新产品变体
|
||||
*/
|
||||
updateVariation(productId: string | number, variationId: string | number, data: UpdateVariationDTO): Promise<UnifiedProductVariationDTO>;
|
||||
|
||||
/**
|
||||
* 删除产品变体
|
||||
*/
|
||||
deleteVariation(productId: string | number, variationId: string | number): Promise<boolean>;
|
||||
deleteOrder(where: Partial<Pick<UnifiedOrderDTO, 'id'>>): Promise<boolean>;
|
||||
|
||||
/**
|
||||
* 获取订单备注
|
||||
|
|
@ -160,71 +174,6 @@ export interface ISiteAdapter {
|
|||
*/
|
||||
createOrderNote(orderId: string | number, data: any): Promise<any>;
|
||||
|
||||
batchProcessProducts?(data: BatchOperationDTO): Promise<BatchOperationResultDTO>;
|
||||
|
||||
createOrder(data: Partial<UnifiedOrderDTO>): Promise<UnifiedOrderDTO>;
|
||||
updateOrder(id: string | number, data: Partial<UnifiedOrderDTO>): Promise<boolean>;
|
||||
deleteOrder(id: string | number): Promise<boolean>;
|
||||
|
||||
batchProcessOrders?(data: BatchOperationDTO): Promise<BatchOperationResultDTO>;
|
||||
|
||||
getCustomers(params: UnifiedSearchParamsDTO): Promise<UnifiedPaginationDTO<UnifiedCustomerDTO>>;
|
||||
getAllCustomers(params?: UnifiedSearchParamsDTO): Promise<UnifiedCustomerDTO[]>;
|
||||
getCustomer(id: string | number): Promise<UnifiedCustomerDTO>;
|
||||
createCustomer(data: Partial<UnifiedCustomerDTO>): Promise<UnifiedCustomerDTO>;
|
||||
updateCustomer(id: string | number, data: Partial<UnifiedCustomerDTO>): Promise<UnifiedCustomerDTO>;
|
||||
deleteCustomer(id: string | number): Promise<boolean>;
|
||||
|
||||
batchProcessCustomers?(data: BatchOperationDTO): Promise<BatchOperationResultDTO>;
|
||||
|
||||
/**
|
||||
* 获取webhooks列表
|
||||
*/
|
||||
getWebhooks(params: UnifiedSearchParamsDTO): Promise<UnifiedWebhookPaginationDTO>;
|
||||
|
||||
/**
|
||||
* 获取所有webhooks
|
||||
*/
|
||||
getAllWebhooks(params?: UnifiedSearchParamsDTO): Promise<UnifiedWebhookDTO[]>;
|
||||
|
||||
/**
|
||||
* 获取单个webhook
|
||||
*/
|
||||
getWebhook(id: string | number): Promise<UnifiedWebhookDTO>;
|
||||
|
||||
/**
|
||||
* 创建webhook
|
||||
*/
|
||||
createWebhook(data: CreateWebhookDTO): Promise<UnifiedWebhookDTO>;
|
||||
|
||||
/**
|
||||
* 更新webhook
|
||||
*/
|
||||
updateWebhook(id: string | number, data: UpdateWebhookDTO): Promise<UnifiedWebhookDTO>;
|
||||
|
||||
/**
|
||||
* 删除webhook
|
||||
*/
|
||||
deleteWebhook(id: string | number): Promise<boolean>;
|
||||
|
||||
/**
|
||||
* 获取站点链接列表
|
||||
*/
|
||||
getLinks(): Promise<Array<{title: string, url: string}>>;
|
||||
|
||||
/**
|
||||
* 订单履行(发货)
|
||||
*/
|
||||
fulfillOrder(orderId: string | number, data: {
|
||||
tracking_number?: string;
|
||||
shipping_provider?: string;
|
||||
shipping_method?: string;
|
||||
items?: Array<{
|
||||
order_item_id: number;
|
||||
quantity: number;
|
||||
}>;
|
||||
}): Promise<any>;
|
||||
|
||||
/**
|
||||
* 取消订单履行
|
||||
*/
|
||||
|
|
@ -272,4 +221,276 @@ export interface ISiteAdapter {
|
|||
* 删除订单履行信息
|
||||
*/
|
||||
deleteOrderFulfillment(orderId: string | number, fulfillmentId: string): Promise<boolean>;
|
||||
|
||||
/**
|
||||
* 批量处理订单
|
||||
*/
|
||||
batchProcessOrders?(data: BatchOperationDTO): Promise<BatchOperationResultDTO>;
|
||||
|
||||
// ========== 产品映射方法 ==========
|
||||
/**
|
||||
* 将平台产品数据转换为统一产品数据格式
|
||||
* @param data 平台特定产品数据
|
||||
* @returns 统一产品数据格式
|
||||
*/
|
||||
mapPlatformToUnifiedProduct(data: any): UnifiedProductDTO;
|
||||
|
||||
/**
|
||||
* 将统一产品数据格式转换为平台产品数据
|
||||
* @param data 统一产品数据格式
|
||||
* @returns 平台特定产品数据
|
||||
*/
|
||||
mapUnifiedToPlatformProduct(data: Partial<UnifiedProductDTO>): any;
|
||||
|
||||
/**
|
||||
* 将统一产品创建参数转换为平台产品创建参数
|
||||
* @param data 统一产品创建参数
|
||||
* @returns 平台产品创建参数
|
||||
*/
|
||||
mapCreateProductParams(data: Partial<UnifiedProductDTO>): any;
|
||||
|
||||
/**
|
||||
* 将统一产品更新参数转换为平台产品更新参数
|
||||
* @param data 统一产品更新参数
|
||||
* @returns 平台产品更新参数
|
||||
*/
|
||||
mapUpdateProductParams(data: Partial<UnifiedProductDTO>): any;
|
||||
|
||||
/**
|
||||
* 获取单个产品
|
||||
*/
|
||||
getProduct(where: Partial<Pick<UnifiedProductDTO, 'id' | 'sku'>>): Promise<UnifiedProductDTO>;
|
||||
|
||||
/**
|
||||
* 获取产品列表
|
||||
*/
|
||||
getProducts(params: UnifiedSearchParamsDTO): Promise<UnifiedPaginationDTO<UnifiedProductDTO>>;
|
||||
|
||||
/**
|
||||
* 获取所有产品
|
||||
*/
|
||||
getAllProducts(params?: UnifiedSearchParamsDTO): Promise<UnifiedProductDTO[]>;
|
||||
|
||||
/**
|
||||
* 创建产品
|
||||
*/
|
||||
createProduct(data: Partial<UnifiedProductDTO>): Promise<UnifiedProductDTO>;
|
||||
|
||||
/**
|
||||
* 更新产品
|
||||
*/
|
||||
updateProduct(where: Partial<Pick<UnifiedProductDTO, 'id' | 'sku'>>, data: Partial<UnifiedProductDTO>): Promise<boolean>;
|
||||
|
||||
/**
|
||||
* 删除产品
|
||||
*/
|
||||
deleteProduct(where: Partial<Pick<UnifiedProductDTO, 'id' | 'sku'>>): Promise<boolean>;
|
||||
|
||||
/**
|
||||
* 批量处理产品
|
||||
*/
|
||||
batchProcessProducts?(data: BatchOperationDTO): Promise<BatchOperationResultDTO>;
|
||||
|
||||
// ========== 评论映射方法 ==========
|
||||
/**
|
||||
* 将平台评论数据转换为统一评论数据格式
|
||||
* @param data 平台特定评论数据
|
||||
* @returns 统一评论数据格式
|
||||
*/
|
||||
mapPlatformToUnifiedReview(data: any): UnifiedReviewDTO;
|
||||
|
||||
/**
|
||||
* 将统一评论数据格式转换为平台评论数据
|
||||
* @param data 统一评论数据格式
|
||||
* @returns 平台特定评论数据
|
||||
*/
|
||||
mapUnifiedToPlatformReview(data: Partial<UnifiedReviewDTO>): any;
|
||||
|
||||
/**
|
||||
* 将统一评论创建参数转换为平台评论创建参数
|
||||
* @param data 统一评论创建参数
|
||||
* @returns 平台评论创建参数
|
||||
*/
|
||||
mapCreateReviewParams(data: CreateReviewDTO): any;
|
||||
|
||||
/**
|
||||
* 将统一评论更新参数转换为平台评论更新参数
|
||||
* @param data 统一评论更新参数
|
||||
* @returns 平台评论更新参数
|
||||
*/
|
||||
mapUpdateReviewParams(data: UpdateReviewDTO): any;
|
||||
|
||||
/**
|
||||
* 获取评论列表
|
||||
*/
|
||||
getReviews(params: UnifiedSearchParamsDTO): Promise<UnifiedPaginationDTO<UnifiedReviewDTO>>;
|
||||
|
||||
/**
|
||||
* 获取所有评论
|
||||
*/
|
||||
getAllReviews(params?: UnifiedSearchParamsDTO): Promise<UnifiedReviewDTO[]>;
|
||||
|
||||
/**
|
||||
* 创建评论
|
||||
*/
|
||||
createReview(data: CreateReviewDTO): Promise<UnifiedReviewDTO>;
|
||||
|
||||
/**
|
||||
* 更新评论
|
||||
*/
|
||||
updateReview(where: Partial<Pick<UnifiedReviewDTO, 'id'>>, data: UpdateReviewDTO): Promise<UnifiedReviewDTO>;
|
||||
|
||||
/**
|
||||
* 删除评论
|
||||
*/
|
||||
deleteReview(where: Partial<Pick<UnifiedReviewDTO, 'id'>>): Promise<boolean>;
|
||||
|
||||
// ========== 订阅映射方法 ==========
|
||||
/**
|
||||
* 将平台订阅数据转换为统一订阅数据格式
|
||||
* @param data 平台特定订阅数据
|
||||
* @returns 统一订阅数据格式
|
||||
*/
|
||||
mapPlatformToUnifiedSubscription(data: any): UnifiedSubscriptionDTO;
|
||||
|
||||
/**
|
||||
* 将统一订阅数据格式转换为平台订阅数据
|
||||
* @param data 统一订阅数据格式
|
||||
* @returns 平台特定订阅数据
|
||||
*/
|
||||
mapUnifiedToPlatformSubscription(data: Partial<UnifiedSubscriptionDTO>): any;
|
||||
|
||||
/**
|
||||
* 获取订阅列表
|
||||
*/
|
||||
getSubscriptions(params: UnifiedSearchParamsDTO): Promise<UnifiedPaginationDTO<UnifiedSubscriptionDTO>>;
|
||||
|
||||
/**
|
||||
* 获取所有订阅
|
||||
*/
|
||||
getAllSubscriptions(params?: UnifiedSearchParamsDTO): Promise<UnifiedSubscriptionDTO[]>;
|
||||
|
||||
// ========== 产品变体映射方法 ==========
|
||||
/**
|
||||
* 将平台产品变体数据转换为统一产品变体数据格式
|
||||
* @param data 平台特定产品变体数据
|
||||
* @returns 统一产品变体数据格式
|
||||
*/
|
||||
mapPlatformToUnifiedVariation(data: any): UnifiedProductVariationDTO;
|
||||
|
||||
/**
|
||||
* 将统一产品变体数据格式转换为平台产品变体数据
|
||||
* @param data 统一产品变体数据格式
|
||||
* @returns 平台特定产品变体数据
|
||||
*/
|
||||
mapUnifiedToPlatformVariation(data: Partial<UnifiedProductVariationDTO>): any;
|
||||
|
||||
/**
|
||||
* 将统一产品变体创建参数转换为平台产品变体创建参数
|
||||
* @param data 统一产品变体创建参数
|
||||
* @returns 平台产品变体创建参数
|
||||
*/
|
||||
mapCreateVariationParams(data: CreateVariationDTO): any;
|
||||
|
||||
/**
|
||||
* 将统一产品变体更新参数转换为平台产品变体更新参数
|
||||
* @param data 统一产品变体更新参数
|
||||
* @returns 平台产品变体更新参数
|
||||
*/
|
||||
mapUpdateVariationParams(data: UpdateVariationDTO): any;
|
||||
|
||||
/**
|
||||
* 获取单个产品变体
|
||||
*/
|
||||
getVariation(productId: string | number, variationId: string | number): Promise<UnifiedProductVariationDTO>;
|
||||
|
||||
/**
|
||||
* 获取产品变体列表
|
||||
*/
|
||||
getVariations(productId: string | number, params: UnifiedSearchParamsDTO): Promise<UnifiedVariationPaginationDTO>;
|
||||
|
||||
/**
|
||||
* 获取所有产品变体
|
||||
*/
|
||||
getAllVariations(productId: string | number, params?: UnifiedSearchParamsDTO): Promise<UnifiedProductVariationDTO[]>;
|
||||
|
||||
/**
|
||||
* 创建产品变体
|
||||
*/
|
||||
createVariation(productId: string | number, data: CreateVariationDTO): Promise<UnifiedProductVariationDTO>;
|
||||
|
||||
/**
|
||||
* 更新产品变体
|
||||
*/
|
||||
updateVariation(productId: string | number, variationId: string | number, data: UpdateVariationDTO): Promise<UnifiedProductVariationDTO>;
|
||||
|
||||
/**
|
||||
* 删除产品变体
|
||||
*/
|
||||
deleteVariation(productId: string | number, variationId: string | number): Promise<boolean>;
|
||||
|
||||
// ========== Webhook映射方法 ==========
|
||||
/**
|
||||
* 将平台Webhook数据转换为统一Webhook数据格式
|
||||
* @param data 平台特定Webhook数据
|
||||
* @returns 统一Webhook数据格式
|
||||
*/
|
||||
mapPlatformToUnifiedWebhook(data: any): UnifiedWebhookDTO;
|
||||
|
||||
/**
|
||||
* 将统一Webhook数据格式转换为平台Webhook数据
|
||||
* @param data 统一Webhook数据格式
|
||||
* @returns 平台特定Webhook数据
|
||||
*/
|
||||
mapUnifiedToPlatformWebhook(data: Partial<UnifiedWebhookDTO>): any;
|
||||
|
||||
/**
|
||||
* 将统一Webhook创建参数转换为平台Webhook创建参数
|
||||
* @param data 统一Webhook创建参数
|
||||
* @returns 平台Webhook创建参数
|
||||
*/
|
||||
mapCreateWebhookParams(data: CreateWebhookDTO): any;
|
||||
|
||||
/**
|
||||
* 将统一Webhook更新参数转换为平台Webhook更新参数
|
||||
* @param data 统一Webhook更新参数
|
||||
* @returns 平台Webhook更新参数
|
||||
*/
|
||||
mapUpdateWebhookParams(data: UpdateWebhookDTO): any;
|
||||
|
||||
/**
|
||||
* 获取单个webhook
|
||||
*/
|
||||
getWebhook(where: Partial<Pick<UnifiedWebhookDTO, 'id'>>): Promise<UnifiedWebhookDTO>;
|
||||
|
||||
/**
|
||||
* 获取webhooks列表
|
||||
*/
|
||||
getWebhooks(params: UnifiedSearchParamsDTO): Promise<UnifiedWebhookPaginationDTO>;
|
||||
|
||||
/**
|
||||
* 获取所有webhooks
|
||||
*/
|
||||
getAllWebhooks(params?: UnifiedSearchParamsDTO): Promise<UnifiedWebhookDTO[]>;
|
||||
|
||||
/**
|
||||
* 创建webhook
|
||||
*/
|
||||
createWebhook(data: CreateWebhookDTO): Promise<UnifiedWebhookDTO>;
|
||||
|
||||
/**
|
||||
* 更新webhook
|
||||
*/
|
||||
updateWebhook(where: Partial<Pick<UnifiedWebhookDTO, 'id'>>, data: UpdateWebhookDTO): Promise<UnifiedWebhookDTO>;
|
||||
|
||||
/**
|
||||
* 删除webhook
|
||||
*/
|
||||
deleteWebhook(where: Partial<Pick<UnifiedWebhookDTO, 'id'>>): Promise<boolean>;
|
||||
|
||||
// ========== 站点/其他方法 ==========
|
||||
/**
|
||||
* 获取站点链接列表
|
||||
*/
|
||||
getLinks(): Promise<Array<{ title: string, url: string }>>;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -202,7 +202,7 @@ export class OrderService {
|
|||
try {
|
||||
// 调用 WooCommerce API 获取订单
|
||||
const adapter = await this.siteApiService.getAdapter(siteId);
|
||||
const order = await adapter.getOrder(orderId);
|
||||
const order = await adapter.getOrder({ id: orderId });
|
||||
|
||||
// 检查订单是否已存在,以区分创建和更新
|
||||
const existingOrder = await this.orderModel.findOne({
|
||||
|
|
|
|||
|
|
@ -110,36 +110,22 @@ export class SiteApiService {
|
|||
const adapter = await this.getAdapter(siteId);
|
||||
|
||||
// 首先尝试查找产品
|
||||
if (product.id) {
|
||||
try {
|
||||
// 尝试获取产品以确认它是否存在
|
||||
const existingProduct = await adapter.getProduct(product.id);
|
||||
if (existingProduct) {
|
||||
// 产品存在,执行更新
|
||||
return await adapter.updateProduct(product.id, product);
|
||||
}
|
||||
} catch (error) {
|
||||
// 如果获取产品失败,可能是因为产品不存在,继续执行创建逻辑
|
||||
console.log(`产品 ${product.id} 不存在,将创建新产品:`, error.message);
|
||||
}
|
||||
} else if (product.sku) {
|
||||
if (product.sku) {
|
||||
// 如果没有提供ID但提供了SKU,尝试通过SKU查找产品
|
||||
try {
|
||||
// 尝试搜索具有相同SKU的产品
|
||||
const searchResult = await adapter.getProducts({ where: { sku: product.sku } });
|
||||
if (searchResult.items && searchResult.items.length > 0) {
|
||||
const existingProduct = searchResult.items[0];
|
||||
const existingProduct = await adapter.getProduct( { sku: product.sku });
|
||||
if (existingProduct) {
|
||||
// 找到现有产品,更新它
|
||||
return await adapter.updateProduct(existingProduct.id, product);
|
||||
return await adapter.updateProduct({ id: existingProduct.id }, product);
|
||||
}
|
||||
// 产品不存在,执行创建
|
||||
return await adapter.createProduct(product);
|
||||
} catch (error) {
|
||||
// 搜索失败,继续执行创建逻辑
|
||||
console.log(`通过SKU搜索产品失败:`, error.message);
|
||||
}
|
||||
}
|
||||
|
||||
// 产品不存在,执行创建
|
||||
return await adapter.createProduct(product);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -197,7 +183,7 @@ export class SiteApiService {
|
|||
*/
|
||||
async getProductFromSite(siteId: number, productId: string | number): Promise<any> {
|
||||
const adapter = await this.getAdapter(siteId);
|
||||
return await adapter.getProduct(productId);
|
||||
return await adapter.getProduct({ id: productId });
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -240,9 +240,11 @@ export class WPService implements IPlatformService {
|
|||
return allData;
|
||||
}
|
||||
|
||||
async getProducts(site: any, page: number = 1, pageSize: number = 100): Promise<any> {
|
||||
async getProducts(site: any, params: Record<string, any> = {}): Promise<any> {
|
||||
const api = this.createApi(site, 'wc/v3');
|
||||
return await this.sdkGetPage<WooProduct>(api, 'products', { page, per_page: pageSize });
|
||||
const page = params.page ?? 1;
|
||||
const per_page = params.per_page ?? params.pageSize ?? 100;
|
||||
return await this.sdkGetPage<WooProduct>(api, 'products', { ...params, page, per_page });
|
||||
}
|
||||
|
||||
async getProduct(site: any, id: number): Promise<any> {
|
||||
|
|
@ -254,7 +256,7 @@ export class WPService implements IPlatformService {
|
|||
|
||||
// 导出 WooCommerce 产品为特殊CSV(平台特性)
|
||||
async exportProductsCsvSpecial(site: any, page: number = 1, pageSize: number = 100): Promise<string> {
|
||||
const list = await this.getProducts(site, page, pageSize);
|
||||
const list = await this.getProducts(site, { page, per_page: pageSize });
|
||||
const header = ['id','name','type','status','sku','regular_price','sale_price','stock_status','stock_quantity'];
|
||||
const rows = (list.items || []).map((p: any) => [p.id,p.name,p.type,p.status,p.sku,p.regular_price,p.sale_price,p.stock_status,p.stock_quantity]);
|
||||
const csv = [header.join(','), ...rows.map(r => r.map(v => String(v ?? '')).join(','))].join('\n');
|
||||
|
|
|
|||
|
|
@ -0,0 +1 @@
|
|||
// 从 unified 到 数据库需要有个转换流程
|
||||
|
|
@ -0,0 +1 @@
|
|||
// 文件转换
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
import { UnifiedOrderDTO } from "../dto/site-api.dto";
|
||||
|
||||
export class ShipmentAdapter {
|
||||
// 用于导出物流需要的数据
|
||||
mapFromOrder(order: UnifiedOrderDTO): any {
|
||||
return order;
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue