103 lines
2.6 KiB
TypeScript
103 lines
2.6 KiB
TypeScript
import { Inject, Provide } from '@midwayjs/core';
|
|
import { ILogger } from '@midwayjs/logger';
|
|
import { InjectEntityModel } from '@midwayjs/typeorm';
|
|
import { Repository } from 'typeorm';
|
|
import { SiteProduct } from '../entity/site-product.entity';
|
|
|
|
@Provide()
|
|
export class SiteProductService {
|
|
@InjectEntityModel(SiteProduct)
|
|
siteProductModel: Repository<SiteProduct>;
|
|
|
|
@Inject()
|
|
logger: ILogger;
|
|
|
|
async getSiteProductList(params: {
|
|
current?: number;
|
|
pageSize?: number;
|
|
siteId?: number;
|
|
name?: string;
|
|
sku?: string;
|
|
}) {
|
|
const {
|
|
current = 1,
|
|
pageSize = 10,
|
|
siteId,
|
|
name,
|
|
sku,
|
|
} = params;
|
|
|
|
const queryBuilder = this.siteProductModel.createQueryBuilder('siteProduct');
|
|
|
|
// 根据 siteId 筛选
|
|
if (siteId) {
|
|
queryBuilder.where('siteProduct.siteId = :siteId', { siteId });
|
|
}
|
|
|
|
// 根据 name 或 sku 模糊搜索
|
|
if (name || sku) {
|
|
queryBuilder.andWhere(
|
|
'(siteProduct.name LIKE :keyword OR siteProduct.sku LIKE :keyword)',
|
|
{ keyword: `%${name || sku}%` }
|
|
);
|
|
}
|
|
|
|
// 计算总数
|
|
const total = await queryBuilder.getCount();
|
|
|
|
// 分页查询
|
|
const items = await queryBuilder
|
|
.skip((current - 1) * pageSize)
|
|
.take(pageSize)
|
|
.orderBy('siteProduct.updatedAt', 'DESC')
|
|
.getMany();
|
|
|
|
return {
|
|
total,
|
|
items,
|
|
current,
|
|
pageSize,
|
|
};
|
|
}
|
|
|
|
async getSiteProductById(id: string) {
|
|
return await this.siteProductModel.findOne({ where: { id } });
|
|
}
|
|
|
|
async createSiteProduct(data: Partial<SiteProduct>) {
|
|
const siteProduct = this.siteProductModel.create(data);
|
|
return await this.siteProductModel.save(siteProduct);
|
|
}
|
|
|
|
async updateSiteProduct(id: string, data: Partial<SiteProduct>) {
|
|
await this.siteProductModel.update(id, data);
|
|
return await this.getSiteProductById(id);
|
|
}
|
|
|
|
async deleteSiteProduct(id: string) {
|
|
await this.siteProductModel.delete(id);
|
|
return true;
|
|
}
|
|
|
|
async batchUpdatePrice(siteId: number, productIds: string[], price: number) {
|
|
const result = await this.siteProductModel
|
|
.createQueryBuilder()
|
|
.update()
|
|
.set({ price })
|
|
.where('siteId = :siteId AND id IN (:...productIds)', { siteId, productIds })
|
|
.execute();
|
|
|
|
return result.affected || 0;
|
|
}
|
|
|
|
async syncSiteProducts(siteId: number) {
|
|
// 这里实现同步逻辑,暂时返回成功
|
|
// 实际实现时需要调用对应的站点适配器进行同步
|
|
this.logger.info(`Syncing products for site ${siteId}`);
|
|
return {
|
|
success: true,
|
|
message: '同步成功',
|
|
};
|
|
}
|
|
}
|