zhangqian
2024-08-01 fc3313955a083c9480e4ea74398f72f9ba6addcd
models/location_product_amount.go
@@ -1,6 +1,7 @@
package models
import (
   "encoding/json"
   "fmt"
   "github.com/shopspring/decimal"
   "gorm.io/gorm"
@@ -9,19 +10,21 @@
)
type (
   // LocationProductAmount 库存产品数量
   LocationProductAmount struct {
      WmsModel
      Id int `json:"id"  gorm:"column:id;primary_key;AUTO_INCREMENT"`
      //LocationProductId int             `json:"locationProductId" gorm:"type:int;not null;comment:上架规则id"` //上架规则id
      //LocationProduct   LocationProduct `json:"locationProduct" gorm:"foreignKey:LocationProductId;references:Id"`
      LocationId        int             `json:"locationId" gorm:"type:int;not null;comment:位置id"` //位置id
      Id                int             `json:"id"  gorm:"column:id;primary_key;AUTO_INCREMENT"`
      LocationId        int             `json:"locationId" gorm:"type:int;not null;comment:位置id"`            //位置id
      WarehouseId       int             `json:"warehouseId" gorm:"type:int;not null;default:0;comment:仓库id"` // 仓库id
      Location          Location        `json:"location" gorm:"foreignKey:LocationId;references:id"`
      ProductCategoryID int             `json:"productCategoryId" gorm:"type:int;not null;comment:产品种类id"` //产品种类id
      ProductCategory   ProductCategory `json:"productCategory" gorm:"foreignKey:ProductCategoryID;references:Id"`
      ProductId         string          `json:"productId" gorm:"type:varchar(191);not null;comment:产品id"` //产品id
      Product           Material        `json:"product" gorm:"foreignKey:ProductId;references:ID"`
      Amount            decimal.Decimal `json:"amount" gorm:"type:decimal(20,2);not null;comment:库存数量"` //库存数量
      CreateDate        string          `json:"createDate" gorm:"type:varchar(63);comment:日期"`          //日期
      MoreUnitList      []UnitItems     `json:"amountMoreUnits" gorm:"-"`                               //在库数量多单位
      MoreUnitValue     string          `json:"-" gorm:"type:varchar(255);comment:多单位值"`
      CreateDate        string          `json:"createDate" gorm:"type:varchar(63);comment:日期"` //日期
   }
   LocationProductAmountSearch struct {
@@ -33,10 +36,13 @@
      Orm      *gorm.DB
      Preload  bool
      //LocationProductIds []int
      LocationIds []int
      ProductIds  []string
      Ids         []int
      Query       string
      LocationIds     []int
      ProductIds      []string
      Ids             []int
      Query           string
      Fields          string
      CategoryIds     []int
      JoinedMaterials bool
   }
   LocationProductAmountWithOperation struct {
@@ -47,19 +53,51 @@
      ProductId               string                     `json:"productId" gorm:"column:product_id"`
      ProductName             string                     `json:"productName" gorm:"column:product_name"`
      Amount                  decimal.Decimal            `json:"amount" gorm:"column:amount"`
      Unit                    string                     `json:"unit" gorm:"column:unit"`
      CreateDate              string                     `json:"createDate" gorm:"column:create_date"`
      AmountMoreUnits         []UnitItems                `json:"amountMoreUnits" gorm:"-"` //在库数量多单位
      Unit                    string                     `json:"unit" gorm:"column:unit;size:50;comment:物品单位"`
      CreateDate              string                     `json:"createDate" gorm:"column:create_date;size:50;comment:创建时间"`
      AdjustAmount            decimal.Decimal            `json:"adjustAmount" gorm:"column:adjust_amount"` //差值
      DifferenceAmount        decimal.Decimal            `json:"differenceAmount" gorm:"-"`                //计数数量
      OperationId             int                        `json:"operationId" gorm:"column:operation_id"`
      Status                  constvar.OperationStatus   `json:"status" gorm:"status"`
      BaseOperationType       constvar.BaseOperationType `json:"baseOperationType" gorm:"base_operation_type"`
      Weight                  decimal.Decimal            `gorm:"type:decimal(20,3);comment:重量" json:"weight"` //重量
      OperationId             int                        `json:"operationId" gorm:"column:operation_id;comment:库存操作记录"`
      Status                  constvar.OperationStatus   `json:"status" gorm:";comment:操作状态(3就绪、4完成、5取消)"`                    // 操作状态
      BaseOperationType       constvar.BaseOperationType `json:"baseOperationType" gorm:"base_operation_type;comment:基础作业类型"` // 基础作业类型
      Weight                  decimal.Decimal            `gorm:"type:decimal(20,3);comment:重量" json:"weight"`                 //重量
   }
)
func (slf *LocationProductAmount) TableName() string {
   return "wms_location_product_amount"
}
func (slf *LocationProductAmount) AfterFind(tx *gorm.DB) (err error) {
   if slf.MoreUnitValue != "" {
      var arr []UnitItems
      err := json.Unmarshal([]byte(slf.MoreUnitValue), &arr)
      if err != nil {
         return err
      }
      slf.MoreUnitList = arr
   }
   return
}
func (slf *LocationProductAmount) BeforeCreate(tx *gorm.DB) (err error) {
   if len(slf.MoreUnitList) != 0 {
      items := make([]UnitItems, 0)
      for k, item := range slf.MoreUnitList {
         if item.Unit != "" && !item.Amount.IsZero() {
            items = append(items, slf.MoreUnitList[k])
         }
      }
      str, err := json.Marshal(items)
      if err != nil {
         return err
      }
      slf.MoreUnitValue = string(str)
   }
   return
}
func NewLocationProductAmountSearch() *LocationProductAmountSearch {
@@ -126,6 +164,21 @@
   return slf
}
func (slf *LocationProductAmountSearch) SetWarehouseId(wid int) *LocationProductAmountSearch {
   slf.WarehouseId = wid
   return slf
}
func (slf *LocationProductAmountSearch) SetFields(fields string) *LocationProductAmountSearch {
   slf.Fields = fields
   return slf
}
func (slf *LocationProductAmountSearch) SetCategoryIds(ids []int) *LocationProductAmountSearch {
   slf.CategoryIds = ids
   return slf
}
func (slf *LocationProductAmountSearch) build() *gorm.DB {
   var db = slf.Orm.Model(&LocationProductAmount{})
@@ -137,6 +190,10 @@
   }
   if slf.Keyword != "" {
      if !slf.JoinedMaterials {
         db = db.Joins("left join material on wms_location_product_amount.product_id = material.id")
         slf.JoinedMaterials = true
      }
      db = db.Joins("left join wms_location on wms_location_product_amount.location_id = wms_location.id").
         Joins("left join material on wms_location_product_amount.product_id = material.id").
         Joins("left join wms_product_category on wms_location_product_amount.product_category_id = wms_product_category.id").
@@ -147,9 +204,7 @@
   if slf.Preload {
      db = db.Model(&LocationProductAmount{}).Preload("Location").Preload("Product").Preload("ProductCategory")
   }
   //if slf.LocationProductId != 0 {
   //   db = db.Where("location_product_id=?", slf.LocationProductId)
   //}
   if len(slf.ProductIds) > 0 {
      db = db.Where("product_id in (?)", slf.ProductIds)
   }
@@ -172,6 +227,22 @@
   if slf.Query != "" {
      db = db.Where(slf.Query)
   }
   if slf.WarehouseId != 0 {
      db = db.Where("warehouse_id = ?", slf.WarehouseId)
   }
   if slf.Fields != "" {
      db = db.Select(slf.Fields)
   }
   if len(slf.CategoryIds) > 0 {
      if !slf.JoinedMaterials {
         db = db.Joins("left join material on wms_location_product_amount.product_id = material.id")
         slf.JoinedMaterials = true
      }
      db = db.Where("material.category_id in ?", slf.CategoryIds)
   }
   return db
@@ -263,6 +334,19 @@
   return records, nil
}
func (slf *LocationProductAmountSearch) FindAll() ([]*LocationProductAmount, error) {
   var (
      records = make([]*LocationProductAmount, 0)
      db      = slf.build()
   )
   if err := db.Find(&records).Error; err != nil {
      return records, fmt.Errorf("find records err: %v", err)
   }
   return records, nil
}
func (slf *LocationProductAmountSearch) FirstRes() (*LocationProductAmount, *gorm.DB) {
   var (
      record = new(LocationProductAmount)