liujiandao
2023-11-03 4a9bc4b7c84985047c7ebe0b991e8c8364bb56a2
controllers/reorder_rule_controller.go
@@ -65,7 +65,7 @@
   if params.PageInfo.Check() {
      search.SetPage(params.Page, params.PageSize)
   }
   rules, total, err := search.SetPreload(true).SetKeyword(params.KeyWord).Find()
   rules, total, err := search.SetPreload(true).SetKeyword(params.KeyWord).SetLocationId(params.LocationId).SetProductId(params.ProductId).Find()
   if err != nil {
      util.ResponseFormat(c, code.RequestParamError, "查询重订货规则列表失败")
      return
@@ -76,29 +76,44 @@
      productIds = append(productIds, rule.ProductId)
      locationIds = append(locationIds, rule.LocationId)
   }
   if params.LocationId != 0 {
      locationIds = []int{params.LocationId}
   }
   if params.ProductId != "" {
      productIds = []string{params.ProductId}
   }
   //在库
   var status = []constvar.OperationStatus{constvar.OperationStatus_Finish, constvar.OperationStatus_Ready}
   amounts, err := models.NewLocationProductAmountSearch().SetProductIds(productIds).SetLocationIds(locationIds).Find()
   if err != nil {
      util.ResponseFormat(c, code.RequestParamError, "查询在库数量失败")
      return
   }
   for _, rule := range rules {
      for _, amount := range amounts {
         if rule.ProductId == amount.ProductId && rule.LocationId == amount.LocationId {
            rule.Amount = rule.Amount.Add(amount.Amount)
         }
      }
   }
   //预测
   //入库就绪
   var status = []constvar.OperationStatus{constvar.OperationStatus_Ready}
   var operationType = []constvar.BaseOperationType{constvar.BaseOperationTypeIncoming, constvar.BaseOperationTypeInternal}
   amount, err := GetProductAmount(productIds, locationIds, nil, status, operationType)
   if err != nil {
      util.ResponseFormat(c, code.RequestParamError, "查询重订货规则列表失败")
      return
   }
   mp := make(map[int]decimal.Decimal)
   for _, rule := range rules {
      for _, productAmount := range amount {
         if rule.ProductId == productAmount.ProductId && rule.LocationId == productAmount.ToLocationId &&
            productAmount.Status == constvar.OperationStatus_Finish {
            rule.Amount = rule.Amount.Add(productAmount.Amount)
         }
         if rule.ProductId == productAmount.ProductId && rule.LocationId == productAmount.ToLocationId &&
            productAmount.Status == constvar.OperationStatus_Ready {
            mp[rule.Id] = mp[rule.Id].Add(productAmount.Amount)
         if rule.ProductId == productAmount.ProductId && rule.LocationId == productAmount.ToLocationId {
            rule.Prediction = rule.Prediction.Add(productAmount.Amount)
         }
      }
      rule.Prediction = rule.Amount.Add(rule.Prediction)
   }
   //预测
   status = []constvar.OperationStatus{constvar.OperationStatus_Finish, constvar.OperationStatus_Ready}
   //出库就绪
   operationType = []constvar.BaseOperationType{constvar.BaseOperationTypeOutgoing, constvar.BaseOperationTypeInternal}
   amount, err = GetProductAmount(productIds, nil, locationIds, status, operationType)
   if err != nil {
@@ -108,13 +123,22 @@
   for _, rule := range rules {
      for _, productAmount := range amount {
         if rule.ProductId == productAmount.ProductId && rule.LocationId == productAmount.FromLocationId {
            rule.Prediction = rule.Prediction.Add(productAmount.Amount)
            rule.Prediction = rule.Prediction.Sub(productAmount.Amount)
         }
      }
      rule.Prediction = rule.Amount.Add(mp[rule.Id]).Sub(rule.Prediction)
   }
   var result []*models.ReorderRule
   if params.Type == "" {
      result = rules
   } else {
      for _, rule := range rules {
         if rule.MinInventory.GreaterThan(rule.Prediction) {
            result = append(result, rule)
         }
      }
   }
   util.ResponseFormatList(c, code.Success, rules, int(total))
   util.ResponseFormatList(c, code.Success, result, int(total))
}
// 计算在库与预测数量
@@ -124,7 +148,7 @@
   search := models.NewOperationDetailsSearch()
   search.Orm = search.Orm.Model(&models.OperationDetails{}).
      Select("wms_operation_details.product_id, wms_operation_details.amount, wms_operation.to_location_id as to_location_id, " +
         "wms_operation.from_location_id as from_location_id, wms_operation.status").
         "wms_operation.from_location_id as from_location_id, wms_operation.base_operation_type").
      Joins("left join wms_operation on wms_operation_details.operation_id = wms_operation.id")
   if len(productIds) > 0 {
      search.Orm.Where("wms_operation_details.product_id in (?)", productIds)
@@ -163,30 +187,24 @@
   productIds = append(productIds, params.ProductId)
   locationIds = append(locationIds, params.LocationId)
   amount := decimal.NewFromInt(0)
   p := decimal.NewFromInt(0)
   prediction := decimal.NewFromInt(0)
   //在库
   var status = []constvar.OperationStatus{constvar.OperationStatus_Finish, constvar.OperationStatus_Ready}
   var operationType = []constvar.BaseOperationType{constvar.BaseOperationTypeIncoming, constvar.BaseOperationTypeInternal}
   list, err := GetProductAmount(productIds, locationIds, nil, status, operationType)
   find, err := models.NewLocationProductAmountSearch().SetProductIds(productIds).SetLocationIds(locationIds).Find()
   if err != nil {
      util.ResponseFormat(c, code.RequestParamError, "查询重订货规则列表失败")
      util.ResponseFormat(c, code.RequestParamError, "查询在库数量失败")
      return
   }
   for _, productAmount := range list {
      if params.ProductId == productAmount.ProductId && params.LocationId == productAmount.ToLocationId &&
         productAmount.Status == constvar.OperationStatus_Finish {
   for _, productAmount := range find {
      if params.ProductId == productAmount.ProductId && params.LocationId == productAmount.LocationId {
         amount = amount.Add(productAmount.Amount)
      }
      if params.ProductId == productAmount.ProductId && params.LocationId == productAmount.ToLocationId &&
         productAmount.Status == constvar.OperationStatus_Ready {
         p = p.Add(productAmount.Amount)
      }
   }
   //预测
   status = []constvar.OperationStatus{constvar.OperationStatus_Finish, constvar.OperationStatus_Ready}
   operationType = []constvar.BaseOperationType{constvar.BaseOperationTypeOutgoing, constvar.BaseOperationTypeInternal}
   list, err = GetProductAmount(productIds, nil, locationIds, status, operationType)
   //入库就绪
   var status = []constvar.OperationStatus{constvar.OperationStatus_Ready}
   var operationType = []constvar.BaseOperationType{constvar.BaseOperationTypeIncoming, constvar.BaseOperationTypeInternal}
   list, err := GetProductAmount(productIds, locationIds, nil, status, operationType)
   if err != nil {
      util.ResponseFormat(c, code.RequestParamError, "查询重订货规则列表失败")
      return
@@ -196,7 +214,19 @@
         prediction = prediction.Add(productAmount.Amount)
      }
   }
   prediction = amount.Add(p).Sub(prediction)
   prediction = amount.Add(prediction)
   //出库就绪
   operationType = []constvar.BaseOperationType{constvar.BaseOperationTypeOutgoing, constvar.BaseOperationTypeInternal}
   list, err = GetProductAmount(productIds, nil, locationIds, status, operationType)
   if err != nil {
      util.ResponseFormat(c, code.RequestParamError, "查询重订货规则列表失败")
      return
   }
   for _, productAmount := range list {
      if params.ProductId == productAmount.ProductId && params.LocationId == productAmount.FromLocationId {
         prediction = prediction.Sub(productAmount.Amount)
      }
   }
   m := make(map[string]int64)
   m["amount"] = amount.IntPart()
   m["prediction"] = prediction.IntPart()