225 lines
4.8 KiB
TypeScript
225 lines
4.8 KiB
TypeScript
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<T> {
|
|
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;
|
|
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[];
|
|
}
|