multi.go 1.1 KB

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