Browse Source

1.根据预警区域判断船舶在港状态
2.增加使用wkt以及时间查询历史轨迹的接口

liangjianf 2 years ago
parent
commit
13db7a6327
16 changed files with 202 additions and 13 deletions
  1. 8 0
      beidou-admin/src/main/java/cn/com/taiji/beidou/web/controller/ship/ShipTrackController.java
  2. 6 0
      beidou-ship/pom.xml
  3. 16 0
      beidou-ship/src/main/java/cn/com/taiji/beidou/ship/track/domain/ShipContainsReq.java
  4. 17 0
      beidou-ship/src/main/java/cn/com/taiji/beidou/ship/track/domain/ShipContainsResult.java
  5. 8 0
      beidou-ship/src/main/java/cn/com/taiji/beidou/ship/track/mapper/ShipTrackMapper.java
  6. 4 0
      beidou-ship/src/main/java/cn/com/taiji/beidou/ship/track/service/ShipTrackService.java
  7. 15 0
      beidou-ship/src/main/java/cn/com/taiji/beidou/ship/track/service/impl/ShipTrackServiceImpl.java
  8. 14 0
      beidou-ship/src/main/resources/mapper/ShipTrackMapper.xml
  9. 2 2
      beidou-track-geomesa/src/main/java/cn/com/taiji/track/dto/BeidouShipLocationDTO.java
  10. 23 0
      beidou-track-geomesa/src/main/java/cn/com/taiji/track/dto/ContainsDTO.java
  11. 25 0
      beidou-track-geomesa/src/main/java/cn/com/taiji/track/entity/WarningAreaEntity.java
  12. 33 0
      beidou-track-geomesa/src/main/java/cn/com/taiji/track/mapper/WarningAreaMapper.java
  13. 0 1
      beidou-track-geomesa/src/main/java/cn/com/taiji/track/schedule/PersistenceSchedule.java
  14. 22 3
      beidou-track-geomesa/src/main/java/cn/com/taiji/track/service/impl/BeidouLocationServiceImpl.java
  15. 1 1
      beidou-track-geomesa/src/main/java/cn/com/taiji/track/service/impl/ShipStatusServiceImpl.java
  16. 8 6
      beidou-track-geomesa/src/main/java/cn/com/taiji/track/service/impl/WarningRecordServiceImpl.java

+ 8 - 0
beidou-admin/src/main/java/cn/com/taiji/beidou/web/controller/ship/ShipTrackController.java

@@ -8,6 +8,7 @@ import cn.com.taiji.beidou.common.core.page.TableDataInfo;
 import cn.com.taiji.beidou.common.utils.StringUtils;
 import cn.com.taiji.beidou.common.utils.file.FileUtils;
 import cn.com.taiji.beidou.common.utils.poi.ExcelUtil;
+import cn.com.taiji.beidou.ship.track.domain.ShipContainsReq;
 import cn.com.taiji.beidou.ship.track.domain.ShipTrackReq;
 import cn.com.taiji.beidou.ship.track.domain.ShipTrackResult;
 import cn.com.taiji.beidou.ship.track.service.ShipTrackService;
@@ -44,6 +45,13 @@ public class ShipTrackController extends BaseController {
 
     }
 
+    @ApiOperation("海域圈选历史查询")
+    @PostMapping("/getContainsDetail")
+    public TableDataInfo getContainsDetail(@RequestBody ShipContainsReq req){
+        return getDataTable(shipTrackService.selectShipContainsResults(req));
+
+    }
+
     @ApiOperation("航速分析")
     @PostMapping("/speedAnalysis")
     public R<List<ShipTrackResult>> speedAnalysis(@RequestBody ShipTrackReq req){

+ 6 - 0
beidou-ship/pom.xml

@@ -37,6 +37,12 @@
             <groupId>org.springframework.kafka</groupId>
             <artifactId>spring-kafka</artifactId>
         </dependency>
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.8.5</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 
 </project>

+ 16 - 0
beidou-ship/src/main/java/cn/com/taiji/beidou/ship/track/domain/ShipContainsReq.java

@@ -0,0 +1,16 @@
+package cn.com.taiji.beidou.ship.track.domain;
+
+import lombok.Data;
+
+/**
+ * @Author CHEN
+ * @Date 2023/1/12 17:55
+ */
+@Data
+public class ShipContainsReq {
+
+    private String wkt;
+    private String startTime;
+    private String endTime;
+
+}

+ 17 - 0
beidou-ship/src/main/java/cn/com/taiji/beidou/ship/track/domain/ShipContainsResult.java

@@ -0,0 +1,17 @@
+package cn.com.taiji.beidou.ship.track.domain;
+
+import cn.com.taiji.beidou.common.annotation.Excel;
+import lombok.Data;
+
+/**
+ * @Author CHEN
+ * @Date 2023/1/12 17:58
+ */
+@Data
+public class ShipContainsResult {
+
+    private String deviceId;
+    private String longitude;
+    private String latitude;
+    private String location;
+}

+ 8 - 0
beidou-ship/src/main/java/cn/com/taiji/beidou/ship/track/mapper/ShipTrackMapper.java

@@ -1,5 +1,7 @@
 package cn.com.taiji.beidou.ship.track.mapper;
 
+import cn.com.taiji.beidou.ship.track.domain.ShipContainsReq;
+import cn.com.taiji.beidou.ship.track.domain.ShipContainsResult;
 import cn.com.taiji.beidou.ship.track.domain.ShipTrackReq;
 import cn.com.taiji.beidou.ship.track.domain.ShipTrackResult;
 import org.apache.ibatis.annotations.Mapper;
@@ -19,4 +21,10 @@ public interface ShipTrackMapper {
      * @return
      */
     List<ShipTrackResult> selectShipTrackDetail(ShipTrackReq shipTrackReq);
+    /**
+     * 海域圈选查询
+     * @param shipTrackReq
+     * @return
+     */
+    List<ShipContainsResult> selectShipContainsResults(ShipContainsReq shipTrackReq);
 }

+ 4 - 0
beidou-ship/src/main/java/cn/com/taiji/beidou/ship/track/service/ShipTrackService.java

@@ -1,5 +1,7 @@
 package cn.com.taiji.beidou.ship.track.service;
 
+import cn.com.taiji.beidou.ship.track.domain.ShipContainsReq;
+import cn.com.taiji.beidou.ship.track.domain.ShipContainsResult;
 import cn.com.taiji.beidou.ship.track.domain.ShipTrackReq;
 import cn.com.taiji.beidou.ship.track.domain.ShipTrackResult;
 
@@ -31,4 +33,6 @@ public interface ShipTrackService {
         String miao = String.format("%.0f", Math.abs(((tp - fen) * 60)));
         return du1 + "°" + Math.abs(fen) + "'" + miao + "\"";
     }
+
+    List<ShipContainsResult> selectShipContainsResults(ShipContainsReq shipContainsReq);
 }

+ 15 - 0
beidou-ship/src/main/java/cn/com/taiji/beidou/ship/track/service/impl/ShipTrackServiceImpl.java

@@ -1,9 +1,13 @@
 package cn.com.taiji.beidou.ship.track.service.impl;
 
+import cn.com.taiji.beidou.common.utils.DateUtils;
+import cn.com.taiji.beidou.ship.track.domain.ShipContainsReq;
+import cn.com.taiji.beidou.ship.track.domain.ShipContainsResult;
 import cn.com.taiji.beidou.ship.track.domain.ShipTrackReq;
 import cn.com.taiji.beidou.ship.track.domain.ShipTrackResult;
 import cn.com.taiji.beidou.ship.track.mapper.ShipTrackMapper;
 import cn.com.taiji.beidou.ship.track.service.ShipTrackService;
+import cn.hutool.core.util.StrUtil;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -33,4 +37,15 @@ public class ShipTrackServiceImpl implements ShipTrackService {
 
         return results;
     }
+    @Override
+    public List<ShipContainsResult> selectShipContainsResults(ShipContainsReq shipContainsReq) {
+        shipContainsReq.setEndTime(DateUtils.dateTimeNow("YYYY-MM-dd HH-mm-ss"));
+        List<ShipContainsResult> results = shipTrackMapper.selectShipContainsResults(shipContainsReq);
+        for (ShipContainsResult shipTrackResult : results) {
+            String location = StrUtil.format("POINT ({} {})", shipTrackResult.getLongitude(),shipTrackResult.getLatitude());
+            shipTrackResult.setLocation(location);
+        }
+        return results;
+    }
+
 }

+ 14 - 0
beidou-ship/src/main/resources/mapper/ShipTrackMapper.xml

@@ -14,6 +14,12 @@
         <result property="speed" column="speed"/>
     </resultMap>
 
+    <resultMap type="ShipContainsResult" id="ShipContainsResult">
+        <result property="deviceId" column="device_id"/>
+        <result property="longitude" column="longitude"/>
+        <result property="latitude" column="latitude"/>
+    </resultMap>
+
     <select id="selectShipTrackDetail" parameterType="shipTrackReq" resultMap="shipTrackResult">
         select ROW_NUMBER() over(ORDER BY track.location_time) as serial,device_id,track.location_time as sendTime,longitude,latitude,direction,speed from ax_beidou_track track
         where track.device_id = #{deviceId}
@@ -21,4 +27,12 @@
         <if test="startTime != null and startTime != ''">and track.location_time &gt; #{startTime}</if>
         order by track.location_time DESC
     </select>
+    <select id="selectShipContainsResults" parameterType="ShipContainsReq" resultMap="ShipContainsResult">
+        SELECT device_id,longitude,latitude FROM (
+        SELECT  device_id,longitude,latitude,
+                ROW_NUMBER() OVER(PARTITION BY device_id ORDER BY location_time desc) AS SCORE_ROWNUMBER
+        from ax_beidou_track where location_time BETWEEN #{startTime} and #{endTime}
+        and ST_Contains(st_geometryfromtext(#{wkt}),st_point(longitude,latitude))=1
+        ) T1 WHERE T1.SCORE_ROWNUMBER = 1
+    </select>
 </mapper>

+ 2 - 2
beidou-track-geomesa/src/main/java/cn/com/taiji/track/dto/BeidouShipLocationDTO.java

@@ -92,7 +92,7 @@ public class BeidouShipLocationDTO extends IGeomesaTrackDTO implements Serializa
             attributes.append("longitude:String,");
             attributes.append("latitude:String,");
             attributes.append("direction:String,");
-            attributes.append("speed:String,");
+            attributes.append("speed:Double,");
             attributes.append("kwh:String,");
             attributes.append("shipName:String,");
             attributes.append("isOnline:String,");
@@ -121,7 +121,7 @@ public class BeidouShipLocationDTO extends IGeomesaTrackDTO implements Serializa
         builder.set("longitude", longitude);
         builder.set("latitude", latitude);
         builder.set("direction", direction);
-        builder.set("speed", speed);
+        builder.set("speed", Double.valueOf(speed));
         builder.set("kwh", kwh);
         builder.set("shipName", shipName);
         builder.set("isOnline", isOnline);

+ 23 - 0
beidou-track-geomesa/src/main/java/cn/com/taiji/track/dto/ContainsDTO.java

@@ -0,0 +1,23 @@
+package cn.com.taiji.track.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.geotools.feature.simple.SimpleFeatureBuilder;
+import org.geotools.util.factory.Hints;
+import org.opengis.feature.simple.SimpleFeature;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * @author kok20
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class ContainsDTO {
+    String name;
+    String ct;
+}

+ 25 - 0
beidou-track-geomesa/src/main/java/cn/com/taiji/track/entity/WarningAreaEntity.java

@@ -0,0 +1,25 @@
+package cn.com.taiji.track.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @Author CHEN
+ * @Date 2022/11/9 18:00
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@TableName("ax_beidou_warning_area")
+public class WarningAreaEntity {
+    private String id;
+    private String name;
+    private String location;
+    private String delFlag;
+    private String createBy;
+    private String createTime;
+    private String updateBy;
+    private String updateTime;
+}

+ 33 - 0
beidou-track-geomesa/src/main/java/cn/com/taiji/track/mapper/WarningAreaMapper.java

@@ -0,0 +1,33 @@
+package cn.com.taiji.track.mapper;
+
+import cn.com.taiji.track.dto.ContainsDTO;
+import cn.com.taiji.track.entity.WarningAreaEntity;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * @author kok20
+ */
+@Mapper
+public interface WarningAreaMapper extends BaseMapper<WarningAreaEntity> {
+    @Select("SELECT * FROM\n" +
+            "(\n" +
+            "SELECT\n" +
+            "`name`,\n" +
+            "ST_Contains ( ST_Polygon ( location ), ST_Point(${longitude},${latitude})) ct \n" +
+            "FROM\n" +
+            "`ax_beidou_warning_area` \n" +
+            "WHERE\n" +
+            "location is not null  \n" +
+            ") AS a \n" +
+            "WHERE\n" +
+            "a.ct = 1")
+    List<ContainsDTO> containsPoint(@Param("longitude") String longitude, @Param("latitude") String latitude);
+}
+

+ 0 - 1
beidou-track-geomesa/src/main/java/cn/com/taiji/track/schedule/PersistenceSchedule.java

@@ -37,7 +37,6 @@ public class PersistenceSchedule {
     }
     @Scheduled(cron = "*/10 * * * * ?")
     private void cacheStatusToMySql() {
-//        shipStatusService.cacheToMySql();
         shipStatusService.onlineCacheToMySql();
     }
     @Scheduled(cron = "*/10 * * * * ?")

+ 22 - 3
beidou-track-geomesa/src/main/java/cn/com/taiji/track/service/impl/BeidouLocationServiceImpl.java

@@ -1,17 +1,19 @@
 package cn.com.taiji.track.service.impl;
 
+import cn.com.taiji.track.constants.WarningCodeConstants;
 import cn.com.taiji.track.dto.BeidouShipLocationDTO;
+import cn.com.taiji.track.dto.ContainsDTO;
 import cn.com.taiji.track.dto.IGeomesaTrackDTO;
 import cn.com.taiji.track.entity.BeidouLocationEntity;
 import cn.com.taiji.track.entity.BeidouShipArchives;
 import cn.com.taiji.track.entity.BeidouTrackEntity;
 import cn.com.taiji.track.mapper.BeidouLocationMapper;
 import cn.com.taiji.track.mapper.BeidouShipArchivesMapper;
+import cn.com.taiji.track.mapper.WarningAreaMapper;
 import cn.com.taiji.track.service.IBeidouLocationService;
 import cn.com.taiji.track.service.IShipStatusService;
 import cn.com.taiji.track.utils.LatLngUtil;
 import cn.hutool.core.util.StrUtil;
-import com.alibaba.druid.util.StringUtils;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -33,6 +35,7 @@ import org.opengis.filter.Filter;
 import org.opengis.filter.FilterFactory2;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
 
 import java.math.BigDecimal;
 import java.util.*;
@@ -48,7 +51,7 @@ public class BeidouLocationServiceImpl extends ServiceImpl<BeidouLocationMapper,
     @Autowired
     protected IShipStatusService shipStatusService;
 
-    private Map<String,BeidouShipLocationDTO> locationMaps= new HashMap<>();
+    private Map<String,String> locationMaps= new HashMap<>();
     private Vector<BeidouLocationEntity> locationEntities= new Vector<>();
 
     @Autowired
@@ -59,6 +62,9 @@ public class BeidouLocationServiceImpl extends ServiceImpl<BeidouLocationMapper,
     private IGeomesaTrackDTO geomesaLocationDTO;
     @Autowired
     private BeidouShipArchivesMapper shipArchivesMapper;
+    @Autowired
+    private WarningAreaMapper warningAreaMapper;
+
     @Override
     public void beidouDynamicShipToCache(List<ConsumerRecord<?, ?>> records){
         try {
@@ -89,7 +95,7 @@ public class BeidouLocationServiceImpl extends ServiceImpl<BeidouLocationMapper,
             List<BeidouLocationEntity> saveList = new ArrayList<>(locationEntities);
             locationEntities.clear();
             for(BeidouLocationEntity e : saveList){
-                if(StringUtils.isEmpty(e.getShipName())){
+                if(!StringUtils.hasText(e.getShipName())){
                     QueryWrapper<BeidouShipArchives> wrapper = new QueryWrapper();
                     wrapper.eq("devide_no",e.getDeviceId());
                     BeidouShipArchives shipArchives = shipArchivesMapper.selectOne(wrapper);
@@ -97,6 +103,19 @@ public class BeidouLocationServiceImpl extends ServiceImpl<BeidouLocationMapper,
                         e.setShipName(shipArchives.getShipId());
                     }
                 }
+                String location = e.getLocation();
+                if (StringUtils.hasText(location) && !location.equals(locationMaps.get(e.getDeviceId()))) {
+//                if (StringUtils.hasText(location)) {
+                    String longitude = location.substring(location.indexOf("(")+1,location.indexOf(" ",location.indexOf("(")));
+                    String latitude = location.substring(location.indexOf(" ",location.indexOf("("))+1,location.indexOf(")"));
+                    List<ContainsDTO> result = warningAreaMapper.containsPoint(longitude,latitude);
+                    if(result.size()>0){
+                        shipStatusService.pushinportDeviceId(e.getDeviceId(), WarningCodeConstants.INPORT_WARNING);
+                    }else{
+                        shipStatusService.pushinportDeviceId(e.getDeviceId(),WarningCodeConstants.OUTPROT_WARNING);
+                    }
+                    locationMaps.put(e.getDeviceId(),e.getLocation());
+                }
             }
             saveBatch(saveList);
             log.info("位置数据写入数据库完成!耗时 {} 毫秒, 合计保存 {} 条记录", (new Date()).getTime() - begin.getTime(), saveList.size());

+ 1 - 1
beidou-track-geomesa/src/main/java/cn/com/taiji/track/service/impl/ShipStatusServiceImpl.java

@@ -144,7 +144,7 @@ public class ShipStatusServiceImpl extends ServiceImpl<ShipStatusMapper, ShipSta
         }
         if(!saveList.isEmpty()){
             saveBatch(saveList);
-            log.info("船舶状态写入数据库完成!耗时 {} 毫秒, 合计保存 {} 条记录", (new Date()).getTime() - begin.getTime(), saveList.size());
+            log.info("在线状态写入数据库完成!耗时 {} 毫秒, 合计保存 {} 条记录", (new Date()).getTime() - begin.getTime(), saveList.size());
         }
     }
 }

+ 8 - 6
beidou-track-geomesa/src/main/java/cn/com/taiji/track/service/impl/WarningRecordServiceImpl.java

@@ -3,6 +3,7 @@ package cn.com.taiji.track.service.impl;
 import cn.com.taiji.track.constants.WarningCodeConstants;
 import cn.com.taiji.track.entity.BeidouTrackEntity;
 import cn.com.taiji.track.entity.WarningRecordEntity;
+import cn.com.taiji.track.mapper.WarningAreaMapper;
 import cn.com.taiji.track.mapper.WarningRecordMapper;
 import cn.com.taiji.track.service.IShipStatusService;
 import cn.com.taiji.track.service.IWarningRecordService;
@@ -47,12 +48,13 @@ public class WarningRecordServiceImpl extends ServiceImpl<WarningRecordMapper, W
                     if (WarningCodeConstants.ANCHOR_WARNING.equals(entity.getModelCode())) {
                         shipStatusService.pushAnchorDeviceId(entity.getDeviceId(),entity.getStart());
                     }
-                    if (WarningCodeConstants.INPORT_WARNING.equals(entity.getModelCode())) {
-                        shipStatusService.pushinportDeviceId(entity.getDeviceId(),WarningCodeConstants.INPORT_WARNING);
-                    }
-                    if (WarningCodeConstants.OUTPROT_WARNING.equals(entity.getModelCode())) {
-                        shipStatusService.pushinportDeviceId(entity.getDeviceId(),WarningCodeConstants.OUTPROT_WARNING);
-                    }
+                    //不再使用预警判断在港状态
+//                    if (WarningCodeConstants.INPORT_WARNING.equals(entity.getModelCode())) {
+//                        shipStatusService.pushinportDeviceId(entity.getDeviceId(),WarningCodeConstants.INPORT_WARNING);
+//                    }
+//                    if (WarningCodeConstants.OUTPROT_WARNING.equals(entity.getModelCode())) {
+//                        shipStatusService.pushinportDeviceId(entity.getDeviceId(),WarningCodeConstants.OUTPROT_WARNING);
+//                    }
                 }
             }
         } catch (Exception e) {