消息中心,待测试

This commit is contained in:
2026-01-08 15:33:40 +08:00
parent 7d9c879a4e
commit baee5dba83
5 changed files with 145 additions and 57 deletions

View File

@@ -1,16 +1,17 @@
import 'package:get/get.dart';
import 'package:getx_scaffold/getx_scaffold.dart';
import 'package:ln_jq_app/common/model/base_model.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
import 'model.dart';
class MessageController extends GetxController {
final RefreshController refreshController = RefreshController(initialRefresh: false);
final RxList<MessageModel> messageList = <MessageModel>[].obs;
int _pageNum = 1;
final int _pageSize = 10;
final int _pageSize = 20;
// 模拟所有已读状态,实际应根据接口判断
final RxBool allRead = false.obs;
// 是否所有已读状态
final RxBool allRead = false.obs;
@override
void onInit() {
@@ -19,45 +20,58 @@ class MessageController extends GetxController {
}
Future<void> _loadData({bool isRefresh = false}) async {
if (isRefresh) {
_pageNum = 1;
} else {
_pageNum++;
}
final int targetPage = isRefresh ? 1 : _pageNum + 1;
try {
// 模拟请求延迟
await Future.delayed(const Duration(milliseconds: 500));
// 模拟数据 (请替换为实际接口请求)
// var response = await HttpService.to.post('message/list', data: {'pageNum': _pageNum, 'pageSize': _pageSize});
List<MessageModel> newData = List.generate(10, (index) {
int id = (_pageNum - 1) * _pageSize + index;
final Map<String, dynamic> requestData = {
'appFlag': 1,
'pageNum': targetPage,
'pageSize': _pageSize,
};
final response = await HttpService.to.get(
'appointment/unread_notice/page',
params: requestData,
);
if (response == null) {
throw Exception("Response is null");
}
final result = BaseModel.fromJson(response.data);
if (result.code != 0) {
throw Exception(result.message ?? "Business error");
}
final recordsList = result.data?["records"] as List? ?? [];
final List<MessageModel> newData = recordsList.map((e) {
return MessageModel(
id: id.toString(),
title: '加氢预约失败通知',
content: '1月6日14时30分-1月6日15时30分北京朝阳加氢站加氢预约失败。原因设备维护',
createTime: '刚刚',
isRead: index % 3 == 0 ? 1 : 0,
id: e['id']?.toString() ?? '',
title: e['noticeTitle'] ?? '',
content: e['noticeContent'] ?? '',
createTime: e['createTime'] ?? '',
isRead: int.tryParse(e['isRead']?.toString() ?? '0') ?? 0,
);
});
}).toList();
if (isRefresh) {
messageList.assignAll(newData);
refreshController.refreshCompleted();
_pageNum = 1; // 只有成功了才重置页码
} else {
if (newData.isEmpty) {
refreshController.loadNoData();
} else {
messageList.addAll(newData);
refreshController.loadComplete();
messageList.addAll(newData);
if (newData.isNotEmpty) {
_pageNum++; // 只有成功且有数据才+1
}
}
_checkAllRead();
_updateRefreshState(isRefresh, newData.length);
// 检查是否全部已读
_checkAllRead();
} catch (e) {
Logger.d("加载失败: $e"); // 建议加上日志
if (isRefresh) {
refreshController.refreshFailed();
} else {
@@ -66,24 +80,48 @@ class MessageController extends GetxController {
}
}
/// 处理 RefreshController 状态
void _updateRefreshState(bool isRefresh, int count) {
if (isRefresh) {
refreshController.refreshCompleted();
// 如果刷新后的数据量小于 pageSize说明没有更多数据了
if (count < _pageSize) {
refreshController.loadNoData();
} else {
// 必须重置 footer 状态,否则之前如果是 NoData 状态无法再加载
refreshController.resetNoData();
}
} else {
if (count == 0) {
refreshController.loadNoData();
} else {
refreshController.loadComplete();
}
}
}
void onRefresh() => _loadData(isRefresh: true);
void onLoading() => _loadData(isRefresh: false);
// 标记全部已读
void markAllRead() async {
showLoading('正在标记...');
try {
// await HttpService.to.post('message/readAll');
await Future.delayed(const Duration(milliseconds: 500));
for (var msg in messageList) {
msg.isRead = 1;
final response = await HttpService.to.post('appointment/unread_notice/read/all');
if (response != null) {
final result = BaseModel.fromJson(response.data);
if (result.code == 0) {
for (var msg in messageList) {
msg.isRead = 0;
}
messageList.refresh();
allRead.value = true;
dismissLoading();
showSuccessToast('全部已读');
}
}
messageList.refresh();
allRead.value = true;
dismissLoading();
showSuccessToast('全部已读');
} catch (e) {
dismissLoading();
showErrorToast('操作失败');
@@ -92,15 +130,22 @@ class MessageController extends GetxController {
// 标记单条已读(弹窗显示时调用)
void markRead(MessageModel message) async {
if (message.isRead == 1) return;
// await HttpService.to.post('message/read', data: {'id': message.id});
message.isRead = 1;
messageList.refresh();
_checkAllRead();
if (message.isRead == 0) return;
final response = await HttpService.to.post(
'/appointment/unread_notice/read/${message.id}',
);
if (response != null) {
final result = BaseModel.fromJson(response.data);
if (result.code == 0) {
message.isRead = 0;
messageList.refresh();
_checkAllRead();
}
}
}
void _checkAllRead() {
allRead.value = messageList.every((msg) => msg.isRead == 1);
allRead.value = messageList.every((msg) => msg.isRead == 0);
}
}

View File

@@ -3,7 +3,7 @@ class MessageModel {
final String title;
final String content;
final String createTime;
int isRead; // 0: 读, 1:
int isRead; // 0: 读, 1:
MessageModel({
required this.id,