feat: improve channel resilience and operations

This commit is contained in:
hectorzhao
2026-07-24 08:17:33 +08:00
parent 2f781ebb8a
commit afd3c96070
43 changed files with 1969 additions and 299 deletions
+12 -3
View File
@@ -186,7 +186,7 @@ export type AdminChannel = {
rateLimitPerSecond: number;
unitPrice: number;
status: string;
config?: { desiredConnections?: number; windowSize?: number; extensionDigits?: number; [key: string]: unknown } | null;
config?: { desiredConnections?: number; windowSize?: number; extensionDigits?: number; heartbeatIntervalSeconds?: number; heartbeatMissThreshold?: number; [key: string]: unknown } | null;
connectionStates?: CmppConnectionState[];
};
@@ -983,7 +983,9 @@ export type DailyReconciliationReport = {
tenantName: string;
applicationId: string;
applicationName: string;
submittedUnits: number;
sentUnits: number;
unknownUnits: number;
successUnits: number;
failedUnits: number;
generatedAt: string;
@@ -1000,7 +1002,9 @@ export type DailyProfitReport = {
tenantName?: string | null;
applicationId?: string | null;
channelId?: string | null;
submittedUnits: number;
sentUnits: number;
unknownUnits: number;
successUnits: number;
failedUnits: number;
revenueCents: number;
@@ -1024,7 +1028,9 @@ export type DailyQualityReport = {
channelId?: string | null;
signatureId?: string | null;
drainageInfoId?: string | null;
submittedUnits: number;
sentUnits: number;
unknownUnits: number;
successUnits: number;
failedUnits: number;
successRateBps: number;
@@ -1104,6 +1110,9 @@ export type CmppConnectionState = {
lastDisconnectedAt?: string | null;
lastHeartbeatAt?: string | null;
reconnectCount: number;
lastReconnectAttemptAt?: string | null;
nextReconnectAt?: string | null;
lastErrorCategory?: string | null;
lastError?: string | null;
updatedAt: string;
channel?: AdminChannel;
@@ -1403,9 +1412,9 @@ export const adminApi = {
request<PagedResponse<DailyQualityReport> & { dimensionType: DailyQualityReport['dimensionType'] }>(withQuery('/admin/reports/quality', query)),
exportQualityReports: (query: { dateFrom?: string; dateTo?: string; dimensionType?: 'application' | 'channel' | 'signature' | 'drainage'; tenantId?: string; applicationId?: string; channelId?: string } = {}) =>
requestBlob(withQuery('/admin/reports/quality/export', query)),
createChannel: (body: Partial<AdminChannel> & { passwordCipher?: string; desiredConnections?: number; windowSize?: number }) =>
createChannel: (body: Partial<AdminChannel> & { passwordCipher?: string; desiredConnections?: number; windowSize?: number; heartbeatIntervalSeconds?: number; heartbeatMissThreshold?: number }) =>
request<AdminChannel>('/admin/channels', { method: 'POST', body: JSON.stringify(body) }),
updateChannel: (id: string, body: Partial<AdminChannel> & { passwordCipher?: string; desiredConnections?: number; windowSize?: number }) =>
updateChannel: (id: string, body: Partial<AdminChannel> & { passwordCipher?: string; desiredConnections?: number; windowSize?: number; heartbeatIntervalSeconds?: number; heartbeatMissThreshold?: number }) =>
request<AdminChannel>(`/admin/channels/${id}`, { method: 'PUT', body: JSON.stringify(body) }),
copyChannel: (id: string, body: { operatorId?: string } = {}) => request<AdminChannel>(`/admin/channels/${id}/copy`, {
method: 'POST',