xiangpei
2024-08-15 17244068535a9163ab1fd6b3be2a794d9a857879
Merge remote-tracking branch 'origin/master'
24个文件已修改
3个文件已添加
650 ■■■■■ 已修改文件
document/海康api.docx 补丁 | 查看 | 原始文档 | blame | 历史
ycl-common/src/main/java/constant/CalculationStrategyConstants.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/MonitoringDetailResult.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/result/UY/ImageDetectionResult.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/calculate/CarConsistentCalculation.java 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/calculate/FaceConsistentCalculation.java 131 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/calculate/IndexCalculationServe.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/calculate/MonitorRegistrationCalculation.java 145 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/calculate/VideoOnlineCalculation.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/factory/IndexCalculationFactory.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/controller/HomeController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/mapper/CheckScoreMapper.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/mapper/ContractScoreMapper.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/mapper/PlatformOnlineMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/service/ICheckScoreService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/service/IContractScoreService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/service/impl/CheckScoreServiceImpl.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/service/impl/ContractScoreServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/task/CarTask.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/task/FaceTask.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/task/HKTask.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/task/MonitorTask.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/task/VideoTask.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/resources/mapper/zgyw/CheckScoreMapper.xml 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/resources/mapper/zgyw/ContractScoreMapper.xml 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/resources/mapper/zgyw/PlatformOnlineMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/resources/mapper/zgyw/YwUnitMapper.xml 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
document/º£¿µapi.docx
Binary 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,8 +53,15 @@
     * äººè„¸æ—¶é’Ÿå‡†ç¡®æ€§
     */
    public static final String Face_ClockAccuracy = "faceClockAccuracy";
    /**
     * äººè„¸ç›®å½•一致率
     */
    public static final String Face_DirectConsistent = "faceDirectConsistent";
    /**
     * ä¸€æœºä¸€æ¡£æ³¨å†ŒçŽ‡ã€æ¡£æ¡ˆè€ƒæ ¸æ¯”
     */
    public static final String Video_MonitorRegis_ArchiveRate = "videoMonitorRegisArchiveRate";
    /**
     * ä¸€æœºä¸€æ¡£åˆæ ¼çއ
     */
ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/MonitoringDetailResult.java
@@ -6,7 +6,7 @@
import org.springframework.data.mongodb.core.mapping.Document;
/**
 * é‡‡é›†è®¾å¤‡å±žæ€§ç›‘测结果:人脸(设备抓拍图片合格性)
 * é‡‡é›†è®¾å¤‡å±žæ€§ç›‘测结果:人脸(人脸卡口信息采集准确率)
 *
 * @author gonghl
 */
ycl-pojo/src/main/java/com/ycl/platform/domain/result/UY/ImageDetectionResult.java
@@ -12,7 +12,7 @@
 * @date:2024/8/8 20:36
 */
@Data
@Document(collation = "uy_image_detection")
@Document(collection = "uy_image_detection")
public class ImageDetectionResult extends BaseResult {
    /**
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
@@ -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;
    //一机一档合格率
    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);
    }
    //一机一档注册率率
    public BigDecimal monitorRegistration(Map<String, Object> param) {
        //新+正在用的档案数
        BigDecimal totalSites = new BigDecimal((Integer) param.get("totalSites"));
        //正在用的档案数
        BigDecimal useSites = new BigDecimal((Integer) param.get("totalSites") - (Integer) param.get("newSites"));
        return useSites.divide(totalSites, 4, RoundingMode.HALF_UP);
    }
    //档案考核比
    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"));
@@ -39,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"));
@@ -140,7 +180,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;
ycl-server/src/main/java/com/ycl/calculate/MonitorRegistrationCalculation.java
New file
@@ -0,0 +1,145 @@
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;
/**
 * è®¡ç®—一机一档注册率、档案考核比
 * èŽ·å–åˆ†çœåŽ…ã€åŒºåŸŸçš„map<k,v> k为deptId或者Province_deptId
 * æ›´æ–°æˆ–新增
 */
@Component
public class MonitorRegistrationCalculation extends IndexCalculationServe implements CalculationStrategy<TMonitorVO> {
    @Autowired
    private CheckIndexVideoMapper checkIndexVideoMapper;
    @Autowired
    private ICheckIndexVideoService checkIndexVideoService;
    @Autowired
    private RedisTemplate redisTemplate;
    //区域视频在线率的内部类
    private static class AreaStats {
        //资产库登记在用数
        int totalSites = 0;
        //未注册的数量
        int newSites = 0;
        //全年留存数
        int allFiles = 0;
        //当日档案数
        int todayFiles = 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().collect(Collectors.toMap(TMonitor::getSerialNumber, Function.identity()));
            }
        }
        //获取昨日mongo一机一档数量
        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);
            // å¤„理省厅数据
            if (!CollectionUtils.isEmpty(provinceIds) && provinceIds.contains(monitor.getSerialNumber())) {
                String provinceKey = ApiConstants.Province + deptId;
                updateAreaStats(areaStatsMap, provinceKey, 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;
        }
        //调用一机一档注册率
        Map<String, Object> param = new HashMap<>();
        param.put("totalSites", stats.totalSites);
        param.put("newSites", stats.newSites);
        BigDecimal monitorRegistration = monitorRegistration(param);
        checkIndexVideo.setMonitorRegistration(monitorRegistration);
        //调用档案考核比计算
        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;
    }
}
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;
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,8 +36,11 @@
        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())
        //一机一档合格率
        calculators.put(CalculationStrategyConstants.Video_MonitorQualify, new MonitorQualifyCalculation());
        //视频点位在线率
ycl-server/src/main/java/com/ycl/platform/controller/HomeController.java
@@ -22,7 +22,6 @@
    private final ITMonitorService tMonitorService;
    private final WorkOrderService workOrderService;
    private final YwPointService ywPointService;
    private final IContractScoreService contractScoreService;
    private final ICheckScoreService checkScoreService;
    @GetMapping("/ywUnitList")
@@ -56,8 +55,8 @@
    }
    @GetMapping("/calculate")
    public AjaxResult calculate() {
        return AjaxResult.success(contractScoreService.calculate());
    public AjaxResult calculate(String category) {
        return AjaxResult.success(checkScoreService.calculate(category));
    }
}
ycl-server/src/main/java/com/ycl/platform/mapper/CheckScoreMapper.java
@@ -7,6 +7,7 @@
import com.ycl.platform.domain.entity.CheckScore;
import enumeration.OperationType;
import java.util.Date;
import java.util.List;
import java.util.Map;
@@ -80,4 +81,13 @@
     * @return æ•°æ®
     */
    List<Map<String, Object>> home();
    /**
     * é¦–页核算
     * @param startDate æœ¬æœˆç¬¬ä¸€å¤©
     * @param endDate å½“前时间
     * @param category åˆ†ç±»
     * @return æ•°æ®
     */
    List<Map<String, Object>> calculate(Date startDate, Date endDate, String category);
}
ycl-server/src/main/java/com/ycl/platform/mapper/ContractScoreMapper.java
@@ -4,7 +4,6 @@
import com.ycl.platform.domain.entity.ContractScore;
import java.util.List;
import java.util.Map;
/**
 * åˆåŒæ‰“分Mapper接口
@@ -61,10 +60,4 @@
     * @return ç»“æžœ
     */
    public int deleteDefaultScoreByIds(Long[] ids);
    /**
     * é¦–页核算
     * @return æ ¸ç®—
     */
    List<Map<String, Object>> calculate();
}
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/platform/service/ICheckScoreService.java
@@ -55,6 +55,13 @@
     * @return æ•°æ®
     */
    List<Map<String, Object>> home();
    /**
     * é¦–页核算
     * @return æ ¸ç®—
     */
    List<Map<String, Object>> calculate(String category);
//    /**
//     * æ–°å¢žè€ƒæ ¸ç§¯åˆ†æ˜Žç»†
//     *
ycl-server/src/main/java/com/ycl/platform/service/IContractScoreService.java
@@ -5,7 +5,6 @@
import java.io.Serializable;
import java.util.List;
import java.util.Map;
/**
 * åˆåŒæ‰“分Service接口
@@ -48,9 +47,4 @@
     */
    List<ContractScore> getDateRangeScoreByContractId(Long id, String startTime, String endTime);
    /**
     * é¦–页核算
     * @return æ ¸ç®—
     */
    List<Map<String, Object>> calculate();
}
ycl-server/src/main/java/com/ycl/platform/service/impl/CheckScoreServiceImpl.java
@@ -295,6 +295,16 @@
        return baseMapper.home();
    }
    @Override
    public List<Map<String, Object>> calculate(String category) {
        Calendar calendar = Calendar.getInstance();
        Date endDate = calendar.getTime();
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        Date startDate = calendar.getTime();
        return scoreMapper.calculate(startDate, endDate, category);
    }
    //    /**
//     * æ–°å¢žè€ƒæ ¸ç§¯åˆ†
//     *
ycl-server/src/main/java/com/ycl/platform/service/impl/ContractScoreServiceImpl.java
@@ -17,7 +17,6 @@
import java.io.Serializable;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
@@ -90,8 +89,4 @@
                .list();
    }
    @Override
    public List<Map<String, Object>> calculate() {
        return contractScoreMapper.calculate();
    }
}
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/HKTask.java
@@ -231,7 +231,7 @@
            Query query = new Query(Criteria
                    .where("mongoCreateTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date()))
                    .and("dataType").is(ApiConstants.HK_DataType_CAR));
            DeleteResult result = mongoTemplate.remove(query, SnapshotDelayMonitorParam.class);
            DeleteResult result = mongoTemplate.remove(query, SnapshotDelayMonitorResult.class);
            //存放在mongo中
            carList.forEach(item -> item.setDataType(ApiConstants.HK_DataType_CAR));
            mongoTemplate.insertAll(carList);
@@ -243,16 +243,16 @@
        faceParam.setPageSize(ApiConstants.HKPageSize);
        faceParam.setDate(DateUtils.getDate());
        faceParam.setDataType(ApiConstants.HK_DataType_FACE);
        List<SnapshotDelayMonitorParam> faceList = HkApiUtil.sendAPI("/api/dqd/service/rs/v1/data/snapAgingDetail/query", faceParam, SnapshotDelayMonitorParam.class);
        List<SnapshotDelayMonitorResult> faceList = HkApiUtil.sendAPI("/api/dqd/service/rs/v1/data/snapAgingDetail/query", faceParam, SnapshotDelayMonitorResult.class);
        if (!CollectionUtils.isEmpty(faceList)) {
            //如果今天存在之前的数据先删除
            Query query = new Query(Criteria
                    .where("mongoCreateTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date()))
                    .and("dataType").is(ApiConstants.HK_DataType_FACE));
            DeleteResult result = mongoTemplate.remove(query, SnapshotDelayMonitorParam.class);
            DeleteResult result = mongoTemplate.remove(query, SnapshotDelayMonitorResult.class);
            //存放在mongo中
            carList.forEach(item -> item.setDataType(ApiConstants.HK_DataType_FACE));
            faceList.forEach(item -> item.setDataType(ApiConstants.HK_DataType_FACE));
            mongoTemplate.insertAll(faceList);
        }
        //TODO:工单
ycl-server/src/main/java/com/ycl/task/MonitorTask.java
@@ -55,7 +55,18 @@
    //同步mongodb一机一档到数据库
    @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);
        //数据库monitor表数据
        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);
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() {
        //计算一机一档注册率、档案考核比
        List<TMonitorVO> tMonitorVOS = monitorMapper.selectMonitorVOList();
        CalculationStrategy calculator = IndexCalculationFactory.getCalculator(CalculationStrategyConstants.Video_Usability);
        calculator.calculate(tMonitorVOS);
    }
    public void oneMonitorQualifyTask(){
@@ -86,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/CheckScoreMapper.xml
@@ -137,6 +137,7 @@
    </select>
    <select id="home" resultType="java.util.Map">
        <![CDATA[
        SELECT
            DATE_FORMAT(cs.create_time, '%Y-%m-%d %h:%i:%s') AS createTime,
            d.area,
@@ -147,8 +148,24 @@
            t_check_score cs
                LEFT JOIN t_check_template ct ON cs.template_id = ct.id
                LEFT JOIN sys_dept d ON cs.dept_id = d.dept_id
        WHERE cs.score > ct.alarm_score
        WHERE cs.score < ct.alarm_score
        ORDER BY cs.create_time DESC
        ]]>
    </select>
    <select id="calculate" resultType="java.util.Map">
        SELECT
            dept_name AS deptName,
            ROUND(AVG(score)) AS score
        FROM
            t_check_score tcs
                LEFT JOIN sys_dept d ON tcs.dept_id = d.dept_id
        WHERE
            examine_tag = 1
          AND examine_category = #{category}
          AND DATE_FORMAT(tcs.create_time, '%Y-%m') BETWEEN DATE_FORMAT(#{startDate}, '%Y-%m') AND DATE_FORMAT(#{endDate}, '%Y-%m')
        GROUP BY tcs.dept_id
        ORDER BY score DESC, tcs.dept_id
    </select>
</mapper>
ycl-server/src/main/resources/mapper/zgyw/ContractScoreMapper.xml
@@ -112,14 +112,4 @@
        </foreach>
    </delete>
    <select id="calculate" resultType="java.util.Map">
        SELECT
            SUBSTRING_INDEX(rule_name, '/', 1) AS name,
            COUNT(*) AS num,
            -SUM(score) AS score
        FROM t_contract_score
        WHERE auditing_status = 'PASS' AND deleted = 0
        GROUP BY SUBSTRING_INDEX(rule_name, '/', 1)
    </select>
</mapper>
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>
ycl-server/src/main/resources/mapper/zgyw/YwUnitMapper.xml
@@ -112,11 +112,13 @@
    <select id="ywUnitCount" resultType="java.util.Map">
        SELECT
            u.unit_name AS name,
            COUNT(tcs.id) AS num
            COUNT(tcs.id) AS num,
            100 - SUM(score) AS score
        FROM
            t_contract_score tcs
                LEFT JOIN t_yw_unit u ON tcs.unit_id = u.id
        WHERE tcs.deleted = 0
        GROUP BY tcs.unit_id
        ORDER BY score DESC
    </select>
</mapper>