You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
120 lines
3.5 KiB
120 lines
3.5 KiB
import 'package:get/get.dart';
|
|
import 'package:flutter/material.dart';
|
|
import '../../../data/services/usage_stats_service.dart';
|
|
import '../../../core/utils/logger.dart';
|
|
|
|
class TranslationCostController extends GetxController {
|
|
final UsageStatsService _usageService = Get.find<UsageStatsService>();
|
|
final RxMap<String, double> costConfig = <String, double>{}.obs;
|
|
final RxDouble dailyCostThreshold = 10.0.obs;
|
|
final RxDouble monthlyCostThreshold = 300.0.obs;
|
|
final translationCostController = TextEditingController();
|
|
final asrCostController = TextEditingController();
|
|
final ttsCostController = TextEditingController();
|
|
final aiSummaryCostController = TextEditingController();
|
|
final dailyThresholdController = TextEditingController();
|
|
final monthlyThresholdController = TextEditingController();
|
|
final isLoading = false.obs;
|
|
final isSaving = false.obs;
|
|
|
|
@override
|
|
void onInit() {
|
|
super.onInit();
|
|
}
|
|
|
|
@override
|
|
void onClose() {
|
|
translationCostController.dispose();
|
|
asrCostController.dispose();
|
|
ttsCostController.dispose();
|
|
aiSummaryCostController.dispose();
|
|
dailyThresholdController.dispose();
|
|
monthlyThresholdController.dispose();
|
|
super.onClose();
|
|
}
|
|
|
|
void _loadCurrentConfig() {}
|
|
|
|
Future<void> saveConfig() async {}
|
|
|
|
void resetToDefault() {}
|
|
|
|
bool _validateInputs() {
|
|
try {
|
|
final translationCost = double.parse(translationCostController.text);
|
|
final asrCost = double.parse(asrCostController.text);
|
|
final ttsCost = double.parse(ttsCostController.text);
|
|
final aiSummaryCost = double.parse(aiSummaryCostController.text);
|
|
final dailyThreshold = double.parse(dailyThresholdController.text);
|
|
final monthlyThreshold = double.parse(monthlyThresholdController.text);
|
|
if (translationCost < 0 ||
|
|
asrCost < 0 ||
|
|
ttsCost < 0 ||
|
|
aiSummaryCost < 0) {
|
|
_showErrorSnackbar('成本不能为负数');
|
|
return false;
|
|
}
|
|
if (dailyThreshold < 0 || monthlyThreshold < 0) {
|
|
_showErrorSnackbar('预警阈值不能为负数');
|
|
return false;
|
|
}
|
|
if (dailyThreshold > monthlyThreshold) {
|
|
_showErrorSnackbar('日预警阈值不能大于月预警阈值');
|
|
return false;
|
|
}
|
|
return true;
|
|
} catch (e) {
|
|
_showErrorSnackbar('请输入有效的数字');
|
|
return false;
|
|
}
|
|
}
|
|
|
|
double calculateEstimatedMonthlyCost() {
|
|
return 0.0;
|
|
}
|
|
|
|
List<String> getCostSavingTips() {
|
|
return [];
|
|
}
|
|
|
|
void _showSuccessSnackbar(String message) {
|
|
Get.snackbar(
|
|
'成功',
|
|
message,
|
|
snackPosition: SnackPosition.TOP,
|
|
backgroundColor: Get.theme.colorScheme.primary.withValues(alpha: 0.1),
|
|
colorText: Get.theme.colorScheme.primary,
|
|
duration: const Duration(seconds: 3),
|
|
);
|
|
}
|
|
|
|
void _showErrorSnackbar(String message) {
|
|
Get.snackbar(
|
|
'错误',
|
|
message,
|
|
snackPosition: SnackPosition.TOP,
|
|
backgroundColor: Get.theme.colorScheme.error.withValues(alpha: 0.1),
|
|
colorText: Get.theme.colorScheme.error,
|
|
duration: const Duration(seconds: 3),
|
|
);
|
|
}
|
|
|
|
void _showInfoSnackbar(String message) {
|
|
Get.snackbar(
|
|
'提示',
|
|
message,
|
|
snackPosition: SnackPosition.TOP,
|
|
backgroundColor: Get.theme.colorScheme.surface.withValues(alpha: 0.9),
|
|
colorText: Get.theme.colorScheme.onSurface,
|
|
duration: const Duration(seconds: 3),
|
|
);
|
|
}
|
|
|
|
String formatCost(double cost) {
|
|
return '¥${cost.toStringAsFixed(2)}';
|
|
}
|
|
|
|
String formatPercentage(double percentage) {
|
|
return '${percentage.toStringAsFixed(1)}%';
|
|
}
|
|
}
|
|
|