single.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  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. "context"
  7. "errors"
  8. "fmt"
  9. "github.com/zeromicro/go-zero/core/logx"
  10. "metawant.greentech.com.cn/gaoyagang/gt-common/envitem"
  11. "metawant.greentech.com.cn/gaoyagang/gt-common/identify"
  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. ht := item.GetItemHtime()
  46. if ht == nil {
  47. println(fmt.Sprintf("htime is nil ov: %s nv: %s event: %s name", ov, nv, name))
  48. return
  49. }
  50. eventChan <- eventInfo{
  51. ProjectId: bind.ProjectId,
  52. DeviceCode: bind.DeviceCode,
  53. Item: bind.Item,
  54. EventId: bind.Id,
  55. EventName: name,
  56. OldValue: ov,
  57. NewValue: nv,
  58. Time: *item.GetItemHtime(),
  59. }
  60. }
  61. }()
  62. }
  63. wg.Wait()
  64. return nil
  65. }
  66. func findSingleRecord(svcCtx *svc.ServiceContext, projectId int64) ([]model.DcEventBind, error) {
  67. if binds, err := svcCtx.DcEventBind.FindByProjectIdRuleFlag(context.Background(), projectId, EVENT_SINGLE_ITEM); err != nil {
  68. logx.Error("findSingleRecord not found record")
  69. return nil, err
  70. } else {
  71. return binds, nil
  72. }
  73. }
  74. func mergeToMultiEventItems(binds []model.DcEventBind) envitem.MultiEnvItem {
  75. me := make(envitem.MultiEnvItem)
  76. for _, bind := range binds {
  77. me[bind.Item] = &envitem.EnvItem{
  78. ProjectId: bind.ProjectId,
  79. Item: bind.Item,
  80. }
  81. }
  82. return me
  83. }