吉安感知网项目-后端
linwei
2026-06-06 b0b01b7302d2b9c6b2f5c6583d40b92b63e6b5f1
feat(workorder): 添加geojson字段支持并优化数据处理

- 在GdTaskResult表中新增geojson字段并更新插入语句
- 为GdTaskResultVO添加geojson属性定义
- 实现geojson字段的数据转换逻辑,解决字符串数组格式转换问题
- 添加processGeojson方法处理"[{"score":0.88}]"到[{"score":0.88}]的格式转换
- 集成FastJSON库进行JSON解析和转换操作
- 增加日志记录功能用于调试geojson处理过程
3 files modified
71 ■■■■■ changed files
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/mapper/GdTaskResultMapper.xml 4 ●●●● patch | view | raw | blame | history
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/vo/GdTaskResultVO.java 4 ●●●● patch | view | raw | blame | history
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/wrapper/GdTaskResultWrapper.java 63 ●●●●● patch | view | raw | blame | history
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>
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;
}
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 文件类型字符串(图片/视频/照片)