forked from yoone/API
Feature: 增加上下架功能
This commit is contained in:
parent
ca1a15c75d
commit
2ad48143b7
|
|
@ -39,7 +39,7 @@ export default {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: '2',
|
id: '2',
|
||||||
wpApiUrl: 'http://t1-shop.local/',
|
wpApiUrl: 'http://t2-shop.local/',
|
||||||
consumerKey: 'ck_a369473a6451dbaec63d19cbfd74a074b2c5f742',
|
consumerKey: 'ck_a369473a6451dbaec63d19cbfd74a074b2c5f742',
|
||||||
consumerSecret: 'cs_0946bbbeea1bfefff08a69e817ac62a48412df8c',
|
consumerSecret: 'cs_0946bbbeea1bfefff08a69e817ac62a48412df8c',
|
||||||
siteName: 'Local',
|
siteName: 'Local',
|
||||||
|
|
|
||||||
|
|
@ -75,7 +75,7 @@ export class WebhookController {
|
||||||
switch (topic) {
|
switch (topic) {
|
||||||
case 'product.created':
|
case 'product.created':
|
||||||
case 'product.updated':
|
case 'product.updated':
|
||||||
const site = await this.wpProductService.geSite(siteId);
|
const site = await this.wpProductService.getSite(siteId);
|
||||||
// 变体更新
|
// 变体更新
|
||||||
if (body.type === 'variation') {
|
if (body.type === 'variation') {
|
||||||
const variation = await this.wpApiService.getVariation(
|
const variation = await this.wpApiService.getVariation(
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ import {
|
||||||
Query,
|
Query,
|
||||||
Put,
|
Put,
|
||||||
Body,
|
Body,
|
||||||
|
Config,
|
||||||
} from '@midwayjs/core';
|
} from '@midwayjs/core';
|
||||||
import { WpProductService } from '../service/wp_product.service';
|
import { WpProductService } from '../service/wp_product.service';
|
||||||
import { errorResponse, successResponse } from '../utils/response.util';
|
import { errorResponse, successResponse } from '../utils/response.util';
|
||||||
|
|
@ -19,9 +20,21 @@ import {
|
||||||
UpdateWpProductDTO,
|
UpdateWpProductDTO,
|
||||||
} from '../dto/wp_product.dto';
|
} from '../dto/wp_product.dto';
|
||||||
import { WPService } from '../service/wp.service';
|
import { WPService } from '../service/wp.service';
|
||||||
|
import { WpSite } from '../interface';
|
||||||
|
|
||||||
@Controller('/wp_product')
|
@Controller('/wp_product')
|
||||||
export class WpProductController {
|
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()
|
@Inject()
|
||||||
private readonly wpProductService: WpProductService;
|
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
|
* @param productId 产品 ID
|
||||||
|
|
@ -96,7 +125,7 @@ export class WpProductController {
|
||||||
if (isDuplicate) {
|
if (isDuplicate) {
|
||||||
return errorResponse('SKU已存在');
|
return errorResponse('SKU已存在');
|
||||||
}
|
}
|
||||||
const site = await this.wpProductService.geSite(siteId);
|
const site = await this.wpProductService.getSite(siteId);
|
||||||
const result = await this.wpApiService.updateProduct(
|
const result = await this.wpApiService.updateProduct(
|
||||||
site,
|
site,
|
||||||
productId,
|
productId,
|
||||||
|
|
@ -136,7 +165,7 @@ export class WpProductController {
|
||||||
if (isDuplicate) {
|
if (isDuplicate) {
|
||||||
return errorResponse('SKU已存在');
|
return errorResponse('SKU已存在');
|
||||||
}
|
}
|
||||||
const site = await this.wpProductService.geSite(siteId);
|
const site = await this.wpProductService.getSite(siteId);
|
||||||
const result = await this.wpApiService.updateVariation(
|
const result = await this.wpApiService.updateVariation(
|
||||||
site,
|
site,
|
||||||
productId,
|
productId,
|
||||||
|
|
|
||||||
|
|
@ -85,7 +85,7 @@ export class LogisticsService {
|
||||||
@Config('wpSite')
|
@Config('wpSite')
|
||||||
sites: WpSite[];
|
sites: WpSite[];
|
||||||
|
|
||||||
geSite(id: string): WpSite {
|
getSite(id: string): WpSite {
|
||||||
let idx = this.sites.findIndex(item => item.id === id);
|
let idx = this.sites.findIndex(item => item.id === id);
|
||||||
return this.sites[idx];
|
return this.sites[idx];
|
||||||
}
|
}
|
||||||
|
|
@ -263,7 +263,7 @@ export class LogisticsService {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// 同步订单状态到woocommerce
|
// 同步订单状态到woocommerce
|
||||||
const site = await this.geSite(order.siteId);
|
const site = await this.getSite(order.siteId);
|
||||||
if (order.status === OrderStatus.COMPLETED) {
|
if (order.status === OrderStatus.COMPLETED) {
|
||||||
await this.wpService.updateOrder(site, order.externalOrderId, {
|
await this.wpService.updateOrder(site, order.externalOrderId, {
|
||||||
status: OrderStatus.PROCESSING,
|
status: OrderStatus.PROCESSING,
|
||||||
|
|
@ -367,7 +367,7 @@ export class LogisticsService {
|
||||||
const tracking_provider = 'UniUni'; // todo: id未确定,后写进常数
|
const tracking_provider = 'UniUni'; // todo: id未确定,后写进常数
|
||||||
|
|
||||||
// 同步物流信息到woocommerce
|
// 同步物流信息到woocommerce
|
||||||
const site = await this.geSite(order.siteId);
|
const site = await this.getSite(order.siteId);
|
||||||
const res = await this.wpService.createShipment(site, order.externalOrderId, {
|
const res = await this.wpService.createShipment(site, order.externalOrderId, {
|
||||||
tracking_number: resShipmentOrder.data.tno,
|
tracking_number: resShipmentOrder.data.tno,
|
||||||
tracking_provider: tracking_provider,
|
tracking_provider: tracking_provider,
|
||||||
|
|
@ -493,7 +493,7 @@ export class LogisticsService {
|
||||||
const order = await this.orderModel.findOneBy({
|
const order = await this.orderModel.findOneBy({
|
||||||
id: orderShipment.order_id,
|
id: orderShipment.order_id,
|
||||||
});
|
});
|
||||||
const site = this.geSite(order.siteId);
|
const site = this.getSite(order.siteId);
|
||||||
await this.wpService.updateOrder(site, order.externalOrderId, {
|
await this.wpService.updateOrder(site, order.externalOrderId, {
|
||||||
status: OrderStatus.COMPLETED,
|
status: OrderStatus.COMPLETED,
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ import { WpSite } from '../interface';
|
||||||
import { WpProduct } from '../entity/wp_product.entity';
|
import { WpProduct } from '../entity/wp_product.entity';
|
||||||
import { Variation } from '../entity/variation.entity';
|
import { Variation } from '../entity/variation.entity';
|
||||||
import { UpdateVariationDTO, UpdateWpProductDTO } from '../dto/wp_product.dto';
|
import { UpdateVariationDTO, UpdateWpProductDTO } from '../dto/wp_product.dto';
|
||||||
|
import { ProductStatus } from '../enums/base.enum';
|
||||||
|
|
||||||
@Provide()
|
@Provide()
|
||||||
export class WPService {
|
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<Boolean> {
|
||||||
|
const res = await this.updateData(`/wc/v3/products/${productId}`, site, {
|
||||||
|
status
|
||||||
|
});
|
||||||
|
console.log('res', res);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 更新 WooCommerce 产品变体
|
* 更新 WooCommerce 产品变体
|
||||||
* @param productId 产品 ID
|
* @param productId 产品 ID
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ import {
|
||||||
UpdateWpProductDTO,
|
UpdateWpProductDTO,
|
||||||
} from '../dto/wp_product.dto';
|
} from '../dto/wp_product.dto';
|
||||||
import { Product } from '../entity/product.entty';
|
import { Product } from '../entity/product.entty';
|
||||||
|
import { ProductStatus } from '../enums/base.enum';
|
||||||
|
|
||||||
@Provide()
|
@Provide()
|
||||||
export class WpProductService {
|
export class WpProductService {
|
||||||
|
|
@ -26,7 +27,7 @@ export class WpProductService {
|
||||||
@InjectEntityModel(Variation)
|
@InjectEntityModel(Variation)
|
||||||
variationModel: Repository<Variation>;
|
variationModel: Repository<Variation>;
|
||||||
|
|
||||||
geSite(id: string): WpSite {
|
getSite(id: string): WpSite {
|
||||||
let idx = this.sites.findIndex(item => item.id === id);
|
let idx = this.sites.findIndex(item => item.id === id);
|
||||||
return this.sites[idx];
|
return this.sites[idx];
|
||||||
}
|
}
|
||||||
|
|
@ -45,7 +46,7 @@ export class WpProductService {
|
||||||
}
|
}
|
||||||
|
|
||||||
async syncSite(siteId: string) {
|
async syncSite(siteId: string) {
|
||||||
const site = this.geSite(siteId);
|
const site = this.getSite(siteId);
|
||||||
const products = await this.wpApiService.getProducts(site);
|
const products = await this.wpApiService.getProducts(site);
|
||||||
for (const product of products) {
|
for (const product of products) {
|
||||||
const variations =
|
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(
|
async findProduct(
|
||||||
siteId: string,
|
siteId: string,
|
||||||
externalProductId: string
|
externalProductId: string
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue