From c6976365d5bfb39a32db8b541b1fe3ceb30c7826 Mon Sep 17 00:00:00 2001
From: fuliqi <fuliqi@qq.com>
Date: 星期五, 14 二月 2025 10:03:17 +0800
Subject: [PATCH] Merge branch 'dev'

---
 ycl-server/src/main/java/com/ycl/task/ContractTask.java |  571 +++++++++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 470 insertions(+), 101 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 4fc6abd..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.ycl.platform.domain.entity.*;
-import com.ycl.platform.domain.result.HK.SnapshotDataMonitorResult;
-import com.ycl.platform.domain.result.UY.VideoOnlineResult;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.ycl.platform.domain.entity.ContractRuleRecord;
+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.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.RuleDeductCategoryEnum;
+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
@@ -54,7 +58,10 @@
     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";
@@ -64,63 +71,42 @@
      * 鍚堝悓鑰冩牳 鍦ㄧ嚎鐜囨瘡鏃ヤ换鍔℃娴�
      * 鏌ョ敓鏁堢殑鍚堝悓鍏宠仈鐨勫叕鍙革紝鑾峰彇unitId闆嗗悎
      * 鏍规嵁unitId鏌ヨ瀵瑰簲鐐逛綅鑾峰彇鍚勪釜鍏徃绠$悊鐨勮澶嘔ds
-     * 鏌ヨ涓夌璁惧鍦ㄧ嚎涓嶅湪绾挎儏鍐碉紝灏佽涓轰竴涓猰ap<鍥芥爣鐮�,鍦ㄧ嚎鐘舵��>
      * 璁$畻姣忔棩姣忓鍏徃鐨勫湪绾跨巼瀛樺叆mysql
      * 鏈堝簳璁$畻骞冲潎鍊硷紝鏍规嵁鍦ㄧ嚎鐜囧拰鍚堝悓鏍囧噯鎵e噺鍒嗘暟
      */
     public void onlineCheck() {
         log.info("寮�濮嬭绠楀悎鍚岀偣浣嶅湪绾跨巼");
-        List<CalculateRuleVO> ruleVos = contractMapper.selectByRuleName(ContractRule.CONTRACT_RULE_Online.getName(), null, new Date());
+        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("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<>();
-        //鏌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());
@@ -135,70 +121,453 @@
     //鏈堝簳璁$畻鍦ㄧ嚎鐜囧垎鏁�
     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鍒嗗崟浣�
-            Map<Long, List<ContractRuleRecord>> unitMap = ruleMonthRecords.stream().collect(Collectors.groupingBy(ContractRuleRecord::getUnitId));
-            //鏌ュ湪绾跨巼瑙勫垯
-            List<CalculateRuleVO> ruleVos = contractMapper.selectByRuleName(ContractRule.CONTRACT_RULE_Online.getName(), null, new Date());
-            //鑾峰彇key涓哄悎鍚宨d锛寁alue涓哄湪绾跨巼瑙勫垯鐨刴ap
-            Map<Integer, List<CalculateRuleVO>> contractMap = ruleVos.stream().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 = new ContractScore();
-                            contractScore.setContractId(Long.parseLong(contractId + ""));
-                            contractScore.setAuditingStatus(AuditingStatus.WAIT);
-                            contractScore.setUnitId(Long.parseLong(unitId + ""));
-                            contractScore.setRuleId(Long.parseLong(ruleVO.getId() + ""));
-                            contractScore.setRuleIds("0," + ruleVO.getId());
-                            contractScore.setNum(siteOnline + "");
-                            contractScore.setDeductCategory(ruleVO.getDeductCategory().getDesc());
-                            contractScore.setScore(new BigDecimal(deductScore));
-                            contractScore.setRuleName(ruleVO.getRuleName() + "/" + ruleVO.getRuleCondition());
-                            contractScore.setCreateTime(new Date());
-                            contractScore.setUpdateTime(new Date());
-                            contractScore.setRemark(Remark);
-                            contractScoreList.add(contractScore);
-                        }
+        //鏌ヤ竴涓湀鐨勮褰�
+        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("缁撴潫璁$畻鍚堝悓鐐逛綅鍦ㄧ嚎鐜囧垎鏁�");
     }
 
-    private boolean checkRange(Double min, Double max, BigDecimal siteOnline) {
-        if (siteOnline == null) {
+    /**
+     * 妫�娴嬪伐鍗曡〃 杩涜鍚堝悓绉垎鎵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 && siteOnline.compareTo(new BigDecimal(max)) > 0) {
+        if (max == null && min == null) {
             return false;
         }
-        if (min != null && siteOnline.compareTo(new BigDecimal(min)) < 0) {
+        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