import 'package:get/get.dart'; import 'package:get/get_core/src/get_main.dart'; import 'package:location/base/base_controller.dart'; import 'package:location/data/bean/track_daily_bean.dart'; import 'package:location/data/repositories/track_repository.dart'; import 'package:location/dialog/loading_dialog.dart'; import 'package:location/handler/error_handler.dart'; import 'package:location/module/track/track_controller.dart'; import 'package:location/module/track/track_day_detail/time_proportion/pie_chat_data.dart'; import 'package:location/resource/string.gen.dart'; import 'package:location/utils/common_expand.dart'; import 'package:location/utils/pair.dart'; import '../../../data/bean/track_days.dart'; import '../track_status.dart'; class TrackDayDetailController extends BaseController { final TrackDays days; late TrackRepository trackRepository; final RxBool _trackNoData = RxBool(false); final RxList trackDailyList = RxList(); final RxBool _isExpanded = RxBool(false); final RxBool _isRequested = RxBool(false); final RxBool _isHideExpand = RxBool(false); bool get isHideExpand => _isHideExpand.value; bool get isRequested => _isRequested.value; bool get isExpanded => _isExpanded.value; bool get trackNoData => _trackNoData.value; final Rxn> _expandSituation = Rxn(); Pair? get expandSituation => _expandSituation.value; final RxList pieChatData = RxList(); int indexPieChatColor = 0; final TrackController trackController = Get.find(); TrackDayDetailController(this.days, bool isExpand) { trackRepository = TrackRepository.getInstance(); _isExpanded.value = isExpand; } @override void onInit() { super.onInit(); _requestTrackDaily(); } void _requestTrackDaily() { _isRequested.value = false; CustomLoadingDialog.show(loadingTxt: StringName.trackLoadingTxt); trackRepository .trackDailyQuery( startTime: days.start, endTime: days.end, userId: trackController.userInfo?.id) .then((list) { CustomLoadingDialog.hide(); _isRequested.value = true; _trackNoData.value = (list == null || list.isEmpty == true); trackDailyList.assignAll(list ?? []); if (list != null && list.length == 1) { _isExpanded.value = true; _isHideExpand.value = true; } _dealPieChatData(); _dealTrackExpandData(); }).catchError((error) { CustomLoadingDialog.hide(); _isRequested.value = false; ErrorHandler.toastError(error); }); } void _dealPieChatData() { pieChatData.clear(); final list = trackDailyList; if (list.isEmpty) { return; } indexPieChatColor = 0; int totalDuration = 0; final Map addrMap = {}; for (var bean in list) { if (bean.status == TrackStatus.error) { continue; } final addr = bean.addr; if (addr == null) { continue; } if (indexPieChatColor >= pieChatColors.length) { indexPieChatColor = 0; } totalDuration += bean.duration; if (addrMap.containsKey(addr)) { addrMap[addr]!.duration += bean.duration; } else { addrMap[addr] = PieChatData( address: addr, duration: bean.duration, color: pieChatColors[indexPieChatColor++], ); } } for (var data in addrMap.values) { data.proportion = (data.duration / totalDuration * 100).toFormattedDouble(1); } pieChatData.addAll(addrMap.values.toList()); } void _dealTrackExpandData() { final list = trackDailyList; if (list.isNotEmpty && list.length > 1) { TrackExpandType? expandType; TrackDailyBean? expandBean; for (var i = 0; i < list.length; i++) { final bean = list[i]; if (bean.status == TrackStatus.error) { expandType = TrackExpandType.error; expandBean = bean; break; } else if (bean.status == TrackStatus.stay) { if (expandBean == null) { expandType = TrackExpandType.stay; expandBean = bean; } continue; } } if (expandType != null && expandBean != null) { if (expandType == TrackExpandType.error && list.indexOf(expandBean) == list.length - 1) { expandType = TrackExpandType.errorNow; } else if (expandType == TrackExpandType.stay && list.indexOf(expandBean) == list.length - 1) { expandType = TrackExpandType.stayNow; } _expandSituation.value = Pair(expandType, expandBean); } } } void onTrackDetailFoldClick() { _isExpanded.value = !_isExpanded.value; } }