From 12d094a193e190bedb1fcf35ac024eaec3c77e9f Mon Sep 17 00:00:00 2001
From: zhaoqingang <zhaoqg0118@163.com>
Date: 星期三, 19 二月 2025 12:03:45 +0800
Subject: [PATCH] merge

---
 /dev/null                  |  513 ------------------------------------------
 models/accessRegularity.go |    4 
 models/locationAnalysis.go |   86 +++---
 models/disappear.go        |   31 ++
 models/model.go            |    3 
 db/db.go                   |   32 +-
 6 files changed, 90 insertions(+), 579 deletions(-)

diff --git a/db/db.go b/db/db.go
index 7a108d7..a71ef97 100644
--- a/db/db.go
+++ b/db/db.go
@@ -241,15 +241,15 @@
 			Scope:   "",
 			RuleArg: RuleArg{
 				Alias:    "duration",
-				Name:     "鏃堕棿娈�",
+				Name:     "鐩戞帶鏃堕棿",
 				Type:     "input",
-				Must:     false,
-				Unit:     "澶�",
-				Range:    "1,2400",
+				Must:     true,
+				Unit:     "澶╁唴",
+				Range:    "1,60",
 				Value:    "30",
 				ValType:  "int",
-				Operator: ">=",
-				Sort:     2,
+				Operator: "==",
+				Sort:     1,
 			},
 		},
 		{
@@ -257,16 +257,16 @@
 			ModelId: ModelIdLocationAnalysis,
 			Scope:   "",
 			RuleArg: RuleArg{
-				Alias:    "personCount",
-				Name:     "鍑虹幇浜烘暟",
-				Type:     "input",
+				Alias:    "timeRange",
+				Name:     "鍑虹幇鏃堕棿",
+				Type:     "range",
 				Must:     true,
-				Unit:     "涓�",
-				Range:    "1,100",
-				Value:    "1, 90",
+				Unit:     "鐐�",
+				Range:    "0,23",
+				Value:    "9,10",
 				ValType:  "int",
-				Operator: ">=",
-				Sort:     0,
+				Operator: "==",
+				Sort:     2,
 			},
 		},
 		{
@@ -278,12 +278,12 @@
 				Name:     "鍑虹幇娆℃暟",
 				Type:     "input",
 				Must:     true,
-				Unit:     "",
+				Unit:     "娆�",
 				Range:    "",
 				Value:    "",
 				ValType:  "int",
 				Operator: ">=",
-				Sort:     1,
+				Sort:     0,
 			},
 		},
 
diff --git a/models/accessRegularity.go b/models/accessRegularity.go
index 70e23d8..dfb3986 100644
--- a/models/accessRegularity.go
+++ b/models/accessRegularity.go
@@ -208,7 +208,7 @@
 
 		if !isCrossDay {
 			// 鍒ゆ柇鏃堕棿鑼冨洿锛屽苟褰掑睘鍒版煇涓�澶�
-			if hour >= startHour && hour <= endHour {
+			if hour >= startHour && hour < endHour {
 				key = t.Format("2006-01-02")
 			} else {
 				continue // 涓嶅湪缁熻鑼冨洿鍐�
@@ -217,7 +217,7 @@
 			// 鍒ゆ柇鏃堕棿鑼冨洿锛屽苟褰掑睘鍒版煇涓�澶�
 			if hour >= startHour { // 21:00-23:59 褰掑睘褰撳ぉ
 				key = t.Format("2006-01-02")
-			} else if hour <= endHour { // 00:00-02:59 褰掑睘鍓嶄竴澶�
+			} else if hour < endHour { // 00:00-02:59 褰掑睘鍓嶄竴澶�
 				key = t.AddDate(0, 0, -1).Format("2006-01-02")
 			} else {
 				continue // 涓嶅湪缁熻鑼冨洿鍐�
diff --git a/models/disappear.go b/models/disappear.go
index a7e0f9a..0532f6b 100644
--- a/models/disappear.go
+++ b/models/disappear.go
@@ -84,6 +84,34 @@
 	results := make([]*db.ModelTaskResults, 0)
 	var ageFilter, labelFilter, keyFilter, lastFilter []PersonInfo
 
+	if m.MinAge == 0 && m.PersonLabel == "" && m.KeyPersonType == "" {
+		err := db.GetDB().Raw(`
+		SELECT
+			s.document_number,
+			s.community_id,
+			s.org_id,
+			p.person_name,
+			p.id_card,
+			s.last_appearance_time,
+			s.last_direction,
+			s.last_location 
+		FROM
+			snapshot_count_summary AS s
+			JOIN person AS p ON p.id = s.document_number 
+		WHERE
+			s.last_appearance_time > ?
+		`, m.StartTime).Scan(&lastFilter).Error
+		if err != nil {
+			logger.Warnf(err.Error())
+		}
+
+		if len(lastFilter) == 0 {
+			return fmt.Errorf("no results found that match the condition %+v", m.Task.Rules)
+		}
+
+		logger.Debugf("task %s match default result %d", m.Task.Name, len(lastFilter))
+	}
+
 	if m.MinAge > 0 {
 		err := db.GetDB().Raw(`
 		SELECT
@@ -204,8 +232,7 @@
 	for _, p := range lastFilter {
 		if len(m.AreaIds) > 0 {
 			_, o1 := m.AreaIds[p.CommunityId]
-			_, o2 := m.AreaIds[p.OrgId]
-			if !o1 && !o2 {
+			if !o1 {
 				continue
 			}
 		}
diff --git a/models/locationAnalysis.go b/models/locationAnalysis.go
index bdb4efa..6a5a4f6 100644
--- a/models/locationAnalysis.go
+++ b/models/locationAnalysis.go
@@ -54,13 +54,22 @@
 	m.AreaIds = areaIds
 	m.Building = task.Building
 	m.AlarmType = task.AlarmType
-	m.PersonIdentity = []string{"stranger", "visitor", "resident"} //task.IdentityType
-	m.KeyTypes = []string{"1", "2", "3", "4", "5"}                 //task.IdentityType
+	m.KeyTypes = []string{"1", "2", "3", "4", "5"} //task.IdentityType
 	m.KeyPersonType = task.PersonType
 	m.PersonLabel = task.PersonLabel
 	if task.IdentityType != "" {
-		m.PersonIdentity = strings.Split(task.IdentityType, ",")
+		for _, t := range strings.Split(task.IdentityType, ",") {
+			if t == "all" {
+				m.PersonIdentity = []string{"stranger", "visitor", "resident"}
+				break
+			} else {
+				m.PersonIdentity = append(m.PersonIdentity, t)
+			}
+		}
+	} else {
+		m.PersonIdentity = []string{"stranger", "visitor", "resident"}
 	}
+
 	if task.PersonType != "" {
 		m.KeyTypes = strings.Split(task.PersonType, ",")
 	}
@@ -112,33 +121,22 @@
 }
 
 type LocationPersonInfo struct {
-	Id             string `json:"id"`
-	DocumentNumber string `json:"document_number"`
-	PersonType     string `json:"person_type"`
-	//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"`
+	Id                 string `json:"id"`
+	DocumentNumber     string `json:"document_number"`
+	PersonType         string `json:"person_type"`
+	LastAppearanceTime int64  `json:"last_appearance_time"`
 }
-
-//var (
-//	processed        sync.Map                           // 瀛樺偍宸插鐞嗚褰�
-//	cleanupThreshold = time.Now().Add(-100 * time.Hour) // 瀹氫箟涓�涓椂闂寸獥鍙o紝鍋囪鍙繚瀛樻渶杩�100灏忔椂鐨勮褰�
-//)
 
 func (m *LocationModel) Run() error {
 	// 鏍规嵁閰嶇疆鐨勬椂闂存澶╂暟, 姣忓ぉ鐨勬椂闂磋寖鍥村唴锛� 閲嶇偣浜哄憳绫诲瀷鎴栬�呯壒瀹氭爣绛句汉鍛樺嚭鐜扮殑妤煎眰娆℃暟瓒呰繃闃堝��
 
 	results := make([]*db.ModelTaskResults, 0)
 	var baseFilter, labelFilter, keyFilter []LocationPersonInfo
-	var document_number_map = make(map[string]LocationPersonInfo)
-	var document_number_list []string
-	community_ids := m.AreaIds
-	if len(community_ids) == 0 {
-		community_ids = m.OrgIds
+	var documentNumberMap = make(map[string]LocationPersonInfo)
+	var documentNumberList []string
+	communityIds := m.AreaIds
+	if len(communityIds) == 0 {
+		communityIds = m.OrgIds
 	}
 	err := db.GetDB().Raw(`
 		SELECT
@@ -149,24 +147,23 @@
 			snapshot_count_summary AS s
 			JOIN person AS p ON p.id = s.document_number
 		WHERE
-			p.id_card != "" 
-			AND (s.community_id IN ? OR s.org_id IN ?)
+			(s.community_id IN ? OR s.org_id IN ?)
 			AND s.status IN ?
-		`, community_ids, m.OrgIds, m.PersonIdentity).Scan(&baseFilter).Error
+		`, communityIds, m.OrgIds, m.PersonIdentity).Scan(&baseFilter).Error
 	if err != nil {
 		logger.Warnf(err.Error())
 	}
 
 	if len(baseFilter) == 0 {
-		return fmt.Errorf("no results found that match the age condition %s - %s - %s ", m.AreaIds, m.OrgIds, m.PersonIdentity)
+		return fmt.Errorf("no results found that match the identity condition %+v", m.Task.Rules)
 	}
 
-	logger.Debugf("task %s match age result %d", m.Task.Name, len(baseFilter))
+	logger.Debugf("task %s match identity result %d", m.Task.Name, len(baseFilter))
 	for _, i := range baseFilter {
-		if _, ok := document_number_map[i.DocumentNumber]; !ok {
-			document_number_list = append(document_number_list, i.DocumentNumber)
+		if _, ok := documentNumberMap[i.DocumentNumber]; !ok {
+			documentNumberList = append(documentNumberList, i.DocumentNumber)
 			tmp := i
-			document_number_map[i.DocumentNumber] = tmp
+			documentNumberMap[i.DocumentNumber] = tmp
 		}
 	}
 	if m.PersonLabel != "" {
@@ -180,7 +177,7 @@
 		WHERE
 			p.id IN ?
 			AND	l.label_id IN ?
-		`, document_number_list, labels).Scan(&labelFilter).Error
+		`, documentNumberList, labels).Scan(&labelFilter).Error
 		if err != nil {
 			logger.Warnf(err.Error())
 		}
@@ -190,11 +187,12 @@
 		}
 
 		logger.Debugf("task %s match label result %d", m.Task.Name, len(labelFilter))
-		document_number_list = []string{}
+		documentNumberList = []string{}
 		for _, i := range labelFilter {
-			document_number_list = append(document_number_list, i.Id)
+			documentNumberList = append(documentNumberList, i.Id)
 		}
 	}
+
 	if len(m.KeyTypes) > 0 {
 		//keyTypes := strings.Split(m.KeyPersonType, ",")
 		err := db.GetDB().Raw(`
@@ -207,30 +205,30 @@
 		WHERE
 			p.id IN ?
 			AND k.person_type IN ?
-		`, document_number_list, m.KeyTypes).Scan(&keyFilter).Error
+		`, documentNumberList, m.KeyTypes).Scan(&keyFilter).Error
 		if err != nil {
 			logger.Warnf(err.Error())
 		}
 		if len(keyFilter) == 0 {
-			return fmt.Errorf("no results found that match the key condition%s------ %s", document_number_list, m.KeyTypes)
+			return fmt.Errorf("no results found that match the key condition %v------ %s", documentNumberList, m.KeyTypes)
 		}
 		logger.Debugf("task %s match key person result %d", m.Task.Name, len(keyFilter))
 	}
 	//logger.Debugf("task %s last result %d", m.Task.Name, len(lastFilter))
-	document_number_list = []string{}
+	documentNumberList = []string{}
 	for _, i := range keyFilter {
 		//logger.Debugf("keyFilter %s ------------- %s", i.Id, i.PersonType)
-		document_number_list = append(document_number_list, i.Id)
-		person := document_number_map[i.Id]
+		documentNumberList = append(documentNumberList, i.Id)
+		person := documentNumberMap[i.Id]
 		person.PersonType = i.PersonType
-		document_number_map[i.Id] = person
+		documentNumberMap[i.Id] = person
 	}
 	//logger.Debugf("document_number_map %s last result %s", m.Task.Name, document_number_map)
-	records, err := queryEsLocation(db.GetEsClient(), m, document_number_list)
+	records, err := queryEsLocation(db.GetEsClient(), m, documentNumberList)
 	if err != nil {
 		return err
 	}
-	logger.Debugf("records %s last result %+v", m.Task.Name, records)
+	logger.Debugf("records %s last result %d", m.Task.Name, len(records))
 	domains, err := domainToLocation(records)
 	if err != nil {
 		return err
@@ -240,8 +238,8 @@
 	for _, record := range records {
 		tagTypes = []string{}
 		for _, personId := range record.DocumentNumbers {
-			logger.Debugf("document_number_map[personId] %s", document_number_map[personId])
-			tagTypes = append(tagTypes, document_number_map[personId].PersonType)
+			logger.Debugf("document_number_map[personId] %+v", documentNumberMap[personId])
+			tagTypes = append(tagTypes, documentNumberMap[personId].PersonType)
 			//lastAppearanceTime = document_number_map[personId].LastAppearanceTime
 		}
 		//logger.Debugf("tagTypes %s ---------------%s--------", record.PicDate, record.DocumentNumbers)
diff --git a/models/model.go b/models/model.go
index 4b1a51a..8a3b136 100644
--- a/models/model.go
+++ b/models/model.go
@@ -16,8 +16,7 @@
 var modelRegistry = map[string]func() Model{
 	"gather":           func() Model { return &GatherModel{} },
 	"disappear":        func() Model { return &DisappearModel{} },
-	"location":         func() Model { return &LocationModel{} },
-	"night":            func() Model { return &nightModel{} },
+	"locationAnalysis": func() Model { return &LocationModel{} },
 	"accessRegularity": func() Model { return &RegularityModel{} },
 	// 娣诲姞鍏朵粬妯″瀷
 }
diff --git a/models/nightAnalysis.go b/models/nightAnalysis.go
deleted file mode 100644
index 42dc360..0000000
--- a/models/nightAnalysis.go
+++ /dev/null
@@ -1,513 +0,0 @@
-package models
-
-import (
-	"bytes"
-	"context"
-	"encoding/json"
-	"errors"
-	"fmt"
-	"github.com/elastic/go-elasticsearch/v6"
-	"model-engine/pkg/set"
-
-	//"log"
-	"model-engine/config"
-	//"model-engine/pkg/set"
-	"strconv"
-	"strings"
-	"time"
-
-	"model-engine/db"
-	"model-engine/pkg/logger"
-	"model-engine/service"
-)
-
-type nightModel struct {
-	AreaIds        []interface{} `json:"-"`
-	OrgIds         []interface{} `json:"-"`
-	Building       string        // 妤兼爧
-	Floor          string
-	AlarmType      db.AlarmType // 棰勮鏂瑰紡
-	KeyPersonType  string       // 浜哄憳绫诲瀷
-	PersonLabel    string       // 浜哄憳鏍囩
-	PersonIdentity []string     // 浜哄憳韬唤
-	Duration       int          // 鏃堕棿鑼冨洿
-	Appearances    int          // 鍑虹幇娆℃暟,
-	StartTime      int          // 鏃堕棿鑼冨洿, 寮�濮嬫椂闂�
-	EndTime        int          // 鏃堕棿鑼冨洿, 缁撴潫鏃堕棿
-	Task           *db.ModelTask
-}
-
-func (m *nightModel) Init(task *db.ModelTask) error {
-	//m.AreaIds = make(map[string]struct{})
-	//for _, a := range task.DomainUnitIds {
-	//	m.AreaIds[a] = struct{}{}
-	//}
-	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.Building = task.Building
-	m.AlarmType = task.AlarmType
-	m.PersonIdentity = []string{"stranger", "visitor", "resident"} //task.IdentityType
-	m.KeyPersonType = task.PersonType
-	m.PersonLabel = task.PersonLabel
-	if task.IdentityType != "" {
-		m.PersonIdentity = strings.Split(task.IdentityType, ",")
-	}
-	for _, v := range task.Rules {
-		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)
-			}
-		}
-		if v.Alias == "timeRange" {
-			if val, ok := v.Value.(string); ok {
-				ages := strings.Split(val, ",")
-				m.StartTime, _ = strconv.Atoi(ages[0])
-				m.EndTime, _ = strconv.Atoi(ages[1])
-			}
-		}
-	}
-
-	// 榛樿璁$畻30澶╃殑鏁版嵁
-	if m.Duration == 0 {
-		m.Duration = 30
-	}
-
-	logger.Debugf("LocationModel init finish ...task id:%s, name:%s, rule:%+v", task.ID, task.Name, m)
-
-	return nil
-}
-
-type nightRecord struct {
-	IDCard          string `json:"idCard"`
-	PicDate         string `json:"picDate"`
-	DocumentNumbers []string
-	CommunityId     string `json:"communityId"`
-	OrgId           string `json:"orgId"`
-	Building        string `json:"building"`
-	Floor           string `json:"floor"`
-	AppearCount     int    `gorm:"type:int;" json:"appearCount"` // 鍑虹幇娆℃暟
-	//AppearInterval int    `gorm:"type:int;" json:"appearInterval"` // 鍑虹幇闂撮殧锛屽崟浣嶄负绉�
-}
-
-type nightPersonInfo struct {
-	Id             string `json:"id"`
-	DocumentNumber string `json:"document_number"`
-	PersonType     string `json:"person_type"`
-	//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"`
-}
-
-//var (
-//	processed        sync.Map                           // 瀛樺偍宸插鐞嗚褰�
-//	cleanupThreshold = time.Now().Add(-100 * time.Hour) // 瀹氫箟涓�涓椂闂寸獥鍙o紝鍋囪鍙繚瀛樻渶杩�100灏忔椂鐨勮褰�
-//)
-
-func (m *nightModel) Run() error {
-	// 鏍规嵁閰嶇疆鐨勬椂闂存澶╂暟, 姣忓ぉ鐨勬椂闂磋寖鍥村唴锛� 閲嶇偣浜哄憳绫诲瀷鎴栬�呯壒瀹氭爣绛句汉鍛樺嚭鐜扮殑妤煎眰娆℃暟瓒呰繃闃堝��
-
-	results := make([]*db.ModelTaskResults, 0)
-	var baseFilter, labelFilter, keyFilter, lastFilter []LocationPersonInfo
-	var document_number_map map[string]LocationPersonInfo
-	var document_number_list []string
-	err := db.GetDB().Raw(`
-		SELECT
-			s.document_number,
--- 			s.community_id,
--- 			s.org_id,
--- 			p.person_name,
--- 			p.id_card,
-			s.last_appearance_time,
--- 			s.last_direction,
--- 			s.last_location 
-		FROM
-			snapshot_count_summary AS s
-			JOIN person AS p ON p.id = s.document_number
-		WHERE
-			p.id_card != "" 
-			AND (p.community_id IN ?
-			OR p.org_id IN ?)
-			AND p.status IN ?
-		`, m.AreaIds, m.OrgIds, m.PersonIdentity).Scan(&baseFilter).Error
-	if err != nil {
-		logger.Warnf(err.Error())
-	}
-
-	if len(baseFilter) == 0 {
-		return fmt.Errorf("no results found that match the age condition %s - %s ", m.AreaIds, m.OrgIds)
-	}
-
-	logger.Debugf("task %s match age result %d", m.Task.Name, len(baseFilter))
-	for _, i := range baseFilter {
-		if _, ok := document_number_map[i.DocumentNumber]; !ok {
-			document_number_list = append(document_number_list, i.DocumentNumber)
-		}
-		document_number_map[i.DocumentNumber] = i
-	}
-	if m.PersonLabel != "" {
-		labels := strings.Split(m.PersonLabel, ",")
-		err := db.GetDB().Raw(`
-		SELECT
-			p.id
-		FROM
-			person AS p
-			JOIN person_label AS l ON p.id = l.person_id 
-		WHERE
-			p.id IN ?
-			AND	l.label_id IN ?
-		`, document_number_list, labels).Scan(&labelFilter).Error
-		if err != nil {
-			logger.Warnf(err.Error())
-		}
-
-		if len(labelFilter) == 0 {
-			return fmt.Errorf("no results found that match the label condition %s", m.PersonLabel)
-		}
-
-		logger.Debugf("task %s match label result %d", m.Task.Name, len(labelFilter))
-	}
-
-	document_number_list = []string{}
-	for _, i := range labelFilter {
-
-		document_number_list = append(document_number_list, i.Id)
-
-	}
-
-	if m.KeyPersonType != "" {
-		keyTypes := strings.Split(m.KeyPersonType, ",")
-		err := db.GetDB().Raw(`
-		SELECT
-			p.id,
-			k.person_type
-		FROM
-			person AS p
-			JOIN key_person AS k ON k.id_card = p.id_card 
-		WHERE
-			p.id IN ?
-			AND k.person_type IN ?
-		`, m.StartTime, keyTypes).Scan(&keyFilter).Error
-		if err != nil {
-			logger.Warnf(err.Error())
-		}
-		if len(keyFilter) == 0 {
-			return fmt.Errorf("no results found that match the key condition %s", m.KeyPersonType)
-		}
-
-		logger.Debugf("task %s match key person result %d", m.Task.Name, len(keyFilter))
-	}
-
-	logger.Debugf("task %s last result %d", m.Task.Name, len(lastFilter))
-	document_number_list = []string{}
-	for _, i := range keyFilter {
-		document_number_list = append(document_number_list, i.Id)
-		person := document_number_map[i.DocumentNumber]
-		person.PersonType = i.PersonType
-		document_number_map[i.DocumentNumber] = person
-	}
-	records, err := queryEsNight(db.GetEsClient(), m, document_number_list)
-	if err != nil {
-		return err
-	}
-	domains, err := domainToNight(records)
-	if err != nil {
-		return err
-	}
-	var tagTypes []string
-	var lastAppearanceTime int64
-	for _, record := range records {
-		tagTypes = []string{}
-		for _, personId := range record.DocumentNumbers {
-			tagTypes = append(tagTypes, document_number_map[personId].PersonType)
-			lastAppearanceTime = document_number_map[personId].LastAppearanceTime
-		}
-		_, typeNames, err := service.GetPersonTypeNameByTypes(tagTypes)
-		if err != nil {
-			return err
-		}
-		event := strings.Join(typeNames, ",")
-		result := &db.ModelTaskResults{
-			Title:         m.Task.Name,
-			Event:         m.eventFormat(event, record.AppearCount),
-			ModelID:       m.Task.ModelID,
-			ModelTaskID:   m.Task.ID,
-			CommunityId:   record.CommunityId,
-			OrgID:         record.OrgId,
-			ObjectIds:     strings.Join(record.DocumentNumbers, ","),
-			Location:      fmt.Sprintf("%s%s%s", domains[record.CommunityId].Name, record.Building, record.Floor),
-			PicDate:       time.Unix(lastAppearanceTime, 0).Format("2006-01-02 15:04:05"),
-			FirstPersonID: record.DocumentNumbers[0],
-		}
-		results = append(results, result)
-	}
-	logger.Debugf("task %s last filter result %d", m.Task.Name, len(results))
-	return service.SaveTaskResults(results)
-}
-
-func (m *nightModel) KeepAlive() error {
-	db.GetDB().Model(m.Task).Where("id = ?", m.Task.ID).Update("last_run_time", time.Now())
-	return nil
-}
-
-func (m *nightModel) Shutdown() error {
-	// 娓呯悊璧勬簮
-	fmt.Println("Shutting down LocationModel Model")
-	return nil
-}
-
-func (m *nightModel) eventFormat(event string, AppearCount int) string {
-	return fmt.Sprintf("%s浜哄憳杩涘嚭%d娆�", event, AppearCount)
-}
-
-func queryEsNight(esClient *elasticsearch.Client, locationModel *nightModel, documentNumbers []string) ([]*nightRecord, error) {
-	var buf bytes.Buffer
-	nowTime := time.Now()
-	startTime := nowTime.Add(-time.Duration(locationModel.Duration) * 24 * time.Hour)
-
-	// 鏋勫缓杩囨护鏉′欢
-	var filters []map[string]interface{}
-	documentNumberFilter := map[string]interface{}{
-		"terms": map[string]interface{}{
-			"documentNumber": documentNumbers,
-		},
-	}
-	filters = append(filters, documentNumberFilter)
-
-	if len(locationModel.OrgIds) > 0 || len(locationModel.AreaIds) > 0 {
-		// 鑾峰彇鏁版嵁鏉冮檺杩囨护鏉′欢
-		authFilters := GetDomainFilters(locationModel.OrgIds, locationModel.AreaIds)
-		filters = append(filters, authFilters...)
-	}
-
-	// 鍦板潃杩囨护
-	if locationModel.Building != "" || locationModel.Floor != "" {
-		var addrParams map[string]interface{}
-		if locationModel.Floor != "" {
-			addrParams = map[string]interface{}{"bool": map[string]interface{}{
-				"must": []interface{}{
-					map[string]interface{}{
-						"term": map[string]interface{}{
-							"cameraLocation.building": locationModel.Building,
-						}},
-					map[string]interface{}{
-						"term": map[string]interface{}{
-							"cameraLocation.floor": locationModel.Floor,
-						}},
-				},
-			}}
-		} else if locationModel.Building != "" {
-			addrParams = map[string]interface{}{
-				"term": map[string]interface{}{
-					"cameraLocation.building": locationModel.Building,
-				}}
-		}
-		filters = append(filters, addrParams)
-	}
-
-	//// 閲嶇偣浜哄憳杩囨护
-	//if len(locationModel.KeyPersonType) > 0 {
-	//	filters = append(filters, map[string]interface{}{
-	//		"terms": map[string]interface{}{
-	//			"keyPersonType": strings.Split(locationModel.KeyPersonType, ","),
-	//		},
-	//	})
-	//}
-
-	// 鏃堕棿鑼冨洿
-	//filters = append(filters, map[string]interface{}{
-	//	"range": map[string]interface{}{
-	//		"picDate": map[string]interface{}{
-	//			"gte": start.Format(time.DateTime),
-	//			"lt":  now.Format(time.DateTime),
-	//		},
-	//	},
-	//})
-	for date := startTime; date.Before(nowTime); date = date.Add(24 * time.Hour) {
-		start := time.Date(date.Year(), date.Month(), date.Day(), locationModel.StartTime, 0, 0, 0, date.Location())
-		end := time.Date(date.Year(), date.Month(), date.Day(), locationModel.EndTime, 0, 0, 0, date.Location())
-
-		filters = append(filters, map[string]interface{}{
-			"range": map[string]interface{}{
-				"picDate": map[string]interface{}{
-					"gte": start.Format(time.RFC3339),
-					"lte": end.Format(time.RFC3339),
-				},
-			},
-		})
-	}
-
-	query := map[string]interface{}{
-		"query": map[string]interface{}{
-			"bool": map[string]interface{}{
-				"filter": filters,
-			},
-		},
-		"aggs": map[string]interface{}{
-			"orgs": map[string]interface{}{ // 鍏堣仛鍚坥rgId
-				"terms": map[string]interface{}{
-					"field": "orgId", // 鑱氬悎orgId
-					"size":  10000,
-				},
-				"aggs": map[string]interface{}{
-					"community": map[string]interface{}{ // 鍦╫rgId鑱氬悎涓嬭仛鍚坈ommunityId
-						"terms": map[string]interface{}{
-							"field": "communityId", // 鑱氬悎communityId
-							"size":  10000,
-						},
-						"aggs": map[string]interface{}{
-							"location": map[string]interface{}{ // 鍦╟ommunityId涓嬭仛鍚坆uilding
-								"terms": map[string]interface{}{
-									"field": "cameraLocation.building", // 鑱氬悎妤兼爧
-									"size":  10000,
-								},
-								"aggs": map[string]interface{}{
-									"floor": map[string]interface{}{ // 鍦╞uilding涓嬭仛鍚坒loor
-										"terms": map[string]interface{}{
-											"field": "cameraLocation.floor", // 鑱氬悎妤煎眰
-											"size":  10000,
-										},
-										"aggs": map[string]interface{}{
-											"filter_floor": map[string]interface{}{
-												"bucket_selector": map[string]interface{}{
-													"buckets_path": map[string]interface{}{
-														"eventCount": "_count",
-													},
-													"script": map[string]interface{}{
-														"source": "params.eventCount >= params.threshold",
-														"params": map[string]interface{}{
-															"threshold": locationModel.Appearances,
-														},
-													},
-												},
-											},
-											"document_numbers": map[string]interface{}{ // 鏂板鎸� documentNumber 鑱氬悎
-												"terms": map[string]interface{}{
-													"field": "documentNumber",
-													"size":  10000,
-												},
-											},
-										},
-									},
-								},
-							},
-						},
-					},
-				},
-			},
-		},
-		"size": 0,
-	}
-
-	if err := json.NewEncoder(&buf).Encode(query); err != nil {
-		return nil, fmt.Errorf("error encoding query: %s", err)
-	}
-
-	res, err := esClient.Search(
-		esClient.Search.WithContext(context.Background()),
-		esClient.Search.WithIndex(config.EsInfo.EsIndex.AiOcean.IndexName),
-		esClient.Search.WithDocumentType(config.EsInfo.EsIndex.AiOcean.IndexType),
-		esClient.Search.WithBody(&buf),
-		esClient.Search.WithTrackTotalHits(true),
-		esClient.Search.WithPretty(),
-	)
-	if err != nil {
-		return nil, fmt.Errorf("error getting response: %s", err)
-	}
-	defer res.Body.Close()
-
-	// Check for a successful status code (2xx range)
-	if res.IsError() {
-		return nil, fmt.Errorf("error getting response: %s", res.String())
-	}
-
-	var result map[string]interface{}
-	if err := json.NewDecoder(res.Body).Decode(&result); err != nil {
-		return nil, fmt.Errorf("error parsing response body: %s", err)
-	}
-
-	// 瑙f瀽鑱氬悎缁撴灉
-	var records []*nightRecord
-	if aggs, ok := result["aggregations"].(map[string]interface{}); ok {
-		if orgBuckets, ok := aggs["orgs"].(map[string]interface{})["buckets"].([]interface{}); ok {
-			for _, orgBucket := range orgBuckets {
-				orgId := orgBucket.(map[string]interface{})["key"].(string)
-
-				// 瑙f瀽鎸塩ommunityId鐨勮仛鍚堢粨鏋�
-				if communityBuckets, ok := orgBucket.(map[string]interface{})["community"].(map[string]interface{})["buckets"].([]interface{}); ok {
-					for _, communityBucket := range communityBuckets {
-						communityId := communityBucket.(map[string]interface{})["key"].(string)
-
-						// 瑙f瀽鎸塨uilding鐨勮仛鍚堢粨鏋�
-						if locationBuckets, ok := communityBucket.(map[string]interface{})["location"].(map[string]interface{})["buckets"].([]interface{}); ok {
-							for _, locationBucket := range locationBuckets {
-								building := locationBucket.(map[string]interface{})["key"].(string)
-
-								// 瑙f瀽鎸塮loor鐨勮仛鍚堢粨鏋�
-								if floorBuckets, ok := locationBucket.(map[string]interface{})["floor"].(map[string]interface{})["buckets"].([]interface{}); ok {
-									for _, floorBucket := range floorBuckets {
-										floor := floorBucket.(map[string]interface{})["key"].(string)
-										appearCount := floorBucket.(map[string]interface{})["filter_floor"].(int)
-										// 鏋勫缓 LocationRecord 缁撴瀯浣�
-										var persons []string
-										if docNumBuckets, ok := floorBucket.(map[string]interface{})["document_numbers"].(map[string]interface{})["buckets"].([]interface{}); ok {
-											for _, docNumBucket := range docNumBuckets {
-												persons = append(persons, docNumBucket.(map[string]interface{})["key"].(string))
-											}
-										}
-										record := &nightRecord{
-											//PicDate:        timestamp,
-											DocumentNumbers: persons,
-											CommunityId:     communityId,
-											Building:        building,
-											Floor:           floor,
-											OrgId:           orgId,
-											AppearCount:     appearCount,
-										}
-
-										records = append(records, record)
-									}
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-	}
-
-	return records, nil
-}
-
-func domainToNight(records []*nightRecord) (map[string]*db.DomainUnit, error) {
-	if len(records) == 0 {
-		return nil, nil
-	}
-	domainIds := set.NewStringSet()
-	for _, record := range records {
-		domainIds.Add(record.CommunityId)
-	}
-	domains, err := service.GetUnitsMapByIds(domainIds.Elements())
-	if err != nil {
-		return nil, err
-	}
-	return domains, nil
-}

--
Gitblit v1.8.0