From e4fc307d58856a0b319c41f0930cd3b731cb0b24 Mon Sep 17 00:00:00 2001
From: zhangzengfei <zhangzengfei@smartai.com>
Date: 星期二, 11 二月 2025 10:19:47 +0800
Subject: [PATCH] 修复规律分析bug

---
 models/disappear.go |   64 +++++++++++++++++++++-----------
 1 files changed, 42 insertions(+), 22 deletions(-)

diff --git a/models/disappear.go b/models/disappear.go
index da3bd39..a7e0f9a 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,7 +68,6 @@
 				m.LastDirection = val
 			}
 		}
-
 	}
 
 	logger.Debugf("DisappearModel init finish ...task id:%s, name:%s, rule:%+v", task.ID, task.Name, m)
@@ -77,17 +78,6 @@
 	}
 
 	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 {
@@ -102,14 +92,15 @@
 			s.org_id,
 			p.person_name,
 			p.id_card,
-			p.last_appearance_time,
+			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
-			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' ),
@@ -120,7 +111,7 @@
 				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
+		`, m.StartTime, m.MinAge, m.MaxAge).Scan(&ageFilter).Error
 		if err != nil {
 			logger.Warnf(err.Error())
 		}
@@ -141,7 +132,7 @@
 			s.org_id,
 			p.person_name,
 			p.id_card,
-			p.last_appearance_time,
+			s.last_appearance_time,
 			s.last_direction,
 			s.last_location 
 		FROM
@@ -149,8 +140,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())
 		}
@@ -180,7 +172,7 @@
 			s.org_id,
 			p.person_name,
 			p.id_card,
-			p.last_appearance_time,
+			s.last_appearance_time,
 			s.last_direction,
 			s.last_location 
 		FROM
@@ -188,10 +180,11 @@
 			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())
 		}
@@ -226,7 +219,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,
@@ -299,3 +292,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