From 2332cb0d6829a421b4d1826bb1825f9df6afdd74 Mon Sep 17 00:00:00 2001
From: zhaoqingang <zhaoqg0118@163.com>
Date: 星期一, 10 二月 2025 10:33:16 +0800
Subject: [PATCH] 测试 场景分析 bug
---
models/disappear.go | 75 ++++++++++++++++++++++++++++++-------
1 files changed, 60 insertions(+), 15 deletions(-)
diff --git a/models/disappear.go b/models/disappear.go
index 08ceda2..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")
}
@@ -109,8 +110,8 @@
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' ),
@@ -121,7 +122,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())
}
@@ -130,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 != "" {
@@ -150,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())
}
@@ -160,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))
}
// 鍚堝苟涓�涓嬫潯浠�
@@ -189,15 +191,16 @@
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)
@@ -206,7 +209,9 @@
}
}
- logger.Debugf("last result %d", len(lastFilter))
+ 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]
@@ -225,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,
@@ -236,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 {
@@ -285,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