From 29d3c47cc6c903c09b386649fabaebc81cbeca27 Mon Sep 17 00:00:00 2001
From: zxl <763096477@qq.com>
Date: 星期四, 05 六月 2025 10:43:39 +0800
Subject: [PATCH] 报错日志添加

---
 ycl-server/src/main/java/com/ycl/task/ContractTask.java |  310 ++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 205 insertions(+), 105 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 a31b5e5..8e898c8 100644
--- a/ycl-server/src/main/java/com/ycl/task/ContractTask.java
+++ b/ycl-server/src/main/java/com/ycl/task/ContractTask.java
@@ -24,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;
@@ -32,6 +33,7 @@
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
 import java.util.*;
 import java.util.function.Function;
@@ -65,7 +67,6 @@
     private static final Integer Offline = -1;
     private static final String AuditStatus_Pass = "1";
     private static final String Remark = "绯荤粺鐢熸垚";
-    private static final Integer randomSize = 30;
 
     /**
      * 鍚堝悓鑰冩牳 鍦ㄧ嚎鐜囨瘡鏃ヤ换鍔℃娴�
@@ -80,11 +81,11 @@
                 .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).eq("examine_status",1));
+        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(
-                        YwPoint::getUnitId
+                                YwPoint::getUnitId
                         )
                 );
         //鏌ヨ鎶ュ鍒楄〃
@@ -194,8 +195,32 @@
         LocalDateTime endTime = LocalDateTime.now();
         // 璁$畻30澶╁墠鐨勬棩鏈�
         LocalDateTime startTime = endTime.minusDays(30);
-        //闇�瑕佹煡瀹℃牳閫氳繃閭f潯璁板綍鐨勬椂闂�
-        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)) {
@@ -228,7 +253,7 @@
 //                }
 //            }
             //鍓嶇鎰熺煡婧愭不鐞嗗伐浣滐紙鏃堕挓鍚屾瑙勫垯銆丱SD瑙勫垯銆佷竴鏈轰竴妗h鍒欙級
-            if (ErrorType.OSD_ERROR.getValue().equals(errorType) || ErrorType.CLOCK_SKEW.getValue().equals(errorType) || ErrorType.CLOCK_RIGHT.getValue().equals(errorType) || ErrorType.POINT_INFO_ERROR.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();
@@ -236,16 +261,22 @@
                         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 (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))) {
@@ -268,8 +299,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))) {
@@ -303,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 = 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()))
@@ -372,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 = 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()))
-                    .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