xiangpei
2024-07-31 f63535115eff538f30b1004faf90a428ebdca963
Merge remote-tracking branch 'origin/master'

# Conflicts:
# ycl-pojo/src/main/java/com/ycl/platform/domain/result/UY/OneMachineFileResult.java
40个文件已修改
10个文件已添加
1 文件已重命名
1712 ■■■■ 已修改文件
ycl-pojo/src/main/java/com/ycl/platform/domain/entity/CheckScore.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/excel/CalculateExport.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/param/UY/QueryVqdParam.java 136 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/param/UY/VideoQualityParam.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/result/BaseResult.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/AttrRecognitionMonitorResult.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/CarDetectResult.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/CodeByAreaResult.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/CoordinateByAreaResult.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/CriteriaResult.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/CrossDetailResult.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/DataIntegrityMonitoringResult.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/FaceDetectResult.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/FaceDeviceInspectionResult.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/FaceDeviceSamplingResult.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/MonitorResourceResult.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/MonitoringDetailResult.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/OrganizationTreeResult.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/PicAccessResult.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/SnapshotDataMonitorResult.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/SnapshotDelayMonitorResult.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/VehicleDeviceInspectionResult.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/VehicleDeviceSamplingResult.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/result/UY/OnlineResult.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/result/UY/QueryVqdResult.java 246 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/result/UY/RecordMetaDSumResult.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/result/UY/VideoQualityResult.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/calculate/CalculationStrategy.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/calculate/CarSiteOnlineCalculation.java 146 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/calculate/FaceSiteOnlineCalculation.java 149 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/calculate/IndexCalculationUtils.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/factory/IndexCalculationFactory.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/feign/UYClient.java 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/controller/CalculateReportController.java 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/controller/VehicleDataMonitorController.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/mapper/CalculateReportMapper.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/mapper/CheckIndexFaceMapper.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/mapper/CheckScoreMapper.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/service/CalculateReportService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/service/ICheckIndexCarService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/service/ICheckIndexFaceService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/service/impl/CalculateReportServiceImpl.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/service/impl/CheckIndexCarServiceImpl.java 130 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/service/impl/CheckIndexFaceServiceImpl.java 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/service/impl/CheckScoreServiceImpl.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/task/HKTask.java 240 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/task/UYTask.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/utils/DateUtils.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/resources/mapper/zgyw/CalculateReportMapper.xml 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/resources/mapper/zgyw/CheckIndexFaceMapper.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/resources/mapper/zgyw/CheckScoreMapper.xml 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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>