From f59d7f75a997872935d55288d37cd80b3acb6dff Mon Sep 17 00:00:00 2001
From: fuliqi <fuliqi@qq.com>
Date: 星期二, 21 一月 2025 10:33:05 +0800
Subject: [PATCH] 批量审核离线工单修改pingonline
---
ycl-server/src/main/java/com/ycl/task/ContractTask.java | 158 ++++++++++++++++++++++++++++++++++------------------
1 files changed, 102 insertions(+), 56 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 44702c0..1d637c2 100644
--- a/ycl-server/src/main/java/com/ycl/task/ContractTask.java
+++ b/ycl-server/src/main/java/com/ycl/task/ContractTask.java
@@ -8,10 +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.*;
@@ -36,6 +34,7 @@
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.util.*;
+import java.util.function.Function;
import java.util.stream.Collectors;
@@ -44,6 +43,7 @@
*/
@Slf4j
@Component("contractTask")
+//TODO:閲嶆柊鐪嬩笅閫昏緫
public class ContractTask {
@Autowired
private MongoTemplate mongoTemplate;
@@ -71,7 +71,6 @@
* 鍚堝悓鑰冩牳 鍦ㄧ嚎鐜囨瘡鏃ヤ换鍔℃娴�
* 鏌ョ敓鏁堢殑鍚堝悓鍏宠仈鐨勫叕鍙革紝鑾峰彇unitId闆嗗悎
* 鏍规嵁unitId鏌ヨ瀵瑰簲鐐逛綅鑾峰彇鍚勪釜鍏徃绠$悊鐨勮澶嘔ds
- * 鏌ヨ涓夌璁惧鍦ㄧ嚎涓嶅湪绾挎儏鍐碉紝灏佽涓轰竴涓猰ap<鍥芥爣鐮�,鍦ㄧ嚎鐘舵��>
* 璁$畻姣忔棩姣忓鍏徃鐨勫湪绾跨巼瀛樺叆mysql
* 鏈堝簳璁$畻骞冲潎鍊硷紝鏍规嵁鍦ㄧ嚎鐜囧拰鍚堝悓鏍囧噯鎵e噺鍒嗘暟
*/
@@ -81,48 +80,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<>();
- Date date = new Date();
- //杞﹁締銆佷汉鑴�
- Query query = new Query();
- query.addCriteria(Criteria
- .where("mongoCreateTime").gte(DateUtils.getDayStart(date)).lt(DateUtils.getDayEnd(date)));
- List<TMonitorResult> tMonitorResults = mongoTemplate.find(query, TMonitorResult.class);
- for (TMonitorResult result : tMonitorResults) {
- if(result.getPingOnline()){
- onlineStatusMap.put(result.getNo(), Online);
- }else {
- onlineStatusMap.put(result.getNo(), Offline);
- }
- }
-
+ );
//鏌ヨ鎶ュ鍒楄〃
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());
@@ -136,18 +120,15 @@
//鏈堝簳璁$畻鍦ㄧ嚎鐜囧垎鏁�
public void calculateOnlineScore() {
- //TODO:妫�鏌ヨ〃
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));
@@ -159,7 +140,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) {
@@ -175,7 +156,6 @@
}
}
});
-// }
contractScoreService.saveBatch(contractScoreList);
log.info("缁撴潫璁$畻鍚堝悓鐐逛綅鍦ㄧ嚎鐜囧垎鏁�");
}
@@ -198,13 +178,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());
//鏌ヨ鎶ュ鍒楄〃
@@ -214,14 +194,40 @@
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) -> {
@@ -246,7 +252,7 @@
// }
// }
//鍓嶇鎰熺煡婧愭不鐞嗗伐浣滐紙鏃堕挓鍚屾瑙勫垯銆丱SD瑙勫垯銆佷竴鏈轰竴妗h鍒欙級
- if (ErrorType.POINT_INFO_ERROR.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();
@@ -254,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 + "鍒�");
@@ -270,7 +290,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();
@@ -278,13 +298,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);
@@ -313,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櫎绉垎
@@ -337,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()))
@@ -371,8 +417,8 @@
}
//鍒ゆ柇鏄惁鏄鍏徃杩愮淮
if (monitorList.contains(picAccessResult.getExternalIndexCode())) {
- //瀛樺湪澶у浘涓嶅彲鐢ㄦ暟鎹噺锛岄渶瑕佹墸鍑�
- if (picAccessResult.getBigDisableCount() > 0) {
+ //瀛樺湪鍥剧墖璁块棶寮傚父鏁版嵁閲忥紝闇�瑕佹墸鍑�
+ if (picAccessResult.getExpCount() > 0) {
deduct = true;
serialNumber = picAccessResult.getExternalIndexCode();
break;
@@ -417,7 +463,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_VideoRecord.getName().equals(calculateRuleVO.getRuleName()))
--
Gitblit v1.8.0