From fca319958029fa924308e50cb61202d7d6ff5008 Mon Sep 17 00:00:00 2001 From: zhaoqingang <zhaoqg0118@163.com> Date: 星期三, 19 二月 2025 13:33:37 +0800 Subject: [PATCH] 暂停聚集模型 --- models/accessRegularity.go | 157 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 149 insertions(+), 8 deletions(-) diff --git a/models/accessRegularity.go b/models/accessRegularity.go index 8e2d123..dfb3986 100644 --- a/models/accessRegularity.go +++ b/models/accessRegularity.go @@ -15,16 +15,17 @@ type RegularityModel struct { OrgIds []interface{} `json:"-"` AreaIds []interface{} `json:"-"` - IdentityType string // 浜哄憳韬唤绫诲瀷 闄岀敓浜�, 璁垮, 浣忔埛 + IdentityType []string // 浜哄憳韬唤绫诲瀷 闄岀敓浜�, 璁垮, 浣忔埛 KeyPersonType string // 閲嶇偣浜哄憳绫诲瀷 PersonLabel string // 浜哄憳韬唤鏍囩 Task *db.ModelTask AlarmType db.AlarmType // 棰勮鏂瑰紡 - Appearances int // 鍑虹幇娆℃暟 - Duration int // 鏃堕棿鑼冨洿, 鍗曚綅澶� - StartHour int // 寮�濮嬭绠楃殑鏃堕棿 閰嶇疆涓哄皬鏃� 23 - 02 琛ㄧず绗竴澶�23鐐� - 绗簩澶╃殑2鐐� - EndHour int // 缁撴潫鏃堕棿 + Appearances int // 鍑虹幇娆℃暟 + Duration int // 鏃堕棿鑼冨洿, 鍗曚綅澶� + LastDirection string // 鏈�鍚庝竴娆″嚭琛岀殑鏂瑰悜 + StartHour int // 寮�濮嬭绠楃殑鏃堕棿 閰嶇疆涓哄皬鏃� 23 - 02 琛ㄧず绗竴澶�23鐐� - 绗簩澶╃殑2鐐� + EndHour int // 缁撴潫鏃堕棿 } func (m *RegularityModel) Init(task *db.ModelTask) error { @@ -42,7 +43,19 @@ m.AlarmType = task.AlarmType m.KeyPersonType = task.PersonType m.PersonLabel = task.PersonLabel - m.IdentityType = task.IdentityType + m.LastDirection = "out" + if task.IdentityType != "" { + for _, t := range strings.Split(task.IdentityType, ",") { + if t == "all" { + m.IdentityType = []string{"stranger", "visitor", "resident"} + break + } else { + m.IdentityType = append(m.IdentityType, t) + } + } + } else { + m.IdentityType = []string{"stranger", "visitor", "resident"} + } for _, v := range task.Rules { if v.Alias == "timeRange" { @@ -64,6 +77,12 @@ m.Duration = int(val) } } + + if v.Alias == "direction" { + if val, ok := v.Value.(string); ok { + m.LastDirection = val + } + } } // 榛樿璁$畻30澶╃殑鏁版嵁 @@ -75,13 +94,74 @@ 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 } func (m *RegularityModel) Run() error { results := make([]*db.ModelTaskResults, 0) + baseFilter := make([]PersonInfo, 0) + + // 鏌ユ壘鎸囧畾鏃堕棿鑼冨洿鍐呭嚭琛岃繃鐨勬。妗堢紪鍙� + 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 (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 { + 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, pd := countValidDays(captures, m.StartHour, m.EndHour, m.LastDirection) + + 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, + } + + results = append(results, result) + } + } logger.Debugf("task %s last filter result %d", m.Task.Name, len(results)) return service.SaveTaskResults(results) @@ -94,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 +} -- Gitblit v1.8.0