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