| | |
| | | |
| | | var s *gocron.Scheduler |
| | | |
| | | func StartTask() error { |
| | | func StartTask(isMaster bool) error { |
| | | finishNumberTimeInterval := conf.Conf.PLC.FinishNumberTimeInterval |
| | | totalNumberTimeInterval := conf.Conf.PLC.TotalNumberTimeInterval |
| | | if finishNumberTimeInterval == 0 { |
| | |
| | | |
| | | }) |
| | | |
| | | s.Every(60).Seconds().Do(SyncProductionProgress) //同步生产数据 |
| | | s.Every(30).Seconds().Do(SyncTaskStatus) //同步任务状态 |
| | | if isMaster { |
| | | s.Every(60).Seconds().Do(SyncProductionProgress) //同步生产数据 |
| | | s.Every(30).Seconds().Do(SyncTaskStatus) //同步任务状态 |
| | | } |
| | | s.StartAsync() |
| | | return nil |
| | | } |
| | | |
| | | func SyncProductionProgress() { |
| | | plcConfig, code := service.NewDevicePlcService().GetDevicePlc() |
| | | if code != ecode.OK { |
| | | progressList, err := service.NewProgressService().GetProgressList() |
| | | if err != nil { |
| | | logx.Errorf("SyncProductionProgress get records err:%v", err) |
| | | return |
| | | } |
| | | var channels []int32 |
| | | for _, item := range plcConfig.Details { |
| | | if item.FieldName == constvar.PlcStartAddressTypeFinishNumber { |
| | | channels = append(channels, item.Channel) |
| | | } |
| | | } |
| | | for _, channel := range channels { |
| | | progress, err := service.NewProgressService().GetCurrentProgress(channel) |
| | | if err != nil { |
| | | return |
| | | } |
| | | if progress == nil { |
| | | return |
| | | } |
| | | |
| | | for _, progress := range progressList { |
| | | caller := nsq.NewCaller(fmt.Sprintf(constvar.NsqTopicSyncTaskProgress, conf.Conf.NsqConf.NodeId), "") |
| | | err = caller.Send(progress) |
| | | if err != nil { |
| | |
| | | } |
| | | } |
| | | |
| | | func StopTask() { |
| | | func RestartTask(isMaster bool) error { |
| | | if s != nil { |
| | | s.Stop() |
| | | } |
| | | return StartTask(isMaster) |
| | | } |
| | | |
| | | // Once 一次性任务 |
| | | func 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) |
| | |
| | | logx.Errorf("nsq Init err:%v", err) |
| | | return |
| | | } |
| | | crontask.Once() |
| | | if err := crontask.StartTask(); err != nil { |
| | | logx.Errorf("crontab task Init err:%v", err) |
| | | return |
| | | } |
| | | |
| | | } |
| | | crontask.Once(agent.ClusterStatus != "slave") |
| | | if err := crontask.StartTask(agent.ClusterStatus != "slave"); err != nil { |
| | | logx.Errorf("crontab task Init err:%v", err) |
| | | return |
| | | } |
| | | |
| | | logx.Infof("apsClient start serve...") |
| | |
| | | func serfClusterEvent(stat int) { |
| | | switch stat { |
| | | case serf.EventCreateCluster, serf.EventSlave2Master, serf.EventLeaveCluster: |
| | | if err := nsq.Init(); err != nil { |
| | | if err := nsq.Init(); err != nil { //开启nsq |
| | | logx.Errorf("nsq Init err:%v", err) |
| | | return |
| | | } |
| | | crontask.Once() |
| | | if err := crontask.StartTask(); err != nil { |
| | | crontask.Once(true) |
| | | if err := crontask.RestartTask(true); err != nil { //以master方式重启task |
| | | logx.Errorf("crontab task Init err:%v", err) |
| | | return |
| | | } |
| | | case serf.EventJoinCluster, serf.EventMaster2Slave: |
| | | nsq.Stop() |
| | | crontask.StopTask() |
| | | nsq.Stop() //关闭nsq |
| | | crontask.Once(false) |
| | | if err := crontask.RestartTask(false); err != nil { //以非master方式重启task |
| | | logx.Errorf("crontab task Init err:%v", err) |
| | | return |
| | | } |
| | | } |
| | | |
| | | logx.Infof("serf cluster event: %v", stat) |
| | |
| | | |
| | | ProductionProgressSearch struct { |
| | | ProductionProgress |
| | | Order string |
| | | PageNum int |
| | | PageSize int |
| | | Orm *gorm.DB |
| | | Order string |
| | | PageNum int |
| | | PageSize int |
| | | Orm *gorm.DB |
| | | UnFinished bool |
| | | } |
| | | ) |
| | | |
| | |
| | | return slf |
| | | } |
| | | |
| | | func (slf *ProductionProgressSearch) SetUnFinished() *ProductionProgressSearch { |
| | | slf.UnFinished = true |
| | | return slf |
| | | } |
| | | |
| | | func (slf *ProductionProgressSearch) build() *gorm.DB { |
| | | var db = slf.Orm.Model(&ProductionProgress{}) |
| | | |
| | |
| | | db = db.Where("channel = ?", slf.Channel) |
| | | } |
| | | |
| | | if slf.UnFinished { |
| | | db = db.Where("finished_quantity < total_quantity") |
| | | } |
| | | |
| | | return db |
| | | } |
| | | |
| | |
| | | package service |
| | | |
| | | import ( |
| | | "apsClient/conf" |
| | | "apsClient/model" |
| | | "errors" |
| | | "github.com/jinzhu/gorm" |
| | |
| | | var ok bool |
| | | progressCache, ok = ProgressCacheGet(channel) |
| | | if !ok { |
| | | progressCache, err = model.NewProductionProgressSearch(nil).SetChannel(channel).SetOrder("id desc").First() |
| | | progressCache, err = model.NewProductionProgressSearch(nil).SetDeviceId(conf.Conf.System.DeviceId).SetChannel(channel).SetOrder("id desc").First() |
| | | if err == gorm.ErrRecordNotFound { |
| | | return nil, errors.New("progress not found") |
| | | } |
| | |
| | | } |
| | | return |
| | | } |
| | | |
| | | // GetProgressList 获取待同步进度工序 |
| | | func (slf ProgressService) GetProgressList() (progressList []*model.ProductionProgress, err error) { |
| | | progressList, err = model.NewProductionProgressSearch(nil).SetUnFinished().SetOrder("id desc").SetPage(1, 100).FindNotTotal() |
| | | return |
| | | } |