finishCommit

This commit is contained in:
atseirjo
2026-07-23 09:17:56 +02:00
parent 9f7ee3f356
commit c8a3cc9812
12 changed files with 822 additions and 175 deletions
+200 -84
View File
@@ -1,6 +1,11 @@
import 'dart:convert';
import 'package:flutter/foundation.dart';
import 'package:get/get.dart';
import 'package:flutter/material.dart';
import 'package:get_storage/get_storage.dart';
import 'package:http/http.dart' as http;
import '../models/response_output.dart';
import '../helper/constants.dart';
@@ -14,74 +19,193 @@ class HomeController extends GetxController {
final currentView = MainView.dashboard.obs;
//--------------Settings View---------------------------
final askiUserController = TextEditingController().obs;
final askiPasswordController = TextEditingController().obs;
final loginUrlController = TextEditingController().obs;
final userWebMethodesController = TextEditingController().obs;
final passwordWebMethodesController = TextEditingController().obs;
final powerUrlController = TextEditingController().obs;
final pvTraunDeviceController = TextEditingController().obs;
final pvTraunDeviceMeterIdPVController = TextEditingController().obs;
final pvTraunDeviceMeterIdImportController = TextEditingController().obs;
final pvSarleinsbachDeviceController = TextEditingController().obs;
final pvSarleinsbachDeviceMeterIdPV01Controller = TextEditingController().obs;
final pvSarleinsbachDeviceMeterIdPV02Controller = TextEditingController().obs;
final pvSarleinsbachDeviceMeterIdPV03Controller = TextEditingController().obs;
final pvSarleinsbachDeviceMeterIdImportController = TextEditingController().obs;
final pvLannachDeviceController = TextEditingController().obs;
final pvLannachDeviceMeterIdPVController = TextEditingController().obs;
final pvLannachDeviceMeterIdImportController = TextEditingController().obs;
void saveSettings() {
String askiUser = askiUserController.value.text;
String askiPassword = askiPasswordController.value.text;
String loginUrl = loginUrlController.value.text;
String powerUrl = powerUrlController.value.text;
//traun
String pvTraunDevice = pvTraunDeviceController.value.text;
int pvTraunDeviceMeterIdPV = int.parse(pvTraunDeviceMeterIdPVController.value.text);
int pvTraunDeviceMeterIdImport = int.parse(pvTraunDeviceMeterIdImportController.value.text);
//sarleinsbach
String pvSarleinsbachDevice = pvSarleinsbachDeviceController.value.text;
int pvSarleinsbachDeviceMeterIdPV01 = int.parse(pvSarleinsbachDeviceMeterIdPV01Controller.value.text);
int pvSarleinsbachDeviceMeterIdPV02 = int.parse(pvSarleinsbachDeviceMeterIdPV02Controller.value.text);
int pvSarleinsbachDeviceMeterIdPV03 = int.parse(pvSarleinsbachDeviceMeterIdPV03Controller.value.text);
int pvSarleinsbachDeviceMeterIdImport = int.parse(pvSarleinsbachDeviceMeterIdImportController.value.text);
//lannach
String pvLannachDevice = pvLannachDeviceController.value.text;
int pvLannachDeviceMeterIdPV = int.parse(pvLannachDeviceMeterIdPVController.value.text);
int pvLannachDeviceMeterIdImport = int.parse(pvLannachDeviceMeterIdImportController.value.text);
String wbUser = userWebMethodesController.value.text;
String wbPassword = passwordWebMethodesController.value.text;
String wbPowerUrl = powerUrlController.value.text;
boxSettings.write('askiUser', askiUser);
boxSettings.write('askiPassword', askiPassword);
boxSettings.write('loginUrl', loginUrl);
boxSettings.write('powerUrl', powerUrl);
boxSettings.write('pvTraunDevice', pvTraunDevice);
boxSettings.write('pvTraunDeviceMeterIdPV', pvTraunDeviceMeterIdPV);
boxSettings.write('pvTraunDeviceMeterIdImport', pvTraunDeviceMeterIdImport);
boxSettings.write('pvSarleinsbachDevice', pvSarleinsbachDevice);
boxSettings.write('pvSarleinsbachDeviceMeterIdPV01', pvSarleinsbachDeviceMeterIdPV01);
boxSettings.write('pvSarleinsbachDeviceMeterIdPV02', pvSarleinsbachDeviceMeterIdPV02);
boxSettings.write('pvSarleinsbachDeviceMeterIdPV03', pvSarleinsbachDeviceMeterIdPV03);
boxSettings.write('pvSarleinsbachDeviceMeterIdImport', pvSarleinsbachDeviceMeterIdImport);
boxSettings.write('pvLannachDevice', pvLannachDevice);
boxSettings.write('pvLannachDeviceMeterIdPV', pvLannachDeviceMeterIdPV);
boxSettings.write('pvLannachDeviceMeterIdImport', pvLannachDeviceMeterIdImport);
boxSettings.write('wbUser', wbUser);
boxSettings.write('wbPassword', wbPassword);
boxSettings.write('wbPowerUrl', wbPowerUrl);
kDisplaySnackBarGreen("Settings saved successfully!");
print('Einstellungen gespeichert:');
print('ASKI User: $askiUser');
print('ASKI Password: $askiPassword');
print('Login URL: $loginUrl');
print('Power URL: $powerUrl');
print('Admin User: $wbUser');
print('Admin Password: $wbPassword');
print('Web Methodes Power URL: $wbPowerUrl');
}
//------------------------------------------------------
// http get request to fetch data from the provided URL
//------------------------------------------------------
final dateFromToIsoController = TextEditingController().obs;
final dateToIsoController = TextEditingController().obs;
final inputSwitchBranches = RxnString('TraunPV');
final responseOutputTraunPV = ResponseOutput().obs;
final responseOutputTraunImport = ResponseOutput().obs;
final responseOutputSarleinsbachPV = ResponseOutput().obs;
final responseOutputSarleinsbachImport = ResponseOutput().obs;
final responseOutputLannachPV = ResponseOutput().obs;
final responseOutputLannachImport = ResponseOutput().obs;
/// Map: Branch → (PV Observable, Import Observable)
Map<String, Map<String, dynamic>> get _branchConfig => {
'TraunPV': {
'pv': responseOutputTraunPV,
'import': responseOutputTraunImport,
'pvSuffix': 'TraunPV',
'importSuffix': 'TraunImport',
},
'TraunImport': {
'pv': responseOutputTraunPV,
'import': responseOutputTraunImport,
'pvSuffix': 'TraunPV',
'importSuffix': 'TraunImport',
},
'SarleinsbachPV': {
'pv': responseOutputSarleinsbachPV,
'import': responseOutputSarleinsbachImport,
'pvSuffix': 'SarleinsbachPV',
'importSuffix': 'SarleinsbachImport',
},
'SarleinsbachImport': {
'pv': responseOutputSarleinsbachPV,
'import': responseOutputSarleinsbachImport,
'pvSuffix': 'SarleinsbachPV',
'importSuffix': 'SarleinsbachImport',
},
'LannachPV': {
'pv': responseOutputLannachPV,
'import': responseOutputLannachImport,
'pvSuffix': 'LannachPV',
'importSuffix': 'LannachImport',
},
'LannachImport': {
'pv': responseOutputLannachPV,
'import': responseOutputLannachImport,
'pvSuffix': 'LannachPV',
'importSuffix': 'LannachImport',
},
};
void fetchData() async {
final inputFromIso = dateFromToIsoController.value.text;
final inputToIso = dateToIsoController.value.text;
final branch = inputSwitchBranches.value;
if (branch == null || branch.isEmpty) {
kDisplaySnackBarRed('Ungültiger Standort ausgewählt.');
return;
}
final baseUrl = _getBaseUrl();
if (baseUrl.isEmpty) {
kDisplaySnackBarRed('Bitte zuerst die Server-URL eintragen.');
return;
}
final config = _branchConfig[branch];
if (config == null) {
kDisplaySnackBarRed('Unbekannte Branche: $branch');
return;
}
final credentials =
'${userWebMethodesController.value.text}:${passwordWebMethodesController.value.text}';
final basicAuth = 'Basic ${base64Encode(utf8.encode(credentials))}';
final baseUri = Uri.parse(baseUrl);
try {
// Fetch PV Daten
await _fetchAndStore(baseUri, inputFromIso, inputToIso,
config['pvSuffix'], config['pv'], basicAuth);
// Fetch Import Daten
await _fetchAndStore(baseUri, inputFromIso, inputToIso,
config['importSuffix'], config['import'], basicAuth);
} catch (e) {
print('Error: $e');
kDisplaySnackBarRed('Netzwerkfehler: $e');
}
}
/// Hilfsfunktion - reduziert Codeverdoppelung
Future<void> _fetchAndStore(
Uri baseUri,
String inputFromIso,
String inputToIso,
String switchBranch,
dynamic responseObservable,
String basicAuth,
) async {
final uri = baseUri.replace(
queryParameters: {
...baseUri.queryParameters,
'InputFromIso': inputFromIso,
'InputToIso': inputToIso,
'InputSwitchBranches': switchBranch,
},
);
try {
final response = await http.get(
uri,
headers: {'Authorization': basicAuth, 'Accept': 'application/json'},
);
final statusGroup = response.statusCode ~/ 100;
if (statusGroup == 2) {
print('$switchBranch erfolgreich geladen');
responseObservable.value = ResponseOutput.fromJson(jsonDecode(response.body));
} else if (statusGroup == 4) {
kDisplaySnackBarRed('Fehler 4xx: ${response.statusCode}');
} else if (statusGroup == 5) {
kDisplaySnackBarRed('Fehler 5xx: ${response.statusCode}');
} else {
kDisplaySnackBarRed('Fehler: ${response.statusCode}');
}
} catch (e) {
print('Error fetching $switchBranch: $e');
rethrow;
}
}
/// Wählt die richtige Base-URL:
/// Web: localhost:3000 (Reverse Proxy)
/// Desktop: Direkt von Settings
String _getBaseUrl() {
final settingsUrl = powerUrlController.value.text.trim();
// Auf Web: verwende Reverse Proxy auf localhost:3000
if (kIsWeb) {
return 'http://localhost:3000/invoke/IFN_ASKI_Service.flows/getAskiData?';
}
// Auf Desktop (Windows, Linux, macOS): direkt von Settings
return settingsUrl;
}
void changeView(MainView view) {
currentView.value = view;
if (currentView.value == MainView.dashboard) {
inputSwitchBranches.value = 'TraunPV';
} else if (currentView.value == MainView.traun) {
inputSwitchBranches.value = 'TraunPV';
} else if (currentView.value == MainView.sarleinsbach) {
inputSwitchBranches.value = 'SarleinsbachPV';
} else if (currentView.value == MainView.lannach) {
inputSwitchBranches.value = 'LannachPV';
}
if (currentView.value != MainView.dashboard) {
fetchData(); // Fetch data whenever the view changes
}
}
void toggleDrawer() {
@@ -100,49 +224,41 @@ class HomeController extends GetxController {
}
}
@override
@override
void onInit() {
super.onInit();
_readStorageData();
}
void _readStorageData() {
bool hasAskiUser = boxSettings.hasData('askiUser');
if (hasAskiUser) {
askiUserController.value.text = boxSettings.read('askiUser');
bool hasWbUser = boxSettings.hasData('wbUser');
if (hasWbUser) {
userWebMethodesController.value.text = boxSettings.read('wbUser');
}
bool hasAskiPassword = boxSettings.hasData('askiPassword');
if (hasAskiPassword) {
askiPasswordController.value.text = boxSettings.read('askiPassword');
bool hasWbPassword = boxSettings.hasData('wbPassword');
if (hasWbPassword) {
passwordWebMethodesController.value.text = boxSettings.read('wbPassword');
}
bool hasLoginUrl = boxSettings.hasData('loginUrl');
if (hasLoginUrl) {
loginUrlController.value.text = boxSettings.read('loginUrl');
}
bool hasPowerUrl = boxSettings.hasData('powerUrl');
if (hasPowerUrl) {
powerUrlController.value.text = boxSettings.read('powerUrl');
bool hasWbPowerUrl = boxSettings.hasData('wbPowerUrl');
if (hasWbPowerUrl) {
powerUrlController.value.text = boxSettings.read('wbPowerUrl');
}
//fromDateTimeIso and toDateTimeIso
dateFromToIsoController.value.text = DateTime(
DateTime.now().year,
DateTime.now().month,
DateTime.now().day,
).toIso8601String();
dateToIsoController.value.text = DateTime.now().toIso8601String();
}
@override
void onClose() {
askiUserController.close();
askiPasswordController.close();
loginUrlController.close();
userWebMethodesController.close();
powerUrlController.close();
pvTraunDeviceController.close();
pvTraunDeviceMeterIdPVController.close();
pvTraunDeviceMeterIdImportController.close();
pvSarleinsbachDeviceController.close();
pvSarleinsbachDeviceMeterIdPV01Controller.close();
pvSarleinsbachDeviceMeterIdPV02Controller.close();
pvSarleinsbachDeviceMeterIdPV03Controller.close();
pvSarleinsbachDeviceMeterIdImportController.close();
pvLannachDeviceController.close();
pvLannachDeviceMeterIdPVController.close();
pvLannachDeviceMeterIdImportController.close();
passwordWebMethodesController.close();
dateFromToIsoController.close();
dateToIsoController.close();
super.onClose();
}
}