From 2ad48143b7226af3ced7af2f460456ea6c580484 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E7=8F=91?= Date: Tue, 16 Sep 2025 11:38:29 +0800 Subject: [PATCH] =?UTF-8?q?Feature:=20=E5=A2=9E=E5=8A=A0=E4=B8=8A=E4=B8=8B?= =?UTF-8?q?=E6=9E=B6=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/config/config.local.ts | 4 +-- src/controller/webhook.controller.ts | 2 +- src/controller/wp_product.controller.ts | 33 +++++++++++++++++++++++-- src/service/logistics.service.ts | 8 +++--- src/service/wp.service.ts | 18 ++++++++++++++ src/service/wp_product.service.ts | 19 ++++++++++++-- 6 files changed, 73 insertions(+), 11 deletions(-) diff --git a/src/config/config.local.ts b/src/config/config.local.ts index dd83048..22747e7 100644 --- a/src/config/config.local.ts +++ b/src/config/config.local.ts @@ -37,9 +37,9 @@ export default { siteName: 'Admin', email: '444693295@qq.com', }, - { + { id: '2', - wpApiUrl: 'http://t1-shop.local/', + wpApiUrl: 'http://t2-shop.local/', consumerKey: 'ck_a369473a6451dbaec63d19cbfd74a074b2c5f742', consumerSecret: 'cs_0946bbbeea1bfefff08a69e817ac62a48412df8c', siteName: 'Local', diff --git a/src/controller/webhook.controller.ts b/src/controller/webhook.controller.ts index 1374678..9de29da 100644 --- a/src/controller/webhook.controller.ts +++ b/src/controller/webhook.controller.ts @@ -75,7 +75,7 @@ export class WebhookController { switch (topic) { case 'product.created': case 'product.updated': - const site = await this.wpProductService.geSite(siteId); + const site = await this.wpProductService.getSite(siteId); // 变体更新 if (body.type === 'variation') { const variation = await this.wpApiService.getVariation( diff --git a/src/controller/wp_product.controller.ts b/src/controller/wp_product.controller.ts index 04d64bf..e79f15e 100644 --- a/src/controller/wp_product.controller.ts +++ b/src/controller/wp_product.controller.ts @@ -7,6 +7,7 @@ import { Query, Put, Body, + Config, } from '@midwayjs/core'; import { WpProductService } from '../service/wp_product.service'; import { errorResponse, successResponse } from '../utils/response.util'; @@ -19,9 +20,21 @@ import { UpdateWpProductDTO, } from '../dto/wp_product.dto'; import { WPService } from '../service/wp.service'; +import { WpSite } from '../interface'; @Controller('/wp_product') export class WpProductController { + @Inject() + wpService: WPService; + + @Config('wpSite') + sites: WpSite[]; + + getSite(id: string): WpSite { + let idx = this.sites.findIndex(item => item.id === id); + return this.sites[idx]; + } + @Inject() private readonly wpProductService: WpProductService; @@ -73,6 +86,22 @@ export class WpProductController { } } + @ApiOkResponse({ + type: BooleanRes + }) + @Post('/updateState/:id') + async updateWPProductState( + @Param('id') id: number, + @Body() body: any, // todo + ) { + try { + await this.wpProductService.updateProductStatus(id, body?.status); + return successResponse(true); + } catch (error) { + return errorResponse(error.message); + } + } + /** * 更新产品接口 * @param productId 产品 ID @@ -96,7 +125,7 @@ export class WpProductController { if (isDuplicate) { return errorResponse('SKU已存在'); } - const site = await this.wpProductService.geSite(siteId); + const site = await this.wpProductService.getSite(siteId); const result = await this.wpApiService.updateProduct( site, productId, @@ -136,7 +165,7 @@ export class WpProductController { if (isDuplicate) { return errorResponse('SKU已存在'); } - const site = await this.wpProductService.geSite(siteId); + const site = await this.wpProductService.getSite(siteId); const result = await this.wpApiService.updateVariation( site, productId, diff --git a/src/service/logistics.service.ts b/src/service/logistics.service.ts index 721ce90..9f69895 100644 --- a/src/service/logistics.service.ts +++ b/src/service/logistics.service.ts @@ -85,7 +85,7 @@ export class LogisticsService { @Config('wpSite') sites: WpSite[]; - geSite(id: string): WpSite { + getSite(id: string): WpSite { let idx = this.sites.findIndex(item => item.id === id); return this.sites[idx]; } @@ -263,7 +263,7 @@ export class LogisticsService { try { // 同步订单状态到woocommerce - const site = await this.geSite(order.siteId); + const site = await this.getSite(order.siteId); if (order.status === OrderStatus.COMPLETED) { await this.wpService.updateOrder(site, order.externalOrderId, { status: OrderStatus.PROCESSING, @@ -367,7 +367,7 @@ export class LogisticsService { const tracking_provider = 'UniUni'; // todo: id未确定,后写进常数 // 同步物流信息到woocommerce - const site = await this.geSite(order.siteId); + const site = await this.getSite(order.siteId); const res = await this.wpService.createShipment(site, order.externalOrderId, { tracking_number: resShipmentOrder.data.tno, tracking_provider: tracking_provider, @@ -493,7 +493,7 @@ export class LogisticsService { const order = await this.orderModel.findOneBy({ id: orderShipment.order_id, }); - const site = this.geSite(order.siteId); + const site = this.getSite(order.siteId); await this.wpService.updateOrder(site, order.externalOrderId, { status: OrderStatus.COMPLETED, }); diff --git a/src/service/wp.service.ts b/src/service/wp.service.ts index 1c8c5a6..48734af 100644 --- a/src/service/wp.service.ts +++ b/src/service/wp.service.ts @@ -4,6 +4,7 @@ import { WpSite } from '../interface'; import { WpProduct } from '../entity/wp_product.entity'; import { Variation } from '../entity/variation.entity'; import { UpdateVariationDTO, UpdateWpProductDTO } from '../dto/wp_product.dto'; +import { ProductStatus } from '../enums/base.enum'; @Provide() export class WPService { @@ -222,6 +223,23 @@ export class WPService { }); } + /** + * 更新 WooCommerce 产品 上下架状态 + * @param productId 产品 ID + * @param status 状态 + */ + async updateProductStatus( + site: WpSite, + productId: string, + status: ProductStatus, + ): Promise { + const res = await this.updateData(`/wc/v3/products/${productId}`, site, { + status + }); + console.log('res', res); + return res; + } + /** * 更新 WooCommerce 产品变体 * @param productId 产品 ID diff --git a/src/service/wp_product.service.ts b/src/service/wp_product.service.ts index 8a9b658..e6335e8 100644 --- a/src/service/wp_product.service.ts +++ b/src/service/wp_product.service.ts @@ -11,6 +11,7 @@ import { UpdateWpProductDTO, } from '../dto/wp_product.dto'; import { Product } from '../entity/product.entty'; +import { ProductStatus } from '../enums/base.enum'; @Provide() export class WpProductService { @@ -26,7 +27,7 @@ export class WpProductService { @InjectEntityModel(Variation) variationModel: Repository; - geSite(id: string): WpSite { + getSite(id: string): WpSite { let idx = this.sites.findIndex(item => item.id === id); return this.sites[idx]; } @@ -45,7 +46,7 @@ export class WpProductService { } async syncSite(siteId: string) { - const site = this.geSite(siteId); + const site = this.getSite(siteId); const products = await this.wpApiService.getProducts(site); for (const product of products) { const variations = @@ -56,6 +57,20 @@ export class WpProductService { } } + // 控制产品上下架 + async updateProductStatus(id: number, status: ProductStatus) { + const wpProduct = await this.wpProductModel.findOneBy({ id }); + const site = await this.getSite(wpProduct.siteId); + wpProduct.status = status; + const res = await this.wpApiService.updateProductStatus(site, wpProduct.externalProductId, status); + if (res === true) { + this.wpProductModel.save(wpProduct); + return true; + } else { + return res; + } + } + async findProduct( siteId: string, externalProductId: string