refactor: 优化服务层代码并修复类型问题 docs: 更新开发进度文档 feat(merchant): 新增商户监控与数据统计服务 feat(dashboard): 添加商户管理前端页面与服务 fix: 修复类型转换与可选参数处理 feat: 实现商户订单、店铺与结算管理功能 refactor: 重构审计日志格式与服务调用 feat: 新增商户入驻与身份注册功能 fix(controller): 修复路由参数类型问题 feat: 添加商户排名与统计报告功能 chore: 更新模拟数据与服务配置
276 lines
7.5 KiB
TypeScript
276 lines
7.5 KiB
TypeScript
/**
|
|
* [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
|
|
};
|
|
}
|
|
}
|