| | |
| | | import ( |
| | | "errors" |
| | | "fmt" |
| | | "strconv" |
| | | "strings" |
| | | "time" |
| | | |
| | |
| | | DisappearTime int // 消失时间, 单位小时 |
| | | AlarmInterval int // 报警时间间隔, 单位天 |
| | | LastDirection string // 最后一次抓拍 |
| | | MaxAge string // 年龄 |
| | | MinAge string // 年龄 |
| | | MaxAge int // 年龄 |
| | | MinAge int // 年龄 |
| | | Task *db.ModelTask |
| | | } |
| | | |
| | |
| | | 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]) |
| | | } |
| | | } |
| | | |
| | |
| | | |
| | | } |
| | | |
| | | 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") |
| | | } |
| | | |
| | |
| | | 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()) |
| | |
| | | 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 != "" { |
| | |
| | | s.org_id, |
| | | p.person_name, |
| | | p.id_card, |
| | | s.last_appearance_time, |
| | | p.last_appearance_time, |
| | | s.last_direction, |
| | | s.last_location |
| | | FROM |
| | |
| | | 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 |
| | |
| | | s.org_id, |
| | | p.person_name, |
| | | p.id_card, |
| | | s.last_appearance_time, |
| | | p.last_appearance_time, |
| | | s.last_direction, |
| | | s.last_location |
| | | FROM |
| | |
| | | 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] |
| | |
| | | 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") |