import 'dart:convert'; import 'package:http/http.dart' as http; /// Result of a registration API call. class RegistrationResult { final bool success; final bool isDuplicate; final String? errorMessage; final Map? duplicateInfo; RegistrationResult({ required this.success, this.isDuplicate = false, this.errorMessage, this.duplicateInfo, }); factory RegistrationResult.ok() => RegistrationResult(success: true); factory RegistrationResult.duplicate(Map info) => RegistrationResult(success: false, isDuplicate: true, duplicateInfo: info); factory RegistrationResult.error(String message) => RegistrationResult(success: false, errorMessage: message); } class ApiService { final http.Client _client; final Duration timeout; ApiService({http.Client? client, this.timeout = const Duration(seconds: 5)}) : _client = client ?? http.Client(); /// Submit a shelf registration (上架登记). Future registerLocation({ required String baseUrl, required String zongpaiNo, required String locationCode, }) async { final uri = Uri.parse('$baseUrl/CargoTrace/location'); try { final response = await _client .post( uri, headers: {'Content-Type': 'application/json'}, body: jsonEncode({ 'zongpai_no': zongpaiNo, 'location_code': locationCode, }), ) .timeout(timeout); switch (response.statusCode) { case 200: return RegistrationResult.ok(); case 409: final body = jsonDecode(response.body) as Map; return RegistrationResult.duplicate(body); default: final body = jsonDecode(response.body) as Map; final msg = body['error'] ?? body['message'] ?? 'Unknown error (${response.statusCode})'; return RegistrationResult.error(msg.toString()); } } catch (e) { return RegistrationResult.error('网络异常,请检查网络连接'); } } /// Test connectivity by making a HEAD request to the base URL. Future testConnection(String baseUrl) async { try { final uri = Uri.parse(baseUrl); final response = await _client.head(uri).timeout(timeout); return response.statusCode < 500; } catch (_) { return false; } } }