Pu Zhibing
2025-02-28 173428adf09179860a3cb1a88f46378fd98473b2
开发模型3业务逻辑
14个文件已修改
5个文件已添加
513 ■■■■■ 已修改文件
guns-admin/pom.xml 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-admin/src/main/java/com/stylefeng/guns/modular/api/ApiController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-admin/src/main/java/com/stylefeng/guns/modular/api/PatrolTaskController.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/IconMapper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/IconMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TaskDetailMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TaskDetailVehiclesChannelMapper.xml 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-admin/src/main/java/com/stylefeng/guns/modular/system/filter/WebFilterUtil.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Icon.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TaskDetailVehicles.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/vo/PictureDetails.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/vo/TaskRecordList.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IIconService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IPatrolTaskService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/IconServiceImpl.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/PatrolTaskServiceImpl.java 228 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TaskDetailServiceImpl.java 33 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/videoGateway/VideoGateway.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-admin/src/main/resources/application.yml 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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>
guns-admin/src/main/java/com/stylefeng/guns/modular/api/ApiController.java
@@ -78,5 +78,10 @@
        return SUCCESS_TIP;
    }
    public static void main(String[] args) {
        String s = ShiroKit.md5("96e79218965eb72c92a549dd5a330112", "8pgby");
        System.err.println(s);
    }
}
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();
    }
}
guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/IconMapper.java
New file
@@ -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> {
}
guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/IconMapper.xml
New file
@@ -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>
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)
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
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 {
guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Icon.java
New file
@@ -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;
}
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")
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("系统审核时间")
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;
}
guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IIconService.java
New file
@@ -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> {
}
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);
}
guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/IconServiceImpl.java
New file
@@ -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 {
}
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,8 +265,12 @@
                                taskDetailVehiclesService.updateById(taskDetailVehicle);
                                continue;
                            }
                            taskDetailVehicle.setVehicleGpsProtocol(vehicleOnline1.getVehicleGpsProtocol());
                            taskDetailVehicle.setTerminalId(vehicleOnline1.getTerminalId());
                            taskDetailVehicle.setStatus(2);
                            taskDetailVehiclesService.updateById(taskDetailVehicle);
                            //非倾倒模型,建筑垃圾倾倒模型由网关接口触发判断执行结果
                            if(!patrolTask.getImageModel().equals(ImageModelEnum.CONSTRUCTION_WASTE_LOAD.getCode())){
                            //成功
                            List<TaskDetailVehiclesChannel> taskDetailVehiclesChannels = taskDetailVehiclesChannelService.selectList(new EntityWrapper<TaskDetailVehiclesChannel>().eq("task_detail_vehicles_id", taskDetailVehicleId));
                            //开始发送拍照指令,获取照片地址
@@ -295,6 +328,7 @@
                            taskDetailVehicle.setEndExecutionTime(LocalDateTime.now());
                            taskDetailVehicle.setStatus(3);
                            taskDetailVehiclesService.updateById(taskDetailVehicle);
                            }
                        }catch (Exception e){
                            e.printStackTrace();
                            //失败
@@ -319,12 +353,184 @@
    }
    
    
    /**
     * 变更车辆状态
     * @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);
                                }
                            }
    
    public static void main(String[] args) {
        LocalDateTime now = LocalDateTime.now();
        now = now.plusDays(5);
        int value = now.getDayOfWeek().getValue();
        System.err.println(value);
                            //删除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);
    }
}
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);
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());
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