From b14531e3b850fe6d2fa916ba7b88b3e2bd2ff30a Mon Sep 17 00:00:00 2001 From: fuliqi <fuliqi@qq.com> Date: 星期三, 11 九月 2024 16:47:48 +0800 Subject: [PATCH] OSD加标签 --- ycl-server/src/main/java/com/ycl/task/ContractTask.java | 405 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 390 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 a07570c..411fb32 100644 --- a/ycl-server/src/main/java/com/ycl/task/ContractTask.java +++ b/ycl-server/src/main/java/com/ycl/task/ContractTask.java @@ -2,35 +2,39 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.mongodb.client.result.DeleteResult; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.ycl.platform.domain.entity.ContractRuleRecord; -import com.ycl.platform.domain.entity.Report; -import com.ycl.platform.domain.entity.TMonitor; +import com.ycl.platform.domain.entity.ContractScore; +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.UY.RecordMetaDSumResult; import com.ycl.platform.domain.result.UY.VideoOnlineResult; import com.ycl.platform.domain.vo.CalculateRuleVO; -import com.ycl.platform.domain.vo.ContractVO; -import com.ycl.platform.domain.vo.ReportVO; +import com.ycl.platform.domain.vo.WorkOrderVO; import com.ycl.platform.mapper.*; +import com.ycl.platform.service.IContractScoreService; import com.ycl.utils.DateUtils; import constant.ApiConstants; -import constant.RedisConstant; import enumeration.ContractRule; +import enumeration.ErrorType; +import enumeration.general.AuditingStatus; +import enumeration.general.WorkOrderStatusEnum; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; -import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; -import javax.management.monitor.Monitor; import java.math.BigDecimal; import java.math.RoundingMode; +import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; + /** * 鍚堝悓鑰冩牳瀹氭椂浠诲姟 @@ -41,10 +45,6 @@ @Autowired private MongoTemplate mongoTemplate; @Autowired - private RedisTemplate redisTemplate; - @Autowired - private TMonitorMapper monitorMapper; - @Autowired private TContractMapper contractMapper; @Autowired private YwPointMapper ywPointMapper; @@ -52,10 +52,16 @@ private ReportMapper reportMapper; @Autowired private ContractRuleRecordMapper recordMapper; + @Autowired + private IContractScoreService contractScoreService; + @Autowired + private WorkOrderMapper workOrderMapper; private static final Integer Online = 1; private static final Integer Offline = -1; private static final String AuditStatus_Pass = "1"; + private static final String Remark = "绯荤粺鐢熸垚"; + private static final Integer randomSize = 30; /** * 鍚堝悓鑰冩牳 鍦ㄧ嚎鐜囨瘡鏃ヤ换鍔℃娴� @@ -66,9 +72,12 @@ * 鏈堝簳璁$畻骞冲潎鍊硷紝鏍规嵁鍦ㄧ嚎鐜囧拰鍚堝悓鏍囧噯鎵e噺鍒嗘暟 */ public void onlineCheck() { - List<CalculateRuleVO> ruleVos = contractMapper.selectByRuleName(ContractRule.CONTRACT_RULE_Online.getName(), null, new Date()); + log.info("寮�濮嬭绠楀悎鍚岀偣浣嶅湪绾跨巼"); + List<CalculateRuleVO> ruleVos = contractMapper.getCalculateRule(new Date()).stream() + .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("unitId", unitIds)); + List<YwPoint> ywPoints = ywPointMapper.selectList(new QueryWrapper<YwPoint>().in("unit_id", unitIds)); //key鏄痷nitId value鏄澶囩紪鐮侀泦鍚� Map<Long, List<String>> unitMap = ywPoints.stream() .collect(Collectors.groupingBy( @@ -116,13 +125,379 @@ onlineSite++; } } + BigDecimal online = new BigDecimal(onlineSite).divide(new BigDecimal(totalSite), 2, RoundingMode.DOWN); ContractRuleRecord contractRuleRecord = new ContractRuleRecord(); - contractRuleRecord.setSiteOnline( onlineSite / totalSite); + contractRuleRecord.setSiteOnline(online); contractRuleRecord.setCreateTime(new Date()); contractRuleRecord.setUnitId(unitId); ruleRecordList.add(contractRuleRecord); }); //瀛樺偍缁撴灉 recordMapper.insertBatch(ruleRecordList); + log.info("缁撴潫璁$畻鍚堝悓鐐逛綅鍦ㄧ嚎鐜�"); + } + + //鏈堝簳璁$畻鍦ㄧ嚎鐜囧垎鏁� + public void calculateOnlineScore() { + log.info("寮�濮嬭绠楀悎鍚岀偣浣嶅湪绾跨巼鍒嗘暟"); + //濡傛灉鏄湀搴曪紝闇�瑕佺粺璁″钩鍧囧湪绾跨巼鐒跺悗杩涜绉垎鎵i櫎 +// String now = DateUtils.getDate(); + String mouthStart = DateUtils.getMouthStart(new Date()); + String mouthEnd = DateUtils.getMouthEnd(new Date()); +// if (now.equals(mouthEnd)) { + //鏌ヤ竴涓湀鐨勮褰� + List<ContractRuleRecord> ruleMonthRecords = recordMapper.selectMonth(mouthStart, mouthEnd); + //閫氳繃unitId鍒嗗崟浣� + Map<Long, List<ContractRuleRecord>> unitMap = ruleMonthRecords.stream().collect(Collectors.groupingBy(ContractRuleRecord::getUnitId)); + //鏌ュ湪绾跨巼瑙勫垯 鑾峰彇key涓哄悎鍚宨d锛寁alue涓哄湪绾跨巼瑙勫垯鐨刴ap + 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)); + + //鍑嗗鎵归噺鎵撳垎鐨勯泦鍚� + List<ContractScore> contractScoreList = new ArrayList<>(); + contractMap.forEach((contractId, ruleList) -> { + //涓�涓悎鍚屽搴斾竴涓崟浣嶏紝鍥犳unitId閮界浉鍚� + CalculateRuleVO calculateRuleVO = ruleList.get(0); + Integer unitId = calculateRuleVO.getUnitId(); + List<ContractRuleRecord> ruleRecordList = unitMap.get(Long.parseLong(unitId + "")); + if (!CollectionUtils.isEmpty(ruleMonthRecords)) { + 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) { + Double max = ruleVO.getMax(); + Double min = ruleVO.getMin(); + //鍒ゆ柇鑼冨洿鍦ㄥ摢涓尯闂� + if (checkRange(min, max, siteOnline.multiply(new BigDecimal(100)))) { + //闇�瑕佹墸闄ょ殑鍒嗘暟 + Double deductScore = ruleVO.getCalcFraction(); + ContractScore contractScore = getContractScore(ruleVO, deductScore, siteOnline + "", Remark); + contractScoreList.add(contractScore); + } + } + } + }); +// } + contractScoreService.saveBatch(contractScoreList); + log.info("缁撴潫璁$畻鍚堝悓鐐逛綅鍦ㄧ嚎鐜囧垎鏁�"); + } + + /** + * 妫�娴嬪伐鍗曡〃 杩涜鍚堝悓绉垎鎵i櫎 + * 鏌ュ嚭宸ュ崟闇�瑕佹墸鍒嗙殑鎵�鏈夎鍒� + * 鏌ュ嚭鏈墸鍒嗕笖宸茬粡瀹℃牳瀹屾垚浜嗙殑宸ュ崟缁勬垚map<unitId,List<WorkOrder>> 宸ュ崟闇�瑕佽繛宸ュ崟鏁呴殰琛ㄦ煡鍑哄涓晠闅滅被鍨� + * 寰幆宸ュ崟map锛屾瘡涓伐鍗曟晠闅滅被鍨嬫煡瀵瑰簲鐨勮鍒欙紝鏍规嵁瑙勫垯鍜屽伐鍗曞垱寤烘椂闂村拰瀹℃牳閫氳繃鏃堕棿杩涜鎵e垎 + * 鎻掑叆鍚堝悓绉垎琛紝淇敼宸ュ崟鐘舵�佷负宸叉墸鍒� + */ + public void workOrderDeduct() { + log.info("寮�濮嬫壂鎻忓伐鍗曟墸鍒�"); + //鍑嗗鎵归噺鎵撳垎鐨勯泦鍚� + List<ContractScore> contractScoreList = new ArrayList<>(); + List<String> workOrderList = new ArrayList<>(); + //鏌ヨ鐢熸晥鍚堝悓瀵瑰簲鎵�鏈夌殑瑙勫垯 + List<CalculateRuleVO> calculateRules = contractMapper.getCalculateRule(new Date()); + Map<String, Map<Integer, List<CalculateRuleVO>>> ruleMap = calculateRules.stream() + .collect(Collectors.groupingBy( + CalculateRuleVO::getRuleName, // 鎸夎鍒欏悕绉板垎缁� + Collectors.groupingBy( + 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()); + //鐐逛綅寮傚父鎯呭喌澶勭悊 鑾峰彇key涓哄悎鍚宨d锛寁alue涓鸿鍒欑殑map + Map<Integer, List<CalculateRuleVO>> siteRuleMap = ruleMap.get(ContractRule.CONTRACT_RULE_Site.getName()); + //鏌ヨ鎶ュ鍒楄〃 + List<String> reportNumbers = reportMapper.selectNumberList(AuditStatus_Pass, DateUtils.getDate()); + //鏌ヨ30澶╁唴鎵�鏈夋湭鎵e垎銆佸鏍搁�氳繃鐨勫伐鍗� + // 鑾峰彇褰撳墠鏃ユ湡 + LocalDateTime endTime = LocalDateTime.now(); + // 璁$畻30澶╁墠鐨勬棩鏈� + LocalDateTime startTime = endTime.minusDays(30); + List<WorkOrderVO> workOrders = workOrderMapper.selectPassOrder(startTime, endTime, WorkOrderStatusEnum.AUDITING_SUCCESS.getValue(), "瀹℃牳閫氳繃"); + for (WorkOrderVO workOrder : workOrders) { + //妫�娴嬫槸鍚︽姤澶囪繃 + if (!CollectionUtils.isEmpty(reportNumbers)) { + if(reportNumbers.contains(workOrder.getSerialNumber())) 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()); + } + } + } + }); + } + } + //鍓嶇鎰熺煡婧愭不鐞嗗伐浣滐紙鏃堕挓鍚屾瑙勫垯銆丱SD瑙勫垯銆佷竴鏈轰竴妗h鍒欙級 + if (ErrorType.MONITOR_UNQUALIFY.getValue().equals(errorType) || ErrorType.OSD_ERROR.getValue().equals(errorType) || ErrorType.CLOCK_SKEW.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); + //閫夋嫨鏃堕棿鑼冨洿鍐呯殑瑙勫垯 + for (CalculateRuleVO rule : rules) { + 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 + "鍒�"); + contractScoreList.add(contractScore); + workOrderList.add(workOrder.getWorkOrderNo()); + } + } + } + }); + } + } + //鐐逛綅寮傚父鎯呭喌澶勭悊锛堥暅澶村紓甯搞�佹憚鍍忓ご閬尅绛夛級 + 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 (!CollectionUtils.isEmpty(monitorRuleMap)) { + siteRuleMap.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 = 0d; + if (ContractRule.CONTRACT_RULE_Store_48H.getName().equals(rule.getRuleCondition())) { + //璁$畻瓒呮椂澶╂暟 + int day = (int) ((diffTime - 48) / 24 + 1); + deductScore = rule.getCalcFraction() * (day); + } else { + deductScore = rule.getCalcFraction(); + } + ContractScore contractScore = getContractScore(rule, deductScore, Math.round(diffTime * 100) / 100 + "", Remark + "宸ュ崟缂栧彿涓�:" + workOrder.getWorkOrderNo() + "澶勭悊瓒呮椂锛屾墸闄�" + deductScore + "鍒�"); + contractScoreList.add(contractScore); + workOrderList.add(workOrder.getWorkOrderNo()); + } + } + + } + }); + } + } + } + contractScoreService.saveBatch(contractScoreList); + if (!CollectionUtils.isEmpty(workOrderList)) { + //淇敼宸ュ崟鎵e垎鐘舵�佷负宸叉墸鍒� + UpdateWrapper<WorkOrder> updateWrapper = new UpdateWrapper<>(); + updateWrapper.in("work_order_no", workOrderList); + updateWrapper.set("deduct", 1); + workOrderMapper.update(null, updateWrapper); + } + log.info("缁撴潫鎵ц宸ュ崟鎵e垎"); + } + + + /** + * 涓嶅畾鏈熸鏌ユ暟鎹� 鎵i櫎绉垎 + * 姣忓ぉ涓�娆¢殢鏈烘暟鍒ゆ柇鎴愬姛灏辨墽琛� + * 娴峰悍鍙栦汉鑴歌溅杈� + */ + public void randomDeductPic() { + Random random = new Random(); + //缁欏畾闅忔満鑼冨洿 + int number = random.nextInt(randomSize); + 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_PicComplete.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<PicAccessResult> picAccessResults = mongoTemplate.find(query, PicAccessResult.class); + List<String> serialNumbers = picAccessResults.stream().map(PicAccessResult::getExternalIndexCode).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() + .collect(Collectors.groupingBy(YwPoint::getUnitId, + Collectors.mapping( + YwPoint::getSerialNumber, + Collectors.toList()))); + if (!CollectionUtils.isEmpty(contractMap)) { + contractMap.forEach((contractId, ruleList) -> { + boolean deduct = false; + String serialNumber = null; + //姝よ鍒欏搴旂殑unitId鍧囩浉绛� + CalculateRuleVO ruleVO = ruleList.get(0); + Integer unitId = ruleVO.getUnitId(); + List<String> monitorList = unitMonitorMap.get(Long.parseLong(unitId + "")); + for (PicAccessResult picAccessResult : picAccessResults) { + //鍒ゆ柇鏄惁鎶ュ杩� + if (!CollectionUtils.isEmpty(reportNumbers)) { + if(reportNumbers.contains(picAccessResult.getExternalIndexCode())) continue; + } + //鍒ゆ柇鏄惁鏄鍏徃杩愮淮 + if (monitorList.contains(picAccessResult.getExternalIndexCode())) { + //瀛樺湪澶у浘涓嶅彲鐢ㄦ暟鎹噺锛岄渶瑕佹墸鍑� + if (picAccessResult.getBigDisableCount() > 0) { + deduct = true; + serialNumber = picAccessResult.getExternalIndexCode(); + break; + } + } + } + if (deduct) { + //闇�瑕佹墸闄ょ殑鍒嗘暟锛屾瑙勫垯鍙湁涓�鏉′笉闇�瑕佸垽鏂寖鍥� + Double deductScore = ruleVO.getCalcFraction(); + ContractScore contractScore = getContractScore(ruleVO, deductScore, "1", Remark + "鍥芥爣鐮佷负:" + serialNumber + "鏃堕棿锛�" + new Date() + "瀛樺湪澶у浘涓嶅彲鐢ㄦ暟鎹�"); + contractScoreList.add(contractScore); + } + }); + } + contractScoreService.saveBatch(contractScoreList); + log.info("缁撴潫鎶芥煡鍥剧墖瀹屾暣鐘舵��"); + } + } + + + /** + * 涓嶅畾鏈熸鏌ユ暟鎹� 鎵i櫎绉垎 + * 姣忓ぉ涓�娆¢殢鏈烘暟鍒ゆ柇鎴愬姛灏辨墽琛� + * 浼樹簯鍙栧綍鍍� + */ + public void randomDeductVideo() { + Random random = new Random(); + //缁欏畾闅忔満鑼冨洿 + int number = random.nextInt(randomSize); + 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)); + + //鍙栧綍鍍忔暟鎹� + 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() + .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); + } + } + }); + } + contractScoreService.saveBatch(contractScoreList); + log.info("缁撴潫鎶芥煡褰曞儚瀹屾暣鐘舵��"); + } + } + + private boolean checkRange(Double min, Double max, BigDecimal index) { + if (index == null) { + return false; + } + if (max == null && min == null) { + return false; + } + if (max != null && index.setScale(0, RoundingMode.DOWN).compareTo(new BigDecimal(max)) > 0) { + return false; + } + if (min != null && index.setScale(0, RoundingMode.UP).compareTo(new BigDecimal(min)) < 0) { + return false; + } + return true; + } + + private ContractScore getContractScore(CalculateRuleVO rule, double deductScore, String num, String remark) { + ContractScore contractScore = new ContractScore(); + contractScore.setContractId(Long.parseLong(rule.getContractId() + "")); + contractScore.setAuditingStatus(AuditingStatus.PASS); + contractScore.setAuditingTime(new Date()); + contractScore.setAuditingUser(Remark); + contractScore.setUnitId(Long.parseLong(rule.getUnitId() + "")); + contractScore.setRuleId(Long.parseLong(rule.getId() + "")); + contractScore.setRuleIds("0," + rule.getId()); + contractScore.setNum(num); + contractScore.setDeductCategory(rule.getDeductCategory().getDesc()); + contractScore.setScore(new BigDecimal(deductScore)); + contractScore.setRuleName(rule.getRuleName() + "/" + rule.getRuleCondition()); + contractScore.setCreateTime(new Date()); + contractScore.setUpdateTime(new Date()); + contractScore.setRemark(remark); + return contractScore; } } -- Gitblit v1.8.0