吸收数字员工审批历史订阅策略

This commit is contained in:
baiyanyun
2026-06-10 18:22:53 +08:00
parent 5b78189c9c
commit 3ac350eb27
12 changed files with 615 additions and 196 deletions

View File

@@ -473,6 +473,13 @@ export interface DigitalEmployeeUiState {
muted_levels: string[];
updated_at: string | null;
};
approvalSubscriptionPreferences?: {
enabled: boolean;
subscribed_actions: string[];
subscribed_risk_levels: string[];
notify_on_timeout: boolean;
updated_at: string | null;
};
consoleRole?: string;
rolePreferences?: Record<string, unknown>;
profile: {
@@ -649,6 +656,7 @@ function defaultUiState(): DigitalEmployeeUiState {
decisionResultsByDate: {},
notificationStateById: {},
notificationPreferences: defaultNotificationPreferences(),
approvalSubscriptionPreferences: defaultApprovalSubscriptionPreferences(),
consoleRole: "sales",
rolePreferences: {},
profile: {
@@ -711,6 +719,16 @@ function defaultNotificationPreferences(): NonNullable<DigitalEmployeeUiState["n
};
}
function defaultApprovalSubscriptionPreferences(): NonNullable<DigitalEmployeeUiState["approvalSubscriptionPreferences"]> {
return {
enabled: true,
subscribed_actions: ["comment", "delegate", "mark_timeout", "mark_risk", "clear_risk", "decision"],
subscribed_risk_levels: ["high", "critical"],
notify_on_timeout: true,
updated_at: null,
};
}
function normalizeStringArray(value: unknown): string[] {
if (!Array.isArray(value)) return [];
return [...new Set(value.filter((item): item is string => typeof item === "string" && Boolean(item.trim())))];
@@ -730,6 +748,26 @@ function normalizeNotificationPreferences(
};
}
function normalizeApprovalSubscriptionPreferences(
value: unknown,
): NonNullable<DigitalEmployeeUiState["approvalSubscriptionPreferences"]> {
const fallback = defaultApprovalSubscriptionPreferences();
const record = value && typeof value === "object" && !Array.isArray(value)
? value as Record<string, unknown>
: {};
return {
enabled: record.enabled !== false,
subscribed_actions: normalizeStringArray(record.subscribed_actions).length > 0
? normalizeStringArray(record.subscribed_actions)
: fallback.subscribed_actions,
subscribed_risk_levels: normalizeStringArray(record.subscribed_risk_levels).length > 0
? normalizeStringArray(record.subscribed_risk_levels)
: fallback.subscribed_risk_levels,
notify_on_timeout: record.notify_on_timeout !== false,
updated_at: typeof record.updated_at === "string" ? record.updated_at : null,
};
}
function normalizeUiState(
value: Partial<DigitalEmployeeUiState>,
): DigitalEmployeeUiState {
@@ -745,6 +783,7 @@ function normalizeUiState(
decisionResultsByDate: normalizeNestedStringMap(value.decisionResultsByDate),
notificationStateById: normalizeRecord(value.notificationStateById),
notificationPreferences: normalizeNotificationPreferences(value.notificationPreferences),
approvalSubscriptionPreferences: normalizeApprovalSubscriptionPreferences(value.approvalSubscriptionPreferences),
consoleRole: typeof value.consoleRole === "string" && value.consoleRole.trim()
? value.consoleRole
: fallback.consoleRole,
@@ -785,6 +824,8 @@ function digitalEmployeeUiActionMessage(action: string, date?: string): string {
return "数字员工运营偏好已更新";
case "update_notification_preferences":
return "数字员工通知订阅已更新";
case "update_approval_subscriptions":
return "数字员工审批订阅已更新";
default:
return `数字员工页面状态已更新${suffix}`;
}