From b0b01b7302d2b9c6b2f5c6583d40b92b63e6b5f1 Mon Sep 17 00:00:00 2001
From: linwei <872216696@qq.com>
Date: Sat, 06 Jun 2026 15:28:58 +0800
Subject: [PATCH] feat(workorder): 添加geojson字段支持并优化数据处理

---
 drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/vo/GdTaskResultVO.java           |    4 ++
 drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/mapper/GdTaskResultMapper.xml    |    4 +-
 drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/wrapper/GdTaskResultWrapper.java |   63 +++++++++++++++++++++++++++++++
 3 files changed, 69 insertions(+), 2 deletions(-)

diff --git a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/mapper/GdTaskResultMapper.xml b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/mapper/GdTaskResultMapper.xml
index bd9806c..cd360d3 100644
--- a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/mapper/GdTaskResultMapper.xml
+++ b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/mapper/GdTaskResultMapper.xml
@@ -133,14 +133,14 @@
             patrol_task_id, result_code, result_url, shoot_time,
             photo_data, longitude, latitude, distribute_status, area_code,
             create_user, create_dept, create_time, update_user, update_time,
-            status, is_deleted, attachment_type
+            status, is_deleted, attachment_type, geojson
         ) VALUES
         <foreach collection="list" item="item" separator=",">
             (
                 #{item.patrolTaskId}, #{item.resultCode}, #{item.resultUrl}, #{item.shootTime},
                 CASE WHEN #{item.photoData} IS NULL THEN NULL ELSE CAST(#{item.photoData} AS JSONB) END, #{item.longitude}, #{item.latitude}, #{item.distributeStatus}, #{item.areaCode},
                 #{item.createUser}, #{item.createDept}, #{item.createTime}, #{item.updateUser}, #{item.updateTime},
-                #{item.status}, #{item.isDeleted}, #{item.attachmentType}
+                #{item.status}, #{item.isDeleted}, #{item.attachmentType}, #{item.geojson}
             )
         </foreach>
     </insert>
diff --git a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/vo/GdTaskResultVO.java b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/vo/GdTaskResultVO.java
index beee4ad..3d25639 100644
--- a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/vo/GdTaskResultVO.java
+++ b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/vo/GdTaskResultVO.java
@@ -133,4 +133,8 @@
 	@ApiModelProperty(value = "附件类型:0图片 1视频 2其他")
 	private Integer attachmentType;
 
+	// geojson
+	@ApiModelProperty(value = "geojson")
+	private String geojson;
+
 }
diff --git a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/wrapper/GdTaskResultWrapper.java b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/wrapper/GdTaskResultWrapper.java
index 5e1612c..7d7f468 100644
--- a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/wrapper/GdTaskResultWrapper.java
+++ b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/wrapper/GdTaskResultWrapper.java
@@ -16,8 +16,11 @@
  */
 package org.sxkj.gd.workorder.wrapper;
 
+import com.alibaba.fastjson.JSON;
+import lombok.extern.slf4j.Slf4j;
 import org.springblade.core.mp.support.BaseEntityWrapper;
 import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.core.tool.utils.StringUtil;
 import org.sxkj.gd.workorder.dto.GdTaskResultDTO;
 import org.sxkj.gd.workorder.entity.GdTaskResultEntity;
 import org.sxkj.gd.workorder.vo.GdTaskResultVO;
@@ -32,6 +35,7 @@
  * @author lw
  * @since 2026-01-14
  */
+@Slf4j
 public class GdTaskResultWrapper extends BaseEntityWrapper<GdTaskResultEntity, GdTaskResultVO>  {
 
 	public static GdTaskResultWrapper build() {
@@ -57,6 +61,7 @@
 
 	/**
 	 * 将单个DTO转换为Entity
+	 * 处理geojson字段:将字符串数组格式转换为正确的JSON对象数组格式
 	 *
 	 * @param dto DTO对象
 	 * @return Entity对象
@@ -64,16 +69,74 @@
 	private GdTaskResultEntity convertDtoToEntity(GdTaskResultDTO dto) {
 		GdTaskResultEntity entity = BeanUtil.copy(dto, GdTaskResultEntity.class);
 
+		// 步骤1:设置附件类型
 		if (dto.getAttachmentType() != null) {
 			entity.setAttachmentType(dto.getAttachmentType());
 		} else if (dto.getDateType() != null) {
 			entity.setAttachmentType(dto.getDateType());
 		}
 
+		// 步骤2:处理geojson字段,将字符串数组转换为正确的JSON格式
+		String processedGeojson = processGeojson(dto.getGeojson());
+		entity.setGeojson(processedGeojson);
+
 		return entity;
 	}
 
 	/**
+	 * 处理geojson字段,将字符串数组格式转换为正确的JSON对象数组格式
+	 * 解决问题:["{\"score\":0.88}"] -> [{"score":0.88}]
+	 *
+	 * @param geojson 原始geojson字符串
+	 * @return 处理后的geojson字符串,如果处理失败则返回原值
+	 */
+	private String processGeojson(String geojson) {
+		// 步骤1:空值检查
+		if (StringUtil.isEmpty(geojson)) {
+			return geojson;
+		}
+
+		try {
+			// 步骤2:尝试解析为JSONArray
+			com.alibaba.fastjson.JSONArray jsonArray = JSON.parseArray(geojson);
+			if (jsonArray == null || jsonArray.isEmpty()) {
+				return geojson;
+			}
+
+			// 步骤3:检查第一个元素是否为字符串(说明是字符串数组格式)
+			Object firstElement = jsonArray.get(0);
+			if (firstElement instanceof String) {
+				// 步骤4:这是一个字符串数组,需要解析每个字符串元素
+				com.alibaba.fastjson.JSONArray resultArray = new com.alibaba.fastjson.JSONArray();
+				for (int i = 0; i < jsonArray.size(); i++) {
+					String elementStr = jsonArray.getString(i);
+					if (StringUtil.hasText(elementStr)) {
+						try {
+							// 步骤5:解析字符串为JSON对象
+							com.alibaba.fastjson.JSONObject jsonObj = JSON.parseObject(elementStr);
+							if (jsonObj != null) {
+								resultArray.add(jsonObj);
+							}
+						} catch (Exception e) {
+							// 单个元素解析失败,记录日志但继续处理其他元素
+							log.warn("解析geojson数组元素失败: {}", elementStr);
+						}
+					}
+				}
+				// 步骤6:返回正确的JSON数组格式
+				return resultArray.toJSONString();
+			}
+
+			// 如果不是字符串数组,直接返回原值
+			return geojson;
+		} catch (Exception e) {
+			// 解析失败,返回原值
+			log.warn("处理geojson失败,返回原值: {}", geojson, e);
+			return geojson;
+		}
+	}
+
+	/**
 	 * 将文件类型字符串转换为附件类型编码
 	 *
 	 * @param fileType 文件类型字符串(图片/视频/照片)

--
Gitblit v1.9.3