From cf2300a3bf596f57ab2ca1a8e134eea1beb24bf6 Mon Sep 17 00:00:00 2001
From: zhangzengfei <zhangzengfei@smartai.com>
Date: 星期四, 06 二月 2025 15:22:00 +0800
Subject: [PATCH] 完善托管

---
 models/disappear.go |   77 +++++++++++++++++++++++++++-----------
 1 files changed, 54 insertions(+), 23 deletions(-)

diff --git a/models/disappear.go b/models/disappear.go
index e65907f..da3bd39 100644
--- a/models/disappear.go
+++ b/models/disappear.go
@@ -3,6 +3,7 @@
 import (
 	"errors"
 	"fmt"
+	"strconv"
 	"strings"
 	"time"
 
@@ -21,7 +22,8 @@
 	DisappearTime int    // 娑堝け鏃堕棿, 鍗曚綅灏忔椂
 	AlarmInterval int    // 鎶ヨ鏃堕棿闂撮殧, 鍗曚綅澶�
 	LastDirection string // 鏈�鍚庝竴娆℃姄鎷�
-	PersonAge     int    // 骞撮緞
+	MaxAge        int    // 骞撮緞
+	MinAge        int    // 骞撮緞
 	Task          *db.ModelTask
 }
 
@@ -52,8 +54,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])
 			}
 		}
 
@@ -65,10 +69,10 @@
 
 	}
 
-	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")
 	}
 
@@ -90,35 +94,42 @@
 	results := make([]*db.ModelTaskResults, 0)
 	var ageFilter, labelFilter, keyFilter, lastFilter []PersonInfo
 
-	if m.PersonAge > 0 {
+	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,
+			p.id_card,
+			p.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 != "" 
+			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.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 != "" {
@@ -130,7 +141,7 @@
 			s.org_id,
 			p.person_name,
 			p.id_card,
-			s.last_appearance_time,
+			p.last_appearance_time,
 			s.last_direction,
 			s.last_location 
 		FROM
@@ -147,12 +158,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
@@ -167,7 +180,7 @@
 			s.org_id,
 			p.person_name,
 			p.id_card,
-			s.last_appearance_time,
+			p.last_appearance_time,
 			s.last_direction,
 			s.last_location 
 		FROM
@@ -182,14 +195,19 @@
 		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]
@@ -219,13 +237,26 @@
 				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 {
 	// 娓呯悊璧勬簮
 	fmt.Println("Shutting down Disappear Model")

--
Gitblit v1.8.0