| | |
| | | Description: "通用场所分析模型", |
| | | Version: "v1.0.0", |
| | | Enabled: false, |
| | | }, { |
| | | BaseModel: BaseModel{ |
| | | ID: ModelIdAccessRegularity, |
| | | }, |
| | | Name: "出行规律分析", |
| | | Description: "出行规律分析模型", |
| | | Version: "v1.0.0", |
| | | Enabled: false, |
| | | }, |
| | | //{ |
| | | // BaseModel: BaseModel{ |
| | |
| | | Sort: 1, |
| | | }, |
| | | }, |
| | | |
| | | // 出行规律 |
| | | { |
| | | Id: "6ba7b810-9dad-11d1-80b4-00c04fd430c8", |
| | | ModelId: ModelIdAccessRegularity, |
| | | Scope: "", |
| | | RuleArg: RuleArg{ |
| | | Alias: "duration", |
| | | Name: "监控时间段", |
| | | Type: "input", |
| | | Must: true, |
| | | Unit: "天内", |
| | | Range: "1,60", |
| | | Value: "30", |
| | | ValType: "int", |
| | | Operator: ">=", |
| | | Sort: 0, |
| | | }, |
| | | }, |
| | | { |
| | | Id: "f47ac10b-58cc-4372-a567-0e02b2c3d479", |
| | | ModelId: ModelIdAccessRegularity, |
| | | Scope: "", |
| | | RuleArg: RuleArg{ |
| | | Alias: "timeRange", |
| | | Name: "出行时间段", |
| | | Type: "range", |
| | | Must: true, |
| | | Unit: "点", |
| | | Range: "1,24", |
| | | Value: "21,3", |
| | | ValType: "int", |
| | | Operator: ">=", |
| | | Sort: 1, |
| | | }, |
| | | }, |
| | | { |
| | | Id: "c9bf9e57-1685-4c89-bafb-ff5af830be8a", |
| | | ModelId: ModelIdAccessRegularity, |
| | | Scope: "", |
| | | RuleArg: RuleArg{ |
| | | Alias: "appearances", |
| | | Name: "出行次数", |
| | | Type: "input", |
| | | Must: false, |
| | | Unit: "次", |
| | | Range: "1,100", |
| | | Value: "2", |
| | | ValType: "int", |
| | | Operator: "==", |
| | | Sort: 2, |
| | | }, |
| | | }, |
| | | { |
| | | Id: "e4eaaaf2-d142-11e1-b3e4-080027620cdd", |
| | | ModelId: ModelIdAccessRegularity, |
| | | Scope: "", |
| | | RuleArg: RuleArg{ |
| | | Alias: "direction", |
| | | Name: "进出方向", |
| | | Type: "select", |
| | | Must: false, |
| | | Unit: "", |
| | | Range: "", |
| | | Value: "", |
| | | ValType: "[{\"label\":\"进\", \"value\":\"in\"},{\"label\":\"出\", \"value\":\"out\"}]", |
| | | Operator: "==", |
| | | Sort: 3, |
| | | }, |
| | | }, |
| | | } |
| | | |
| | | for i := range rules { |
| | |
| | | ModelIdGather = "gather" // 聚集 |
| | | ModelIdDisappear = "disappear" // 失踪 |
| | | ModelIdLocationAnalysis = "locationAnalysis" // 场所分析 |
| | | //ModelIdNightAnalysis = "nightAnalysis" // 昼伏夜出分析 |
| | | ModelIdAccessRegularity = "accessRegularity" // 出行规律分析 |
| | | ) |
| | |
| | | type RegularityModel struct { |
| | | OrgIds []interface{} `json:"-"` |
| | | AreaIds []interface{} `json:"-"` |
| | | IdentityType string // 人员身份类型 陌生人, 访客, 住户 |
| | | IdentityType []string // 人员身份类型 陌生人, 访客, 住户 |
| | | KeyPersonType string // 重点人员类型 |
| | | PersonLabel string // 人员身份标签 |
| | | Task *db.ModelTask |
| | | AlarmType db.AlarmType // 预警方式 |
| | | |
| | | Appearances int // 出现次数 |
| | | Duration int // 时间范围, 单位天 |
| | | StartHour int // 开始计算的时间 配置为小时 23 - 02 表示第一天23点 - 第二天的2点 |
| | | EndHour int // 结束时间 |
| | | Appearances int // 出现次数 |
| | | Duration int // 时间范围, 单位天 |
| | | LastDirection string // 最后一次出行的方向 |
| | | StartHour int // 开始计算的时间 配置为小时 23 - 02 表示第一天23点 - 第二天的2点 |
| | | EndHour int // 结束时间 |
| | | } |
| | | |
| | | func (m *RegularityModel) Init(task *db.ModelTask) error { |
| | |
| | | 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) |
| | |
| | | package models |
| | | |
| | | type PersonInfo struct { |
| | | DocumentNumber string `json:"document_number"` |
| | | CommunityId string `json:"community_id"` |
| | | OrgId string `json:"org_id"` |
| | | PersonName string `json:"person_name"` |
| | | IdCard string `json:"id_card"` |
| | | FrequentAddress string `json:"frequent_address"` |
| | | LastAppearanceTime int64 `json:"last_appearance_time"` |
| | | LastDirection string `json:"last_direction"` |
| | | LastLocation string `json:"last_location"` |
| | | } |
| | | |
| | | func GetDomainFilters(orgIds, areaIds []interface{}) (filters []map[string]interface{}) { |
| | | filters = make([]map[string]interface{}, 0) |
| | | // 数据权限过滤 |
| | |
| | | return nil |
| | | } |
| | | |
| | | type PersonInfo struct { |
| | | DocumentNumber string `json:"document_number"` |
| | | CommunityId string `json:"community_id"` |
| | | OrgId string `json:"org_id"` |
| | | PersonName string `json:"person_name"` |
| | | IdCard string `json:"id_card"` |
| | | LastAppearanceTime int64 `json:"last_appearance_time"` |
| | | LastDirection string `json:"last_direction"` |
| | | LastLocation string `json:"last_location"` |
| | | } |
| | | |
| | | func (m *DisappearModel) Run() error { |
| | | results := make([]*db.ModelTaskResults, 0) |
| | | var ageFilter, labelFilter, keyFilter, lastFilter []PersonInfo |
| | |
| | | PicDate: lt.Time, |
| | | FirstPersonID: personIds[0], |
| | | } |
| | | |
| | | results = append(results, result) |
| | | } |
| | | return service.SaveTaskResults(results) |