From fe8a0ffbc45f8afec2d6fec36b97562605d0d84d Mon Sep 17 00:00:00 2001 From: mmc <1556375442@qq.com> Date: Sun, 1 Mar 2026 16:13:37 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8D=81=E5=AD=97=E5=87=86=E6=98=9F=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=20=20=E4=BF=9D=E5=AD=98=20=E5=88=9D=E6=AD=A5=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/widgets/common/enum.dart | 6 +- .../widgets/map/testmap_pages.dart | 170 ++++++++++++++++-- 2 files changed, 162 insertions(+), 14 deletions(-) diff --git a/lib/features/home/presentation/widgets/common/enum.dart b/lib/features/home/presentation/widgets/common/enum.dart index 964f2b03..a76e58a2 100644 --- a/lib/features/home/presentation/widgets/common/enum.dart +++ b/lib/features/home/presentation/widgets/common/enum.dart @@ -1,9 +1,9 @@ enum WorkMode { - bow("0"), // 作业模式:bow,值为0 - custom("2"); // 作业模式:custom,值为2 + bow(0), // 作业模式:bow,值为0 + custom(2); // 作业模式:custom,值为2 // 定义枚举的数值属性 - final String value; + final int value; // 枚举构造函数(必须是const) const WorkMode(this.value); } diff --git a/lib/features/home/presentation/widgets/map/testmap_pages.dart b/lib/features/home/presentation/widgets/map/testmap_pages.dart index 1de21f73..1dc49073 100644 --- a/lib/features/home/presentation/widgets/map/testmap_pages.dart +++ b/lib/features/home/presentation/widgets/map/testmap_pages.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'dart:convert'; import 'dart:math'; +import 'dart:math' as math; import 'dart:typed_data'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; @@ -324,7 +325,7 @@ class _MapPageEnterpriseState extends State { // 2. 构造 SavePath 数据 (严格对应你的 JS 结构) final Map savePath = { - 'img': imgBase64 ?? '', // 截图的 Base64 字符串 + //'img': imgBase64 ?? '', // 截图的 Base64 字符串 'name': plotName, // 地块名称 'path': jsonEncode( typedPathList @@ -342,7 +343,7 @@ class _MapPageEnterpriseState extends State { .map( (point) => { // 外边界点数组 - 'lon': point.longitude, + 'lng': point.longitude, 'lat': point.latitude, }, ) @@ -350,6 +351,34 @@ class _MapPageEnterpriseState extends State { ), 'planModel': _currentWorkMode == WorkMode.bow ? 0 : 2, // 作业模式值 }; + // 2. 解析并打印 Path + try { + final List pathData = jsonDecode(savePath['path'] as String); + print('\n🗺️ 路径数据 (共 ${pathData.length} 个点):'); + // 格式化打印前 3 个点,避免数据过多刷屏 + for (int i = 0; i < math.min(3, pathData.length); i++) { + final point = pathData[i] as Map; + print(' 点 $i: lat=${point['lat']}, lon=${point['lon']}'); + } + if (pathData.length > 3) { + print(' ... 还有 ${pathData.length - 3} 个点'); + } + } catch (e) { + print('❌ 解析 path 失败: $e'); + } + + // 3. 解析并打印 Outer + try { + final List outerData = jsonDecode(savePath['outer'] as String); + print('\n📏 外边界数据 (共 ${outerData.length} 个点):'); + // 格式化打印所有外边界点(通常数量少) + for (int i = 0; i < outerData.length; i++) { + final point = outerData[i] as Map; + print(' 点 $i: lat=${point['lat']}, lon=${point['lon']}'); + } + } catch (e) { + print('❌ 解析 outer 失败: $e'); + } // 3. 构造 workRecord (包裹一层) final Map workRecord = { @@ -383,7 +412,7 @@ class _MapPageEnterpriseState extends State { ), ); - _debugPrintMultipartRequest(request); + //_debugPrintMultipartRequest(request); // 7. 发送请求 try { @@ -630,29 +659,150 @@ class _MapPageEnterpriseState extends State { print('加载地块「${plot.plotName}」的路径数据: $_loadedPlot'); // 2. 立即解析并更新状态(在事件回调中,不在 build 中) + //if (_loadedPlot is List) { + // final List rawList = _loadedPlot as List; + // final pathRecords = rawList.where((item) => item is Map).cast>().toList(); + + // // 打印:过滤后的 pathRecords 长度和第一条数据的顶层字段 + // print('🔍 过滤后 pathRecords 长度: ${pathRecords.length}'); + // if (pathRecords.isNotEmpty) { + // final Map firstRecord = pathRecords.first; + // print('📋 第一条记录的顶层字段:'); + // print(' - id: ${firstRecord['id']}'); + // print(' - workName: ${firstRecord['workName']}'); + // print(' - userId: ${firstRecord['userId']}'); + // print(' - jsonData (原始字符串长度): ${firstRecord['jsonData']?.toString().length ?? 0} 字符'); + // print('------------------------------------'); + + // final selectedPlotPath = PlotDataPath(jsonData: firstRecord); + // try { + // final dynamic nestedJsonRaw = selectedPlotPath.jsonData['jsonData']; + // print('📦 嵌套 jsonData 原始类型: ${nestedJsonRaw.runtimeType}'); + // print('📦 嵌套 jsonData 前200字符: ${nestedJsonRaw?.toString().substring(0, min(200, nestedJsonRaw?.toString().length ?? 0))}...'); + + // if (nestedJsonRaw != null && nestedJsonRaw is String) { + // final String nestedJsonStr = nestedJsonRaw; + // final dynamic parsedJson = jsonDecode(nestedJsonStr); + // print('✅ 嵌套 JSON 解析成功,类型: ${parsedJson.runtimeType}'); + + // // 格式化打印完整的嵌套 JSON(排除 img 字段,避免刷屏) + // if (parsedJson is Map) { + // final Map nestedJson = Map.from(parsedJson); + // // 截断 img 字段的 Base64 数据 + // if (nestedJson.containsKey('img')) { + // final String imgBase64 = nestedJson['img'] as String; + // nestedJson['img'] = imgBase64.substring(0, min(50, imgBase64.length)) + '...(Base64 已截断)'; + // } + // print('📝 格式化嵌套 JSON 数据:'); + // print(const JsonEncoder.withIndent(' ').convert(nestedJson)); + // print('------------------------------------'); + + // // 解析作业模式并打印 + // final dynamic planModel = nestedJson['planModel']; + // workMode = planModel == WorkMode.bow.value ? "弓字模式" : "自定义模式"; + // print('⚙️ 解析出作业模式: $workMode (原始 planModel 值: $planModel)'); + + // // 解析 Path 并打印明细 + // final dynamic rawPath = nestedJson['path']; + // List pathList = rawPath is List ? rawPath : []; + // print('🗺️ 解析出 Path 数据:'); + // print(' - Path 类型: ${rawPath.runtimeType}'); + // print(' - Path 长度: ${pathList.length} 个点'); + // // 逐点打印前 5 个 Path 坐标(避免点太多刷屏) + // for (int i = 0; i < min(5, pathList.length); i++) { + // final dynamic point = pathList[i]; + // print(' - Path 点 $i: lat=${point['lat']}, lon=${point['lon']} (或 lng=${point['lng']})'); + // } + // if (pathList.length > 5) { + // print(' - ... 还有 ${pathList.length - 5} 个点未显示'); + // } + + // // 解析 Outer 并打印明细 + // final dynamic rawOuter = nestedJson['outer']; + // List outerList = rawOuter is List ? rawOuter : []; + // print('📏 解析出 Outer 外边界数据:'); + // print(' - Outer 类型: ${rawOuter.runtimeType}'); + // print(' - Outer 长度: ${outerList.length} 个点'); + // // 逐点打印前 5 个 Outer 坐标 + // for (int i = 0; i < min(5, outerList.length); i++) { + // final dynamic point = outerList[i]; + // print(' - Outer 点 $i: lat=${point['lat']}, lon=${point['lon']} (或 lng=${point['lng']})'); + // } + // if (outerList.length > 5) { + // print(' - ... 还有 ${outerList.length - 5} 个点未显示'); + // } + + // // 后续坐标转换逻辑(保持你的原有代码) + // // ...(这里放你原来的坐标转换、setState 逻辑) + // } else { + // print('❌ 解析失败:嵌套 JSON 不是 Map 类型,实际类型: ${parsedJson.runtimeType}'); + // } + // } else { + // print('❌ 解析失败:nestedJsonRaw 为空或不是字符串,实际值: $nestedJsonRaw,类型: ${nestedJsonRaw?.runtimeType}'); + // } + // } catch (e, stackTrace) { + // print('❌ 解析嵌套 JSON 时发生异常: $e'); + // print('📜 异常堆栈: $stackTrace'); + // } + // } else { + // print('❌ 过滤后 pathRecords 为空,无有效数据'); + // } + //} if (_loadedPlot is List) { final List rawList = _loadedPlot as List; final pathRecords = rawList.where((item) => item is Map).cast>().toList(); - if (pathRecords.isNotEmpty) { final selectedPlotPath = PlotDataPath(jsonData: pathRecords.first); try { final dynamic nestedJsonRaw = selectedPlotPath.jsonData['jsonData']; - if (nestedJsonRaw != null && nestedJsonRaw is String) { final String nestedJsonStr = nestedJsonRaw; final dynamic parsedJson = jsonDecode(nestedJsonStr); workMode = parsedJson['planModel'] == WorkMode.bow.value ? "弓字模式" : "自定义模式"; + debugPrint('解析出的作业模式: ${parsedJson['planModel']},WorkMode.bow.value=${WorkMode.bow.value}, 解析结果: $workMode'); if (parsedJson is Map) { final Map nestedJson = parsedJson; + // 替换你原来的 rawPath/rawOuter 解析部分 final dynamic rawPath = nestedJson['path']; final dynamic rawOuter = nestedJson['outer']; - List pathList = rawPath is List ? rawPath : []; - List outerList = rawOuter is List ? rawOuter : []; + debugPrint('解析后的路径数据11: pathList=$rawPath,'); + debugPrint('解析后的外边界数据22: outerList=$rawOuter,'); + + // ========== 修复核心:先解码字符串,再处理类型 ========== + List pathList = []; + if (rawPath is String) { + try { + pathList = jsonDecode(rawPath) as List; + } catch (e) { + debugPrint('path 字符串解码失败: $e, rawPath=$rawPath'); + pathList = []; + } + } else if (rawPath is List) { + pathList = rawPath; + } else { + pathList = []; + } + + List outerList = []; + if (rawOuter is String) { + try { + outerList = jsonDecode(rawOuter) as List; + } catch (e) { + debugPrint('outer 字符串解码失败: $e, rawOuter=$rawOuter'); + outerList = []; + } + } else if (rawOuter is List) { + outerList = rawOuter; + } else { + outerList = []; + } + // ========== 修复结束 ========== + + debugPrint('解析后的路径数据: pathList=$pathList, 长度=${pathList.length}'); + debugPrint('解析后的外边界数据: outerList=$outerList, 长度=${outerList.length}'); List newPathPoints = []; List newOuterPoints = []; - for (var item in pathList) { double? lat = safeToDouble(item['lat']); double? lon = safeToDouble(item['lon']); @@ -667,7 +817,6 @@ class _MapPageEnterpriseState extends State { newOuterPoints.add(convertWGS84ToGCJ02(lat, lng)); } } - // 在这里更新状态(安全,因为在事件回调中) setState(() { gcjPathPoints = newPathPoints; @@ -676,7 +825,6 @@ class _MapPageEnterpriseState extends State { _isListBoxOpen = false; _isWorkPanelOpen = true; }); - // 移动地图到中心 List allPoints = []; allPoints.addAll(gcjPathPoints); @@ -1326,7 +1474,7 @@ class _MapPageEnterpriseState extends State { }).toList(); gcjOuterPoints = List.from(_markedPoints); // 生成新列表,复制所有元素 // ========== 核心修改:清空临时打点列表 ========== - _markedPoints.clear(); // 清空后,临时划线会自动消失 + //_markedPoints.clear(); // 清空后,临时划线会自动消失 }); moveMapToPointsCenter(gcjPathPoints); }