From ffa3485e9d36911f3b6aeac7ddbcca61c3e3dde6 Mon Sep 17 00:00:00 2001
From: pansen <pansen626@sina.com>
Date: 星期四, 10 一月 2019 20:12:15 +0800
Subject: [PATCH] Merge svn 3352

---
 QiaoJiaSystem/VideoServer/QiaoJia/DB/DBStruct.h       |   70 
 QiaoJiaSystem/VideoAnalysFromHC/RtspAnalysElement.cpp |  236 ++--
 QiaoJiaSystem/StructureApp/PerimeterElement.cpp       |  364 ++++--
 QiaoJiaSystem/VideoServer/QiaoJia/DB/LDBTool.h        |   20 
 QiaoJiaSystem/StructureApp/TrackingTrigger.h          |    4 
 QiaoJiaSystem/StructureApp/JudgmentRetrogradeTool.h   |   88 +
 QiaoJiaSystem/StructureApp/AppPipeController.h        |   29 
 QiaoJiaSystem/StructureApp/JudgmentRetrogradeTool.cpp |  211 +++
 QiaoJiaSystem/StructureApp/FaceExtractElement.h       |    5 
 QiaoJiaSystem/RapidStructureApp/TriggerElement.cpp    |    2 
 QiaoJiaSystem/StructureApp/PerimeterElement.h         |   44 
 QiaoJiaSystem/StructureApp/main.cpp                   |   16 
 QiaoJiaSystem/CMakeLists.txt                          |    2 
 QiaoJiaSystem/StructureApp/PersonElement.cpp          |  148 ++
 QiaoJiaSystem/build/YoloServer                        |    0 
 QiaoJiaSystem/VideoAnalysFromHC/RtspAnalysElement.h   |    5 
 QiaoJiaSystem/DataManagerServer/CMakeLists.txt        |    2 
 QiaoJiaSystem/VideoAnalysFromHC/BaiscSDKAnalysVideo.h |   54 
 QiaoJiaSystem/FaceDetectServer/CMakeLists.txt         |    3 
 QiaoJiaSystem/StructureApp/FaceRpcElement.cpp         |   69 +
 QiaoJiaSystem/StructureApp/PerStaticElement.cpp       |  274 +++++
 QiaoJiaSystem/StructureApp/PersonElement.h            |   54 +
 QiaoJiaSystem/RapidStructureApp/CMakeLists.txt        |    1 
 QiaoJiaSystem/StructureApp/AppPipeController.cpp      |  252 +++-
 QiaoJiaSystem/StructureApp/FaceRpcElement.h           |   14 
 QiaoJiaSystem/StructureApp/AppPipeControllerTest.cpp  |   16 
 QiaoJiaSystem/DataManagerServer/http_configserver.cpp |  233 ++++
 QiaoJiaSystem/VideoServer/QiaoJia/DB/LDBTool.cpp      |  282 ++---
 QiaoJiaSystem/FaceSearchServer/CMakeLists.txt         |    1 
 QiaoJiaSystem/VideoAnalysFromHC/CMakeLists.txt        |    3 
 QiaoJiaSystem/StructureApp/CMakeLists.txt             |    6 
 QiaoJiaSystem/DataManagerServer/http_configserver.h   |   13 
 QiaoJiaSystem/YoloServer/CMakeLists.txt               |    2 
 QiaoJiaSystem/DataManagerServer/web-server接口.txt      |  116 ++
 QiaoJiaSystem/StructureApp/PerStaticElement.h         |   84 +
 QiaoJiaSystem/StructureApp/YoloRpcElement.cpp         |  206 +--
 QiaoJiaSystem/StructureApp/FaceExtractElement.cpp     |   11 
 QiaoJiaSystem/StructureApp/YoloRpcElement.h           |   23 
 38 files changed, 2,061 insertions(+), 902 deletions(-)

diff --git a/QiaoJiaSystem/CMakeLists.txt b/QiaoJiaSystem/CMakeLists.txt
index 2da842a..400e343 100644
--- a/QiaoJiaSystem/CMakeLists.txt
+++ b/QiaoJiaSystem/CMakeLists.txt
@@ -16,7 +16,7 @@
 
 add_subdirectory(StructureApp)
 add_subdirectory(FaceDetectServer)
-#add_subdirectory(YoloServer)
+add_subdirectory(YoloServer)
 add_subdirectory(FaceSearchServer)
 add_subdirectory(VideoAnalysFromHC)
 add_subdirectory(RapidStructureApp)
diff --git a/QiaoJiaSystem/DataManagerServer/CMakeLists.txt b/QiaoJiaSystem/DataManagerServer/CMakeLists.txt
index d774952..9e4b341 100644
--- a/QiaoJiaSystem/DataManagerServer/CMakeLists.txt
+++ b/QiaoJiaSystem/DataManagerServer/CMakeLists.txt
@@ -96,6 +96,8 @@
     ../FaceSearchServer/CasiaFaceWrapper/CasiaFaceWrapperN.h
     ../../../BasicPlatForm/basic/pipe_element/ffmpeg/FfmpegElement.cpp
     ../../../BasicPlatForm/basic/pipe_element/ffmpeg/VideoChangeScore.cpp
+    ../../../BasicPlatForm/basic/timer_counter/Clocktimer.cpp
+
 
 
     ../../syncDBTool/ErlangDbTool.cpp
diff --git a/QiaoJiaSystem/DataManagerServer/http_configserver.cpp b/QiaoJiaSystem/DataManagerServer/http_configserver.cpp
index d27d6fd..c857f11 100644
--- a/QiaoJiaSystem/DataManagerServer/http_configserver.cpp
+++ b/QiaoJiaSystem/DataManagerServer/http_configserver.cpp
@@ -226,6 +226,20 @@
                                std::bind(&devHttpServer_c::editDevId, this,
                                          std::placeholders::_1, std::placeholders::_2,
                                          std::placeholders::_3, std::placeholders::_4));
+    _HttpSrvRetRecieve.setInfo("^/findSdkRule$", "POST",
+                               std::bind(&devHttpServer_c::findSdkRule, this,
+                                         std::placeholders::_1, std::placeholders::_2,
+                                         std::placeholders::_3, std::placeholders::_4));
+    _HttpSrvRetRecieve.setInfo("^/editSdkRule$", "POST",
+                               std::bind(&devHttpServer_c::editSdkRule, this,
+                                         std::placeholders::_1, std::placeholders::_2,
+                                         std::placeholders::_3, std::placeholders::_4));
+    _HttpSrvRetRecieve.setInfo("^/getSnapshot$", "POST",
+                               std::bind(&devHttpServer_c::getSnapshot, this,
+                                         std::placeholders::_1, std::placeholders::_2,
+                                         std::placeholders::_3, std::placeholders::_4));
+
+
     _HttpSrvRetRecieve.start();
     _HttpSrvRetRecieve.waitForShutDown();
 }
@@ -969,10 +983,10 @@
         elem["str_brand"] = iter->str_brand.toStdString();
         elem["str_reserved"] = iter->str_reserved.toStdString();
 
-        Record_Cam_Sdk rec_sdk = db_c.searchCamSdkTableByCamId(iter->str_cam_dev_id);
-        elem["str_sdks"] = rec_sdk.str_sdks.toStdString();
-        elem["str_det_thr"] = rec_sdk.str_det_thr.toStdString();
-        elem["str_cmp_thr"] = rec_sdk.str_cmp_thr.toStdString();
+//        Record_Cam_Sdk rec_sdk = db_c.searchCamSdkTableByCamId(iter->str_cam_dev_id);
+//        elem["str_sdks"] = rec_sdk.str_sdks.toStdString();
+//        elem["str_det_thr"] = rec_sdk.str_det_thr.toStdString();
+//        elem["str_cmp_thr"] = rec_sdk.str_cmp_thr.toStdString();
 
         cout << elem.toStyledString() << endl;
 
@@ -1021,12 +1035,12 @@
         rec.str_password = QString::fromStdString(value["str_password"].asString());
         rec.str_brand = QString::fromStdString(value["str_brand"].asString());
 
-        rec_sdk_old = db_c.searchCamSdkTableByCamId(rec.str_cam_dev_id);
+//        rec_sdk_old = db_c.searchCamSdkTableByCamId(rec.str_cam_dev_id);
 
-        rec_sdk.str_cam_dev_id = rec.str_cam_dev_id;
-        rec_sdk.str_sdks = QString::fromStdString(value["str_sdks"].asString());
-        rec_sdk.str_det_thr = QString::fromStdString(value["str_det_thr"].asString());
-        rec_sdk.str_cmp_thr = QString::fromStdString(value["str_cmp_thr"].asString());
+//        rec_sdk.str_cam_dev_id = rec.str_cam_dev_id;
+//        rec_sdk.str_sdks = QString::fromStdString(value["str_sdks"].asString());
+//        rec_sdk.str_det_thr = QString::fromStdString(value["str_det_thr"].asString());
+//        rec_sdk.str_cmp_thr = QString::fromStdString(value["str_cmp_thr"].asString());
 
         ret = db_c.updateCamAndSdkTable(rec, rec_sdk);
         if (!ret) {
@@ -1040,14 +1054,14 @@
         db_c.updateConfigTableByDevType(DEV_CAMERA);
         runAllApp();
     }
-        //edit camera's sdks
-    else/* if ((rec_sdk_old.str_sdks != rec_sdk.str_sdks) ||
-             (rec_sdk_old.str_det_thr != rec_sdk.str_det_thr) ||
-             (rec_sdk_old.str_cmp_thr != rec_sdk.str_cmp_thr)) */{
-        killVideoAnalysFromHCApp();
-        sleep(1);
-        runAllApp();
-    }
+    //edit camera's sdks
+//    else/* if ((rec_sdk_old.str_sdks != rec_sdk.str_sdks) ||
+//             (rec_sdk_old.str_det_thr != rec_sdk.str_det_thr) ||
+//             (rec_sdk_old.str_cmp_thr != rec_sdk.str_cmp_thr)) */{
+//        killVideoAnalysFromHCApp();
+//        sleep(1);
+//        runAllApp();
+//    }
 
     Json::Value value_out;
     value_out["str_cam_dev_id"] = rec.str_cam_dev_id.toStdString();
@@ -1435,8 +1449,8 @@
 
     if (reader.parse(content, value)) {
         int cut_max_duration = value["cut_max_duration"].asInt();
-
-        ret = db_c.updateConfigTableByCutDuration(cut_max_duration);
+        int cut_min_duration = value["cut_min_duration"].asInt();
+        ret = db_c.updateConfigTableByCutDuration(cut_max_duration, cut_min_duration);
 
     } else {
         return "{\"ret_status\": \"浼犺緭閿欒锛岃妫�鏌ワ紒\"}";
@@ -1460,10 +1474,11 @@
 
     Json::Value value;
 
-    int cut_max_duration = db_c.searchConfigTableWithinCutDuration();
 
-    value["cut_max_duration"] = cut_max_duration;
+    Record_Config rec = db_c.searchConfigTableWithinServerInfo();
 
+    value["cut_max_duration"] = rec.n_cut_max_duration;
+    value["cut_min_duration"] = rec.n_cut_min_duration;
     std::string out = value.toStyledString();
 
     return out;
@@ -2542,7 +2557,7 @@
 std::string devHttpServer_c::getVideoPathByTime(const std::string &time, const std::string &camId, qint64 &sub) {
     std::string t_FilePath = appConfig.getStringProperty("cutPath");
 
-    bool find = false;;
+    bool find = false;
     if (t_FilePath.back() != '/') {
         t_FilePath.push_back('/');
     }
@@ -2833,3 +2848,177 @@
 //        return "{\"error\":\"浼犺緭閿欒锛岃妫�鏌ワ紒\"}";
     }
 }
+
+std::string devHttpServer_c::editSdkRule(std::string ip, unsigned int port, std::string content, PResponse &response) {
+    Json::Reader reader;
+    Json::Value value;
+    Json::FastWriter writer;
+    if (reader.parse(content, value)) {
+        SdkRule rule;
+        rule.nSdkType = value["nSdkType"].asInt();
+        rule.nAlarmNumLowerLimit = value["nAlarmNumLowerLimit"].asInt();
+        rule.nAlarmNumUpperLimit = value["nAlarmNumUpperLimit"].asInt();
+        rule.nTriggerDelay = value["nTriggerDelay"].asInt();
+        rule.nTriggerTolerance = value["nTriggerTolerance"].asInt();
+        rule.nThreshold = value["nThreshold"].asInt();
+        rule.nQuality = value["nQuality"].asInt();
+        rule.nIsRun = value["nIsRun"].asInt();
+        rule.strBroadcast = value["nIsBroadcast"].asCString();
+        rule.strAreas = value["strAreas"].asCString();
+        rule.strCamId = value["strCamId"].asCString();
+        rule.strExAreas = value["strExAreas"].asCString();
+        rule.strLine = value["strLine"].asCString();
+        rule.strExLine = value["strExLine"].asCString();
+        if (rule.strCamId.isEmpty()) {
+            return "{\"ret_status\":\"鍐呭鏈夎锛岃妫�鏌ワ紒\"}";
+        }
+        if (rule.nSdkType <= SdkTypeStart || rule.nSdkType >= SdkTypeEnd) {
+            return "{\"ret_status\":\"鍐呭鏈夎锛岃妫�鏌ワ紒\"}";
+        }
+
+        for (int i = 0; i < value["weekRuleArray"].size(); ++i) {
+            Json::Value item = value["weekRuleArray"][i];
+            LActRuleWeekRecord weekRule;
+            weekRule.m_nSdkType = rule.nSdkType;
+            weekRule.m_nType = item["nType"].asInt();
+            weekRule.m_strCamId = rule.strCamId;
+            weekRule.m_strBegin = item["strBegin"].asCString();
+            weekRule.m_strEnd = item["strEnd"].asCString();
+            //rule.weekRuleVec.push_back(weekRule);
+            db_c.updateCameraWeekRule(weekRule);
+        }
+
+
+        if (db_c.updateSdkRule(rule)) {
+//            if(rule.nIsRun==1)
+
+            killVideoAnalysFromHCApp();
+            sleep(1);
+            runAllApp();
+
+
+            return "{\"ret_status\": \"ok_ack\"}";
+        } else {
+            return "{\"ret_status\":\"鍐呭鏈夎锛岃妫�鏌ワ紒\"}";
+        }
+    } else {
+        return "{\"error\":\"浼犺緭閿欒锛岃妫�鏌ワ紒\"}";
+    }
+}
+
+std::string devHttpServer_c::findSdkRule(std::string ip, unsigned int port, std::string content, PResponse &response) {
+    Json::Reader reader;
+    Json::Value value;
+
+    if (reader.parse(content, value)) {
+
+        QString strCamId = value["strCamId"].asCString();
+
+        SdkRuleMap ruleMap = db_c.searchSdkRuleByCamId(strCamId);
+
+        int count = ruleMap.size();
+
+        if (count > 0) {
+            Json::Value objs;
+            Json::Value obj;
+
+            for (auto rule:ruleMap) {
+                obj["nSdkType"] = rule.second.nSdkType;
+                obj["nAlarmNumLowerLimit"] = rule.second.nAlarmNumLowerLimit;
+                obj["nAlarmNumUpperLimit"] = rule.second.nAlarmNumUpperLimit;
+                obj["nTriggerDelay"] = rule.second.nTriggerDelay;
+                obj["nTriggerTolerance"] = rule.second.nTriggerTolerance;
+                obj["nThreshold"] = rule.second.nThreshold;
+                obj["nQuality"] = rule.second.nQuality;
+                obj["nIsRun"] = rule.second.nIsRun;
+                obj["nIsBroadcast"] = rule.second.strBroadcast.toStdString();
+                obj["strAreas"] = rule.second.strAreas.toStdString();
+                obj["strCamId"] = rule.second.strCamId.toStdString();
+                obj["strExAreas"] = rule.second.strExAreas.toStdString();
+                obj["strLine"] = rule.second.strLine.toStdString();
+                obj["strExLine"] = rule.second.strExLine.toStdString();
+                Json::Value weekRuleArray;
+
+
+                Json::Value weekRule;
+                std::vector<LActRuleWeekRecord> weekRuleVec = db_c.searchCameraWeekRuleByCamId(strCamId, rule.first);
+                for (int k = 0; k < weekRuleVec.size(); ++k) {
+                    Json::Value weekRuleObj;
+                    weekRuleObj["nSdkType"] = weekRuleVec[k].m_nSdkType;
+                    weekRuleObj["strCamId"] = weekRuleVec[k].m_strCamId.toStdString();
+                    weekRuleObj["strBegin"] = weekRuleVec[k].m_strBegin.toStdString();
+                    weekRuleObj["strEnd"] = weekRuleVec[k].m_strEnd.toStdString();
+                    weekRuleObj["nType"] = weekRuleVec[k].m_nType;
+                    weekRule.append(weekRuleObj);
+                }
+                //weekRuleArray[j]=weekRule;
+
+
+                obj["weekRuleArray"] = weekRule;
+                objs.append(obj);
+            }
+            return objs.toStyledString();
+        } else {
+//            return "{\"ret_status\":\"鍐呭鏈夎锛岃妫�鏌ワ紒\"}";
+            return "[]";
+        }
+    } else {
+        return "{\"error\":\"浼犺緭閿欒锛岃妫�鏌ワ紒\"}";
+    }
+}
+
+std::string devHttpServer_c::getSnapshot(std::string ip, unsigned int port, std::string content, PResponse &response) {
+    Json::Reader reader;
+    Json::Value value;
+
+    if (reader.parse(content, value)) {
+
+        std::string ip = value["str_ip"].asString();
+//        int port= value["n_port"].asInt();
+        int port = 554;
+        std::string username = value["str_username"].asString();
+        std::string pass = value["str_password"].asString();
+        std::string brand = value["str_brand"].asString();
+        std::string rtsp_url = rtspAddrBuild(ip, port, username, pass, brand);
+        if (rtsp_url.empty()) {
+            return "{\"ret_status\":\"鍐呭鏈夎锛岃妫�鏌ワ紒\"}";
+        }
+        std::string str_imgName = appConfig.getStringProperty("cutPath");
+        if (str_imgName.back() != '/') {
+            str_imgName.push_back('/');
+        }
+        str_imgName += "snapshot.jpg";
+        //admin:a1234567@192.168.1.201:554/h264/ch1/main/av_stream -r 1/25 -f image2 -s 1920*1080 /home/basic/work_src/a.jpg
+        std::string cmd("ffmpeg -i " + rtsp_url + " -r 1/25  -f image2 -s 1920*1080 -y " + str_imgName);
+        DBG(cmd);
+        system(cmd.c_str());
+
+        cv::Mat img = cv::imread(str_imgName);
+
+        if (img.empty()) {
+
+            return "{\"ret_status\":\"鍐呭鏈夎锛岃妫�鏌ワ紒\"}";
+        }
+        fdfsClient.rwLock.rdlock();
+        std::string strImgUrl = "http://";
+        if (fdfsClient.fastFds != nullptr) {
+            std::vector<unsigned char> buffer;
+            CvUtil::cvMat2Buffer(img, buffer);
+            std::string strImgUrlTmp = "";
+            fdfsClient.fastFds->uploadFile(buffer, strImgUrlTmp, "jpg");
+            strImgUrl.append(fdfsClient.fastFds->getIp() + "/" + strImgUrlTmp);
+            strImgUrl.clear();
+            strImgUrl = strImgUrlTmp;
+        }
+        fdfsClient.rwLock.unlock();
+        Json::Value result;
+        result["imgUrl"] = strImgUrl;
+
+        return result.toStyledString();
+
+
+    } else {
+        return "{\"error\":\"浼犺緭閿欒锛岃妫�鏌ワ紒\"}";
+    }
+}
+
diff --git a/QiaoJiaSystem/DataManagerServer/http_configserver.h b/QiaoJiaSystem/DataManagerServer/http_configserver.h
index 5d67869..a8b8aa6 100644
--- a/QiaoJiaSystem/DataManagerServer/http_configserver.h
+++ b/QiaoJiaSystem/DataManagerServer/http_configserver.h
@@ -117,6 +117,12 @@
 
     std::string editDevId(std::string ip, unsigned int port, std::string content, PResponse &response);
 
+    std::string findSdkRule(std::string ip, unsigned int port, std::string content, PResponse &response);
+
+    std::string editSdkRule(std::string ip, unsigned int port, std::string content, PResponse &response);
+
+    std::string getSnapshot(std::string ip, unsigned int port, std::string content, PResponse &response);
+
 private:
     void init(void);
 
@@ -168,13 +174,14 @@
 
     bool getHKDevSerialNumber(const char *ip, const int port, const char *username, const char *passwd,
                               unsigned char *serialNumber = NULL) const;
-    bool createDevId(const  int& dev_batch, const  int& dev_sequence) ;
 
-    std::string getVideoPathByTime(const std::string& time,const std::string& camId,qint64& sub);
+    bool createDevId(const int &dev_batch, const int &dev_sequence);
+
+    std::string getVideoPathByTime(const std::string &time, const std::string &camId, qint64 &sub);
 
     std::vector<std::string> forEachFile(const std::string &dir_name);
 
-    qint64 getVideoTime(/*const std::string& videoPath,*/std::string& str_tmpTime);
+    qint64 getVideoTime(/*const std::string& videoPath*/std::string &str_tmpTime);
 };
 
 #endif
diff --git "a/QiaoJiaSystem/DataManagerServer/web-server\346\216\245\345\217\243.txt" "b/QiaoJiaSystem/DataManagerServer/web-server\346\216\245\345\217\243.txt"
index 99682e8..487734a 100644
--- "a/QiaoJiaSystem/DataManagerServer/web-server\346\216\245\345\217\243.txt"
+++ "b/QiaoJiaSystem/DataManagerServer/web-server\346\216\245\345\217\243.txt"
@@ -164,9 +164,9 @@
 	"str_username" : "admin",
 	"str_password" : "123456",
 	"str_brand" : "dahua",
-	"str_sdks": "1,2,4",
-	"str_det_thr": "90,80,95",
-	"str_cmp_thr": "80,85,90",
+	//"str_sdks": "1,2,4",
+	//"str_det_thr": "90,80,95",
+	//"str_cmp_thr": "80,85,90",
 	"str_reserved": ""
 }
 杩斿洖锛�
@@ -183,30 +183,30 @@
       "str_addr" : "鏈涗含soho澶у帵濉�3 b搴�2005",
       "str_brand" : "dahua",
       "str_cam_dev_id" : "dahua:ca:me:ra:22:22:22",
-      "str_cmp_thr" : "80,92",
-      "str_det_thr" : "90,92",
+      //"str_cmp_thr" : "80,92",
+     // "str_det_thr" : "90,92",
       "str_ip" : 8080,
       "str_latitude" : "116.457092",
       "str_longitude" : "39.994827",
       "str_name" : "澶у崕鎽勫儚鏈�2",
       "str_password" : "123456",
       "str_reserved" : "",
-      "str_sdks" : "1,2",
+     // "str_sdks" : "1,2",
       "str_username" : "admin"
    },
    {
       "str_addr" : "鏈涗含soho澶у帵濉�3 b搴�33",
       "str_brand" : "dahua",
       "str_cam_dev_id" : "dahua:ca:me:ra:33:33:33",
-      "str_cmp_thr" : "80,85,93",
-      "str_det_thr" : "90,80,93",
+     // "str_cmp_thr" : "80,85,93",
+     // "str_det_thr" : "90,80,93",
       "str_ip" : 8080,
       "str_latitude" : "116.457033",
       "str_longitude" : "39.994833",
       "str_name" : "澶у崕鎽勫儚鏈�3",
       "str_password" : "123433",
       "str_reserved" : "",
-      "str_sdks" : "1,2,3",
+      //"str_sdks" : "1,2,3",
       "str_username" : "admin"
    }
 ]
@@ -280,12 +280,14 @@
 杩斿洖锛�
 {
    "cut_max_duration" : 4
+   "cut_min_duration" : 4
 }
 
 //瑙嗛鏃堕暱璁剧疆 cut_dura_edit
 涓嬪彂锛�
 {
 	"cut_max_duration" : 3
+        "cut_min_duration" : 3
 }
 杩斿洖锛氭爣鍑嗚繑鍥炲��
 
@@ -602,4 +604,98 @@
 }
 閿欒:
 鏍囧噯杩斿洖鍊�
-
+淇敼鍗曚釜sdk瑙勫垯 editSdkRule
+author:寮犵户鏂�
+涓嬪彂锛�
+{
+    "nAlarmNumLowerLimit": 3, //鎶ヨ浜烘暟涓嬮檺 娌″惎鐢ㄤ娇鐢ㄨ礋鏁�
+    "nAlarmNumUpperLimit": 6, //鎶ヨ浜烘暟涓婇檺 娌″惎鐢ㄤ娇鐢ㄨ礋鏁�
+    "nIsBroadcast": "瀛︽牎,椋熷爞,瀹胯垗", //ip骞挎挱
+    "nIsRun": 1, //鏄惁鍚敤 鍚敤濉�1
+    "nSdkType": 1,//sdk绫诲瀷
+    "nTriggerDelay": 5,//鎶ヨ寤惰繜
+    "nTriggerTolerance": 20,//鏆備笉浣跨敤
+    "nQuality": 90, //鍥剧墖璐ㄩ噺
+    "nThreshold": 90,//鍥剧墖闃堝�煎拰鐏垫晱搴﹂兘鐢ㄨ繖涓�
+    "strAreas": "[{\"x\":100,\"y\":6},{\"x\":100,\"y\":1200},{\"x\":1800,\"y\":1200},{\"x\":1800,\"y\":6}]",//鐢绘鍖哄煙鍧愭爣锛屾槸 鎵�鏈� 绫诲瀷鐨勫敮涓�妗嗭紝涔熸槸闈犲彸琛岀殑绗竴妗嗭紝鏁扮粍闀垮害涓哄杈瑰舰杈规暟
+    "strCamId": "1",//camId 鐩告満id 鍞竴鏍囩ず
+    "strExAreas": "",//闈犲彸琛岀浜屼釜妗嗗潗鏍� 锛屽悓涓�
+    "strExLine": "",//闈犲彸琛岀浜屾潯绾垮潗鏍�  鏁扮粍闀垮害涓�2
+    "strLine": "[{\"x\":100,\"y\":6},{\"x\":100,\"y\":1200}]",//绾挎潯鍧愭爣锛屾暟缁勫厓绱犵敱璧峰鍧愭爣 鍒扮粨鏉熷潗鏍囷紝鏁扮粍闀垮害涓�2
+    "weekRuleArray": [    //鍛ㄨ鍒欐椂闂�
+        {
+            "nSdkType": 1, // 鍚屼笂 淇濇寔涓�鑷达紝鍙互涓嶇┛   
+            "nType": 1, //鍛�1
+            "strBegin": "00:00",//寮�濮嬫椂闂� HH:mm
+            "strCamId": "1",//鍚屼笂 淇濇寔涓�鑷达紝鍙互涓嶇┛
+            "strEnd": "23:59"//缁撴潫鏃堕棿  HH:mm
+        },
+        {
+            "nSdkType": 1,
+            "nType": 2,
+            "strBegin": "00:00",
+            "strCamId": "1",
+            "strEnd": "23:59"
+        }
+    ]
+}
+杩斿洖锛�
+{
+    "ret_status": "ok_ack"
+}
+鏌ヨ鎵�鏈塻dk瑙勫垯 findSdkRule
+author:寮犵户鏂�
+涓嬪彂锛�
+{"strCamId": "1"}
+杩斿洖锛�
+[
+   {
+      "nAlarmNumLowerLimit" : 0,
+      "nAlarmNumUpperLimit" : 0,
+      "nIsBroadcast" : "",
+      "nIsRun" : 0,
+      "nQuality" : 0,
+      "nSdkType" : 1,
+      "nThreshold" : 0,
+      "nTriggerDelay" : 0,
+      "nTriggerTolerance" : 0,
+      "strAreas" : "",
+      "strCamId" : "1",
+      "strExAreas" : "",
+      "strExLine" : "",
+      "strLine" : "",
+      "weekRuleArray" : [
+         
+            {
+               "nSdkType" : 1,
+               "nType" : 1,
+               "strBegin" : "00:00",
+               "strCamId" : "1",
+               "strEnd" : "23:59"
+            },
+            {
+               "nSdkType" : 1,
+               "nType" : 2,
+               "strBegin" : "00:00",
+               "strCamId" : "1",
+               "strEnd" : "23:59"
+            }
+         
+         
+      ]
+    
+   }
+]
+鑾峰彇瀹炴椂娴佹埅鍥� getSnapshot
+涓嬪彂锛�
+{
+    "str_ip":"192.168.1.215",
+    "n_port":554,
+    "str_username":"admin",
+    "str_password":"a1234567",
+    "str_brand":"haikang"	
+}
+杩斿洖锛�
+{
+     "imgUrl" : "group2/M00/02/7F/wKgBnFw1whWAT5DbAALrl1a_A04988.jpg"
+}
diff --git a/QiaoJiaSystem/FaceDetectServer/CMakeLists.txt b/QiaoJiaSystem/FaceDetectServer/CMakeLists.txt
index 918457d..b4b8421 100644
--- a/QiaoJiaSystem/FaceDetectServer/CMakeLists.txt
+++ b/QiaoJiaSystem/FaceDetectServer/CMakeLists.txt
@@ -49,15 +49,18 @@
     main_detect.cpp
     FaceDetectServerI.cpp
     rpc/FaceServer.cpp
+    ../../../BasicPlatForm/basic/timer_counter/Clocktimer.cpp
     )
 add_executable(FaceDetectResourcesTest
     FaceDetectResourcesTest.cpp
+    ../../../BasicPlatForm/basic/timer_counter/Clocktimer.cpp
     )
 
 add_executable(FaceExtractServer
     main_extract.cpp
     FaceExtractServerI.cpp
     rpc/FaceServer.cpp
+    ../../../BasicPlatForm/basic/timer_counter/Clocktimer.cpp
     )
 
 target_link_libraries(${PROJECT_NAME}
diff --git a/QiaoJiaSystem/FaceSearchServer/CMakeLists.txt b/QiaoJiaSystem/FaceSearchServer/CMakeLists.txt
index 8900ba4..f214035 100644
--- a/QiaoJiaSystem/FaceSearchServer/CMakeLists.txt
+++ b/QiaoJiaSystem/FaceSearchServer/CMakeLists.txt
@@ -105,6 +105,7 @@
     ../../../BasicPlatForm/basic/db/Elasticsearch/EsDBTool.cpp
     ../../../BasicPlatForm/basic/db/Elasticsearch/EsDBTool.h
 
+    ../../../BasicPlatForm/basic/timer_counter/Clocktimer.cpp
 
     ../LocalDBTool/SqliteFaceEncap.cpp
     ../../../BasicPlatForm/basic/db/sqlite/sqliteEncapsulation.cpp
diff --git a/QiaoJiaSystem/RapidStructureApp/CMakeLists.txt b/QiaoJiaSystem/RapidStructureApp/CMakeLists.txt
index a37d457..1685bb6 100644
--- a/QiaoJiaSystem/RapidStructureApp/CMakeLists.txt
+++ b/QiaoJiaSystem/RapidStructureApp/CMakeLists.txt
@@ -16,6 +16,7 @@
     ../../../BasicPlatForm/basic/pipe/TimerElement.cpp
     ../../../BasicPlatForm/basic/util/file/FileUtil.cpp
     ../../../BasicPlatForm/basic/pipe_element/ffmpeg/ffmpegRecoder/FileRecorder.cpp
+    ../../../BasicPlatForm/basic/timer_counter/Clocktimer.cpp
     )
 
 SET(LIBS
diff --git a/QiaoJiaSystem/RapidStructureApp/TriggerElement.cpp b/QiaoJiaSystem/RapidStructureApp/TriggerElement.cpp
index b2b89af..6f0272d 100644
--- a/QiaoJiaSystem/RapidStructureApp/TriggerElement.cpp
+++ b/QiaoJiaSystem/RapidStructureApp/TriggerElement.cpp
@@ -70,7 +70,7 @@
 }
 
 bool TriggerElement::getTriggerState() const {
-    return state;
+    return triggerState;
 }
 
 void TriggerElement::threadInitial() {
diff --git a/QiaoJiaSystem/StructureApp/AppPipeController.cpp b/QiaoJiaSystem/StructureApp/AppPipeController.cpp
index 135ce98..6edd112 100644
--- a/QiaoJiaSystem/StructureApp/AppPipeController.cpp
+++ b/QiaoJiaSystem/StructureApp/AppPipeController.cpp
@@ -7,49 +7,87 @@
 #include <QtCore/QtGlobal>
 #include <net_config.h>
 
-AppPipeController::AppPipeController(std::string folderPath, const Json::Value &json) :
+//AppPipeController::AppPipeController(std::string folderPath, const Json::Value &json) :
+//    videoCaptureElement("filePath", 25, -1, appPref.getLongData("gpu.index")), m_index(0),
+//    m_folderPath(folderPath),
+//    m_json(json), fdfsClient(nullptr), yoloRpcElement(folderPath + "yoloRpc"), faceRpcElement(folderPath + "faceRpc"),
+//    faceExtractElement(folderPath + "faceExtract"), triggerElement(25, 10),
+//    recordVideoElement(-1, json["rtsp"].asString()), bRecordVideoEnable(false) {
+
+//    init();
+
+//}
+AppPipeController::AppPipeController(std::string folderPath, const SdkRuleMap &ruleMap) :
     videoCaptureElement("filePath", 25, -1, appPref.getLongData("gpu.index")), m_index(0),
     m_folderPath(folderPath),
-    m_json(json), fdfsClient(nullptr), yoloRpcElement(folderPath + "yoloRpc"), faceRpcElement(folderPath + "faceRpc"),
-    faceExtractElement(folderPath + "faceExtract"), triggerElement(25, 10),
-    recordVideoElement(-1, json["rtsp"].asString()), bRecordVideoEnable(false) {
+    m_sdkRuleMap(ruleMap),
+    fdfsClient(nullptr),
+    yoloRpcElement(folderPath + "yoloRpc"),
+    faceRpcElement(folderPath + "faceRpc", ruleMap[FaceSdk]),
+    faceExtractElement(folderPath + "faceExtract", ruleMap[FaceSdk]),
+    triggerElement(25, 10),
+    recordVideoElement(-1, ""),
+    bRecordVideoEnable(false) {
 
     init();
 
 }
-
-AppPipeController::AppPipeController(int index, const Json::Value &json, bool RecordVideoEnable) :
-    videoCaptureElement(json["rtsp"].asString(), 25, 3000, appPref.getLongData("gpu.index"), RecordVideoEnable),
-    m_index(index), fdfsClient(nullptr), yoloRpcElement(to_string(index) + "yoloRpc"),
-    faceRpcElement(to_string(index) + "faceRpc"), m_json(json), faceExtractElement(to_string(index) + "faceExtract"),
-    triggerElement(25, 4), recordVideoElement(index, json["rtsp"].asString()), bRecordVideoEnable(RecordVideoEnable) {
-    init();
-}
+//AppPipeController::AppPipeController(int index, const Json::Value &json, bool RecordVideoEnable) :
+//    videoCaptureElement(json["rtsp"].asString(), 25, 3000, appPref.getLongData("gpu.index"), RecordVideoEnable),
+//    m_index(index), fdfsClient(nullptr), yoloRpcElement(to_string(index) + "yoloRpc"),
+//    faceRpcElement(to_string(index) + "faceRpc"), m_json(json), faceExtractElement(to_string(index) + "faceExtract"),
+//    triggerElement(25, 4), recordVideoElement(index, json["rtsp"].asString()), bRecordVideoEnable(RecordVideoEnable) {
+//    init();
+//}
 
 
-AppPipeController::AppPipeController(std::string camId, const Json::Value &json, bool RecordVideoEnable) :
-    videoCaptureElement(json["rtsp"].asString(), 25, 3000, appPref.getLongData("gpu.index")),
+//AppPipeController::AppPipeController(std::string camId, const Json::Value &json, bool RecordVideoEnable) :
+//    videoCaptureElement(json["rtsp"].asString(), 25, 3000, appPref.getLongData("gpu.index")),
+//    m_index(0),
+//    m_camId(camId),
+//    fdfsClient(nullptr),
+//    yoloRpcElement(camId + "yoloRpc"),
+//    faceRpcElement(camId + "faceRpc"),
+//    m_json(json),
+//    faceExtractElement(camId + "faceExtract"),
+//    triggerElement(25, 4),
+//    recordVideoElement(camId, json["rtsp"].asString()),
+//    newRecordVideoElement(camId),
+//    perimeterElement(1),
+//    crowdElement(json["crowd.num"].asInt()),
+//    bRecordVideoEnable(RecordVideoEnable)
+//{
+//    init();
+//    initPerimeter();
+//    initCrowd();
+//    intKeepRight();
+//}
+AppPipeController::AppPipeController(std::string camId, const SdkRuleMap &ruleMap, bool RecordVideoEnable) :
+    videoCaptureElement(appPref.getStringData(camId + "rtsp"), 25, 3000, appPref.getLongData("gpu.index")),
     m_index(0),
     m_camId(camId),
     fdfsClient(nullptr),
     yoloRpcElement(camId + "yoloRpc"),
-    faceRpcElement(camId + "faceRpc"),
-    m_json(json),
-    faceExtractElement(camId + "faceExtract"),
-    // peTriggerElement(json["perimeter.tolerance"].asInt(), json["perimeter.delay"].asInt()),
-//    leftTriggerElement(json["keepRight.tolerance"].asInt(), json["keepRight.delay"].asInt()),
-//    rightTriggerElement(json["keepRight.tolerance"].asInt(), json["keepRight.delay"].asInt()),
-    // crowdTriggerElement(json["crowd.tolerance"].asInt(), json["crowd.delay"].asInt()),
+    faceRpcElement(camId + "faceRpc", ruleMap[FaceSdk]),
+    faceExtractElement(camId + "faceExtract", ruleMap[FaceSdk]),
     triggerElement(25, 4),
-    recordVideoElement(camId, json["rtsp"].asString()),
+    recordVideoElement(camId, appPref.getStringData(camId + "rtsp")),
     newRecordVideoElement(camId),
-    perimeterElement(1),
-    crowdElement(json["crowd.num"].asInt()),
-    bRecordVideoEnable(RecordVideoEnable) {
+    perimeterElement(ruleMap[PerimeterSdk]),
+    crowdElement(ruleMap[CrowdSdk]),
+    perStaticElement(ruleMap[PerStaticSdk]),
+    perHubElement(ruleMap[PerHubSdk]),
+    leftJudgment(ruleMap[KeepRightSdk]),
+    rightJudgment(ruleMap[KeepRightSdk]),
+    bRecordVideoEnable(RecordVideoEnable),
+    m_sdkRuleMap(ruleMap) {
+    DBG("camId" << camId);
     init();
     initPerimeter();
     initCrowd();
-    intKeepRight();
+    initKeepRight();
+    initPerHub();
+    initPerStatic();
 }
 
 AppPipeController::~AppPipeController() {
@@ -91,9 +129,9 @@
     faceExtractElement.setProperty("dev_id", str_device_id);
     faceExtractElement.setProperty("ch_id", str_ch_id);
     faceExtractElement.setProperty("path", path);
-    yoloRpcElement.setProperty("dev_id", str_device_id);
-    yoloRpcElement.setProperty("ch_id", str_ch_id);
-    yoloRpcElement.setProperty("path", path);
+    personElement.setProperty("dev_id", str_device_id);
+    personElement.setProperty("ch_id", str_ch_id);
+    personElement.setProperty("path", path);
 
     //淇敼鏃堕棿涓哄疄闄呭彂鐢熸椂闂�
     QString strPath = QString::fromStdString(path);
@@ -134,20 +172,19 @@
     if (!(GetIpAddress(net_ifname.c_str(), ip_old))) {
         ERR("couldn't get ip");
     }
-
+    m_localIp = std::string((char *) ip_old);
     bUp = false;
 
-    yoloRpcElement.setProperty("str_addr", m_json["addr"].asString());
-    yoloRpcElement.setProperty("local_ip", std::string((char *) ip_old));
+    personElement.setProperty("str_addr", m_sdkRuleMap[YoloSdk].strAddr.toStdString());
+    personElement.setProperty("local_ip", std::string((char *) ip_old));
 
-    faceExtractElement.setProperty("str_addr", m_json["addr"].asString());
+    faceExtractElement.setProperty("str_addr", m_sdkRuleMap[FaceSdk].strAddr.toStdString());
     faceExtractElement.setProperty("local_ip", std::string((char *) ip_old));
 
 
     if (bRecordVideoEnable) {
         faceExtractElement.setProperty("dev_id", m_camId);
-        yoloRpcElement.setProperty("dev_id", m_camId);
-        m_json_Record["rtsp"] = m_json["rtsp"].asString();
+        personElement.setProperty("dev_id", m_camId);
     }
 
 
@@ -161,21 +198,25 @@
         std::string strNewTime;
         strNewTime = AppUtil::getTimeUSecString();
 
-        cv::putText(imageTemp, strNewTime, cv::Point(408, 540), cv::HersheyFonts::FONT_HERSHEY_PLAIN, 5,
-                    cv::Scalar(255, 255, 0), 2);
+//        cv::putText(imageTemp, strNewTime, cv::Point(408, 540), cv::HersheyFonts::FONT_HERSHEY_PLAIN, 5,
+//                    cv::Scalar(255, 255, 0), 2);
         if (m_camId.size() > 0) {
 
 
             if (bRecordVideoEnable) {
-//                DBG("strNewTime="<<strNewTime<<" camId="<<m_camId);
                 newRecordVideoElement.pushImgBuf(strNewTime, imageTemp);
                 newRecordVideoElement.setSdkTrigger(faceRpcElement.getTriggerState() ||//TODO
-                                                    yoloRpcElement.getTrigger() ||
+                                                    personElement.getTrigger() ||
                                                     leftJudgment.getTriggerState() ||
                                                     rightJudgment.getTriggerState() ||
                                                     perimeterElement.getTriggerState() ||
-                                                    crowdElement.getTriggerState());
-               // newRecordVideoElement.submit();
+                                                    crowdElement.getTriggerState() ||
+                                                    perHubElement.getTriggerState() ||
+                                                    perStaticElement.getTriggerState()
+                );
+                if (!newRecordVideoElement.isBusy()) {
+                    newRecordVideoElement.submit();
+                }
 
             }
 
@@ -222,7 +263,12 @@
 
 
     yoloRpcElement.registerConnector([&] {
-        imageDrawElement.setYoloObjects(yoloRpcElement.getLastScoreRects());
+        imageDrawElement.setYoloObjects(personElement.getLastScoreRects());
+        if (!personElement.isBusy()) {
+
+            personElement.setObjsResults(yoloRpcElement.getLastScoreRects());
+            personElement.submit();
+        }
     });
 
     faceRpcElement.registerConnector([&] {
@@ -250,17 +296,19 @@
     });
 
     registerElement(videoCaptureElement);
-    if (m_json["yolo.enable"].asString() == "1") {
-        registerElement(yoloRpcElement);
+    if (m_sdkRuleMap[YoloSdk].nIsRun == 1) {
+        registerElement(personElement);
     }
-    if (m_json["face.enable"].asString() == "1") {
+    if (m_sdkRuleMap[FaceSdk].nIsRun == 1) {
+        DBG("FaceSdk=" << m_sdkRuleMap[FaceSdk].nIsRun);
         registerElement(faceRpcElement);
         registerElement(faceExtractElement);
     }
     registerElement(imageDrawElement);
     registerElement(newRecordVideoElement);
-    videoCaptureElement.setOutPutInterval(3);
+    videoCaptureElement.setOutPutInterval(5);
     faceExtractElement.setProperty("index", to_string(m_index));
+    registerElement(yoloRpcElement);
     //#todo setProperty
 //    faceExtractElement.setProperty("index", to_string(m_index));
 //    faceExtractElement.setProperty("index", to_string(m_index));
@@ -305,7 +353,14 @@
 void AppPipeController::setfdfsClient(FastFdsWithLock *p_fdfsClient) {
     fdfsClient = p_fdfsClient;
     faceExtractElement.setFdfs(fdfsClient);
-    yoloRpcElement.setFdfs(fdfsClient);
+    personElement.setFdfs(fdfsClient);
+    perHubElement.setFdfs(fdfsClient);
+    perimeterElement.setFdfs(fdfsClient);
+    perStaticElement.setFdfs(fdfsClient);
+    leftJudgment.setFdfs(fdfsClient);
+    rightJudgment.setFdfs(fdfsClient);
+    crowdElement.setFdfs(fdfsClient);
+
 }
 
 std::string AppPipeController::getRtmp() {
@@ -317,18 +372,17 @@
 }
 
 void AppPipeController::initPerimeter() {
-    if (!m_json["perimeter.enable"] == "1") {
+    SdkRule rule = m_sdkRuleMap[PerimeterSdk];
+    if (rule.nIsRun != 1) {
         return;
     }
-    std::string area = m_json["perimeter.area"].asString();
-    //area="[{\"x\":100,\"y\":6},{\"x\":100,\"y\":1200},{\"x\":1800,\"y\":1200},{\"x\":1800,\"y\":6}]";
-    perimeterElement.setMask(area);
-    perimeterElement.setFdfs(fdfsClient);
-    perimeterElement.setProperty("sdkType", "perimeter");
+
+
     yoloRpcElement.registerConnector([&] {
         if (!perimeterElement.isBusy()) {
+            perimeterElement.setYoloObjects(yoloRpcElement.getLastScoreRects());
+            perimeterElement.setImage(yoloRpcElement.getImage());
 
-            perimeterElement.setObjsResults(yoloRpcElement.getObjects());
             perimeterElement.submit();
         }
     });
@@ -354,61 +408,83 @@
 }
 
 void AppPipeController::initCrowd() {
-    if (m_json["crowd.enable"] != "1") {
+    SdkRule rule = m_sdkRuleMap[CrowdSdk];
+    if (rule.nIsRun != 1) {
         return;
     }
-    std::string area = m_json["crowd.area"].asString();
+    //   std::string area = m_json["crowd.area"].asString();
     //area="[{\"x\":100,\"y\":6},{\"x\":100,\"y\":1200},{\"x\":1800,\"y\":1200},{\"x\":1800,\"y\":6}]";
-    crowdElement.setMask(area);
-    crowdElement.setFdfs(fdfsClient);
-    crowdElement.setProperty("sdkType", "crowd");
+
+    crowdElement.setProperty("local_ip", m_localIp);
+
     yoloRpcElement.registerConnector([&] {
         if (!crowdElement.isBusy()) {
-            crowdElement.setObjsResults(yoloRpcElement.getObjects());
+            crowdElement.setYoloObjects(yoloRpcElement.getLastScoreRects());
+            crowdElement.setImage(yoloRpcElement.getImage());
             crowdElement.submit();
         }
     });
-//    crowdElement.registerConnector([&] {
-//        crowdTriggerElement.setState(crowdElement.getRealNum() >= m_json["crowd.num"].asInt());
-//        crowdTriggerElement.triggerOnce();
-//    });
-//    crowdTriggerElement.registerConnector([&] {
 
-//        switch (crowdTriggerElement.getTriggerType()) {
-//            case UP:
-//                //reqRecordMap[SdkType_Perimeter]=true;
-//                // startRecord(SdkType_Perimeter);
-//            DBG("crowdTriggerElement UP");
-//                break;
-//            case DOWN:
-//                // reqRecordMap[SdkType_Perimeter]=false;
-//                //endRecord(SdkType_Perimeter);
-//            DBG("crowdTriggerElement Down");
-//                break;
-//            default:
-//                break;
-//        }
-//    });
     registerElement(crowdElement);
 //    registerElement(crowdTriggerElement);
 }
 
-void AppPipeController::intKeepRight() {
-    if (m_json["keepRight.enable"] != "1") {
+void AppPipeController::initKeepRight() {
+    SdkRule rule = m_sdkRuleMap[KeepRightSdk];
+    if (rule.nIsRun != 1) {
         return;
     }
-    std::string leftArea = m_json["keepRight.leftArea"].asString();
-    std::string leftLine = m_json["keepRight.leftLine"].asString();
-    std::string rightArea = m_json["keepRight.rightArea"].asString();
-    std::string rightLine = m_json["keepRight.rightLine"].asString();
-    leftJudgment.init(QString::fromStdString(leftArea), QString::fromStdString(leftLine));
-    rightJudgment.init(QString::fromStdString(rightArea), QString::fromStdString(rightLine));
+    leftJudgment.setProperty("local_ip", m_localIp);
+    rightJudgment.setProperty("local_ip", m_localIp);
+    leftJudgment.init(rule.strAreas, rule.strLine);
+    rightJudgment.init(rule.strExAreas, rule.strExLine);
     yoloRpcElement.registerConnector([&] {
         leftJudgment.setYoloObjects(yoloRpcElement.getLastScoreRects());
         rightJudgment.setYoloObjects(yoloRpcElement.getLastScoreRects());
+        leftJudgment.setImage(yoloRpcElement.getImage());
+        rightJudgment.setImage(yoloRpcElement.getImage());
     });
     registerElement(leftJudgment);
     registerElement(rightJudgment);
 
 }
 
+void AppPipeController::initPerStatic() {
+    SdkRule rule = m_sdkRuleMap[PerStaticSdk];
+    if (rule.nIsRun != 1) {
+        return;
+    }
+    //   std::string area = m_json["crowd.area"].asString();
+    //area="[{\"x\":100,\"y\":6},{\"x\":100,\"y\":1200},{\"x\":1800,\"y\":1200},{\"x\":1800,\"y\":6}]";
+
+    perStaticElement.setProperty("local_ip", m_localIp);
+    yoloRpcElement.registerConnector([&] {
+        if (!perStaticElement.isBusy()) {
+            perStaticElement.setYoloObjects(yoloRpcElement.getLastScoreRects());
+            perStaticElement.setImage(yoloRpcElement.getImage());
+            perStaticElement.submit();
+        }
+    });
+
+    registerElement(perStaticElement);
+}
+
+void AppPipeController::initPerHub() {
+    SdkRule rule = m_sdkRuleMap[PerHubSdk];
+    if (rule.nIsRun != 1) {
+        return;
+    }
+    //   std::string area = m_json["crowd.area"].asString();
+    //area="[{\"x\":100,\"y\":6},{\"x\":100,\"y\":1200},{\"x\":1800,\"y\":1200},{\"x\":1800,\"y\":6}]";
+
+    perHubElement.setProperty("local_ip", m_localIp);
+    yoloRpcElement.registerConnector([&] {
+        if (!perHubElement.isBusy()) {
+            perHubElement.setYoloObjects(yoloRpcElement.getLastScoreRects());
+            perHubElement.setImage(yoloRpcElement.getImage());
+            perHubElement.submit();
+        }
+    });
+
+    registerElement(perHubElement);
+}
diff --git a/QiaoJiaSystem/StructureApp/AppPipeController.h b/QiaoJiaSystem/StructureApp/AppPipeController.h
index 58f3e55..e617143 100644
--- a/QiaoJiaSystem/StructureApp/AppPipeController.h
+++ b/QiaoJiaSystem/StructureApp/AppPipeController.h
@@ -15,8 +15,10 @@
 #include "PerimeterElement.h"
 #include "JudgmentRetrogradeTool.h"
 #include "NewRecordVideoElement.h"
+#include "PersonElement.h"
+#include "PerStaticElement.h"
 #include <jsoncpp/json/json.h>
-
+#include "DBStruct.h"
 
 class AppPipeController : public PipeController {
 public:
@@ -25,11 +27,14 @@
      * @param folderPath 浠诲姟鏍圭洰褰曪紝鐢ㄤ簬鍋氬叡浜唴瀛榠d
      * @param json 鍙傛暟涓簉tsp娴佸湴鍧� sdk鏄惁鍚敤鐨勬爣璇�
      */
-    AppPipeController(std::string folderPath, const Json::Value &json);
+  //  AppPipeController(std::string folderPath, const Json::Value &json);
+    AppPipeController(std::string folderPath, const SdkRuleMap& ruleMap);
 
-    AppPipeController(int index, const Json::Value &json, bool RecordVideoEnable = false);
+  //  AppPipeController(int index, const Json::Value &json, bool RecordVideoEnable = false);
 
-    AppPipeController(std::string camId, const Json::Value &json, bool RecordVideoEnable);
+  //  AppPipeController(std::string camId, const Json::Value &json, bool RecordVideoEnable);
+
+    AppPipeController(std::string camId, const SdkRuleMap& ruleMap, bool RecordVideoEnable);
 
     virtual ~AppPipeController();
 
@@ -41,9 +46,9 @@
 
     void setfdfsClient(FastFdsWithLock *p_fdfsClient);
 
+    void setWeekRule(const std::map<int, std::vector<LActRuleWeekRecord>>& weekRuleMap);
 private:
     void init();
-
 private://Perimete
     PerimeterElement perimeterElement;
    // TriggerElement peTriggerElement;
@@ -63,8 +68,16 @@
 //    TriggerElement leftTriggerElement;
 //    TriggerElement rightTriggerElement;
 
-    void intKeepRight();
+    void initKeepRight();
 
+private:
+    PerStaticElement perStaticElement;
+    void initPerStatic();
+private://Perimete
+    PerimeterElement perHubElement;
+   // TriggerElement peTriggerElement;
+
+    void initPerHub();
 private:
     ffmpeg::VideoCaptureElement videoCaptureElement;
     YoloRpcElement yoloRpcElement;
@@ -73,6 +86,7 @@
     ImageDrawElement imageDrawElement;
     RecordVideoElement recordVideoElement;
     NewRecordVideoElement newRecordVideoElement;
+    PersonElement personElement;
 
     int m_index;
     std::string m_camId;
@@ -91,6 +105,9 @@
 
     QDateTime m_dt;
 
+    std::map<int, std::vector<LActRuleWeekRecord>> m_weekRuleMap;
+    SdkRuleMap m_sdkRuleMap;
+    std::string m_localIp;
     std::string getFullFileName();
 
 };
diff --git a/QiaoJiaSystem/StructureApp/AppPipeControllerTest.cpp b/QiaoJiaSystem/StructureApp/AppPipeControllerTest.cpp
index c4b75b3..2bc4af0 100644
--- a/QiaoJiaSystem/StructureApp/AppPipeControllerTest.cpp
+++ b/QiaoJiaSystem/StructureApp/AppPipeControllerTest.cpp
@@ -60,13 +60,13 @@
     json["face.enable"] = "1";
     json["yolo.enable"] = "1";
 
-    AppPipeController appPipeController(0, json);
-    appPipeController.resetVideoCapturePath(
-        "/home/bsk/development/c++/Qt/QiaoJiaSystem/build/load/123456/33/201808/27/123456-33-201808-20180827093100/2018-08-27 09:31:00.mp4");
-    appPipeController.start();
-    getchar();
-    appPipeController.stop();
-    appPipeController.wait();
+//    AppPipeController appPipeController(0, json);
+//    appPipeController.resetVideoCapturePath(
+//        "/home/bsk/development/c++/Qt/QiaoJiaSystem/build/load/123456/33/201808/27/123456-33-201808-20180827093100/2018-08-27 09:31:00.mp4");
+//    appPipeController.start();
+//    getchar();
+//    appPipeController.stop();
+//    appPipeController.wait();
     return 0;
 }
 
@@ -90,4 +90,4 @@
         cout << postResponseStr << endl;
 //    system("pause");
     return 0;
-}
\ No newline at end of file
+}
diff --git a/QiaoJiaSystem/StructureApp/CMakeLists.txt b/QiaoJiaSystem/StructureApp/CMakeLists.txt
index 2dc1314..a06601a 100644
--- a/QiaoJiaSystem/StructureApp/CMakeLists.txt
+++ b/QiaoJiaSystem/StructureApp/CMakeLists.txt
@@ -8,13 +8,15 @@
 
 SET(SOURCES
 
-
+    #    HiredisTool.cpp
     NewRecordVideoElement.cpp
     JudgmentRetrogradeTool.cpp
     PerimeterElement.cpp
     NewEncodeVideoManager.cpp
     NewEncodeVideo.cpp
     HiredisTool.cpp
+    PersonElement.cpp
+    PerStaticElement.cpp
 
     TrackingTrigger.cpp
     FaceRpcElement.cpp
@@ -39,6 +41,7 @@
     ../../../BasicPlatForm/basic/db/Elasticsearch/EsDBTool.cpp
     ../../../BasicPlatForm/basic/util/curl/HttpRequestWithCrul.hpp
     ../../../BasicPlatForm/basic/util/net_config/net_config.cpp
+    ../../../BasicPlatForm/basic/timer_counter/Clocktimer.cpp
     )
 
 SET(LIBS
@@ -99,6 +102,7 @@
     /usr/include/x86_64-linux-gnu/qt5/QtCore
 
     ../../BasicPlatForm/libs/hiredis-master/include
+    ../VideoServer/QiaoJia/DB
 )
 
 link_directories(
diff --git a/QiaoJiaSystem/StructureApp/FaceExtractElement.cpp b/QiaoJiaSystem/StructureApp/FaceExtractElement.cpp
index 7f6e288..c1519f2 100644
--- a/QiaoJiaSystem/StructureApp/FaceExtractElement.cpp
+++ b/QiaoJiaSystem/StructureApp/FaceExtractElement.cpp
@@ -25,7 +25,7 @@
     }
 }
 
-FaceExtractElement::FaceExtractElement(std::string shareMemoryName) :
+FaceExtractElement::FaceExtractElement(std::string shareMemoryName, const SdkRule &rule) :
     TimerElement(1000), sharedMemory(nullptr), fdfsClient(nullptr),
     //#todo appPref.setStringData
     faceExtractRpcClient(appPref.getStringData("faceExte.proxy"), appPref.getStringData("faceExte.ip"),
@@ -33,9 +33,9 @@
 //    faceExtractRpcClient(/*appPref.getStringData("face.extract.proxy")*/
 //        "faceExtractServer", "", 10008, "tcp"),//浜鸿劯鐗瑰緛鎻愬彇 淇敼鎴愮偣瀵圭偣閫氳
     faceSearchRpcClient(appPref.getStringData("faceSear.proxy"), appPref.getStringData("faceSear.ip"),
-                        appPref.getIntData("faceSear.port"), "tcp")
+                        appPref.getIntData("faceSear.port"), "tcp"),
 //    faceSearchRpcClient("faceCmServer", "", 10004, "tcp")
-{
+    m_sdkRule(rule) {
     sharedMemory = new QSharedMemory(QString(shareMemoryName.c_str()));
     if (!sharedMemory->create(4608 * 2592 * 4)) {
         sharedMemory->attach();
@@ -68,8 +68,8 @@
     try {
 
         string t_camIdex = getProperty("dev_id") + getProperty("ch_id");
-        float t_com_sc =
-            appPref.getFloatData(t_camIdex + "face.cmp") == -1 ? 75 : appPref.getFloatData(t_camIdex + "face.cmp");
+        float t_com_sc = m_sdkRule.nThreshold == 0 ? 75 : m_sdkRule.nThreshold;
+
 
         DBG(" TESTCODE getValue" << t_camIdex << "  " << t_com_sc << "  " << t_com_sc / 100);
 
@@ -146,6 +146,7 @@
                 t_json["picSmUrl"] = strImgUrl;//浜哄憳鎶撳皬鍥�
                 //#todo
                 t_json["picDate"] = faceExtractQueueTmp[i].scoredRects[j].properties["time"];
+                DBG("picDate=" << t_json["picDate"].asString());
 //                DBG("timeC ::::B" << t_json["picDate"].asString());
 //                t_json["picDate"] = AppUtil::getTimeSecString();
 
diff --git a/QiaoJiaSystem/StructureApp/FaceExtractElement.h b/QiaoJiaSystem/StructureApp/FaceExtractElement.h
index 8a1a0fb..f9f7d2b 100644
--- a/QiaoJiaSystem/StructureApp/FaceExtractElement.h
+++ b/QiaoJiaSystem/StructureApp/FaceExtractElement.h
@@ -12,7 +12,7 @@
 #include <queue>
 #include <mutex>
 #include <jsoncpp/json/json.h>
-
+#include "DBStruct.h"
 #define VECTOR_MAX 50
 
 class QSharedMemory;
@@ -28,7 +28,7 @@
 
 class FaceExtractElement : public TimerElement {
 public:
-    FaceExtractElement(std::string shareMemoryName);
+    FaceExtractElement(std::string shareMemoryName,const SdkRule& rule);
 
     ~FaceExtractElement();
 
@@ -55,6 +55,7 @@
     std::vector<::FaceDetect::Data> features;
 
     Base64 base64;
+    SdkRule m_sdkRule;
 };
 
 
diff --git a/QiaoJiaSystem/StructureApp/FaceRpcElement.cpp b/QiaoJiaSystem/StructureApp/FaceRpcElement.cpp
index 6f2cdd1..1e5553a 100644
--- a/QiaoJiaSystem/StructureApp/FaceRpcElement.cpp
+++ b/QiaoJiaSystem/StructureApp/FaceRpcElement.cpp
@@ -4,7 +4,8 @@
 #include <QtCore/QString>
 #include <basic/timer_counter/Clocktimer.h>
 #include <basic/util/opencv/CvUtil.h>
-
+#include <QJsonDocument>
+#include <QJsonObject>
 #define GETSCORE(IDENT) appPref.getFloatData(IDENT) == -1 ? 95 : appPref.getFloatData(IDENT);
 
 //************************************
@@ -29,12 +30,16 @@
 }
 
 //todo  appPref.getStringData("face.detect.proxy")
-FaceRpcElement::FaceRpcElement(string shareMemoryName) :
+FaceRpcElement::FaceRpcElement(string shareMemoryName,const SdkRule& rule) :
 //#todo
     rpcClient(appPref.getStringData("faceDete.proxy"), appPref.getStringData("faceDete.ip"),
-              appPref.getIntData("faceDete.port"), "tcp"), m_triggerElement(0, 0),
+              appPref.getIntData("faceDete.port"), "tcp"),
+    m_triggerElement(0, 0),
 //    rpcClient("faceServer","",10002,"tcp"),
-    sharedMemory(nullptr), trackingTrigger(nullptr) {
+    sharedMemory(nullptr),
+    trackingTrigger(nullptr),
+    m_sdkRule(rule)
+{
     sharedMemory = new QSharedMemory(QString(shareMemoryName.c_str()));
     if (!sharedMemory->create(4608 * 2592 * 4)) {
         sharedMemory->attach();
@@ -55,13 +60,14 @@
         t_camIdex = shareMemoryName.substr(0, shareMemoryName.rfind("faceRpc"));
     }
 
-    float t_score = GETSCORE(t_camIdex + "face.det");
+    float t_score = m_sdkRule.nQuality;
 
     DBG(" TESTCODE  getValue" << t_camIdex << "  " << t_score << " " << t_score / 100);
 
     t_score = t_score / 100;
 
     trackingTrigger = new TrackingTrigger(t_score);
+    setMask(m_sdkRule.strAreas.toStdString());
 }
 
 FaceRpcElement::~FaceRpcElement() {
@@ -80,6 +86,8 @@
 //        string string1(AppUtil::getTimeString() + "-ff2" + getProperty("time") + ".jpg");
 //        cv::imwrite(string1, image);
 //    }
+    if(!isInWeek(m_sdkRule.weekRuleVec))
+        return;
     triggerMats.clear();
     triggerFaces.clear();
     triggerScoredRects.clear();
@@ -88,6 +96,7 @@
         if (!server) ERR("server is null");
         faces = server->faceDetect(image.cols, image.rows, sharedMemory->key().toStdString());
 //        DBG("faces.size  " << faces.size());
+
         for (auto face: faces) {
             ::FaceDetect::RECT &rect = face.rcFace;
             ScoredRect scoredRect;
@@ -95,6 +104,12 @@
             int y = face.rcFace.top;
             int w = face.rcFace.right - face.rcFace.left;
             int h = face.rcFace.bottom - face.rcFace.top;
+            QRect re(x,y,w,h);
+            QPoint center = re.center();
+            if(!mPolygon.containsPoint(center,Qt::OddEvenFill))
+            {
+                return;
+            }
             scoredRect.rect = {x, y, w, h};
             scoredRect.score = (float) face.fAngle.confidence;
 
@@ -166,3 +181,47 @@
 bool FaceRpcElement::getTriggerState() const {
     return m_triggerElement.getTriggerState();
 }
+void FaceRpcElement::setMask(std::string mask)
+{
+    QJsonArray arrayAreas = getJsonArrayFromQString(QString::fromStdString(mask));
+    if(arrayAreas.isEmpty())
+    {
+        return;//do not detect
+    }
+    for(int i = 0;i < arrayAreas.size();++i)
+    {
+        QJsonValue jsonValue = arrayAreas[i];
+        QJsonObject obj = jsonValue.toObject();
+        int x = obj.value("x").toDouble()*4;
+        int y = obj.value("y").toDouble()*4;
+        mPolygon<<(QPoint(x,y));
+
+    }
+}
+QJsonArray FaceRpcElement::getJsonArrayFromQString(const QString& strJson)
+{
+    QJsonDocument jsonDocument = QJsonDocument::fromJson(strJson.toLocal8Bit());
+    if( jsonDocument.isNull() ){
+        DBG("please check the string"<< strJson.toStdString());
+        return QJsonArray();
+    }
+    QJsonArray jsonArray = jsonDocument.array();
+    return jsonArray;
+}
+bool FaceRpcElement::isInWeek(const std::vector<LActRuleWeekRecord>& ruleWeek)
+{
+
+    int nWeek = QDate::currentDate().dayOfWeek();
+    for(int i = 0;i < ruleWeek.size();++i)
+    {
+        if(ruleWeek[i].m_nType == nWeek)
+        {
+            QString strCurrent = QDateTime::currentDateTime().toString("hh:mm");
+            if(strCurrent >= ruleWeek[i].m_strBegin && strCurrent <= ruleWeek[i].m_strEnd)
+            {
+               return true;
+            }
+        }
+    }
+    return false;
+}
diff --git a/QiaoJiaSystem/StructureApp/FaceRpcElement.h b/QiaoJiaSystem/StructureApp/FaceRpcElement.h
index 4804da4..deec82f 100644
--- a/QiaoJiaSystem/StructureApp/FaceRpcElement.h
+++ b/QiaoJiaSystem/StructureApp/FaceRpcElement.h
@@ -7,12 +7,14 @@
 #include <opencv2/opencv.hpp>
 #include <RapidStructureApp/TriggerElement.h>
 #include "TrackingTrigger.h"
-
+#include "DBStruct.h"
+#include <QtGui/QPolygon>
+#include <QJsonArray>
 class QSharedMemory;
 
 class FaceRpcElement : public basic::PipeElement {
 public:
-    FaceRpcElement(string);
+    FaceRpcElement(string,const SdkRule& rule);
 
     ~FaceRpcElement();
 
@@ -33,9 +35,12 @@
 
     cv::Mat getImage() const;
 
+
 private:
     virtual void threadFunc() override;
-
+    void setMask(std::string mask);
+    QJsonArray getJsonArrayFromQString(const QString& strJson);
+    bool isInWeek(const std::vector<LActRuleWeekRecord>& ruleWeek);
 private:
     IceRpcClient<FaceDetect::FaceDetectServerPrx> rpcClient;
     cv::Mat image;
@@ -45,8 +50,9 @@
     ::FaceDetect::Faces triggerFaces;
     std::vector<cv::Mat> triggerMats;
     std::vector<ScoredRect> triggerScoredRects;
-
+    QPolygon mPolygon;
     TriggerElement m_triggerElement;
+    SdkRule m_sdkRule;
 };
 
 #endif // FACERPCELEMENT_H
diff --git a/QiaoJiaSystem/StructureApp/JudgmentRetrogradeTool.cpp b/QiaoJiaSystem/StructureApp/JudgmentRetrogradeTool.cpp
index 1dca1a6..d04013c 100644
--- a/QiaoJiaSystem/StructureApp/JudgmentRetrogradeTool.cpp
+++ b/QiaoJiaSystem/StructureApp/JudgmentRetrogradeTool.cpp
@@ -1,36 +1,43 @@
 //
 // Created by basic on 18-8-24.
 //
-
 #include "JudgmentRetrogradeTool.h"
 #include <basic/util/opencv/CvMath.hpp>
 #include <QtCore/QDebug>
+#include <basic/db/Elasticsearch/EsDBTool.h>
+#include <basic/util/opencv/CvUtil.h>
+#include <uuid/uuid.h>
+#include <basic/util/app/AppPreference.hpp>
 
-JudgmentRetrogradeTool::JudgmentRetrogradeTool():
-TimerElement(1000),
-m_triggerElement(0,50)
-{
-
+JudgmentRetrogradeTool::JudgmentRetrogradeTool(const SdkRule &rule) :
+    TimerElement(1000),
+    m_triggerElement(0, rule.nTriggerDelay * 1000 * 1000),
+    m_sdkRule(rule),
+    pManagerEsDB(nullptr) {
+    pManagerEsDB = new EsDBTool(appPref.getStringData("ipAdd"), appPref.getIntData("ipPort"));
 }
 
 JudgmentRetrogradeTool::~JudgmentRetrogradeTool() {
-
+    if (pManagerEsDB) {
+        delete pManagerEsDB;
+        pManagerEsDB = nullptr;
+    }
 }
 
-bool JudgmentRetrogradeTool::init(QString area,QString line) {
+bool JudgmentRetrogradeTool::init(QString area, QString line) {
+
     //#todo string ->json
     QJsonArray arrayAreas = getJsonArrayFromQString(area);
-    if(arrayAreas.isEmpty())
-    {
+    if (arrayAreas.isEmpty()) {
         return false;//do not detect
     }
     QVector<QPoint> vec;
-    for(int i = 0;i < arrayAreas.size();++i){
+    for (int i = 0; i < arrayAreas.size(); ++i) {
         QJsonValue jsonValue = arrayAreas[i];
         QJsonObject obj = jsonValue.toObject();
-        int x = obj.value("x").toInt()*2 ;
-        int y = obj.value("y").toInt()*2 ;
-        vec.push_back(QPoint(x,y));
+        int x = obj.value("x").toDouble() * 4;
+        int y = obj.value("y").toDouble() * 4;
+        vec.push_back(QPoint(x, y));
     }
 
 
@@ -48,22 +55,22 @@
 
     cv::Point start, end;
     QJsonArray arrayLine = getJsonArrayFromQString(line);
-    if(arrayLine.size() == 2){
+    if (arrayLine.size() == 2) {
         QJsonValue jsonValue = arrayLine[0];
         QJsonObject obj = jsonValue.toObject();
-        start.x = obj.value("x").toInt() ;
-        start.y = obj.value("y").toInt() ;
+        start.x = obj.value("x").toDouble();
+        start.y = obj.value("y").toDouble();
 
 
         QJsonValue jsonValue2 = arrayLine[1];
         QJsonObject obj2 = jsonValue2.toObject();
-        end.x = obj2.value("x").toInt() ;
-        end.y = obj2.value("y").toInt() ;
+        end.x = obj2.value("x").toDouble();
+        end.y = obj2.value("y").toDouble();
 
-    }else{
+    } else {
         return false;
     }
-    setUpBaseline(start,end);
+    setUpBaseline(start, end);
 
     //setDownBaseline(start,end);
     //    setUpBaseline();
@@ -71,17 +78,20 @@
     return true;
 }
 
-void JudgmentRetrogradeTool::setYoloObjects(std::vector<ScoredRect> value)
-{
-    mObjs=value;
-    for(auto & item :value){
-        setPerRect(item.id,item.rect);
+void JudgmentRetrogradeTool::setYoloObjects(std::vector<ScoredRect> value) {
+    if (!isInWeek(m_sdkRule.weekRuleVec))
+        return;
+    mObjs = value;
+    for (auto &item :value) {
+        if (item.score < m_sdkRule.fSensitivity)continue;
+
+        setPerRect(item.id, item.rect);
     }
 }
 
 
-void JudgmentRetrogradeTool::setPerRect(const long& id,cv::Rect rect){
-    setPerPoint(id,getCenterPoint(rect));
+void JudgmentRetrogradeTool::setPerRect(const long &id, cv::Rect rect) {
+    setPerPoint(id, getCenterPoint(rect));
 }
 
 void JudgmentRetrogradeTool::setPerPoint(const long &id, cv::Point2f result) {
@@ -96,13 +106,11 @@
         tt.end_Point = listCache.back();
         auto &temp = m_mapPerDirection[id];
         //#TODO tt.end_Point in UP Area
-        QPoint center(tt.end_Point.x,tt.end_Point.y);
-        if(m_polygon.containsPoint(center,Qt::OddEvenFill)){
+        QPoint center(tt.end_Point.x, tt.end_Point.y);
+        if (m_polygon.containsPoint(center, Qt::OddEvenFill)) {
             temp.push_back(JRTOOL::low_filter(temp.back(), getTheta(m_UpBaseLine, tt)));
-           //DBG("ID="<<id<<" left getTheta="<<getTheta(m_DownBaseLine, tt));
-        }
-        else
-        {
+            //DBG("ID="<<id<<" left getTheta="<<getTheta(m_DownBaseLine, tt));
+        } else {
             temp.clear();
         }
         listCache.clear();
@@ -129,8 +137,7 @@
     return JRTOOL::getAngelOfTwoVector(directionVectorPoint, point);
 }
 
-void JudgmentRetrogradeTool::timerFunc()
-{
+void JudgmentRetrogradeTool::timerFunc() {
     func();
     fireConnectors();
 }
@@ -147,9 +154,15 @@
                 a++;
             }
         }
-       // DBG("id="<<item.first<<" a="<<a<<"  b="<<b);
+        // DBG("id="<<item.first<<" a="<<a<<"  b="<<b);
         bool ret = a >= b ? true : false;
-        m_mapPerRet[item.first] = ret;
+        if (!ret) {
+            m_mapPerRet.insert(std::make_pair(item.first, false));
+            // m_mapPerRet[item.first] = false;
+
+        }
+
+
         if (temp.size() > 9) {
             temp.pop_front();
         }
@@ -158,11 +171,17 @@
     for (auto scoredRect:mObjs) {
         if (!getPerRet(scoredRect.id))//judgment.bool
         {
+            DBG("scoredRect.id" << scoredRect.id << " val=" << m_mapPerRet[scoredRect.id]);
+            m_mapPerRet[scoredRect.id] = true;
+
             m_triggerElement.setState(true);
+            auto t_image = image(
+                CvUtil::zoomRectEqual(scoredRect.rect, 1.2, 1.2) & cv::Rect(0, 0, image.cols, image.rows)).clone();
+            //  auto t_image = image(scoredRect.rect& cv::Rect(0, 0, image.cols, image.rows)).clone();
+            std::string imgUrl = uploadImgToFdfs(t_image);
+            saveInfoToEs(imgUrl, scoredRect);
             break;
-        }
-        else
-        {
+        } else {
             m_triggerElement.setState(false);
 
         }
@@ -170,25 +189,119 @@
     m_triggerElement.triggerOnce();
 }
 
-QJsonArray JudgmentRetrogradeTool::getJsonArrayFromQString(const QString strJson)
-{
+std::string JudgmentRetrogradeTool::uploadImgToFdfs(cv::Mat &image) {
+    std::string strImgUrl = "http://";
+    if (fdfsClient != nullptr && fdfsClient->fastFds != nullptr) {
+        fdfsClient->rwLock.rdlock();
+        std::vector<unsigned char> buffer;
+        CvUtil::cvMat2Buffer(image, buffer);
+        std::string strImgUrlTmp = "";
+        fdfsClient->fastFds->uploadFile(buffer, strImgUrlTmp, "jpg");
+        strImgUrl.append(fdfsClient->fastFds->getIp() + "/" + strImgUrlTmp);
+        strImgUrl.clear();
+        strImgUrl = strImgUrlTmp;
+//                    strImgUrl.append("/").append(strImgUrlTmp);
+        fdfsClient->rwLock.unlock();
+    }
+    return strImgUrl;
+}
+
+bool JudgmentRetrogradeTool::saveInfoToEs(const std::string &imgUrl, const ScoredRect &obj) {
+
+
+    string str_uuid;
+    uuid_t t_uuid;
+    char str[36];
+    uuid_generate(t_uuid);
+    uuid_unparse(t_uuid, str);
+    str_uuid = str;
+
+
+    Json::Value t_json;
+    t_json["Id"] = str_uuid; //涓婚敭
+//#todo
+
+    t_json["videoReqNum"] = m_sdkRule.strCamId.toStdString();
+    t_json["sdkType"] = to_string(m_sdkRule.nSdkType);
+//        t_json["Gender"] = obj.score;
+
+    t_json["picName"] = "wait todo";// 鎶撴媿鐓х墖鍚嶇О
+    t_json["content"] = "wait todo";// 鍐呭鎻忚堪
+    t_json["personPicUrl"] = "";// 浜哄憳 鍦板簱鍥剧墖
+    t_json["ChannlId"] = getProperty("ch_id"); // 閫氶亾id
+    t_json["likeDate"] = AppUtil::getTimeSecString(); // 姣斿鏃堕棿
+    t_json["picAddress"] = getProperty("str_addr");// 鎶撴媿鍦板潃
+    t_json["picMaxUrl"] = "wait todo"; // 澶у浘璺緞
+
+
+    //   t_json["Age"] ="wait todo";
+    t_json["picDate"] = obj.properties["time"]; // 鎶撴媿鏃堕棿锛屽繀椤绘湁
+    t_json["picLocalUrl"] = "wait todo";  // 鏈湴璺緞
+    t_json["isDelete"] = "1";//榛樿1 ,0鏃犳晥 1鏈夋晥
+
+    t_json["likePer"] = obj.score; // 鐩镐技鍊�
+
+    t_json["BaseName"] = "wait todo";// 鍦板簱鍚嶇О
+
+    t_json["videoNum"] = m_sdkRule.strCamId.toStdString();//Video璁惧缂栧彿
+    t_json["picSmUrl"] = imgUrl; // 鎶撴媿鍥剧墖
+    t_json["indeviceid"] = appPref.getStringData("fxDevID");;// 璁惧id
+    t_json["idcard"] = "wait todo";
+    t_json["personId"] = "wait todo";
+    t_json["indevicename"] = appPref.getStringData("fxDevNAME");// 璁惧鍚嶇О
+    t_json["FaceFeature"] = "base64";
+    t_json["personIsHub"] = m_triggerElement.getTriggerState() ? "1" : "4"; //1: 鎶ヨ  2: 鍙枒  3: 瀹夊叏  4: 鏈煡
+    t_json["videoIp"] = getProperty("local_ip");//褰撳墠鏈嶅姟鍣↖P鍦板潃
+    t_json["ack_alarm"] = m_triggerElement.getTriggerState() ? "0" : "";  //  que ren shi fou bao jing
+    t_json["cluster_id"] = "wait todo"; // ji qun id
+
+    bool retface = false;
+    if (pManagerEsDB)
+        retface = pManagerEsDB->insertData("personaction", "perVideoAction", t_json.toStyledString(), str_uuid);
+
+    if (retface) {
+        INFO("perVideoAction db success");
+    } else {
+        ERR("personaction db fail");
+    }
+}
+
+bool JudgmentRetrogradeTool::isInWeek(const std::vector<LActRuleWeekRecord> &ruleWeek) {
+
+    int nWeek = QDate::currentDate().dayOfWeek();
+    for (int i = 0; i < ruleWeek.size(); ++i) {
+        if (ruleWeek[i].m_nType == nWeek) {
+            QString strCurrent = QDateTime::currentDateTime().toString("hh:mm");
+            if (strCurrent >= ruleWeek[i].m_strBegin && strCurrent <= ruleWeek[i].m_strEnd) {
+                return true;
+            }
+        }
+    }
+    return false;
+}
+
+QJsonArray JudgmentRetrogradeTool::getJsonArrayFromQString(const QString strJson) {
     QJsonDocument jsonDocument = QJsonDocument::fromJson(strJson.toLocal8Bit());
-    if( jsonDocument.isNull() ){
-        qDebug()<< "please check the string"<< strJson.toLocal8Bit();
+    if (jsonDocument.isNull()) {
+        qDebug() << "please check the string" << strJson.toLocal8Bit();
         return QJsonArray();
     }
     QJsonArray jsonArray = jsonDocument.array();
     return jsonArray;
 }
 
-void JudgmentRetrogradeTool::setUpDetectionArea()
-{
+void JudgmentRetrogradeTool::setUpDetectionArea() {
 
 }
-void JudgmentRetrogradeTool::setDownDetectionArea()
-{
+
+void JudgmentRetrogradeTool::setDownDetectionArea() {
 
 }
+
 bool JudgmentRetrogradeTool::getTriggerState() const {
     return m_triggerElement.getTriggerState();
 }
+
+void JudgmentRetrogradeTool::setImage(const cv::Mat &value) {
+    value.copyTo(image);
+}
diff --git a/QiaoJiaSystem/StructureApp/JudgmentRetrogradeTool.h b/QiaoJiaSystem/StructureApp/JudgmentRetrogradeTool.h
index c2bb157..956c7ad 100644
--- a/QiaoJiaSystem/StructureApp/JudgmentRetrogradeTool.h
+++ b/QiaoJiaSystem/StructureApp/JudgmentRetrogradeTool.h
@@ -17,63 +17,75 @@
 #include <QJsonObject>
 #include <QJsonDocument>
 #include <QtGui/QPolygon>
+#include "DBStruct.h"
+#include <basic/db/Elasticsearch/EsDBTool.h>
+#include <jsoncpp/json/json.h>
 
-struct VectorPoint{
+struct VectorPoint {
     cv::Point2f start_Point;
     cv::Point2f end_Point;
 };
 
 typedef VectorPoint BaseLine;
-namespace JRTOOL{
+namespace JRTOOL {
 //浠t1涓哄熀鍑�
 //璁$畻涓や釜鍚戦噺鐨勫す瑙�,0~90涔嬮棿涓烘甯�,90~180涓洪�嗚
-static float getAngelOfTwoVector(VectorPoint &pt1, VectorPoint &pt2){
-    float theta = atan2(pt1.end_Point.x - pt1.start_Point.x, pt1.end_Point.y - pt1.start_Point.y)
-            - atan2(pt2.end_Point.x - pt2.start_Point.x, pt2.end_Point.y - pt2.start_Point.y);
-    if (theta > CV_PI)
-        theta -= 2 * CV_PI;
-    if (theta < -CV_PI)
-        theta += 2 * CV_PI;
-    theta = theta * 180.0 / CV_PI;
-    return abs(theta);
-}
+    static float getAngelOfTwoVector(VectorPoint &pt1, VectorPoint &pt2) {
+        float theta = atan2(pt1.end_Point.x - pt1.start_Point.x, pt1.end_Point.y - pt1.start_Point.y)
+                      - atan2(pt2.end_Point.x - pt2.start_Point.x, pt2.end_Point.y - pt2.start_Point.y);
+        if (theta > CV_PI)
+            theta -= 2 * CV_PI;
+        if (theta < -CV_PI)
+            theta += 2 * CV_PI;
+        theta = theta * 180.0 / CV_PI;
+        return abs(theta);
+    }
 
 //婊ゆ尝
-static float low_filter(float a, float b){
-    float sample_value;
-    float X=0.1;
-    sample_value=(1-X)*b+X*a;
-    return(sample_value);
-}
+    static float low_filter(float a, float b) {
+        float sample_value;
+        float X = 0.1;
+        sample_value = (1 - X) * b + X * a;
+        return (sample_value);
+    }
 }
 
 
-class JudgmentRetrogradeTool :public TimerElement {
+class JudgmentRetrogradeTool : public TimerElement {
 public:
-    JudgmentRetrogradeTool();
+    JudgmentRetrogradeTool() : TimerElement(1000) {}
+
+    JudgmentRetrogradeTool(const SdkRule &rule);
 
     virtual ~JudgmentRetrogradeTool();
 
-    bool init(QString area,QString line);
+    bool init(QString area, QString line);
 
     void setYoloObjects(std::vector<ScoredRect> value);
 
-    bool getPerRet(const long&);
+    bool getPerRet(const long &);
 
-     bool getTriggerState() const;
+    bool getTriggerState() const;
+
+    void setFdfs(FastFdsWithLock *p_fdfsClient) {
+        fdfsClient = p_fdfsClient;
+    }
+
+    void setImage(const cv::Mat &value);
 
 private:
-    void setPerPoint(const long&,cv::Point2f);
-    void setPerRect(const long&,cv::Rect rect);
+    void setPerPoint(const long &, cv::Point2f);
+
+    void setPerRect(const long &, cv::Rect rect);
 
     //璁剧疆涓婅鐨勮繍鍔ㄥ熀鍑嗙嚎
-    void setUpBaseline(cv::Point start,cv::Point end);
+    void setUpBaseline(cv::Point start, cv::Point end);
 
     //璁剧疆涓婅妫�娴嬪尯鍩�
     void setUpDetectionArea();
 
     //璁剧疆涓嬭鐨勮繍鍔ㄥ熀鍑嗙嚎
-    void setDownBaseline(cv::Point start,cv::Point end);
+    void setDownBaseline(cv::Point start, cv::Point end);
 
     //璁剧疆涓嬭妫�娴嬪尯鍩�
     void setDownDetectionArea();
@@ -81,14 +93,19 @@
 
     void func();
 
-    float getTheta(BaseLine&,VectorPoint&);
+    float getTheta(BaseLine &, VectorPoint &);
 
     QJsonArray getJsonArrayFromQString(const QString strJson);
 
+    std::string uploadImgToFdfs(cv::Mat &image);
+
+    bool saveInfoToEs(const std::string &imgUrl, const ScoredRect &obj);
+
+    bool isInWeek(const std::vector<LActRuleWeekRecord> &ruleWeek);
 
 private:
     //    virtual void threadInitial() override;
-    virtual void timerFunc()override;
+    virtual void timerFunc() override;
     //    virtual void threadClosing()override;
 
 private:
@@ -99,19 +116,26 @@
 
     //浜哄憳杩愬姩杞ㄨ抗
     //璺熻釜id,杩愬姩涓績鐐�
-    std::map<long,std::vector<cv::Point2f>> m_mapPerPoint;
+    std::map<long, std::vector<cv::Point2f>> m_mapPerPoint;
 
     //璺熻釜id,涓庡熀鍑嗙嚎鐨勫す瑙掑垪琛�
-    std::map<long,std::list<float>> m_mapPerDirection;
+    std::map<long, std::list<float>> m_mapPerDirection;
 
     //璺熻釜id,閫嗚鐘舵��
-    std::map<long,bool> m_mapPerRet;
+    std::map<long, bool> m_mapPerRet;
 
     QPolygon m_polygon;
 
     TriggerElement m_triggerElement;
 
     std::vector<ScoredRect> mObjs;
+
+    const SdkRule m_sdkRule;
+
+    FastFdsWithLock *fdfsClient;
+
+    cv::Mat image;
+    EsDBTool *pManagerEsDB;
 };
 
 
diff --git a/QiaoJiaSystem/StructureApp/PerStaticElement.cpp b/QiaoJiaSystem/StructureApp/PerStaticElement.cpp
new file mode 100644
index 0000000..4dbcf92
--- /dev/null
+++ b/QiaoJiaSystem/StructureApp/PerStaticElement.cpp
@@ -0,0 +1,274 @@
+#include "PerStaticElement.h"
+#include <basic/debug/Debug.h>
+#include <iostream>
+#include <opencv2/opencv.hpp>
+#include <basic/timer_counter/Clocktimer.h>
+#include <QJsonDocument>
+#include <QJsonObject>
+#include <QString>
+#include <basic/util/app/AppPreference.hpp>
+#include <basic/util/opencv/CvUtil.h>
+#include <uuid/uuid.h>
+#include <jsoncpp/json/json.h>
+
+PerStaticElement::PerStaticElement(const SdkRule& rule):
+PipeElement(true),
+m_sdkRule(rule),
+m_triggerElement(0,0),
+m_lTime(AppUtil::getCurrentUs()),
+pManagerEsDB(nullptr)
+{
+   pManagerEsDB=new EsDBTool(appPref.getStringData("ipAdd"), appPref.getIntData("ipPort"));
+
+}
+
+PerStaticElement::~PerStaticElement()
+{
+   if(pManagerEsDB)
+   {
+       delete pManagerEsDB;
+       pManagerEsDB=nullptr;
+   }
+}
+
+
+
+void PerStaticElement::threadInitial()
+{
+   setMask(m_sdkRule.strAreas.toStdString());
+}
+
+
+void PerStaticElement::threadFunc()
+{
+
+    if(!isInWeek(m_sdkRule.weekRuleVec))
+        return;
+    int num=0;
+
+
+    for(auto obj:mObjs)
+    {
+
+            if(obj.score < m_sdkRule.fSensitivity)continue;
+
+            QRect rect(obj.rect.x,obj.rect.y,obj.rect.width,obj.rect.height);
+            QPoint center = rect.center();
+            if(mPolygon.containsPoint(center,Qt::OddEvenFill))
+            {
+                for(auto score:m_lastScoreRect)
+                {
+                    if(obj.id == score.id)
+                    {
+                        obj.isMove = score.isMove;
+                        //DBG("moving? "<<_TrackingInfo.m_bMoveState)
+                        break;
+                    }
+                }
+
+
+            }
+
+    }
+    if((AppUtil::getCurrentUs()-m_lTime)>(m_sdkRule.nTriggerDelay*60*1000*1000))
+    {
+        for(auto& obj: mObjs){
+
+            //compare with last temp memery and clear temp memery
+            for(auto ele:m_lastScoreRect)
+            {
+                if(ele.id==obj.id)
+                {
+                    if((obj.rect&ele.rect).area()>ele.rect.area()*0.8)
+                    {
+                        //not moving
+                        obj.isMove = true;
+
+                         auto t_image = image(CvUtil::zoomRectEqual(obj.rect, 1.2, 1.2) & cv::Rect(0, 0, image.cols, image.rows)).clone();
+                         std::string imgUrl=uploadImgToFdfs(t_image);
+                         saveInfoToEs(imgUrl,obj);
+                         m_triggerElement.setState(true);
+                        //DBG("not moving")
+                    }
+                    else
+                    {
+                        obj.isMove = false;
+                        m_triggerElement.setState(false);
+                        //DBG("moving")
+                    }
+                    break;
+                }
+            }
+            //do temp memery
+
+        }
+        m_lastScoreRect = mObjs;
+        m_lTime =AppUtil::getCurrentUs();
+    }
+    m_lastScoreRect=mObjs;
+    m_triggerElement.triggerOnce();
+
+
+    fireConnectors();
+}
+
+
+
+
+
+
+//void PerimeterElement::setSensitivity(float value)
+//{
+//    sensitivity = value;
+//}
+
+
+
+void PerStaticElement::setObjsResults(const YoloDetect::ObjInfos &value)
+{
+    m_objs = value;
+}
+
+std::vector<ScoredRect> PerStaticElement::getLastScoreRects() const {
+    return trackingTrigger->getLastScoreRects();
+}
+
+void PerStaticElement::setYoloObjects(std::vector<ScoredRect> value)
+{
+    mObjs=value;
+}
+
+
+void PerStaticElement::setMask(std::string mask)
+{
+    QJsonArray arrayAreas = getJsonArrayFromQString(QString::fromStdString(mask));
+    if(arrayAreas.isEmpty())
+    {
+        return;//do not detect
+    }
+    for(int i = 0;i < arrayAreas.size();++i)
+    {
+        QJsonValue jsonValue = arrayAreas[i];
+        QJsonObject obj = jsonValue.toObject();
+        int x = obj.value("x").toDouble()*4;
+        int y = obj.value("y").toDouble()*4;
+        mPolygon<<(QPoint(x,y));
+
+    }
+}
+QJsonArray PerStaticElement::getJsonArrayFromQString(const QString& strJson)
+{
+    QJsonDocument jsonDocument = QJsonDocument::fromJson(strJson.toLocal8Bit());
+    if( jsonDocument.isNull() ){
+        //DBG("please check the string"<< strJson.toLocal8Bit());
+        return QJsonArray();
+    }
+    QJsonArray jsonArray = jsonDocument.array();
+    return jsonArray;
+}
+
+
+bool PerStaticElement::getTriggerState() const {
+    return m_triggerElement.getTriggerState();
+}
+std::string PerStaticElement::uploadImgToFdfs(cv::Mat& image)
+{
+    std::string strImgUrl = "http://";
+    if (fdfsClient != nullptr && fdfsClient->fastFds != nullptr) {
+        fdfsClient->rwLock.rdlock();
+        std::vector<unsigned char> buffer;
+        CvUtil::cvMat2Buffer(image, buffer);
+        std::string strImgUrlTmp = "";
+        fdfsClient->fastFds->uploadFile(buffer, strImgUrlTmp, "jpg");
+        strImgUrl.append(fdfsClient->fastFds->getIp() + "/" + strImgUrlTmp);
+        strImgUrl.clear();
+        strImgUrl = strImgUrlTmp;
+//                    strImgUrl.append("/").append(strImgUrlTmp);
+        fdfsClient->rwLock.unlock();
+    }
+    return strImgUrl;
+}
+bool PerStaticElement::saveInfoToEs(const std::string& imgUrl,const ScoredRect& obj)
+{
+
+
+    string str_uuid;
+    uuid_t t_uuid;
+    char str[36];
+    uuid_generate(t_uuid);
+    uuid_unparse(t_uuid, str);
+    str_uuid = str;
+
+
+    Json::Value t_json;
+    t_json["Id"] = str_uuid; //涓婚敭
+//#todo
+
+    t_json["videoReqNum"] = m_sdkRule.strCamId.toStdString();
+    t_json["sdkType"] =to_string(m_sdkRule.nSdkType);
+//        t_json["Gender"] = obj.score;
+
+    t_json["picName"] = "wait todo";// 鎶撴媿鐓х墖鍚嶇О
+    t_json["content"] = "wait todo";// 鍐呭鎻忚堪
+    t_json["personPicUrl"] = "";// 浜哄憳 鍦板簱鍥剧墖
+    t_json["ChannlId"] = getProperty("ch_id"); // 閫氶亾id
+    t_json["likeDate"] =AppUtil::getTimeSecString(); // 姣斿鏃堕棿
+    t_json["picAddress"] =getProperty("str_addr");// 鎶撴媿鍦板潃
+    t_json["picMaxUrl"] = "wait todo"; // 澶у浘璺緞
+
+
+ //   t_json["Age"] ="wait todo";
+    t_json["picDate"] = obj.properties["time"]; // 鎶撴媿鏃堕棿锛屽繀椤绘湁
+    t_json["picLocalUrl"] = "wait todo";  // 鏈湴璺緞
+    t_json["isDelete"] = "1";//榛樿1 ,0鏃犳晥 1鏈夋晥
+
+    t_json["likePer"] = obj.score; // 鐩镐技鍊�
+
+    t_json["BaseName"] = "wait todo";// 鍦板簱鍚嶇О
+
+    t_json["videoNum"] =  m_sdkRule.strCamId.toStdString();//Video璁惧缂栧彿
+    t_json["picSmUrl"] = imgUrl; // 鎶撴媿鍥剧墖
+    t_json["indeviceid"] = appPref.getStringData("fxDevID");;// 璁惧id
+    t_json["idcard"] = "wait todo";
+    t_json["personId"] = "wait todo";
+    t_json["indevicename"] =  appPref.getStringData("fxDevNAME");// 璁惧鍚嶇О
+    t_json["FaceFeature"] = "base64";
+    t_json["personIsHub"] = m_triggerElement.getTriggerState()?"1":"4"; //1: 鎶ヨ  2: 鍙枒  3: 瀹夊叏  4: 鏈煡
+    t_json["videoIp"] = m_sdkRule.strAddr.toStdString();  // 璁惧ip
+    t_json["ack_alarm"]=m_triggerElement.getTriggerState()?"0":"";  //  que ren shi fou bao jing
+    t_json["cluster_id"]="wait todo"; // ji qun id
+
+    bool retface = false;
+    if(pManagerEsDB)
+    retface = pManagerEsDB->insertData("personaction", "perVideoAction", t_json.toStyledString(), str_uuid);
+    if (retface)
+    {
+        INFO("perVideoAction db success");
+    }
+    else
+    {
+        ERR("personaction db fail");
+    }
+}
+bool PerStaticElement::isInWeek(const std::vector<LActRuleWeekRecord>& ruleWeek)
+{
+
+    int nWeek = QDate::currentDate().dayOfWeek();
+    for(int i = 0;i < ruleWeek.size();++i)
+    {
+        if(ruleWeek[i].m_nType == nWeek)
+        {
+            QString strCurrent = QDateTime::currentDateTime().toString("hh:mm");
+            if(strCurrent >= ruleWeek[i].m_strBegin && strCurrent <= ruleWeek[i].m_strEnd)
+            {
+               return true;
+            }
+        }
+    }
+    return false;
+}
+void PerStaticElement::setImage(const cv::Mat &value)
+{
+
+    value.copyTo(image);
+}
diff --git a/QiaoJiaSystem/StructureApp/PerStaticElement.h b/QiaoJiaSystem/StructureApp/PerStaticElement.h
new file mode 100644
index 0000000..d6c21a7
--- /dev/null
+++ b/QiaoJiaSystem/StructureApp/PerStaticElement.h
@@ -0,0 +1,84 @@
+#ifndef PERSTATICELEMENT
+#define PERSTATICELEMENT
+#include <basic/pipe/PipeElement.h>
+#include <opencv2/opencv.hpp>
+#include <Ice/Ice.h>
+#include <YoloServer.h>
+#include <QtGui/qpolygon.h>
+#include "TrackingTrigger.h"
+#include <QJsonArray>
+#include <RapidStructureApp/TriggerElement.h>
+#include <basic/util/fastdfs/FastFds.hpp>
+#include "DBStruct.h"
+#include <basic/db/Elasticsearch/EsDBTool.h>
+class PerStaticElement : public basic::PipeElement
+{
+public:
+    PerStaticElement(){}
+    PerStaticElement(const SdkRule& rule);
+public:
+    ~PerStaticElement();
+
+    //鏄惁鏈夌煩褰�
+    bool hasRects();
+    //璁剧疆ROI鍖哄煙
+
+
+
+
+    void setYoloObjects(std::vector<ScoredRect> value);
+
+    //灏嗘娴嬬粨鏋滄斁鍒版鍗曞厓涓�
+    //void setVptResults(const vector<VPT_ObjInfo> &value);
+    void setObjsResults(const ::YoloDetect::ObjInfos &value);
+
+    //璁剧疆缃俊搴�
+    void setSensitivity(float value);
+
+    //鑾峰彇鐭╁舰妗�
+    std::vector<cv::Rect2f> getRects() const;
+
+    //鑾峰彇YOLO妫�娴嬬殑缁撴灉
+    std::vector<ScoredRect> getLastScoreRects() const;
+
+
+    bool getTriggerState() const;
+
+    void setFdfs(FastFdsWithLock *p_fdfsClient) {
+        fdfsClient = p_fdfsClient;
+    }
+    void setImage(const cv::Mat &value);
+
+private:
+
+
+    virtual void threadInitial()override;
+
+    virtual void threadFunc()override;
+
+    QJsonArray getJsonArrayFromQString(const QString& strJson);
+
+    std::string uploadImgToFdfs(cv::Mat& image);
+
+    bool saveInfoToEs(const std::string& imgUrl,const ScoredRect& obj);
+    void setMask(std::string mask);
+    bool isInWeek(const std::vector<LActRuleWeekRecord>& ruleWeek);
+
+private:
+    cv::Mat image;
+    //cv::Mat mask;
+    //vector<VPT_ObjInfo> vptResults;
+    ::YoloDetect::ObjInfos m_objs;
+    QPolygon mPolygon;
+    TrackingTrigger *trackingTrigger;
+    ::YoloDetect::stringData cocoData;
+    std::vector<ScoredRect> mObjs;
+    TriggerElement m_triggerElement;
+    FastFdsWithLock* fdfsClient;
+    SdkRule m_sdkRule;
+    std::vector<ScoredRect> m_lastScoreRect;
+    unsigned long long m_lTime;
+    EsDBTool* pManagerEsDB;
+};
+
+#endif // PAELEMENT_H
diff --git a/QiaoJiaSystem/StructureApp/PerimeterElement.cpp b/QiaoJiaSystem/StructureApp/PerimeterElement.cpp
index 36efe0c..27d4716 100644
--- a/QiaoJiaSystem/StructureApp/PerimeterElement.cpp
+++ b/QiaoJiaSystem/StructureApp/PerimeterElement.cpp
@@ -8,98 +8,127 @@
 #include <QJsonObject>
 #include <QString>
 #include <basic/util/app/AppPreference.hpp>
-#include <basic/db/Elasticsearch/EsDBTool.h>
+
 #include <basic/util/opencv/CvUtil.h>
 #include <uuid/uuid.h>
 #include <jsoncpp/json/json.h>
-PerimeterElement::PerimeterElement(int alarm_people_num):
-m_nAlarmPeopleNum(alarm_people_num),
-PipeElement(true),
-trackingTrigger(nullptr),
-mRealNum(0),
-m_triggerElement(0,50)
-{
 
-    trackingTrigger= new TrackingTrigger(0.5);
+PerimeterElement::PerimeterElement(const SdkRule &rule) :
+    m_sdkRule(rule),
+    PipeElement(true),
+    trackingTrigger(nullptr),
+    mRealNum(0),
+    m_triggerElement(0, rule.nTriggerDelay * 1000 * 1000),
+    pManagerEsDB(nullptr),
+    npts(0) {
 
-
+    pManagerEsDB = new EsDBTool(appPref.getStringData("ipAdd"), appPref.getIntData("ipPort"));
 }
 
-PerimeterElement::~PerimeterElement()
-{
-    if(trackingTrigger)
-    {
-        delete trackingTrigger;
-        trackingTrigger=nullptr;
+PerimeterElement::~PerimeterElement() {
+    if (pManagerEsDB) {
+        delete pManagerEsDB;
+        pManagerEsDB = nullptr;
     }
 }
 
 
-
-void PerimeterElement::threadInitial()
-{
-
+void PerimeterElement::threadInitial() {
+    setMask(m_sdkRule.strAreas.toStdString());
 }
 
 
-void PerimeterElement::threadFunc()
-{
+void PerimeterElement::threadFunc() {
 
-    int num=0;
-    string detKey = getProperty("dev_id") + getProperty("ch_id")+getProperty("sdkType")+".det";
-     float t_det_sc =0.75;
+    if (!isInWeek(m_sdkRule.weekRuleVec))
+        return;
+    int num = 0;
+    std::string picDate;
+    bool state = false;
 
-     t_det_sc= appPref.getFloatData(detKey) == -1 ? 0.75 : appPref.getFloatData(detKey);
+    m_recVec.clear();
+    //   DBG("Objs="<<mObjs.size()<<" fSensitivity="<<m_sdkRule.fSensitivity<<" nThreshold"<<m_sdkRule.nThreshold);
 
+    for (auto obj:mObjs) {
 
-//           t_det_sc= appPref.getFloatData(t_camIdex + "perimeter.det") == -1 ? 0.75 : appPref.getFloatData(t_camIdex + "perimeter.det");
+        if (obj.score < m_sdkRule.fSensitivity)continue;
 
+        QRect rect(obj.rect.x, obj.rect.y, obj.rect.width, obj.rect.height);
+        QPoint center = rect.center();
+        if (mPolygon.containsPoint(center, Qt::OddEvenFill)) {
+            m_recVec.push_back(obj.rect);
+            if (picDate.empty()) {
+                picDate = obj.properties["time"];
+                // DBG("picDate="<<picDate);
 
-    for(auto obj:m_objs){
-            if(obj.type!=0) continue;
-            //todo
-            if(obj.prob < ((1-0.5)/2+0.5))continue;
-
-//            ScoredRect scoredRect;
-
-            int x = obj.rcObj.left * image.cols;
-            int y = obj.rcObj.top * image.rows;
-            int w = (obj.rcObj.right - obj.rcObj.left) * image.cols;
-            int h = (obj.rcObj.bottom - obj.rcObj.top) * image.rows;
-//            scoredRect.rect = cv::Rect(x, y, w, h);
-//            scoredRect.score = scoredRect.rect.area() > 0 ? obj.prob : 0;
-           // cv::Rect rec=obj.rect;
-            QRect rect(x,y,w,h);
-            QPoint center = rect.center();
-            if(mPolygon.containsPoint(center,Qt::OddEvenFill))
-            {
-               // scoredRect.isMask=true;
-                //if(bInWeekTime)
-                   num++;
-                  auto t_image = image(cv::Rect(x, y, w, h)& cv::Rect(0, 0, image.cols, image.rows)).clone();
-                 std::string imgUrl=uploadImgToFdfs(t_image);
-                 saveInfoToEs(imgUrl,obj);
             }
-//            if(trackingTrigger->triggerOnce(scoredRect))
-//            {
-//                trackingTrigger->getLastRect().properties["id"] = to_string(scoredRect.id);
-//                trackingTrigger->getLastRect().properties["type"] = cocoData[obj.type];
-//            }
+
+            num++;
+
+
+        }
+
 
     }
-    trackingTrigger->triggerLine();
-    if(num>=m_nAlarmPeopleNum)
-    {
-        m_triggerElement.setState(true);
+
+    switch (m_sdkRule.nSdkType) {
+        case PerimeterSdk:
+            state = num > 0 && num != mRealNum;
+
+
+            break;
+        case CrowdSdk:
+            state = num > m_sdkRule.nAlarmNumLowerLimit && num != mRealNum;
+
+            break;
+        case PerHubSdk:
+            state = num > m_sdkRule.nAlarmNumLowerLimit && num < m_sdkRule.nAlarmNumUpperLimit && num != mRealNum;
+//         if(m_sdkRule.nAlarmNumLowerLimit>0)
+//         {
+//             if( m_sdkRule.nAlarmNumUpperLimit>m_sdkRule.nAlarmNumLowerLimit+1)
+//             {
+
+//                  m_triggerElement.setState(num>m_sdkRule.nAlarmNumLowerLimit && num<m_sdkRule.nAlarmNumUpperLimit);
+//             }
+//             else
+//             {
+//                  m_triggerElement.setState(num>m_sdkRule.nAlarmNumLowerLimit);
+//             }
+
+//         }
+//         else
+//         {
+//             if(m_sdkRule.nAlarmNumUpperLimit>0)
+//             {
+//                 m_triggerElement.setState(num>m_sdkRule.nAlarmNumUpperLimit);
+//             }
+//             else
+//             {
+//                m_triggerElement.setState(false);
+//             }
+//         }
+
+
+            break;
+        default:
+            break;
+    }
+    m_triggerElement.setState(state);
+
+    //  DBG("imgUrl="<<imgUrl);
+    if (state) {
+        auto t_image = image(CutMask()).clone();
+        std::string imgUrl = uploadImgToFdfs(t_image);
+        saveInfoToEs(imgUrl, picDate);
+        DBG("num=" << num << " lastnum=" << mRealNum);
 
     }
-    else
-    {
-        m_triggerElement.setState(false);
-    }
+
+
     m_triggerElement.triggerOnce();
-    mRealNum=num;
 
+    mRealNum = num;
+    // DBG("m_sdkRule.nSdkType="<<m_sdkRule.nSdkType<<" num="<<num);
     fireConnectors();
 }
 
@@ -108,15 +137,14 @@
 
 
 
-void PerimeterElement::setSensitivity(float value)
-{
-    sensitivity = value;
-}
+//void PerimeterElement::setSensitivity(float value)
+//{
+//    sensitivity = value;
+//}
 
 
 
-void PerimeterElement::setObjsResults(const YoloDetect::ObjInfos &value)
-{
+void PerimeterElement::setObjsResults(const YoloDetect::ObjInfos &value) {
     m_objs = value;
 }
 
@@ -124,56 +152,57 @@
     return trackingTrigger->getLastScoreRects();
 }
 
-void PerimeterElement::setYoloObjects(std::vector<ScoredRect> value)
-{
-    mObjs=value;
+void PerimeterElement::setYoloObjects(std::vector<ScoredRect> value) {
+    mObjs.clear();
+    mObjs = value;
 }
 
-int PerimeterElement::getRealNum() const
-{
+int PerimeterElement::getRealNum() const {
     //DBG("getRealNum "<<mRealNum);
     return mRealNum;
 }
-void PerimeterElement::setMask(std::string mask)
-{
+
+void PerimeterElement::setMask(std::string mask) {
     QJsonArray arrayAreas = getJsonArrayFromQString(QString::fromStdString(mask));
-    if(arrayAreas.isEmpty())
-    {
+    if (arrayAreas.isEmpty()) {
         return;//do not detect
     }
-    for(int i = 0;i < arrayAreas.size();++i)
-    {
+    int size = arrayAreas.size();
+    npts = size;
+    for (int i = 0; i < size; ++i) {
+
         QJsonValue jsonValue = arrayAreas[i];
         QJsonObject obj = jsonValue.toObject();
-        int x = obj.value("x").toInt()*2;
-        int y = obj.value("y").toInt()*2;
-        mPolygon<<(QPoint(x,y));
+        int x = obj.value("x").toDouble() * 4;
+        int y = obj.value("y").toDouble() * 4;
+
+        mPolygon << (QPoint(x, y));
 
     }
 }
-QJsonArray PerimeterElement::getJsonArrayFromQString(const QString& strJson)
-{
+
+QJsonArray PerimeterElement::getJsonArrayFromQString(const QString &strJson) {
     QJsonDocument jsonDocument = QJsonDocument::fromJson(strJson.toLocal8Bit());
-    if( jsonDocument.isNull() ){
-        //DBG("please check the string"<< strJson.toLocal8Bit());
+    if (jsonDocument.isNull()) {
+        DBG("please check the string" << strJson.toStdString());
         return QJsonArray();
     }
     QJsonArray jsonArray = jsonDocument.array();
     return jsonArray;
 }
 
-void PerimeterElement::setImage(const cv::Mat &value)
-{
+void PerimeterElement::setImage(const cv::Mat &value) {
 //    if (value.size != image.size) {
 //        image = cv::Mat(value.rows, value.cols, CV_8UC3, sharedMemory->data());
 //    }
-//    value.copyTo(image);
+    value.copyTo(image);
 }
+
 bool PerimeterElement::getTriggerState() const {
     return m_triggerElement.getTriggerState();
 }
-std::string PerimeterElement::uploadImgToFdfs(cv::Mat& image)
-{
+
+std::string PerimeterElement::uploadImgToFdfs(cv::Mat &image) {
     std::string strImgUrl = "http://";
     if (fdfsClient != nullptr && fdfsClient->fastFds != nullptr) {
         fdfsClient->rwLock.rdlock();
@@ -189,53 +218,126 @@
     }
     return strImgUrl;
 }
-bool PerimeterElement::saveInfoToEs(const std::string& imgUrl,const ::YoloDetect::ObjInfo& obj)
-{
 
-        //#todo
-        EsDBTool pManagerEsDB(appPref.getStringData("ipAdd"), appPref.getIntData("ipPort"));
+bool PerimeterElement::saveInfoToEs(const std::string &imgUrl, const std::string &time) {
 
-        string str_uuid;
-        uuid_t t_uuid;
-        char str[36];
-        uuid_generate(t_uuid);
-        uuid_unparse(t_uuid, str);
-        str_uuid = str;
+    string str_uuid;
+    uuid_t t_uuid;
+    char str[36];
+    uuid_generate(t_uuid);
+    uuid_unparse(t_uuid, str);
+    str_uuid = str;
 
 
-        Json::Value t_json;
-        t_json["Id"] = str_uuid; //涓婚敭
+    Json::Value t_json;
+    t_json["Id"] = str_uuid; //涓婚敭
 //#todo
 
-        t_json["picName"] = "wait todo";
-        t_json["DataType"] = cocoData[obj.type];
-        t_json["Score"] = obj.prob;
+    t_json["videoReqNum"] = m_sdkRule.strCamId.toStdString();
+    t_json["sdkType"] = to_string(m_sdkRule.nSdkType);
+//    DBG("to_string(m_sdkRule.nSdkType)="<<to_string(m_sdkRule.nSdkType));
+//        t_json["Gender"] = obj.score;
 
-        t_json["likeDate"] = AppUtil::getTimeSecString();//姣旇緝鏃堕棿
-        t_json["picAddress"] = getProperty("str_addr");//鎶撴媿鍦板潃
-        t_json["picSmUrl"] = imgUrl;//浜哄憳鎶撳皬鍥�
-        t_json["picDate"] = getProperty("time");
-        t_json["viType"] = "2";//鍙湁4绉嶇被鍨� 1:personface 2:personbody 3:car 4:bicycle 5:none 鏈煡绫诲瀷
-        t_json["personIsHub"] = "4";//1: 鎶ヨ  2: 鍙枒  3: 瀹夊叏  4: 鏈煡
-        t_json["videoIp"] = getProperty("local_ip");//褰撳墠鏈嶅姟鍣↖P鍦板潃
+    t_json["picName"] = "wait todo";// 鎶撴媿鐓х墖鍚嶇О
+    t_json["content"] = "wait todo";// 鍐呭鎻忚堪
+    t_json["personPicUrl"] = "";// 浜哄憳 鍦板簱鍥剧墖
+    t_json["ChannlId"] = getProperty("ch_id"); // 閫氶亾id
+    t_json["likeDate"] = AppUtil::getTimeSecString(); // 姣斿鏃堕棿
+    t_json["picAddress"] = getProperty("str_addr");// 鎶撴媿鍦板潃
+    t_json["picMaxUrl"] = "wait todo"; // 澶у浘璺緞
 
 
-        t_json["videoNum"] = getProperty("path");//Vide缂栧彿 澶栭敭
-        t_json["videoReqNum"] = getProperty("dev_id");//Video璁惧缂栧彿
-        t_json["ChannlId"] = getProperty("ch_id");//閫氶亾id
-        t_json["isDelete"] = "1";//榛樿1 ,0鏃犳晥 1鏈夋晥
+    //   t_json["Age"] ="wait todo";
+    t_json["picDate"] = time; // 鎶撴媿鏃堕棿锛屽繀椤绘湁
+    // DBG("picDate="<<time);
+    t_json["picLocalUrl"] = "wait todo";  // 鏈湴璺緞
+    t_json["isDelete"] = "1";//榛樿1 ,0鏃犳晥 1鏈夋晥
 
-        t_json["indeviceid"] = appPref.getStringData("fxDevID");
-        t_json["indevicename"] = appPref.getStringData("fxDevNAME");
-        bool retface = false;
-        std::string name=getProperty("sdkType")+"det";
-        retface = pManagerEsDB.insertData(name, "info", t_json.toStyledString(), str_uuid);
-        if (retface)
-        {
-            INFO(name<<"db success");
+    t_json["likePer"] = "0"; // 鐩镐技鍊�
+
+    t_json["BaseName"] = "wait todo";// 鍦板簱鍚嶇О
+
+    t_json["videoNum"] = m_sdkRule.strCamId.toStdString();//Video璁惧缂栧彿
+    t_json["picSmUrl"] = imgUrl; // 鎶撴媿鍥剧墖
+    t_json["indeviceid"] = appPref.getStringData("fxDevID");;// 璁惧id
+    t_json["idcard"] = "wait todo";
+    t_json["personId"] = "wait todo";
+    t_json["indevicename"] = appPref.getStringData("fxDevNAME");// 璁惧鍚嶇О
+    t_json["FaceFeature"] = "base64";
+    t_json["personIsHub"] = m_triggerElement.getTriggerState() ? "1" : "4"; //1: 鎶ヨ  2: 鍙枒  3: 瀹夊叏  4: 鏈煡
+    t_json["videoIp"] = m_sdkRule.strAddr.toStdString();  // 璁惧ip
+    t_json["ack_alarm"] = m_triggerElement.getTriggerState() ? "0" : "";  //  que ren shi fou bao jing
+    t_json["cluster_id"] = "wait todo"; // ji qun id
+
+    bool retface = false;
+    if (pManagerEsDB)
+        retface = pManagerEsDB->insertData("personaction", "perVideoAction", t_json.toStyledString(), str_uuid);
+    if (retface) {
+        INFO("perVideoAction db success");
+    } else {
+        ERR("personaction db fail");
+    }
+}
+
+bool PerimeterElement::isInWeek(const std::vector<LActRuleWeekRecord> &ruleWeek) {
+
+    int nWeek = QDate::currentDate().dayOfWeek();
+    for (int i = 0; i < ruleWeek.size(); ++i) {
+        if (ruleWeek[i].m_nType == nWeek) {
+            QString strCurrent = QDateTime::currentDateTime().toString("hh:mm");
+            if (strCurrent >= ruleWeek[i].m_strBegin && strCurrent <= ruleWeek[i].m_strEnd) {
+                return true;
+            }
         }
-        else
-        {
-            ERR(name<<"db fail");
+    }
+    return false;
+}
+
+cv::Rect PerimeterElement::CutMask() {
+    int size = m_recVec.size();
+    //QPoint max,secMax;
+    cv::Rect rect, max, min;
+
+    if (size > 0) {
+
+        max = m_recVec[0];
+        min = m_recVec[0];
+    }
+
+    for (int i = 1; i < size; ++i) {
+        if (m_recVec[i].x > max.x) {
+
+            max.x = m_recVec[i].x;
         }
+
+
+        if (m_recVec[i].y > max.y) {
+
+            max.y = m_recVec[i].y;
+        }
+        if (m_recVec[i].x < min.x) {
+            min.x = m_recVec[i].x;
+        }
+
+        if (m_recVec[i].y < min.y) {
+            min.y = m_recVec[i].y;
+        }
+
+    }
+
+    if (size == 1) {
+        rect = max;
+    } else {
+
+        rect.x = min.x;
+        rect.y = min.y;
+        rect.width = max.x + max.width - min.x;
+        rect.height = max.y + max.height - min.y;
+    }
+
+    rect = CvUtil::zoomRectEqual(rect, 1.2, 1.2) & cv::Rect(0, 0, image.cols, image.rows);
+//    DBG("min x="<<min.x<<"y"<<min.y<<"w"<<min.width<<"h"<<min.height);
+//    DBG("max x="<<max.x<<"y"<<max.y<<"w"<<max.width<<"h"<<max.height);
+//   DBG("RECT x="<<rect.x<<"y"<<rect.y<<"w"<<rect.width<<"h"<<rect.height);
+    return rect;
 }
diff --git a/QiaoJiaSystem/StructureApp/PerimeterElement.h b/QiaoJiaSystem/StructureApp/PerimeterElement.h
index 9bf6eb4..685677e 100644
--- a/QiaoJiaSystem/StructureApp/PerimeterElement.h
+++ b/QiaoJiaSystem/StructureApp/PerimeterElement.h
@@ -1,8 +1,6 @@
 #ifndef PERIMETERELEMENT
 #define PERIMETERELEMENT
-
 #include <basic/pipe/PipeElement.h>
-//#include <basic/event/EventHandler.hpp>
 #include <opencv2/opencv.hpp>
 #include <Ice/Ice.h>
 #include <YoloServer.h>
@@ -11,19 +9,20 @@
 #include <QJsonArray>
 #include <RapidStructureApp/TriggerElement.h>
 #include <basic/util/fastdfs/FastFds.hpp>
-
-class PerimeterElement : public basic::PipeElement {
+#include "DBStruct.h"
+#include <basic/db/Elasticsearch/EsDBTool.h>
+class PerimeterElement : public basic::PipeElement
+{
 public:
-    PerimeterElement(int alarm_people_num = 1);
-
+    PerimeterElement(){}
+    PerimeterElement(const SdkRule& rule);
 public:
     ~PerimeterElement();
 
     //鏄惁鏈夌煩褰�
     bool hasRects();
-
     //璁剧疆ROI鍖哄煙
-    void setMask(std::string mask);
+
 
     void setImage(const cv::Mat &value);
 
@@ -49,36 +48,41 @@
     void setFdfs(FastFdsWithLock *p_fdfsClient) {
         fdfsClient = p_fdfsClient;
     }
-
+    void setImage(const cv::Mat &value) const;
 
 private:
 
 
-    virtual void threadInitial() override;
+    virtual void threadInitial()override;
 
-    virtual void threadFunc() override;
+    virtual void threadFunc()override;
 
-    QJsonArray getJsonArrayFromQString(const QString &strJson);
+    QJsonArray getJsonArrayFromQString(const QString& strJson);
 
-    std::string uploadImgToFdfs(cv::Mat &image);
+    std::string uploadImgToFdfs(cv::Mat& image);
 
-    bool saveInfoToEs(const std::string &imgUrl, const ::YoloDetect::ObjInfo &obj);
-
-
+    bool saveInfoToEs(const std::string& imgUrl,const std::string& time);
+    void setMask(std::string mask);
+    bool isInWeek(const std::vector<LActRuleWeekRecord>& ruleWeek);
+    cv::Rect CutMask();
 private:
     cv::Mat image;
-    cv::Mat mask;
+    //cv::Mat mask;
     //vector<VPT_ObjInfo> vptResults;
     ::YoloDetect::ObjInfos m_objs;
-    float sensitivity;
     QPolygon mPolygon;
     TrackingTrigger *trackingTrigger;
     ::YoloDetect::stringData cocoData;
     int mRealNum;
-    int m_nAlarmPeopleNum;
     std::vector<ScoredRect> mObjs;
     TriggerElement m_triggerElement;
-    FastFdsWithLock *fdfsClient;
+    FastFdsWithLock* fdfsClient;
+    SdkRule m_sdkRule;
+    EsDBTool* pManagerEsDB;
+
+
+   int npts;
+   vector<cv::Rect> m_recVec;
 };
 
 #endif // PAELEMENT_H
diff --git a/QiaoJiaSystem/StructureApp/PersonElement.cpp b/QiaoJiaSystem/StructureApp/PersonElement.cpp
new file mode 100644
index 0000000..6509449
--- /dev/null
+++ b/QiaoJiaSystem/StructureApp/PersonElement.cpp
@@ -0,0 +1,148 @@
+#include "PersonElement.h"
+#include <basic/util/app/AppPreference.hpp>
+#include <QtCore/QSharedMemory>
+#include <QtCore/QString>
+#include <basic/timer_counter/Clocktimer.h>
+#include <basic/util/opencv/CvUtil.h>
+
+
+#include <basic/db/Elasticsearch/EsDBTool.h>
+#include <uuid/uuid.h>
+#include <jsoncpp/json/json.h>
+
+#include <QtCore/QJsonDocument>
+#include <QtCore/QJsonObject>
+
+PersonElement::PersonElement(const SdkRule& sdkRule) :
+    m_sdkRule(sdkRule),
+//    rpcClient(appPref.getStringData("yolo.proxy"), appPref.getStringData("yolo.ip"),
+//              appPref.getIntData("yolo.port"), "tcp"),
+    fdfsClient(nullptr),
+    m_triggerElement(0, sdkRule.nTriggerDelay)
+{
+
+
+}
+
+PersonElement::~PersonElement() {
+
+}
+
+void PersonElement::threadFunc() {
+//    ClockTimer ct("YoloRpcElement::threadFunc");.
+        triggerMats.clear();
+        for (auto &obj: m_objs) {
+
+            if (obj.score < m_sdkRule.fSensitivity)
+                continue;
+
+
+                auto t_image = image(obj.rect & cv::Rect(0, 0, image.cols, image.rows)).clone();
+                triggerMats.push_back(t_image);
+                std::string strImgUrl = "http://";
+                if (fdfsClient != nullptr && fdfsClient->fastFds != nullptr) {
+                    fdfsClient->rwLock.rdlock();
+                    std::vector<unsigned char> buffer;
+                    CvUtil::cvMat2Buffer(t_image, buffer);
+                    std::string strImgUrlTmp = "";
+                    fdfsClient->fastFds->uploadFile(buffer, strImgUrlTmp, "jpg");
+                    strImgUrl.append(fdfsClient->fastFds->getIp() + "/" + strImgUrlTmp);
+                    strImgUrl.clear();
+                    strImgUrl = strImgUrlTmp;
+//                    strImgUrl.append("/").append(strImgUrlTmp);
+                    fdfsClient->rwLock.unlock();
+                }
+
+                //浣跨敤鐨勬椂鍊欏皢false鏀逛负ture
+                {
+                    //#todo
+                    EsDBTool pManagerEsDB(appPref.getStringData("ipAdd"), appPref.getIntData("ipPort"));
+
+                    string str_uuid;
+                    uuid_t t_uuid;
+                    char str[36];
+                    uuid_generate(t_uuid);
+                    uuid_unparse(t_uuid, str);
+                    str_uuid = str;
+
+//                jsonyolo.insert("HardCamId","");//纭洏鎽勫儚鏈篿d  锛燂紵锛熸嬁涓嶅埌
+//                jsonyolo.insert("ChannlId","");//閫氶亾id 锛燂紵锛� 鎷夸笉鍒�
+//                jsonyolo.insert("Time","");//鏃堕棿 鍙互鑾峰彇褰撳墠鏃堕棿 鏄庣‘鏃堕棿鏄幏鍙栧綋鍓嶇殑杩樻槸浼犺繃鏉ョ殑  锛燂紵锛� 鎷夸笉鍒�
+//                jsonyolo.insert("ImgUrl","");//鍥惧儚img璺緞  锛燂紵锛� 鎷夸笉鍒�
+//                jsonyolo.insert("Image","");//蹇収  锛燂紵锛� 鎷夸笉鍒�
+//                jsonyolo.insert("DataType",obj.type);//妫�娴嬬殑绫诲瀷
+//                jsonyolo.insert("Score",obj.prob);//妫�娴嬬殑寰楀垎
+
+                    Json::Value t_json;
+                    t_json["Id"] = str_uuid; //涓婚敭
+//#todo
+
+                    t_json["picName"] = "wait todo";
+                    t_json["DataType"] = obj.properties["type"];
+                    t_json["Score"] = obj.score;
+
+                    t_json["personPicUrl"] = "wait todo";//浜哄憳鍥剧墖 store
+                    t_json["likeDate"] = AppUtil::getTimeSecString();//姣旇緝鏃堕棿
+                    t_json["picAddress"] = m_sdkRule.strAddr.toStdString();//鎶撴媿鍦板潃
+                    t_json["picMaxUrl"] = "wait todo";//澶у浘璺緞
+                    t_json["picLocalUrl"] = "wait todo";//鏈湴璺緞
+                    t_json["picSmUrl"] = strImgUrl;//浜哄憳鎶撳皬鍥�
+
+//                    faceRpcElement.setProperty("frame_number", frame_number);
+                    t_json["picDate"] = obj.properties["time"];
+                    t_json["content"] = "wait todo";
+                    t_json["viType"] = "2";//鍙湁4绉嶇被鍨� 1:personface 2:personbody 3:car 4:bicycle 5:none 鏈煡绫诲瀷
+                    t_json["personIsHub"] = "4";//1: 鎶ヨ  2: 鍙枒  3: 瀹夊叏  4: 鏈煡
+                    t_json["videoIp"] = getProperty("local_ip");//褰撳墠鏈嶅姟鍣↖P鍦板潃
+
+
+                    t_json["videoNum"] = getProperty("path");//Vide缂栧彿 澶栭敭
+                    t_json["videoReqNum"] = getProperty("dev_id");//Video璁惧缂栧彿
+                    t_json["ChannlId"] = getProperty("ch_id");//閫氶亾id
+                    t_json["isDelete"] = "1";//榛樿1 ,0鏃犳晥 1鏈夋晥
+
+                    t_json["indeviceid"] = appPref.getStringData("fxDevID");
+                    t_json["indevicename"] = appPref.getStringData("fxDevNAME");
+
+                    DBG(t_json.toStyledString());
+                    bool retface = false;
+                    retface = pManagerEsDB.insertData("yolodet", "info", t_json.toStyledString(), str_uuid);
+                    if (retface) {
+                        INFO("facedb success");
+                    } else {
+                        ERR("facedb fail");
+                    }
+                }
+            }
+
+
+        if (triggerMats.size() > 0)fireConnectors("YoloTrigger");
+        fireConnectors();
+
+}
+
+void PersonElement::setObjsResults(const std::vector<ScoredRect>& objs)
+{
+    m_objs = objs;
+}
+bool PersonElement::getTrigger() const {
+    return (m_objs.size() > 0 ? true : false);
+}
+
+std::vector<cv::Mat> PersonElement::getTriggerMats() {
+    return triggerMats;
+}
+
+std::vector<ScoredRect> PersonElement::getLastScoreRects() const {
+    return m_objs;
+}
+
+void PersonElement::setImage(const cv::Mat &value) {
+
+    value.copyTo(image);
+}
+
+bool PersonElement::getTriggerState() const {
+    return m_triggerElement.getTriggerState();
+}
+
diff --git a/QiaoJiaSystem/StructureApp/PersonElement.h b/QiaoJiaSystem/StructureApp/PersonElement.h
new file mode 100644
index 0000000..8b20020
--- /dev/null
+++ b/QiaoJiaSystem/StructureApp/PersonElement.h
@@ -0,0 +1,54 @@
+#ifndef PERSONELEMENT_H
+#define PERSONELEMENT_H
+
+#include <YoloServer.h>
+#include <basic/pipe/PipeElement.h>
+#include <basic/rpc/IceRpc.hpp>
+#include <opencv2/opencv.hpp>
+#include <basic/util/fastdfs/FastFds.hpp>
+#include <RapidStructureApp/TriggerElement.h>
+#include "TrackingTrigger.h"
+#include "DBStruct.h"
+class QSharedMemory;
+
+class PersonElement : public basic::PipeElement {
+public:
+    PersonElement(){}
+    PersonElement(const SdkRule& sdkRule);
+
+    ~PersonElement();
+
+    void setImage(const cv::Mat &value);
+
+    std::vector<cv::Mat> getTriggerMats();
+
+    std::vector<ScoredRect> getLastScoreRects() const;
+
+    void setFdfs(FastFdsWithLock *p_fdfsClient) {
+        fdfsClient = p_fdfsClient;
+    }
+
+    bool getTriggerState() const;
+
+    bool getTrigger() const;
+    void setObjsResults(const std::vector<ScoredRect>& objs);
+
+private:
+    virtual void threadFunc() override;
+
+private:
+//    IceRpcClient<YoloDetect::YoloDetectServerPrx> rpcClient;
+    cv::Mat image;
+//    QSharedMemory *sharedMemory;
+   // ::YoloDetect::ObjInfos objs;
+    std::vector<ScoredRect> m_objs;
+  //  TrackingTrigger *trackingTrigger;
+    std::vector<cv::Mat> triggerMats;
+    ::YoloDetect::stringData cocoData;
+    FastFdsWithLock *fdfsClient;
+
+    TriggerElement m_triggerElement;
+    SdkRule m_sdkRule;
+};
+
+#endif // YOLORPCELEMENT_H
diff --git a/QiaoJiaSystem/StructureApp/TrackingTrigger.h b/QiaoJiaSystem/StructureApp/TrackingTrigger.h
index 8fe9509..2e86b19 100644
--- a/QiaoJiaSystem/StructureApp/TrackingTrigger.h
+++ b/QiaoJiaSystem/StructureApp/TrackingTrigger.h
@@ -9,8 +9,8 @@
 using namespace std;
 
 struct ScoredRect {
-    ScoredRect() : id(-1) ,isMask(false){}
-    bool isMask;
+    ScoredRect() : id(-1) ,isMove(false){}
+    bool isMove;
     float score;
     cv::Rect rect;
     long id;
diff --git a/QiaoJiaSystem/StructureApp/YoloRpcElement.cpp b/QiaoJiaSystem/StructureApp/YoloRpcElement.cpp
index 0a47849..b16012d 100644
--- a/QiaoJiaSystem/StructureApp/YoloRpcElement.cpp
+++ b/QiaoJiaSystem/StructureApp/YoloRpcElement.cpp
@@ -6,24 +6,20 @@
 #include <basic/util/opencv/CvUtil.h>
 
 
-#include <basic/db/Elasticsearch/EsDBTool.h>
-#include <uuid/uuid.h>
-#include <jsoncpp/json/json.h>
-
-#include <QtCore/QJsonDocument>
-#include <QtCore/QJsonObject>
-
-YoloRpcElement::YoloRpcElement(string shareMemoryName) :
+YoloRpcElement::YoloRpcElement(std::string shareMemoryName) :
     rpcClient(appPref.getStringData("yolo.proxy"), appPref.getStringData("yolo.ip"),
-              appPref.getIntData("yolo.port"), "tcp"), fdfsClient(nullptr), sharedMemory(nullptr),
-    m_triggerElement(0, 50), trackingTrigger(nullptr) {
+              appPref.getIntData("yolo.port"), "tcp"),
+    sharedMemory(nullptr),
+    trackingTrigger(nullptr)
+{
+     trackingTrigger = new TrackingTrigger(0.5);
     sharedMemory = new QSharedMemory(QString(shareMemoryName.c_str()));
 //    DBG(shareMemoryName);
     //1520 x 2688   1080 x 1920 //2560 * 1440 * 4
     if (!sharedMemory->create(4608 * 2592 * 4)) {
         sharedMemory->attach();
     }
-    trackingTrigger = new TrackingTrigger(0.5);
+
     try {
         auto server = rpcClient.getServer();
         cocoData = server->getCocoData();
@@ -37,39 +33,68 @@
     if (sharedMemory) {
         delete sharedMemory;
     }
-    if (trackingTrigger) {
+    if(trackingTrigger)
+    {
         delete trackingTrigger;
+        trackingTrigger=nullptr;
     }
 }
+void YoloRpcElement::setImage(const cv::Mat &value)
+{
+    if (value.size != image.size)
+    {
+        image = cv::Mat(value.rows, value.cols, CV_8UC3, sharedMemory->data());
+    }
+    value.copyTo(image);
+}
+::YoloDetect::ObjInfos YoloRpcElement::getObjects() const
+{
+    return objs;
+}
 
-void YoloRpcElement::threadFunc() {
-//    ClockTimer ct("YoloRpcElement::threadFunc");.
-    triggerMats.clear();
+
+std::vector<ScoredRect> YoloRpcElement::getLastScoreRects() const {
+    return triggerScoredRects;
+}
+
+ cv::Mat YoloRpcElement::getImage() const
+{
+    return image;
+}
+
+void YoloRpcElement::threadFunc()
+{
+        triggerScoredRects.clear();
     try {
-        auto server = rpcClient.getServer();
-        if (!server) {
-            ERR("server is null");
-            return;
+            auto server = rpcClient.getServer();
+            if (!server)
+            {
+                ERR("server is null");
+                return;
+            }
+            objs = server->YoloDetect(image.cols, image.rows, sharedMemory->key().toStdString());//TODO
         }
-        objs = server->YoloDetect(image.cols, image.rows, sharedMemory->key().toStdString());//TODO
-        if (objs.size() <= 0) {
-            m_triggerElement.setState(false);
-            m_triggerElement.triggerOnce(false);
-            trackingTrigger->triggerLine();
-            return;
-        } else {
-            m_triggerElement.setState(true);
+        catch (std::exception &e)
+        {
+            ERR(e.what())
         }
-        string t_camIdex = getProperty("dev_id") + getProperty("ch_id");
-        float t_det_sc =
-            appPref.getFloatData(t_camIdex + "yolo.det") == -1 ? 0.75 : appPref.getFloatData(t_camIdex + "yolo.det");
+        int size=objs.size();
+        if(size>30)
+        {
 
-        for (auto &obj: objs) {
+//              cv::imshow("image", image);
+
+//               cv::waitKey();
+
+            DBG("size="<<size);
+            return;
+        }
+
+        for (auto &obj: objs)
+        {
             if (obj.type != 0)
                 continue;
-            if (obj.prob < t_det_sc) {
-                continue;
-            }
+
             ScoredRect scoredRect;
 
             int x = obj.rcObj.left * image.cols;
@@ -77,122 +102,25 @@
             int w = (obj.rcObj.right - obj.rcObj.left) * image.cols;
             int h = (obj.rcObj.bottom - obj.rcObj.top) * image.rows;
             scoredRect.rect = cv::Rect(x, y, w, h);
-
             scoredRect.score = scoredRect.rect.area() > 0 ? obj.prob : 0;
-            if (trackingTrigger->triggerOnce(scoredRect)) {
+            if (trackingTrigger->triggerOnce(scoredRect))
+            {
                 trackingTrigger->getLastRect().properties["id"] = to_string(scoredRect.id);
                 trackingTrigger->getLastRect().properties["type"] = cocoData[obj.type];
-                auto t_image = image(scoredRect.rect & cv::Rect(0, 0, image.cols, image.rows)).clone();
-                triggerMats.push_back(t_image);
-
-                std::string strImgUrl = "http://";
-                if (fdfsClient != nullptr && fdfsClient->fastFds != nullptr) {
-                    fdfsClient->rwLock.rdlock();
-                    std::vector<unsigned char> buffer;
-                    CvUtil::cvMat2Buffer(t_image, buffer);
-                    std::string strImgUrlTmp = "";
-                    fdfsClient->fastFds->uploadFile(buffer, strImgUrlTmp, "jpg");
-                    strImgUrl.append(fdfsClient->fastFds->getIp() + "/" + strImgUrlTmp);
-                    strImgUrl.clear();
-                    strImgUrl = strImgUrlTmp;
-//                    strImgUrl.append("/").append(strImgUrlTmp);
-                    fdfsClient->rwLock.unlock();
-                }
-
-                //浣跨敤鐨勬椂鍊欏皢false鏀逛负ture
-                {
-                    //#todo
-                    EsDBTool pManagerEsDB(appPref.getStringData("ipAdd"), appPref.getIntData("ipPort"));
-
-                    string str_uuid;
-                    uuid_t t_uuid;
-                    char str[36];
-                    uuid_generate(t_uuid);
-                    uuid_unparse(t_uuid, str);
-                    str_uuid = str;
-
-//                jsonyolo.insert("HardCamId","");//纭洏鎽勫儚鏈篿d  锛燂紵锛熸嬁涓嶅埌
-//                jsonyolo.insert("ChannlId","");//閫氶亾id 锛燂紵锛� 鎷夸笉鍒�
-//                jsonyolo.insert("Time","");//鏃堕棿 鍙互鑾峰彇褰撳墠鏃堕棿 鏄庣‘鏃堕棿鏄幏鍙栧綋鍓嶇殑杩樻槸浼犺繃鏉ョ殑  锛燂紵锛� 鎷夸笉鍒�
-//                jsonyolo.insert("ImgUrl","");//鍥惧儚img璺緞  锛燂紵锛� 鎷夸笉鍒�
-//                jsonyolo.insert("Image","");//蹇収  锛燂紵锛� 鎷夸笉鍒�
-//                jsonyolo.insert("DataType",obj.type);//妫�娴嬬殑绫诲瀷
-//                jsonyolo.insert("Score",obj.prob);//妫�娴嬬殑寰楀垎
-
-                    Json::Value t_json;
-                    t_json["Id"] = str_uuid; //涓婚敭
-//#todo
-
-                    t_json["picName"] = "wait todo";
-                    t_json["DataType"] = cocoData[obj.type];
-                    t_json["Score"] = obj.prob;
-
-                    t_json["personPicUrl"] = "wait todo";//浜哄憳鍥剧墖 store
-                    t_json["likeDate"] = AppUtil::getTimeSecString();//姣旇緝鏃堕棿
-                    t_json["picAddress"] = getProperty("str_addr");//鎶撴媿鍦板潃
-                    t_json["picMaxUrl"] = "wait todo";//澶у浘璺緞
-                    t_json["picLocalUrl"] = "wait todo";//鏈湴璺緞
-                    t_json["picSmUrl"] = strImgUrl;//浜哄憳鎶撳皬鍥�
-
-//                    faceRpcElement.setProperty("frame_number", frame_number);
-                    t_json["picDate"] = getProperty("time");
-                    t_json["content"] = "wait todo";
-                    t_json["viType"] = "2";//鍙湁4绉嶇被鍨� 1:personface 2:personbody 3:car 4:bicycle 5:none 鏈煡绫诲瀷
-                    t_json["personIsHub"] = "4";//1: 鎶ヨ  2: 鍙枒  3: 瀹夊叏  4: 鏈煡
-                    t_json["videoIp"] = getProperty("local_ip");//褰撳墠鏈嶅姟鍣↖P鍦板潃
-
-
-                    t_json["videoNum"] = getProperty("path");//Vide缂栧彿 澶栭敭
-                    t_json["videoReqNum"] = getProperty("dev_id");//Video璁惧缂栧彿
-                    t_json["ChannlId"] = getProperty("ch_id");//閫氶亾id
-                    t_json["isDelete"] = "1";//榛樿1 ,0鏃犳晥 1鏈夋晥
-
-                    t_json["indeviceid"] = appPref.getStringData("fxDevID");
-                    t_json["indevicename"] = appPref.getStringData("fxDevNAME");
-
-                    DBG(t_json.toStyledString());
-                    bool retface = false;
-                    retface = pManagerEsDB.insertData("yolodet", "info", t_json.toStyledString(), str_uuid);
-                    if (retface) {
-                        INFO("facedb success");
-                    } else {
-                        ERR("facedb fail");
-                    }
-                }
+                trackingTrigger->getLastRect().properties["time"] = getProperty("time");
+                triggerScoredRects.push_back(trackingTrigger->getLastRect());
             }
         }
         trackingTrigger->triggerLine();
-        m_triggerElement.triggerOnce(false);
-        if (triggerMats.size() > 0)fireConnectors("YoloTrigger");
+        if(trackingTrigger->getLastScoreRects().size()>20)
+        {
+            DBG("");
+        }
         fireConnectors();
-    } catch (std::exception &e) {
-        ERR(e.what())
-    }
 }
 
-::YoloDetect::ObjInfos YoloRpcElement::getObjects() const {
-    return objs;
-}
 
-bool YoloRpcElement::getTrigger() const {
-    return (objs.size() > 0 ? true : false);
-}
 
-std::vector<cv::Mat> YoloRpcElement::getTriggerMats() {
-    return triggerMats;
-}
 
-std::vector<ScoredRect> YoloRpcElement::getLastScoreRects() const {
-    return trackingTrigger->getLastScoreRects();
-}
 
-void YoloRpcElement::setImage(const cv::Mat &value) {
-    if (value.size != image.size) {
-        image = cv::Mat(value.rows, value.cols, CV_8UC3, sharedMemory->data());
-    }
-    value.copyTo(image);
-}
 
-bool YoloRpcElement::getTriggerState() const {
-    return m_triggerElement.getTriggerState();
-}
diff --git a/QiaoJiaSystem/StructureApp/YoloRpcElement.h b/QiaoJiaSystem/StructureApp/YoloRpcElement.h
index 857f2d7..8434ba6 100644
--- a/QiaoJiaSystem/StructureApp/YoloRpcElement.h
+++ b/QiaoJiaSystem/StructureApp/YoloRpcElement.h
@@ -8,31 +8,22 @@
 #include <basic/util/fastdfs/FastFds.hpp>
 #include <RapidStructureApp/TriggerElement.h>
 #include "TrackingTrigger.h"
-
+#include "DBStruct.h"
 class QSharedMemory;
 
 class YoloRpcElement : public basic::PipeElement {
 public:
-    YoloRpcElement(string);
+    YoloRpcElement(std::string shareMemoryName);
 
     ~YoloRpcElement();
 
     void setImage(const cv::Mat &value);
 
+     cv::Mat getImage() const;
+
     ::YoloDetect::ObjInfos getObjects() const;
 
-    std::vector<cv::Mat> getTriggerMats();
-
     std::vector<ScoredRect> getLastScoreRects() const;
-
-    void setFdfs(FastFdsWithLock *p_fdfsClient) {
-        fdfsClient = p_fdfsClient;
-    }
-
-    bool getTriggerState() const;
-
-    bool getTrigger() const;
-
 private:
     virtual void threadFunc() override;
 
@@ -41,12 +32,10 @@
     cv::Mat image;
     QSharedMemory *sharedMemory;
     ::YoloDetect::ObjInfos objs;
-    TrackingTrigger *trackingTrigger;
-    std::vector<cv::Mat> triggerMats;
     ::YoloDetect::stringData cocoData;
-    FastFdsWithLock *fdfsClient;
+    std::vector<ScoredRect> triggerScoredRects;
+   TrackingTrigger* trackingTrigger;
 
-    TriggerElement m_triggerElement;
 };
 
 #endif // YOLORPCELEMENT_H
diff --git a/QiaoJiaSystem/StructureApp/main.cpp b/QiaoJiaSystem/StructureApp/main.cpp
index c820521..449e7a7 100644
--- a/QiaoJiaSystem/StructureApp/main.cpp
+++ b/QiaoJiaSystem/StructureApp/main.cpp
@@ -88,21 +88,21 @@
     auto size = vec.size();
 //    int size = 1;
     int pos = 0;
-    AppPipeController _AppPipeController("test12344", json, true);
+ //   AppPipeController _AppPipeController("test12344", json, true);
 //    AppPipeController _AppPipeController(src_path, json);
-    _AppPipeController.setfdfsClient(&fdfsClient);
+//    _AppPipeController.setfdfsClient(&fdfsClient);
 //    for (; pos < size;) {
 //
 //        //#todo
 //        _AppPipeController.resetVideoCapturePath(vec[pos++]);
 //        _AppPipeController.resetVideoCapturePath(
 //            "/home/basic/work/qiaojia/cut/DS-7808N-SN0820161208AARR691369356WCVU/34/201810/11/DS-7808N-SN0820161208AARR691369356WCVU-34-20181011090000/2018-10-11 09:48:05.mp4");
-    _AppPipeController.start();
-    while (_AppPipeController.getRunning()) {
-        usleep(40000);
-    }
-    _AppPipeController.stop();
-    _AppPipeController.wait();
+//    _AppPipeController.start();
+//    while (_AppPipeController.getRunning()) {
+//        usleep(40000);
+//    }
+//    _AppPipeController.stop();
+//    _AppPipeController.wait();
     DBG("finish file");
 //    }
 //    }
diff --git a/QiaoJiaSystem/VideoAnalysFromHC/BaiscSDKAnalysVideo.h b/QiaoJiaSystem/VideoAnalysFromHC/BaiscSDKAnalysVideo.h
index a742fb6..622bc1e 100644
--- a/QiaoJiaSystem/VideoAnalysFromHC/BaiscSDKAnalysVideo.h
+++ b/QiaoJiaSystem/VideoAnalysFromHC/BaiscSDKAnalysVideo.h
@@ -16,7 +16,7 @@
 #include <basic/util/app/AppPreference.hpp>
 #include <basic/http_server/HttpSrvRetRecieve.hpp>
 #include <basic/util/net_config/net_config.h>
-
+#include "DBStruct.h"
 #define SETSCORE(VEC, POS, IDENT) appPref.setFloatData(IDENT, POS >= VEC.size() ? 80 : VEC[POS]);
 
 class BaiscSDKAnalysVideo : public mythread<getsdkHdlManage> {
@@ -60,7 +60,7 @@
     virtual void doFunc(std::shared_ptr<getsdkHdlManage> spPacket) {
 
 //        DBG("do func sdk");
-        Json::Value json;
+  //      Json::Value json;
 
         //split sdks enable
         //#todo other sdk
@@ -70,42 +70,62 @@
 //            std::string s_c = str_cmp_thr;
         vector<int> sdkDetCoVec = chnString2Vec(spPacket->str_det_thr);
         vector<int> sdkComCoVec = chnString2Vec(spPacket->str_cmp_thr);
-
+        SdkRuleMap ruleMap;
         int t_size = sdkVec.size();
         std::string str_pre(spPacket->strDevID);
         str_pre.append(to_string(spPacket->nChannelID));
         for (int i = 0; i < t_size; i++) {
             switch (sdkVec[i]) {
-                case 1: {
-                    json["face.enable"] = "1";
+                case FaceSdk: {
+//                    json["face.enable"] = "1";
+
                     DBG("" << str_pre);
+
                     DBG(" TESTCODE setValue" << str_pre << "  " << sdkDetCoVec[i] << "  " << sdkComCoVec[i]);
-                    SETSCORE(sdkDetCoVec, i, str_pre + "face.det");
-                    SETSCORE(sdkComCoVec, i, str_pre + "face.cmp");
+//                    SETSCORE(sdkDetCoVec, i, str_pre + "face.det");
+//                    SETSCORE(sdkComCoVec, i, str_pre + "face.cmp");
+                    SdkRule rule;
+                    rule.nIsRun=1;
+                    rule.nQuality=sdkDetCoVec[i];
+                    rule.nThreshold=sdkComCoVec[i];
+                    rule.strAddr=spPacket->str_addr.c_str();
+                    ruleMap[FaceSdk]=rule;
                     break;
                 }
-                case 2: {
-                    DBG("XX.enable    " << "1");
+                case CarSdk: {
+//                    DBG("XX.enable    " << "1");
                     DBG(" TESTCODE setValue" << str_pre << "  " << sdkDetCoVec[i] << "  " << sdkComCoVec[i]);
-                    SETSCORE(sdkDetCoVec, i, str_pre + "XX.det");
-                    SETSCORE(sdkComCoVec, i, str_pre + "XX.cmp");
+//                    SETSCORE(sdkDetCoVec, i, str_pre + "XX.det");
+//                    SETSCORE(sdkComCoVec, i, str_pre + "XX.cmp");
+                    SdkRule rule;
+                    rule.nIsRun=1;
+                    rule.nQuality=sdkDetCoVec[i];
+                    rule.nThreshold=sdkComCoVec[i];
+                    rule.strAddr=spPacket->str_addr.c_str();
+                    ruleMap[CarSdk]=rule;
                     break;
                 }
-                case 3: {
-                    json["yolo.enable"] = "1";
+                case YoloSdk: {
+//                    json["yolo.enable"] = "1";
                     DBG(" TESTCODE setValue" << str_pre << "  " << sdkDetCoVec[i] << "  " << sdkComCoVec[i]);
-                    SETSCORE(sdkDetCoVec, i, str_pre + "yolo.det");
-                    SETSCORE(sdkComCoVec, i, str_pre + "yolo.cmp");
+//                    SETSCORE(sdkDetCoVec, i, str_pre + "yolo.det");
+//                    SETSCORE(sdkComCoVec, i, str_pre + "yolo.cmp");
+                    SdkRule rule;
+                    rule.nIsRun=1;
+                    rule.nQuality=sdkDetCoVec[i];
+                    rule.nThreshold=sdkComCoVec[i];
+                    rule.strAddr=spPacket->str_addr.c_str();
+                    ruleMap[YoloSdk]=rule;
                     break;
                 }
             }
         }
-        json["addr"] = spPacket->str_addr;
+     //   json["addr"] = spPacket->str_addr;
         INFO("cam add is " << spPacket->str_addr);
 
         //#todo get address
 
-        AppPipeController _AppPipeController(spPacket->src_path, json);
+        AppPipeController _AppPipeController(spPacket->src_path, ruleMap);
         _AppPipeController.setfdfsClient(&fdfsClient);
         //#todo from path get file list
         file_filter_type filter = [](const char *dirName, const char *dirent) {
diff --git a/QiaoJiaSystem/VideoAnalysFromHC/CMakeLists.txt b/QiaoJiaSystem/VideoAnalysFromHC/CMakeLists.txt
index 7c531d3..d4a83d9 100644
--- a/QiaoJiaSystem/VideoAnalysFromHC/CMakeLists.txt
+++ b/QiaoJiaSystem/VideoAnalysFromHC/CMakeLists.txt
@@ -57,6 +57,8 @@
     ../StructureApp/NewEncodeVideoManager.cpp
     ../StructureApp/NewEncodeVideo.cpp
     ../StructureApp/HiredisTool.cpp
+     ../StructureApp/PersonElement.cpp
+    ../StructureApp/PerStaticElement.cpp
 
     ../YoloServer/rpc/YoloServer.cpp
     ../FaceDetectServer/rpc/FaceServer.cpp
@@ -77,6 +79,7 @@
     ../../../BasicPlatForm/basic/pipe_element/ImageFactoryElement.cpp
     ../../../BasicPlatForm/basic/util/BASE64/Base64.cpp
     ../../../BasicPlatForm/basic/util/fastdfs/FastdfsClient.cpp
+    ../../../BasicPlatForm/basic/timer_counter/Clocktimer.cpp
 
     #绾跨▼姹�
     myThread.cpp
diff --git a/QiaoJiaSystem/VideoAnalysFromHC/RtspAnalysElement.cpp b/QiaoJiaSystem/VideoAnalysFromHC/RtspAnalysElement.cpp
index b96f6bd..f64710f 100644
--- a/QiaoJiaSystem/VideoAnalysFromHC/RtspAnalysElement.cpp
+++ b/QiaoJiaSystem/VideoAnalysFromHC/RtspAnalysElement.cpp
@@ -69,104 +69,34 @@
 
 void RtspAnalysElement::init() {
     auto lst = m_lDBTool->searchCamDevTableAll();
-    auto lst_dev = m_lDBTool->searchConfigTableWithinServerInfo();
+    Record_Config lst_dev = m_lDBTool->searchConfigTableWithinServerInfo();
 
     appPref.setIntData("n_cut_max_duration", lst_dev.n_cut_max_duration);
-
+    appPref.setIntData("n_cut_min_duration", lst_dev.n_cut_min_duration);
     if (lst.size() > 0) {
         Json::Value json;
         for (auto item : lst) {
-            string t_camIdex = item.str_cam_dev_id.toStdString();
-//            std::string rtsp_url;
-//            if (item.str_brand.toStdString() == "haikang") {
-//                //璋冪敤rtsp娴乺tsp://admin:a1234567@192.168.1.215:554/h264/ch1/main/av_stream
-//                int port = 554;//TODO
-//                string username =;
-//                DBG("username:" << username << "!!!");
-//                string passwd = item.str_password.toStdString();
-//                string ip = item.str_ip.toStdString();
-//
-//                rtsp_url = "rtsp://" + username + ":" + passwd + "@" + ip + ":" + std::to_string(port) +
-//                           "/h264/ch1/main/av_stream";
-//
-//            }//else if(){}
-
+            std::string t_camIdex = item.str_cam_dev_id.toStdString();
             std::string rtsp_url = rtspAddrBuild(item.str_ip.toStdString(), 554, item.str_username.toStdString(),
                                                  item.str_password.toStdString(), item.str_brand.toStdString());
-
-
-//            lRec.str_det_thr = rec.value("det_thr").toString();
-//            lRec.str_cmp_thr = rec.value("cmp_thr").toString();
-            auto en_sdk = m_lDBTool->searchCamSdkTableByCamId(item.str_cam_dev_id);
-            vector<int> sdkVec = chnString2Vec(en_sdk.str_sdks.toStdString());
-
-            //璁剧疆妫�娴嬪緱鍒�
-//            std::string s_d = str_det_thr;
-//            std::string s_c = str_cmp_thr;
-            vector<int> sdkDetCoVec = chnString2Vec(en_sdk.str_det_thr.toStdString());
-            vector<int> sdkComCoVec = chnString2Vec(en_sdk.str_cmp_thr.toStdString());
-
-            int camId=item.str_cam_dev_id.toInt();
-            int t_size = sdkVec.size();
-            for (int i = 0; i < t_size; i++) {
-                switch (sdkVec[i]) {
-                    case 1: {
-//                        INFO("face.enable");
-                        json["face.enable"] = "1";
-                        SETSCORE(sdkDetCoVec, i, t_camIdex + "face.det");
-                        SETSCORE(sdkComCoVec, i, t_camIdex + "face.cmp");
-                        DBG(" TESTCODE " << sdkDetCoVec[i] << " " << sdkComCoVec[i]);
-
-                        break;
-                    }
-                    case 2: {
-                        DBG("XX.enable    " << "1");
-                        SETSCORE(sdkDetCoVec, i, t_camIdex + "XX.det");
-                        SETSCORE(sdkComCoVec, i, t_camIdex + "XX.cmp");
-                        break;
-                    }
-                    case 3: {
-//                        INFO("face.enable");
-                        json["yolo.enable"] = "1";
-                        SETSCORE(sdkDetCoVec, i, t_camIdex + "yolo.det");
-                        SETSCORE(sdkComCoVec, i, t_camIdex + "yolo.cmp");
-                        break;
-                    }
-                    case 4: {
-
-                        json["perimeter.enable"] = "1";
-                        SETSCORE(sdkDetCoVec, i, t_camIdex + "perimeter.det");
-                        SETSCORE(sdkComCoVec, i, t_camIdex + "perimeter.cmp");
-                        setDataByType(4,json,camId);
-                        break;
-                      }
-                    case 5: {
-
-                        json["crowd.enable"] = "1";
-                        SETSCORE(sdkDetCoVec, i, t_camIdex + "crowd.det");
-                        SETSCORE(sdkComCoVec, i, t_camIdex + "crowd.cmp");
-                        setDataByType(5,json,camId);
-                        break;
-                    }
-                    case 6: {
-
-                        json["keepRight.enable"] = "1";
-                        SETSCORE(sdkDetCoVec, i, t_camIdex + "keepRight.det");
-                        SETSCORE(sdkComCoVec, i, t_camIdex + "keepRight.cmp");
-                        setDataByType(6,json,camId);
-                        break;
-                    }
+            SdkRuleMap ruleMap = m_lDBTool->searchSdkRuleByCamId(item.str_cam_dev_id);
+            for (auto &rule:ruleMap) {
+                if (rule.second.nThreshold < 5 || rule.second.nThreshold > 95) {
+                    rule.second.nThreshold = 75;
                 }
+                rule.second.fSensitivity = (float) (rule.second.nThreshold) / 100;
+                DBG("fSensitivity" << rule.second.fSensitivity);
+                rule.second.strAddr = item.str_addr;
+                rule.second.weekRuleVec = m_lDBTool->searchCameraWeekRuleByCamId(item.str_cam_dev_id, rule.first);
             }
+            appPref.setStringData(t_camIdex + "rtsp", rtsp_url);
+            // appPref.setStringData(t_camIdex+"addr", item.str_addr.toStdString());
             json["rtsp"] = rtsp_url;
-            json["addr"] = item.str_addr.toStdString();
+            // json["addr"] = item.str_addr.toStdString();
 
             INFO("cam add is " << item.str_addr.toStdString());
 
-//            DBG(t_camIdex);
-
-            appPref.getLongData("gpu.index");
-            addCamera(t_camIdex, json.toStyledString());
+            addCamera(t_camIdex, ruleMap);
         }
     } else {
         ERR("searchCamDevTableAll size is 0");
@@ -181,30 +111,23 @@
     controllers.clear();
 }
 
-int RtspAnalysElement::addCamera(const std::string &index, const std::string &json) {
+int RtspAnalysElement::addCamera(const std::string &index, const std::map<int, SdkRule> &sdkRuleMap) {
     if (controllers.find(index) == controllers.end()) {
         if (currentCount >= maxCount) {
             ERR("addCamera faild, camera's num is full!")
             return -1;
         }
-        Json::Reader reader;
-        Json::Value value;
 
-        if (reader.parse(json, value)) {
+        controllers[index] = new AppPipeController(index, sdkRuleMap, true);
+        controllers[index]->setfdfsClient(&fdfsClient);
+        controllers[index]->start();
+        currentCount++;
+        return 0;
 
-            controllers[index] = new AppPipeController(index, std::move(value), true);
-//            controllers[index] = new AppPipeController(index, std::move(value), false);
-
-            controllers[index]->setfdfsClient(&fdfsClient);
-            controllers[index]->start();
-            currentCount++;
-            return 0;
-        }
-        return -1;
     } else {
         removeCamera(index);
         DBG("removeCamera " << index)
-        return addCamera(index, json);
+        return addCamera(index, sdkRuleMap);
     }
 }
 
@@ -266,39 +189,82 @@
     }
     return result;
 }
-void RtspAnalysElement::setDataByType(int type,Json::Value& json,int camId)
-{
-    switch (type) {
-    case 4:
-    {
-        auto rule=m_lDBTool->searchPerimeterRuleByCamId(camId);
-        json["perimeter.area"]=rule.strAreas.toStdString();
-        json["perimeter.num"]=rule.nAlarmPeopleNum;
-        json["perimeter.delay"]=rule.nTriggerDelay;
-        json["perimeter.tolerance"]=rule.nTriggertolerance;
-        break;
-    }
-    case 5:
-    {
-        auto rule=m_lDBTool->searchCrowdRuleByCamId(camId);
-        json["crowd.area"]=rule.strAreas.toStdString();
-        json["crowd.num"]=rule.nAlarmPeopleNum;
-        json["crowd.delay"]=rule.nTriggerDelay;
-        json["crowd.tolerance"]=rule.nTriggertolerance;
-        break;
-    }
-    case 6:
-    {
-         auto rule=m_lDBTool->searchActRuleByCamId(camId);
-         json["keepRight.leftArea"]=rule.strAreas.toStdString();
-         json["keepRight.leftLine"]=rule.strLine.toStdString();
-         json["keepRight.rightArea"]=rule.strExAreas.toStdString();
-         json["keepRight.rightLine"]=rule.strExLine.toStdString();
-         json["keepRight.delay"]=rule.nTriggerDelay;
-         json["keepRight.tolerance"]=rule.nTriggertolerance;
-        break;
-    }
-    default:
-        break;
-    }
-}
+
+//void RtspAnalysElement::setDataByType(Json::Value& json,const SdkRule& rule)
+//{
+//    std::string camId=rule.strCamId.toStdString();
+//    sdkRuleMap[rule.nSdkType].weekRuleVec=m_lDBTool->searchCameraWeekRuleByCamId(rule.strCamId,rule.nSdkType);
+//    switch (rule.nSdkType)
+//    {
+//        case FaceSdk:
+//        {
+//            json["face.enable"] = "1";
+
+//            appPref.setFloatData(camId+"face.det",rule.nQuality);
+//            appPref.setFloatData(camId+"face.cmp",rule.nThreshold);
+
+
+
+//            break;
+//        }
+//        case CarSdk:
+//        {
+//          //  DBG("XX.enable    " << "1");
+
+//            appPref.setFloatData(camId+"xx.det",rule.nQuality);
+//            appPref.setFloatData(camId+"xx.cmp",rule.nThreshold);
+
+//            break;
+//        }
+//        case YoloSdk:
+//        {
+//             json["yolo.enable"] = "1";
+//            appPref.setFloatData(camId+"yolo.det",rule.nQuality);
+//            appPref.setFloatData(camId+"yolo.cmp",rule.nThreshold);
+
+//            break;
+//        }
+//        case PerimeterSdk:
+//        {
+//          //  auto rule=m_lDBTool->searchPerimeterRuleByCamId(camId);
+//            json["perimeter.enable"] = 1;
+//            json["perimeter.area"]=rule.strAreas.toStdString();
+//            json["perimeter.num"]=rule.nAlarmNumLowerLimit;
+
+//            json["perimeter.delay"]=rule.nTriggerDelay;
+//            json["perimeter.tolerance"]=rule.nTriggerTolerance;
+//            appPref.setFloatData(camId+"perimeter.det",rule.nQuality);
+//            appPref.setFloatData(camId+"perimeter.cmp",rule.nThreshold);
+
+
+//            break;
+//        }
+//        case CrowdSdk:
+//        {
+//            json["crowd.enable"] = 1;
+//            json["crowd.area"]=rule.strAreas.toStdString();
+//            json["crowd.num"]=rule.nAlarmNumLowerLimit;
+//            json["crowd.delay"]=rule.nTriggerDelay;
+//            json["crowd.tolerance"]=rule.nTriggerTolerance;
+//            appPref.setFloatData(camId+"crowd.det",rule.nQuality);
+//            appPref.setFloatData(camId+"crowd.cmp",rule.nThreshold);
+
+//            break;
+//        }
+//        case KeepRightSdk:
+//        {
+//             json["keepRight.enable"] = 1;
+//             json["keepRight.leftArea"]=rule.strAreas.toStdString();
+//             json["keepRight.leftLine"]=rule.strLine.toStdString();
+//             json["keepRight.rightArea"]=rule.strExAreas.toStdString();
+//             json["keepRight.rightLine"]=rule.strExLine.toStdString();
+//             json["keepRight.delay"]=rule.nTriggerDelay;
+//             json["keepRight.tolerance"]=rule.nTriggerTolerance;
+//             appPref.setFloatData(camId+"keepRight.det",rule.nQuality);
+//             appPref.setFloatData(camId+"keepRight.cmp",rule.nThreshold);
+//            break;
+//        }
+//        default:
+//            break;
+//    }
+//}
diff --git a/QiaoJiaSystem/VideoAnalysFromHC/RtspAnalysElement.h b/QiaoJiaSystem/VideoAnalysFromHC/RtspAnalysElement.h
index 890e317..21db01e 100644
--- a/QiaoJiaSystem/VideoAnalysFromHC/RtspAnalysElement.h
+++ b/QiaoJiaSystem/VideoAnalysFromHC/RtspAnalysElement.h
@@ -21,7 +21,7 @@
 
     virtual ~RtspAnalysElement();
 
-    int addCamera(const std::string &, const std::string &);
+    int addCamera(const std::string &, const std::map<int, SdkRule>& sdkRuleMap);
 
     int removeCamera(const std::string &);
 
@@ -40,7 +40,7 @@
 
     static std::vector<int> chnString2Vec(std::string str_list);
 
-    void setDataByType(int type,Json::Value& json,int camId);
+    void setDataByType(Json::Value& json,const SdkRule& rule);
 
 private:
     LDBTool *m_lDBTool;
@@ -50,6 +50,7 @@
     int maxCount;
 
     FastFdsWithLock fdfsClient;
+    std::map<int, SdkRule> sdkRuleMap;
 };
 
 
diff --git a/QiaoJiaSystem/VideoServer/QiaoJia/DB/DBStruct.h b/QiaoJiaSystem/VideoServer/QiaoJia/DB/DBStruct.h
index 5de036a..64e0d36 100644
--- a/QiaoJiaSystem/VideoServer/QiaoJia/DB/DBStruct.h
+++ b/QiaoJiaSystem/VideoServer/QiaoJia/DB/DBStruct.h
@@ -1,11 +1,12 @@
 #ifndef DBCONNECTSTRUCT
 #define DBCONNECTSTRUCT
 
-//#include <vector>
+
 //#include <QImage>
 #include <QString>
 #include <QDateTime>
 #include <QVector>
+#include <map>
 struct Record_Storage_Dev
 {
     Record_Storage_Dev()
@@ -251,7 +252,8 @@
         n_web_pic_port = 0;
         str_es_pic_ip = "";
         n_es_pic_port = 0;
-        n_cut_max_duration = 0;
+        n_cut_max_duration = 20;
+        n_cut_min_duration = 5;
         n_dev_type = 0;
         str_reserved = "";
         dev_id = "";
@@ -265,6 +267,7 @@
     QString str_es_pic_ip;//ES绔浘鐗囨湇鍔″櫒ip
     int n_es_pic_port;//ES绔浘鐗囨湇鍔″櫒绔彛
     int n_cut_max_duration;//瑁佸壀瑙嗛鏈�闀�
+    int n_cut_min_duration;//瑁佸壀瑙嗛鏈�duan
     int n_dev_type;//0:no dev; 1:storage; 2:camera
     QString str_reserved;//棰勭暀
     QString dev_id;
@@ -275,50 +278,75 @@
 {
     LActRuleWeekRecord()
     {
-        m_nCamId=0;
+        m_strCamId="";
+        m_nSdkType=0;
         m_nType = 0;
         m_strBegin = "";
         m_strEnd = "";
     }
-    int m_nCamId;
+    QString m_strCamId;
+    int m_nSdkType;
     int m_nType; //鍛ㄥ嚑
     QString m_strBegin;
     QString m_strEnd;
 };
-struct ActRule
+
+
+struct SdkRule
 {
-    ActRule()
+    SdkRule()
     {
-        nCamId = 0;
+        nIsRun=0;
+        nSdkType = 0 ;
+        strCamId = "";
         strAreas = "";
         strLine = "";
         strImageUrl = "";
-        nTriggertolerance = 0;
+        nTriggerTolerance = 0;
         nTriggerDelay=0;
-        fSensitivity = 0.5;
-        nAlarmPeopleNum = 0;
+        nQuality=0;
+        nThreshold=0;
+        nAlarmNumUpperLimit = 0;
+        nAlarmNumLowerLimit = 0;
+        fSensitivity=0;
         strExAreas="";
         strLine="";
+        strAddr="";
     }
-    int nCamId;
+    int nSdkType;
+    QString strCamId;
     QString strAreas; //鐩戞祴鍖哄煙
     QString strExAreas;
     QString strLine; //鍒嗗壊绾�
     QString strExLine;
     QString strImageUrl; //鍒掑尯鍩熺殑鍥剧墖璺緞
-    int nTriggertolerance;
+    QString strBroadcast;
+    QString strAddr;
+    int nTriggerTolerance;
     int nTriggerDelay; //寤惰繜鏃堕棿锛堢锛�
-    float fSensitivity;//鐏垫晱搴�
-    int nAlarmPeopleNum; //鎶ヨ浜烘暟锛堜汉鍛樻嫢鎸わ級
+    int nQuality;
+    int nThreshold;//闃堝��
+    float fSensitivity;
+    int nAlarmNumUpperLimit; //鎶ヨ浜烘暟锛堜汉鍛樻嫢鎸わ級
+    int nAlarmNumLowerLimit;
+    int nIsRun;
+
+    std::vector<LActRuleWeekRecord> weekRuleVec;
 };
-struct RuleCfg
+typedef std::map<int,SdkRule> SdkRuleMap;
+enum SdkType
 {
-
-    QVector<LActRuleWeekRecord> weekRuleVec;
-    ActRule actRule;
-    std::string strCamId;
-    std::string strRtsp;
-    std::string strAdrr;
+    SdkTypeStart=0,
+    FaceSdk,
+    CarSdk,
+    YoloSdk,   //浜轰綋
+    PerimeterSdk,
+    CrowdSdk,  //浜哄憳鎷ユ尋
+    KeepRightSdk,
+    PerHubSdk,    //浜哄憳寮傚父7
+    PerStaticSdk,  //涓綋闈欐8
+    SdkTypeEnd
 
 };
+
 #endif // DBCONNECTSTRUCT
diff --git a/QiaoJiaSystem/VideoServer/QiaoJia/DB/LDBTool.cpp b/QiaoJiaSystem/VideoServer/QiaoJia/DB/LDBTool.cpp
index f2e61a4..dd8ba1c 100644
--- a/QiaoJiaSystem/VideoServer/QiaoJia/DB/LDBTool.cpp
+++ b/QiaoJiaSystem/VideoServer/QiaoJia/DB/LDBTool.cpp
@@ -2370,7 +2370,7 @@
 
 
 //config 淇敼瑁佸壀瑙嗛鏃堕暱
-bool LDBTool::updateConfigTableByCutDuration(int n_cut_max_duration) {
+bool LDBTool::updateConfigTableByCutDuration(int n_cut_max_duration,int n_cut_min_duration) {
     QMutexLocker mutexLocker(&m_mutexVisit);//TODO
     QSqlTableModel pModel(NULL, m_db);
     pModel.setTable("config");
@@ -2379,7 +2379,7 @@
 
     QSqlRecord rec = pModel.record(0);
     rec.setValue("cut_max_duration", n_cut_max_duration);
-
+    rec.setValue("cut_min_duration", n_cut_min_duration);
     while (pModel.canFetchMore()) {
         pModel.fetchMore();
     }
@@ -2423,32 +2423,22 @@
         lRec.str_es_pic_ip = rec.value("es_pic_ip").toString();
         lRec.n_es_pic_port = rec.value("es_pic_port").toInt();
         lRec.n_cut_max_duration = rec.value("cut_max_duration").toInt();
-        lRec.dev_id = QString::fromStdString(appConfig.getStringProperty("DEV_ID"));
+        lRec.n_cut_min_duration = rec.value("cut_min_duration").toInt();
         lRec.dev_name = rec.value("dev_name").toString();
     }
-
+    lRec.dev_id = QString::fromStdString(appConfig.getStringProperty("DEV_ID"));
+    if(lRec.n_cut_max_duration == 0)
+    {
+        lRec.n_cut_max_duration = 20;
+    }
+    if(lRec.n_cut_min_duration == 0)
+    {
+        lRec.n_cut_min_duration = 4;
+    }
     return lRec;
 }
 
-//config 鏌ヨ瑁佸壀瑙嗛鏃堕暱
-int LDBTool::searchConfigTableWithinCutDuration(void) {
-    int cut_max_duration = 5;//榛樿5鍒嗛挓
-    QMutexLocker mutexLocker(&m_mutexVisit);//TODO
-    QSqlTableModel pModel(NULL, m_db);
-    pModel.setTable("config");
-    pModel.setEditStrategy(QSqlTableModel::OnManualSubmit);//OnManualSubmit OnFieldChange
-    pModel.select();
 
-    int rowCount = pModel.rowCount();
-    if (rowCount > 0) {
-        QSqlRecord rec = pModel.record(0);
-        if (cut_max_duration != 0) {
-            cut_max_duration = rec.value("cut_max_duration").toInt();
-        }
-    }
-
-    return cut_max_duration;
-}
 
 bool LDBTool::insertRecordVedioPath(QString pathKey, QString filePath) {
     QMutexLocker mutexLocker(&m_mutexVisit);//TODO
@@ -2523,55 +2513,33 @@
         return false;
     }
 }
- bool LDBTool::insertPerimeterRule(ActRule actRule)
+
+
+
+
+ bool LDBTool::updateCameraWeekRule(const LActRuleWeekRecord& weekRule)
  {
      QMutexLocker mutexLocker(&m_mutexVisit);//TODO
      QSqlTableModel pModel(NULL, m_db);
-     pModel.setTable("rule_perimeter");
+     pModel.setTable("rule_week");
+     pModel.setFilter(QObject::tr("camera_id = '%1' and type='%2' and sdk_type='%3'").arg(weekRule.m_strCamId).arg(weekRule.m_nType).arg(weekRule.m_nSdkType));
      pModel.setEditStrategy(QSqlTableModel::OnManualSubmit);//OnManualSubmit OnFieldChange
-
-     QSqlRecord rec = pModel.record();
-     rec.setGenerated("rule_id", false);
-     rec.setValue("camera_id", actRule.nCamId);
-     rec.setValue("sensitivity", actRule.fSensitivity);
-     rec.setValue("delay",actRule.nTriggerDelay);
-     rec.setValue("tolerance",actRule.nTriggertolerance);
-     rec.setValue("show_pepole_num",actRule.nAlarmPeopleNum);
-
-     pModel.insertRecord(-1, rec);//TODO
-
-     m_db.transaction();//寮�濮嬩簨鍔℃搷浣�
-
-     if (pModel.submitAll()) {
-         m_db.commit();//鎻愪氦
-         return true;
-     } else {
-         m_db.rollback();//鍥炴粴
-         ERR("insertCameraRule ,pModel_load Error: " << pModel.lastError().text().toStdString());
-
-         return false;
-     }
- }
- bool LDBTool::updatePerimeterRuleByCamId(ActRule actRule)
- {
-     QMutexLocker mutexLocker(&m_mutexVisit);//TODO
-     QSqlTableModel pModel(NULL, m_db);
-     pModel.setTable("rule_perimeter");
-     pModel.setFilter(QObject::tr("camera_id = '%1' ").arg(actRule.nCamId));
-     pModel.setEditStrategy(QSqlTableModel::OnManualSubmit);//OnManualSubmit OnFieldChange
-
-
+     pModel.select();
      QSqlRecord rec = pModel.record(0);
-     rec.setValue("camera_id", actRule.nCamId);
-     rec.setValue("sensitivity", actRule.fSensitivity);
-     rec.setValue("delay",actRule.nTriggerDelay);
-     rec.setValue("tolerance",actRule.nTriggertolerance);
-     rec.setValue("show_pepole_num",actRule.nAlarmPeopleNum);
+     //rec.setGenerated("id", false);
+     rec.setValue("camera_id",weekRule.m_strCamId);
+     rec.setValue("sdk_type",weekRule.m_nSdkType);
+     rec.setValue("type", weekRule.m_nType);
+     rec.setValue("begin_time", weekRule.m_strBegin);
+     rec.setValue("end_time",weekRule.m_strEnd);
 
      int rowCount = pModel.rowCount();
-     if (rowCount == 0) {
+     if (rowCount == 0)
+     {
          pModel.insertRecord(-1, rec);
-     } else if (rowCount > 0) {
+     }
+     else if (rowCount > 0)
+     {
          pModel.setRecord(0, rec);//TODO
      }
 
@@ -2582,69 +2550,18 @@
          return true;
      } else {
          m_db.rollback();//鍥炴粴
-         ERR("updateCameraRuleByCamId ,pModel_load Error: " << pModel.lastError().text().toStdString());
-         return false;
-     }
-
- }
- ActRule LDBTool::searchPerimeterRuleByCamId(int camId)
- {
-     QMutexLocker mutexLocker(&m_mutexVisit);//TODO
-     QSqlTableModel pModel(NULL, m_db);
-     pModel.setTable("rule_perimeter");
-     pModel.setFilter(QObject::tr("camera_id = '%1' ").arg(camId));
-     pModel.setEditStrategy(QSqlTableModel::OnManualSubmit);//OnManualSubmit OnFieldChange
-     pModel.select();
-
-     ActRule rule;
-     int rowCount = pModel.rowCount();
-     if (rowCount > 0) {
-         QSqlRecord rec = pModel.record(0);
-         rule.nTriggerDelay=rec.value("delay").toInt();
-         rule.nTriggertolerance=rec.value("tolerance").toInt();
-         rule.strAreas=rec.value("area_points").toString();
-         rule.nAlarmPeopleNum=rec.value("show_people_sum").toInt();
-         rule.fSensitivity=rec.value("sensitivity").toFloat();
-     }
-
-     return rule;
- }
-
- bool LDBTool::insertCameraWeekRule(LActRuleWeekRecord weekRule)
- {
-     QMutexLocker mutexLocker(&m_mutexVisit);//TODO
-     QSqlTableModel pModel(NULL, m_db);
-     pModel.setTable("rule_week");
-     pModel.setEditStrategy(QSqlTableModel::OnManualSubmit);//OnManualSubmit OnFieldChange
-
-     QSqlRecord rec = pModel.record();
-     rec.setGenerated("id", false);
-     rec.setValue("camera_id",weekRule.m_nCamId);
-     rec.setValue("type", weekRule.m_nType);
-     rec.setValue("start_time", weekRule.m_strBegin);
-     rec.setValue("end_time",weekRule.m_strEnd);
-
-     pModel.insertRecord(-1, rec);//TODO
-
-     m_db.transaction();//寮�濮嬩簨鍔℃搷浣�
-
-     if (pModel.submitAll()) {
-         m_db.commit();//鎻愪氦
-         return true;
-     } else {
-         m_db.rollback();//鍥炴粴
-         ERR("insertCameraWeekRule ,pModel_load Error: " << pModel.lastError().text().toStdString());
+         ERR("updateCameraWeekRule ,pModel_load Error: " << pModel.lastError().text().toStdString());
 
          return false;
      }
  }
- QVector<LActRuleWeekRecord> LDBTool::searchCameraWeekRuleByCamId(int camId)
+ std::vector<LActRuleWeekRecord> LDBTool::searchCameraWeekRuleByCamId(const QString& camId,const int& sdkType)
  {
-     QVector<LActRuleWeekRecord> vecWeek;
+     std::vector<LActRuleWeekRecord> vecWeek;
      QMutexLocker mutexLocker(&m_mutexVisit);//TODO
      QSqlTableModel pModel(NULL, m_db);
      pModel.setTable("rule_week");
-     pModel.setFilter(QObject::tr("camera_id = '%1' ").arg(camId));
+     pModel.setFilter(QObject::tr("camera_id = '%1' and sdk_type='%2'").arg(camId).arg(sdkType));
      pModel.setEditStrategy(QSqlTableModel::OnManualSubmit);//OnManualSubmit OnFieldChange
      pModel.select();
 
@@ -2653,57 +2570,100 @@
      {
          LActRuleWeekRecord lActRuleWeekRec;
          QSqlRecord rec = pModel.record(i);
+         lActRuleWeekRec.m_nSdkType = rec.value("sdk_type").toInt();
          lActRuleWeekRec.m_nType = rec.value("type").toInt();
-         lActRuleWeekRec.m_strBegin = rec.value("begin").toString();
-         lActRuleWeekRec.m_strEnd = rec.value("end").toString();
+         lActRuleWeekRec.m_strBegin = rec.value("begin_time").toString();
+         lActRuleWeekRec.m_strEnd = rec.value("end_time").toString();
+         lActRuleWeekRec.m_strCamId=rec.value("camera_id").toString();
          vecWeek.push_back(lActRuleWeekRec);
      }
 
      return vecWeek;
  }
- ActRule LDBTool::searchActRuleByCamId(int camId)
- {
-     QMutexLocker mutexLocker(&m_mutexVisit);//TODO
-     QSqlTableModel pModel(NULL, m_db);
-     pModel.setTable("rule_act");
-     pModel.setFilter(QObject::tr("cam_id = '%1' ").arg(camId));
-     pModel.setEditStrategy(QSqlTableModel::OnManualSubmit);//OnManualSubmit OnFieldChange
-     pModel.select();
 
-     ActRule rule;
-     int rowCount = pModel.rowCount();
-     if (rowCount > 0) {
-         QSqlRecord rec = pModel.record(0);
-         rule.nTriggertolerance=rec.value("tolerance").toInt();
-         rule.nTriggerDelay=rec.value("delay").toInt();
-         rule.strAreas=rec.value("act_left_area").toString();
-         rule.strLine=rec.value("act_left_line").toString();
-         rule.strExAreas=rec.value("act_right_area").toString();
-         rule.strExLine=rec.value("act_right_line").toString();
-         rule.fSensitivity=rec.value("sensitivity").toFloat();
-     }
 
-     return rule;
- }
 
- ActRule LDBTool::searchCrowdRuleByCamId(int camId)
- {
-     QMutexLocker mutexLocker(&m_mutexVisit);//TODO
-     QSqlTableModel pModel(NULL, m_db);
-     pModel.setTable("rule_crowd");
-     pModel.setFilter(QObject::tr("camera_id = '%1' ").arg(camId));
-     pModel.setEditStrategy(QSqlTableModel::OnManualSubmit);//OnManualSubmit OnFieldChange
-     pModel.select();
+bool LDBTool::updateSdkRule(const SdkRule& sdkRule)
+{
+    QMutexLocker mutexLocker(&m_mutexVisit);//TODO
+    QSqlTableModel pModel(NULL, m_db);
+    pModel.setTable("sdk_rule");
+    pModel.setFilter(QObject::tr("cam_id = '%1' and sdk_type = '%2' ").arg(sdkRule.strCamId).arg(sdkRule.nSdkType));
+    pModel.setEditStrategy(QSqlTableModel::OnManualSubmit);//OnManualSubmit OnFieldChange
+    pModel.select();
+    QSqlRecord rec = pModel.record(0);
+    rec.setValue("cam_id", sdkRule.strCamId);
+    rec.setValue("sdk_type", sdkRule.nSdkType);
+    rec.setValue("area", sdkRule.strAreas);
+    rec.setValue("ex_area",sdkRule.strExAreas);
+    rec.setValue("line",sdkRule.strLine);
+    rec.setValue("ex_line",sdkRule.strExLine);
+    rec.setValue("alarm_delay",sdkRule.nTriggerDelay);
+    rec.setValue("tolerance",sdkRule.nTriggerTolerance);
+    rec.setValue("alarm_num_upper",sdkRule.nAlarmNumUpperLimit);
+    rec.setValue("alarm_num_lower",sdkRule.nAlarmNumLowerLimit);
+    rec.setValue("broadcast_area",sdkRule.strBroadcast);
+    rec.setValue("is_run",sdkRule.nIsRun);
+    rec.setValue("img_threshold",sdkRule.nThreshold);
+    rec.setValue("img_quality",sdkRule.nQuality);
 
-     ActRule rule;
-     int rowCount = pModel.rowCount();
-     if (rowCount > 0) {
-         QSqlRecord rec = pModel.record(0);
-         rule.nTriggertolerance=rec.value("tolerance").toInt();
-         rule.nTriggerDelay=rec.value("delay").toInt();
-         rule.strAreas=rec.value("area_points").toString();
-         rule.nAlarmPeopleNum=rec.value("alarm_people_num").toInt();
-     }
+    int rowCount = pModel.rowCount();
+    if (rowCount == 0)
+    {
+        pModel.insertRecord(-1, rec);
+    }
+    else if (rowCount > 0)
+    {
+        pModel.setRecord(0, rec);//TODO
+    }
 
-     return rule;
- }
+    m_db.transaction();//寮�濮嬩簨鍔℃搷浣�
+
+    if (pModel.submitAll())
+    {
+        m_db.commit();//鎻愪氦
+        return true;
+    }
+    else
+    {
+        m_db.rollback();//鍥炴粴
+        ERR("updateSdkRule ,pModel_load Error: " << pModel.lastError().text().toStdString());
+        return false;
+    }
+}
+SdkRuleMap LDBTool::searchSdkRuleByCamId(const QString& camId)
+{
+    QMutexLocker mutexLocker(&m_mutexVisit);//TODO
+    QSqlTableModel pModel(NULL, m_db);
+    pModel.setTable("sdk_rule");
+    pModel.setFilter(QObject::tr("cam_id = '%1' ").arg(camId));
+    pModel.setEditStrategy(QSqlTableModel::OnManualSubmit);//OnManualSubmit OnFieldChange
+    pModel.select();
+    std::map<int,SdkRule> ruleMap;
+
+    //std::vector<SdkRule> ruleVec;
+    int rowCount = pModel.rowCount();
+    for(int i=0;i<rowCount;++i)
+    {
+        SdkRule rule;
+        QSqlRecord rec = pModel.record(i);
+        rule.strCamId=rec.value("cam_id").toString();
+        rule.strAreas=rec.value("area").toString();
+        rule.strExAreas=rec.value("ex_area").toString();
+        rule.strLine=rec.value("line").toString();
+        rule.strExLine=rec.value("ex_line").toString();
+        rule.nTriggerDelay=rec.value("alarm_delay").toInt();
+        rule.nTriggerTolerance=rec.value("tolerance").toInt();
+        rule.nQuality=rec.value("img_quality").toInt();
+        rule.nThreshold=rec.value("img_threshold").toInt();
+        rule.nAlarmNumUpperLimit=rec.value("alarm_num_upper").toInt();
+        rule.nAlarmNumLowerLimit=rec.value("alarm_num_lower").toInt();
+        rule.strBroadcast=rec.value("broadcast_area").toString();
+        rule.nIsRun=rec.value("is_run").toInt();
+        rule.nSdkType=rec.value("sdk_type").toInt();
+        ruleMap[rule.nSdkType]=rule;
+        //ruleVec.push_back(rule);
+    }
+
+    return ruleMap;
+}
diff --git a/QiaoJiaSystem/VideoServer/QiaoJia/DB/LDBTool.h b/QiaoJiaSystem/VideoServer/QiaoJia/DB/LDBTool.h
index 2c73a77..2eaf1dd 100644
--- a/QiaoJiaSystem/VideoServer/QiaoJia/DB/LDBTool.h
+++ b/QiaoJiaSystem/VideoServer/QiaoJia/DB/LDBTool.h
@@ -111,9 +111,8 @@
 
     //config
     bool updateConfigTableByServerInfo(Record_Config configRec);
-    bool updateConfigTableByCutDuration(int n_cut_max_duration);
+    bool updateConfigTableByCutDuration(int n_cut_max_duration,int n_cut_min_duration);
     Record_Config searchConfigTableWithinServerInfo(void);
-    int searchConfigTableWithinCutDuration(void);
     bool updateConfigTableByDevType(int devType);
     int searchDevTypeFromConfigTable(void);
     //Record_Config searchDevIdFromConfigTable(void);
@@ -121,17 +120,14 @@
     //name_key_match
     bool insertRecordVedioPath(QString pathKey,QString filePath);
     QString  searchRecordVedioPathByKey(QString pathKey);
-    //perimeter_rule
-    bool insertPerimeterRule(ActRule actRule);
-    bool updatePerimeterRuleByCamId(ActRule actRule);
-    ActRule searchPerimeterRuleByCamId(int camId);
+
     //rule_week
-    bool insertCameraWeekRule(LActRuleWeekRecord weekRule);
-    QVector<LActRuleWeekRecord> searchCameraWeekRuleByCamId(int camId);
-    //rule_act
-    ActRule searchActRuleByCamId(int camId);
-    //crowd_rule
-    ActRule searchCrowdRuleByCamId(int camId);
+    bool updateCameraWeekRule(const LActRuleWeekRecord& weekRule);
+    std::vector<LActRuleWeekRecord> searchCameraWeekRuleByCamId(const QString& camId,const int& sdkType);
+
+    //sdk_rule
+    bool updateSdkRule(const SdkRule& sdkRule);
+    SdkRuleMap searchSdkRuleByCamId(const QString& camId);
 private:
     QSqlDatabase m_db;
     QSqlTableModel *m_pModel;
diff --git a/QiaoJiaSystem/YoloServer/CMakeLists.txt b/QiaoJiaSystem/YoloServer/CMakeLists.txt
index ff8a39e..a706b75 100644
--- a/QiaoJiaSystem/YoloServer/CMakeLists.txt
+++ b/QiaoJiaSystem/YoloServer/CMakeLists.txt
@@ -65,6 +65,7 @@
     main.cpp
     YoloDetectServerI.cpp
     rpc/YoloServer.cpp
+    ../../../BasicPlatForm/basic/timer_counter/Clocktimer.cpp
     )
 
 target_link_libraries(${PROJECT_NAME}
@@ -87,6 +88,7 @@
 #    ../../BasicPlatForm/basic/pipe_element/ImageShowElement.h
 #    ../../BasicPlatForm/basic/pipe_element/ffmpeg/VideoCaptureElement.cpp
 #    ../../BasicPlatForm/basic/pipe_element/ffmpeg/VideoCaptureElement.h
+#    ../../../BasicPlatForm/basic/timer_counter/Clocktimer.cpp
 #    rpc/YoloServer.cpp
 #    YoloDetectClientTest.cpp
 #    YoloRpcElement.cpp
diff --git a/QiaoJiaSystem/build/YoloServer b/QiaoJiaSystem/build/YoloServer
new file mode 100644
index 0000000..d04ef47
--- /dev/null
+++ b/QiaoJiaSystem/build/YoloServer
Binary files differ

--
Gitblit v1.8.0