From 5da2c5431b2663141a278afd2858101a2e98f814 Mon Sep 17 00:00:00 2001
From: fuliqi <fuliqi@qq.com>
Date: 星期四, 15 八月 2024 15:41:59 +0800
Subject: [PATCH] 一机一档注册率、档案考核比

---
 ycl-server/src/main/java/com/ycl/factory/IndexCalculationFactory.java          |    2 
 ycl-common/src/main/java/constant/CalculationStrategyConstants.java            |    4 +
 ycl-server/src/main/java/com/ycl/calculate/MonitorRegistrationCalculation.java |  141 +++++++++++++++++++++++++++++++++++
 ycl-server/src/main/java/com/ycl/task/VideoTask.java                           |    9 +
 ycl-server/src/main/java/com/ycl/task/MonitorTask.java                         |   15 +++
 ycl-server/src/main/java/com/ycl/calculate/IndexCalculationServe.java          |   47 +++++++++++
 ycl-server/src/main/java/com/ycl/calculate/VideoOnlineCalculation.java         |    4 
 7 files changed, 215 insertions(+), 7 deletions(-)

diff --git a/ycl-common/src/main/java/constant/CalculationStrategyConstants.java b/ycl-common/src/main/java/constant/CalculationStrategyConstants.java
index a726877..0a43e29 100644
--- a/ycl-common/src/main/java/constant/CalculationStrategyConstants.java
+++ b/ycl-common/src/main/java/constant/CalculationStrategyConstants.java
@@ -53,6 +53,10 @@
 
 
     /**
+     * 涓�鏈轰竴妗f敞鍐岀巼銆佹。妗堣�冩牳姣�
+     */
+    public static final String Video_MonitorRegis_ArchiveRate = "videoMonitorRegisArchiveRate";
+    /**
      * 涓�鏈轰竴妗e悎鏍肩巼
      */
     public static final String Video_MonitorQualify = "videoMonitorQualify";
diff --git a/ycl-server/src/main/java/com/ycl/calculate/IndexCalculationServe.java b/ycl-server/src/main/java/com/ycl/calculate/IndexCalculationServe.java
index 6546b7b..d2600fa 100644
--- a/ycl-server/src/main/java/com/ycl/calculate/IndexCalculationServe.java
+++ b/ycl-server/src/main/java/com/ycl/calculate/IndexCalculationServe.java
@@ -2,18 +2,27 @@
 
 
 import com.ycl.platform.base.CheckIndex;
+import com.ycl.platform.domain.entity.TMonitor;
 import com.ycl.platform.domain.entity.YwPoint;
+import com.ycl.platform.domain.result.UY.MonitorQualifyResult;
+import com.ycl.platform.domain.vo.TMonitorVO;
+import com.ycl.platform.mapper.TMonitorMapper;
 import com.ycl.platform.mapper.YwPointMapper;
+import com.ycl.utils.DateUtils;
 import constant.ApiConstants;
 import constant.CheckConstants;
 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.stereotype.Component;
 import org.springframework.util.CollectionUtils;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 /**
@@ -25,13 +34,32 @@
     @Autowired
     private YwPointMapper pointMapper;
 
+    @Autowired
+    private TMonitorMapper monitorMapper;
+
+    @Autowired
+    private MongoTemplate mongoTemplate;
+
     //涓�鏈轰竴妗e悎鏍肩巼
     public BigDecimal monitorQualify(Map<String, Object> param) {
         BigDecimal totalMonitors = new BigDecimal((Integer) param.get("totalMonitors"));
         BigDecimal qualifyMonitor = new BigDecimal((Integer) param.get("qualifyMonitor"));
         return qualifyMonitor.divide(totalMonitors, 4, RoundingMode.HALF_UP);
     }
-
+    //涓�鏈轰竴妗f敞鍐岀巼鐜�
+    public BigDecimal monitorRegistration(Map<String, Object> param) {
+        //鏂�+姝e湪鐢ㄧ殑妗f鏁�
+        BigDecimal totalSites = new BigDecimal((Integer) param.get("totalSites"));
+        //姝e湪鐢ㄧ殑妗f鏁�
+        BigDecimal useSites = new BigDecimal((Integer) param.get("totalSites") - (Integer) param.get("newSites"));
+        return useSites.divide(totalSites, 4, RoundingMode.HALF_UP);
+    }
+    //妗f鑰冩牳姣�
+    public BigDecimal archivesRate(Map<String, Object> param) {
+        BigDecimal allFiles = new BigDecimal((Integer) param.get("allFiles"));
+        BigDecimal todayFiles = new BigDecimal((Integer) param.get("todayFiles"));
+        return todayFiles.divide(allFiles, 4, RoundingMode.HALF_UP);
+    }
     //鐐逛綅鍦ㄧ嚎鐜�
     public BigDecimal siteOnline(Map<String, Object> param) {
         BigDecimal totalSites = new BigDecimal((Integer) param.get("totalSites"));
@@ -140,7 +168,24 @@
         List<YwPoint> commandImages = pointMapper.selectByTag(null, null, Boolean.TRUE);
         return CollectionUtils.isEmpty(commandImages) ? new ArrayList<>() : commandImages.stream().map(YwPoint::getSerialNumber).collect(Collectors.toList());
     }
+    //杩斿洖閲嶇偣鎸囨尌鍥惧儚闆嗗悎
+    public List<String> getMonitorFromMongo() {
+        // 鑾峰彇Calendar瀹炰緥锛岄粯璁や娇鐢ㄥ綋鍓嶆椂鍖哄拰璇█鐜
+        Calendar calendar = Calendar.getInstance();
+        // 娓呴櫎Calendar涓殑鎵�鏈夊瓧娈靛�硷紝浠ラ伩鍏嶅畠浠褰撳墠鏃ユ湡鏃堕棿鏈夊奖鍝�
+        calendar.clear();
+        // 璁剧疆骞翠唤銆佹湀浠斤紙娉ㄦ剰锛氭湀浠芥槸浠�0寮�濮嬬殑锛屾墍浠�8鏈堟槸7锛夈�佹棩鏈�
+        calendar.set(Calendar.YEAR, 2024);
+        calendar.set(Calendar.MONTH, Calendar.AUGUST);
+        calendar.set(Calendar.DAY_OF_MONTH, 13);
+        // Calendar.getTime()鏂规硶杩斿洖涓�涓〃绀烘Calendar鏃堕棿鍊肩殑Date瀵硅薄
+        Date date = calendar.getTime();
+        Query query = new Query(Criteria.where("mongoCreateTime").gte(DateUtils.getDayStart(date)).lt(DateUtils.getDayEnd(date)));
+//        Query query = new Query(Criteria.where("mongoCreateTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date())));
+        List<MonitorQualifyResult> oneMachineFileResults = mongoTemplate.find(query, MonitorQualifyResult.class);
 
+        return CollectionUtils.isEmpty(oneMachineFileResults) ? new ArrayList<>() : oneMachineFileResults.stream().map(result -> result.getSerialNumber().getValue()).collect(Collectors.toList());
+    }
     //妫�鏌ユ槸鍚﹀瓨鍦ㄥ綋鏃ユ暟鎹�
     public <T extends CheckIndex> T getCheckIndex(String key, List<T> checkIndexList, Class<T> clazz) {
         T checkIndex;
diff --git a/ycl-server/src/main/java/com/ycl/calculate/MonitorRegistrationCalculation.java b/ycl-server/src/main/java/com/ycl/calculate/MonitorRegistrationCalculation.java
new file mode 100644
index 0000000..a6f4dcb
--- /dev/null
+++ b/ycl-server/src/main/java/com/ycl/calculate/MonitorRegistrationCalculation.java
@@ -0,0 +1,141 @@
+package com.ycl.calculate;
+
+import com.alibaba.fastjson2.JSONArray;
+import com.ycl.platform.domain.entity.CheckIndexVideo;
+import com.ycl.platform.domain.entity.TMonitor;
+import com.ycl.platform.domain.entity.YwPoint;
+import com.ycl.platform.domain.result.UY.VideoOnlineResult;
+import com.ycl.platform.domain.vo.TMonitorVO;
+import com.ycl.platform.mapper.CheckIndexVideoMapper;
+import com.ycl.platform.mapper.TMonitorMapper;
+import com.ycl.platform.service.ICheckIndexVideoService;
+import constant.ApiConstants;
+import constant.RedisConstant;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+import utils.DateUtils;
+import utils.StringUtils;
+
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * 璁$畻涓�鏈轰竴妗f敞鍐岀巼銆佹。妗堣�冩牳姣�
+ * 鑾峰彇鍒嗙渷鍘呫�佸尯鍩熺殑map<k,v> k涓篸eptId鎴栬�匬rovince_deptId
+ * 鏇存柊鎴栨柊澧�
+ */
+@Component
+public class MonitorRegistrationCalculation extends IndexCalculationServe implements CalculationStrategy<TMonitorVO> {
+    @Autowired
+    private CheckIndexVideoMapper checkIndexVideoMapper;
+    @Autowired
+    private TMonitorMapper monitorMapper;
+    @Autowired
+    private ICheckIndexVideoService checkIndexVideoService;
+    @Autowired
+    private RedisTemplate redisTemplate;
+
+    //鍖哄煙瑙嗛鍦ㄧ嚎鐜囩殑鍐呴儴绫�
+    private static class AreaStats {
+        //璧勪骇搴撶櫥璁板湪鐢ㄦ暟
+        int totalSites = 0;
+        //鏈敞鍐岀殑鏁伴噺
+        int newSites = 0;
+        //鍏ㄥ勾鐣欏瓨鏁�
+        int allFiles = 0;
+        //褰撴棩妗f鏁�
+        int todayFiles = 0;
+    }
+
+    @Override
+    public void calculate(List<TMonitorVO> list) {
+        if (CollectionUtils.isEmpty(list)) {
+            return;
+        }
+        //鑾峰緱鍥芥爣鐮佷负key鐨勮澶噈ap
+        Map<String, TMonitorVO> monitorMap = new HashMap<>();
+        if(!CollectionUtils.isEmpty(list)){
+            monitorMap = list.stream().collect(Collectors.toMap(TMonitorVO::getSerialNumber, Function.identity()));
+        }
+        //鏈敞鍐岃澶�
+        Map<String,TMonitor> newMonitorMap = new HashMap<>();
+        //Mongo涓�鏈轰竴妗e悓姝ysql鏃舵斁鍏edis
+        String json = (String) redisTemplate.opsForValue().get(RedisConstant.New_Monitor_Set);
+        if (!StringUtils.isEmpty(json)) {
+            List<TMonitor> newMonitors = JSONArray.parseArray(json, TMonitor.class);
+            if(!CollectionUtils.isEmpty(newMonitors)){
+                newMonitorMap = newMonitors.stream().collect(Collectors.toMap(TMonitor::getSerialNumber, Function.identity()));
+            }
+        }
+
+        //鑾峰彇鏄ㄦ棩mongo涓�鏈轰竴妗f暟閲�
+        List<String> todayMonitor = getMonitorFromMongo();
+        Map<String, AreaStats> areaStatsMap = new HashMap<>();
+        for (TMonitorVO result : list) {
+            TMonitorVO monitor = monitorMap.get(result.getSerialNumber());
+            if (monitor == null) continue;
+
+            String deptId = monitor.getDeptId().toString();
+            updateAreaStats(areaStatsMap, deptId, result,newMonitorMap,todayMonitor);
+
+        }
+
+        // 鏌ヨ鏄惁index琛ㄥ凡缁忓瓨鍦ㄤ粖鏃ユ暟鎹�
+        List<CheckIndexVideo> checkIndexVideoList = checkIndexVideoMapper.selectToday(DateUtils.getDate());
+        List<CheckIndexVideo> checkIndexVideos = new ArrayList<>();
+        areaStatsMap.forEach((deptId, stats) -> {
+            if (stats.totalSites > 0) {
+                CheckIndexVideo CheckIndexVideo = createOrUpdateCheckIndexVideo(deptId, stats, checkIndexVideoList);
+                if (CheckIndexVideo != null) {
+                    checkIndexVideos.add(CheckIndexVideo);
+                }
+            }
+        });
+
+        checkIndexVideoService.saveOrUpdateBatch(checkIndexVideos);
+    }
+
+    /**
+     * 绱鎬荤偣浣嶆暟銆佸湪绾跨偣浣嶆暟銆侀噸鐐圭偣浣嶆暟銆侀噸鐐圭偣浣嶅湪绾挎暟銆佹寚鎸ュ浘鍍忔暟銆佹寚鎸ュ浘鍍忓湪绾挎暟
+     */
+    private void updateAreaStats(Map<String, AreaStats> areaStatsMap, String key, TMonitorVO result,Map<String,TMonitor> newMonitors,List<String> todayMonitor) {
+        //杩斿洖瀵硅薄鐨勫紩鐢紝濡傛灉涓嶅瓨鍦ㄤ細鏀惧叆鏂扮殑key,value
+        AreaStats stats = areaStatsMap.computeIfAbsent(key, k -> new AreaStats());
+        stats.totalSites++;
+        stats.allFiles++;
+        if(newMonitors.containsKey(result.getSerialNumber())){
+            stats.newSites++;
+        }
+        if(todayMonitor.contains(result.getSerialNumber())){
+            stats.todayFiles++;
+        }
+    }
+
+    /**
+     * 瑙嗛鐐逛綅鍦ㄧ嚎鐜�
+     */
+    private CheckIndexVideo createOrUpdateCheckIndexVideo(String key, AreaStats stats, List<CheckIndexVideo> checkIndexVideoList) {
+        CheckIndexVideo checkIndexVideo = getCheckIndex(key, checkIndexVideoList, CheckIndexVideo.class);
+        if (checkIndexVideo == null) {
+            return null;
+        }
+        //璋冪敤涓�鏈轰竴妗f敞鍐岀巼
+        Map<String, Object> param = new HashMap<>();
+        param.put("totalSites", stats.totalSites);
+        param.put("newSites", stats.newSites);
+        BigDecimal monitorRegistration = monitorRegistration(param);
+        checkIndexVideo.setMonitorRegistration(monitorRegistration);
+        //璋冪敤妗f鑰冩牳姣旇绠�
+        Map<String, Object> importantParam = new HashMap<>();
+        param.put("allFiles", stats.allFiles);
+        param.put("todayFiles", stats.todayFiles);
+        BigDecimal archivesRate = archivesRate(importantParam);
+        checkIndexVideo.setArchivesRate(archivesRate);
+
+        return checkIndexVideo;
+    }
+}
diff --git a/ycl-server/src/main/java/com/ycl/calculate/VideoOnlineCalculation.java b/ycl-server/src/main/java/com/ycl/calculate/VideoOnlineCalculation.java
index 9a8d1b4..5c4f9ea 100644
--- a/ycl-server/src/main/java/com/ycl/calculate/VideoOnlineCalculation.java
+++ b/ycl-server/src/main/java/com/ycl/calculate/VideoOnlineCalculation.java
@@ -88,7 +88,7 @@
         List<CheckIndexVideo> checkIndexVideos = new ArrayList<>();
         areaStatsMap.forEach((deptId, stats) -> {
             if (stats.totalSites > 0) {
-                CheckIndexVideo CheckIndexVideo = createOrUpdateCheckIndexFace(deptId, stats, checkIndexVideoList);
+                CheckIndexVideo CheckIndexVideo = createOrUpdateCheckIndexVideo(deptId, stats, checkIndexVideoList);
                 if (CheckIndexVideo != null) {
                     checkIndexVideos.add(CheckIndexVideo);
                 }
@@ -127,7 +127,7 @@
     /**
      * 瑙嗛鐐逛綅鍦ㄧ嚎鐜�
      */
-    private CheckIndexVideo createOrUpdateCheckIndexFace(String key, AreaStats stats, List<CheckIndexVideo> checkIndexVideoList) {
+    private CheckIndexVideo createOrUpdateCheckIndexVideo(String key, AreaStats stats, List<CheckIndexVideo> checkIndexVideoList) {
         CheckIndexVideo checkIndexVideo = getCheckIndex(key, checkIndexVideoList, CheckIndexVideo.class);
         if (checkIndexVideo == null) {
             return null;
diff --git a/ycl-server/src/main/java/com/ycl/factory/IndexCalculationFactory.java b/ycl-server/src/main/java/com/ycl/factory/IndexCalculationFactory.java
index 196a70d..b8f2e79 100644
--- a/ycl-server/src/main/java/com/ycl/factory/IndexCalculationFactory.java
+++ b/ycl-server/src/main/java/com/ycl/factory/IndexCalculationFactory.java
@@ -37,6 +37,8 @@
         calculators.put(CalculationStrategyConstants.Face_ClockAccuracy, new FaceClockAccuracyCalculation());
         //TODO锛氫汉鑴哥洰褰曚竴鑷�
 
+        //涓�鏈轰竴妗f敞鍐岀巼銆佹。妗堣�冩牳姣�
+        calculators.put(CalculationStrategyConstants.Video_MonitorRegis_ArchiveRate,new MonitorRegistrationCalculation())
         //涓�鏈轰竴妗e悎鏍肩巼
         calculators.put(CalculationStrategyConstants.Video_MonitorQualify, new MonitorQualifyCalculation());
         //瑙嗛鐐逛綅鍦ㄧ嚎鐜�
diff --git a/ycl-server/src/main/java/com/ycl/task/MonitorTask.java b/ycl-server/src/main/java/com/ycl/task/MonitorTask.java
index 76725ba..9dc6986 100644
--- a/ycl-server/src/main/java/com/ycl/task/MonitorTask.java
+++ b/ycl-server/src/main/java/com/ycl/task/MonitorTask.java
@@ -55,7 +55,18 @@
     //鍚屾mongodb涓�鏈轰竴妗e埌鏁版嵁搴�
     @Transactional
     public void synchronize() {
-        Query query = new Query(Criteria.where("mongoCreateTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date())));
+        // 鑾峰彇Calendar瀹炰緥锛岄粯璁や娇鐢ㄥ綋鍓嶆椂鍖哄拰璇█鐜
+        Calendar calendar = Calendar.getInstance();
+        // 娓呴櫎Calendar涓殑鎵�鏈夊瓧娈靛�硷紝浠ラ伩鍏嶅畠浠褰撳墠鏃ユ湡鏃堕棿鏈夊奖鍝�
+        calendar.clear();
+        // 璁剧疆骞翠唤銆佹湀浠斤紙娉ㄦ剰锛氭湀浠芥槸浠�0寮�濮嬬殑锛屾墍浠�8鏈堟槸7锛夈�佹棩鏈�
+        calendar.set(Calendar.YEAR, 2024);
+        calendar.set(Calendar.MONTH, Calendar.AUGUST);
+        calendar.set(Calendar.DAY_OF_MONTH, 13);
+        // Calendar.getTime()鏂规硶杩斿洖涓�涓〃绀烘Calendar鏃堕棿鍊肩殑Date瀵硅薄
+        Date date = calendar.getTime();
+        Query query = new Query(Criteria.where("mongoCreateTime").gte(DateUtils.getDayStart(date)).lt(DateUtils.getDayEnd(date)));
+//        Query query = new Query(Criteria.where("mongoCreateTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date())));
         List<MonitorQualifyResult> oneMachineFileResults = mongoTemplate.find(query, MonitorQualifyResult.class);
         //鏁版嵁搴搈onitor琛ㄦ暟鎹�
         Map<String, TMonitorVO> monitorVOMap = monitorMapper.selectMonitorVOList().stream().collect(Collectors.toMap(TMonitorVO::getSerialNumber, Function.identity()));
@@ -73,7 +84,7 @@
         List<SysDictData> DictDataList = dictDataService.selectDictDataList(sysDictData);
         List<String> importantSite = DictDataList.stream().map(SysDictData::getDictValue).collect(Collectors.toList());
 
-        //TODO:鍏ㄥ勾鐣欏瓨杩樻槸鍗曟鐣欏瓨
+        //鍏ㄥ勾鐣欏瓨
         for (MonitorQualifyResult result : oneMachineFileResults) {
             TMonitor monitor = getMonitor(result, monitorVOMap);
             YwPoint point = getPoint(result, pointMap, importantSite);
diff --git a/ycl-server/src/main/java/com/ycl/task/VideoTask.java b/ycl-server/src/main/java/com/ycl/task/VideoTask.java
index 7b0f7ec..c89f06c 100644
--- a/ycl-server/src/main/java/com/ycl/task/VideoTask.java
+++ b/ycl-server/src/main/java/com/ycl/task/VideoTask.java
@@ -10,8 +10,10 @@
 import com.ycl.platform.domain.result.UY.QueryVqdResult;
 import com.ycl.platform.domain.result.UY.VideoOnlineResult;
 import com.ycl.platform.domain.vo.PlatformOnlineVO;
+import com.ycl.platform.domain.vo.TMonitorVO;
 import com.ycl.platform.mapper.CheckIndexVideoMapper;
 import com.ycl.platform.mapper.PlatformOnlineMapper;
+import com.ycl.platform.mapper.TMonitorMapper;
 import com.ycl.platform.service.PlatformOnlineService;
 import com.ycl.system.mapper.SysDeptMapper;
 import com.ycl.utils.DateUtils;
@@ -43,7 +45,8 @@
     private MongoTemplate mongoTemplate;
     @Autowired
     private PlatformOnlineMapper platformOnlineMapper;
-
+    @Autowired
+    private TMonitorMapper monitorMapper;
 
     public void siteOnlineTask() {
         Date yesterday = DateUtils.addDays(new Date(), -1);
@@ -71,7 +74,9 @@
 
     public void oneMonitorFileTask() {
         //璁$畻涓�鏈轰竴妗f敞鍐岀巼銆佹。妗堣�冩牳姣�
-
+        List<TMonitorVO> tMonitorVOS = monitorMapper.selectMonitorVOList();
+        CalculationStrategy calculator = IndexCalculationFactory.getCalculator(CalculationStrategyConstants.Video_Usability);
+        calculator.calculate(tMonitorVOS);
     }
 
     public void oneMonitorQualifyTask(){

--
Gitblit v1.8.0