| | |
| | | import com.ycl.platform.wvp.WVPResult; |
| | | import com.ycl.system.Result; |
| | | import com.ycl.system.domain.SysConfig; |
| | | import com.ycl.system.entity.SysDictData; |
| | | import com.ycl.system.mapper.SysConfigMapper; |
| | | import com.ycl.system.mapper.SysDictDataMapper; |
| | | import com.ycl.system.mapper.SysDictTypeMapper; |
| | | import com.ycl.system.model.LoginUser; |
| | | import com.ycl.system.page.PageUtil; |
| | | import com.ycl.utils.DateUtils; |
| | |
| | | import com.ycl.utils.http.HttpUtils; |
| | | import com.ycl.utils.redis.RedisCache; |
| | | import com.ycl.utils.uuid.IdUtils; |
| | | import enumeration.general.*; |
| | | import enumeration.general.NotifyTypeEnum; |
| | | import enumeration.general.UrgentLevelEnum; |
| | | import enumeration.general.WorkOrderDistributeWayEnum; |
| | | import enumeration.general.WorkOrderStatusEnum; |
| | | import lombok.RequiredArgsConstructor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.apache.commons.lang3.ObjectUtils; |
| | | import org.bytedeco.javacv.FFmpegFrameGrabber; |
| | | import org.bytedeco.javacv.Frame; |
| | | import org.bytedeco.javacv.Java2DFrameConverter; |
| | | import org.bytedeco.javacv.*; |
| | | import org.bytedeco.opencv.global.opencv_imgcodecs; |
| | | import org.bytedeco.opencv.opencv_core.Mat; |
| | | import org.springframework.beans.BeanUtils; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | |
| | | import org.springframework.util.StringUtils; |
| | | |
| | | import javax.imageio.ImageIO; |
| | | import javax.swing.*; |
| | | import java.awt.image.BufferedImage; |
| | | import java.io.File; |
| | | import java.io.IOException; |
| | |
| | | List<WorkOrderErrorType> waitAddErrorTypeList = new ArrayList<>(48); |
| | | Integer updateNum = 0; |
| | | Date now = new Date(); |
| | | // 因故障类型不一致而要更新状态的工单 |
| | | List<WorkOrder> willUpdateStatusWorkOrderList = new ArrayList<>(48); |
| | | // 更改工单类型而要增加的系统运维处理信息 |
| | | List<WorkOrderYwConditionRecord> willAddMsg = new ArrayList<>(48); |
| | | // 即将要添加的错误类型 |
| | | List<WorkOrderErrorType> willAddErrorType = new ArrayList<>(96); |
| | | for (WorkOrder workOrder : workOrderList) { |
| | | WorkOrder databaseWorkOrder = mapping.get(workOrder.getSerialNumber()); |
| | | if (Objects.nonNull(databaseWorkOrder)) { |
| | |
| | | workOrderErrorType.setCreateTime(now); |
| | | workOrderErrorType.setUpdateTime(now); |
| | | workOrderErrorType.setErrorName(errorType); |
| | | workOrderErrorTypeService.save(workOrderErrorType); |
| | | willAddErrorType.add(workOrderErrorType); |
| | | } |
| | | } |
| | | databaseWorkOrder.setStatus(WorkOrderStatusEnum.DISTRIBUTED); |
| | | databaseWorkOrder.setUpdateTime(now); |
| | | baseMapper.updateById(databaseWorkOrder); |
| | | willUpdateStatusWorkOrderList.add(databaseWorkOrder); |
| | | updateNum++; |
| | | // 同时新增一个运维处理信息,表明此工单被调整 |
| | | WorkOrderYwConditionRecord ywRecord = new WorkOrderYwConditionRecord(); |
| | | ywRecord.setWorkOrderId(databaseWorkOrder.getId()); |
| | | ywRecord.setWorkOrderNo(databaseWorkOrder.getWorkOrderNo()); |
| | | ywRecord.setCommitUser(1); |
| | | ywRecord.setYwCondition("故障类型更新,工单状态调整为待处理"); |
| | | ywRecord.setCreateTime(new Date()); |
| | | workOrderYwConditionRecordMapper.insert(ywRecord); |
| | | ywRecord.setSysMsg(Boolean.TRUE); |
| | | willAddMsg.add(ywRecord); |
| | | } |
| | | } else { |
| | | workOrder.setCreateTime(new Date()); |
| | |
| | | // } |
| | | waitAddList.add(workOrder); |
| | | } |
| | | } |
| | | if (willAddErrorType.size() > 0) { |
| | | workOrderErrorTypeService.getBaseMapper().addMany(willAddErrorType); |
| | | } |
| | | if (willAddMsg.size() > 0) { |
| | | workOrderYwConditionRecordMapper.insertMany(willAddMsg); |
| | | } |
| | | if (willUpdateStatusWorkOrderList.size() > 0) { |
| | | this.baseMapper.updateMany(willUpdateStatusWorkOrderList); |
| | | } |
| | | if (CollectionUtils.isEmpty(waitAddList)) { |
| | | return Boolean.TRUE; |
| | |
| | | notAddList.add(workOrder); |
| | | continue; |
| | | } |
| | | workOrder.setWorkOrderNo(IdUtils.timeAddRandomNO(5)); |
| | | workOrder.setWorkOrderNo(IdUtils.randomNO()); |
| | | if (Objects.nonNull(point.getUnitId())) { |
| | | workOrder.setUnitId(Math.toIntExact(point.getUnitId())); |
| | | } |
| | |
| | | } |
| | | // 如果是直接下发,添加下发记录 |
| | | if (WorkOrderStatusEnum.DISTRIBUTED.equals(waitAddList.get(0).getStatus())) { |
| | | ArrayList<String> list = new ArrayList<>(); |
| | | List<WorkOrderDistributeRecord> distributedRecordList = waitAddList.stream().map(item -> { |
| | | list.add(item.getSerialNumber()); |
| | | WorkOrderDistributeRecord workOrderDistributeRecord = new WorkOrderDistributeRecord(); |
| | | workOrderDistributeRecord.setWorkOrderNo(item.getWorkOrderNo()); |
| | | workOrderDistributeRecord.setDistributeWay(WorkOrderDistributeWayEnum.DIRECT_DISTRIBUTE); |
| | |
| | | return workOrderDistributeRecord; |
| | | }).collect(Collectors.toList()); |
| | | workOrderDistributeRecordMapper.insertBatch(distributedRecordList); |
| | | // 同步点位状态 |
| | | ywPointService.updateRecovery(list, 1); |
| | | } |
| | | log.info("传入工单总数: {},实际添加工单数:{}, 实际修改工单数:{}", total, waitAddList.size(), updateNum); |
| | | return Boolean.TRUE; |
| | |
| | | @Override |
| | | public Result add(WorkOrderForm form) { |
| | | WorkOrder entity = WorkOrderForm.getEntityByForm(form, null); |
| | | entity.setWorkOrderNo(IdUtils.timeAddRandomNO(5)); |
| | | entity.setWorkOrderNo(IdUtils.randomNO()); |
| | | entity.setCreateTime(DateUtils.getNowDate()); |
| | | entity.setStatus(WorkOrderStatusEnum.WAIT_DISTRIBUTE); |
| | | Date now = new Date(); |
| | |
| | | baseMapper.updateById(workOrder); |
| | | // 添加一条审核记录 |
| | | WorkOrderAuditingRecord workOrderAuditingRecord = new WorkOrderAuditingRecord(); |
| | | workOrderAuditingRecord.setWorkOrderId(workOrder.getId()); |
| | | workOrderAuditingRecord.setWorkOrderNo(workOrder.getWorkOrderNo()); |
| | | workOrderAuditingRecord.setAuditingUser(SecurityUtils.getLoginUser().getUserId().intValue()); |
| | | workOrderAuditingRecord.setResult(form.getAuditingResult().getDesc()); |
| | | workOrderAuditingRecord.setRemark(form.getAuditingRemark()); |
| | |
| | | notifyService.save(notify); |
| | | // 同步点位状态 |
| | | if (form.getAuditingResult() == WorkOrderStatusEnum.AUDITING_SUCCESS) { |
| | | ywPointService.updateRecovery(Arrays.asList(workOrder.getSerialNumber()), 0); |
| | | ywPointService.updateRecovery(Collections.singletonList(workOrder.getSerialNumber()), 0); |
| | | } |
| | | return Result.ok("操作成功"); |
| | | } |
| | |
| | | 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) |
| | | .select(WorkOrder::getId, WorkOrder::getUnitId, WorkOrder::getWorkOrderNo, WorkOrder::getSerialNumber) |
| | | .list(); |
| | | if (list.isEmpty()) { |
| | | return Result.error("没有工单可以审核"); |
| | | } |
| | | List<Integer> ids = list.stream().map(WorkOrder::getId).collect(Collectors.toList()); |
| | | List<String> workOrderNoList = list.stream().map(WorkOrder::getWorkOrderNo).collect(Collectors.toList()); |
| | | List<String> serialNumbers = list.stream().map(WorkOrder::getSerialNumber).toList(); |
| | | // 工单状态 |
| | | LambdaUpdateWrapper<WorkOrder> lambdaUpdateWrapper = new LambdaUpdateWrapper<>(); |
| | | lambdaUpdateWrapper.in(WorkOrder::getId, ids); |
| | | lambdaUpdateWrapper.in(WorkOrder::getWorkOrderNo, workOrderNoList); |
| | | lambdaUpdateWrapper.set(WorkOrder::getStatus, form.getAuditingResult()); |
| | | baseMapper.update(lambdaUpdateWrapper); |
| | | // 添加多条审核记录 |
| | | List<WorkOrderAuditingRecord> workOrderAuditingRecords = new ArrayList<>(); |
| | | for (Integer id : ids) { |
| | | for (String workOrderNo : workOrderNoList) { |
| | | WorkOrderAuditingRecord workOrderAuditingRecord = new WorkOrderAuditingRecord(); |
| | | workOrderAuditingRecord.setWorkOrderId(id); |
| | | workOrderAuditingRecord.setWorkOrderNo(workOrderNo); |
| | | workOrderAuditingRecord.setAuditingUser(SecurityUtils.getLoginUser().getUserId().intValue()); |
| | | workOrderAuditingRecord.setResult(form.getAuditingResult().getDesc()); |
| | | workOrderAuditingRecord.setRemark(form.getAuditingRemark()); |
| | |
| | | UrgentLevelEnum.WARNING, |
| | | workOrder.getWorkOrderNo()); |
| | | notifies.add(notify); |
| | | } |
| | | // 同步点位状态 |
| | | if (form.getAuditingResult() == WorkOrderStatusEnum.AUDITING_SUCCESS) { |
| | | ywPointService.updateRecovery(serialNumbers, 0); |
| | | } |
| | | notifyService.saveBatch(notifies); |
| | | return Result.ok("操作成功"); |
| | |
| | | baseMapper.updateById(workOrder); |
| | | // 添加一条运维情况记录 |
| | | WorkOrderYwConditionRecord workOrderYwConditionRecord = new WorkOrderYwConditionRecord(); |
| | | workOrderYwConditionRecord.setWorkOrderId(workOrder.getId()); |
| | | workOrderYwConditionRecord.setWorkOrderNo(workOrder.getWorkOrderNo()); |
| | | workOrderYwConditionRecord.setCommitUser(SecurityUtils.getLoginUser().getUserId().intValue()); |
| | | workOrderYwConditionRecord.setYwCondition(form.getYwCondition()); |
| | | workOrderYwConditionRecord.setYwProofMaterials(form.getYwProofMaterials()); |
| | |
| | | } |
| | | |
| | | @Override |
| | | public Result selectYwConditionByYwId(Integer id) { |
| | | List<WorkOrderYwConditionRecordVO> ywConditionList = workOrderYwConditionRecordMapper.selectYwConditionByYwId(id); |
| | | public Result selectYwConditionByYwId(String workOrderNo) { |
| | | List<WorkOrderYwConditionRecordVO> ywConditionList = workOrderYwConditionRecordMapper.selectYwConditionByYwId(workOrderNo); |
| | | ywConditionList.stream().forEach(item -> { |
| | | if (Objects.nonNull(item.getSysMsg()) && item.getSysMsg()) { |
| | | item.setCommitUserName("系统消息"); |
| | |
| | | } |
| | | |
| | | @Override |
| | | public Result selectYwAuditingListByYwId(String id) { |
| | | public Result selectYwAuditingListByYwId(String workOrderNo) { |
| | | return Result.ok().data( |
| | | new LambdaQueryChainWrapper<>(workOrderAuditingRecordMapper) |
| | | .eq(WorkOrderAuditingRecord::getWorkOrderId, id) |
| | | .eq(WorkOrderAuditingRecord::getWorkOrderNo, workOrderNo) |
| | | .orderByAsc(WorkOrderAuditingRecord::getCreateTime) |
| | | .list()); |
| | | } |
| | |
| | | public Result page(WorkOrderQuery query) { |
| | | IPage<WorkOrderVO> page = PageUtil.getPage(query, WorkOrderVO.class); |
| | | 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(","))); |
| | | } |
| | | }); |
| | | } |
| | | return Result.ok().data(page.getRecords()).total(page.getTotal()); |
| | | } |
| | | |
| | |
| | | |
| | | // 查询符合条件的工单 |
| | | List<WorkOrder> list = new LambdaQueryChainWrapper<>(baseMapper) |
| | | .select(WorkOrder::getSerialNumber, WorkOrder::getSerialNumber) |
| | | .select(WorkOrder::getSerialNumber, WorkOrder::getWorkOrderNo) |
| | | .eq(WorkOrder::getStatus, WorkOrderStatusEnum.WAIT_DISTRIBUTE) |
| | | .eq(Objects.nonNull(data.getUnitId()), WorkOrder::getUnitId, data.getUnitId()) |
| | | .eq(WorkOrder::getErrorType, data.getErrorType()) |
| | |
| | | query.setWorkOrderNOList(new LambdaQueryChainWrapper<>(baseMapper) |
| | | .eq(WorkOrder::getStatus, WorkOrderStatusEnum.WAIT_DISTRIBUTE) |
| | | .eq(Objects.nonNull(query.getUnitId()), WorkOrder::getUnitId, query.getUnitId()) |
| | | .select(WorkOrder::getId) |
| | | .select(WorkOrder::getWorkOrderNo) |
| | | .list() |
| | | .stream() |
| | | .map(WorkOrder::getWorkOrderNo) |
| | |
| | | .update(); |
| | | addDistributeRecord(query.getWorkOrderNOList(), distributeWayEnum); |
| | | // 同步点位状态 |
| | | List<String> serialNumberList = new LambdaQueryChainWrapper<>(baseMapper).select(WorkOrder::getSerialNumber).in(WorkOrder::getId, query.getWorkOrderNOList()).list().stream().map(WorkOrder::getSerialNumber).toList(); |
| | | List<String> serialNumberList = new LambdaQueryChainWrapper<>(baseMapper).select(WorkOrder::getSerialNumber).in(WorkOrder::getWorkOrderNo, query.getWorkOrderNOList()).list().stream().map(WorkOrder::getSerialNumber).toList(); |
| | | ywPointService.updateRecovery(serialNumberList, 1); |
| | | return Result.ok("成功下发" + query.getWorkOrderNOList().size() + "条工单"); |
| | | } catch (Exception e) { |
| | |
| | | |
| | | @Override |
| | | public String getFrameImgByDevice(String deviceId, String channelId) { |
| | | String url = String.format(this.rtspServer + "/start/%s/%s", deviceId, channelId); |
| | | String url = String.format(this.rtspServer + "/api/play/start/%s/%s", deviceId, channelId); |
| | | String result = HttpUtils.sendGet(url); |
| | | log.error("拿到取流响应结果:" + result); |
| | | WVPResult wvpResult = JSON.parseObject(result, WVPResult.class); |
| | | if (0 == wvpResult.getCode()) { |
| | | log.error("请求成功"); |
| | | StreamContent data = (StreamContent) wvpResult.getData(); |
| | | String rtspUrl = data.getRtsp(); |
| | | log.error("目标地址:" + rtspUrl); |
| | | if (StringUtils.hasText(rtspUrl)) { |
| | | try { |
| | | // 创建FFmpegFrameGrabber对象 |
| | | FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(rtspUrl); |
| | | grabber.start(); // 开始捕获 |
| | | 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); |
| | | |
| | | Frame frame; |
| | | if ((frame = grabber.grabFrame()) != null) { |
| | | // 将帧转换为图片 |
| | | Java2DFrameConverter converter = new Java2DFrameConverter(); |
| | | BufferedImage image = converter.convert(frame); |
| | | File outputfile = new File(serverConfig.getUrl() + PlatformConfig.getUploadPath() + deviceId + IdUtils.fastSimpleUUID() + ".png"); |
| | | ImageIO.write(image, "png", outputfile); |
| | | String imgPath = outputfile.getAbsolutePath(); |
| | | System.out.println("Saved " + imgPath); |
| | | return imgPath; |
| | | OpenCVFrameConverter.ToMat converter = new OpenCVFrameConverter.ToMat(); |
| | | int ex = 0; |
| | | String imgPath = null; |
| | | while (true) { |
| | | if (ex > 1) { |
| | | break; |
| | | } |
| | | Frame frame = grabber.grabImage(); |
| | | canvasFrame.showImage(frame); |
| | | //程序到这里其实已经实现了预览的功能了,下面的方法就是将流保存成图片 |
| | | |
| | | //opencv_core.Mat |
| | | Mat mat = converter.convertToMat(frame); |
| | | imgPath = serverConfig.getUrl() + PlatformConfig.getUploadPath() + deviceId + IdUtils.fastSimpleUUID() + ".png"; |
| | | opencv_imgcodecs.imwrite(imgPath, mat); |
| | | |
| | | ex++; |
| | | try { |
| | | Thread.sleep(1000); |
| | | } |
| | | catch (InterruptedException e) |
| | | { |
| | | e.printStackTrace(); |
| | | } // 1000毫秒刷新一次圖像 |
| | | } |
| | | grabber.stop(); // 停止捕获 |
| | | grabber.release(); // 释放资源 |
| | | return imgPath; |
| | | } catch (IOException e) { |
| | | e.printStackTrace(); |
| | | } |