From 847983cd82cff288e5b610d2bbcebbdb0398f1d6 Mon Sep 17 00:00:00 2001 From: panlei <2799247126@qq.com> Date: 星期六, 22 六月 2019 17:02:43 +0800 Subject: [PATCH] 补充不画区域时的情形 --- ruleserver/ruleToformula.go | 588 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 588 insertions(+), 0 deletions(-) diff --git a/ruleserver/ruleToformula.go b/ruleserver/ruleToformula.go new file mode 100644 index 0000000..e4be299 --- /dev/null +++ b/ruleserver/ruleToformula.go @@ -0,0 +1,588 @@ +package ruleserver + +import ( + "encoding/json" + "fmt" + "sort" + "strconv" + "strings" + "time" + + "basic.com/dbapi.git" + "basic.com/pubsub/protomsg.git" + "github.com/knetic/govaluate" +) + +// 浠诲姟 +type Task struct { + camID string //鎽勫儚鏈篒D + taskID string //浠诲姟ID + sdkID string //绠楁硶ID + areaId string //鍖哄煙id + areaName string //鍖哄煙鍚嶇О + topicType string //瑙勫垯涓婚绫诲瀷锛岀洰鏍�/鎸佺画鏃堕棿/鐏垫晱搴︾瓑 +} + +// 鏁版嵁搴撲腑鐨勮鍒欏厓绱� +type SingleRule struct { + Task + operatorType string // 鎿嶄綔绗︼紝>=,==... + compareType string // 瀵规瘮绫诲瀷锛屽�硷紝琚�夐」 + compareValue string // 瀵规瘮鐨勫�� + ruleWithPrevious string // 璺熶笂涓�鏉$殑閫昏緫鍏崇郴 + groupId string // 澶ц鍒檌d +} + +// 鏁版嵁搴撲腑鍗曟潯瀛愯鍒� 璺熸暟鎹簱鏄犲皠鐨� +type CameraTaskArg struct { + Id string `json:"id"` + CameraTaskId string `json:"camera_task_id"` + CameraId string `json:"camera_id"` + PolygonId string `json:"polygon_id"` + SdkId string `json:"sdk_id"` + SdkArgAlias string `json:"sdk_arg_alias"` + Operator string `json:"operator"` //鎿嶄綔绗︼紝>=,==... + OperatorType string `json:"operator_type"` //瀵规瘮绫诲瀷锛屽�硷紝琚�夐」 + SdkArgValue string `json:"sdk_arg_value"` //瀵规瘮鐨勫�� + Sort int `json:"sort"` + RuleWithPrevious string `json:"rule_with_previous"` //璺熶笂涓�鏉$殑閫昏緫鍏崇郴 + GroupId string `json:"group_id"` //澶ц鍒檌d +} + +// sdk杈撳嚭鐨勫浘鐗囨彁鍙栧弬鏁版暟鎹箣鍚庣殑鏁版嵁闆嗗悎锛屼篃鏄紶缁欎笅涓�姝ョ敤浜庤祴鍊肩殑鏁版嵁闆嗗悎 +type AreaMapList struct { + areaMapList []AreaMap +} + +// 姣忎釜鐩爣鐨勫弬鏁帮細鐩镐技搴︼紝鍗犳瘮锛屽昂瀵� +type Arg struct { + id string + score float64 // 鍖哄煙鍐呯殑鐩爣鐨勭浉浼煎害 + proportion float64 // 鍖哄煙鍐呯殑鐩爣鐨勫崰姣� + size float64 // 鍖哄煙鍐呯殑鐩爣鐨勫昂瀵� +} + +// 姣忎釜鍖哄煙鍐呯殑鍥剧墖鏁版嵁闆嗗悎 +type AreaMap struct { + cameraId string + areaId string + groupId string + taskId string + sdkIds []string + areaJson string + triggerLine string + directionLine string + targetNum int // 鍖哄煙鍐呯洰鏍囨暟閲� + args []Arg // 鍖哄煙鍐呯洰鏍囩殑鍙傛暟闆嗗悎 + filterData []Arg // 杩囨护鍚庡尯鍩熷唴鐩爣闆嗗悎 + time string // 褰撳墠鏃堕棿锛堢敤浠ュ尮閰嶆椂闂磋鍒欙級 + keepRight bool // 鏄惁闈犲彸琛� + isStatic bool // 鏄惁闈欐 +} + +// sdk杈撳嚭鐨勫浘鐗囦笂鍗曚釜鐩爣鐨勬暟鎹� +type PhotoMap struct { + Rects Rect // 鐭╁舰鍖哄煙鍙傛暟 + Score float64 // 鐩镐技搴﹀緱鍒� +} + +// 浠庨�氶亾涓幏鍙栫殑sdk杈撳嚭鐨勫浘鍍忔暟鎹�(鐩墠涓昏鏄痽olo绠楁硶鐨勬暟鎹�) +type ArgsFromSdk struct { + CameraId string + TaskId string + Photo []PhotoMap // yolo绠楁硶缁撴瀯锛屼篃鍙互瀛樹汉鑴哥殑鏁版嵁锛屾瘯绔熶汉鑴镐腑鑳界敤瑙勫垯鏉ユ祴鐨勮繕鏄偅浜涘弬鏁� + KeepRight bool // 鏄惁闈犲彸琛� 绠楁硶鍒ゆ柇鐨勪笌涓婁竴甯у浘鍍忕殑姣旇緝缁撴灉 + IsStatic bool // 鏄惁闈欐 + ImageWidth int // 鎽勫儚鏈烘媿鎽勭殑鍥惧儚瀹� 鍍忕礌 + ImageHeight int // 鎽勫儚鏈烘媿鎽勭殑鍥惧儚楂� 鍍忕礌 + RuleResult []Result // 杩囧畬瑙勫垯鍚庢墦鐨勬爣绛� +} + +// 灏嗕紶閫掕繃鏉ョ殑鍙傛暟杞寲涓� +//protomsg.SdkMessage.TaskLabel.SdkmsgWithTask.sdkdata + +type ResultMsg struct { + protomsg.SdkMessage + RuleResult []Result // 杩囧畬瑙勫垯鍚庢墦鐨勬爣绛� +} + +// 杩囪鍒欏簱鎵撲笂鐨勬爣绛� +type Result struct { + TaskId string // 浠诲姟id + RuleGroupId string // 瑙勫垯缁刬d + AlarmLevel int32 // 鎶ヨ绛夌骇 + RuleText string // 鏂囧瓧鐗堣鍒欑粍 +} + +// 鍖呭惈N鏉¤鍒欏厓绱犵殑涓�鏁存潯瑙勫垯 +type CompleteRule struct { + rule string +} + +// 鏍规嵁鎽勫儚鏈篿d鎷垮埌鎽勫儚鏈烘墍鏈夊尯鍩� +func GetPolygons(cameraId string) []protomsg.CameraPolygon { + var api dbapi.CameraApi + data := api.FindAllPolygons() + //fmt.Println("鏌ュ埌鐨勬墍鏈夊尯鍩燂細", data) + // 鏍规嵁id浠巑ap涓嬁鍒板尯鍩� + var cameraPolygons []protomsg.CameraPolygon + for _, item := range data { + if item.CameraId == cameraId { + // 闇�瑕佹牴鎹瘮渚嬫妸鍓嶅彴鐢荤殑鍖哄煙鐨勫潗鏍囪浆鍖栦负鐩稿簲鎽勫儚鏈烘媿鎽勭殑鍥惧儚鐨勫ぇ灏� x鍧愭爣鍒嗗埆*image.width/椤甸潰鍖哄煙瀹� y鍧愭爣鍒嗗埆*image.height/椤甸潰鍖哄煙楂� + // 鍓嶅彴瀹介珮鍥哄畾 + cameraPolygons = append(cameraPolygons, item) + } + } + //log.Println("鏍规嵁鎽勫儚鏈篿d鏌ュ埌鐨勫尯鍩�", cameraPolygons, "--鍖哄煙鏁伴噺涓猴細", len(cameraPolygons)) + return cameraPolygons +} + +// 瑙勫垯涓诲嚱鏁板叆鍙� +func MainJudge(arg *ArgsFromSdk) { + cameraPolygons := GetPolygons(arg.CameraId) + list := AreaMapList{} + for _, polygon := range cameraPolygons { + areaMap := AreaMap{cameraId: arg.CameraId, areaId: polygon.Id, areaJson: polygon.Polygon, triggerLine: polygon.TriggerLine, directionLine: polygon.DirectionLine} + // 涓烘瘡涓憚鍍忔満鍖哄煙濉厖鏁版嵁 + areaMap.CountAreaObjs(arg) + list.areaMapList = append(list.areaMapList, areaMap) + } + //fmt.Println("涓烘瘡涓憚鍍忔満鍖哄煙濉厖鏁版嵁鍚庣殑鍐呭", list.areaMapList) + // 灏嗘甯ф暟鎹寜鎽勫儚鏈哄尯鍩熷垎绫绘墦鍖呭悗鍒ゆ柇鏄惁鎶ヨ + judge(&list, arg) +} + +// 璁$畻鍖哄煙鍐呯殑鐩爣鏁伴噺浠ュ強灏嗙浉浼煎害銆佸崰姣斻�佸昂瀵哥瓑鎵撳寘 +func (a *AreaMap) CountAreaObjs(arg *ArgsFromSdk) { + + a.targetNum = 0 + threshold := 0.0 // 鐩镐技搴� + intersectionper := 0.2 // 鍗犳瘮 + size := 0.0 // 灏哄 + + areaPoints := Json2points(a.areaJson) + widthScale := float64(arg.ImageWidth / 960) + heigthScale := float64(arg.ImageHeight / 540) + // for _, sdkInfo := range arg.SdkMessage.Tasklab.Sdkinfos { + // if sdkInfo.Sdktype == "yolo" { + // //sdkInfo.Sdkdata. + // } + + // } + for _, obj := range arg.Photo { + if threshold <= obj.Score && + size <= float64(obj.Rects.Width*obj.Rects.Height) && + intersectionper <= PgsInterPercent(areaPoints, obj.Rects, widthScale, heigthScale) { + // 杩欐瑕佸榻愯〃杈惧紡閲屾墍闇�瑕佺殑鎵�鏈夊弬鏁� + a.targetNum++ + arg := Arg{score: obj.Score, proportion: PgsInterPercent(areaPoints, obj.Rects, widthScale, heigthScale), size: float64(obj.Rects.Width * obj.Rects.Height)} + a.args = append(a.args, arg) + a.filterData = append(a.filterData, arg) + } + } + a.time = time.Unix(time.Now().Unix(), 0).String()[11:16] + a.keepRight = arg.KeepRight + a.isStatic = arg.IsStatic +} + +// 灏嗗瓧绗︿覆鏍煎紡鐨勫潗鏍囧簭鍒楀寲涓篜oint鏍煎紡 +func Json2points(areaPoints string) []Point { + var pts []Point + if areaPoints == "" { + pts = append(pts,Point{0,0}) + pts = append(pts,Point{0,540}) + pts = append(pts,Point{960,540}) + pts = append(pts,Point{960,0}) + } else { + err := json.Unmarshal([]byte(areaPoints), &pts) + if err != nil { + fmt.Println("json.Unmarshal閿欒", err) + panic("搴忓垪鍖栧潗鏍囧紓甯革紝绋嬪簭閫�鍑�") + } + } + return pts +} + +// 浠ユ憚鍍忔満id鏌ュ嚭璺熷叾鐩稿叧鐨勬墍鏈変换鍔′笅鐨勮鍒欑粍 +func GetRuleGroup(cameraId string) []*protomsg.TaskGroupArgs { + // 鏌ヨ鏁版嵁搴� + // 绗竴姝ユ煡鍑鸿窡杩欎釜鎽勫儚鏈虹浉鍏崇殑group_id(澶ц鍒�) + var api dbapi.CameraTaskArgsApi + all := api.FindAll() + //fmt.Println("鎵�鏈夎鍒�:", all) + var taskArgs []*protomsg.TaskGroupArgs + for _, taskArg := range all { + if taskArg.CameraId == cameraId { + taskArgs = taskArg.TaskArgs + } + } + return taskArgs +} + +// 鑱斿姩浠诲姟鐨勫鐞� +func linkTask(aml *AreaMapList, arg *ArgsFromSdk, groupRule *protomsg.GroupRule, taskId string) { + // new涓�涓畾鏃跺櫒锛屽鏋滀互姝roupId涓烘爣蹇楃殑瀹氭椂鍣ㄤ笉瀛樺湪鐨勮瘽 + var flag bool = true + var timeEle = TimeElement{N: 3, InitN: 3, GroupId: groupRule.GroupId} + for k, timeEle1 := range TimeEleList { + if k == groupRule.GroupId { + flag = false // 宸茬粡鏈変簡杩欎釜瀹氭椂鍣ㄥ氨缃负false 涓嶅啀鏂板 + timeEle = *timeEle1 + } + } + if flag { // 濡傛灉杩樻病鏈夎繖涓畾鏃跺櫒鍏冪礌灏辨柊澧炰竴涓� + timeEle := TimeElement{N: 3, InitN: 3, GroupId: groupRule.GroupId} // 鎵旇繘鍘讳竴涓畾鏃跺櫒鍏冪礌 + //TimeEleList = make(map[string]timeElement) + TimeEleList[groupRule.GroupId] = &timeEle // 瀹氭椂鍣ㄥ厓绱犱互瑙勫垯缁刬d涓洪敭 + fmt.Println("鍒涘缓浜嗚鏁板櫒骞朵笖璁℃暟鍣ㄩ泦鍚堜负锛�", TimeEleList) + // 寰楀嚭杩欑粍瀹屾暣瑙勫垯閲屾秹鍙婂埌鍑犱釜鎽勫儚鏈猴紝鍐冲畾鐫�鏁扮粍閲屾湁鍑犱釜缁撴瀯浣�,鍘婚噸娣诲姞鏂瑰紡 + for j := 0; j < len(groupRule.Rules); j++ { + var flag1 bool = false + for _, ruleRes := range TimeEleList[groupRule.GroupId].RuleResults { + if groupRule.Rules[j].CameraId == ruleRes.CameraId { + flag1 = true + } + } + if flag1 { + TimeEleList[groupRule.GroupId].RuleResults = append(TimeEleList[groupRule.GroupId].RuleResults, &RuleResult{groupRule.Rules[j].CameraId, groupRule.Rules[j].Sort, "", groupRule.Rules[j].RuleWithPre}) + } + } + } + // 寰�鏁扮粍閲岃祴鍊� + isOk := singleTask(aml, arg, groupRule, taskId) + if isOk { + fmt.Println("杩欏抚鍥惧儚鍦ㄤ换鍔′笅鐨勪竴鏁存潯瑙勫垯涓嬶紙鑱斿姩浠诲姟涓嬪氨鏄窡鏈憚鍍忔満鍍忕浉鍏崇殑灏忚鍒欙級鐨勫垽鏂粨鏋滀负true") + // 鏍规嵁cameraId鍘绘洿鏂版垨鑰呮彃鍏ョ粨鏋�,鐒跺悗鍒ゆ柇鏄惁鏁扮粍鏄惁鍙互寰楀嚭鎶ヨ鐨勭粨璁� + // 寰�鑱斿姩浠诲姟鐨勭粨鏋滄暟缁勯噷鏀惧�兼垨鏇存柊 + for _, va := range timeEle.RuleResults { + if arg.CameraId != "" && va.CameraId == arg.CameraId { + va.Result = strconv.FormatBool(isOk) + } + } + // 鍒ゆ柇缁撴灉鏁扮粍鏄惁瀹屾弧鍙緱鍑烘姤璀︾粨鏋� + var isPerfect = true + for _, va := range timeEle.RuleResults { + if va.Result == "" && va.RuleWithPre != "||" { + isPerfect = false + } + } + if isPerfect { + // 灏嗘暟缁勬寜sort鎺掑簭 + sort.Sort(SubList(timeEle.RuleResults)) + // 鎺掑簭鍚庡彇鍚勮嚜鐨勭粨鏋滃拰杩炴帴绗︽嫾鍑鸿鍒欒〃杈惧紡寰楀嚭缁撴灉 + completeFormula := "" + for _, va := range timeEle.RuleResults { + completeFormula = completeFormula + va.RuleWithPre + "" + va.Result + } + if completeFormula != "" { + expression, _ := govaluate.NewEvaluableExpression(completeFormula) + result, _ := expression.Evaluate(nil) // 寰楀埌鏁板鍏紡鐨勭粨鏋� + if result.(bool) { + // 杩囧畬瑙勫垯鍚庢墦涓爣绛撅紝鍛婅瘔璋冪敤鑰呮湰甯ф暟鎹拡瀵瑰摢涓换鍔″摢缁勮鍒欐姤璀︿簡 + arg.RuleResult = append(arg.RuleResult, Result{TaskId: taskId, RuleGroupId: groupRule.GroupId}) + } + } + } else { + fmt.Println("鏁扮粍涓嶅渾婊′笉鎵撴爣绛�") + } + } else { // 娌℃湁鎶ヨ锛� + fmt.Println("杩欏抚鍥惧儚鍦ㄤ换鍔′笅鐨勪竴鏁存潯瑙勫垯涓嬶紙鑱斿姩浠诲姟涓嬪氨鏄窡鏈憚鍍忔満鍍忕浉鍏崇殑灏忚鍒欙級鐨勫垽鏂粨鏋滀负false") + // 鎵�浠ヤ篃瑕佸幓缁撴灉鏁扮粍閲屾斁鍊兼垨鏇存柊 + for _, va := range timeEle.RuleResults { + if arg.CameraId != "" && va.CameraId == arg.CameraId { // arg.CameraId 闅忎究鎵句竴涓暟鎹� + va.Result = strconv.FormatBool(isOk) + } + } + // 鍥犱负鏈抚鏁版嵁涓嶇鍚堣鍒欙紝鎵�浠ヤ篃涓嶇敤缁熻缁撴灉鏁扮粍閲岀殑涓滆タ + } +} + +// 鐙珛浠诲姟 +func singleTask(aml *AreaMapList, arg *ArgsFromSdk, groupRule *protomsg.GroupRule, taskId string) bool { + var completeFormula string = "" + for _, areaMap := range aml.areaMapList { + for j := 0; j < len(groupRule.Rules); j++ { + // 鍏堣繃瀹屾潯浠舵暟鎹� + filterRule(groupRule.Rules[j], &areaMap) + } + for j := 0; j < len(groupRule.Rules); j++ { + // 鍐嶈繃鍏朵粬鏁版嵁 杩欐鐩存帴寰楀埌缁撴灉锛堢湡鎴栧亣锛� 杩囩洰鏍囨暟閲� + flag := transferParameters(groupRule.Rules[j], &areaMap) + if flag != "" { + fmt.Println("寰楀嚭鐨勭粨鏋�", flag) + completeFormula = completeFormula + groupRule.Rules[j].RuleWithPre + "" + flag + } + } + if completeFormula == "" { + flag := splice1(&areaMap) + if flag != "" { + fmt.Println("寮鸿鎷煎噾涓�涓汉鏁版槸鍚﹀ぇ浜�0鐨勭粨鏋�", flag) + completeFormula = flag + } + } + for j := 0; j < len(groupRule.Rules); j++ { + // 杩欐杩囩殑鏄椂闂磋鍒欙紙鏃堕棿娈电瓑锛� + flag := timeRuleResult(groupRule.Rules[j], &areaMap) + if flag != "" { + fmt.Println("鏃堕棿瑙勫垯鐨勭粨鏋�", flag) + completeFormula = completeFormula + groupRule.Rules[j].RuleWithPre + "" + flag + } + } + + for j := 0; j < len(groupRule.Rules); j++ { + // 鏈�鍚庤繃鎸佺画鏃堕棿绛夋椂闂寸淮搴︾殑鏉′欢 + duration(groupRule.Rules[j], &areaMap) + } + + } + fmt.Println("鎷煎嚭鐨勬暟瀛﹀叕寮忎负:==== ", completeFormula) + if completeFormula != "" { + expression, _ := govaluate.NewEvaluableExpression(completeFormula) + result, _ := expression.Evaluate(nil) // 寰楀埌鏁板鍏紡鐨勭粨鏋� + fmt.Println("杩欏抚鍥惧儚鍦ㄤ换鍔′笅鐨勯櫎浜嗘寔缁椂闂村鐨勪竴鏁存潯瑙勫垯涓嬬殑鍒ゆ柇缁撴灉", result) + // 鐢变簬澶╃劧鎴栫殑鍏崇郴锛屾弧瓒充竴涓氨璇ユ姤璀�,鍗宠甯ф暟鎹浜庢煇涓换鍔$殑鏌愪釜瑙勫垯缁勫簲璇ユ姤璀� + if !result.(bool) { // 濡傛灉涓嶇鍚堟潯浠讹紝搴旇閲嶇疆瀹氭椂鍣ㄥ厓绱狅紝绛夌鍚堟椂鍐嶅紑鍚�,鎶妅ey涓寘鍚换鍔d鐨則imeEle閮介噸缃� + for k, timeEle := range TimeEleList { + if strings.Index(k, taskId) != -1 { + timeEle.N = timeEle.InitN // 閲嶇疆瀹氭椂鍣� + } + } + return false + } else { + // 鍘荤湅瀹氭椂鍣ㄦ鏃舵槸鍚﹁蛋鍒�0锛岃蛋鍒�0鐨勮瘽杩斿洖鎴愬姛鎶ヨ + var flag bool = true + for k, timeEle := range TimeEleList { + if strings.Index(k, taskId) != -1 { + if timeEle.N != 0 { // 璺熻繖涓换鍔℃湁鍏崇殑瀹氭椂鍣ㄨ鍏ㄩ儴绛変簬0 + flag = false + } + } + } + if flag { + fmt.Println("瀹氭椂鍣ㄦ姤璀︿簡") + // 杩囧畬瑙勫垯鍚庢墦涓爣绛撅紝鍛婅瘔璋冪敤鑰呮湰甯ф暟鎹拡瀵瑰摢涓换鍔″摢缁勮鍒欐姤璀︿簡 + arg.RuleResult = append(arg.RuleResult, Result{taskId, groupRule.GroupId,groupRule.AlarmLevel,groupRule.GroupText}) + return true + } else { + return false + } + } + } else { + return false + } +} + +// 瀵瑰崟甯у浘鍍忕殑鍒ゆ柇 鏄垗寮冿紙鎴栬�呰瀵逛簬鏌愪簺闇�姹傚彲浠ユ斁ES鏁版嵁搴撲竴浠斤級杩樻槸杩斿洖 +func judge(aml *AreaMapList, arg *ArgsFromSdk) { + // 寰楀埌灞炰簬璇ユ憚鍍忔満鐨勮嫢骞茬粍浠诲姟鐨勫畬鏁磋鍒欙紙璺熸瘡涓�鏉″畬鏁磋鍒欐瘮杈冧箣鍚庡緱鍑烘湰寮犲浘鍍忓浜庢煇涓鍒欐槸鍚︽姤璀︾殑缁撴灉銆傛斁杩沵ap锛屾瘮濡傛湰甯у浘鍍忕殑id锛屾墍纰版挒鎴愬姛鐨勮鍒檌d锛� + taskRuleList := GetRuleGroup(arg.CameraId) + if len(taskRuleList) > 0 { + for _, taskRule := range taskRuleList { + ruleList := taskRule.GroupRules // 鑾峰彇鐨勬槸task涓嬮潰鐨勪换鍔$粍 + taskId := taskRule.TaskId + for i := 0; i < len(ruleList); i++ { + temp := ruleList[i].Rules // temp涓轰竴缁勫畬鏁磋鍒� 鍦ㄦ闇�瑕佸垽鏂鍒欐槸鍚︽槸鑱斿姩瑙勫垯 + if len(temp) > 0 { + if strings.Contains(ruleList[i].GroupId, "link") { + // groupId涓惈鏈塴ink鍒欎负鑱斿姩浠诲姟 + linkTask(aml, arg, ruleList[i], taskId) + } else { + // 鐙珛浠诲姟鐨勫鐞� + singleTask(aml, arg, ruleList[i], taskId) + } + } + } + } + } +} + +// 杩囨护瑙勫垯鍏堢瓫閫夊嚭绗﹀悎鏉′欢鐨勭洰鏍囨暟閲� +func filterRule(rule *protomsg.Rule, am *AreaMap) { + if rule.PolygonId == am.areaId { // 棣栧厛瑙勫垯鎵�瀵瑰簲鐨勫尯鍩焛d瑕佽窡鍖哄煙鏁版嵁鐨刬d瀵圭殑涓� + if rule.SdkArgAlias == "score" || rule.SdkArgAlias == "proportion" || rule.SdkArgAlias == "size" { // 鍒ゆ柇鐨勬槸鐩镐技鍊硷紝鍗犳瘮锛屽昂瀵哥瓑杩囨护鏉′欢锛屽鏋滃啀鏈夛紝杩樺彲浠ュ啀鍔� + //fmt.Println("绛涢�変汉鏁伴樁娈�", "姣旇緝鐨勮鍒欐槸锛�", rule) + var args []Arg + if rule.RuleWithPre == "&&" { + args = am.filterData + } else { + args = am.args + } + // 鍏堟竻绌鸿繃婊ゅ悗鐨勬暟鎹紝鍐嶅線閲屽鏈杩囨护鍚庣殑鏁版嵁 + am.filterData = am.filterData[0:0] + for _, arg := range args { + var formula string + if rule.SdkArgAlias == "score" { + formula = strconv.FormatFloat(arg.score, 'f', -1, 64) + " " + rule.Operator + " " + rule.SdkArgValue // 寰楀埌瀛楃涓插叕寮� + } else if rule.SdkArgAlias == "proportion" { + formula = strconv.FormatFloat(arg.proportion, 'f', -1, 64) + " " + rule.Operator + " " + rule.SdkArgValue // 寰楀埌瀛楃涓插叕寮� + } else { + formula = strconv.FormatFloat(arg.size, 'f', -1, 64) + " " + rule.Operator + " " + rule.SdkArgValue // 寰楀埌瀛楃涓插叕寮� + } + expression, _ := govaluate.NewEvaluableExpression(formula) // 寰楀埌鏁板鍏紡 + result, _ := expression.Evaluate(nil) // 寰楀埌鏁板鍏紡鐨勭粨鏋� + if result.(bool) { + am.filterData = append(am.filterData, arg) // 寰楀埌绗﹀悎鏉′欢鐨勮繃婊ゆ暟鎹� + } + } + am.targetNum = len(am.filterData) // 鎶婄鍚堟潯浠剁殑鐩爣鏁伴噺鏇存柊鍒皌argetNum瀛楁 + } + } +} + +// 閮借繃婊ゅ畬鏉′欢涔嬪悗鐪嬬湅鏄惁瑕佸垱寤轰竴涓畾鏃跺櫒鍏冪礌 鍒涘缓瀹氭椂鍣ㄧ殑鏉′欢锛氭槸鍚︽湁闈犲彸琛岋紝涓綋闈欐绛夎嚜甯﹀畾鏃跺櫒鍚箟鐨勭畻娉曚互鍙婃槸鍚︽湁鎸佺画鏃堕棿 +func duration(rule *protomsg.Rule, am *AreaMap) { + if rule.PolygonId == am.areaId { // 棣栧厛瑙勫垯鎵�瀵瑰簲鐨勫尯鍩焛d瑕佽窡鍖哄煙鏁版嵁鐨刬d瀵圭殑涓� + if rule.SdkArgAlias == "duration" { // + // 鍏堢湅鐪嬪畾鏃跺櫒鍏冪礌闃熷垪涓槸鍚︽湁杩欎釜鎽勫儚鏈鸿繖涓尯鍩熺殑瀹氭椂鍣�,濡傛灉鏈夊氨涓嶈兘鍐嶆鍒涘缓浜� + var flag bool = true + for k, _ := range TimeEleList { + if k == am.taskId+" "+am.areaId { + flag = false // 鏈夊氨缃负false + fmt.Println("鏈夎繖涓畾鏃跺櫒锛屼笉鍐嶅垱寤轰簡锛�") + } + } + + if flag { + timeLength, _ := strconv.Atoi(rule.SdkArgValue) + timeEle := TimeElement{N: timeLength, InitN: timeLength} // 鎵旇繘鍘讳竴涓畾鏃跺櫒鍏冪礌 + //TimeEleList = make(map[string]timeElement) + TimeEleList[am.taskId+" "+am.areaId] = &timeEle // 瀹氭椂鍣ㄥ厓绱犱互鎽勫儚鏈篿d鎷兼帴鍖哄煙id涓洪敭 + fmt.Println("鍒涘缓浜嗚鏁板櫒骞朵笖璁℃暟鍣ㄩ泦鍚堜负锛�", TimeEleList) + } + } + } +} +// 鍐椾綑鎷兼帴 +func splice1 (am *AreaMap) string { + args := am.targetNum + formula := strconv.Itoa(args) + " " + ">" + "0" + expression, _ := govaluate.NewEvaluableExpression(formula) // 寰楀埌鏁板鍏紡 + result, _ := expression.Evaluate(nil) // 寰楀埌鏁板鍏紡鐨勭粨鏋� + return strconv.FormatBool(result.(bool)) +} +// 缁欐暟鎹簱鐨勮鍒欒〃杈惧紡浠e弬 args: 涓�鏉″瓙瑙勫垯锛屽尯鍩熸暟鎹� +func transferParameters(rule *protomsg.Rule, am *AreaMap) string { + if rule.PolygonId == am.areaId { // 棣栧厛瑙勫垯鎵�瀵瑰簲鐨勫尯鍩焛d瑕佽窡鍖哄煙鏁版嵁鐨刬d瀵圭殑涓� + if rule.SdkArgAlias == "targetNum" { // 濡傛灉鍙傛暟鏄鍖哄煙鍐呯洰鏍囨暟閲� 鍗硑olo + //fmt.Println("寰楀嚭缁撴灉闃舵", "姣旇緝鐨勮鍒欐槸锛�", rule) + if rule.Operator == "" { + return strconv.Itoa(am.targetNum) // 濡傛灉鍚庨潰涓嶈窡鎿嶄綔绗﹀氨鐩存帴杩斿洖鏁伴噺 姣斿瑕佽窡涓嬩竴涓尯鍩熸瘮杈冩暟閲忕殑灏辩洿鎺ヨ繑鍥炴湰鍖哄煙鐨勬暟閲� + } + args := am.targetNum + formula := strconv.Itoa(args) + " " + rule.Operator + " " + rule.SdkArgValue + expression, _ := govaluate.NewEvaluableExpression(formula) // 寰楀埌鏁板鍏紡 + result, _ := expression.Evaluate(nil) // 寰楀埌鏁板鍏紡鐨勭粨鏋� + return strconv.FormatBool(result.(bool)) + // 鍔犱笂鍏充簬绠楁硶鐨勫垽鏂潯浠讹紝涓嶈兘鍙湁鍏充簬瑙勫垯鐨勶紝鏈夌殑绠楁硶鏈韩灏辨槸涓�涓鍒欙紝濡備釜浣撻潤姝紝闈犲彸琛�,鎵�浠ワ紝鎷垮埌褰撳墠瀛愯鍒欑殑sdkid鏉ュ垽鏂槸鍚︽槸閭d簺鐗规畩鐨勮鍒� + } else if rule.SdkId == "IsStatic" { // 闈欐绠楁硶 + if am.isStatic { + return "true" + } else { + return "false" + } + } else if rule.SdkId == "KeepRight" { // 闈犲彸琛岀畻娉� + if am.keepRight { + return "true" + } else { + return "false" + } + } else if rule.SdkId == "FaceDetect" { // 浜鸿劯妫�娴� + if rule.Operator == "==" || rule.Operator == ">=" || rule.Operator == "<=" || rule.Operator == "<" || rule.Operator == ">" || rule.Operator == "!=" { + // 濡傛灉鏄笉瑙勭煩鐨勮繛鎺ョ缁熺粺杩斿洖false 瑙勫垯涔熷彧鑳藉垽鏂汉鑴哥殑鐩镐技搴︼紝鎵�浠ヤ笉瀛樺湪鍒殑杩炴帴绗� + return "false" + } else { + return "false" + } + } else { + + } + + } + return "" +} +func timeRuleResult(rule *protomsg.Rule, am *AreaMap) string { + if rule.PolygonId == am.areaId { // 棣栧厛瑙勫垯鎵�瀵瑰簲鐨勫尯鍩焛d瑕佽窡鍖哄煙鏁版嵁鐨刬d瀵圭殑涓� + if rule.SdkArgAlias == "time" { // 鍒ゆ柇鏄惁绗﹀悎鏃堕棿瑙勫垯 + // 鏍规嵁鏀惧�煎瓧娈甸噷瀛樼殑鏃堕棿瑙勫垯鐨刬d鍘诲彟涓�涓〃閲屾煡闇�瑕佹瘮瀵圭殑鏃堕棿娈碉紙姣斿褰撳墠鏃堕棿鏄懆涓夛紝搴旀牴鎹尯鍩焛d鏌ュ嚭鍏跺懆涓夌殑鍑犱釜甯冮槻鏃堕棿娈碉紝鏁扮粍锛� + //fmt.Println("鏃堕棿瑙勫垯鐨勬祴璇�") + now := time.Now() + index := getIndexOfWeek(now.Weekday().String()) + timeList := GetTimeById(rule.SdkArgValue, index) + //fmt.Println("浠庢暟鎹簱涓煡鍑虹殑鏃堕棿瑙勫垯锛�", timeList) + // 鍒ゆ柇鍥剧墖鏁版嵁鐨勬椂闂存槸鍚︾鍚堝綋鍓嶈鍒� 鍦ㄤ竴涓嵆涓簍rue锛屽叏涓嶅湪涓篺alse + flag := "false" + for _, timeSlot := range timeList { + if rule.Operator == "satisfy" { // 婊¤冻鎵�閫夌殑鏃堕棿瑙勫垯 + formula := "'" + timeSlot.Start + "'" + "<" + "'" + am.time + "'" + expression, _ := govaluate.NewEvaluableExpression(formula) // 寰楀埌鏁板鍏紡 + result, _ := expression.Evaluate(nil) // 寰楀埌鏁板鍏紡鐨勭粨鏋� + + formula1 := "'" + timeSlot.End + "'" + ">" + "'" + am.time + "'" + expression1, _ := govaluate.NewEvaluableExpression(formula1) // 寰楀埌鏁板鍏紡 + result1, _ := expression1.Evaluate(nil) // 寰楀埌鏁板鍏紡鐨勭粨鏋� + //fmt.Println("鐪嬬湅杩欎袱灏婂ぇ绁�", result, result1) + if result.(bool) && result1.(bool) { + flag = "true" + break + } + } + if rule.Operator == "unsatisfy" { // 涓嶆弧瓒虫墍閫夌殑鏃堕棿瑙勫垯 + formula := timeSlot.Start + "<" + am.time + expression, _ := govaluate.NewEvaluableExpression(formula) // 寰楀埌鏁板鍏紡 + result, _ := expression.Evaluate(nil) // 寰楀埌鏁板鍏紡鐨勭粨鏋� + + formula1 := timeSlot.End + ">" + am.time + expression1, _ := govaluate.NewEvaluableExpression(formula1) // 寰楀埌鏁板鍏紡 + result1, _ := expression1.Evaluate(nil) // 寰楀埌鏁板鍏紡鐨勭粨鏋� + if result.(bool) && result1.(bool) { + flag = "true" + break + } + } + } + return flag + } + } + return "" +} + +// 鏍规嵁浼犲叆鐨勫瓧绗︿覆寰楀埌鍏跺湪涓�鍛ㄥ唴鐨勭储寮� 鍛ㄤ竴鍒板懆鏃ュ垎鍒搴�1鍒�7 +func getIndexOfWeek(weekday string) int { + var weekdays = [7]string{"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"} + for k, value := range weekdays { + if value == weekday { + return k + 1 // 鍥犱负鏁版嵁搴撲腑瀛樼殑鏄�1-7浠h〃鐨勫懆涓�鍒板懆鏃� + } + } + return 0 +} + +type TimeRange struct { + Start string `json:"start"` + End string `json:"end"` +} +type day struct { + Day int `json:"day"` // 鏍囩ず褰撳墠鏄熸湡鍑� + TimeRange []TimeRange `json:"time_range"` // 褰撳ぉ鐨勫嚑涓椂闂存 +} + +// 鍙栧嚭鏌愪釜鏃堕棿瑙勫垯鐨勭鍑犲ぉ鐨勮鍒欐闆嗗悎 +func GetTimeById(id string, index int) []TimeRange { + var cameraTimeRule protomsg.CameraTimerule + var api dbapi.CameraApi + _, rules := api.FindAllTimeRules() + for _, rule := range rules { + if rule.Id == id { + cameraTimeRule = rule + } + } + var timeRangeList []day + json.Unmarshal([]byte(cameraTimeRule.TimeRule), &timeRangeList) + for _, timerange := range timeRangeList { + if timerange.Day == index { + //log.Println("鍙栧埌鐨勬椂闂磋鍒欙細", timerange.TimeRange) + return timerange.TimeRange + } + } + return nil +} -- Gitblit v1.8.0