document/º£¿µapi.docxBinary files differ
ycl-common/src/main/java/constant/CalculationStrategyConstants.java
@@ -28,7 +28,10 @@ * è½¦è¾æ¶éåç¡®æ§ */ public static final String Car_ClockAccuracy = "carClockAccuracy"; /** * 车è¾ç®å½ä¸è´ç */ public static final String Car_DirectConsistent = "carDirectConsistent"; /** * äººè¸æ°æ®ä¸ä¼ åæ¶æ§ @@ -50,7 +53,10 @@ * äººè¸æ¶éåç¡®æ§ */ public static final String Face_ClockAccuracy = "faceClockAccuracy"; /** * 人è¸ç®å½ä¸è´ç */ public static final String Face_DirectConsistent = "faceDirectConsistent"; /** * 䏿ºä¸æ¡£æ³¨åçãæ¡£æ¡èæ ¸æ¯ ycl-server/src/main/java/com/ycl/calculate/CarConsistentCalculation.java
New file @@ -0,0 +1,132 @@ package com.ycl.calculate; import com.alibaba.fastjson2.JSONArray; import com.ycl.platform.domain.entity.CheckIndexCar; import com.ycl.platform.domain.entity.TMonitor; import com.ycl.platform.domain.result.HK.DataIntegrityMonitoringResult; import com.ycl.platform.domain.vo.TMonitorVO; import com.ycl.platform.mapper.CheckIndexCarMapper; import com.ycl.platform.mapper.TMonitorMapper; import com.ycl.platform.service.ICheckIndexCarService; import constant.ApiConstants; import constant.CheckConstants; 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.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; /** * 计ç®è½¦è¾ç®å½ä¸è´ç * è·ååçå ãåºåçmap<k,v> k为deptIdæè Province_deptId * æ´æ°ææ°å¢ */ @Component public class CarConsistentCalculation extends IndexCalculationServe implements CalculationStrategy<TMonitorVO> { @Autowired private CheckIndexCarMapper checkIndexCarMapper; @Autowired private TMonitorMapper monitorMapper; @Autowired private ICheckIndexCarService checkIndexCarService; @Autowired private RedisTemplate redisTemplate; //åºå车è¾ä¿¡æ¯ééåç¡®ççå é¨ç±» private static class AreaStats { int totalSites = 0; int newSites = 0; } @Override public void calculate(List<TMonitorVO> list) { if (CollectionUtils.isEmpty(list)) { return; } //è¿å以彿 ç 为keyç设å¤map Map<String, TMonitorVO> monitorMap = new HashMap<>(); if(!CollectionUtils.isEmpty(list)){ monitorMap = list.stream().collect(Collectors.toMap(TMonitorVO::getSerialNumber, Function.identity())); } //è·åçå 彿 ç éå List<String> provinceIds = getProvince(); //æªæ³¨å车è¾è®¾å¤ Map<String,TMonitor> newMonitorMap = new HashMap<>(); //Mongo䏿ºä¸æ¡£åæ¥Mysqlæ¶æ¾å ¥Redis çéåºè½¦è¾æ¡£æ¡ 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().filter(tMonitor -> tMonitor.getCameraFunType().contains(CheckConstants.Rule_Category_Car+"")).collect(Collectors.toMap(TMonitor::getSerialNumber, Function.identity())); } } 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); // å¤ççå æ°æ® if (!CollectionUtils.isEmpty(provinceIds) && provinceIds.contains(monitor.getSerialNumber())) { String provinceKey = ApiConstants.Province + deptId; updateAreaStats(areaStatsMap, provinceKey, result,newMonitorMap); } } // æ¥è¯¢æ¯å¦index表已ç»åå¨ä»æ¥æ°æ® List<CheckIndexCar> checkIndexCarList = checkIndexCarMapper.selectToday(DateUtils.getDate()); List<CheckIndexCar> checkIndexCars = new ArrayList<>(); areaStatsMap.forEach((deptId, stats) -> { if (stats.totalSites > 0) { CheckIndexCar checkIndexCar = createOrUpdateCheckIndexCar(deptId, stats, checkIndexCarList); if (checkIndexCar != null) { checkIndexCars.add(checkIndexCar); } } }); checkIndexCarService.saveOrUpdateBatch(checkIndexCars); } /** * 累计车è¾ç®å½ä¸è´ç */ private void updateAreaStats(Map<String, AreaStats> areaStatsMap, String key, TMonitorVO result,Map<String,TMonitor> newMonitorMap) { //è¿å对象çå¼ç¨ï¼å¦æä¸åå¨ä¼æ¾å ¥æ°çkey,value AreaStats stats = areaStatsMap.computeIfAbsent(key, k -> new AreaStats()); stats.totalSites++; if(newMonitorMap.containsKey(result.getSerialNumber())){ stats.newSites++; } } /** * 车è¾ä¿¡æ¯ééæ£ç¡®ç */ private CheckIndexCar createOrUpdateCheckIndexCar(String key, AreaStats stats, List<CheckIndexCar> checkIndexCarList) { CheckIndexCar checkIndexCar = getCheckIndex(key, checkIndexCarList, CheckIndexCar.class); if (checkIndexCar == null) { return null; } //è°ç¨ç®å½ä¸è´çè®¡ç®æ¹æ³ Map<String, Object> param = new HashMap<>(); param.put("totalSites", stats.totalSites); param.put("newSites", stats.newSites); BigDecimal directoryConstant = directoryConstant(param); checkIndexCar.setDeviceDirectoryConsistent(directoryConstant); return checkIndexCar; } } ycl-server/src/main/java/com/ycl/calculate/FaceConsistentCalculation.java
New file @@ -0,0 +1,131 @@ package com.ycl.calculate; import com.alibaba.fastjson2.JSONArray; import com.ycl.platform.domain.entity.CheckIndexFace; import com.ycl.platform.domain.entity.TMonitor; import com.ycl.platform.domain.vo.TMonitorVO; import com.ycl.platform.mapper.CheckIndexFaceMapper; import com.ycl.platform.mapper.TMonitorMapper; import com.ycl.platform.service.ICheckIndexFaceService; import constant.ApiConstants; import constant.CheckConstants; 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.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; /** * 计ç®è½¦è¾ç®å½ä¸è´ç * è·ååçå ãåºåçmap<k,v> k为deptIdæè Province_deptId * æ´æ°ææ°å¢ */ @Component public class FaceConsistentCalculation extends IndexCalculationServe implements CalculationStrategy<TMonitorVO> { @Autowired private CheckIndexFaceMapper checkIndexFaceMapper; @Autowired private TMonitorMapper monitorMapper; @Autowired private ICheckIndexFaceService checkIndexFaceService; @Autowired private RedisTemplate redisTemplate; //åºå车è¾ä¿¡æ¯ééåç¡®ççå é¨ç±» private static class AreaStats { int totalSites = 0; int newSites = 0; } @Override public void calculate(List<TMonitorVO> list) { if (CollectionUtils.isEmpty(list)) { return; } //è¿å以彿 ç 为keyç设å¤map Map<String, TMonitorVO> monitorMap = new HashMap<>(); if(!CollectionUtils.isEmpty(list)){ monitorMap = list.stream().collect(Collectors.toMap(TMonitorVO::getSerialNumber, Function.identity())); } //è·åçå 彿 ç éå List<String> provinceIds = getProvince(); //æªæ³¨å车è¾è®¾å¤ Map<String,TMonitor> newMonitorMap = new HashMap<>(); //Mongo䏿ºä¸æ¡£åæ¥Mysqlæ¶æ¾å ¥Redis çéåºè½¦è¾æ¡£æ¡ 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().filter(tMonitor -> tMonitor.getCameraFunType().contains(CheckConstants.Rule_Category_Face+"")).collect(Collectors.toMap(TMonitor::getSerialNumber, Function.identity())); } } 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); // å¤ççå æ°æ® if (!CollectionUtils.isEmpty(provinceIds) && provinceIds.contains(monitor.getSerialNumber())) { String provinceKey = ApiConstants.Province + deptId; updateAreaStats(areaStatsMap, provinceKey, result,newMonitorMap); } } // æ¥è¯¢æ¯å¦index表已ç»åå¨ä»æ¥æ°æ® List<CheckIndexFace> checkIndexFaceList = checkIndexFaceMapper.selectToday(DateUtils.getDate()); List<CheckIndexFace> checkIndexFaces = new ArrayList<>(); areaStatsMap.forEach((deptId, stats) -> { if (stats.totalSites > 0) { CheckIndexFace checkIndexFace = createOrUpdateCheckIndexFace(deptId, stats, checkIndexFaceList); if (checkIndexFace != null) { checkIndexFaces.add(checkIndexFace); } } }); checkIndexFaceService.saveOrUpdateBatch(checkIndexFaces); } /** * 累计人è¸ç®å½ä¸è´ç */ private void updateAreaStats(Map<String, AreaStats> areaStatsMap, String key, TMonitorVO result,Map<String,TMonitor> newMonitorMap) { //è¿å对象çå¼ç¨ï¼å¦æä¸åå¨ä¼æ¾å ¥æ°çkey,value AreaStats stats = areaStatsMap.computeIfAbsent(key, k -> new AreaStats()); stats.totalSites++; if(newMonitorMap.containsKey(result.getSerialNumber())){ stats.newSites++; } } /** * 人è¸ä¿¡æ¯ééæ£ç¡®ç */ private CheckIndexFace createOrUpdateCheckIndexFace(String key, AreaStats stats, List<CheckIndexFace> checkIndexFaceList) { CheckIndexFace checkIndexFace = getCheckIndex(key, checkIndexFaceList, CheckIndexFace.class); if (checkIndexFace == null) { return null; } //è°ç¨ç®å½ä¸è´çè®¡ç®æ¹æ³ Map<String, Object> param = new HashMap<>(); param.put("totalSites", stats.totalSites); param.put("newSites", stats.newSites); BigDecimal directoryConstant = directoryConstant(param); checkIndexFace.setDeviceDirectoryConsistent(directoryConstant); return checkIndexFace; } } ycl-server/src/main/java/com/ycl/calculate/IndexCalculationServe.java
@@ -67,6 +67,18 @@ return onlineSites.divide(totalSites, 4, RoundingMode.HALF_UP); } //ç®å½ä¸è´çï¼æ¯è¶ è¿ç¾åä¹1æ£10% public BigDecimal directoryConstant(Map<String, Object> param) { BigDecimal totalSites = new BigDecimal((Integer) param.get("totalSites")); BigDecimal newSites = new BigDecimal((Integer) param.get("newSites")); // 计ç®newSiteså totalSitesçç¾åæ¯åæ° BigDecimal percentage = newSites.divide(totalSites, 2, RoundingMode.DOWN).multiply(BigDecimal.valueOf(100)); BigDecimal result = BigDecimal.ONE; if(BigDecimal.ONE.compareTo(percentage) <= 0 ){ result = result.subtract(percentage.multiply(new BigDecimal("0.1"))); } return result.max(BigDecimal.ZERO); } //è§å¾åºå¯¹æ¥ç¨³å®æ§ public BigDecimal viewConnectStability(Map<String, Object> param) { BigDecimal totalDataSum = new BigDecimal((Integer) param.get("totalDataSum")); ycl-server/src/main/java/com/ycl/calculate/MonitorRegistrationCalculation.java
@@ -33,8 +33,6 @@ @Autowired private CheckIndexVideoMapper checkIndexVideoMapper; @Autowired private TMonitorMapper monitorMapper; @Autowired private ICheckIndexVideoService checkIndexVideoService; @Autowired private RedisTemplate redisTemplate; @@ -61,6 +59,8 @@ if(!CollectionUtils.isEmpty(list)){ monitorMap = list.stream().collect(Collectors.toMap(TMonitorVO::getSerialNumber, Function.identity())); } //è·åçå 彿 ç éå List<String> provinceIds = getProvince(); //æªæ³¨åè®¾å¤ Map<String,TMonitor> newMonitorMap = new HashMap<>(); //Mongo䏿ºä¸æ¡£åæ¥Mysqlæ¶æ¾å ¥Redis @@ -81,7 +81,11 @@ String deptId = monitor.getDeptId().toString(); updateAreaStats(areaStatsMap, deptId, result,newMonitorMap,todayMonitor); // å¤ççå æ°æ® if (!CollectionUtils.isEmpty(provinceIds) && provinceIds.contains(monitor.getSerialNumber())) { String provinceKey = ApiConstants.Province + deptId; updateAreaStats(areaStatsMap, provinceKey, result,newMonitorMap,todayMonitor); } } // æ¥è¯¢æ¯å¦index表已ç»åå¨ä»æ¥æ°æ® ycl-server/src/main/java/com/ycl/factory/IndexCalculationFactory.java
@@ -23,7 +23,8 @@ calculators.put(CalculationStrategyConstants.Car_DataAccuracy_Url_PicUsability, new CarDeviceSampleCalculation()); //è½¦è¾æ¶éåç¡®æ§ calculators.put(CalculationStrategyConstants.Car_ClockAccuracy, new CarClockAccuracyCalculation()); //TODOï¼è½¦è¾ç®å½ä¸è´ //车è¾ç®å½ä¸è´ calculators.put(CalculationStrategyConstants.Car_DirectConsistent, new CarConsistentCalculation()); //人è¸ç¹ä½å¨çº¿ãè§å¾åºå¯¹æ¥ç¨³å® calculators.put(CalculationStrategyConstants.Face_SiteOnline_ViewStability, new FaceSnapshotDataCalculation()); @@ -35,7 +36,8 @@ calculators.put(CalculationStrategyConstants.Face_DataAccuracy_PicUsability, new FaceDeviceSampleCalculation()); //äººè¸æ¶éåç¡®æ§ calculators.put(CalculationStrategyConstants.Face_ClockAccuracy, new FaceClockAccuracyCalculation()); //TODOï¼äººè¸ç®å½ä¸è´ //人è¸ç®å½ä¸è´ calculators.put(CalculationStrategyConstants.Face_DirectConsistent, new FaceConsistentCalculation()); //䏿ºä¸æ¡£æ³¨åçãæ¡£æ¡èæ ¸æ¯ calculators.put(CalculationStrategyConstants.Video_MonitorRegis_ArchiveRate,new MonitorRegistrationCalculation()) ycl-server/src/main/java/com/ycl/platform/mapper/PlatformOnlineMapper.java
@@ -34,6 +34,6 @@ IPage getPage(IPage page, @Param("query") DataCenterQuery query); //æ¨æ¥æ°æ® List<PlatformOnlineVO> sumYesterday(@Param("startDate")String startDate, @Param("endDate")String endDate); List<PlatformOnlineVO> yesterdayData(@Param("startDate")String startDate, @Param("endDate")String endDate); } ycl-server/src/main/java/com/ycl/task/CarTask.java
@@ -4,9 +4,12 @@ import com.ycl.calculate.CalculationStrategy; import com.ycl.factory.IndexCalculationFactory; import com.ycl.platform.domain.result.HK.*; import com.ycl.platform.domain.vo.TMonitorVO; import com.ycl.platform.mapper.TMonitorMapper; import com.ycl.utils.DateUtils; import constant.ApiConstants; import constant.CalculationStrategyConstants; import constant.CheckConstants; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoTemplate; @@ -16,6 +19,7 @@ import java.util.Date; import java.util.List; import java.util.stream.Collectors; /** * 车è¾è®¡ç®èæ ¸ææ ä»»å¡ @@ -26,7 +30,8 @@ public class CarTask { @Autowired private MongoTemplate mongoTemplate; @Autowired private TMonitorMapper monitorMapper; public void siteOnlineTask() { Date yesterday = DateUtils.addDays(new Date(), -1); //计ç®ç¹ä½å¨çº¿çåè§å¾åºå¯¹æ¥ç¨³å®æ§ @@ -95,8 +100,12 @@ calculator.calculate(results); } public void test() { Date yesterday = DateUtils.addDays(new Date(), -1); //TODOï¼ä¸æºä¸æ¡£ èç½å¡å£è®¾å¤ç®å½ä¸è´ç public void directConsistentTask() { //车è¾ç®å½ä¸è´ç List<TMonitorVO> tMonitorVOS = monitorMapper.selectMonitorVOList(); List<TMonitorVO> list = tMonitorVOS.stream().filter(tMonitorVO -> tMonitorVO.getCameraFunType().contains(CheckConstants.Rule_Category_Car + "")).collect(Collectors.toList()); CalculationStrategy calculator = IndexCalculationFactory.getCalculator(CalculationStrategyConstants.Car_DirectConsistent); calculator.calculate(list); } } ycl-server/src/main/java/com/ycl/task/FaceTask.java
@@ -4,9 +4,12 @@ import com.ycl.calculate.CalculationStrategy; import com.ycl.factory.IndexCalculationFactory; import com.ycl.platform.domain.result.HK.*; import com.ycl.platform.domain.vo.TMonitorVO; import com.ycl.platform.mapper.TMonitorMapper; import com.ycl.utils.DateUtils; import constant.ApiConstants; import constant.CalculationStrategyConstants; import constant.CheckConstants; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoTemplate; @@ -16,6 +19,7 @@ import java.util.Date; import java.util.List; import java.util.stream.Collectors; /** * 人è¸è®¡ç®èæ ¸ææ ä»»å¡ @@ -26,6 +30,8 @@ public class FaceTask { @Autowired private MongoTemplate mongoTemplate; @Autowired private TMonitorMapper monitorMapper; public void siteOnlineTask() { Date yesterday = DateUtils.addDays(new Date(), -1); @@ -80,8 +86,11 @@ calculator.calculate(results); } public void test() { Date yesterday = DateUtils.addDays(new Date(), -1); //TODOï¼ä¸æºä¸æ¡£ èç½å¡å£è®¾å¤ç®å½ä¸è´ç public void directConsistentTask() { //人è¸ç®å½ä¸è´ç List<TMonitorVO> tMonitorVOS = monitorMapper.selectMonitorVOList(); List<TMonitorVO> list = tMonitorVOS.stream().filter(tMonitorVO -> tMonitorVO.getCameraFunType().contains(CheckConstants.Rule_Category_Face + "")).collect(Collectors.toList()); CalculationStrategy calculator = IndexCalculationFactory.getCalculator(CalculationStrategyConstants.Face_DirectConsistent); calculator.calculate(list); } } ycl-server/src/main/java/com/ycl/task/VideoTask.java
@@ -91,7 +91,7 @@ } public void platformOnlineTask() { //计ç®å¹³å°å¨çº¿ç List<PlatformOnlineVO> list = platformOnlineMapper.sumYesterday(DateUtils.getMouthStart(new Date()), DateUtils.getMouthEnd(new Date())); List<PlatformOnlineVO> list = platformOnlineMapper.yesterdayData(DateUtils.getMouthStart(new Date()), DateUtils.getMouthEnd(new Date())); CalculationStrategy calculator = IndexCalculationFactory.getCalculator(CalculationStrategyConstants.Video_PlatformOnline); calculator.calculate(list); } ycl-server/src/main/resources/mapper/zgyw/PlatformOnlineMapper.xml
@@ -47,7 +47,7 @@ </select> <select id="sumYesterday" resultMap="BaseResultMap"> <select id="yesterdayData" resultMap="BaseResultMap"> select * from t_platform_online where create_date between #{startDate} and #{endDate} </select>