From 3d54c2726165343fd7d18ca91a577931d7732c82 Mon Sep 17 00:00:00 2001 From: zhangzengfei <zhangzengfei@smartai.com> Date: 星期二, 11 二月 2025 15:06:26 +0800 Subject: [PATCH] 移除night --- /dev/null | 513 --------------------------------------------------------- models/model.go | 3 2 files changed, 1 insertions(+), 515 deletions(-) diff --git a/models/model.go b/models/model.go index 4b1a51a..8a3b136 100644 --- a/models/model.go +++ b/models/model.go @@ -16,8 +16,7 @@ var modelRegistry = map[string]func() Model{ "gather": func() Model { return &GatherModel{} }, "disappear": func() Model { return &DisappearModel{} }, - "location": func() Model { return &LocationModel{} }, - "night": func() Model { return &nightModel{} }, + "locationAnalysis": func() Model { return &LocationModel{} }, "accessRegularity": func() Model { return &RegularityModel{} }, // 娣诲姞鍏朵粬妯″瀷 } diff --git a/models/nightAnalysis.go b/models/nightAnalysis.go deleted file mode 100644 index 42dc360..0000000 --- a/models/nightAnalysis.go +++ /dev/null @@ -1,513 +0,0 @@ -package models - -import ( - "bytes" - "context" - "encoding/json" - "errors" - "fmt" - "github.com/elastic/go-elasticsearch/v6" - "model-engine/pkg/set" - - //"log" - "model-engine/config" - //"model-engine/pkg/set" - "strconv" - "strings" - "time" - - "model-engine/db" - "model-engine/pkg/logger" - "model-engine/service" -) - -type nightModel struct { - AreaIds []interface{} `json:"-"` - OrgIds []interface{} `json:"-"` - Building string // 妤兼爧 - Floor string - AlarmType db.AlarmType // 棰勮鏂瑰紡 - KeyPersonType string // 浜哄憳绫诲瀷 - PersonLabel string // 浜哄憳鏍囩 - PersonIdentity []string // 浜哄憳韬唤 - Duration int // 鏃堕棿鑼冨洿 - Appearances int // 鍑虹幇娆℃暟, - StartTime int // 鏃堕棿鑼冨洿, 寮�濮嬫椂闂� - EndTime int // 鏃堕棿鑼冨洿, 缁撴潫鏃堕棿 - Task *db.ModelTask -} - -func (m *nightModel) Init(task *db.ModelTask) error { - //m.AreaIds = make(map[string]struct{}) - //for _, a := range task.DomainUnitIds { - // m.AreaIds[a] = struct{}{} - //} - if len(task.DomainUnitIds) == 0 { - return errors.New("empty domain set") - } - orgIds, areaIds, err := service.GetOrgIdsAndAreaIdsByDomainUnitIds(task.DomainUnitIds) - if err != nil { - return err - } - - m.Task = task - m.OrgIds = orgIds - m.AreaIds = areaIds - m.Building = task.Building - m.AlarmType = task.AlarmType - m.PersonIdentity = []string{"stranger", "visitor", "resident"} //task.IdentityType - m.KeyPersonType = task.PersonType - m.PersonLabel = task.PersonLabel - if task.IdentityType != "" { - m.PersonIdentity = strings.Split(task.IdentityType, ",") - } - for _, v := range task.Rules { - if v.Alias == "appearances" { - if val, ok := v.Value.(float64); ok { - m.Appearances = int(val) - } - } - - if v.Alias == "duration" { - if val, ok := v.Value.(float64); ok { - m.Duration = int(val) - } - } - if v.Alias == "timeRange" { - if val, ok := v.Value.(string); ok { - ages := strings.Split(val, ",") - m.StartTime, _ = strconv.Atoi(ages[0]) - m.EndTime, _ = strconv.Atoi(ages[1]) - } - } - } - - // 榛樿璁$畻30澶╃殑鏁版嵁 - if m.Duration == 0 { - m.Duration = 30 - } - - logger.Debugf("LocationModel init finish ...task id:%s, name:%s, rule:%+v", task.ID, task.Name, m) - - return nil -} - -type nightRecord struct { - IDCard string `json:"idCard"` - PicDate string `json:"picDate"` - DocumentNumbers []string - CommunityId string `json:"communityId"` - OrgId string `json:"orgId"` - Building string `json:"building"` - Floor string `json:"floor"` - AppearCount int `gorm:"type:int;" json:"appearCount"` // 鍑虹幇娆℃暟 - //AppearInterval int `gorm:"type:int;" json:"appearInterval"` // 鍑虹幇闂撮殧锛屽崟浣嶄负绉� -} - -type nightPersonInfo struct { - Id string `json:"id"` - DocumentNumber string `json:"document_number"` - PersonType string `json:"person_type"` - //CommunityId string `json:"community_id"` - //OrgId string `json:"org_id"` - //PersonName string `json:"person_name"` - //IdCard string `json:"id_card"` - LastAppearanceTime int64 `json:"last_appearance_time"` - //LastDirection string `json:"last_direction"` - //LastLocation string `json:"last_location"` -} - -//var ( -// processed sync.Map // 瀛樺偍宸插鐞嗚褰� -// cleanupThreshold = time.Now().Add(-100 * time.Hour) // 瀹氫箟涓�涓椂闂寸獥鍙o紝鍋囪鍙繚瀛樻渶杩�100灏忔椂鐨勮褰� -//) - -func (m *nightModel) Run() error { - // 鏍规嵁閰嶇疆鐨勬椂闂存澶╂暟, 姣忓ぉ鐨勬椂闂磋寖鍥村唴锛� 閲嶇偣浜哄憳绫诲瀷鎴栬�呯壒瀹氭爣绛句汉鍛樺嚭鐜扮殑妤煎眰娆℃暟瓒呰繃闃堝�� - - results := make([]*db.ModelTaskResults, 0) - var baseFilter, labelFilter, keyFilter, lastFilter []LocationPersonInfo - var document_number_map map[string]LocationPersonInfo - var document_number_list []string - err := db.GetDB().Raw(` - SELECT - s.document_number, --- s.community_id, --- s.org_id, --- p.person_name, --- p.id_card, - s.last_appearance_time, --- s.last_direction, --- s.last_location - FROM - snapshot_count_summary AS s - JOIN person AS p ON p.id = s.document_number - WHERE - p.id_card != "" - AND (p.community_id IN ? - OR p.org_id IN ?) - AND p.status IN ? - `, m.AreaIds, m.OrgIds, m.PersonIdentity).Scan(&baseFilter).Error - if err != nil { - logger.Warnf(err.Error()) - } - - if len(baseFilter) == 0 { - return fmt.Errorf("no results found that match the age condition %s - %s ", m.AreaIds, m.OrgIds) - } - - logger.Debugf("task %s match age result %d", m.Task.Name, len(baseFilter)) - for _, i := range baseFilter { - if _, ok := document_number_map[i.DocumentNumber]; !ok { - document_number_list = append(document_number_list, i.DocumentNumber) - } - document_number_map[i.DocumentNumber] = i - } - if m.PersonLabel != "" { - labels := strings.Split(m.PersonLabel, ",") - err := db.GetDB().Raw(` - SELECT - p.id - FROM - person AS p - JOIN person_label AS l ON p.id = l.person_id - WHERE - p.id IN ? - AND l.label_id IN ? - `, document_number_list, labels).Scan(&labelFilter).Error - if err != nil { - logger.Warnf(err.Error()) - } - - if len(labelFilter) == 0 { - return fmt.Errorf("no results found that match the label condition %s", m.PersonLabel) - } - - logger.Debugf("task %s match label result %d", m.Task.Name, len(labelFilter)) - } - - document_number_list = []string{} - for _, i := range labelFilter { - - document_number_list = append(document_number_list, i.Id) - - } - - if m.KeyPersonType != "" { - keyTypes := strings.Split(m.KeyPersonType, ",") - err := db.GetDB().Raw(` - SELECT - p.id, - k.person_type - FROM - person AS p - JOIN key_person AS k ON k.id_card = p.id_card - WHERE - p.id IN ? - AND k.person_type IN ? - `, m.StartTime, keyTypes).Scan(&keyFilter).Error - if err != nil { - logger.Warnf(err.Error()) - } - if len(keyFilter) == 0 { - return fmt.Errorf("no results found that match the key condition %s", m.KeyPersonType) - } - - logger.Debugf("task %s match key person result %d", m.Task.Name, len(keyFilter)) - } - - logger.Debugf("task %s last result %d", m.Task.Name, len(lastFilter)) - document_number_list = []string{} - for _, i := range keyFilter { - document_number_list = append(document_number_list, i.Id) - person := document_number_map[i.DocumentNumber] - person.PersonType = i.PersonType - document_number_map[i.DocumentNumber] = person - } - records, err := queryEsNight(db.GetEsClient(), m, document_number_list) - if err != nil { - return err - } - domains, err := domainToNight(records) - if err != nil { - return err - } - var tagTypes []string - var lastAppearanceTime int64 - for _, record := range records { - tagTypes = []string{} - for _, personId := range record.DocumentNumbers { - tagTypes = append(tagTypes, document_number_map[personId].PersonType) - lastAppearanceTime = document_number_map[personId].LastAppearanceTime - } - _, typeNames, err := service.GetPersonTypeNameByTypes(tagTypes) - if err != nil { - return err - } - event := strings.Join(typeNames, ",") - result := &db.ModelTaskResults{ - Title: m.Task.Name, - Event: m.eventFormat(event, record.AppearCount), - ModelID: m.Task.ModelID, - ModelTaskID: m.Task.ID, - CommunityId: record.CommunityId, - OrgID: record.OrgId, - ObjectIds: strings.Join(record.DocumentNumbers, ","), - Location: fmt.Sprintf("%s%s%s", domains[record.CommunityId].Name, record.Building, record.Floor), - PicDate: time.Unix(lastAppearanceTime, 0).Format("2006-01-02 15:04:05"), - FirstPersonID: record.DocumentNumbers[0], - } - results = append(results, result) - } - logger.Debugf("task %s last filter result %d", m.Task.Name, len(results)) - return service.SaveTaskResults(results) -} - -func (m *nightModel) KeepAlive() error { - db.GetDB().Model(m.Task).Where("id = ?", m.Task.ID).Update("last_run_time", time.Now()) - return nil -} - -func (m *nightModel) Shutdown() error { - // 娓呯悊璧勬簮 - fmt.Println("Shutting down LocationModel Model") - return nil -} - -func (m *nightModel) eventFormat(event string, AppearCount int) string { - return fmt.Sprintf("%s浜哄憳杩涘嚭%d娆�", event, AppearCount) -} - -func queryEsNight(esClient *elasticsearch.Client, locationModel *nightModel, documentNumbers []string) ([]*nightRecord, error) { - var buf bytes.Buffer - nowTime := time.Now() - startTime := nowTime.Add(-time.Duration(locationModel.Duration) * 24 * time.Hour) - - // 鏋勫缓杩囨护鏉′欢 - var filters []map[string]interface{} - documentNumberFilter := map[string]interface{}{ - "terms": map[string]interface{}{ - "documentNumber": documentNumbers, - }, - } - filters = append(filters, documentNumberFilter) - - if len(locationModel.OrgIds) > 0 || len(locationModel.AreaIds) > 0 { - // 鑾峰彇鏁版嵁鏉冮檺杩囨护鏉′欢 - authFilters := GetDomainFilters(locationModel.OrgIds, locationModel.AreaIds) - filters = append(filters, authFilters...) - } - - // 鍦板潃杩囨护 - if locationModel.Building != "" || locationModel.Floor != "" { - var addrParams map[string]interface{} - if locationModel.Floor != "" { - addrParams = map[string]interface{}{"bool": map[string]interface{}{ - "must": []interface{}{ - map[string]interface{}{ - "term": map[string]interface{}{ - "cameraLocation.building": locationModel.Building, - }}, - map[string]interface{}{ - "term": map[string]interface{}{ - "cameraLocation.floor": locationModel.Floor, - }}, - }, - }} - } else if locationModel.Building != "" { - addrParams = map[string]interface{}{ - "term": map[string]interface{}{ - "cameraLocation.building": locationModel.Building, - }} - } - filters = append(filters, addrParams) - } - - //// 閲嶇偣浜哄憳杩囨护 - //if len(locationModel.KeyPersonType) > 0 { - // filters = append(filters, map[string]interface{}{ - // "terms": map[string]interface{}{ - // "keyPersonType": strings.Split(locationModel.KeyPersonType, ","), - // }, - // }) - //} - - // 鏃堕棿鑼冨洿 - //filters = append(filters, map[string]interface{}{ - // "range": map[string]interface{}{ - // "picDate": map[string]interface{}{ - // "gte": start.Format(time.DateTime), - // "lt": now.Format(time.DateTime), - // }, - // }, - //}) - for date := startTime; date.Before(nowTime); date = date.Add(24 * time.Hour) { - start := time.Date(date.Year(), date.Month(), date.Day(), locationModel.StartTime, 0, 0, 0, date.Location()) - end := time.Date(date.Year(), date.Month(), date.Day(), locationModel.EndTime, 0, 0, 0, date.Location()) - - filters = append(filters, map[string]interface{}{ - "range": map[string]interface{}{ - "picDate": map[string]interface{}{ - "gte": start.Format(time.RFC3339), - "lte": end.Format(time.RFC3339), - }, - }, - }) - } - - query := map[string]interface{}{ - "query": map[string]interface{}{ - "bool": map[string]interface{}{ - "filter": filters, - }, - }, - "aggs": map[string]interface{}{ - "orgs": map[string]interface{}{ // 鍏堣仛鍚坥rgId - "terms": map[string]interface{}{ - "field": "orgId", // 鑱氬悎orgId - "size": 10000, - }, - "aggs": map[string]interface{}{ - "community": map[string]interface{}{ // 鍦╫rgId鑱氬悎涓嬭仛鍚坈ommunityId - "terms": map[string]interface{}{ - "field": "communityId", // 鑱氬悎communityId - "size": 10000, - }, - "aggs": map[string]interface{}{ - "location": map[string]interface{}{ // 鍦╟ommunityId涓嬭仛鍚坆uilding - "terms": map[string]interface{}{ - "field": "cameraLocation.building", // 鑱氬悎妤兼爧 - "size": 10000, - }, - "aggs": map[string]interface{}{ - "floor": map[string]interface{}{ // 鍦╞uilding涓嬭仛鍚坒loor - "terms": map[string]interface{}{ - "field": "cameraLocation.floor", // 鑱氬悎妤煎眰 - "size": 10000, - }, - "aggs": map[string]interface{}{ - "filter_floor": map[string]interface{}{ - "bucket_selector": map[string]interface{}{ - "buckets_path": map[string]interface{}{ - "eventCount": "_count", - }, - "script": map[string]interface{}{ - "source": "params.eventCount >= params.threshold", - "params": map[string]interface{}{ - "threshold": locationModel.Appearances, - }, - }, - }, - }, - "document_numbers": map[string]interface{}{ // 鏂板鎸� documentNumber 鑱氬悎 - "terms": map[string]interface{}{ - "field": "documentNumber", - "size": 10000, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - "size": 0, - } - - 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) - } - - // 瑙f瀽鑱氬悎缁撴灉 - var records []*nightRecord - if aggs, ok := result["aggregations"].(map[string]interface{}); ok { - if orgBuckets, ok := aggs["orgs"].(map[string]interface{})["buckets"].([]interface{}); ok { - for _, orgBucket := range orgBuckets { - orgId := orgBucket.(map[string]interface{})["key"].(string) - - // 瑙f瀽鎸塩ommunityId鐨勮仛鍚堢粨鏋� - if communityBuckets, ok := orgBucket.(map[string]interface{})["community"].(map[string]interface{})["buckets"].([]interface{}); ok { - for _, communityBucket := range communityBuckets { - communityId := communityBucket.(map[string]interface{})["key"].(string) - - // 瑙f瀽鎸塨uilding鐨勮仛鍚堢粨鏋� - if locationBuckets, ok := communityBucket.(map[string]interface{})["location"].(map[string]interface{})["buckets"].([]interface{}); ok { - for _, locationBucket := range locationBuckets { - building := locationBucket.(map[string]interface{})["key"].(string) - - // 瑙f瀽鎸塮loor鐨勮仛鍚堢粨鏋� - if floorBuckets, ok := locationBucket.(map[string]interface{})["floor"].(map[string]interface{})["buckets"].([]interface{}); ok { - for _, floorBucket := range floorBuckets { - floor := floorBucket.(map[string]interface{})["key"].(string) - appearCount := floorBucket.(map[string]interface{})["filter_floor"].(int) - // 鏋勫缓 LocationRecord 缁撴瀯浣� - var persons []string - if docNumBuckets, ok := floorBucket.(map[string]interface{})["document_numbers"].(map[string]interface{})["buckets"].([]interface{}); ok { - for _, docNumBucket := range docNumBuckets { - persons = append(persons, docNumBucket.(map[string]interface{})["key"].(string)) - } - } - record := &nightRecord{ - //PicDate: timestamp, - DocumentNumbers: persons, - CommunityId: communityId, - Building: building, - Floor: floor, - OrgId: orgId, - AppearCount: appearCount, - } - - records = append(records, record) - } - } - } - } - } - } - } - } - } - - return records, nil -} - -func domainToNight(records []*nightRecord) (map[string]*db.DomainUnit, error) { - if len(records) == 0 { - return nil, nil - } - domainIds := set.NewStringSet() - for _, record := range records { - domainIds.Add(record.CommunityId) - } - domains, err := service.GetUnitsMapByIds(domainIds.Elements()) - if err != nil { - return nil, err - } - return domains, nil -} -- Gitblit v1.8.0