From eeee39c3ca0cbbb3d24e30ec9f9abe731367bb6e Mon Sep 17 00:00:00 2001 From: xiangpei <xiangpei@timesnew.cn> Date: 星期三, 21 八月 2024 16:34:08 +0800 Subject: [PATCH] 平台离线定时任务查询平台列表方式改为数据库 --- ycl-server/src/main/java/com/ycl/platform/service/impl/WorkOrderServiceImpl.java | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 107 insertions(+), 2 deletions(-) diff --git a/ycl-server/src/main/java/com/ycl/platform/service/impl/WorkOrderServiceImpl.java b/ycl-server/src/main/java/com/ycl/platform/service/impl/WorkOrderServiceImpl.java index 3899c27..13a982c 100644 --- a/ycl-server/src/main/java/com/ycl/platform/service/impl/WorkOrderServiceImpl.java +++ b/ycl-server/src/main/java/com/ycl/platform/service/impl/WorkOrderServiceImpl.java @@ -1,14 +1,18 @@ package com.ycl.platform.service.impl; +import com.alibaba.fastjson2.JSON; 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.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ycl.config.PlatformConfig; +import com.ycl.config.ServerConfig; import com.ycl.exception.ServiceException; import com.ycl.platform.domain.entity.*; import com.ycl.platform.domain.form.*; import com.ycl.platform.domain.query.*; +import com.ycl.platform.domain.vo.DeviceInfoVO; import com.ycl.platform.domain.vo.DistributeWorkOrderVO; import com.ycl.platform.domain.vo.WorkOrderVO; import com.ycl.platform.domain.vo.WorkOrderYwConditionRecordVO; @@ -20,6 +24,8 @@ import com.ycl.platform.service.WorkOrderAuditingRecordService; import com.ycl.platform.service.WorkOrderService; import com.ycl.platform.service.YwPointService; +import com.ycl.platform.wvp.StreamContent; +import com.ycl.platform.wvp.WVPResult; import com.ycl.system.Result; import com.ycl.system.domain.SysConfig; import com.ycl.system.mapper.SysConfigMapper; @@ -27,20 +33,29 @@ import com.ycl.system.page.PageUtil; import com.ycl.utils.DateUtils; import com.ycl.utils.SecurityUtils; +import com.ycl.utils.http.HttpUtils; import com.ycl.utils.redis.RedisCache; import com.ycl.utils.uuid.IdUtils; import enumeration.general.*; 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.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; 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 javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; import java.time.LocalDateTime; import java.time.ZoneId; import java.util.*; @@ -66,6 +81,11 @@ private final WorkOrderDistributeRecordMapper workOrderDistributeRecordMapper; private final TMonitorMapper monitorMapper; private final SysConfigMapper configMapper; + private final ServerConfig serverConfig; + private final ReportMapper reportMapper; + + @Value("${rtsp.server:http://127.0.0.1:7788}") + private String rtspServer; private final String DISTRIBUTE_LOCK_KEY = "distributeLock"; private final static String IMPORTANT = "important"; @@ -80,6 +100,9 @@ workOrderList.stream().filter(item -> { return StringUtils.hasText(item.getSerialNumber()) && Objects.nonNull(item.getStatus()) && StringUtils.hasText(item.getErrorType()); }); + if (CollectionUtils.isEmpty(workOrderList)) { + return Boolean.TRUE; + } List<String> serialNumberList = workOrderList.stream().map(WorkOrder::getSerialNumber).collect(Collectors.toList()); // 鏌ュ嚭鏁版嵁搴撲腑鍥芥爣鐮佸搴旂殑鏈畬鎴愮殑宸ュ崟 List<WorkOrder> inDatabaseWorkOrderList = new LambdaQueryChainWrapper<>(baseMapper) @@ -90,6 +113,7 @@ Map<String, WorkOrder> mapping = inDatabaseWorkOrderList.stream().collect((Collectors.toMap(WorkOrder::getSerialNumber, workOrder -> workOrder))); List<WorkOrder> waitAddList = new ArrayList<>(48); Integer updateNum = 0; + for (WorkOrder workOrder : workOrderList) { WorkOrder databaseWorkOrder = mapping.get(workOrder.getSerialNumber()); if (Objects.nonNull(databaseWorkOrder)) { @@ -102,11 +126,26 @@ errorType = errorType + "," + workOrder.getErrorType(); databaseWorkOrder.setErrorType(errorType); databaseWorkOrder.setStatus(WorkOrderStatusEnum.DISTRIBUTED); + Date now = new Date(); + databaseWorkOrder.setUpdateTime(now); baseMapper.updateById(databaseWorkOrder); updateNum++; - // 鍚屾椂鏂板涓�涓繍缁村鐞嗕俊鎭紝琛ㄦ槑姝ゅ伐鍗曡璋冩暣 TODO + // 鍚屾椂鏂板涓�涓繍缁村鐞嗕俊鎭紝琛ㄦ槑姝ゅ伐鍗曡璋冩暣 + WorkOrderYwConditionRecord ywRecord = new WorkOrderYwConditionRecord(); + ywRecord.setWorkOrderId(databaseWorkOrder.getId()); + ywRecord.setCommitUser(1); + ywRecord.setYwCondition("鏁呴殰绫诲瀷鏇存柊锛屽伐鍗曠姸鎬佽皟鏁翠负寰呭鐞�"); + ywRecord.setCreateTime(new Date()); + workOrderYwConditionRecordMapper.insert(ywRecord); } } else { + workOrder.setCreateTime(new Date()); + workOrder.setUpdateTime(new Date()); + // 濡傛灉鎶ュ杩囷紝浣跨敤鏈�鏂版姤澶囩殑閿欒绫诲瀷 + Report report = reportMapper.checkPointReported(workOrder.getSerialNumber()); + if (Objects.nonNull(report)) { + workOrder.setErrorType(report.getErrorType()); + } waitAddList.add(workOrder); } } @@ -128,6 +167,7 @@ YwPoint point = pointMapping.get(workOrder.getSerialNumber()); if (Objects.isNull(point)) { notAddList.add(workOrder); + continue; } workOrder.setWorkOrderNo(IdUtils.timeAddRandomNO(5)); workOrder.setUnitId(Math.toIntExact(point.getUnitId())); @@ -138,6 +178,9 @@ } } waitAddList.removeAll(notAddList); + if (CollectionUtils.isEmpty(waitAddList)) { + return Boolean.TRUE; + } this.saveBatch(waitAddList); // 濡傛灉鏄洿鎺ヤ笅鍙戯紝娣诲姞涓嬪彂璁板綍 if (WorkOrderStatusEnum.DISTRIBUTED.equals(waitAddList.get(0).getStatus())) { @@ -146,6 +189,9 @@ workOrderDistributeRecord.setWorkOrderId(item.getId()); workOrderDistributeRecord.setDistributeWay(WorkOrderDistributeWayEnum.DIRECT_DISTRIBUTE); workOrderDistributeRecord.setUserId(1L); + Date now = new Date(); + workOrderDistributeRecord.setCreateTime(now); + workOrderDistributeRecord.setUpdateTime(now); return workOrderDistributeRecord; }).collect(Collectors.toList()); workOrderDistributeRecordMapper.insertBatch(distributedRecordList); @@ -165,6 +211,9 @@ entity.setWorkOrderNo(IdUtils.timeAddRandomNO(5)); entity.setCreateTime(DateUtils.getNowDate()); entity.setStatus(WorkOrderStatusEnum.WAIT_DISTRIBUTE); + Date now = new Date(); + entity.setCreateTime(now); + entity.setUpdateTime(now); if(baseMapper.insert(entity) > 0) { return Result.ok("娣诲姞鎴愬姛"); } @@ -180,10 +229,11 @@ public Result update(WorkOrderForm form) { WorkOrder entity = baseMapper.selectById(form.getId()); - // 涓虹┖鎶汭llegalArgumentException锛屽仛鍏ㄥ眬寮傚父澶勭悊 Assert.notNull(entity, "璁板綍涓嶅瓨鍦�"); BeanUtils.copyProperties(form, entity); + Date now = new Date(); + entity.setUpdateTime(now); if (baseMapper.updateById(entity) > 0) { return Result.ok("淇敼鎴愬姛"); } @@ -278,6 +328,7 @@ workOrderYwConditionRecord.setCommitUser(SecurityUtils.getLoginUser().getUserId().intValue()); workOrderYwConditionRecord.setYwCondition(form.getYwCondition()); workOrderYwConditionRecord.setYwProofMaterials(form.getYwProofMaterials()); + workOrderYwConditionRecord.setSysMsg(Boolean.FALSE); workOrderYwConditionRecordMapper.insert(workOrderYwConditionRecord); return Result.ok("鎿嶄綔鎴愬姛"); } @@ -285,6 +336,11 @@ @Override public Result selectYwConditionByYwId(Integer id) { List<WorkOrderYwConditionRecordVO> ywConditionList = workOrderYwConditionRecordMapper.selectYwConditionByYwId(id); + ywConditionList.stream().forEach(item -> { + if (Objects.nonNull(item.getSysMsg()) && item.getSysMsg()) { + item.setCommitUserName("绯荤粺娑堟伅"); + } + }); return Result.ok().data(ywConditionList); } @@ -538,4 +594,53 @@ public List<WorkOrderRegionVO> workOrderRegion(DashboardQuery dashboardQuery) { return baseMapper.workOrderRegion(dashboardQuery); } + + + @Override + public String getFrameImgByDevice(String deviceId, String channelId) { + String url = String.format(this.rtspServer + "/start/%s/%s", deviceId, channelId); + String result = HttpUtils.sendGet(url); + WVPResult wvpResult = JSON.parseObject(result, WVPResult.class); + if (0 == wvpResult.getCode()) { + StreamContent data = (StreamContent) wvpResult.getData(); + String rtspUrl = data.getRtsp(); + if (StringUtils.hasText(rtspUrl)) { + try { + // 鍒涘缓FFmpegFrameGrabber瀵硅薄 + FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(rtspUrl); + grabber.start(); // 寮�濮嬫崟鑾� + + 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; + } + grabber.stop(); // 鍋滄鎹曡幏 + grabber.release(); // 閲婃斁璧勬簮 + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return null; + } + + @Override + public List<DeviceInfoVO> hasErrorWorkOrderList() { + List<DeviceInfoVO> list = baseMapper.hasErrorWorkOrderList(); + return list; + } + + @Override + public void updateImgById(Integer workOrderId, String imgPath) { + new LambdaUpdateChainWrapper<>(baseMapper) + .eq(WorkOrder::getId, workOrderId) + .set(WorkOrder::getYwCheckCondition, imgPath); + } } -- Gitblit v1.8.0