fuliqi
2024-12-19 7b73755e320f1bec9254b86a0f078c5f7969880d
接入海康成绩
16个文件已修改
1128 ■■■■■ 已修改文件
ycl-common/src/main/java/constant/ApiConstants.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/HKScoreResult.java 102 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/vo/WorkOrderVO.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/feign/HKClient.java 471 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/feign/HKFeignConfig.java 41 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/feign/HkApiUtil.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/service/impl/CheckScoreServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/service/impl/WorkOrderServiceImpl.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/task/CheckScoreTask.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/task/HKTask.java 260 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/task/MonitorTask.java 118 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/utils/DateUtils.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/resources/application-dev.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/resources/application-prod.yml 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/resources/mapper/zgyw/TMonitorMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/resources/mapper/zgyw/WorkOrderMapper.xml 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-common/src/main/java/constant/ApiConstants.java
@@ -80,6 +80,10 @@
    //海康访问时间路径
    public final static String HK_OSD_TIME = "/ISAPI/System/time";
    //海康成绩重点标签
    public final static Integer HK_FOCUS_FLAG_ALL = 0;
    public final static Integer HK_FOCUS_FLAG_Important = 1;
    //国标码通道索引
    public final static Integer SerialNumber_Channel = 13;
    //国标码设备类型索引
ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/HKScoreResult.java
@@ -1,32 +1,88 @@
package com.ycl.platform.domain.result.HK;
import com.ycl.platform.domain.result.BaseResult;
import lombok.Data;
import java.util.Date;
import java.util.List;
//考核成绩
@Data
public class HKScoreResult extends BaseResult {
   private List<HkScore> list;
public class HKScoreResult{
    //区域名
    private String areaName;
    //区域编码
    private String areaCode;
    //排名
    private Integer ranking;
    //所有指标得分
    private String totalScore;
    private String fullScore;
    //ZDR动向准确新(暂时没用)
    private String downCrossZdrAccuracyQualityScoreString;
    /** 车辆
     * url可用性
     * 信息采集准确性
     * */
    //批量查询车辆
    private String downCarQueryInterfaceQualityScoreString;
    //车辆数据上传稳定性得分(视图库对接稳定性)
    private String downCarDataUploadScoreString;
    //车辆注册率
    private String downCrossCarSignUpScoreString;
    //车辆卡口数量推送(设备目录一致率)
    private String downCrossNumPushCarScoreString;
    //车辆卡口运行质量(点位在线率)
    private String downCrossQualityCarScoreString;
    //车辆数据完整性(抓拍数据完整性)
    private String downCrossAllCarDataIntegrityScoreString;
    //车辆过车数据主要属性准确性(抓拍数据准确性)
    private String downCrossAccuracyCarScoreString;
    //车辆过车数据重要属性准确性(抓拍数据准确性)
    private String downCrossDataTypeAccuracyCarScoreString;
    //车辆卡口时钟准确性(时钟准确性)
    private String downCrossCarInvertScoreString;
    //车辆卡口上传及时性(数据上传及时性)
    private String downCrossAllCarDelayScoreString;
    //车辆卡口大图可用性(大图可用性)
    private String downCrossPictureQualityCarScoreString;
    /**
     * 考核成绩
     */
    @Data
    public static class HkScore {
        //区域名
        private String areaName;
        //区域编码
        private String areaCode;
        //排名
        private Integer ranking;
        //总分
        private String totalScore;
        //focusFlag为0涉及到的全量指标
        private String downCarDataUploadScoreString;
        private Date dCreateTime;
    //重点车辆卡口数据上传及时性
    private String downCrossFocusCarDelayScoreString;
    //重点车辆卡口大图可用性
    private String downCrossFocusPictureQualityCarScoreString;
    //重点车辆抓拍数据完整性
    private String downCrossFocusCarDataIntegrityScoreString;
    //重点车辆过车数据主要属性准确性
    private String downCrossFocusAccuracyCarScoreString;
    //重点车辆过车数据重要属性准确性
    private String downCrossFocusDataTypeAccuracyCarScoreString;
    /** 人脸
     *
     * 目录一致率
     * 人脸信息采集准确新
     * 设备抓拍图片合格性
     *
     * */
    //批量查询人脸
    private String downFaceQueryInterfaceQualityScoreString;
    //搜图得分
    private String downDrawFaceInterfaceQualityScoreString;
    //人脸数据上传稳定性得分(视图库对接稳定性)
    private String downFaceDataUploadScoreString;
    //人脸注册率
    private String downCrossFaceSignUpScoreString;
    //人脸卡口数量推送(设备目录一致率)
    private String downCrossNumPushFaceScoreString;
    //人脸卡口运行质量(点位在线率)
    private String downCrossQualityFaceScoreString;
    //人脸卡口小图可用性
    private String downCrossFaceBuildRateScoreString;
    //人脸卡口上传及时性(数据上传及时性)
    private String downCrossAllFaceDelayScoreString;
    //人脸卡口时钟准确性(时钟准确性)
    private String downCrossFaceInvertScoreString;
    //人脸卡口大图可用性(大图可用性)
    private String downCrossPictureQualityFaceScoreString;
    }
    //重点人脸卡口上传及时性
    private String downCrossFocusFaceDelayScoreString;
    //重点人脸卡口大图可用性
    private String downCrossFocusPictureQualityFaceScoreString;
}
ycl-pojo/src/main/java/com/ycl/platform/domain/vo/WorkOrderVO.java
@@ -31,7 +31,7 @@
    private String workOrderNo;
    private Integer id;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Excel(name = "故障时间",sort = 6,dateFormat = "yyyy-MM-dd HH:mm:ss")
    @Excel(name = "故障时间",sort = 7,dateFormat = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date updateTime;
@@ -40,7 +40,7 @@
    /** 运维单位 */
    private Integer unitId;
    @Excel(name = "运维单位",sort = 5)
    @Excel(name = "运维单位",sort = 6)
    private String unitName;
    private String unitContact;
    private String unitContactPhone;
@@ -49,28 +49,37 @@
    @Excel(name = "设备名称",sort = 3)
    private String source;
    /** ip */
    @Excel(name = "IP",sort = 4)
    @Excel(name = "IP",sort = 5)
    private String ip;
    /**
     * 设备编号
     */
    @Excel(name = "设备编号",sort = 2)
    private String serialNumber;
    private Boolean importantTag;
    private Boolean importantCommandImageTag;
    /**
     * 标签
     * @param entity
     * @param vo
     * @return
     */
    @Excel(name = "标签",sort = 4)
    private String tag;
    /**
     * 是否重点点位
     */
    private Boolean important;
    private Boolean importantTag;
    private Boolean importantCommandImageTag;
    private Boolean deptTag;
    private Boolean provinceTagVideo;
    private Boolean provinceTagCar;
    private Boolean provinceTagFace;
    /** 故障类型 */
    private List<String> errorTypeList;
    /** 故障类型 */
    @Excel(name = "故障类型")
    @Excel(name = "故障类型",sort = 8)
    private String errorType;
    /** 工单检测图片 */
@@ -112,6 +121,7 @@
     */
    private Boolean deduct;
    public static WorkOrderVO getVoByEntity(@NonNull WorkOrder entity, WorkOrderVO vo) {
        if(vo == null) {
            vo = new WorkOrderVO();
ycl-server/src/main/java/com/ycl/feign/HKClient.java
@@ -3,6 +3,7 @@
import com.alibaba.fastjson2.JSONObject;
import com.ycl.platform.domain.param.HK.*;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.cloud.openfeign.SpringQueryMap;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
@@ -16,236 +17,252 @@
@Component
@FeignClient(name = "HKClient", url = "${request.haiKangDomain}", configuration = HKFeignConfig.class)
public interface HKClient {
    /**
     * 获取海康考核业务树
     * 获取海康考核业务树
     * @return 业务树
     */
    @GetMapping("/aaoo/api/third/timeTree")
    JSONObject getTree(@SpringQueryMap TreeParam param);
    /**
     * 按区域统计经纬度异常设备或卡口
     * 1、根据组织区域每10分钟汇总采集设备/卡口经纬度异常数量。
     * 2、异常包括:
     * (1)精度过低:经纬度小数点后不足6位。
     * (2)经纬度缺失:经度或纬度存在缺失
     * (3)不在辖区:经纬度超出所属行政区划范围
     * 3、当日数据更新频率为每10分钟一次。历史数据保留一个月,每日凌晨生成昨日一整天区域汇总结果。
     * @param param 请求参数
     * @return 按区域统计经纬度异常设备或卡口
     * 获取海康考核成绩
     * 获取海康考核成绩
     * @return 考核成绩
     */
    @PostMapping("/dqd/service/rs/v1/device/coordinateExpInfo/query")
    JSONObject coordinateByArea(@RequestBody CoordinateByAreaParam param);
    @GetMapping("/aaoo/api/third/score/get")
    JSONObject getScore(@SpringQueryMap ScoreParam param);
//    /**
//     * 按区域统计经纬度异常设备或卡口
//     * 1、根据组织区域每10分钟汇总采集设备/卡口经纬度异常数量。
//     * 2、异常包括:
//     * (1)精度过低:经纬度小数点后不足6位。
//     * (2)经纬度缺失:经度或纬度存在缺失
//     * (3)不在辖区:经纬度超出所属行政区划范围
//     * 3、当日数据更新频率为每10分钟一次。历史数据保留一个月,每日凌晨生成昨日一整天区域汇总结果。
//     * @param param 请求参数
//     * @return 按区域统计经纬度异常设备或卡口
//     */
//    @PostMapping("/dqd/service/rs/v1/device/coordinateExpInfo/query")
//    JSONObject coordinateByArea(@RequestBody CoordinateByAreaParam param);
//
//    /**
//     * 按区域统计编码异常设备或卡口
//     * 1、根据组织区域每10分钟统计采集设备和卡口国标编码异常量。
//     * 2、异常包括:
//     * (1)前6位不符合标准:国标编码前六位与组织编号前六位比较
//     * (2)11-13位符合标准:根据现场实际情况在idad数据配置界面配置所得,可通过指标配置信息接口获取配置参数
//     * (3)编码长度不是20位
//     * 3、当日数据更新频率为每10分钟一次。历史数据保留一个月,每日凌晨生成昨日一整天区域汇总结果。
//     * @param param 请求参数
//     * @return 按区域统计编码异常设备或卡口
//     */
//    @PostMapping("/dqd/service/rs/v1/device/gbCodeExpInfo/query")
//    JSONObject codeByArea(@RequestBody CodeByAreaParam param);
//
//    /**
//     * 按区域统计人脸数据监测指标项
//     * 1、根据区域每10分钟汇总区域内以下监测结果:
//     * (1)设备活跃性:无抓拍、抓拍过少、抓拍突降。
//     * (2)时钟准确性:时钟准确率、不准确量、设备合格率等。
//     * (3)上传及时性:上传及时率、延迟各区间数据量、设备合格率。
//     * (4)大图可用性:大图可用量、访问异常量、标注异常量、大小图不一致量。
//     * (5)图片合格性:人脸唯一量、不唯一量等。
//     * (6)图片有效性:建模失败量、低评分量等。
//     * (7)图片关联性:未上报设备数、未上报抓拍量。
//     * (8)数据唯一性:不唯一数据、不唯一数据量。
//     * 2、可查询近30天内的数据异常情况。
//     * 3、今日数据更新频率为每10分钟一次。历史数据保留一个月,每日凌晨生成昨日一整天区域汇总结果。
//     *
//     * 注:今日数据变化较大,因而今日抓拍异常统计情况仅供参考。数据突降结论无法给出。故,数据突降异常是只针对截止历史的数据异常监测。
//     * @param param 请求参数
//     * @return 按区域统计人脸数据监测指标项
//     */
//    @PostMapping("/dqd/service/rs/v2/data/faceDetect/query")
//    JSONObject faceDetectByArea(@RequestBody FaceDetectParam param);
//
//    /**
//     * 按区域统计车辆数据监测指标项
//     * 1、根据区域每10分钟汇总区域内以下监测结果:
//     * (1)设备活跃性:无抓拍、抓拍过少、抓拍突降的卡口/设备情况。
//     * (2)时钟准确性:车辆数据时钟准确率、卡口/设备合格率等。
//     * (3)上传及时性:车辆数据上传及时率、卡口/设备合格率等。
//     * (4)大图可用性:车辆背景大图可用率、不可用量等。
//     * (5)车牌合规性:车牌未识别量、车牌识别率低和昼夜识别突变卡口/采集设备数量灯。
//     * (6)数据准确性:车辆数据主要属性一致量、重要属性一致量。
//     * (7)数据完整性:下级上传的车辆数据,六项属性不完整量、两项属性不完整量。
//     * (8)数据关联性:未上报设备数、未上报抓拍量。
//     * (9)数据唯一性:车辆数据不唯一数据、不唯一数据量。
//     * 2、可查询近30天内的数据异常情况。
//     * 3、今日数据更新频率为每10分钟一次。历史数据保留一个月,每日凌晨生成昨日一整天区域汇总结果。
//     *
//     * 注:今日数据变化较大,因而今日抓拍异常统计情况仅供参考。数据突降结论无法给出。故,数据突降异常是只针对截止历史的数据异常监测。
//     * @param param 请求参数
//     * @return 按区域统计车辆数据监测指标项
//     */
//    @PostMapping("/dqd/service/rs/v2/data/passDetect/query")
//    JSONObject carDetectByArea(@RequestBody CarDetectParam param);
//
//    /**
//     * 采集设备属性监测结果
//     * 1、每10分钟同步质量计算服务的资源数据,进行采集设备属性异常监测。
//     * 2、主要包含:采集设备基本信息以及经纬度、国标编码和时间差监测结果。可根据组织、经纬度和国标编码监测结果进行过滤。
//     * @param param 请求参数
//     * @return 采集设备属性监测结果
//     */
//    @PostMapping("/dqd/service/rs/v1/device/cameraExpDetailInfo/query")
//    JSONObject monitorDetail(@RequestBody MonitoringDetailParam param);
//
//    /**
//     * 卡口属性监测结果
//     * 1、每10分钟同步质量计算服务的资源数据,进行卡口属性异常监测。
//     * 2、主要包含:卡口基本信息以及经纬度、国标编码监测结果。可根据组织、经纬度和国标编码监测结果进行过滤。
//     * @param param 请求参数
//     * @return 卡口属性监测结果
//     */
//    @PostMapping("/dqd/service/rs/v1/device/crossExpDetailInfo/query")
//    JSONObject crossDetail(@RequestBody CrossDetailParam param);
//
//    /**
//     * 抓拍数据量监测结果
//     * 1、每10分钟统计今日各点位人脸数量,对数据量进行监测。
//     * 2、每10分钟统计今日各卡口过车数量,对过车量进行监测.
//     * 3、人脸数据量监测结果主要包括:正常、无抓拍、抓拍过少、抓拍突降
//     * (1)无抓拍:点位人脸数据量为0
//     * (2)抓拍过少:点位人脸数据量少于某一数据量(配置)。可通过接口2.3.2 指标配置信息查询(返回参数:lowFaceCriteria)获取配置
//     * (3)抓拍突降:(平均抓拍量-当天抓拍数据量)/平均抓拍量>=某一比例(配置)。可通过接口3.2 指标配置信息查询(返回参数:faceDropCriteriaPercent)获取配置
//     * 4.卡口/设备过车量监测结果主要包括:正常、无抓拍、抓拍过少、抓拍突降
//     * (1)无抓拍:卡口过车数据量为0
//     * (2)抓拍过少:卡口过车数据量少于某一数据量(配置)。可通过接口2.3.2 指标配置信息查询(返回参数:lowVelCriteria)获取配置
//     * (3)抓拍突降:(平均抓拍量-当天抓拍数据量)/平均抓拍量>=某一比例(配置)。可通过接口3.2 指标配置信息查询(返回参数:velDropCriteriaPercent)获取配置
//     * 5、数据每小时更新,只支持昨日和今日的查询。
//     *
//     * 注:今日数据每10分钟变化较大,因而今日抓拍异常统计情况仅供参考。数据突降与持续无数据天数定论无法给出。故,数据突降异常和持续无数据天数是只针对历史的数据异常监测。
//     * @param param 请求参数
//     * @return 抓拍数据量监测结果
//     */
//    @PostMapping("/dqd/service/rs/v1/data/snapCountDetail/query")
//    JSONObject snapshotDataMonitor(@RequestBody SnapshotDataMonitorParam param);
//
//    /**
//     * 抓拍数据时延监测结果
//     * 1、每10分钟统计今日各点位人脸数量和延迟倒挂数据量,对时效性进行监测。
//     * 2、每10分钟统计今日各卡口/设备过车数量和延迟倒挂数据量,对过车时效性进行监测.
//     * 3、判断数据延迟倒挂依据:
//     * (1)延迟:数据接收时间-抓拍时间 >13s(配置)。可通过接口3.2 指标配置信息查询(返回参数:faceDelayCriteria 和velDelayCriteria )获取配置
//     * (2)倒挂:抓拍时间-数据接收时间>5s(配置)。可通过接口3.2 指标配置信息查询(返回参数:faceHangCriteria和velHangCriteria)获取配置
//     * 4、数据每小时更新,只支持昨日和今日的查询。
//     *
//     * 注:今日数据每10分钟变化较大,因而今日抓拍异常统计情况仅供参考。
//     * @param param 请求参数
//     * @return 抓拍数据时延监测结果
//     */
//    @PostMapping("/dqd/service/rs/v1/data/snapAgingDetail/query")
//    JSONObject snapshotDelayMonitor(@RequestBody SnapshotDelayMonitorParam param);
//
//    /**
//     * 图片访问监测结果
//     * 1、每10分钟统计今日各点位人脸数据中图片抽检访问情况。
//     * 2、每10分钟统计今日各卡口/设备过车数据中图片抽检访问情况。
//     * 3、数据每10分钟更新,支持近一个月数据结果的查询。今日数据变化较大,因而今日抓拍异常统计情况仅供参考
//     * @param param 请求参数
//     * @return 图片访问监测结果
//     */
//    @PostMapping("/dqd/service/rs/v1/data/picAccessDetail/query")
//    JSONObject picAccessMonitor(@RequestBody PicAccessParam param);
//
//    /**
//     * 属性识别准确监测结果
//     * 1、每10分钟统计今日各卡口/设备过车数据属性识别准确性结果。
//     * 2、只支持近一个月的历史监测结果查询。
//     * @param param 请求参数
//     * @return 属性识别准确监测结果
//     */
//    @PostMapping("/dqd/service/rs/v1/data/attributeRecognition/query")
//    JSONObject attrRecognitionMonitor(@RequestBody AttrRecognitionParam param);
//
//    /**
//     * 数据完整性监测结果
//     * 1、 每10分钟统计今日各卡口/设备过车数据中:
//     * (1)数据不完整数量及对应各属性字段不完整的数量。
//     * (2)对于主要属性会另外单独统计不完整量。
//     * 2、 抓拍数据完整:车辆卡口设备抓拍车辆数据包含符合GA/T 1400.3标准的车牌号码、车牌颜色、车辆类型、车辆品牌、车身颜色、车辆型号属性字段。其中,主要属性包括:车牌号码、车牌颜
//     * 3、今日数据每10分钟更新,支持近一个月的属性识别监测结果查询。
//     * 注:今日数据实时在变,10分钟更新一次的结果仅供参考。
//     * @param param 请求参数
//     * @return 数据完整性监测结果
//     */
//    @PostMapping("/dqd/service/rs/v1/data/attributeIntegrity/query")
//    JSONObject dataIntegrityMonitoring(@RequestBody DataIntegrityMonitoringParam param);
//
//    /**
//     * 人脸设备全检指标监测结果
//     * 1、汇总人脸设备活跃性、数据及时性、时钟准确性、图片有效性、人脸唯一性全检指标监测结果
//     * 2、只支持近一个月的监测结果查询。
//     * 注:今日数据每10分钟变化较大,因而今日抓拍异常统计情况仅供参考。
//     * @param param 请求参数
//     * @return 人脸设备全检指标监测结果
//     */
//    @PostMapping("/dqd/service/rs/v2/data/faceFullAmount/query")
//    JSONObject faceDeviceInspection(@RequestBody FaceDeviceInspectionParam param);
//
//    /**
//     * 人脸设备抽检指标监测结果
//     * 1、汇总人脸设备大图可用性、图片合格性抽检指标监测结果
//     * 2、只支持近一个月的监测结果查询。
//     * 注:今日数据每10分钟变化较大,因而今日抓拍异常统计情况仅供参考。
//     * @param param 请求参数
//     * @return 人脸设备抽检指标监测结果
//     */
//    @PostMapping("/dqd/service/rs/v2/data/faceSampleAmount/query")
//    JSONObject faceDeviceSampling(@RequestBody FaceDeviceSamplingParam param);
//
//    /**
//     * 车辆设备全检指标监测结果
//     * 1、汇总车辆设备活跃性、数据及时性、时钟准确性、数据完整性、数据唯一性全检指标监测结果
//     * 2、只支持近一个月的监测结果查询。
//     * 注:今日数据每10分钟变化较大,因而今日抓拍异常统计情况仅供参考。
//     * @param param 请求参数
//     * @return 车辆设备全检指标监测结果
//     */
//    @PostMapping("/dqd/service/rs/v2/data/vehFullAmount/query")
//    JSONObject vehicleDeviceInspection(@RequestBody VehicleDeviceInspectionParam param);
//
//    /**
//     * 车辆设备抽检指标监测结果
//     * 1、汇总车辆设备大图可用性、数据准确性抽检指标监测结果
//     * 2、只支持近一个月的监测结果查询。
//     * 注:今日数据每10分钟变化较大,因而今日抓拍异常统计情况仅供参考。
//     * @param param 请求参数
//     * @return 车辆设备抽检指标监测结果
//     */
//    @PostMapping("/dqd/service/rs/v2/data/vehSampleAmount/query")
//    JSONObject vehicleDeviceSampling(@RequestBody VehicleDeviceSamplingParam param);
//
//    /**
//     * 关注监测资源查询
//     * 1、根据需求可在idad配置各区域关注点位或卡口信息。Idad对这批点位或卡口进行异常监测。此接口可查询关注的资源信息。
//     * @param param 请求参数
//     * @return 关注监测资源查询
//     */
//    @PostMapping("/dqd/service/rs/v1/alarm/monitorResource/query")
//    JSONObject monitorResource(@RequestBody MonitorResourceParam param);
//
//    /**
//     * 指标配置信息查询
//     * 查询各类数据异常标准。例如:抓拍数据量低于多少认为数据量过少
//     * @return 指标配置信息查询
//     */
//    @GetMapping("/dqd/service/rs/v1/statistics/criteria/query")
//    JSONObject criteria();
//
//    /**
//     * 组织树查询
//     * 支持国标组织树和业务组织树信息查询。
//     * @return 组织树查询
//     */
//    @PostMapping("/dqd/service/rs/v1/orgInfo/standard/query")
//    JSONObject organizationTree(@RequestBody OrganizationTreeParam param);
    /**
     * 按区域统计编码异常设备或卡口
     * 1、根据组织区域每10分钟统计采集设备和卡口国标编码异常量。
     * 2、异常包括:
     * (1)前6位不符合标准:国标编码前六位与组织编号前六位比较
     * (2)11-13位符合标准:根据现场实际情况在idad数据配置界面配置所得,可通过指标配置信息接口获取配置参数
     * (3)编码长度不是20位
     * 3、当日数据更新频率为每10分钟一次。历史数据保留一个月,每日凌晨生成昨日一整天区域汇总结果。
     * @param param 请求参数
     * @return 按区域统计编码异常设备或卡口
     */
    @PostMapping("/dqd/service/rs/v1/device/gbCodeExpInfo/query")
    JSONObject codeByArea(@RequestBody CodeByAreaParam param);
    /**
     * 按区域统计人脸数据监测指标项
     * 1、根据区域每10分钟汇总区域内以下监测结果:
     * (1)设备活跃性:无抓拍、抓拍过少、抓拍突降。
     * (2)时钟准确性:时钟准确率、不准确量、设备合格率等。
     * (3)上传及时性:上传及时率、延迟各区间数据量、设备合格率。
     * (4)大图可用性:大图可用量、访问异常量、标注异常量、大小图不一致量。
     * (5)图片合格性:人脸唯一量、不唯一量等。
     * (6)图片有效性:建模失败量、低评分量等。
     * (7)图片关联性:未上报设备数、未上报抓拍量。
     * (8)数据唯一性:不唯一数据、不唯一数据量。
     * 2、可查询近30天内的数据异常情况。
     * 3、今日数据更新频率为每10分钟一次。历史数据保留一个月,每日凌晨生成昨日一整天区域汇总结果。
     *
     * 注:今日数据变化较大,因而今日抓拍异常统计情况仅供参考。数据突降结论无法给出。故,数据突降异常是只针对截止历史的数据异常监测。
     * @param param 请求参数
     * @return 按区域统计人脸数据监测指标项
     */
    @PostMapping("/dqd/service/rs/v2/data/faceDetect/query")
    JSONObject faceDetectByArea(@RequestBody FaceDetectParam param);
    /**
     * 按区域统计车辆数据监测指标项
     * 1、根据区域每10分钟汇总区域内以下监测结果:
     * (1)设备活跃性:无抓拍、抓拍过少、抓拍突降的卡口/设备情况。
     * (2)时钟准确性:车辆数据时钟准确率、卡口/设备合格率等。
     * (3)上传及时性:车辆数据上传及时率、卡口/设备合格率等。
     * (4)大图可用性:车辆背景大图可用率、不可用量等。
     * (5)车牌合规性:车牌未识别量、车牌识别率低和昼夜识别突变卡口/采集设备数量灯。
     * (6)数据准确性:车辆数据主要属性一致量、重要属性一致量。
     * (7)数据完整性:下级上传的车辆数据,六项属性不完整量、两项属性不完整量。
     * (8)数据关联性:未上报设备数、未上报抓拍量。
     * (9)数据唯一性:车辆数据不唯一数据、不唯一数据量。
     * 2、可查询近30天内的数据异常情况。
     * 3、今日数据更新频率为每10分钟一次。历史数据保留一个月,每日凌晨生成昨日一整天区域汇总结果。
     *
     * 注:今日数据变化较大,因而今日抓拍异常统计情况仅供参考。数据突降结论无法给出。故,数据突降异常是只针对截止历史的数据异常监测。
     * @param param 请求参数
     * @return 按区域统计车辆数据监测指标项
     */
    @PostMapping("/dqd/service/rs/v2/data/passDetect/query")
    JSONObject carDetectByArea(@RequestBody CarDetectParam param);
    /**
     * 采集设备属性监测结果
     * 1、每10分钟同步质量计算服务的资源数据,进行采集设备属性异常监测。
     * 2、主要包含:采集设备基本信息以及经纬度、国标编码和时间差监测结果。可根据组织、经纬度和国标编码监测结果进行过滤。
     * @param param 请求参数
     * @return 采集设备属性监测结果
     */
    @PostMapping("/dqd/service/rs/v1/device/cameraExpDetailInfo/query")
    JSONObject monitorDetail(@RequestBody MonitoringDetailParam param);
    /**
     * 卡口属性监测结果
     * 1、每10分钟同步质量计算服务的资源数据,进行卡口属性异常监测。
     * 2、主要包含:卡口基本信息以及经纬度、国标编码监测结果。可根据组织、经纬度和国标编码监测结果进行过滤。
     * @param param 请求参数
     * @return 卡口属性监测结果
     */
    @PostMapping("/dqd/service/rs/v1/device/crossExpDetailInfo/query")
    JSONObject crossDetail(@RequestBody CrossDetailParam param);
    /**
     * 抓拍数据量监测结果
     * 1、每10分钟统计今日各点位人脸数量,对数据量进行监测。
     * 2、每10分钟统计今日各卡口过车数量,对过车量进行监测.
     * 3、人脸数据量监测结果主要包括:正常、无抓拍、抓拍过少、抓拍突降
     * (1)无抓拍:点位人脸数据量为0
     * (2)抓拍过少:点位人脸数据量少于某一数据量(配置)。可通过接口2.3.2 指标配置信息查询(返回参数:lowFaceCriteria)获取配置
     * (3)抓拍突降:(平均抓拍量-当天抓拍数据量)/平均抓拍量>=某一比例(配置)。可通过接口3.2 指标配置信息查询(返回参数:faceDropCriteriaPercent)获取配置
     * 4.卡口/设备过车量监测结果主要包括:正常、无抓拍、抓拍过少、抓拍突降
     * (1)无抓拍:卡口过车数据量为0
     * (2)抓拍过少:卡口过车数据量少于某一数据量(配置)。可通过接口2.3.2 指标配置信息查询(返回参数:lowVelCriteria)获取配置
     * (3)抓拍突降:(平均抓拍量-当天抓拍数据量)/平均抓拍量>=某一比例(配置)。可通过接口3.2 指标配置信息查询(返回参数:velDropCriteriaPercent)获取配置
     * 5、数据每小时更新,只支持昨日和今日的查询。
     *
     * 注:今日数据每10分钟变化较大,因而今日抓拍异常统计情况仅供参考。数据突降与持续无数据天数定论无法给出。故,数据突降异常和持续无数据天数是只针对历史的数据异常监测。
     * @param param 请求参数
     * @return 抓拍数据量监测结果
     */
    @PostMapping("/dqd/service/rs/v1/data/snapCountDetail/query")
    JSONObject snapshotDataMonitor(@RequestBody SnapshotDataMonitorParam param);
    /**
     * 抓拍数据时延监测结果
     * 1、每10分钟统计今日各点位人脸数量和延迟倒挂数据量,对时效性进行监测。
     * 2、每10分钟统计今日各卡口/设备过车数量和延迟倒挂数据量,对过车时效性进行监测.
     * 3、判断数据延迟倒挂依据:
     * (1)延迟:数据接收时间-抓拍时间 >13s(配置)。可通过接口3.2 指标配置信息查询(返回参数:faceDelayCriteria 和velDelayCriteria )获取配置
     * (2)倒挂:抓拍时间-数据接收时间>5s(配置)。可通过接口3.2 指标配置信息查询(返回参数:faceHangCriteria和velHangCriteria)获取配置
     * 4、数据每小时更新,只支持昨日和今日的查询。
     *
     * 注:今日数据每10分钟变化较大,因而今日抓拍异常统计情况仅供参考。
     * @param param 请求参数
     * @return 抓拍数据时延监测结果
     */
    @PostMapping("/dqd/service/rs/v1/data/snapAgingDetail/query")
    JSONObject snapshotDelayMonitor(@RequestBody SnapshotDelayMonitorParam param);
    /**
     * 图片访问监测结果
     * 1、每10分钟统计今日各点位人脸数据中图片抽检访问情况。
     * 2、每10分钟统计今日各卡口/设备过车数据中图片抽检访问情况。
     * 3、数据每10分钟更新,支持近一个月数据结果的查询。今日数据变化较大,因而今日抓拍异常统计情况仅供参考
     * @param param 请求参数
     * @return 图片访问监测结果
     */
    @PostMapping("/dqd/service/rs/v1/data/picAccessDetail/query")
    JSONObject picAccessMonitor(@RequestBody PicAccessParam param);
    /**
     * 属性识别准确监测结果
     * 1、每10分钟统计今日各卡口/设备过车数据属性识别准确性结果。
     * 2、只支持近一个月的历史监测结果查询。
     * @param param 请求参数
     * @return 属性识别准确监测结果
     */
    @PostMapping("/dqd/service/rs/v1/data/attributeRecognition/query")
    JSONObject attrRecognitionMonitor(@RequestBody AttrRecognitionParam param);
    /**
     * 数据完整性监测结果
     * 1、 每10分钟统计今日各卡口/设备过车数据中:
     * (1)数据不完整数量及对应各属性字段不完整的数量。
     * (2)对于主要属性会另外单独统计不完整量。
     * 2、 抓拍数据完整:车辆卡口设备抓拍车辆数据包含符合GA/T 1400.3标准的车牌号码、车牌颜色、车辆类型、车辆品牌、车身颜色、车辆型号属性字段。其中,主要属性包括:车牌号码、车牌颜
     * 3、今日数据每10分钟更新,支持近一个月的属性识别监测结果查询。
     * 注:今日数据实时在变,10分钟更新一次的结果仅供参考。
     * @param param 请求参数
     * @return 数据完整性监测结果
     */
    @PostMapping("/dqd/service/rs/v1/data/attributeIntegrity/query")
    JSONObject dataIntegrityMonitoring(@RequestBody DataIntegrityMonitoringParam param);
    /**
     * 人脸设备全检指标监测结果
     * 1、汇总人脸设备活跃性、数据及时性、时钟准确性、图片有效性、人脸唯一性全检指标监测结果
     * 2、只支持近一个月的监测结果查询。
     * 注:今日数据每10分钟变化较大,因而今日抓拍异常统计情况仅供参考。
     * @param param 请求参数
     * @return 人脸设备全检指标监测结果
     */
    @PostMapping("/dqd/service/rs/v2/data/faceFullAmount/query")
    JSONObject faceDeviceInspection(@RequestBody FaceDeviceInspectionParam param);
    /**
     * 人脸设备抽检指标监测结果
     * 1、汇总人脸设备大图可用性、图片合格性抽检指标监测结果
     * 2、只支持近一个月的监测结果查询。
     * 注:今日数据每10分钟变化较大,因而今日抓拍异常统计情况仅供参考。
     * @param param 请求参数
     * @return 人脸设备抽检指标监测结果
     */
    @PostMapping("/dqd/service/rs/v2/data/faceSampleAmount/query")
    JSONObject faceDeviceSampling(@RequestBody FaceDeviceSamplingParam param);
    /**
     * 车辆设备全检指标监测结果
     * 1、汇总车辆设备活跃性、数据及时性、时钟准确性、数据完整性、数据唯一性全检指标监测结果
     * 2、只支持近一个月的监测结果查询。
     * 注:今日数据每10分钟变化较大,因而今日抓拍异常统计情况仅供参考。
     * @param param 请求参数
     * @return 车辆设备全检指标监测结果
     */
    @PostMapping("/dqd/service/rs/v2/data/vehFullAmount/query")
    JSONObject vehicleDeviceInspection(@RequestBody VehicleDeviceInspectionParam param);
    /**
     * 车辆设备抽检指标监测结果
     * 1、汇总车辆设备大图可用性、数据准确性抽检指标监测结果
     * 2、只支持近一个月的监测结果查询。
     * 注:今日数据每10分钟变化较大,因而今日抓拍异常统计情况仅供参考。
     * @param param 请求参数
     * @return 车辆设备抽检指标监测结果
     */
    @PostMapping("/dqd/service/rs/v2/data/vehSampleAmount/query")
    JSONObject vehicleDeviceSampling(@RequestBody VehicleDeviceSamplingParam param);
    /**
     * 关注监测资源查询
     * 1、根据需求可在idad配置各区域关注点位或卡口信息。Idad对这批点位或卡口进行异常监测。此接口可查询关注的资源信息。
     * @param param 请求参数
     * @return 关注监测资源查询
     */
    @PostMapping("/dqd/service/rs/v1/alarm/monitorResource/query")
    JSONObject monitorResource(@RequestBody MonitorResourceParam param);
    /**
     * 指标配置信息查询
     * 查询各类数据异常标准。例如:抓拍数据量低于多少认为数据量过少
     * @return 指标配置信息查询
     */
    @GetMapping("/dqd/service/rs/v1/statistics/criteria/query")
    JSONObject criteria();
    /**
     * 组织树查询
     * 支持国标组织树和业务组织树信息查询。
     * @return 组织树查询
     */
    @PostMapping("/dqd/service/rs/v1/orgInfo/standard/query")
    JSONObject organizationTree(@RequestBody OrganizationTreeParam param);
}
ycl-server/src/main/java/com/ycl/feign/HKFeignConfig.java
@@ -1,24 +1,48 @@
package com.ycl.feign;
import com.ycl.interceptor.HKFeignInterceptor;
import feign.Client;
import feign.Logger;
import feign.RequestInterceptor;
import feign.codec.ErrorDecoder;
import org.springframework.cloud.configuration.SSLContextFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
/**
 *海康接口配置
 */
@Configuration
public class HKFeignConfig {
    /**
     * 注入拦截器
     */
    //跳过ssl验证
    @Bean
    public RequestInterceptor requestInterceptor(){
        return new HKFeignInterceptor();
    public Client generateClient() {
        try {
            SSLContext ctx = SSLContext.getInstance("SSL");
            X509TrustManager tm = new X509TrustManager() {
                @Override
                public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
                }
                @Override
                public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
                }
                @Override
                public X509Certificate[] getAcceptedIssuers() {
                    return null;
                }
            };
            ctx.init(null, new TrustManager[]{tm}, null);
            return new Client.Default(ctx.getSocketFactory(), (hostname, session) -> true);
        } catch (Exception e) {
            return null;
        }
    }
    /**
     * 调用异常处理
     * @return
@@ -27,4 +51,9 @@
    public ErrorDecoder errorDecoder() {
        return new FeignErrorDecoder();
    }
    @Bean
    Logger.Level feignLoggerLevel(){
        return Logger.Level.FULL;
    }
}
ycl-server/src/main/java/com/ycl/feign/HkApiUtil.java
@@ -85,59 +85,6 @@
    }
    /**
     * 调用海康接口 基础数据平台 Get请求
     *
     * @param apiUrl 接口地址:
     * @param params 请求参数
     * @param resultType 响应结果接收类
     * @return 调用结果
     */
    public static <T> List<T> sendGetAPI(String host,String appKey,String appSecret,String apiUrl, BaseParam params, Class<T> resultType) {
        // STEP1:设置平台参数,根据实际情况,设置host appkey appsecret 三个参数.
        ArtemisConfig.host = host; // 平台的ip端口
        ArtemisConfig.appKey = appKey;  // 密钥appkey
        ArtemisConfig.appSecret = appSecret;// 密钥appSecret
        // STEP2:设置OpenAPI接口的上下文
        final String ARTEMIS_PATH = "/artemis/aaoo";
        // STEP3:设置接口的URI地址
        final String previewURLsApi = ARTEMIS_PATH + apiUrl;
        Map<String, String> path = new HashMap<String, String>(2) {
            {
                put("https://", previewURLsApi);
            }
        };
        // STEP4:设置参数提交方式
        // STEP5:组装请求参数
        Map<String, String> queryMap = object2Map(params);
        log.info("请求参数"+queryMap);
        // STEP6:调用接口
        String result = null;
        List<T> dataList = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            result = ArtemisHttpUtil.doGetArtemis(path, queryMap, null,  null , null);
            JSONObject jsonObject = JSONObject.parseObject(result);
            log.info("请求结果"+jsonObject);
            if(jsonObject.getString("code") == null || !ApiConstants.HKSuccessCode.equals(jsonObject.getString("code"))){
                log.error("请求失败{}",result);
                dataList = null;
                break;
            }
            List<T> resultList = HkApiUtil.getDataList(JSONObject.parseObject(result), resultType);
            if(CollectionUtils.isEmpty(resultList) || resultList.size()<ApiConstants.HKPageSize) {
                dataList.addAll(resultList);
                break;
            }else {
                dataList.addAll(resultList);
                params.setPageNo(params.getPageNo()+1);
            }
        }
        return dataList;
    }
    //解析数据
    private static <T> List<T> getDataList(JSONObject jsonObject, Class<T> resultClass) {
ycl-server/src/main/java/com/ycl/platform/service/impl/CheckScoreServiceImpl.java
@@ -539,8 +539,9 @@
    @Override
    public Map<String, Map<String, Object>> dashboard(DashboardQuery dashboardQuery) {
        Date now = new Date();
        dashboardQuery.setStartTime(DateUtils.getMouthStart(now));
        dashboardQuery.setEndTime(DateUtils.getMouthEnd(now));
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        dashboardQuery.setStartTime(format.format(DateUtils.getDayStart(now)));
        dashboardQuery.setEndTime(format.format(DateUtils.getDayEnd(now)));
        List<CheckScore> dashboard = scoreMapper.dashboard(dashboardQuery);
        //初始化各个区县数据
        Map<String, Map<String, Object>> resultMap = new HashMap<>();
ycl-server/src/main/java/com/ycl/platform/service/impl/WorkOrderServiceImpl.java
@@ -1120,8 +1120,16 @@
        }
        if (query.getStart() != null) query.setStart(query.getStart() + " 00:00:00");
        if (query.getEnd() != null) query.setEnd(query.getEnd() + " 23:59:59");
        return baseMapper.export(query);
        List<WorkOrderVO> export = baseMapper.export(query);
        export.forEach(result->{
           StringBuilder tag = new StringBuilder("" + (result.getProvinceTagVideo() ? "省厅视频、" : "")+(result.getProvinceTagCar() ? "省厅车辆、" : "")+(result.getProvinceTagFace() ? "省厅人脸、" : "") + (result.getImportantTag() ? "重点点位、" : "") + (result.getImportantCommandImageTag() ? "重点指挥图像、" : "") + (result.getDeptTag() ? "部级、" : ""));
            // 删除字符串末尾的“、”
            if (tag.toString().endsWith("、")) {
                tag = new StringBuilder(tag.substring(0, tag.length() - 1));
            }
            result.setTag(tag.toString());
        });
        return export;
    }
    /**
ycl-server/src/main/java/com/ycl/task/CheckScoreTask.java
@@ -151,10 +151,12 @@
        String adjustWay = checkTemplate.getAdjustWay();
        BigDecimal adjustCoefficient = checkTemplate.getAdjustCoefficient();
        if (CheckConstants.Multiply.equals(adjustWay)) {
            scoreFinal = adjustCoefficient.multiply(scoreFinal).multiply(new BigDecimal(100));
//            scoreFinal = adjustCoefficient.multiply(scoreFinal).multiply(new BigDecimal(100));
            scoreFinal = adjustCoefficient.multiply(scoreFinal);
        } else if (CheckConstants.Divided.equals(adjustWay)) {
            //四舍五入保留小数后四位
            scoreFinal = scoreFinal.divide(adjustCoefficient, 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100));
//            scoreFinal = scoreFinal.divide(adjustCoefficient, 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100));
            scoreFinal = scoreFinal.divide(adjustCoefficient, 4, RoundingMode.HALF_UP);
        }
        checkScore.setCreateTime(new Date());
        checkScore.setExamineTag(Integer.parseInt(examineTag + ""));
ycl-server/src/main/java/com/ycl/task/HKTask.java
@@ -3,18 +3,27 @@
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.mongodb.client.result.DeleteResult;
import com.ycl.feign.HKClient;
import com.ycl.feign.HkApiUtil;
import com.ycl.feign.UYClient;
import com.ycl.platform.domain.entity.CheckIndexCar;
import com.ycl.platform.domain.entity.CheckIndexFace;
import com.ycl.platform.domain.entity.TMonitor;
import com.ycl.platform.domain.param.HK.*;
import com.ycl.platform.domain.result.HK.*;
import com.ycl.platform.domain.result.UY.MonitorQualifyResult;
import com.ycl.platform.domain.result.UY.VideoOnlineResult;
import com.ycl.platform.domain.vo.UpdateOnlineVO;
import com.ycl.platform.mapper.CheckIndexCarMapper;
import com.ycl.platform.mapper.CheckIndexFaceMapper;
import com.ycl.platform.mapper.TMonitorMapper;
import com.ycl.platform.mapper.WorkOrderMapper;
import com.ycl.platform.service.*;
import com.ycl.utils.DateUtils;
import constant.ApiConstants;
import constant.CheckConstants;
import enumeration.general.AreaDeptEnum;
import enumeration.general.PublishType;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
@@ -24,6 +33,8 @@
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
@@ -39,6 +50,14 @@
    public String appKey;
    @Value("${HK.appSecret}")
    public String appSecret;
    @Value("${HK.carCode}")
    public String carCode;
    @Value("${HK.faceCode}")
    public String faceCode;
    @Value("${HK.carProvinceCode}")
    public String carProvinceCode;
    @Value("${HK.faceProvinceCode}")
    public String faceProvinceCode;
    @Autowired
    private MongoTemplate mongoTemplate;
    @Autowired
@@ -49,6 +68,17 @@
    private TMonitorMapper monitorMapper;
    @Autowired
    private UYErrorTypeCheckService uyErrorTypeCheckService;
    @Autowired
    private HKClient hkClient;
    @Autowired
    private ICheckIndexCarService carService;
    @Autowired
    private CheckIndexCarMapper carMapper;
    @Autowired
    private ICheckIndexFaceService faceService;
    @Autowired
    private CheckIndexFaceMapper faceMapper;
    //车辆设备全检指标监测结果
    public void vehicleDeviceInspectionTask() {
        log.info("开始执行车辆设备全检指标监测结果数据同步");
@@ -57,7 +87,7 @@
        param.setPageSize(ApiConstants.HKPageSize);
        param.setDate(DateUtils.getDate());
        param.setDataType(ApiConstants.HK_DataType_CAR);
        List<VehicleDeviceInspectionResult> list = HkApiUtil.sendAPI(host,appKey,appSecret,"/api/dqd/service/rs/v2/data/vehFullAmount/query", param, VehicleDeviceInspectionResult.class);
        List<VehicleDeviceInspectionResult> list = HkApiUtil.sendAPI(host, appKey, appSecret, "/api/dqd/service/rs/v2/data/vehFullAmount/query", param, VehicleDeviceInspectionResult.class);
        if (!CollectionUtils.isEmpty(list)) {
            //如果存在之前的数据先删除
            Query query = new Query(Criteria.where("mongoCreateTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date())));
@@ -86,7 +116,7 @@
        param.setPageNo(ApiConstants.PageNo);
        param.setPageSize(ApiConstants.HKPageSize);
        param.setDate(DateUtils.getDate());
        List<FaceDeviceInspectionResult> list = HkApiUtil.sendAPI(host,appKey,appSecret,"/api/dqd/service/rs/v2/data/faceFullAmount/query", param, FaceDeviceInspectionResult.class);
        List<FaceDeviceInspectionResult> list = HkApiUtil.sendAPI(host, appKey, appSecret, "/api/dqd/service/rs/v2/data/faceFullAmount/query", param, FaceDeviceInspectionResult.class);
        if (!CollectionUtils.isEmpty(list)) {
            //如果存在之前的数据先删除
            Query query = new Query(Criteria.where("mongoCreateTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date())));
@@ -96,7 +126,7 @@
                    item.setNo(item.getExternalIndexCode());
                }
            });
            pointService.setDeviceTagByGB(list,CheckConstants.Rule_Category_Face);
            pointService.setDeviceTagByGB(list, CheckConstants.Rule_Category_Face);
            //存放在mongo中
            mongoTemplate.insertAll(list);
            //同步的数据进行工单阈值处理
@@ -117,7 +147,7 @@
        carParam.setPageSize(ApiConstants.HKPageSize);
        carParam.setDate(DateUtils.getDate());
        carParam.setDataType(ApiConstants.HK_DataType_CAR);
        List<SnapshotDataMonitorResult> carList = HkApiUtil.sendAPI(host,appKey,appSecret,"/api/dqd/service/rs/v1/data/snapCountDetail/query", carParam, SnapshotDataMonitorResult.class);
        List<SnapshotDataMonitorResult> carList = HkApiUtil.sendAPI(host, appKey, appSecret, "/api/dqd/service/rs/v1/data/snapCountDetail/query", carParam, SnapshotDataMonitorResult.class);
        if (!CollectionUtils.isEmpty(carList)) {
            //如果今天存在之前的数据先删除
            Query query = new Query(Criteria
@@ -129,7 +159,7 @@
                    item.setNo(item.getExternalIndexCode());
                }
            });
            pointService.setDeviceTagByGB(carList,CheckConstants.Rule_Category_Car);
            pointService.setDeviceTagByGB(carList, CheckConstants.Rule_Category_Car);
            //存放在mongo中
            carList.forEach(item -> item.setDataType(ApiConstants.HK_DataType_CAR));
            mongoTemplate.insertAll(carList);
@@ -141,9 +171,9 @@
        faceParam.setPageSize(ApiConstants.HKPageSize);
        faceParam.setDate(DateUtils.getDate());
        faceParam.setDataType(ApiConstants.HK_DataType_FACE);
        List<SnapshotDataMonitorResult> faceList = HkApiUtil.sendAPI(host,appKey,appSecret,"/api/dqd/service/rs/v1/data/snapCountDetail/query", faceParam, SnapshotDataMonitorResult.class);
        List<SnapshotDataMonitorResult> faceList = HkApiUtil.sendAPI(host, appKey, appSecret, "/api/dqd/service/rs/v1/data/snapCountDetail/query", faceParam, SnapshotDataMonitorResult.class);
        if (!CollectionUtils.isEmpty(faceList)) {
            log.info("结果数据大小:{}",faceList.size());
            log.info("结果数据大小:{}", faceList.size());
            //如果今天存在之前的数据先删除
            Query query = new Query(Criteria
                    .where("mongoCreateTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date()))
@@ -154,29 +184,29 @@
                    item.setNo(item.getExternalIndexCode());
                }
            });
            pointService.setDeviceTagByGB(faceList,CheckConstants.Rule_Category_Face);
            pointService.setDeviceTagByGB(faceList, CheckConstants.Rule_Category_Face);
            //存放在mongo中
            faceList.forEach(item -> item.setDataType(ApiConstants.HK_DataType_FACE));
            mongoTemplate.insertAll(faceList);
        }
        //修改online状态以及生成工单
        List<SnapshotDataMonitorResult> totalResult =new ArrayList<>();
        List<SnapshotDataMonitorResult> totalResult = new ArrayList<>();
        totalResult.addAll(carList);
        totalResult.addAll(faceList);
        if(!CollectionUtils.isEmpty(totalResult)) {
        if (!CollectionUtils.isEmpty(totalResult)) {
            List<String> numbers = totalResult.stream().map(SnapshotDataMonitorResult::getExternalIndexCode).collect(Collectors.toList());
            Map<String, TMonitor> map = monitorMapper.selectList(new QueryWrapper<TMonitor>().in("serial_number", numbers))
                    .stream().collect(Collectors.toMap(TMonitor::getSerialNumber, Function.identity()));
            Date now = new Date();
            //过滤
            totalResult = totalResult.stream().filter(item -> map.get(item.getExternalIndexCode()) != null).collect(Collectors.toList());
            totalResult.forEach(item->{
            totalResult.forEach(item -> {
                TMonitor monitor = map.get(item.getExternalIndexCode());
                item.setIp(monitor.getIp());
            });
            List<UpdateOnlineVO> willUpdateList = totalResult.stream().map(item -> {
                UpdateOnlineVO vo = new UpdateOnlineVO();
                vo.setOnline(item.getDataCount()>0?1:-1);
                vo.setOnline(item.getDataCount() > 0 ? 1 : -1);
                vo.setIp(map.get(item.getExternalIndexCode()).getIp());
                vo.setUpdateTime(now);
                return vo;
@@ -184,7 +214,7 @@
            monitorMapper.updateOnlineFromUyOrHk(willUpdateList);
            //离线生成工单,一个ip只生成一个工单
            List<SnapshotDataMonitorResult> workOrders = new ArrayList<>(totalResult.stream()
                    .filter(item -> ApiConstants.UY_OnlineSite_Offline.equals(item.getDataCount()>0?1:-1))
                    .filter(item -> ApiConstants.UY_OnlineSite_Offline.equals(item.getDataCount() > 0 ? 1 : -1))
                    .collect(Collectors.toMap(
                            SnapshotDataMonitorResult::getIp,
                            Function.identity(),
@@ -203,7 +233,7 @@
        param.setPageNo(ApiConstants.PageNo);
        param.setPageSize(ApiConstants.HKPageSize);
        param.setDate(DateUtils.getDate());
        List<MonitoringDetailResult> faceList = HkApiUtil.sendAPI(host,appKey,appSecret,"/api/dqd/service/rs/v1/device/cameraExpDetailInfo/query", param, MonitoringDetailResult.class);
        List<MonitoringDetailResult> faceList = HkApiUtil.sendAPI(host, appKey, appSecret, "/api/dqd/service/rs/v1/device/cameraExpDetailInfo/query", param, MonitoringDetailResult.class);
        if (!CollectionUtils.isEmpty(faceList)) {
            //如果今天存在之前的数据先删除
            Query query = new Query(Criteria
@@ -214,7 +244,7 @@
                    item.setNo(item.getExternalIndexCode());
                }
            });
            pointService.setDeviceTagByGB(faceList,CheckConstants.Rule_Category_Face);
            pointService.setDeviceTagByGB(faceList, CheckConstants.Rule_Category_Face);
            //存放在mongo中
            mongoTemplate.insertAll(faceList);
        }
@@ -229,7 +259,7 @@
        param.setPageNo(ApiConstants.PageNo);
        param.setPageSize(ApiConstants.HKPageSize);
        param.setDate(DateUtils.getDate());
        List<CrossDetailResult> carList = HkApiUtil.sendAPI(host,appKey,appSecret,"/api/dqd/service/rs/v1/device/crossExpDetailInfo/query", param, CrossDetailResult.class);
        List<CrossDetailResult> carList = HkApiUtil.sendAPI(host, appKey, appSecret, "/api/dqd/service/rs/v1/device/crossExpDetailInfo/query", param, CrossDetailResult.class);
        if (!CollectionUtils.isEmpty(carList)) {
            //如果今天存在之前的数据先删除
            Query query = new Query(Criteria
@@ -240,7 +270,7 @@
                    item.setNo(item.getExternalIndexCode());
                }
            });
            pointService.setDeviceTagByGB(carList,CheckConstants.Rule_Category_Car);
            pointService.setDeviceTagByGB(carList, CheckConstants.Rule_Category_Car);
            //存放在mongo中
            mongoTemplate.insertAll(carList);
        }
@@ -256,7 +286,7 @@
        param.setPageSize(ApiConstants.HKPageSize);
        param.setDate(DateUtils.getDate());
        param.setDataType(ApiConstants.HK_DataType_CAR);
        List<DataIntegrityMonitoringResult> carList = HkApiUtil.sendAPI(host,appKey,appSecret,"/api/dqd/service/rs/v1/data/attributeIntegrity/query", param, DataIntegrityMonitoringResult.class);
        List<DataIntegrityMonitoringResult> carList = HkApiUtil.sendAPI(host, appKey, appSecret, "/api/dqd/service/rs/v1/data/attributeIntegrity/query", param, DataIntegrityMonitoringResult.class);
        if (!CollectionUtils.isEmpty(carList)) {
            //如果今天存在之前的数据先删除
@@ -268,7 +298,7 @@
                    item.setNo(item.getExternalIndexCode());
                }
            });
            pointService.setDeviceTagByGB(carList,CheckConstants.Rule_Category_Car);
            pointService.setDeviceTagByGB(carList, CheckConstants.Rule_Category_Car);
            //存放在mongo中
            mongoTemplate.insertAll(carList);
        }
@@ -284,7 +314,7 @@
        param.setPageSize(ApiConstants.HKPageSize);
        param.setDate(DateUtils.getDate());
        param.setDataType(ApiConstants.HK_DataType_CAR);
        List<AttrRecognitionMonitorResult> carList = HkApiUtil.sendAPI(host,appKey,appSecret,"/api/dqd/service/rs/v1/data/attributeRecognition/query", param, AttrRecognitionMonitorResult.class);
        List<AttrRecognitionMonitorResult> carList = HkApiUtil.sendAPI(host, appKey, appSecret, "/api/dqd/service/rs/v1/data/attributeRecognition/query", param, AttrRecognitionMonitorResult.class);
        if (!CollectionUtils.isEmpty(carList)) {
            //如果今天存在之前的数据先删除
@@ -296,7 +326,7 @@
                    item.setNo(item.getExternalIndexCode());
                }
            });
            pointService.setDeviceTagByGB(carList,CheckConstants.Rule_Category_Car);
            pointService.setDeviceTagByGB(carList, CheckConstants.Rule_Category_Car);
            //存放在mongo中
            mongoTemplate.insertAll(carList);
        }
@@ -314,7 +344,7 @@
        carParam.setPageSize(ApiConstants.HKPageSize);
        carParam.setDate(DateUtils.getDate());
        carParam.setDataType(ApiConstants.HK_DataType_CAR);
        List<SnapshotDelayMonitorResult> carList = HkApiUtil.sendAPI(host,appKey,appSecret,"/api/dqd/service/rs/v1/data/snapAgingDetail/query", carParam, SnapshotDelayMonitorResult.class);
        List<SnapshotDelayMonitorResult> carList = HkApiUtil.sendAPI(host, appKey, appSecret, "/api/dqd/service/rs/v1/data/snapAgingDetail/query", carParam, SnapshotDelayMonitorResult.class);
        if (!CollectionUtils.isEmpty(carList)) {
            //如果今天存在之前的数据先删除
@@ -329,7 +359,7 @@
                    item.setNo(item.getExternalIndexCode());
                }
            });
            pointService.setDeviceTagByGB(carList,CheckConstants.Rule_Category_Car);
            pointService.setDeviceTagByGB(carList, CheckConstants.Rule_Category_Car);
            mongoTemplate.insertAll(carList);
        }
@@ -339,7 +369,7 @@
        faceParam.setPageSize(ApiConstants.HKPageSize);
        faceParam.setDate(DateUtils.getDate());
        faceParam.setDataType(ApiConstants.HK_DataType_FACE);
        List<SnapshotDelayMonitorResult> faceList = HkApiUtil.sendAPI(host,appKey,appSecret,"/api/dqd/service/rs/v1/data/snapAgingDetail/query", faceParam, SnapshotDelayMonitorResult.class);
        List<SnapshotDelayMonitorResult> faceList = HkApiUtil.sendAPI(host, appKey, appSecret, "/api/dqd/service/rs/v1/data/snapAgingDetail/query", faceParam, SnapshotDelayMonitorResult.class);
        if (!CollectionUtils.isEmpty(faceList)) {
            //如果今天存在之前的数据先删除
@@ -354,7 +384,7 @@
                    item.setNo(item.getExternalIndexCode());
                }
            });
            pointService.setDeviceTagByGB(faceList,CheckConstants.Rule_Category_Face);
            pointService.setDeviceTagByGB(faceList, CheckConstants.Rule_Category_Face);
            mongoTemplate.insertAll(faceList);
        }
        log.info("结束抓拍数据时延监测结果数据同步");
@@ -369,7 +399,7 @@
        param.setPageSize(ApiConstants.HKPageSize);
        param.setDate(DateUtils.getDate());
        param.setDataType(ApiConstants.HK_DataType_CAR);
        List<PicAccessResult> carList = HkApiUtil.sendAPI(host,appKey,appSecret,"/api/dqd/service/rs/v1/data/picAccessDetail/query", param, PicAccessResult.class);
        List<PicAccessResult> carList = HkApiUtil.sendAPI(host, appKey, appSecret, "/api/dqd/service/rs/v1/data/picAccessDetail/query", param, PicAccessResult.class);
        if (!CollectionUtils.isEmpty(carList)) {
            //如果今天存在之前的数据先删除
@@ -381,7 +411,7 @@
                    item.setNo(item.getExternalIndexCode());
                }
            });
            pointService.setDeviceTagByGB(carList,CheckConstants.Rule_Category_Car);
            pointService.setDeviceTagByGB(carList, CheckConstants.Rule_Category_Car);
            //存放在mongo中
            mongoTemplate.insertAll(carList);
        }
@@ -397,7 +427,7 @@
        param.setPageSize(ApiConstants.HKPageSize);
        param.setDate(DateUtils.getDate());
        param.setDataType(ApiConstants.HK_DataType_CAR);
        List<VehicleDeviceSamplingResult> carList = HkApiUtil.sendAPI(host,appKey,appSecret,"/api/dqd/service/rs/v2/data/vehSampleAmount/query", param, VehicleDeviceSamplingResult.class);
        List<VehicleDeviceSamplingResult> carList = HkApiUtil.sendAPI(host, appKey, appSecret, "/api/dqd/service/rs/v2/data/vehSampleAmount/query", param, VehicleDeviceSamplingResult.class);
        if (!CollectionUtils.isEmpty(carList)) {
            //如果今天存在之前的数据先删除
@@ -409,7 +439,7 @@
                    item.setNo(item.getExternalIndexCode());
                }
            });
            pointService.setDeviceTagByGB(carList,CheckConstants.Rule_Category_Car);
            pointService.setDeviceTagByGB(carList, CheckConstants.Rule_Category_Car);
            //存放在mongo中
            mongoTemplate.insertAll(carList);
        }
@@ -424,7 +454,7 @@
        param.setPageNo(ApiConstants.PageNo);
        param.setPageSize(ApiConstants.HKPageSize);
        param.setDate(DateUtils.getDate());
        List<FaceDeviceSamplingResult> faceList = HkApiUtil.sendAPI(host,appKey,appSecret,"/api/dqd/service/rs/v2/data/faceSampleAmount/query", param, FaceDeviceSamplingResult.class);
        List<FaceDeviceSamplingResult> faceList = HkApiUtil.sendAPI(host, appKey, appSecret, "/api/dqd/service/rs/v2/data/faceSampleAmount/query", param, FaceDeviceSamplingResult.class);
        if (!CollectionUtils.isEmpty(faceList)) {
            //如果今天存在之前的数据先删除
@@ -436,65 +466,149 @@
                    item.setNo(item.getExternalIndexCode());
                }
            });
            pointService.setDeviceTagByGB(faceList,CheckConstants.Rule_Category_Face);
            pointService.setDeviceTagByGB(faceList, CheckConstants.Rule_Category_Face);
            //存放在mongo中
            mongoTemplate.insertAll(faceList);
        }
        log.info("结束人脸设备抽检指标监测结果数据同步");
    }
    //业务树
    public void TreeTask() {
        log.info("开始执行业务树数据");
        TreeParam param = new TreeParam();
        param.setStartDate("2024-12-06");
        param.setEndDate("2024-12-06");
        List<HKTreeResult> faceList = HkApiUtil.sendGetAPI(host,appKey,appSecret,"/api/third/timeTree", param, HKTreeResult.class);
//        if (!CollectionUtils.isEmpty(faceList)) {
//            //如果今天存在之前的数据先删除
//            Query query = new Query(Criteria
//                    .where("mongoCreateTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date())));
//            DeleteResult result = mongoTemplate.remove(query, FaceDeviceSamplingResult.class);
//            faceList.stream().forEach(item -> {
//                if (Objects.nonNull(item.getExternalIndexCode())) {
//                    item.setNo(item.getExternalIndexCode());
//                }
//            });
//            pointService.setDeviceTagByGB(faceList,CheckConstants.Rule_Category_Face);
//            //存放在mongo中
//            mongoTemplate.insertAll(faceList);
//        }
        log.info("结束业务树数据");
    }
    //考核成绩
    public void HkScoreTask() {
        log.info("开始执行海康考核成绩数据");
        //准备新增或修改的数据
        List<CheckIndexCar> cars = new ArrayList<>();
        List<CheckIndexFace> faces = new ArrayList<>();
        // 查询是否index表已经存在今日数据
        List<CheckIndexFace> checkIndexFaceList = faceMapper.selectToday(utils.DateUtils.getDate());
        List<CheckIndexCar> checkIndexCarList = carMapper.selectToday(utils.DateUtils.getDate());
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        // 获取当前时间的Calendar实例
        Calendar calendar = Calendar.getInstance();
        // 设置时间为前一天
        calendar.add(Calendar.DATE, -1);
        // 获取前一天的Date对象
        Date yesterday = calendar.getTime();
        //先请求全量数据
        ScoreParam param = new ScoreParam();
        param.setStartDate("2024-12-06");
        param.setEndDate("2024-12-06");
        List<HKScoreResult> dataList = HkApiUtil.sendGetAPI(host,appKey,appSecret,"/api/third/score/get", param, HKScoreResult.class);
//        if (!CollectionUtils.isEmpty(faceList)) {
//            //如果今天存在之前的数据先删除
//            Query query = new Query(Criteria
//                    .where("mongoCreateTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date())));
//            DeleteResult result = mongoTemplate.remove(query, FaceDeviceSamplingResult.class);
//            faceList.stream().forEach(item -> {
//                if (Objects.nonNull(item.getExternalIndexCode())) {
//                    item.setNo(item.getExternalIndexCode());
//                }
//            });
//            pointService.setDeviceTagByGB(faceList,CheckConstants.Rule_Category_Face);
//            //存放在mongo中
//            mongoTemplate.insertAll(faceList);
//        }
        param.setStartDate(format.format(yesterday));
        param.setEndDate(format.format(yesterday));
        param.setFocusFlag(ApiConstants.HK_FOCUS_FLAG_ALL);
        param.setCarTree(carCode);
        param.setFaceTree(faceCode);
        JSONObject scoreJson = hkClient.getScore(param);
        if (scoreJson != null) {
            String code = scoreJson.getString("code");
            if (ApiConstants.HKSuccessCode.equals(code)) {
                List<HKScoreResult> data = scoreJson.getList("data", HKScoreResult.class);
                //根据数据转换为index对象
                data.forEach(score -> {
                    CheckIndexCar car = new CheckIndexCar();
                    CheckIndexFace face = new CheckIndexFace();
                    score2Index(score, car, face);
                    car.setExamineTag(CheckConstants.Examine_Tag_County);
                    face.setExamineTag(CheckConstants.Examine_Tag_County);
                    Optional<CheckIndexCar> carFirst = checkIndexCarList.stream()
                            .filter(index -> CheckConstants.Examine_Tag_County.equals(index.getExamineTag()) && car.getDeptId().equals(index.getDeptId()))
                            .findFirst();
                    Optional<CheckIndexFace> faceFirst = checkIndexFaceList.stream()
                            .filter(index -> CheckConstants.Examine_Tag_County.equals(index.getExamineTag()) && face.getDeptId().equals(index.getDeptId()))
                            .findFirst();
                    if (carFirst.isPresent()) {
                        car.setId(carFirst.get().getId());
                    }
                    if (faceFirst.isPresent()) {
                        face.setId(faceFirst.get().getId());
                    }
                    cars.add(car);
                    faces.add(face);
                });
            }
        }
        //先请求省厅数据
        ScoreParam provinceParam = new ScoreParam();
        provinceParam.setStartDate(format.format(yesterday));
        provinceParam.setEndDate(format.format(yesterday));
        provinceParam.setFocusFlag(ApiConstants.HK_FOCUS_FLAG_ALL);
        provinceParam.setCarTree(carProvinceCode);
        provinceParam.setFaceTree(faceProvinceCode);
        JSONObject scoreProvinceJson = hkClient.getScore(provinceParam);
        if (scoreProvinceJson != null) {
            String code = scoreProvinceJson.getString("code");
            if (ApiConstants.HKSuccessCode.equals(code)) {
                List<HKScoreResult> data = scoreProvinceJson.getList("data", HKScoreResult.class);
                //根据数据转换为index对象
                data.forEach(score -> {
                    CheckIndexCar car = new CheckIndexCar();
                    CheckIndexFace face = new CheckIndexFace();
                    score2Index(score, car, face);
                    car.setExamineTag(CheckConstants.Examine_Tag_Province);
                    face.setExamineTag(CheckConstants.Examine_Tag_Province);
                    Optional<CheckIndexCar> carFirst = checkIndexCarList.stream()
                            .filter(index -> CheckConstants.Examine_Tag_Province.equals(index.getExamineTag()) && car.getDeptId().equals(index.getDeptId()))
                            .findFirst();
                    Optional<CheckIndexFace> faceFirst = checkIndexFaceList.stream()
                            .filter(index -> CheckConstants.Examine_Tag_Province.equals(index.getExamineTag()) && face.getDeptId().equals(index.getDeptId()))
                            .findFirst();
                    if (carFirst.isPresent()) {
                        car.setId(carFirst.get().getId());
                    }
                    if (faceFirst.isPresent()) {
                        face.setId(faceFirst.get().getId());
                    }
                    cars.add(car);
                    faces.add(face);
                });
            }
        }
        //存放成绩到mysql,如果存在则替换不存在就新增。
        if (!CollectionUtils.isEmpty(cars)) carService.saveOrUpdateBatch(cars);
        if (!CollectionUtils.isEmpty(faces)) faceService.saveOrUpdateBatch(faces);
        log.info("结束海康考核成绩数据");
    }
    private void score2Index(HKScoreResult score, CheckIndexCar car, CheckIndexFace face) {
        car.setDeptId(Long.parseLong(AreaDeptEnum.fromCode(score.getAreaCode()).getDeptId() + ""));
        car.setCreateTime(new Date());
        car.setPublish(PublishType.PUBLISHED.getCode());
        face.setDeptId(Long.parseLong(AreaDeptEnum.fromCode(score.getAreaCode()).getDeptId() + ""));
        face.setCreateTime(new Date());
        face.setPublish(PublishType.PUBLISHED.getCode());
        car.setViewConnectStability(new BigDecimal(score.getDownCarDataUploadScoreString() == null ? "1" : score.getDownCarDataUploadScoreString()));
        car.setSiteOnline(new BigDecimal(score.getDownCrossQualityCarScoreString() == null ? "1" : score.getDownCrossQualityCarScoreString()));
        car.setDeviceDirectoryConsistent(new BigDecimal(score.getDownCrossNumPushCarScoreString() == null ? "1" : score.getDownCrossNumPushCarScoreString()));
        //TODO:待完善
        car.setVehicleInformationCollectionAccuracy(new BigDecimal("1"));
        //TODO:待完善 重点怎么加进去
        car.setVehicleCaptureIntegrity(new BigDecimal(score.getDownCrossAllCarDataIntegrityScoreString() == null ? "1" : score.getDownCrossAllCarDataIntegrityScoreString()));
        //TODO:待完善 两个项合成一个
        car.setVehicleCaptureAccuracy(new BigDecimal("1"));
        car.setVehicleTimingAccuracy(new BigDecimal(score.getDownCrossCarInvertScoreString() == null ? "1" : score.getDownCrossCarInvertScoreString()));
        car.setVehicleUploadTimeliness(new BigDecimal(score.getDownCrossAllCarDelayScoreString() == null ? "1" : score.getDownCrossAllCarDelayScoreString()));
        //TODO:待完善
        car.setVehicleUrlAvailability(new BigDecimal("1"));
        car.setVehiclePictureAvailability(new BigDecimal(score.getDownCrossPictureQualityCarScoreString() == null ? "1" : score.getDownCrossPictureQualityCarScoreString()));
        face.setViewConnectStability(new BigDecimal(score.getDownFaceDataUploadScoreString() == null ? "1" : score.getDownFaceDataUploadScoreString()));
        face.setSiteOnline(new BigDecimal(score.getDownFaceDataUploadScoreString() == null ? "1" : score.getDownFaceDataUploadScoreString()));
        face.setDeviceDirectoryConsistent(new BigDecimal(score.getDownCrossNumPushCarScoreString() == null ? "1" : score.getDownCrossNumPushCarScoreString()));
        //TODO:待完善
        face.setFaceInformationCollectionAccuracy(new BigDecimal("1"));
        //TODO:待完善
        face.setFacePictureQualification(new BigDecimal("1"));
        face.setFaceTimingAccuracy(new BigDecimal(score.getDownCrossFaceInvertScoreString() == null ? "1" : score.getDownCrossFaceInvertScoreString()));
        face.setFaceUploadTimeliness(new BigDecimal(score.getDownCrossAllFaceDelayScoreString() == null ? "1" : score.getDownCrossAllFaceDelayScoreString()));
        face.setFacePictureAvailability(new BigDecimal(score.getDownCrossPictureQualityFaceScoreString() == null ? "1" : score.getDownCrossPictureQualityFaceScoreString()));
    }
    //解析数据
    private <T> List<T> getDataList(JSONObject jsonObject, Class<T> resultClass, String message) {
        if (jsonObject != null && ApiConstants.HKSuccessCode.equals(jsonObject.getString("code"))) {
            log.info("数据格式"+jsonObject);
            log.info("数据格式" + jsonObject);
            JSONObject data = jsonObject.getJSONObject("data");
            if (data == null) {
                log.error(message, jsonObject);
ycl-server/src/main/java/com/ycl/task/MonitorTask.java
@@ -83,72 +83,74 @@
//        Date yesterday = DateUtils.addDays(new Date(), -1);
        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);
        //mongo品牌数据
        Query OSDQuery = new Query(Criteria.where("mongoCreateTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date())));
        Map<String, OsdCheckResult> osdMap = mongoTemplate.find(query, OsdCheckResult.class).stream().collect(Collectors.toMap(OsdCheckResult::getDeviceNo, Function.identity()));
        //数据库monitor表数据
        Map<String, TMonitorVO> monitorVOMap = monitorMapper.selectMonitorVOList().stream().collect(Collectors.toMap(TMonitorVO::getSerialNumber, Function.identity()));
        //点位数据
        Map<String, YwPoint> pointMap = ywPointService.list(new QueryWrapper<YwPoint>()).stream().collect(Collectors.toMap(YwPoint::getSerialNumber, Function.identity()));
        if(!CollectionUtils.isEmpty(oneMachineFileResults)) {
            //mongo品牌数据
            Query OSDQuery = new Query(Criteria.where("mongoCreateTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date())));
            Map<String, OsdCheckResult> osdMap = mongoTemplate.find(query, OsdCheckResult.class).stream().collect(Collectors.toMap(OsdCheckResult::getDeviceNo, Function.identity()));
            //数据库monitor表数据
            Map<String, TMonitorVO> monitorVOMap = monitorMapper.selectMonitorVOList().stream().collect(Collectors.toMap(TMonitorVO::getSerialNumber, Function.identity()));
            //点位数据
            Map<String, YwPoint> pointMap = ywPointService.list(new QueryWrapper<YwPoint>()).stream().collect(Collectors.toMap(YwPoint::getSerialNumber, Function.identity()));
        //重点点位集合字典(解析SXJCJQY字段)
        SysDictData sysDictData = new SysDictData();
        sysDictData.setDictType("platform_important_site");
        List<SysDictData> DictDataList = dictDataService.selectDictDataList(sysDictData);
        //采集区域为重点点位的集合
        List<String> importantSite = DictDataList.stream().map(SysDictData::getDictValue).collect(Collectors.toList());
            //重点点位集合字典(解析SXJCJQY字段)
            SysDictData sysDictData = new SysDictData();
            sysDictData.setDictType("platform_important_site");
            List<SysDictData> DictDataList = dictDataService.selectDictDataList(sysDictData);
            //采集区域为重点点位的集合
            List<String> importantSite = DictDataList.stream().map(SysDictData::getDictValue).collect(Collectors.toList());
        //准备插入设备表的数据
        List<TMonitor> monitorList = new ArrayList<>();
        //准备插入点位表的数据
        List<YwPoint> ywPointList = new ArrayList<>();
            //准备插入设备表的数据
            List<TMonitor> monitorList = new ArrayList<>();
            //准备插入点位表的数据
            List<YwPoint> ywPointList = new ArrayList<>();
        //全年留存
        for (MonitorQualifyResult result : oneMachineFileResults) {
            TMonitor monitor = getMonitor(result, monitorVOMap, osdMap);
            YwPoint point = getPoint(result, pointMap, importantSite);
            monitorList.add(monitor);
            ywPointList.add(point);
        }
        //添加老数据
        List<String> numbers = CollectionUtils.isEmpty(monitorList) ? new ArrayList<>() : monitorList.stream().map(TMonitor::getSerialNumber).collect(Collectors.toList());
        monitorVOMap.forEach((key, value) -> {
            if (!numbers.contains(key)) {
                TMonitor monitor = new TMonitor();
                BeanUtils.copyProperties(value, monitor);
                //填补品牌
                OsdCheckResult osdCheckResult = osdMap.get(key);
                if (osdCheckResult != null) {
                    monitor.setDeviceType(osdCheckResult.getDeviceBrand());
                }
            //全年留存
            for (MonitorQualifyResult result : oneMachineFileResults) {
                TMonitor monitor = getMonitor(result, monitorVOMap, osdMap);
                YwPoint point = getPoint(result, pointMap, importantSite);
                monitorList.add(monitor);
                ywPointList.add(point);
            }
        });
        List<String> points = CollectionUtils.isEmpty(ywPointList) ? new ArrayList<>() : ywPointList.stream().map(YwPoint::getSerialNumber).collect(Collectors.toList());
        pointMap.forEach((key, value) -> {
            //老设备状态改为不参与考核
            if (!points.contains(key)) {
                value.setExamineStatus(Boolean.FALSE);
                //单位设置为空
                value.setUnitId(null);
                ywPointList.add(value);
            }
        });
            //添加老数据
            List<String> numbers = CollectionUtils.isEmpty(monitorList) ? new ArrayList<>() : monitorList.stream().map(TMonitor::getSerialNumber).collect(Collectors.toList());
            monitorVOMap.forEach((key, value) -> {
                if (!numbers.contains(key)) {
                    TMonitor monitor = new TMonitor();
                    BeanUtils.copyProperties(value, monitor);
                    //填补品牌
                    OsdCheckResult osdCheckResult = osdMap.get(key);
                    if (osdCheckResult != null) {
                        monitor.setDeviceType(osdCheckResult.getDeviceBrand());
                    }
        log.info("result集合{},设备集合{},点位集合{}", oneMachineFileResults.size(), monitorList.size(), ywPointList.size());
        //插入数据库
        if (!CollectionUtils.isEmpty(monitorList)) {
            monitorMapper.deleteAll();
            monitorService.saveBatch(monitorList);
        }
        if (!CollectionUtils.isEmpty(ywPointList)) {
            ywPointMapper.deleteAll();
            ywPointService.saveBatch(ywPointList);
        }
        //新的数据放入Redis中等待考核指标任务使用(弃用,改为标签形式)
                    monitorList.add(monitor);
                }
            });
            List<String> points = CollectionUtils.isEmpty(ywPointList) ? new ArrayList<>() : ywPointList.stream().map(YwPoint::getSerialNumber).collect(Collectors.toList());
            pointMap.forEach((key, value) -> {
                //老设备状态改为不参与考核
                if (!points.contains(key)) {
                    value.setExamineStatus(Boolean.FALSE);
                    //单位设置为空(TODO:为啥)
                    value.setUnitId(null);
                    ywPointList.add(value);
                }
            });
            log.info("result集合{},设备集合{},点位集合{}", oneMachineFileResults.size(), monitorList.size(), ywPointList.size());
            //插入数据库
            if (!CollectionUtils.isEmpty(monitorList)) {
                monitorMapper.deleteAll();
                monitorService.saveBatch(monitorList);
            }
            if (!CollectionUtils.isEmpty(ywPointList)) {
                ywPointMapper.deleteAll();
                ywPointService.saveBatch(ywPointList);
            }
            //新的数据放入Redis中等待考核指标任务使用(弃用,改为标签形式)
//        redisTemplate.opsForValue().set(RedisConstant.New_Monitor_Set, JSONArray.toJSONString(newMonitorList));
        }
        log.info("结束同步mongodb一机一档到数据库");
    }
ycl-server/src/main/java/com/ycl/utils/DateUtils.java
@@ -233,7 +233,6 @@
    /**
     * 获取某月开始日期
     */
    //TODO:校验逻辑是否正确
    public static String getMouthStart(@Nullable Date date) {
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        Calendar c = Calendar.getInstance();
ycl-server/src/main/resources/application-dev.yml
@@ -151,6 +151,10 @@
  host: 51.92.65.49
  appKey: 29555942
  appSecret: t9U7tCplCyYHzQPPL7cH
  carCode: gb
  faceCode: gb
  carProvinceCode: 2_car
  faceProvinceCode: 3_face
DH:
  userName: admin
ycl-server/src/main/resources/application-prod.yml
@@ -110,7 +110,7 @@
request:
  retry: 4 # 最大重试次数
  youYunDomain: http://51.92.65.56 # 优云地址
#  haiKangDomain: 51.92.65.48 # 海康地址
  haiKangDomain: http://51.92.65.49 # 海康地址
youYun:
  tenantId: e10adc3949ba59abbe56e057f20f88dd
  email: yunwei-app
@@ -125,7 +125,13 @@
  host: 51.92.65.49
  appKey: 29555942
  appSecret: t9U7tCplCyYHzQPPL7cH
  carCode: gb
  faceCode: gb
  carProvinceCode: 2_car
  faceProvinceCode: 3_face
  1111: Hik12345+
DH:
  userName: admin
  password: zg@2024dx
ycl-server/src/main/resources/mapper/zgyw/TMonitorMapper.xml
@@ -95,7 +95,7 @@
            #{number}
        </foreach>
    </select>
    <!-- TODO:异常恢复监控和是否产生工单字段-->
    <select id="selectTMonitorList" resultType="com.ycl.platform.domain.vo.TMonitorVO">
        select m.id, m.serial_number, name, site_type, mac_addr, ip, camera_fun_type, longitude, latitude,
        camera_capture_area,
ycl-server/src/main/resources/mapper/zgyw/WorkOrderMapper.xml
@@ -92,7 +92,7 @@
        ORDER BY wo.work_order_no DESC
    </select>
    <select id="export" resultMap="BaseResultMap">
    <select id="export" resultType = "com.ycl.platform.domain.vo.WorkOrderVO">
        SELECT
        wo.id,wo.status,
        wo.work_order_no,
@@ -111,11 +111,18 @@
        p.yw_person_name,
        tm.name as source,
        tm.ip as ip,
        yp.province_tag_video,
        yp.province_tag_car,
        yp.province_tag_face,
        yp.important_tag,
        yp.important_command_image_tag,
        yp.dept_tag,
        GROUP_CONCAT(DISTINCT da.dict_label ORDER BY da.dict_label SEPARATOR ',') AS errorType,
        GROUP_CONCAT(DISTINCT ci.img_url ORDER BY ci.create_time DESC SEPARATOR ',') AS imgListStr
        FROM
        t_work_order wo
        INNER JOIN t_monitor tm ON wo.serial_number = tm.serial_number
        INNER JOIN t_yw_point yp ON wo.serial_number = yp.serial_number
        INNER JOIN t_work_order_error_type et ON wo.work_order_no = et.work_order_no
        INNER JOIN sys_dict_data da ON da.dict_value = et.error_name AND da.dict_type = 'error_type'
        INNER JOIN t_yw_unit u ON wo.unit_id = u.id AND u.deleted = 0
@@ -212,9 +219,9 @@
    <select id="getOfflineWorkOrder" resultType="java.lang.String">
        select tm.ip
        FROM t_work_order wo
                 INNER JOIN t_monitor tm ON wo.serial_number = tm.serial_number
        INNER JOIN t_monitor tm ON wo.serial_number = tm.serial_number
        where wo.status != 'AUDITING_SUCCESS' and wo.deleted = 0
          AND (EXISTS(
        AND (EXISTS (
                SELECT 1
                FROM t_work_order_error_type twoet
                WHERE twoet.work_order_no = wo.work_order_no