package timeSlot import ( "basic.com/pubsub/protomsg.git" "encoding/json" "github.com/knetic/govaluate" "ruleprocess/cache" "ruleprocess/logger" "ruleprocess/ruleserver" "time" ) func TimeRuleResult(rule *protomsg.Rule, am *ruleserver.AreaMap) ruleserver.LittleRuleResult { if rule.PolygonId == am.AreaId { // 首先规则所对应的区域id要跟区域数据的id对的上 if rule.SdkArgAlias == "time_rule" { // 判断是否符合时间规 //logger.Info("----------当前时间规则:---------", rule) // 根据放值字段里存的时间规则的id去另一个表里查需要比对的时间段(比如当前时间是周三,应根据区域id查出其周三的几个布防时间段,数组) //logger.Info("时间规则的测试") now := time.Now() index := GetIndexOfWeek(now.Weekday().String()) timeList := GetTimeById(rule.SdkArgValue, index) //logger.Info("当天的时间段集合:----------", timeList) //logger.Info("从数据库中查出的时间规则:", timeList) // 判断图片数据的时间是否符合当前规则 在一个即为true,全不在为false if rule.Operator == "satisfy" || rule.Operator == "==" { // 满足所选的时间规则 flag := "false" for _, timeSlot := range timeList { 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) // 得到数学公式的结果 //logger.Info("看看这两尊大神", result, result1) if result.(bool) && result1.(bool) { flag = "true" break } } return ruleserver.LittleRuleResult{am.SdkName, rule.RuleWithPre + "" + flag, rule.Sort} } if rule.Operator == "unsatisfy" || rule.Operator == "!=" { // 不满足所选的时间规则 flag := "true" for _, timeSlot := range timeList { formula := "'" + timeSlot.Start + "'" + " < " + "'" + am.Time + "'" //logger.Info("-----------------时间规则不满足的公式start:", formula) expression, _ := govaluate.NewEvaluableExpression(formula) // 得到数学公式 result, _ := expression.Evaluate(nil) // 得到数学公式的结果 formula1 := "'" + timeSlot.End + "'" + " > " + "'" + am.Time + "'" //logger.Info("-----------------时间规则不满足的公式end:", formula1) expression1, _ := govaluate.NewEvaluableExpression(formula1) // 得到数学公式 result1, _ := expression1.Evaluate(nil) // 得到数学公式的结果 if result.(bool) && result1.(bool) { flag = "false" break } } return ruleserver.LittleRuleResult{am.SdkName, rule.RuleWithPre + "" + flag, rule.Sort} } } } return ruleserver.LittleRuleResult{} } // 取出某个时间规则的第几天的规则段集合 func GetTimeById(id string, index int) []ruleserver.TimeRange { _, cameraTimeRule := cache.GetTimeRuleById(id) var timeRangeList []ruleserver.Day err := json.Unmarshal([]byte(cameraTimeRule.TimeRule), &timeRangeList) if err != nil { logger.Error("取时间规则时反序列化错误!") } for _, timerange := range timeRangeList { if timerange.Day == index { //logger.Println("取到的时间规则:", timerange.TimeRange) return timerange.TimeRange } } return nil } // 根据传入的字符串得到其在一周内的索引 周一到周日分别对应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代表的周一到周日 } } return 0 }