sunty
2024-09-04 b88f052edf3c6921aa7a52f53144c202af266957
修改地址计算策略
2个文件已修改
114 ■■■■■ 已修改文件
data/prepare.go 113 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rule/service.go 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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)
rule/service.go
@@ -172,6 +172,7 @@
            captureInfos[i].FrequentAddress = data.GetFrequentAddress(captureInfos[i].CaptureDetail)
            //fmt.Println("CaptureDetail: ", captureInfos[i].DocumentNumber, captureInfos[i].CaptureDays, captureInfos[i].CaptureDetail)
        }
        //continue
        //fmt.Println("residentCount: ", residentCount)
        //fmt.Println("captureInfosQ: ", captureInfos)
        for _, identity := range labeManage {