multi.go 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. package identify
  2. import "encoding/json"
  3. type MultiItem struct {
  4. nvs map[ItemName]ItemValue // 当前值
  5. ovs map[ItemName]ItemValue // 上一次的值
  6. rules map[EventName]MultiRule
  7. }
  8. func (m *MultiItem) Check(ovs, nvs map[ItemName]ItemValue) EventName {
  9. m.ovs = ovs
  10. m.nvs = nvs
  11. defer func() {
  12. m.ovs = nil
  13. m.nvs = nil
  14. }()
  15. for eventName, multiRule := range m.rules {
  16. if m.check(multiRule) {
  17. return eventName
  18. }
  19. }
  20. return ""
  21. }
  22. func (m *MultiItem) check(rules MultiRule) bool {
  23. s := newSingleCheckForMultiItem()
  24. // 判断指定的点位名, 是否通过了检测, 有一项不为true, 提前返回false
  25. for itemName, rule := range rules {
  26. if s.checkForMulti(m.ovs[itemName], m.nvs[itemName], rule) == false {
  27. return false
  28. }
  29. }
  30. return true
  31. }
  32. func NewMultiCheck(rules map[EventName]MultiRule) *MultiItem {
  33. return &MultiItem{
  34. rules: rules,
  35. }
  36. }
  37. func MultiTest(ovs, nvs map[ItemName]ItemValue, ruleString string) string {
  38. rules := make(map[EventName]MultiRule)
  39. err := json.Unmarshal([]byte(ruleString), &rules)
  40. if err != nil {
  41. println(err.Error())
  42. }
  43. return NewMultiCheck(rules).Check(ovs, nvs)
  44. }