package service import ( "apsClient/model" "errors" "gorm.io/gorm" ) type ProgressService struct { } func NewProgressService() *ProgressService { return &ProgressService{} } func (slf ProgressService) Add(db *gorm.DB, procedure *model.Procedures, order *model.Order) error { _, err := model.NewProductionProgressSearch(db).SetProcedureId(procedure.ProcedureID).SetWorkOrderId(procedure.WorkOrderID).First() if err == gorm.ErrRecordNotFound { progress := &model.ProductionProgress{ WorkOrderID: procedure.WorkOrderID, OrderID: procedure.OrderID, ProcedureID: procedure.ProceduresInfo.ProcedureID, DeviceID: procedure.DeviceID, TotalQuantity: order.Amount.IntPart(), Channel: procedure.Channel, } err := model.NewProductionProgressSearch(db).Create(progress) if err != nil { return err } ProgressCacheSet(procedure.Channel, progress) } return nil } func (slf ProgressService) UpdateProgress(channel int32, finishedQuantity int64) (err error) { progressCache, err := slf.GetCurrentProgress(channel) if err != nil { return err } if progressCache == nil { return errors.New("progress cache not found") } if finishedQuantity > progressCache.FinishedQuantity { //当有变化时才更新 progressCache.FinishedQuantity = finishedQuantity ProgressCacheSet(channel, progressCache) return model.NewProductionProgressSearch(nil).SetId(progressCache.ID).Save(progressCache) } return nil } func (slf ProgressService) GetCurrentProgress(channel int32) (progressCache *model.ProductionProgress, err error) { var ok bool progressCache, ok = ProgressCacheGet(channel) if !ok { progressCache, err = model.NewProductionProgressSearch(nil).SetChannel(channel).SetOrder("id desc").First() if err == gorm.ErrRecordNotFound { return nil, errors.New("progress not found") } if err != nil { return nil, err } if progressCache.FinishedQuantity >= progressCache.TotalQuantity { //如果完成量大于等于总量就说明是上一个已完成的任务,不是当前进行中的任务。 progressCache = nil } if progressCache != nil { ProgressCacheSet(channel, progressCache) } } return }