|
|
@@ -2,6 +2,7 @@ import 'dart:async';
|
|
|
import 'dart:convert';
|
|
|
|
|
|
import 'package:flutter/cupertino.dart';
|
|
|
+import 'package:flutter_map/flutter_map.dart';
|
|
|
import 'package:get/get.dart';
|
|
|
import 'package:get/get_core/src/get_main.dart';
|
|
|
import 'package:location/base/base_controller.dart';
|
|
|
@@ -11,6 +12,7 @@ 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/module/track/track_util.dart';
|
|
|
import 'package:location/resource/string.gen.dart';
|
|
|
import 'package:location/sdk/wechat/wechat_share_util.dart';
|
|
|
import 'package:location/utils/async_util.dart';
|
|
|
@@ -19,6 +21,7 @@ import 'package:location/utils/pair.dart';
|
|
|
import 'package:location/utils/toast_util.dart';
|
|
|
import 'package:url_launcher/url_launcher.dart';
|
|
|
import '../../../data/api/response/track_daily_summary_response.dart';
|
|
|
+import '../../../data/bean/atmob_track_point.dart';
|
|
|
import '../../../data/bean/stream_chat_origin_data.dart';
|
|
|
import '../../../data/bean/track_days.dart';
|
|
|
import '../../../utils/capture_util.dart';
|
|
|
@@ -68,6 +71,10 @@ class TrackDayDetailController extends BaseController {
|
|
|
|
|
|
final RxnString _summaryError = RxnString();
|
|
|
|
|
|
+ CancelableFuture? requestTrackFuture;
|
|
|
+
|
|
|
+ List<AtmobTrackPoint>? trackOriginPoints;
|
|
|
+
|
|
|
String? get summaryError => _summaryError.value;
|
|
|
|
|
|
final GlobalKey shareGlobalKey = GlobalKey();
|
|
|
@@ -82,12 +89,91 @@ class TrackDayDetailController extends BaseController {
|
|
|
@override
|
|
|
void onInit() {
|
|
|
super.onInit();
|
|
|
- _requestTrackDaily();
|
|
|
+ _requestTrackData();
|
|
|
_requestTrackDailySummary();
|
|
|
- _requestTrackHistoryPoints();
|
|
|
}
|
|
|
|
|
|
- void _requestTrackHistoryPoints() {}
|
|
|
+ _requestTrackData() {
|
|
|
+ requestTrackFuture?.cancel();
|
|
|
+ requestTrackFuture = AsyncUtil.waitForAll(
|
|
|
+ [_requestTrackHistoryPoints(), _requestTrackDaily()]);
|
|
|
+ requestTrackFuture!.then((_) {
|
|
|
+ //组装地图新的数据
|
|
|
+ List<LatLng> points = [];
|
|
|
+ List<Marker> markers = [];
|
|
|
+
|
|
|
+ for (int i = 0; i < trackDailyList.length; i++) {
|
|
|
+ final bean = trackDailyList[i];
|
|
|
+ double? markerLatitude;
|
|
|
+ double? markerLongitude;
|
|
|
+ if (bean.status == TrackStatus.stay) {
|
|
|
+ //停留
|
|
|
+ markerLatitude = bean.lat;
|
|
|
+ markerLongitude = bean.lng;
|
|
|
+ points.add(
|
|
|
+ LatLng(latitude: markerLatitude, longitude: markerLongitude));
|
|
|
+ } else if (bean.status == TrackStatus.moving) {
|
|
|
+ //移动
|
|
|
+ final movePoints = TrackUtil.getTrackMovePoints(
|
|
|
+ trackOriginPoints, bean.start, bean.end);
|
|
|
+ points.addAll(movePoints);
|
|
|
+ continue;
|
|
|
+ } else if (bean.status == TrackStatus.error) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ MarkerType markerType;
|
|
|
+ String? markerName;
|
|
|
+ String? customAvatarUrl;
|
|
|
+ if (i == 0) {
|
|
|
+ //起点
|
|
|
+ markerType = MarkerType.traceStartPoint;
|
|
|
+ } else if (i == trackDailyList.length - 1) {
|
|
|
+ //终点
|
|
|
+ final userInfo = trackController.userInfo;
|
|
|
+ markerName = userInfo?.getUserNickName();
|
|
|
+ markerType = userInfo?.isMine == true
|
|
|
+ ? MarkerType.traceEndMinePoint
|
|
|
+ : MarkerType.traceEndMinePoint;
|
|
|
+ customAvatarUrl = userInfo?.avatar;
|
|
|
+ } else {
|
|
|
+ markerType = MarkerType.tracePassingPoint;
|
|
|
+ }
|
|
|
+ markers.add(Marker(
|
|
|
+ id: '${bean.start}',
|
|
|
+ markerName: markerName ?? '',
|
|
|
+ longitude: markerLongitude,
|
|
|
+ latitude: markerLatitude,
|
|
|
+ markerType: markerType,
|
|
|
+ customAvatarUrl: customAvatarUrl));
|
|
|
+ }
|
|
|
+ if (markers.last.markerType != MarkerType.traceEndMinePoint ||
|
|
|
+ markers.last.markerType != MarkerType.traceEndFriendPoint) {
|
|
|
+ markers.last.markerType = trackController.userInfo?.isMine == true
|
|
|
+ ? MarkerType.traceEndMinePoint
|
|
|
+ : MarkerType.traceEndFriendPoint;
|
|
|
+ markers.last.markerName =
|
|
|
+ trackController.userInfo?.getUserNickName() ?? '';
|
|
|
+ markers.last.customAvatarUrl = trackController.userInfo?.avatar;
|
|
|
+ }
|
|
|
+ trackController.showMapTrack(points, markers);
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ Future<void> _requestTrackHistoryPoints() {
|
|
|
+ final userInfo = trackController.userInfo;
|
|
|
+ trackOriginPoints = null;
|
|
|
+ return Future.value().then((_) {
|
|
|
+ if (userInfo?.virtual == true) {
|
|
|
+ return trackRepository.queryVirtualTrack();
|
|
|
+ } else {
|
|
|
+ return trackRepository.queryTrack(
|
|
|
+ startTime: days.start, endTime: days.end, userId: userInfo?.id);
|
|
|
+ }
|
|
|
+ }).then((data) {
|
|
|
+ trackOriginPoints = data.trackPoints;
|
|
|
+ });
|
|
|
+ }
|
|
|
|
|
|
void _requestTrackDailySummary() {
|
|
|
summaryFuture?.cancel();
|
|
|
@@ -112,10 +198,10 @@ class TrackDayDetailController extends BaseController {
|
|
|
});
|
|
|
}
|
|
|
|
|
|
- void _requestTrackDaily() {
|
|
|
+ Future<void> _requestTrackDaily() {
|
|
|
_isRequested.value = false;
|
|
|
CustomLoadingDialog.show(loadingTxt: StringName.trackLoadingTxt);
|
|
|
- trackRepository
|
|
|
+ return trackRepository
|
|
|
.trackDailyQuery(
|
|
|
startTime: days.start,
|
|
|
endTime: days.end,
|
|
|
@@ -287,5 +373,6 @@ class TrackDayDetailController extends BaseController {
|
|
|
super.onClose();
|
|
|
_streamChatSubscription?.cancel();
|
|
|
graduallyController.dispose();
|
|
|
+ requestTrackFuture?.cancel();
|
|
|
}
|
|
|
}
|