From 6351d00c4b72dff122b30688aef591ac2ea91666 Mon Sep 17 00:00:00 2001
From: hs <873121290@qq.com>
Date: Tue, 2 Sep 2025 16:22:17 +0800
Subject: [PATCH] =?UTF-8?q?=E3=80=82=E3=80=82=E3=80=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
assets/map/index.html | 17 +-
assets/map/test_baidu_map.html | 380 ------------------
lib/customWidget/BaiDuMap/Map_page.dart | 150 +++----
lib/customWidget/custom_button.dart | 4 +-
lib/customWidget/photo_picker_row.dart | 15 +-
.../picker/CupertinoDatePicker.dart | 130 ++++--
lib/customWidget/toast_util.dart | 40 +-
lib/http/ApiService.dart | 26 +-
.../Danger/danger_manager_detail_page.dart | 7 +-
.../punishment_manager_detail_page.dart | 3 -
.../SafeCheck/custom/safe_drawer_page.dart | 30 --
.../check_information_one_item.dart | 39 +-
.../hazard_registration_page.dart | 51 +--
.../app/Danger_paicha/quick_report_page.dart | 42 +-
.../home/NFC/nfc_check_danger_detail.dart | 42 --
.../safeCheck_assignment_detail_page.dart | 8 +-
.../Record/defend_record_detail_page.dart | 14 +-
.../Start/safeCheck_drawer_page.dart | 13 -
.../team_safety_commitment_apply.dart | 3 +
lib/pages/home/home_page.dart | 6 +
lib/pages/home/risk/risk_detail_page.dart | 38 +-
lib/pages/home/study/study_my_task_page.dart | 13 +-
lib/pages/home/study/study_score_page.dart | 6 +-
lib/pages/home/study/take_exam_page.dart | 137 ++++---
.../home/study/video_study_detail_page.dart | 4 +-
.../special_wrok/dangerous_options_page.dart | 3 -
.../aqjd_work_detail/hotwork_aqjd_detail.dart | 3 -
.../dh_work_detai/hotwork_apply_detail.dart | 10 +-
.../ysgd_work_detail/hotwork_ysgd_detail.dart | 8 +-
.../aqjd_work_detail/cutroad_aqjd_detail.dart | 3 -
.../dl_work_detai/cutroad_apply_detail.dart | 8 +-
.../ysgd_work_detail/cutroad_ysgd_detail.dart | 6 -
.../zyr_work_detail/cutroad_zyr_detail.dart | 3 -
.../breakground_aqjd_detail.dart | 3 -
.../breakground_apply_detail.dart | 8 +-
.../breakground_ysgd_detail.dart | 4 +-
.../breakground_zyr_detail.dart | 3 -
.../hoistwork_aqjd_detail.dart | 3 -
.../dz_work_detai/hoistwork_apply_detail.dart | 8 +-
.../hoistwork_ysgd_detail.dart | 8 +-
.../highwork_aqjd_detail.dart | 3 -
.../gc_work_detai/highwork_apply_detail.dart | 8 +-
.../highwork_ysgd_detail.dart | 8 +-
.../electricity_aqjd_detail.dart | 3 -
.../electricity_apply_detail.dart | 5 +-
.../electricity_ysgd_detail.dart | 8 +-
.../blindboard_aqjd_detail.dart | 3 -
.../blindboard_cjry_detail.dart | 3 -
.../blindboard_apply_detail.dart | 33 +-
.../blindboard_ysgd_detail.dart | 8 +-
.../spacework_aqjd_detail.dart | 3 -
.../spacework_apply_detail.dart | 8 +-
.../spacework_ysgd_detail.dart | 8 +-
lib/pages/home/work/danger_project_page.dart | 34 +-
lib/pages/login_page.dart | 4 +-
lib/tools/coord_convert.dart | 229 +++++++++++
lib/tools/tools.dart | 1 +
pubspec.yaml | 3 +-
58 files changed, 680 insertions(+), 991 deletions(-)
delete mode 100644 assets/map/test_baidu_map.html
create mode 100644 lib/tools/coord_convert.dart
diff --git a/assets/map/index.html b/assets/map/index.html
index 971b9c3..0c33628 100644
--- a/assets/map/index.html
+++ b/assets/map/index.html
@@ -230,10 +230,19 @@
//alert("当前选择点位不在区域中!");
notifyHost({type:'point_selected', ok:false, reason:'out_of_polygon', lng:e.latlng.lng, lat:e.latlng.lat});
} else {
- map.addOverlay(marker);
- // 把 BD09 -> WGS84 转换后的点回传给宿主
- fnConvertorBd09ToWgs84Data2(e.latlng.lng, e.latlng.lat);
- notifyHost({type:'point_selected', ok:true, lng:e.latlng.lng, lat:e.latlng.lat});
+ map.addOverlay(marker);
+ // 把 BD09 -> WGS84 转换后的点回传给宿主
+ fnConvertorBd09ToWgs84Data2(e.latlng.lng, e.latlng.lat);
+ notifyHost({type:'point_selected', ok:true, lng:e.latlng.lng, lat:e.latlng.lat});
+
+ // // 直接把BD09回传
+ // notifyHost({type:'converted', longitue: e.latlng.lng, latitude: e.latlng.lat});
+ // notifyHost({
+ // type: 'point_selected',
+ // ok: true,
+ // lng: e.latlng.lng,
+ // lat: e.latlng.lat
+ // });
}
} catch (err) {
console.error('MapClick error', err);
diff --git a/assets/map/test_baidu_map.html b/assets/map/test_baidu_map.html
deleted file mode 100644
index 010ecac..0000000
--- a/assets/map/test_baidu_map.html
+++ /dev/null
@@ -1,380 +0,0 @@
-
-
-
-
- 特殊作业扎点
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/lib/customWidget/BaiDuMap/Map_page.dart b/lib/customWidget/BaiDuMap/Map_page.dart
index ef27cb6..4210252 100644
--- a/lib/customWidget/BaiDuMap/Map_page.dart
+++ b/lib/customWidget/BaiDuMap/Map_page.dart
@@ -4,7 +4,9 @@ import 'package:qhd_prevention/customWidget/BaiDuMap/BaiduMapWebView.dart';
import 'package:qhd_prevention/customWidget/toast_util.dart';
import 'package:qhd_prevention/pages/my_appbar.dart';
import 'package:qhd_prevention/services/location_service.dart';
+import 'package:qhd_prevention/tools/coord_convert.dart';
import 'package:qhd_prevention/tools/tools.dart';
+import 'package:shared_preferences/shared_preferences.dart';
import 'package:webview_flutter/webview_flutter.dart';
import 'package:geolocator/geolocator.dart';
@@ -37,86 +39,84 @@ class _MapPageState extends State {
_isLoading = true;
_errorMessage = null;
});
- LoadingDialogHelper.show(message: '地图加载中');
try {
- final LocationResult loc = await LocationService.getCurrentLocation(
- timeout: const Duration(seconds: 10),
- );
+ await fetchAndSaveBd09(context);
- // 解析 gson
- try {
- final parsed = jsonDecode(widget.gson);
- if (parsed is List) {
- _gsonList = parsed;
- } else {
- _gsonList = [];
- }
- } catch (e) {
- debugPrint('解析 gson 失败: $e');
+ final prefs = await SharedPreferences.getInstance();
+ String latitude = prefs.getString('bd_lat') ?? '';
+ String longitude = prefs.getString('bd_lon') ?? '';
+ _loadWebView(LocationResult(latitude: latitude, longitude: longitude));
+
+ } catch (e, st) {
+
+ final prefs = await SharedPreferences.getInstance();
+ String latitude = prefs.getString('bd_lat') ?? '';
+ String longitude = prefs.getString('bd_lon') ?? '';
+ _loadWebView(LocationResult(latitude: latitude, longitude: longitude));
+ }
+ }
+ Future _loadWebView(LocationResult loc) async {
+ // 解析 gson
+ try {
+ final parsed = jsonDecode(widget.gson);
+ if (parsed is List) {
+ _gsonList = parsed;
+ } else {
_gsonList = [];
}
-
- if (!mounted) return;
-
- setState(() {
- _longitude = loc.longitudeAsDouble;
- _latitude = loc.latitudeAsDouble;
- });
-
-
- // 初始化 WebViewController 并加载本地页面
- _controller = WebViewController()
- ..setJavaScriptMode(JavaScriptMode.unrestricted)
- // 注册 JS 通道 'JS' —— 对应 HTML 中的 window.JS.postMessage(...)
- ..addJavaScriptChannel('JS', onMessageReceived: (dynamic message) {
- // message 是动态对象,不在签名中引用具体类型以避免 "Undefined class" 问题
- String payload;
- try {
- payload = message.message ?? message.toString();
- } catch (e) {
- payload = message.toString();
- }
- _onJsMessage(payload);
- })
- // 也保留一个备用通道 'Flutter'
- ..addJavaScriptChannel('Flutter', onMessageReceived: (dynamic message) {
- String payload;
- try {
- payload = message.message ?? message.toString();
- } catch (e) {
- payload = message.toString();
- }
- _onJsMessage(payload);
- })
- ..setNavigationDelegate(
- NavigationDelegate(
- onPageFinished: (String url) async {
- LoadingDialogHelper.hide();
-
- debugPrint('网页加载完成: $url');
- await _injectLocationParams();
- },
- onWebResourceError: (err) {
- debugPrint('Web resource error: ${err.description}');
- },
- ),
- );
-
- // 加载本地 assets 中的 HTML
- // await _controller.loadFlutterAsset('assets/map/test_baidu_map.html');
- await _controller.loadRequest(Uri.parse('http://47.92.102.56:7811/file/fluteightmap/index.html'));
-
- setState(() {
- _isLoading = false;
- });
- } catch (e, st) {
- debugPrint('获取位置或初始化失败: $e\n$st');
- if (!mounted) return;
- setState(() {
- _errorMessage = '获取位置失败: ${e.toString()}';
- _isLoading = false;
- });
+ } catch (e) {
+ debugPrint('解析 gson 失败: $e');
+ _gsonList = [];
}
+ if (!mounted) return;
+
+ setState(() {
+ _longitude = loc.longitudeAsDouble;
+ _latitude = loc.latitudeAsDouble;
+ });
+ // 初始化 WebViewController 并加载本地页面
+ _controller = WebViewController()
+ ..setJavaScriptMode(JavaScriptMode.unrestricted)
+ // 注册 JS 通道 'JS' —— 对应 HTML 中的 window.JS.postMessage(...)
+ ..addJavaScriptChannel('JS', onMessageReceived: (dynamic message) {
+ // message 是动态对象,不在签名中引用具体类型以避免 "Undefined class" 问题
+ String payload;
+ try {
+ payload = message.message ?? message.toString();
+ } catch (e) {
+ payload = message.toString();
+ }
+ _onJsMessage(payload);
+ })
+ // 也保留一个备用通道 'Flutter'
+ ..addJavaScriptChannel('Flutter', onMessageReceived: (dynamic message) {
+ String payload;
+ try {
+ payload = message.message ?? message.toString();
+ } catch (e) {
+ payload = message.toString();
+ }
+ _onJsMessage(payload);
+ })
+ ..setNavigationDelegate(
+ NavigationDelegate(
+ onPageFinished: (String url) async {
+ debugPrint('网页加载完成: $url');
+ await _injectLocationParams();
+ },
+ onWebResourceError: (err) {
+ debugPrint('Web resource error: ${err.description}');
+ },
+ ),
+ );
+
+ // 加载本地 assets 中的 HTML
+ // await _controller.loadFlutterAsset('assets/map/index.html');
+ await _controller.loadRequest(Uri.parse('http://47.92.102.56:7811/file/fluteightmap/index.html'));
+
+ setState(() {
+ _isLoading = false;
+ });
}
/// 注入参数并调用页面初始化函数 window.initWithData(...)
diff --git a/lib/customWidget/custom_button.dart b/lib/customWidget/custom_button.dart
index 39d5b41..1034012 100644
--- a/lib/customWidget/custom_button.dart
+++ b/lib/customWidget/custom_button.dart
@@ -55,7 +55,7 @@ class CustomButton extends StatelessWidget {
} else {
finalTextStyle = TextStyle(
color: isEnabled ? Colors.white : (disabledTextColor ?? Colors.white70),
- fontSize: 15,
+ fontSize: 14,
fontWeight: FontWeight.bold,
);
}
@@ -69,7 +69,7 @@ class CustomButton extends StatelessWidget {
onTap: isEnabled ? onPressed : null,
child: Container(
height: height ?? 45, // 默认高度45
- padding: padding ?? const EdgeInsets.all(8), // 默认内边距
+ padding: padding ?? const EdgeInsets.all(6), // 默认内边距
margin: margin ?? const EdgeInsets.symmetric(horizontal: 5), // 默认外边距
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(borderRadius),
diff --git a/lib/customWidget/photo_picker_row.dart b/lib/customWidget/photo_picker_row.dart
index 0099314..e67b603 100644
--- a/lib/customWidget/photo_picker_row.dart
+++ b/lib/customWidget/photo_picker_row.dart
@@ -4,6 +4,9 @@ import 'package:flutter/services.dart';
import 'package:image_picker/image_picker.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart';
+import 'package:qhd_prevention/customWidget/full_screen_video_page.dart';
+import 'package:qhd_prevention/customWidget/single_image_viewer.dart';
+import 'package:qhd_prevention/tools/tools.dart';
import 'package:video_compress/video_compress.dart';
import 'package:wechat_assets_picker/wechat_assets_picker.dart';
import 'package:photo_manager/photo_manager.dart';
@@ -563,7 +566,17 @@ class _RepairedPhotoSectionState extends State {
},
onMediaAdded: widget.onMediaAdded,
onMediaRemoved: widget.onMediaRemoved,
- onMediaTapped: widget.onMediaTapped,
+ onMediaTapped: (filePath) {
+ if (widget.mediaType == MediaType.image) {
+ presentOpaque(SingleImageViewer(imageUrl: filePath), context);
+ }else{
+ showDialog(
+ context: context,
+ barrierColor: Colors.black54,
+ builder: (_) => VideoPlayerPopup(videoUrl:filePath),
+ );
+ }
+ },
// 传递点击回调
isEdit: widget.isEdit, // 传递编辑状态
),
diff --git a/lib/customWidget/picker/CupertinoDatePicker.dart b/lib/customWidget/picker/CupertinoDatePicker.dart
index 811a504..a43fc6d 100644
--- a/lib/customWidget/picker/CupertinoDatePicker.dart
+++ b/lib/customWidget/picker/CupertinoDatePicker.dart
@@ -12,16 +12,20 @@ import 'package:flutter/material.dart';
/// if (picked != null) {
/// print('用户选择的时间:$picked');
/// }
-enum BottomPickerMode { dateTime, date, dateTimeWithSeconds }
+enum BottomPickerMode {
+ dateTime, // 底部弹窗 年月日时分
+ date, // 中间弹窗日历
+ dateTimeWithSeconds, // 底部弹窗 年月日时分秒
+}
class BottomDateTimePicker {
static Future showDate(
- BuildContext context, {
- bool allowFuture = true,
- bool allowPast = true, // 是否允许选择过去(默认允许)
- String? minTimeStr, // 可选:'yyyy-MM-dd HH:mm:ss'
- BottomPickerMode mode = BottomPickerMode.dateTime,
- }) {
+ BuildContext context, {
+ bool allowFuture = true,
+ bool allowPast = true, // 是否允许选择过去(默认允许)
+ String? minTimeStr, // 可选:'yyyy-MM-dd HH:mm:ss'
+ BottomPickerMode mode = BottomPickerMode.dateTime,
+ }) {
return showModalBottomSheet(
context: context,
backgroundColor: Colors.white,
@@ -29,12 +33,13 @@ class BottomDateTimePicker {
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.vertical(top: Radius.circular(12)),
),
- builder: (_) => _InlineDateTimePickerContent(
- allowFuture: allowFuture,
- allowPast: allowPast,
- minTimeStr: minTimeStr,
- mode: mode,
- ),
+ builder:
+ (_) => _InlineDateTimePickerContent(
+ allowFuture: allowFuture,
+ allowPast: allowPast,
+ minTimeStr: minTimeStr,
+ mode: mode,
+ ),
);
}
}
@@ -118,8 +123,13 @@ class _InlineDateTimePickerContentState
if (widget.mode == BottomPickerMode.date) {
initial = DateTime(initial.year, initial.month, initial.day);
} else if (widget.mode == BottomPickerMode.dateTime) {
- initial = DateTime(initial.year, initial.month, initial.day,
- initial.hour, initial.minute);
+ initial = DateTime(
+ initial.year,
+ initial.month,
+ initial.day,
+ initial.hour,
+ initial.minute,
+ );
}
// dateTimeWithSeconds 模式保持完整的时间
@@ -135,17 +145,24 @@ class _InlineDateTimePickerContentState
// controllers 初始项索引需在范围内
yearCtrl = FixedExtentScrollController(
- initialItem: years.indexOf(selectedYear).clamp(0, years.length - 1));
+ initialItem: years.indexOf(selectedYear).clamp(0, years.length - 1),
+ );
monthCtrl = FixedExtentScrollController(
- initialItem: (selectedMonth - 1).clamp(0, months.length - 1));
+ initialItem: (selectedMonth - 1).clamp(0, months.length - 1),
+ );
dayCtrl = FixedExtentScrollController(
- initialItem: (selectedDay - 1).clamp(0, days.length - 1));
+ initialItem: (selectedDay - 1).clamp(0, days.length - 1),
+ );
hourCtrl = FixedExtentScrollController(
- initialItem: selectedHour.clamp(0, hours.length - 1));
+ initialItem: selectedHour.clamp(0, hours.length - 1),
+ );
minuteCtrl = FixedExtentScrollController(
- initialItem: selectedMinute.clamp(0, minutes.length - 1));
- secondCtrl = FixedExtentScrollController( // 初始化秒控制器
- initialItem: selectedSecond.clamp(0, seconds.length - 1));
+ initialItem: selectedMinute.clamp(0, minutes.length - 1),
+ );
+ secondCtrl = FixedExtentScrollController(
+ // 初始化秒控制器
+ initialItem: selectedSecond.clamp(0, seconds.length - 1),
+ );
// 确保初始选择满足约束(例如 minTime 或禁止未来/禁止过去)
WidgetsBinding.instance.addPostFrameCallback((_) {
@@ -165,11 +182,11 @@ class _InlineDateTimePickerContentState
try {
final trimmed = s.trim();
final parts = trimmed.split(' ');
- final dateParts =
- parts[0].split('-').map((e) => int.parse(e)).toList();
- final timeParts = (parts.length > 1)
- ? parts[1].split(':').map((e) => int.parse(e)).toList()
- : [0, 0, 0];
+ final dateParts = parts[0].split('-').map((e) => int.parse(e)).toList();
+ final timeParts =
+ (parts.length > 1)
+ ? parts[1].split(':').map((e) => int.parse(e)).toList()
+ : [0, 0, 0];
final year = dateParts[0];
final month = dateParts[1];
final day = dateParts[2];
@@ -208,10 +225,21 @@ class _InlineDateTimePickerContentState
picked = DateTime(selectedYear, selectedMonth, selectedDay);
} else if (isDateTimeOnly) {
picked = DateTime(
- selectedYear, selectedMonth, selectedDay, selectedHour, selectedMinute);
+ selectedYear,
+ selectedMonth,
+ selectedDay,
+ selectedHour,
+ selectedMinute,
+ );
} else {
- picked = DateTime(selectedYear, selectedMonth, selectedDay,
- selectedHour, selectedMinute, selectedSecond);
+ picked = DateTime(
+ selectedYear,
+ selectedMonth,
+ selectedDay,
+ selectedHour,
+ selectedMinute,
+ selectedSecond,
+ );
}
// 处理最小时间约束:结合 _minTime 与 allowPast
@@ -232,8 +260,13 @@ class _InlineDateTimePickerContentState
if (isDateOnly) {
minRef = DateTime(minRef!.year, minRef.month, minRef.day);
} else if (isDateTimeOnly) {
- minRef = DateTime(minRef!.year, minRef.month, minRef.day,
- minRef.hour, minRef.minute);
+ minRef = DateTime(
+ minRef!.year,
+ minRef.month,
+ minRef.day,
+ minRef.hour,
+ minRef.minute,
+ );
}
}
} else if (_minTime != null) {
@@ -243,8 +276,13 @@ class _InlineDateTimePickerContentState
if (isDateOnly) {
minRef = DateTime(minRef!.year, minRef.month, minRef.day);
} else if (isDateTimeOnly) {
- minRef = DateTime(minRef!.year, minRef.month, minRef.day,
- minRef.hour, minRef.minute);
+ minRef = DateTime(
+ minRef!.year,
+ minRef.month,
+ minRef.day,
+ minRef.hour,
+ minRef.minute,
+ );
}
}
@@ -363,7 +401,11 @@ class _InlineDateTimePickerContentState
onPressed: () {
DateTime result;
if (isDateOnly) {
- result = DateTime(selectedYear, selectedMonth, selectedDay);
+ result = DateTime(
+ selectedYear,
+ selectedMonth,
+ selectedDay,
+ );
} else if (isDateTimeOnly) {
result = DateTime(
selectedYear,
@@ -411,7 +453,8 @@ class _InlineDateTimePickerContentState
// 月
_buildPicker(
controller: monthCtrl,
- items: months.map((e) => e.toString().padLeft(2, '0')).toList(),
+ items:
+ months.map((e) => e.toString().padLeft(2, '0')).toList(),
onSelected: (idx) {
setState(() {
selectedMonth = months[idx];
@@ -438,7 +481,8 @@ class _InlineDateTimePickerContentState
if (!isDateOnly)
_buildPicker(
controller: hourCtrl,
- items: hours.map((e) => e.toString().padLeft(2, '0')).toList(),
+ items:
+ hours.map((e) => e.toString().padLeft(2, '0')).toList(),
onSelected: (idx) {
setState(() {
selectedHour = hours[idx];
@@ -450,7 +494,10 @@ class _InlineDateTimePickerContentState
if (!isDateOnly)
_buildPicker(
controller: minuteCtrl,
- items: minutes.map((e) => e.toString().padLeft(2, '0')).toList(),
+ items:
+ minutes
+ .map((e) => e.toString().padLeft(2, '0'))
+ .toList(),
onSelected: (idx) {
setState(() {
selectedMinute = minutes[idx];
@@ -463,7 +510,10 @@ class _InlineDateTimePickerContentState
if (widget.mode == BottomPickerMode.dateTimeWithSeconds)
_buildPicker(
controller: secondCtrl,
- items: seconds.map((e) => e.toString().padLeft(2, '0')).toList(),
+ items:
+ seconds
+ .map((e) => e.toString().padLeft(2, '0'))
+ .toList(),
onSelected: (idx) {
setState(() {
selectedSecond = seconds[idx];
@@ -496,4 +546,4 @@ class _InlineDateTimePickerContentState
),
);
}
-}
\ No newline at end of file
+}
diff --git a/lib/customWidget/toast_util.dart b/lib/customWidget/toast_util.dart
index 3488d00..d42e5f2 100644
--- a/lib/customWidget/toast_util.dart
+++ b/lib/customWidget/toast_util.dart
@@ -2,11 +2,13 @@ import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
class ToastUtil {
- /// 普通灰色背景提示(仅文字)
- static void showNormal(BuildContext context, String message, {
- ToastGravity gravity = ToastGravity.BOTTOM,
- int duration = 2,
- }) {
+ /// 普通提示(仅文字,屏幕中间)
+ static void showNormal(
+ BuildContext context,
+ String message, {
+ ToastGravity gravity = ToastGravity.CENTER, // 修改为 CENTER
+ int duration = 2,
+ }) {
_showToast(
context: context,
message: message,
@@ -15,11 +17,13 @@ class ToastUtil {
);
}
- /// 成功提示(带图标)
- static void showSuccess(BuildContext context, String message, {
- ToastGravity gravity = ToastGravity.CENTER,
- int duration = 3,
- }) {
+ /// 成功提示(带图标,屏幕中间)
+ static void showSuccess(
+ BuildContext context,
+ String message, {
+ ToastGravity gravity = ToastGravity.CENTER, // 修改为 CENTER
+ int duration = 3,
+ }) {
_showToast(
context: context,
message: message,
@@ -29,11 +33,13 @@ class ToastUtil {
);
}
- /// 失败提示(带图标)
- static void showError(BuildContext context, String message, {
- ToastGravity gravity = ToastGravity.CENTER,
- int duration = 4,
- }) {
+ /// 失败提示(带图标,屏幕中间)
+ static void showError(
+ BuildContext context,
+ String message, {
+ ToastGravity gravity = ToastGravity.CENTER, // 修改为 CENTER
+ int duration = 4,
+ }) {
_showToast(
context: context,
message: message,
@@ -67,7 +73,7 @@ class ToastUtil {
Fluttertoast.showToast(
msg: message,
toastLength: duration > 2 ? Toast.LENGTH_LONG : Toast.LENGTH_SHORT,
- gravity: gravity,
+ gravity: gravity, // 始终 CENTER
backgroundColor: Colors.grey[500],
textColor: Colors.white,
fontSize: 16.0,
@@ -104,4 +110,4 @@ class ToastUtil {
),
);
}
-}
\ No newline at end of file
+}
diff --git a/lib/http/ApiService.dart b/lib/http/ApiService.dart
index 90bc7c7..b32ab9a 100644
--- a/lib/http/ApiService.dart
+++ b/lib/http/ApiService.dart
@@ -19,11 +19,13 @@ class ApiService {
// static const String projectManagerUrl = 'https://pm.qhdsafety.com/zy-projectManage/';
// static const String publicKey = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDUoHAavCikaZxjlDM6Km8cX+ye78F4oF39AcEfnE1p2Yn9pJ9WFxYZ4Vkh6F8SKMi7k4nYsKceqB1RwG996SvHQ5C3pM3nbXCP4K15ad6QhN4a7lzlbLhiJcyIKszvvK8ncUDw8mVQ0j/2mwxv05yH6LN9OKU6Hzm1ninpWeE+awIDAQAB'
/// 人脸识别服务
+ // static const String baseFacePath = "https://qaaqwh.qhdsafety.com/whb_stu_face";
static const String baseFacePath =
- "https://qaaqwh.qhdsafety.com/whb_stu_face";
-
+ "http://192.168.20.240:8500/whb_stu_face/";
/// 登录及其他管理后台接口
- static const String basePath = "https://qaaqwh.qhdsafety.com/integrated_whb";
+ // static const String basePath = "https://qaaqwh.qhdsafety.com/integrated_whb";
+ static const String basePath = "http://192.168.20.240:8500/integrated_whb/";
+
// static const String basePath = "http://192.168.0.37:8099/api";
/// 图片文件服务
@@ -38,24 +40,6 @@ class ApiService {
'https://pm.qhdsafety.com/zy-projectManage';
- // /// 人脸识别服务
- // static const String baseFacePath =
- // "https://qaaqwh.qhdsafety.com/whb_stu_face/";
- //
- // /// 登录及其他管理后台接口
- // static const String basePath = "http://192.168.20.240:8500/integrated_whb/";
- //
- // /// 图片文件服务
- // static const String baseImgPath = "https://file.zcloudchina.com/YTHFile";
- //
- // /// 管理后台统一路径
- // static const String adminPath =
- // "https://qaaqwh.qhdsafety.com/integrated_whb/";
- //
- // /// 项目管理系统
- // static const String projectManagerUrl =
- // 'https://pm.qhdsafety.com/zy-projectManage';
-
/// RSA 公钥
static const publicKey = '''
-----BEGIN PUBLIC KEY-----
diff --git a/lib/pages/KeyProjects/Danger/danger_manager_detail_page.dart b/lib/pages/KeyProjects/Danger/danger_manager_detail_page.dart
index 0545a56..9486adb 100644
--- a/lib/pages/KeyProjects/Danger/danger_manager_detail_page.dart
+++ b/lib/pages/KeyProjects/Danger/danger_manager_detail_page.dart
@@ -368,12 +368,7 @@ class _DangerManagerDetailPageState extends State {
'${ApiService.baseImgPath}$path',
)
.toList(),
- onMediaTapped: (p) {
- presentOpaque(
- SingleImageViewer(imageUrl: p),
- context,
- );
- },
+
onChanged:
(files) => setState(() {
hiddenForm['ysImgs'] =
diff --git a/lib/pages/KeyProjects/Punishment/punishment_manager_detail_page.dart b/lib/pages/KeyProjects/Punishment/punishment_manager_detail_page.dart
index 448fc8e..77c0c89 100644
--- a/lib/pages/KeyProjects/Punishment/punishment_manager_detail_page.dart
+++ b/lib/pages/KeyProjects/Punishment/punishment_manager_detail_page.dart
@@ -354,9 +354,6 @@ class _PunishmentManagerDetailPageState extends State '${ApiService.baseImgPath}$path').toList(),
- onMediaTapped: (p) {
- presentOpaque(SingleImageViewer(imageUrl: p), context);
- },
onChanged:
(files) => setState(() {
hiddenForm['ysImgs'] =
diff --git a/lib/pages/KeyProjects/SafeCheck/custom/safe_drawer_page.dart b/lib/pages/KeyProjects/SafeCheck/custom/safe_drawer_page.dart
index b0b4f8a..149f2f3 100644
--- a/lib/pages/KeyProjects/SafeCheck/custom/safe_drawer_page.dart
+++ b/lib/pages/KeyProjects/SafeCheck/custom/safe_drawer_page.dart
@@ -190,9 +190,6 @@ class _SafeDrawerPageState extends State {
isEdit: _isEdit,
isRequired: _isEdit,
initialMediaPaths: _getSelectedImages(),
- onMediaTapped: (p) {
- presentOpaque(SingleImageViewer(imageUrl: p), context);
- },
onChanged:
(files) => setState(() {
hiddenForm['hiddenImgs'] =
@@ -222,13 +219,6 @@ class _SafeDrawerPageState extends State {
RepairedPhotoSection(
title: '隐患视频',
maxCount: 1,
- onMediaTapped: (p) {
- showDialog(
- context: context,
- barrierColor: Colors.black54,
- builder: (_) => VideoPlayerPopup(videoUrl:p),
- );
- },
isEdit: _isEdit,
mediaType: MediaType.video,
initialMediaPaths: _getSelectedVideos(),
@@ -680,24 +670,4 @@ class _SafeDrawerPageState extends State {
}
}
- Future _uploadFile(String path, String type, String id) async {
- try {
- final r = await ApiService.addImgFiles(path, type, id);
- return r['result'] == 'success' ? (r['imgPath'] ?? '') : '';
- } catch (_) {
- return '';
- }
- }
-
- Future _determinePosition() async {
- if (!await Geolocator.isLocationServiceEnabled()) throw 'location disabled';
- var p = await Geolocator.checkPermission();
- if (p == LocationPermission.denied)
- p = await Geolocator.requestPermission();
- if (p == LocationPermission.denied || p == LocationPermission.deniedForever)
- throw 'permission denied';
- return await Geolocator.getCurrentPosition(
- desiredAccuracy: LocationAccuracy.high,
- );
- }
}
diff --git a/lib/pages/app/Danger_paicha/check_information_one_item.dart b/lib/pages/app/Danger_paicha/check_information_one_item.dart
index 252b03f..0598c97 100644
--- a/lib/pages/app/Danger_paicha/check_information_one_item.dart
+++ b/lib/pages/app/Danger_paicha/check_information_one_item.dart
@@ -13,10 +13,13 @@ import 'package:qhd_prevention/customWidget/department_person_picker.dart';
import 'package:qhd_prevention/customWidget/department_picker.dart';
import 'package:qhd_prevention/customWidget/department_picker_hidden_type.dart';
import 'package:qhd_prevention/customWidget/department_picker_two.dart';
+import 'package:qhd_prevention/customWidget/full_screen_video_page.dart';
import 'package:qhd_prevention/customWidget/toast_util.dart';
import 'package:qhd_prevention/pages/home/tap/item_list_widget.dart';
import 'package:qhd_prevention/pages/my_appbar.dart';
+import 'package:qhd_prevention/tools/coord_convert.dart';
import 'package:qhd_prevention/tools/tools.dart';
+import 'package:shared_preferences/shared_preferences.dart';
import '../../../customWidget/photo_picker_row.dart';
import '../../../http/ApiService.dart';
@@ -680,12 +683,11 @@ class _CheckInformationOneItemState extends State {
}
-
//获取定位
- Position position = await _determinePosition();
- String longitude=position.longitude.toString();
- String latitude=position.latitude.toString();
-
+ await fetchAndSaveBd09(context);
+ final prefs = await SharedPreferences.getInstance();
+ String latitude = prefs.getString('bd_lat') ?? '';
+ String longitude = prefs.getString('bd_lon') ?? '';
try {
// final result = await ApiService.temporaryStorageOfHidden(
// unqualifiedInspectionItemID.isNotEmpty?"edit":"add",widget.item,unqualifiedInspectionItemID,
@@ -828,33 +830,6 @@ class _CheckInformationOneItemState extends State {
}
}
- Future _determinePosition() async {
- bool serviceEnabled;
- LocationPermission permission;
-
- // 检查定位服务是否启用
- serviceEnabled = await Geolocator.isLocationServiceEnabled();
- if (!serviceEnabled) {
- return Future.error('Location services are disabled.');
- }
-
- // 获取权限
- permission = await Geolocator.checkPermission();
- if (permission == LocationPermission.denied) {
- permission = await Geolocator.requestPermission();
- if (permission == LocationPermission.denied) {
- return Future.error('Location permissions are denied');
- }
- }
-
- if (permission == LocationPermission.deniedForever) {
- return Future.error(
- 'Location permissions are permanently denied, we cannot request permissions.');
- }
-
- // 获取当前位置
- return await Geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.high);
- }
String truncateText(String text, {int maxLength = 17}) {
if (text.length <= maxLength) return text;
diff --git a/lib/pages/app/Danger_paicha/hazard_registration_page.dart b/lib/pages/app/Danger_paicha/hazard_registration_page.dart
index eea82b2..deb2fd9 100644
--- a/lib/pages/app/Danger_paicha/hazard_registration_page.dart
+++ b/lib/pages/app/Danger_paicha/hazard_registration_page.dart
@@ -18,7 +18,9 @@ import 'package:qhd_prevention/customWidget/single_image_viewer.dart';
import 'package:qhd_prevention/customWidget/toast_util.dart';
import 'package:qhd_prevention/pages/home/tap/item_list_widget.dart';
import 'package:qhd_prevention/pages/my_appbar.dart';
+import 'package:qhd_prevention/tools/coord_convert.dart';
import 'package:qhd_prevention/tools/tools.dart';
+import 'package:shared_preferences/shared_preferences.dart';
import '../../../customWidget/photo_picker_row.dart';
import '../../../http/ApiService.dart';
@@ -256,9 +258,6 @@ class _HazardRegistrationPageState extends State {
}
},
onChanged: (List files) {},
- onMediaTapped: (path) {
- presentOpaque(SingleImageViewer(imageUrl: path), context);
- },
onAiIdentify: () {
// AI 识别逻辑
if(_yinHuanImages.isEmpty){
@@ -285,13 +284,6 @@ class _HazardRegistrationPageState extends State {
onMediaRemoved: (value){
_yinHuanVido.remove(value);
},
- onMediaTapped: (path) {
- showDialog(
- context: context,
- barrierColor: Colors.black54,
- builder: (_) => VideoPlayerPopup(videoUrl:path),
- );
- },
onChanged: (List files) {
},
onAiIdentify: () {},
@@ -665,12 +657,11 @@ class _HazardRegistrationPageState extends State {
hiddenType1=_yinHuanTypeIds[2];
}
-
-
//获取定位
- Position position = await _determinePosition();
- String longitude=position.longitude.toString();
- String latitude=position.latitude.toString();
+ await fetchAndSaveBd09(context);
+ final prefs = await SharedPreferences.getInstance();
+ String latitude = prefs.getString('bd_lat') ?? '';
+ String longitude = prefs.getString('bd_lon') ?? '';
try {
@@ -720,6 +711,9 @@ class _HazardRegistrationPageState extends State {
widget.onClose(hiddenId, _standardController.text.trim());
});
}
+ }else{
+
+ ToastUtil.showNormal(context, "提交失败");
}
} catch (e) {
LoadingDialogHelper.hide();
@@ -804,33 +798,6 @@ class _HazardRegistrationPageState extends State {
}
}
- Future _determinePosition() async {
- bool serviceEnabled;
- LocationPermission permission;
-
- // 检查定位服务是否启用
- serviceEnabled = await Geolocator.isLocationServiceEnabled();
- if (!serviceEnabled) {
- return Future.error('Location services are disabled.');
- }
-
- // 获取权限
- permission = await Geolocator.checkPermission();
- if (permission == LocationPermission.denied) {
- permission = await Geolocator.requestPermission();
- if (permission == LocationPermission.denied) {
- return Future.error('Location permissions are denied');
- }
- }
-
- if (permission == LocationPermission.deniedForever) {
- return Future.error(
- 'Location permissions are permanently denied, we cannot request permissions.');
- }
-
- // 获取当前位置
- return await Geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.high);
- }
String truncateText(String text, {int maxLength = 17}) {
if (text.length <= maxLength) return text;
diff --git a/lib/pages/app/Danger_paicha/quick_report_page.dart b/lib/pages/app/Danger_paicha/quick_report_page.dart
index 4c57a8a..ed1e6af 100644
--- a/lib/pages/app/Danger_paicha/quick_report_page.dart
+++ b/lib/pages/app/Danger_paicha/quick_report_page.dart
@@ -12,9 +12,13 @@ import 'package:qhd_prevention/customWidget/department_person_picker.dart';
import 'package:qhd_prevention/customWidget/department_picker.dart';
import 'package:qhd_prevention/customWidget/department_picker_hidden_type.dart';
import 'package:qhd_prevention/customWidget/department_picker_two.dart';
+import 'package:qhd_prevention/customWidget/full_screen_video_page.dart';
+import 'package:qhd_prevention/customWidget/single_image_viewer.dart';
import 'package:qhd_prevention/customWidget/toast_util.dart';
import 'package:qhd_prevention/pages/my_appbar.dart';
+import 'package:qhd_prevention/tools/coord_convert.dart';
import 'package:qhd_prevention/tools/tools.dart';
+import 'package:shared_preferences/shared_preferences.dart';
import '../../../customWidget/photo_picker_row.dart';
import '../../../http/ApiService.dart';
@@ -518,12 +522,11 @@ class _QuickReportPageState extends State {
hiddenType1=_yinHuanTypeIds[2];
}
-
-
//获取定位
- Position position = await _determinePosition();
- String longitude=position.longitude.toString();
- String latitude=position.latitude.toString();
+ await fetchAndSaveBd09(context);
+ final prefs = await SharedPreferences.getInstance();
+ String latitude = prefs.getString('bd_lat') ?? '';
+ String longitude = prefs.getString('bd_lon') ?? '';
try {
Map data = {};
@@ -536,7 +539,6 @@ class _QuickReportPageState extends State {
String hiddenId = result['pd']['HIDDEN_ID'] ;
-
for (int i=0;i<_yinHuanImages.length;i++){
_addImgFiles(_yinHuanImages[i],"3",hiddenId);
}
@@ -630,33 +632,5 @@ class _QuickReportPageState extends State {
}
}
- Future _determinePosition() async {
- bool serviceEnabled;
- LocationPermission permission;
-
- // 检查定位服务是否启用
- serviceEnabled = await Geolocator.isLocationServiceEnabled();
- if (!serviceEnabled) {
- return Future.error('Location services are disabled.');
- }
-
- // 获取权限
- permission = await Geolocator.checkPermission();
- if (permission == LocationPermission.denied) {
- permission = await Geolocator.requestPermission();
- if (permission == LocationPermission.denied) {
- return Future.error('Location permissions are denied');
- }
- }
-
- if (permission == LocationPermission.deniedForever) {
- return Future.error(
- 'Location permissions are permanently denied, we cannot request permissions.');
- }
-
- // 获取当前位置
- return await Geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.high);
- }
-
}
diff --git a/lib/pages/home/NFC/nfc_check_danger_detail.dart b/lib/pages/home/NFC/nfc_check_danger_detail.dart
index 829946a..69c861a 100644
--- a/lib/pages/home/NFC/nfc_check_danger_detail.dart
+++ b/lib/pages/home/NFC/nfc_check_danger_detail.dart
@@ -285,9 +285,6 @@ class _NfcCheckDangerDetailState extends State {
});
}
},
- onMediaTapped: (path) {
- presentOpaque(SingleImageViewer(imageUrl: path), context);
- },
onChanged: (v) {},
onAiIdentify: () {
// AI 识别逻辑
@@ -324,12 +321,6 @@ class _NfcCheckDangerDetailState extends State {
});
}
},
- onMediaTapped: (path) {
- showDialog(
- context: context,
- barrierColor: Colors.black54,
- builder: (_) => VideoPlayerPopup(videoUrl: path),
- ); },
onMediaAdded: (localPath) {
_videos.add(nfcImgData(path: localPath, id: ''));
},
@@ -427,9 +418,6 @@ class _NfcCheckDangerDetailState extends State {
initialMediaPaths: zgImgList.map((item) => item.path).toList(),
mediaType: MediaType.image,
isShowAI: false,
- onMediaTapped: (path) {
- presentOpaque(SingleImageViewer(imageUrl: path), context);
- },
onMediaAdded: (localPath) {
zgImgList.add(nfcImgData(path: localPath, id: ''));
},
@@ -646,34 +634,4 @@ class _NfcCheckDangerDetailState extends State {
}
}
- Future _determinePosition() async {
- bool serviceEnabled;
- LocationPermission permission;
-
- // 检查定位服务是否启用
- serviceEnabled = await Geolocator.isLocationServiceEnabled();
- if (!serviceEnabled) {
- return Future.error('Location services are disabled.');
- }
-
- // 获取权限
- permission = await Geolocator.checkPermission();
- if (permission == LocationPermission.denied) {
- permission = await Geolocator.requestPermission();
- if (permission == LocationPermission.denied) {
- return Future.error('Location permissions are denied');
- }
- }
-
- if (permission == LocationPermission.deniedForever) {
- return Future.error(
- 'Location permissions are permanently denied, we cannot request permissions.',
- );
- }
-
- // 获取当前位置
- return await Geolocator.getCurrentPosition(
- desiredAccuracy: LocationAccuracy.high,
- );
- }
}
diff --git a/lib/pages/home/SafeCheck/DangeCheck/safeCheck_assignment_detail_page.dart b/lib/pages/home/SafeCheck/DangeCheck/safeCheck_assignment_detail_page.dart
index 5aa24a4..95ef6bc 100644
--- a/lib/pages/home/SafeCheck/DangeCheck/safeCheck_assignment_detail_page.dart
+++ b/lib/pages/home/SafeCheck/DangeCheck/safeCheck_assignment_detail_page.dart
@@ -241,18 +241,12 @@ class _SafecheckAssignmentDetailPageState
RepairedPhotoSection(
title: '隐患视频',
maxCount: 1,
- onMediaTapped: (p) {
- showDialog(
- context: context,
- barrierColor: Colors.black54,
- builder: (_) => VideoPlayerPopup(videoUrl: p),
- );
- },
isEdit: false,
mediaType: MediaType.video,
initialMediaPaths: hiddenVideo,
onChanged: (files) {},
onAiIdentify: () {},
+
),
),
],
diff --git a/lib/pages/home/SafeCheck/Record/defend_record_detail_page.dart b/lib/pages/home/SafeCheck/Record/defend_record_detail_page.dart
index 5975932..b669922 100644
--- a/lib/pages/home/SafeCheck/Record/defend_record_detail_page.dart
+++ b/lib/pages/home/SafeCheck/Record/defend_record_detail_page.dart
@@ -125,14 +125,12 @@ class _DefendRecordDetailPageState extends State {
return Scaffold(
appBar: MyAppbar(title: '申辩记录'),
body: SafeArea(
- child: Expanded(
- child: ListView.builder(
- itemCount: _list.length,
- itemBuilder: (context, index) {
- final item = _list[index];
- return _itemWidget(item);
- },
- ),
+ child: ListView.builder(
+ itemCount: _list.length,
+ itemBuilder: (context, index) {
+ final item = _list[index];
+ return _itemWidget(item);
+ },
),
),
);
diff --git a/lib/pages/home/SafeCheck/Start/safeCheck_drawer_page.dart b/lib/pages/home/SafeCheck/Start/safeCheck_drawer_page.dart
index adbfecf..d2cd89d 100644
--- a/lib/pages/home/SafeCheck/Start/safeCheck_drawer_page.dart
+++ b/lib/pages/home/SafeCheck/Start/safeCheck_drawer_page.dart
@@ -220,12 +220,6 @@ class _SafeCheckDrawerPageState extends State {
isEdit: _isEdit,
isRequired: _isEdit,
initialMediaPaths: _getSelectedImages(),
- onMediaTapped: (p) {
- presentOpaque(
- SingleImageViewer(imageUrl: p),
- context,
- );
- },
onChanged:
(files) => setState(() {
hiddenForm['hiddenImgs'] =
@@ -255,13 +249,6 @@ class _SafeCheckDrawerPageState extends State {
RepairedPhotoSection(
title: '隐患视频',
maxCount: 1,
- onMediaTapped: (p) {
- showDialog(
- context: context,
- barrierColor: Colors.black54,
- builder: (_) => VideoPlayerPopup(videoUrl: p),
- );
- },
isEdit: _isEdit,
mediaType: MediaType.video,
initialMediaPaths: _getSelectedVideos(),
diff --git a/lib/pages/home/SafetyCommitment/team_safety_commitment_apply.dart b/lib/pages/home/SafetyCommitment/team_safety_commitment_apply.dart
index d46eb7b..3f95f0f 100644
--- a/lib/pages/home/SafetyCommitment/team_safety_commitment_apply.dart
+++ b/lib/pages/home/SafetyCommitment/team_safety_commitment_apply.dart
@@ -133,6 +133,9 @@ class _TeamSafetyCommitmentApplyState extends State {
isEditable: true,
controller: _controller5,
text: '',
+ onChanged: (v) {
+
+ }
),
const Divider(),
diff --git a/lib/pages/home/home_page.dart b/lib/pages/home/home_page.dart
index b96d117..6ab5033 100644
--- a/lib/pages/home/home_page.dart
+++ b/lib/pages/home/home_page.dart
@@ -8,6 +8,8 @@ import 'package:qhd_prevention/customWidget/toast_util.dart';
import 'package:qhd_prevention/pages/home/scan_page.dart';
import 'package:qhd_prevention/pages/my_appbar.dart';
import 'package:qhd_prevention/services/auth_service.dart';
+import 'package:qhd_prevention/services/location_service.dart';
+import 'package:qhd_prevention/tools/coord_convert.dart';
import 'package:qhd_prevention/tools/update/update_dialogs.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart';
@@ -185,10 +187,12 @@ class HomePageState extends State {
// 使用初始化加载:先恢复缓存(若存在则直接显示),然后再发起网络请求(成功则覆盖缓存)
_initialLoad();
BadgeManager().initAllModules();
+
}
/// 首次加载:先恢复缓存(如果有),然后在后台去刷新(只有当无缓存时才显示 loading)
Future _initialLoad() async {
+
/// 清单列表
final data = await ApiService.getListData();
if (data['result'] == 'success') {
@@ -239,6 +243,8 @@ class HomePageState extends State {
// 拉取其他数据 + 隐患列表(当 hiddenList 为空时显示 loading,否则不显示)
await _fetchData();
await _fetchHiddenList(showLoading: hiddenList.isEmpty);
+ await fetchAndSaveBd09(context);
+
}
Future _onRefresh() async {
diff --git a/lib/pages/home/risk/risk_detail_page.dart b/lib/pages/home/risk/risk_detail_page.dart
index 3a43dd3..4a1160b 100644
--- a/lib/pages/home/risk/risk_detail_page.dart
+++ b/lib/pages/home/risk/risk_detail_page.dart
@@ -1,7 +1,9 @@
import 'package:flutter/material.dart';
import 'package:qhd_prevention/pages/my_appbar.dart';
+import 'package:qhd_prevention/tools/coord_convert.dart';
import 'package:qhd_prevention/tools/tools.dart';
import 'package:geolocator/geolocator.dart';
+import 'package:shared_preferences/shared_preferences.dart';
import '../../../http/ApiService.dart';
import '../../../tools/h_colors.dart';
@@ -64,9 +66,13 @@ class _RiskDetailPageState extends State {
Future _addCoordinate() async {
try {
- Position position = await _determinePosition();
+ //获取定位
+ await fetchAndSaveBd09(context);
+ final prefs = await SharedPreferences.getInstance();
+ String latitude = prefs.getString('bd_lat') ?? '';
+ String longitude = prefs.getString('bd_lon') ?? '';
final result = await ApiService.addCoordinate( widget.itemData["IDENTIFICATIONPARTS_ID"],
- position.longitude.toString(),position.latitude.toString());
+ longitude,latitude);
if (result['result'] == 'success') {
setState(() {
_showMessage('提交成功');
@@ -391,34 +397,6 @@ class _RiskDetailPageState extends State {
);
}
- Future _determinePosition() async {
- bool serviceEnabled;
- LocationPermission permission;
-
- // 检查定位服务是否启用
- serviceEnabled = await Geolocator.isLocationServiceEnabled();
- if (!serviceEnabled) {
- return Future.error('Location services are disabled.');
- }
-
- // 获取权限
- permission = await Geolocator.checkPermission();
- if (permission == LocationPermission.denied) {
- permission = await Geolocator.requestPermission();
- if (permission == LocationPermission.denied) {
- return Future.error('Location permissions are denied');
- }
- }
-
- if (permission == LocationPermission.deniedForever) {
- return Future.error(
- 'Location permissions are permanently denied, we cannot request permissions.');
- }
-
- // 获取当前位置
- return await Geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.high);
- }
-
void _showMessage(String msg) {
ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(msg)));
}
diff --git a/lib/pages/home/study/study_my_task_page.dart b/lib/pages/home/study/study_my_task_page.dart
index 43d1666..8a0ff18 100644
--- a/lib/pages/home/study/study_my_task_page.dart
+++ b/lib/pages/home/study/study_my_task_page.dart
@@ -288,7 +288,7 @@ class _StudyMyTaskPageState extends State with RouteAware {
],
),
Wrap(
- spacing: 10,
+ spacing: 5,
children: [
// 加强学习
if (studyState >= 2 &&
@@ -317,7 +317,8 @@ class _StudyMyTaskPageState extends State with RouteAware {
CustomButton(
height: 36,
text: "立即学习",
- padding: EdgeInsets.symmetric(horizontal: 18),
+ margin: const EdgeInsets.symmetric(horizontal: 2),
+ padding: EdgeInsets.symmetric(horizontal: 15),
borderRadius: 18,
backgroundColor: Colors.blue,
onPressed: () {
@@ -338,7 +339,9 @@ class _StudyMyTaskPageState extends State with RouteAware {
CustomButton(
height: 36,
text: "立即考试",
- padding: EdgeInsets.symmetric(horizontal: 18),
+ margin: const EdgeInsets.symmetric(horizontal: 2),
+
+ padding: EdgeInsets.symmetric(horizontal: 15),
borderRadius: 18,
backgroundColor: Colors.green,
onPressed:
@@ -349,7 +352,9 @@ class _StudyMyTaskPageState extends State with RouteAware {
CustomButton(
height: 36,
text: "考试详情",
- padding: EdgeInsets.symmetric(horizontal: 18),
+ margin: const EdgeInsets.symmetric(horizontal: 2),
+
+ padding: EdgeInsets.symmetric(horizontal: 15),
borderRadius: 18,
backgroundColor: Colors.green,
onPressed: () {
diff --git a/lib/pages/home/study/study_score_page.dart b/lib/pages/home/study/study_score_page.dart
index 61264c5..adf37cc 100644
--- a/lib/pages/home/study/study_score_page.dart
+++ b/lib/pages/home/study/study_score_page.dart
@@ -62,7 +62,8 @@ class _StudyScorePageState extends State {
int _toInt(dynamic value, {required int defaultValue}) {
if (value is int) return value;
if (value is String) {
- return int.tryParse(value) ?? defaultValue;
+ int score = int.parse(value);
+ return score;
}
return defaultValue;
}
@@ -115,8 +116,7 @@ class _StudyScorePageState extends State {
}
// 解析成绩
- int score = _toInt(item['STAGEEXAMSCORE'], defaultValue: -1);
- String scoreText = score >= 0 ? '$score' : '无';
+ String scoreText = item['STAGEEXAMSCORE'] == '-1' ? '无' : item['STAGEEXAMSCORE'];
return Card(
color: Colors.white,
diff --git a/lib/pages/home/study/take_exam_page.dart b/lib/pages/home/study/take_exam_page.dart
index 14711d1..7abcb09 100644
--- a/lib/pages/home/study/take_exam_page.dart
+++ b/lib/pages/home/study/take_exam_page.dart
@@ -113,9 +113,10 @@ class _TakeExamPageState extends State {
Future _showTip(String content) {
return CustomAlertDialog.showAlert(
- context,
- title: '温馨提示',
- confirmText: '确认'
+ context,
+ title: '温馨提示',
+ content: content,
+ confirmText: '确认'
);
}
@@ -206,13 +207,14 @@ class _TakeExamPageState extends State {
context,
title: '温馨提示',
content:
- passed
- ? '您的成绩为 $score 分,恭喜您通过本次考试,请继续保持!'
- : '您的成绩为 $score 分,很遗憾您没有通过本次考试,请再接再厉!',
+ passed
+ ? '您的成绩为 $score 分,恭喜您通过本次考试,请继续保持!'
+ : '您的成绩为 $score 分,很遗憾您没有通过本次考试,请再接再厉!',
cancelText: '',
confirmText: '确定',
);
- if (ok) {}
+ Navigator.of(context).pop();
+
}
}
@@ -236,47 +238,47 @@ class _TakeExamPageState extends State {
final keys = q.questionType == '3' ? ['A', 'B'] : ['A', 'B', 'C', 'D'];
return Column(
children:
- keys.map((key) {
- final active = q.checked.split(',').contains(key);
- return GestureDetector(
- onTap:
- () => _chooseTopic(
- q.questionType == '3'
- ? 'judge'
- : (q.questionType == '2' ? 'multiple' : 'radio'),
- key,
+ keys.map((key) {
+ final active = q.checked.split(',').contains(key);
+ return GestureDetector(
+ onTap:
+ () => _chooseTopic(
+ q.questionType == '3'
+ ? 'judge'
+ : (q.questionType == '2' ? 'multiple' : 'radio'),
+ key,
+ ),
+ child: Container(
+ margin: const EdgeInsets.symmetric(vertical: 8),
+ child: Row(
+ children: [
+ Container(
+ width: 40,
+ height: 40,
+ alignment: Alignment.center,
+ decoration: BoxDecoration(
+ color: active ? Colors.blue : Colors.grey.shade200,
+ shape: BoxShape.circle,
),
- child: Container(
- margin: const EdgeInsets.symmetric(vertical: 8),
- child: Row(
- children: [
- Container(
- width: 40,
- height: 40,
- alignment: Alignment.center,
- decoration: BoxDecoration(
- color: active ? Colors.blue : Colors.grey.shade200,
- shape: BoxShape.circle,
- ),
- child: Text(
- key,
- style: TextStyle(
- color: active ? Colors.white : Colors.black87,
- ),
- ),
+ child: Text(
+ key,
+ style: TextStyle(
+ color: active ? Colors.white : Colors.black87,
),
- const SizedBox(width: 16),
- Expanded(
- child: Text(
- q.options[key] ?? '',
- style: const TextStyle(fontSize: 16),
- ),
- ),
- ],
+ ),
),
- ),
- );
- }).toList(),
+ const SizedBox(width: 16),
+ Expanded(
+ child: Text(
+ q.options[key] ?? '',
+ style: const TextStyle(fontSize: 15),
+ ),
+ ),
+ ],
+ ),
+ ),
+ );
+ }).toList(),
);
}
@@ -321,7 +323,7 @@ class _TakeExamPageState extends State {
'考试科目:${info['EXAMNAME'] ?? ''}',
style: const TextStyle(
color: Colors.white,
- fontSize: 18,
+ fontSize: 16,
fontWeight: FontWeight.bold,
),
),
@@ -330,7 +332,7 @@ class _TakeExamPageState extends State {
'当前试题 ${current + 1}/${questions.length}',
style: const TextStyle(
color: Colors.white,
- fontSize: 16,
+ fontSize: 15,
),
),
const SizedBox(height: 8),
@@ -338,7 +340,7 @@ class _TakeExamPageState extends State {
'考试剩余时间:$_formattedTime',
style: const TextStyle(
color: Colors.white,
- fontSize: 16,
+ fontSize: 15,
),
),
],
@@ -348,18 +350,35 @@ class _TakeExamPageState extends State {
],
),
const SizedBox(height: 16),
- if (q != null) ...[
- Text(
- '${current + 1}. ${q.questionDry} (${questionTypeMap[q.questionType] ?? ''})',
- style: const TextStyle(
- fontWeight: FontWeight.bold,
- fontSize: 18,
+
+ // ============= 可滚动题目区域(防止题干或选项过长导致溢出) =============
+ if (q != null)
+ // 将题干和选项放入可滚动区域,保证页头和按钮固定
+ Expanded(
+ child: SingleChildScrollView(
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text(
+ '${current + 1}. ${q.questionDry} (${questionTypeMap[q.questionType] ?? ''})',
+ style: const TextStyle(
+ fontWeight: FontWeight.w500,
+ fontSize: 15,
+ ),
+ ),
+ const SizedBox(height: 16),
+ _buildOptions(q),
+ // 底部留白,避免最后一项被按钮遮挡
+ const SizedBox(height: 24),
+ ],
+ ),
),
- ),
- const SizedBox(height: 16),
- _buildOptions(q),
- ],
- const Spacer(),
+ )
+ else
+ // 占位,保证布局一致
+ const Expanded(child: SizedBox()),
+
+ const SizedBox(height: 8),
Row(
children: [
if (current > 0)
diff --git a/lib/pages/home/study/video_study_detail_page.dart b/lib/pages/home/study/video_study_detail_page.dart
index 2d115cd..9f3e3be 100644
--- a/lib/pages/home/study/video_study_detail_page.dart
+++ b/lib/pages/home/study/video_study_detail_page.dart
@@ -192,7 +192,7 @@ class _VideoStudyDetailPageState extends State {
children: [
Text(
'考试科目: ${paperInfo['EXAMNAME']}',
- style: TextStyle(color: Colors.white, fontSize: 18, fontWeight: FontWeight.bold),
+ style: TextStyle(color: Colors.white, fontSize: 16, fontWeight: FontWeight.bold),
),
Padding(padding: EdgeInsets.symmetric(horizontal: 15), child: Divider(color: Colors.white30, height: 20,),),
Text(
@@ -210,7 +210,7 @@ class _VideoStudyDetailPageState extends State {
if (q != null) ...[
Text(
'${current + 1}. ${q.questionDry} (${questionTypeMap[q.questionType]})',
- style: TextStyle(fontWeight: FontWeight.bold, fontSize: 18),
+ style: TextStyle(fontSize: 16),
),
SizedBox(height: 16),
_buildOptions(q),
diff --git a/lib/pages/home/tap/tabList/special_wrok/dangerous_options_page.dart b/lib/pages/home/tap/tabList/special_wrok/dangerous_options_page.dart
index ce3ea47..5140ff4 100644
--- a/lib/pages/home/tap/tabList/special_wrok/dangerous_options_page.dart
+++ b/lib/pages/home/tap/tabList/special_wrok/dangerous_options_page.dart
@@ -329,9 +329,6 @@ class _DangerousOptionsPageState extends State {
.toList(),
onChanged: (paths) {},
onMediaAdded: _onImageAdded,
- onMediaTapped: (path) {
- presentOpaque(SingleImageViewer(imageUrl: path), context);
- },
onMediaRemoved: (path) {
final item = imgList.firstWhere((e) => e.localPath == path);
_onImageRemoved(item);
diff --git a/lib/pages/home/tap/tabList/special_wrok/dh_work/aqjd_work_detail/hotwork_aqjd_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dh_work/aqjd_work_detail/hotwork_aqjd_detail.dart
index b2abbf6..07bcdf7 100644
--- a/lib/pages/home/tap/tabList/special_wrok/dh_work/aqjd_work_detail/hotwork_aqjd_detail.dart
+++ b/lib/pages/home/tap/tabList/special_wrok/dh_work/aqjd_work_detail/hotwork_aqjd_detail.dart
@@ -324,9 +324,6 @@ class _HotworkAqjdDetailState extends State {
mediaType: MediaType.image,
onChanged: (paths) {},
onMediaAdded: _onImageAdded,
- onMediaTapped: (path) {
- presentOpaque(SingleImageViewer(imageUrl: path), context);
- },
onMediaRemoved: (path) {
final item = imgList.firstWhere(
(e) => e.localPath == path,
diff --git a/lib/pages/home/tap/tabList/special_wrok/dh_work/dh_work_detai/hotwork_apply_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dh_work/dh_work_detai/hotwork_apply_detail.dart
index d514460..ef87dda 100644
--- a/lib/pages/home/tap/tabList/special_wrok/dh_work/dh_work_detai/hotwork_apply_detail.dart
+++ b/lib/pages/home/tap/tabList/special_wrok/dh_work/dh_work_detai/hotwork_apply_detail.dart
@@ -265,7 +265,7 @@ class _HotworkApplyDetailState extends State {
});
}
}
-
+
/// 选择经纬度
Future _showLocationHandle() async{
if (!FormUtils.hasValue(pd, 'ELECTRONIC_FENCE_AREA_ID')) {
@@ -476,10 +476,10 @@ class _HotworkApplyDetailState extends State {
{'value': _locationController.text.trim(), 'message': '请填写动火地点及部位'},
{'value': _methodController.text.trim(), 'message': '请填写动火方式'},
{'value': _hotworkPersonController.text.trim(), 'message': '请填写动火人及证书编号'},
- {
- 'value': _relatedController.text.trim(),
- 'message': '请输入关联的其他特殊作业及安全作业票编号',
- },
+ // {
+ // 'value': _relatedController.text.trim(),
+ // 'message': '请输入关联的其他特殊作业及安全作业票编号',
+ // },
{'value': _riskController.text.trim(), 'message': '请填写风险辨识结果'},
];
final level = pd['WORK_LEVEL'] ?? '';
diff --git a/lib/pages/home/tap/tabList/special_wrok/dh_work/ysgd_work_detail/hotwork_ysgd_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dh_work/ysgd_work_detail/hotwork_ysgd_detail.dart
index 1254f10..47ee6e2 100644
--- a/lib/pages/home/tap/tabList/special_wrok/dh_work/ysgd_work_detail/hotwork_ysgd_detail.dart
+++ b/lib/pages/home/tap/tabList/special_wrok/dh_work/ysgd_work_detail/hotwork_ysgd_detail.dart
@@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart';
import 'package:qhd_prevention/customWidget/custom_button.dart';
+import 'package:qhd_prevention/customWidget/full_screen_video_page.dart';
import 'package:qhd_prevention/customWidget/toast_util.dart';
import 'package:qhd_prevention/pages/home/tap/item_list_widget.dart';
import 'package:qhd_prevention/tools/tools.dart';
@@ -199,7 +200,7 @@ class _HotworkYsgdDetailState extends State {
title: '作废原因',
hintText: '请输入作废原因',
cancelText: '取消',
- confirmText: '确定'
+ confirmText: '确定',
);
if (reasonText.isEmpty) {
ToastUtil.showNormal(context, '请填写作废原因');
@@ -243,7 +244,7 @@ class _HotworkYsgdDetailState extends State {
if (result['result'] == 'success') {
ToastUtil.showSuccess(context, '保存成功');
Navigator.of(context).pop(true);
- }else{
+ } else {
ToastUtil.showNormal(context, '操作失败:${result['msg'] ?? '未知错误'}');
}
} catch (e) {
@@ -388,9 +389,6 @@ class _HotworkYsgdDetailState extends State {
horizontalPadding: 0,
onChanged: (paths) {},
onMediaAdded: _onImageAdded,
- onMediaTapped: (path) {
- presentOpaque(SingleImageViewer(imageUrl: path), context);
- },
onMediaRemoved: (path) {
final item = imgList.firstWhere(
(e) => e.localPath == path,
diff --git a/lib/pages/home/tap/tabList/special_wrok/dl_work/aqjd_work_detail/cutroad_aqjd_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dl_work/aqjd_work_detail/cutroad_aqjd_detail.dart
index ff0fbed..274e48e 100644
--- a/lib/pages/home/tap/tabList/special_wrok/dl_work/aqjd_work_detail/cutroad_aqjd_detail.dart
+++ b/lib/pages/home/tap/tabList/special_wrok/dl_work/aqjd_work_detail/cutroad_aqjd_detail.dart
@@ -317,9 +317,6 @@ class _CutroadAqjdDetailState extends State {
mediaType: MediaType.image,
onChanged: (paths) {},
onMediaAdded: _onImageAdded,
- onMediaTapped: (path) {
- presentOpaque(SingleImageViewer(imageUrl: path), context);
- },
onMediaRemoved: (path) {
final item = imgList.firstWhere(
(e) => e.localPath == path,
diff --git a/lib/pages/home/tap/tabList/special_wrok/dl_work/dl_work_detai/cutroad_apply_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dl_work/dl_work_detai/cutroad_apply_detail.dart
index 637bc60..5a14c24 100644
--- a/lib/pages/home/tap/tabList/special_wrok/dl_work/dl_work_detai/cutroad_apply_detail.dart
+++ b/lib/pages/home/tap/tabList/special_wrok/dl_work/dl_work_detai/cutroad_apply_detail.dart
@@ -281,10 +281,10 @@ class _CutroadApplyDetailState extends State {
{'value': _unitController.text.trim(), 'message': '请输入涉及相关单位(部门)'},
{'value': _contentController.text.trim(), 'message': '请输入断路原因'},
- {
- 'value': _relatedController.text.trim(),
- 'message': '请输入关联的其他特殊作业及安全作业票编号',
- },
+ // {
+ // 'value': _relatedController.text.trim(),
+ // 'message': '请输入关联的其他特殊作业及安全作业票编号',
+ // },
{'value': _riskController.text.trim(), 'message': '请填写风险辨识结果'},
];
/// 各项负责人校验
diff --git a/lib/pages/home/tap/tabList/special_wrok/dl_work/ysgd_work_detail/cutroad_ysgd_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dl_work/ysgd_work_detail/cutroad_ysgd_detail.dart
index 461d16c..b6b0f63 100644
--- a/lib/pages/home/tap/tabList/special_wrok/dl_work/ysgd_work_detail/cutroad_ysgd_detail.dart
+++ b/lib/pages/home/tap/tabList/special_wrok/dl_work/ysgd_work_detail/cutroad_ysgd_detail.dart
@@ -380,12 +380,6 @@ class _CutroadYsgdDetailState extends State {
horizontalPadding: 0,
onChanged: (paths) {},
onMediaAdded: _onImageAdded,
- onMediaTapped: (path) {
- presentOpaque(
- SingleImageViewer(imageUrl: path),
- context,
- );
- },
onMediaRemoved: (path) {
final item = imgList.firstWhere(
(e) => e.localPath == path,
diff --git a/lib/pages/home/tap/tabList/special_wrok/dl_work/zyr_work_detail/cutroad_zyr_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dl_work/zyr_work_detail/cutroad_zyr_detail.dart
index 166eb6e..00eafda 100644
--- a/lib/pages/home/tap/tabList/special_wrok/dl_work/zyr_work_detail/cutroad_zyr_detail.dart
+++ b/lib/pages/home/tap/tabList/special_wrok/dl_work/zyr_work_detail/cutroad_zyr_detail.dart
@@ -328,9 +328,6 @@ setState(() {
horizontalPadding: 0,
isRequired: true,
onMediaAdded: _onImageAdded,
- onMediaTapped: (path) {
- presentOpaque(SingleImageViewer(imageUrl: path), context);
- },
onMediaRemoved: (path) {
final item = imgList.firstWhere((e) => e.localPath == path);
_onImageRemoved(item);
diff --git a/lib/pages/home/tap/tabList/special_wrok/dt_work/aqjd_work_detail/breakground_aqjd_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dt_work/aqjd_work_detail/breakground_aqjd_detail.dart
index 4ebd960..460c088 100644
--- a/lib/pages/home/tap/tabList/special_wrok/dt_work/aqjd_work_detail/breakground_aqjd_detail.dart
+++ b/lib/pages/home/tap/tabList/special_wrok/dt_work/aqjd_work_detail/breakground_aqjd_detail.dart
@@ -317,9 +317,6 @@ class _BreakgroundAqjdDetailState extends State {
mediaType: MediaType.image,
onChanged: (paths) {},
onMediaAdded: _onImageAdded,
- onMediaTapped: (path) {
- presentOpaque(SingleImageViewer(imageUrl: path), context);
- },
onMediaRemoved: (path) {
final item = imgList.firstWhere(
(e) => e.localPath == path,
diff --git a/lib/pages/home/tap/tabList/special_wrok/dt_work/dt_work_detai/breakground_apply_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dt_work/dt_work_detai/breakground_apply_detail.dart
index 6731053..f57b19f 100644
--- a/lib/pages/home/tap/tabList/special_wrok/dt_work/dt_work_detai/breakground_apply_detail.dart
+++ b/lib/pages/home/tap/tabList/special_wrok/dt_work/dt_work_detai/breakground_apply_detail.dart
@@ -420,10 +420,10 @@ class _BreakgroundApplyDetailState extends State {
final textRules =