添加401状态

加氢预约列表,确认 拒绝
This commit is contained in:
2025-11-06 16:17:45 +08:00
parent 8ccc869a7e
commit aaf5c12735
5 changed files with 194 additions and 66 deletions

View File

@@ -3,3 +3,6 @@
加氢预约app 加氢预约app
android jks
小羚羚
Ln123456.

View File

@@ -1,5 +1,8 @@
allprojects { allprojects {
repositories { repositories {
// 使用阿里云镜像
maven("https://maven.aliyun.com/repository/public")
maven("https://maven.aliyun.com/repository/google")
google() google()
mavenCentral() mavenCentral()
} }

View File

@@ -7,6 +7,7 @@ import 'package:ln_jq_app/storage_service.dart';
import 'common/styles/theme.dart'; import 'common/styles/theme.dart';
import 'pages/home/view.dart'; import 'pages/home/view.dart';
import 'pages/login/view.dart';
void main() async { void main() async {
WidgetsFlutterBinding.ensureInitialized(); WidgetsFlutterBinding.ensureInitialized();
@@ -54,15 +55,17 @@ void initHttpSet() {
// 设置基础 URL // 设置基础 URL
HttpService.to.setBaseUrl(AppTheme.test_service_url); HttpService.to.setBaseUrl(AppTheme.test_service_url);
//指定请求头 //指定请求头
HttpService.to.dio.interceptors.add( HttpService.to.dio.interceptors.add(TokenInterceptor(tokenKey: 'asoco-token'));
TokenInterceptor(tokenKey: 'asoco-token'),
);
// 设置全局响应处理器 // 设置全局响应处理器
HttpService.to.setOnResponseHandler((response) async { HttpService.to.setOnResponseHandler((response) async {
try { try {
final baseModel = BaseModel<dynamic>.fromJson(response.data); final baseModel = BaseModel<dynamic>.fromJson(response.data);
if (baseModel.code == 0) { if (baseModel.code == 0) {
return null; return null;
} else if (baseModel.code == 401) {
await StorageService.to.clearLoginInfo();
Get.offAll(() => LoginPage());
return baseModel.message;
} else { } else {
return baseModel.message; return baseModel.message;
} }
@@ -71,5 +74,4 @@ void initHttpSet() {
return '服务器异常'; return '服务器异常';
} }
}); });
} }

View File

@@ -1,8 +1,15 @@
import 'dart:async';
import 'package:getx_scaffold/getx_scaffold.dart'; import 'package:getx_scaffold/getx_scaffold.dart';
import 'package:ln_jq_app/common/model/base_model.dart'; import 'package:ln_jq_app/common/model/base_model.dart';
import 'package:ln_jq_app/storage_service.dart'; import 'package:ln_jq_app/storage_service.dart';
enum ReservationStatus { pending, completed, rejected } enum ReservationStatus {
pending, // 待处理 ( addStatus: 1)
completed, // 已完成 ( addStatus: 2)
rejected, // 已拒绝 ( 3)
unknown, // 未知状态
}
class ReservationModel { class ReservationModel {
final String id; final String id;
@@ -22,6 +29,45 @@ class ReservationModel {
required this.contactPhone, required this.contactPhone,
this.status = ReservationStatus.pending, this.status = ReservationStatus.pending,
}); });
/// 工厂构造函数用于从JSON创建ReservationModel实例
factory ReservationModel.fromJson(Map<String, dynamic> json) {
//1完成 0待处理 2已拒绝
ReservationStatus currentStatus;
int statusFromServer = json['addStatus'] as int? ?? 0;
switch (statusFromServer) {
case 0:
currentStatus = ReservationStatus.pending;
break;
case 1:
currentStatus = ReservationStatus.completed;
break;
case 2:
currentStatus = ReservationStatus.rejected;
break;
default:
currentStatus = ReservationStatus.unknown;
}
// 格式化时间显示
String startTime = json['startTime']?.toString() ?? '';
String endTime = json['endTime']?.toString() ?? '';
String timeRange = (startTime.isNotEmpty && endTime.isNotEmpty)
? '${json['date']?.toString() ?? ''} ${startTime.substring(11, 16)}-${endTime.substring(11, 16)}' // 截取 HH:mm
: '时间未定';
return ReservationModel(
// id, hydAmount 需要转换为 String
id: json['id']?.toString() ?? '',
plateNumber: json['plateNumber']?.toString() ?? '未知车牌',
amount: '${json['hydAmount']?.toString() ?? '0'}kg',
// 拼接单位
time: timeRange,
contactPerson: json['contacts']?.toString() ?? '无联系人',
contactPhone: json['phone']?.toString() ?? '无联系电话',
status: currentStatus,
);
}
} }
class SiteController extends GetxController with BaseControllerMixin { class SiteController extends GetxController with BaseControllerMixin {
@@ -35,91 +81,156 @@ class SiteController extends GetxController with BaseControllerMixin {
// 新增预约数据列表 // 新增预约数据列表
List<ReservationModel> reservationList = []; List<ReservationModel> reservationList = [];
Timer? _refreshTimer;
@override @override
void onInit() { void onInit() {
super.onInit(); super.onInit();
// 页面初始化时自动加载数据
fetchReservationData();
renderData(); renderData();
startAutoRefresh();
} }
/// 模拟获取预约数据的方法 @override
void onClose() {
stopAutoRefresh();
super.onClose();
}
void startAutoRefresh() {
// 先停止已存在的定时器,防止重复启动
stopAutoRefresh();
// 创建一个每5分钟执行一次的周期性定时器
_refreshTimer = Timer.periodic(const Duration(minutes: 5), (timer) {
fetchReservationData();
});
}
/// 【6. 新增】停止定时器的方法
void stopAutoRefresh() {
// 如果定时器存在并且是激活状态,就取消它
_refreshTimer?.cancel();
_refreshTimer = null; // 置为null方便判断
print("【自动刷新】定时器已停止。");
}
/// 获取预约数据的方法
Future<void> fetchReservationData() async { Future<void> fetchReservationData() async {
showLoading("加载中"); showLoading("加载中");
// 模拟网络请求延迟 try {
await Future.delayed(const Duration(seconds: 1)); var response = await HttpService.to.post(
"appointment/orderAddHyd/sitOrderPage",
data: {
'stationName': name, // 使用从 renderData 中获取到的 name
'pageNum': 1,
'pageSize': 30, // 暂时不考虑分页一次获取30条
},
);
// ==================== 3. 填充模拟数据 ==================== // 安全校验
reservationList = [ if (response == null || response.data == null) {
ReservationModel( showToast('暂时无法获取预约数据');
id: '1', hasReservationData = false;
plateNumber: '浙F08860F', reservationList = [];
amount: '52kg', return;
time: '2025-11-04 21:54-22:24', }
contactPerson: '王小龙',
contactPhone: '15888332828',
status: ReservationStatus.pending,
),
ReservationModel(
id: '2',
plateNumber: '浙F08860F',
amount: '52kg',
time: '2025-11-04 14:54-15:24',
contactPerson: '王小龙',
contactPhone: '15888332828',
status: ReservationStatus.completed, // 示例:已完成状态
),
ReservationModel(
id: '3',
plateNumber: '浙F08860F',
amount: '52kg',
time: '2025-11-04 15:54-16:24',
contactPerson: '王小龙',
contactPhone: '15888332828',
status: ReservationStatus.rejected, // 示例:已拒绝状态
),
ReservationModel(
id: '4',
plateNumber: '浙F08860F',
amount: '52kg',
time: '2025-11-04 12:54-13:24',
contactPerson: '王小龙',
contactPhone: '15888332828',
status: ReservationStatus.pending,
),
];
final baseModel = BaseModel<dynamic>.fromJson(response.data);
if (baseModel.code == 0 && baseModel.data != null) {
// 【核心修改】处理接口返回的列表数据
final dataMap = baseModel.data as Map<String, dynamic>;
final List<dynamic> listFromServer = dataMap['list'] ?? [];
// 使用 .map() 遍历列表,将每个 item 转换为一个 ReservationModel 对象
reservationList = listFromServer.map((item) {
return ReservationModel.fromJson(item as Map<String, dynamic>);
}).toList();
// 根据列表是否为空来更新 hasReservationData 状态
hasReservationData = reservationList.isNotEmpty; hasReservationData = reservationList.isNotEmpty;
} else {
// 接口返回业务错误
showToast(baseModel.message);
hasReservationData = false;
reservationList = []; // 清空列表
}
} catch (e) {
// 捕获网络或解析异常
showToast('获取预约数据失败');
hasReservationData = false;
reservationList = []; // 清空列表
} finally {
// 无论成功失败最后都要关闭加载动画并更新UI
dismissLoading(); dismissLoading();
updateUi(); updateUi();
} }
}
/// 确认预约 /// 确认预约
Future<void> confirmReservation(String id) async { Future<void> confirmReservation(String id) async {
print('确认预约: $id');
// TODO: 在这里调用确认接口
// 接口调用成功后更新本地数据状态并刷新UI
final item = reservationList.firstWhere((item) => item.id == id); final item = reservationList.firstWhere((item) => item.id == id);
item.status = ReservationStatus.completed; DialogX.to.showConfirmDialog(
updateUi(); title: '确认预约',
message: '确定要确认车牌号${item.plateNumber}的预约吗',
onConfirm: () {
upDataService(id, 1, item);
},
onCancel: () {},
);
} }
/// 拒绝预约 /// 拒绝预约
Future<void> rejectReservation(String id) async { Future<void> rejectReservation(String id) async {
print('拒绝预约: $id');
// TODO: 在这里调用拒绝接口
// 接口调用成功后更新本地数据状态并刷新UI
final item = reservationList.firstWhere((item) => item.id == id); final item = reservationList.firstWhere((item) => item.id == id);
DialogX.to.showConfirmDialog(
title: '拒绝预约',
message: '确定要拒绝车牌号${item.plateNumber}的预约吗',
onConfirm: () {
upDataService(id, 2, item);
},
onCancel: () {},
);
}
void upDataService(String id, int status, ReservationModel item) async {
showLoading("确认中");
try {
var responseData = await HttpService.to.post(
'appointment/orderAddHyd/completeOrder',
data: {'id': id, 'addStatus': status},
);
if (responseData == null && responseData!.data == null) {
dismissLoading();
showToast('服务暂不可用,请稍后');
return;
}
var result = BaseModel.fromJson(responseData.data);
if (result.code == 0) {
showSuccessToast("操作成功");
}
dismissLoading();
if (status == 1) {
item.status = ReservationStatus.completed;
} else if (status == 2) {
item.status = ReservationStatus.rejected; item.status = ReservationStatus.rejected;
}
updateUi(); updateUi();
} catch (e) {
dismissLoading();
}
} }
String leftHydrogen = ""; String leftHydrogen = "";
String orderAmount = ""; String orderAmount = "";
String completedAmount = ""; String completedAmount = "";
String name = "";
Future<void> renderData() async { Future<void> renderData() async {
try { try {
@@ -138,8 +249,12 @@ class SiteController extends GetxController with BaseControllerMixin {
leftHydrogen = result.data["leftHydrogen"] ?? ""; leftHydrogen = result.data["leftHydrogen"] ?? "";
orderAmount = result.data["orderAmount"].toString(); orderAmount = result.data["orderAmount"].toString();
completedAmount = result.data["completedAmount"].toString(); completedAmount = result.data["completedAmount"].toString();
name = result.data["name"].toString();
leftHydrogen = leftHydrogen.isEmpty ? "统计中" : leftHydrogen; leftHydrogen = leftHydrogen.isEmpty ? "统计中" : leftHydrogen.toString();
//加载列表数据
fetchReservationData();
} catch (e) { } catch (e) {
showToast('数据异常'); showToast('数据异常');
} }

View File

@@ -3,6 +3,7 @@ import 'package:getx_scaffold/getx_scaffold.dart';
import 'package:ln_jq_app/common/styles/theme.dart'; import 'package:ln_jq_app/common/styles/theme.dart';
import 'controller.dart'; import 'controller.dart';
///加氢预约 ///加氢预约
class SitePage extends GetView<SiteController> { class SitePage extends GetView<SiteController> {
const SitePage({super.key}); const SitePage({super.key});
@@ -236,14 +237,14 @@ class SitePage extends GetView<SiteController> {
itemBuilder: (context, index) { itemBuilder: (context, index) {
final item = controller.reservationList[index]; final item = controller.reservationList[index];
// 调用新的方法来构建每一项 // 调用新的方法来构建每一项
return _buildReservationItem(item); return _buildReservationItem(index, item);
}, },
separatorBuilder: (context, index) => const SizedBox(height: 12), // 列表项之间的间距 separatorBuilder: (context, index) => const SizedBox(height: 12), // 列表项之间的间距
), ),
); );
} }
Widget _buildReservationItem(ReservationModel item) { Widget _buildReservationItem(int index, ReservationModel item) {
return Container( return Container(
decoration: BoxDecoration( decoration: BoxDecoration(
color: Colors.white, color: Colors.white,
@@ -275,7 +276,7 @@ class SitePage extends GetView<SiteController> {
shape: BoxShape.circle, shape: BoxShape.circle,
), ),
child: Text( child: Text(
item.id, "${index + 1}",
style: const TextStyle( style: const TextStyle(
color: Colors.white, color: Colors.white,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
@@ -373,6 +374,10 @@ class SitePage extends GetView<SiteController> {
text = '已拒绝'; text = '已拒绝';
color = Colors.red; color = Colors.red;
break; break;
default:
text = '未知状态';
color = Colors.grey;
break;
} }
return Container( return Container(
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),