zhangqian
2023-11-09 02a84fb6fb2a39bfe7fc5cf6c0137bbf231b17fe
service/progress.go
@@ -1,9 +1,10 @@
package service
import (
   "apsClient/conf"
   "apsClient/model"
   "errors"
   "gorm.io/gorm"
   "github.com/jinzhu/gorm"
)
type ProgressService struct {
@@ -13,44 +14,67 @@
   return &ProgressService{}
}
func (slf ProgressService) AddProgress(db *gorm.DB, procedure *model.Procedures, order *model.Order) error {
   progress := &model.ProductionProgress{
      WorkOrderID:   procedure.WorkOrderID,
      OrderID:       procedure.OrderID,
      ProcedureID:   procedure.ProceduresInfo.ProcedureID,
      DeviceID:      procedure.DeviceID,
      TotalQuantity: order.Amount.IntPart(),
   }
   err := model.NewProductionProgressSearch(db).Create(progress)
   if err != nil {
      return err
   }
   ProgressCacheSet(progress)
   return nil
}
func (slf ProgressService) UpdateProgress(finishedQuantity int64) (err error) {
   var progressCache *model.ProductionProgress
   progressCache, ok := ProgressCacheGet()
   if !ok {
      progressCache, err = model.NewProductionProgressSearch(nil).SetOrder("id desc").First()
      if err == gorm.ErrRecordNotFound {
         return errors.New("progress cache not found")
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
      }
      if progressCache.FinishedQuantity < progressCache.TotalQuantity {
         ProgressCacheSet(progressCache)
      }
      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(progressCache)
      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).SetDeviceId(conf.Conf.CurrentDeviceID).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
}
// GetProgressList 获取待同步进度工序
func (slf ProgressService) GetProgressList() (progressList []*model.ProductionProgress, err error) {
   progressList, err = model.NewProductionProgressSearch(nil).SetUnFinished().SetOrder("id desc").SetPage(1, 100).FindNotTotal()
   return
}