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 |  139 +++++++++++++++++++++++++++++++++------------
 1 files changed, 101 insertions(+), 38 deletions(-)

diff --git a/models/disappear.go b/models/disappear.go
index 8ad5215..0532f6b 100644
--- a/models/disappear.go
+++ b/models/disappear.go
@@ -24,6 +24,7 @@
 	LastDirection string // 鏈�鍚庝竴娆℃姄鎷�
 	MaxAge        int    // 骞撮緞
 	MinAge        int    // 骞撮緞
+	StartTime     int64  // 璧峰鏃堕棿
 	Task          *db.ModelTask
 }
 
@@ -39,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" {
@@ -66,33 +68,49 @@
 				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.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,
+			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 > ?
+		`, 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(`
@@ -101,25 +119,27 @@
 			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 > ?
+			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( ) >= ?
-		    AND TIMESTAMPDIFF(
+				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.MinAge, m.MaxAge).Scan(&ageFilter).Error
+			CURDATE( ) 
+			) <= ?
+		`, m.StartTime, m.MinAge, m.MaxAge).Scan(&ageFilter).Error
 		if err != nil {
 			logger.Warnf(err.Error())
 		}
@@ -128,7 +148,7 @@
 			return fmt.Errorf("no results found that match the age condition %s - %s", m.MinAge, m.MaxAge)
 		}
 
-		logger.Debugf("match age result %d", len(ageFilter))
+		logger.Debugf("task %s match age result %d", m.Task.Name, len(ageFilter))
 	}
 
 	if m.PersonLabel != "" {
@@ -148,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())
 		}
@@ -158,7 +179,7 @@
 			return fmt.Errorf("no results found that match the label condition %s", m.PersonLabel)
 		}
 
-		logger.Debugf("match label result %d", len(labelFilter))
+		logger.Debugf("task %s match label result %d", m.Task.Name, len(labelFilter))
 	}
 
 	// 鍚堝苟涓�涓嬫潯浠�
@@ -187,29 +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("match key person result %d", len(keyFilter))
+		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))
 
-	logger.Debugf("last result %d", 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
 			}
 		}
@@ -223,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,
@@ -234,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 {
@@ -283,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