sunty
2024-09-05 8286117e3435781401bc6d722095fa033c0704b2
补充地址计算规则
2个文件已修改
125 ■■■■ 已修改文件
data/prepare.go 85 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rule/service.go 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
data/prepare.go
@@ -70,10 +70,14 @@
func getfrAddress(pointAddress map[string]int) string {
    maxCount := 0
    maxCountAddress := ""
    re, _ := regexp.Compile(`\b1F\b`)
    re1F, _ := regexp.Compile(`\b1F\b`)
    reNoF, _ := regexp.Compile(`^[^F]*$`)
    reNegF := regexp.MustCompile(`-`)
    for address, count := range pointAddress {
        matchFlag := re.MatchString(address)
        if address == "" || matchFlag == true {
        matchFlag1F := re1F.MatchString(address)
        matchFlagNoF := reNoF.MatchString(address)
        matchFlagNegF := reNegF.MatchString(address)
        if address == "" || matchFlag1F || matchFlagNoF || matchFlagNegF {
            continue
        }
        if count > maxCount {
@@ -87,70 +91,109 @@
// SetFrequentAddress 方法计算出现最频繁的出行地址并设置为常用地址
func GetFrequentAddress(captureDetail []db.CaptureDetail) string {
    // 统计每个出行地址的出现次数
    //pointDate 靶标日期,pointAddress靶标地址
    pointDate := ""
    pointAddress := make(map[string]int, 0)
    //dateAddress 按日期汇总单日常用地址
    dateAddress := make(map[string]string, 0)
    //floor1Address 后备地址,为1楼地址
    floor1Address := ""
    //captureDays 按日期去重统计总抓拍天数
    captureDays := make(map[string]int, 0)
    //frequentAddress 最终设置的常用地址
    var frequentAddress string
    re, _ := regexp.Compile(`\b1F\b`)
    //正则 判断地址是否包含1F字样,完全匹配
    re1F, _ := regexp.Compile(`\b1F\b`)
    reNoF, _ := regexp.Compile(`^[^F]*$`)
    // 遍历所有抓拍数据
    for index, detail := range captureDetail {
        //fmt.Println("抓拍地址:", detail.CaptureAddress)
        //fmt.Println("抓拍日期:", detail.CaptureDate)
        //dateStr截取的日期,为YYYY-MM-DD
        dateStr := strings.Split(detail.CaptureDate, " ")[0]
        //去重统计抓拍天数 captureDays
        captureDays[dateStr]++
        matchFlag := re.MatchString(detail.CaptureAddress)
        if matchFlag {
        //匹配是否是1F
        matchFlag1F := re1F.MatchString(detail.CaptureAddress)
        matchFlagNoF := reNoF.MatchString(detail.CaptureAddress)
        if matchFlag1F {
            //如果是, 提前设置好备用地址 floor1Address = detail.CaptureAddress
            floor1Address = detail.CaptureAddress
        }
        //判断日期标是否满足条件
        if matchFlagNoF && floor1Address != "" {
            //如果是, 提前设置好备用地址 floor1Address = detail.CaptureAddress
            floor1Address = detail.CaptureAddress
        }
        //判断日期标是否满足条件 判断日期标是否为空,若为空表示是第一个元素,初始化日期靶标
        if pointDate == "" {
            //初始化日期靶标为当前日期
            pointDate = dateStr
            //把当前日期的
            pointAddress[detail.CaptureAddress]++
            //若为最后一条则计算常用地址
            //若为最后一条则计算单日常用地址
            if index == len(captureDetail)-1 {
                //fmt.Println("处理前pointAddress表:", pointAddress)
                fmt.Println("处理前pointAddress表:", pointAddress)
                //这代表仅有一条数据,将会直接把当前地址加入dateAddress 日期汇总单日常用地址表内 下方continue会直接结束循环
                //否则会初始化pointDate和pointAddress
                dateAddress[pointDate] = detail.CaptureAddress
            }
            continue
        }
        //若日期标相等则为同一天,地址标数组楼层计数+1
        //若日期标相等则为同一天
        if pointDate == dateStr {
            //pointAddress靶标日期数组对应楼层地址数+1
            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)
                fmt.Println("处理前pointAddress表:", pointAddress)
                //计算单日常用地址 若地址内都为1F或者空地址,会返回空地址
                dateAddress[pointDate] = getfrAddress(pointAddress)
                continue
            }
            //不相等则为新的日期,首先计算出当日的常用地址,然后重新初始化日期标和地址标数组
        } else {
            //若为最后一条则计算单日常用地址
            if index == len(captureDetail)-1 {
                //把当前最后一条加入    pointAddress靶标地址
                pointAddress[detail.CaptureAddress]++
                //
                fmt.Println("处理前pointAddress表:", pointAddress)
                //计算单日常用地址 若地址内都为1F或者空地址,会返回空地址
                dateAddress[pointDate] = getfrAddress(pointAddress)
                continue
            }
            //不为最后一条表示这是新的一天的抓拍地址数据,需要计算之前一天的单日常用地址
            dateAddress[pointDate] = getfrAddress(pointAddress)
            //初始化新的一天的靶标日期和pointAddress 靶标地址数组
            pointDate = dateStr
            pointAddress = make(map[string]int, 0)
        }
    }
    //fmt.Println("抓拍地址待处理结构表:", dateAddress)
    //fmt.Println("dareAddress len: ", len(dateAddress))
    fmt.Println("抓拍地址待处理结构表:", dateAddress)
    fmt.Println("dareAddress len: ", len(dateAddress))
    //判断抓拍的非1楼非空的天数占比总天数
    if float64(len(dateAddress))/float64(len(captureDays))*100 >= 50 {
        fmt.Println("非1楼非空抓拍占比: ", float64(len(dateAddress))/float64(len(captureDays))*100)
        //初始化地址列表,按地址计数
        addressCount := make(map[string]int)
        //遍历之前汇总的单日常用地址列表
        for _, address := range dateAddress {
            //对应地址数+1
            addressCount[address]++
        }
        //复制常用地址给最终结果,若地址内都为1F或者空地址,会返回空地址
        frequentAddress = getfrAddress(addressCount)
    } else {
        //若不满足非1楼非空抓拍占比,则直接把备用地址(1F)赋值给最终结果
        frequentAddress = floor1Address
    }
    //若存在满足非1楼非空抓拍占比,但是最终结果是空地址,则赋值备用地址(1F)为最终结果
    if frequentAddress == "" {
        frequentAddress = floor1Address
    }
    //fmt.Println("in address: ", inAddressCounts)
    //fmt.Println("out address: ", outAddressCounts)
    //fmt.Println("final address: ", frequentAddress)
    fmt.Println("final address: ", frequentAddress)
    return frequentAddress
}
rule/service.go
@@ -2,7 +2,9 @@
import (
    "basic.com/valib/logger.git"
    "encoding/csv"
    "fmt"
    "os"
    "ruleModelEngine/cache"
    "ruleModelEngine/config"
    "ruleModelEngine/data"
@@ -30,6 +32,39 @@
//    }
//    return true
//}
func writeCSV(filename string, data []db.CaptureInfo) error {
    file, err := os.Create(filename)
    if err != nil {
        return err
    }
    defer file.Close()
    writer := csv.NewWriter(file)
    defer writer.Flush()
    // Write header
    header := []string{"档案编号", "抓拍天数", "过夜天数", "分类", "常用地址"}
    if err := writer.Write(header); err != nil {
        return err
    }
    // Write data
    for _, info := range data {
        record := []string{
            info.DocumentNumber,
            strconv.Itoa(info.CaptureDays),
            strconv.Itoa(info.OvernightStays),
            info.Status,
            info.FrequentAddress,
        }
        if err := writer.Write(record); err != nil {
            return err
        }
    }
    return nil
}
func executeEnteringButNotLeaving(communityId string) {
    //进出异常布控任务,暂时归类到标签计算部分
@@ -170,8 +205,13 @@
            }
            captureInfos[i].Age = age
            captureInfos[i].FrequentAddress = data.GetFrequentAddress(captureInfos[i].CaptureDetail)
            //fmt.Println("CaptureDetail: ", captureInfos[i].DocumentNumber, captureInfos[i].CaptureDays, captureInfos[i].CaptureDetail)
        }
        //err1 := writeCSV("report.csv", captureInfos)
        //if err != nil {
        //    fmt.Println(err1)
        //}
        //continue
        //fmt.Println("residentCount: ", residentCount)
        //fmt.Println("captureInfosQ: ", captureInfos)