From 70f7f9d6f3a431662722f76e4da93cd3b4823857 Mon Sep 17 00:00:00 2001 From: fuliqi <fuliqi@qq.com> Date: 星期四, 22 八月 2024 18:51:00 +0800 Subject: [PATCH] 不定期抽检图片和录像完整 --- ycl-server/src/main/java/com/ycl/platform/service/impl/WorkOrderServiceImpl.java | 124 +++++++++++++++++++++++++++++++++++++++- 1 files changed, 119 insertions(+), 5 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 53ad1af..6e8b5db 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,23 +33,33 @@ 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.*; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; /** @@ -64,8 +80,13 @@ private final WorkOrderYwConditionRecordMapper workOrderYwConditionRecordMapper; private final NotifyService notifyService; private final WorkOrderDistributeRecordMapper workOrderDistributeRecordMapper; - private final TMonitorMapper monitorMapper; + private final WorkOrderErrorTypeMapper workOrderErrorTypeMapper; 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 +101,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 +114,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 +127,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); } } @@ -122,9 +162,14 @@ // 鏌ュ嚭閲嶇偣鐐逛綅銆佹櫘閫氱偣浣嶇殑澶勭悊鏃堕棿 SysConfig important = configMapper.checkConfigKeyUnique("important.wordkorder.time"); SysConfig normal = configMapper.checkConfigKeyUnique("normal.wordkorder.alarm.time"); + // 濡傛灉鍗冲皢鐢熸垚宸ュ崟锛屼絾鏄澶囧浗鏍囩爜鏌ヤ笉鍒扮偣浣嶏紝鍒欎笉娣诲姞锛� + List<WorkOrder> notAddList = new ArrayList<>(); for (WorkOrder workOrder : waitAddList) { - //TODO锛歱oint涓虹┖ 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())); if (point.getImportantTag() || point.getImportantCommandImageTag()) { @@ -132,6 +177,10 @@ } else { workOrder.setProcessingPeriod(Integer.valueOf(normal.getConfigValue())); } + } + waitAddList.removeAll(notAddList); + if (CollectionUtils.isEmpty(waitAddList)) { + return Boolean.TRUE; } this.saveBatch(waitAddList); // 濡傛灉鏄洿鎺ヤ笅鍙戯紝娣诲姞涓嬪彂璁板綍 @@ -141,6 +190,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); @@ -160,6 +212,12 @@ entity.setWorkOrderNo(IdUtils.timeAddRandomNO(5)); entity.setCreateTime(DateUtils.getNowDate()); entity.setStatus(WorkOrderStatusEnum.WAIT_DISTRIBUTE); + Date now = new Date(); + entity.setCreateTime(now); + entity.setUpdateTime(now); + entity.setErrorType(form.getErrorType().stream().map(ErrorTypeEnum::getValue).collect(Collectors.joining(","))); + List<WorkOrderErrorType> workOrderErrorTypes = form.getErrorType().stream().map(errorType -> new WorkOrderErrorType(entity.getWorkOrderNo(), errorType.getValue())).toList(); + workOrderErrorTypeMapper.insertWorkOrderErrorTypeList(workOrderErrorTypes); if(baseMapper.insert(entity) > 0) { return Result.ok("娣诲姞鎴愬姛"); } @@ -175,10 +233,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("淇敼鎴愬姛"); } @@ -273,6 +332,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("鎿嶄綔鎴愬姛"); } @@ -280,6 +340,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); } @@ -439,7 +504,7 @@ */ public synchronized Boolean getDistributeLock() { if (Objects.isNull(redisCache.getCacheObject(DISTRIBUTE_LOCK_KEY))) { - redisCache.setCacheObject(DISTRIBUTE_LOCK_KEY, "1"); + redisCache.setCacheObject(DISTRIBUTE_LOCK_KEY, "1", 30, TimeUnit.SECONDS); return true; } else { return false; @@ -533,4 +598,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