zhangzengfei
2025-02-06 cf2300a3bf596f57ab2ca1a8e134eea1beb24bf6
models/disappear.go
@@ -3,6 +3,7 @@
import (
   "errors"
   "fmt"
   "strconv"
   "strings"
   "time"
@@ -21,8 +22,8 @@
   DisappearTime int    // 消失时间, 单位小时
   AlarmInterval int    // 报警时间间隔, 单位天
   LastDirection string // 最后一次抓拍
   MaxAge        string // 年龄
   MinAge        string // 年龄
   MaxAge        int    // 年龄
   MinAge        int    // 年龄
   Task          *db.ModelTask
}
@@ -55,8 +56,8 @@
      if v.Alias == "age" {
         if val, ok := v.Value.(string); ok {
            ages := strings.Split(val, ",")
            m.MinAge = ages[0]
            m.MaxAge = ages[1]
            m.MinAge, _ = strconv.Atoi(ages[0])
            m.MaxAge, _ = strconv.Atoi(ages[1])
         }
      }
@@ -68,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")
   }
@@ -93,31 +94,32 @@
   results := make([]*db.ModelTaskResults, 0)
   var ageFilter, labelFilter, keyFilter, lastFilter []PersonInfo
   if m.MinAge != "" {
   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( ) >= ?
          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( ) <= ?
         CURDATE( )
         ) <= ?
      `, m.MinAge, m.MaxAge).Scan(&ageFilter).Error
      if err != nil {
         logger.Warnf(err.Error())
@@ -127,7 +129,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 != "" {
@@ -139,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
@@ -157,13 +159,13 @@
         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))
   }
   // 合并一下条件
   if m.MinAge != "" && m.PersonLabel != "" {
   if m.MinAge > 0 && m.PersonLabel != "" {
      lastFilter = intersectPersonInfo(ageFilter, labelFilter)
   } else if m.MinAge != "" {
   } else if m.MinAge > 0 {
      lastFilter = ageFilter
   } else if m.PersonLabel != "" {
      lastFilter = labelFilter
@@ -178,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
@@ -194,16 +196,18 @@
         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]
@@ -233,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")