zhangzengfei
2025-02-08 8ed1e960d5b13822385ecb9fcbdd18807de701e4
models/accessRegularity.go
@@ -15,7 +15,7 @@
type RegularityModel struct {
   OrgIds        []interface{} `json:"-"`
   AreaIds       []interface{} `json:"-"`
   IdentityType  string        // 人员身份类型 陌生人, 访客, 住户
   IdentityType  []string      // 人员身份类型 陌生人, 访客, 住户
   KeyPersonType string        // 重点人员类型
   PersonLabel   string        // 人员身份标签
   Task          *db.ModelTask
@@ -23,6 +23,7 @@
   Appearances int // 出现次数
   Duration    int // 时间范围, 单位天
   LastDirection string // 最后一次出行的方向
   StartHour   int // 开始计算的时间 配置为小时 23 - 02 表示第一天23点 - 第二天的2点
   EndHour     int // 结束时间
}
@@ -42,7 +43,19 @@
   m.AlarmType = task.AlarmType
   m.KeyPersonType = task.PersonType
   m.PersonLabel = task.PersonLabel
   m.IdentityType = task.IdentityType
   m.LastDirection = "out"
   if task.IdentityType != "" {
      for _, t := range strings.Split(task.IdentityType, ",") {
         if t == "all" {
            m.IdentityType = []string{"stranger", "visitor", "resident"}
            break
         } else {
            m.IdentityType = append(m.IdentityType, t)
         }
      }
   } else {
      m.IdentityType = []string{"stranger", "visitor", "resident"}
   }
   for _, v := range task.Rules {
      if v.Alias == "timeRange" {
@@ -64,6 +77,12 @@
            m.Duration = int(val)
         }
      }
      if v.Alias == "direction" {
         if val, ok := v.Value.(string); ok {
            m.LastDirection = val
         }
      }
   }
   // 默认计算30天的数据
@@ -82,6 +101,47 @@
func (m *RegularityModel) Run() error {
   results := make([]*db.ModelTaskResults, 0)
   baseFilter := make([]PersonInfo, 0)
   // 查找指定时间范围内出行过的档案编号
   now := time.Now()
   startDate := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location()).AddDate(0, 0, -m.Duration).Unix()
   err := db.GetDB().Raw(`
      SELECT
         document_number,
         frequent_address,
      FROM
         snapshot_count_summary
      WHERE
         last_appearance_time > ? ""
         AND (p.community_id IN ?
         OR p.org_id IN ?)
         AND p.status IN ?
      `, startDate, m.AreaIds, m.OrgIds, m.IdentityType).Scan(&baseFilter).Error
   if err != nil {
      logger.Warnf(err.Error())
   }
   for _, p := range baseFilter {
      // 调用es分析此人的出行规律是否符合条件, 返回符合条件的次数和最后一次符合条件的时间
      // 写数据库
      var hitCount int
      result := &db.ModelTaskResults{
         Title:         m.Task.Name,
         Event:         fmt.Sprintf("%s %d次", m.Task.Name, hitCount),
         ModelID:       m.Task.ModelID,
         ModelTaskID:   m.Task.ID,
         CommunityId:   p.CommunityId,
         OrgID:         p.OrgId,
         ObjectIds:     p.DocumentNumber,
         Location:      p.FrequentAddress,
         PicDate:       time.Unix(p.LastAppearanceTime, 0).Format("2006-01-02 15:04:05"),
         FirstPersonID: p.DocumentNumber,
      }
      results = append(results, result)
   }
   logger.Debugf("task %s last filter result %d", m.Task.Name, len(results))
   return service.SaveTaskResults(results)