export type TaskStatus = | 'WAITING' | 'CLAIMED' | 'STARTED' | 'SUBMITTED' | 'COMPLETED' | 'REJECTED' | 'EXEMPT' | 'SETTLED' | 'CANCELLED'; export type SettlementStatus = 'DRAFT' | 'CONFIRMED' | 'PAID' | 'CANCELLED'; export type PayoutStateFilter = 'NONE' | 'SUCCESS' | 'FAIL' | 'PROCESSING' | 'WAIT_USER_CONFIRM'; export type TransferMode = 'API' | 'MOCK'; export type UserStatus = 'ACTIVE' | 'DISABLED'; export type StaffRole = 'CLEANER' | 'STAFF' | 'STORE_ADMIN' | 'TENANT_ADMIN'; export interface PageResult { items: T[]; total: number; page: number; pageSize: number; } export interface ManagedUser { id: string; userType: string; status: UserStatus; nickname: string; avatarUrl: string; maskedPhone: string; maskedLastIp: string; note: string; roles: StaffRole[]; storeIds: string[]; wechatMiniappBound: boolean; registeredAt: string; lastLoginAt: string | null; } export interface CleaningTask { id: string; taskNo: string; storeId: string; storeName: string; roomId: string; roomName: string; roomNo: string; orderId: string | null; orderNo: string | null; status: TaskStatus; cleanerUserId: string | null; priority: number; rewardCents: number; requirement: string; photoUrls: string[]; rejectReason: string; claimedAt?: string; startedAt?: string; submittedAt?: string; completedAt?: string; memberCount: number; createdAt?: string; updatedAt?: string; } export interface CleaningTaskMember { id: string; taskId: string; userId: string; nickname: string; memberRole: 'LEAD' | 'ASSIST'; rewardCents: number; joinedAt?: string; removedAt?: string | null; settledAt?: string | null; } export interface CleaningTaskEvent { id: string; taskId: string; fromStatus: TaskStatus | null; toStatus: TaskStatus; action: string; actorId: string; traceId: string; note: string; createdAt: string; } export interface CleaningSettlement { id: string; settlementNo: string; cleanerUserId: string; cleanerName: string; storeId: string | null; storeName: string | null; status: SettlementStatus; taskCount: number; totalRewardCents: number; periodStart: string | null; periodEnd: string | null; paidBy: string | null; confirmedAt: string | null; paidAt: string | null; payoutChannel: string; payoutReference: string; payoutState: string; payoutPackageInfo: string; payoutError: string; note: string; createdAt: string; } export interface CleaningSettlementItem { id: string; settlementId: string; taskId: string; taskNo: string; orderNo: string | null; storeName: string; roomName: string; roomNo: string; cleanerUserId: string; cleanerName: string; rewardCents: number; completedAt: string | null; createdAt: string; } export interface CleaningSettlementDetail { settlement: CleaningSettlement; items: CleaningSettlementItem[]; } export interface CleaningStatistics { summary: { taskTotal: number; pendingReview: number; active: number; rejected: number; completed: number; rewardCents: number; pendingSettlementCents: number; confirmedSettlementCents: number; paidSettlementCents: number; }; byStatus: Array<{ status: TaskStatus; total: number; rewardCents: number; }>; byStore: Array<{ storeId: string; storeName: string; taskTotal: number; pendingReview: number; completed: number; rejected: number; rewardCents: number; }>; settlements: Array<{ status: SettlementStatus; total: number; rewardCents: number; }>; members: Array<{ cleanerUserId: string; cleanerName: string; taskCount: number; completedTaskCount: number; rejectedTaskCount: number; pendingSettlementCents: number; settledRewardCents: number; }>; trend: Array<{ date: string; taskTotal: number; pendingReview: number; completed: number; rejected: number; rewardCents: number; paidSettlementCents: number; }>; } export type WechatTransferPreflightStatus = 'PASS' | 'WARN' | 'FAIL'; export interface WechatTransferPreflightCheck { key: string; status: WechatTransferPreflightStatus; message: string; } export interface WechatTransferPreflight { ready: boolean; settlement: { id: string; settlementNo: string; status: SettlementStatus; totalRewardCents: number; cleanerUserId: string; storeId: string | null; }; account: { configured: boolean; id?: string; storeScoped?: boolean; merchantIdMasked?: string; credentialRefMasked?: string; authorizationStatus?: string; }; credential: { configured: boolean; appIdPresent?: boolean; serialNoPresent?: boolean; transferSceneId?: string; reportInfoCount?: number; transferNotifyUrlConfigured?: boolean; platformCertificateCount?: number; }; cleaner: { openidConfigured: boolean; }; checks: WechatTransferPreflightCheck[]; }