From 3c033759200ad7c02dd59521b1aebbbdc35b98fa Mon Sep 17 00:00:00 2001
From: zhaoqingang <zhaoqg0118@163.com>
Date: 星期六, 08 二月 2025 16:18:50 +0800
Subject: [PATCH] 长场景人员分析模型

---
 models/disappear.go |   97 ++++++++++++++++++++++++++++++++++++------------
 1 files changed, 72 insertions(+), 25 deletions(-)

diff --git a/models/disappear.go b/models/disappear.go
index 8ad5215..3f09e2a 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,13 +68,12 @@
 				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")
 	}
 
@@ -101,25 +102,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 +131,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 +151,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 +162,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,24 +191,27 @@
 			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]
@@ -223,7 +230,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 +241,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 +303,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