From 1510366fa12fafd5197ebcd8d7fbc45d2383218d Mon Sep 17 00:00:00 2001
From: linwei <872216696@qq.com>
Date: Thu, 22 Jan 2026 15:49:27 +0800
Subject: [PATCH] 设备管理优化

---
 drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/controller/GdManageDeviceController.java          |   32 ++--
 drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/entity/GdPatrolTaskEntity.java                    |    6 
 drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/IGdManageDeviceService.java               |    7 +
 drone-service/drone-gd/src/main/java/org/sxkj/gd/orderdata/mapper/GdDataObjectionMapper.xml                  |    2 
 drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/vo/GdPatrolTaskVO.java                            |    7 +
 drone-service/drone-gd/src/main/java/org/sxkj/gd/config/GeometryTypeHandler.java                             |  125 +++++++++++++++++
 drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdWorkOrderServiceImpl.java          |    1 
 drone-ops/drone-resource/src/main/java/org/sxkj/resource/dto/AttachDto.java                                  |   22 +++
 drone-service/drone-gd/src/main/java/org/sxkj/gd/orderdata/param/GdApplicationInnovationParam.java           |   14 ++
 drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/mapper/GdManageDeviceMapper.xml                   |   22 ++
 drone-service/drone-gd/src/main/java/org/sxkj/gd/utils/GeomUtils.java                                        |   86 ++++++++++++
 drone-service/drone-gd/src/main/java/org/sxkj/gd/orderdata/vo/GdDataObjectionVO.java                         |    3 
 drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdManageDeviceServiceImpl.java       |   17 ++
 drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/vo/GdManageDeviceVO.java                          |    5 
 drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/vo/GdWorkOrderVO.java                             |    6 
 drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/mapper/GdWorkOrderMapper.xml                      |    1 
 drone-service/drone-gd/src/main/java/org/sxkj/gd/orderdata/controller/GdApplicationInnovationController.java |   30 +--
 drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/entity/GdManageDeviceEntity.java                  |   11 +
 drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/entity/GdWorkOrderEntity.java                     |    7 +
 drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdPatrolTaskServiceImpl.java         |    1 
 20 files changed, 364 insertions(+), 41 deletions(-)

diff --git a/drone-ops/drone-resource/src/main/java/org/sxkj/resource/dto/AttachDto.java b/drone-ops/drone-resource/src/main/java/org/sxkj/resource/dto/AttachDto.java
index 3fd3ba8..33c94f4 100644
--- a/drone-ops/drone-resource/src/main/java/org/sxkj/resource/dto/AttachDto.java
+++ b/drone-ops/drone-resource/src/main/java/org/sxkj/resource/dto/AttachDto.java
@@ -9,7 +9,6 @@
 public class AttachDto {
 
 	@ApiModelProperty(value = "附件id")
-	@NotNull
 	private Long id;
 
 	/**
@@ -18,5 +17,26 @@
 	@ApiModelProperty(value = "附件名称")
 	private String nickName;
 
+	/**
+	 * 附件地址
+	 */
+	@ApiModelProperty(value = "附件地址")
+	private String link;
+
+	/**
+	 * 附件名称
+	 */
+	@ApiModelProperty(value = "附件名称")
+	private String name;
+	/**
+	 * 附件原名
+	 */
+	@ApiModelProperty(value = "附件原名")
+	private String originalName;
+
+	@ApiModelProperty(value = "附件类型: 1=巡查类文档,2=巡检类文档,3=安保类文档,4=文旅类文档,5=采集数据类文档")
+	private Integer resultType;
+
+
 
 }
diff --git a/drone-service/drone-gd/src/main/java/org/sxkj/gd/config/GeometryTypeHandler.java b/drone-service/drone-gd/src/main/java/org/sxkj/gd/config/GeometryTypeHandler.java
new file mode 100644
index 0000000..0d46756
--- /dev/null
+++ b/drone-service/drone-gd/src/main/java/org/sxkj/gd/config/GeometryTypeHandler.java
@@ -0,0 +1,125 @@
+package org.sxkj.gd.config;
+
+
+import org.apache.ibatis.type.BaseTypeHandler;
+import org.apache.ibatis.type.JdbcType;
+import org.apache.ibatis.type.MappedJdbcTypes;
+import org.apache.ibatis.type.MappedTypes;
+import org.locationtech.jts.geom.Geometry;
+import org.locationtech.jts.geom.GeometryFactory;
+import org.locationtech.jts.geom.PrecisionModel;
+import org.locationtech.jts.io.*;
+
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.sql.CallableStatement;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+@MappedTypes({String.class})
+@MappedJdbcTypes({JdbcType.OTHER})
+public class GeometryTypeHandler extends BaseTypeHandler<String> {
+
+
+	@Override
+	public void setNonNullParameter(PreparedStatement preparedStatement, int i, String s, JdbcType jdbcType) throws SQLException {
+
+
+		Geometry geo = null;
+		try {
+			// String转Geometry
+			geo = new WKTReader(new GeometryFactory(new PrecisionModel())).read(s);
+			// Geometry转WKB
+			byte[] geometryBytes = new WKBWriter(2, ByteOrderValues.LITTLE_ENDIAN, false).write(geo);
+			// 设置SRID为mysql默认的 0
+			byte[] wkb = new byte[geometryBytes.length + 4];
+			wkb[0] = wkb[1] = wkb[2] = wkb[3] = 0;
+			System.arraycopy(geometryBytes, 0, wkb, 4, geometryBytes.length);
+			preparedStatement.setBytes(i, wkb);
+		} catch (ParseException e) {
+
+		}
+	}
+
+
+	@Override
+	public String getNullableResult(ResultSet resultSet, String s) {
+		try (InputStream inputStream = resultSet.getBinaryStream(s)) {
+			Geometry geo = getGeometryFromInputStream(inputStream);
+			if (geo != null) {
+				return geo.toString();
+			}
+		} catch (Exception e) {
+
+		}
+		return null;
+	}
+
+	@Override
+	public String getNullableResult(ResultSet resultSet, int i) {
+		try (InputStream inputStream = resultSet.getBinaryStream(i)) {
+			Geometry geo = getGeometryFromInputStream(inputStream);
+			if (geo != null) {
+				return geo.toString();
+			}
+		} catch (Exception e) {
+
+		}
+		return null;
+	}
+
+	@Override
+	public String getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
+		return "";
+	}
+
+	/**
+	 * 流 转 geometry
+	 */
+	private Geometry getGeometryFromInputStream(InputStream inputStream) throws Exception {
+
+		Geometry dbGeometry = null;
+
+		if (inputStream != null) {
+			// 二进制流转成字节数组
+			byte[] buffer = new byte[255];
+
+			int bytesRead = 0;
+			ByteArrayOutputStream baos = new ByteArrayOutputStream();
+			while ((bytesRead = inputStream.read(buffer)) != -1) {
+				baos.write(buffer, 0, bytesRead);
+			}
+			// 得到字节数组
+			byte[] geometryAsBytes = baos.toByteArray();
+			// 字节数组小于5 异常
+			if (geometryAsBytes.length < 5) {
+
+			}
+
+			// 字节数组前4个字节表示srid 去掉
+			byte[] sridBytes = new byte[4];
+			System.arraycopy(geometryAsBytes, 0, sridBytes, 0, 4);
+			boolean bigEndian = (geometryAsBytes[4] == 0x00);
+			// 解析srid
+			int srid = 0;
+			if (bigEndian) {
+				for (int i = 0; i < sridBytes.length; i++) {
+					srid = (srid << 8) + (sridBytes[i] & 0xff);
+				}
+			} else {
+				for (int i = 0; i < sridBytes.length; i++) {
+					srid += (sridBytes[i] & 0xff) << (8 * i);
+				}
+			}
+
+			WKBReader wkbReader = new WKBReader();
+			// WKBReader 把字节数组转成geometry对象。
+			byte[] wkb = new byte[geometryAsBytes.length - 4];
+			System.arraycopy(geometryAsBytes, 4, wkb, 0, wkb.length);
+			dbGeometry = wkbReader.read(wkb);
+			dbGeometry.setSRID(srid);
+		}
+		return dbGeometry;
+	}
+}
diff --git a/drone-service/drone-gd/src/main/java/org/sxkj/gd/orderdata/controller/GdApplicationInnovationController.java b/drone-service/drone-gd/src/main/java/org/sxkj/gd/orderdata/controller/GdApplicationInnovationController.java
index 711daf1..dc502d6 100644
--- a/drone-service/drone-gd/src/main/java/org/sxkj/gd/orderdata/controller/GdApplicationInnovationController.java
+++ b/drone-service/drone-gd/src/main/java/org/sxkj/gd/orderdata/controller/GdApplicationInnovationController.java
@@ -16,36 +16,28 @@
  */
 package org.sxkj.gd.orderdata.controller;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
-import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import lombok.AllArgsConstructor;
-import javax.validation.Valid;
-
-import org.springblade.core.secure.BladeUser;
+import org.springblade.core.boot.ctrl.BladeController;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
 import org.springframework.web.bind.annotation.*;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.sxkj.gd.common.GenericConverter;
 import org.sxkj.gd.orderdata.dto.GdApplicationInnovationDTO;
 import org.sxkj.gd.orderdata.entity.GdApplicationInnovationEntity;
 import org.sxkj.gd.orderdata.param.GdApplicationInnovationPageParam;
-import org.sxkj.gd.orderdata.vo.GdApplicationInnovationVO;
-import org.sxkj.gd.orderdata.excel.GdApplicationInnovationExcel;
-import org.sxkj.gd.orderdata.wrapper.GdApplicationInnovationWrapper;
+import org.sxkj.gd.orderdata.param.GdApplicationInnovationParam;
 import org.sxkj.gd.orderdata.service.IGdApplicationInnovationService;
-import org.springblade.core.boot.ctrl.BladeController;
-import org.springblade.core.tool.utils.DateUtil;
-import org.springblade.core.excel.util.ExcelUtil;
-import org.springblade.core.tool.constant.BladeConstant;
-import springfox.documentation.annotations.ApiIgnore;
-import java.util.Map;
-import java.util.List;
-import javax.servlet.http.HttpServletResponse;
+import org.sxkj.gd.orderdata.vo.GdApplicationInnovationVO;
+import org.sxkj.gd.orderdata.wrapper.GdApplicationInnovationWrapper;
+
+import javax.validation.Valid;
 
 /**
  * 应用创新案例表 控制器
@@ -67,8 +59,8 @@
 	@GetMapping("/detail")
 	@ApiOperationSupport(order = 1)
 	@ApiOperation(value = "详情", notes = "传入gdApplicationInnovation")
-	public R<GdApplicationInnovationVO> detail(GdApplicationInnovationEntity gdApplicationInnovation) {
-		GdApplicationInnovationEntity detail = gdApplicationInnovationService.getOne(Condition.getQueryWrapper(gdApplicationInnovation));
+	public R<GdApplicationInnovationVO> detail(GdApplicationInnovationParam gdApplicationInnovation) {
+		GdApplicationInnovationEntity detail = gdApplicationInnovationService.getOne(Condition.getQueryWrapper(GenericConverter.convert(gdApplicationInnovation, GdApplicationInnovationEntity.class)));
 		return R.data(GdApplicationInnovationWrapper.build().entityVO(detail));
 	}
 
diff --git a/drone-service/drone-gd/src/main/java/org/sxkj/gd/orderdata/mapper/GdDataObjectionMapper.xml b/drone-service/drone-gd/src/main/java/org/sxkj/gd/orderdata/mapper/GdDataObjectionMapper.xml
index bd481aa..7de7022 100644
--- a/drone-service/drone-gd/src/main/java/org/sxkj/gd/orderdata/mapper/GdDataObjectionMapper.xml
+++ b/drone-service/drone-gd/src/main/java/org/sxkj/gd/orderdata/mapper/GdDataObjectionMapper.xml
@@ -49,7 +49,7 @@
     </select>
 
     <select id="getDetail" resultType="org.sxkj.gd.orderdata.vo.GdDataObjectionVO">
-        select do.*, GROUP_CONCAT(da.attach_name SEPARATOR ',') as attach_names
+        select do.*, GROUP_CONCAT(da.attach_name SEPARATOR ',') as attach_names ,GROUP_CONCAT(da.attach_id SEPARATOR ',') as attach_ids
         from ja_gd_data_objection do
         left join ja_gd_data_objection_attachment da on do.id = da.objection_id
         <where>
diff --git a/drone-service/drone-gd/src/main/java/org/sxkj/gd/orderdata/param/GdApplicationInnovationParam.java b/drone-service/drone-gd/src/main/java/org/sxkj/gd/orderdata/param/GdApplicationInnovationParam.java
new file mode 100644
index 0000000..8ece6df
--- /dev/null
+++ b/drone-service/drone-gd/src/main/java/org/sxkj/gd/orderdata/param/GdApplicationInnovationParam.java
@@ -0,0 +1,14 @@
+package org.sxkj.gd.orderdata.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Data
+public class GdApplicationInnovationParam {
+
+	@ApiModelProperty(value = "主键id")
+	@NotNull
+	private Long id;
+}
diff --git a/drone-service/drone-gd/src/main/java/org/sxkj/gd/orderdata/vo/GdDataObjectionVO.java b/drone-service/drone-gd/src/main/java/org/sxkj/gd/orderdata/vo/GdDataObjectionVO.java
index 14cafd3..db27993 100644
--- a/drone-service/drone-gd/src/main/java/org/sxkj/gd/orderdata/vo/GdDataObjectionVO.java
+++ b/drone-service/drone-gd/src/main/java/org/sxkj/gd/orderdata/vo/GdDataObjectionVO.java
@@ -98,6 +98,9 @@
 	 */
 	@ApiModelProperty(value = "附件名称列表(逗号分隔)")
 	private String attachNames;
+
+	@ApiModelProperty(value = "附件名称列表(逗号分隔)")
+	private String attachIds;
 	/**
 	 * 创建人
 	 */
diff --git a/drone-service/drone-gd/src/main/java/org/sxkj/gd/utils/GeomUtils.java b/drone-service/drone-gd/src/main/java/org/sxkj/gd/utils/GeomUtils.java
new file mode 100644
index 0000000..e263cfe
--- /dev/null
+++ b/drone-service/drone-gd/src/main/java/org/sxkj/gd/utils/GeomUtils.java
@@ -0,0 +1,86 @@
+package org.sxkj.gd.utils;
+
+import org.geotools.geometry.DirectPosition2D;
+import org.geotools.geometry.jts.JTS;
+import org.geotools.referencing.CRS;
+import org.geotools.referencing.crs.DefaultGeographicCRS;
+import org.locationtech.jts.geom.*;
+import org.opengis.referencing.crs.CoordinateReferenceSystem;
+import org.opengis.referencing.operation.MathTransform;
+
+/**
+ * @Description TODO 航线拆分工具类
+ * @Author AIX
+ * @Date 2025/6/26 9:48
+ * @Version 1.0
+ */
+public class GeomUtils {
+
+	private static final GeometryFactory geometryFactory = new GeometryFactory();
+
+	/**
+	 * 获取指定点周围指定距离(米)内的多边形区域
+	 *
+	 * @param lon      中心点经度
+	 * @param lat      中心点纬度
+	 * @param distance 距离(米)
+	 * @return 多边形几何对象
+	 */
+	public static Geometry getAreaWithinDistance(double lon, double lat, double distance) throws Exception {
+		// 创建投影CRS(使用UTM投影,适用于小范围距离计算)
+		CoordinateReferenceSystem auto = CRS.decode("AUTO:42001," + lon + "," + lat);
+		// 源CRS(WGS84)
+		CoordinateReferenceSystem sourceCRS = DefaultGeographicCRS.WGS84;
+		// 转换到投影CRS
+		MathTransform toTransform = CRS.findMathTransform(sourceCRS, auto);
+		// 转换回WGS84
+		MathTransform fromTransform = CRS.findMathTransform(auto, sourceCRS);
+
+		// 转换中心点到投影坐标系
+		DirectPosition2D src = new DirectPosition2D(sourceCRS, lon, lat);
+		DirectPosition2D dest = new DirectPosition2D();
+		toTransform.transform(src, dest);
+
+		// 在投影坐标系中创建缓冲区(距离单位为米)
+		Point projPoint = geometryFactory.createPoint(new Coordinate(dest.x, dest.y));
+		Geometry buffer = projPoint.buffer(distance);
+
+		// 转换回WGS84坐标系
+		Geometry transformedBuffer = JTS.transform(buffer, fromTransform);
+
+		return transformedBuffer;
+	}
+
+	/**
+	 * 获取某点周围指定距离(米)的缓冲区
+	 */
+	public static Polygon getBufferAroundPoint(double lon, double lat, double distance) throws Exception {
+		Geometry area = getAreaWithinDistance(lon, lat, distance);
+		return (Polygon) area;
+	}
+
+	/**
+	 * 获取某点周围指定距离(米)的缓冲区,返回WKT字符串格式
+	 *
+	 * @param lon      中心点经度
+	 * @param lat      中心点纬度
+	 * @param distance 距离(米)
+	 * @return WKT格式的多边形字符串,格式:POLYGON((lon1 lat1, lon2 lat2, ...))
+	 */
+	public static String getBufferAroundPointAsString(double lon, double lat, double distance) throws Exception {
+		Polygon polygon = getBufferAroundPoint(lon, lat, distance);
+		return polygon.toText();
+	}
+
+	/**
+	 * 将Polygon对象转换为WKT字符串格式
+	 *
+	 * @param polygon 多边形对象
+	 * @return WKT格式的多边形字符串,格式:POLYGON((lon1 lat1, lon2 lat2, ...))
+	 */
+	public static String polygonToString(Polygon polygon) {
+		return polygon.toText();
+	}
+
+
+}
diff --git a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/controller/GdManageDeviceController.java b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/controller/GdManageDeviceController.java
index ac86bd2..6a6b3a6 100644
--- a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/controller/GdManageDeviceController.java
+++ b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/controller/GdManageDeviceController.java
@@ -16,37 +16,37 @@
  */
 package org.sxkj.gd.workorder.controller;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
-import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import lombok.AllArgsConstructor;
-import javax.validation.Valid;
-
-import org.springblade.core.secure.BladeUser;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.excel.util.ExcelUtil;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
+import org.springblade.core.secure.BladeUser;
 import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.constant.BladeConstant;
+import org.springblade.core.tool.utils.DateUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springframework.web.bind.annotation.*;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.sxkj.gd.common.GenericConverter;
 import org.sxkj.gd.common.IdParam;
 import org.sxkj.gd.workorder.dto.GdManageDeviceDTO;
 import org.sxkj.gd.workorder.entity.GdManageDeviceEntity;
-import org.sxkj.gd.workorder.vo.GdManageDeviceVO;
 import org.sxkj.gd.workorder.excel.GdManageDeviceExcel;
-import org.sxkj.gd.workorder.wrapper.GdManageDeviceWrapper;
 import org.sxkj.gd.workorder.service.IGdManageDeviceService;
-import org.springblade.core.boot.ctrl.BladeController;
-import org.springblade.core.tool.utils.DateUtil;
-import org.springblade.core.excel.util.ExcelUtil;
-import org.springblade.core.tool.constant.BladeConstant;
+import org.sxkj.gd.workorder.vo.GdManageDeviceVO;
+import org.sxkj.gd.workorder.wrapper.GdManageDeviceWrapper;
 import springfox.documentation.annotations.ApiIgnore;
-import java.util.Map;
-import java.util.List;
+
 import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.util.List;
+import java.util.Map;
 
 /**
  * 设备信息 控制器
@@ -104,8 +104,8 @@
 	@PostMapping("/submit")
 	@ApiOperationSupport(order = 6)
 	@ApiOperation(value = "新增或修改", notes = "传入gdManageDevice")
-	public R submit(@Valid @RequestBody GdManageDeviceDTO gdManageDevice) {
-		return R.status(gdManageDeviceService.saveOrUpdate(GdManageDeviceWrapper.build().entityDTO(gdManageDevice)));
+	public R submit(@Valid @RequestBody GdManageDeviceDTO gdManageDevice) throws Exception {
+		return R.status(gdManageDeviceService.saveOrUpdateDevice(GdManageDeviceWrapper.build().entityDTO(gdManageDevice)));
 	}
 
 	/**
diff --git a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/entity/GdManageDeviceEntity.java b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/entity/GdManageDeviceEntity.java
index e300e8b..f65a931 100644
--- a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/entity/GdManageDeviceEntity.java
+++ b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/entity/GdManageDeviceEntity.java
@@ -16,12 +16,14 @@
  */
 package org.sxkj.gd.workorder.entity;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.springblade.core.mp.base.BaseEntity;
+import org.sxkj.gd.config.GeometryTypeHandler;
 
 import java.math.BigDecimal;
 import java.util.Date;
@@ -33,7 +35,8 @@
  * @since 2026-01-14
  */
 @Data
-@TableName("ja_gd_manage_device")
+// @TableName("ja_gd_manage_device")
+@TableName(value = "ja_gd_manage_device",autoResultMap = true)
 @ApiModel(value = "设备信息表", description = "设备信息")
 @EqualsAndHashCode(callSuper = true)
 public class GdManageDeviceEntity extends BaseEntity {
@@ -104,5 +107,11 @@
 	@ApiModelProperty(value = "流量到期时间")
 	private Date trafficExpireTime;
 
+	/**
+	 * 5公里范围面数据
+	 */
+	@ApiModelProperty(value = "5公里范围面数据")
+ 	@TableField(typeHandler = GeometryTypeHandler.class)
+	private String geom;
 
 }
diff --git a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/entity/GdPatrolTaskEntity.java b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/entity/GdPatrolTaskEntity.java
index 67151b1..a7e2324 100644
--- a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/entity/GdPatrolTaskEntity.java
+++ b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/entity/GdPatrolTaskEntity.java
@@ -94,4 +94,10 @@
 	@ApiModelProperty(value = "区域编码")
 	private String areaCode;
 
+	/**
+	 * 拒绝原因(审核拒绝时必填)
+	 */
+	@ApiModelProperty(value = "拒绝原因(审核拒绝时必填)")
+	private String rejectReason;
+
 }
diff --git a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/entity/GdWorkOrderEntity.java b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/entity/GdWorkOrderEntity.java
index 2de25ac..efca848 100644
--- a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/entity/GdWorkOrderEntity.java
+++ b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/entity/GdWorkOrderEntity.java
@@ -114,4 +114,11 @@
 	@TableField("area_code")
 	private String areaCode;
 
+	/**
+	 * 拒绝原因(审核拒绝时必填)
+	 */
+	@ApiModelProperty(value = "拒绝原因(审核拒绝时必填)")
+	@TableField("reject_reason")
+	private String rejectReason;
+
 }
diff --git a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/mapper/GdManageDeviceMapper.xml b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/mapper/GdManageDeviceMapper.xml
index adbcf10..fff0f13 100644
--- a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/mapper/GdManageDeviceMapper.xml
+++ b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/mapper/GdManageDeviceMapper.xml
@@ -65,15 +65,31 @@
     </select>
 
     <select id="selectGdManageDevice" resultType="org.sxkj.gd.workorder.vo.GdManageDeviceVO">
-        select id, device_sn, device_name, nickname, device_payload,longitude,latitude
-        from ja_gd_manage_device
-        where is_deleted = 0
+        select
+        id,
+        device_sn,
+        device_name,
+        nickname,
+        device_payload,
+        longitude,
+        latitude,
+        geom
+        from
+        ja_gd_manage_device
+        where
+        is_deleted = 0
         <if test="deviceIds != null and deviceIds.size() > 0">
             and id in
             <foreach item="item" collection="deviceIds" index="index" open="(" close=")" separator=",">
                 #{item}
             </foreach>
         </if>
+        <if test="devicePayload != null and devicePayload != ''">
+            and device_payload like concat('%',#{devicePayload},'%')
+        </if>
+        <if test="geom != null and geom != ''">
+            and ST_Intersects(geom, ST_GeomFromText(#{geom}))
+        </if>
     </select>
 
 </mapper>
diff --git a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/mapper/GdWorkOrderMapper.xml b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/mapper/GdWorkOrderMapper.xml
index c966671..51d41fd 100644
--- a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/mapper/GdWorkOrderMapper.xml
+++ b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/mapper/GdWorkOrderMapper.xml
@@ -39,6 +39,7 @@
                service_party,
                ST_AsText(geom) geom,
                remark,
+               reject_reason,
                area_code,
                create_user,
                create_dept,
diff --git a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/IGdManageDeviceService.java b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/IGdManageDeviceService.java
index 84cd934..4f3e4f2 100644
--- a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/IGdManageDeviceService.java
+++ b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/IGdManageDeviceService.java
@@ -55,4 +55,11 @@
 	 * @return
 	 */
     List<GdManageDeviceVO> selectGdManageDevice(GdManageDeviceVO gdManageDevice);
+
+	/**
+	 * 新增或修改
+	 * @param gdManageDeviceEntity
+	 * @return
+	 */
+	boolean saveOrUpdateDevice(GdManageDeviceEntity gdManageDeviceEntity) throws Exception;
 }
diff --git a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdManageDeviceServiceImpl.java b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdManageDeviceServiceImpl.java
index f69f051..34e99ff 100644
--- a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdManageDeviceServiceImpl.java
+++ b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdManageDeviceServiceImpl.java
@@ -16,6 +16,7 @@
  */
 package org.sxkj.gd.workorder.service.impl;
 
+import org.sxkj.gd.utils.GeomUtils;
 import org.sxkj.gd.workorder.entity.GdManageDeviceEntity;
 import org.sxkj.gd.workorder.vo.GdManageDeviceVO;
 import org.sxkj.gd.workorder.excel.GdManageDeviceExcel;
@@ -56,4 +57,20 @@
 		return gdManageDeviceList;
 	}
 
+	/**
+	 * 保存或更新设备信息
+	 *
+	 * @param gdManageDeviceEntity
+	 * @return
+	 * @throws Exception
+	 */
+	@Override
+	public boolean saveOrUpdateDevice(GdManageDeviceEntity gdManageDeviceEntity) throws Exception {
+		// 获取设备位置 生成缓冲区
+		if (gdManageDeviceEntity.getLongitude() != null && gdManageDeviceEntity.getLatitude() != null) {
+			String bufferAroundPointAsString = GeomUtils.getBufferAroundPointAsString(gdManageDeviceEntity.getLongitude(), gdManageDeviceEntity.getLatitude(), 5 * 1000);
+			gdManageDeviceEntity.setGeom(bufferAroundPointAsString);
+		}
+		return saveOrUpdate(gdManageDeviceEntity);
+	}
 }
diff --git a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdPatrolTaskServiceImpl.java b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdPatrolTaskServiceImpl.java
index 3259fb6..d6fce0c 100644
--- a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdPatrolTaskServiceImpl.java
+++ b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdPatrolTaskServiceImpl.java
@@ -174,6 +174,7 @@
         task.setTaskStatus(newStatusEnum.getValue());
         task.setUpdateUser(AuthUtil.getUserId());
         task.setUpdateTime(now);
+		task.setRejectReason(auditParam.getRejectReason());
         boolean updateResult = updateById(task);
         if (!updateResult) {
             throw new RuntimeException("更新任务状态失败");
diff --git a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdWorkOrderServiceImpl.java b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdWorkOrderServiceImpl.java
index 253c812..85bb990 100644
--- a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdWorkOrderServiceImpl.java
+++ b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdWorkOrderServiceImpl.java
@@ -211,6 +211,7 @@
 		workOrder.setUpdateUser(AuthUtil.getUserId());
 		workOrder.setGeom(null);
 		workOrder.setUpdateTime(now);
+		workOrder.setRejectReason(statusParam.getRejectReason());
 		boolean updateResult = updateById(workOrder);
 
 		// 5. 保存流转记录
diff --git a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/vo/GdManageDeviceVO.java b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/vo/GdManageDeviceVO.java
index c092427..e1de75f 100644
--- a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/vo/GdManageDeviceVO.java
+++ b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/vo/GdManageDeviceVO.java
@@ -63,5 +63,10 @@
 	@ApiModelProperty(value = "设备ids")
 	private List<Integer> deviceIds;
 
+	@ApiModelProperty(value = "设备位置")
+	private String geom;
+
+	@ApiModelProperty(value = "5公里范围面数据")
+	private String fiveKmArea;
 
 }
diff --git a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/vo/GdPatrolTaskVO.java b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/vo/GdPatrolTaskVO.java
index 73a97b2..929293c 100644
--- a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/vo/GdPatrolTaskVO.java
+++ b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/vo/GdPatrolTaskVO.java
@@ -90,6 +90,13 @@
 	 */
 	@ApiModelProperty(value = "状态:0待签收、1拒绝签收、2已撤回、3待审核、4审核驳回、5审核通过、6待验收、7拒绝验收、8验收通过")
 	private String taskStatus;
+
+	/**
+	 * 拒绝原因(审核拒绝时必填)
+	 */
+	@ApiModelProperty(value = "拒绝原因(审核拒绝时必填)")
+	private String rejectReason;
+
 	/**
 	 * 区域编码
 	 */
diff --git a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/vo/GdWorkOrderVO.java b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/vo/GdWorkOrderVO.java
index 6d2b714..0de8422 100644
--- a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/vo/GdWorkOrderVO.java
+++ b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/vo/GdWorkOrderVO.java
@@ -88,6 +88,12 @@
      */
     @ApiModelProperty(value = "备注")
     private String remark;
+
+	/**
+	 * 拒绝原因(审核拒绝时必填)
+	 */
+	@ApiModelProperty(value = "拒绝原因(审核拒绝时必填)")
+	private String rejectReason;
     /**
      * 区域编码
      */

--
Gitblit v1.9.3