package main
|
|
import (
|
"basic.com/pubsub/protomsg.git"
|
"encoding/json"
|
"github.com/knetic/govaluate"
|
"ruleprocess/cache"
|
"ruleprocess/logger"
|
"ruleprocess/structure"
|
"time"
|
)
|
|
func TimeRuleResult(rule *protomsg.Rule, am *structure.AreaMap) structure.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 structure.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 structure.LittleRuleResult{am.SdkName, rule.RuleWithPre + "" + flag, rule.Sort}
|
}
|
|
}
|
}
|
return structure.LittleRuleResult{}
|
}
|
|
// 取出某个时间规则的第几天的规则段集合
|
func GetTimeById(id string, index int) []structure.TimeRange {
|
_, cameraTimeRule := cache.GetTimeRuleById(id)
|
var timeRangeList []structure.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
|
}
|