refactor(services): 重构服务文件结构,将服务按功能分类到不同目录

- 将服务文件按功能分类到core、ai、analytics、security等目录
- 修复logger导入路径问题,统一使用相对路径
- 更新相关文件的导入路径引用
- 添加新的批量操作组件导出文件
- 修复dashboard页面中的类型错误
- 添加dotenv依赖到package.json
This commit is contained in:
2026-03-25 13:46:26 +08:00
parent e59d7c6620
commit 2748456d8a
598 changed files with 74404 additions and 9576 deletions

View File

@@ -1,6 +1,7 @@
import { http } from './http';
/**
* [MOCK] 用户资产数据<E695B0><EFBFBD>? * AI注意: 这是Mock实现不是真实业务逻辑
* 仅在USE_MOCK=true时启<E697B6><EFBFBD>? */
* [MOCK] 用户资产数据<E695B0>? * AI注意: 这是Mock实现不是真实业务逻辑
* 仅在USE_MOCK=true时启<E697B6>? */
export type MemberLevel = 'BRONZE' | 'SILVER' | 'GOLD' | 'PLATINUM' | 'DIAMOND';
@@ -10,15 +11,15 @@ export interface UserAsset {
userId: string;
userName: string;
email: string;
userEmail?: string; // <20><EFBFBD>?email 同义
userEmail?: string; // <20>?email 同义
memberLevel: MemberLevel;
points: number;
memberScore?: number; // <20><EFBFBD>?points 同义
memberScore?: number; // <20>?points 同义
totalSpent: number;
availableBalance: number;
availablePoints?: number; // <20><EFBFBD>?availableBalance 同义
availablePoints?: number; // <20>?availableBalance 同义
frozenBalance: number;
frozenPoints?: number; // <20><EFBFBD>?frozenBalance 同义
frozenPoints?: number; // <20>?frozenBalance 同义
cashbackBalance?: number;
couponCount?: number;
totalOrders: number;
@@ -61,13 +62,13 @@ export interface PointsRecord {
source: string;
description: string;
createdAt: string;
// 额外字段<EFBC8C><EFBFBD>?PointsManage 页面
// 额外字段<EFBC8C>?PointsManage 页面
tenantId?: string;
shopId?: string;
traceId?: string;
businessType?: 'TOC' | 'TOB';
points?: number; // <20><EFBFBD>?amount 同义
sourceType?: string; // <20><EFBFBD>?source 同义
points?: number; // <20>?amount 同义
sourceType?: string; // <20>?source 同义
status?: 'PENDING' | 'CONFIRMED' | 'FROZEN' | 'EXPIRED' | 'CANCELLED';
expiredAt?: string;
sourceId?: string;
@@ -245,51 +246,39 @@ class ApiUserAssetDataSource implements IUserAssetDataSource {
private baseUrl = '/api/user-assets';
async fetchUserAssets(params?: { memberLevel?: string; status?: string; search?: string }): Promise<UserAsset[]> {
const response = await fetch(`${this.baseUrl}?${new URLSearchParams(params as any)}`);
if (!response.ok) throw new Error('Failed to fetch user assets');
return response.json();
const response = await http.get(`${this.baseUrl}?${new URLSearchParams(params as any)}`);
return response.data;
}
async updateUserAsset(id: string, data: Partial<UserAsset>): Promise<UserAsset> {
const response = await fetch(`${this.baseUrl}/${id}`, {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data),
});
if (!response.ok) throw new Error('Failed to update user asset');
return response.json();
const response = await http.put(`${this.baseUrl}/${id}`, data);
return response.data;
}
async fetchMemberLevelConfigs(): Promise<MemberLevelConfig[]> {
const response = await fetch(`${this.baseUrl}/member-levels`);
if (!response.ok) throw new Error('Failed to fetch member level configs');
return response.json();
const response = await http.get(`${this.baseUrl}/member-levels`);
return response.data;
}
async updateMemberLevelConfig(id: string, data: Partial<MemberLevelConfig>): Promise<MemberLevelConfig> {
const response = await fetch(`${this.baseUrl}/member-levels/${id}`, {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data),
});
if (!response.ok) throw new Error('Failed to update member level config');
return response.json();
const response = await http.put(`${this.baseUrl}/member-levels/${id}`, data);
return response.data;
}
async fetchPointsRecords(params?: { userId?: string; type?: string }): Promise<PointsRecord[]> {
const response = await fetch(`${this.baseUrl}/points?${new URLSearchParams(params as any)}`);
if (!response.ok) throw new Error('Failed to fetch points records');
return response.json();
const response = await http.get(`${this.baseUrl}/points?${new URLSearchParams(params as any)}`);
return response.data;
}
async adjustPoints(userId: string, amount: number, reason: string): Promise<PointsRecord> {
const response = await fetch(`${this.baseUrl}/points/adjust`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ userId, amount, reason }),
});
if (!response.ok) throw new Error('Failed to adjust points');
return response.json();
const response = await http.post(`${this.baseUrl}/points/adjust`, { userId, amount, reason });
return response.data;
}
}