zhangzengfei
2025-02-11 e4fc307d58856a0b319c41f0930cd3b731cb0b24
models/accessRegularity.go
@@ -114,10 +114,10 @@
      FROM
         snapshot_count_summary
      WHERE
         last_appearance_time > ? ""
         AND (p.community_id IN ?
         OR p.org_id IN ?)
         AND p.status IN ?
         last_appearance_time > ?
         AND (community_id IN ?
         OR org_id IN ?)
         AND status IN ?
      `, startDate.Unix(), m.AreaIds, m.OrgIds, m.IdentityType).Scan(&baseFilter).Error
   if err != nil {
      logger.Warnf(err.Error())
@@ -134,27 +134,25 @@
      }
      // 根据抓拍时间和出入方向,计算符合规则内的出入次数
      hitCount := 0
      hitCount := countValidDays(captures, m.StartHour, m.EndHour, m.LastDirection)
      //for _, c := range captures {
      //   captureTime, err := time.ParseInLocation(time.DateTime, c.PicDate, time.Local)
      //}
      if hitCount > m.Appearances {
         // 写数据库
         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(time.DateTime),
            FirstPersonID: p.DocumentNumber,
         }
      // 写数据库
      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(time.DateTime),
         FirstPersonID: p.DocumentNumber,
         results = append(results, result)
      }
      results = append(results, result)
   }
   logger.Debugf("task %s last filter result %d", m.Task.Name, len(results))
@@ -175,3 +173,62 @@
func (m *RegularityModel) eventFormat() string {
   return ""
}
func countValidDays(records []*service.ESRecordInfo, startHour, endHour int, direction string) int {
   layout := "2006-01-02 15:04:05"             // 时间格式
   lastDirectionMap := make(map[string]string) // 记录最后一条 Direction
   lastTimeMap := make(map[string]time.Time)   // 记录最后一条时间
   // 判断是否跨天
   var isCrossDay bool
   if endHour < startHour {
      isCrossDay = true
   }
   for _, record := range records {
      // 解析时间
      t, err := time.Parse(layout, record.PicDate)
      if err != nil {
         fmt.Println("解析时间失败:", err)
         continue
      }
      // 获取小时
      hour := t.Hour()
      var key string
      if !isCrossDay {
         // 判断时间范围,并归属到某一天
         if hour >= startHour && hour < endHour {
            key = t.Format("2006-01-02")
         } else {
            continue // 不在统计范围内
         }
      } else {
         // 判断时间范围,并归属到某一天
         if hour >= startHour { // 21:00-23:59 归属当天
            key = t.Format("2006-01-02")
         } else if hour < endHour { // 00:00-02:59 归属前一天
            key = t.AddDate(0, 0, -1).Format("2006-01-02")
         } else {
            continue // 不在统计范围内
         }
      }
      // 记录该时间段内的最后一条数据
      if lastTime, exists := lastTimeMap[key]; !exists || t.After(lastTime) {
         lastTimeMap[key] = t
         lastDirectionMap[key] = record.CameraLocation.Direction
      }
   }
   // 统计符合条件
   count := 0
   for _, dir := range lastDirectionMap {
      if dir == direction || direction == "" {
         count++
      }
   }
   return count
}