ycl-common/src/main/java/enumeration/ErrorType.java
@@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.annotation.EnumValue; import lombok.Getter; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @@ -71,14 +72,29 @@ } // 根据value获取desc public static List<String> getDescriptionList() { List<String> list = new ArrayList<>(); for (ErrorType errorType : ErrorType.values()) { list.add(errorType.getDesc()); } return list; } // 根据value获取desc public static String getDescriptionByValue(String value) { for (ErrorType errorType : ErrorType.values()) { if (errorType.getValue().equals(value)) { return errorType.getDesc(); } } // 如果没有找到匹配的value,返回null或者抛出一个异常 // 这里返回null return null; } // 根据desc获取value public static String getValueByDescription(String desc) { for (ErrorType errorType : ErrorType.values()) { if (errorType.getDesc().equals(desc)) { return errorType.getValue(); } } return null; } } ycl-pojo/src/main/java/com/ycl/platform/domain/excel/ErrorExport.java
New file @@ -0,0 +1,16 @@ package com.ycl.platform.domain.excel; import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.write.style.ColumnWidth; import lombok.Data; /** * 故障类型页 */ @Data public class ErrorExport { @ColumnWidth(30) @ExcelProperty("故障类型") private String error; } ycl-pojo/src/main/java/com/ycl/platform/domain/excel/WorkOrderWhiteExport.java
New file @@ -0,0 +1,27 @@ package com.ycl.platform.domain.excel; import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.write.style.ColumnWidth; import lombok.Data; /** * 白名单导入导出 */ @Data public class WorkOrderWhiteExport { @ColumnWidth(30) @ExcelProperty("国标码(不可修改)") private String serialNumber; @ColumnWidth(50) @ExcelProperty("点位名称(不可修改)") private String pointName; @ColumnWidth(50) @ExcelProperty("故障类型(可修改)") private String errorType; @ColumnWidth(50) @ExcelProperty("备注(可修改)") private String remark; } ycl-pojo/src/main/java/com/ycl/platform/domain/form/WorkOrderForm.java
@@ -73,6 +73,7 @@ entity = new WorkOrder(); } BeanUtils.copyProperties(form, entity); entity.setErrorTypeList(form.getErrorType()); return entity; } ycl-server/src/main/java/com/ycl/platform/controller/WorkOrderController.java
@@ -4,10 +4,7 @@ import com.ycl.platform.domain.entity.WorkOrderAuditingRecord; import com.ycl.platform.domain.entity.WorkOrderWhite; import com.ycl.platform.domain.form.*; import com.ycl.platform.domain.query.DistributeWorkOrderQuery; import com.ycl.platform.domain.query.WorkOrderExportQuery; import com.ycl.platform.domain.query.WorkOrderQuery; import com.ycl.platform.domain.query.WorkOrderWhiteQuery; import com.ycl.platform.domain.query.*; import com.ycl.platform.domain.vo.DistributeWorkOrderVO; import com.ycl.platform.domain.vo.WorkOrderVO; import com.ycl.platform.domain.vo.WorkOrderYwConditionRecordVO; @@ -28,6 +25,7 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.io.IOException; import java.util.List; /** @@ -198,64 +196,6 @@ List<WorkOrderAuditingRecord> data = workOrderService.selectYwAuditingListByYwId(workOrderNo); return Result.ok().data(data); } /** * 工单白名单列表 */ @PostMapping("/white/page") @ApiOperation(value = "工单白名单列表", notes = "工单白名单列表") public Result whitePage(@RequestBody WorkOrderWhiteQuery workOrderWhiteQuery) { return workOrderService.selectWorkOrderWhiteList(workOrderWhiteQuery); } /** * 工单白名单详情 */ @GetMapping("/white/{id}") @ApiOperation(value = "工单白名单详情", notes = "工单白名单详情") public Result whiteDetail(@PathVariable Integer id) { return workOrderService.selectWorkOrderWhiteDetail(id); } /** * 添加工单白名单 * * @param workOrderWhite 白色工单 * @return {@link Result } * @author */ @PostMapping("/white/add") @ApiOperation(value = "新增工单白名单", notes = "新增工单白名单") public Result addWorkOrderWhite(@RequestBody WorkOrderWhite workOrderWhite) { return workOrderService.addWorkOrderWhite(workOrderWhite); } /** * 修改工单白名单 * * @param workOrderWhite 白色工单 * @return {@link Result } * @author */ @PostMapping("/white/update") @ApiOperation(value = "修改工单白名单", notes = "修改工单白名单") public Result updateWorkOrderWhite(@RequestBody WorkOrderWhite workOrderWhite) { return workOrderService.updateWorkOrderWhite(workOrderWhite); } /** * 批量删除工单白名单 * * @param ids ids * @return {@link Result } * @author */ @DeleteMapping("/white/batchDelete") @ApiOperation(value = "批量删除工单白名单", notes = "批量删除工单白名单") public Result batchDeleteWorkOrderWhite(@RequestBody List<String> ids) { return workOrderService.batchDeleteWorkOrderWhite(ids); } /** * 批量删除工单 * @@ -268,4 +208,5 @@ public Result batchDeleteWorkOrder(@RequestBody List<String> workOrderNos) { return workOrderService.batchDeleteWorkOrder(workOrderNos); } } ycl-server/src/main/java/com/ycl/platform/controller/YwThresholdController.java
@@ -1,7 +1,9 @@ package com.ycl.platform.controller; import annotation.Log; import com.ycl.platform.domain.entity.WorkOrderWhite; import com.ycl.platform.domain.entity.YwThreshold; import com.ycl.platform.domain.query.WorkOrderWhiteQuery; import com.ycl.platform.service.IYwThresholdService; import com.ycl.system.AjaxResult; import com.ycl.system.Result; @@ -91,17 +93,84 @@ { return toAjax(ywThresholdService.deleteYwThresholdByIds(ids)); } /** * 工单白名单列表 */ @PostMapping("/white/page") @ApiOperation(value = "工单白名单列表", notes = "工单白名单列表") public Result whitePage(@RequestBody WorkOrderWhiteQuery workOrderWhiteQuery) { return ywThresholdService.selectWorkOrderWhiteList(workOrderWhiteQuery); } /** * 导入数据 * 工单白名单详情 */ @GetMapping("/white/{id}") @ApiOperation(value = "工单白名单详情", notes = "工单白名单详情") public Result whiteDetail(@PathVariable Integer id) { return ywThresholdService.selectWorkOrderWhiteDetail(id); } /** * 添加工单白名单 * * @param workOrderWhite 白色工单 * @return {@link Result } * @author */ @PostMapping("/white/add") @ApiOperation(value = "新增工单白名单", notes = "新增工单白名单") public Result addWorkOrderWhite(@RequestBody WorkOrderWhite workOrderWhite) { return ywThresholdService.addWorkOrderWhite(workOrderWhite); } /** * 修改工单白名单 * * @param workOrderWhite 白色工单 * @return {@link Result } * @author */ @PostMapping("/white/update") @ApiOperation(value = "修改工单白名单", notes = "修改工单白名单") public Result updateWorkOrderWhite(@RequestBody WorkOrderWhite workOrderWhite) { return ywThresholdService.updateWorkOrderWhite(workOrderWhite); } /** * 批量删除工单白名单 * * @param ids ids * @return {@link Result } * @author */ @DeleteMapping("/white/batchDelete") @ApiOperation(value = "批量删除工单白名单", notes = "批量删除工单白名单") public Result batchDeleteWorkOrderWhite(@RequestBody List<String> ids) { return ywThresholdService.batchDeleteWorkOrderWhite(ids); } /** * 导出白名单 * @param response * @throws IOException */ @GetMapping("/white/export") @ApiOperation(value = "导出数据", notes = "导出数据") public void whiteExport(HttpServletResponse response) throws IOException { ywThresholdService.whiteExport(response); } /** * 导入白名单 * * @param file 文件 * @return {@link Result } * @author */ @PostMapping("/import") @ApiOperation(value = "导入数据", notes = "导入数据") @ApiOperation(value = "导入白名单", notes = "导入白名单") public Result importData(MultipartFile file) throws IOException, ParseException, ExecutionException, InterruptedException { return ywThresholdService.importData(file); return ywThresholdService.importWhite(file); } } ycl-server/src/main/java/com/ycl/platform/mapper/WorkOrderMapper.java
@@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.ycl.platform.domain.entity.WorkOrder; import com.ycl.platform.domain.excel.WorkOrderWhiteExport; import com.ycl.platform.domain.form.WorkOrderBatchAuditingForm; import com.ycl.platform.domain.query.*; import com.ycl.platform.domain.vo.DeviceInfoVO; @@ -113,4 +114,5 @@ List<WorkOrder> selectByNos(@Param("workOrderNos") List<String> workOrderNos); } ycl-server/src/main/java/com/ycl/platform/mapper/WorkOrderWhiteMapper.java
@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.ycl.platform.domain.entity.WorkOrderWhite; import com.ycl.platform.domain.excel.WorkOrderWhiteExport; import com.ycl.platform.domain.query.WorkOrderWhiteQuery; import org.apache.ibatis.annotations.Param; @@ -71,4 +72,13 @@ void updateBySerialNumber(WorkOrderWhite white); WorkOrderWhite getById(Integer id); List<WorkOrderWhiteExport> whiteExport(); void updateBatch(@Param("whiteList")List<WorkOrderWhite> dataList); void insertBatch(@Param("whiteList")List<WorkOrderWhite> addList); void deleteAll(); } ycl-server/src/main/java/com/ycl/platform/service/IYwThresholdService.java
@@ -1,14 +1,21 @@ package com.ycl.platform.service; import com.baomidou.mybatisplus.extension.service.IService; import com.ycl.platform.domain.entity.WorkOrderWhite; import com.ycl.platform.domain.entity.YwThreshold; import com.ycl.platform.domain.excel.PointExport; import com.ycl.platform.domain.query.WorkOrderWhiteQuery; import com.ycl.platform.domain.result.HK.FaceDeviceInspectionResult; import com.ycl.platform.domain.result.HK.VehicleDeviceInspectionResult; import com.ycl.system.Result; import com.ycl.system.page.TableDataInfo; import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.util.List; import java.util.Map; import java.util.concurrent.ExecutionException; /** * 运维阈值Service接口 @@ -86,12 +93,47 @@ */ public void errorTypeCheckUY(List list); /** * 导入数据 * 工单白名单列表 * * @param file 文件 * @param workOrderWhiteQuery 白色工单查询 * @return {@link TableDataInfo } * @author */ Result selectWorkOrderWhiteList(WorkOrderWhiteQuery workOrderWhiteQuery); /** * 添加工单白名单 * * @param workOrderWhite 白色工单 * @return {@link Result } * @author */ Result importData(MultipartFile file); Result addWorkOrderWhite(WorkOrderWhite workOrderWhite); /** * 批量删除工单白名单 * * @param ids ids * @author */ Result batchDeleteWorkOrderWhite(List<String> ids); Result selectWorkOrderWhiteDetail(Integer id); Result updateWorkOrderWhite(WorkOrderWhite workOrderWhite); /** * 导出数据 * * @param response */ void whiteExport(HttpServletResponse response) throws IOException;; /** * 批量导入工单白名单 * * @author */ Result importWhite(MultipartFile file) throws IOException; } ycl-server/src/main/java/com/ycl/platform/service/WorkOrderService.java
@@ -12,8 +12,10 @@ import com.ycl.platform.domain.vo.screen.WorkOrderTotalVO; import com.ycl.system.Result; import com.ycl.system.page.TableDataInfo; import jakarta.servlet.http.HttpServletResponse; import org.bytedeco.javacv.FFmpegFrameGrabber; import java.io.IOException; import java.util.Date; import java.util.List; import java.util.Map; @@ -238,40 +240,6 @@ List<WorkOrderVO> export(WorkOrderExportQuery query); /** * 工单白名单列表 * * @param workOrderWhiteQuery 白色工单查询 * @return {@link TableDataInfo } * @author */ Result selectWorkOrderWhiteList(WorkOrderWhiteQuery workOrderWhiteQuery); /** * 添加工单白名单 * * @param workOrderWhite 白色工单 * @return {@link Result } * @author */ Result addWorkOrderWhite(WorkOrderWhite workOrderWhite); /** * 批量删除工单白名单 * * @param ids ids * @author */ Result batchDeleteWorkOrderWhite(List<String> ids); /** * 批量导入工单白名单 * * @param dataList 数据列表 * @author */ void batchImportWhite(List<PointExport> dataList); /** * 检测按钮 * @param workOrderNo * @return @@ -282,8 +250,5 @@ Result errorAll(); Result selectWorkOrderWhiteDetail(Integer id); Result updateWorkOrderWhite(WorkOrderWhite workOrderWhite); } ycl-server/src/main/java/com/ycl/platform/service/impl/WorkOrderServiceImpl.java
@@ -1,5 +1,8 @@ package com.ycl.platform.service.impl; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.write.metadata.WriteSheet; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; @@ -12,7 +15,9 @@ import com.ycl.config.PlatformConfig; import com.ycl.exception.ServiceException; import com.ycl.platform.domain.entity.*; import com.ycl.platform.domain.excel.ErrorExport; import com.ycl.platform.domain.excel.PointExport; import com.ycl.platform.domain.excel.WorkOrderWhiteExport; import com.ycl.platform.domain.form.*; import com.ycl.platform.domain.query.*; import com.ycl.platform.domain.vo.*; @@ -40,6 +45,7 @@ import constant.RedisConstant; import enumeration.ErrorType; import enumeration.general.*; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; @@ -61,10 +67,13 @@ import org.springframework.util.StringUtils; import pojo.CascadeOption; import java.io.IOException; import java.io.OutputStream; import java.time.LocalDateTime; import java.time.ZoneId; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.function.Function; import java.util.stream.Collectors; /** @@ -86,10 +95,10 @@ private final WorkOrderDistributeRecordMapper workOrderDistributeRecordMapper; private final WorkOrderErrorTypeServiceImpl workOrderErrorTypeService; private final WorkOrderErrorTypeMapper workOrderErrorTypeMapper; private final WorkOrderWhiteMapper workOrderWhiteMapper; 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}") @@ -109,19 +118,12 @@ } @Transactional(rollbackFor = Exception.class) public Boolean batchAddWorkOrder(List<WorkOrder> workOrderList){ public Boolean batchAddWorkOrder(List<WorkOrder> workOrderList) { int total = workOrderList.size(); // 查询出白名单列表 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; } // 根据国标码去重 workOrderList = workOrderList.stream() .collect(Collectors.toMap( @@ -129,6 +131,12 @@ p -> p, (existing, replacement) -> existing // 冲突时保留第一个 )).values().stream().collect(Collectors.toList()); //检查白名单 workOrderList = checkWhite(workOrderList); if (CollectionUtils.isEmpty(workOrderList)) { return Boolean.TRUE; } List<String> serialNumberList = workOrderList.stream().map(WorkOrder::getSerialNumber).collect(Collectors.toList()); // 查出数据库中国标码对应的未完成的工单 List<WorkOrder> inDatabaseWorkOrderList = baseMapper.getNotFinishedWorkOrders(serialNumberList); @@ -171,7 +179,7 @@ } } //避免代下发的工单直接变成下发 if(!databaseWorkOrder.getStatus().equals(WorkOrderStatusEnum.WAIT_DISTRIBUTE)) { if (!databaseWorkOrder.getStatus().equals(WorkOrderStatusEnum.WAIT_DISTRIBUTE)) { databaseWorkOrder.setStatus(WorkOrderStatusEnum.DISTRIBUTED); } databaseWorkOrder.setUpdateTime(now); @@ -282,7 +290,7 @@ workOrderErrorType.setErrorName(errorType); waitAddErrorTypeList.add(workOrderErrorType); } log.info("即将生成的工单:{}",workOrder); log.info("即将生成的工单:{}", workOrder); } redisCache.setCacheObject(RedisConstant.WORKORDER_NUM, workOrderNum); redisCache.releaseLock(RedisConstant.WORKORDER_NUM_LOCK, requestId); @@ -311,6 +319,8 @@ log.info("传入工单总数: {},实际添加工单数:{}, 实际修改工单数:{}", total, waitAddList.size(), updateNum); return Boolean.TRUE; } /** * 添加 * @@ -319,6 +329,16 @@ */ @Override public Result add(WorkOrderForm form) { //检查白名单 List<WorkOrder> data = new ArrayList<>(); WorkOrder workOrder = WorkOrderForm.getEntityByForm(form, null); data.add(workOrder); data = checkWhite(data); if (CollectionUtils.isEmpty(data)) { return Result.error("该设备的故障类型在白名单中,不能添加工单"); } WorkOrder entity = data.get(0); //查redis今日工单数量 int workOrderNum = 0; //UUID作为value,保证上锁的线程自己解锁 @@ -334,28 +354,22 @@ } else { return Result.error("工单正在添加,请稍后再试"); } WorkOrder entity = WorkOrderForm.getEntityByForm(form, null); // 查询出白名单列表 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("添加失败"); 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("添加失败"); } /** * 修改 @@ -488,7 +502,7 @@ // 国标设备的编码就是取视频流的设备编码,国标设备就一个。国标设备的每一个通道代表一个摄像头,也就是设备id是取流的通道id String frameImg = null; try { log.info("国标平台:{},设备编码:{},工单号:{}",gbDevices.get(0).getDeviceId(), workOrder.getSerialNumber(), workOrder.getWorkOrderNo()); 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(); @@ -501,11 +515,12 @@ 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)){ if (item.getUserId().equals(1)) { item.setUnitName("管理员"); } if (Objects.nonNull(item.getSysMsg()) && item.getSysMsg()) { @@ -583,11 +598,11 @@ @Override public Result page(WorkOrderQuery query) { IPage<WorkOrderVO> page = PageUtil.getPage(query, WorkOrderVO.class); if(query.getUnitId()==null) { 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())); 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 -> { @@ -616,8 +631,8 @@ @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())); 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()); } @@ -845,11 +860,11 @@ @Override 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); log.info("访问路径{}", url); String result = HttpUtils.sendGet(url); log.info("拿到取流图片响应结果:" + result); WVPResult wvpResult = JSON.parseObject(result, WVPResult.class); if(wvpResult.getCode() == 0) { if (wvpResult.getCode() == 0) { Object imgUrl = (Object) wvpResult.getData(); imgUrl = Objects.isNull(imgUrl) ? "" : imgUrl; log.info("拿到取流图片:" + imgUrl); @@ -906,7 +921,7 @@ } @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); @@ -967,13 +982,13 @@ } @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) @@ -981,7 +996,7 @@ } @Override public Result processImg (String workOrderNo){ public Result processImg(String workOrderNo) { WorkOrder workOrder = new LambdaQueryChainWrapper<>(baseMapper) .eq(WorkOrder::getWorkOrderNo, workOrderNo) .one(); @@ -1022,7 +1037,7 @@ } @Override public Result detailByNo (String workOrderNo){ public Result detailByNo(String workOrderNo) { WorkOrderDetailVO workOrder = baseMapper.detailByNo(workOrderNo); // 是否报备 boolean hasReport = new LambdaQueryChainWrapper<>(reportMapper) @@ -1044,8 +1059,8 @@ } @Override public List<WorkOrderVO> export (WorkOrderExportQuery query){ if(query.getUnitId()==null) { public List<WorkOrderVO> export(WorkOrderExportQuery query) { if (query.getUnitId() == null) { query.setUnitId(SecurityUtils.getUnitId()); } if (query.getStart() != null) query.setStart(query.getStart() + " 00:00:00"); @@ -1055,107 +1070,13 @@ } /** * 工单白名单列表 * * @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); List<WorkOrderWhite> records = page.getRecords(); records.forEach(white-> { List<String> errorTextList = new ArrayList<>(); List<String> errorTypeList = JSONArray.parseArray(white.getErrorType(), String.class); errorTypeList.forEach(error->{ String errorText = ErrorType.getDescriptionByValue(error); errorTextList.add(errorText); }); white.setErrorType(String.join(",", errorTextList)); }); return Result.ok().data(records).total(page.getTotal()); } /** * 添加工单白名单 * * @param workOrderWhite 白色工单 * @return {@link Result } * @author */ @Override public Result addWorkOrderWhite(WorkOrderWhite workOrderWhite) { // 检查是否已经存在该白名单 WorkOrderWhite flag = workOrderWhiteMapper.selectBySerialNumber(workOrderWhite.getSerialNumber()); if (flag != null) { return Result.error("该设备已存在白名单"); } else { List<String> errorTypeList = workOrderWhite.getErrorTypeList(); workOrderWhite.setErrorType(JSONArray.toJSONString(errorTypeList)); workOrderWhite.setCreateBy(SecurityUtils.getUsername()); workOrderWhiteMapper.insert(workOrderWhite); return Result.ok(); } } /** * 修改工单白名单 * * @param workOrderWhite 白色工单 * @return {@link Result } * @author */ @Override public Result updateWorkOrderWhite(WorkOrderWhite workOrderWhite) { WorkOrderWhite white = workOrderWhiteMapper.selectBySerialNumber(workOrderWhite.getSerialNumber()); workOrderWhite.setId(white.getId()); List<String> errorTypeList = workOrderWhite.getErrorTypeList(); workOrderWhite.setErrorType(JSONArray.toJSONString(errorTypeList)); workOrderWhiteMapper.updateById(workOrderWhite); return Result.ok(); } /** * 批量删除工单白名单 * * @param ids ids * @author */ @Override public Result batchDeleteWorkOrderWhite(List<String> ids) { workOrderWhiteMapper.batchDelete(ids); return Result.ok(); } /** * 批量导入白名单 * * @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) { public Result checkImage(String workOrderNo, String serialNumber) { // 查出国标设备,就一条数据 List<DeviceInfo> gbDevices = new LambdaQueryChainWrapper<>(deviceInfoMapper) .orderByDesc(DeviceInfo::getUpdateTime) @@ -1163,7 +1084,7 @@ .list(); if (!CollectionUtils.isEmpty(gbDevices)) { try { String imgUrl = this.getFrameImgByDevice(gbDevices.get(0).getDeviceId(), serialNumber,workOrderNo); String imgUrl = this.getFrameImgByDevice(gbDevices.get(0).getDeviceId(), serialNumber, workOrderNo); if (StringUtils.hasText(imgUrl)) { WorkOrderCheckImg img = new WorkOrderCheckImg(); img.setWorkOrderNo(workOrderNo); @@ -1182,7 +1103,7 @@ @Override @Transactional(rollbackFor = Exception.class) public Result batchDeleteWorkOrder(List<String> workOrderNos) { if(!CollectionUtils.isEmpty(workOrderNos)) { if (!CollectionUtils.isEmpty(workOrderNos)) { //删除工单审核记录 workOrderAuditingRecordMapper.delete(new QueryWrapper<WorkOrderAuditingRecord>().in("work_order_no", workOrderNos)); //删除工单图片记录 @@ -1248,12 +1169,22 @@ return Result.ok().data(results); } @Override public Result selectWorkOrderWhiteDetail(Integer id) { WorkOrderWhite workOrderWhite = workOrderWhiteMapper.getById(id); List<String> errorList = JSONArray.parseArray(workOrderWhite.getErrorType(), String.class); workOrderWhite.setErrorTypeList(errorList); return Result.ok().data(workOrderWhite); //白名单校验 private List<WorkOrder> checkWhite(List<WorkOrder> workOrderList) { // 查询出白名单列表 Map<String, WorkOrderWhite> whiteMap = workOrderWhiteMapper.selectList().stream().collect(Collectors.toMap(WorkOrderWhite::getSerialNumber, Function.identity())); workOrderList = workOrderList.stream() .filter(workOrder -> { List<String> errorTypeList = workOrder.getErrorTypeList(); WorkOrderWhite white = whiteMap.get(workOrder.getSerialNumber()); if (white != null) { List<String> whiteErrorListSet = Arrays.asList(white.getErrorType().split(",")); errorTypeList.removeIf(whiteErrorListSet::contains); } return !errorTypeList.isEmpty(); // 只保留 errorTypeList 非空的 WorkOrder }) .collect(Collectors.toList()); return workOrderList; } ycl-server/src/main/java/com/ycl/platform/service/impl/YwThresholdServiceImpl.java
@@ -1,17 +1,34 @@ package com.ycl.platform.service.impl; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import com.alibaba.excel.write.metadata.WriteSheet; import com.alibaba.fastjson2.JSONArray; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ycl.dataListener.CurrencyDataListener; import com.ycl.platform.domain.entity.WorkOrder; import com.ycl.platform.domain.entity.WorkOrderWhite; import com.ycl.platform.domain.entity.YwPoint; import com.ycl.platform.domain.entity.YwThreshold; import com.ycl.platform.domain.excel.ErrorExport; import com.ycl.platform.domain.excel.PointExport; import com.ycl.platform.domain.excel.WorkOrderWhiteExport; import com.ycl.platform.domain.query.WorkOrderWhiteQuery; import com.ycl.platform.domain.result.HK.FaceDeviceInspectionResult; import com.ycl.platform.domain.result.HK.VehicleDeviceInspectionResult; import com.ycl.platform.domain.vo.DynamicColumnVO; import com.ycl.platform.mapper.WorkOrderWhiteMapper; import com.ycl.platform.mapper.YwThresholdMapper; import com.ycl.platform.service.IYwThresholdService; import com.ycl.platform.service.WorkOrderService; import com.ycl.system.Result; import com.ycl.system.page.PageUtil; import com.ycl.utils.SecurityUtils; import com.ycl.utils.StringUtils; import com.ycl.utils.ip.PingUtil; import com.ycl.utils.poi.EasyExcelImportUtils; import com.ycl.utils.uuid.IdUtils; @@ -21,14 +38,20 @@ import enumeration.ErrorType; import enumeration.general.BusinessTypeEnum; import enumeration.general.WorkOrderStatusEnum; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import org.springframework.web.multipart.MultipartFile; import utils.DateUtils; import java.io.IOException; import java.io.OutputStream; import java.util.*; import java.util.concurrent.ExecutionException; import java.util.function.Consumer; import java.util.function.Function; import java.util.stream.Collectors; @@ -47,6 +70,8 @@ @Autowired private WorkOrderService workOrderService; @Autowired private WorkOrderWhiteMapper workOrderWhiteMapper; /** * 查询运维阈值 * @@ -151,21 +176,6 @@ // 清晰度异常检测 // 亮度异常故障检测 } @Override public Result importData(MultipartFile file) { List<Map<String, String>> list = EasyExcelImportUtils.makeData(file); List<PointExport> dataList = new ArrayList<>(); for (Map<String, String> map : list) { PointExport pointExport = new PointExport(); pointExport.setPointName(map.get(PointHeaderConstant.Point_Name)); pointExport.setSerialNumber(map.get(PointHeaderConstant.Serial_Number)); dataList.add(pointExport); } workOrderService.batchImportWhite(dataList); return Result.ok("导入成功"); } /** @@ -305,6 +315,264 @@ } /** * 白名单详情 * @param id * @return */ @Override public Result selectWorkOrderWhiteDetail(Integer id) { WorkOrderWhite workOrderWhite = workOrderWhiteMapper.getById(id); List<String> errorTypeList = Arrays.asList(workOrderWhite.getErrorType().split(",")); workOrderWhite.setErrorTypeList(errorTypeList); return Result.ok().data(workOrderWhite); } /** * 工单白名单列表 * * @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); List<WorkOrderWhite> records = page.getRecords(); records.forEach(white-> { List<String> errorTextList = new ArrayList<>(); List<String> errorTypeList = Arrays.asList(white.getErrorType().split(",")); errorTypeList.forEach(error->{ String errorText = ErrorType.getDescriptionByValue(error); errorTextList.add(errorText); }); white.setErrorType(String.join(",", errorTextList)); }); return Result.ok().data(records).total(page.getTotal()); } /** * 添加工单白名单 * * @param workOrderWhite 白色工单 * @return {@link Result } * @author */ @Override public Result addWorkOrderWhite(WorkOrderWhite workOrderWhite) { // 检查是否已经存在该白名单 WorkOrderWhite flag = workOrderWhiteMapper.selectBySerialNumber(workOrderWhite.getSerialNumber()); if (flag != null) { return Result.error("该设备已存在白名单"); } else { List<String> errorTypeList = workOrderWhite.getErrorTypeList(); workOrderWhite.setErrorType(String.join(",",errorTypeList)); workOrderWhite.setCreateBy(SecurityUtils.getUsername()); workOrderWhiteMapper.insert(workOrderWhite); return Result.ok(); } } /** * 修改工单白名单 * * @param workOrderWhite 白色工单 * @return {@link Result } * @author */ @Override public Result updateWorkOrderWhite(WorkOrderWhite workOrderWhite) { WorkOrderWhite white = workOrderWhiteMapper.selectBySerialNumber(workOrderWhite.getSerialNumber()); workOrderWhite.setId(white.getId()); List<String> errorTypeList = workOrderWhite.getErrorTypeList(); workOrderWhite.setErrorType(String.join(",",errorTypeList)); workOrderWhiteMapper.updateById(workOrderWhite); return Result.ok(); } /** * 批量删除工单白名单 * * @param ids ids * @author */ @Override public Result batchDeleteWorkOrderWhite(List<String> ids) { workOrderWhiteMapper.batchDelete(ids); return Result.ok(); } /** * 白名单导出 * @param response * @throws IOException */ @Override public void whiteExport(HttpServletResponse response) throws IOException { //白名单数据 List<WorkOrderWhiteExport> data = workOrderWhiteMapper.whiteExport(); data.forEach(white-> { List<String> errorTextList = new ArrayList<>(); List<String> errorTypeList = Arrays.asList(white.getErrorType().split(",")); errorTypeList.forEach(error->{ String errorText = ErrorType.getDescriptionByValue(error); errorTextList.add(errorText); }); white.setErrorType(String.join(",", errorTextList)); }); //故障类型数据 List<String> errorTextList = ErrorType.getDescriptionList(); List<ErrorExport> errorExports = new ArrayList<>(); errorTextList.forEach(error -> { ErrorExport errorExport = new ErrorExport(); errorExport.setError(error); errorExports.add(errorExport); }); ExcelWriter excelWriter = null; try(OutputStream outputStream = response.getOutputStream()) { excelWriter = EasyExcel.write(outputStream).build(); WriteSheet whiteSheet = EasyExcel.writerSheet(0, "工单白名单清单").head(WorkOrderWhiteExport.class).build(); WriteSheet errorSheet = EasyExcel.writerSheet(1, "故障类型").head(ErrorExport.class).build(); excelWriter.write(data, whiteSheet); excelWriter.write(errorExports, errorSheet); excelWriter.finish(); outputStream.flush(); }catch (Exception e) { e.printStackTrace(); } finally { try { excelWriter.finish(); response.getOutputStream().close(); } catch (IOException e) { e.printStackTrace(); } } } /** * 导入工单白名单 * @param file * @return */ @Override @Transactional(rollbackFor = Exception.class) public Result importWhite(MultipartFile file) throws IOException{ // Consumer<List<WorkOrderWhiteExport>> consumer = (dataList) -> { // try { // this.updateWhite(dataList); // } catch (ExecutionException e) { // e.printStackTrace(); // } catch (InterruptedException e) { // e.printStackTrace(); // } // }; // EasyExcel.read(file.getInputStream(), WorkOrderWhiteExport.class, new CurrencyDataListener(consumer)) // .sheet() // .headRowNumber(1) // .doRead(); List<WorkOrderWhiteExport> dataList = new ArrayList<>(); EasyExcel.read(file.getInputStream(), WorkOrderWhiteExport.class, new AnalysisEventListener<WorkOrderWhiteExport>() { @Override public void invoke(WorkOrderWhiteExport excel, AnalysisContext analysisContext) { // 将读取到的每一行存入reportDetails集合中 dataList.add(excel); } @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) {} }).sheet().doRead(); if (CollectionUtils.isEmpty(dataList)) { throw new RuntimeException("导入数据不能为空"); } boolean duplic = checkDuplic(dataList); if(duplic) throw new RuntimeException("存在重复国标设备"); //已存在的白名单 Map<String, WorkOrderWhite> whiteMap = workOrderWhiteMapper.selectList().stream().collect(Collectors.toMap(WorkOrderWhite::getSerialNumber, Function.identity())); List<WorkOrderWhite> addList = new ArrayList<>(); dataList.stream().forEach(item -> { WorkOrderWhite white = new WorkOrderWhite(); //国标码 white.setSerialNumber(item.getSerialNumber()); //备注 white.setRemark(item.getRemark()); String errorType = item.getErrorType(); if(StringUtils.isEmpty(errorType)){ throw new RuntimeException("国标码为"+item.getSerialNumber()+"的设备故障不能为空"); } try { List<String> errorDataList = new ArrayList<>(); List<String> errorExcelList = Arrays.asList(item.getErrorType().split(",")); errorExcelList.forEach(desc->{ //把中文转换为数据库存储格式 String errorText = ErrorType.getValueByDescription(desc); //找不到抛出异常 if(errorText == null) throw new RuntimeException("国标码为"+item.getSerialNumber()+"的设备故障类型有误"); errorDataList.add(errorText); }); white.setErrorType(String.join(",", errorDataList)); //如果已存在补充id WorkOrderWhite whiteExsit = whiteMap.get(white.getSerialNumber()); if(whiteExsit!=null) white.setId(whiteExsit.getId()); addList.add(white); } catch (Exception e) { throw new RuntimeException("国标码为"+item.getSerialNumber()+"的设备故障类型有误"); } }); if(!CollectionUtils.isEmpty(addList)) { workOrderWhiteMapper.deleteAll(); workOrderWhiteMapper.insertBatch(addList); } return Result.ok(); } /** * 修改白名单 * * @param dataList * @param unitId */ public void updateWhite(List<WorkOrderWhiteExport> dataList) throws ExecutionException, InterruptedException { if (CollectionUtils.isEmpty(dataList)) { throw new RuntimeException("导入数据不能为空"); } //已存在的白名单 List<String> serialNumbers = workOrderWhiteMapper.selectList().stream().map(WorkOrderWhite::getSerialNumber).collect(Collectors.toList()); List<WorkOrderWhite> addList = new ArrayList<>(); List<WorkOrderWhite> updateList = new ArrayList<>(); dataList.stream().forEach(item -> { WorkOrderWhite white = new WorkOrderWhite(); //国标码 white.setSerialNumber(item.getSerialNumber()); //备注 white.setRemark(item.getRemark()); String errorType = item.getErrorType(); if(StringUtils.isEmpty(errorType)){ throw new RuntimeException("国标码为"+item.getSerialNumber()+"的设备故障不能为空"); } try { List<String> errorDataList = new ArrayList<>(); List<String> errorExcelList = Arrays.asList(item.getErrorType().split(",")); errorExcelList.forEach(desc->{ //把中文转换为数据库存储格式 String errorText = ErrorType.getValueByDescription(desc); //找不到抛出异常 if(errorText == null) throw new RuntimeException("国标码为"+item.getSerialNumber()+"的设备故障类型有误"); errorDataList.add(errorText); }); white.setErrorType(String.join(",", errorDataList)); if(!CollectionUtils.isEmpty(serialNumbers) && serialNumbers.contains(white.getSerialNumber())){ updateList.add(white); }else { addList.add(white); } } catch (Exception e) { throw new RuntimeException("国标码为"+item.getSerialNumber()+"的设备故障类型有误"); } }); if(!CollectionUtils.isEmpty(addList)) workOrderWhiteMapper.insertBatch(addList); if(!CollectionUtils.isEmpty(updateList)) workOrderWhiteMapper.updateBatch(updateList); } /** * 检查阈值 * * @param key 某阈值标识 @@ -373,4 +641,15 @@ } } public static boolean checkDuplic(List<WorkOrderWhiteExport> dataList) { Set<String> serialNumbers = new HashSet<>(); for (WorkOrderWhiteExport white : dataList) { String serialNumber = white.getSerialNumber(); if (!serialNumbers.add(serialNumber)) { return true; } } return false; } } ycl-server/src/main/resources/mapper/zgyw/WorkOrderWhiteMapper.xml
@@ -32,7 +32,7 @@ left join t_monitor m on wow.serial_number = m.serial_number <where> <if test="query.keyword != null and query.keyword != ''"> and (serial_number like concat('%',#{query.keyword},'%') or point_name like concat('%', #{query.keyword}, '%')) and (wow.serial_number like concat('%',#{query.keyword},'%') or m.name like concat('%', #{query.keyword}, '%')) </if> </where> </select> @@ -44,10 +44,18 @@ wow.id = #{id} </where> </select> <select id="whiteExport" resultType="com.ycl.platform.domain.excel.WorkOrderWhiteExport"> select wow.id, wow.serial_number,m.name as pointName, wow.error_type, wow.create_by, wow.remark from t_work_order_white wow left join t_monitor m on wow.serial_number = m.serial_number </select> <select id="selectBySerialNumber" resultType="com.ycl.platform.domain.entity.WorkOrderWhite"> <include refid="selectWorkOrderWhiteVo"/> where serial_number = #{serialNumber} </select> <select id="selectList" resultType="com.ycl.platform.domain.entity.WorkOrderWhite"> <include refid="selectWorkOrderWhiteVo"/> </select> @@ -80,4 +88,26 @@ #{id} </foreach> </delete> <update id="updateBatch"> <foreach collection="whiteList" separator=";" item="white"> UPDATE t_work_order_white SET <if test="white.errorType != null and white.errorType !=''"> error_type = #{white.errorType}, </if> remark = #{white.remark} WHERE serial_number = #{white.serialNumber} </foreach> </update> <insert id="insertBatch"> insert into t_work_order_white (serial_number,error_type,remark) values <foreach item="white" collection="whiteList" separator=","> (#{white.serialNumber},#{white.errorType},#{white.remark}) </foreach> </insert> <delete id="deleteAll"> delete from t_work_order_white; </delete> </mapper>