zhangzengfei
2025-02-08 8ed1e960d5b13822385ecb9fcbdd18807de701e4
完善出行规律模型内容
6个文件已修改
176 ■■■■ 已修改文件
db/db.go 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
db/model.go 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
models/accessRegularity.go 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
models/common.go 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
models/disappear.go 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
models/gather_model.go 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
db/db.go
@@ -82,6 +82,14 @@
            Description: "通用场所分析模型",
            Version:     "v1.0.0",
            Enabled:     false,
        }, {
            BaseModel: BaseModel{
                ID: ModelIdAccessRegularity,
            },
            Name:        "出行规律分析",
            Description: "出行规律分析模型",
            Version:     "v1.0.0",
            Enabled:     false,
        },
        //{
        //    BaseModel: BaseModel{
@@ -278,6 +286,76 @@
                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 {
db/model.go
@@ -187,5 +187,5 @@
    ModelIdGather           = "gather"           // 聚集
    ModelIdDisappear        = "disappear"        // 失踪
    ModelIdLocationAnalysis = "locationAnalysis" // 场所分析
    //ModelIdNightAnalysis    = "nightAnalysis"    // 昼伏夜出分析
    ModelIdAccessRegularity = "accessRegularity" // 出行规律分析
)
models/accessRegularity.go
@@ -15,16 +15,17 @@
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 {
@@ -42,7 +43,19 @@
    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" {
@@ -64,6 +77,12 @@
                m.Duration = int(val)
            }
        }
        if v.Alias == "direction" {
            if val, ok := v.Value.(string); ok {
                m.LastDirection = val
            }
        }
    }
    // 默认计算30天的数据
@@ -82,6 +101,47 @@
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)
models/common.go
@@ -1,5 +1,17 @@
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)
    // 数据权限过滤
models/disappear.go
@@ -80,17 +80,6 @@
    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
models/gather_model.go
@@ -185,6 +185,7 @@
            PicDate:       lt.Time,
            FirstPersonID: personIds[0],
        }
        results = append(results, result)
    }
    return service.SaveTaskResults(results)