package data
|
|
import (
|
"fmt"
|
"ruleModelEngine/db"
|
"time"
|
)
|
|
// 计算抓拍天数
|
func CalculateCaptureDays(details []db.CaptureDetail) int {
|
// 使用 map 来存储每天是否有抓拍记录
|
captureMap := make(map[string]bool)
|
for _, detail := range details {
|
// 解析抓拍日期
|
layout := "2006-01-02 15:04:05"
|
captureTime, err := time.Parse(layout, detail.CaptureDate)
|
if err != nil {
|
fmt.Println("解析抓拍日期时出错:", err)
|
continue
|
}
|
// 获取日期部分
|
date := captureTime.Format("2006-01-02")
|
// 在 map 中标记这一天有抓拍记录
|
captureMap[date] = true
|
}
|
|
// 统计有抓拍记录的天数
|
captureDays := 0
|
for range captureMap {
|
captureDays++
|
}
|
|
return captureDays
|
}
|
|
// 设置状态
|
func SetStatus(captureDays int, rules []db.PersonnelStatusRule) string {
|
for _, rule := range rules {
|
if captureDays >= rule.DetectionDaysStart && captureDays <= rule.DetectionDaysEnd {
|
return rule.Name
|
}
|
}
|
return rules[1].Name
|
}
|
|
// SetFrequentAddress 方法计算出现最频繁的出行地址并设置为常用地址
|
func SetFrequentAddress(c *db.CaptureInfo) {
|
outAddressCounts := make(map[string]int)
|
inAddressCounts := make(map[string]int)
|
// 统计每个出行地址的出现次数
|
for _, detail := range c.CaptureDetail {
|
if detail.Direction == "out" {
|
outAddressCounts[detail.CaptureAddress]++
|
}
|
if detail.Direction == "in" {
|
inAddressCounts[detail.CaptureAddress]++
|
}
|
}
|
|
// 找到出现次数最多的出行地址
|
maxOutCount := 0
|
var frequentAddress string
|
for address, count := range outAddressCounts {
|
if count > maxOutCount {
|
maxOutCount = count
|
frequentAddress = address
|
}
|
}
|
if frequentAddress == "" {
|
maxInCount := 0
|
for address, count := range inAddressCounts {
|
if count > maxInCount {
|
maxInCount = count
|
frequentAddress = address
|
}
|
}
|
}
|
// 将出现次数最多的出行地址设置为常用地址
|
c.FrequentAddress = frequentAddress
|
}
|
|
// processData 函数处理数据,根据要求过滤掉数据并根据规则更新状态
|
func ProcessData(captureInfos []db.CaptureInfo, personStatus []db.PersonStatus, ruleInfos []db.PersonnelStatusRule, communityID string) []db.PersonStatus {
|
filteredInfos := make([]db.PersonStatus, 0)
|
|
// 构建快速查找索引,方便查找对应的人员状态和规则
|
statusIndex := make(map[string]db.PersonStatus)
|
ruleIndex := make(map[string]db.PersonnelStatusRule)
|
|
for _, person := range personStatus {
|
statusIndex[person.DocumentNumber] = person
|
}
|
|
for _, rule := range ruleInfos {
|
ruleIndex[rule.Name] = rule
|
}
|
|
// 处理每个抓拍信息
|
for _, info := range captureInfos {
|
//fmt.Println("info", info.DocumentNumber, info.Status, info.FrequentAddress)
|
//fmt.Println("person", statusIndex[info.DocumentNumber].DocumentNumber, statusIndex[info.DocumentNumber].Status, statusIndex[info.DocumentNumber].FrequentAddress)
|
// 检查是否存在对应的人员状态
|
person, ok := statusIndex[info.DocumentNumber]
|
if !ok {
|
// 不存在对应的人员状态为新数据
|
filteredInfos = append(filteredInfos, db.PersonStatus{CommunityID: communityID, DocumentNumber: info.DocumentNumber, Status: info.Status, FrequentAddress: info.FrequentAddress})
|
continue
|
}
|
|
// 判断状态和常用地址是否相等,如果相等则忽略
|
if (info.Status == person.Status || info.CaptureDays <= ruleIndex[person.DocumentNumber].DetectionDaysEnd) &&
|
info.FrequentAddress == person.FrequentAddress {
|
continue
|
}
|
|
// 更新过滤后的信息列表
|
filteredInfos = append(filteredInfos, db.PersonStatus{CommunityID: communityID, DocumentNumber: info.DocumentNumber, Status: info.Status, FrequentAddress: info.FrequentAddress})
|
|
}
|
|
return filteredInfos
|
}
|