ycl-pojo/src/main/java/com/ycl/platform/domain/param/HK/TreeParam.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/HKTreeResult.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ycl-server/src/main/java/com/ycl/feign/HkApiUtil.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ycl-server/src/main/java/com/ycl/platform/service/impl/UYErrorTypeCheckServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ycl-server/src/main/java/com/ycl/platform/service/impl/YwThresholdServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ycl-server/src/main/java/com/ycl/task/HKTask.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ycl-server/src/main/java/com/ycl/task/UYTask.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ycl-server/src/main/java/com/ycl/utils/bean/BeanUtils.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ycl-server/src/main/resources/mapper/zgyw/YwPointMapper.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
ycl-pojo/src/main/java/com/ycl/platform/domain/param/HK/TreeParam.java
New file @@ -0,0 +1,9 @@ package com.ycl.platform.domain.param.HK; import lombok.Data; @Data public class TreeParam extends BaseParam{ private String startDate; private String endDate; } ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/HKTreeResult.java
New file @@ -0,0 +1,32 @@ package com.ycl.platform.domain.result.HK; import com.ycl.platform.domain.result.BaseResult; import lombok.Data; import java.util.Date; import java.util.List; //考核业务树 @Data public class HKTreeResult extends BaseResult { //业务树类型 face/car private String type; private List<Tree> treeList; /** * 考核业务树 */ @Data public static class Tree { //业务树编码 private String cTreeCode; //业务树名称 private String cTreeName; private Integer cType; private String open; private String iSystem; private Date dCreateTime; } } ycl-server/src/main/java/com/ycl/feign/HkApiUtil.java
@@ -2,16 +2,20 @@ import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.fasterxml.jackson.databind.ObjectMapper; import com.hikvision.artemis.sdk.ArtemisHttpUtil; import com.hikvision.artemis.sdk.config.ArtemisConfig; import com.ycl.platform.domain.param.HK.BaseParam; import com.ycl.platform.domain.param.HK.FaceDetectParam; import com.ycl.utils.DateUtils; import com.ycl.utils.bean.BeanUtils; import constant.ApiConstants; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.util.CollectionUtils; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -27,7 +31,7 @@ /** * 调用海康接口 * 调用海康接口 基础数据平台 Post请求 * * @param apiUrl 接口地址:/api/dqd/service/rs/v2/data/faceDetect/query * @param params 请求参数 @@ -80,6 +84,61 @@ return dataList; } /** * 调用海康接口 基础数据平台 Get请求 * * @param apiUrl 接口地址: * @param params 请求参数 * @param resultType 响应结果接收类 * @return 调用结果 */ public static <T> List<T> sendGetAPI(String host,String appKey,String appSecret,String apiUrl, BaseParam params, Class<T> resultType) { // STEP1:设置平台参数,根据实际情况,设置host appkey appsecret 三个参数. ArtemisConfig.host = host; // 平台的ip端口 ArtemisConfig.appKey = appKey; // 密钥appkey ArtemisConfig.appSecret = appSecret;// 密钥appSecret // STEP2:设置OpenAPI接口的上下文 final String ARTEMIS_PATH = "/artemis/aaoo"; // STEP3:设置接口的URI地址 final String previewURLsApi = ARTEMIS_PATH + apiUrl; Map<String, String> path = new HashMap<String, String>(2) { { put("https://", previewURLsApi); } }; // STEP4:设置参数提交方式 // STEP5:组装请求参数 Map<String, String> queryMap = object2Map(params); log.info("请求参数"+queryMap); // STEP6:调用接口 String result = null; List<T> dataList = new ArrayList<>(); for (int i = 0; i < 10; i++) { result = ArtemisHttpUtil.doGetArtemis(path, queryMap, null, null , null); JSONObject jsonObject = JSONObject.parseObject(result); log.info("请求结果"+jsonObject); if(jsonObject.getString("code") == null || !ApiConstants.HKSuccessCode.equals(jsonObject.getString("code"))){ log.error("请求失败{}",result); dataList = null; break; } List<T> resultList = HkApiUtil.getDataList(JSONObject.parseObject(result), resultType); if(CollectionUtils.isEmpty(resultList) || resultList.size()<ApiConstants.HKPageSize) { dataList.addAll(resultList); break; }else { dataList.addAll(resultList); params.setPageNo(params.getPageNo()+1); } } return dataList; } //解析数据 private static <T> List<T> getDataList(JSONObject jsonObject, Class<T> resultClass) { if (jsonObject != null && ApiConstants.HKSuccessCode.equals(jsonObject.getString("code"))) { @@ -96,6 +155,56 @@ return null; } /** * 实体对象转成Map * @param obj 实体对象 * @return */ public static Map<String, String> object2Map(Object obj) { Map<String, String> map = new HashMap<>(); if (obj == null) { return map; } Class clazz = obj.getClass(); Field[] fields = clazz.getDeclaredFields(); try { for (Field field : fields) { field.setAccessible(true); map.put(field.getName(), field.get(obj).toString()); } } catch (Exception e) { e.printStackTrace(); } return map; } /** * Map转成实体对象 * @param map map实体对象包含属性 * @param clazz 实体对象类型 * @return */ public static Object map2Object(Map<String, Object> map, Class<?> clazz) { if (map == null) { return null; } Object obj = null; try { obj = clazz.newInstance(); Field[] fields = obj.getClass().getDeclaredFields(); for (Field field : fields) { int mod = field.getModifiers(); if (Modifier.isStatic(mod) || Modifier.isFinal(mod)) { continue; } field.setAccessible(true); field.set(obj, map.get(field.getName())); } } catch (Exception e) { e.printStackTrace(); } return obj; } } ycl-server/src/main/java/com/ycl/platform/service/impl/UYErrorTypeCheckServiceImpl.java
@@ -37,6 +37,7 @@ private final WorkOrderService workOrderService; private final IYwThresholdService ywThresholdService; /** * 图像检测生成工单 * @@ -45,40 +46,40 @@ @Override public void imageDetectionCheck(List<ImageDetectionResult> dataList) { List<WorkOrder> workOrderList = dataList.stream().filter(item -> -1 == item.getSignal() || -1 == item.getImage() ) .map(item -> { WorkOrder workOrder = new WorkOrder(); // 信号缺失 if (-1 == item.getSigna1() ) { this.genWorkOrder(workOrder, ErrorType.SIGNAL_LOSS, item.getDeviceId()); } // 画面偏色 if (-1 == item.getColor()) { this.genWorkOrder(workOrder, ErrorType.SCREEN_COLOR_DEVIATION, item.getDeviceId()); } // 雪花干扰 if (-1 == item.getSnow()) { this.genWorkOrder(workOrder, ErrorType.SNOW_STORM, item.getDeviceId()); } // 条纹干扰 if (-1 == item.getStripe()) { this.genWorkOrder(workOrder, ErrorType.STRIPE_INTERFERENCE, item.getDeviceId()); } // 画面遮挡 if (-1 == item.getShade()) { this.genWorkOrder(workOrder, ErrorType.SCREEN_OCCLUSION, item.getDeviceId()); } // 清晰度异常 if (-1 == item.getBlur()) { this.genWorkOrder(workOrder, ErrorType.ABNORMAL_CLARITY, item.getDeviceId()); } || -1 == item.getImage() ) .map(item -> { WorkOrder workOrder = new WorkOrder(); // 信号缺失 if (-1 == item.getSigna1()) { this.genWorkOrder(workOrder, ErrorType.SIGNAL_LOSS, item.getDeviceId()); } // 画面偏色 if (-1 == item.getColor()) { this.genWorkOrder(workOrder, ErrorType.SCREEN_COLOR_DEVIATION, item.getDeviceId()); } // 雪花干扰 if (-1 == item.getSnow()) { this.genWorkOrder(workOrder, ErrorType.SNOW_STORM, item.getDeviceId()); } // 条纹干扰 if (-1 == item.getStripe()) { this.genWorkOrder(workOrder, ErrorType.STRIPE_INTERFERENCE, item.getDeviceId()); } // 画面遮挡 if (-1 == item.getShade()) { this.genWorkOrder(workOrder, ErrorType.SCREEN_OCCLUSION, item.getDeviceId()); } // 清晰度异常 if (-1 == item.getBlur()) { this.genWorkOrder(workOrder, ErrorType.ABNORMAL_CLARITY, item.getDeviceId()); } // // 亮度异常 // if (-1 == item.getLight()) { // this.genWorkOrder(workOrder, ErrorType.ABNORMAL_BRIGHTNESS, item.getDeviceId()); // } return workOrder; }).collect(Collectors.toList()); return workOrder; }).collect(Collectors.toList()); workOrderService.innerAddWorkOrder(workOrderList); } @@ -91,18 +92,22 @@ public void monitorQualifyCheck(List<MonitorQualifyResult> dataList) { List<WorkOrder> workOrderList = dataList.stream().map(item -> { WorkOrder workOrder = new WorkOrder(); if (item.getSerialNumber().getError() || item.getCivilCode().getError() || item.getIntegrated_device().getError() || item.getIp().getError() || item.getJkdwlx().getError() || item.getLatitude().getError() || item.getLongitude().getError() || item.getMacdz().getError() || item.getSbzt().getError() || item.getName().getError() || item.getSxjcjqy().getError() || item.getSxjgnlx().getError()) { //TODO:待优云修复,避免工单 MonitorQualifyResult.QualifyResult qualifyResult = new MonitorQualifyResult.QualifyResult(); qualifyResult.setError(false); item.setIntegrated_device(qualifyResult); if (item.getSerialNumber() == null || item.getSerialNumber().getError() || item.getCivilCode() == null || item.getCivilCode().getError() || item.getIntegrated_device() == null || item.getIntegrated_device().getError() || item.getIp() == null || item.getIp().getError() || item.getJkdwlx() == null || item.getJkdwlx().getError() || item.getLatitude() == null || item.getLatitude().getError() || item.getLongitude() == null || item.getLongitude().getError() || item.getMacdz() == null || item.getMacdz().getError() || item.getSbzt() == null || item.getSbzt().getError() || item.getName() == null || item.getName().getError() || item.getSxjcjqy() == null || item.getSxjcjqy().getError() || item.getSxjgnlx() == null || item.getSxjgnlx().getError()) { this.genWorkOrder(workOrder, ErrorType.POINT_INFO_ERROR, item.getSerialNumber().getValue()); } return workOrder; @@ -114,7 +119,7 @@ public void videoOnlineCheck(List<VideoOnlineResult> dataList) { List<WorkOrder> workOrderList = dataList.stream().map(item -> { WorkOrder workOrder = new WorkOrder(); if (ApiConstants.UY_OnlineSite_Offline.equals(item.getStatus()) ) { if (ApiConstants.UY_OnlineSite_Offline.equals(item.getStatus())) { this.genWorkOrder(workOrder, ErrorType.DEVICE_OFFLINE, item.getDeviceId()); } // else if (0 == item.getStatus()) { @@ -160,7 +165,7 @@ long checkTime = item.getCheckTime().getTime(); long osdTime = item.getSetTime().getTime(); Long timeDiff = (checkTime - osdTime) / 1000; ywThresholdService.check(YwThreadConstants.Video_DiffTime,timeDiff ,item.getDeviceNo(),ywThresholdMap,workOrder,CompareType.MORE_THAN_EQ,ErrorType.CLOCK_SKEW.getValue()); ywThresholdService.check(YwThreadConstants.Video_DiffTime, timeDiff, item.getDeviceNo(), ywThresholdMap, workOrder, CompareType.MORE_THAN_EQ, ErrorType.CLOCK_SKEW.getValue()); return workOrder; }).collect(Collectors.toList()); workOrderService.innerAddWorkOrder(workOrderList); @@ -170,7 +175,7 @@ * 工单信息 * * @param workOrder * @param errorType 故障类型 * @param errorType 故障类型 * @param serialNumber 国标码 */ private void genWorkOrder(WorkOrder workOrder, ErrorType errorType, String serialNumber) { ycl-server/src/main/java/com/ycl/platform/service/impl/YwThresholdServiceImpl.java
@@ -72,6 +72,7 @@ @Autowired private WorkOrderWhiteMapper workOrderWhiteMapper; /** * 查询运维阈值 * @@ -156,7 +157,7 @@ // 平台离线故障检测 if (CollectionUtils.isEmpty(list)) { Boolean ping = PingUtil.ping("", 5); if (! ping) { if (!ping) { } } @@ -197,23 +198,35 @@ } WorkOrder workOrder = new WorkOrder(); //检查时钟准确率 Float clockPercent = result.getSnapClock().getClockPercent(); check(YwThreadConstants.Face_ClockPercent, clockPercent, result.getExternalIndexCode(), thresholdMap, workOrder, CompareType.LESS_THAN_EQ, ErrorType.CLOCK_RIGHT.getValue()); if (result.getSnapClock() != null) { Float clockPercent = result.getSnapClock().getClockPercent(); check(YwThreadConstants.Face_ClockPercent, clockPercent, result.getExternalIndexCode(), thresholdMap, workOrder, CompareType.LESS_THAN_EQ, ErrorType.CLOCK_RIGHT.getValue()); } //检查数据及时率 Float timelyPercent = result.getSnapTimely().getTimelyPercent(); check(YwThreadConstants.Face_TimelyPercent, timelyPercent, result.getExternalIndexCode(), thresholdMap, workOrder, CompareType.LESS_THAN_EQ, ErrorType.DATA_TIMELY_ERROR.getValue()); if (result.getSnapTimely() != null) { Float timelyPercent = result.getSnapTimely().getTimelyPercent(); check(YwThreadConstants.Face_TimelyPercent, timelyPercent, result.getExternalIndexCode(), thresholdMap, workOrder, CompareType.LESS_THAN_EQ, ErrorType.DATA_TIMELY_ERROR.getValue()); } //检查持续无数据天数 Integer continueNoDataCount = result.getContinueNoDataCount(); check(YwThreadConstants.Face_ContinueNoDataCount, continueNoDataCount, result.getExternalIndexCode(), thresholdMap, workOrder, CompareType.MORE_THAN_EQ, ErrorType.LONG_DAY_NO_DATA.getValue()); if (result.getContinueNoDataCount() != null) { Integer continueNoDataCount = result.getContinueNoDataCount(); check(YwThreadConstants.Face_ContinueNoDataCount, continueNoDataCount, result.getExternalIndexCode(), thresholdMap, workOrder, CompareType.MORE_THAN_EQ, ErrorType.LONG_DAY_NO_DATA.getValue()); } //检查不唯一数据量 Integer nouniqueCount = result.getSnapUnique().getNouniqueCount(); check(YwThreadConstants.Face_NouniqueCount, nouniqueCount, result.getExternalIndexCode(), thresholdMap, workOrder, CompareType.MORE_THAN_EQ, ErrorType.NOT_UNIQUE_DATA_VOLUME.getValue()); if (result.getSnapUnique() != null) { Integer nouniqueCount = result.getSnapUnique().getNouniqueCount(); check(YwThreadConstants.Face_NouniqueCount, nouniqueCount, result.getExternalIndexCode(), thresholdMap, workOrder, CompareType.MORE_THAN_EQ, ErrorType.NOT_UNIQUE_DATA_VOLUME.getValue()); } //检查人脸低评分率 Float lowScorePercent = result.getSnapValidity().getLowScorePercent(); check(YwThreadConstants.Face_LowScorePercent, lowScorePercent, result.getExternalIndexCode(), thresholdMap, workOrder, CompareType.MORE_THAN_EQ, ErrorType.FACE_LOW.getValue()); if (result.getSnapValidity() != null) { Float lowScorePercent = result.getSnapValidity().getLowScorePercent(); check(YwThreadConstants.Face_LowScorePercent, lowScorePercent, result.getExternalIndexCode(), thresholdMap, workOrder, CompareType.MORE_THAN_EQ, ErrorType.FACE_LOW.getValue()); } //检查建模失败率 Float failPercent = result.getSnapValidity().getFailPercent(); check(YwThreadConstants.Face_FailPercent, failPercent, result.getExternalIndexCode(), thresholdMap, workOrder, CompareType.MORE_THAN_EQ, ErrorType.MODELING_FAIL.getValue()); if (result.getSnapValidity() != null) { Float failPercent = result.getSnapValidity().getFailPercent(); check(YwThreadConstants.Face_FailPercent, failPercent, result.getExternalIndexCode(), thresholdMap, workOrder, CompareType.MORE_THAN_EQ, ErrorType.MODELING_FAIL.getValue()); } // 点位在线率 if (2 == result.getSnapResult()) { workOrder.setSerialNumber(result.getExternalIndexCode()); @@ -259,22 +272,32 @@ Integer continueNoDataCount = result.getContinueNoDataCount(); check(YwThreadConstants.Car_ContinueNoDataCount, continueNoDataCount, result.getExternalIndexCode(), thresholdMap, workOrder, CompareType.MORE_THAN_EQ, ErrorType.LONG_DAY_NO_DATA.getValue()); //检查时钟准确率 Float clockPercent = result.getSnapClock().getClockPercent(); check(YwThreadConstants.Car_ClockPercent, clockPercent, result.getExternalIndexCode(), thresholdMap, workOrder, CompareType.LESS_THAN_EQ, ErrorType.CLOCK_RIGHT.getValue()); if (result.getSnapClock() != null) { Float clockPercent = result.getSnapClock().getClockPercent(); check(YwThreadConstants.Car_ClockPercent, clockPercent, result.getExternalIndexCode(), thresholdMap, workOrder, CompareType.LESS_THAN_EQ, ErrorType.CLOCK_RIGHT.getValue()); } //检查数据及时率 Float timelyPercentResult = result.getSnapTimely().getTimelyPercent(); check(YwThreadConstants.Car_TimelyPercent, timelyPercentResult, result.getExternalIndexCode(), thresholdMap, workOrder, CompareType.LESS_THAN_EQ, ErrorType.DATA_TIMELY_ERROR.getValue()); if (result.getSnapTimely() != null) { Float timelyPercentResult = result.getSnapTimely().getTimelyPercent(); check(YwThreadConstants.Car_TimelyPercent, timelyPercentResult, result.getExternalIndexCode(), thresholdMap, workOrder, CompareType.LESS_THAN_EQ, ErrorType.DATA_TIMELY_ERROR.getValue()); } //检查不唯一数据量 Integer nouniqueCountResult = result.getSnapUnique().getNouniqueCount(); check(YwThreadConstants.Car_NouniqueCount, nouniqueCountResult, result.getExternalIndexCode(), thresholdMap, workOrder, CompareType.MORE_THAN_EQ, ErrorType.NOT_UNIQUE_DATA_VOLUME.getValue()); if (result.getSnapUnique() != null) { Integer nouniqueCountResult = result.getSnapUnique().getNouniqueCount(); check(YwThreadConstants.Car_NouniqueCount, nouniqueCountResult, result.getExternalIndexCode(), thresholdMap, workOrder, CompareType.MORE_THAN_EQ, ErrorType.NOT_UNIQUE_DATA_VOLUME.getValue()); } //检查白天未识别量 Integer dayNoNumberCountResult = result.getSnapPlate().getDayNoNumberCount(); check(YwThreadConstants.Car_DayNoNumberCount, dayNoNumberCountResult, result.getExternalIndexCode(), thresholdMap, workOrder, CompareType.MORE_THAN_EQ, ErrorType.UNRECOGNIZED_DAY_VOLUME.getValue()); if (result.getSnapPlate() != null) { Integer dayNoNumberCountResult = result.getSnapPlate().getDayNoNumberCount(); check(YwThreadConstants.Car_DayNoNumberCount, dayNoNumberCountResult, result.getExternalIndexCode(), thresholdMap, workOrder, CompareType.MORE_THAN_EQ, ErrorType.UNRECOGNIZED_DAY_VOLUME.getValue()); } //车辆主要属性一致率 Integer noIntegrityCountResult = result.getIntegrity().getMainNoIntegrityCount(); Integer dataCount = result.getDataCount(); Double integrityRate = ((double)dataCount-noIntegrityCountResult)/dataCount; check(YwThreadConstants.Car_NoIntegrityCount, integrityRate, result.getExternalIndexCode(), thresholdMap, workOrder, CompareType.LESS_THAN_EQ, ErrorType.CAR_SIX.getValue()); if (result.getIntegrity() != null) { Integer noIntegrityCountResult = result.getIntegrity().getMainNoIntegrityCount(); Integer dataCount = result.getDataCount(); Double integrityRate = ((double) dataCount - noIntegrityCountResult) / dataCount; check(YwThreadConstants.Car_NoIntegrityCount, integrityRate, result.getExternalIndexCode(), thresholdMap, workOrder, CompareType.LESS_THAN_EQ, ErrorType.CAR_SIX.getValue()); } // 点位在线率 if (2 == result.getSnapResult()) { workOrder.setSerialNumber(result.getExternalIndexCode()); @@ -316,6 +339,7 @@ /** * 白名单详情 * * @param id * @return */ @@ -326,6 +350,7 @@ workOrderWhite.setErrorTypeList(errorTypeList); return Result.ok().data(workOrderWhite); } /** * 工单白名单列表 * @@ -338,10 +363,10 @@ IPage<WorkOrderWhite> page = PageUtil.getPage(query, WorkOrderWhite.class); workOrderWhiteMapper.page(page, query); List<WorkOrderWhite> records = page.getRecords(); records.forEach(white-> { records.forEach(white -> { List<String> errorTextList = new ArrayList<>(); List<String> errorTypeList = Arrays.asList(white.getErrorType().split(",")); errorTypeList.forEach(error->{ errorTypeList.forEach(error -> { String errorText = ErrorType.getDescriptionByValue(error); errorTextList.add(errorText); }); @@ -365,12 +390,13 @@ return Result.error("该设备已存在白名单"); } else { List<String> errorTypeList = workOrderWhite.getErrorTypeList(); workOrderWhite.setErrorType(String.join(",",errorTypeList)); workOrderWhite.setErrorType(String.join(",", errorTypeList)); workOrderWhite.setCreateBy(SecurityUtils.getUsername()); workOrderWhiteMapper.insert(workOrderWhite); return Result.ok(); } } /** * 修改工单白名单 * @@ -383,7 +409,7 @@ WorkOrderWhite white = workOrderWhiteMapper.selectBySerialNumber(workOrderWhite.getSerialNumber()); workOrderWhite.setId(white.getId()); List<String> errorTypeList = workOrderWhite.getErrorTypeList(); workOrderWhite.setErrorType(String.join(",",errorTypeList)); workOrderWhite.setErrorType(String.join(",", errorTypeList)); workOrderWhiteMapper.updateById(workOrderWhite); return Result.ok(); } @@ -399,8 +425,10 @@ workOrderWhiteMapper.batchDelete(ids); return Result.ok(); } /** * 白名单导出 * * @param response * @throws IOException */ @@ -408,10 +436,10 @@ public void whiteExport(HttpServletResponse response) throws IOException { //白名单数据 List<WorkOrderWhiteExport> data = workOrderWhiteMapper.whiteExport(); data.forEach(white-> { data.forEach(white -> { List<String> errorTextList = new ArrayList<>(); List<String> errorTypeList = Arrays.asList(white.getErrorType().split(",")); errorTypeList.forEach(error->{ errorTypeList.forEach(error -> { String errorText = ErrorType.getDescriptionByValue(error); errorTextList.add(errorText); }); @@ -426,7 +454,7 @@ errorExports.add(errorExport); }); ExcelWriter excelWriter = null; try(OutputStream outputStream = response.getOutputStream()) { try (OutputStream outputStream = response.getOutputStream()) { excelWriter = EasyExcel.write(outputStream).build(); WriteSheet whiteSheet = EasyExcel.writerSheet(0, "工单白名单清单").head(WorkOrderWhiteExport.class).build(); @@ -436,7 +464,7 @@ excelWriter.write(errorExports, errorSheet); excelWriter.finish(); outputStream.flush(); }catch (Exception e) { } catch (Exception e) { e.printStackTrace(); } finally { try { @@ -451,12 +479,13 @@ /** * 导入工单白名单 * * @param file * @return */ @Override @Transactional(rollbackFor = Exception.class) public Result importWhite(MultipartFile file) throws IOException{ public Result importWhite(MultipartFile file) throws IOException { // Consumer<List<WorkOrderWhiteExport>> consumer = (dataList) -> { // try { // this.updateWhite(dataList); @@ -477,15 +506,17 @@ // 将读取到的每一行存入reportDetails集合中 dataList.add(excel); } @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) {} public void doAfterAllAnalysed(AnalysisContext analysisContext) { } }).sheet().doRead(); if (CollectionUtils.isEmpty(dataList)) { throw new RuntimeException("导入数据不能为空"); } boolean duplic = checkDuplic(dataList); if(duplic) throw new RuntimeException("存在重复国标设备"); if (duplic) throw new RuntimeException("存在重复国标设备"); //已存在的白名单 Map<String, WorkOrderWhite> whiteMap = workOrderWhiteMapper.selectList().stream().collect(Collectors.toMap(WorkOrderWhite::getSerialNumber, Function.identity())); List<WorkOrderWhite> addList = new ArrayList<>(); @@ -496,34 +527,36 @@ //备注 white.setRemark(item.getRemark()); String errorType = item.getErrorType(); if(StringUtils.isEmpty(errorType)){ throw new RuntimeException("国标码为"+item.getSerialNumber()+"的设备故障不能为空"); 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->{ errorExcelList.forEach(desc -> { //把中文转换为数据库存储格式 String errorText = ErrorType.getValueByDescription(desc); //找不到抛出异常 if(errorText == null) throw new RuntimeException("国标码为"+item.getSerialNumber()+"的设备故障类型有误"); 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()); if (whiteExsit != null) white.setId(whiteExsit.getId()); addList.add(white); } catch (Exception e) { throw new RuntimeException("国标码为"+item.getSerialNumber()+"的设备故障类型有误"); throw new RuntimeException("国标码为" + item.getSerialNumber() + "的设备故障类型有误"); } }); if(!CollectionUtils.isEmpty(addList)) { if (!CollectionUtils.isEmpty(addList)) { workOrderWhiteMapper.deleteAll(); workOrderWhiteMapper.insertBatch(addList); } return Result.ok(); } /** * 修改白名单 * @@ -545,46 +578,49 @@ //备注 white.setRemark(item.getRemark()); String errorType = item.getErrorType(); if(StringUtils.isEmpty(errorType)){ throw new RuntimeException("国标码为"+item.getSerialNumber()+"的设备故障不能为空"); 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->{ errorExcelList.forEach(desc -> { //把中文转换为数据库存储格式 String errorText = ErrorType.getValueByDescription(desc); //找不到抛出异常 if(errorText == null) throw new RuntimeException("国标码为"+item.getSerialNumber()+"的设备故障类型有误"); if (errorText == null) throw new RuntimeException("国标码为" + item.getSerialNumber() + "的设备故障类型有误"); errorDataList.add(errorText); }); white.setErrorType(String.join(",", errorDataList)); if(!CollectionUtils.isEmpty(serialNumbers) && serialNumbers.contains(white.getSerialNumber())){ if (!CollectionUtils.isEmpty(serialNumbers) && serialNumbers.contains(white.getSerialNumber())) { updateList.add(white); }else { } else { addList.add(white); } } catch (Exception e) { throw new RuntimeException("国标码为"+item.getSerialNumber()+"的设备故障类型有误"); throw new RuntimeException("国标码为" + item.getSerialNumber() + "的设备故障类型有误"); } }); if(!CollectionUtils.isEmpty(addList)) workOrderWhiteMapper.insertBatch(addList); if(!CollectionUtils.isEmpty(updateList)) workOrderWhiteMapper.updateBatch(updateList); if (!CollectionUtils.isEmpty(addList)) workOrderWhiteMapper.insertBatch(addList); if (!CollectionUtils.isEmpty(updateList)) workOrderWhiteMapper.updateBatch(updateList); } /** * 检查阈值 * * @param key 某阈值标识 * @param value 接口获取到的值 * @param key 某阈值标识 * @param value 接口获取到的值 * @param serialNumber 国标码 * @param thresholds 阈值条件map * @param compareType 比较方式:>= <= * @param errorType 故障类型 * @param thresholds 阈值条件map * @param compareType 比较方式:>= <= * @param errorType 故障类型 * @param <T> */ @Override public <T extends Comparable<T>> void check(String key, T value, String serialNumber, Map<String, YwThreshold> thresholds, WorkOrder workOrder, CompareType compareType,String errorType) { public <T extends Comparable<T>> void check(String key, T value, String serialNumber, Map<String, YwThreshold> thresholds, WorkOrder workOrder, CompareType compareType, String errorType) { Optional.ofNullable(value).ifPresentOrElse( v -> { YwThreshold ywThreshold = thresholds.get(key); @@ -593,7 +629,7 @@ T thresholdAutoValue = parseThreshold(ywThreshold.getValueAuto(), value.getClass()); //直接下发工单阈值 T thresholdValue = parseThreshold(ywThreshold.getValue(), value.getClass()); if("percent".equals(ywThreshold.getCountType())){ if ("percent".equals(ywThreshold.getCountType())) { if (thresholdAutoValue instanceof Float) { thresholdAutoValue = (T) Float.valueOf(((Float) thresholdAutoValue) / 100f); } ycl-server/src/main/java/com/ycl/task/HKTask.java
@@ -406,6 +406,30 @@ log.info("结束人脸设备抽检指标监测结果数据同步"); } //业务树 public void TreeTask() { log.info("开始执行业务树数据"); TreeParam param = new TreeParam(); param.setStartDate("2024-12-06"); param.setEndDate("2024-12-06"); List<HKTreeResult> faceList = HkApiUtil.sendGetAPI(host,appKey,appSecret,"/api/third/timeTree", param, HKTreeResult.class); // if (!CollectionUtils.isEmpty(faceList)) { // //如果今天存在之前的数据先删除 // Query query = new Query(Criteria // .where("mongoCreateTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date()))); // DeleteResult result = mongoTemplate.remove(query, FaceDeviceSamplingResult.class); // faceList.stream().forEach(item -> { // if (Objects.nonNull(item.getExternalIndexCode())) { // item.setNo(item.getExternalIndexCode()); // } // }); // pointService.setDeviceTagByGB(faceList,CheckConstants.Rule_Category_Face); // //存放在mongo中 // mongoTemplate.insertAll(faceList); // } log.info("结束业务树数据"); } //解析数据 private <T> List<T> getDataList(JSONObject jsonObject, Class<T> resultClass, String message) { if (jsonObject != null && ApiConstants.HKSuccessCode.equals(jsonObject.getString("code"))) { ycl-server/src/main/java/com/ycl/task/UYTask.java
@@ -197,7 +197,9 @@ List<TMonitorResult> monitorList = monitorMapper.getDistinctIP(); //补充错误时间点 Query onlineQuery = new Query(Criteria.where("mongoCreateTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date()))); Map<String, TMonitorResult> mongoMap = mongoTemplate.find(onlineQuery, TMonitorResult.class).stream().collect(Collectors.toMap(TMonitorResult::getNo, Function.identity())); Map<String, TMonitorResult> mongoMap = mongoTemplate.find(onlineQuery, TMonitorResult.class) .stream() .collect(Collectors.toMap(TMonitorResult::getNo, Function.identity(), (existing, replacement) -> replacement)); for (TMonitorResult result : monitorList) { TMonitorResult mongoData = mongoMap.get(result.getNo()); if(mongoData!=null){ ycl-server/src/main/java/com/ycl/utils/bean/BeanUtils.java
@@ -1,14 +1,18 @@ package com.ycl.utils.bean; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Bean 工具类 * * * @author ruoyi */ public class BeanUtils extends org.springframework.beans.BeanUtils @@ -24,7 +28,7 @@ /** * Bean属性复制工具方法。 * * * @param dest 目标对象 * @param src 源对象 */ @@ -42,7 +46,7 @@ /** * 获取对象的setter方法。 * * * @param obj 对象 * @return 对象的setter方法列表 */ @@ -70,7 +74,7 @@ /** * 获取对象的getter方法。 * * * @param obj 对象 * @return 对象的getter方法列表 */ @@ -97,7 +101,7 @@ /** * 检查Bean方法名中的属性名是否相等。<br> * 如getName()和setName()属性名一样,getName()和setAge()属性名不一样。 * * * @param m1 方法名1 * @param m2 方法名2 * @return 属性名一样返回true,否则返回false @@ -107,4 +111,7 @@ { return m1.substring(BEAN_METHOD_PROP_INDEX).equals(m2.substring(BEAN_METHOD_PROP_INDEX)); } } ycl-server/src/main/resources/mapper/zgyw/YwPointMapper.xml
@@ -232,7 +232,7 @@ deleted = 0 AND serial_number in <foreach collection="gbList" open="(" separator="," close=")" item="no">#{no}</foreach> GROUP BY serial_number, province_tag_face,province_tag_car,province_tag_videogetTagsByGB, important_tag, important_command_image_tag, dept_tag serial_number, province_tag_face,province_tag_car,province_tag_video, important_tag, important_command_image_tag, dept_tag </select> <select id="selectToCount" resultType="com.ycl.platform.domain.vo.YwPointVO">