ycl-pojo/src/main/java/com/ycl/platform/domain/entity/CheckScore.java
@@ -6,14 +6,9 @@ import com.fasterxml.jackson.annotation.JsonFormat; import com.ycl.system.entity.BaseEntity; import lombok.Data; import lombok.experimental.Accessors; import org.apache.commons.lang.builder.ToStringBuilder; import org.apache.commons.lang.builder.ToStringStyle; import org.springframework.format.annotation.DateTimeFormat; import java.math.BigDecimal; import java.util.Date; import java.util.Map; /** * 考核积分明细对象 t_check_score @@ -69,4 +64,10 @@ @TableField(exist = false) private String date; @TableField(exist = false) private Date startDate; @TableField(exist = false) private Date endDate; } ycl-pojo/src/main/java/com/ycl/platform/domain/excel/CalculateExport.java
New file @@ -0,0 +1,51 @@ package com.ycl.platform.domain.excel; import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.write.style.*; import com.alibaba.excel.enums.BooleanEnum; import com.alibaba.excel.enums.poi.HorizontalAlignmentEnum; import com.alibaba.excel.enums.poi.VerticalAlignmentEnum; import lombok.Data; import java.math.BigDecimal; /** * @author gonghl * @since 2024/7/30 上午 10:01 */ @Data @ColumnWidth(20) @HeadRowHeight(30) @ContentRowHeight(30) @HeadStyle(fillForegroundColor = 64) @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER) @ContentFontStyle(fontHeightInPoints = 18, bold = BooleanEnum.TRUE, fontName = "宋体") @HeadFontStyle(fontHeightInPoints = 18, bold = BooleanEnum.TRUE, fontName = "宋体") public class CalculateExport { /** * 规则名称 */ @ExcelProperty({"自贡市公共视频监控系统续维合同", "规则名称"}) @ColumnWidth(40) private String ruleName; /** * 数量 */ @ExcelProperty({"自贡市公共视频监控系统续维合同", "数量"}) private Integer num; /** * 分数 */ @ExcelProperty({"自贡市公共视频监控系统续维合同", "分数"}) private Integer score; /** * 金额 */ @ExcelProperty({"自贡市公共视频监控系统续维合同", "金额"}) private BigDecimal money; } ycl-pojo/src/main/java/com/ycl/platform/domain/param/UY/QueryVqdParam.java
New file @@ -0,0 +1,136 @@ package com.ycl.platform.domain.param.UY; import lombok.Data; import lombok.experimental.Accessors; /** * 图像检测诊断结果 */ @Data @Accessors(chain = true) public class QueryVqdParam { /** * 租户id */ private String tenantId; /** * 行政区域编码 */ private String arealayerno; /** * 模糊 1:正常 0:未知 -1:异常 */ private String blur; /** * 颜色 1:正常 0:未知 -1:异常 */ private String color; /** * 摄像机国标ID */ private String deviceId; /** * 摄像机名称 */ private String deviceName; /** * 排序方式 可选值为 desc:倒序排序 asc:正序排序 默认倒序排序 */ private String direction; /** * 0:实时码流诊断 1:历史码流诊断 */ private Integer groupFlag; /** * 诊断分组ID */ private String groupId; /** * 图像质量状态 1:正常 0:未知 -1:异常 */ private String imgStatus; /** * 亮度 1:正常 0:未知 -1:异常 */ private String light; /** * 在线状态 1:在线 0:未知 -1:离线 */ private String onlineStatus; /** * 分页页码,默认从1开始 */ private Integer pageNum; /** * 分页大小,默认1000 */ private Integer pageSize; /** * 国标平台ID */ private String platId; /** * 遮挡 1:正常 0:未知 -1:异常 */ private String shade; /** * 抖动 1:正常 0:未知 -1:异常 */ private String shake; /** * 无信号 1:有信号 0:未知 -1:无信号 */ private String signal; /** * 信号状态 1:有信号 0:未知 -1:无信号 */ private String signalStatus; /** * 雪花 1:正常 0:未知 -1:异常 */ private String snow; /** * 排序的字段 按指定字段排序 默认按拉码流时间排序 */ private String sortedField; /** * 条纹 1:正常 0:未知 -1:异常 */ private String stripe; /** * 诊断任务创建时间 */ private String taskCreateTime; /** * 诊断任务复核时间 */ private String taskRecheckTime; /** * 视频诊断状态 */ private String videoDiagStatus; /** * 视频流诊断开始时间 */ private String videoDiagTimeBegin; /** * 视频流诊断结束时间 */ private String videoDiagTimeEnd; /** * 获取视频流状态 */ private String videoGetStatus; /** * 视频流获取时间开始时间 */ private String videoGetTimeBegin; /** * 视频流获取时间结束时间 */ private String videoGetTimeEnd; /** * 是否需要分页返回结果,当为true时pageSize和pageNum参数失效 */ private Boolean withOutPaging; } ycl-pojo/src/main/java/com/ycl/platform/domain/param/UY/VideoQualityParam.java
New file @@ -0,0 +1,31 @@ package com.ycl.platform.domain.param.UY; import lombok.Data; import lombok.experimental.Accessors; /** * 视频图像质量 */ @Data @Accessors(chain = true) public class VideoQualityParam { /** 区域编码 */ private String arealayerno; private Object[] dbConditionItems; /** 设备 ID */ private String deviceId; /** 设备名称 */ private String deviceName; /** 动态条件 */ private String dynamicConditionJson; /** 排序字段 */ private String field; /** 排序方式,desc: 降序, asc: 升序 */ private String order; /** 分页页码 */ private Integer pageNum; /** 分页大小 */ private Integer pageSize; /** 状态 */ private Integer status; } ycl-pojo/src/main/java/com/ycl/platform/domain/result/BaseResult.java
File was renamed from ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/BaseResult.java @@ -1,4 +1,4 @@ package com.ycl.platform.domain.result.HK; package com.ycl.platform.domain.result; import lombok.Data; import org.bson.types.ObjectId; ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/AttrRecognitionMonitorResult.java
@@ -1,6 +1,8 @@ package com.ycl.platform.domain.result.HK; import com.ycl.platform.domain.result.BaseResult; import lombok.Data; import org.springframework.data.mongodb.core.mapping.Document; /** * 属性识别准确监测结果 @@ -8,7 +10,8 @@ * @author gonghl */ @Data public class AttrRecognitionMonitorResult { @Document(collection = "attr_recognition_monitor") public class AttrRecognitionMonitorResult extends BaseResult { /** * 卡口内码或采集设备内码,dataType为1时表示卡口内码,dataType为11时表示采集设备内码 ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/CarDetectResult.java
@@ -1,6 +1,8 @@ package com.ycl.platform.domain.result.HK; import com.ycl.platform.domain.result.BaseResult; import lombok.Data; import org.springframework.data.mongodb.core.mapping.Document; /** * 按区域统计车辆数据监测指标项(2.3.0新增) @@ -8,7 +10,8 @@ * @author gonghl */ @Data public class CarDetectResult { @Document(collection = "car_detect") public class CarDetectResult extends BaseResult { /** * 组织编号 ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/CodeByAreaResult.java
@@ -1,6 +1,8 @@ package com.ycl.platform.domain.result.HK; import com.ycl.platform.domain.result.BaseResult; import lombok.Data; import org.springframework.data.mongodb.core.mapping.Document; /** * 按区域统计编码异常设备或卡口 @@ -8,7 +10,8 @@ * @author gonghl */ @Data public class CodeByAreaResult { @Document(collection = "code_by_area") public class CodeByAreaResult extends BaseResult { /** * 组织编号 ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/CoordinateByAreaResult.java
@@ -1,6 +1,8 @@ package com.ycl.platform.domain.result.HK; import com.ycl.platform.domain.result.BaseResult; import lombok.Data; import org.springframework.data.mongodb.core.mapping.Document; /** * 按区域统计经纬度异常设备或卡口 @@ -8,7 +10,8 @@ * @author gonghl */ @Data public class CoordinateByAreaResult { @Document(collection = "coordinate_by_area") public class CoordinateByAreaResult extends BaseResult { /** * 组织编号 ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/CriteriaResult.java
@@ -1,6 +1,8 @@ package com.ycl.platform.domain.result.HK; import com.ycl.platform.domain.result.BaseResult; import lombok.Data; import org.springframework.data.mongodb.core.mapping.Document; /** * 指标配置信息查询 @@ -8,7 +10,8 @@ * @author gonghl */ @Data public class CriteriaResult { @Document(collection = "criteria") public class CriteriaResult extends BaseResult { /** * 人脸评分低标准,例如:0.4 ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/CrossDetailResult.java
@@ -1,6 +1,8 @@ package com.ycl.platform.domain.result.HK; import com.ycl.platform.domain.result.BaseResult; import lombok.Data; import org.springframework.data.mongodb.core.mapping.Document; /** * 卡口属性监测结果(调整,可查历史) @@ -8,7 +10,8 @@ * @author gonghl */ @Data public class CrossDetailResult { @Document(collection = "cross_detail") public class CrossDetailResult extends BaseResult { /** * 组织编号,用于查询该组织及其所有下级组织卡口异常情况。若不传,返回所有卡口异常详情。 ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/DataIntegrityMonitoringResult.java
@@ -1,6 +1,8 @@ package com.ycl.platform.domain.result.HK; import com.ycl.platform.domain.result.BaseResult; import lombok.Data; import org.springframework.data.mongodb.core.mapping.Document; /** * 数据完整性监测结果,2.2.0版本新增 @@ -8,14 +10,15 @@ * @author gonghl */ @Data public class DataIntegrityMonitoringResult { @Document(collection = "data_integrity_monitoring") public class DataIntegrityMonitoringResult extends BaseResult { /** * 卡口内码或采集设备内码,dataType为1时表示卡口内码,dataType为11时表示采集设备内码 */ private String indexCode; /** /** * 设备或卡口国标编码 */ private String externalIndexCode; ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/FaceDetectResult.java
@@ -1,6 +1,8 @@ package com.ycl.platform.domain.result.HK; import com.ycl.platform.domain.result.BaseResult; import lombok.Data; import org.springframework.data.mongodb.core.mapping.Document; /** * 按区域统计人脸数据监测指标项(2.3.0新增) @@ -8,7 +10,8 @@ * @author gonghl */ @Data public class FaceDetectResult { @Document(collection = "face_detect") public class FaceDetectResult extends BaseResult { /** * 组织编号 ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/FaceDeviceInspectionResult.java
@@ -1,5 +1,6 @@ package com.ycl.platform.domain.result.HK; import com.ycl.platform.domain.result.BaseResult; import lombok.Data; import org.springframework.data.mongodb.core.mapping.Document; @@ -10,7 +11,7 @@ */ @Data @Document(collection = "face_device_inspection") public class FaceDeviceInspectionResult extends BaseResult{ public class FaceDeviceInspectionResult extends BaseResult { /** * 设备名称 ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/FaceDeviceSamplingResult.java
@@ -1,6 +1,8 @@ package com.ycl.platform.domain.result.HK; import com.ycl.platform.domain.result.BaseResult; import lombok.Data; import org.springframework.data.mongodb.core.mapping.Document; /** * 人脸设备抽检指标监测结果,2.3.0版本新增 @@ -8,7 +10,8 @@ * @author gonghl */ @Data public class FaceDeviceSamplingResult { @Document(collection = "face_device_sampling") public class FaceDeviceSamplingResult extends BaseResult { /** * 设备名称 ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/MonitorResourceResult.java
@@ -1,6 +1,8 @@ package com.ycl.platform.domain.result.HK; import com.ycl.platform.domain.result.BaseResult; import lombok.Data; import org.springframework.data.mongodb.core.mapping.Document; import java.util.List; @@ -9,7 +11,8 @@ * @author gonghl */ @Data public class MonitorResourceResult { @Document(collection = "monitor_resource") public class MonitorResourceResult extends BaseResult { /** * 关注资源列表 ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/MonitoringDetailResult.java
@@ -1,6 +1,8 @@ package com.ycl.platform.domain.result.HK; import com.ycl.platform.domain.result.BaseResult; import lombok.Data; import org.springframework.data.mongodb.core.mapping.Document; /** * 采集设备属性监测结果 @@ -8,7 +10,8 @@ * @author gonghl */ @Data public class MonitoringDetailResult { @Document(collection = "monitoring_detail") public class MonitoringDetailResult extends BaseResult { /** * 组织编号 ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/OrganizationTreeResult.java
@@ -1,6 +1,8 @@ package com.ycl.platform.domain.result.HK; import com.ycl.platform.domain.result.BaseResult; import lombok.Data; import org.springframework.data.mongodb.core.mapping.Document; import java.util.List; @@ -10,7 +12,8 @@ * @author gonghl */ @Data public class OrganizationTreeResult { @Document(collection = "organization_tree") public class OrganizationTreeResult extends BaseResult { /** * 组织列表 ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/PicAccessResult.java
@@ -1,6 +1,8 @@ package com.ycl.platform.domain.result.HK; import com.ycl.platform.domain.result.BaseResult; import lombok.Data; import org.springframework.data.mongodb.core.mapping.Document; /** * 图片访问监测结果 @@ -8,7 +10,8 @@ * @author gonghl */ @Data public class PicAccessResult { @Document(collection = "pic_access") public class PicAccessResult extends BaseResult { /** * 数据类型为1时表示卡口内码,数据类型为2或11时表示人脸采集设备内码 ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/SnapshotDataMonitorResult.java
@@ -1,5 +1,6 @@ package com.ycl.platform.domain.result.HK; import com.ycl.platform.domain.result.BaseResult; import lombok.Data; import org.springframework.data.mongodb.core.mapping.Document; @@ -10,8 +11,11 @@ */ @Data @Document(collection = "snapshot_data_monitor") public class SnapshotDataMonitorResult extends BaseResult{ public class SnapshotDataMonitorResult extends BaseResult { /** * 数据类型 */ private Integer dataType; /** * dataType为1:卡口内码 dataType为2或11:采集设备内码 */ ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/SnapshotDelayMonitorResult.java
@@ -1,6 +1,8 @@ package com.ycl.platform.domain.result.HK; import com.ycl.platform.domain.result.BaseResult; import lombok.Data; import org.springframework.data.mongodb.core.mapping.Document; /** * 抓拍数据时延监测结果 @@ -8,8 +10,9 @@ * @author gonghl */ @Data public class SnapshotDelayMonitorResult { @Document(collection = "snapshop_delay_monitor") public class SnapshotDelayMonitorResult extends BaseResult { private Integer dataType; /** * dataType为1:卡口内码 dataType为2或11:采集设备内码 */ ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/VehicleDeviceInspectionResult.java
@@ -1,5 +1,6 @@ package com.ycl.platform.domain.result.HK; import com.ycl.platform.domain.result.BaseResult; import lombok.Data; import org.springframework.data.mongodb.core.mapping.Document; @@ -10,7 +11,7 @@ */ @Data @Document(collection = "vehicle_device_inspection") public class VehicleDeviceInspectionResult extends BaseResult{ public class VehicleDeviceInspectionResult extends BaseResult { /** * 设备编号,dataType为1时表示卡口内码,dataType为11时表示采集设备内码 ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/VehicleDeviceSamplingResult.java
@@ -1,6 +1,8 @@ package com.ycl.platform.domain.result.HK; import com.ycl.platform.domain.result.BaseResult; import lombok.Data; import org.springframework.data.mongodb.core.mapping.Document; /** * 车辆设备抽检指标监测结果,2.3.0版本新增 @@ -8,7 +10,8 @@ * @author gonghl */ @Data public class VehicleDeviceSamplingResult { @Document(collection = "vehicle_device_sampling") public class VehicleDeviceSamplingResult extends BaseResult { /** * 卡口内码或采集设备内码,dataType为1时表示卡口内码,dataType为11时表示采集设备内码 ycl-pojo/src/main/java/com/ycl/platform/domain/result/UY/OnlineResult.java
@@ -9,7 +9,7 @@ * @since 2024-4-19 11:37:30 */ @Data public class OnlineResult { public class OnlineResult{ /** * 行政区划编码 ycl-pojo/src/main/java/com/ycl/platform/domain/result/UY/QueryVqdResult.java
New file @@ -0,0 +1,246 @@ package com.ycl.platform.domain.result.UY; import lombok.Data; /** * 图像监测诊断结果 */ @Data public class QueryVqdResult { /** * */ private String arealayerPath; /** * 行政区划编码 */ private String arealayernoCode; /** * 行政区划名称 */ private String arealayernoName; /** * */ private String binaryTenantId; /** * 模糊 */ private Integer blur; /** * 模糊原始分值 */ private Integer blurRaw; /** * 模糊阈值 */ private Integer blurThreshold; /** * 颜色 */ private Integer color; /** * 颜色原始分值 */ private Integer colorRaw; /** * 颜色阈值 */ private Integer colorThreshold; /** * */ private String decodeInfo; /** * 设备 ID */ private String deviceId; /** * 设备 IP */ private String deviceIp; /** * 设备名称 */ private String deviceName; /** * */ private String extJson; /** * */ private String frameLostRate; /** * */ private String groupId; /** * */ private String id; /** * */ private Integer ifmDelay; /** * 图像地址 */ private String imagePath; /** * 图像质量状态 1:正常 0:未知 -1:异常 */ private Integer imgStatus; /** * */ private Boolean inTime; /** * 维度 */ private String latitude; /** * 亮度 */ private Integer light; /** * 亮度原始分值 */ private Integer lightRaw; /** * 亮度阈值 */ private Integer lightThreshold; /** * 经度 */ private String longitude; /** * 在线状态 1:在线 0:未知 -1:离线 */ private Integer onlineStatus; /** * */ private String originalPlatId; /** * */ private String payloadType; /** * */ private String pixelInfo; /** * 国标平台ID */ private String platId; /** * 遮挡 */ private Integer shade; /** * 遮挡原始分值 */ private Integer shadeRaw; /** * 遮挡阈值 */ private Integer shadeThreshold; /** * 抖动 */ private Integer shake; /** * 抖动原始分值 */ private Integer shakeRaw; /** * 抖动阈值 */ private Integer shakeThreshold; /** * 信号 */ private Integer signal; /** * 信号原始分值 */ private Integer signalRaw; /** * 信号状态 无信号 1:有信号 0:未知 -1:无信号 */ private Integer signalStatus; /** * 信号阈值 */ private Integer signalThreshold; /** * */ private Integer sipDelay; /** * 雪花 */ private Integer snow; /** * 雪花原始分值 */ private Integer snowRaw; /** * 雪花阈值 */ private Integer snowThreshold; /** * 条纹 */ private Integer stripe; /** * 条纹原始分值 */ private Integer stripeRaw; /** * 条纹阈值 */ private Integer stripeThreshold; /** * */ private String tags; /** * */ private String taskCreateTime; /** * */ private String taskRecheckTime; /** * */ private String tenantId; /** * */ private Integer videoDelay; /** * */ private Integer videoDiagStatus; /** * */ private String videoDiagTime; /** * */ private Integer videoGetStatus; /** * */ private String videoGetTime; /** * */ private Integer vqdAtNight; } ycl-pojo/src/main/java/com/ycl/platform/domain/result/UY/RecordMetaDSumResult.java
@@ -6,10 +6,11 @@ /** * 录像可用性 * * @author gonghl */ @Data public class RecordMetaDSumResult { public class RecordMetaDSumResult{ /** * 行政区域名称 ycl-pojo/src/main/java/com/ycl/platform/domain/result/UY/VideoQualityResult.java
New file @@ -0,0 +1,66 @@ package com.ycl.platform.domain.result.UY; import lombok.Data; /** * 视频图像质量 */ @Data public class VideoQualityResult { /** 行政区划编码 */ private String arealayernoCode; /** 行政区划名称 */ private String arealayernoName; /** 模糊 */ private Integer blur; /** 模糊原始分值 */ private Integer blurRaw; /** 颜色 */ private Integer color; /** 颜色原始分值 */ private Integer colorRaw; /** 摄像机-国标id */ private String deviceId; /** 摄像机ip */ private String deviceIp; /** 摄像机设备名称 */ private String deviceName; /** 统计纬度 */ private String dim; /** 图像是否正常 -1:异常,1正常,0:未诊断*/ private Integer isImgAbnormal; /** 信号是否丢失 -1:异常,1正常,0:未诊断*/ private Integer isSignalMiss; /** 亮度 */ private Integer light; /** 亮度原始分值 */ private Integer lightRaw; /** 遮挡 */ private Integer shade; /** 遮挡原始分值 */ private Integer shadeRaw; /** 抖动 */ private Integer shake; /** 抖动原始分值 */ private Integer shakeRaw; /** 无信号 */ private Integer signal; /** 无信号原始分值 */ private Integer signalRaw; /** 雪花 */ private Integer snow; /** 雪花原始分值 */ private Integer snowRaw; /** 排序属性 */ private String sortFiled; /** 诊断状态编码 -1:异常,1:正常,0:未诊断 */ private String status; /** 诊断状态名称 */ private String statusName; /** 条纹 */ private Integer stripe; /** 条纹原始分值 */ private Integer stripeRaw; /** 诊断时间 */ private String vqdTime; } ycl-server/src/main/java/com/ycl/calculate/CalculationStrategy.java
New file @@ -0,0 +1,7 @@ package com.ycl.calculate; import java.util.List; public interface CalculationStrategy<T> { void calculate(List<T> list); } ycl-server/src/main/java/com/ycl/calculate/CarSiteOnlineCalculation.java
New file @@ -0,0 +1,146 @@ package com.ycl.calculate; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.ycl.platform.domain.entity.CheckIndexCar; import com.ycl.platform.domain.entity.TMonitor; import com.ycl.platform.domain.result.HK.SnapshotDataMonitorResult; import com.ycl.platform.mapper.CheckIndexCarMapper; import com.ycl.platform.service.ICheckIndexCarService; import com.ycl.platform.service.ITMonitorService; import com.ycl.system.mapper.SysConfigMapper; import constant.ApiConstants; import constant.CheckConstants; import constant.CheckSnapCountConstants; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import utils.DateUtils; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; /** * 计算车辆、人脸点位在线率、视图库对接稳定性 * 获取分省厅、区域的map<k,v> k为deptId或者Province_deptId * 循环map计算点位在线率 * 更新或新增 */ @Component public class CarSiteOnlineCalculation implements CalculationStrategy<SnapshotDataMonitorResult> { @Autowired private CheckIndexCarMapper checkIndexCarMapper; @Autowired private SysConfigMapper sysConfigMapper; @Autowired private ITMonitorService monitorService; @Autowired private ICheckIndexCarService checkIndexCarService; //区域车辆点位在线指标的内部类 private static class AreaStats { int totalSites = 0; int offlineSites = 0; int totalDataSum = 0; } @Override public void calculate(List<SnapshotDataMonitorResult> list) { if (CollectionUtils.isEmpty(list)) { return; } Map<String, AreaStats> areaStatsMap = new HashMap<>(); Map<String, TMonitor> monitorMap = monitorService.list(new QueryWrapper<TMonitor>() .in("serial_number", list.stream().map(SnapshotDataMonitorResult::getExternalIndexCode).collect(Collectors.toList()))) .stream().collect(Collectors.toMap(TMonitor::getSerialNumber, Function.identity())); // TODO: 分省厅市局 需要补充集合数据 List<String> provinceIds = new ArrayList<>(); // 这里需要根据点位补充 for (SnapshotDataMonitorResult result : list) { TMonitor monitor = monitorMap.get(result.getExternalIndexCode()); if (monitor == null) continue; String deptId = monitor.getDeptId().toString(); updateAreaStats(areaStatsMap, deptId, result); // 处理省厅数据 if (!CollectionUtils.isEmpty(provinceIds) && provinceIds.contains(monitor.getSerialNumber())) { String provinceKey = "Province_" + deptId; updateAreaStats(areaStatsMap, provinceKey, result); } } //获取2022同期抓拍平均值 省厅、市局 BigDecimal cityCountAvg = getAverageCount(CheckSnapCountConstants.City); BigDecimal countyCountAvg = getAverageCount(CheckSnapCountConstants.County); // 查询今日数据 List<CheckIndexCar> checkIndexCarList = checkIndexCarMapper.selectToday(DateUtils.getDate()); List<CheckIndexCar> checkIndexCars = new ArrayList<>(); areaStatsMap.forEach((deptId, stats) -> { if (stats.totalSites > 0) { CheckIndexCar checkIndexCar = createOrUpdateCheckIndexCar(deptId, stats, cityCountAvg, countyCountAvg, checkIndexCarList); checkIndexCars.add(checkIndexCar); } }); checkIndexCarService.saveOrUpdateBatch(checkIndexCars); } //累计总点位数、离线数、总抓拍量 private void updateAreaStats(Map<String, AreaStats> areaStatsMap, String key, SnapshotDataMonitorResult result) { //返回对象的引用,如果不存在会放入新的key,value AreaStats stats = areaStatsMap.computeIfAbsent(key, k -> new AreaStats()); stats.totalSites++; if (ApiConstants.HK_SnapCount_ResultType_Null == result.getResultType()) { stats.offlineSites++; } else { stats.totalDataSum += result.getDataCount(); } } //获取2022同期抓拍平均值 private BigDecimal getAverageCount(String configKey) { String count = sysConfigMapper.checkConfigKeyUnique(configKey).getConfigValue(); return new BigDecimal(count).multiply(new BigDecimal(CheckSnapCountConstants.Multiply)) .divide(new BigDecimal(CheckSnapCountConstants.CountyNum), 0, RoundingMode.HALF_UP); } //车辆点位在线率和视图库对接稳定性 private CheckIndexCar createOrUpdateCheckIndexCar(String key, AreaStats stats, BigDecimal cityCountAvg, BigDecimal countyCountAvg, List<CheckIndexCar> checkIndexCarList) { CheckIndexCar checkIndexCar; // 检查是否已存在今日数据 Optional<CheckIndexCar> existingCar = checkIndexCarList.stream() .filter(car -> key.equals(car.getDeptId().toString()) && (key.startsWith("Province_") ? CheckConstants.Examine_Tag_City.equals(car.getExamineTag()) : CheckConstants.Examine_Tag_County.equals(car.getExamineTag()))) .findFirst(); if (existingCar.isPresent()) { checkIndexCar = existingCar.get(); } else { checkIndexCar = new CheckIndexCar(); checkIndexCar.setDeptId(key.startsWith("Province_") ? Long.parseLong(key.split("_")[1]) : Long.parseLong(key)); checkIndexCar.setExamineTag(key.startsWith("Province_") ? CheckConstants.Examine_Tag_City : CheckConstants.Examine_Tag_County); checkIndexCar.setCreateTime(new Date()); } //调用点位在线计算方法 Map<String, Object> siteOnlineParam = new HashMap<>(); siteOnlineParam.put("totalSites", stats.totalSites); siteOnlineParam.put("offlineSites", stats.offlineSites); BigDecimal siteOnline = IndexCalculationUtils.siteOnline(siteOnlineParam); checkIndexCar.setSiteOnline(siteOnline); //视图库对接稳定性 BigDecimal avgCount = key.startsWith("Province_") ? cityCountAvg : countyCountAvg; Map<String, Object> viewConnectParam = new HashMap<>(); viewConnectParam.put("totalDataSum", stats.totalDataSum); viewConnectParam.put("avgCount", avgCount); BigDecimal viewConnectStability = IndexCalculationUtils.viewConnectStability(viewConnectParam); checkIndexCar.setViewConnectStability(viewConnectStability); return checkIndexCar; } } ycl-server/src/main/java/com/ycl/calculate/FaceSiteOnlineCalculation.java
New file @@ -0,0 +1,149 @@ package com.ycl.calculate; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 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.result.HK.SnapshotDataMonitorResult; import com.ycl.platform.mapper.CheckIndexCarMapper; import com.ycl.platform.mapper.CheckIndexFaceMapper; import com.ycl.platform.service.ICheckIndexCarService; import com.ycl.platform.service.ICheckIndexFaceService; import com.ycl.platform.service.ITMonitorService; import com.ycl.platform.service.impl.CheckIndexFaceServiceImpl; import com.ycl.system.mapper.SysConfigMapper; import com.ycl.system.mapper.SysDeptMapper; import constant.ApiConstants; import constant.CheckConstants; import constant.CheckSnapCountConstants; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import utils.DateUtils; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; /** * 计算人脸点位在线率、视图库对接稳定性 * 获取分省厅、区域的map<k,v> k为deptId或者Province_deptId * 循环map计算点位在线率 * 更新或新增 */ @Component public class FaceSiteOnlineCalculation implements CalculationStrategy<SnapshotDataMonitorResult> { @Autowired private CheckIndexFaceMapper checkIndexFaceMapper; @Autowired private ICheckIndexFaceService checkIndexFaceService; @Autowired private SysConfigMapper sysConfigMapper; @Autowired private ITMonitorService monitorService; //区域人脸点位在线指标的内部类 private static class AreaStats { int totalSites = 0; int offlineSites = 0; int totalDataSum = 0; } @Override public void calculate(List<SnapshotDataMonitorResult> list) { if (CollectionUtils.isEmpty(list)) { return; } Map<String, AreaStats> areaStatsMap = new HashMap<>(); Map<String, TMonitor> monitorMap = monitorService.list(new QueryWrapper<TMonitor>() .in("serial_number", list.stream().map(SnapshotDataMonitorResult::getExternalIndexCode).collect(Collectors.toList()))) .stream().collect(Collectors.toMap(TMonitor::getSerialNumber, Function.identity())); // TODO: 分省厅市局 需要补充集合数据 List<String> provinceIds = new ArrayList<>(); // 这里需要根据点位补充 for (SnapshotDataMonitorResult result : list) { TMonitor monitor = monitorMap.get(result.getExternalIndexCode()); if (monitor == null) continue; String deptId = monitor.getDeptId().toString(); updateAreaStats(areaStatsMap, deptId, result); // 处理省厅数据 if (!CollectionUtils.isEmpty(provinceIds) && provinceIds.contains(monitor.getSerialNumber())) { String provinceKey = "Province_" + deptId; updateAreaStats(areaStatsMap, provinceKey, result); } } //获取2022同期抓拍平均值 省厅、市局 BigDecimal cityCountAvg = getAverageCount(CheckSnapCountConstants.City); BigDecimal countyCountAvg = getAverageCount(CheckSnapCountConstants.County); // 查询今日数据 List<CheckIndexFace> checkIndexFaceList = checkIndexFaceMapper.selectToday(DateUtils.getDate()); List<CheckIndexFace> checkIndexFaces = new ArrayList<>(); areaStatsMap.forEach((deptId, stats) -> { if (stats.totalSites > 0) { CheckIndexFace checkIndexFace = createOrUpdateCheckIndexFace(deptId, stats, cityCountAvg, countyCountAvg, checkIndexFaceList); checkIndexFaces.add(checkIndexFace); } }); checkIndexFaceService.saveOrUpdateBatch(checkIndexFaces); } //累计总点位数、离线数、总抓拍量 private void updateAreaStats(Map<String, AreaStats> areaStatsMap, String key, SnapshotDataMonitorResult result) { //返回对象的引用,如果不存在会放入新的key,value AreaStats stats = areaStatsMap.computeIfAbsent(key, k -> new AreaStats()); stats.totalSites++; if (ApiConstants.HK_SnapCount_ResultType_Null == result.getResultType()) { stats.offlineSites++; } else { stats.totalDataSum += result.getDataCount(); } } //获取2022同期抓拍平均值 private BigDecimal getAverageCount(String configKey) { String count = sysConfigMapper.checkConfigKeyUnique(configKey).getConfigValue(); return new BigDecimal(count).multiply(new BigDecimal(CheckSnapCountConstants.Multiply)) .divide(new BigDecimal(CheckSnapCountConstants.CountyNum), 0, RoundingMode.HALF_UP); } //车辆点位在线率和视图库对接稳定性 private CheckIndexFace createOrUpdateCheckIndexFace(String key, AreaStats stats, BigDecimal cityCountAvg, BigDecimal countyCountAvg, List<CheckIndexFace> checkIndexFaceList) { CheckIndexFace checkIndexFace; // 检查是否已存在今日数据 Optional<CheckIndexFace> existingFace = checkIndexFaceList.stream() .filter(face -> key.equals(face.getDeptId().toString()) && (key.startsWith("Province_") ? CheckConstants.Examine_Tag_City.equals(face.getExamineTag()) : CheckConstants.Examine_Tag_County.equals(face.getExamineTag()))) .findFirst(); if (existingFace.isPresent()) { checkIndexFace = existingFace.get(); } else { checkIndexFace = new CheckIndexFace(); checkIndexFace.setDeptId(key.startsWith("Province_") ? Long.parseLong(key.split("_")[1]) : Long.parseLong(key)); checkIndexFace.setExamineTag(key.startsWith("Province_") ? CheckConstants.Examine_Tag_City : CheckConstants.Examine_Tag_County); checkIndexFace.setCreateTime(new Date()); } // 点位在线率 BigDecimal totalSitesBd = new BigDecimal(stats.totalSites); BigDecimal offlineSitesBd = new BigDecimal(stats.offlineSites); BigDecimal onlineSitesBd = totalSitesBd.subtract(offlineSitesBd); checkIndexFace.setSiteOnline(onlineSitesBd.divide(totalSitesBd, 4, RoundingMode.HALF_UP)); //视图库对接稳定性 BigDecimal avgCount = key.startsWith("Province_") ? cityCountAvg : countyCountAvg; checkIndexFace.setViewConnectStability(new BigDecimal(stats.totalDataSum).divide(avgCount, 4, RoundingMode.HALF_UP)); return checkIndexFace; } } ycl-server/src/main/java/com/ycl/calculate/IndexCalculationUtils.java
New file @@ -0,0 +1,30 @@ package com.ycl.calculate; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.Map; /** * 计算公式 */ public class IndexCalculationUtils { //点位在线率 public static BigDecimal siteOnline(Map<String, Object> param) { BigDecimal totalSitesBd = new BigDecimal((Integer) param.get("totalSites")); BigDecimal offlineSitesBd = new BigDecimal((Integer) param.get("offlineSites")); BigDecimal onlineSitesBd = totalSitesBd.subtract(offlineSitesBd); return onlineSitesBd.divide(totalSitesBd, 4, RoundingMode.HALF_UP); } //视图库对接稳定性 public static BigDecimal viewConnectStability(Map<String, Object> param){ BigDecimal totalDataSum = new BigDecimal((Integer) param.get("totalDataSum")); BigDecimal avgCount = new BigDecimal((Integer) param.get("avgCount")); return totalDataSum.divide(avgCount, 4, RoundingMode.HALF_UP); } } ycl-server/src/main/java/com/ycl/factory/IndexCalculationFactory.java
New file @@ -0,0 +1,19 @@ package com.ycl.factory; import com.ycl.calculate.CalculationStrategy; import com.ycl.calculate.CarSiteOnlineCalculation; import java.util.HashMap; import java.util.Map; public class IndexCalculationFactory { private static final Map<String, CalculationStrategy> calculators = new HashMap<>(); static { calculators.put("siteOnline", new CarSiteOnlineCalculation()); } public static CalculationStrategy getCalculator(String indexName) { return calculators.get(indexName); } } ycl-server/src/main/java/com/ycl/feign/UYClient.java
@@ -1,10 +1,9 @@ package com.ycl.feign; import com.alibaba.fastjson2.JSONObject; import com.ycl.platform.domain.param.UY.CameraParam; import com.ycl.platform.domain.param.UY.OnlineParam; import com.ycl.platform.domain.param.UY.RecordMetaDSumParam; import com.ycl.platform.domain.param.UY.*; 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; @@ -27,7 +26,7 @@ * @return 查询摄像机清单集合 */ @GetMapping("/VIID/Cameras") JSONObject cameraList(@RequestParam CameraParam cameraParam); JSONObject cameraList(@SpringQueryMap CameraParam cameraParam); /** * 点位在线 @@ -36,7 +35,7 @@ * @return 查询在线统计列表 */ @GetMapping("/openapi/v1/report/online/list") JSONObject onlineList(@RequestParam OnlineParam onlineParam); JSONObject onlineList(@SpringQueryMap OnlineParam onlineParam); /** * 录像可用 @@ -50,4 +49,21 @@ @GetMapping("/api/v1/app/osdMonitor/list") JSONObject osdMonitorList(); /** * 图像检测诊断结果 * * @param param * @return */ @GetMapping("/openapi/v1/vqdMonitor/queryVqdResult") JSONObject queryVqdResult(@SpringQueryMap QueryVqdParam param); /** * 视频图像质量 * * @param param * @return */ @GetMapping("/api/v1/app/report/vqd/detail/list") JSONObject queryVqdResult(@SpringQueryMap VideoQualityParam param); } ycl-server/src/main/java/com/ycl/platform/controller/CalculateReportController.java
@@ -1,22 +1,15 @@ package com.ycl.platform.controller; import com.ycl.platform.domain.form.CalculateReportBackfillForm; import com.ycl.platform.domain.param.HK.CoordinateByAreaParam; import com.ycl.system.domain.group.Update; import com.ycl.system.domain.group.Add; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import lombok.RequiredArgsConstructor; import java.util.List; import org.springframework.validation.annotation.Validated; import jakarta.validation.constraints.NotEmpty; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import com.ycl.platform.domain.query.CalculateReportQuery; import com.ycl.platform.service.CalculateReportService; import com.ycl.system.Result; import com.ycl.platform.domain.form.CalculateReportForm; import com.ycl.platform.domain.query.CalculateReportQuery; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; /** @@ -62,4 +55,11 @@ return calculateReportService.updatePublishStatus(reportId); } @PostMapping("/export") @ApiOperation(value = "导出", notes = "导出") @PreAuthorize("@ss.hasPermi('system:calculate:report:export')") public void export(Integer contractId, HttpServletResponse response) { calculateReportService.export(contractId, response); } } ycl-server/src/main/java/com/ycl/platform/controller/VehicleDataMonitorController.java
@@ -30,7 +30,7 @@ /** * 查询卡口过车数据一致性列表 */ @PreAuthorize("@ss.hasPermi('platform:platform:list')") @PreAuthorize("@ss.hasPermi('platform:platform:list')") @GetMapping("/list") public TableDataInfo list(VehicleDataMonitor vehicleDataMonitor) { startPage(); @@ -53,7 +53,7 @@ /** * 获取卡口过车数据一致性详细信息 */ @PreAuthorize("@ss.hasPermi('platform:platform:query')") @PreAuthorize("@ss.hasPermi('platform:platform:query')") @GetMapping(value = "/{id}") public AjaxResult getInfo(@PathVariable("id") Integer id) { return success(vehicleDataMonitorService.selectVehicleDataMonitorById(id)); @@ -62,7 +62,7 @@ /** * 新增卡口过车数据一致性 */ @PreAuthorize("@ss.hasPermi('platform:platform:add')") @PreAuthorize("@ss.hasPermi('platform:platform:add')") @Log(title = "卡口过车数据一致性", businessType = BusinessType.INSERT) @PostMapping public AjaxResult add(@RequestBody VehicleDataMonitor vehicleDataMonitor) { @@ -72,7 +72,7 @@ /** * 修改卡口过车数据一致性 */ @PreAuthorize("@ss.hasPermi('platform:platform:edit')") @PreAuthorize("@ss.hasPermi('platform:platform:edit')") @Log(title = "卡口过车数据一致性", businessType = BusinessType.UPDATE) @PutMapping public AjaxResult edit(@RequestBody VehicleDataMonitor vehicleDataMonitor) { @@ -82,7 +82,7 @@ /** * 删除卡口过车数据一致性 */ @PreAuthorize("@ss.hasPermi('platform:platform:remove')") @PreAuthorize("@ss.hasPermi('platform:platform:remove')") @Log(title = "卡口过车数据一致性", businessType = BusinessType.DELETE) @DeleteMapping("/{ids}") public AjaxResult remove(@PathVariable Integer[] ids) { ycl-server/src/main/java/com/ycl/platform/mapper/CalculateReportMapper.java
@@ -1,16 +1,16 @@ package com.ycl.platform.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.ycl.platform.domain.entity.CalculateReport; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ycl.platform.domain.excel.CalculateExport; import com.ycl.platform.domain.query.CalculateReportQuery; import com.ycl.platform.domain.vo.CalculateRecordVO; import com.ycl.platform.domain.vo.CalculateReportDetailVO; import com.ycl.platform.domain.vo.CalculateReportVO; import com.ycl.platform.domain.form.CalculateReportForm; import java.util.List; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List; /** * 核算报告 Mapper 接口 @@ -37,4 +37,10 @@ * @return */ CalculateReportDetailVO getById(@Param("id") Long id); /** * 导出数据 * @return 数据 */ List<CalculateExport> exportData(Integer contractId); } ycl-server/src/main/java/com/ycl/platform/mapper/CheckIndexFaceMapper.java
@@ -1,20 +1,21 @@ package com.ycl.platform.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ycl.platform.domain.entity.CheckIndexFace; import java.util.List; /** * 人脸指标概率数据Mapper接口 * * * @author ruoyi * @date 2024-04-29 */ public interface CheckIndexFaceMapper public interface CheckIndexFaceMapper extends BaseMapper<CheckIndexFace> { /** * 查询人脸指标概率数据 * * * @param id 人脸指标概率数据主键 * @return 人脸指标概率数据 */ @@ -22,7 +23,7 @@ /** * 查询人脸指标概率数据列表 * * * @param checkIndexFace 人脸指标概率数据 * @return 人脸指标概率数据集合 */ @@ -30,7 +31,7 @@ /** * 新增人脸指标概率数据 * * * @param checkIndexFace 人脸指标概率数据 * @return 结果 */ @@ -38,7 +39,7 @@ /** * 修改人脸指标概率数据 * * * @param checkIndexFace 人脸指标概率数据 * @return 结果 */ @@ -46,7 +47,7 @@ /** * 删除人脸指标概率数据 * * * @param id 人脸指标概率数据主键 * @return 结果 */ @@ -54,9 +55,12 @@ /** * 批量删除人脸指标概率数据 * * * @param ids 需要删除的数据主键集合 * @return 结果 */ public int deleteCheckIndexFaceByIds(Long[] ids); List<CheckIndexFace> selectToday(String date); } ycl-server/src/main/java/com/ycl/platform/mapper/CheckScoreMapper.java
@@ -73,4 +73,5 @@ void saveBatch(List<CheckScore> scoreList); List<CheckScore> selectCheckScoreMap(CheckScore checkScore); } ycl-server/src/main/java/com/ycl/platform/service/CalculateReportService.java
@@ -6,6 +6,8 @@ import com.ycl.system.Result; import com.ycl.platform.domain.form.CalculateReportForm; import com.ycl.platform.domain.query.CalculateReportQuery; import jakarta.servlet.http.HttpServletResponse; import java.util.List; /** @@ -79,4 +81,10 @@ * @return */ Result updatePublishStatus(Long reportId); /** * 导出 * @param response 响应 */ void export(Integer contractId, HttpServletResponse response); } ycl-server/src/main/java/com/ycl/platform/service/ICheckIndexCarService.java
@@ -62,9 +62,4 @@ */ public int deleteCheckIndexCarById(Long id); /** * 计算车辆点位在线率 * @param list */ void siteOnline(List<SnapshotDataMonitorResult> list); } ycl-server/src/main/java/com/ycl/platform/service/ICheckIndexFaceService.java
@@ -1,5 +1,7 @@ package com.ycl.platform.service; import com.baomidou.mybatisplus.extension.service.IService; import com.ycl.platform.domain.entity.CheckIndexCar; import com.ycl.platform.domain.entity.CheckIndexFace; import com.ycl.platform.domain.result.HK.SnapshotDataMonitorResult; @@ -11,7 +13,7 @@ * @author ruoyi * @date 2024-04-29 */ public interface ICheckIndexFaceService public interface ICheckIndexFaceService extends IService<CheckIndexFace> { /** * 查询人脸指标概率数据 @@ -60,11 +62,5 @@ * @return 结果 */ public int deleteCheckIndexFaceById(Long id); /** * 计算人脸点位在线率 * @param list */ void siteOnline(List<SnapshotDataMonitorResult> list); } ycl-server/src/main/java/com/ycl/platform/service/impl/CalculateReportServiceImpl.java
@@ -1,40 +1,37 @@ package com.ycl.platform.service.impl; import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper; import com.alibaba.excel.EasyExcel; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ycl.platform.domain.entity.CalculateRecord; import com.ycl.platform.domain.entity.CalculateReport; import com.ycl.platform.domain.excel.CalculateExport; import com.ycl.platform.domain.form.CalculateReportBackfillForm; import com.ycl.platform.domain.vo.CalculateRecordVO; import com.ycl.platform.domain.form.CalculateReportForm; import com.ycl.platform.domain.query.CalculateReportQuery; import com.ycl.platform.domain.vo.CalculateReportDetailVO; import com.ycl.platform.domain.vo.CalculateReportVO; import com.ycl.platform.mapper.CalculateRecordMapper; import com.ycl.platform.mapper.CalculateReportMapper; import com.ycl.platform.service.CalculateReportService; import com.ycl.system.Result; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ycl.platform.domain.form.CalculateReportForm; import com.ycl.platform.domain.vo.CalculateReportVO; import com.ycl.platform.domain.query.CalculateReportQuery; import java.math.BigDecimal; import java.util.List; import com.ycl.utils.SecurityUtils; import enumeration.general.CalculateReportStatusEnum; import org.apache.commons.lang3.StringUtils; import com.baomidou.mybatisplus.core.metadata.IPage; import com.ycl.system.page.PageUtil; import org.springframework.stereotype.Service; import org.springframework.security.core.context.SecurityContextHolder; import enumeration.general.CalculateReportStatusEnum; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; import java.util.ArrayList; import org.springframework.util.CollectionUtils; import java.math.BigDecimal; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import lombok.RequiredArgsConstructor; import org.springframework.util.CollectionUtils; /** * 核算报告 服务实现类 @@ -198,4 +195,24 @@ baseMapper.updateById(report); return Result.ok("操作成功"); } @Override @SneakyThrows public void export(Integer contractId, HttpServletResponse response) { // 获取数据 List<CalculateExport> list = baseMapper.exportData(contractId); CalculateExport calculateExport = new CalculateExport(); calculateExport.setRuleName("合计"); calculateExport.setNum(list.stream().mapToInt(CalculateExport::getNum).sum()); calculateExport.setScore(list.stream().mapToInt(CalculateExport::getScore).sum()); list.add(calculateExport); // 输出文件 response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setCharacterEncoding("utf-8"); String fileName = URLEncoder.encode("核算报告", StandardCharsets.UTF_8).replace("\\+", "%20"); response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); EasyExcel.write(response.getOutputStream(), CalculateExport.class) .sheet("核算报告") .doWrite(list); } } ycl-server/src/main/java/com/ycl/platform/service/impl/CheckIndexCarServiceImpl.java
@@ -1,34 +1,19 @@ package com.ycl.platform.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ycl.platform.domain.entity.CalculateReport; import com.ycl.calculate.IndexCalculationUtils; import com.ycl.platform.domain.entity.CheckIndexCar; import com.ycl.platform.domain.entity.TMonitor; import com.ycl.platform.domain.result.HK.SnapshotDataMonitorResult; import com.ycl.platform.mapper.CalculateReportMapper; import com.ycl.platform.mapper.CheckIndexCarMapper; import com.ycl.platform.service.ICheckIndexCarService; import com.ycl.platform.service.ITMonitorService; import com.ycl.system.domain.SysConfig; import com.ycl.system.entity.SysDept; import com.ycl.system.mapper.SysConfigMapper; import com.ycl.system.mapper.SysDeptMapper; import constant.ApiConstants; import constant.CheckConstants; import constant.CheckSnapCountConstants; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import utils.DateUtils; import java.math.BigDecimal; import java.math.RoundingMode; import java.text.SimpleDateFormat; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; /** * 车辆指标概率数据Service业务层处理 @@ -47,7 +32,6 @@ private ITMonitorService monitorService; @Autowired private SysDeptMapper deptMapper; /** * 查询车辆指标概率数据 * @@ -114,116 +98,4 @@ public int deleteCheckIndexCarById(Long id) { return checkIndexCarMapper.deleteCheckIndexCarById(id); } /** * 计算车辆点位在线率、视图库对接稳定性 * 获取分省厅、区域的map<k,v> k为deptId或者Province_deptId * 循环map计算点位在线率 * 更新或新增 * * @param list */ //TODO:任务顺序需要排在一机一档之后 @Override public void siteOnline(List<SnapshotDataMonitorResult> list) { if (CollectionUtils.isEmpty(list)) { return; } Map<String, AreaStats> areaStatsMap = new HashMap<>(); Map<String, TMonitor> monitorMap = monitorService.list(new QueryWrapper<TMonitor>() .in("serial_number", list.stream().map(SnapshotDataMonitorResult::getExternalIndexCode).collect(Collectors.toList()))) .stream().collect(Collectors.toMap(TMonitor::getSerialNumber, Function.identity())); // TODO: 分省厅市局 需要补充集合数据 List<String> provinceIds = new ArrayList<>(); // 这里需要根据点位补充 for (SnapshotDataMonitorResult result : list) { TMonitor monitor = monitorMap.get(result.getExternalIndexCode()); if (monitor == null) continue; String deptId = monitor.getDeptId().toString(); updateAreaStats(areaStatsMap, deptId, result); // 处理省厅数据 if (!CollectionUtils.isEmpty(provinceIds) && provinceIds.contains(monitor.getSerialNumber())) { String provinceKey = "Province_" + deptId; updateAreaStats(areaStatsMap, provinceKey, result); } } //获取2022同期抓拍平均值 省厅、市局 BigDecimal cityCountAvg = getAverageCount(CheckSnapCountConstants.City); BigDecimal countyCountAvg = getAverageCount(CheckSnapCountConstants.County); // 查询今日数据 List<CheckIndexCar> checkIndexCarList = checkIndexCarMapper.selectToday(DateUtils.getDate()); List<CheckIndexCar> checkIndexCars = new ArrayList<>(); areaStatsMap.forEach((deptId, stats) -> { if (stats.totalSites > 0) { CheckIndexCar checkIndexCar = createOrUpdateCheckIndexCar(deptId, stats, cityCountAvg, countyCountAvg, checkIndexCarList); checkIndexCars.add(checkIndexCar); } }); saveOrUpdateBatch(checkIndexCars); } //累计总点位数、离线数、总抓拍量 private void updateAreaStats(Map<String, AreaStats> areaStatsMap, String key, SnapshotDataMonitorResult result) { //返回对象的引用,如果不存在会放入新的key,value AreaStats stats = areaStatsMap.computeIfAbsent(key, k -> new AreaStats()); stats.totalSites++; if (ApiConstants.HK_SnapCount_ResultType_Null == result.getResultType()) { stats.offlineSites++; } else { stats.totalDataSum += result.getDataCount(); } } //获取2022同期抓拍平均值 private BigDecimal getAverageCount(String configKey) { String count = sysConfigMapper.checkConfigKeyUnique(configKey).getConfigValue(); return new BigDecimal(count).multiply(new BigDecimal(CheckSnapCountConstants.Multiply)) .divide(new BigDecimal(CheckSnapCountConstants.CountyNum), 0, RoundingMode.HALF_UP); } //车辆点位在线率和视图库对接稳定性 private CheckIndexCar createOrUpdateCheckIndexCar(String key, AreaStats stats, BigDecimal cityCountAvg, BigDecimal countyCountAvg, List<CheckIndexCar> checkIndexCarList) { CheckIndexCar checkIndexCar; // 检查是否已存在今日数据 Optional<CheckIndexCar> existingCar = checkIndexCarList.stream() .filter(car -> key.equals(car.getDeptId().toString()) && (key.startsWith("Province_") ? CheckConstants.Examine_Tag_City.equals(car.getExamineTag()) : CheckConstants.Examine_Tag_County.equals(car.getExamineTag()))) .findFirst(); if (existingCar.isPresent()) { checkIndexCar = existingCar.get(); } else { checkIndexCar = new CheckIndexCar(); checkIndexCar.setDeptId(key.startsWith("Province_") ? Long.parseLong(key.split("_")[1]) : Long.parseLong(key)); checkIndexCar.setExamineTag(key.startsWith("Province_") ? CheckConstants.Examine_Tag_City : CheckConstants.Examine_Tag_County); checkIndexCar.setCreateTime(new Date()); } // 点位在线率 BigDecimal totalSitesBd = new BigDecimal(stats.totalSites); BigDecimal offlineSitesBd = new BigDecimal(stats.offlineSites); BigDecimal onlineSitesBd = totalSitesBd.subtract(offlineSitesBd); checkIndexCar.setSiteOnline(onlineSitesBd.divide(totalSitesBd, 4, RoundingMode.HALF_UP)); //视图库对接稳定性 BigDecimal avgCount = key.startsWith("Province_") ? cityCountAvg : countyCountAvg; checkIndexCar.setViewConnectStability(new BigDecimal(stats.totalDataSum).divide(avgCount, 4, RoundingMode.HALF_UP)); return checkIndexCar; } //区域车辆点位在线指标的内部类 private static class AreaStats { int totalSites = 0; int offlineSites = 0; int totalDataSum = 0; } } ycl-server/src/main/java/com/ycl/platform/service/impl/CheckIndexFaceServiceImpl.java
@@ -1,14 +1,30 @@ package com.ycl.platform.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 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.result.HK.SnapshotDataMonitorResult; import com.ycl.platform.mapper.CheckIndexCarMapper; import com.ycl.platform.mapper.CheckIndexFaceMapper; import com.ycl.platform.service.ICheckIndexFaceService; import com.ycl.platform.service.ITMonitorService; import com.ycl.system.mapper.SysConfigMapper; import com.ycl.system.mapper.SysDeptMapper; import constant.ApiConstants; import constant.CheckConstants; import constant.CheckSnapCountConstants; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import utils.DateUtils; import java.util.List; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; /** * 人脸指标概率数据Service业务层处理 @@ -17,10 +33,15 @@ * @date 2024-04-29 */ @Service public class CheckIndexFaceServiceImpl implements ICheckIndexFaceService { public class CheckIndexFaceServiceImpl extends ServiceImpl<CheckIndexFaceMapper, CheckIndexFace> implements ICheckIndexFaceService { @Autowired private CheckIndexFaceMapper checkIndexFaceMapper; @Autowired private SysConfigMapper sysConfigMapper; @Autowired private ITMonitorService monitorService; @Autowired private SysDeptMapper deptMapper; /** * 查询人脸指标概率数据 * @@ -88,13 +109,7 @@ return checkIndexFaceMapper.deleteCheckIndexFaceById(id); } /** * 计算人脸点位在线率 * * @param list */ @Override public void siteOnline(List<SnapshotDataMonitorResult> list) { } } ycl-server/src/main/java/com/ycl/platform/service/impl/CheckScoreServiceImpl.java
@@ -2,8 +2,6 @@ import annotation.DataScope; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ycl.platform.base.BaseSelect; import com.ycl.platform.base.CheckIndex; import com.ycl.platform.domain.dto.CheckScoreDTO; import com.ycl.platform.domain.dto.CheckScoreIndexDTO; import com.ycl.platform.domain.dto.ScoreIndexDTO; @@ -17,14 +15,11 @@ import com.ycl.platform.service.ICheckIndexFaceService; import com.ycl.platform.service.ICheckIndexVideoService; import com.ycl.platform.service.ICheckScoreService; import com.ycl.system.Result; import com.ycl.system.entity.SysRole; import com.ycl.system.service.ISysDeptService; import com.ycl.utils.DateUtils; import com.ycl.utils.SecurityUtils; import com.ycl.utils.StringUtils; import com.ycl.utils.poi.ExcelUtil; import constant.CheckConstants; import enumeration.general.CheckScoreType; import enumeration.general.PublishType; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; @@ -32,16 +27,13 @@ import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import pojo.ExcelExp; import utils.DateUtils; import utils.poi.ExcelUtilManySheet; import java.io.IOException; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; /** * 考核积分明细Service业务层处理 @@ -137,21 +129,24 @@ //区县只能看已发布 roleControl(checkScore); //查询成绩 String date = checkScore.getDate(); if(StringUtils.isEmpty(date)){ //如果为空查本月的数据 Calendar now = Calendar.getInstance(); //取昨天 now.add(Calendar.DATE, -1); Date yesterday = now.getTime(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM"); date = simpleDateFormat.format(yesterday); checkScore.setDate(date); // 获取数据日期时间 Calendar calendar = Calendar.getInstance(); // 一号查询之前的数据 if (LocalDateTime.now().getDayOfMonth() == 1) { calendar.add(Calendar.DAY_OF_MONTH, -1); } // 0 省厅月度 1 市局月度 2 省厅季度 3 市局季度 switch (checkScore.getExamineTag()) { case 0, 1: checkScore.setEndDate(calendar.getTime()); calendar.set(Calendar.DAY_OF_MONTH, 1); checkScore.setStartDate(calendar.getTime()); break; case 2, 3: checkScore.setStartDate(DateUtils.getQuarterStart(calendar).getTime()); checkScore.setEndDate(DateUtils.getQuarterEnd(calendar).getTime()); checkScore.setExamineTag(checkScore.getExamineTag() == 2 ? 0 : 1); break; } List<CheckScore> checkScores = scoreMapper.selectCheckScoreList(checkScore); Map<Long, List<CheckScore>> deptMap = checkScores.stream().collect(Collectors.groupingBy(CheckScore::getDeptId)); return deptMap; return scoreMapper.selectCheckScoreMap(checkScore).stream().collect(Collectors.groupingBy(CheckScore::getDeptId)); } ycl-server/src/main/java/com/ycl/task/HKTask.java
@@ -1,26 +1,25 @@ package com.ycl.task; import com.alibaba.fastjson2.JSONObject; import com.ycl.platform.domain.param.HK.FaceDeviceInspectionParam; import com.ycl.platform.domain.param.HK.SnapshotDataMonitorParam; import com.ycl.platform.domain.param.HK.VehicleDeviceInspectionParam; import com.ycl.platform.domain.result.HK.BaseResult; import com.ycl.platform.domain.result.HK.FaceDeviceInspectionResult; import com.ycl.platform.domain.result.HK.SnapshotDataMonitorResult; import com.ycl.platform.domain.result.HK.VehicleDeviceInspectionResult; import com.mongodb.client.result.DeleteResult; import com.ycl.platform.domain.param.HK.*; import com.ycl.platform.domain.result.BaseResult; import com.ycl.platform.domain.result.HK.*; import com.ycl.platform.service.ICheckIndexCarService; import com.ycl.platform.service.ICheckIndexFaceService; import com.ycl.platform.service.ICheckIndexVideoService; import com.ycl.platform.service.IYwThresholdService; import com.ycl.utils.DateUtils; import constant.ApiConstants; import com.ycl.feign.HKClient; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; @@ -43,13 +42,16 @@ private ICheckIndexVideoService checkIndexVideoService; //车辆设备全检指标监测结果 public void VehicleDeviceInspectionTask() { public void vehicleDeviceInspectionTask() { log.info("开始执行车辆设备全检指标监测结果数据同步"); VehicleDeviceInspectionParam param = new VehicleDeviceInspectionParam(); param.setPageNO(ApiConstants.pageNo).setPageSize(ApiConstants.pageSize).setDate(getToday()); param.setPageNO(ApiConstants.pageNo).setPageSize(ApiConstants.pageSize).setDate(DateUtils.getDate()); JSONObject jsonObject = hkClient.VehicleDeviceInspection(param); List<VehicleDeviceInspectionResult> list = getDataList(jsonObject, VehicleDeviceInspectionResult.class, "车辆设备全检指标监测结果数据为空"); if (!CollectionUtils.isEmpty(list)) { //如果存在之前的数据先删除 Query query = new Query(Criteria.where("createTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date()))); DeleteResult result = mongoTemplate.remove(query, VehicleDeviceInspectionResult.class); //存放在mongo中 mongoTemplate.insert(list); //同步的数据进行工单阈值处理 @@ -59,16 +61,20 @@ } //人脸设备全检指标监测结果 public void FaceDeviceInspectionTask() { public void faceDeviceInspectionTask() { log.info("开始执行人脸设备全检指标监测结果数据同步"); FaceDeviceInspectionParam param = new FaceDeviceInspectionParam(); param.setPageNO(ApiConstants.pageNo).setPageSize(ApiConstants.pageSize).setDate(getToday()); param.setPageNO(ApiConstants.pageNo).setPageSize(ApiConstants.pageSize).setDate(DateUtils.getDate()); JSONObject jsonObject = hkClient.FaceDeviceInspection(param); List<FaceDeviceInspectionResult> list = getDataList(jsonObject, FaceDeviceInspectionResult.class, "人脸设备全检指标监测结果数据为空"); if (!CollectionUtils.isEmpty(list)) { //如果存在之前的数据先删除 Query query = new Query(Criteria.where("createTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date()))); DeleteResult result = mongoTemplate.remove(query, FaceDeviceInspectionResult.class); //存放在mongo中 mongoTemplate.insert(list); //同步的数据进行工单阈值处理 //TODO:可能有重复工单 ywThresholdService.faceCheck(list); } log.info("结束人脸设备全检指标监测结果数据同步"); @@ -76,79 +82,221 @@ //抓拍数据量监测结果 public void SnapshotDataMonitorTask() { public void snapshotDataMonitorTask() { log.info("开始执行抓拍数据量检测结果数据同步"); /** 车辆数据 */ SnapshotDataMonitorParam carParam = new SnapshotDataMonitorParam(); carParam.setPageNO(ApiConstants.pageNo).setPageSize(ApiConstants.pageSize).setDate(getToday()).setDataType(ApiConstants.HK_DATATYPE_CAR); carParam.setPageNO(ApiConstants.pageNo).setPageSize(ApiConstants.pageSize).setDate(DateUtils.getDate()).setDataType(ApiConstants.HK_DATATYPE_CAR); JSONObject carJsonObject = hkClient.SnapshotDataMonitor(carParam); List<SnapshotDataMonitorResult> carList = getDataList(carJsonObject, SnapshotDataMonitorResult.class, "车辆抓拍数据量检测结果数据"); if (!CollectionUtils.isEmpty(carList)) { //如果今天存在之前的数据先删除 Query query = new Query(Criteria .where("createTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date())) .and("dataType").is(ApiConstants.HK_DATATYPE_CAR)); DeleteResult result = mongoTemplate.remove(query, SnapshotDataMonitorResult.class); //存放在mongo中 carList.forEach(item -> item.setDataType(ApiConstants.HK_DATATYPE_CAR)); mongoTemplate.insert(carList); //TODO:车辆点位在线率 checkIndexCarService.siteOnline(carList); } /** 人脸数据 */ SnapshotDataMonitorParam faceParam = new SnapshotDataMonitorParam(); faceParam.setPageNO(ApiConstants.pageNo).setPageSize(ApiConstants.pageSize).setDate(getToday()).setDataType(ApiConstants.HK_DATATYPE_FACE); faceParam.setPageNO(ApiConstants.pageNo).setPageSize(ApiConstants.pageSize).setDate(DateUtils.getDate()).setDataType(ApiConstants.HK_DATATYPE_FACE); JSONObject faceJsonObject = hkClient.SnapshotDataMonitor(carParam); List list = getDataList(faceJsonObject, SnapshotDataMonitorResult.class, "人脸抓拍数据量检测结果数据为空"); if (!CollectionUtils.isEmpty(list)) { List<SnapshotDataMonitorResult> faceList = getDataList(faceJsonObject, SnapshotDataMonitorResult.class, "人脸抓拍数据量检测结果数据为空"); if (!CollectionUtils.isEmpty(faceList)) { //如果今天存在之前的数据先删除 Query query = new Query(Criteria .where("createTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date())) .and("dataType").is(ApiConstants.HK_DATATYPE_FACE)); DeleteResult result = mongoTemplate.remove(query, SnapshotDataMonitorResult.class); //存放在mongo中 mongoTemplate.insert(list); //TODO:人脸点位在线率 checkIndexFaceService.siteOnline(list); carList.forEach(item -> item.setDataType(ApiConstants.HK_DATATYPE_FACE)); mongoTemplate.insert(faceList); } //TODO:工单 log.info("结束抓拍数据量检测结果数据同步"); } //一机一档 public void task2() { //联网卡口设备目录一致率 //采集设备属性监测结果(人脸) public void monitorDetailTask() { log.info("开始执行采集设备属性监测结果数据同步"); //人脸卡口信息采集准确率 MonitoringDetailParam param = new MonitoringDetailParam(); param.setPageNO(ApiConstants.pageNo).setPageSize(ApiConstants.pageSize).setDate(DateUtils.getDate()); JSONObject jsonObject = hkClient.monitorDetail(param); List<MonitoringDetailResult> faceList = getDataList(jsonObject, MonitoringDetailResult.class, "采集设备属性监测结果数据为空"); if (!CollectionUtils.isEmpty(faceList)) { //如果今天存在之前的数据先删除 Query query = new Query(Criteria .where("createTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date()))); DeleteResult result = mongoTemplate.remove(query, MonitoringDetailResult.class); //存放在mongo中 mongoTemplate.insert(faceList); } //TODO:工单处理 log.info("结束采集设备属性监测结果数据同步"); } //卡口属性监测结果 public void task3() { public void crossDetailTask() { log.info("开始执行卡口属性监测结果数据同步"); //车辆卡口信息采集准确率 CrossDetailParam param = new CrossDetailParam(); param.setPageNO(ApiConstants.pageNo).setPageSize(ApiConstants.pageSize).setDate(DateUtils.getDate()); JSONObject jsonObject = hkClient.crossDetail(param); List<CrossDetailResult> faceList = getDataList(jsonObject, CrossDetailResult.class, "卡口属性监测结果数据为空"); if (!CollectionUtils.isEmpty(faceList)) { //如果今天存在之前的数据先删除 Query query = new Query(Criteria .where("createTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date()))); DeleteResult result = mongoTemplate.remove(query, CrossDetailResult.class); //存放在mongo中 mongoTemplate.insert(faceList); } //TODO:工单处理 log.info("结束卡口属性监测结果数据同步"); } //数据完整性监测结果 public void task4() { public void dataIntegrityMonitoringTask() { log.info("开始执行数据完整性监测结果数据同步"); //车辆卡口设备抓拍数据完整性 DataIntegrityMonitoringParam param = new DataIntegrityMonitoringParam(); param.setPageNO(ApiConstants.pageNo).setPageSize(ApiConstants.pageSize).setDate(DateUtils.getDate()).setDataType(ApiConstants.HK_DATATYPE_CAR); JSONObject jsonObject = hkClient.DataIntegrityMonitoring(param); List<DataIntegrityMonitoringResult> faceList = getDataList(jsonObject, DataIntegrityMonitoringResult.class, "数据完整性监测结果数据为空"); if (!CollectionUtils.isEmpty(faceList)) { //如果今天存在之前的数据先删除 Query query = new Query(Criteria .where("createTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date()))); DeleteResult result = mongoTemplate.remove(query, DataIntegrityMonitoringResult.class); //存放在mongo中 mongoTemplate.insert(faceList); } //TODO:工单处理 log.info("结束数据完整性监测结果数据同步"); } //属性识别准确监测结果 public void task5() { //车辆卡口设备抓拍数据完整性 } public void attrRecognitionMonitorTask() { log.info("开始执行属性识别准确监测结果数据同步"); //车辆卡口设备抓拍数据准确性 AttrRecognitionParam param = new AttrRecognitionParam(); param.setPageNO(ApiConstants.pageNo).setPageSize(ApiConstants.pageSize).setDate(DateUtils.getDate()).setDataType(ApiConstants.HK_DATATYPE_CAR); JSONObject jsonObject = hkClient.AttrRecognitionMonitor(param); List<AttrRecognitionMonitorResult> faceList = getDataList(jsonObject, AttrRecognitionMonitorResult.class, "属性识别准确监测结果数据为空"); if (!CollectionUtils.isEmpty(faceList)) { //如果今天存在之前的数据先删除 Query query = new Query(Criteria .where("createTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date()))); DeleteResult result = mongoTemplate.remove(query, AttrRecognitionMonitorResult.class); //存放在mongo中 mongoTemplate.insert(faceList); } //TODO:工单处理 log.info("结束属性识别准确监测结果数据同步"); //车辆设备全检指标监测结果 public void task6() { //车辆卡口设备时钟准确性 } //抓拍数据时延监测结果 public void task7() { public void snapshopDelayMonitorTask() { log.info("开始执行抓拍数据时延监测结果数据同步"); //车辆卡口设备抓拍数据上传及时性 /** 车辆数据 */ SnapshotDelayMonitorParam carParam = new SnapshotDelayMonitorParam(); carParam.setPageNO(ApiConstants.pageNo).setPageSize(ApiConstants.pageSize).setDate(DateUtils.getDate()).setDataType(ApiConstants.HK_DATATYPE_CAR); JSONObject carJsonObject = hkClient.SnapshotDelayMonitor(carParam); List<SnapshotDelayMonitorResult> carList = getDataList(carJsonObject, SnapshotDelayMonitorResult.class, "车辆抓拍数据量检测结果数据"); if (!CollectionUtils.isEmpty(carList)) { //如果今天存在之前的数据先删除 Query query = new Query(Criteria .where("createTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date())) .and("dataType").is(ApiConstants.HK_DATATYPE_CAR)); DeleteResult result = mongoTemplate.remove(query, SnapshotDataMonitorResult.class); //存放在mongo中 carList.forEach(item -> item.setDataType(ApiConstants.HK_DATATYPE_CAR)); mongoTemplate.insert(carList); } /** 人脸数据 */ SnapshotDelayMonitorParam faceParam = new SnapshotDelayMonitorParam(); faceParam.setPageNO(ApiConstants.pageNo).setPageSize(ApiConstants.pageSize).setDate(DateUtils.getDate()).setDataType(ApiConstants.HK_DATATYPE_FACE); JSONObject faceJsonObject = hkClient.SnapshotDelayMonitor(faceParam); List<SnapshotDelayMonitorParam> faceList = getDataList(faceJsonObject, SnapshotDelayMonitorParam.class, "人脸抓拍数据量检测结果数据为空"); if (!CollectionUtils.isEmpty(faceList)) { //如果今天存在之前的数据先删除 Query query = new Query(Criteria .where("createTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date())) .and("dataType").is(ApiConstants.HK_DATATYPE_FACE)); DeleteResult result = mongoTemplate.remove(query, SnapshotDataMonitorResult.class); //存放在mongo中 carList.forEach(item -> item.setDataType(ApiConstants.HK_DATATYPE_FACE)); mongoTemplate.insert(faceList); } //TODO:工单 log.info("结束抓拍数据时延监测结果数据同步"); } //图片访问监测结果 public void task8() { //车辆卡口信息采集准确率 //车辆卡口设备url可用性 public void PicAccessTask() { log.info("开始执行图片访问监测结果数据同步"); //车辆卡口信息采集准确率、车辆卡口设备url可用性 PicAccessParam param = new PicAccessParam(); param.setPageNO(ApiConstants.pageNo).setPageSize(ApiConstants.pageSize).setDate(DateUtils.getDate()).setDataType(ApiConstants.HK_DATATYPE_CAR); JSONObject jsonObject = hkClient.PicAccessMonitor(param); List<PicAccessResult> faceList = getDataList(jsonObject, PicAccessResult.class, "图片访问监测结果数据为空"); if (!CollectionUtils.isEmpty(faceList)) { //如果今天存在之前的数据先删除 Query query = new Query(Criteria .where("createTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date()))); DeleteResult result = mongoTemplate.remove(query, PicAccessResult.class); //存放在mongo中 mongoTemplate.insert(faceList); } //TODO:工单处理 log.info("结束图片访问监测结果数据同步"); } //获取当前日期 private String getToday() { Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); String today = sdf.format(date); return today; //人脸设备抽检指标监测结果 public void Face() { log.info("开始执行人脸设备抽检指标监测结果数据同步"); //车辆卡口信息采集准确率、车辆卡口设备url可用性 FaceDeviceSamplingParam param = new FaceDeviceSamplingParam(); param.setPageNO(ApiConstants.pageNo).setPageSize(ApiConstants.pageSize).setDate(DateUtils.getDate()); JSONObject jsonObject = hkClient.FaceDeviceSampling(param); List<FaceDeviceSamplingResult> faceList = getDataList(jsonObject, FaceDeviceSamplingResult.class, "人脸设备抽检指标监测结果数据为空"); if (!CollectionUtils.isEmpty(faceList)) { //如果今天存在之前的数据先删除 Query query = new Query(Criteria .where("createTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date()))); DeleteResult result = mongoTemplate.remove(query, PicAccessResult.class); //存放在mongo中 mongoTemplate.insert(faceList); } //TODO:工单处理 log.info("结束人脸设备抽检指标监测结果数据同步"); } //车辆设备抽检指标监测结果 public void FaceDeviceSamplingTask() { log.info("开始执行车辆设备抽检指标监测结果数据同步"); //车辆卡口信息采集准确率、车辆卡口设备url可用性 FaceDeviceSamplingParam param = new FaceDeviceSamplingParam(); param.setPageNO(ApiConstants.pageNo).setPageSize(ApiConstants.pageSize).setDate(DateUtils.getDate()); JSONObject jsonObject = hkClient.FaceDeviceSampling(param); List<FaceDeviceSamplingResult> faceList = getDataList(jsonObject, FaceDeviceSamplingResult.class, "人脸设备抽检指标监测结果数据为空"); if (!CollectionUtils.isEmpty(faceList)) { //如果今天存在之前的数据先删除 Query query = new Query(Criteria .where("createTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date()))); DeleteResult result = mongoTemplate.remove(query, PicAccessResult.class); //存放在mongo中 mongoTemplate.insert(faceList); } //TODO:工单处理 log.info("结束人脸设备抽检指标监测结果数据同步"); } //解析数据 ycl-server/src/main/java/com/ycl/task/UYTask.java
@@ -1,5 +1,6 @@ package com.ycl.task; import com.ycl.platform.domain.param.UY.OnlineParam; import com.ycl.platform.service.IYwThresholdService; import com.ycl.feign.UYClient; import lombok.extern.slf4j.Slf4j; @@ -49,8 +50,12 @@ } //图像监测诊断结果 public void task2() { public void queryVqdResultTask() { //点位在线率 log.info("开始执行图像监测诊断结果数据同步"); log.info("结束执行图像监测诊断结果数据同步"); } //录像可用 @@ -58,10 +63,5 @@ //录像可用率 } private String getToday() { Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); String today = sdf.format(date); return today; } } ycl-server/src/main/java/com/ycl/utils/DateUtils.java
@@ -8,6 +8,7 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.*; import java.util.Calendar; import java.util.Date; import java.util.Objects; @@ -227,4 +228,34 @@ LocalDateTime of = LocalDateTime.of(localDateTime.getYear(), localDateTime.getMonth(), localDateTime.getDayOfMonth(), 23, 59, 59); return Timestamp.valueOf(of); } /** * 获取指定Calendar的季度开始日期 * @param calendar 日历 * @return 季度第一天 */ public static Calendar getQuarterStart(Calendar calendar) { Calendar quarterStart = (Calendar) calendar.clone(); // 设置为当前季度的第一个月的第一天 quarterStart.set(Calendar.DAY_OF_MONTH, 1); int month = quarterStart.get(Calendar.MONTH); quarterStart.set(Calendar.MONTH, (month / 3) * 3); return quarterStart; } /** * 获取指定Calendar的季度结束日期 * @param calendar 日历 * @return 季度最后一天 */ public static Calendar getQuarterEnd(Calendar calendar) { Calendar quarterEnd = getQuarterStart(calendar); // 将月份设置为下一个季度的第一个月 quarterEnd.add(Calendar.MONTH, 3); // 设置为那个月的最后一天 quarterEnd.add(Calendar.DAY_OF_MONTH, -1); return quarterEnd; } } ycl-server/src/main/resources/mapper/zgyw/CalculateReportMapper.xml
@@ -20,6 +20,7 @@ <select id="page" resultMap="BaseResultMap"> SELECT tcr.contract_id, tyu.unit_name, tc.name, tcr.id, @@ -99,4 +100,14 @@ WHERE tcr.id = #{id} </select> <select id="exportData" resultType="com.ycl.platform.domain.excel.CalculateExport"> SELECT SUBSTRING_INDEX(rule_name, '/', 1) AS rule_name, COUNT(*) AS num, -SUM(score) AS score FROM t_contract_score WHERE contract_id = #{contractId} AND auditing_status = 'PASS' AND deleted = 0 GROUP BY SUBSTRING_INDEX(rule_name, '/', 1) </select> </mapper> ycl-server/src/main/resources/mapper/zgyw/CheckIndexFaceMapper.xml
@@ -3,7 +3,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ycl.platform.mapper.CheckIndexFaceMapper"> <resultMap type="com.ycl.platform.domain.entity.CheckIndexFace" id="CheckIndexFaceResult"> <result property="id" column="id" /> <result property="deptId" column="dept_id" /> @@ -26,7 +26,7 @@ <select id="selectCheckIndexFaceList" resultMap="CheckIndexFaceResult"> select tcif.*,sd.dept_name from t_check_index_face tcif left join sys_dept sd on tcif.dept_id = sd.dept_id <where> <where> <if test="deptId != null "> and tcif.dept_id = #{deptId}</if> <if test="examineTag != null "> and examine_tag = #{examineTag}</if> <if test="date != null "> and date_format(tcif.create_time,'%Y-%m') = #{date}</if> @@ -46,12 +46,12 @@ </if> </where> </select> <select id="selectCheckIndexFaceById" resultMap="CheckIndexFaceResult"> <include refid="selectCheckIndexFaceVo"/> where id = #{id} </select> <insert id="insertCheckIndexFace" useGeneratedKeys="true" keyProperty="id"> insert into t_check_index_face <trim prefix="(" suffix=")" suffixOverrides=","> @@ -105,9 +105,13 @@ </delete> <delete id="deleteCheckIndexFaceByIds" > delete from t_check_index_face where id in delete from t_check_index_face where id in <foreach item="id" collection="array" open="(" separator="," close=")"> #{id} </foreach> </delete> </mapper> <select id="selectToday"> select * from t_check_index_car where DATE(create_time) = #{today} </select> </mapper> ycl-server/src/main/resources/mapper/zgyw/CheckScoreMapper.xml
@@ -114,4 +114,23 @@ (#{score.score},#{score.deptId},#{score.templateId},#{score.examineTag},#{score.examineCategory},#{score.createTime}) </foreach> </insert> <select id="selectCheckScoreMap" resultType="com.ycl.platform.domain.entity.CheckScore"> SELECT tcs.dept_id, examine_category, AVG(score) AS score, #{startDate} AS startDate, #{endDate} AS endDate FROM t_check_score tcs LEFT JOIN sys_dept d ON tcs.dept_id = d.dept_id WHERE examine_tag = #{examineTag} AND tcs.create_time BETWEEN #{startDate} AND #{endDate} GROUP BY tcs.dept_id, examine_category </select> </mapper>