From f1c2453aaf74d17048b3f80c08a92e5f69d575e1 Mon Sep 17 00:00:00 2001
From: zhangzengfei <zhangzengfei@smartai.com>
Date: 星期一, 10 二月 2025 16:36:23 +0800
Subject: [PATCH] 添加出行习惯模型

---
 models/accessRegularity.go |  103 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 103 insertions(+), 0 deletions(-)

diff --git a/models/accessRegularity.go b/models/accessRegularity.go
new file mode 100644
index 0000000..8e2d123
--- /dev/null
+++ b/models/accessRegularity.go
@@ -0,0 +1,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 ""
+}

--
Gitblit v1.8.0