zhangzengfei
2025-02-08 f1c2453aaf74d17048b3f80c08a92e5f69d575e1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
package models
 
import (
    "errors"
    "fmt"
    "strconv"
    "strings"
    "time"
 
    "model-engine/db"
    "model-engine/pkg/logger"
    "model-engine/service"
)
 
type RegularityModel struct {
    OrgIds        []interface{} `json:"-"`
    AreaIds       []interface{} `json:"-"`
    IdentityType  string        // 人员身份类型 陌生人, 访客, 住户
    KeyPersonType string        // 重点人员类型
    PersonLabel   string        // 人员身份标签
    Task          *db.ModelTask
    AlarmType     db.AlarmType // 预警方式
 
    Appearances int // 出现次数
    Duration    int // 时间范围, 单位天
    StartHour   int // 开始计算的时间 配置为小时 23 - 02 表示第一天23点 - 第二天的2点
    EndHour     int // 结束时间
}
 
func (m *RegularityModel) Init(task *db.ModelTask) error {
    if len(task.DomainUnitIds) == 0 {
        return errors.New("empty domain set")
    }
    orgIds, areaIds, err := service.GetOrgIdsAndAreaIdsByDomainUnitIds(task.DomainUnitIds)
    if err != nil {
        return err
    }
 
    m.Task = task
    m.OrgIds = orgIds
    m.AreaIds = areaIds
    m.AlarmType = task.AlarmType
    m.KeyPersonType = task.PersonType
    m.PersonLabel = task.PersonLabel
    m.IdentityType = task.IdentityType
 
    for _, v := range task.Rules {
        if v.Alias == "timeRange" {
            if val, ok := v.Value.(string); ok {
                ages := strings.Split(val, ",")
                m.StartHour, _ = strconv.Atoi(ages[0])
                m.EndHour, _ = strconv.Atoi(ages[1])
            }
        }
 
        if v.Alias == "appearances" {
            if val, ok := v.Value.(float64); ok {
                m.Appearances = int(val)
            }
        }
 
        if v.Alias == "duration" {
            if val, ok := v.Value.(float64); ok {
                m.Duration = int(val)
            }
        }
    }
 
    // 默认计算30天的数据
    if m.Duration == 0 {
        m.Duration = 30
    }
 
    if m.StartHour == 0 || m.EndHour == 0 {
        return fmt.Errorf("task id:%s, %s timeRange Time range setting error. %+v", task.ID, task.Name, task.Rules)
    }
 
    logger.Debugf("LocationModel init finish ...task id:%s, name:%s, rule:%+v", task.ID, task.Name, m)
 
    return nil
}
 
func (m *RegularityModel) Run() error {
    results := make([]*db.ModelTaskResults, 0)
 
    logger.Debugf("task %s last filter result %d", m.Task.Name, len(results))
    return service.SaveTaskResults(results)
}
 
func (m *RegularityModel) KeepAlive() error {
    db.GetDB().Model(m.Task).Where("id = ?", m.Task.ID).Update("last_run_time", time.Now())
    return nil
}
 
func (m *RegularityModel) Shutdown() error {
    // 清理资源
    fmt.Println("Shutting down LocationModel Model")
    return nil
}
 
func (m *RegularityModel) eventFormat() string {
    return ""
}