feat: 实现多商户管理模块与前端服务

refactor: 优化服务层代码并修复类型问题

docs: 更新开发进度文档

feat(merchant): 新增商户监控与数据统计服务

feat(dashboard): 添加商户管理前端页面与服务

fix: 修复类型转换与可选参数处理

feat: 实现商户订单、店铺与结算管理功能

refactor: 重构审计日志格式与服务调用

feat: 新增商户入驻与身份注册功能

fix(controller): 修复路由参数类型问题

feat: 添加商户排名与统计报告功能

chore: 更新模拟数据与服务配置
This commit is contained in:
2026-03-18 13:38:05 +08:00
parent 86ec0fe253
commit b31591e04c
57 changed files with 24055 additions and 157 deletions

View File

@@ -0,0 +1,275 @@
/**
* [OP-MV002] 商户服务健康检查服务
* @description 检查商户服务的健康状态,生成健康报告
* @version 1.0
*/
export class ServiceHealthCheck {
/**
* 检查商户服务健康状态
* @param params 检查参数
* @param traceInfo 追踪信息
* @returns 健康检查结果
*/
public static async checkMerchantServiceHealth(params: {
merchantId?: string;
services?: string[];
}, traceInfo: {
tenantId: string;
shopId: string;
taskId: string;
traceId: string;
businessType: 'TOC' | 'TOB';
}): Promise<{
overallStatus: 'healthy' | 'degraded' | 'unhealthy';
services: Array<{
serviceName: string;
status: 'healthy' | 'degraded' | 'unhealthy';
responseTime: number;
errorCount: number;
lastChecked: string;
}>;
recommendations: string[];
}> {
// 模拟服务列表
const servicesToCheck = params.services || [
'inventory',
'order',
'payment',
'shipping',
'notification'
];
// 模拟健康检查结果
const services = servicesToCheck.map(service => {
// 生成随机响应时间和错误数
const responseTime = Math.floor(Math.random() * 500) + 50;
const errorCount = Math.floor(Math.random() * 5);
// 计算服务状态
let status: 'healthy' | 'degraded' | 'unhealthy' = 'healthy';
if (errorCount > 3 || responseTime > 400) {
status = 'unhealthy';
} else if (errorCount > 1 || responseTime > 200) {
status = 'degraded';
}
return {
serviceName: service,
status,
responseTime,
errorCount,
lastChecked: new Date().toISOString()
};
});
// 计算整体状态
const unhealthyCount = services.filter(s => s.status === 'unhealthy').length;
const degradedCount = services.filter(s => s.status === 'degraded').length;
let overallStatus: 'healthy' | 'degraded' | 'unhealthy' = 'healthy';
if (unhealthyCount > 0) {
overallStatus = 'unhealthy';
} else if (degradedCount > 0) {
overallStatus = 'degraded';
}
// 生成建议
const recommendations: string[] = [];
if (overallStatus === 'unhealthy') {
recommendations.push('立即检查不健康的服务');
recommendations.push('考虑重启相关服务');
} else if (overallStatus === 'degraded') {
recommendations.push('检查性能瓶颈');
recommendations.push('优化响应时间');
} else {
recommendations.push('保持当前状态');
recommendations.push('定期进行健康检查');
}
// 记录健康检查日志
console.log(`[ServiceHealthCheck] 健康检查完成 - 整体状态: ${overallStatus}`, {
...traceInfo,
servicesCount: services.length,
unhealthyCount,
degradedCount
});
return {
overallStatus,
services,
recommendations
};
}
/**
* 生成健康报告
* @param merchantId 商户ID
* @param traceInfo 追踪信息
* @returns 健康报告
*/
public static async generateHealthReport(merchantId: string, traceInfo: {
tenantId: string;
shopId: string;
taskId: string;
traceId: string;
businessType: 'TOC' | 'TOB';
}): Promise<{
reportId: string;
merchantId: string;
timestamp: string;
overallStatus: string;
serviceDetails: any;
performanceMetrics: any;
recommendations: string[];
}> {
// 生成报告ID
const reportId = `HR-${Date.now()}`;
const timestamp = new Date().toISOString();
// 模拟服务健康数据
const serviceDetails = {
inventory: {
status: 'healthy',
responseTime: 120,
errorRate: 0.01
},
order: {
status: 'degraded',
responseTime: 250,
errorRate: 0.05
},
payment: {
status: 'healthy',
responseTime: 90,
errorRate: 0.005
},
shipping: {
status: 'healthy',
responseTime: 150,
errorRate: 0.02
},
notification: {
status: 'healthy',
responseTime: 80,
errorRate: 0.01
}
};
// 计算整体状态
const overallStatus = Object.values(serviceDetails).some(s => s.status === 'unhealthy')
? 'unhealthy'
: Object.values(serviceDetails).some(s => s.status === 'degraded')
? 'degraded'
: 'healthy';
// 计算性能指标
const performanceMetrics = {
averageResponseTime: Object.values(serviceDetails).reduce((sum, s) => sum + s.responseTime, 0) / Object.values(serviceDetails).length,
averageErrorRate: Object.values(serviceDetails).reduce((sum, s) => sum + s.errorRate, 0) / Object.values(serviceDetails).length,
healthyServices: Object.values(serviceDetails).filter(s => s.status === 'healthy').length,
totalServices: Object.values(serviceDetails).length
};
// 生成建议
const recommendations = [
overallStatus === 'unhealthy' ? '立即修复不健康的服务' : '保持服务健康状态',
performanceMetrics.averageResponseTime > 200 ? '优化服务响应时间' : '响应时间正常',
performanceMetrics.averageErrorRate > 0.05 ? '减少服务错误率' : '错误率在可接受范围内'
];
// 记录报告生成日志
console.log(`[ServiceHealthCheck] 生成健康报告 - ID: ${reportId}, 商户: ${merchantId}`, {
...traceInfo,
reportId
});
return {
reportId,
merchantId,
timestamp,
overallStatus,
serviceDetails,
performanceMetrics,
recommendations
};
}
/**
* 执行服务可用性测试
* @param params 测试参数
* @param traceInfo 追踪信息
* @returns 测试结果
*/
public static async testServiceAvailability(params: {
merchantId: string;
services: string[];
testDuration: number; // 测试持续时间(秒)
}, traceInfo: {
tenantId: string;
shopId: string;
taskId: string;
traceId: string;
businessType: 'TOC' | 'TOB';
}): Promise<{
testId: string;
merchantId: string;
startTime: string;
endTime: string;
results: Array<{
serviceName: string;
availability: number; // 可用性百分比
responseTimes: number[];
errorCount: number;
}>;
}> {
// 生成测试ID
const testId = `AT-${Date.now()}`;
const startTime = new Date().toISOString();
// 模拟测试结果
const results = params.services.map(service => {
// 生成模拟响应时间和错误数
const responseTimes: number[] = [];
let errorCount = 0;
// 模拟测试过程
for (let i = 0; i < 10; i++) {
const responseTime = Math.floor(Math.random() * 300) + 50;
responseTimes.push(responseTime);
if (Math.random() < 0.05) {
errorCount++;
}
}
// 计算可用性
const availability = ((10 - errorCount) / 10) * 100;
return {
serviceName: service,
availability,
responseTimes,
errorCount
};
});
// 模拟测试持续时间
await new Promise(resolve => setTimeout(resolve, params.testDuration * 1000));
const endTime = new Date().toISOString();
// 记录测试日志
console.log(`[ServiceHealthCheck] 服务可用性测试完成 - ID: ${testId}, 商户: ${params.merchantId}`, {
...traceInfo,
testId,
duration: params.testDuration
});
return {
testId,
merchantId: params.merchantId,
startTime,
endTime,
results
};
}
}