Files
tuiche/lib/controller/message/message_controller.dart
2025-08-26 17:56:36 +08:00

291 lines
10 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import 'dart:convert';
import 'package:EasyDartModule/EasyDartModule.dart';
import 'package:ef/ef.dart';
import 'package:flutter/material.dart';
import 'package:flutterflow_ui/flutterflow_ui.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:vbvs_app/common/color/ServiceConstant.dart';
import 'package:vbvs_app/common/color/appConstants.dart';
import 'package:vbvs_app/common/color/app_uri_status.dart';
import 'package:vbvs_app/common/util/DailyLogUtils.dart';
import 'package:vbvs_app/common/util/MyUtils.dart';
import 'package:vbvs_app/common/util/requestWithLog.dart';
import 'package:vbvs_app/component/tool/TopSlideNotification.dart';
import 'package:vbvs_app/enum/APPPackageType.dart';
import 'package:vbvs_app/model/api_response.dart';
part 'message_controller.g.dart'; // 由json_serializable自动生成的部分
@JsonSerializable()
class MessageModel {
int? type = 1; //设备类型 1:体征消息 2.系统消息
int? body_message_read = 0; //体征消息 0已读 1未读
int? system_message_read = 0; //系统消息 0已读 1未读
MessageModel();
// 从JSON反序列化时的异常处理
factory MessageModel.fromJson(Map<String, dynamic> json) {
try {
return _$MessageModelFromJson(json);
} catch (e) {
// 在实际应用中,应该有更细致的异常处理策略和错误日志
return MessageModel(); // 或者返回一个带有错误信息的特定DeviceInfoModel实例
}
}
// 序列化为JSON时的异常处理
Map<String, dynamic> toJson() => _$MessageModelToJson(this);
}
class MessageController extends GetControllerEx<MessageModel> {
MessageController() {
attr = GetModel(MessageModel()).obs;
}
RxList messageList = [].obs;
int bodyPage = 1;
int systemPage = 1;
Future<void> loadMore(String type) async {
if (type == "app_vsm") {
bodyPage++;
await getMessageList(key: "app_vsm", page: bodyPage, append: true);
} else {
systemPage++;
await getMessageList(key: "app_system", page: systemPage, append: true);
}
}
Future<ApiResponse> getMessageList(
{String? key, int page = 1, int limit = 20, bool append = false}) async {
try {
ApiResponse apiResponse = ApiResponse(code: -1, msg: "请求失败".tr);
String serviceAddress = ServiceConstant.service_address;
String serviceName = ServiceConstant.server_service;
String serviceApi = ServiceConstant.message_list;
String messageType;
if (key != null && key.isNotEmpty) {
messageType = key;
} else if (model.type == 1) {
messageType = "app_vsm";
} else {
messageType = "app_system";
}
String queryUrl =
"${serviceAddress}${serviceName}${serviceApi}?type=${messageType}&page=$page&limit=$limit";
String? language = "";
if (AppConstants().ent_type == APPPackageType.MHT.code) {
if (mhLanguageController.selectLanguage != null) {
language = mhLanguageController.selectLanguage.value!.language_code;
}
} else {
if (languageController.selectLanguage != null) {
language = languageController.selectLanguage.value!.language_code;
}
}
if (language != null && language.isNotEmpty) {
if (queryUrl.contains("?")) {
queryUrl += "&lang=$language";
} else {
queryUrl += "?lang=$language";
}
}
var response = await EasyDartModule.dio.get(queryUrl);
if (response != null) {
var responseData =
response.data is String ? jsonDecode(response.data) : response.data;
ApiResponse res =
ApiResponse.fromJson(responseData, (object) => object);
MyUtils.formatResponse(res, "请求成功".tr, "请求失败".tr);
if (res.code == HttpStatusCodes.ok) {
if (append) {
messageList.addAll(res.data ?? []);
} else {
messageList.assignAll(res.data ?? []);
}
updateAll();
return res;
}
} else {
return ApiResponse(code: -1, msg: "失败".tr);
}
return apiResponse;
} catch (e) {
EasyDartModule.logger.info("设备请求列表: $e");
DailyLogUtils.writeLog("设备请求列表: $e");
}
return ApiResponse(code: -1, msg: "未知错误".tr); // Default return statement
}
//获取消息已读未读
Future<ApiResponse> getMessageStatus() async {
try {
ApiResponse apiResponse = ApiResponse(code: -1, msg: "请求失败".tr);
// return apiResponse;
String serviceAddress = ServiceConstant.service_address;
String serviceName = ServiceConstant.server_service;
String serviceApi = ServiceConstant.message_read;
String queryUrl = "${serviceAddress}${serviceName}${serviceApi}";
String? language = "";
if (AppConstants().ent_type == APPPackageType.MHT.code) {
if (mhLanguageController.selectLanguage != null) {
language = mhLanguageController.selectLanguage.value!.language_code;
}
} else {
if (languageController.selectLanguage != null) {
language = languageController.selectLanguage.value!.language_code;
}
}
if (language != null && language.isNotEmpty) {
if (queryUrl.contains("?")) {
queryUrl += "&lang=$language";
} else {
queryUrl += "?lang=$language";
}
}
var response = await EasyDartModule.dio.get(queryUrl);
if (response != null) {
var responseData =
response.data is String ? jsonDecode(response.data) : response.data;
ApiResponse res =
ApiResponse.fromJson(responseData, (object) => object);
MyUtils.formatResponse(res, "请求成功".tr, "请求失败".tr);
if (res.code == HttpStatusCodes.ok) {
updateAll();
List dataList = res.data;
// 查找 type 为 app_vsm 的项
var vsmItem = dataList.firstWhere(
(e) => e['type'] == 'app_vsm',
orElse: () => null,
);
model.body_message_read =
(vsmItem?['count'] == null || vsmItem?['count'] == 0) ? 0 : 1;
// 查找 type 为 app_system 的项
var systemItem = dataList.firstWhere(
(e) => e['type'] == 'app_system',
orElse: () => null,
);
model.system_message_read =
(systemItem?['count'] == null || systemItem?['count'] == 0)
? 0
: 1;
updateAll();
return res;
}
} else {
return ApiResponse(code: -1, msg: "失败".tr);
}
return apiResponse;
} catch (e) {
EasyDartModule.logger.info("获取消息已读未读: $e");
DailyLogUtils.writeLog("获取消息已读未读: $e");
}
return ApiResponse(code: -1, msg: "未知错误".tr); // Default return statement
}
//更新消息已读
Future<ApiResponse> updateMessageStatus({String? type}) async {
EasyDartModule.logger.info("更新消息已读状态");
DailyLogUtils.writeLog("更新消息已读状态");
try {
ApiResponse apiResponse = ApiResponse(code: -1, msg: "操作失败".tr);
String serviceAddress = ServiceConstant.service_address;
String serviceName = ServiceConstant.server_service;
String serviceApi = ServiceConstant.message_read;
// 拼接 URL添加 type 参数
String queryUrl = "$serviceAddress$serviceName$serviceApi";
if (type != null && type.isNotEmpty) {
queryUrl += "?type=$type";
}
String? language = "";
if (AppConstants().ent_type == APPPackageType.MHT.code) {
if (mhLanguageController.selectLanguage != null) {
language = mhLanguageController.selectLanguage.value!.language_code;
}
} else {
if (languageController.selectLanguage != null) {
language = languageController.selectLanguage.value!.language_code;
}
}
if (language != null && language.isNotEmpty) {
if (queryUrl.contains("?")) {
queryUrl += "&lang=$language";
} else {
queryUrl += "?lang=$language";
}
}
if (type != null) {
queryUrl = "$queryUrl&type=$type";
}
queryUrl = "$queryUrl&mid=ALL";
var response = await EasyDartModule.dio.post(queryUrl);
if (response != null) {
var responseData =
response.data is String ? jsonDecode(response.data) : response.data;
ApiResponse res =
ApiResponse.fromJson(responseData, (object) => object);
MyUtils.formatResponse(res, "操作成功".tr, "操作成功".tr);
return res;
} else {
return ApiResponse(code: -1, msg: "失败".tr);
}
} catch (e) {
EasyDartModule.logger.info("更新消息已读状态->$e");
DailyLogUtils.writeLog("更新消息已读状态->$e");
return ApiResponse(code: -1, msg: "失败".tr);
}
}
Future<void> updateMessageReadStatus(BuildContext context, String messageType,
{String? mid, bool all = false}) async {
final serviceAddress = ServiceConstant.service_address;
final serviceName = ServiceConstant.server_service;
final serviceApi = ServiceConstant.message_read;
// 构建 query 参数
String queryUrl =
"$serviceAddress$serviceName$serviceApi?type=$messageType";
if (all) {
queryUrl += "&mid=ALL";
} else if (mid != null && mid.isNotEmpty) {
queryUrl += "&mid=$mid";
}
await requestWithLog(
logTitle: all ? '更新所有消息为已读' : '更新消息为已读',
method: MyHttpMethod.post,
queryUrl: queryUrl,
onSuccess: (res) {
if (res.code == HttpStatusCodes.ok) {
getMessageList(key: messageType);
getMessageStatus();
// ✅ 只有在 all 为 true 时才提示
if (all) {
TopSlideNotification.show(
context,
text: res.msg!,
textColor: Color(0XFF00C1AA),
);
}
}
},
onFailure: (res) {
TopSlideNotification.show(context,
text: res.msg!, textColor: Color(0xFFFF7159));
},
);
}
}