From 33e5baa0832789546aa6aa2e7e90198d9e4140c8 Mon Sep 17 00:00:00 2001 From: zhuotianyuan Date: Sun, 28 Sep 2025 17:19:17 +0800 Subject: [PATCH 1/2] =?UTF-8?q?2024-0928-zty-wp=E4=BA=A7=E5=93=81=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E9=80=BB=E8=BE=91=E5=88=A0=E9=99=A4=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controller/webhook.controller.ts | 1 - src/entity/variation.entity.ts | 4 ++ src/entity/wp_product.entity.ts | 6 +++ src/service/wp_product.service.ts | 57 +++++++++++++++++++++++++--- 4 files changed, 62 insertions(+), 6 deletions(-) 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 }); } } -- 2.40.1 From 9df0ea233a0cc0b17c3b2889835f4e1672e1f3df Mon Sep 17 00:00:00 2001 From: zhuotianyuan Date: Fri, 10 Oct 2025 15:15:49 +0800 Subject: [PATCH 2/2] =?UTF-8?q?20251010-=E8=AE=A2=E5=8D=95=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E5=A2=9E=E5=8A=A0=E6=89=8B=E6=9C=BA=E5=8F=B7=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E9=80=BB=E8=BE=91=E4=BF=AE=E6=94=B9=EF=BC=8C=E6=8D=A2?= =?UTF-8?q?=E8=B4=A7=E6=96=B0=E5=A2=9E=E5=AD=97=E6=AE=B5=E3=80=81=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/entity/order.entity.ts | 10 ++++++ src/entity/order_item_original.entity.ts | 3 ++ src/service/order.service.ts | 43 ++++++++++++++++++++++-- 3 files changed, 53 insertions(+), 3 deletions(-) diff --git a/src/entity/order.entity.ts b/src/entity/order.entity.ts index 6937deb..0eef3fc 100644 --- a/src/entity/order.entity.ts +++ b/src/entity/order.entity.ts @@ -249,6 +249,16 @@ export class Order { @Expose() utm_source: string; + @ApiProperty() + @Column({ default: '' }) + @Expose() + is_exchange: string; + + @ApiProperty() + @Column({ default: '' }) + @Expose() + exchange_frequency: string; + @ApiProperty({ example: '2022-12-12 11:11:11', description: '创建时间', diff --git a/src/entity/order_item_original.entity.ts b/src/entity/order_item_original.entity.ts index c457c6e..26c494a 100644 --- a/src/entity/order_item_original.entity.ts +++ b/src/entity/order_item_original.entity.ts @@ -77,3 +77,6 @@ export class OrderSaleOriginal { @Expose() updatedAt?: Date; } + + + diff --git a/src/service/order.service.ts b/src/service/order.service.ts index 2d4b122..6662104 100644 --- a/src/service/order.service.ts +++ b/src/service/order.service.ts @@ -5,6 +5,7 @@ import { In, Like, Repository } from 'typeorm'; import { InjectEntityModel, TypeORMDataSourceManager } from '@midwayjs/typeorm'; import { plainToClass } from 'class-transformer'; import { OrderItem } from '../entity/order_item.entity'; +import { OrderItemOriginal } from '../entity/order_items_original.entity'; import { OrderSale } from '../entity/order_sale.entity'; import { WpProduct } from '../entity/wp_product.entity'; import { Product } from '../entity/product.entty'; @@ -51,6 +52,9 @@ export class OrderService { @InjectEntityModel(OrderItem) orderItemModel: Repository; + @InjectEntityModel(OrderItem) + orderItemOriginalModel: Repository; + @InjectEntityModel(OrderSale) orderSaleModel: Repository; @@ -209,7 +213,7 @@ export class OrderService { el => el.key === '_wc_order_attribution_utm_source' )?.value || ''; order.customer_email = order?.billing?.email || order?.shipping?.email; - order.billing_phone = order?.billing?.phone || order?.shipping?.phone; + order.billing_phone = order?.billing?.phone || order?.shipping?.phone; const entity = plainToClass(Order, order); const existingOrder = await this.orderModel.findOne({ where: { externalOrderId: order.externalOrderId, siteId: siteId }, @@ -323,6 +327,28 @@ export class OrderService { } } + async saveOrderItemsG(orderItem: OrderItem) { + const existingOrderItem = await this.orderItemModel.findOne({ + where: { + externalOrderId: orderItem.externalOrderId, + siteId: orderItem.siteId, + externalOrderItemId: orderItem.externalOrderItemId, + }, + }); + + if ( + existingOrderItem && + existingOrderItem.quantity === orderItem.quantity + ) { + return; + } + if (existingOrderItem) { + await this.orderItemModel.update(existingOrderItem.id, orderItem); + } else { + await this.orderItemModel.save(orderItem); + } + } + async saveOrderSale(orderItem: OrderItem) { const currentOrderSale = await this.orderSaleModel.find({ where: { @@ -565,7 +591,7 @@ export class OrderService { o.total as total, o.date_created as date_created, o.customer_email as customer_email, - o.billing_phone as billing_phone, + o.transaction_id as transaction_id, o.orderStatus as orderStatus, o.customer_ip_address as customer_ip_address, @@ -1116,7 +1142,6 @@ export class OrderService { } // update order_sale_origin if not exist - try { const order_sale_origin_count = await this.orderSaleOriginalModel.countBy({ orderId: id }); if (order_sale_origin_count === 0) { @@ -1125,6 +1150,15 @@ export class OrderService { await this.orderSaleOriginalModel.save(saleData); }); } + + // update order_item_origin if not exist + const order_item_origin_count = await this.orderItemOriginalModel.countBy({ orderId: id }); + if (order_item_origin_count === 0 && items.length!=0) { + items.forEach(async sale => { + const { id: saleId, ...saleData } = sale; + await this.orderItemOriginalModel.save(saleData); + }); + } } catch (error) { console.log('create order sale origin error: ', error.message); @@ -1342,6 +1376,9 @@ export class OrderService { // externalOrderItemId: }); }; + + //await orderRepo.save(); + }).catch(error => { transactionError = error; }); -- 2.40.1