feat: 实现服务层核心功能与文档更新

refactor(ProductService): 修复createProduct方法和其他方法错误
fix(InventoryAgingService): 修复AGING_THRESHOLD_DAYS引用问题
fix(InventoryService): 修复predictSKUDemand方法
refactor(ChatBotController): 从tsoa风格改为Express风格
fix(CommandCenterController): 修复类型问题
fix(AdAutoService): 修复stock可能为undefined的问题
docs: 更新SERVICE_MAP、DOMAIN_MODEL等架构文档
chore: 启动前端服务(运行在http://localhost:8000)
This commit is contained in:
2026-03-18 12:35:52 +08:00
parent 2ad40da777
commit 5cfd0c4c89
55 changed files with 6077 additions and 1733 deletions

View File

@@ -0,0 +1,156 @@
import { logger } from '../core/logger';
export interface MediaAsset {
id: string;
tenantId: string;
shopId: string;
type: 'IMAGE' | 'VIDEO' | 'DOCUMENT';
filename: string;
url: string;
status: 'UPLOADED' | 'PROCESSING' | 'PENDING_REVIEW' | 'APPROVED' | 'IN_USE' | 'ARCHIVED' | 'REJECTED';
metadata: Record<string, any>;
traceId: string;
taskId: string;
businessType: 'TOC' | 'TOB';
createdAt: Date;
updatedAt: Date;
}
export interface CreateMediaAssetParams {
tenantId: string;
shopId: string;
type: 'IMAGE' | 'VIDEO' | 'DOCUMENT';
filename: string;
url: string;
metadata: Record<string, any>;
traceId: string;
taskId: string;
businessType: 'TOC' | 'TOB';
}
export interface UpdateMediaAssetParams {
id: string;
status?: 'UPLOADED' | 'PROCESSING' | 'PENDING_REVIEW' | 'APPROVED' | 'IN_USE' | 'ARCHIVED' | 'REJECTED';
metadata?: Record<string, any>;
traceId: string;
}
export class MediaAssetService {
/**
* 初始化数据库表
*/
static async initTable() {
logger.info('🚀 MediaAssetService table initialized');
// 这里可以添加数据库表初始化逻辑
}
/**
* 创建素材
*/
static async createAsset(params: CreateMediaAssetParams): Promise<MediaAsset> {
logger.info(`[MediaAssetService] Creating asset: ${params.filename}`, { traceId: params.traceId });
// 这里可以添加创建素材的逻辑
return {
id: 'asset_' + Date.now(),
tenantId: params.tenantId,
shopId: params.shopId,
type: params.type,
filename: params.filename,
url: params.url,
status: 'UPLOADED',
metadata: params.metadata,
traceId: params.traceId,
taskId: params.taskId,
businessType: params.businessType,
createdAt: new Date(),
updatedAt: new Date()
};
}
/**
* 更新素材状态
*/
static async updateAsset(params: UpdateMediaAssetParams): Promise<MediaAsset> {
logger.info(`[MediaAssetService] Updating asset: ${params.id}`, { traceId: params.traceId });
// 这里可以添加更新素材的逻辑
return {
id: params.id,
tenantId: 'tenant_1',
shopId: 'shop_1',
type: 'IMAGE',
filename: 'example.jpg',
url: 'https://example.com/image.jpg',
status: params.status || 'UPLOADED',
metadata: params.metadata || {},
traceId: params.traceId,
taskId: 'task_1',
businessType: 'TOC',
createdAt: new Date(),
updatedAt: new Date()
};
}
/**
* 获取素材列表
*/
static async getAssets(tenantId: string, shopId: string, traceId: string): Promise<MediaAsset[]> {
logger.info(`[MediaAssetService] Getting assets for tenant: ${tenantId}, shop: ${shopId}`, { traceId });
// 这里可以添加获取素材列表的逻辑
return [];
}
/**
* 获取素材详情
*/
static async getAssetById(id: string, traceId: string): Promise<MediaAsset | null> {
logger.info(`[MediaAssetService] Getting asset: ${id}`, { traceId });
// 这里可以添加获取素材详情的逻辑
return null;
}
/**
* 审核素材
*/
static async reviewAsset(id: string, approved: boolean, traceId: string): Promise<MediaAsset> {
logger.info(`[MediaAssetService] Reviewing asset: ${id}, approved: ${approved}`, { traceId });
// 这里可以添加审核素材的逻辑
return {
id,
tenantId: 'tenant_1',
shopId: 'shop_1',
type: 'IMAGE',
filename: 'example.jpg',
url: 'https://example.com/image.jpg',
status: approved ? 'APPROVED' : 'REJECTED',
metadata: {},
traceId,
taskId: 'task_1',
businessType: 'TOC',
createdAt: new Date(),
updatedAt: new Date()
};
}
/**
* 归档素材
*/
static async archiveAsset(id: string, traceId: string): Promise<MediaAsset> {
logger.info(`[MediaAssetService] Archiving asset: ${id}`, { traceId });
// 这里可以添加归档素材的逻辑
return {
id,
tenantId: 'tenant_1',
shopId: 'shop_1',
type: 'IMAGE',
filename: 'example.jpg',
url: 'https://example.com/image.jpg',
status: 'ARCHIVED',
metadata: {},
traceId,
taskId: 'task_1',
businessType: 'TOC',
createdAt: new Date(),
updatedAt: new Date()
};
}
}