diff --git a/src/controller/webhook.controller.ts b/src/controller/webhook.controller.ts index 9de29da..76714c5 100644 --- a/src/controller/webhook.controller.ts +++ b/src/controller/webhook.controller.ts @@ -75,7 +75,6 @@ export class WebhookController { switch (topic) { case 'product.created': case 'product.updated': - const site = await this.wpProductService.getSite(siteId); // 变体更新 if (body.type === 'variation') { const variation = await this.wpApiService.getVariation( diff --git a/src/entity/variation.entity.ts b/src/entity/variation.entity.ts index d35c6e2..7550bb5 100644 --- a/src/entity/variation.entity.ts +++ b/src/entity/variation.entity.ts @@ -80,6 +80,10 @@ export class Variation { @Column({ nullable: true, type: Boolean }) on_sale: boolean; // 是否促销中 + @ApiProperty({ description: '是否删除', type: Boolean }) + @Column({ nullable: true, type: Boolean , default: false }) + on_delete: boolean; // 是否删除 + @Column({ type: 'json', nullable: true }) attributes: Record; // 变体的属性 diff --git a/src/entity/wp_product.entity.ts b/src/entity/wp_product.entity.ts index a2b2fb6..3cabe1c 100644 --- a/src/entity/wp_product.entity.ts +++ b/src/entity/wp_product.entity.ts @@ -77,6 +77,11 @@ export class WpProduct { @Column({ nullable: true, type: Boolean }) on_sale: boolean; // 是否促销中 + @ApiProperty({ description: '是否删除', type: Boolean }) + @Column({ nullable: true, type: Boolean , default: false }) + on_delete: boolean; // 是否删除 + + @ApiProperty({ description: '产品类型', enum: ProductType, @@ -84,6 +89,7 @@ export class WpProduct { @Column({ type: 'enum', enum: ProductType }) type: ProductType; + @Column({ type: 'json', nullable: true }) metadata: Record; // 产品的其他扩展字段 diff --git a/src/service/wp_product.service.ts b/src/service/wp_product.service.ts index fd08046..92c950e 100644 --- a/src/service/wp_product.service.ts +++ b/src/service/wp_product.service.ts @@ -1,3 +1,4 @@ +import { Product } from './../entity/product.entty'; import { Config, Inject, Provide } from '@midwayjs/core'; import { WPService } from './wp.service'; import { WpSite } from '../interface'; @@ -10,7 +11,6 @@ import { UpdateVariationDTO, UpdateWpProductDTO, } from '../dto/wp_product.dto'; -import { Product } from '../entity/product.entty'; import { ProductStatus, ProductStockStatus } from '../enums/base.enum'; @Provide() @@ -47,14 +47,45 @@ export class WpProductService { async syncSite(siteId: string) { const site = this.getSite(siteId); + const externalProductIds = this.wpProductModel.createQueryBuilder('wp_product') + .select([ + 'wp_product.id ', + 'wp_product.externalProductId ', + ]) + .where('wp_product.siteId = :siteIds ', { + siteIds: siteId, + }) + const rawResult = await externalProductIds.getRawMany(); + + const externalIds = rawResult.map(item => item.externalProductId); + +const excludeValues = []; + const products = await this.wpApiService.getProducts(site); for (const product of products) { - const variations = + excludeValues.push(String(product.id)); + const variations = product.type === 'variable' ? await this.wpApiService.getVariations(site, product.id) : []; + await this.syncProductAndVariations(site.id, product, variations); } + + const filteredIds = externalIds.filter(id => !excludeValues.includes(id)); + if(filteredIds.length!=0){ + await this.variationModel.createQueryBuilder('variation') + .update() + .set({ on_delete: true }) + .where(" variation.externalProductId in (:...filteredId) ",{filteredId:filteredIds}) + .execute(); + + this.wpProductModel.createQueryBuilder('wp_product') + .update() + .set({ on_delete: true }) + .where(" wp_product.externalProductId in (:...filteredId) ",{filteredId:filteredIds}) + .execute(); +} } // 控制产品上下架 @@ -279,6 +310,8 @@ export class WpProductService { if (status) { where.status = status; } + where.on_delete = false; + const products = await this.wpProductModel.find({ where, skip: (current - 1) * pageSize, @@ -325,7 +358,7 @@ export class WpProductService { 'product.name as product_name', // 关联查询返回 product.name 'variation_product.name as variation_product_name', // 关联查询返回 variation 的产品 name ]) - .where('wp_product.id IN (:...ids)', { + .where('wp_product.id IN (:...ids) AND wp_product.on_delete = false ', { ids: products.map(product => product.id), }); @@ -457,7 +490,21 @@ export class WpProductService { where: { siteId, externalProductId: productId }, }); if (!product) throw new Error('未找到该商品'); - await this.variationModel.delete({ siteId, externalProductId: productId }); - await this.wpProductModel.delete({ siteId, externalProductId: productId }); + + await this.variationModel.createQueryBuilder('variation') + .update() + .set({ on_delete: true }) + .where(" variation.externalProductId = :externalProductId ",{externalProductId:productId}) + .execute(); + + const sums= await this.wpProductModel.createQueryBuilder('wp_product') + .update() + .set({ on_delete: true }) + .where(" wp_product.externalProductId = :externalProductId ",{externalProductId:productId}) + .execute(); + + console.log(sums); + //await this.variationModel.delete({ siteId, externalProductId: productId }); + //await this.wpProductModel.delete({ siteId, externalProductId: productId }); } }