| | |
| | | LocalDateTime endTime = LocalDateTime.now(); |
| | | // 计算30天前的日期 |
| | | LocalDateTime startTime = endTime.minusDays(30); |
| | | List<WorkOrderVO> workOrders = workOrderMapper.selectPassOrder(startTime, endTime, WorkOrderStatusEnum.AUDITING_SUCCESS.getValue(), "审核通过"); |
| | | //自动扣分的工单故障类型 |
| | | List<String> deductErrorType = new ArrayList<>(); |
| | | deductErrorType.add(ErrorType.OSD_ERROR.getValue()); |
| | | deductErrorType.add(ErrorType.ABNORMAL_PIC.getValue()); |
| | | deductErrorType.add(ErrorType.POINT_INFO_ERROR.getValue()); |
| | | deductErrorType.add(ErrorType.CLOCK_SKEW.getValue()); |
| | | List<WorkOrderVO> workOrders = workOrderMapper.selectPassOrder(startTime, endTime, WorkOrderStatusEnum.AUDITING_SUCCESS.getValue(),deductErrorType); |
| | | //存在有两种扣分的故障 只扣减第一个故障 |
| | | Map<String, WorkOrderVO> map = workOrders.stream() |
| | | .collect(Collectors.toMap( |
| | | WorkOrderVO::getWorkOrderNo, |
| | | Function.identity(), |
| | | (older, newer) -> older.getDistributeTime().compareTo(newer.getDistributeTime()) <= 0 ? older : newer |
| | | )); |
| | | workOrders = new ArrayList<>(map.values()); |
| | | List<String> workOrderNos = workOrders.stream().map(WorkOrderVO::getWorkOrderNo).collect(Collectors.toList()); |
| | | List<WorkOrderVO> auditTimeList = workOrderMapper.getAuditTimeList(workOrderNos); |
| | | Map<String, List<Date>> auditTimeMap = auditTimeList.stream() |
| | | .collect(Collectors.groupingBy( |
| | | WorkOrderVO::getWorkOrderNo, // 分组的键 |
| | | Collectors.mapping(WorkOrderVO::getAuditTime, Collectors.toList()))); |
| | | List<WorkOrderVO> handleTimeList = workOrderMapper.getHandleTimeList(workOrderNos); |
| | | Map<String, List<Date>> handleTimeMap = handleTimeList.stream() |
| | | .collect(Collectors.groupingBy( |
| | | WorkOrderVO::getWorkOrderNo, // 分组的键 |
| | | Collectors.mapping(WorkOrderVO::getHandleTime, Collectors.toList()))); |
| | | for (WorkOrderVO workOrder : workOrders) { |
| | | //检测是否报备过 |
| | | if (!CollectionUtils.isEmpty(reportNumbers)) { |
| | |
| | | // } |
| | | // } |
| | | //前端感知源治理工作(时钟同步规则、OSD规则、一机一档规则) |
| | | if (ErrorType.OSD_ERROR.getValue().equals(errorType) || ErrorType.CLOCK_SKEW.getValue().equals(errorType) || ErrorType.CLOCK_RIGHT.getValue().equals(errorType) || ErrorType.POINT_INFO_ERROR.getValue().equals(errorType)) { |
| | | if (ErrorType.OSD_ERROR.getValue().equals(errorType) || ErrorType.CLOCK_SKEW.getValue().equals(errorType) || ErrorType.POINT_INFO_ERROR.getValue().equals(errorType)) { |
| | | if (!CollectionUtils.isEmpty(monitorRuleMap)) { |
| | | monitorRuleMap.forEach((contractId, rules) -> { |
| | | Integer unitId = rules.get(0).getUnitId(); |
| | |
| | | if (workOrder.getUnitId().equals(unitId)) { |
| | | //工单下发时间 |
| | | Date createTime = workOrder.getDistributeTime(); |
| | | Date auditTime = workOrder.getAuditTime(); |
| | | double diffTime = (double) (auditTime.getTime() - createTime.getTime()) / (1000 * 60 * 60); |
| | | List<Date> auditTimes = auditTimeMap.get(workOrder.getWorkOrderNo()); |
| | | List<Date> handleTimes = handleTimeMap.get(workOrder.getWorkOrderNo()); |
| | | //拿到审核时间 |
| | | long auditDuration = getAuditDuration(auditTimes, handleTimes); |
| | | //审核通过时间 |
| | | Date passTime = Collections.max(auditTimes); |
| | | //处理花费总时长 |
| | | double diffTime = (double) (passTime.getTime() - createTime.getTime() - auditDuration) / (1000 * 60 * 60); |
| | | //找到对应规则、选择时间范围内的规则 |
| | | for (CalculateRuleVO rule : rules) { |
| | | if(ErrorType.OSD_ERROR.getValue().equals(errorType)){ |
| | |
| | | if (workOrder.getUnitId().equals(unitId)) { |
| | | //工单下发时间 |
| | | Date createTime = workOrder.getDistributeTime(); |
| | | Date auditTime = workOrder.getAuditTime(); |
| | | double diffTime = (double) (auditTime.getTime() - createTime.getTime()) / (1000 * 60 * 60); |
| | | List<Date> auditTimes = auditTimeMap.get(workOrder.getWorkOrderNo()); |
| | | List<Date> handleTimes = handleTimeMap.get(workOrder.getWorkOrderNo()); |
| | | //拿到审核时间 |
| | | long auditDuration = getAuditDuration(auditTimes, handleTimes); |
| | | //审核通过时间 |
| | | Date passTime = Collections.max(auditTimes); |
| | | double diffTime = (double) (passTime.getTime() - createTime.getTime() -auditDuration) / (1000 * 60 * 60); |
| | | //选择时间范围内的规则 |
| | | for (CalculateRuleVO rule : rules) { |
| | | if (checkRange(rule.getMin(), rule.getMax(), new BigDecimal(diffTime))) { |
| | |
| | | log.info("结束执行工单扣分"); |
| | | } |
| | | |
| | | private long getAuditDuration(List<Date> auditTimes, List<Date> handleTimes) { |
| | | //计算出审核的总时间(由于故障类型会更新导致可能提交的时间点数量和审核的时间点数量不一致) |
| | | long auditDuration = 0; |
| | | for (Date auditTime : auditTimes) { |
| | | //离这次审核最近的一次提交处理时间点 |
| | | Date nearestHandleTime = null; |
| | | long minDifference = Long.MAX_VALUE; |
| | | for (Date handleTime : handleTimes) { |
| | | if(handleTime.before(auditTime)) { |
| | | long difference = Math.abs(auditTime.getTime() - handleTime.getTime()); |
| | | if (difference < minDifference) { |
| | | minDifference = difference; |
| | | nearestHandleTime = handleTime; |
| | | } |
| | | } |
| | | } |
| | | auditDuration += auditTime.getTime()-nearestHandleTime.getTime(); |
| | | } |
| | | return auditDuration; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 不定期检查数据 扣除积分 |