From 66544379029bdc7ecce13e6b3a32b59be1527495 Mon Sep 17 00:00:00 2001
From: xiangpei <xiangpei@timesnew.cn>
Date: 星期四, 01 八月 2024 18:23:10 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 ycl-common/src/main/java/constant/RedisConstant.java                                   |    6 
 ycl-server/src/main/java/com/ycl/calculate/FaceSiteOnlineCalculation.java              |   33 
 ycl-server/src/main/java/com/ycl/calculate/FaceInFoAccuracyCalculation.java            |  132 ++++++
 ycl-server/src/main/java/com/ycl/task/CarTask.java                                     |   31 +
 ycl-server/src/main/java/com/ycl/feign/UYClient.java                                   |    2 
 ycl-common/src/main/java/constant/ApiConstants.java                                    |   28 +
 ycl-server/src/main/java/com/ycl/calculate/CarSiteOnlineCalculation.java               |   15 
 ycl-common/src/main/java/constant/CalculationStrategyConstants.java                    |   18 
 ycl-server/src/main/java/com/ycl/calculate/CarInFoAccuracyCalculation.java             |  136 ++++++
 ycl-server/src/main/java/com/ycl/calculate/FaceSnapshotDelayCalculation.java           |  136 ++++++
 ycl-pojo/src/main/java/com/ycl/platform/domain/entity/TMonitor.java                    |   49 --
 ycl-server/src/main/java/com/ycl/platform/service/impl/CalculateReportServiceImpl.java |    2 
 ycl-server/src/main/java/com/ycl/platform/service/impl/WorkOrderServiceImpl.java       |   51 +-
 ycl-server/src/main/java/com/ycl/task/MonitorTask.java                                 |   88 ++++
 ycl-server/src/main/java/com/ycl/platform/service/impl/YwPointServiceImpl.java         |   41 
 ycl-server/src/main/resources/mapper/zgyw/TMonitorMapper.xml                           |   60 +-
 ycl-pojo/src/main/java/com/ycl/platform/domain/entity/YwPoint.java                     |   15 
 ycl-server/src/main/java/com/ycl/platform/service/impl/CheckIndexCarServiceImpl.java   |    1 
 ycl-server/src/main/java/com/ycl/task/HKTask.java                                      |   30 
 ycl-server/src/main/java/com/ycl/platform/service/ITMonitorService.java                |    2 
 ycl-server/src/main/java/com/ycl/platform/mapper/TMonitorMapper.java                   |   10 
 ycl-pojo/src/main/java/com/ycl/platform/domain/result/UY/OneMachineFileResult.java     |   89 ++-
 ycl-server/src/main/java/com/ycl/platform/service/impl/TMonitorServiceImpl.java        |   19 
 ycl-server/src/main/java/com/ycl/factory/IndexCalculationFactory.java                  |   10 
 /dev/null                                                                              |   30 -
 ycl-server/src/main/java/com/ycl/task/FaceTask.java                                    |   33 +
 ycl-server/src/main/java/com/ycl/calculate/CarSnapshotDelayCalculation.java            |  141 ++++++
 ycl-server/src/main/resources/mapper/zgyw/CheckScoreMapper.xml                         |   12 
 ycl-server/src/main/java/com/ycl/task/UYTask.java                                      |    5 
 ycl-server/src/main/java/com/ycl/feign/UYFeignConfig.java                              |    2 
 ycl-server/src/main/java/com/ycl/calculate/IndexCalculationServe.java                  |   69 +++
 ycl-server/src/main/java/com/ycl/platform/service/YwPointService.java                  |    9 
 32 files changed, 1,033 insertions(+), 272 deletions(-)

diff --git a/ycl-common/src/main/java/constant/ApiConstants.java b/ycl-common/src/main/java/constant/ApiConstants.java
index c4fcf99..105d11d 100644
--- a/ycl-common/src/main/java/constant/ApiConstants.java
+++ b/ycl-common/src/main/java/constant/ApiConstants.java
@@ -10,19 +10,37 @@
     public final static Integer pageNo = 1;
     public final static Integer pageSize = 5000;
     //璇锋眰鍙傛暟dataType-鍗″彛杩囪溅
-    public final static Integer HK_DATATYPE_CAR = 1;
+    public final static Integer HK_DataType_CAR = 1;
     //璇锋眰鍙傛暟dataType-浜鸿劯鏁版嵁
-    public final static Integer HK_DATATYPE_FACE = 2;
+    public final static Integer HK_DataType_FACE = 2;
 
     //鎶撴媿鏁版嵁閲忕洃娴嬬粨鏋� 姝e父
     public final static Integer HK_SnapCount_ResultType_Normal = 1;
-
     //鎶撴媿鏁版嵁閲忕洃娴嬬粨鏋� 鏃犳暟鎹�
     public final static Integer HK_SnapCount_ResultType_Null = 2;
-
     //鎶撴媿鏁版嵁閲忕洃娴嬬粨鏋� 鏁版嵁绐侀檷
     public final static Integer HK_SnapCount_ResultType_Descent = 3;
 
     //璇锋眰鍙傛暟dataType 鏁版嵁閲忓皯
-    public final static Integer HK_DATATYPE_ResultType_Low = 4;
+    public final static Integer HK_DataType_ResultType_Low = 4;
+
+    //缁忕含搴︽娴嬬粨鏋� 姝e父
+    public final static Integer HK_Info_LayType_Normal = 1;
+    //缁忕含搴︽娴嬬粨鏋� 缁忕含搴︾己澶�
+    public final static Integer HK_Info_LayType_Absent = 2;
+    //缁忕含搴︽娴嬬粨鏋� 涓嶅湪杈栧尯
+    public final static Integer HK_Info_LayType_NotIn = 3;
+    //缁忕含搴︽娴嬬粨鏋� 绮惧害浣�
+    public final static Integer HK_Info_LayType_Low = 4;
+
+    //鍥介檯缂栫爜鐩戞祴缁撴灉 姝e父
+    public final static Integer HK_Info_GbCodeType_Normal = 1;
+    //鍥介檯缂栫爜鐩戞祴缁撴灉 缂栫爜闀垮害涓嶇瓑浜�20浣�
+    public final static Integer HK_Info_GbCodeType_NotEq = 2;
+    //鍥介檯缂栫爜鐩戞祴缁撴灉 鍓�6浣嶄笉鍚堟爣鍑�
+    public final static Integer HK_Info_GbCodeType_6NotStandard = 3;
+    //鍥介檯缂栫爜鐩戞祴缁撴灉 11-13浣嶄笉鍚堟爣鍑�
+    public final static Integer HK_Info_GbCodeType_11NotStandard = 4;
+
+
 }
diff --git a/ycl-common/src/main/java/constant/CalculationStrategyConstants.java b/ycl-common/src/main/java/constant/CalculationStrategyConstants.java
index c749b7e..667e3d1 100644
--- a/ycl-common/src/main/java/constant/CalculationStrategyConstants.java
+++ b/ycl-common/src/main/java/constant/CalculationStrategyConstants.java
@@ -8,9 +8,25 @@
     /**
      * 杞﹁締鐐逛綅鍦ㄧ嚎鐜囧拰瑙嗗浘搴撳鎺ョǔ瀹氭��
      */
-    public static final String CAR_SiteOnline_ViewStability = "carSiteOnlineViewStability";
+    public static final String Car_SiteOnline_ViewStability = "carSiteOnlineViewStability";
     /**
      * 浜鸿劯鐐逛綅鍦ㄧ嚎鐜囧拰瑙嗗浘搴撳鎺ョǔ瀹氭��
      */
     public static final String Face_SiteOnline_ViewStability = "faceSiteOnlineViewStability";
+    /**
+     * 杞﹁締鍗″彛灞炴�х洃娴嬬粨鏋�
+     */
+    public static final String Car_InfoAccuracy = "carInfoAccuracy";
+    /**
+     * 浜鸿劯灞炴�х洃娴嬬粨鏋�
+     */
+    public static final String Face_InfoAccuracy = "faceInfoAccuracy";
+    /**
+     * 杞﹁締鏁版嵁涓婁紶鍙婃椂鎬�
+     */
+    public static final String Car_SnapshotDelay = "carSnapshotDelay";
+    /**
+     * 浜鸿劯鏁版嵁涓婁紶鍙婃椂鎬�
+     */
+    public static final String Face_SnapshotDelay = "faceSnapshotDelay";
 }
diff --git a/ycl-common/src/main/java/constant/RedisConstant.java b/ycl-common/src/main/java/constant/RedisConstant.java
new file mode 100644
index 0000000..2e024e8
--- /dev/null
+++ b/ycl-common/src/main/java/constant/RedisConstant.java
@@ -0,0 +1,6 @@
+package constant;
+
+public class RedisConstant {
+    /** 涓�鏈轰竴妗g洰褰曚竴鑷寸巼 澶氬嚭鏉ョ殑璁惧 Set闆嗗悎 */
+    public static final String New_Monitor_Set="New_Monitor_Set";
+}
diff --git a/ycl-pojo/src/main/java/com/ycl/platform/domain/entity/TMonitor.java b/ycl-pojo/src/main/java/com/ycl/platform/domain/entity/TMonitor.java
index c3fe608..296b1ba 100644
--- a/ycl-pojo/src/main/java/com/ycl/platform/domain/entity/TMonitor.java
+++ b/ycl-pojo/src/main/java/com/ycl/platform/domain/entity/TMonitor.java
@@ -1,6 +1,7 @@
 package com.ycl.platform.domain.entity;
 
 import annotation.Excel;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.ycl.system.entity.BaseEntity;
 
@@ -141,18 +142,8 @@
     @Excel(name = "绫诲瀷缂栫爜 : [131.鎽勫儚鏈虹紪鐮�;132.缃戠粶鎽勫儚鏈虹紪鐮�;]")
     private Long lxbm;
 
-    @Excel(name = "寮傚父鍘熷洜")
-    private String reason;
-
-    @Excel(name = "鏄惁鐢熸垚寮傚父宸ュ崟")
-    private Long defaultOrder;
-
-    @Excel(name ="寮傚父鎭㈠鏍囪瘑")
-    private Long recovery;
-
-    @Excel(name = "寮傚父鎭㈠鏃堕棿")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    private Date recoveryTime;
+    @TableField(exist = false)
+    private Integer recovery;
 
     private Long deptId;
 
@@ -164,14 +155,6 @@
         this.deptId = deptId;
     }
 
-    public Long getDefaultOrder() {
-        return defaultOrder;
-    }
-
-    public void setDefaultOrder(Long defaultOrder) {
-        this.defaultOrder = defaultOrder;
-    }
-
     public void setInstalledTime(Date installedTime) {
         this.installedTime = installedTime;
     }
@@ -180,31 +163,13 @@
         return installedTime;
     }
 
-    public Date getRecoveryTime() {
-        return recoveryTime;
-    }
-
-    public void setRecoveryTime(Date recoveryTime) {
-        this.recoveryTime = recoveryTime;
-    }
-
-    public Long getRecovery() {
+    public Integer getRecovery() {
         return recovery;
     }
 
-    public void setRecovery(Long recovery) {
+    public void setRecovery(Integer recovery) {
         this.recovery = recovery;
     }
-
-    public String getReason() {
-        return reason;
-    }
-
-    public void setReason(String reason) {
-        this.reason = reason;
-    }
-
-
 
     public void setId(Long id)
     {
@@ -512,10 +477,6 @@
                 ", cameraDept='" + cameraDept + '\'' +
                 ", hybm='" + hybm + '\'' +
                 ", lxbm=" + lxbm +
-                ", reason='" + reason + '\'' +
-                ", defaultOrder=" + defaultOrder +
-                ", recovery=" + recovery +
-                ", recoveryTime=" + recoveryTime +
                 ", deptId=" + deptId +
                 '}';
     }
diff --git a/ycl-pojo/src/main/java/com/ycl/platform/domain/entity/YwPoint.java b/ycl-pojo/src/main/java/com/ycl/platform/domain/entity/YwPoint.java
index e041929..4fd4a81 100644
--- a/ycl-pojo/src/main/java/com/ycl/platform/domain/entity/YwPoint.java
+++ b/ycl-pojo/src/main/java/com/ycl/platform/domain/entity/YwPoint.java
@@ -3,13 +3,15 @@
 import com.baomidou.mybatisplus.annotation.FieldStrategy;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
-import java.time.LocalDateTime;
-
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.ycl.platform.base.AbsEntity;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.experimental.Accessors;
+
+import java.time.LocalDateTime;
+import java.util.Date;
 
 /**
  * 杩愮淮鐐逛綅
@@ -60,5 +62,14 @@
     @TableField("point_tag")
     private String pointTag;
 
+    @TableField("reason")
+    private String reason;
+
+    @TableField("recovery")
+    private Integer recovery;
+
+    @TableField("recovery_time")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date recoveryTime;
 
 }
diff --git a/ycl-pojo/src/main/java/com/ycl/platform/domain/result/UY/OneMachineFileResult.java b/ycl-pojo/src/main/java/com/ycl/platform/domain/result/UY/OneMachineFileResult.java
index f6d6087..99e9cc0 100644
--- a/ycl-pojo/src/main/java/com/ycl/platform/domain/result/UY/OneMachineFileResult.java
+++ b/ycl-pojo/src/main/java/com/ycl/platform/domain/result/UY/OneMachineFileResult.java
@@ -27,6 +27,54 @@
     private String SBMC;
 
     /**
+     * 鎽勫儚鏈洪噰闆嗗尯鍩燂紙鍙傝�冩枃妗hВ鏋愶級
+     */
+    private String SXJCJQY;
+
+    /**
+     * 鐩戞帶鐐逛綅绫诲瀷锛�1-涓�绫昏棰戠洃鎺х偣锛�2-浜岀被瑙嗛鐩戞帶鐐癸紱3-涓夌被瑙嗛鐩戞帶鐐癸紱4-鍏畨鍐呴儴瑙嗛鐩戞帶鐐癸紱9-鍏朵粬鐐逛綅銆�
+     * 鍙傜収鍏畨閮ㄣ�婂叧浜庤繘涓�姝ュ姞寮哄叕瀹夋満鍏宠棰戝浘鍍忎俊鎭簲鐢ㄥ伐浣滅殑鎰忚銆嬶紙鍏�氬瓧锕�2015锕�4鍙凤級瀹氫箟銆�
+     */
+    private String JKDWLX;
+
+    /**
+     * IPV4鍦板潃锛屾憚鍍忔満IP鍦板潃銆�
+     */
+    private String IP;
+
+    /**
+     * IPV6鍦板潃锛屾憚鍍忔満鎵╁睍IP鍦板潃銆�
+     */
+//    private String IPV6;
+
+    /**
+     * 缁忓害銆�
+     */
+    private Double JD;
+
+    /**
+     * 绾害銆�
+     */
+    private Double WD;
+
+    /**
+     * 鎽勫儚鏈哄姛鑳界被鍨嬶紝鍙栧�艰寖鍥�(澶氶��) : [1.瑙嗛鐩戞帶;2.杞﹁締璇嗗埆;3.浜哄憳璇嗗埆;] 鏁版嵁鏍煎紡[濉叆澶氫釜鍊煎苟浠�/闅斿紑銆備緥濡�  1/2]
+     */
+    private String SXJGNLX;
+
+    /**
+     * MAC鍦板潃锛屾憚鍍忔満MAC鍦板潃銆�
+     */
+    private String MACDZ;
+
+    /**
+     * 璁惧鐘舵�侊紝1-鍦ㄧ敤锛�2-缁翠慨锛�3-鎷嗛櫎銆�
+     */
+    private String SBZT;
+
+    //---------------------------------------------------------------------
+
+    /**
      * 璁惧鍘傚晢锛岀紪鐮�1-娴峰悍濞佽锛�2-澶у崕锛�3-澶╁湴浼熶笟锛�4-绉戣揪锛�5-瀹夎澹紱6-鍗氫笘锛�7-浜氬畨锛�8-鑻遍鎷擄紱9-瀹囪锛�10-娴蜂俊锛�11-涓槦鐢靛瓙锛�12-鏄庢櫙锛�13-鑱旀兂锛�14-涓叴锛�99-鍏朵粬銆�
      */
     private String SBCS;
@@ -35,12 +83,6 @@
      * 琛屾斂鍖哄煙锛岃鏀垮尯鍒掋�佺睄璐渷甯傚幙浠g爜銆傚弬鐓с�奊B/T 2260 涓崕浜烘皯鍏卞拰鍥借鏀垮尯鍒掍唬鐮併�嬨��
      */
     private String XZQY;
-
-    /**
-     * 鐩戞帶鐐逛綅绫诲瀷锛�1-涓�绫昏棰戠洃鎺х偣锛�2-浜岀被瑙嗛鐩戞帶鐐癸紱3-涓夌被瑙嗛鐩戞帶鐐癸紱4-鍏畨鍐呴儴瑙嗛鐩戞帶鐐癸紱9-鍏朵粬鐐逛綅銆�
-     * 鍙傜収鍏畨閮ㄣ�婂叧浜庤繘涓�姝ュ姞寮哄叕瀹夋満鍏宠棰戝浘鍍忎俊鎭簲鐢ㄥ伐浣滅殑鎰忚銆嬶紙鍏�氬瓧锕�2015锕�4鍙凤級瀹氫箟銆�
-     */
-    private String JKDWLX;
 
     /**
      * 璁惧鍨嬪彿锛屾弿杩拌澶囩殑鍏蜂綋鍨嬪彿銆�
@@ -53,29 +95,9 @@
     private String DWSC;
 
     /**
-     * IPV4鍦板潃锛屾憚鍍忔満IP鍦板潃銆�
-     */
-    private String IPV4;
-
-    /**
-     * IPV6鍦板潃锛屾憚鍍忔満鎵╁睍IP鍦板潃銆�
-     */
-    private String IPV6;
-
-    /**
-     * MAC鍦板潃锛屾憚鍍忔満MAC鍦板潃銆�
-     */
-    private String MACDZ;
-
-    /**
      * 鎽勫儚鏈虹被鍨嬶紝1-鐞冩満锛�2-鍗婄悆锛�3-鍥哄畾鏋満锛�4-閬ユ帶鏋満锛�5-鍗″彛鏋満锛�99-鏈煡銆�
      */
     private String SXJLX;
-
-    /**
-     * 鎽勫儚鏈哄姛鑳界被鍨嬶紝1-杞﹁締鍗″彛锛�2-浜哄憳鍗″彛锛�3-寰崱鍙o紱4-鐗瑰緛鎽勫儚鏈猴紱5-鏅�氱洃鎺э紱99-鍏朵粬锛屽閫夊悇鍙傛暟浠モ��/鈥濆垎闅斻��
-     */
-    private String SXJGNLX;
 
     /**
      * 琛ュ厜灞炴�э紝1-鏃犺ˉ鍏夈��2-绾㈠琛ュ厜銆�3-鐧藉厜琛ュ厜銆�9-鍏朵粬琛ュ厜銆�
@@ -92,16 +114,6 @@
      * 鍙傝�冭寖寮忥細琛楅亾+闂ㄧ墝鍙风爜+鍗曚綅鍚嶇О銆傞珮閫熷叕璺�佸浗閬撶瓑鐐逛綅鍙弬鐓р�滃叕璺悕绉�+鍏噷鏁扳�濊寖寮忋��
      */
     private String AZDZ;
-
-    /**
-     * 缁忓害銆�
-     */
-    private Double JD;
-
-    /**
-     * 绾害銆�
-     */
-    private Double WD;
 
     /**
      * 鎽勫儚鏈轰綅缃被鍨嬶紝1-鐪侀檯妫�鏌ョ珯銆�2-鍏氭斂鏈哄叧銆�3-杞︾珯鐮佸ご銆�4-涓績骞垮満銆�5-浣撹偛鍦洪銆�6-鍟嗕笟涓績銆�7-瀹楁暀鍦烘墍銆�8-鏍″洯鍛ㄨ竟銆�9-娌诲畨澶嶆潅鍖哄煙銆�10-浜ら�氬共绾裤��11-鍖婚櫌鍛ㄨ竟銆�12-閲戣瀺鏈烘瀯鍛ㄨ竟銆�13-鍗遍櫓鐗╁搧鍦烘墍鍛ㄨ竟銆�14-鍗氱墿棣嗗睍瑙堥銆�15-閲嶇偣姘村煙銆佽埅閬撱��96-甯傞檯鍏畨妫�鏌ョ珯锛�97-娑夊鍦烘墍锛�98-杈瑰娌跨嚎锛�99-鏃呮父鏅尯锛屽閫夊悇鍙傛暟浠モ��/鈥濆垎闅斻��
@@ -147,11 +159,6 @@
      * 褰曞儚淇濆瓨澶╂暟銆�
      */
     private Integer LXBCTS;
-
-    /**
-     * 璁惧鐘舵�侊紝1-鍦ㄧ敤锛�2-缁翠慨锛�3-鎷嗛櫎銆�
-     */
-    private String SBZT;
 
     /**
      * 鎵�灞為儴闂�/琛屼笟锛�1-鍏畨鏈哄叧锛�2-鐜繚閮ㄩ棬锛�3-鏂囧崥閮ㄩ棬锛�4-鍖荤枟閮ㄩ棬锛�5-鏃呮父绠$悊锛�6-鏂伴椈骞跨數锛�7-椋熷搧鍖昏嵂鐩戠潱绠$悊閮ㄩ棬锛�8-鏁欒偛绠$悊閮ㄩ棬锛�9-妫�瀵熼櫌锛�10-娉曢櫌锛�11-閲戣瀺閮ㄩ棬锛�12-浜ら�氶儴闂紱13-浣忔埧鍜屽煄涔″缓璁鹃儴闂紱14-姘村埄閮ㄩ棬锛�15-鏋椾笟閮ㄩ棬锛�16-瀹夊叏鐢熶骇鐩戠潱閮ㄩ棬锛�17-甯傛斂甯傚濮旓紱18-鍥藉湡灞�锛屽彲鎵╁睍锛屽閫夊悇鍙傛暟浠モ��/鈥濆垎闅斻��
diff --git a/ycl-server/src/main/java/com/ycl/calculate/CarInFoAccuracyCalculation.java b/ycl-server/src/main/java/com/ycl/calculate/CarInFoAccuracyCalculation.java
new file mode 100644
index 0000000..f1d31d6
--- /dev/null
+++ b/ycl-server/src/main/java/com/ycl/calculate/CarInFoAccuracyCalculation.java
@@ -0,0 +1,136 @@
+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.CrossDetailResult;
+import com.ycl.platform.domain.result.HK.SnapshotDataMonitorResult;
+import com.ycl.platform.mapper.CheckIndexCarMapper;
+import com.ycl.platform.mapper.TMonitorMapper;
+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.time.LocalDate;
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * 璁$畻杞﹁締鍗″彛淇℃伅閲囬泦鍑嗙‘鐜�  璁惧缂栫爜銆佽鏀垮尯鍒掍唬鐮併�佸畨瑁呬綅缃�佸潗鏍囩粡绾害淇℃伅瀹屾暣鍑嗙‘
+ * 鑾峰彇鍒嗙渷鍘呫�佸尯鍩熺殑map<k,v> k涓篸eptId鎴栬�匬rovince_deptId
+ * 鏇存柊鎴栨柊澧�
+ */
+@Component
+public class CarInFoAccuracyCalculation extends IndexCalculationServe implements CalculationStrategy<CrossDetailResult> {
+    @Autowired
+    private CheckIndexCarMapper checkIndexCarMapper;
+    @Autowired
+    private SysConfigMapper sysConfigMapper;
+    @Autowired
+    private ITMonitorService monitorService;
+    @Autowired
+    private TMonitorMapper monitorMapper;
+    @Autowired
+    private ICheckIndexCarService checkIndexCarService;
+
+    //鍖哄煙杞﹁締淇℃伅閲囬泦鍑嗙‘鐜囩殑鍐呴儴绫�
+    private static class AreaStats {
+        int totalSites = 0;
+        int qualifySite = 0;
+    }
+
+    @Override
+    public void calculate(List<CrossDetailResult> list) {
+        if (CollectionUtils.isEmpty(list)) {
+            return;
+        }
+        //杩斿洖浠ュ浗鏍囩爜涓簁ey鐨勮澶噈ap
+        //TODO锛歮onitor鍘绘帀浜哾eptId
+        Map<String, TMonitor> monitorMap = monitorService.list(new QueryWrapper<TMonitor>()
+                        .in("serial_number", list.stream().map(CrossDetailResult::getExternalIndexCode).collect(Collectors.toList())))
+                .stream().collect(Collectors.toMap(TMonitor::getSerialNumber, Function.identity()));
+        //鑾峰彇鐪佸巺鍥芥爣鐮侀泦鍚�
+        List<String> provinceIds = getProvince();
+        Map<String, AreaStats> areaStatsMap = new HashMap<>();
+
+        for (CrossDetailResult 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);
+            }
+        }
+
+        // 鏌ヨ鏄惁index琛ㄥ凡缁忓瓨鍦ㄤ粖鏃ユ暟鎹�
+        List<CheckIndexCar> checkIndexCarList = checkIndexCarMapper.selectToday(DateUtils.getDate());
+        List<CheckIndexCar> checkIndexCars = new ArrayList<>();
+        areaStatsMap.forEach((deptId, stats) -> {
+            if (stats.totalSites > 0) {
+                CheckIndexCar checkIndexCar = createOrUpdateCheckIndexCar(deptId, stats, checkIndexCarList);
+                checkIndexCars.add(checkIndexCar);
+            }
+        });
+
+        checkIndexCarService.saveOrUpdateBatch(checkIndexCars);
+    }
+
+
+    /**
+     * 绱鎬荤偣浣嶆暟銆佹爣娉ㄥ紓甯哥偣浣嶆暟
+     */
+    private void updateAreaStats(Map<String, AreaStats> areaStatsMap, String key, CrossDetailResult result) {
+        //杩斿洖瀵硅薄鐨勫紩鐢紝濡傛灉涓嶅瓨鍦ㄤ細鏀惧叆鏂扮殑key,value
+        AreaStats stats = areaStatsMap.computeIfAbsent(key, k -> new AreaStats());
+        stats.totalSites++;
+        if (ApiConstants.HK_Info_LayType_Normal.equals(result.getLalType()) && ApiConstants.HK_Info_GbCodeType_Normal.equals(result.getGbCodeType())) {
+            stats.qualifySite++;
+        }
+    }
+
+    /**
+     * 杞﹁締淇℃伅閲囬泦姝g‘鐜�
+     */
+    private CheckIndexCar createOrUpdateCheckIndexCar(String key, AreaStats stats, 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("qualifySite", stats.qualifySite);
+        BigDecimal infoAccuracy = infoAccuracy(siteOnlineParam);
+        checkIndexCar.setVehicleInformationCollectionAccuracy(infoAccuracy);
+        return checkIndexCar;
+    }
+}
diff --git a/ycl-server/src/main/java/com/ycl/calculate/CarSiteOnlineCalculation.java b/ycl-server/src/main/java/com/ycl/calculate/CarSiteOnlineCalculation.java
index fa6cffc..2b64436 100644
--- a/ycl-server/src/main/java/com/ycl/calculate/CarSiteOnlineCalculation.java
+++ b/ycl-server/src/main/java/com/ycl/calculate/CarSiteOnlineCalculation.java
@@ -30,7 +30,7 @@
  * 鏇存柊鎴栨柊澧�
  */
 @Component
-public class CarSiteOnlineCalculation implements CalculationStrategy<SnapshotDataMonitorResult> {
+public class CarSiteOnlineCalculation extends IndexCalculationServe implements CalculationStrategy<SnapshotDataMonitorResult> {
     @Autowired
     private CheckIndexCarMapper checkIndexCarMapper;
     @Autowired
@@ -52,14 +52,15 @@
         if (CollectionUtils.isEmpty(list)) {
             return;
         }
-        Map<String, AreaStats> areaStatsMap = new HashMap<>();
+
+        //鑾峰緱鍥芥爣鐮佷负key鐨勮澶噈ap
         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()));
+        //鑾峰彇鐪佸巺鍥芥爣鐮侀泦鍚�
+        List<String> provinceIds = getProvince();
 
-        // TODO: 鍒嗙渷鍘呭競灞� 闇�瑕佽ˉ鍏呴泦鍚堟暟鎹�
-        List<String> provinceIds = new ArrayList<>(); // 杩欓噷闇�瑕佹牴鎹偣浣嶈ˉ鍏�
-
+        Map<String, AreaStats> areaStatsMap = new HashMap<>();
         for (SnapshotDataMonitorResult result : list) {
             TMonitor monitor = monitorMap.get(result.getExternalIndexCode());
             if (monitor == null) continue;
@@ -135,14 +136,14 @@
         Map<String, Object> siteOnlineParam = new HashMap<>();
         siteOnlineParam.put("totalSites", stats.totalSites);
         siteOnlineParam.put("offlineSites", stats.offlineSites);
-        BigDecimal siteOnline = IndexCalculationUtils.siteOnline(siteOnlineParam);
+        BigDecimal siteOnline = 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);
+        BigDecimal viewConnectStability = viewConnectStability(viewConnectParam);
         checkIndexCar.setViewConnectStability(viewConnectStability);
         return checkIndexCar;
     }
diff --git a/ycl-server/src/main/java/com/ycl/calculate/CarSnapshotDelayCalculation.java b/ycl-server/src/main/java/com/ycl/calculate/CarSnapshotDelayCalculation.java
new file mode 100644
index 0000000..f58e3e9
--- /dev/null
+++ b/ycl-server/src/main/java/com/ycl/calculate/CarSnapshotDelayCalculation.java
@@ -0,0 +1,141 @@
+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.domain.result.HK.SnapshotDelayMonitorResult;
+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.time.LocalDate;
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * 璁$畻杞﹁締澶囨姄鎷嶆暟鎹笂浼犲強鏃舵��
+ * 鑾峰彇鍒嗙渷鍘呫�佸尯鍩熺殑map<k,v> k涓篸eptId鎴栬�匬rovince_deptId
+ * 寰幆map璁$畻鏁版嵁涓婁紶鍙婃椂鎬�
+ * 鏇存柊鎴栨柊澧�
+ */
+@Component
+public class CarSnapshotDelayCalculation extends IndexCalculationServe implements CalculationStrategy<SnapshotDelayMonitorResult> {
+    @Autowired
+    private CheckIndexCarMapper checkIndexCarMapper;
+    @Autowired
+    private SysConfigMapper sysConfigMapper;
+    @Autowired
+    private ITMonitorService monitorService;
+    @Autowired
+    private ICheckIndexCarService checkIndexCarService;
+
+    //鍖哄煙杞﹁締鐐逛綅鍦ㄧ嚎鎸囨爣鐨勫唴閮ㄧ被
+    private static class AreaStats {
+        int totalCount = 0;
+        //0-180s
+        int delayCount1 = 0;
+        //180-300s
+        int delayCount2 = 0;
+        //300-600s
+        int delayCount3 = 0;
+    }
+
+    @Override
+    public void calculate(List<SnapshotDelayMonitorResult> list) {
+        if (CollectionUtils.isEmpty(list)) {
+            return;
+        }
+
+        //鑾峰緱鍥芥爣鐮佷负key鐨勮澶噈ap
+        Map<String, TMonitor> monitorMap = monitorService.list(new QueryWrapper<TMonitor>()
+                        .in("serial_number", list.stream().map(SnapshotDelayMonitorResult::getExternalIndexCode).collect(Collectors.toList())))
+                .stream().collect(Collectors.toMap(TMonitor::getSerialNumber, Function.identity()));
+        //鑾峰彇鐪佸巺鍥芥爣鐮侀泦鍚�
+        List<String> provinceIds = getProvince();
+
+        Map<String, AreaStats> areaStatsMap = new HashMap<>();
+        for (SnapshotDelayMonitorResult 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);
+            }
+        }
+
+        // 鏌ヨ鏄惁index琛ㄥ凡缁忓瓨鍦ㄤ粖鏃ユ暟鎹�
+        List<CheckIndexCar> checkIndexCarList = checkIndexCarMapper.selectToday(DateUtils.getDate());
+        List<CheckIndexCar> checkIndexCars = new ArrayList<>();
+        areaStatsMap.forEach((deptId, stats) -> {
+            if (stats.totalCount > 0) {
+                CheckIndexCar checkIndexCar = createOrUpdateCheckIndexCar(deptId, stats, checkIndexCarList);
+                checkIndexCars.add(checkIndexCar);
+            }
+        });
+
+        checkIndexCarService.saveOrUpdateBatch(checkIndexCars);
+    }
+
+    /**
+     * 绱鎬荤偣浣嶆暟銆佺绾挎暟銆佹�绘姄鎷嶉噺
+     */
+    private void updateAreaStats(Map<String, AreaStats> areaStatsMap, String key, SnapshotDelayMonitorResult result) {
+        //杩斿洖瀵硅薄鐨勫紩鐢紝濡傛灉涓嶅瓨鍦ㄤ細鏀惧叆鏂扮殑key,value
+        AreaStats stats = areaStatsMap.computeIfAbsent(key, k -> new AreaStats());
+        stats.totalCount += result.getDataCount();
+        stats.delayCount1 += result.getDataDelayCount1();
+        stats.delayCount2 += result.getDataDelayCount2();
+        stats.delayCount3 += result.getDataDelayCount3();
+    }
+
+
+    /**
+     * 杞﹁締鐐逛綅鍦ㄧ嚎鐜囧拰瑙嗗浘搴撳鎺ョǔ瀹氭��
+     */
+    private CheckIndexCar createOrUpdateCheckIndexCar(String key, AreaStats stats, 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> param = new HashMap<>();
+        param.put("totalCount", stats.totalCount);
+        param.put("delayCount1", stats.delayCount1);
+        param.put("delayCount2", stats.delayCount2);
+        param.put("delayCount3", stats.delayCount3);
+        BigDecimal index = snapshopDelay(param);
+        checkIndexCar.setSiteOnline(index);
+        return checkIndexCar;
+    }
+}
diff --git a/ycl-server/src/main/java/com/ycl/calculate/FaceInFoAccuracyCalculation.java b/ycl-server/src/main/java/com/ycl/calculate/FaceInFoAccuracyCalculation.java
new file mode 100644
index 0000000..3eef548
--- /dev/null
+++ b/ycl-server/src/main/java/com/ycl/calculate/FaceInFoAccuracyCalculation.java
@@ -0,0 +1,132 @@
+package com.ycl.calculate;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ycl.platform.domain.entity.CheckIndexFace;
+import com.ycl.platform.domain.entity.TMonitor;
+import com.ycl.platform.domain.result.HK.MonitoringDetailResult;
+import com.ycl.platform.mapper.CheckIndexFaceMapper;
+import com.ycl.platform.mapper.TMonitorMapper;
+import com.ycl.platform.service.ICheckIndexFaceService;
+import com.ycl.platform.service.ITMonitorService;
+import com.ycl.system.mapper.SysConfigMapper;
+import constant.ApiConstants;
+import constant.CheckConstants;
+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.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * 浜鸿劯鍗″彛淇℃伅閲囬泦鍑嗙‘鐜�  璁惧缂栫爜銆佽鏀垮尯鍒掍唬鐮併�佸畨瑁呬綅缃�佸潗鏍囩粡绾害淇℃伅瀹屾暣鍑嗙‘
+ * 鑾峰彇鍒嗙渷鍘呫�佸尯鍩熺殑map<k,v> k涓篸eptId鎴栬�匬rovince_deptId
+ * 鏇存柊鎴栨柊澧�
+ */
+@Component
+public class FaceInFoAccuracyCalculation extends IndexCalculationServe implements CalculationStrategy<MonitoringDetailResult> {
+    @Autowired
+    private CheckIndexFaceMapper checkIndexFaceMapper;
+    @Autowired
+    private ICheckIndexFaceService checkIndexFaceService;
+    @Autowired
+    private SysConfigMapper sysConfigMapper;
+    @Autowired
+    private ITMonitorService monitorService;
+    @Autowired
+    private TMonitorMapper monitorMapper;
+
+    //鍖哄煙杞﹁締淇℃伅閲囬泦鍑嗙‘鐜囩殑鍐呴儴绫�
+    private static class AreaStats {
+        int totalSites = 0;
+        int qualifySite = 0;
+    }
+
+    @Override
+    public void calculate(List<MonitoringDetailResult> list) {
+        if (CollectionUtils.isEmpty(list)) {
+            return;
+        }
+        //杩斿洖浠ュ浗鏍囩爜涓簁ey鐨勮澶噈ap
+        //TODO锛歮onitor鍘绘帀浜哾eptId
+        Map<String, TMonitor> monitorMap = monitorService.list(new QueryWrapper<TMonitor>()
+                        .in("serial_number", list.stream().map(MonitoringDetailResult::getExternalIndexCode).collect(Collectors.toList())))
+                .stream().collect(Collectors.toMap(TMonitor::getSerialNumber, Function.identity()));
+        //鑾峰彇鐪佸巺鍥芥爣鐮侀泦鍚�
+        List<String> provinceIds = getProvince();
+        Map<String, AreaStats> areaStatsMap = new HashMap<>();
+
+        for (MonitoringDetailResult 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);
+            }
+        }
+
+        // 鏌ヨ鏄惁index琛ㄥ凡缁忓瓨鍦ㄤ粖鏃ユ暟鎹�
+        List<CheckIndexFace> checkIndexFaceList = checkIndexFaceMapper.selectToday(DateUtils.getDate());
+        List<CheckIndexFace> checkIndexFaces = new ArrayList<>();
+        areaStatsMap.forEach((deptId, stats) -> {
+            if (stats.totalSites > 0) {
+                CheckIndexFace checkIndexFace = createOrUpdateCheckIndexFace(deptId, stats, checkIndexFaceList);
+                checkIndexFaces.add(checkIndexFace);
+            }
+        });
+
+        checkIndexFaceService.saveOrUpdateBatch(checkIndexFaces);
+    }
+
+
+    /**
+     * 绱鎬荤偣浣嶆暟銆佹爣娉ㄥ紓甯哥偣浣嶆暟
+     */
+    private void updateAreaStats(Map<String, AreaStats> areaStatsMap, String key, MonitoringDetailResult result) {
+        //杩斿洖瀵硅薄鐨勫紩鐢紝濡傛灉涓嶅瓨鍦ㄤ細鏀惧叆鏂扮殑key,value
+        AreaStats stats = areaStatsMap.computeIfAbsent(key, k -> new AreaStats());
+        stats.totalSites++;
+        if (ApiConstants.HK_Info_LayType_Normal.equals(result.getLalType()) && ApiConstants.HK_Info_GbCodeType_Normal.equals(result.getGbCodeType())) {
+            stats.qualifySite++;
+        }
+    }
+
+    /**
+     * 杞﹁締淇℃伅閲囬泦姝g‘鐜�
+     */
+    private CheckIndexFace createOrUpdateCheckIndexFace(String key, AreaStats stats, List<CheckIndexFace> checkIndexFaceList) {
+        CheckIndexFace checkIndexFace;
+
+        // 妫�鏌ユ槸鍚﹀凡瀛樺湪浠婃棩鏁版嵁
+        Optional<CheckIndexFace> existingFace = checkIndexFaceList.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 (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());
+        }
+        //璋冪敤璁$畻鏂规硶
+        Map<String, Object> siteOnlineParam = new HashMap<>();
+        siteOnlineParam.put("totalSites", stats.totalSites);
+        siteOnlineParam.put("qualifySite", stats.qualifySite);
+        BigDecimal infoAccuracy = infoAccuracy(siteOnlineParam);
+        checkIndexFace.setFaceInformationCollectionAccuracy(infoAccuracy);
+        return checkIndexFace;
+    }
+}
diff --git a/ycl-server/src/main/java/com/ycl/calculate/FaceSiteOnlineCalculation.java b/ycl-server/src/main/java/com/ycl/calculate/FaceSiteOnlineCalculation.java
index 524a2b4..0058832 100644
--- a/ycl-server/src/main/java/com/ycl/calculate/FaceSiteOnlineCalculation.java
+++ b/ycl-server/src/main/java/com/ycl/calculate/FaceSiteOnlineCalculation.java
@@ -1,18 +1,13 @@
 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;
@@ -35,7 +30,7 @@
  * 鏇存柊鎴栨柊澧�
  */
 @Component
-public class FaceSiteOnlineCalculation implements CalculationStrategy<SnapshotDataMonitorResult> {
+public class FaceSiteOnlineCalculation extends IndexCalculationServe implements CalculationStrategy<SnapshotDataMonitorResult> {
     @Autowired
     private CheckIndexFaceMapper checkIndexFaceMapper;
     @Autowired
@@ -57,14 +52,14 @@
         if (CollectionUtils.isEmpty(list)) {
             return;
         }
-
-        Map<String, AreaStats> areaStatsMap = new HashMap<>();
+        //杩斿洖浠ュ浗鏍囩爜涓簁ey鐨勮澶噈ap
         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()));
+        //鑾峰彇鐪佸巺鍥芥爣鐮侀泦鍚�
+        List<String> provinceIds = getProvince();
 
-        // TODO: 鍒嗙渷鍘呭競灞� 闇�瑕佽ˉ鍏呴泦鍚堟暟鎹�
-        List<String> provinceIds = new ArrayList<>(); // 杩欓噷闇�瑕佹牴鎹偣浣嶈ˉ鍏�
+        Map<String, AreaStats> areaStatsMap = new HashMap<>();
 
         for (SnapshotDataMonitorResult result : list) {
             TMonitor monitor = monitorMap.get(result.getExternalIndexCode());
@@ -138,15 +133,19 @@
             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));
+        //璋冪敤鐐逛綅鍦ㄧ嚎璁$畻鏂规硶
+        Map<String, Object> siteOnlineParam = new HashMap<>();
+        siteOnlineParam.put("totalSites", stats.totalSites);
+        siteOnlineParam.put("offlineSites", stats.offlineSites);
+        BigDecimal siteOnline = siteOnline(siteOnlineParam);
+        checkIndexFace.setSiteOnline(siteOnline);
         //瑙嗗浘搴撳鎺ョǔ瀹氭��
         BigDecimal avgCount = key.startsWith("Province_") ? cityCountAvg : countyCountAvg;
-        checkIndexFace.setViewConnectStability(new BigDecimal(stats.totalDataSum).divide(avgCount, 4, RoundingMode.HALF_UP));
-
+        Map<String, Object> viewConnectParam = new HashMap<>();
+        viewConnectParam.put("totalDataSum", stats.totalDataSum);
+        viewConnectParam.put("avgCount", avgCount);
+        BigDecimal viewConnectStability = viewConnectStability(viewConnectParam);
+        checkIndexFace.setViewConnectStability(viewConnectStability);
         return checkIndexFace;
     }
 }
diff --git a/ycl-server/src/main/java/com/ycl/calculate/FaceSnapshotDelayCalculation.java b/ycl-server/src/main/java/com/ycl/calculate/FaceSnapshotDelayCalculation.java
new file mode 100644
index 0000000..8013800
--- /dev/null
+++ b/ycl-server/src/main/java/com/ycl/calculate/FaceSnapshotDelayCalculation.java
@@ -0,0 +1,136 @@
+package com.ycl.calculate;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ycl.platform.domain.entity.CheckIndexFace;
+import com.ycl.platform.domain.entity.TMonitor;
+import com.ycl.platform.domain.result.HK.SnapshotDelayMonitorResult;
+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 constant.CheckConstants;
+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.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * 璁$畻浜鸿劯璁惧鎶撴媿鏁版嵁涓婁紶鍙婃椂鎬�
+ * 鑾峰彇鍒嗙渷鍘呫�佸尯鍩熺殑map<k,v> k涓篸eptId鎴栬�匬rovince_deptId
+ * 寰幆map璁$畻鏁版嵁涓婁紶鍙婃椂鎬�
+ * 鏇存柊鎴栨柊澧�
+ */
+@Component
+public class FaceSnapshotDelayCalculation extends IndexCalculationServe implements CalculationStrategy<SnapshotDelayMonitorResult> {
+    @Autowired
+    private CheckIndexFaceMapper checkIndexFaceMapper;
+    @Autowired
+    private SysConfigMapper sysConfigMapper;
+    @Autowired
+    private ITMonitorService monitorService;
+    @Autowired
+    private ICheckIndexFaceService checkIndexFaceService;
+
+    //鍖哄煙杞﹁締鐐逛綅鍦ㄧ嚎鎸囨爣鐨勫唴閮ㄧ被
+    private static class AreaStats {
+        int totalCount = 0;
+        //0-180s
+        int delayCount1 = 0;
+        //180-300s
+        int delayCount2 = 0;
+        //300-600s
+        int delayCount3 = 0;
+    }
+
+    @Override
+    public void calculate(List<SnapshotDelayMonitorResult> list) {
+        if (CollectionUtils.isEmpty(list)) {
+            return;
+        }
+
+        //鑾峰緱鍥芥爣鐮佷负key鐨勮澶噈ap
+        Map<String, TMonitor> monitorMap = monitorService.list(new QueryWrapper<TMonitor>()
+                        .in("serial_number", list.stream().map(SnapshotDelayMonitorResult::getExternalIndexCode).collect(Collectors.toList())))
+                .stream().collect(Collectors.toMap(TMonitor::getSerialNumber, Function.identity()));
+        //鑾峰彇鐪佸巺鍥芥爣鐮侀泦鍚�
+        List<String> provinceIds = getProvince();
+
+        Map<String, AreaStats> areaStatsMap = new HashMap<>();
+        for (SnapshotDelayMonitorResult 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);
+            }
+        }
+
+        // 鏌ヨ鏄惁index琛ㄥ凡缁忓瓨鍦ㄤ粖鏃ユ暟鎹�
+        List<CheckIndexFace> checkIndexFaceList = checkIndexFaceMapper.selectToday(DateUtils.getDate());
+        List<CheckIndexFace> checkIndexFaces = new ArrayList<>();
+        areaStatsMap.forEach((deptId, stats) -> {
+            if (stats.totalCount > 0) {
+                CheckIndexFace checkIndexFace = createOrUpdateCheckIndexFace(deptId, stats, checkIndexFaceList);
+                checkIndexFaces.add(checkIndexFace);
+            }
+        });
+
+        checkIndexFaceService.saveOrUpdateBatch(checkIndexFaces);
+    }
+
+    /**
+     * 绱鎬荤偣浣嶆暟銆佺绾挎暟銆佹�绘姄鎷嶉噺
+     */
+    private void updateAreaStats(Map<String, AreaStats> areaStatsMap, String key, SnapshotDelayMonitorResult result) {
+        //杩斿洖瀵硅薄鐨勫紩鐢紝濡傛灉涓嶅瓨鍦ㄤ細鏀惧叆鏂扮殑key,value
+        AreaStats stats = areaStatsMap.computeIfAbsent(key, k -> new AreaStats());
+        stats.totalCount += result.getDataCount();
+        stats.delayCount1 += result.getDataDelayCount1();
+        stats.delayCount2 += result.getDataDelayCount2();
+        stats.delayCount3 += result.getDataDelayCount3();
+    }
+
+
+    /**
+     * 杞﹁締鐐逛綅鍦ㄧ嚎鐜囧拰瑙嗗浘搴撳鎺ョǔ瀹氭��
+     */
+    private CheckIndexFace createOrUpdateCheckIndexFace(String key, AreaStats stats, 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());
+        }
+
+        //璋冪敤鎶撴媿涓婁紶鍙婃椂鎬ц绠楁柟娉�
+        Map<String, Object> param = new HashMap<>();
+        param.put("totalCount", stats.totalCount);
+        param.put("delayCount1", stats.delayCount1);
+        param.put("delayCount2", stats.delayCount2);
+        param.put("delayCount3", stats.delayCount3);
+        BigDecimal index = snapshopDelay(param);
+        checkIndexFace.setSiteOnline(index);
+        return checkIndexFace;
+    }
+}
diff --git a/ycl-server/src/main/java/com/ycl/calculate/IndexCalculationServe.java b/ycl-server/src/main/java/com/ycl/calculate/IndexCalculationServe.java
new file mode 100644
index 0000000..6d5d7b7
--- /dev/null
+++ b/ycl-server/src/main/java/com/ycl/calculate/IndexCalculationServe.java
@@ -0,0 +1,69 @@
+package com.ycl.calculate;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ycl.platform.domain.entity.TMonitor;
+import com.ycl.platform.domain.result.HK.SnapshotDataMonitorResult;
+import com.ycl.platform.service.ITMonitorService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * 璁$畻鍏紡
+ */
+@Component
+public class IndexCalculationServe {
+
+    @Autowired
+    private ITMonitorService monitorService;
+
+    //鐐逛綅鍦ㄧ嚎鐜�
+    public BigDecimal siteOnline(Map<String, Object> param) {
+        BigDecimal totalSites = new BigDecimal((Integer) param.get("totalSites"));
+        BigDecimal offlineSites = new BigDecimal((Integer) param.get("offlineSites"));
+        BigDecimal onlineSites = totalSites.subtract(offlineSites);
+        return onlineSites.divide(totalSites, 4, RoundingMode.HALF_UP);
+    }
+
+    //瑙嗗浘搴撳鎺ョǔ瀹氭��
+    public BigDecimal viewConnectStability(Map<String, Object> param) {
+        BigDecimal totalDataSum = new BigDecimal((Integer) param.get("totalDataSum"));
+        BigDecimal avgCount = new BigDecimal((Integer) param.get("avgCount"));
+        return avgCount.divide(totalDataSum, 4, RoundingMode.HALF_UP);
+    }
+
+    //鏍囨敞姝g‘鐜�
+    public BigDecimal infoAccuracy(Map<String, Object> param) {
+        BigDecimal totalSitesCount = new BigDecimal((Integer) param.get("totalSites"));
+        BigDecimal qualifySiteCount = new BigDecimal((Integer) param.get("qualifySite"));
+        return qualifySiteCount.divide(totalSitesCount, 4, RoundingMode.HALF_UP);
+    }
+
+    //鏁版嵁涓婁紶鍙婃椂鎬�
+    public BigDecimal snapshopDelay(Map<String, Object> param) {
+        BigDecimal totalCount = new BigDecimal((Integer) param.get("totalCount"));
+        BigDecimal delayCount1 = new BigDecimal((Integer) param.get("delayCount1"));
+        BigDecimal delayCount2 = new BigDecimal((Integer) param.get("delayCount2"));
+        BigDecimal delayCount3 = new BigDecimal((Integer) param.get("delayCount3"));
+
+        BigDecimal result = delayCount1.divide(totalCount, 10, RoundingMode.HALF_UP).multiply(BigDecimal.ONE)
+                .add(delayCount2.divide(totalCount, 10, RoundingMode.HALF_UP).multiply(new BigDecimal("0.8")))
+                .add(delayCount3.divide(totalCount, 10, RoundingMode.HALF_UP).multiply(new BigDecimal("0.6")));
+        return result.setScale(4, RoundingMode.HALF_UP);
+    }
+    //杩斿洖鐪佸巺鍥芥爣鐮侀泦鍚�
+    public List<String> getProvince() {
+        // TODO: 鍒嗙渷鍘呭競灞� 闇�瑕佽ˉ鍏呴泦鍚堟暟鎹�
+        List<String> list = new ArrayList<>();
+        return list;
+    }
+}
diff --git a/ycl-server/src/main/java/com/ycl/calculate/IndexCalculationUtils.java b/ycl-server/src/main/java/com/ycl/calculate/IndexCalculationUtils.java
deleted file mode 100644
index 919e9c1..0000000
--- a/ycl-server/src/main/java/com/ycl/calculate/IndexCalculationUtils.java
+++ /dev/null
@@ -1,30 +0,0 @@
-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);
-    }
-
-}
diff --git a/ycl-server/src/main/java/com/ycl/factory/IndexCalculationFactory.java b/ycl-server/src/main/java/com/ycl/factory/IndexCalculationFactory.java
index faa06c8..912cd56 100644
--- a/ycl-server/src/main/java/com/ycl/factory/IndexCalculationFactory.java
+++ b/ycl-server/src/main/java/com/ycl/factory/IndexCalculationFactory.java
@@ -1,8 +1,6 @@
 package com.ycl.factory;
 
-import com.ycl.calculate.CalculationStrategy;
-import com.ycl.calculate.CarSiteOnlineCalculation;
-import com.ycl.calculate.FaceSiteOnlineCalculation;
+import com.ycl.calculate.*;
 import constant.CalculationStrategyConstants;
 
 import java.util.HashMap;
@@ -12,8 +10,12 @@
     private static final Map<String, CalculationStrategy> calculators = new HashMap<>();
 
     static {
-        calculators.put(CalculationStrategyConstants.CAR_SiteOnline_ViewStability, new CarSiteOnlineCalculation());
+        calculators.put(CalculationStrategyConstants.Car_SiteOnline_ViewStability, new CarSiteOnlineCalculation());
         calculators.put(CalculationStrategyConstants.Face_SiteOnline_ViewStability, new FaceSiteOnlineCalculation());
+        calculators.put(CalculationStrategyConstants.Car_InfoAccuracy, new CarInFoAccuracyCalculation());
+        calculators.put(CalculationStrategyConstants.Face_InfoAccuracy, new FaceInFoAccuracyCalculation());
+        calculators.put(CalculationStrategyConstants.Car_SnapshotDelay, new CarSnapshotDelayCalculation());
+        calculators.put(CalculationStrategyConstants.Face_SnapshotDelay, new FaceSnapshotDelayCalculation());
     }
 
     public static CalculationStrategy getCalculator(String indexName) {
diff --git a/ycl-server/src/main/java/com/ycl/feign/UYClient.java b/ycl-server/src/main/java/com/ycl/feign/UYClient.java
index 44d25b8..7a5ccad 100644
--- a/ycl-server/src/main/java/com/ycl/feign/UYClient.java
+++ b/ycl-server/src/main/java/com/ycl/feign/UYClient.java
@@ -15,7 +15,7 @@
  */
 
 @Component
-@FeignClient(name = "UYClient", url = "${request.youYunDomain}", configuration = YYFeignConfig.class)
+@FeignClient(name = "UYClient", url = "${request.youYunDomain}", configuration = UYFeignConfig.class)
 public interface UYClient {
 
     /**
diff --git a/ycl-server/src/main/java/com/ycl/feign/YYFeignConfig.java b/ycl-server/src/main/java/com/ycl/feign/UYFeignConfig.java
similarity index 95%
rename from ycl-server/src/main/java/com/ycl/feign/YYFeignConfig.java
rename to ycl-server/src/main/java/com/ycl/feign/UYFeignConfig.java
index cdc7833..d11f33e 100644
--- a/ycl-server/src/main/java/com/ycl/feign/YYFeignConfig.java
+++ b/ycl-server/src/main/java/com/ycl/feign/UYFeignConfig.java
@@ -11,7 +11,7 @@
  * 浼樹簯鎺ュ彛閰嶇疆
  */
 @Configuration
-public class YYFeignConfig {
+public class UYFeignConfig {
     /**
      * 娉ㄥ叆鎷︽埅鍣�
      */
diff --git a/ycl-server/src/main/java/com/ycl/platform/mapper/TMonitorMapper.java b/ycl-server/src/main/java/com/ycl/platform/mapper/TMonitorMapper.java
index 0132e86..552305c 100644
--- a/ycl-server/src/main/java/com/ycl/platform/mapper/TMonitorMapper.java
+++ b/ycl-server/src/main/java/com/ycl/platform/mapper/TMonitorMapper.java
@@ -65,10 +65,16 @@
 
     /**
      * 鑾峰彇瑙嗛缁熻
-     * @param cameraFunType 绫诲瀷
+     * @param tMonitor 鏉′欢
      * @return 缁熻鏁�
      */
     Map<String, String> getVideoCount(TMonitor tMonitor);
 
-    Map<String, String> recoveryException();
+    Map<String, String> recoveryException(String time);
+
+    /**
+     * 鑾峰彇鎭㈠寮傚父鎸佺画鍏虫敞璁惧
+     * @return 璁惧
+     */
+    List<TMonitorVO> selectRecoveryMonitor(String time);
 }
diff --git a/ycl-server/src/main/java/com/ycl/platform/service/ITMonitorService.java b/ycl-server/src/main/java/com/ycl/platform/service/ITMonitorService.java
index 38de510..5cfb83e 100644
--- a/ycl-server/src/main/java/com/ycl/platform/service/ITMonitorService.java
+++ b/ycl-server/src/main/java/com/ycl/platform/service/ITMonitorService.java
@@ -66,7 +66,7 @@
     /**
      * 鑾峰彇鎸囧畾鎽勫儚澶村姛鑳界被鍨嬩笅鐨勮棰戞暟閲忋��
      *
-     * @param cameraFunType 鎽勫儚澶村姛鑳界被鍨嬶紝鐢ㄤ簬绛涢�夎棰戙��
+     * @param tMonitor 鏉′欢
      * @return 杩斿洖涓�涓寘鍚棰戞暟閲忕殑Map瀵硅薄锛屽叾涓璳ey涓虹粺璁℃寚鏍囷紝value涓哄搴斿姛鑳界被鍨嬩笅鐨勭粺璁℃暟閲忋��
      */
     Map<String, String> getVideoCount(TMonitor tMonitor);
diff --git a/ycl-server/src/main/java/com/ycl/platform/service/YwPointService.java b/ycl-server/src/main/java/com/ycl/platform/service/YwPointService.java
index e9603bd..a6e6d44 100644
--- a/ycl-server/src/main/java/com/ycl/platform/service/YwPointService.java
+++ b/ycl-server/src/main/java/com/ycl/platform/service/YwPointService.java
@@ -85,4 +85,13 @@
      * @return
      */
     Result select(String keyword);
+
+    /**
+     * 鎵归噺鍚屾鐘舵��
+     *
+     * @param pointIds 鐐逛綅id
+     * @param recovery  鐘舵��
+     * @return 鏁伴噺
+     */
+    boolean updateRecovery(List<Integer> pointIds, int recovery);
 }
diff --git a/ycl-server/src/main/java/com/ycl/platform/service/impl/CalculateReportServiceImpl.java b/ycl-server/src/main/java/com/ycl/platform/service/impl/CalculateReportServiceImpl.java
index e603c06..992dcee 100644
--- a/ycl-server/src/main/java/com/ycl/platform/service/impl/CalculateReportServiceImpl.java
+++ b/ycl-server/src/main/java/com/ycl/platform/service/impl/CalculateReportServiceImpl.java
@@ -204,7 +204,7 @@
         CalculateExport calculateExport = new CalculateExport();
         calculateExport.setRuleName("鍚堣");
         calculateExport.setNum(list.stream().mapToInt(CalculateExport::getNum).sum());
-        calculateExport.setScore(list.stream().mapToInt(CalculateExport::getScore).sum());
+        calculateExport.setScore(100 + list.stream().mapToInt(CalculateExport::getScore).sum());
         list.add(calculateExport);
         // 杈撳嚭鏂囦欢
         response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
diff --git a/ycl-server/src/main/java/com/ycl/platform/service/impl/CheckIndexCarServiceImpl.java b/ycl-server/src/main/java/com/ycl/platform/service/impl/CheckIndexCarServiceImpl.java
index 45313ed..40e0402 100644
--- a/ycl-server/src/main/java/com/ycl/platform/service/impl/CheckIndexCarServiceImpl.java
+++ b/ycl-server/src/main/java/com/ycl/platform/service/impl/CheckIndexCarServiceImpl.java
@@ -1,7 +1,6 @@
 package com.ycl.platform.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.ycl.calculate.IndexCalculationUtils;
 import com.ycl.platform.domain.entity.CheckIndexCar;
 import com.ycl.platform.mapper.CheckIndexCarMapper;
 import com.ycl.platform.service.ICheckIndexCarService;
diff --git a/ycl-server/src/main/java/com/ycl/platform/service/impl/TMonitorServiceImpl.java b/ycl-server/src/main/java/com/ycl/platform/service/impl/TMonitorServiceImpl.java
index 57e65f8..88610bb 100644
--- a/ycl-server/src/main/java/com/ycl/platform/service/impl/TMonitorServiceImpl.java
+++ b/ycl-server/src/main/java/com/ycl/platform/service/impl/TMonitorServiceImpl.java
@@ -6,11 +6,14 @@
 import com.ycl.platform.domain.vo.TMonitorVO;
 import com.ycl.platform.mapper.TMonitorMapper;
 import com.ycl.platform.service.ITMonitorService;
+import com.ycl.system.service.ISysConfigService;
+import com.ycl.utils.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 
 /**
  * 璁惧璧勪骇Service涓氬姟灞傚鐞�
@@ -23,6 +26,8 @@
 {
     @Autowired
     private TMonitorMapper tMonitorMapper;
+    @Autowired
+    private ISysConfigService configService;
 
     /**
      * 鏌ヨ璁惧璧勪骇
@@ -46,7 +51,16 @@
     @DataScope(deptAlias = "d",userAlias = "u")
     public List<TMonitorVO> selectTMonitorList(TMonitor tMonitor)
     {
-        return tMonitorMapper.selectTMonitorList(tMonitor);
+        List<TMonitorVO> monitors = tMonitorMapper.selectTMonitorList(tMonitor);
+        if (Objects.equals(tMonitor.getRecovery(), 1)) {
+            String time = configService.selectConfigByKey("abnormal.equipment.continuous.attention.time");
+            if (StringUtils.isBlank(time)) {
+                throw new RuntimeException("璇烽厤缃紓甯歌澶囪繛缁叧娉ㄦ椂闂�");
+            }
+            List<TMonitorVO> recoveryMonitors = tMonitorMapper.selectRecoveryMonitor(time);
+            monitors.addAll(recoveryMonitors);
+        }
+        return monitors;
     }
 
     /**
@@ -105,6 +119,7 @@
 
     @Override
     public Map<String, String> recoveryException() {
-        return tMonitorMapper.recoveryException();
+        String time = configService.selectConfigByKey("abnormal.equipment.continuous.attention.time");
+        return tMonitorMapper.recoveryException(time);
     }
 }
diff --git a/ycl-server/src/main/java/com/ycl/platform/service/impl/WorkOrderServiceImpl.java b/ycl-server/src/main/java/com/ycl/platform/service/impl/WorkOrderServiceImpl.java
index 7b6af3f..32c27db 100644
--- a/ycl-server/src/main/java/com/ycl/platform/service/impl/WorkOrderServiceImpl.java
+++ b/ycl-server/src/main/java/com/ycl/platform/service/impl/WorkOrderServiceImpl.java
@@ -19,6 +19,7 @@
 import com.ycl.platform.service.NotifyService;
 import com.ycl.platform.service.WorkOrderAuditingRecordService;
 import com.ycl.platform.service.WorkOrderService;
+import com.ycl.platform.service.YwPointService;
 import com.ycl.system.Result;
 import com.ycl.system.model.LoginUser;
 import com.ycl.system.page.PageUtil;
@@ -26,6 +27,10 @@
 import com.ycl.utils.SecurityUtils;
 import com.ycl.utils.redis.RedisCache;
 import com.ycl.utils.uuid.IdUtils;
+import enumeration.general.NotifyTypeEnum;
+import enumeration.general.UrgentLevelEnum;
+import enumeration.general.WorkOrderDistributeWayEnum;
+import enumeration.general.WorkOrderStatusEnum;
 import enumeration.general.*;
 import lombok.RequiredArgsConstructor;
 import org.springframework.beans.BeanUtils;
@@ -40,6 +45,7 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -53,8 +59,7 @@
 public class WorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, WorkOrder> implements WorkOrderService {
 
     private final WorkOrderMapper workOrderMapper;
-    private final YwUnitMapper ywUnitMapper;
-    private final YwPeopleMapper ywPeopleMapper;
+    private final YwPointService ywPointService;
     private final WorkOrderAuditingRecordMapper workOrderAuditingRecordMapper;
     private final WorkOrderAuditingRecordService workOrderAuditingRecordService;
     private final WorkOrderYwConditionRecordMapper workOrderYwConditionRecordMapper;
@@ -124,6 +129,10 @@
                 UrgentLevelEnum.WARNING,
                 workOrder.getWorkOrderNo());
         notifyService.save(notify);
+        // 鍚屾鐐逛綅鐘舵��
+        if (form.getAuditingResult() == WorkOrderStatusEnum.AUDITING_SUCCESS) {
+            ywPointService.updateRecovery(Collections.singletonList(workOrder.getPointId()), 0);
+        }
         return Result.ok("鎿嶄綔鎴愬姛");
     }
 
@@ -267,53 +276,49 @@
     }
 
     @Override
+    @Transactional
     public Result distributeFast(DistributeWorkOrderVO data) {
         // 鑾峰彇褰撳墠鏃堕棿
         LocalDateTime now = LocalDateTime.now(ZoneId.systemDefault());
+        data.setEnd(now);
         switch (data.getFastWay()) {
             case LAST_HALF_HOUR:
                 data.setStart(now.minusMinutes(30));
-                data.setEnd(now);
                 break;
             case LAST_HOUR:
                 data.setStart(now.minusHours(1));
-                data.setEnd(now);
                 break;
             case LAST_TWO_HOUR:
                data.setStart(now.minusHours(2));
-               data.setEnd(now);
                break;
             case LAST_DAY:
                 data.setStart(now.minusDays(1));
-                data.setEnd(now);
                 break;
            }
 
         // 鏌ヨ绗﹀悎鏉′欢鐨勫伐鍗�
-        List<Integer> ids = new LambdaQueryChainWrapper<>(baseMapper)
+        List<WorkOrder> list = new LambdaQueryChainWrapper<>(baseMapper)
+                .select(WorkOrder::getId, WorkOrder::getPointId)
                 .eq(WorkOrder::getStatus, WorkOrderStatusEnum.WAIT_DISTRIBUTE)
                 .eq(Objects.nonNull(data.getUnitId()), WorkOrder::getUnitId, data.getUnitId())
                 .eq(WorkOrder::getErrorType, data.getErrorType())
                 .between(WorkOrder::getCreateTime, data.getStart(), data.getEnd())
                 .orderByDesc(WorkOrder::getCreateTime)
                 .last("limit " + data.getFastNumLimit())
-                .list()
-                .stream()
-                .map(WorkOrder::getId)
-                .toList();
+                .list();
+        List<Integer> ids = list.stream().map(WorkOrder::getId).toList();
+        List<Integer> pointIds = list.stream().map(WorkOrder::getPointId).toList();
 
-        if (ids.isEmpty()) {
-            return Result.error("娌℃湁绗﹀悎鏉′欢鐨勫伐鍗�");
-        }
-        if (!getDistributeLock()) {
-            return Result.error("姝ゅ埢鏈変汉涓嬪彂涓紝涓洪伩鍏嶅啿绐侊紝璇风◢鍚庨噸璇�");
-        }
+        if (ids.isEmpty()) { return Result.error("娌℃湁绗﹀悎鏉′欢鐨勫伐鍗�"); }
+        if (!getDistributeLock()) { return Result.error("姝ゅ埢鏈変汉涓嬪彂涓紝涓洪伩鍏嶅啿绐侊紝璇风◢鍚庨噸璇�"); }
         try {
             new LambdaUpdateChainWrapper<>(baseMapper)
                     .set(WorkOrder::getStatus, WorkOrderStatusEnum.DISTRIBUTED)
                     .in(WorkOrder::getId, ids)
                     .update();
             addDistributeRecord(ids, WorkOrderDistributeWayEnum.FAST_DISTRIBUTE);
+            // 鍚屾鐐逛綅鐘舵��
+            ywPointService.updateRecovery(pointIds, 1);
             return Result.ok("鎴愬姛涓嬪彂" + ids.size() + "鏉″伐鍗�");
         } catch (Exception e) {
             return Result.error("鎿嶄綔澶辫触");
@@ -323,11 +328,10 @@
     }
 
     @Override
+    @Transactional
     public Result selectedIdsDistribute(DistributeWorkOrderQuery query) {
         WorkOrderDistributeWayEnum distributeWayEnum = WorkOrderDistributeWayEnum.SELECTED_DISTRIBUTE;
-        if (!getDistributeLock()) {
-            return Result.error("姝ゅ埢鏈変汉涓嬪彂涓紝涓洪伩鍏嶅啿绐侊紝璇风◢鍚庨噸璇�");
-        }
+        if (!getDistributeLock()) { return Result.error("姝ゅ埢鏈変汉涓嬪彂涓紝涓洪伩鍏嶅啿绐侊紝璇风◢鍚庨噸璇�"); }
         try {
             if (query.getIds().isEmpty()) {
                 query.setIds(new LambdaQueryChainWrapper<>(baseMapper)
@@ -340,14 +344,15 @@
                         .collect(Collectors.toList()));
                 distributeWayEnum = WorkOrderDistributeWayEnum.ALL_DISTRIBUTE;
             }
-            if (query.getIds().isEmpty()) {
-                return Result.error("娌℃湁宸ュ崟寰呬笅鍙�");
-            }
+            if (query.getIds().isEmpty()) { return Result.error("娌℃湁宸ュ崟寰呬笅鍙�"); }
             new LambdaUpdateChainWrapper<>(baseMapper)
                     .set(WorkOrder::getStatus, WorkOrderStatusEnum.DISTRIBUTED)
                     .in(WorkOrder::getId, query.getIds())
                     .update();
             addDistributeRecord(query.getIds(), distributeWayEnum);
+            // 鍚屾鐐逛綅鐘舵��
+            List<Integer> pointIds = new LambdaQueryChainWrapper<>(baseMapper).select(WorkOrder::getPointId).in(WorkOrder::getId, query.getIds()).list().stream().map(WorkOrder::getPointId).toList();
+            ywPointService.updateRecovery(pointIds, 1);
             return Result.ok("鎴愬姛涓嬪彂" + query.getIds().size() + "鏉″伐鍗�");
         } catch (Exception e) {
             return Result.error("鎿嶄綔澶辫触");
diff --git a/ycl-server/src/main/java/com/ycl/platform/service/impl/YwPointServiceImpl.java b/ycl-server/src/main/java/com/ycl/platform/service/impl/YwPointServiceImpl.java
index b18d3a5..258f830 100644
--- a/ycl-server/src/main/java/com/ycl/platform/service/impl/YwPointServiceImpl.java
+++ b/ycl-server/src/main/java/com/ycl/platform/service/impl/YwPointServiceImpl.java
@@ -1,43 +1,35 @@
 package com.ycl.platform.service.impl;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
 import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ycl.platform.base.BaseSelect;
-import com.ycl.platform.domain.entity.Region;
 import com.ycl.platform.domain.entity.YwPeople;
 import com.ycl.platform.domain.entity.YwPoint;
-import com.ycl.platform.domain.entity.YwUnit;
 import com.ycl.platform.domain.form.BatchEditPointForm;
-import com.ycl.platform.mapper.RegionMapper;
+import com.ycl.platform.domain.form.YwPointForm;
+import com.ycl.platform.domain.query.YwPointQuery;
+import com.ycl.platform.domain.vo.YwPointVO;
 import com.ycl.platform.mapper.YwPeopleMapper;
 import com.ycl.platform.mapper.YwPointMapper;
-import com.ycl.platform.mapper.YwUnitMapper;
 import com.ycl.platform.service.YwPointService;
 import com.ycl.platform.service.YwUnitService;
 import com.ycl.system.Result;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.ycl.platform.domain.form.YwPointForm;
-import com.ycl.platform.domain.vo.YwPointVO;
-import com.ycl.platform.domain.query.YwPointQuery;
-import java.util.List;
-
-import com.ycl.system.entity.SysUser;
 import com.ycl.system.mapper.SysDeptMapper;
-import com.ycl.system.service.ISysDeptService;
-
-import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.ycl.system.page.PageUtil;
+import com.ycl.utils.DateUtils;
 import com.ycl.utils.SecurityUtils;
-import enumeration.general.RegionLevelEnum;
-import org.springframework.stereotype.Service;
+import lombok.RequiredArgsConstructor;
 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.StringUtils;
+
+import java.util.List;
 import java.util.Objects;
 import java.util.stream.Collectors;
-import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
-import lombok.RequiredArgsConstructor;
-import org.springframework.util.StringUtils;
 
 /**
  * 杩愮淮鐐逛綅 鏈嶅姟瀹炵幇绫�
@@ -214,4 +206,13 @@
         }).collect(Collectors.toList());
         return Result.ok().data(data);
     }
+
+    @Override
+    public boolean updateRecovery(List<Integer> pointIds, int recovery) {
+        return new LambdaUpdateChainWrapper<>(baseMapper)
+                .in(YwPoint::getId, pointIds)
+                .set(YwPoint::getRecovery, recovery)
+                .set(recovery == 0, YwPoint::getRecoveryTime, DateUtils.getNowDate())
+                .update();
+    }
 }
diff --git a/ycl-server/src/main/java/com/ycl/task/CarTask.java b/ycl-server/src/main/java/com/ycl/task/CarTask.java
index 0834c2b..5608389 100644
--- a/ycl-server/src/main/java/com/ycl/task/CarTask.java
+++ b/ycl-server/src/main/java/com/ycl/task/CarTask.java
@@ -3,7 +3,9 @@
 
 import com.ycl.calculate.CalculationStrategy;
 import com.ycl.factory.IndexCalculationFactory;
+import com.ycl.platform.domain.result.HK.CrossDetailResult;
 import com.ycl.platform.domain.result.HK.SnapshotDataMonitorResult;
+import com.ycl.platform.domain.result.HK.SnapshotDelayMonitorResult;
 import com.ycl.utils.DateUtils;
 import constant.ApiConstants;
 import constant.CalculationStrategyConstants;
@@ -33,10 +35,31 @@
         Query query = new Query();
         query.addCriteria(Criteria
                 .where("mongoCreateTime").gte(DateUtils.getDayStart(yesterday)).lt(DateUtils.getDayEnd(yesterday))
-                .and("dataType").is(ApiConstants.HK_DATATYPE_CAR));
-        List<SnapshotDataMonitorResult> snapshotDataMonitorResults = mongoTemplate.find(query, SnapshotDataMonitorResult.class);
-        CalculationStrategy<SnapshotDataMonitorResult> siteOnlineCalculator = IndexCalculationFactory.getCalculator(CalculationStrategyConstants.CAR_SiteOnline_ViewStability);
-        siteOnlineCalculator.calculate(snapshotDataMonitorResults);
+                .and("dataType").is(ApiConstants.HK_DataType_CAR));
+        List<SnapshotDataMonitorResult> results = mongoTemplate.find(query, SnapshotDataMonitorResult.class);
+        CalculationStrategy<SnapshotDataMonitorResult> calculator = IndexCalculationFactory.getCalculator(CalculationStrategyConstants.Car_SiteOnline_ViewStability);
+        calculator.calculate(results);
+    }
+    public void infoAccuracyTask(){
+        Date yesterday = DateUtils.addDays(new Date(), -1);
+        //璁$畻杞﹁締鍗″彛淇℃伅閲囬泦鍑嗙‘鐜�
+        Query query = new Query();
+        query.addCriteria(Criteria
+                .where("mongoCreateTime").gte(DateUtils.getDayStart(yesterday)).lt(DateUtils.getDayEnd(yesterday)));
+        List<CrossDetailResult> results = mongoTemplate.find(query, CrossDetailResult.class);
+        CalculationStrategy calculator = IndexCalculationFactory.getCalculator(CalculationStrategyConstants.Car_InfoAccuracy);
+        calculator.calculate(results);
+    }
+    public void snapShopDelay(){
+        Date yesterday = DateUtils.addDays(new Date(), -1);
+        //璁$畻杞﹁締鍗″彛淇℃伅閲囬泦鍑嗙‘鐜�
+        Query query = new Query();
+        query.addCriteria(Criteria
+                .where("mongoCreateTime").gte(DateUtils.getDayStart(yesterday)).lt(DateUtils.getDayEnd(yesterday))
+                .and("dataType").is(ApiConstants.HK_DataType_CAR));
+        List<SnapshotDelayMonitorResult> results = mongoTemplate.find(query, SnapshotDelayMonitorResult.class);
+        CalculationStrategy calculator = IndexCalculationFactory.getCalculator(CalculationStrategyConstants.Car_SnapshotDelay);
+        calculator.calculate(results);
     }
 
 
diff --git a/ycl-server/src/main/java/com/ycl/task/FaceTask.java b/ycl-server/src/main/java/com/ycl/task/FaceTask.java
index aa29496..f258b5a 100644
--- a/ycl-server/src/main/java/com/ycl/task/FaceTask.java
+++ b/ycl-server/src/main/java/com/ycl/task/FaceTask.java
@@ -3,7 +3,10 @@
 
 import com.ycl.calculate.CalculationStrategy;
 import com.ycl.factory.IndexCalculationFactory;
+import com.ycl.platform.domain.result.HK.CrossDetailResult;
+import com.ycl.platform.domain.result.HK.MonitoringDetailResult;
 import com.ycl.platform.domain.result.HK.SnapshotDataMonitorResult;
+import com.ycl.platform.domain.result.HK.SnapshotDelayMonitorResult;
 import com.ycl.utils.DateUtils;
 import constant.ApiConstants;
 import constant.CalculationStrategyConstants;
@@ -33,10 +36,30 @@
         Query query = new Query();
         query.addCriteria(Criteria
                 .where("mongoCreateTime").gte(DateUtils.getDayStart(yesterday)).lt(DateUtils.getDayEnd(yesterday))
-                .and("dataType").is(ApiConstants.HK_DATATYPE_FACE));
-        List<SnapshotDataMonitorResult> snapshotDataMonitorResults = mongoTemplate.find(query, SnapshotDataMonitorResult.class);
-        CalculationStrategy<SnapshotDataMonitorResult> siteOnlineCalculator = IndexCalculationFactory.getCalculator(CalculationStrategyConstants.Face_SiteOnline_ViewStability);
-        siteOnlineCalculator.calculate(snapshotDataMonitorResults);
+                .and("dataType").is(ApiConstants.HK_DataType_FACE));
+        List<SnapshotDataMonitorResult> results = mongoTemplate.find(query, SnapshotDataMonitorResult.class);
+        CalculationStrategy calculator = IndexCalculationFactory.getCalculator(CalculationStrategyConstants.Face_SiteOnline_ViewStability);
+        calculator.calculate(results);
     }
-
+    public void InfoAccuracyTask(){
+        Date yesterday = DateUtils.addDays(new Date(), -1);
+        //璁$畻杞﹁締鍗″彛淇℃伅閲囬泦鍑嗙‘鐜�
+        Query query = new Query();
+        query.addCriteria(Criteria
+                .where("mongoCreateTime").gte(DateUtils.getDayStart(yesterday)).lt(DateUtils.getDayEnd(yesterday)));
+        List<MonitoringDetailResult> results = mongoTemplate.find(query, MonitoringDetailResult.class);
+        CalculationStrategy calculator = IndexCalculationFactory.getCalculator(CalculationStrategyConstants.Face_InfoAccuracy);
+        calculator.calculate(results);
+    }
+    public void snapShopDelay(){
+        Date yesterday = DateUtils.addDays(new Date(), -1);
+        //璁$畻杞﹁締鍗″彛淇℃伅閲囬泦鍑嗙‘鐜�
+        Query query = new Query();
+        query.addCriteria(Criteria
+                .where("mongoCreateTime").gte(DateUtils.getDayStart(yesterday)).lt(DateUtils.getDayEnd(yesterday))
+                .and("dataType").is(ApiConstants.HK_DataType_FACE));
+        List<SnapshotDelayMonitorResult> results = mongoTemplate.find(query, SnapshotDelayMonitorResult.class);
+        CalculationStrategy calculator = IndexCalculationFactory.getCalculator(CalculationStrategyConstants.Face_SnapshotDelay);
+        calculator.calculate(results);
+    }
 }
diff --git a/ycl-server/src/main/java/com/ycl/task/HKTask.java b/ycl-server/src/main/java/com/ycl/task/HKTask.java
index dd81b77..376f750 100644
--- a/ycl-server/src/main/java/com/ycl/task/HKTask.java
+++ b/ycl-server/src/main/java/com/ycl/task/HKTask.java
@@ -86,33 +86,33 @@
         log.info("寮�濮嬫墽琛屾姄鎷嶆暟鎹噺妫�娴嬬粨鏋滄暟鎹悓姝�");
         /** 杞﹁締鏁版嵁 */
         SnapshotDataMonitorParam carParam = new SnapshotDataMonitorParam();
-        carParam.setPageNO(ApiConstants.pageNo).setPageSize(ApiConstants.pageSize).setDate(DateUtils.getDate()).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("mongoCreateTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date()))
-                    .and("dataType").is(ApiConstants.HK_DATATYPE_CAR));
+                    .and("dataType").is(ApiConstants.HK_DataType_CAR));
             DeleteResult result = mongoTemplate.remove(query, SnapshotDataMonitorResult.class);
             //瀛樻斁鍦╩ongo涓�
-            carList.forEach(item -> item.setDataType(ApiConstants.HK_DATATYPE_CAR));
+            carList.forEach(item -> item.setDataType(ApiConstants.HK_DataType_CAR));
             mongoTemplate.insert(carList);
         }
 
         /** 浜鸿劯鏁版嵁 */
         SnapshotDataMonitorParam faceParam = new SnapshotDataMonitorParam();
-        faceParam.setPageNO(ApiConstants.pageNo).setPageSize(ApiConstants.pageSize).setDate(DateUtils.getDate()).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<SnapshotDataMonitorResult> faceList = getDataList(faceJsonObject, SnapshotDataMonitorResult.class, "浜鸿劯鎶撴媿鏁版嵁閲忔娴嬬粨鏋滄暟鎹负绌�");
         if (!CollectionUtils.isEmpty(faceList)) {
             //濡傛灉浠婂ぉ瀛樺湪涔嬪墠鐨勬暟鎹厛鍒犻櫎
             Query query = new Query(Criteria
                     .where("mongoCreateTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date()))
-                    .and("dataType").is(ApiConstants.HK_DATATYPE_FACE));
+                    .and("dataType").is(ApiConstants.HK_DataType_FACE));
             DeleteResult result = mongoTemplate.remove(query, SnapshotDataMonitorResult.class);
             //瀛樻斁鍦╩ongo涓�
-            carList.forEach(item -> item.setDataType(ApiConstants.HK_DATATYPE_FACE));
+            carList.forEach(item -> item.setDataType(ApiConstants.HK_DataType_FACE));
             mongoTemplate.insert(faceList);
         }
         //TODO:宸ュ崟
@@ -164,7 +164,7 @@
         log.info("寮�濮嬫墽琛屾暟鎹畬鏁存�х洃娴嬬粨鏋滄暟鎹悓姝�");
         //杞﹁締鍗″彛璁惧鎶撴媿鏁版嵁瀹屾暣鎬�
         DataIntegrityMonitoringParam param = new DataIntegrityMonitoringParam();
-        param.setPageNO(ApiConstants.pageNo).setPageSize(ApiConstants.pageSize).setDate(DateUtils.getDate()).setDataType(ApiConstants.HK_DATATYPE_CAR);
+        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)) {
@@ -184,7 +184,7 @@
         log.info("寮�濮嬫墽琛屽睘鎬ц瘑鍒噯纭洃娴嬬粨鏋滄暟鎹悓姝�");
         //杞﹁締鍗″彛璁惧鎶撴媿鏁版嵁鍑嗙‘鎬�
         AttrRecognitionParam param = new AttrRecognitionParam();
-        param.setPageNO(ApiConstants.pageNo).setPageSize(ApiConstants.pageSize).setDate(DateUtils.getDate()).setDataType(ApiConstants.HK_DATATYPE_CAR);
+        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)) {
@@ -206,33 +206,33 @@
         //杞﹁締鍗″彛璁惧鎶撴媿鏁版嵁涓婁紶鍙婃椂鎬�
         /** 杞﹁締鏁版嵁 */
         SnapshotDelayMonitorParam carParam = new SnapshotDelayMonitorParam();
-        carParam.setPageNO(ApiConstants.pageNo).setPageSize(ApiConstants.pageSize).setDate(DateUtils.getDate()).setDataType(ApiConstants.HK_DATATYPE_CAR);
+        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("mongoCreateTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date()))
-                    .and("dataType").is(ApiConstants.HK_DATATYPE_CAR));
+                    .and("dataType").is(ApiConstants.HK_DataType_CAR));
             DeleteResult result = mongoTemplate.remove(query, SnapshotDelayMonitorParam.class);
             //瀛樻斁鍦╩ongo涓�
-            carList.forEach(item -> item.setDataType(ApiConstants.HK_DATATYPE_CAR));
+            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);
+        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("mongoCreateTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date()))
-                    .and("dataType").is(ApiConstants.HK_DATATYPE_FACE));
+                    .and("dataType").is(ApiConstants.HK_DataType_FACE));
             DeleteResult result = mongoTemplate.remove(query, SnapshotDelayMonitorParam.class);
             //瀛樻斁鍦╩ongo涓�
-            carList.forEach(item -> item.setDataType(ApiConstants.HK_DATATYPE_FACE));
+            carList.forEach(item -> item.setDataType(ApiConstants.HK_DataType_FACE));
             mongoTemplate.insert(faceList);
         }
         //TODO:宸ュ崟
@@ -244,7 +244,7 @@
         log.info("寮�濮嬫墽琛屽浘鐗囪闂洃娴嬬粨鏋滄暟鎹悓姝�");
         //杞﹁締鍗″彛淇℃伅閲囬泦鍑嗙‘鐜囥�佽溅杈嗗崱鍙h澶噓rl鍙敤鎬�
         PicAccessParam param = new PicAccessParam();
-        param.setPageNO(ApiConstants.pageNo).setPageSize(ApiConstants.pageSize).setDate(DateUtils.getDate()).setDataType(ApiConstants.HK_DATATYPE_CAR);
+        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)) {
diff --git a/ycl-server/src/main/java/com/ycl/task/MonitorTask.java b/ycl-server/src/main/java/com/ycl/task/MonitorTask.java
new file mode 100644
index 0000000..ae6b11e
--- /dev/null
+++ b/ycl-server/src/main/java/com/ycl/task/MonitorTask.java
@@ -0,0 +1,88 @@
+package com.ycl.task;
+
+
+import com.alibaba.druid.support.json.JSONUtils;
+import com.alibaba.fastjson2.JSONArray;
+import com.ycl.platform.domain.entity.TMonitor;
+import com.ycl.platform.domain.result.UY.OneMachineFileResult;
+import com.ycl.platform.domain.vo.TMonitorVO;
+import com.ycl.platform.service.ITMonitorService;
+import com.ycl.system.entity.SysDictData;
+import com.ycl.system.service.ISysDictDataService;
+import com.ycl.utils.DateUtils;
+import constant.RedisConstant;
+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.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * 褰撳ぉ鏅氫笂 鍚屾mongodb涓�鏈轰竴妗e埌鏁版嵁搴�
+ */
+@Slf4j
+@Component("monitorTask")
+public class MonitorTask {
+    @Autowired
+    private MongoTemplate mongoTemplate;
+    @Autowired
+    private ITMonitorService monitorService;
+    @Autowired
+    private ISysDictDataService dictDataService;
+    @Autowired
+    private RedisTemplate redisTemplate;
+    //鍚屾mongodb涓�鏈轰竴妗e埌鏁版嵁搴�
+    public void synchronize() {
+        Query query = new Query(Criteria.where("mongoCreateTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date())));
+        List<OneMachineFileResult> oneMachineFileResults = mongoTemplate.find(query, OneMachineFileResult.class);
+        List<String> serialNumberInBase = monitorService.selectTMonitorList(null).stream().map(TMonitorVO::getSerialNumber).collect(Collectors.toList());
+        //鍑嗗鎻掑叆鏁版嵁搴撶殑鏁版嵁
+        List<TMonitor> monitorList = new ArrayList<>();
+        //鏂扮殑鏁版嵁锛屽師鏁版嵁搴撲腑涓嶅瓨鍦ㄧ殑鏁版嵁
+        Set<TMonitor> newMonitorList = new HashSet<>();
+        for (OneMachineFileResult result : oneMachineFileResults) {
+            TMonitor monitor = setMonitor(result);
+            monitorList.add(monitor);
+            //姣斿绛涢�夊嚭鏂扮殑鏁版嵁
+            if(!CollectionUtils.isEmpty(serialNumberInBase) && !serialNumberInBase.contains(result.getSBBM())){
+                newMonitorList.add(monitor);
+            }
+        }
+        //鏂扮殑鏁版嵁鏀惧叆Redis涓瓑寰呰�冩牳鎸囨爣浠诲姟浣跨敤
+        redisTemplate.opsForValue().set(RedisConstant.New_Monitor_Set, JSONArray.toJSONString(newMonitorList));
+        //TODO:瑙f瀽鍖哄煙
+
+        //TODO:瑙f瀽閲嶇偣鐐逛綅
+        //閲嶇偣鐐逛綅闆嗗悎瀛楀吀
+        SysDictData sysDictData = new SysDictData();
+        sysDictData.setDictType("platform_important_site");
+        List<SysDictData> DictDataList = dictDataService.selectDictDataList(sysDictData);
+        List<String> importantSite = DictDataList.stream().map(SysDictData::getDictValue).collect(Collectors.toList());
+
+
+    }
+
+    private TMonitor setMonitor(OneMachineFileResult result) {
+        TMonitor monitor = new TMonitor();
+        monitor.setSerialNumber(result.getSBBM());
+        monitor.setName(result.getSBMC());
+        monitor.setSiteType(Long.valueOf(result.getJKDWLX()));
+        monitor.setMacAddr(result.getMACDZ());
+        monitor.setIp(result.getIP());
+        monitor.setCameraFunType(result.getSXJGNLX());
+        monitor.setLongitude(result.getJD() + "");
+        monitor.setLatitude(result.getWD() + "");
+        monitor.setCameraCaptureArea(result.getSXJCJQY());
+        monitor.setOnState(Long.valueOf(result.getSBZT()));
+        //鍥芥爣鐮佸墠鍏綅涓鸿鏀跨紪鐮�
+        monitor.setCivilCode(result.getSBBM().substring(0, 8));
+        return monitor;
+    }
+}
diff --git a/ycl-server/src/main/java/com/ycl/task/UYTask.java b/ycl-server/src/main/java/com/ycl/task/UYTask.java
index f529f48..4a359d9 100644
--- a/ycl-server/src/main/java/com/ycl/task/UYTask.java
+++ b/ycl-server/src/main/java/com/ycl/task/UYTask.java
@@ -9,6 +9,7 @@
 import com.ycl.platform.domain.result.UY.OneMachineFileResult;
 import com.ycl.platform.domain.result.UY.QueryVqdResult;
 import com.ycl.platform.domain.result.UY.RecordMetaDSumResult;
+import com.ycl.platform.service.ITMonitorService;
 import com.ycl.platform.service.IYwThresholdService;
 import com.ycl.utils.DateUtils;
 import constant.ApiConstants;
@@ -23,6 +24,7 @@
 
 import java.util.Date;
 import java.util.List;
+import java.util.stream.Collectors;
 
 //浼樹簯瀵规帴鏁版嵁浠诲姟
 @Slf4j
@@ -35,7 +37,8 @@
     private UYClient uyClient;
     @Autowired
     private IYwThresholdService ywThresholdService;
-
+    @Autowired
+    private ITMonitorService monitorService;
     @Value("${youYun.tenantId}")
     private String tenantId;
 
diff --git a/ycl-server/src/main/resources/mapper/zgyw/CheckScoreMapper.xml b/ycl-server/src/main/resources/mapper/zgyw/CheckScoreMapper.xml
index 2bc0f1f..ae68b76 100644
--- a/ycl-server/src/main/resources/mapper/zgyw/CheckScoreMapper.xml
+++ b/ycl-server/src/main/resources/mapper/zgyw/CheckScoreMapper.xml
@@ -123,21 +123,17 @@
 
     <select id="selectCheckScoreMap" resultType="com.ycl.platform.domain.entity.CheckScore">
         SELECT
+            id,
             tcs.dept_id,
             examine_category,
-            ROUND(AVG(score), 2) AS score,
-            #{startDate} AS startDate,
-            #{endDate} AS endDate,
-            ANY_VALUE(tcs.create_time) AS createTime
+            ROUND(AVG(score) OVER(PARTITION BY tcs.dept_id, examine_category), 2) AS score,
+            tcs.create_time AS createTime
         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
+          AND DATE_FORMAT(tcs.create_time, '%Y-%m') BETWEEN DATE_FORMAT(#{startDate}, '%Y-%m') AND DATE_FORMAT(#{endDate}, '%Y-%m')
     </select>
 
 </mapper>
\ No newline at end of file
diff --git a/ycl-server/src/main/resources/mapper/zgyw/TMonitorMapper.xml b/ycl-server/src/main/resources/mapper/zgyw/TMonitorMapper.xml
index 460ec85..687d7f7 100644
--- a/ycl-server/src/main/resources/mapper/zgyw/TMonitorMapper.xml
+++ b/ycl-server/src/main/resources/mapper/zgyw/TMonitorMapper.xml
@@ -37,22 +37,22 @@
         <result property="hybm"    column="hybm"    />
         <result property="lxbm"    column="lxbm"    />
         <result property="reason"    column="reason"    />
-        <result property="defaultOrder"    column="default_order"    />
         <result property="recovery"    column="recovery"    />
         <result property="recoveryTime"    column="recovery_time"    />
         <result property="deptId"    column="dept_id"    />
     </resultMap>
 
     <sql id="selectTMonitorVo">
-        select id, serial_number, name, site_type, mac_addr, ip, camera_fun_type, longitude, latitude, camera_capture_area, on_state, civil_code, integrated_device, camera_brand, address, net_working, public_security, installed_time, management_unit, mu_contact_info, storage_days, monitor_azimuth, scene_photo_addr, model, site_vulgo, camera_type, camera_light_type, encoded_format, camera_dept, hybm, lxbm, reason, default_order,recovery,recovery_time,dept_id from t_monitor
+        select id, serial_number, name, site_type, mac_addr, ip, camera_fun_type, longitude, latitude, camera_capture_area, on_state, civil_code, integrated_device, camera_brand, address, net_working, public_security, installed_time, management_unit, mu_contact_info, storage_days, monitor_azimuth, scene_photo_addr, model, site_vulgo, camera_type, camera_light_type, encoded_format, camera_dept, hybm, lxbm from t_monitor
     </sql>
 
     <select id="selectTMonitorList" resultType="com.ycl.platform.domain.vo.TMonitorVO">
-        select id, serial_number, name, site_type, mac_addr, ip, camera_fun_type, longitude, latitude, camera_capture_area, on_state, civil_code, integrated_device, camera_brand, address, net_working, public_security, installed_time, management_unit, mu_contact_info, storage_days
-        , monitor_azimuth, scene_photo_addr, model, site_vulgo, camera_type, camera_light_type, encoded_format, camera_dept, hybm, lxbm, reason, default_order,recovery,recovery_time,d.dept_name from t_monitor m
-        left join sys_dept d on m.dept_id = d.dept_id
+        select m.id, m.serial_number, name, site_type, mac_addr, ip, camera_fun_type, longitude, latitude, camera_capture_area, on_state, civil_code, integrated_device, camera_brand, address, net_working, public_security, installed_time, management_unit, mu_contact_info, storage_days
+        , monitor_azimuth, scene_photo_addr, model, site_vulgo, camera_type, camera_light_type, encoded_format, camera_dept, hybm, lxbm, d.dept_name from t_monitor m
+        left join t_yw_point p on m.serial_number = p.serial_number
+        left join sys_dept d on p.dept_id = d.dept_id
         <where>
-            <if test="serialNumber != null  and serialNumber != ''"> and serial_number = #{serialNumber}</if>
+            <if test="serialNumber != null  and serialNumber != ''"> and m.serial_number = #{serialNumber}</if>
             <if test="name != null  and name != ''"> and name like concat('%', #{name}, '%')</if>
             <if test="siteType != null "> and site_type = #{siteType}</if>
             <if test="macAddr != null  and macAddr != ''"> and mac_addr = #{macAddr}</if>
@@ -82,11 +82,7 @@
             <if test="cameraDept != null  and cameraDept != ''"> and camera_dept = #{cameraDept}</if>
             <if test="hybm != null  and hybm != ''"> and hybm = #{hybm}</if>
             <if test="lxbm != null "> and lxbm = #{lxbm}</if>
-            <if test="reason != null  and reason != ''"> and reason = #{reason}</if>
-            <if test="defaultOrder != null "> and default_order = #{defaultOrder}</if>
-            <if test="recovery != null "> and recovery = #{recovery}</if>
-            <if test="recoveryTime != null "> and recovery_time = #{recoveryTime}</if>
-            <if test="deptId != null "> and m.dept_id = #{deptId}</if>
+            <if test="recovery != null "> and p.recovery = #{recovery}</if>
         </where>
         ${params.dataScope}
     </select>
@@ -129,11 +125,6 @@
             <if test="cameraDept != null">camera_dept,</if>
             <if test="hybm != null">hybm,</if>
             <if test="lxbm != null">lxbm,</if>
-            <if test="reason != null">reason,</if>
-            <if test="defaultOrder != null">default_order,</if>
-            <if test="recovery != null">recovery,</if>
-            <if test="recoveryTime != null">recovery_time,</if>
-            <if test="deptId != null">dept_id,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="serialNumber != null and serialNumber != ''">#{serialNumber},</if>
@@ -166,11 +157,6 @@
             <if test="cameraDept != null">#{cameraDept},</if>
             <if test="hybm != null">#{hybm},</if>
             <if test="lxbm != null">#{lxbm},</if>
-            <if test="reason != null">#{reason},</if>
-            <if test="defaultOrder != null">#{defaultOrder},</if>
-            <if test="recovery != null">#{recovery},</if>
-            <if test="recoveryTime != null">#{recoveryTime},</if>
-            <if test="deptId != null">#{deptId},</if>
          </trim>
     </insert>
 
@@ -207,11 +193,6 @@
             <if test="cameraDept != null">camera_dept = #{cameraDept},</if>
             <if test="hybm != null">hybm = #{hybm},</if>
             <if test="lxbm != null">lxbm = #{lxbm},</if>
-            <if test="reason != null">reason = #{reason},</if>
-            <if test="defaultOrder != null">default_order = #{defaultOrder},</if>
-            <if test="recovery != null">recovery = #{defaultOrder},</if>
-            <if test="recoveryTime != null">recovery_time = #{recoveryTime},</if>
-            <if test="deptId != null">dept_id = #{deptId},</if>
         </trim>
         where id = #{id}
     </update>
@@ -231,14 +212,10 @@
         SELECT count(*)                                                          AS totalPosts,
                IFNULL(SUM(IF(on_state = 1, 1, 0)), 0)                            AS totalMembers,
                IFNULL(SUM(IF(on_state = 2, 1, 0)), 0)                            AS postsPercentage,
-               IFNULL(SUM(IF(default_order = 1, 1, 0)), 0)                       AS totalViews,
-               -1                                                                as noStore,
-               -1                                                                as partStore,
-               IFNULL(ROUND(SUM(IF(on_state = 1, 1, 0)) / count(*) * 100, 2), 0) as viewsPercentage,
-               -1                                                                as totalFace,
-               -1                                                                as totalCar
+               IFNULL(ROUND(SUM(IF(on_state = 1, 1, 0)) / count(*) * 100, 2), 0) as viewsPercentage
         FROM t_monitor m
-         left join sys_dept d on m.dept_id = d.dept_id
+            left join t_yw_point p on m.serial_number = p.serial_number
+            left join sys_dept d on p.dept_id = d.dept_id
         <where>
             camera_fun_type like concat('%', #{cameraFunType}, '%')
         </where>
@@ -246,13 +223,24 @@
     </select>
 
     <select id="recoveryException" resultType="java.util.Map">
+        <![CDATA[
         SELECT count(*)                                                          AS totalPosts,
                IFNULL(SUM(IF(on_state = 1, 1, 0)), 0)                            AS totalMembers,
                IFNULL(SUM(IF(on_state = 2, 1, 0)), 0)                            AS postsPercentage,
-               IFNULL(SUM(IF(default_order = 1, 1, 0)), 0)                       AS totalViews,
                IFNULL(ROUND(SUM(IF(on_state = 1, 1, 0)) / count(*) * 100, 2), 0) as viewsPercentage
-        FROM t_monitor
-        WHERE recovery = 1
+        FROM t_monitor t
+        LEFT JOIN t_yw_point p ON t.serial_number = p.serial_number
+        WHERE p.recovery = 1 OR TIMESTAMPDIFF(DAY, p.recovery_time, NOW()) <= #{time}
+        ]]>
+    </select>
+
+    <select id="selectRecoveryMonitor" resultType="com.ycl.platform.domain.vo.TMonitorVO">
+        <![CDATA[
+        SELECT t.id, p.serial_number, name, site_type, mac_addr, ip, camera_fun_type, longitude, latitude, camera_capture_area, on_state, civil_code, integrated_device, camera_brand, address, net_working, public_security, installed_time, management_unit, mu_contact_info, storage_days, monitor_azimuth, scene_photo_addr, model, site_vulgo, camera_type, camera_light_type, encoded_format, camera_dept, hybm, lxbm
+        FROM t_monitor t
+        LEFT JOIN t_yw_point p ON t.serial_number = p.serial_number
+        WHERE TIMESTAMPDIFF(DAY, p.recovery_time, NOW()) <= #{time}
+        ]]>
     </select>
 
 </mapper>

--
Gitblit v1.8.0