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 }