| | |
| | | import com.alibaba.excel.annotation.format.DateTimeFormat; |
| | | import com.alibaba.fastjson2.JSON; |
| | | import com.alibaba.fastjson2.JSONObject; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; |
| | |
| | | import com.ycl.config.ServerConfig; |
| | | import com.ycl.exception.ServiceException; |
| | | import com.ycl.platform.domain.entity.*; |
| | | import com.ycl.platform.domain.excel.PointExport; |
| | | import com.ycl.platform.domain.form.*; |
| | | import com.ycl.platform.domain.query.*; |
| | | import com.ycl.platform.domain.vo.*; |
| | |
| | | import com.ycl.utils.http.HttpUtils; |
| | | import com.ycl.utils.redis.RedisCache; |
| | | import com.ycl.utils.uuid.IdUtils; |
| | | import constant.ApiConstants; |
| | | import constant.CheckConstants; |
| | | import constant.Constants; |
| | | import constant.RedisConstant; |
| | | import enumeration.ErrorType; |
| | | import enumeration.general.*; |
| | | import lombok.RequiredArgsConstructor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | |
| | | import org.springframework.beans.BeanUtils; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | import org.springframework.context.ApplicationContext; |
| | | import org.springframework.data.redis.core.RedisTemplate; |
| | | import org.springframework.scheduling.annotation.Async; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.util.Assert; |
| | | import org.springframework.util.CollectionUtils; |
| | | import org.springframework.util.StringUtils; |
| | | import pojo.CascadeOption; |
| | | |
| | | import javax.imageio.ImageIO; |
| | | import javax.swing.*; |
| | | import java.awt.image.BufferedImage; |
| | | import java.io.File; |
| | | import java.io.IOException; |
| | | import java.net.HttpURLConnection; |
| | | import java.net.URL; |
| | |
| | | private final NotifyService notifyService; |
| | | private final WorkOrderDistributeRecordMapper workOrderDistributeRecordMapper; |
| | | private final WorkOrderErrorTypeServiceImpl workOrderErrorTypeService; |
| | | private final WorkOrderErrorTypeMapper workOrderErrorTypeMapper; |
| | | private final SysConfigMapper configMapper; |
| | | private final ReportMapper reportMapper; |
| | | private final WorkOrderCheckImgMapper workOrderCheckImgMapper; |
| | | private final WorkOrderWhiteMapper workOrderWhiteMapper; |
| | | private final DeviceInfoMapper deviceInfoMapper; |
| | | private final ApplicationContext applicationContext; |
| | | @Value("${rtsp.server:http://127.0.0.1:7788}") |
| | | private String rtspServer; |
| | | |
| | |
| | | private RedisCache redisCache; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public synchronized Boolean innerAddWorkOrder(List<WorkOrder> workOrderList) { |
| | | //避免坑(事务加锁会失效、方法内部调用事务会失效) |
| | | WorkOrderServiceImpl self = applicationContext.getBean(WorkOrderServiceImpl.class); |
| | | return self.batchAddWorkOrder(workOrderList); |
| | | } |
| | | |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Boolean batchAddWorkOrder(List<WorkOrder> workOrderList){ |
| | | int total = workOrderList.size(); |
| | | workOrderList.stream().filter(item -> { |
| | | // 查询出白名单列表 |
| | | List<String> serialNumbers = workOrderWhiteMapper.selectList().stream().map(WorkOrderWhite::getSerialNumber).collect(Collectors.toList()); |
| | | // 遍历工单列表,判断是否在白名单中 |
| | | workOrderList = workOrderList.stream().filter(item -> !serialNumbers.contains(item.getSerialNumber())) |
| | | .collect(Collectors.toList()); |
| | | workOrderList = workOrderList.stream().filter(item -> { |
| | | return StringUtils.hasText(item.getSerialNumber()) && Objects.nonNull(item.getStatus()) && !CollectionUtils.isEmpty(item.getErrorTypeList()); |
| | | }); |
| | | }).collect(Collectors.toList()); |
| | | if (CollectionUtils.isEmpty(workOrderList)) { |
| | | return Boolean.TRUE; |
| | | } |
| | |
| | | willAddErrorType.add(workOrderErrorType); |
| | | } |
| | | } |
| | | databaseWorkOrder.setStatus(WorkOrderStatusEnum.DISTRIBUTED); |
| | | //避免代下发的工单直接变成下发 |
| | | if(!databaseWorkOrder.getStatus().equals(WorkOrderStatusEnum.WAIT_DISTRIBUTE)) { |
| | | databaseWorkOrder.setStatus(WorkOrderStatusEnum.DISTRIBUTED); |
| | | } |
| | | databaseWorkOrder.setUpdateTime(now); |
| | | willUpdateStatusWorkOrderList.add(databaseWorkOrder); |
| | | updateNum++; |
| | |
| | | return Boolean.TRUE; |
| | | } |
| | | List<String> willAddSerialNumber = waitAddList.stream().map(WorkOrder::getSerialNumber).collect(Collectors.toList()); |
| | | //只生成考核设备、且有运维单位的工单 |
| | | List<YwPoint> pointList = new LambdaQueryChainWrapper<>(ywPointService.getBaseMapper()) |
| | | .select(YwPoint::getUnitId, YwPoint::getSerialNumber, YwPoint::getImportantTag, YwPoint::getImportantTag, YwPoint::getProvinceTag, YwPoint::getImportantCommandImageTag) |
| | | .in(YwPoint::getSerialNumber, willAddSerialNumber) |
| | | .eq(YwPoint::getExamineStatus, Boolean.TRUE) |
| | | .isNotNull(YwPoint::getUnitId) |
| | | .list(); |
| | | Map<String, YwPoint> pointMapping = pointList.stream().collect(Collectors.toMap(YwPoint::getSerialNumber, point -> point)); |
| | | // 查出重点点位、普通点位的处理时间 |
| | |
| | | List<WorkOrder> notAddList = new ArrayList<>(); |
| | | //查redis今日工单数量 |
| | | int workOrderNum = 0; |
| | | for (WorkOrder workOrder : waitAddList) { |
| | | YwPoint point = pointMapping.get(workOrder.getSerialNumber()); |
| | | if (Objects.isNull(point)) { |
| | | notAddList.add(workOrder); |
| | | continue; |
| | | } |
| | | if (Objects.nonNull(point.getUnitId())) { |
| | | workOrder.setUnitId(Math.toIntExact(point.getUnitId())); |
| | | } |
| | | if (point.getImportantTag() || point.getImportantCommandImageTag()) { |
| | | workOrder.setProcessingPeriod(Integer.valueOf(important.getConfigValue())); |
| | | } else { |
| | | workOrder.setProcessingPeriod(Integer.valueOf(normal.getConfigValue())); |
| | | } |
| | | } |
| | | waitAddList.removeAll(notAddList); |
| | | if (CollectionUtils.isEmpty(waitAddList)) { |
| | | return Boolean.TRUE; |
| | | } |
| | | //UUID作为value,保证上锁的线程自己解锁 |
| | | String requestId = IdUtils.fastSimpleUUID(); |
| | | try { |
| | |
| | | log.error("获取锁异常"); |
| | | return Boolean.FALSE; |
| | | } |
| | | //记录工单数,补充工单号 |
| | | for (WorkOrder workOrder : waitAddList) { |
| | | YwPoint point = pointMapping.get(workOrder.getSerialNumber()); |
| | | if (Objects.isNull(point)) { |
| | | notAddList.add(workOrder); |
| | | continue; |
| | | } |
| | | //数字前面补0 |
| | | workOrderNum++; |
| | | workOrder.setWorkOrderNo(IdUtils.workOrderNO(now, String.format("%05d", workOrderNum))); |
| | | if (Objects.nonNull(point.getUnitId())) { |
| | | workOrder.setUnitId(Math.toIntExact(point.getUnitId())); |
| | | } |
| | | if (point.getImportantTag() || point.getImportantCommandImageTag()) { |
| | | workOrder.setProcessingPeriod(Integer.valueOf(important.getConfigValue())); |
| | | } else { |
| | | workOrder.setProcessingPeriod(Integer.valueOf(normal.getConfigValue())); |
| | | } |
| | | // 保存错误类型 |
| | | for (String errorType : workOrder.getErrorTypeList()) { |
| | | WorkOrderErrorType workOrderErrorType = new WorkOrderErrorType(); |
| | |
| | | workOrderErrorType.setErrorName(errorType); |
| | | waitAddErrorTypeList.add(workOrderErrorType); |
| | | } |
| | | log.info("即将生成的工单:{}",workOrder); |
| | | } |
| | | waitAddList.removeAll(notAddList); |
| | | if (CollectionUtils.isEmpty(waitAddList)) { |
| | | return Boolean.TRUE; |
| | | } |
| | | //记录工单数 |
| | | redisCache.setCacheObject(RedisConstant.WORKORDER_NUM, workOrderNum); |
| | | redisCache.releaseLock(RedisConstant.WORKORDER_NUM_LOCK, requestId); |
| | | // 保存工单和故障类型 |
| | |
| | | log.info("传入工单总数: {},实际添加工单数:{}, 实际修改工单数:{}", total, waitAddList.size(), updateNum); |
| | | return Boolean.TRUE; |
| | | } |
| | | |
| | | /** |
| | | * 添加 |
| | | * |
| | |
| | | return Result.error("工单正在添加,请稍后再试"); |
| | | } |
| | | WorkOrder entity = WorkOrderForm.getEntityByForm(form, null); |
| | | entity.setCreateTime(DateUtils.getNowDate()); |
| | | entity.setStatus(WorkOrderStatusEnum.WAIT_DISTRIBUTE); |
| | | Date now = new Date(); |
| | | entity.setCreateTime(now); |
| | | entity.setUpdateTime(now); |
| | | entity.setWorkOrderNo(IdUtils.workOrderNO(now, String.format("%05d", workOrderNum))); |
| | | entity.setErrorType(String.join(",", form.getErrorType())); |
| | | List<WorkOrderErrorType> workOrderErrorTypes = form.getErrorType().stream().map(errorType -> new WorkOrderErrorType(entity.getWorkOrderNo(), errorType)).toList(); |
| | | workOrderErrorTypeService.getBaseMapper().insertWorkOrderErrorTypeList(workOrderErrorTypes); |
| | | if (baseMapper.insert(entity) > 0) { |
| | | return Result.ok("添加成功"); |
| | | // 查询出白名单列表 |
| | | List<String> serialNumbers = workOrderWhiteMapper.selectList().stream().map(WorkOrderWhite::getSerialNumber).collect(Collectors.toList()); |
| | | // 遍历工单列表,判断是否在白名单中 |
| | | if (serialNumbers.contains(entity.getSerialNumber())){ |
| | | return Result.error("该设备在白名单中,不能添加工单"); |
| | | }else { |
| | | entity.setCreateTime(DateUtils.getNowDate()); |
| | | entity.setStatus(WorkOrderStatusEnum.WAIT_DISTRIBUTE); |
| | | Date now = new Date(); |
| | | entity.setCreateTime(now); |
| | | entity.setUpdateTime(now); |
| | | entity.setWorkOrderNo(IdUtils.workOrderNO(now, String.format("%05d", workOrderNum))); |
| | | entity.setErrorType(String.join(",", form.getErrorType())); |
| | | List<WorkOrderErrorType> workOrderErrorTypes = form.getErrorType().stream().map(errorType -> new WorkOrderErrorType(entity.getWorkOrderNo(), errorType)).toList(); |
| | | workOrderErrorTypeService.getBaseMapper().insertWorkOrderErrorTypeList(workOrderErrorTypes); |
| | | if (baseMapper.insert(entity) > 0) { |
| | | return Result.ok("添加成功"); |
| | | } |
| | | return Result.error("添加失败"); |
| | | } |
| | | return Result.error("添加失败"); |
| | | } |
| | | |
| | | /** |
| | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Result batchAuditing(WorkOrderBatchAuditingForm form) { |
| | | // 根据故障类型获取列表 |
| | | List<WorkOrder> list = new LambdaQueryChainWrapper<>(baseMapper) |
| | | .in(WorkOrder::getStatus, WorkOrderStatusEnum.YW_HANDLE.getValue()) |
| | | .in(WorkOrder::getErrorType, form.getErrorTypes()) |
| | | .select(WorkOrder::getId, WorkOrder::getUnitId, WorkOrder::getWorkOrderNo, WorkOrder::getSerialNumber) |
| | | .list(); |
| | | //根据工单编号获取工单 |
| | | List<WorkOrder> list = baseMapper.selectByNos(form.getWorkOrderNumbers()); |
| | | if (list.isEmpty()) { |
| | | return Result.error("没有工单可以审核"); |
| | | return Result.error("没有待审核工单"); |
| | | } |
| | | List<String> workOrderNoList = list.stream().map(WorkOrder::getWorkOrderNo).collect(Collectors.toList()); |
| | | List<String> serialNumbers = list.stream().map(WorkOrder::getSerialNumber).toList(); |
| | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Result ywCondition(WorkOrderYWConditionForm form) { |
| | | |
| | | WorkOrder workOrder = baseMapper.selectById(form.getId()); |
| | | if (Objects.isNull(workOrder)) { |
| | | throw new ServiceException("工单不存在"); |
| | |
| | | workOrderYwConditionRecord.setYwProofMaterials(form.getYwProofMaterials()); |
| | | workOrderYwConditionRecord.setSysMsg(Boolean.FALSE); |
| | | workOrderYwConditionRecordMapper.insert(workOrderYwConditionRecord); |
| | | //异步获取图片 |
| | | WorkOrderServiceImpl self = applicationContext.getBean(WorkOrderServiceImpl.class); |
| | | self.getImage(workOrder); |
| | | return Result.ok("操作成功"); |
| | | } |
| | | |
| | | @Async("threadPoolTaskExecutor") |
| | | public void getImage(WorkOrder workOrder) { |
| | | List<DeviceInfo> gbDevices = new LambdaQueryChainWrapper<>(deviceInfoMapper) |
| | | .orderByDesc(DeviceInfo::getUpdateTime) |
| | | .last("limit 1") |
| | | .list(); |
| | | if (CollectionUtils.isEmpty(gbDevices)) { |
| | | return; |
| | | } |
| | | // 国标设备的编码就是取视频流的设备编码,国标设备就一个。国标设备的每一个通道代表一个摄像头,也就是设备id是取流的通道id |
| | | String frameImg = null; |
| | | try { |
| | | log.info("国标平台:{},设备编码:{},工单号:{}",gbDevices.get(0).getDeviceId(), workOrder.getSerialNumber(), workOrder.getWorkOrderNo()); |
| | | frameImg = this.getFrameImgByDevice(gbDevices.get(0).getDeviceId(), workOrder.getSerialNumber(), workOrder.getWorkOrderNo()); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | if (StringUtils.hasText(frameImg)) { |
| | | WorkOrderCheckImg img = new WorkOrderCheckImg(); |
| | | img.setWorkOrderNo(workOrder.getWorkOrderNo()); |
| | | img.setImgUrl(frameImg); |
| | | img.setCreateTime(new Date()); |
| | | workOrderCheckImgMapper.insert(img); |
| | | } |
| | | } |
| | | @Override |
| | | public List<WorkOrderYwConditionRecordVO> selectYwConditionByYwId(String workOrderNo) { |
| | | List<WorkOrderYwConditionRecordVO> ywConditionList = workOrderYwConditionRecordMapper.selectYwConditionByYwId(workOrderNo); |
| | | ywConditionList.stream().forEach(item -> { |
| | | if(item.getUserId().equals(1)){ |
| | | item.setUnitName("管理员"); |
| | | } |
| | | if (Objects.nonNull(item.getSysMsg()) && item.getSysMsg()) { |
| | | item.setUnitName("系统消息"); |
| | | } |
| | |
| | | */ |
| | | @Override |
| | | public Result removeById(String id) { |
| | | WorkOrder workOrder = baseMapper.selectById(id); |
| | | String workOrderNo = workOrder.getWorkOrderNo(); |
| | | //删除工单审核记录 |
| | | workOrderAuditingRecordMapper.delete(new QueryWrapper<WorkOrderAuditingRecord>().eq("work_order_no", workOrderNo)); |
| | | //删除工单图片记录 |
| | | workOrderCheckImgMapper.delete(new QueryWrapper<WorkOrderCheckImg>().eq("work_order_no", workOrderNo)); |
| | | //删除工单下发记录 |
| | | workOrderDistributeRecordMapper.delete(new QueryWrapper<WorkOrderDistributeRecord>().eq("work_order_no", workOrderNo)); |
| | | //删除工单故障类型 |
| | | workOrderErrorTypeMapper.delete(new QueryWrapper<WorkOrderErrorType>().eq("work_order_no", workOrderNo)); |
| | | //删除工单情况记录 |
| | | workOrderYwConditionRecordMapper.delete(new QueryWrapper<WorkOrderYwConditionRecord>().eq("work_order_no", workOrderNo)); |
| | | |
| | | if (baseMapper.deleteById(id) > 0) { |
| | | return Result.ok("删除成功"); |
| | | } |
| | |
| | | @Override |
| | | public Result page(WorkOrderQuery query) { |
| | | IPage<WorkOrderVO> page = PageUtil.getPage(query, WorkOrderVO.class); |
| | | query.setUnitId(SecurityUtils.getUnitId()); |
| | | query.setStart(DateUtils.getDayStart(query.getStart())); |
| | | query.setEnd(DateUtils.getDayEnd(query.getEnd())); |
| | | if(query.getUnitId()==null) { |
| | | query.setUnitId(SecurityUtils.getUnitId()); |
| | | } |
| | | if(query.getStart()!=null) query.setStart(DateUtils.getDayStart(query.getStart())); |
| | | if(query.getEnd()!=null) query.setEnd(DateUtils.getDayEnd(query.getEnd())); |
| | | baseMapper.page(page, query); |
| | | if (!CollectionUtils.isEmpty(page.getRecords())) { |
| | | page.getRecords().stream().forEach(item -> { |
| | | if (StringUtils.hasText(item.getErrorType())) { |
| | | item.setErrorTypeList(List.of(item.getErrorType().split(","))); |
| | | List<String> errorTypeList = new ArrayList<>(List.of(item.getErrorType().split(","))); |
| | | int index = errorTypeList.indexOf(query.getErrorTypeLabel()); |
| | | if (index != -1) { |
| | | // 保存要移动的元素 |
| | | String firstOccurrence = errorTypeList.get(index); |
| | | // 从列表中移除该元素(第一次出现的位置) |
| | | errorTypeList.remove(index); |
| | | // 将该元素添加到列表的首位 |
| | | errorTypeList.add(0, firstOccurrence); |
| | | } |
| | | // 设置更新后的列表 |
| | | item.setErrorTypeList(errorTypeList); |
| | | } |
| | | if (StringUtils.hasText(item.getImgListStr())) { |
| | | item.setImgList(List.of(item.getImgListStr().split(","))); |
| | |
| | | @Override |
| | | public Result distributePage(DistributeWorkOrderQuery query) { |
| | | IPage<WorkOrderVO> page = PageUtil.getPage(query, WorkOrderVO.class); |
| | | if(query.getStart()!=null) query.setStart(DateUtils.getDayStart(query.getStart())); |
| | | if(query.getEnd()!=null) query.setEnd(DateUtils.getDayEnd(query.getEnd())); |
| | | baseMapper.distributePage(page, query); |
| | | return Result.ok().data(page).total(page.getTotal()); |
| | | } |
| | |
| | | |
| | | |
| | | @Override |
| | | public synchronized String getFrameImgByDevice(String deviceId, String channelId, String workOrderNo) { |
| | | String url = String.format(this.rtspServer + "/api/play/start/%s/%s", deviceId, channelId); |
| | | public String getFrameImgByDevice(String deviceId, String channelId, String workOrderNo) throws Exception { |
| | | String url = String.format(this.rtspServer + "/api/play/start/img/%s/%s", deviceId, channelId); |
| | | log.info("访问路径{}",url); |
| | | String result = HttpUtils.sendGet(url); |
| | | log.error("拿到取流响应结果:" + result); |
| | | log.info("拿到取流图片响应结果:" + result); |
| | | WVPResult wvpResult = JSON.parseObject(result, WVPResult.class); |
| | | String imgUrl = null; |
| | | if (0 == wvpResult.getCode()) { |
| | | log.error("请求成功"); |
| | | JSONObject data = (JSONObject) wvpResult.getData(); |
| | | String rtspUrl = data.getString("rtsp"); // 取地址 |
| | | log.error("目标地址:" + rtspUrl); |
| | | if (StringUtils.hasText(rtspUrl)) { |
| | | try { |
| | | FFmpegFrameGrabber grabber = FFmpegFrameGrabber.createDefault(rtspUrl); |
| | | // grabber.setOption("rtsp_transport", "tcp"); // 使用tcp的方式,不然会丢包很严重 |
| | | grabber.setImageWidth(960); |
| | | grabber.setImageHeight(540); |
| | | grabber.start(); |
| | | CanvasFrame canvasFrame = new CanvasFrame("正茂");// 创建窗口 |
| | | canvasFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 设置窗口关闭程序是否也跟随关闭 |
| | | canvasFrame.setAlwaysOnTop(true); |
| | | |
| | | OpenCVFrameConverter.ToMat converter = new OpenCVFrameConverter.ToMat(); |
| | | int ex = 0; |
| | | while (true) { |
| | | if (ex > 1) { |
| | | break; |
| | | } |
| | | Frame frame = grabber.grabImage(); |
| | | canvasFrame.showImage(frame); |
| | | //程序到这里其实已经实现了预览的功能了,下面的方法就是将流保存成图片 |
| | | |
| | | //opencv_core.Mat |
| | | Mat mat = converter.convertToMat(frame); |
| | | |
| | | imgUrl = workOrderNo + "_" + IdUtils.fastSimpleUUID() + ".png"; |
| | | // 生成图片路径 |
| | | String imgPath = PlatformConfig.getProfile() + "/" + imgUrl; |
| | | System.out.println("图片保存地址:" + imgPath); |
| | | imgUrl = Constants.RESOURCE_PREFIX + "/" + imgUrl; |
| | | |
| | | opencv_imgcodecs.imwrite(imgPath, mat); |
| | | |
| | | ex++; |
| | | try { |
| | | Thread.sleep(1000); |
| | | } |
| | | catch (InterruptedException e) |
| | | { |
| | | e.printStackTrace(); |
| | | } // 1000毫秒刷新一次圖像 |
| | | } |
| | | grabber.stop(); // 停止捕获 |
| | | grabber.release(); // 释放资源 |
| | | } catch (IOException e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | if(wvpResult.getCode() == 0) { |
| | | Object imgUrl = (Object) wvpResult.getData(); |
| | | imgUrl = Objects.isNull(imgUrl) ? "" : imgUrl; |
| | | log.info("拿到取流图片:" + imgUrl); |
| | | return (String) imgUrl; |
| | | } |
| | | return imgUrl; |
| | | return null; |
| | | // WVPResult wvpResult = JSON.parseObject(result, WVPResult.class); |
| | | // String imgUrl = null; |
| | | // if (wvpResult.getCode() == 0) { |
| | | // JSONObject data = (JSONObject) wvpResult.getData(); |
| | | // String rtspUrl = data.getString("fmp4"); // 取mp4地址 |
| | | // if (StringUtils.hasText(rtspUrl)) { |
| | | // System.out.println("目标地址:" + rtspUrl); |
| | | // FFmpegFrameGrabber grabber = null; |
| | | // try { |
| | | // grabber = new FFmpegFrameGrabber(rtspUrl); |
| | | //// grabber.setOption("rtsp_transport", "tcp"); // 使用tcp的方式,不然会丢包很严重 |
| | | //// grabber.setVideoOption("probesize", "10000"); // 设置捕获分析的最大字节 |
| | | // grabber.start(); |
| | | // Frame frame = grabber.grabImage(); // 直接捕获一帧 |
| | | // if (frame != null) { |
| | | // System.out.println("成功捕获一帧"); |
| | | // // 将Frame转换为Mat |
| | | // OpenCVFrameConverter.ToMat converter = new OpenCVFrameConverter.ToMat(); |
| | | // Mat mat = converter.convertToMat(frame); |
| | | // |
| | | // imgUrl = workOrderNo + "_" + IdUtils.fastSimpleUUID() + ".png"; |
| | | // // 生成图片路径 |
| | | // String imgPath = PlatformConfig.getProfile() + "/" + imgUrl; |
| | | // System.out.println("图片保存地址:" + imgPath); |
| | | // imgUrl = Constants.RESOURCE_PREFIX + "/" + imgUrl; |
| | | // // 保存图片 |
| | | // opencv_imgcodecs.imwrite(imgPath, mat); |
| | | // } else { |
| | | // System.out.println("未捕获到帧"); |
| | | // } |
| | | // } catch (FrameGrabber.Exception e) { |
| | | // e.printStackTrace(); |
| | | // } finally { |
| | | // if (grabber != null) { |
| | | // try { |
| | | // grabber.stop(); // 停止捕获 |
| | | // } catch (FrameGrabber.Exception e) { |
| | | // e.printStackTrace(); |
| | | // } |
| | | // } |
| | | // } |
| | | // } |
| | | // } else { |
| | | // System.out.println("请求失败,错误码:" + wvpResult.getCode() + "--" + wvpResult.getMsg()); |
| | | // } |
| | | // System.out.println("图片URL:" + imgUrl); |
| | | // return imgUrl; |
| | | } |
| | | |
| | | @Override |
| | | public void saveFrameImgByDevice(String deviceId, String channelId, String workOrderNo) { |
| | | public void saveFrameImgByDevice (String deviceId, String channelId, String workOrderNo){ |
| | | String url = String.format(this.rtspServer + "/api/play/start/%s/%s", deviceId, channelId); |
| | | String result = HttpUtils.sendGet(url); |
| | | WVPResult wvpResult = JSON.parseObject(result, WVPResult.class); |
| | | String imgUrl = null; |
| | | if (wvpResult.getCode() == 0) { |
| | | JSONObject data = (JSONObject) wvpResult.getData(); |
| | | String rtspUrl = data.getString("fmp4"); // 取mp4地址 |
| | | String rtspUrl = data.getString("rtsp"); // 取mp4地址 |
| | | if (StringUtils.hasText(rtspUrl)) { |
| | | System.out.println("目标地址:" + rtspUrl); |
| | | FFmpegFrameGrabber grabber = null; |
| | |
| | | } |
| | | |
| | | @Override |
| | | public List<DeviceInfoVO> hasErrorWorkOrderList(Date start, Date end) { |
| | | public List<DeviceInfoVO> hasErrorWorkOrderList (Date start, Date end){ |
| | | List<DeviceInfoVO> list = baseMapper.hasErrorWorkOrderList(start, end); |
| | | return list; |
| | | } |
| | | |
| | | @Override |
| | | public void updateImgById(Integer workOrderId, String imgPath) { |
| | | public void updateImgById (Integer workOrderId, String imgPath){ |
| | | new LambdaUpdateChainWrapper<>(baseMapper) |
| | | .eq(WorkOrder::getId, workOrderId) |
| | | .set(WorkOrder::getYwCheckResult, imgPath) |
| | |
| | | } |
| | | |
| | | @Override |
| | | public Result processImg(String workOrderNo) { |
| | | public Result processImg (String workOrderNo){ |
| | | WorkOrder workOrder = new LambdaQueryChainWrapper<>(baseMapper) |
| | | .eq(WorkOrder::getWorkOrderNo, workOrderNo) |
| | | .one(); |
| | |
| | | } |
| | | |
| | | @Override |
| | | public Result detailByNo(String workOrderNo) { |
| | | public Result detailByNo (String workOrderNo){ |
| | | WorkOrderDetailVO workOrder = baseMapper.detailByNo(workOrderNo); |
| | | // 是否报备 |
| | | boolean hasReport = new LambdaQueryChainWrapper<>(reportMapper) |
| | |
| | | } |
| | | |
| | | @Override |
| | | public List<WorkOrderVO> export(WorkOrderExportQuery query) { |
| | | query.setUnitId(SecurityUtils.getUnitId()); |
| | | SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); |
| | | if (query.getStart() == null) { |
| | | query.setStart(format.format(DateUtils.getDayStart(new Date()))); |
| | | } else { |
| | | query.setStart(query.getStart() + " 00:00:00"); |
| | | public List<WorkOrderVO> export (WorkOrderExportQuery query){ |
| | | if(query.getUnitId()==null) { |
| | | query.setUnitId(SecurityUtils.getUnitId()); |
| | | } |
| | | if (query.getEnd() == null) { |
| | | query.setStart(format.format(DateUtils.getDayEnd(new Date()))); |
| | | } else { |
| | | query.setEnd(query.getEnd() + " 23:59:59"); |
| | | if (query.getStart() != null) query.setStart(query.getStart() + " 00:00:00"); |
| | | if (query.getEnd() != null) query.setEnd(query.getEnd() + " 23:59:59"); |
| | | |
| | | return baseMapper.export(query); |
| | | } |
| | | |
| | | /** |
| | | * 工单白名单列表 |
| | | * |
| | | * @param query 查询 |
| | | * @return {@link List }<{@link WorkOrderWhite }> |
| | | * @author |
| | | */ |
| | | @Override |
| | | public Result selectWorkOrderWhiteList(WorkOrderWhiteQuery query) { |
| | | IPage<WorkOrderWhite> page = PageUtil.getPage(query, WorkOrderWhite.class); |
| | | workOrderWhiteMapper.page(page, query); |
| | | return Result.ok().data(page.getRecords()).total(page.getTotal()); |
| | | } |
| | | |
| | | /** |
| | | * 添加工单白名单 |
| | | * |
| | | * @param workOrderWhite 白色工单 |
| | | * @return {@link Result } |
| | | * @author |
| | | */ |
| | | @Override |
| | | public Result addWorkOrderWhite(WorkOrderWhite workOrderWhite) { |
| | | // 通过设备编码查询设备信息 |
| | | YwPoint ywPoint = ywPointService.selectBySerialNumber(workOrderWhite.getSerialNumber()); |
| | | // 新增白名单设备记录 |
| | | if (ywPoint == null){ |
| | | return Result.error("设备不存在"); |
| | | } |
| | | // 检查是否已经存在该白名单 |
| | | WorkOrderWhite flag = workOrderWhiteMapper.selectBySerialNumber(workOrderWhite.getSerialNumber()); |
| | | if (flag != null) { |
| | | return Result.error("该设备已存在白名单"); |
| | | } else { |
| | | workOrderWhite.setPointName(ywPoint.getPointName()); |
| | | workOrderWhite.setCreateBy(SecurityUtils.getUsername()); |
| | | workOrderWhiteMapper.insert(workOrderWhite); |
| | | return Result.ok(); |
| | | } |
| | | } |
| | | |
| | | List<WorkOrderVO> export = baseMapper.export(query); |
| | | /** |
| | | * 批量删除工单白名单 |
| | | * |
| | | * @param ids ids |
| | | * @author |
| | | */ |
| | | @Override |
| | | public Result batchDeleteWorkOrderWhite(List<String> ids) { |
| | | workOrderWhiteMapper.batchDelete(ids); |
| | | return Result.ok(); |
| | | } |
| | | |
| | | System.out.println(export); |
| | | return export; |
| | | /** |
| | | * 批量导入白名单 |
| | | * |
| | | * @param dataList 数据列表 |
| | | * @author |
| | | */ |
| | | @Override |
| | | public void batchImportWhite(List<PointExport> dataList) { |
| | | // 获得所有需要新增的白名单对象 |
| | | List<WorkOrderWhite> whitelist = dataList.stream().map(pointExport -> |
| | | new WorkOrderWhite(pointExport.getSerialNumber(), pointExport.getPointName(), SecurityUtils.getUsername())) |
| | | .collect(Collectors.toList()); |
| | | // 获得所有已存在的白名单设备编码 |
| | | List<String> serialNumbers = workOrderWhiteMapper.selectList().stream().map(WorkOrderWhite::getSerialNumber).collect(Collectors.toList()); |
| | | // 筛选出新增、修改的白名单对象 |
| | | List<WorkOrderWhite> updateWhiteList = whitelist.stream().filter(white -> serialNumbers.contains(white.getSerialNumber())).collect(Collectors.toList()); |
| | | List<WorkOrderWhite> insertWhiteList = whitelist.stream().filter(white ->!serialNumbers.contains(white.getSerialNumber())).collect(Collectors.toList()); |
| | | // 新增/修改白名单设备记录 |
| | | updateWhiteList.stream().forEach(white -> workOrderWhiteMapper.updateBySerialNumber(white)); |
| | | insertWhiteList.stream().forEach(white -> workOrderWhiteMapper.insert(white)); |
| | | } |
| | | |
| | | /** |
| | | * 检测工单按钮 |
| | | * @param workOrderNo |
| | | * @return |
| | | */ |
| | | @Override |
| | | public Result checkImage(String workOrderNo,String serialNumber) { |
| | | // 查出国标设备,就一条数据 |
| | | List<DeviceInfo> gbDevices = new LambdaQueryChainWrapper<>(deviceInfoMapper) |
| | | .orderByDesc(DeviceInfo::getUpdateTime) |
| | | .last("limit 1") |
| | | .list(); |
| | | if (!CollectionUtils.isEmpty(gbDevices)) { |
| | | try { |
| | | String imgUrl = this.getFrameImgByDevice(gbDevices.get(0).getDeviceId(), serialNumber,workOrderNo); |
| | | if (StringUtils.hasText(imgUrl)) { |
| | | WorkOrderCheckImg img = new WorkOrderCheckImg(); |
| | | img.setWorkOrderNo(workOrderNo); |
| | | img.setImgUrl(imgUrl); |
| | | img.setCreateTime(new Date()); |
| | | workOrderCheckImgMapper.insert(img); |
| | | } |
| | | return Result.ok().data(imgUrl); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | return Result.ok(); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Result batchDeleteWorkOrder(List<String> workOrderNos) { |
| | | if(!CollectionUtils.isEmpty(workOrderNos)) { |
| | | //删除工单审核记录 |
| | | workOrderAuditingRecordMapper.delete(new QueryWrapper<WorkOrderAuditingRecord>().in("work_order_no", workOrderNos)); |
| | | //删除工单图片记录 |
| | | workOrderCheckImgMapper.delete(new QueryWrapper<WorkOrderCheckImg>().in("work_order_no", workOrderNos)); |
| | | //删除工单下发记录 |
| | | workOrderDistributeRecordMapper.delete(new QueryWrapper<WorkOrderDistributeRecord>().in("work_order_no", workOrderNos)); |
| | | //删除工单故障类型 |
| | | workOrderErrorTypeMapper.delete(new QueryWrapper<WorkOrderErrorType>().in("work_order_no", workOrderNos)); |
| | | //删除工单情况记录 |
| | | workOrderYwConditionRecordMapper.delete(new QueryWrapper<WorkOrderYwConditionRecord>().in("work_order_no", workOrderNos)); |
| | | //删除工单 |
| | | this.baseMapper.delete(new QueryWrapper<WorkOrder>().in("work_order_no", workOrderNos)); |
| | | } |
| | | return Result.ok(); |
| | | } |
| | | |
| | | @Override |
| | | public Result errorAll() { |
| | | List<CascadeOption> results = new ArrayList<>(); |
| | | CascadeOption video = new CascadeOption(); |
| | | video.setLabel("视频"); |
| | | video.setValue("VIDEO"); |
| | | List<ErrorType> videoErr = ErrorType.getErrorTypesByCategory("VIDEO"); |
| | | List<ErrorType> videoErr1 = ErrorType.getErrorTypesByCategory("COMMON"); |
| | | videoErr.addAll(videoErr1); |
| | | List<CascadeOption> videoChildren = videoErr.stream().map(item -> CascadeOption.builder() |
| | | .value(item.getValue()) |
| | | .label(item.getDesc()) |
| | | .build()).collect(Collectors.toList()); |
| | | video.setChildren(videoChildren); |
| | | |
| | | CascadeOption car = new CascadeOption(); |
| | | car.setLabel("车辆"); |
| | | car.setValue("CAR"); |
| | | List<ErrorType> carErr = ErrorType.getErrorTypesByCategory("CAR"); |
| | | List<ErrorType> carErr1 = ErrorType.getErrorTypesByCategory("COMMON"); |
| | | List<ErrorType> carErr2 = ErrorType.getErrorTypesByCategory("CARORFACE"); |
| | | carErr.addAll(carErr1); |
| | | carErr.addAll(carErr2); |
| | | List<CascadeOption> carChildren = carErr.stream().map(item -> CascadeOption.builder() |
| | | .value(item.getValue()) |
| | | .label(item.getDesc()) |
| | | .build()).collect(Collectors.toList()); |
| | | car.setChildren(carChildren); |
| | | |
| | | CascadeOption face = new CascadeOption(); |
| | | face.setLabel("人脸"); |
| | | face.setValue("FACE"); |
| | | List<ErrorType> faceErr = ErrorType.getErrorTypesByCategory("FACE"); |
| | | List<ErrorType> faceErr1 = ErrorType.getErrorTypesByCategory("COMMON"); |
| | | List<ErrorType> faceErr2 = ErrorType.getErrorTypesByCategory("CARORFACE"); |
| | | faceErr.addAll(faceErr1); |
| | | faceErr.addAll(faceErr2); |
| | | List<CascadeOption> faceChildren = faceErr.stream().map(item -> CascadeOption.builder() |
| | | .value(item.getValue()) |
| | | .label(item.getDesc()) |
| | | .build()).collect(Collectors.toList()); |
| | | face.setChildren(faceChildren); |
| | | |
| | | results.add(video); |
| | | results.add(car); |
| | | results.add(face); |
| | | return Result.ok().data(results); |
| | | } |
| | | } |