single.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package handler
  2. import (
  3. "GtDataStore/app/cmd/events/internal/logic/job"
  4. "GtDataStore/app/cmd/events/internal/svc"
  5. "GtDataStore/app/model"
  6. "GtDataStore/common/envitem"
  7. "GtDataStore/common/identify"
  8. "context"
  9. "errors"
  10. "fmt"
  11. "github.com/zeromicro/go-zero/core/logx"
  12. "sync"
  13. )
  14. func EventSingle(ctx context.Context, task *job.Task, technologyName string) error {
  15. // 1. 查询所有的设备
  16. binds, err := findSingleRecord(task.Job.SvcCtx, int64(task.Id))
  17. if err != nil {
  18. return err
  19. }
  20. // 2. 从记录中提取点位,并合并成MultiEventItems
  21. MultiEvents := mergeToMultiEventItems(binds)
  22. if len(MultiEvents) == 0 {
  23. return errors.New("mergeToMultiEventItems not found envitems")
  24. }
  25. // 2. 获得点位信息
  26. ovMap := MultiEvents.FindPrevString() // 旧点位值map
  27. err = MultiEvents.FillCurrentValue() // 该方法执行行, 会将当前的值更新到旧点位值
  28. if err != nil {
  29. return err
  30. }
  31. // 3. 识别事件
  32. var wg sync.WaitGroup
  33. wg.Add(len(binds))
  34. for _, bind := range binds {
  35. bind := bind
  36. go func() {
  37. defer wg.Done()
  38. item := MultiEvents[bind.Item]
  39. ov, _ := ovMap[bind.Item]
  40. nv := item.GetItemStringVal()
  41. checker := identify.NewSingleCheck(map[string]identify.Rule{bind.Name: bind.Config})
  42. name := checker.Check(ov, nv)
  43. println(fmt.Sprintf("ov: %s nv: %s event: %s name", ov, nv, name))
  44. if name != "" {
  45. eventChan <- eventInfo{
  46. ProjectId: bind.ProjectId,
  47. DeviceCode: bind.DeviceCode,
  48. Item: bind.Item,
  49. EventId: bind.Id,
  50. EventName: name,
  51. OldValue: ov,
  52. NewValue: nv,
  53. Time: *item.GetItemHtime(),
  54. }
  55. }
  56. }()
  57. }
  58. wg.Wait()
  59. return nil
  60. }
  61. func findSingleRecord(svcCtx *svc.ServiceContext, projectId int64) ([]model.DcEventBind, error) {
  62. if binds, err := svcCtx.DcEventBind.FindByProjectIdRuleFlag(context.Background(), projectId, EVENT_SINGLE_ITEM); err != nil {
  63. logx.Infof("findSingleRecord not found record")
  64. return nil, err
  65. } else {
  66. return binds, nil
  67. }
  68. }
  69. func mergeToMultiEventItems(binds []model.DcEventBind) envitem.MultiEnvItem {
  70. me := make(envitem.MultiEnvItem)
  71. for _, bind := range binds {
  72. me[bind.Item] = &envitem.EnvItem{
  73. ProjectId: bind.ProjectId,
  74. Item: bind.Item,
  75. }
  76. }
  77. return me
  78. }