ycl-common/src/main/java/enumeration/ErrorType.java
@@ -31,6 +31,16 @@ MONITOR_UNQUALIFY("MONITORUNQUALIFY", "一机一档不合格"), PIC_UNUSEFUL("PICUNUSEFUL", "大图不可用"), VIDEO_ORPIC_UNNORMAL("VIDEOORPICUNNORMAL", "视频拉流、图片获取异常"), // 阈值 CLOCK_RIGHT("CLOCK_RIGHT", "时钟准确率异常"), LONG_DAY_NO_DATA("LONG_DAY_NO_DATA", "长时间无数据"), DATA_TIMELY_ERROR("DATA_TIMELY_ERROR", "数据及时性异常"), NOT_UNIQUE_DATA_VOLUME("NOT_UNIQUE_DATA_VOLUME", "不唯一数据量异常"), UNRECOGNIZED_DAY_VOLUME("UNRECOGNIZED_DAY_VOLUME", "白天未识别数据量异常"), CAR_SIX("CAR_SIX", "车辆六项属性不完整"), MODELING_FAIL("MODELING_FAIL", "建模失败率异常"), FACE_LOW("FACE_LOW", "人脸低分率异常"), ; private String value; ycl-pojo/src/main/java/com/ycl/platform/domain/entity/WorkOrderYwConditionRecord.java
@@ -22,9 +22,9 @@ private static final long serialVersionUID = 1L; @ApiModelProperty("工单ID") @TableField("work_order_id") private Integer workOrderId; @ApiModelProperty("工单号") @TableField("work_order_no") private String workOrderNo; @ApiModelProperty("提交人") @TableField("commit_user") ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/VehicleDeviceInspectionResult.java
@@ -120,7 +120,7 @@ @Data public static class SnapClock { /** * 时钟准确率 * 时钟准确率:1 == 100% */ private Float clockPercent; @@ -178,7 +178,7 @@ @Data public static class SnapTimely { /** * 及时率 * 及时率 1 == 100% */ private Float timelyPercent; ycl-server/src/main/java/com/ycl/platform/mapper/WorkOrderErrorTypeMapper.java
@@ -86,4 +86,5 @@ * @return */ int addMany(@Param("errorTypeList") List<WorkOrderErrorType> errorTypeList); } ycl-server/src/main/java/com/ycl/platform/mapper/WorkOrderMapper.java
@@ -75,4 +75,12 @@ List<WorkOrderVO> selectPassOrder(@Param("startTime") LocalDateTime now, @Param("endTime")LocalDateTime thirtyDaysAgo, @Param("status") String status, @Param("auditStatus") String auditStatus); int addMany(@Param("workOrderList") List<WorkOrder> workOrderList); /** * 批量修改状态 * * @param workOrderList * @return */ int updateMany(List<WorkOrder> workOrderList); } ycl-server/src/main/java/com/ycl/platform/mapper/WorkOrderYwConditionRecordMapper.java
@@ -25,4 +25,10 @@ */ List<WorkOrderYwConditionRecordVO> selectYwConditionByYwId(@Param("workOrderId") Integer workOrderId); /** * 批量插入 * * @param ywRecordList */ Integer insertMany(@Param("ywRecordList") List<WorkOrderYwConditionRecord> ywRecordList); } ycl-server/src/main/java/com/ycl/platform/service/impl/WorkOrderServiceImpl.java
@@ -121,6 +121,12 @@ 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)) { @@ -138,20 +144,20 @@ 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); willAddMsg.add(ywRecord); } } else { workOrder.setCreateTime(new Date()); @@ -163,6 +169,15 @@ // } 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; @@ -360,7 +375,7 @@ 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()); ycl-server/src/main/java/com/ycl/platform/service/impl/YwThresholdServiceImpl.java
@@ -12,6 +12,7 @@ import com.ycl.utils.ip.PingUtil; import constant.YwThreadConstants; import enumeration.CompareType; import enumeration.ErrorType; import enumeration.general.BusinessTypeEnum; import enumeration.general.WorkOrderStatusEnum; import lombok.extern.slf4j.Slf4j; @@ -163,24 +164,41 @@ log.error("人脸对象数据为空"); continue; } WorkOrder workOrder = new WorkOrder(); //检查时钟准确率 Float clockPercent = result.getSnapClock().getClockPercent(); check(YwThreadConstants.Face_ClockPercent, clockPercent, result.getExternalIndexCode(), thresholdMap, distributeList, workOrderList, CompareType.LESS_THAN_EQ,""); 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, distributeList, workOrderList, CompareType.LESS_THAN_EQ,""); 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, distributeList, workOrderList, CompareType.MORE_THAN_EQ,""); 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, distributeList, workOrderList, CompareType.MORE_THAN_EQ,""); 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, distributeList, workOrderList, CompareType.LESS_THAN_EQ,""); check(YwThreadConstants.Face_LowScorePercent, lowScorePercent, result.getExternalIndexCode(), thresholdMap, workOrder, CompareType.LESS_THAN_EQ, ErrorType.FACE_LOW.getValue()); //检查建模失败率 Float failPercent = result.getSnapValidity().getFailPercent(); check(YwThreadConstants.Face_FailPercent, failPercent, result.getExternalIndexCode(), thresholdMap, distributeList, workOrderList, CompareType.LESS_THAN_EQ,""); check(YwThreadConstants.Face_FailPercent, failPercent, result.getExternalIndexCode(), thresholdMap, workOrder, CompareType.LESS_THAN_EQ, ErrorType.MODELING_FAIL.getValue()); // 点位在线率 if (2 == result.getSnapResult()) { workOrder.setSerialNumber(result.getExternalIndexCode()); workOrder.setStatus(WorkOrderStatusEnum.DISTRIBUTED); if (CollectionUtils.isEmpty(workOrder.getErrorTypeList())) { workOrder.setErrorTypeList(new ArrayList<>()); workOrder.getErrorTypeList().add(ErrorType.DEVICE_OFFLINE.getValue()); } else { workOrder.getErrorTypeList().add(ErrorType.DEVICE_OFFLINE.getValue()); } } if (WorkOrderStatusEnum.WAIT_DISTRIBUTE.equals(workOrder.getStatus())) { workOrderList.add(workOrder); } else if (WorkOrderStatusEnum.DISTRIBUTED.equals(workOrder.getStatus())) { distributeList.add(workOrder); } } /** 添加工单 */ workOrderService.innerAddWorkOrder(workOrderList); @@ -205,24 +223,41 @@ log.error("车辆对象数据为空"); continue; } WorkOrder workOrder = new WorkOrder(); //检查持续无数据天数 Integer continueNoDataCount = result.getContinueNoDataCount(); check(YwThreadConstants.Car_ContinueNoDataCount, continueNoDataCount, result.getExternalIndexCode(), thresholdMap, distributeList, workOrderList, CompareType.MORE_THAN_EQ,""); 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, distributeList, workOrderList, CompareType.LESS_THAN_EQ,""); 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, distributeList, workOrderList, CompareType.LESS_THAN_EQ,""); 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, distributeList, workOrderList, CompareType.MORE_THAN_EQ,""); 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, distributeList, workOrderList, CompareType.MORE_THAN_EQ,""); check(YwThreadConstants.Car_DayNoNumberCount, dayNoNumberCountResult, result.getExternalIndexCode(), thresholdMap, workOrder, CompareType.MORE_THAN_EQ, ErrorType.UNRECOGNIZED_DAY_VOLUME.getValue()); //车辆六项属性不完整量 Integer noIntegrityCountResult = result.getIntegrity().getNoIntegrityCount(); check(YwThreadConstants.Car_NoIntegrityCount, noIntegrityCountResult, result.getExternalIndexCode(), thresholdMap, distributeList, workOrderList, CompareType.MORE_THAN_EQ,""); check(YwThreadConstants.Car_NoIntegrityCount, noIntegrityCountResult, result.getExternalIndexCode(), thresholdMap, workOrder, CompareType.MORE_THAN_EQ, ErrorType.CAR_SIX.getValue()); // 点位在线率 if (2 == result.getSnapResult()) { workOrder.setSerialNumber(result.getExternalIndexCode()); workOrder.setStatus(WorkOrderStatusEnum.DISTRIBUTED); if (CollectionUtils.isEmpty(workOrder.getErrorTypeList())) { workOrder.setErrorTypeList(new ArrayList<>()); workOrder.getErrorTypeList().add(ErrorType.DEVICE_OFFLINE.getValue()); } else { workOrder.getErrorTypeList().add(ErrorType.DEVICE_OFFLINE.getValue()); } } if (WorkOrderStatusEnum.WAIT_DISTRIBUTE.equals(workOrder.getStatus())) { workOrderList.add(workOrder); } else if (WorkOrderStatusEnum.DISTRIBUTED.equals(workOrder.getStatus())) { distributeList.add(workOrder); } } /** 添加工单 */ workOrderService.innerAddWorkOrder(workOrderList); @@ -251,13 +286,11 @@ * @param value 接口获取到的值 * @param serialNumber 国标码 * @param thresholds 阈值条件map * @param distributeList 要下发的工单容器 * @param workOrderList 待下发的工单容器 * @param compareType 比较方式:>= <= * @param errorType 故障类型 * @param <T> */ private <T extends Comparable<T>> void check(String key, T value, String serialNumber, Map<String, YwThreshold> thresholds, List distributeList, List workOrderList, CompareType compareType,String errorType) { private <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); @@ -267,18 +300,24 @@ //比较大小,加入到对应待处理集合 if (compareType.compare(v, thresholdAutoValue)) { //自动下发工单 WorkOrder workOrder = new WorkOrder(); workOrder.setSerialNumber(serialNumber); workOrder.setStatus(WorkOrderStatusEnum.WAIT_DISTRIBUTE); workOrder.setErrorType(errorType); workOrderList.add(workOrder); if (CollectionUtils.isEmpty(workOrder.getErrorTypeList())) { workOrder.setErrorTypeList(new ArrayList<>()); workOrder.getErrorTypeList().add(errorType); } else { workOrder.getErrorTypeList().add(errorType); } } else if (compareType.compare(v, thresholdValue)) { //进入工单代下发 WorkOrder workOrder = new WorkOrder(); workOrder.setSerialNumber(serialNumber); workOrder.setStatus(WorkOrderStatusEnum.DISTRIBUTED); workOrder.setErrorType(errorType); distributeList.add(workOrder); if (CollectionUtils.isEmpty(workOrder.getErrorTypeList())) { workOrder.setErrorTypeList(new ArrayList<>()); workOrder.getErrorTypeList().add(errorType); } else { workOrder.getErrorTypeList().add(errorType); } } }, () -> log.error("{} 为空: {}", thresholds.get(key).getName(), serialNumber) ycl-server/src/main/java/com/ycl/task/UYTask.java
@@ -144,40 +144,40 @@ public void videoOnlineTask() { //视频图像质量 log.info("开始执行点位在线数据同步"); VideoOnlineParam param = new VideoOnlineParam(); param.setPageNum(ApiConstants.PageNo); param.setPageSize(ApiConstants.PageSize); param.setArealayerno(ApiConstants.AreaNo); param.setStatus(ApiConstants.UY_OnlineStatus_All); param.setIcmpStatus(ApiConstants.UY_OnlineStatus_All); JSONObject jsonObject = uyClient.videoOnline(param); if (jsonObject != null) { Integer statusCode = jsonObject.getInteger("statusCode"); if (ApiConstants.UYSuccessCode.equals(statusCode)) { JSONObject data = jsonObject.getJSONObject("data"); if (data != null) { List<VideoOnlineResult> records = data.getList("records", VideoOnlineResult.class); if (!CollectionUtils.isEmpty(records)) { //如果今天存在之前的数据先删除 Query query = new Query(Criteria .where("mongoCreateTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date()))); DeleteResult result = mongoTemplate.remove(query, VideoOnlineResult.class); //存放在mongo中 mongoTemplate.insertAll(records); // 工单生成 uyErrorTypeCheckService.videoOnlineCheck(records); } else { log.error("点位在线结果数据为空{}", data); } } else { log.error("点位在线结果数据为空{}", jsonObject); } } else { log.error("点位在线结果请求失败{}", jsonObject); } } else { log.error("点位在线结果数据为空"); } // VideoOnlineParam param = new VideoOnlineParam(); // param.setPageNum(ApiConstants.PageNo); // param.setPageSize(ApiConstants.PageSize); // param.setArealayerno(ApiConstants.AreaNo); // param.setStatus(ApiConstants.UY_OnlineStatus_All); // param.setIcmpStatus(ApiConstants.UY_OnlineStatus_All); // JSONObject jsonObject = uyClient.videoOnline(param); // if (jsonObject != null) { // Integer statusCode = jsonObject.getInteger("statusCode"); // if (ApiConstants.UYSuccessCode.equals(statusCode)) { // JSONObject data = jsonObject.getJSONObject("data"); // if (data != null) { // List<VideoOnlineResult> records = data.getList("records", VideoOnlineResult.class); // if (!CollectionUtils.isEmpty(records)) { // //如果今天存在之前的数据先删除 // Query query = new Query(Criteria // .where("mongoCreateTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date()))); // DeleteResult result = mongoTemplate.remove(query, VideoOnlineResult.class); // //存放在mongo中 // mongoTemplate.insertAll(records); // // 工单生成 // uyErrorTypeCheckService.videoOnlineCheck(records); // } else { // log.error("点位在线结果数据为空{}", data); // } // } else { // log.error("点位在线结果数据为空{}", jsonObject); // } // } else { // log.error("点位在线结果请求失败{}", jsonObject); // } // } else { // log.error("点位在线结果数据为空"); // } Query query = new Query(Criteria.where("mongoCreateTime").lt(DateUtils.getDayEnd(new Date()))); uyErrorTypeCheckService.videoOnlineCheck(mongoTemplate.find(query, VideoOnlineResult.class)); log.info("结束执行点位在线数据同步"); ycl-server/src/main/resources/mapper/zgyw/WorkOrderMapper.xml
@@ -219,4 +219,14 @@ WHERE wo.deleted = 0 AND wo.status = #{status} AND woar.result = #{auditStatus} AND wo.deduct = 0 AND woar.create_time between #{startTime} and #{endTime} </select> <update id="updateMany"> <foreach collection="workOrderList" separator=";" item="item"> UPDATE t_work_order SET update_time = #{item.updateTime}, status = #{item.status} WHERE id = #{item.id} </foreach> </update> </mapper> ycl-server/src/main/resources/mapper/zgyw/WorkOrderYwConditionRecordMapper.xml
@@ -15,8 +15,16 @@ <select id="selectYwConditionByYwId" resultMap="BaseResultMap"> SELECT yw.id, yw.commit_user, yw.yw_condition, yw.yw_proofMaterials, yw.create_time, yw.sys_msg, su.nick_name FROM t_work_order_yw_condition_record yw INNER JOIN sys_user su ON yw.commit_user = su.user_id AND yw.deleted = 0 AND yw.work_order_id = #{workOrderId} INNER JOIN sys_user su ON yw.commit_user = su.user_id AND yw.deleted = 0 AND yw.work_order_no = #{workOrderId} ORDER BY yw.create_time DESC </select> <insert id="insertMany"> insert into t_work_order_yw_condition_record (work_order_no, commit_user, yw_condition, deleted, create_time) values <foreach collection="ywRecordList" item="item" separator=","> (#{item.workOrderNo}, #{item.commitUser}, #{item.ywCondition}, 0, now()) </foreach> </insert> </mapper>