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
@@ -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); } } 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,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); } } 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