From 173428adf09179860a3cb1a88f46378fd98473b2 Mon Sep 17 00:00:00 2001
From: Pu Zhibing <393733352@qq.com>
Date: 星期五, 28 二月 2025 18:49:35 +0800
Subject: [PATCH] 开发模型3业务逻辑

---
 guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TaskDetailVehicles.java                   |   10 
 guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/PatrolTaskServiceImpl.java         |  336 ++++++++++++++++++++++++-----
 guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IPatrolTaskService.java                 |   11 +
 guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/IconMapper.java                             |   11 +
 guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/videoGateway/VideoGateway.java             |   43 +++
 guns-admin/src/main/java/com/stylefeng/guns/modular/api/ApiController.java                                 |    7 
 guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Icon.java                                 |   31 ++
 guns-admin/pom.xml                                                                                         |    8 
 guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TaskDetailServiceImpl.java         |   33 ++
 guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/vo/PictureDetails.java                    |    2 
 guns-admin/src/main/java/com/stylefeng/guns/modular/api/PatrolTaskController.java                          |   45 ++-
 guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TaskDetailMapper.xml                |    1 
 guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IIconService.java                       |   11 +
 guns-admin/src/main/java/com/stylefeng/guns/modular/system/filter/WebFilterUtil.java                       |   10 
 guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/IconServiceImpl.java               |   15 +
 guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/IconMapper.xml                      |    5 
 guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/vo/TaskRecordList.java                    |    2 
 guns-admin/src/main/resources/application.yml                                                              |   38 ++-
 guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TaskDetailVehiclesChannelMapper.xml |    4 
 19 files changed, 519 insertions(+), 104 deletions(-)

diff --git a/guns-admin/pom.xml b/guns-admin/pom.xml
index 21533c8..839ae48 100644
--- a/guns-admin/pom.xml
+++ b/guns-admin/pom.xml
@@ -131,10 +131,10 @@
             <!--<groupId>org.springframework.session</groupId>-->
             <!--<artifactId>spring-session-data-redis</artifactId>-->
         <!--</dependency>-->
-        <!--<dependency>-->
-            <!--<groupId>org.springframework.boot</groupId>-->
-            <!--<artifactId>spring-boot-starter-data-redis</artifactId>-->
-        <!--</dependency>-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+        </dependency>
 
         <dependency>
             <groupId>com.github.penggle</groupId>
diff --git a/guns-admin/src/main/java/com/stylefeng/guns/modular/api/ApiController.java b/guns-admin/src/main/java/com/stylefeng/guns/modular/api/ApiController.java
index ed5a2ec..4f3f610 100644
--- a/guns-admin/src/main/java/com/stylefeng/guns/modular/api/ApiController.java
+++ b/guns-admin/src/main/java/com/stylefeng/guns/modular/api/ApiController.java
@@ -77,6 +77,11 @@
     public Object test() {
         return SUCCESS_TIP;
     }
-
+    
+    
+    public static void main(String[] args) {
+        String s = ShiroKit.md5("96e79218965eb72c92a549dd5a330112", "8pgby");
+        System.err.println(s);
+    }
 }
 
diff --git a/guns-admin/src/main/java/com/stylefeng/guns/modular/api/PatrolTaskController.java b/guns-admin/src/main/java/com/stylefeng/guns/modular/api/PatrolTaskController.java
index e2aaf84..cc99c2d 100644
--- a/guns-admin/src/main/java/com/stylefeng/guns/modular/api/PatrolTaskController.java
+++ b/guns-admin/src/main/java/com/stylefeng/guns/modular/api/PatrolTaskController.java
@@ -30,7 +30,7 @@
  * @Date 2024/12/17 20:18
  */
 @RestController
-@RequestMapping("/api/patrolTask")
+@RequestMapping("")
 public class PatrolTaskController extends BaseController {
 
 	@Resource
@@ -41,7 +41,7 @@
 	
 	
 	
-	@GetMapping("/getTaskDetailList")
+	@GetMapping("/api/patrolTask/getTaskDetailList")
 	@ApiOperation(value = "获取任务列表数据", tags = {"任务管理"})
 	public PageInfoBT<TaskDetailList> getTaskDetailList(TaskDetailListVo vo){
 		Page<TaskDetailList> pageInfo = new Page(vo.getLimit(), vo.getOffset());
@@ -55,7 +55,7 @@
 	
 	
 	
-	@DeleteMapping("/delTaskDetail")
+	@DeleteMapping("/api/patrolTask/delTaskDetail")
 	@ApiOperation(value = "删除任务", tags = {"任务管理"})
 	public ResultUtil delTaskDetail(String ids){
 		List<String> id = Arrays.asList(ids.split(","));
@@ -65,7 +65,7 @@
 	
 	
 	
-	@PostMapping("/addPatrolTask")
+	@PostMapping("/api/patrolTask/addPatrolTask")
 	@ApiOperation(value = "添加巡查任务", tags = {"任务管理"})
 	public ResultUtil addPatrolTask(@RequestBody PatrolTaskVo vo, HttpServletRequest request){
 		String token = request.getHeader(JwtConstants.AUTH_HEADER);
@@ -77,7 +77,7 @@
 		return ResultUtil.success();
 	}
 	
-	@GetMapping("/getImageModel")
+	@GetMapping("/api/patrolTask/getImageModel")
 	@ApiOperation(value = "获取图片模型", tags = {"任务管理"})
 	public ResultUtil<List<Map<String, Object>>> getImageModel(){
 		ImageModelEnum[] values = ImageModelEnum.values();
@@ -95,7 +95,7 @@
 	
 	
 	
-	@GetMapping("/getVideoChannel")
+	@GetMapping("/api/patrolTask/getVideoChannel")
 	@ApiOperation(value = "获取视频通道", tags = {"任务管理"})
 	public ResultUtil<List<Map<String, Object>>> getVideoChannel(){
 		VideoChannelEnum[] values = VideoChannelEnum.values();
@@ -112,7 +112,7 @@
 	}
 	
 	
-	@GetMapping("/getVehicleList")
+	@GetMapping("/api/patrolTask/getVehicleList")
 	@ApiOperation(value = "获取车辆列表", tags = {"任务管理"})
 	public ResultUtil<List<Vehicle>> getVehicleList(Integer year){
 		List<Vehicle> vehicleList = VideoGateway.getVehicleList(null, null, null, 0);
@@ -132,7 +132,7 @@
 	
 	
 	
-	@GetMapping("/getShipList")
+	@GetMapping("/api/patrolTask/getShipList")
 	@ApiOperation(value = "获取船舶列表", tags = {"任务管理"})
 	public ResultUtil<List<Ship>> getShipList(Integer year){
 		List<Ship> shipList = VideoGateway.getShipList(null, null, null, 0);
@@ -152,7 +152,7 @@
 	
 	
 	
-	@GetMapping("/getTaskRecordList")
+	@GetMapping("/api/patrolTask/getTaskRecordList")
 	@ApiOperation(value = "获取任务记录列表", tags = {"任务记录"})
 	public PageInfoBT<TaskRecordList> getTaskRecordList(TaskRecordListVo vo){
 		Page<TaskRecordList> pageInfo = new Page(vo.getLimit(), vo.getOffset());
@@ -166,14 +166,14 @@
 	
 	
 	
-	@GetMapping("/getTaskRecordInfo")
+	@GetMapping("/api/patrolTask/getTaskRecordInfo")
 	@ApiOperation(value = "获取任务记录详情", tags = {"任务记录"})
 	public ResultUtil<TaskRecordInfo> getTaskRecordInfo(Integer id){
 		TaskRecordInfo taskRecordInfo = taskDetailService.getTaskRecordInfo(id);
 		return ResultUtil.success(taskRecordInfo);
 	}
 	
-	@PostMapping("/getPictureDetailsVehicle")
+	@PostMapping("/api/patrolTask/getPictureDetailsVehicle")
 	@ApiOperation(value = "获取任务记录详情中的车船数据", tags = {"任务记录"})
 	public ResultUtil<PictureDetailsVehicle> getPictureDetailsVehicle(@RequestBody PictureDetailsVo vo){
 		PictureDetailsVehicle pictureDetailsVehicle = taskDetailService.getPictureDetailsVehicle(vo);
@@ -182,7 +182,7 @@
 	
 	
 	
-	@PostMapping("/getPictureDetails")
+	@PostMapping("/api/patrolTask/getPictureDetails")
 	@ApiOperation(value = "获取任务记录详情中的视频通道数据", tags = {"任务记录"})
 	public PageInfoBT<PictureDetails> getPictureDetails(@RequestBody PictureDetailsVo vo){
 		Page<PictureDetails> pageInfo = new Page(vo.getLimit(), vo.getOffset());
@@ -196,7 +196,7 @@
 	
 	
 	
-	@PostMapping("/manualAudit")
+	@PostMapping("/api/patrolTask/manualAudit")
 	@ApiOperation(value = "人工审核视频通道数据", tags = {"任务记录"})
 	public ResultUtil manualAudit(@RequestBody ManualAuditVo vo, HttpServletRequest request){
 		String token = request.getHeader(JwtConstants.AUTH_HEADER);
@@ -209,7 +209,7 @@
 	
 	
 	
-	@GetMapping("/downloadTaskRecord")
+	@GetMapping("/api/patrolTask/downloadTaskRecord")
 	@ApiOperation(value = "下载任务记录数据", tags = {"任务记录"})
 	@ApiImplicitParams({
 			@ApiImplicitParam(value = "列表数据id,多个逗号分隔", name = "ids", dataType = "String"),
@@ -224,4 +224,21 @@
 		}
 		taskDetailService.downloadTaskRecord(id, code, status, response);
 	}
+	
+	
+	@PutMapping("/base/patrolTask/vehicleSpeed")
+	@ApiOperation(value = "变更车辆状态", tags = {"互联互通接口"})
+	@ApiImplicitParams({
+			@ApiImplicitParam(value = "车牌号", name = "vehicleNum", dataType = "String", required = true),
+			@ApiImplicitParam(value = "状态(1=行驶中,2=已停止)", name = "vehicleStatus", dataType = "int", required = true),
+			@ApiImplicitParam(value = "车辆类型(1=车,2=船)", name = "vehicleType", dataType = "int", required = true),
+			@ApiImplicitParam(value = "通信号", name = "communicationNum", dataType = "String", required = true),
+			@ApiImplicitParam(value = "gps协议", name = "vehicleGpsProtocol", dataType = "String", required = true),
+			@ApiImplicitParam(value = "纬度", name = "latitude", dataType = "double", required = true),
+			@ApiImplicitParam(value = "经度", name = "longitude", dataType = "double", required = true),
+	})
+	public ResultUtil vehicleSpeed(String vehicleNum, Integer vehicleStatus, Integer vehicleType, String communicationNum, String vehicleGpsProtocol, Double latitude, Double longitude){
+		patrolTaskService.vehicleSpeed(vehicleNum, vehicleStatus, vehicleType, communicationNum, vehicleGpsProtocol, latitude, longitude);
+		return ResultUtil.success();
+	}
 }
diff --git a/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/IconMapper.java b/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/IconMapper.java
new file mode 100644
index 0000000..d341776
--- /dev/null
+++ b/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/IconMapper.java
@@ -0,0 +1,11 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.Icon;
+
+/**
+ * @author zhibing.pu
+ * @Date 2025/2/19 14:15
+ */
+public interface IconMapper extends BaseMapper<Icon> {
+}
diff --git a/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/IconMapper.xml b/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/IconMapper.xml
new file mode 100644
index 0000000..271a093
--- /dev/null
+++ b/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/IconMapper.xml
@@ -0,0 +1,5 @@
+<?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.stylefeng.guns.modular.system.dao.IconMapper">
+
+</mapper>
\ No newline at end of file
diff --git a/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TaskDetailMapper.xml b/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TaskDetailMapper.xml
index a04916c..b2bcfee 100644
--- a/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TaskDetailMapper.xml
+++ b/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TaskDetailMapper.xml
@@ -35,6 +35,7 @@
 			ifnull(e.num, 0) as offlineNum,
 			ifnull(f.num, 0) as normalNum,
 			ifnull(g.num, 0) as abnormalNum,
+			ROUND(ifnull(((ifnull(e.num, 0) + ifnull(f.num, 0) + ifnull(g.num, 0)) / ifnull(c.num, 0) * 100), 0), 2) as schedule,
 			if(h.num > 0, 0, 1) as authStatus
 		from t_task_detail a
      	left join t_patrol_task b on (a.patrol_task_id = b.id)
diff --git a/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TaskDetailVehiclesChannelMapper.xml b/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TaskDetailVehiclesChannelMapper.xml
index 485f39c..1409160 100644
--- a/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TaskDetailVehiclesChannelMapper.xml
+++ b/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TaskDetailVehiclesChannelMapper.xml
@@ -13,9 +13,11 @@
 			DATE_FORMAT(a.sys_create_time, '%Y-%m-%d %H:%i:%s') as sysCreateTime,
 			a.artificial_status as artificialStatus,
 			DATE_FORMAT(a.artificial_create_time, '%Y-%m-%d %H:%i:%s') as artificialCreateTime,
-			b.`name` as artificialUserName
+			b.`name` as artificialUserName,
+			c.status as status
 		from t_task_detail_vehicles_channel a
 		left join sys_user b on (a.artificial_user_id = b.id)
+		left join t_task_detail_vehicles c on (a.task_detail_vehicles_id = c.id)
 		<where>
 			<if test="null != taskDetailVehiclesIdList and taskDetailVehiclesIdList.size() > 0">
 				and a.task_detail_vehicles_id in
diff --git a/guns-admin/src/main/java/com/stylefeng/guns/modular/system/filter/WebFilterUtil.java b/guns-admin/src/main/java/com/stylefeng/guns/modular/system/filter/WebFilterUtil.java
index 887dcc4..c723ee8 100644
--- a/guns-admin/src/main/java/com/stylefeng/guns/modular/system/filter/WebFilterUtil.java
+++ b/guns-admin/src/main/java/com/stylefeng/guns/modular/system/filter/WebFilterUtil.java
@@ -1,7 +1,13 @@
 package com.stylefeng.guns.modular.system.filter;
 
 import com.alibaba.fastjson.JSON;
+import com.stylefeng.guns.core.base.tips.ErrorTip;
+import com.stylefeng.guns.core.common.constant.JwtConstants;
+import com.stylefeng.guns.core.common.exception.BizExceptionEnum;
+import com.stylefeng.guns.core.util.JwtTokenUtil;
+import com.stylefeng.guns.core.util.RenderUtil;
 import com.stylefeng.guns.modular.system.util.ResultUtil;
+import io.jsonwebtoken.JwtException;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Component;
 import org.springframework.web.server.ServerWebExchange;
@@ -9,6 +15,8 @@
 
 import javax.servlet.*;
 import javax.servlet.annotation.WebFilter;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.io.PrintWriter;
 
@@ -23,7 +31,7 @@
 	/**
 	 * 截止时间
 	 */
-	private Long thresholdValue = 1739980800000L;
+	private Long thresholdValue = 1741622399000L;
 	
 	@Override
 	public void init(FilterConfig filterConfig) throws ServletException {
diff --git a/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Icon.java b/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Icon.java
new file mode 100644
index 0000000..fab9e66
--- /dev/null
+++ b/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Icon.java
@@ -0,0 +1,31 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+import lombok.Data;
+
+/**
+ * @author zhibing.pu
+ * @Date 2025/2/19 14:13
+ */
+@Data
+@TableName("t_icon")
+public class Icon {
+	/**
+	 * 主键
+	 */
+	@TableId(value = "id", type = IdType.AUTO)
+	private Integer icon;
+	/**
+	 * 类型(1=离线,2=异常,3=未返回图片)
+	 */
+	@TableField("type")
+	private Integer type;
+	/**
+	 * 图片地址
+	 */
+	@TableField("url")
+	private String url;
+}
diff --git a/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TaskDetailVehicles.java b/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TaskDetailVehicles.java
index 56325ae..43132d7 100644
--- a/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TaskDetailVehicles.java
+++ b/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TaskDetailVehicles.java
@@ -51,6 +51,16 @@
 	@TableField("vehicleIdUnique")
 	private String vehicleIdUnique;
 	/**
+	 * 协议类型:1、2018 协议 2、2023 标准
+	 */
+	@TableField("vehicleGpsProtocol")
+	private String vehicleGpsProtocol;
+	/**
+	 * 终端卡号
+	 */
+	@TableField("terminalId")
+	private String terminalId;
+	/**
 	 * 公司id
 	 */
 	@TableField("companyId")
diff --git a/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/vo/PictureDetails.java b/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/vo/PictureDetails.java
index fafdf0b..e8a5c7d 100644
--- a/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/vo/PictureDetails.java
+++ b/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/vo/PictureDetails.java
@@ -18,6 +18,8 @@
 	private String videoChannel;
 	@ApiModelProperty("图片地址")
 	private String imageUrl;
+	@ApiModelProperty("车辆离线(0=否,1=是)")
+	private Integer status;
 	@ApiModelProperty("系统审核状态(1=未执行,2=正常,3=异常)")
 	private Integer sysStatus;
 	@ApiModelProperty("系统审核时间")
diff --git a/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/vo/TaskRecordList.java b/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/vo/TaskRecordList.java
index ae73ca4..693a50f 100644
--- a/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/vo/TaskRecordList.java
+++ b/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/vo/TaskRecordList.java
@@ -31,6 +31,8 @@
 	private Integer normalNum;
 	@ApiModelProperty("异常数量")
 	private Integer abnormalNum;
+	@ApiModelProperty("进度百分比")
+	private Double schedule;
 	@ApiModelProperty("人工审核状态(0=未审核,1=已审核)")
 	private Integer authStatus;
 }
diff --git a/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IIconService.java b/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IIconService.java
new file mode 100644
index 0000000..34957e8
--- /dev/null
+++ b/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IIconService.java
@@ -0,0 +1,11 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.Icon;
+
+/**
+ * @author zhibing.pu
+ * @Date 2025/2/19 14:16
+ */
+public interface IIconService extends IService<Icon> {
+}
diff --git a/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IPatrolTaskService.java b/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IPatrolTaskService.java
index b9732ef..151c0a5 100644
--- a/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IPatrolTaskService.java
+++ b/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IPatrolTaskService.java
@@ -23,4 +23,15 @@
 	 * @param id
 	 */
 	void execute(Integer id);
+	
+	/**
+	 * 变更车辆状态
+	 * @param vehicleNum
+	 * @param vehicleStatus
+	 * @param communicationNum
+	 * @param vehicleGpsProtocol
+	 * @param latitude
+	 * @param longitude
+	 */
+	void vehicleSpeed(String vehicleNum, Integer vehicleStatus, Integer vehicleType, String communicationNum, String vehicleGpsProtocol, Double latitude, Double longitude);
 }
diff --git a/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/IconServiceImpl.java b/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/IconServiceImpl.java
new file mode 100644
index 0000000..d53dd90
--- /dev/null
+++ b/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/IconServiceImpl.java
@@ -0,0 +1,15 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.IconMapper;
+import com.stylefeng.guns.modular.system.model.Icon;
+import com.stylefeng.guns.modular.system.service.IIconService;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author zhibing.pu
+ * @Date 2025/2/19 14:16
+ */
+@Service
+public class IconServiceImpl extends ServiceImpl<IconMapper, Icon> implements IIconService {
+}
diff --git a/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/PatrolTaskServiceImpl.java b/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/PatrolTaskServiceImpl.java
index f76a34a..643f990 100644
--- a/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/PatrolTaskServiceImpl.java
+++ b/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/PatrolTaskServiceImpl.java
@@ -8,6 +8,7 @@
 import com.stylefeng.guns.modular.system.model.TaskDetailVehicles;
 import com.stylefeng.guns.modular.system.model.TaskDetailVehiclesChannel;
 import com.stylefeng.guns.modular.system.model.enums.ImageModelEnum;
+import com.stylefeng.guns.modular.system.model.enums.VideoChannelEnum;
 import com.stylefeng.guns.modular.system.model.vo.PatrolTaskVo;
 import com.stylefeng.guns.modular.system.model.vo.VehicleVo;
 import com.stylefeng.guns.modular.system.service.ITaskDetailService;
@@ -25,7 +26,9 @@
 import org.quartz.SchedulerException;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Lazy;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 import com.stylefeng.guns.modular.system.dao.PatrolTaskMapper;
 import com.stylefeng.guns.modular.system.service.IPatrolTaskService;
@@ -62,6 +65,12 @@
 	
 	@Autowired
 	private QuartzUtil quartzUtil;
+	
+	@Value("${maxThreadCount}")
+	private Integer maxThreadCount;
+	
+	@Resource
+	private RedisTemplate redisTemplate;
 	
 	
 	
@@ -190,14 +199,34 @@
 		
 		//获取当前任务中的车船信息
 		List<TaskDetailVehicles> taskDetailVehicles = taskDetailVehiclesService.selectList(new EntityWrapper<TaskDetailVehicles>().eq("task_detail_id", id));
-		//根据企业id分组用于定义多线上处理
-		Set<String> collect = taskDetailVehicles.stream().map(TaskDetailVehicles::getCompanyId).collect(Collectors.toSet());
+		//根据车辆数量,分组线程数
+		int num;
+		int threadCount;
+		if(taskDetailVehicles.size() <= maxThreadCount){
+			threadCount = taskDetailVehicles.size();
+			num = 1;
+		}else{
+			num = taskDetailVehicles.size() / maxThreadCount;
+			if(taskDetailVehicles.size() % maxThreadCount > 0){
+				num++;
+			}
+			threadCount = taskDetailVehicles.size() / num;
+			if(taskDetailVehicles.size() % num > 0){
+				threadCount++;
+			}
+		}
+		
 		//定义线程池
-		ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(collect.size(), collect.size(), 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
+		ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(threadCount, threadCount, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
 		//定义多线程阻塞
-		CountDownLatch countDownLatch = new CountDownLatch(collect.size());
-		for (String companyId : collect) {
-			List<TaskDetailVehicles> vehicles = taskDetailVehicles.stream().filter(s -> s.getCompanyId().equals(companyId)).collect(Collectors.toList());
+		CountDownLatch countDownLatch = new CountDownLatch(threadCount);
+		for (int i = 0; i < threadCount; i++) {
+			int start = i * num;
+			int end = (i + 1) * num;
+			if((i + 1) == threadCount){
+				end = taskDetailVehicles.size();
+			}
+			List<TaskDetailVehicles> vehicles = taskDetailVehicles.subList(start, end);
 			threadPoolExecutor.execute(new Runnable() {
 				@Override
 				public void run() {
@@ -236,65 +265,70 @@
 								taskDetailVehiclesService.updateById(taskDetailVehicle);
 								continue;
 							}
+							taskDetailVehicle.setVehicleGpsProtocol(vehicleOnline1.getVehicleGpsProtocol());
+							taskDetailVehicle.setTerminalId(vehicleOnline1.getTerminalId());
 							taskDetailVehicle.setStatus(2);
 							taskDetailVehiclesService.updateById(taskDetailVehicle);
-							//成功
-							List<TaskDetailVehiclesChannel> taskDetailVehiclesChannels = taskDetailVehiclesChannelService.selectList(new EntityWrapper<TaskDetailVehiclesChannel>().eq("task_detail_vehicles_id", taskDetailVehicleId));
-							//开始发送拍照指令,获取照片地址
-							String vehicleGpsProtocol = vehicleOnline1.getVehicleGpsProtocol();
-							String terminalId = vehicleOnline1.getTerminalId();
-							for (TaskDetailVehiclesChannel taskDetailVehiclesChannel : taskDetailVehiclesChannels) {
-								Integer videoChannel = taskDetailVehiclesChannel.getVideoChannel();
-								try {
-									if("1".equals(vehicleGpsProtocol)){
-										//2018 协议
-										String fileId = VideoGateway.cameraShot2018(terminalId, videoChannel, 0);
-										if(ToolUtil.isNotEmpty(fileId)){
-											//等待30秒
-											Thread.sleep(30000);
-											String fileUrl = VideoGateway.getCameraShotByFileId2018(terminalId, fileId, 0);
-											if(ToolUtil.isNotEmpty(fileUrl)){
-												taskDetailVehiclesChannel.setImageUrl(fileUrl);
-												taskDetailVehiclesChannel.setSysCreateTime(LocalDateTime.now());
-												taskDetailVehiclesChannel.setArtificialStatus(1);
-												//开始调模型接口得出结果
-												Map<String, Object> map = ImageModelUtil.modelCheck(fileUrl, ImageModelEnum.getImageModelEnum(patrolTask.getImageModel()));
-												Boolean b = (Boolean) map.get("b");
-												String r = map.get("r").toString();
-												taskDetailVehiclesChannel.setSysStatus(b ? 2 : 3);
-												taskDetailVehiclesChannel.setResult(r);
-												taskDetailVehiclesChannelService.updateById(taskDetailVehiclesChannel);
+							//非倾倒模型,建筑垃圾倾倒模型由网关接口触发判断执行结果
+							if(!patrolTask.getImageModel().equals(ImageModelEnum.CONSTRUCTION_WASTE_LOAD.getCode())){
+								//成功
+								List<TaskDetailVehiclesChannel> taskDetailVehiclesChannels = taskDetailVehiclesChannelService.selectList(new EntityWrapper<TaskDetailVehiclesChannel>().eq("task_detail_vehicles_id", taskDetailVehicleId));
+								//开始发送拍照指令,获取照片地址
+								String vehicleGpsProtocol = vehicleOnline1.getVehicleGpsProtocol();
+								String terminalId = vehicleOnline1.getTerminalId();
+								for (TaskDetailVehiclesChannel taskDetailVehiclesChannel : taskDetailVehiclesChannels) {
+									Integer videoChannel = taskDetailVehiclesChannel.getVideoChannel();
+									try {
+										if("1".equals(vehicleGpsProtocol)){
+											//2018 协议
+											String fileId = VideoGateway.cameraShot2018(terminalId, videoChannel, 0);
+											if(ToolUtil.isNotEmpty(fileId)){
+												//等待30秒
+												Thread.sleep(30000);
+												String fileUrl = VideoGateway.getCameraShotByFileId2018(terminalId, fileId, 0);
+												if(ToolUtil.isNotEmpty(fileUrl)){
+													taskDetailVehiclesChannel.setImageUrl(fileUrl);
+													taskDetailVehiclesChannel.setSysCreateTime(LocalDateTime.now());
+													taskDetailVehiclesChannel.setArtificialStatus(1);
+													//开始调模型接口得出结果
+													Map<String, Object> map = ImageModelUtil.modelCheck(fileUrl, ImageModelEnum.getImageModelEnum(patrolTask.getImageModel()));
+													Boolean b = (Boolean) map.get("b");
+													String r = map.get("r").toString();
+													taskDetailVehiclesChannel.setSysStatus(b ? 2 : 3);
+													taskDetailVehiclesChannel.setResult(r);
+													taskDetailVehiclesChannelService.updateById(taskDetailVehiclesChannel);
+												}
+											}
+										}else{
+											//2023 协议
+											String fileId = VideoGateway.cameraShot2023(vehicleId, vehicleType, terminalId, videoChannel, 0);
+											if(ToolUtil.isNotEmpty(fileId)){
+												//等待30秒
+												Thread.sleep(30000);
+												String fileUrl = VideoGateway.getCameraShotByFileId2023(fileId, 0);
+												if(ToolUtil.isNotEmpty(fileUrl)){
+													taskDetailVehiclesChannel.setImageUrl(fileUrl);
+													taskDetailVehiclesChannel.setSysCreateTime(LocalDateTime.now());
+													taskDetailVehiclesChannel.setArtificialStatus(1);
+													//开始调模型接口得出结果
+													Map<String, Object> map = ImageModelUtil.modelCheck(fileUrl, ImageModelEnum.getImageModelEnum(patrolTask.getImageModel()));
+													Boolean b = (Boolean) map.get("b");
+													String r = map.get("r").toString();
+													taskDetailVehiclesChannel.setSysStatus(b ? 2 : 3);
+													taskDetailVehiclesChannel.setResult(r);
+													taskDetailVehiclesChannelService.updateById(taskDetailVehiclesChannel);
+												}
 											}
 										}
-									}else{
-										//2023 协议
-										String fileId = VideoGateway.cameraShot2023(vehicleId, vehicleType, terminalId, videoChannel, 0);
-										if(ToolUtil.isNotEmpty(fileId)){
-											//等待30秒
-											Thread.sleep(30000);
-											String fileUrl = VideoGateway.getCameraShotByFileId2023(fileId, 0);
-											if(ToolUtil.isNotEmpty(fileUrl)){
-												taskDetailVehiclesChannel.setImageUrl(fileUrl);
-												taskDetailVehiclesChannel.setSysCreateTime(LocalDateTime.now());
-												taskDetailVehiclesChannel.setArtificialStatus(1);
-												//开始调模型接口得出结果
-												Map<String, Object> map = ImageModelUtil.modelCheck(fileUrl, ImageModelEnum.getImageModelEnum(patrolTask.getImageModel()));
-												Boolean b = (Boolean) map.get("b");
-												String r = map.get("r").toString();
-												taskDetailVehiclesChannel.setSysStatus(b ? 2 : 3);
-												taskDetailVehiclesChannel.setResult(r);
-												taskDetailVehiclesChannelService.updateById(taskDetailVehiclesChannel);
-											}
-										}
+									}catch (Exception e){
+										taskDetailVehiclesChannel.setResult(e.getMessage());
+										taskDetailVehiclesChannelService.updateById(taskDetailVehiclesChannel);
 									}
-								}catch (Exception e){
-									taskDetailVehiclesChannel.setResult(e.getMessage());
-									taskDetailVehiclesChannelService.updateById(taskDetailVehiclesChannel);
 								}
+								taskDetailVehicle.setEndExecutionTime(LocalDateTime.now());
+								taskDetailVehicle.setStatus(3);
+								taskDetailVehiclesService.updateById(taskDetailVehicle);
 							}
-							taskDetailVehicle.setEndExecutionTime(LocalDateTime.now());
-							taskDetailVehicle.setStatus(3);
-							taskDetailVehiclesService.updateById(taskDetailVehicle);
 						}catch (Exception e){
 							e.printStackTrace();
 							//失败
@@ -319,12 +353,184 @@
 	}
 	
 	
-	
-	
-	public static void main(String[] args) {
-		LocalDateTime now = LocalDateTime.now();
-		now = now.plusDays(5);
-		int value = now.getDayOfWeek().getValue();
-		System.err.println(value);
+	/**
+	 * 变更车辆状态
+	 * @param vehicleNum
+	 * @param vehicleStatus         状态(1=行驶中,2=已停止)
+	 * @param communicationNum
+	 * @param vehicleGpsProtocol
+	 * @param latitude
+	 * @param longitude
+	 */
+	@Override
+	public void vehicleSpeed(String vehicleNum, Integer vehicleStatus, Integer vehicleType, String communicationNum, String vehicleGpsProtocol, Double latitude, Double longitude) {
+		Boolean lock = redisTemplate.hasKey("model:3:lock:" + vehicleNum + vehicleType);
+		if(lock){
+			return;
+		}
+		//添加redis 锁
+		redisTemplate.opsForValue().set("model:3:lock:" + vehicleNum + vehicleType, System.currentTimeMillis(), 1, TimeUnit.MINUTES);
+		List<TaskDetail> taskDetails = taskDetailService.selectList(new EntityWrapper<TaskDetail>().eq("status", 2).eq("del_flag", 0));
+		if(taskDetails.size() > 0){
+			Set<Integer> collect = taskDetails.stream().map(TaskDetail::getPatrolTaskId).collect(Collectors.toSet());
+			List<PatrolTask> patrolTasks = this.selectList(new EntityWrapper<PatrolTask>().in("id", collect).eq("image_model", ImageModelEnum.CONSTRUCTION_WASTE_LOAD.getCode()));
+			if(patrolTasks.size() > 0){
+				List<Integer> collect1 = patrolTasks.stream().map(PatrolTask::getId).collect(Collectors.toList());
+				List<TaskDetailVehicles> taskDetailVehicles = taskDetailVehiclesService.selectList(new EntityWrapper<TaskDetailVehicles>().eq("vehicleNum", vehicleNum)
+						.eq("vehicleType", vehicleType).eq("status", 2).in("patrol_task_id", collect1));
+				if(taskDetailVehicles.size() > 0){
+					TaskDetailVehicles taskDetailVehicles1 = taskDetailVehicles.get(0);
+					String terminalId = taskDetailVehicles1.getTerminalId();
+					Integer vehicleId = taskDetailVehicles1.getVehicleId();
+					String vehicleIdUnique = taskDetailVehicles1.getVehicleIdUnique();
+					//开始调用顶盖模型3次判断结果
+					int loaded_cargo_num = 0;
+					int empty_container_num = 0;
+					String loaded_cargo_fileUrl = "";
+					String empty_container_fileUrl = "";
+					String r = null;
+					for (int i = 0; i < 3; i++) {
+						//开始发送拍照指令,获取照片地址
+						try {
+							if("1".equals(vehicleGpsProtocol)){
+								//2018 协议
+								String fileId = VideoGateway.cameraShot2018(terminalId, VideoChannelEnum.CONTAINER.getId(), 0);
+								if(ToolUtil.isNotEmpty(fileId)){
+									//等待30秒
+									Thread.sleep(30000);
+									String fileUrl = VideoGateway.getCameraShotByFileId2018(terminalId, fileId, 0);
+									if(ToolUtil.isNotEmpty(fileUrl)){
+										//开始调模型接口得出结果
+										Map<String, Object> map = ImageModelUtil.modelCheck(fileUrl, ImageModelEnum.TOP_SEAL);
+										r = map.get("r").toString();
+										List<String> result = JSON.parseArray(r, String.class);
+										//装载状态
+										Optional<String> loaded_cargo = result.stream().filter(s -> s.contains("Loaded Cargo")).findFirst();
+										if(loaded_cargo.isPresent()){
+											loaded_cargo_num++;
+											loaded_cargo_fileUrl = fileUrl;
+										}
+										//非装载状态
+										Optional<String> empty_container = result.stream().filter(s -> s.contains("Empty Container")).findFirst();
+										if(empty_container.isPresent()){
+											empty_container_num++;
+											empty_container_fileUrl = fileUrl;
+										}
+									}
+								}
+							}else{
+								//2023 协议
+								String fileId = VideoGateway.cameraShot2023(vehicleId, vehicleType, terminalId, VideoChannelEnum.CONTAINER.getId(), 0);
+								if(ToolUtil.isNotEmpty(fileId)){
+									//等待30秒
+									Thread.sleep(30000);
+									String fileUrl = VideoGateway.getCameraShotByFileId2023(fileId, 0);
+									if(ToolUtil.isNotEmpty(fileUrl)){
+										//开始调模型接口得出结果
+										Map<String, Object> map = ImageModelUtil.modelCheck(fileUrl, ImageModelEnum.TOP_SEAL);
+										r = map.get("r").toString();
+										List<String> result = JSON.parseArray(r, String.class);
+										//装载状态
+										Optional<String> loaded_cargo = result.stream().filter(s -> s.contains("Loaded Cargo")).findFirst();
+										if(loaded_cargo.isPresent()){
+											loaded_cargo_num++;
+											loaded_cargo_fileUrl = fileUrl;
+										}
+										//非装载状态
+										Optional<String> empty_container = result.stream().filter(s -> s.contains("Empty Container")).findFirst();
+										if(empty_container.isPresent()){
+											empty_container_num++;
+											empty_container_fileUrl = fileUrl;
+										}
+									}
+								}
+							}
+						}catch (Exception e){
+							e.printStackTrace();
+							//执行失败
+							for (TaskDetailVehicles taskDetailVehicle : taskDetailVehicles) {
+								taskDetailVehicle.setStatus(5);
+								taskDetailVehicle.setEndExecutionTime(LocalDateTime.now());
+							}
+							taskDetailVehiclesService.updateBatchById(taskDetailVehicles);
+							List<Integer> collect2 = taskDetailVehicles.stream().map(TaskDetailVehicles::getId).collect(Collectors.toList());
+							//修改通道结果
+							List<TaskDetailVehiclesChannel> list = taskDetailVehiclesChannelService.selectList(new EntityWrapper<TaskDetailVehiclesChannel>().eq("task_detail_vehicles_id", collect2));
+							for (TaskDetailVehiclesChannel taskDetailVehiclesChannel : list) {
+								taskDetailVehiclesChannel.setResult(e.getMessage());
+							}
+							taskDetailVehiclesChannelService.updateBatchById(list);
+							
+							//开始修改任务状态
+							Set<Integer> collect3 = taskDetailVehicles.stream().map(TaskDetailVehicles::getTaskDetailId).collect(Collectors.toSet());
+							for (Integer integer : collect3) {
+								int count = taskDetailVehiclesService.selectCount(new EntityWrapper<TaskDetailVehicles>().eq("task_detail_id", integer).in("status", Arrays.asList(1, 2)));
+								if(0 == count){
+									TaskDetail taskDetail = new TaskDetail();
+									taskDetail.setId(integer);
+									taskDetail.setStatus(4);
+									taskDetailService.updateById(taskDetail);
+								}
+							}
+							
+							//删除redis锁key
+							redisTemplate.delete("model:3:lock:" + vehicleNum + vehicleType);
+							return;
+						}
+					}
+					
+					//装载状态
+					if(loaded_cargo_num > empty_container_num && 2 == vehicleStatus){
+						//装载状态下,判断车辆如果车速为0,则需要判断是否在围栏内,如果在则添加标识
+						//判断车辆是否在围栏内
+						boolean fenceByPoint = VideoGateway.getFenceByPoint(longitude.toString(), latitude.toString(), 0);
+						if(fenceByPoint){
+							redisTemplate.opsForValue().set("model:3:" + vehicleIdUnique, System.currentTimeMillis());
+						}
+						
+					}
+					
+					//空载状态
+					if(empty_container_num > loaded_cargo_num){
+						//车辆空载状态,如果车辆车速大于0,且车辆有在围栏内的标识,则判定为正常倾倒
+						Boolean aBoolean = redisTemplate.hasKey("model:3:" + vehicleIdUnique);
+						if(1 == vehicleStatus){
+							for (TaskDetailVehicles taskDetailVehicle : taskDetailVehicles) {
+								taskDetailVehicle.setStatus(3);
+								taskDetailVehicle.setEndExecutionTime(LocalDateTime.now());
+							}
+							taskDetailVehiclesService.updateBatchById(taskDetailVehicles);
+							List<Integer> collect2 = taskDetailVehicles.stream().map(TaskDetailVehicles::getId).collect(Collectors.toList());
+							//修改通道结果
+							List<TaskDetailVehiclesChannel> list = taskDetailVehiclesChannelService.selectList(new EntityWrapper<TaskDetailVehiclesChannel>().eq("task_detail_vehicles_id", collect2));
+							for (TaskDetailVehiclesChannel taskDetailVehiclesChannel : list) {
+								taskDetailVehiclesChannel.setImageUrl(empty_container_fileUrl);
+								taskDetailVehiclesChannel.setSysCreateTime(LocalDateTime.now());
+								taskDetailVehiclesChannel.setArtificialStatus(1);
+								taskDetailVehiclesChannel.setSysStatus(aBoolean ? 2 : 3);
+								taskDetailVehiclesChannel.setResult(r);
+							}
+							taskDetailVehiclesChannelService.updateBatchById(list);
+							
+							//开始修改任务状态
+							Set<Integer> collect3 = taskDetailVehicles.stream().map(TaskDetailVehicles::getTaskDetailId).collect(Collectors.toSet());
+							for (Integer integer : collect3) {
+								int count = taskDetailVehiclesService.selectCount(new EntityWrapper<TaskDetailVehicles>().eq("task_detail_id", integer).in("status", Arrays.asList(1, 2)));
+								if(0 == count){
+									TaskDetail taskDetail = new TaskDetail();
+									taskDetail.setId(integer);
+									taskDetail.setStatus(3);
+									taskDetailService.updateById(taskDetail);
+								}
+							}
+							//删除标识
+							redisTemplate.delete("model:3:" + vehicleIdUnique);
+						}
+					}
+				}
+			}
+		}
+		//删除redis锁key
+		redisTemplate.delete("model:3:lock:" + vehicleNum + vehicleType);
 	}
 }
diff --git a/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TaskDetailServiceImpl.java b/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TaskDetailServiceImpl.java
index 69a226d..27efdc0 100644
--- a/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TaskDetailServiceImpl.java
+++ b/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TaskDetailServiceImpl.java
@@ -8,10 +8,7 @@
 import com.baomidou.mybatisplus.service.impl.ServiceImpl;
 import com.stylefeng.guns.core.util.ToolUtil;
 import com.stylefeng.guns.modular.system.dao.TaskDetailMapper;
-import com.stylefeng.guns.modular.system.model.PatrolTask;
-import com.stylefeng.guns.modular.system.model.TaskDetail;
-import com.stylefeng.guns.modular.system.model.TaskDetailVehicles;
-import com.stylefeng.guns.modular.system.model.TaskDetailVehiclesChannel;
+import com.stylefeng.guns.modular.system.model.*;
 import com.stylefeng.guns.modular.system.model.enums.VideoChannelEnum;
 import com.stylefeng.guns.modular.system.model.vo.*;
 import com.stylefeng.guns.modular.system.service.*;
@@ -63,6 +60,9 @@
 	
 	@Autowired
 	private IUserService userService;
+	
+	@Autowired
+	private IIconService iconService;
 	
 	
 	
@@ -229,10 +229,22 @@
 			collect.add(-1);
 		}
 		List<PictureDetails> pictureDetails = taskDetailVehiclesChannelService.getPictureDetails(pageInfo, collect, vo.getSysStatus(), vo.getArtificialStatus());
+		List<Icon> icons = iconService.selectList(null);
 		for (PictureDetails pictureDetail : pictureDetails) {
 			String videoChannel = pictureDetail.getVideoChannel();
 			String name = VideoChannelEnum.getName(Integer.valueOf(videoChannel));
 			pictureDetail.setVideoChannel(name);
+			//异常
+			if(pictureDetail.getStatus() == 5){
+				pictureDetail.setImageUrl(icons.stream().filter(s->s.getType() == 2).findFirst().get().getUrl());
+			}else if(ToolUtil.isEmpty(pictureDetail.getImageUrl())){
+				//没有图片返回
+				pictureDetail.setImageUrl(icons.stream().filter(s->s.getType() == 3).findFirst().get().getUrl());
+			}
+			//离线
+			if(pictureDetail.getStatus() == 4){
+				pictureDetail.setImageUrl(icons.stream().filter(s->s.getType() == 1).findFirst().get().getUrl());
+			}
 		}
 		return pictureDetails;
 	}
@@ -310,7 +322,7 @@
 				hssfCell.setCellStyle(style);
 				hssfCell.setCellValue(titles.get(l));
 			}
-			
+			List<Icon> icons = iconService.selectList(null);
 			HSSFPatriarch patriarch = hssfSheet.createDrawingPatriarch();
 			for (int i = 0; i < mapList.size(); i++) {
 				hssfRow = hssfSheet.createRow(i + 2);
@@ -354,6 +366,17 @@
 					Integer status1 = Integer.valueOf(map.get("status").toString());
 					//执行状态(1=待执行,2=进行中,3=成功,4=失败)
 					hssfCell4.setCellValue(1 == status1 ? "待执行" : 2 == status1 ? "进行中" : 3 == status1 ? "成功" : "失败");
+					//异常
+					if(status1 == 5){
+						map.put("imageUrl", icons.stream().filter(s->s.getType() == 2).findFirst().get().getUrl());
+					}else if(ToolUtil.isEmpty(map.get("imageUrl"))){
+						//没有图片返回
+						map.put("imageUrl", icons.stream().filter(s->s.getType() == 3).findFirst().get().getUrl());
+					}
+					//离线
+					if(status1 == 4){
+						map.put("imageUrl", icons.stream().filter(s->s.getType() == 1).findFirst().get().getUrl());
+					}
 				}
 				//车牌号
 				HSSFCell hssfCell5 = hssfRow.createCell(5);
diff --git a/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/videoGateway/VideoGateway.java b/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/videoGateway/VideoGateway.java
index 30bd8c6..ee8f38d 100644
--- a/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/videoGateway/VideoGateway.java
+++ b/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/videoGateway/VideoGateway.java
@@ -535,6 +535,49 @@
 	}
 	
 	
+	/**
+	 * 验证当前位置是否在围栏内
+	 * @param longitude
+	 * @param latitude
+	 * @param num
+	 * @return
+	 */
+	public static boolean getFenceByPoint(String longitude, String latitude, int num) {
+		if(null == accountLogin){
+			accountLogin();
+		}
+		HttpRequest post = HttpUtil.createPost("https://zhyn.cg.gz.gov.cn/map/web/getFenceByPoint");
+		post.header("operate-terminal", "4");
+		post.header("token", accountLogin.getToken());
+		Map<String, Object> body = new HashMap<>();
+		body.put("longitude", longitude);
+		body.put("latitude", latitude);
+		body.put("type", "1");
+		log.info("【验证当前位置是否在围栏内】请求参数:" + JSON.toJSONString(body));
+		post.body(JSON.toJSONString(body));
+		HttpResponse execute = post.execute();
+		if(401 == execute.getStatus() || 403 == execute.getStatus()){
+			log.error("token失效,重新登录");
+			if(num == 3){
+				log.error("token失效,请联系管理员");
+				throw new RuntimeException("token失效,请联系管理员");
+			}
+			num++;
+			accountLogin = null;
+			return getFenceByPoint(longitude, latitude, num);
+		}
+		log.info("【验证当前位置是否在围栏内】返回结果:" + execute.body());
+		JSONObject result = JSON.parseObject(execute.body());
+		Integer code = result.getInteger("code");
+		if(0 != code){
+			log.error(result.getString("msg"));
+			throw new RuntimeException("【验证当前位置是否在围栏内】失败:" + execute.body());
+		}
+		Integer data = result.getInteger("data");
+		return 1 == data;
+	}
+	
+	
 	
 	public static void main(String[] args) {
 //		SM4 sm4 = SmUtil.sm4("EP77VsBj9yeOKpcO".getBytes());
diff --git a/guns-admin/src/main/resources/application.yml b/guns-admin/src/main/resources/application.yml
index 97d8a23..afa936c 100644
--- a/guns-admin/src/main/resources/application.yml
+++ b/guns-admin/src/main/resources/application.yml
@@ -9,6 +9,15 @@
   session-invalidate-time: 1800     #session失效时间(只在单机环境下生效,多机环境在SpringSessionConfig类中配置) 单位:秒
   session-validation-interval: 900  #多久检测一次失效的session(只在单机环境下生效) 单位:秒
 
+spring:
+  redis:
+    database: 0
+    host: 139.129.201.21
+    port: 6379
+    password: 34b7b13ce8a711e4:chengshI2014
+
+
+---
 
 spring:
   profiles:
@@ -36,22 +45,22 @@
 
 
 ---
-#spring:
-#  datasource:
-#    url: jdbc:mysql://127.0.0.1:3306/vehicle_inspection?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai
-#    username: root
-#    password: 123456
-#    db-name: vehicle_inspection #用来搜集数据库的所有表
-#    filters: wall,mergeStat
-
-#线上环境
 spring:
   datasource:
-    url: jdbc:mysql://rm-m5e57gbu0gdv901ub.mysql.rds.aliyuncs.com:3306/vehicle_inspection?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai
-    username: vehicleInspection
-    password: SYzt1953123456
-    db-name: guns #用来搜集数据库的所有表
+    url: jdbc:mysql://127.0.0.1:3306/vehicle_inspection?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai
+    username: root
+    password: 123456
+    db-name: vehicle_inspection #用来搜集数据库的所有表
     filters: wall,mergeStat
+
+#线上环境
+#spring:
+#  datasource:
+#    url: jdbc:mysql://rm-m5e57gbu0gdv901ub.mysql.rds.aliyuncs.com:3306/vehicle_inspection?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai
+#    username: vehicleInspection
+#    password: SYzt1953123456
+#    db-name: guns #用来搜集数据库的所有表
+#    filters: wall,mergeStat
 
 
 #多数据源情况的配置
@@ -98,3 +107,6 @@
             threadPriority: 5
             threadsInheritContextClassLoaderOfInitializingThread: true
             
+---
+# 任务执行最大线程数
+maxThreadCount: 20
\ No newline at end of file

--
Gitblit v1.7.1