From 5242d687d4edcd6c0f7e10fb82b0e5505dbb3da3 Mon Sep 17 00:00:00 2001
From: jinpengyong <jpy123456>
Date: Fri, 25 Aug 2023 08:24:05 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/wb' into qa

---
 screen-manage/src/main/java/com/moral/api/service/HistorySecondCruiserService.java            |    8 
 screen-manage/src/main/java/com/moral/api/mapper/ManageCoordinateMapper.java                  |    8 
 screen-manage/src/main/java/com/moral/api/service/ManageCoordinateService.java                |   26 +
 screen-manage/src/main/resources/mapper/ManageCoordinateDetailMapper.xml                      |   18 
 screen-manage/src/main/java/com/moral/api/mapper/ManageCoordinateDetailMapper.java            |    7 
 screen-api/src/main/java/com/moral/api/service/impl/ExcelServiceImpl.java                     |    8 
 screen-manage/src/main/java/com/moral/api/controller/TestController.java                      |   49 +
 screen-manage/src/main/java/com/moral/api/service/impl/ManageCoordinateDetailServiceImpl.java |  264 ++++++++++++
 screen-manage/src/main/java/com/moral/api/controller/CruiserController.java                   |   80 +++
 screen-manage/src/main/java/com/moral/api/mapper/HistorySecondCruiserMapper.java              |    6 
 screen-manage/src/main/java/com/moral/api/service/impl/HistorySecondCruiserServiceImpl.java   |   90 ++++
 screen-manage/src/main/java/com/moral/api/service/ManageCoordinateDetailService.java          |   23 +
 screen-manage/src/main/java/com/moral/api/util/RoadUtils.java                                 |  157 +++++++
 screen-manage/src/main/java/com/moral/api/pojo/dto/cruiser/CruiserDTO.java                    |   55 ++
 screen-manage/src/main/java/com/moral/api/controller/ManageCoordinateDetailController.java    |  107 +++++
 screen-manage/src/main/java/com/moral/api/entity/ManageCoordinateDetail.java                  |   66 +++
 screen-manage/src/main/java/com/moral/api/entity/ManageCoordinate.java                        |   57 ++
 screen-manage/src/main/resources/mapper/ManageCoordinateMapper.xml                            |   18 
 screen-manage/src/main/java/com/moral/api/controller/ManageCoordinateController.java          |  101 ++++
 screen-manage/src/main/java/com/moral/api/service/impl/ManageCoordinateServiceImpl.java       |   94 ++++
 screen-manage/src/main/resources/mapper/HistorySecondCruiserMapper.xml                        |    9 
 screen-common/src/main/java/com/moral/constant/RedisConstants.java                            |    3 
 22 files changed, 1,238 insertions(+), 16 deletions(-)

diff --git a/screen-api/src/main/java/com/moral/api/service/impl/ExcelServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/ExcelServiceImpl.java
index 1eb53a5..6d6bce9 100644
--- a/screen-api/src/main/java/com/moral/api/service/impl/ExcelServiceImpl.java
+++ b/screen-api/src/main/java/com/moral/api/service/impl/ExcelServiceImpl.java
@@ -561,7 +561,13 @@
         for (Map<String, Object> map : list) {
             HistoryDaily historyDaily = new HistoryDaily();
             String time = map.remove("time").toString();
-            Date date = DateUtils.dateStringToDate(time);
+            Date date=null;
+            if (time.length()>20){
+                date = DateUtils.dateStringToDate(time);
+            }else {
+                date = DateUtils.getDate(time, DateUtils.yyyy_MM_dd_HH_mm_ss_EN);
+            }
+
             String mac = map.remove("mac").toString();
             String value = JSONObject.toJSONString(map);
             historyDaily.setMac(mac);
diff --git a/screen-common/src/main/java/com/moral/constant/RedisConstants.java b/screen-common/src/main/java/com/moral/constant/RedisConstants.java
index c07f1cf..7a08d47 100644
--- a/screen-common/src/main/java/com/moral/constant/RedisConstants.java
+++ b/screen-common/src/main/java/com/moral/constant/RedisConstants.java
@@ -105,4 +105,7 @@
 
 
     public static final String DATE_CHANG_SHU = "date_changshu";
+
+
+    public static final String DATE_COORDINATE="data_coordinate";
 }
diff --git a/screen-manage/src/main/java/com/moral/api/controller/CruiserController.java b/screen-manage/src/main/java/com/moral/api/controller/CruiserController.java
new file mode 100644
index 0000000..651b23f
--- /dev/null
+++ b/screen-manage/src/main/java/com/moral/api/controller/CruiserController.java
@@ -0,0 +1,80 @@
+package com.moral.api.controller;
+
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.moral.api.entity.ManageCoordinate;
+import com.moral.api.entity.SpecialDevice;
+import com.moral.api.pojo.dto.cruiser.CruiserDTO;
+import com.moral.api.service.HistorySecondCruiserService;
+import com.moral.api.service.ManageCoordinateService;
+import com.moral.constant.ResponseCodeEnum;
+import com.moral.constant.ResultMessage;
+import com.moral.util.WebUtils;
+
+@Slf4j
+@Api(tags = {"���������������������"})
+@RestController
+@RequestMapping("cruiserInfo")
+public class CruiserController {
+
+
+    @Autowired
+    private HistorySecondCruiserService historySecondCruiserService;
+
+
+
+
+    /**
+     *
+     * @return
+     */
+    @GetMapping("selectCruisers")
+    @ApiOperation(value = "���������������������")
+    public ResultMessage selectCruisers() {
+        List<SpecialDevice> specialDevices = historySecondCruiserService.selectCruisers();
+        if (ObjectUtils.isEmpty(specialDevices)){
+            return ResultMessage.fail(ResponseCodeEnum.TARGET_IS_NULL.getCode(),
+                    ResponseCodeEnum.TARGET_IS_NULL.getMsg());
+        }
+        return ResultMessage.ok(specialDevices);
+    }
+
+    @GetMapping("getCruiserInFo")
+    @ApiOperation(value = "���������������", notes = "���������������")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "token", value = "token", required = true, paramType = "header", dataType = "String"),
+            @ApiImplicitParam(name = "mac", value = "������mac", required = true, paramType = "query", dataType = "String"),
+            @ApiImplicitParam(name = "time1", value = "���������2021-08-18", required = true, paramType = "query", dataType = "String"),
+            @ApiImplicitParam(name = "time2", value = "���������2021-08-18", required = true, paramType = "query", dataType = "String")
+    })
+    public ResultMessage getCruiserInFo(HttpServletRequest request){
+        Map<String, Object> params = WebUtils.getParametersStartingWith(request, null);
+        if (!params.containsKey("mac") || !params.containsKey("time1")|| !params.containsKey("time2")) {
+            return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(), ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg());
+        }
+        Map<String, Object> cruiserInFo = historySecondCruiserService.getCruiserInFo(params);
+
+        return ObjectUtils.isEmpty(cruiserInFo)? ResultMessage.ok() : ResultMessage.ok(cruiserInFo);
+    }
+
+
+
+
+}
diff --git a/screen-manage/src/main/java/com/moral/api/controller/ManageCoordinateController.java b/screen-manage/src/main/java/com/moral/api/controller/ManageCoordinateController.java
new file mode 100644
index 0000000..8182b65
--- /dev/null
+++ b/screen-manage/src/main/java/com/moral/api/controller/ManageCoordinateController.java
@@ -0,0 +1,101 @@
+package com.moral.api.controller;
+
+
+import io.swagger.annotations.Api;
+import javafx.scene.input.Mnemonic;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.ibatis.annotations.Update;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.Map;
+
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.moral.api.entity.ManageCoordinate;
+import com.moral.api.service.ManageCoordinateService;
+import com.moral.constant.ResponseCodeEnum;
+import com.moral.constant.ResultMessage;
+
+@Slf4j
+@RestController
+@Api(tags = {"������������������"})
+@RequestMapping("coordinate")
+@CrossOrigin(origins = "*", maxAge = 3600)
+public class ManageCoordinateController {
+
+    @Autowired
+    private ManageCoordinateService manageCoordinateService;
+
+
+
+    /**
+     * ������������������
+     * @param params
+     * @return
+     */
+    @PostMapping("interCruiserRoad")
+    public ResultMessage interCruiserRoad(@RequestBody Map<String,Object> params){
+        if (!params.containsKey("startPoint") || !params.containsKey("endPoint")) {
+            return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(), ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg());
+        }
+        Integer integer = manageCoordinateService.interCoordinate(params);
+        if (integer==null){
+            return ResultMessage.ok("���������������");
+        }
+        return ResultMessage.ok();
+    }
+
+
+    /**
+     * ������������������
+     * @param manageCoordinate
+     * @return
+     */
+    @PostMapping("updateCruiserRoad")
+    public ResultMessage updateCruiserRoad(@RequestBody ManageCoordinate manageCoordinate){
+        if (ObjectUtils.isEmpty(manageCoordinate)){
+            return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(), ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg());
+        }
+        manageCoordinateService.updateCoordinate(manageCoordinate);
+        return ResultMessage.ok();
+    }
+
+    /**
+     * ������������������
+     * @param id
+     * @return
+     */
+    @GetMapping("deleteCruiserRoad")
+    public ResultMessage deleteCruiser(Integer id){
+        if (id==null){
+            return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(),
+                    ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg());
+        }
+        Integer integer = manageCoordinateService.deleteCoordinate(id);
+        if (integer==1){
+          return  ResultMessage.ok("������������");
+        }
+        return ResultMessage.ok();
+    }
+
+    /**
+     * ������������������
+     *
+     * @return
+     */
+    @GetMapping("selectCruiserRoad")
+    public ResultMessage selectCruiser(){
+        List<ManageCoordinate> manageCoordinates = manageCoordinateService.selectCoordinate();
+        if (ObjectUtils.isEmpty(manageCoordinates)){
+            return ResultMessage.fail(ResponseCodeEnum.TARGET_IS_NULL.getCode(),
+                    ResponseCodeEnum.TARGET_IS_NULL.getMsg());
+        }
+        return ResultMessage.ok(manageCoordinates);
+    }
+}
diff --git a/screen-manage/src/main/java/com/moral/api/controller/ManageCoordinateDetailController.java b/screen-manage/src/main/java/com/moral/api/controller/ManageCoordinateDetailController.java
new file mode 100644
index 0000000..972f489
--- /dev/null
+++ b/screen-manage/src/main/java/com/moral/api/controller/ManageCoordinateDetailController.java
@@ -0,0 +1,107 @@
+package com.moral.api.controller;
+
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.Map;
+
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.moral.api.entity.ManageCoordinateDetail;
+import com.moral.api.service.ManageCoordinateDetailService;
+import com.moral.constant.ResponseCodeEnum;
+import com.moral.constant.ResultMessage;
+
+
+@Slf4j
+@RestController
+@Api(tags = {"���������������������"})
+@RequestMapping("coordinateDetail")
+public class ManageCoordinateDetailController {
+
+
+    @Autowired
+    private ManageCoordinateDetailService manageCoordinateDetailService;
+
+    /**
+     * ������������������
+     * @param
+     * @return
+     */
+    @PostMapping("insert")
+    public ResultMessage insert(@RequestBody Map<String,Object> params){
+        if (ObjectUtils.isEmpty(params)){
+            return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(), ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg());
+        }
+        Integer integer = manageCoordinateDetailService.insertCoordinate(params);
+        if (integer==1){
+            return ResultMessage.ok("������������������");
+        }
+        if (integer==2){
+            return ResultMessage.ok("������������������");
+        }
+        return ResultMessage.ok();
+    }
+
+    /**
+     * ������������
+     * @return
+     */
+    @PostMapping("batch")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "token", value = "token", required = true, paramType = "header", dataType = "String"),
+            @ApiImplicitParam(name = "coordinateId", value = "������id", required = true, paramType = "query", dataType = "String"),
+            @ApiImplicitParam(name = "time1", value = "���������2021-08-18", required = true, paramType = "query", dataType = "String"),
+            @ApiImplicitParam(name = "time2", value = "���������2021-08-18", required = true, paramType = "query", dataType = "String")
+    })
+    public ResultMessage  getInserts(@RequestBody Map<String,Object> params){
+        if (!params.containsKey("coordinateId") || !params.containsKey("time1")|| !params.containsKey("time2")) {
+            return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(), ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg());
+        }
+        Integer integer = manageCoordinateDetailService.batchAll(params);
+        if (integer!=200){
+            return ResultMessage.ok("������������");
+        }
+         return ResultMessage.ok();
+    }
+
+    /**
+     * ������������������
+     * @param manageCoordinateDetail
+     * @return
+     */
+    @PostMapping("update")
+    public ResultMessage update(@RequestBody ManageCoordinateDetail manageCoordinateDetail){
+        return null;
+    }
+
+
+
+    /**
+     * ���������������
+     * @return
+     */
+    @PostMapping("select")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "token", value = "token", required = true, paramType = "header", dataType = "String"),
+            @ApiImplicitParam(name = "coordinateId", value = "������id", required = true, paramType = "query", dataType = "String"),
+            @ApiImplicitParam(name = "time1", value = "���������2021-08-18", required = true, paramType = "query", dataType = "String"),
+            @ApiImplicitParam(name = "time2", value = "���������2021-08-18", required = true, paramType = "query", dataType = "String")
+    })
+    public ResultMessage selectAll(@RequestBody Map<String,Object> params){
+        if (!params.containsKey("coordinateId") || !params.containsKey("time1")|| !params.containsKey("time2")) {
+            return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(), ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg());
+        }
+        Map<String,Object> rsMap = manageCoordinateDetailService.selectCoordinate(params);
+        return ResultMessage.ok(rsMap);
+    }
+}
diff --git a/screen-manage/src/main/java/com/moral/api/controller/TestController.java b/screen-manage/src/main/java/com/moral/api/controller/TestController.java
index 6f45837..6222d6d 100644
--- a/screen-manage/src/main/java/com/moral/api/controller/TestController.java
+++ b/screen-manage/src/main/java/com/moral/api/controller/TestController.java
@@ -8,13 +8,15 @@
 import com.moral.api.entity.Test;
 import com.moral.api.entity.UnitConversion;
 import com.moral.api.mapper.SysDictDataMapper;
+import com.moral.api.pojo.dto.account.AccountDTO;
+import com.moral.api.pojo.dto.accountRole.AccountRoleDTO;
+import com.moral.api.pojo.dto.adjust.AdjustDTO;
+import com.moral.api.service.DeviceService;
 import com.moral.api.service.SensorService;
 import com.moral.api.service.SysDictDataService;
 import com.moral.api.service.TestService;
 import com.moral.api.service.impl.SensorServiceImpl;
-import com.moral.api.util.AdjustDataUtils;
 import com.moral.api.util.CacheUtils;
-import com.moral.api.util.CompareFieldUtils;
 import com.moral.constant.Constants;
 import com.moral.constant.KafkaConstants;
 import com.moral.constant.RedisConstants;
@@ -213,8 +215,9 @@
     private SensorService sensorService;
     @Autowired
     SysDictDataMapper sysDictDataMapper;
+
     @Autowired
-    private  AdjustDataUtils adjustDataUtils;
+    private DeviceService deviceService;
 
     @ApiOperation(value = "������������", notes = "������������")
     @ApiImplicitParams({
@@ -222,18 +225,34 @@
     })
     @RequestMapping(value = "getSensor", method = RequestMethod.GET)
     public void getSensor() {
-        HashMap<String, Object> map = new HashMap<>();
-        map.put("time","1692364996898");
-        map.put("mac","p5dnd7a0391986");
-        HashMap<String, Object> map1 = new HashMap<>();
-        HashMap<String, Object> map2 = new HashMap<>();
-        Map<String, Object> adjust = adjustDataUtils.adjust(map, map1, map2, "2");
-        QueryWrapper<Sensor> queryWrapper = new QueryWrapper<>();
-        queryWrapper.select("code").eq("is_delete", Constants.NOT_DELETE);
-        List<Object> list = sensorService.listObjs(queryWrapper);
-        for (Object o : list) {
-            System.out.println(o);
-        }
+        HashMap<String, Object> deviceData = new HashMap<>();
+        deviceData.put("time","1691996716839");
+        deviceData.put("DataTime","20230814150000");
+        deviceData.put("mac","p5dnd7a0245362");
+        deviceData.put("a00e12","11479.2");
+        deviceData.put("a00e13","44.0");
+        deviceData.put("a21005","0.0264");
+        deviceData.put("a21004","20.0");
+        deviceData.put("a21026","30.5");
+        deviceData.put("a01001","38.1");
+        deviceData.put("a05024","279.6");
+        deviceData.put("a01002","54.2");
+        deviceData.put("a01007","2.45");
+        deviceData.put("a01006","805.834");
+        deviceData.put("a01008","102.0");
+        deviceData.put("a34002","4.9");
+        deviceData.put("a34004","4.9");
+        deviceData.put("a00e03","798.5");
+        deviceData.put("a00e04","2.9");
+        deviceData.put("a99054","0.0348");
+        deviceData.put("a31001","0.1");
+        Map<String, Object> map = deviceService.adjustDeviceData(deviceData, "2");
+//        QueryWrapper<Sensor> queryWrapper = new QueryWrapper<>();
+//        queryWrapper.select("code").eq("is_delete", Constants.NOT_DELETE);
+//        List<Object> list = sensorService.listObjs(queryWrapper);
+//        for (Object o : list) {
+//            System.out.println(o);
+//        }
     }
 
 }
diff --git a/screen-manage/src/main/java/com/moral/api/entity/ManageCoordinate.java b/screen-manage/src/main/java/com/moral/api/entity/ManageCoordinate.java
new file mode 100644
index 0000000..976f806
--- /dev/null
+++ b/screen-manage/src/main/java/com/moral/api/entity/ManageCoordinate.java
@@ -0,0 +1,57 @@
+package com.moral.api.entity;
+
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+
+/**
+ * ���������������
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class ManageCoordinate  extends Model<ManageCoordinate> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ������id
+     */
+    @TableId(value = "coordinate_id", type = IdType.AUTO)
+    private  Integer coordinateId;
+    /**
+     * ������������
+     */
+    private  String startPoint;
+    /**
+     * ������������
+     */
+    private  String endPoint;
+    /**
+     *������������
+     */
+    private  Integer isDel;
+    /**
+     * ������������
+     */
+    private Date  createTime;
+    /**
+     * ������������
+     */
+    private Date  updateTime;
+
+    /**
+     * ���������id
+     *
+     */
+    private  Integer updateUserId;
+    /**
+     * ���������������
+     */
+    private  String updayeUserName;
+}
diff --git a/screen-manage/src/main/java/com/moral/api/entity/ManageCoordinateDetail.java b/screen-manage/src/main/java/com/moral/api/entity/ManageCoordinateDetail.java
new file mode 100644
index 0000000..01e15f5
--- /dev/null
+++ b/screen-manage/src/main/java/com/moral/api/entity/ManageCoordinateDetail.java
@@ -0,0 +1,66 @@
+package com.moral.api.entity;
+
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class ManageCoordinateDetail extends Model<ManageCoordinateDetail> {
+
+    private static final long serialVersionUID = 1L;
+
+
+    /**
+     * ���������id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private  Integer id;
+
+    /**
+     * ������id
+     */
+    private  Integer coordinateId;
+    /**
+     * ������
+     */
+    private  Double longitude;
+    /**
+     *������
+     */
+    private  Double latitude;
+    /**
+     * ������������
+     */
+    private Date createTime;
+    /**
+     * ������������
+     */
+    private Date  updateTime;
+
+    /**
+     * ���������id
+     *
+     */
+    private  Integer updateUserId;
+    /**
+     * ���������������
+     */
+    private  String updayeUserName;
+
+
+    private String state;
+
+
+    @TableField(exist = false)
+    private  String code;
+
+
+}
diff --git a/screen-manage/src/main/java/com/moral/api/mapper/HistorySecondCruiserMapper.java b/screen-manage/src/main/java/com/moral/api/mapper/HistorySecondCruiserMapper.java
index 9eaabe9..0cab33e 100644
--- a/screen-manage/src/main/java/com/moral/api/mapper/HistorySecondCruiserMapper.java
+++ b/screen-manage/src/main/java/com/moral/api/mapper/HistorySecondCruiserMapper.java
@@ -1,7 +1,11 @@
 package com.moral.api.mapper;
 
+import java.util.List;
+import java.util.Map;
+
 import com.moral.api.entity.HistorySecondCruiser;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.moral.api.pojo.dto.cruiser.CruiserDTO;
 
 /**
  * <p>
@@ -13,4 +17,6 @@
  */
 public interface HistorySecondCruiserMapper extends BaseMapper<HistorySecondCruiser> {
 
+    List<CruiserDTO> getCruiserInfo(Map<String,Object> params);
+
 }
diff --git a/screen-manage/src/main/java/com/moral/api/mapper/ManageCoordinateDetailMapper.java b/screen-manage/src/main/java/com/moral/api/mapper/ManageCoordinateDetailMapper.java
new file mode 100644
index 0000000..86a4bd0
--- /dev/null
+++ b/screen-manage/src/main/java/com/moral/api/mapper/ManageCoordinateDetailMapper.java
@@ -0,0 +1,7 @@
+package com.moral.api.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.moral.api.entity.ManageCoordinateDetail;
+
+public interface ManageCoordinateDetailMapper extends BaseMapper<ManageCoordinateDetail> {
+}
diff --git a/screen-manage/src/main/java/com/moral/api/mapper/ManageCoordinateMapper.java b/screen-manage/src/main/java/com/moral/api/mapper/ManageCoordinateMapper.java
new file mode 100644
index 0000000..2a83638
--- /dev/null
+++ b/screen-manage/src/main/java/com/moral/api/mapper/ManageCoordinateMapper.java
@@ -0,0 +1,8 @@
+package com.moral.api.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.moral.api.entity.ManageCoordinate;
+
+
+public interface ManageCoordinateMapper extends BaseMapper<ManageCoordinate> {
+}
diff --git a/screen-manage/src/main/java/com/moral/api/pojo/dto/cruiser/CruiserDTO.java b/screen-manage/src/main/java/com/moral/api/pojo/dto/cruiser/CruiserDTO.java
new file mode 100644
index 0000000..3ea7c5d
--- /dev/null
+++ b/screen-manage/src/main/java/com/moral/api/pojo/dto/cruiser/CruiserDTO.java
@@ -0,0 +1,55 @@
+package com.moral.api.pojo.dto.cruiser;
+
+
+import lombok.Data;
+
+import java.util.Objects;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+@Data
+public class CruiserDTO {
+
+    /**
+     * ������������
+     */
+    private String time;
+
+    /**
+     * ������
+     */
+    @JsonProperty(value = "flylat")
+    private Double flyLat;
+
+    /**
+     * ������
+     */
+    @JsonProperty(value = "flylon")
+    private Double flyLon;
+
+
+    private String data;
+
+
+    private String state;
+
+
+    public CruiserDTO() {
+        this.state = "1"; // ������state������������������1
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        CruiserDTO cruiser = (CruiserDTO) o;
+        //���type���color ������������������������������������true
+        return Objects.equals(flyLat, cruiser.flyLat) &&
+                Objects.equals(flyLon, cruiser.flyLon);
+    }
+    @Override
+    public int hashCode() {
+        return Objects.hash(flyLat, flyLon);
+    }
+
+}
diff --git a/screen-manage/src/main/java/com/moral/api/service/HistorySecondCruiserService.java b/screen-manage/src/main/java/com/moral/api/service/HistorySecondCruiserService.java
index f83f252..00c00c1 100644
--- a/screen-manage/src/main/java/com/moral/api/service/HistorySecondCruiserService.java
+++ b/screen-manage/src/main/java/com/moral/api/service/HistorySecondCruiserService.java
@@ -2,7 +2,10 @@
 
 import com.moral.api.entity.HistorySecondCruiser;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.moral.api.entity.SpecialDevice;
+import com.moral.api.pojo.dto.cruiser.CruiserDTO;
 
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -18,4 +21,9 @@
     //���������insert
     void insertHistorySecond(Map<String, Object> data);
 
+    //���������������������
+    List<SpecialDevice> selectCruisers();
+
+    //���������������������
+    Map<String,Object> getCruiserInFo(Map<String, Object> params);
 }
diff --git a/screen-manage/src/main/java/com/moral/api/service/ManageCoordinateDetailService.java b/screen-manage/src/main/java/com/moral/api/service/ManageCoordinateDetailService.java
new file mode 100644
index 0000000..a07dcfd
--- /dev/null
+++ b/screen-manage/src/main/java/com/moral/api/service/ManageCoordinateDetailService.java
@@ -0,0 +1,23 @@
+package com.moral.api.service;
+
+import java.util.List;
+import java.util.Map;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.moral.api.entity.ManageCoordinateDetail;
+
+public interface ManageCoordinateDetailService extends IService<ManageCoordinateDetail> {
+
+
+    Integer insertCoordinate(Map<String,Object> params);
+
+
+
+
+
+    Map<String,Object> selectCoordinate(Map<String,Object> params);
+
+
+    Integer batchAll(Map<String,Object> params);
+
+}
diff --git a/screen-manage/src/main/java/com/moral/api/service/ManageCoordinateService.java b/screen-manage/src/main/java/com/moral/api/service/ManageCoordinateService.java
new file mode 100644
index 0000000..859817b
--- /dev/null
+++ b/screen-manage/src/main/java/com/moral/api/service/ManageCoordinateService.java
@@ -0,0 +1,26 @@
+package com.moral.api.service;
+
+import java.util.List;
+import java.util.Map;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.moral.api.entity.ManageCoordinate;
+
+public interface ManageCoordinateService extends IService<ManageCoordinate> {
+    /**
+     * ������������������
+     * @param params
+     * @return
+     */
+    Integer interCoordinate(Map<String,Object> params);
+
+
+    void updateCoordinate(ManageCoordinate manageCoordinate);
+
+
+    Integer deleteCoordinate(Integer id);
+
+
+    List<ManageCoordinate> selectCoordinate();
+
+}
diff --git a/screen-manage/src/main/java/com/moral/api/service/impl/HistorySecondCruiserServiceImpl.java b/screen-manage/src/main/java/com/moral/api/service/impl/HistorySecondCruiserServiceImpl.java
index e9d6ac2..36574a2 100644
--- a/screen-manage/src/main/java/com/moral/api/service/impl/HistorySecondCruiserServiceImpl.java
+++ b/screen-manage/src/main/java/com/moral/api/service/impl/HistorySecondCruiserServiceImpl.java
@@ -1,24 +1,38 @@
 package com.moral.api.service.impl;
 
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.moral.api.entity.HistorySecondCruiser;
 import com.moral.api.entity.Sensor;
 import com.moral.api.entity.SpecialDevice;
 import com.moral.api.mapper.HistorySecondCruiserMapper;
+import com.moral.api.mapper.SpecialDeviceMapper;
+import com.moral.api.pojo.dto.cruiser.CruiserDTO;
 import com.moral.api.service.DeviceService;
 import com.moral.api.service.HistorySecondCruiserService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.moral.api.service.SpecialDeviceService;
+import com.moral.api.util.RoadUtils;
 import com.moral.constant.Constants;
 import com.moral.constant.RedisConstants;
 import com.moral.util.DateUtils;
+
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.ObjectUtils;
 
+import java.sql.Wrapper;
+import java.util.ArrayList;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.TimeUnit;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
 /**
@@ -29,6 +43,7 @@
  * @author moral
  * @since 2021-09-02
  */
+@Slf4j
 @Service
 public class HistorySecondCruiserServiceImpl extends ServiceImpl<HistorySecondCruiserMapper, HistorySecondCruiser> implements HistorySecondCruiserService {
 
@@ -37,6 +52,8 @@
 
     @Autowired
     private SpecialDeviceService specialDeviceService;
+    @Autowired
+    private SpecialDeviceMapper specialDeviceMapper;
 
     @Autowired
     private RedisTemplate redisTemplate;
@@ -78,4 +95,77 @@
         historySecondCruiser.setBatch(batchTime);
         historySecondCruiserMapper.insert(historySecondCruiser);
     }
+
+    /**
+     * ���������������������������
+     * @return
+     */
+    @Override
+    public List<SpecialDevice> selectCruisers() {
+        QueryWrapper<SpecialDevice> wrapper = new QueryWrapper<>();
+        wrapper.select("name","mac");
+        wrapper.eq("is_delete",Constants.NOT_DELETE);
+        List<SpecialDevice> specialDevices = specialDeviceMapper.selectList(wrapper);
+        return specialDevices;
+    }
+
+    /**
+     * ���������������������
+     * @param params
+     * @return
+     */
+    @Override
+    public Map<String,Object> getCruiserInFo(Map<String, Object> params) {
+        HashMap<String, Object> map = new HashMap<>();
+        String mac = params.get("mac").toString();
+        String time1 = params.get("time1").toString();
+        params.put("dateFormat", "%Y-%m-%d %H:%i:%s");
+        ArrayList<Object> list = new ArrayList<>();
+        List<CruiserDTO> data = (List<CruiserDTO>) redisTemplate.opsForHash().get(RedisConstants.DATE_COORDINATE, mac + time1);
+//        List<CruiserDTO> data = (List<CruiserDTO>) redisTemplate.opsForValue().get(mac + time1);
+        if (ObjectUtils.isEmpty(data)){
+            data = historySecondCruiserMapper.getCruiserInfo(params);
+            data = data.stream().distinct().collect(Collectors.toList());
+            data.removeIf(o->{
+                if (ObjectUtils.isEmpty(o.getFlyLon()) || ObjectUtils.isEmpty(o.getFlyLat())) {
+                    return true;
+                }
+                double lon = o.getFlyLon();
+                double lat = o.getFlyLat();
+                double[] doubles = RoadUtils.transformWGS84ToBD09(lon, lat);
+                Matcher matcher = Pattern.compile("\\d*\\.\\d{8}").matcher(""+doubles[0]);
+                matcher.find();
+                String s = matcher.group();
+                Matcher matcher1 = Pattern.compile("\\d*\\.\\d{8}").matcher(""+doubles[1]);
+                matcher1.find();
+                String s1 = matcher1.group();
+                o.setFlyLon(Double.parseDouble(s));
+                o.setFlyLat(Double.parseDouble(s1));
+                o.setData(lon+"_"+lat);
+//            o.setFlyLon(doubles[0]);
+//            o.setFlyLat(doubles[1]);
+                if (lon < 70 || lon > 150 || lat < 20 || lat > 60) {
+                    return true;
+                }
+                return false;
+            });
+
+            redisTemplate.opsForHash().put(RedisConstants.DATE_COORDINATE,mac+time1,data);
+            //������������������
+            redisTemplate.opsForHash().getOperations().expire(RedisConstants.DATE_COORDINATE,600, TimeUnit.SECONDS);
+
+        }
+
+//        redisTemplate.opsForValue().set(mac+time1,rsCruiser,600, TimeUnit.SECONDS);
+
+        map.put("rsData",data);
+        map.put("data",list);
+        log.info(data.size()+"");
+        log.info(data.size()+"");
+        return map;
+    }
+
+
+
+
 }
diff --git a/screen-manage/src/main/java/com/moral/api/service/impl/ManageCoordinateDetailServiceImpl.java b/screen-manage/src/main/java/com/moral/api/service/impl/ManageCoordinateDetailServiceImpl.java
new file mode 100644
index 0000000..8ce0e1f
--- /dev/null
+++ b/screen-manage/src/main/java/com/moral/api/service/impl/ManageCoordinateDetailServiceImpl.java
@@ -0,0 +1,264 @@
+package com.moral.api.service.impl;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.ObjectUtils;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.TimeUnit;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+import javax.servlet.http.HttpServletRequest;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.moral.api.entity.ManageAccount;
+import com.moral.api.entity.ManageCoordinateDetail;
+import com.moral.api.mapper.HistorySecondCruiserMapper;
+import com.moral.api.mapper.ManageCoordinateDetailMapper;
+import com.moral.api.pojo.dto.cruiser.CruiserDTO;
+import com.moral.api.pojo.redisBean.AccountInfoDTO;
+import com.moral.api.service.ManageCoordinateDetailService;
+import com.moral.api.util.RoadUtils;
+import com.moral.constant.Constants;
+import com.moral.constant.RedisConstants;
+import com.moral.util.DateUtils;
+import com.moral.util.TokenUtils;
+import com.sun.org.apache.regexp.internal.RE;
+
+
+@Service
+@Slf4j
+public class ManageCoordinateDetailServiceImpl extends ServiceImpl<ManageCoordinateDetailMapper, ManageCoordinateDetail> implements ManageCoordinateDetailService {
+
+
+    @Autowired
+    private  ManageCoordinateDetailMapper manageCoordinateDetailMapper;
+
+    @Autowired
+    private HistorySecondCruiserMapper historySecondCruiserMapper;
+
+    @Autowired
+    private RedisTemplate redisTemplate;
+    /**
+     * ���������������
+     * @param params
+     * @return
+     */
+    @Override
+    @Transactional
+    public Integer insertCoordinate(Map<String,Object> params) {
+        HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
+        String token = request.getHeader("token");
+        AccountInfoDTO accountInfoDTO = (AccountInfoDTO) TokenUtils.getUserInfoByToken(token);
+        ManageAccount manageAccount = accountInfoDTO.getAccount();
+        Integer id = manageAccount.getId();
+        String userName = manageAccount.getUserName();
+
+        int coordinateId = Integer.parseInt(params.get("coordinateId").toString());
+        List<Map<String, Object>> data = (List<Map<String, Object>>) params.get("data");
+
+        for (Map<String, Object> datum : data) {
+            ManageCoordinateDetail manageCoordinateDetail = new ManageCoordinateDetail();
+            String code = datum.get("code").toString();
+            String state = datum.get("state").toString();
+
+            if (state.equals("2")){
+                String[] rs = code.split("_");
+                manageCoordinateDetail.setCoordinateId(coordinateId);
+                manageCoordinateDetail.setLongitude(Double.parseDouble(rs[0]));
+                manageCoordinateDetail.setLatitude(Double.parseDouble(rs[1]));
+                manageCoordinateDetail.setState("2");
+                manageCoordinateDetail.setUpdateUserId(id);
+                manageCoordinateDetail.setUpdayeUserName(userName);
+                QueryWrapper<ManageCoordinateDetail> wrapper = new QueryWrapper<>();
+                wrapper.eq("coordinate_id",coordinateId);
+                wrapper.eq("longitude",manageCoordinateDetail.getLongitude());
+                wrapper.eq("latitude",manageCoordinateDetail.getLatitude());
+                Integer integer = manageCoordinateDetailMapper.selectCount(wrapper);
+                if (integer>=1){
+                    return 1;
+                }
+                manageCoordinateDetailMapper.insert(manageCoordinateDetail);
+            }else {
+                Object id1 = datum.get("id");
+                if (ObjectUtils.isEmpty(id1)){
+                    return 2;
+                }
+                manageCoordinateDetailMapper.deleteById(Integer.parseInt(id1.toString()));
+//                    manageCoordinateDetailMapper.delete(wrapper);
+            }
+        }
+        return 200;
+    }
+
+
+    /**
+     * ���������������
+     * @param params
+     * @return
+     */
+    @Override
+    public Map<String,Object> selectCoordinate(Map<String, Object> params) {
+        HashMap<String,Object> rsMap = new HashMap<>();
+        String mac = params.get("mac").toString();
+        String time1 = params.get("time1").toString();
+        ArrayList<ManageCoordinateDetail> rsList1 = new ArrayList<>();
+        params.put("dateFormat", "%Y-%m-%d %H:%i:%s");
+        String coordinateId = params.get("coordinateId").toString();
+        QueryWrapper<ManageCoordinateDetail> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("coordinate_id",coordinateId);
+        List<ManageCoordinateDetail> manageCoordinateDetails = manageCoordinateDetailMapper.selectList(queryWrapper);
+        List<CruiserDTO> cruiserInfo = (List<CruiserDTO>) redisTemplate.opsForHash().get(RedisConstants.DATE_COORDINATE, mac + time1);
+        if (ObjectUtils.isEmpty(cruiserInfo)){
+            cruiserInfo = historySecondCruiserMapper.getCruiserInfo(params);
+            cruiserInfo = cruiserInfo.stream().distinct().collect(Collectors.toList());
+            cruiserInfo.removeIf(o->{
+                    if (ObjectUtils.isEmpty(o.getFlyLon()) || ObjectUtils.isEmpty(o.getFlyLat())) {
+                        return true;
+                    }
+                    double lon = o.getFlyLon();
+                    double lat = o.getFlyLat();
+                    double[] doubles = RoadUtils.transformWGS84ToBD09(lon, lat);
+                    Matcher matcher = Pattern.compile("\\d*\\.\\d{8}").matcher(""+doubles[0]);
+                    matcher.find();
+                    String s = matcher.group();
+                    Matcher matcher1 = Pattern.compile("\\d*\\.\\d{8}").matcher(""+doubles[1]);
+                    matcher1.find();
+                    String s1 = matcher1.group();
+                    o.setFlyLon(Double.parseDouble(s));
+                    o.setFlyLat(Double.parseDouble(s1));
+                    o.setData(lon+"_"+lat);
+//            o.setFlyLon(doubles[0]);
+//            o.setFlyLat(doubles[1]);
+                    if (lon < 70 || lon > 150 || lat < 20 || lat > 60) {
+                        return true;
+                    }
+                    return false;
+                });
+
+                redisTemplate.opsForHash().put(RedisConstants.DATE_COORDINATE,mac+time1,cruiserInfo);
+                //������������������
+                redisTemplate.opsForHash().getOperations().expire(RedisConstants.DATE_COORDINATE,6000, TimeUnit.SECONDS);
+
+        }
+//        List<CruiserDTO> cruiserInfo = historySecondCruiserMapper.getCruiserInfo(params);
+        if (ObjectUtils.isEmpty(manageCoordinateDetails)){
+            rsMap.put("rsData",cruiserInfo);
+            rsMap.put("data",rsList1);
+            return rsMap;
+        }
+        for (int i=cruiserInfo.size()-1;i>0;i--) {
+            CruiserDTO cruiserDTO = cruiserInfo.get(i);
+            String data = cruiserDTO.getData();
+            String[] rs = data.split("_");
+            String flyLon = rs[0];
+            String flyLat = rs[1];
+            for (ManageCoordinateDetail manageCoordinateDetail : manageCoordinateDetails) {
+                String latitude = manageCoordinateDetail.getLatitude().toString();
+                String longitude = manageCoordinateDetail.getLongitude().toString();
+                if (latitude.equals(flyLat) && longitude.equals(flyLon)){
+                    manageCoordinateDetail.setCode(data);
+                    manageCoordinateDetail.setLongitude(cruiserDTO.getFlyLon());
+                    manageCoordinateDetail.setLatitude(cruiserDTO.getFlyLat());
+                    rsList1.add(manageCoordinateDetail);
+                    cruiserInfo.remove(i);
+                    break;
+                }
+            }
+
+        }
+        rsMap.put("rsData",cruiserInfo);
+        rsMap.put("data",rsList1);
+        return rsMap;
+    }
+
+
+    /**
+     * ������������
+     * @param params
+     * @return
+     */
+    @Override
+    @Transactional
+    public Integer batchAll(Map<String, Object> params) {
+        params.put("dateFormat", "%Y-%m-%d %H:%i:%s");
+        int coordinateId = Integer.parseInt(params.get("coordinateId").toString());
+        QueryWrapper<ManageCoordinateDetail> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("coordinate_id",coordinateId);
+        String time1 = params.remove("time1").toString();
+        String time2 = params.remove("time2").toString();
+        long l = DateUtils.compareDateStr(time1, time2);
+        if (l>0){
+            params.put("time1",time1);
+            params.put("time2",time2);
+        }else {
+            params.put("time1",time2);
+            params.put("time2",time1);
+        }
+        int j =0;
+        List<ManageCoordinateDetail> manageCoordinateDetails = manageCoordinateDetailMapper.selectList(queryWrapper);
+        List<CruiserDTO> cruiserInfo = historySecondCruiserMapper.getCruiserInfo(params);
+        if (ObjectUtils.isEmpty(manageCoordinateDetails)){
+            for (CruiserDTO cruiserDTO : cruiserInfo) {
+                Double flyLat = cruiserDTO.getFlyLat();
+                Double flyLon = cruiserDTO.getFlyLon();
+                ManageCoordinateDetail rsDTO = new ManageCoordinateDetail();
+                rsDTO.setLatitude(flyLat);
+                rsDTO.setLongitude(flyLon);
+                rsDTO.setState("2");
+                rsDTO.setCreateTime(new Date());
+                rsDTO.setUpdateTime(new Date());
+                rsDTO.setCoordinateId(coordinateId);
+                manageCoordinateDetailMapper.insert(rsDTO);
+                j++;
+                log.info(j+"");
+            }
+        }else {
+            for (int i=cruiserInfo.size()-1;i>0;i--) {
+                CruiserDTO cruiserDTO = cruiserInfo.get(i);
+                Double flyLat = cruiserDTO.getFlyLat();
+                Double flyLon = cruiserDTO.getFlyLon();
+                for (ManageCoordinateDetail manageCoordinateDetail : manageCoordinateDetails) {
+                    String latitude = manageCoordinateDetail.getLatitude().toString();
+                    String longitude = manageCoordinateDetail.getLongitude().toString();
+                    if (latitude.equals(flyLat+"") && longitude.equals(flyLon+"")){
+                        cruiserInfo.remove(i);
+                        break;
+                    }
+                }
+            }
+            for (CruiserDTO cruiserDTO : cruiserInfo) {
+                Double flyLat = cruiserDTO.getFlyLat();
+                Double flyLon = cruiserDTO.getFlyLon();
+                ManageCoordinateDetail rsDTO = new ManageCoordinateDetail();
+                rsDTO.setLatitude(flyLat);
+                rsDTO.setLongitude(flyLon);
+                rsDTO.setState("2");
+                rsDTO.setCreateTime(new Date());
+                rsDTO.setUpdateTime(new Date());
+                rsDTO.setCoordinateId(coordinateId);
+                manageCoordinateDetailMapper.insert(rsDTO);
+                j++;
+                log.info(j+"");
+            }
+        }
+        return 200;
+    }
+}
diff --git a/screen-manage/src/main/java/com/moral/api/service/impl/ManageCoordinateServiceImpl.java b/screen-manage/src/main/java/com/moral/api/service/impl/ManageCoordinateServiceImpl.java
new file mode 100644
index 0000000..17c4ef3
--- /dev/null
+++ b/screen-manage/src/main/java/com/moral/api/service/impl/ManageCoordinateServiceImpl.java
@@ -0,0 +1,94 @@
+package com.moral.api.service.impl;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.moral.api.entity.ManageCoordinate;
+import com.moral.api.entity.ManageCoordinateDetail;
+import com.moral.api.mapper.ManageCoordinateDetailMapper;
+import com.moral.api.mapper.ManageCoordinateMapper;
+import com.moral.api.service.ManageCoordinateDetailService;
+import com.moral.api.service.ManageCoordinateService;
+
+
+@Service
+public class ManageCoordinateServiceImpl extends ServiceImpl<ManageCoordinateMapper, ManageCoordinate> implements ManageCoordinateService {
+
+    @Autowired
+    private ManageCoordinateMapper manageCoordinateMapper;
+
+    @Autowired
+    private ManageCoordinateDetailMapper manageCoordinateDetailMapper;
+
+    /**
+     * ������������
+     * @param params
+     * @return
+     */
+    @Override
+    public Integer interCoordinate(Map<String, Object> params) {
+        String startPoint = params.get("startPoint").toString();
+        String endPoint = params.get("endPoint").toString();
+        QueryWrapper<ManageCoordinate> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("start_point",startPoint);
+        queryWrapper.eq("end_point",endPoint);
+        Integer integer = manageCoordinateMapper.selectCount(queryWrapper);
+        if (integer>=1){
+            return null;
+        }
+        ManageCoordinate manageCoordinate = new ManageCoordinate();
+        manageCoordinate.setCreateTime(new Date());
+        manageCoordinate.setUpdateTime(new Date());
+        manageCoordinate.setStartPoint(startPoint);
+        manageCoordinate.setEndPoint(endPoint);
+        manageCoordinate.setIsDel(0);
+        int code = manageCoordinateMapper.insert(manageCoordinate);
+        return code;
+    }
+
+    /**
+     * ������������
+     * @param manageCoordinate
+     */
+    @Override
+    public void updateCoordinate(ManageCoordinate manageCoordinate) {
+        manageCoordinate.setUpdateTime(new Date());
+        manageCoordinateMapper.updateById(manageCoordinate);
+    }
+
+    /**
+     * ������������
+     * @param id
+     */
+    @Override
+    public Integer deleteCoordinate(Integer id) {
+        QueryWrapper<ManageCoordinateDetail> wrapper = new QueryWrapper<>();
+        wrapper.eq("coordinate_id",id);
+        Integer integer = manageCoordinateDetailMapper.selectCount(wrapper);
+        if (integer>0){
+            return 1;
+        }
+        manageCoordinateMapper.deleteById(id);
+        return 200;
+
+    }
+
+    /**
+     * ������������������
+     * @return
+     */
+    @Override
+    public List<ManageCoordinate> selectCoordinate() {
+        QueryWrapper<ManageCoordinate> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("is_del",0);
+        List<ManageCoordinate> manageCoordinates = manageCoordinateMapper.selectList(queryWrapper);
+        return manageCoordinates;
+    }
+}
diff --git a/screen-manage/src/main/java/com/moral/api/util/RoadUtils.java b/screen-manage/src/main/java/com/moral/api/util/RoadUtils.java
new file mode 100644
index 0000000..c0cbf62
--- /dev/null
+++ b/screen-manage/src/main/java/com/moral/api/util/RoadUtils.java
@@ -0,0 +1,157 @@
+package com.moral.api.util;
+
+
+/**
+ * ���������������
+ */
+
+public class RoadUtils {
+
+    private static final double x_PI = 3.14159265358979324 * 3000.0 / 180.0;
+    private static final double PI = 3.1415926535897932384626;
+    private static final double a = 6378245.0;
+    private static final double ee = 0.00669342162296594323;
+    /**
+     * WGS84 ������ ��� GCJ02
+     *
+     * @param lng ������
+     * @param lat ������
+     * @return GCJ02 ���������[���������������]
+     */
+    public static double[] transformWGS84ToGCJ02(double lng, double lat) {
+        if (outOfChina(lng, lat)) {
+            return new double[]{lng, lat};
+        } else {
+            double dLat = transformLat(lng - 105.0, lat - 35.0);
+            double dLng = transformLng(lng - 105.0, lat - 35.0);
+            double redLat = lat / 180.0 * PI;
+            double magic = Math.sin(redLat);
+            magic = 1 - ee * magic * magic;
+            double sqrtMagic = Math.sqrt(magic);
+            dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * PI);
+            dLng = (dLng * 180.0) / (a / sqrtMagic * Math.cos(redLat) * PI);
+            double mgLat = lat + dLat;
+            double mgLng = lng + dLng;
+            return new double[]{mgLng, mgLat};
+        }
+    }
+
+    private static double transformLat(double lng, double lat) {
+        double ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng));
+        ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;
+        ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0;
+        ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0;
+        return ret;
+    }
+
+    private static double transformLng(double lng, double lat) {
+        double ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));
+        ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;
+        ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0;
+        ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0;
+        return ret;
+    }
+    /**
+     * ������������������������������
+     *
+     * @param lng ������
+     * @param lat ������
+     * @return ���������������������
+     */
+    public static boolean outOfChina(double lng, double lat) {
+        return (lng < 72.004 || lng > 137.8347) || (lat < 0.8293 || lat > 55.8271);
+    }
+
+    /**
+     * GCJ02 ���������������
+     *
+     * @param lng GCJ02 ������
+     * @param lat GCJ02 ������
+     * @return ���������������[���������������]
+     */
+    public static double[] transformGCJ02ToBD09(double lng, double lat) {
+        double z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * x_PI);
+        double theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * x_PI);
+        double bd_lng = z * Math.cos(theta) + 0.0065;
+        double bd_lat = z * Math.sin(theta) + 0.006;
+        return new double[]{bd_lng, bd_lat};
+    }
+
+
+    /**
+     * WGS84 ��� ������������BD09
+     *
+     * @param lng ������
+     * @param lat ������
+     * @return BD09 ���������[���������������]
+     */
+    public static double[] transformWGS84ToBD09(double lng, double lat) {
+        double[] lngLat = transformWGS84ToGCJ02(lng, lat);
+
+        return transformGCJ02ToBD09(lngLat[0], lngLat[1]);
+    }
+
+
+
+    /**
+     * ���������������BD09������ GCJ02
+     *
+     * @param lng ������������
+     * @param lat ������������
+     * @return GCJ02 ���������[���������������]
+     */
+    public static double[] transformBD09ToGCJ02(double lng, double lat) {
+        double x = lng - 0.0065;
+        double y = lat - 0.006;
+        double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_PI);
+        double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_PI);
+        double gcj_lng = z * Math.cos(theta);
+        double gcj_lat = z * Math.sin(theta);
+        return new double[]{gcj_lng, gcj_lat};
+
+    }
+
+    /**
+     * ������������BD09 ��� WGS84
+     *
+     * @param lng ������
+     * @param lat ������
+     * @return WGS84 ���������[���������������]
+     */
+    public static double[] transformBD09ToWGS84(double lng, double lat) {
+        double[] lngLat = transformBD09ToGCJ02(lng, lat);
+
+        return transformGCJ02ToWGS84(lngLat[0], lngLat[1]);
+    }
+
+
+    /**
+     * GCJ02 ��� WGS84
+     *
+     * @param lng ������
+     * @param lat ������
+     * @return WGS84���������[���������������]
+     */
+    public static double[] transformGCJ02ToWGS84(double lng, double lat) {
+        if (outOfChina(lng, lat)) {
+            return new double[]{lng, lat};
+        } else {
+            double dLat = transformLat(lng - 105.0, lat - 35.0);
+            double dLng = transformLng(lng - 105.0, lat - 35.0);
+            double radLat = lat / 180.0 * PI;
+            double magic = Math.sin(radLat);
+            magic = 1 - ee * magic * magic;
+            double sqrtMagic = Math.sqrt(magic);
+            dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * PI);
+            dLng = (dLng * 180.0) / (a / sqrtMagic * Math.cos(radLat) * PI);
+            double mgLat = lat + dLat;
+            double mgLng = lng + dLng;
+            return new double[]{lng * 2 - mgLng, lat * 2 - mgLat};
+        }
+    }
+
+
+
+
+
+}
diff --git a/screen-manage/src/main/resources/mapper/HistorySecondCruiserMapper.xml b/screen-manage/src/main/resources/mapper/HistorySecondCruiserMapper.xml
index a69ab10..553e496 100644
--- a/screen-manage/src/main/resources/mapper/HistorySecondCruiserMapper.xml
+++ b/screen-manage/src/main/resources/mapper/HistorySecondCruiserMapper.xml
@@ -11,4 +11,13 @@
                     <result column="batch" property="batch" />
         </resultMap>
 
+    <select id="getCruiserInfo" resultType="com.moral.api.pojo.dto.cruiser.CruiserDTO">
+        select  DATE_FORMAT(`time`, #{dateFormat}) AS time,value ->>'$.flylat' as flyLat,value ->>'$.flylon' as flyLon
+        from history_second_cruiser
+        WHERE mac = #{mac}
+          AND `time` <![CDATA[>=]]> #{time1}
+          AND `time` <![CDATA[<=]]> #{time2}
+        order by time
+    </select>
+
 </mapper>
\ No newline at end of file
diff --git a/screen-manage/src/main/resources/mapper/ManageCoordinateDetailMapper.xml b/screen-manage/src/main/resources/mapper/ManageCoordinateDetailMapper.xml
new file mode 100644
index 0000000..c24070a
--- /dev/null
+++ b/screen-manage/src/main/resources/mapper/ManageCoordinateDetailMapper.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.moral.api.mapper.ManageCoordinateDetailMapper">
+
+    <!-- ������������������������ -->
+    <resultMap id="BaseResultMap" type="com.moral.api.entity.ManageCoordinateDetail">
+        <id column="id" property="id" />
+        <result column="coordinate_id" property="coordinateId" />
+        <result column="longitude" property="longitude" />
+        <result column="latitude" property="latitude" />
+        <result column="create_time" property="createTime" />
+        <result column="update_time" property="updateTime" />
+        <result column="update_user_id" property="updateUserId" />
+        <result column="updaye_user_name" property="updayeUserName" />
+    </resultMap>
+
+
+</mapper>
\ No newline at end of file
diff --git a/screen-manage/src/main/resources/mapper/ManageCoordinateMapper.xml b/screen-manage/src/main/resources/mapper/ManageCoordinateMapper.xml
new file mode 100644
index 0000000..61492c7
--- /dev/null
+++ b/screen-manage/src/main/resources/mapper/ManageCoordinateMapper.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.moral.api.mapper.ManageCoordinateMapper">
+
+    <!-- ������������������������ -->
+    <resultMap id="BaseResultMap" type="com.moral.api.entity.ManageCoordinate">
+        <id column="coordinate_id" property="coordinateId" />
+        <result column="start_point" property="startPoint" />
+        <result column="end_point" property="endPoint" />
+        <result column="is_del" property="isDel" />
+        <result column="create_time" property="createTime" />
+        <result column="update_time" property="updateTime" />
+        <result column="update_user_id" property="updateUserId" />
+        <result column="updaye_user_name" property="updayeUserName" />
+    </resultMap>
+
+
+</mapper>
\ No newline at end of file

--
Gitblit v1.8.0