// 功能描述:用户押金汇总与单瓶押金事实;版本:1.0.0。 /// 单只气瓶的押金状态,金额单位为分。 class DepositRecord { const DepositRecord({ required this.identity, required this.depositNo, required this.status, required this.statusName, required this.amount, required this.productName, required this.productCode, required this.paidAt, required this.refundedAt, required this.allowedActions, this.returnRequestIdentity = '', this.returnStatusName = '', }); final String identity, depositNo, statusName, productName, productCode; final String returnRequestIdentity, returnStatusName; final int status, amount; final DateTime paidAt; final DateTime? refundedAt; final List allowedActions; factory DepositRecord.fromJson(Map data) { final paidAt = DateTime.tryParse(data['paid_at']?.toString() ?? ''); if (data['identity'] is! String || data['deposit_no'] is! String || data['deposit_status'] is! int || data['amount'] is! int || (data['amount'] as int) < 0 || paidAt == null) { throw const FormatException('押金记录数据异常'); } return DepositRecord( identity: data['identity'] as String, depositNo: data['deposit_no'] as String, status: data['deposit_status'] as int, statusName: data['status_name'] as String? ?? '处理中', amount: data['amount'] as int, productName: data['product_name'] as String? ?? '', productCode: data['product_code'] as String? ?? '', paidAt: paidAt.toLocal(), refundedAt: data['refunded_at'] == null ? null : DateTime.tryParse(data['refunded_at'].toString())?.toLocal(), allowedActions: (data['allowed_actions'] as List? ?? []).whereType().toList(), returnRequestIdentity: data['return_request_identity'] as String? ?? '', returnStatusName: data['return_status_name'] as String? ?? '', ); } } /// 押金页一次读取的服务端快照。 class DepositSummary { const DepositSummary({ required this.refundableAmount, required this.usingCount, required this.items, required this.ruleText, }); final int refundableAmount, usingCount; final List items; final String ruleText; factory DepositSummary.fromJson(Map data) { if (data['refundable_amount'] is! int || data['using_count'] is! int || data['items'] is! List) { throw const FormatException('押金汇总数据异常'); } return DepositSummary( refundableAmount: data['refundable_amount'] as int, usingCount: data['using_count'] as int, items: (data['items'] as List) .whereType>() .map((item) => DepositRecord.fromJson(Map.from(item))) .toList(), ruleText: data['rule_text'] as String? ?? '', ); } } // DepositReturnRequest 表示退瓶申请的可见状态,不暴露内部关联主键。 class DepositReturnRequest { const DepositReturnRequest({ required this.identity, required this.status, required this.statusName, required this.estimatedAmount, required this.refundAmount, }); final String identity, statusName; final int status, estimatedAmount, refundAmount; factory DepositReturnRequest.fromJson(Map data) { if (data['identity'] is! String || data['return_status'] is! int) { throw const FormatException('退瓶申请数据不完整'); } return DepositReturnRequest( identity: data['identity'] as String, status: data['return_status'] as int, statusName: data['status_name'] as String? ?? '处理中', estimatedAmount: data['estimated_amount'] as int? ?? 0, refundAmount: data['refund_amount'] as int? ?? 0, ); } }