package crontask import ( "apsClient/conf" "apsClient/constvar" "apsClient/model/common" "apsClient/nsq" "apsClient/pkg/ecode" "apsClient/pkg/logx" "apsClient/service" "fmt" "github.com/go-co-op/gocron" "github.com/spf13/cast" "time" ) var s *gocron.Scheduler func StartTask(isMaster bool) error { finishNumberTimeInterval := conf.Conf.PLC.FinishNumberTimeInterval totalNumberTimeInterval := conf.Conf.PLC.TotalNumberTimeInterval if finishNumberTimeInterval == 0 { finishNumberTimeInterval = 6 } if totalNumberTimeInterval == 0 { totalNumberTimeInterval = 60 } s = gocron.NewScheduler(time.UTC) _, err := s.Every(finishNumberTimeInterval).Seconds().Do(func() { plcConfig, code := service.NewDevicePlcService().GetDevicePlc() if code != ecode.OK { return } for _, addressItem := range plcConfig.Details { if addressItem.FieldName == constvar.PlcStartAddressTypeFinishNumber { value, err := service.PlcReadDirect(plcConfig, addressItem.StartAddress, addressItem.Length, addressItem.Type) if err != nil { logx.Infof("plc read finish number err: %v", err) continue } finishNumber := cast.ToInt64(value) if finishNumber != 0 { service.PlcCacheSet(addressItem.Channel, constvar.PlcCacheKeyFinishNumber, finishNumber) _ = service.NewProgressService().UpdateProgress(addressItem.Channel, cast.ToInt64(finishNumber)) } logx.Infof("plc read finish number: %v", finishNumber) } } }) if err != nil { return err } s.Every(totalNumberTimeInterval).Seconds().Do(func() { plcConfig, code := service.NewDevicePlcService().GetDevicePlc() if code != ecode.OK { return } for _, addressItem := range plcConfig.Details { if addressItem.FieldName == constvar.PlcStartAddressTypeTotalNumber { value, err := service.PlcReadDirect(plcConfig, addressItem.StartAddress, addressItem.Length, addressItem.Type) if err != nil { logx.Infof("plc read total number err: %v", err) continue } totalNumber := cast.ToInt64(value) if totalNumber != 0 { service.PlcCacheSet(addressItem.Channel, constvar.PlcCacheKeyTotalNumber, totalNumber) _ = service.NewProgressService().UpdateProgress(addressItem.Channel, cast.ToInt64(totalNumber)) } logx.Infof("plc read total number: %v", totalNumber) } } }) if isMaster { s.Every(60).Seconds().Do(SyncProductionProgress) //同步生产数据 s.Every(30).Seconds().Do(SyncTaskStatus) //同步任务状态 } s.StartAsync() return nil } func SyncProductionProgress() { progressList, err := service.NewProgressService().GetProgressList() if err != nil { logx.Errorf("SyncProductionProgress get records err:%v", err) return } for _, progress := range progressList { caller := nsq.NewCaller(fmt.Sprintf(constvar.NsqTopicSyncTaskProgress, conf.Conf.NsqConf.NodeId), "") err = caller.Send(progress) if err != nil { logx.Errorf("SyncProductionProgress error:%v", err.Error()) } } } func SyncTaskStatus() { records, err := service.NewTaskService().GetTaskStatusSync(100) if err != nil { logx.Errorf("SyncTaskStatus get records err:%v", err) } syncOkIds := make([]uint, 0, len(records)) for _, record := range records { msg := &common.MsgTaskStatusUpdate{ WorkOrderId: record.WorkOrderId, ProcedureID: record.ProcedureID, DeviceId: record.DeviceId, IsProcessing: record.IsProcessing, IsFinish: record.IsFinish, } caller := nsq.NewCaller(fmt.Sprintf(constvar.NsqTopicTaskProcedureStatusUpdate, conf.Conf.NsqConf.NodeId), "") err = caller.Send(msg) if err != nil { logx.Errorf("sync task status send msg error:%v", err.Error()) } syncOkIds = append(syncOkIds, record.ID) } if len(syncOkIds) > 0 { err = service.NewTaskService().RemoveTaskStatusSync(syncOkIds) if err != nil { logx.Errorf("sync task status delete sync ok records error:%v", err) } } } func RestartTask(isMaster bool) error { if s != nil { s.Stop() } return StartTask(isMaster) } // Once 一次性任务 func Once(isMaster bool) { if !isMaster { return } msg := &common.MsgPullDataRequest{DataType: common.PullDataTypeProcessModel} caller := nsq.NewCaller(fmt.Sprintf(constvar.NsqTopicPullDataRequest, conf.Conf.NsqConf.NodeId), constvar.NsqTopicPullDataResponse) err := caller.Send(msg) if err != nil { logx.Errorf("send pull data msg error:%v", err.Error()) } caller = nsq.NewCaller(fmt.Sprintf(constvar.NsqTopicGetPlcAddress, conf.Conf.NsqConf.NodeId), "") err = caller.Send(common.RequestPlcAddress{DeviceId: conf.Conf.System.DeviceId}) if err != nil { logx.Infof("get plc address err: %v", err.Error()) } }