From 23302186a81c1b6f3e5f398f21b057350bfd34e8 Mon Sep 17 00:00:00 2001 From: fuliqi <fuliqi@qq.com> Date: 星期四, 16 一月 2025 12:18:08 +0800 Subject: [PATCH] 工单扣分处理时间调整逻辑 --- ycl-server/src/main/java/com/ycl/task/ContractTask.java | 94 +++++++++++++++++++++++++++++++++++++++------- 1 files changed, 79 insertions(+), 15 deletions(-) diff --git a/ycl-server/src/main/java/com/ycl/task/ContractTask.java b/ycl-server/src/main/java/com/ycl/task/ContractTask.java index 60eb9b8..b54211c 100644 --- a/ycl-server/src/main/java/com/ycl/task/ContractTask.java +++ b/ycl-server/src/main/java/com/ycl/task/ContractTask.java @@ -80,7 +80,7 @@ .filter(calculateRuleVO -> ContractRule.CONTRACT_RULE_Online.getName().equals(calculateRuleVO.getRuleName())) .collect(Collectors.toList()); List<Integer> unitIds = ruleVos.stream().map(CalculateRuleVO::getUnitId).collect(Collectors.toList()); - List<YwPoint> ywPoints = ywPointMapper.selectList(new QueryWrapper<YwPoint>().in("unit_id", unitIds)); + List<YwPoint> ywPoints = ywPointMapper.selectList(new QueryWrapper<YwPoint>().in("unit_id", unitIds).eq("examine_status",1)); //key鏄痷nitId value鏄澶囩紪鐮侀泦鍚� Map<Long, List<YwPoint>> unitMap = ywPoints.stream().filter(point -> point.getUnitId() != null) .collect(Collectors.groupingBy( @@ -99,7 +99,7 @@ if (!CollectionUtils.isEmpty(reportNumbers) && reportNumbers.contains(point.getSerialNumber())) continue; totalSite++; - if (ApiConstants.UY_OnlineSite_Online.equals(point.getOnline())) { + if (ApiConstants.UY_OnlineSite_Online.equals(point.getOnline()) && ApiConstants.UY_OnlineSite_Online.equals(point.getPingOnline())) { onlineSite++; } } @@ -120,7 +120,6 @@ //鏈堝簳璁$畻鍦ㄧ嚎鐜囧垎鏁� public void calculateOnlineScore() { - //TODO:妫�鏌ヨ〃 log.info("寮�濮嬭绠楀悎鍚岀偣浣嶅湪绾跨巼鍒嗘暟"); //鏈堝簳闇�瑕佺粺璁″钩鍧囧湪绾跨巼鐒跺悗杩涜绉垎鎵i櫎 String mouthStart = DateUtils.getMouthStart(new Date()); @@ -179,7 +178,7 @@ .collect(Collectors.groupingBy( CalculateRuleVO::getRuleName, // 鎸夎鍒欏悕绉板垎缁� Collectors.groupingBy( - CalculateRuleVO::getContractId // 姣忎釜瑙勫垯鍚嶇О鍐呴儴鍐嶆寜鍚堝悓ID鍒嗙粍,value涓鸿鍒欓泦鍚� + CalculateRuleVO::getContractId // 姣忎釜瑙勫垯鍚嶇О鍐呴儴鍐嶆寜鍚堝悓ID鍒嗙粍,value涓鸿鍒欓泦鍚�(澶氫釜鍚堝悓鎯呭喌) ) )); //鍓嶇鎰熺煡婧愭不鐞嗗伐浣滐紙鏃堕挓鍚屾瑙勫垯銆丱SD瑙勫垯銆佷竴鏈轰竴妗h鍒欙級 鑾峰彇key涓哄悎鍚宨d锛寁alue涓鸿鍒欑殑map @@ -195,12 +194,38 @@ LocalDateTime endTime = LocalDateTime.now(); // 璁$畻30澶╁墠鐨勬棩鏈� LocalDateTime startTime = endTime.minusDays(30); - List<WorkOrderVO> workOrders = workOrderMapper.selectPassOrder(startTime, endTime, WorkOrderStatusEnum.AUDITING_SUCCESS.getValue(), "瀹℃牳閫氳繃"); + //鑷姩鎵e垎鐨勫伐鍗曟晠闅滅被鍨� + 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)) { if (reportNumbers.contains(workOrder.getSerialNumber())) continue; } +// if(!WorkOrderStatusEnum.AUDITING_SUCCESS.equals(workOrder.getStatus())) continue; String errorType = workOrder.getErrorType(); //瀛樺偍鏁呴殰 褰曞儚鎴栧浘鐗囪闂紓甯� 锛堟敼鎴愭墜鍔ㄦ墦鍒嗕簡锛� // if (ErrorType.VIDEO_NONE.getValue().equals(errorType) || ErrorType.PIC_URLABNORMAL.getValue().equals(errorType)) { @@ -227,7 +252,7 @@ // } // } //鍓嶇鎰熺煡婧愭不鐞嗗伐浣滐紙鏃堕挓鍚屾瑙勫垯銆丱SD瑙勫垯銆佷竴鏈轰竴妗h鍒欙級 - if (ErrorType.OSD_ERROR.getValue().equals(errorType) || ErrorType.CLOCK_SKEW.getValue().equals(errorType) || ErrorType.CLOCK_RIGHT.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(); @@ -235,10 +260,24 @@ 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(!rule.getRuleCondition().equals("OSD鏍囪瘑")) continue; + }else if(ErrorType.CLOCK_SKEW.getValue().equals(errorType)){ + if(!rule.getRuleCondition().equals("鏃堕挓鍚屾")) continue; + }else if( ErrorType.POINT_INFO_ERROR.getValue().equals(errorType)){ + if(!rule.getRuleCondition().equals("涓�鏈轰竴妗�")) continue; + } + if (checkRange(rule.getMin(), rule.getMax(), new BigDecimal(diffTime))) { double deductScore = rule.getCalcFraction(); ContractScore contractScore = getContractScore(rule, deductScore, Math.round(diffTime * 100) / 100 + "", Remark + "宸ュ崟缂栧彿涓�:" + workOrder.getWorkOrderNo() + "澶勭悊瓒呮椂锛屾墸闄�" + deductScore + "鍒�"); @@ -251,7 +290,7 @@ } } //鐐逛綅寮傚父鎯呭喌澶勭悊锛堥暅澶村紓甯搞�佹憚鍍忓ご閬尅绛夛級 - if (ErrorType.SCREEN_OCCLUSION.getValue().equals(errorType)) { + if (ErrorType.ABNORMAL_PIC.getValue().equals(errorType)) { if (!CollectionUtils.isEmpty(monitorRuleMap)) { siteRuleMap.forEach((contractId, rules) -> { Integer unitId = rules.get(0).getUnitId(); @@ -259,8 +298,13 @@ 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))) { @@ -294,6 +338,27 @@ log.info("缁撴潫鎵ц宸ュ崟鎵e垎"); } + 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; + } + /** * 涓嶅畾鏈熸鏌ユ暟鎹� 鎵i櫎绉垎 @@ -318,7 +383,7 @@ List<ContractScore> contractScoreList = new ArrayList<>(); //鏌ヨ鎶ュ鍒楄〃 List<String> reportNumbers = reportMapper.selectNumberList(AuditStatus_Pass, DateUtils.getDate()); - Date date = DateUtils.getDay(2024, 7, 13); + Date date = new Date(); //鏌ュ浘鐗囧畬鏁存�ц鍒� 鑾峰彇key涓哄悎鍚宨d锛寁alue涓鸿鍒欑殑map Map<Integer, List<CalculateRuleVO>> contractMap = contractMapper.getCalculateRule(new Date()).stream() .filter(calculateRuleVO -> ContractRule.CONTRACT_RULE_PicComplete.getName().equals(calculateRuleVO.getRuleName())) @@ -398,8 +463,7 @@ List<ContractScore> contractScoreList = new ArrayList<>(); //鏌ヨ鎶ュ鍒楄〃 List<String> reportNumbers = reportMapper.selectNumberList(AuditStatus_Pass, DateUtils.getDate()); - //TODO:娴嬭瘯鏃ユ湡 - Date date = DateUtils.getDay(2024, 7, 13); + Date date = new Date(); //鏌ュ浘鐗囧畬鏁存�ц鍒� 鑾峰彇key涓哄悎鍚宨d锛寁alue涓鸿鍒欑殑map Map<Integer, List<CalculateRuleVO>> contractMap = contractMapper.getCalculateRule(new Date()).stream() .filter(calculateRuleVO -> ContractRule.CONTRACT_RULE_VideoRecord.getName().equals(calculateRuleVO.getRuleName())) -- Gitblit v1.8.0