sunty
2024-09-04 b88f052edf3c6921aa7a52f53144c202af266957
data/prepare.go
@@ -4,6 +4,7 @@
   "fmt"
   "regexp"
   "ruleModelEngine/db"
   "strings"
   "time"
)
@@ -65,59 +66,87 @@
   return rules[1].Name
}
// 获取常用地址
func getfrAddress(pointAddress map[string]int) string {
   maxCount := 0
   maxCountAddress := ""
   re, _ := regexp.Compile(`\b1F\b`)
   for address, count := range pointAddress {
      matchFlag := re.MatchString(address)
      if address == "" || matchFlag == true {
         continue
      }
      if count > maxCount {
         maxCount = count
         maxCountAddress = address
      }
   }
   return maxCountAddress
}
// SetFrequentAddress 方法计算出现最频繁的出行地址并设置为常用地址
func GetFrequentAddress(captureDetail []db.CaptureDetail) string {
   outAddressCounts := make(map[string]int)
   inAddressCounts := make(map[string]int)
   // 统计每个出行地址的出现次数
   for _, detail := range captureDetail {
      if detail.Direction == "out" {
         outAddressCounts[detail.CaptureAddress]++
      }
      if detail.Direction == "in" {
         inAddressCounts[detail.CaptureAddress]++
      }
   }
   // 找到出现次数最多的出行地址
   maxOutCount := 0
   maxTotalCount := 0
   var frequentAddress string
   floor1AddressCount := 0
   pointDate := ""
   pointAddress := make(map[string]int, 0)
   dateAddress := make(map[string]string, 0)
   floor1Address := ""
   for address, count := range outAddressCounts {
      maxTotalCount = maxTotalCount + count
      re, _ := regexp.Compile(`\b1F\b`)
      if re.MatchString(address) {
         if count > floor1AddressCount {
            floor1Address = address
            floor1AddressCount = count
   captureDays := make(map[string]int, 0)
   var frequentAddress string
   re, _ := regexp.Compile(`\b1F\b`)
   for index, detail := range captureDetail {
      //fmt.Println("抓拍地址:", detail.CaptureAddress)
      //fmt.Println("抓拍日期:", detail.CaptureDate)
      dateStr := strings.Split(detail.CaptureDate, " ")[0]
      captureDays[dateStr]++
      matchFlag := re.MatchString(detail.CaptureAddress)
      if matchFlag {
         floor1Address = detail.CaptureAddress
      }
      //判断日期标是否满足条件
      if pointDate == "" {
         pointDate = dateStr
         pointAddress[detail.CaptureAddress]++
         //若为最后一条则计算常用地址
         if index == len(captureDetail)-1 {
            //fmt.Println("处理前pointAddress表:", pointAddress)
            dateAddress[pointDate] = detail.CaptureAddress
         }
         continue
      }
      //若日期标相等则为同一天,地址标数组楼层计数+1
      if pointDate == dateStr {
         pointAddress[detail.CaptureAddress]++
         if index == len(captureDetail)-1 {
            //fmt.Println("处理前pointAddress表:", pointAddress)
            dateAddress[pointDate] = getfrAddress(pointAddress)
         }
         //不相等则为新的日期,首先计算出当日的常用地址,然后重新初始化日期标和地址标数组
      } else {
         if index == len(captureDetail)-1 {
            pointAddress[detail.CaptureAddress]++
            //fmt.Println("处理前pointAddress表:", pointAddress)
            dateAddress[pointDate] = getfrAddress(pointAddress)
            continue
         }
      }
      if count > maxOutCount {
         maxOutCount = count
         frequentAddress = address
         dateAddress[pointDate] = getfrAddress(pointAddress)
         pointDate = dateStr
         pointAddress = make(map[string]int, 0)
      }
   }
   if frequentAddress == "" && floor1Address != "" {
   //fmt.Println("抓拍地址待处理结构表:", dateAddress)
   //fmt.Println("dareAddress len: ", len(dateAddress))
   if float64(len(dateAddress))/float64(len(captureDays))*100 >= 50 {
      addressCount := make(map[string]int)
      for _, address := range dateAddress {
         addressCount[address]++
      }
      frequentAddress = getfrAddress(addressCount)
   } else {
      frequentAddress = floor1Address
   }
   if frequentAddress != "" && floor1Address != "" {
      if (float64(floor1AddressCount)/float64(maxTotalCount))*100 > 90 {
         frequentAddress = floor1Address
      }
   }
   if frequentAddress == "" {
      maxInCount := 0
      for address, count := range inAddressCounts {
         if count > maxInCount {
            maxInCount = count
            frequentAddress = address
         }
      }
      frequentAddress = floor1Address
   }
   //fmt.Println("in address: ", inAddressCounts)
   //fmt.Println("out address: ", outAddressCounts)