You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
311 lines
10 KiB
Dart
311 lines
10 KiB
Dart
import 'dart:convert';
|
|
|
|
import 'package:flutter/foundation.dart';
|
|
import 'package:test_sa/controllers/api_routes/api_manager.dart';
|
|
import 'package:test_sa/controllers/api_routes/urls.dart';
|
|
import 'package:test_sa/modules/asset_tracking/models/coordinates_model.dart';
|
|
import 'package:test_sa/modules/asset_tracking/models/asset_tracking_search_model.dart';
|
|
import 'package:test_sa/views/widgets/equipment/asset_tag_model.dart';
|
|
|
|
import 'models/asset_tracking_model.dart';
|
|
import 'models/floor_map_model.dart';
|
|
import 'models/penguin_site_model.dart';
|
|
import 'models/zone_data_model.dart';
|
|
|
|
class AssetTrackingProvider extends ChangeNotifier {
|
|
bool isLoading = false;
|
|
bool isNextPageLoading = false;
|
|
final pageItemNumber = 12;
|
|
int pageNo = 1;
|
|
bool nextPage = false;
|
|
List<AssetTrackingModel> assetsList = [];
|
|
List<AssetTrackingModel> assetsOnTheFloorList = [];
|
|
|
|
List<ZoneModel> zonesList = [];
|
|
ZoneModel? selectedZone;
|
|
|
|
List<PenguinSiteModel> sitesList = [];
|
|
PenguinSiteModel? selectedSite;
|
|
|
|
List<PenguinSiteModel> buildList = [];
|
|
PenguinSiteModel? selectedBuilding;
|
|
List<PenguinSiteModel> floorList = [];
|
|
PenguinSiteModel? selectedFloor;
|
|
|
|
List<Coordinates> coordinates = [];
|
|
|
|
void calculateCoordinates() {
|
|
coordinates.clear();
|
|
coordinates.addAll(selectedBuilding!.coordinates!.map((e) => Coordinates(latitude: e.latitude, longitude: e.longitude)).toList());
|
|
notify();
|
|
}
|
|
|
|
// List<ZoneModel> getFilteredZones() {
|
|
// if (zonesList.isEmpty || selectedSite == null || selectedBuilding == null) {
|
|
// return [];
|
|
// } else {
|
|
// return zonesList.where((zone) => zone.siteId == selectedSite!.id).toList();
|
|
// }
|
|
// }
|
|
|
|
String get getExpansionHeader =>
|
|
(selectedBuilding == null || selectedBuilding == null) ? "Search Floor Map" : "${selectedSite!.label} > ${selectedBuilding!.label} > ${selectedFloor?.label ?? "Select Floor"}";
|
|
|
|
reset() {
|
|
isLoading = false;
|
|
isNextPageLoading = false;
|
|
pageNo = 1;
|
|
nextPage = false;
|
|
selectedFloor = null;
|
|
selectedBuilding = null;
|
|
selectedSite = null;
|
|
assetsList = [];
|
|
assetsOnTheFloorList = [];
|
|
notify();
|
|
}
|
|
|
|
notify() {
|
|
notifyListeners();
|
|
}
|
|
|
|
Future<int> getAssetsFromPenguin({bool loadMore = false, AssetTrackingSearchModel? searchModel}) async {
|
|
if (isLoading || isNextPageLoading) return -2;
|
|
if (loadMore) {
|
|
isNextPageLoading = true;
|
|
pageNo += 1;
|
|
} else {
|
|
isLoading = true;
|
|
pageNo = 1;
|
|
}
|
|
notifyListeners();
|
|
try {
|
|
final Map<String, dynamic> payload = {
|
|
"pageSize": pageItemNumber,
|
|
"pageNumber": pageNo,
|
|
};
|
|
|
|
if (searchModel != null) {
|
|
payload.addAll(searchModel.toJson());
|
|
}
|
|
final response = await ApiManager.instance.post(URLs.getAssetsFromPenguin, body: payload);
|
|
if (response.statusCode >= 200 && response.statusCode < 300) {
|
|
final Map<String, dynamic> jsonData = json.decode(response.body);
|
|
List list = jsonData["data"] ?? [];
|
|
List<AssetTrackingModel> responseAssetList = list.map((item) => AssetTrackingModel.fromJson(item)).toList();
|
|
|
|
if (loadMore) {
|
|
assetsList.addAll(responseAssetList);
|
|
} else {
|
|
assetsList = responseAssetList;
|
|
}
|
|
final int totalRows = (jsonData["totalRows"] as int?) ?? assetsList.length;
|
|
nextPage = (assetsList.length) < totalRows;
|
|
} else {
|
|
if (loadMore) pageNo -= 1;
|
|
}
|
|
isLoading = false;
|
|
isNextPageLoading = false;
|
|
notifyListeners();
|
|
return response.statusCode;
|
|
} catch (error) {
|
|
if (loadMore) pageNo -= 1;
|
|
isLoading = false;
|
|
isNextPageLoading = false;
|
|
notifyListeners();
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
Future getBuildingMapFromPenguin() async {
|
|
if (zonesList.isNotEmpty) {
|
|
await Future.delayed(const Duration(milliseconds: 250));
|
|
// return;
|
|
}
|
|
try {
|
|
final response = await ApiManager.instance.get(URLs.getPenguinBuildings + "");
|
|
if (response.statusCode >= 200 && response.statusCode < 300) {
|
|
final Map<String, dynamic> jsonData = json.decode(response.body);
|
|
List list = jsonData["data"];
|
|
zonesList.addAll(list.map((item) => ZoneModel.fromJson(item)).toList());
|
|
notify();
|
|
}
|
|
} catch (error) {
|
|
print("getZoneFromPenguin:Error:$error");
|
|
}
|
|
}
|
|
|
|
Future getZoneFromPenguin() async {
|
|
if (zonesList.isNotEmpty) {
|
|
await Future.delayed(const Duration(milliseconds: 250));
|
|
calculateCoordinates();
|
|
return;
|
|
}
|
|
try {
|
|
final response = await ApiManager.instance.get(URLs.getPenguinZones);
|
|
if (response.statusCode >= 200 && response.statusCode < 300) {
|
|
final Map<String, dynamic> jsonData = json.decode(response.body);
|
|
List list = jsonData["data"];
|
|
zonesList.addAll(list.map((item) => ZoneModel.fromJson(item)).toList());
|
|
calculateCoordinates();
|
|
// notify();
|
|
}
|
|
} catch (error) {
|
|
print("getZoneFromPenguin:Error:$error");
|
|
}
|
|
}
|
|
|
|
Future getAssetsFromPenguinByFloor() async {
|
|
try {
|
|
assetsOnTheFloorList.clear();
|
|
Map<String, dynamic> body = {
|
|
"campusId": selectedSite!.id,
|
|
"venueIds": [selectedBuilding!.id]
|
|
};
|
|
if (selectedFloor != null) {
|
|
body["floorIds"] = [selectedFloor!.id];
|
|
}
|
|
final response = await ApiManager.instance.post(URLs.getAssetsFromPenguin, body: body);
|
|
if (response.statusCode >= 200 && response.statusCode < 300) {
|
|
final Map<String, dynamic> jsonData = json.decode(response.body);
|
|
List list = jsonData["data"];
|
|
assetsOnTheFloorList.addAll(list.map((item) => AssetTrackingModel.fromJson(item)).toList());
|
|
}
|
|
notifyListeners();
|
|
} catch (error) {
|
|
notifyListeners();
|
|
}
|
|
}
|
|
|
|
Future<FloorMapModel?> getFloorMap(int floorId) async {
|
|
FloorMapModel? floorMapModel;
|
|
try {
|
|
final response = await ApiManager.instance.get(URLs.getPenguinFloors + "/$floorId/maps");
|
|
if (response.statusCode >= 200 && response.statusCode < 300) {
|
|
floorMapModel = FloorMapModel.fromJson(json.decode(response.body)["data"]);
|
|
final geoJsonResponse = await ApiManager.instance.get(floorMapModel.geojsonUrl!);
|
|
floorMapModel.geojsonData = json.decode(geoJsonResponse.body);
|
|
}
|
|
return floorMapModel;
|
|
} catch (error) {
|
|
return floorMapModel;
|
|
}
|
|
}
|
|
|
|
Future getPenguinSites() async {
|
|
try {
|
|
sitesList.clear();
|
|
buildList.clear();
|
|
floorList.clear();
|
|
selectedSite = null;
|
|
selectedBuilding = null;
|
|
selectedFloor = null;
|
|
final response = await ApiManager.instance.get(URLs.getPenguinSites);
|
|
if (response.statusCode >= 200 && response.statusCode < 300) {
|
|
final Map<String, dynamic> jsonData = json.decode(response.body);
|
|
List list = jsonData["data"];
|
|
sitesList.addAll(list.map((item) => PenguinSiteModel.fromJson(item)).toList());
|
|
}
|
|
notifyListeners();
|
|
} catch (error) {
|
|
notifyListeners();
|
|
}
|
|
}
|
|
|
|
Future<List<PenguinSiteModel>> getPenguinDepartments(int id) async {
|
|
List<PenguinSiteModel> sitesList = [];
|
|
try {
|
|
final response = await ApiManager.instance.get(URLs.getPenguinDepartments + "?siteId=$id");
|
|
if (response.statusCode >= 200 && response.statusCode < 300) {
|
|
final Map<String, dynamic> jsonData = json.decode(response.body);
|
|
List list = jsonData["data"];
|
|
sitesList.addAll(list.map((item) => PenguinSiteModel.fromJson(item)).toList());
|
|
}
|
|
return sitesList;
|
|
} catch (error) {
|
|
return sitesList;
|
|
}
|
|
}
|
|
|
|
Future getPenguinBuildings(int id) async {
|
|
try {
|
|
buildList.clear();
|
|
floorList.clear();
|
|
selectedBuilding = null;
|
|
selectedFloor = null;
|
|
final response = await ApiManager.instance.get(URLs.getPenguinBuildings + "?siteId=$id");
|
|
if (response.statusCode >= 200 && response.statusCode < 300) {
|
|
final Map<String, dynamic> jsonData = json.decode(response.body);
|
|
List list = jsonData["data"];
|
|
buildList.addAll(list.map((item) => PenguinSiteModel.fromJson(item)).toList());
|
|
}
|
|
notifyListeners();
|
|
} catch (error) {
|
|
notifyListeners();
|
|
}
|
|
}
|
|
|
|
Future getPenguinFloors(int id) async {
|
|
try {
|
|
floorList.clear();
|
|
selectedFloor = null;
|
|
final response = await ApiManager.instance.get(URLs.getPenguinFloors + "?buildingId=$id");
|
|
if (response.statusCode >= 200 && response.statusCode < 300) {
|
|
final Map<String, dynamic> jsonData = json.decode(response.body);
|
|
List list = jsonData["data"];
|
|
floorList.addAll(list.map((item) => PenguinSiteModel.fromJson(item)).toList());
|
|
}
|
|
notifyListeners();
|
|
} catch (error) {
|
|
notifyListeners();
|
|
}
|
|
}
|
|
|
|
int assetTagPageNumber = 1;
|
|
int? totalAssetTags;
|
|
List<AssetTagModel> tagList = [];
|
|
|
|
bool isLoadingAssetTags = false;
|
|
|
|
void resetAssetTagData() {
|
|
tagList.clear();
|
|
assetTagPageNumber = 1;
|
|
totalAssetTags = null;
|
|
}
|
|
|
|
bool get isCanLoadMore => tagList.length < (totalAssetTags ?? 0);
|
|
|
|
Future getPenguinAssetTags() async {
|
|
if (isLoadingAssetTags) return;
|
|
try {
|
|
isLoadingAssetTags = true;
|
|
notify();
|
|
final response = await ApiManager.instance.get(URLs.getPenguinAssetTags + "?pageNumber=$assetTagPageNumber&tagStatus=1");
|
|
if (response.statusCode >= 200 && response.statusCode < 300) {
|
|
final Map<String, dynamic> jsonData = json.decode(response.body);
|
|
List list = jsonData["response"]["data"];
|
|
totalAssetTags ??= jsonData["response"]["totalRows"];
|
|
tagList.addAll(list.map((item) => AssetTagModel.fromJson(item)).toList());
|
|
if (tagList.length < totalAssetTags!) {
|
|
assetTagPageNumber += 1;
|
|
}
|
|
}
|
|
} catch (error) {}
|
|
isLoadingAssetTags = false;
|
|
notify();
|
|
}
|
|
|
|
Future<List> linkAssetWithPenguinTag(int assetId, int penguinTagId) async {
|
|
try {
|
|
final response = await ApiManager.instance.get(URLs.getPenguinAssetTags);
|
|
if (response.statusCode >= 200 && response.statusCode < 300) {
|
|
final Map<String, dynamic> jsonData = json.decode(response.body);
|
|
List list = jsonData["data"];
|
|
return list;
|
|
}
|
|
return [];
|
|
} catch (error) {
|
|
return [];
|
|
}
|
|
}
|
|
}
|