feat: 实现多商户管理模块与前端服务
refactor: 优化服务层代码并修复类型问题 docs: 更新开发进度文档 feat(merchant): 新增商户监控与数据统计服务 feat(dashboard): 添加商户管理前端页面与服务 fix: 修复类型转换与可选参数处理 feat: 实现商户订单、店铺与结算管理功能 refactor: 重构审计日志格式与服务调用 feat: 新增商户入驻与身份注册功能 fix(controller): 修复路由参数类型问题 feat: 添加商户排名与统计报告功能 chore: 更新模拟数据与服务配置
This commit is contained in:
275
server/src/services/ServiceHealthCheck.ts
Normal file
275
server/src/services/ServiceHealthCheck.ts
Normal 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
|
||||
};
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user