From 0ba453c66cd5d20b970c894358031c9c06df7071 Mon Sep 17 00:00:00 2001 From: zxl <763096477@qq.com> Date: 星期四, 05 六月 2025 10:43:26 +0800 Subject: [PATCH] 大屏修改,以及报错日志添加 --- ycl-server/src/main/java/com/ycl/task/ContractTask.java | 433 ++++++++++++++++++++++++++++++++--------------------- 1 files changed, 259 insertions(+), 174 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 26c75e0..8e898c8 100644 --- a/ycl-server/src/main/java/com/ycl/task/ContractTask.java +++ b/ycl-server/src/main/java/com/ycl/task/ContractTask.java @@ -8,9 +8,8 @@ import com.ycl.platform.domain.entity.WorkOrder; import com.ycl.platform.domain.entity.YwPoint; import com.ycl.platform.domain.result.HK.PicAccessResult; -import com.ycl.platform.domain.result.HK.SnapshotDataMonitorResult; +import com.ycl.platform.domain.result.SYS.TMonitorResult; import com.ycl.platform.domain.result.UY.RecordMetaDSumResult; -import com.ycl.platform.domain.result.UY.VideoOnlineResult; import com.ycl.platform.domain.vo.CalculateRuleVO; import com.ycl.platform.domain.vo.WorkOrderVO; import com.ycl.platform.mapper.*; @@ -25,6 +24,7 @@ import enumeration.general.WorkOrderStatusEnum; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DataAccessException; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; @@ -33,8 +33,10 @@ import java.math.BigDecimal; import java.math.RoundingMode; +import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.util.*; +import java.util.function.Function; import java.util.stream.Collectors; @@ -43,6 +45,7 @@ */ @Slf4j @Component("contractTask") +//TODO:閲嶆柊鐪嬩笅閫昏緫 public class ContractTask { @Autowired private MongoTemplate mongoTemplate; @@ -64,13 +67,11 @@ private static final Integer Offline = -1; private static final String AuditStatus_Pass = "1"; private static final String Remark = "绯荤粺鐢熸垚"; - private static final Integer randomSize = 30; /** * 鍚堝悓鑰冩牳 鍦ㄧ嚎鐜囨瘡鏃ヤ换鍔℃娴� * 鏌ョ敓鏁堢殑鍚堝悓鍏宠仈鐨勫叕鍙革紝鑾峰彇unitId闆嗗悎 * 鏍规嵁unitId鏌ヨ瀵瑰簲鐐逛綅鑾峰彇鍚勪釜鍏徃绠$悊鐨勮澶嘔ds - * 鏌ヨ涓夌璁惧鍦ㄧ嚎涓嶅湪绾挎儏鍐碉紝灏佽涓轰竴涓猰ap<鍥芥爣鐮�,鍦ㄧ嚎鐘舵��> * 璁$畻姣忔棩姣忓鍏徃鐨勫湪绾跨巼瀛樺叆mysql * 鏈堝簳璁$畻骞冲潎鍊硷紝鏍规嵁鍦ㄧ嚎鐜囧拰鍚堝悓鏍囧噯鎵e噺鍒嗘暟 */ @@ -80,55 +81,33 @@ .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<String>> unitMap = ywPoints.stream() + Map<Long, List<YwPoint>> unitMap = ywPoints.stream().filter(point -> point.getUnitId() != null) .collect(Collectors.groupingBy( - YwPoint::getUnitId, - Collectors.mapping( - YwPoint::getSerialNumber, - Collectors.toList() + YwPoint::getUnitId ) - )); - Map<String, Integer> onlineStatusMap = new HashMap<>(); - //TODO 鍦ㄧ嚎鐜囦慨鏀癸紝鏌ongo鑾峰彇璁惧鍦ㄧ嚎鎯呭喌 - Date date = DateUtils.getDay(2024, 7, 13); - //杞﹁締銆佷汉鑴� - Query query = new Query(); - query.addCriteria(Criteria - .where("mongoCreateTime").gte(DateUtils.getDayStart(date)).lt(DateUtils.getDayEnd(date))); - List<SnapshotDataMonitorResult> results = mongoTemplate.find(query, SnapshotDataMonitorResult.class); - for (SnapshotDataMonitorResult result : results) { - if (ApiConstants.HK_SnapCount_ResultType_Null != result.getResultType()) { - onlineStatusMap.put(result.getExternalIndexCode(), Online); - } else { - onlineStatusMap.put(result.getExternalIndexCode(), Offline); - } - } - //瑙嗛 - Query videoQuery = new Query(Criteria - .where("mongoCreateTime").gte(DateUtils.getDayStart(date)).lt(DateUtils.getDayEnd(date))); - List<VideoOnlineResult> videoOnlineResults = mongoTemplate.find(videoQuery, VideoOnlineResult.class); - for (VideoOnlineResult videoOnlineResult : videoOnlineResults) { - onlineStatusMap.put(videoOnlineResult.getDeviceId(), videoOnlineResult.getStatus()); - } + ); //鏌ヨ鎶ュ鍒楄〃 List<String> reportNumbers = reportMapper.selectNumberList(AuditStatus_Pass, DateUtils.getDate()); //璁$畻姣忎釜鍏徃鐨勭偣浣嶅湪绾跨巼 List<ContractRuleRecord> ruleRecordList = new ArrayList<>(); - unitMap.forEach((unitId, serialNumberList) -> { + unitMap.forEach((unitId, pointList) -> { int totalSite = 0; int onlineSite = 0; - for (String number : serialNumberList) { + for (YwPoint point : pointList) { //鎶ュ杩囦笉绾冲叆璁$畻 - if (!CollectionUtils.isEmpty(reportNumbers) && reportNumbers.contains(number)) continue; - Integer status = onlineStatusMap.get(number); + if (!CollectionUtils.isEmpty(reportNumbers) && reportNumbers.contains(point.getSerialNumber())) + continue; totalSite++; - if (Online.equals(status)) { + if (ApiConstants.UY_OnlineSite_Online.equals(point.getOnline()) && ApiConstants.UY_OnlineSite_Online.equals(point.getPingOnline())) { onlineSite++; } } - BigDecimal online = new BigDecimal(onlineSite).divide(new BigDecimal(totalSite), 2, RoundingMode.DOWN); + BigDecimal online = BigDecimal.ONE; + if (totalSite != 0) { + online = new BigDecimal(onlineSite).divide(new BigDecimal(totalSite), 2, RoundingMode.DOWN); + } ContractRuleRecord contractRuleRecord = new ContractRuleRecord(); contractRuleRecord.setSiteOnline(online); contractRuleRecord.setCreateTime(new Date()); @@ -143,16 +122,14 @@ //鏈堝簳璁$畻鍦ㄧ嚎鐜囧垎鏁� public void calculateOnlineScore() { log.info("寮�濮嬭绠楀悎鍚岀偣浣嶅湪绾跨巼鍒嗘暟"); - //濡傛灉鏄湀搴曪紝闇�瑕佺粺璁″钩鍧囧湪绾跨巼鐒跺悗杩涜绉垎鎵i櫎 -// String now = DateUtils.getDate(); + //鏈堝簳闇�瑕佺粺璁″钩鍧囧湪绾跨巼鐒跺悗杩涜绉垎鎵i櫎 String mouthStart = DateUtils.getMouthStart(new Date()); String mouthEnd = DateUtils.getMouthEnd(new Date()); -// if (now.equals(mouthEnd)) { //鏌ヤ竴涓湀鐨勮褰� List<ContractRuleRecord> ruleMonthRecords = recordMapper.selectMonth(mouthStart, mouthEnd); - //閫氳繃unitId鍒嗗崟浣� + //閫氳繃unitId鍒嗗崟浣嶏紝鑾峰彇褰撴湀鏁版嵁map Map<Long, List<ContractRuleRecord>> unitMap = ruleMonthRecords.stream().collect(Collectors.groupingBy(ContractRuleRecord::getUnitId)); - //鏌ュ湪绾跨巼瑙勫垯 鑾峰彇key涓哄悎鍚宨d锛寁alue涓哄湪绾跨巼瑙勫垯鐨刴ap + //鏌ュ湪绾跨巼瑙勫垯 鑾峰彇key涓哄悎鍚宨d锛寁alue涓哄湪绾跨巼瑙勫垯闆嗗悎 Map<Integer, List<CalculateRuleVO>> contractMap = contractMapper.getCalculateRule(new Date()).stream() .filter(calculateRuleVO -> ContractRule.CONTRACT_RULE_Online.getName().equals(calculateRuleVO.getRuleName())) .collect(Collectors.groupingBy(CalculateRuleVO::getContractId)); @@ -164,7 +141,7 @@ CalculateRuleVO calculateRuleVO = ruleList.get(0); Integer unitId = calculateRuleVO.getUnitId(); List<ContractRuleRecord> ruleRecordList = unitMap.get(Long.parseLong(unitId + "")); - if (!CollectionUtils.isEmpty(ruleMonthRecords)) { + if (!CollectionUtils.isEmpty(ruleRecordList)) { BigDecimal siteOnlineTotal = ruleRecordList.stream().map(ContractRuleRecord::getSiteOnline).reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal siteOnline = siteOnlineTotal.divide(new BigDecimal(ruleRecordList.size()), 2, RoundingMode.DOWN); for (CalculateRuleVO ruleVO : ruleList) { @@ -180,7 +157,6 @@ } } }); -// } contractScoreService.saveBatch(contractScoreList); log.info("缁撴潫璁$畻鍚堝悓鐐逛綅鍦ㄧ嚎鐜囧垎鏁�"); } @@ -203,13 +179,13 @@ .collect(Collectors.groupingBy( CalculateRuleVO::getRuleName, // 鎸夎鍒欏悕绉板垎缁� Collectors.groupingBy( - CalculateRuleVO::getContractId // 姣忎釜瑙勫垯鍚嶇О鍐呴儴鍐嶆寜鍚堝悓ID鍒嗙粍,value涓鸿鍒欓泦鍚� + CalculateRuleVO::getContractId // 姣忎釜瑙勫垯鍚嶇О鍐呴儴鍐嶆寜鍚堝悓ID鍒嗙粍,value涓鸿鍒欓泦鍚�(澶氫釜鍚堝悓鎯呭喌) ) )); //鍓嶇鎰熺煡婧愭不鐞嗗伐浣滐紙鏃堕挓鍚屾瑙勫垯銆丱SD瑙勫垯銆佷竴鏈轰竴妗h鍒欙級 鑾峰彇key涓哄悎鍚宨d锛寁alue涓鸿鍒欑殑map Map<Integer, List<CalculateRuleVO>> monitorRuleMap = ruleMap.get(ContractRule.CONTRACT_RULE_Monitor.getName()); - //瀛樺偍鏁呴殰锛�24灏忔椂浠ュ唴锛�48灏忔椂浠ュ唴锛� 鑾峰彇key涓哄悎鍚宨d锛寁alue涓鸿鍒欑殑map - Map<Integer, List<CalculateRuleVO>> storeRuleMap = ruleMap.get(ContractRule.CONTRACT_RULE_Store.getName()); + //瀛樺偍鏁呴殰锛�24灏忔椂浠ュ唴锛�48灏忔椂浠ュ唴锛� 鑾峰彇key涓哄悎鍚宨d锛寁alue涓鸿鍒欑殑map 锛堟敼鎴愭墜鍔ㄧ殑浜嗭級 +// Map<Integer, List<CalculateRuleVO>> storeRuleMap = ruleMap.get(ContractRule.CONTRACT_RULE_Store.getName()); //鐐逛綅寮傚父鎯呭喌澶勭悊 鑾峰彇key涓哄悎鍚宨d锛寁alue涓鸿鍒欑殑map Map<Integer, List<CalculateRuleVO>> siteRuleMap = ruleMap.get(ContractRule.CONTRACT_RULE_Site.getName()); //鏌ヨ鎶ュ鍒楄〃 @@ -219,39 +195,65 @@ 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)) { - if (!CollectionUtils.isEmpty(storeRuleMap)) { - storeRuleMap.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); - //閫夋嫨鏃堕棿鑼冨洿鍐呯殑瑙勫垯 - for (CalculateRuleVO rule : rules) { - if (checkRange(rule.getMin(), rule.getMax(), new BigDecimal(diffTime))) { - double deductScore = rule.getCalcFraction() * Math.ceil(diffTime); - ContractScore contractScore = getContractScore(rule, deductScore, Math.round(diffTime * 100) / 100 + "", Remark + "宸ュ崟缂栧彿涓�:" + workOrder.getWorkOrderNo() + "澶勭悊瓒呮椂锛屾墸闄�" + deductScore + "鍒�"); - contractScoreList.add(contractScore); - workOrderList.add(workOrder.getWorkOrderNo()); - } - } - } - }); - } - } + //瀛樺偍鏁呴殰 褰曞儚鎴栧浘鐗囪闂紓甯� 锛堟敼鎴愭墜鍔ㄦ墦鍒嗕簡锛� +// if (ErrorType.VIDEO_NONE.getValue().equals(errorType) || ErrorType.PIC_URLABNORMAL.getValue().equals(errorType)) { +// if (!CollectionUtils.isEmpty(storeRuleMap)) { +// storeRuleMap.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); +// //閫夋嫨鏃堕棿鑼冨洿鍐呯殑瑙勫垯 +// for (CalculateRuleVO rule : rules) { +// if (checkRange(rule.getMin(), rule.getMax(), new BigDecimal(diffTime))) { +// double deductScore = rule.getCalcFraction() * Math.ceil(diffTime); +// ContractScore contractScore = getContractScore(rule, deductScore, Math.round(diffTime * 100) / 100 + "", Remark + "宸ュ崟缂栧彿涓�:" + workOrder.getWorkOrderNo() + "澶勭悊瓒呮椂锛屾墸闄�" + deductScore + "鍒�"); +// contractScoreList.add(contractScore); +// workOrderList.add(workOrder.getWorkOrderNo()); +// } +// } +// } +// }); +// } +// } //鍓嶇鎰熺煡婧愭不鐞嗗伐浣滐紙鏃堕挓鍚屾瑙勫垯銆丱SD瑙勫垯銆佷竴鏈轰竴妗h鍒欙級 - if (ErrorType.MONITOR_UNQUALIFY.getValue().equals(errorType) || ErrorType.OSD_ERROR.getValue().equals(errorType) || ErrorType.CLOCK_SKEW.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(); @@ -259,10 +261,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 + "鍒�"); @@ -275,7 +291,7 @@ } } //鐐逛綅寮傚父鎯呭喌澶勭悊锛堥暅澶村紓甯搞�佹憚鍍忓ご閬尅绛夛級 - if (ErrorType.SCREEN_COLOR_DEVIATION.getValue().equals(errorType) || ErrorType.SNOW_STORM.getValue().equals(errorType) || ErrorType.STRIPE_INTERFERENCE.getValue().equals(errorType) || ErrorType.SCREEN_OCCLUSION.getValue().equals(errorType) || ErrorType.ABNORMAL_CLARITY.getValue().equals(errorType) || ErrorType.ABNORMAL_BRIGHTNESS.getValue().equals(errorType)) { + if (ErrorType.ABNORMAL_PIC.getValue().equals(errorType)) { if (!CollectionUtils.isEmpty(monitorRuleMap)) { siteRuleMap.forEach((contractId, rules) -> { Integer unitId = rules.get(0).getUnitId(); @@ -283,13 +299,18 @@ 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))) { double deductScore = 0d; - if (ContractRule.CONTRACT_RULE_Store_48H.getName().equals(rule.getRuleCondition())) { + if (ContractRule.CONTRACT_RULE_Site_Error48.getName().equals(rule.getRuleCondition())) { //璁$畻瓒呮椂澶╂暟 int day = (int) ((diffTime - 48) / 24 + 1); deductScore = rule.getCalcFraction() * (day); @@ -318,31 +339,52 @@ 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櫎绉垎 - * 姣忓ぉ涓�娆¢殢鏈烘暟鍒ゆ柇鎴愬姛灏辨墽琛� * 娴峰悍鍙栦汉鑴歌溅杈� */ public void randomDeductPic() { - Random random = new Random(); - Integer num = randomSize; - //缁欏畾闅忔満鑼冨洿 - String count = sysConfigMapper.checkConfigKeyUnique("check.contract.sample").getConfigValue(); - if (!StringUtils.isEmpty(count)) { - Integer temp = Integer.valueOf(count); - if (temp > 0) { - num = temp; - } - } - int number = random.nextInt(num); - if (number == 0) { + try { log.info("寮�濮嬫娊鏌ュ浘鐗囧畬鏁寸姸鎬�"); + //杩欎釜鏈堥殢鏈烘娊鍙栦竴澶� +// Date date = getRandomDate(); + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.MONTH, -1); // 涓婁釜鏈� + calendar.set(Calendar.DAY_OF_MONTH, 1); // 璁剧疆涓�1鍙� + + int lastDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); + Random random = new Random(); + int randomDay = random.nextInt(lastDay) + 1; + + calendar.set(Calendar.DAY_OF_MONTH, randomDay); + Date date = calendar.getTime(); + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); //鍑嗗鎵归噺鎵撳垎鐨勯泦鍚� List<ContractScore> contractScoreList = new ArrayList<>(); - //鏌ヨ鎶ュ鍒楄〃 + //鏌ヨ鎶ュ鍒楄〃 閫氳繃瀹℃牳骞朵笖鍒涘缓鏃堕棿鍦ㄥ綋鍓嶆棩鏈熺殑鎶ュid鍒楄〃 List<String> reportNumbers = reportMapper.selectNumberList(AuditStatus_Pass, DateUtils.getDate()); - Date date = DateUtils.getDay(2024, 7, 13); //鏌ュ浘鐗囧畬鏁存�ц鍒� 鑾峰彇key涓哄悎鍚宨d锛寁alue涓鸿鍒欑殑map Map<Integer, List<CalculateRuleVO>> contractMap = contractMapper.getCalculateRule(new Date()).stream() .filter(calculateRuleVO -> ContractRule.CONTRACT_RULE_PicComplete.getName().equals(calculateRuleVO.getRuleName())) @@ -357,7 +399,7 @@ queryWrapper.in("serial_number", serialNumbers); //鑾峰彇鍏徃鎵�杩愮淮鐨勮澶囬泦鍚堬紝key涓簎nitId value涓鸿澶囧浗鏍囩爜闆嗗悎 Map<Long, List<String>> unitMonitorMap = ywPointMapper.selectList(queryWrapper).stream() - .filter(ywPoint -> ywPoint.getUnitId()!=null).collect(Collectors.groupingBy(YwPoint::getUnitId, + .filter(ywPoint -> ywPoint.getUnitId() != null).collect(Collectors.groupingBy(YwPoint::getUnitId, Collectors.mapping( YwPoint::getSerialNumber, Collectors.toList()))); @@ -376,8 +418,8 @@ } //鍒ゆ柇鏄惁鏄鍏徃杩愮淮 if (monitorList.contains(picAccessResult.getExternalIndexCode())) { - //瀛樺湪澶у浘涓嶅彲鐢ㄦ暟鎹噺锛岄渶瑕佹墸鍑� - if (picAccessResult.getBigDisableCount() > 0) { + //瀛樺湪鍥剧墖璁块棶寮傚父鏁版嵁閲忥紝闇�瑕佹墸鍑� + if (picAccessResult.getExpCount() > 0) { deduct = true; serialNumber = picAccessResult.getExternalIndexCode(); break; @@ -387,103 +429,146 @@ if (deduct) { //闇�瑕佹墸闄ょ殑鍒嗘暟锛屾瑙勫垯鍙湁涓�鏉′笉闇�瑕佸垽鏂寖鍥� Double deductScore = ruleVO.getCalcFraction(); - ContractScore contractScore = getContractScore(ruleVO, deductScore, "1", Remark + "鍥芥爣鐮佷负:" + serialNumber + "鏃堕棿锛�" + new Date() + "瀛樺湪澶у浘涓嶅彲鐢ㄦ暟鎹�"); + ContractScore contractScore = getContractScore(ruleVO, deductScore, "1", Remark + "鍥芥爣鐮佷负:" + serialNumber + "鏃堕棿锛�" + format.format(date) + "瀛樺湪澶у浘涓嶅彲鐢ㄦ暟鎹�"); contractScoreList.add(contractScore); } }); } contractScoreService.saveBatch(contractScoreList); log.info("缁撴潫鎶芥煡鍥剧墖瀹屾暣鐘舵��"); + }catch (NullPointerException e) { + log.error("绌烘寚閽堝紓甯革紝鎶芥煡鍥剧墖瀹屾暣鐘舵�佸け璐�: {}", e.getMessage(), e); + } catch (DataAccessException e) { + log.error("鏁版嵁搴撹闂紓甯革紝鎶芥煡鍥剧墖瀹屾暣鐘舵�佸け璐�: {}", e.getMessage(), e); + } catch (IllegalArgumentException e) { + log.error("鍙傛暟涓嶅悎娉曞紓甯革紝鎶芥煡鍥剧墖瀹屾暣鐘舵�佸け璐�: {}", e.getMessage(), e); + } catch (Exception e) { + log.error("鏈煡寮傚父锛屾娊鏌ュ浘鐗囧畬鏁寸姸鎬佸け璐�: ", e); // 娉ㄦ剰杩欓噷浣跨敤閫楀彿鑰屼笉鏄�+锛屽彲浠ユ墦鍗板畬鏁村爢鏍� + // 濡傛灉闇�瑕佸彲浠ユ姏鍑鸿繍琛屾椂寮傚父 + throw new RuntimeException("鎶芥煡鍥剧墖瀹屾暣鐘舵�佸け璐�", e); } } /** * 涓嶅畾鏈熸鏌ユ暟鎹� 鎵i櫎绉垎 - * 姣忓ぉ涓�娆¢殢鏈烘暟鍒ゆ柇鎴愬姛灏辨墽琛� * 浼樹簯鍙栧綍鍍� */ public void randomDeductVideo() { - Random random = new Random(); - //缁欏畾闅忔満鑼冨洿 - Integer num = randomSize; - //缁欏畾闅忔満鑼冨洿 - String count = sysConfigMapper.checkConfigKeyUnique("check.contract.sample").getConfigValue(); - if (!StringUtils.isEmpty(count)) { - Integer temp = Integer.valueOf(count); - if (temp > 0) { - num = temp; - } - } - int number = random.nextInt(num); - if (number == 0) { - log.info("寮�濮嬫娊鏌ュ綍鍍忓畬鏁寸姸鎬�"); - //鍑嗗鎵归噺鎵撳垎鐨勯泦鍚� - List<ContractScore> contractScoreList = new ArrayList<>(); - //鏌ヨ鎶ュ鍒楄〃 - List<String> reportNumbers = reportMapper.selectNumberList(AuditStatus_Pass, DateUtils.getDate()); - Date date = DateUtils.getDay(2024, 7, 13); - //鏌ュ浘鐗囧畬鏁存�ц鍒� 鑾峰彇key涓哄悎鍚宨d锛寁alue涓鸿鍒欑殑map - Map<Integer, List<CalculateRuleVO>> contractMap = contractMapper.getCalculateRule(new Date()).stream() - .filter(calculateRuleVO -> ContractRule.CONTRACT_RULE_VideoRecord.getName().equals(calculateRuleVO.getRuleName())) - .collect(Collectors.groupingBy(CalculateRuleVO::getContractId)); + try{ + log.info("寮�濮嬫娊鏌ュ綍鍍忓畬鏁寸姸鎬�"); + //杩欎釜鏈堥殢鏈烘娊鍙栦竴澶� + Date date = getRandomDate(); +// Calendar instance = Calendar.getInstance(); +// // 璁惧畾骞淬�佹湀銆佹棩锛堟敞鎰忔湀浠戒粠0寮�濮嬶紝鍗�0浠h〃1鏈堬紝11浠h〃12鏈堬級 +// instance.set(2024, 10, 1); +// Date date = instance.getTime(); + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + //鍑嗗鎵归噺鎵撳垎鐨勯泦鍚� + List<ContractScore> contractScoreList = new ArrayList<>(); + //鏌ヨ鎶ュ鍒楄〃 + List<String> reportNumbers = reportMapper.selectNumberList(AuditStatus_Pass, DateUtils.getDate()); + //鏌ュ浘鐗囧畬鏁存�ц鍒� 鑾峰彇key涓哄悎鍚宨d锛寁alue涓鸿鍒欑殑map + Map<Integer, List<CalculateRuleVO>> contractMap = contractMapper.getCalculateRule(new Date()).stream() + .filter(calculateRuleVO -> ContractRule.CONTRACT_RULE_VideoRecord.getName().equals(calculateRuleVO.getRuleName())) + .collect(Collectors.groupingBy(CalculateRuleVO::getContractId)); - //鍙栧綍鍍忔暟鎹� - Query query = new Query(Criteria - .where("mongoCreateTime").gte(DateUtils.getDayStart(date)).lt(DateUtils.getDayEnd(date))); - List<RecordMetaDSumResult> recordMetaDSumResults = mongoTemplate.find(query, RecordMetaDSumResult.class); - List<String> serialNumbers = recordMetaDSumResults.stream().map(RecordMetaDSumResult::getDeviceId).collect(Collectors.toList()); - QueryWrapper<YwPoint> queryWrapper = new QueryWrapper<>(); - queryWrapper.in("serial_number", serialNumbers); - //鑾峰彇鍏徃鎵�杩愮淮鐨勮澶囬泦鍚堬紝key涓簎nitId value涓鸿澶囧浗鏍囩爜闆嗗悎 - Map<Long, List<String>> unitMonitorMap = ywPointMapper.selectList(queryWrapper).stream() - .filter(ywPoint -> ywPoint.getUnitId()!=null).collect(Collectors.groupingBy(YwPoint::getUnitId, - Collectors.mapping( - YwPoint::getSerialNumber, - Collectors.toList()))); - if (!CollectionUtils.isEmpty(contractMap)) { - contractMap.forEach((contractId, ruleList) -> { - //姝よ鍒欏搴旂殑unitId鍧囩浉绛� - CalculateRuleVO ruleVO = ruleList.get(0); - Integer unitId = ruleVO.getUnitId(); - List<String> monitorList = unitMonitorMap.get(Long.parseLong(unitId + "")); - for (RecordMetaDSumResult result : recordMetaDSumResults) { - //鍒ゆ柇鏄惁鎶ュ杩� - if (!CollectionUtils.isEmpty(reportNumbers)) { - if (reportNumbers.contains(result.getDeviceId())) continue; - } - //鍒ゆ柇鏄惁鏄鍏徃杩愮淮 - if (monitorList.contains(result.getDeviceId())) { - //褰曞儚鐘舵�佷笉瀹屾暣 - if (!Objects.equals(result.getRecordStatus(), ApiConstants.UY_RecordStatus_Integrity)) { - for (CalculateRuleVO calculateRuleVO : ruleList) { - Double max = calculateRuleVO.getMax(); - Double min = calculateRuleVO.getMin(); - //鍒ゆ柇鑼冨洿鍦ㄥ摢涓尯闂� 鍗曚綅鏄皬鏃惰浆鎹负鍒嗛挓 - if (checkRange(min, max, BigDecimal.valueOf(result.getMissDuration() * 60))) { - if (calculateRuleVO.getNum() == null) { - calculateRuleVO.setNum(1); - } else { - calculateRuleVO.setNum(calculateRuleVO.getNum() + 1); - } + //鍙栧綍鍍忔暟鎹� + Query query = new Query(Criteria + .where("mongoCreateTime").gte(DateUtils.getDayStart(date)).lt(DateUtils.getDayEnd(date))); + List<RecordMetaDSumResult> recordMetaDSumResults = mongoTemplate.find(query, RecordMetaDSumResult.class); + List<String> serialNumbers = recordMetaDSumResults.stream().map(RecordMetaDSumResult::getDeviceId).collect(Collectors.toList()); + QueryWrapper<YwPoint> queryWrapper = new QueryWrapper<>(); + queryWrapper.in("serial_number", serialNumbers); + //鑾峰彇鍏徃鎵�杩愮淮鐨勮澶囬泦鍚堬紝key涓簎nitId value涓鸿澶囧浗鏍囩爜闆嗗悎 + Map<Long, List<String>> unitMonitorMap = ywPointMapper.selectList(queryWrapper).stream() + .filter(ywPoint -> ywPoint.getUnitId() != null).collect(Collectors.groupingBy(YwPoint::getUnitId, + Collectors.mapping( + YwPoint::getSerialNumber, + Collectors.toList()))); + if (!CollectionUtils.isEmpty(contractMap)) { + contractMap.forEach((contractId, ruleList) -> { + //姝よ鍒欏搴旂殑unitId鍧囩浉绛� + CalculateRuleVO ruleVO = ruleList.get(0); + Integer unitId = ruleVO.getUnitId(); + List<String> monitorList = unitMonitorMap.get(Long.parseLong(unitId + "")); + for (RecordMetaDSumResult result : recordMetaDSumResults) { + //鍒ゆ柇鏄惁鎶ュ杩� + if (!CollectionUtils.isEmpty(reportNumbers)) { + if (reportNumbers.contains(result.getDeviceId())) continue; + } + //鍒ゆ柇鏄惁鏄鍏徃杩愮淮 + if (monitorList.contains(result.getDeviceId())) { + //褰曞儚鐘舵�佷笉瀹屾暣 + if (!Objects.equals(result.getRecordStatus(), ApiConstants.UY_RecordStatus_Integrity)) { + for (CalculateRuleVO calculateRuleVO : ruleList) { + Double max = calculateRuleVO.getMax(); + Double min = calculateRuleVO.getMin(); + //鍒ゆ柇鑼冨洿鍦ㄥ摢涓尯闂� 鍗曚綅鏄皬鏃惰浆鎹负鍒嗛挓 + if (checkRange(min, max, BigDecimal.valueOf(result.getMissDuration() * 60))) { + if (calculateRuleVO.getNum() == null) { + calculateRuleVO.setNum(1); + } else { + calculateRuleVO.setNum(calculateRuleVO.getNum() + 1); } } } } } - for (CalculateRuleVO calculateRuleVO : ruleList) { - if (calculateRuleVO.getNum() != null && calculateRuleVO.getNum() > 0) { - //闇�瑕佹墸闄ょ殑鍒嗘暟锛屾瑙勫垯鍙湁涓�鏉′笉闇�瑕佸垽鏂寖鍥� - double deductScore = calculateRuleVO.getCalcFraction() * calculateRuleVO.getNum(); - ContractScore contractScore = getContractScore(calculateRuleVO, deductScore, calculateRuleVO.getNum() + "", Remark + calculateRuleVO.getNum() + "璺澶囪繚鍙嶈鍒�"); - contractScoreList.add(contractScore); - } + } + for (CalculateRuleVO calculateRuleVO : ruleList) { + if (calculateRuleVO.getNum() != null && calculateRuleVO.getNum() > 0) { + //闇�瑕佹墸闄ょ殑鍒嗘暟锛屾瑙勫垯鍙湁涓�鏉′笉闇�瑕佸垽鏂寖鍥� + double deductScore = calculateRuleVO.getCalcFraction() * calculateRuleVO.getNum(); + ContractScore contractScore = getContractScore(calculateRuleVO, deductScore, calculateRuleVO.getNum() + "", Remark +"鎶芥煡鏃堕棿"+format.format(date)+"瀛樺湪"+ calculateRuleVO.getNum() + "璺澶囪繚鍙嶈鍒�"); + contractScoreList.add(contractScore); } - }); - } - contractScoreService.saveBatch(contractScoreList); - log.info("缁撴潫鎶芥煡褰曞儚瀹屾暣鐘舵��"); + } + }); } + contractScoreService.saveBatch(contractScoreList); + }catch (NullPointerException e) { + log.error("绌烘寚閽堝紓甯革紝鎶芥煡鍥剧墖瀹屾暣鐘舵�佸け璐�: {}", e.getMessage(), e); + } catch (DataAccessException e) { + log.error("鏁版嵁搴撹闂紓甯革紝鎶芥煡鍥剧墖瀹屾暣鐘舵�佸け璐�: {}", e.getMessage(), e); + } catch (IllegalArgumentException e) { + log.error("鍙傛暟涓嶅悎娉曞紓甯革紝鎶芥煡鍥剧墖瀹屾暣鐘舵�佸け璐�: {}", e.getMessage(), e); + } catch (Exception e) { + log.error("鏈煡寮傚父锛屾娊鏌ュ浘鐗囧畬鏁寸姸鎬佸け璐�: ", e); // 娉ㄦ剰杩欓噷浣跨敤閫楀彿鑰屼笉鏄�+锛屽彲浠ユ墦鍗板畬鏁村爢鏍� + // 濡傛灉闇�瑕佸彲浠ユ姏鍑鸿繍琛屾椂寮傚父 + throw new RuntimeException("鎶芥煡鍥剧墖瀹屾暣鐘舵�佸け璐�", e); + } + } + + private Date getRandomDate() { + // 鑾峰彇褰撳墠鏃ュ巻瀹炰緥 + Calendar calendar = Calendar.getInstance(); + + // 鑾峰彇褰撳墠鏃ユ湡 + Date now = calendar.getTime(); + + // 璁剧疆涓哄綋鍓嶆湀浠界殑绗竴澶� + calendar.setTime(now); + calendar.set(Calendar.DAY_OF_MONTH, 1); + Date firstDayOfMonth = calendar.getTime(); + + // 璁剧疆涓哄綋鍓嶆湀浠界殑鏈�鍚庝竴澶╋紙涓嬩釜鏈堢殑绗竴澶╁噺涓�锛� + calendar.add(Calendar.MONTH, 1); + calendar.set(Calendar.DAY_OF_MONTH, 0); // Calendar.DAY_OF_MONTH璁句负0琛ㄧず涓婁釜鏈堟渶鍚庝竴澶╋紝浣嗚繖閲屾槸涓轰簡寰楀埌鏈湀鏈�鍚庝竴澶╋紝鎵�浠ュ厛鍔犱竴鏈� + Date lastDayOfMonth = calendar.getTime(); + log.info("鏈�鍚庝竴澶�" + lastDayOfMonth); + // 璁$畻澶╂暟宸紙鍔�1鍥犱负鍖呭惈璧峰鍜岀粨鏉熸棩鏈燂級 + long daysBetween = (lastDayOfMonth.getTime() - firstDayOfMonth.getTime()) / (1000 * 60 * 60 * 24) + 1; + + // 鐢熸垚闅忔満鏁� + Random random = new Random(); + int randomDayIndex = random.nextInt((int) daysBetween); + + // 鑾峰彇闅忔満鏃ユ湡 + calendar.setTime(firstDayOfMonth); + calendar.add(Calendar.DAY_OF_MONTH, randomDayIndex); + Date randomDate = calendar.getTime(); + return randomDate; } private boolean checkRange(Double min, Double max, BigDecimal index) { -- Gitblit v1.8.0