From db75b45e9a7ce347162b8d3a36e4a7f46cfe199e Mon Sep 17 00:00:00 2001 From: fuliqi <fuliqi@qq.com> Date: 星期一, 10 二月 2025 15:30:18 +0800 Subject: [PATCH] 核算导出单独对录像扣分的数量做处理 --- ycl-server/src/main/java/com/ycl/task/ContractTask.java | 549 +++++++++++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 497 insertions(+), 52 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..c7e7eac 100644 --- a/ycl-server/src/main/java/com/ycl/task/ContractTask.java +++ b/ycl-server/src/main/java/com/ycl/task/ContractTask.java @@ -2,48 +2,52 @@ 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.SnapshotDataMonitorResult; -import com.ycl.platform.domain.result.UY.VideoOnlineResult; +import com.ycl.platform.domain.result.HK.PicAccessResult; +import com.ycl.platform.domain.result.SYS.TMonitorResult; +import com.ycl.platform.domain.result.UY.RecordMetaDSumResult; 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.system.mapper.SysConfigMapper; import com.ycl.utils.DateUtils; +import com.ycl.utils.StringUtils; 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.text.SimpleDateFormat; +import java.time.LocalDateTime; import java.util.*; +import java.util.function.Function; import java.util.stream.Collectors; + /** * 鍚堝悓鑰冩牳瀹氭椂浠诲姟 */ @Slf4j @Component("contractTask") +//TODO:閲嶆柊鐪嬩笅閫昏緫 public class ContractTask { @Autowired private MongoTemplate mongoTemplate; - @Autowired - private RedisTemplate redisTemplate; - @Autowired - private TMonitorMapper monitorMapper; @Autowired private TContractMapper contractMapper; @Autowired @@ -52,77 +56,518 @@ private ReportMapper reportMapper; @Autowired private ContractRuleRecordMapper recordMapper; - + @Autowired + private IContractScoreService contractScoreService; + @Autowired + private WorkOrderMapper workOrderMapper; + @Autowired + private SysConfigMapper sysConfigMapper; private static final Integer Online = 1; private static final Integer Offline = -1; private static final String AuditStatus_Pass = "1"; + private static final String Remark = "绯荤粺鐢熸垚"; /** * 鍚堝悓鑰冩牳 鍦ㄧ嚎鐜囨瘡鏃ヤ换鍔℃娴� * 鏌ョ敓鏁堢殑鍚堝悓鍏宠仈鐨勫叕鍙革紝鑾峰彇unitId闆嗗悎 * 鏍规嵁unitId鏌ヨ瀵瑰簲鐐逛綅鑾峰彇鍚勪釜鍏徃绠$悊鐨勮澶嘔ds - * 鏌ヨ涓夌璁惧鍦ㄧ嚎涓嶅湪绾挎儏鍐碉紝灏佽涓轰竴涓猰ap<鍥芥爣鐮�,鍦ㄧ嚎鐘舵��> * 璁$畻姣忔棩姣忓鍏徃鐨勫湪绾跨巼瀛樺叆mysql * 鏈堝簳璁$畻骞冲潎鍊硷紝鏍规嵁鍦ㄧ嚎鐜囧拰鍚堝悓鏍囧噯鎵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).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<>(); - //鏌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 = BigDecimal.ONE; + if (totalSite != 0) { + 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 mouthStart = DateUtils.getMouthStart(new Date()); + String mouthEnd = DateUtils.getMouthEnd(new Date()); + //鏌ヤ竴涓湀鐨勮褰� + List<ContractRuleRecord> ruleMonthRecords = recordMapper.selectMonth(mouthStart, mouthEnd); + //閫氳繃unitId鍒嗗崟浣嶏紝鑾峰彇褰撴湀鏁版嵁map + Map<Long, List<ContractRuleRecord>> unitMap = ruleMonthRecords.stream().collect(Collectors.groupingBy(ContractRuleRecord::getUnitId)); + //鏌ュ湪绾跨巼瑙勫垯 鑾峰彇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)); + + //鍑嗗鎵归噺鎵撳垎鐨勯泦鍚� + 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(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) { + 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); + //鑷姩鎵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()); +// } +// } +// } +// }); +// } +// } + //鍓嶇鎰熺煡婧愭不鐞嗗伐浣滐紙鏃堕挓鍚屾瑙勫垯銆丱SD瑙勫垯銆佷竴鏈轰竴妗h鍒欙級 + 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(); + 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 + "鍒�"); + contractScoreList.add(contractScore); + workOrderList.add(workOrder.getWorkOrderNo()); + } + } + } + }); + } + } + //鐐逛綅寮傚父鎯呭喌澶勭悊锛堥暅澶村紓甯搞�佹憚鍍忓ご閬尅绛夛級 + if (ErrorType.ABNORMAL_PIC.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(); + 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_Site_Error48.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垎"); + } + + 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() { + log.info("寮�濮嬫娊鏌ュ浘鐗囧畬鏁寸姸鎬�"); + //杩欎釜鏈堥殢鏈烘娊鍙栦竴澶� + Date date = getRandomDate(); + 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_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() + .filter(ywPoint -> ywPoint.getUnitId() != null).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.getExpCount() > 0) { + deduct = true; + serialNumber = picAccessResult.getExternalIndexCode(); + break; + } + } + } + if (deduct) { + //闇�瑕佹墸闄ょ殑鍒嗘暟锛屾瑙勫垯鍙湁涓�鏉′笉闇�瑕佸垽鏂寖鍥� + Double deductScore = ruleVO.getCalcFraction(); + ContractScore contractScore = getContractScore(ruleVO, deductScore, "1", Remark + "鍥芥爣鐮佷负:" + serialNumber + "鏃堕棿锛�" + format.format(date) + "瀛樺湪澶у浘涓嶅彲鐢ㄦ暟鎹�"); + contractScoreList.add(contractScore); + } + }); + } + contractScoreService.saveBatch(contractScoreList); + log.info("缁撴潫鎶芥煡鍥剧墖瀹屾暣鐘舵��"); + } + + + /** + * 涓嶅畾鏈熸鏌ユ暟鎹� 鎵i櫎绉垎 + * 浼樹簯鍙栧綍鍍� + */ + public void randomDeductVideo() { + 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); + } + } + } + } + } + } + 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); + } + + 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) { + 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