208 lines
5.2 KiB
TypeScript
208 lines
5.2 KiB
TypeScript
import {
|
|
Controller,
|
|
Param,
|
|
Post,
|
|
Inject,
|
|
Get,
|
|
Query,
|
|
Put,
|
|
Body,
|
|
Config,
|
|
} from '@midwayjs/core';
|
|
import { WpProductService } from '../service/wp_product.service';
|
|
import { errorResponse, successResponse } from '../utils/response.util';
|
|
import { ApiOkResponse } from '@midwayjs/swagger';
|
|
import { BooleanRes, WpProductListRes } from '../dto/reponse.dto';
|
|
import {
|
|
QueryWpProductDTO,
|
|
SetConstitutionDTO,
|
|
UpdateVariationDTO,
|
|
UpdateWpProductDTO,
|
|
} from '../dto/wp_product.dto';
|
|
import { WPService } from '../service/wp.service';
|
|
import { WpSite } from '../interface';
|
|
import {
|
|
ProductsRes,
|
|
} from '../dto/reponse.dto';
|
|
@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;
|
|
|
|
@Inject()
|
|
private readonly wpApiService: WPService;
|
|
|
|
@ApiOkResponse({
|
|
type: BooleanRes,
|
|
})
|
|
@Post('/sync/:siteId')
|
|
async syncProducts(@Param('siteId') siteId: string) {
|
|
try {
|
|
await this.wpProductService.syncSite(siteId);
|
|
return successResponse(true);
|
|
} catch (error) {
|
|
console.log(error);
|
|
return errorResponse('同步失败');
|
|
}
|
|
}
|
|
|
|
@ApiOkResponse({
|
|
type: WpProductListRes,
|
|
})
|
|
@Get('/list')
|
|
async getWpProducts(@Query() query: QueryWpProductDTO) {
|
|
try {
|
|
const data = await this.wpProductService.getProductList(query);
|
|
return successResponse(data);
|
|
} catch (error) {
|
|
return errorResponse(error.message);
|
|
}
|
|
}
|
|
|
|
@ApiOkResponse({
|
|
type: BooleanRes,
|
|
})
|
|
@Put('/:id/constitution')
|
|
async setConstitution(
|
|
@Param('id') id: number,
|
|
@Body()
|
|
body: SetConstitutionDTO
|
|
) {
|
|
const { isProduct, constitution } = body;
|
|
try {
|
|
await this.wpProductService.setConstitution(id, isProduct, constitution);
|
|
return successResponse(true);
|
|
} catch (error) {
|
|
return errorResponse(error.message);
|
|
}
|
|
}
|
|
|
|
@ApiOkResponse({
|
|
type: BooleanRes
|
|
})
|
|
@Post('/updateState/:id')
|
|
async updateWPProductState(
|
|
@Param('id') id: number,
|
|
@Body() body: any, // todo
|
|
) {
|
|
try {
|
|
const res = await this.wpProductService.updateProductStatus(id, body?.status, body?.stock_status);
|
|
return successResponse(res);
|
|
} catch (error) {
|
|
return errorResponse(error.message);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 更新产品接口
|
|
* @param productId 产品 ID
|
|
* @param body 更新数据
|
|
*/
|
|
@ApiOkResponse({
|
|
type: BooleanRes,
|
|
})
|
|
@Put('/siteId/:siteId/products/:productId')
|
|
async updateProduct(
|
|
@Param('siteId') siteId: string,
|
|
@Param('productId') productId: string,
|
|
@Body() body: UpdateWpProductDTO
|
|
) {
|
|
try {
|
|
const isDuplicate = await this.wpProductService.isSkuDuplicate(
|
|
body.sku,
|
|
siteId,
|
|
productId
|
|
);
|
|
if (isDuplicate) {
|
|
return errorResponse('SKU已存在');
|
|
}
|
|
const site = await this.wpProductService.getSite(siteId);
|
|
const result = await this.wpApiService.updateProduct(
|
|
site,
|
|
productId,
|
|
body
|
|
);
|
|
if (result) {
|
|
this.wpProductService.updateWpProduct(siteId, productId, body);
|
|
return successResponse(result, '产品更新成功');
|
|
}
|
|
return errorResponse('产品更新失败');
|
|
} catch (error) {
|
|
console.error('更新产品失败:', error);
|
|
return errorResponse(error.message || '产品更新失败');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 更新变体接口
|
|
* @param productId 产品 ID
|
|
* @param variationId 变体 ID
|
|
* @param body 更新数据
|
|
*/
|
|
@Put('/siteId/:siteId/products/:productId/variations/:variationId')
|
|
async updateVariation(
|
|
@Param('siteId') siteId: string,
|
|
@Param('productId') productId: string,
|
|
@Param('variationId') variationId: string,
|
|
@Body() body: UpdateVariationDTO
|
|
) {
|
|
try {
|
|
const isDuplicate = await this.wpProductService.isSkuDuplicate(
|
|
body.sku,
|
|
siteId,
|
|
productId,
|
|
variationId
|
|
);
|
|
if (isDuplicate) {
|
|
return errorResponse('SKU已存在');
|
|
}
|
|
const site = await this.wpProductService.getSite(siteId);
|
|
const result = await this.wpApiService.updateVariation(
|
|
site,
|
|
productId,
|
|
variationId,
|
|
body
|
|
);
|
|
if (result) {
|
|
this.wpProductService.updateWpProductVaritation(
|
|
siteId,
|
|
productId,
|
|
variationId,
|
|
body
|
|
);
|
|
return successResponse(result, '产品变体更新成功');
|
|
}
|
|
return errorResponse('变体更新失败');
|
|
} catch (error) {
|
|
console.error('更新变体失败:', error);
|
|
return errorResponse(error.message || '产品变体更新失败');
|
|
}
|
|
}
|
|
|
|
@ApiOkResponse({
|
|
description: '通过name搜索产品/订单',
|
|
type: ProductsRes,
|
|
})
|
|
@Get('/search')
|
|
async searchProducts(@Query('name') name: string) {
|
|
try {
|
|
// 调用服务获取产品数据
|
|
const products = await this.wpProductService.findProductsByName(name);
|
|
return successResponse(products);
|
|
} catch (error) {
|
|
return errorResponse(error.message || '获取数据失败');
|
|
}
|
|
}
|
|
}
|