From fca319958029fa924308e50cb61202d7d6ff5008 Mon Sep 17 00:00:00 2001 From: zhaoqingang <zhaoqg0118@163.com> Date: 星期三, 19 二月 2025 13:33:37 +0800 Subject: [PATCH] 暂停聚集模型 --- models/disappear.go | 156 +++++++++++++++++++++++++++++++++++++++------------- 1 files changed, 117 insertions(+), 39 deletions(-) diff --git a/models/disappear.go b/models/disappear.go index e65907f..0532f6b 100644 --- a/models/disappear.go +++ b/models/disappear.go @@ -3,6 +3,7 @@ import ( "errors" "fmt" + "strconv" "strings" "time" @@ -21,7 +22,9 @@ DisappearTime int // 娑堝け鏃堕棿, 鍗曚綅灏忔椂 AlarmInterval int // 鎶ヨ鏃堕棿闂撮殧, 鍗曚綅澶� LastDirection string // 鏈�鍚庝竴娆℃姄鎷� - PersonAge int // 骞撮緞 + MaxAge int // 骞撮緞 + MinAge int // 骞撮緞 + StartTime int64 // 璧峰鏃堕棿 Task *db.ModelTask } @@ -37,6 +40,7 @@ m.AlarmType = task.AlarmType m.KeyPersonType = task.PersonType m.PersonLabel = task.PersonLabel + m.StartTime = task.BeginTime.Unix() for _, v := range task.Rules { if v.Alias == "disappearTime" { @@ -52,8 +56,10 @@ } if v.Alias == "age" { - if val, ok := v.Value.(float64); ok { - m.PersonAge = int(val) + if val, ok := v.Value.(string); ok { + ages := strings.Split(val, ",") + m.MinAge, _ = strconv.Atoi(ages[0]) + m.MaxAge, _ = strconv.Atoi(ages[1]) } } @@ -62,63 +68,87 @@ m.LastDirection = val } } - } - logger.Debugf("DisappearModel init finish ...task id:%s, name:%s, rule:%+v\n", task.ID, task.Name, m) + logger.Debugf("DisappearModel init finish ...task id:%s, name:%s, rule:%+v", task.ID, task.Name, m) if m.DisappearTime == 0 { - logger.Warnf("invalid parameters. task id:%s, name:%s\n", task.ID, task.Name) + logger.Warnf("invalid parameters. task id:%s, name:%s", task.ID, task.Name) return errors.New("invalid parameters") } return nil } -type PersonInfo struct { - DocumentNumber string `json:"document_number"` - 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"` -} - func (m *DisappearModel) Run() error { results := make([]*db.ModelTaskResults, 0) var ageFilter, labelFilter, keyFilter, lastFilter []PersonInfo - if m.PersonAge > 0 { + if m.MinAge == 0 && m.PersonLabel == "" && m.KeyPersonType == "" { err := db.GetDB().Raw(` SELECT s.document_number, s.community_id, s.org_id, p.person_name, - p.id_card , + p.id_card, s.last_appearance_time, s.last_direction, - s.last_location + s.last_location FROM snapshot_count_summary AS s JOIN person AS p ON p.id = s.document_number WHERE - s.STATUS = 'resident' - AND p.id_card != "" + s.last_appearance_time > ? + `, m.StartTime).Scan(&lastFilter).Error + if err != nil { + logger.Warnf(err.Error()) + } + + if len(lastFilter) == 0 { + return fmt.Errorf("no results found that match the condition %+v", m.Task.Rules) + } + + logger.Debugf("task %s match default result %d", m.Task.Name, len(lastFilter)) + } + + if m.MinAge > 0 { + 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 + s.last_appearance_time > ? + AND p.id_card != "" AND TIMESTAMPDIFF( YEAR, STR_TO_DATE( CASE WHEN LENGTH( id_card ) = 18 THEN SUBSTRING( id_card, 7, 8 ) ELSE NULL END, '%Y%m%d' ), - CURDATE( ) > ? - `, m.PersonAge).Scan(&ageFilter).Error + CURDATE( ) + ) >= ? + AND TIMESTAMPDIFF( + YEAR, + STR_TO_DATE( CASE WHEN LENGTH( id_card ) = 18 THEN SUBSTRING( id_card, 7, 8 ) ELSE NULL END, '%Y%m%d' ), + CURDATE( ) + ) <= ? + `, m.StartTime, m.MinAge, m.MaxAge).Scan(&ageFilter).Error if err != nil { logger.Warnf(err.Error()) } if len(ageFilter) == 0 { - return fmt.Errorf("no results found that match the age condition %d", m.PersonAge) + return fmt.Errorf("no results found that match the age condition %s - %s", m.MinAge, m.MaxAge) } + + logger.Debugf("task %s match age result %d", m.Task.Name, len(ageFilter)) } if m.PersonLabel != "" { @@ -138,8 +168,9 @@ JOIN person AS p ON p.id = s.document_number JOIN person_label AS l ON p.id = l.person_id WHERE - l.label_id IN ? - `, labels).Scan(&labelFilter).Error + s.last_appearance_time > ? + AND l.label_id IN ? + `, m.StartTime, labels).Scan(&labelFilter).Error if err != nil { logger.Warnf(err.Error()) } @@ -147,12 +178,14 @@ 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)) } // 鍚堝苟涓�涓嬫潯浠� - if m.PersonAge > 0 && m.PersonLabel != "" { + if m.MinAge > 0 && m.PersonLabel != "" { lastFilter = intersectPersonInfo(ageFilter, labelFilter) - } else if m.PersonAge > 0 { + } else if m.MinAge > 0 { lastFilter = ageFilter } else if m.PersonLabel != "" { lastFilter = labelFilter @@ -175,26 +208,31 @@ JOIN person AS p ON p.id = s.document_number JOIN key_person AS k ON k.id_card = p.id_card WHERE - s.key_status = 1 + s.last_appearance_time > ? + AND s.key_status = 1 AND p.id_card != "" AND k.person_type IN ? - `, keyTypes).Scan(&keyFilter).Error + `, m.StartTime, keyTypes).Scan(&keyFilter).Error if err != nil { logger.Warnf(err.Error()) } + + logger.Debugf("task %s match key person result %d", m.Task.Name, len(keyFilter)) + + if len(lastFilter) > 0 { + lastFilter = intersectPersonInfo(lastFilter, keyFilter) + } else { + lastFilter = keyFilter + } } - if len(lastFilter) > 0 { - lastFilter = intersectPersonInfo(lastFilter, keyFilter) - } else { - lastFilter = keyFilter - } + logger.Debugf("task %s last result %d", m.Task.Name, len(lastFilter)) + var personIds = make(map[string]struct{}, 0) for _, p := range lastFilter { if len(m.AreaIds) > 0 { _, o1 := m.AreaIds[p.CommunityId] - _, o2 := m.AreaIds[p.OrgId] - if !o1 && !o2 { + if !o1 { continue } } @@ -208,7 +246,7 @@ if isOlderThanGivenHours(p.LastAppearanceTime, m.DisappearTime) { result := &db.ModelTaskResults{ Title: m.Task.Name, - Event: m.Task.Name, + Event: m.eventFormat(p.LastAppearanceTime, p.LastDirection), ModelID: m.Task.ModelID, ModelTaskID: m.Task.ID, CommunityId: p.CommunityId, @@ -219,11 +257,24 @@ FirstPersonID: p.DocumentNumber, } + // 鍚屼竴涓汉鎶ヨ涓�娆� + if _, ok := personIds[p.DocumentNumber]; ok { + continue + } else { + personIds[p.DocumentNumber] = struct{}{} + } + results = append(results, result) } } + logger.Debugf("task %s last filter result %d", m.Task.Name, len(results)) return service.SaveTaskResults(results) +} + +func (m *DisappearModel) KeepAlive() error { + db.GetDB().Model(m.Task).Where("id = ?", m.Task.ID).Update("last_run_time", time.Now()) + return nil } func (m *DisappearModel) Shutdown() error { @@ -268,3 +319,30 @@ // 鍒ゆ柇鏃堕棿鎴虫槸鍚︽棭浜庤鏃堕棿 return timestampTime.Before(timeThreshold) } + +func (m *DisappearModel) eventFormat(lastAppearTime int64, lastDirection string) string { + lastTime := time.Unix(lastAppearTime, 0) + currentTime := time.Now() + + duration := currentTime.Sub(lastTime) + + // 杈撳嚭鏃堕棿宸殑灏忔椂鏁� + var durationStr = "灏忔椂" + hours := duration.Hours() + if hours > 24 { + hours = hours / 24 + durationStr = "澶�" + } + + var direction string + var reverse = "鏈嚭鐜�" + if lastDirection == "in" { + direction = "杩�" + reverse = "鏈嚭" + } else if lastDirection == "out" { + direction = "鍑�" + reverse = "鏈綊" + } + + return fmt.Sprintf("%s%s,鎸佺画%.1f%s%s", lastTime.Format("2006-01-02 15:04:05"), direction, hours, durationStr, reverse) +} -- Gitblit v1.8.0