package identify import ( "encoding/json" ) type MultiItem struct { nvs map[ItemName]ItemValue // 当前值 ovs map[ItemName]ItemValue // 上一次的值 rules map[EventName]MultiRule } func (m *MultiItem) Check(ovs, nvs map[ItemName]ItemValue) EventName { m.ovs = ovs m.nvs = nvs defer func() { m.ovs = nil m.nvs = nil }() for eventName, multiRule := range m.rules { if m.check(multiRule) { return eventName } } return "" } func (m *MultiItem) check(rules MultiRule) bool { s := newSingleCheckForMultiItem() s.SetVars(m.nvs) // 判断指定的点位名, 是否通过了检测, 有一项不为true, 提前返回false for itemName, rule := range rules { if s.checkForMulti(m.ovs[itemName], m.nvs[itemName], rule) == false { return false } } return true } func NewMultiCheck(rules map[EventName]MultiRule) *MultiItem { return &MultiItem{ rules: rules, } } func MultiTest(ovs, nvs map[ItemName]ItemValue, ruleString string) string { rules := make(map[EventName]MultiRule) err := json.Unmarshal([]byte(ruleString), &rules) if err != nil { println(err.Error()) } return NewMultiCheck(rules).Check(ovs, nvs) }