// 功能描述:用户可见的配送人员、资质、配送点及订单交付快照;版本:1.0.0。 class DeliveryProduct { const DeliveryProduct({required this.name, required this.quantity}); final String name; final int quantity; } /// 只接受本人配送接口的显式事实;不可用能力保留布尔状态,不由客户端猜测。 class DeliveryDetail { DeliveryDetail.fromJson(Map data) : identity = _required(data, 'identity'), orderNo = _required(data, 'order_no'), statusName = _required(data, 'status_name'), statusMessage = _required(data, 'status_message'), address = _required(data, 'address'), contactName = _required(data, 'contact_name'), contactPhoneMasked = _required(data, 'contact_phone_masked'), stationName = _text(data, 'station_name'), deliveryName = _text(data, 'delivery_name'), deliveryAddress = _text(data, 'delivery_address'), staffName = _text(data, 'staff_name'), staffAvatar = _text(data, 'staff_avatar'), credentialType = _text(data, 'credential_type'), appointmentAt = DateTime.parse(_required(data, 'appointment_at')).toLocal(), trackUpdatedAt = _date(data['track_updated_at']), staffAssigned = _flag(data, 'staff_assigned'), credentialVerified = _flag(data, 'credential_verified'), trackAvailable = _flag(data, 'track_available'), controlledCallAvailable = _flag(data, 'controlled_call_available'), messageAvailable = _flag(data, 'message_available'), vehicleConfigured = _flag(data, 'vehicle_configured'), products = List.unmodifiable([ for (final row in data['products'] as List) DeliveryProduct( name: _required(Map.from(row as Map), 'name'), quantity: (row['quantity'] as int?) ?? 0, ), ]) { if (products.any((item) => item.quantity < 1)) throw const FormatException('配送商品数量异常'); } final String identity, orderNo, statusName, statusMessage, address, contactName; final String contactPhoneMasked, stationName, deliveryName, deliveryAddress, staffName; final String staffAvatar; final String credentialType; final DateTime appointmentAt; final DateTime? trackUpdatedAt; final bool staffAssigned, credentialVerified, trackAvailable; final bool controlledCallAvailable, messageAvailable, vehicleConfigured; final List products; static String _text(Map data, String key) => data[key] as String? ?? ''; static String _required(Map data, String key) { final value = _text(data, key); if (value.trim().isEmpty) throw FormatException('配送资料不完整:$key'); return value; } static bool _flag(Map data, String key) { if (data[key] is! bool) throw FormatException('配送状态异常:$key'); return data[key] as bool; } static DateTime? _date(Object? value) => value == null ? null : DateTime.tryParse('$value')?.toLocal(); }