From 699dbde008569e88d7d53da196656b07be1755eb Mon Sep 17 00:00:00 2001 From: zhaoqingang <zhaoqg0118@163.com> Date: 星期二, 11 二月 2025 14:22:19 +0800 Subject: [PATCH] Merge branch 'dev' of http://192.168.5.5:10010/r/CloudAI/model-engine into dev --- .gitignore | 2 models/accessRegularity.go | 121 +++++++++++++++++++++++++++++++--------- service/esSearch.go | 6 +- models/locationAnalysis.go | 2 models/model.go | 9 +- db/db.go | 3 db/model_rule.go | 5 + 7 files changed, 109 insertions(+), 39 deletions(-) diff --git a/.gitignore b/.gitignore index 460ccad..9f8e32f 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,6 @@ go.sum .so logs -model-engine +model-engine* vendor *.lock \ No newline at end of file diff --git a/db/db.go b/db/db.go index 34ab3bc..7a108d7 100644 --- a/db/db.go +++ b/db/db.go @@ -351,8 +351,9 @@ Unit: "", Range: "", Value: "", - ValType: "[{\"label\":\"杩沑", \"value\":\"in\"},{\"label\":\"鍑篭", \"value\":\"out\"}]", + ValType: "string", Operator: "==", + Options: "[{\"label\":\"杩沑", \"value\":\"in\"},{\"label\":\"鍑篭", \"value\":\"out\"}]", Sort: 3, }, }, diff --git a/db/model_rule.go b/db/model_rule.go index a6aab41..9244338 100644 --- a/db/model_rule.go +++ b/db/model_rule.go @@ -17,19 +17,20 @@ RuleArg struct { Alias string `gorm:"column:alias" json:"alias"` // 鍙傛暟鐨勫埆鍚� Name string `gorm:"column:name" json:"name"` // 鍙傛暟鍚嶇О - Type string `gorm:"column:type" json:"type"` // 鍙傛暟绫诲瀷: input, option, range, image + Type string `gorm:"column:type" json:"type"` // 鍙傛暟绫诲瀷: input, select, range, image Must bool `gorm:"column:must" json:"must"` // 鏄惁蹇呭~ Unit string `gorm:"column:unit" json:"unit"` // 鍗曚綅 Range string `gorm:"column:range" json:"range"` // 鍊肩殑鑼冨洿锛宔g锛�0,100琛ㄧず浠�0鍒�100 Value string `gorm:"column:value" json:"value"` // 鍙傛暟鍊� ValType string `gorm:"column:val_type" json:"valType"` // 鍙傛暟鍊肩被鍨� int, string, bool Operator string `gorm:"column:operator" json:"operator"` // 杩愮畻绗� + Options string `gorm:"column:options" json:"options"` // 閫夐」鐨勫閫夊弬鏁� Sort int `gorm:"column:sort;default:0" json:"sort"` // 鍙傛暟椤哄簭 } ModelRuleSet struct { Alias string `json:"alias"` // 鍙傛暟鐨勫埆鍚� - Type string `json:"type"` // 鍙傛暟绫诲瀷: input, option, range, image + Type string `json:"type"` // 鍙傛暟绫诲瀷: input, select, range, image Name string `json:"name"` // 鍙傛暟鍚嶇О Value interface{} `json:"value"` // 鍙傛暟鍊� ValType string `json:"valType"` // 鍊肩被鍨� diff --git a/models/accessRegularity.go b/models/accessRegularity.go index 54d5850..70e23d8 100644 --- a/models/accessRegularity.go +++ b/models/accessRegularity.go @@ -94,7 +94,7 @@ return fmt.Errorf("task id:%s, %s timeRange Time range setting error. %+v", task.ID, task.Name, task.Rules) } - logger.Debugf("LocationModel init finish ...task id:%s, name:%s, rule:%+v", task.ID, task.Name, m) + logger.Debugf("AccessRegularity init finish ...task id:%s, name:%s, rule:%+v", task.ID, task.Name, m) return nil } @@ -106,55 +106,61 @@ // 鏌ユ壘鎸囧畾鏃堕棿鑼冨洿鍐呭嚭琛岃繃鐨勬。妗堢紪鍙� now := time.Now() startDate := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location()).AddDate(0, 0, -m.Duration) + endDate := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location()) + err := db.GetDB().Raw(` SELECT document_number, frequent_address, community_id, + org_id FROM snapshot_count_summary WHERE - last_appearance_time > ? "" - AND (p.community_id IN ? - OR p.org_id IN ?) - AND p.status IN ? + last_appearance_time > ? + AND (community_id IN ? + OR org_id IN ?) + AND status IN ? `, startDate.Unix(), m.AreaIds, m.OrgIds, m.IdentityType).Scan(&baseFilter).Error if err != nil { logger.Warnf(err.Error()) } + logger.Debugf("task %s base filter result %d", m.Task.Name, len(baseFilter)) esCli := db.GetEsClient() + // 璋冪敤es鍒嗘瀽姝や汉鐨勫嚭琛岃寰嬫槸鍚︾鍚堟潯浠讹紝 杩斿洖绗﹀悎鏉′欢鐨勬鏁板拰鏈�鍚庝竴娆$鍚堟潯浠剁殑鏃堕棿 + sTime := startDate.Format(time.DateTime) + eTime := endDate.Format(time.DateTime) + 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}) + //logger.Debugf("task %s person %s captures %d", m.Task.Name, p.DocumentNumber, len(captures)) + if len(captures) == 0 || err != nil { continue } + //logger.Debugf("task %s person %s captures %+v", m.Task.Name, p.DocumentNumber, captures[0]) // 鏍规嵁鎶撴媿鏃堕棿鍜屽嚭鍏ユ柟鍚戯紝璁$畻绗﹀悎瑙勫垯鍐呯殑鍑哄叆娆℃暟 - hitCount := 0 + hitCount, pd := countValidDays(captures, m.StartHour, m.EndHour, m.LastDirection) - //for _, c := range captures { - // captureTime, err := time.ParseInLocation(time.DateTime, c.PicDate, time.Local) - //} + if hitCount > m.Appearances { + // 鍐欐暟鎹簱 + result := &db.ModelTaskResults{ + Title: m.Task.Name, + Event: fmt.Sprintf("%s - %s 鏃堕棿娈靛唴, %s %d娆�", sTime, eTime, m.Task.Name, hitCount), + ModelID: m.Task.ModelID, + ModelTaskID: m.Task.ID, + CommunityId: p.CommunityId, + OrgID: p.OrgId, + ObjectIds: p.DocumentNumber, + Location: p.FrequentAddress, + PicDate: pd, + FirstPersonID: p.DocumentNumber, + } - // 鍐欐暟鎹簱 - result := &db.ModelTaskResults{ - Title: m.Task.Name, - Event: fmt.Sprintf("%s %d娆�", m.Task.Name, hitCount), - ModelID: m.Task.ModelID, - ModelTaskID: m.Task.ID, - CommunityId: p.CommunityId, - OrgID: p.OrgId, - ObjectIds: p.DocumentNumber, - Location: p.FrequentAddress, - PicDate: time.Unix(p.LastAppearanceTime, 0).Format(time.DateTime), - FirstPersonID: p.DocumentNumber, + results = append(results, result) } - - results = append(results, result) } logger.Debugf("task %s last filter result %d", m.Task.Name, len(results)) @@ -168,10 +174,71 @@ func (m *RegularityModel) Shutdown() error { // 娓呯悊璧勬簮 - fmt.Println("Shutting down LocationModel Model") + fmt.Println("Shutting down accessRegularityS Model") return nil } func (m *RegularityModel) eventFormat() string { return "" } + +func countValidDays(records []*service.ESRecordInfo, startHour, endHour int, direction string) (int, string) { + layout := "2006-01-02 15:04:05" // 鏃堕棿鏍煎紡 + lastDirectionMap := make(map[string]string) // 璁板綍鏈�鍚庝竴鏉� Direction + lastTimeMap := make(map[string]time.Time) // 璁板綍鏈�鍚庝竴鏉℃椂闂� + lastPicDate := "" + + // 鍒ゆ柇鏄惁璺ㄥぉ + var isCrossDay bool + if endHour < startHour { + isCrossDay = true + } + + for _, record := range records { + // 瑙f瀽鏃堕棿 + t, err := time.ParseInLocation(layout, record.PicDate, time.Local) + if err != nil { + fmt.Println("瑙f瀽鏃堕棿澶辫触:", err) + continue + } + + // 鑾峰彇灏忔椂 + hour := t.Hour() + var key string + + if !isCrossDay { + // 鍒ゆ柇鏃堕棿鑼冨洿锛屽苟褰掑睘鍒版煇涓�澶� + if hour >= startHour && hour <= endHour { + key = t.Format("2006-01-02") + } else { + continue // 涓嶅湪缁熻鑼冨洿鍐� + } + } else { + // 鍒ゆ柇鏃堕棿鑼冨洿锛屽苟褰掑睘鍒版煇涓�澶� + if hour >= startHour { // 21:00-23:59 褰掑睘褰撳ぉ + key = t.Format("2006-01-02") + } else if hour <= endHour { // 00:00-02:59 褰掑睘鍓嶄竴澶� + key = t.AddDate(0, 0, -1).Format("2006-01-02") + } else { + continue // 涓嶅湪缁熻鑼冨洿鍐� + } + } + + // 璁板綍璇ユ椂闂存鍐呯殑鏈�鍚庝竴鏉℃暟鎹� + if lastTime, exists := lastTimeMap[key]; !exists || t.After(lastTime) { + lastTimeMap[key] = t + lastDirectionMap[key] = record.CameraLocation.Direction + lastPicDate = record.PicDate + } + } + + // 缁熻绗﹀悎鏉′欢 + count := 0 + for _, dir := range lastDirectionMap { + if dir == direction || direction == "" { + count++ + } + } + + return count, lastPicDate +} diff --git a/models/locationAnalysis.go b/models/locationAnalysis.go index 37d42ed..bdb4efa 100644 --- a/models/locationAnalysis.go +++ b/models/locationAnalysis.go @@ -230,7 +230,7 @@ if err != nil { return err } - logger.Debugf("records %s last result %s", m.Task.Name, records) + logger.Debugf("records %s last result %+v", m.Task.Name, records) domains, err := domainToLocation(records) if err != nil { return err diff --git a/models/model.go b/models/model.go index 7d9d983..4b1a51a 100644 --- a/models/model.go +++ b/models/model.go @@ -14,10 +14,11 @@ } 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{} }, + "gather": func() Model { return &GatherModel{} }, + "disappear": func() Model { return &DisappearModel{} }, + "location": func() Model { return &LocationModel{} }, + "night": func() Model { return &nightModel{} }, + "accessRegularity": func() Model { return &RegularityModel{} }, // 娣诲姞鍏朵粬妯″瀷 } diff --git a/service/esSearch.go b/service/esSearch.go index c5a14e9..e4b05ac 100644 --- a/service/esSearch.go +++ b/service/esSearch.go @@ -89,9 +89,9 @@ "filter": filters, }, }, - "size": 0, + "size": 10000000, "sort": []interface{}{map[string]interface{}{"picDate": map[string]interface{}{"order": "asc"}}}, - "_source": map[string]interface{}{"includes": []interface{}{}, "excludes": []interface{}{"*.feature"}}, + "_source": map[string]interface{}{"includes": []interface{}{}, "excludes": []interface{}{"*.feature", "targetInfo"}}, } if err := json.NewEncoder(&buf).Encode(query); err != nil { @@ -148,7 +148,7 @@ PicMaxUrl: source["picMaxUrl"].(string), } - cameraLocation := source["cameraId"].(map[string]interface{}) + cameraLocation := source["cameraLocation"].(map[string]interface{}) record.CameraLocation = CameraLocation{ Building: cameraLocation["building"].(string), Unit: cameraLocation["unit"].(string), -- Gitblit v1.8.0