package handler import ( "GtDataStore/app/cmd/events/internal/logic/job" "GtDataStore/app/cmd/events/internal/svc" "GtDataStore/app/model" "GtDataStore/common/envitem" "GtDataStore/common/identify" "context" "errors" "github.com/zeromicro/go-zero/core/logx" "sync" ) 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. 获得点位信息 err = MultiEvents.FillCurrentValue() if err != nil { return err } // 3. 识别事件 var wg sync.WaitGroup wg.Add(len(binds)) for _, bind := range binds { item := MultiEvents[bind.Item] ov := item.GetItemPrevStringVal() nv := item.GetItemStringVal() checker := identify.NewSingleCheck(map[string]identify.Rule{bind.Name: bind.Config}) if name := checker.Check(ov, nv); name != "" { eventChan <- eventInfo{ ProjectId: bind.ProjectId, DeviceCode: bind.DeviceCode, Item: bind.Item, EventName: name, OldValue: ov, NewValue: nv, Time: *item.GetItemHtime(), } } } wg.Wait() return nil } func findSingleRecord(svcCtx *svc.ServiceContext, projectId int64) ([]model.DcEventBind, error) { if binds, err := svcCtx.DcEventBind.FindByProjectIdRuleFlag(context.Background(), projectId, EVENT_SINGLE_ITEM); err != nil { logx.Infof("findSingleRecord not found record") return nil, err } else { 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 }