panlei
2019-11-07 23c837bc4d5b4312c0bb5eb96260c90e887882ac
git add .
1个文件已修改
32 ■■■■■ 已修改文件
ruleserver/ruleToformula.go 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruleserver/ruleToformula.go
@@ -213,6 +213,7 @@
        if result.(bool) {
            // 最后过持续时间等时间维度的条件   把时间规则位置调整到这个位置是为了缓存数据
            cacheId := ""
            for j := 0; j < len(groupRule.Rules); j++ {
                for _, sdkData := range args.Sdkdata {
                    sdk, err := cache.GetSdkById(groupRule.Rules[j].SdkId)
@@ -223,7 +224,7 @@
                    if ipcId == sdkData.IpcId {
                        for _, areaMap := range sdkData.AreaMapList {
                            // 去开启一个定时器
                            duration(groupRule.Rules[j], groupRule.GroupId, areaMap, args, message)
                            cacheId = duration(groupRule.Rules[j], groupRule.GroupId, areaMap, args, message)
                        }
                    }
                }
@@ -284,6 +285,28 @@
                    //logger.Info("-------------------face结果标签", len(args.RuleResult["face"].([]FaceResult)))
                    labelTypes = append(labelTypes,1)
                }
                // 给持续时间的第一张赋予缓存数据(遍历复制)
                if cacheId != "" { // 有这帧数据的缓存
                    tempMap := make(map[string]interface{})
                    for k, result := range args.RuleResult {
                        if k == "yolo" {
                            tempMap[k] = []structure.Result{}
                            for _, res := range result.([]structure.Result) {
                                tempMap[k] = append(tempMap[k].([]structure.Result), res)
                            }
                        }
                        if k == "face" {
                            tempMap[k] = []structure.FaceResult{}
                            for _, res := range result.([]structure.FaceResult) {
                                tempMap[k] = append(tempMap[k].([]structure.FaceResult), res)
                            }
                        }
                    }
                    rw.Lock()
                    TimeEleList[cacheId].CacheSdkData.RuleResult = tempMap
                    rw.Unlock()
                }
                return true,labelTypes
            } else {
                return false,[]int{}
@@ -624,7 +647,8 @@
}
// 如果有持续时间条件维护开启一个定时器
func duration(rule *protomsg.Rule, groupId string, am *structure.AreaMap, args *structure.SdkDatas, message *protomsg.SdkMessage) {
func duration(rule *protomsg.Rule, groupId string, am *structure.AreaMap, args *structure.SdkDatas, message *protomsg.SdkMessage) string{
    cacheId := ""
    if rule.PolygonId == am.AreaId { // 首先规则所对应的区域id要跟区域数据的id对的上  配置的算法要对的上
        if rule.SdkArgAlias == "duration" { //
            logger.Info("当前小规则是:---------", rule)
@@ -640,14 +664,16 @@
            if flag {
                timeLength, _ := strconv.Atoi(rule.SdkArgValue)
                timeEle := TimeElement{N: timeLength, InitN: timeLength, AlarmFlag: false, BufferFlag: 10, CacheSdkData: structure.ResultMsg{message, args.RuleResult}} // 扔进去一个定时器元素(并缓存当前画面帧数据)
                timeEle := TimeElement{N: timeLength, InitN: timeLength, AlarmFlag: false, BufferFlag: 10, CacheSdkData: structure.ResultMsg{message, nil}} // 扔进去一个定时器元素(并缓存当前画面帧数据)
                //TimeEleList = make(map[string]timeElement)
                TimeEleList[groupId+"+"+rule.Id] = &timeEle // 定时器元素以当前持续时间小规则id为键
                logger.Info("创建了计数器")
                cacheId = groupId+"+"+rule.Id
            }
            rw.Unlock()
        }
    }
    return cacheId
}
// 给数据库的规则表达式代参 args: 一条子规则,区域数据