From 2e2e065ffcf79b90e2e42ec999886ef7e8f29fb7 Mon Sep 17 00:00:00 2001
From: zhangzengfei <zhangzengfei@smartai.com>
Date: 星期一, 10 二月 2025 16:36:24 +0800
Subject: [PATCH] 昼伏夜出完善

---
 models/accessRegularity.go |   22 ++++-
 service/esSearch.go        |  200 ++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 218 insertions(+), 4 deletions(-)

diff --git a/models/accessRegularity.go b/models/accessRegularity.go
index 78274b8..54d5850 100644
--- a/models/accessRegularity.go
+++ b/models/accessRegularity.go
@@ -105,11 +105,12 @@
 
 	// 鏌ユ壘鎸囧畾鏃堕棿鑼冨洿鍐呭嚭琛岃繃鐨勬。妗堢紪鍙�
 	now := time.Now()
-	startDate := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location()).AddDate(0, 0, -m.Duration).Unix()
+	startDate := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location()).AddDate(0, 0, -m.Duration)
 	err := db.GetDB().Raw(`
 		SELECT
 			document_number,
 			frequent_address,
+			community_id,
 		FROM
 			snapshot_count_summary
 		WHERE
@@ -117,16 +118,29 @@
 			AND (p.community_id IN ?
 			OR p.org_id IN ?)
 			AND p.status IN ?
-		`, startDate, m.AreaIds, m.OrgIds, m.IdentityType).Scan(&baseFilter).Error
+		`, startDate.Unix(), m.AreaIds, m.OrgIds, m.IdentityType).Scan(&baseFilter).Error
 	if err != nil {
 		logger.Warnf(err.Error())
 	}
 
+	esCli := db.GetEsClient()
 	for _, p := range baseFilter {
 		// 璋冪敤es鍒嗘瀽姝や汉鐨勫嚭琛岃寰嬫槸鍚︾鍚堟潯浠讹紝 杩斿洖绗﹀悎鏉′欢鐨勬鏁板拰鏈�鍚庝竴娆$鍚堟潯浠剁殑鏃堕棿
+		sTime := startDate.Format(time.DateTime)
+		eTime := time.Now().Format(time.DateTime)
+		captures, err := service.QueryEsRecord(esCli, sTime, eTime, nil, []interface{}{p.CommunityId}, []string{p.DocumentNumber})
+		if len(captures) == 0 || err != nil {
+			continue
+		}
+
+		// 鏍规嵁鎶撴媿鏃堕棿鍜屽嚭鍏ユ柟鍚戯紝璁$畻绗﹀悎瑙勫垯鍐呯殑鍑哄叆娆℃暟
+		hitCount := 0
+
+		//for _, c := range captures {
+		//	captureTime, err := time.ParseInLocation(time.DateTime, c.PicDate, time.Local)
+		//}
 
 		// 鍐欐暟鎹簱
-		var hitCount int
 		result := &db.ModelTaskResults{
 			Title:         m.Task.Name,
 			Event:         fmt.Sprintf("%s %d娆�", m.Task.Name, hitCount),
@@ -136,7 +150,7 @@
 			OrgID:         p.OrgId,
 			ObjectIds:     p.DocumentNumber,
 			Location:      p.FrequentAddress,
-			PicDate:       time.Unix(p.LastAppearanceTime, 0).Format("2006-01-02 15:04:05"),
+			PicDate:       time.Unix(p.LastAppearanceTime, 0).Format(time.DateTime),
 			FirstPersonID: p.DocumentNumber,
 		}
 
diff --git a/service/esSearch.go b/service/esSearch.go
new file mode 100644
index 0000000..c5a14e9
--- /dev/null
+++ b/service/esSearch.go
@@ -0,0 +1,200 @@
+package service
+
+import (
+	"bytes"
+	"context"
+	"encoding/json"
+	"fmt"
+	"github.com/elastic/go-elasticsearch/v6"
+	"model-engine/config"
+)
+
+type CameraLocation struct {
+	Building  string `json:"building"`
+	Unit      string `json:"unit"`
+	Pos       string `json:"pos"`
+	Floor     string `json:"floor"`
+	Direction string `json:"direction"`
+	Latitude  string `json:"latitude"`
+	Longitude string `json:"longitude"`
+}
+
+func (cl *CameraLocation) Join() string {
+	return cl.Building + cl.Unit + cl.Pos + cl.Floor
+}
+
+type ESRecordInfo struct {
+	Id             string         `json:"id"`
+	ClusterId      string         `json:"clusterId"`
+	CameraId       string         `json:"cameraId"`
+	CameraAddr     string         `json:"cameraAddr"`     // 鎽勫儚鏈哄湴鍧�
+	CameraName     string         `json:"cameraName"`     // 鎽勫儚鏈哄悕绉�
+	CommunityId    string         `json:"communityId"`    // 灏忓尯ID
+	CommunityName  string         `json:"communityName"`  // 灏忓尯鍚嶇О
+	PersonName     string         `json:"personName"`     // 濮撳悕
+	IdCard         string         `json:"idCard"`         // 璇佷欢鍙风爜
+	CameraLocation CameraLocation `json:"cameraLocation"` // 鎶撴媿浣嶇疆
+	DocumentNumber string         `json:"documentNumber"` // 妗f缂栧彿
+	OrgId          string         `json:"orgId"`          // 鏈烘瀯ID
+	OrgName        string         `json:"orgName"`        // 鏈烘瀯鍚嶇О
+	PicDate        string         `json:"picDate"`
+	PicId          string         `json:"picId"`
+	PicMaxUrl      string         `json:"picMaxUrl"`
+	TaskId         string         `json:"taskId"`
+	TaskName       string         `json:"taskName"`
+	SdkName        string         `json:"sdkName"`
+	Content        string         `json:"content"`
+	ShowLabels     string         `json:"showLabels"`
+	OtherLabels    string         `json:"otherLabels"`
+	VideoUrl       string         `json:"videoUrl"`
+	IsAlarm        bool           `json:"isAlarm"`
+	IsAckAlarm     bool           `json:"isAckAlarm"`
+	IsDelete       bool           `json:"isDelete"`
+	IsKeyPerson    bool           `json:"isKeyPerson"`
+	KeyPersonType  []string       `json:"keyPersonType"`
+	DataSource     string         `json:"dataSource"` // 鏁版嵁鏉ユ簮:鎽勫儚鏈�, 鏁版嵁鏍�
+}
+
+func QueryEsRecord(esClient *elasticsearch.Client, startTime, endTime string, orgIds, areaIds []interface{}, documentNumbers []string) ([]*ESRecordInfo, error) {
+	var buf bytes.Buffer
+
+	// 鏋勫缓杩囨护鏉′欢
+	var filters []map[string]interface{}
+	documentNumberFilter := map[string]interface{}{
+		"terms": map[string]interface{}{
+			"documentNumber": documentNumbers,
+		},
+	}
+	filters = append(filters, documentNumberFilter)
+
+	if len(orgIds) > 0 || len(areaIds) > 0 {
+		// 鑾峰彇鏁版嵁鏉冮檺杩囨护鏉′欢
+		authFilters := getDomainFilters(orgIds, areaIds)
+		filters = append(filters, authFilters...)
+	}
+
+	// 鏃堕棿鑼冨洿
+	filters = append(filters, map[string]interface{}{
+		"range": map[string]interface{}{
+			"picDate": map[string]interface{}{
+				"gte": startTime,
+				"lt":  endTime,
+			},
+		},
+	})
+
+	query := map[string]interface{}{
+		"query": map[string]interface{}{
+			"bool": map[string]interface{}{
+				"filter": filters,
+			},
+		},
+		"size":    0,
+		"sort":    []interface{}{map[string]interface{}{"picDate": map[string]interface{}{"order": "asc"}}},
+		"_source": map[string]interface{}{"includes": []interface{}{}, "excludes": []interface{}{"*.feature"}},
+	}
+
+	if err := json.NewEncoder(&buf).Encode(query); err != nil {
+		return nil, fmt.Errorf("error encoding query: %s", err)
+	}
+
+	res, err := esClient.Search(
+		esClient.Search.WithContext(context.Background()),
+		esClient.Search.WithIndex(config.EsInfo.EsIndex.AiOcean.IndexName),
+		esClient.Search.WithDocumentType(config.EsInfo.EsIndex.AiOcean.IndexType),
+		esClient.Search.WithBody(&buf),
+		esClient.Search.WithTrackTotalHits(true),
+		esClient.Search.WithPretty(),
+	)
+	if err != nil {
+		return nil, fmt.Errorf("error getting response: %s", err)
+	}
+	defer res.Body.Close()
+
+	// Check for a successful status code (2xx range)
+	if res.IsError() {
+		return nil, fmt.Errorf("error getting response: %s", res.String())
+	}
+
+	var result map[string]interface{}
+	if err := json.NewDecoder(res.Body).Decode(&result); err != nil {
+		return nil, fmt.Errorf("error parsing response body: %s", err)
+	}
+
+	if _, ok := result["hits"]; !ok || result["hits"] == nil {
+		return nil, nil
+	}
+
+	// 瑙f瀽鏌ヨ缁撴灉
+	dat := result["hits"].(map[string]interface{})
+	var records = make([]*ESRecordInfo, len(dat["hits"].([]interface{})))
+
+	for idx, value := range dat["hits"].([]interface{}) {
+		sourceData := value.(map[string]interface{})
+		source := sourceData["_source"].(map[string]interface{})
+
+		var record = ESRecordInfo{
+			Id:             source["id"].(string),
+			CameraId:       source["cameraId"].(string),
+			CameraAddr:     source["cameraAddr"].(string),
+			CameraName:     source["cameraName"].(string),
+			CommunityId:    source["communityId"].(string),
+			CommunityName:  source["communityName"].(string),
+			DocumentNumber: source["documentNumber"].(string),
+			OrgId:          source["orgId"].(string),
+			OrgName:        source["orgName"].(string),
+			PicDate:        source["picDate"].(string),
+			PicId:          source["picId"].(string),
+			PicMaxUrl:      source["picMaxUrl"].(string),
+		}
+
+		cameraLocation := source["cameraId"].(map[string]interface{})
+		record.CameraLocation = CameraLocation{
+			Building:  cameraLocation["building"].(string),
+			Unit:      cameraLocation["unit"].(string),
+			Pos:       cameraLocation["pos"].(string),
+			Floor:     cameraLocation["floor"].(string),
+			Direction: cameraLocation["direction"].(string),
+		}
+
+		records[idx] = &record
+	}
+
+	return records, nil
+}
+
+func getDomainFilters(orgIds, areaIds []interface{}) (filters []map[string]interface{}) {
+	filters = make([]map[string]interface{}, 0)
+	// 鏁版嵁鏉冮檺杩囨护
+	if len(orgIds) > 0 && len(areaIds) > 0 {
+		var authParams = map[string]interface{}{
+			"bool": map[string]interface{}{
+				"should": []interface{}{
+					map[string]interface{}{
+						"terms": map[string]interface{}{
+							"orgId": orgIds,
+						}},
+					map[string]interface{}{
+						"terms": map[string]interface{}{
+							"communityId": areaIds,
+						}},
+				},
+			},
+		}
+		filters = append(filters, authParams)
+
+	} else if len(orgIds) > 0 {
+		filters = append(filters, map[string]interface{}{
+			"terms": map[string]interface{}{
+				"orgId": orgIds,
+			},
+		})
+	} else if len(areaIds) > 0 {
+		filters = append(filters, map[string]interface{}{
+			"terms": map[string]interface{}{
+				"communityId": areaIds,
+			},
+		})
+	}
+	return filters
+}

--
Gitblit v1.8.0