| | |
| | | type RegularityModel struct { |
| | | OrgIds []interface{} `json:"-"` |
| | | AreaIds []interface{} `json:"-"` |
| | | IdentityType string // 人员身份类型 陌生人, 访客, 住户 |
| | | IdentityType []string // 人员身份类型 陌生人, 访客, 住户 |
| | | KeyPersonType string // 重点人员类型 |
| | | PersonLabel string // 人员身份标签 |
| | | Task *db.ModelTask |
| | |
| | | |
| | | Appearances int // 出现次数 |
| | | Duration int // 时间范围, 单位天 |
| | | LastDirection string // 最后一次出行的方向 |
| | | StartHour int // 开始计算的时间 配置为小时 23 - 02 表示第一天23点 - 第二天的2点 |
| | | EndHour int // 结束时间 |
| | | } |
| | |
| | | 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" { |
| | |
| | | m.Duration = int(val) |
| | | } |
| | | } |
| | | |
| | | if v.Alias == "direction" { |
| | | if val, ok := v.Value.(string); ok { |
| | | m.LastDirection = val |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 默认计算30天的数据 |
| | |
| | | |
| | | 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) |