forked from yoone/API
1
0
Fork 0

Compare commits

..

No commits in common. "9137e95c02d64fe859f2d57c32674fb637ed4243" and "39afbae7cf265c0bcbc2a4def9be6286254ee5a5" have entirely different histories.

17 changed files with 94 additions and 228 deletions

View File

@ -39,19 +39,10 @@ export default {
}, },
{ {
id: '2', id: '2',
wpApiUrl: 'http://t2-shop.local/',
consumerKey: 'ck_a369473a6451dbaec63d19cbfd74a074b2c5f742',
consumerSecret: 'cs_0946bbbeea1bfefff08a69e817ac62a48412df8c',
siteName: 'Local',
email: '444693295@qq.com',
emailPswd: 'lulin91.',
},
{
id: '3',
wpApiUrl: 'http://t1-shop.local/', wpApiUrl: 'http://t1-shop.local/',
consumerKey: 'ck_a369473a6451dbaec63d19cbfd74a074b2c5f742', consumerKey: 'ck_a369473a6451dbaec63d19cbfd74a074b2c5f742',
consumerSecret: 'cs_0946bbbeea1bfefff08a69e817ac62a48412df8c', consumerSecret: 'cs_0946bbbeea1bfefff08a69e817ac62a48412df8c',
siteName: 'Local-test-2', siteName: 'Local',
email: '444693295@qq.com', email: '444693295@qq.com',
emailPswd: 'lulin91.', emailPswd: 'lulin91.',
}, },

View File

@ -222,7 +222,7 @@ export class LogisticsController {
} }
@ApiOkResponse() @ApiOkResponse()
@Post('/updateState/:shipmentId') @Post('/updateState/:id')
async updateShipmentState( async updateShipmentState(
@Param('shipmentId') shipmentId: number @Param('shipmentId') shipmentId: number
) { ) {
@ -247,11 +247,11 @@ export class LogisticsController {
} }
@ApiOkResponse() @ApiOkResponse()
@Post('/getOrderList') @Post('/getTrackingNumber')
async getOrderList(@Query('number') number: string) { async getTrackingNumber(@Query('number') number: string) {
try { try {
return successResponse( return successResponse(
await this.logisticsService.getOrderList(number) await this.logisticsService.getTrackingNumber(number)
); );
} catch (error) { } catch (error) {
return errorResponse(error?.message || '获取失败'); return errorResponse(error?.message || '获取失败');
@ -259,11 +259,11 @@ export class LogisticsController {
} }
@ApiOkResponse() @ApiOkResponse()
@Post('/getListByOrderId') @Post('/getListByTrackingId')
async getListByOrderId(@Query('id') orderId: number) { async getListByTrackingId(@Query('shipment_id') shipment_id: number) {
try { try {
return successResponse( return successResponse(
await this.logisticsService.getListByOrderId(orderId) await this.logisticsService.getListByTrackingId(shipment_id)
); );
} catch (error) { } catch (error) {
return errorResponse(error?.message || '获取失败'); return errorResponse(error?.message || '获取失败');

View File

@ -68,12 +68,11 @@ export class OrderController {
@Get('/getOrders') @Get('/getOrders')
async getOrders( async getOrders(
@Query() @Query()
param: QueryOrderDTO, param: QueryOrderDTO
@User() user
) { ) {
try { try {
const count = await this.orderService.getOrderStatus(param); const count = await this.orderService.getOrderStatus(param);
const data = await this.orderService.getOrders(param, user.id); const data = await this.orderService.getOrders(param);
return successResponse({ return successResponse({
...data, ...data,
count, count,

View File

@ -12,15 +12,11 @@ export class UserController {
@Inject() @Inject()
userService: UserService; userService: UserService;
@Inject()
ctx;
@ApiOkResponse({ @ApiOkResponse({
type: LoginRes, type: LoginRes,
}) })
@Post('/login') @Post('/login')
async login(@Body() body) { async login(@Body() body) {
this.ctx.logger.info('ip:', this.ctx.ip, '; path:', this.ctx.path, '; user:', body?.username);
try { try {
const result = await this.userService.login(body); const result = await this.userService.login(body);
return successResponse(result, '登录成功'); return successResponse(result, '登录成功');

View File

@ -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.getSite(siteId); const site = await this.wpProductService.geSite(siteId);
// 变体更新 // 变体更新
if (body.type === 'variation') { if (body.type === 'variation') {
const variation = await this.wpApiService.getVariation( const variation = await this.wpApiService.getVariation(

View File

@ -7,7 +7,6 @@ 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';
@ -20,21 +19,9 @@ 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;
@ -86,22 +73,6 @@ export class WpProductController {
} }
} }
@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 productId ID
@ -125,7 +96,7 @@ export class WpProductController {
if (isDuplicate) { if (isDuplicate) {
return errorResponse('SKU已存在'); return errorResponse('SKU已存在');
} }
const site = await this.wpProductService.getSite(siteId); const site = await this.wpProductService.geSite(siteId);
const result = await this.wpApiService.updateProduct( const result = await this.wpApiService.updateProduct(
site, site,
productId, productId,
@ -165,7 +136,7 @@ export class WpProductController {
if (isDuplicate) { if (isDuplicate) {
return errorResponse('SKU已存在'); return errorResponse('SKU已存在');
} }
const site = await this.wpProductService.getSite(siteId); const site = await this.wpProductService.geSite(siteId);
const result = await this.wpApiService.updateVariation( const result = await this.wpApiService.updateVariation(
site, site,
productId, productId,

View File

@ -90,10 +90,6 @@ export class QueryOrderSalesDTO {
@Rule(RuleType.bool().default(false)) @Rule(RuleType.bool().default(false))
isSource: boolean; isSource: boolean;
@ApiProperty()
@Rule(RuleType.bool().default(false))
exceptPackage: boolean;
@ApiProperty({ example: '1', description: '页码' }) @ApiProperty({ example: '1', description: '页码' })
@Rule(RuleType.number()) @Rule(RuleType.number())
current: number; current: number;

View File

@ -37,7 +37,7 @@ export class OrderItem {
externalOrderId: string; // WooCommerce 订单 ID externalOrderId: string; // WooCommerce 订单 ID
@ApiProperty() @ApiProperty()
@Column({ nullable: true }) @Column()
@Expose() @Expose()
externalOrderItemId: string; // WooCommerce 订单item ID externalOrderItemId: string; // WooCommerce 订单item ID

View File

@ -22,7 +22,6 @@ export class OrderSaleOriginal {
@ApiProperty() @ApiProperty()
@ManyToOne(() => Order) @ManyToOne(() => Order)
@JoinColumn({ name: 'order_id' }) @JoinColumn({ name: 'order_id' })
@Column({ name: 'order_id' })
@Expose() @Expose()
orderId: number; // 订单 ID orderId: number; // 订单 ID
@ -32,7 +31,7 @@ export class OrderSaleOriginal {
siteId: string; // 来源站点唯一标识 siteId: string; // 来源站点唯一标识
@ApiProperty() @ApiProperty()
@Column({ nullable: true }) @Column()
@Expose() @Expose()
externalOrderItemId: string; // WooCommerce 订单item ID externalOrderItemId: string; // WooCommerce 订单item ID

View File

@ -7,7 +7,7 @@ import {
Entity, Entity,
} from 'typeorm'; } from 'typeorm';
import { ApiProperty } from '@midwayjs/swagger'; import { ApiProperty } from '@midwayjs/swagger';
import { ProductStatus, ProductStockStatus, ProductType } from '../enums/base.enum'; import { ProductStatus, ProductType } from '../enums/base.enum';
@Entity('wp_product') @Entity('wp_product')
@Unique(['siteId', 'externalProductId']) // 确保产品的唯一性 @Unique(['siteId', 'externalProductId']) // 确保产品的唯一性
@ -56,15 +56,6 @@ export class WpProduct {
@Column({ type: 'enum', enum: ProductStatus }) @Column({ type: 'enum', enum: ProductStatus })
status: ProductStatus; status: ProductStatus;
@ApiProperty({ description: '上下架状态', enum: ProductStockStatus })
@Column({
name: 'stock_status',
type: 'enum',
enum: ProductStockStatus,
default: ProductStockStatus.INSTOCK
})
stockStatus: ProductStockStatus;
@ApiProperty({ description: '常规价格', type: Number }) @ApiProperty({ description: '常规价格', type: Number })
@Column('decimal', { precision: 10, scale: 2, nullable: true }) @Column('decimal', { precision: 10, scale: 2, nullable: true })
regular_price: number; // 常规价格 regular_price: number; // 常规价格

View File

@ -9,12 +9,6 @@ export enum ProductStatus {
INHERIT = 'inherit', // 继承状态 INHERIT = 'inherit', // 继承状态
} }
export enum ProductStockStatus {
INSTOCK = 'instock',
OUT_OF_STOCK = 'outofstock',
ON_BACK_ORDER = 'onbackorder',
}
export enum ProductType { export enum ProductType {
SIMPLE = 'simple', SIMPLE = 'simple',
VARIABLE = 'variable', VARIABLE = 'variable',

View File

@ -85,7 +85,7 @@ export class LogisticsService {
@Config('wpSite') @Config('wpSite')
sites: WpSite[]; sites: WpSite[];
getSite(id: string): WpSite { geSite(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];
} }
@ -129,7 +129,6 @@ export class LogisticsService {
async updateShipmentState(shipment: Shipment) { async updateShipmentState(shipment: Shipment) {
try { try {
const data = await this.uniExpressService.getOrderStatus(shipment.return_tracking_number); const data = await this.uniExpressService.getOrderStatus(shipment.return_tracking_number);
console.log('updateShipmentState data:', data);
shipment.state = data.data[0].state; shipment.state = data.data[0].state;
if (shipment.state in [203, 215, 216, 230]) { // todo,写常数 if (shipment.state in [203, 215, 216, 230]) { // todo,写常数
shipment.finished = true; shipment.finished = true;
@ -137,13 +136,12 @@ export class LogisticsService {
this.shipmentModel.save(shipment); this.shipmentModel.save(shipment);
return shipment.state; return shipment.state;
} catch (error) { } catch (error) {
throw error; throw new Error(`更新运单状态失败 ${error.message}`);
// throw new Error(`更新运单状态失败 ${error.message}`);
} }
} }
async updateShipmentStateById(id: number) { async updateShipmentStateById(id: number) {
const shipment: Shipment = await this.shipmentModel.findOneBy({ id: id }); const shipment:Shipment = await this.shipmentModel.findOneBy({ id : id });
return this.updateShipmentState(shipment); return this.updateShipmentState(shipment);
} }
@ -220,7 +218,7 @@ export class LogisticsService {
async getShipmentLabel(shipmentId) { async getShipmentLabel(shipmentId) {
try { try {
const shipment: Shipment = await this.shipmentModel.findOneBy({ id: shipmentId }); const shipment:Shipment = await this.shipmentModel.findOneBy({id: shipmentId});
if (!shipment) { if (!shipment) {
throw new Error('运单不存在'); throw new Error('运单不存在');
} }
@ -232,11 +230,11 @@ export class LogisticsService {
async removeShipment(shipmentId: number) { async removeShipment(shipmentId: number) {
try { try {
const shipment: Shipment = await this.shipmentModel.findOneBy({ id: shipmentId }); const shipment:Shipment = await this.shipmentModel.findOneBy({id: shipmentId});
if (shipment.state !== '190') { // todo写常数 if (shipment.state !== '190') { // todo写常数
throw new Error('订单当前状态无法删除'); throw new Error('订单当前状态无法删除');
} }
const order: Order = await this.orderModel.findOneBy({ id: shipment.order_id }); const order:Order = await this.orderModel.findOneBy({id: shipment.order_id});
const dataSource = this.dataSourceManager.getDataSource('default'); const dataSource = this.dataSourceManager.getDataSource('default');
let transactionError = undefined; let transactionError = undefined;
await dataSource.transaction(async manager => { await dataSource.transaction(async manager => {
@ -263,7 +261,7 @@ export class LogisticsService {
try { try {
// 同步订单状态到woocommerce // 同步订单状态到woocommerce
const site = await this.getSite(order.siteId); const site = await this.geSite(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,
@ -288,7 +286,7 @@ export class LogisticsService {
async getShipmentFee(data: ShipmentFeeBookDTO) { async getShipmentFee(data: ShipmentFeeBookDTO) {
try { try {
const stock_point = await this.stockPointModel.findOneBy({ id: data.stockPointId }); const stock_point = await this.stockPointModel.findOneBy({ id: data.stockPointId});
const reqBody = { const reqBody = {
...convertKeysFromCamelToSnake(data), ...convertKeysFromCamelToSnake(data),
pickup_warehouse: stock_point.upStreamStockPointId, pickup_warehouse: stock_point.upStreamStockPointId,
@ -320,7 +318,7 @@ export class LogisticsService {
let resShipmentOrder; let resShipmentOrder;
try { try {
const stock_point = await this.stockPointModel.findOneBy({ id: data.stockPointId }); const stock_point = await this.stockPointModel.findOneBy({ id: data.stockPointId});
const reqBody = { const reqBody = {
sender: data.details.origin.contact_name, sender: data.details.origin.contact_name,
start_phone: data.details.origin.phone_number, start_phone: data.details.origin.phone_number,
@ -367,7 +365,7 @@ export class LogisticsService {
const tracking_provider = 'UniUni'; // todo: id未确定后写进常数 const tracking_provider = 'UniUni'; // todo: id未确定后写进常数
// 同步物流信息到woocommerce // 同步物流信息到woocommerce
const site = await this.getSite(order.siteId); const site = await this.geSite(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,
@ -410,12 +408,10 @@ export class LogisticsService {
// 更新产品发货信息 // 更新产品发货信息
this.orderService.updateOrderSales(order.id, sales); this.orderService.updateOrderSales(order.id, sales);
return { return { data: {
data: {
shipmentId shipmentId
} } };
}; } catch(error) {
} catch (error) {
if (resShipmentOrder.status === 'SUCCESS') { if (resShipmentOrder.status === 'SUCCESS') {
await this.uniExpressService.deleteShipment(resShipmentOrder.data.tno); await this.uniExpressService.deleteShipment(resShipmentOrder.data.tno);
} }
@ -472,7 +468,7 @@ export class LogisticsService {
} }
async getShipment(id: number) { async getShipment(id: number) {
const orderShipments: OrderShipment[] = await this.orderShipmentModel.find({ const orderShipments:OrderShipment[] = await this.orderShipmentModel.find({
where: { shipment_id: id }, where: { shipment_id: id },
}); });
if (!orderShipments || orderShipments.length === 0) return; if (!orderShipments || orderShipments.length === 0) return;
@ -493,7 +489,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.getSite(order.siteId); const site = this.geSite(order.siteId);
await this.wpService.updateOrder(site, order.externalOrderId, { await this.wpService.updateOrder(site, order.externalOrderId, {
status: OrderStatus.COMPLETED, status: OrderStatus.COMPLETED,
}); });
@ -556,7 +552,7 @@ export class LogisticsService {
}); });
} }
async getOrderList(number: string) { async getTrackingNumber(number: string) {
const orders = await this.orderModel.find({ const orders = await this.orderModel.find({
where: { where: {
externalOrderId: Like(`%${number}%`), externalOrderId: Like(`%${number}%`),
@ -571,14 +567,56 @@ export class LogisticsService {
})); }));
} }
async getListByOrderId(id: number) { async getListByTrackingId(id: number) {
const item = await this.orderItem.find({ where: { orderId: id } }); const qb = `
const saleItem = await this.orderSaleModel.find({ where: { orderId: id } }); SELECT
oi.name,
oi.quantity,
CASE
WHEN oi.externalVariationId != 0 THEN v.constitution
ELSE p.constitution
END AS constitution
FROM order_item oi
LEFT JOIN wp_product p ON oi.siteId=p.siteId AND oi.externalProductId=p.externalProductId
LEFT JOIN variation v ON oi.siteId=v.siteId AND oi.externalVariationId=v.externalVariationId
WHERE oi.orderId=?
`;
const saleItem = await this.orderSaleModel.query(qb, [id]);
const allSkus = new Set<string>();
for (const item of saleItem) {
if (!item.constitution) continue;
try {
item.constitution.forEach(c => allSkus.add(c.sku));
} catch (e) {
console.warn('Invalid constitution JSON:', item.constitution);
}
}
console.log(allSkus);
const skuList = Array.from(allSkus);
let skuNameMap = new Map<string, string>();
return { if (skuList.length > 0) {
item, const placeholders = skuList.map(() => '?').join(', ');
saleItem const productRows = await this.orderSaleModel.query(
}; `SELECT sku, name FROM product WHERE sku IN (${placeholders})`,
skuList
);
skuNameMap = new Map(productRows.map(p => [p.sku, p.name]));
}
for (const item of saleItem) {
if (!item.constitution) continue;
try {
item.constitution = item.constitution.map(c => ({
...c,
name: skuNameMap.get(c.sku) || null,
}));
} catch (e) {
item.constitution = [];
}
}
return saleItem;
} }
async getList(param: Record<string, any>) { async getList(param: Record<string, any>) {

View File

@ -45,9 +45,6 @@ export class OrderService {
@InjectEntityModel(Order) @InjectEntityModel(Order)
orderModel: Repository<Order>; orderModel: Repository<Order>;
@InjectEntityModel(User)
userModel: Repository<User>;
@InjectEntityModel(OrderItem) @InjectEntityModel(OrderItem)
orderItemModel: Repository<OrderItem>; orderItemModel: Repository<OrderItem>;
@ -549,7 +546,7 @@ export class OrderService {
current, current,
pageSize, pageSize,
customer_email, customer_email,
}, userId = undefined) { }) {
const parameters: any[] = []; const parameters: any[] = [];
// 基础查询 // 基础查询
@ -632,14 +629,6 @@ export class OrderService {
totalQuery += ` AND o.date_created <= ?`; totalQuery += ` AND o.date_created <= ?`;
parameters.push(endDate); parameters.push(endDate);
} }
const user = await this.userModel.findOneBy({id: userId});
if (user?.permissions?.includes('order-10-days')) {
sqlQuery += ` AND o.date_created >= ?`;
totalQuery += ` AND o.date_created >= ?`;
const tenDaysAgo = new Date();
tenDaysAgo.setDate(tenDaysAgo.getDate() - 10);
parameters.push(tenDaysAgo.toISOString());
}
// 处理 status 参数 // 处理 status 参数
if (status) { if (status) {
@ -749,7 +738,7 @@ export class OrderService {
return await query.getRawMany(); return await query.getRawMany();
} }
async getOrderSales({ siteId, startDate, endDate, current, pageSize, name, exceptPackage }: QueryOrderSalesDTO) { async getOrderSales({ siteId, startDate, endDate, current, pageSize, name }: QueryOrderSalesDTO) {
const nameKeywords = name ? name.split(' ').filter(Boolean) : []; const nameKeywords = name ? name.split(' ').filter(Boolean) : [];
const offset = (current - 1) * pageSize; const offset = (current - 1) * pageSize;
@ -796,16 +785,6 @@ export class OrderService {
itemSql += ' AND os.siteId = ?'; itemSql += ' AND os.siteId = ?';
itemParams.push(siteId); itemParams.push(siteId);
} }
if (exceptPackage) {
itemSql += `
AND os.orderId IN (
SELECT orderId
FROM order_sale
GROUP BY orderId
HAVING COUNT(*) = 1
)
`;
}
itemSql += nameCondition; itemSql += nameCondition;
itemSql += ` itemSql += `
GROUP BY os.productId, os.name GROUP BY os.productId, os.name
@ -823,17 +802,17 @@ export class OrderService {
const pcParams: any[] = [...productIds, startDate, endDate]; const pcParams: any[] = [...productIds, startDate, endDate];
if (siteId) pcParams.push(siteId); if (siteId) pcParams.push(siteId);
let pcSql = ` const pcSql = `
SELECT SELECT
os.productId, os.productId,
SUM(CASE WHEN t.purchaseIndex = 1 THEN os.quantity ELSE 0 END) AS firstOrderYOONEBoxCount, SUM(CASE WHEN t.purchaseIndex = 1 THEN os.quantity ELSE 0 END) AS firstOrderYOONEBoxCount,
COUNT(DISTINCT CASE WHEN t.purchaseIndex = 1 THEN os.orderId END) AS firstOrderCount, COUNT(CASE WHEN t.purchaseIndex = 1 THEN 1 END) AS firstOrderCount,
SUM(CASE WHEN t.purchaseIndex = 2 THEN os.quantity ELSE 0 END) AS secondOrderYOONEBoxCount, SUM(CASE WHEN t.purchaseIndex = 2 THEN os.quantity ELSE 0 END) AS secondOrderYOONEBoxCount,
COUNT(DISTINCT CASE WHEN t.purchaseIndex = 2 THEN os.orderId END) AS secondOrderCount, COUNT(CASE WHEN t.purchaseIndex = 2 THEN 1 END) AS secondOrderCount,
SUM(CASE WHEN t.purchaseIndex = 3 THEN os.quantity ELSE 0 END) AS thirdOrderYOONEBoxCount, SUM(CASE WHEN t.purchaseIndex = 3 THEN os.quantity ELSE 0 END) AS thirdOrderYOONEBoxCount,
COUNT(DISTINCT CASE WHEN t.purchaseIndex = 3 THEN os.orderId END) AS thirdOrderCount, COUNT(CASE WHEN t.purchaseIndex = 3 THEN 1 END) AS thirdOrderCount,
SUM(CASE WHEN t.purchaseIndex > 3 THEN os.quantity ELSE 0 END) AS moreThirdOrderYOONEBoxCount, SUM(CASE WHEN t.purchaseIndex > 3 THEN os.quantity ELSE 0 END) AS moreThirdOrderYOONEBoxCount,
COUNT(DISTINCT CASE WHEN t.purchaseIndex > 3 THEN os.orderId END) AS moreThirdOrderCount COUNT(CASE WHEN t.purchaseIndex > 3 THEN 1 END) AS moreThirdOrderCount
FROM order_sale os FROM order_sale os
INNER JOIN ( INNER JOIN (
SELECT o2.id AS orderId, SELECT o2.id AS orderId,
@ -850,22 +829,9 @@ export class OrderService {
WHERE date_paid BETWEEN ? AND ? WHERE date_paid BETWEEN ? AND ?
${siteId ? 'AND siteId = ?' : ''} ${siteId ? 'AND siteId = ?' : ''}
) )
`;
if (exceptPackage) {
pcSql += `
AND os.orderId IN (
SELECT orderId
FROM order_sale
GROUP BY orderId
HAVING COUNT(*) = 1
)
`;
}
pcSql += `
GROUP BY os.productId GROUP BY os.productId
`; `;
console.log('------3.5-----', pcSql, pcParams, exceptPackage);
const pcResults = await this.orderSaleModel.query(pcSql, pcParams); const pcResults = await this.orderSaleModel.query(pcSql, pcParams);
const pcMap = new Map<number, any>(); const pcMap = new Map<number, any>();
@ -1320,8 +1286,7 @@ export class OrderService {
productId: product.id, productId: product.id,
name: product.name, name: product.name,
sku: sale.sku, sku: sale.sku,
quantity: sale.quantity, quantity: sale.quantity
// externalOrderItemId:
}); });
}; };
}).catch(error => { }).catch(error => {

View File

@ -70,7 +70,6 @@ export class UserService {
id: user.id, id: user.id,
deviceId, deviceId,
username: user.username, username: user.username,
isSuper: user.isSuper,
}); });
return { return {

View File

@ -4,7 +4,6 @@ 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, ProductStockStatus } from '../enums/base.enum';
@Provide() @Provide()
export class WPService { export class WPService {
@ -223,26 +222,6 @@ export class WPService {
}); });
} }
/**
* WooCommerce
* @param productId ID
* @param status
* @param stock_status
*/
async updateProductStatus(
site: WpSite,
productId: string,
status: ProductStatus,
stock_status: ProductStockStatus
): Promise<Boolean> {
const res = await this.updateData(`/wc/v3/products/${productId}`, site, {
status,
stock_status,
});
console.log('res', res);
return res;
}
/** /**
* WooCommerce * WooCommerce
* @param productId ID * @param productId ID

View File

@ -11,7 +11,6 @@ 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, ProductStockStatus } from '../enums/base.enum';
@Provide() @Provide()
export class WpProductService { export class WpProductService {
@ -27,7 +26,7 @@ export class WpProductService {
@InjectEntityModel(Variation) @InjectEntityModel(Variation)
variationModel: Repository<Variation>; variationModel: Repository<Variation>;
getSite(id: string): WpSite { geSite(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];
} }
@ -46,7 +45,7 @@ export class WpProductService {
} }
async syncSite(siteId: string) { async syncSite(siteId: string) {
const site = this.getSite(siteId); const site = this.geSite(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 =
@ -57,21 +56,6 @@ export class WpProductService {
} }
} }
// 控制产品上下架
async updateProductStatus(id: number, status: ProductStatus, stock_status: ProductStockStatus) {
const wpProduct = await this.wpProductModel.findOneBy({ id });
const site = await this.getSite(wpProduct.siteId);
wpProduct.status = status;
wpProduct.stockStatus = stock_status;
const res = await this.wpApiService.updateProductStatus(site, wpProduct.externalProductId, status, stock_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

View File

@ -1,36 +0,0 @@
function camelToSnake(str: string): string {
return str.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`);
}
function snakeToCamel(str: string): string {
return str.replace(/(_[\w])/g, (match) =>
match[1].toUpperCase()
);
}
export function convertKeysFromSnakeToCamel<T>(obj: T): T {
if (Array.isArray(obj)) {
return obj.map(convertKeysFromSnakeToCamel) as unknown as T;
} else if (obj !== null && typeof obj === 'object') {
return Object.keys(obj).reduce((acc, key) => {
const newKey = snakeToCamel(key);
acc[newKey] = convertKeysFromSnakeToCamel((obj as any)[key]);
return acc;
}, {} as any);
}
return obj;
}
export function convertKeysFromCamelToSnake<T>(obj: T): T {
if (Array.isArray(obj)) {
return obj.map(convertKeysFromCamelToSnake) as unknown as T;
} else if (obj !== null && typeof obj === 'object') {
return Object.keys(obj).reduce((acc, key) => {
const newKey = camelToSnake(key);
acc[newKey] = convertKeysFromCamelToSnake((obj as any)[key]);
return acc;
}, {} as any);
}
return obj;
}