123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- 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"
- )
- 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})
- 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 binds, err := svcCtx.DcEventBind.FindByProjectIdRuleFlag(context.Background(), projectId, EVENT_SINGLE_ITEM); err != nil {
- logx.Error("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
- }
|