package handler import ( "GtDataStore/app/cmd/events/internal/logic/job" "GtDataStore/app/cmd/events/internal/svc" "GtDataStore/app/model" "context" "errors" "fmt" "github.com/zeromicro/go-zero/core/logx" "metawant.greentech.com.cn/gaoyagang/gt-common/envitem" "metawant.greentech.com.cn/gaoyagang/gt-common/identify" "sync" "time" ) func EventSingle(ctx context.Context, task *job.Task, technologyName string) error { // 1. 查询所有的设备 binds, err := findSingleRecord(task.Job.SvcCtx, int64(task.Id)) if err != nil { return err } // 2. 从记录中提取点位,并合并成MultiEventItems MultiEvents := mergeToMultiEventItems(binds) if len(MultiEvents) == 0 { return errors.New("mergeToMultiEventItems not found envitems") } // 2. 获得点位信息 ovMap := MultiEvents.FindPrevString() // 旧点位值map err = MultiEvents.FillCurrentValue() // 该方法执行行, 会将当前的值更新到旧点位值 if err != nil { return err } // 3. 识别事件 var wg sync.WaitGroup wg.Add(len(binds)) for _, bind := range binds { bind := bind go func() { defer wg.Done() item := MultiEvents[bind.Item] ov, _ := ovMap[bind.Item] nv := item.GetItemStringVal() checker := identify.NewSingleCheck(map[string]identify.Rule{bind.Name: bind.Config.Single}) name := checker.Check(ov, nv) //println(fmt.Sprintf("ov: %s nv: %s event: %s name", ov, nv, name)) if name != "" { ht := item.GetItemHtime() if ht == nil { println(fmt.Sprintf("htime is nil ov: %s nv: %s event: %s name", ov, nv, name)) return } eventChan <- eventInfo{ ProjectId: bind.ProjectId, DeviceCode: bind.DeviceCode, Item: bind.Item, EventId: bind.Id, EventName: name, OldValue: ov, NewValue: nv, Time: *item.GetItemHtime(), } } }() } wg.Wait() return nil } func findSingleRecord(svcCtx *svc.ServiceContext, projectId int64) ([]model.DcEventBind, error) { if data := eventBindCacheTable.GetCache(EVENT_SINGLE_ITEM); data != nil { return data, nil } if binds, err := svcCtx.DcEventBind.FindByProjectIdRuleFlag(context.Background(), projectId, EVENT_SINGLE_ITEM); err != nil { logx.Error("findSingleRecord not found record") return nil, err } else { eventBindCacheTable.SetCache(EVENT_SINGLE_ITEM, binds, time.Now().Add(300*time.Second)) return binds, nil } } func mergeToMultiEventItems(binds []model.DcEventBind) envitem.MultiEnvItem { me := make(envitem.MultiEnvItem) for _, bind := range binds { me[bind.Item] = &envitem.EnvItem{ ProjectId: bind.ProjectId, Item: bind.Item, } } return me }