package models
|
|
import (
|
"fmt"
|
"github.com/shopspring/decimal"
|
"gorm.io/gorm"
|
"wms/constvar"
|
"wms/pkg/mysqlx"
|
)
|
|
type (
|
// Material 物料
|
Material struct {
|
BaseModelString
|
Name string `gorm:"unique;type:varchar(191);not null;comment:物料名称" json:"name"` //物料名称
|
//MaterialType constvar.ProductType `gorm:"index;type:int(11);comment:物料类型(数字)" json:"materialType"`
|
Model constvar.MaterialMode `gorm:"type:varchar(191);not null;comment:物料类型(字符串)" json:"model"` //物料类型(字符串)
|
//Explain string `gorm:"type:varchar(512);comment:编号说明" json:"explain"`
|
//CodeStandardID string `gorm:"type:varchar(191);comment:编码规范ID" json:"codeStandardID"`
|
//Specs string `gorm:"type:varchar(191);comment:物料规格" json:"specs"`
|
//Type string `gorm:"type:varchar(191);comment:物料型号" json:"type"`
|
MinInventory decimal.Decimal `gorm:"type:decimal(35,18);comment:最小库存" json:"minInventory"` //最小库存
|
MaxInventory decimal.Decimal `gorm:"type:decimal(35,18);comment:最大库存" json:"maxInventory"` //最大库存
|
Amount decimal.Decimal `gorm:"type:decimal(35,18);comment:数量" json:"amount"` //数量
|
//LockAmount decimal.Decimal `gorm:"type:decimal(35,18);default:0;comment:锁定数量" json:"lockAmount"`
|
Unit string `gorm:"type:varchar(100);comment:单位" json:"unit"` //单位
|
//Note string `gorm:"type:varchar(1024);comment:备注" json:"note"`
|
TemplateID string `gorm:"type:varchar(191);comment:模板ID" json:"templateID"` //模板ID
|
//FSource string `gorm:"type:varchar(191);comment:生产车间" json:"-"`
|
//Status constvar.MaterialStatus `gorm:"type:int(11);comment:状态" json:"status"`
|
Supplier string `gorm:"type:varchar(191);comment:供应商" json:"supplier"` //供应商
|
PurchasePrice decimal.Decimal `gorm:"type:decimal(35,18);comment:采购价格" json:"purchasePrice"` //采购价格
|
//PurchaseAheadDay int `gorm:"type:int(11);comment:采购提前期(天)" json:"purchaseAheadDay"`
|
//ProduceAheadDay int `gorm:"type:int(11);comment:制造提前期(天)" json:"produceAheadDay"`
|
MinPurchaseAmount decimal.Decimal `gorm:"type:decimal(35,18);comment:最小采购量" json:"minPurchaseAmount"` //最小采购量
|
//PurchaseType constvar.PurchaseType `gorm:"type:int(11);comment:采购类型" json:"purchaseType"`
|
IsSale bool `gorm:"type:tinyint(1);comment:是否销售" json:"isSale"` //是否销售
|
SalePrice decimal.Decimal `gorm:"type:decimal(35,18);comment:销售单价" json:"salePrice"` //销售单价
|
AutoIncr uint `gorm:"type:int(11);comment:自增ID;default:0;" json:"-"`
|
//wms添加字段
|
ProductType constvar.ProductType `gorm:"type:int(11);comment:产品类型" json:"productType"` //产品类型
|
InvoicingStrategy constvar.InvoicingStrategy `gorm:"type:int(11);comment:开票策略" json:"invoicingStrategy"` //开票策略
|
OrderCreation constvar.OrderCreation `gorm:"type:int(11);comment:订单创建" json:"orderCreation"` //订单创建
|
CustomerTaxes decimal.Decimal `gorm:"type:decimal(20,2);comment:客户税" json:"customerTaxes"` //客户税百分比
|
Cost decimal.Decimal `gorm:"type:decimal(20,2);comment:成本" json:"cost"` //成本
|
CategoryId int `gorm:"type:int(11);comment:产品类别id" json:"categoryId"` //产品类别id
|
CategoryName string `gorm:"type:varchar(255);comment:产品类别名称" json:"categoryName"` //产品类别名称
|
InternalReference string `gorm:"type:varchar(255);comment:内部参考" json:"internalReference"` //内部参考
|
Barcode string `gorm:"type:varchar(255);comment:条码" json:"barcode"` //条码
|
ProductTagId int `gorm:"type:int(11);comment:产品标签id" json:"productTagId"` //产品标签id
|
ProductTagName string `gorm:"type:varchar(255);comment:产品标签名称" json:"productTagName"` //产品标签名称
|
CompanyId int `gorm:"type:int(11);comment:公司id" json:"companyId"` //公司id
|
CompanyName string `gorm:"type:varchar(255);comment:公司名称" json:"companyName"` //公司名称
|
InternalNotes string `gorm:"type:varchar(512);comment:内部说明" json:"internalNotes"` //内部说明
|
SelectProduct string `gorm:"type:varchar(255);comment:可选产品id" json:"selectProduct"` //可选产品id
|
SellExplain string `gorm:"type:varchar(512);comment:销售说明" json:"sellExplain"` //销售说明
|
CanBePurchased bool `gorm:"type:int(11);comment:是否可采购" json:"canBePurchased"` //是否可采购
|
CurrencyName string `gorm:"type:varchar(255);comment:币种名称" json:"currencyName"` //币种名称
|
DeliveryAdvanceTime int `gorm:"type:int(11);comment:交货提前时间(天)" json:"deliveryAdvanceTime"` //交货提前时间(天)
|
ControlStrategy constvar.InvoicingStrategy `gorm:"type:int(11);comment:控制策略" json:"controlStrategy"` //控制策略
|
BuyExplain string `gorm:"type:varchar(512);comment:采购说明" json:"buyExplain"` //采购说明
|
Principal string `gorm:"type:varchar(255);comment:负责人" json:"principal"` //负责人
|
Weight decimal.Decimal `gorm:"type:decimal(20,2);comment:重量" json:"weight"` //重量
|
Volume decimal.Decimal `gorm:"type:decimal(20,2);comment:体积" json:"volume"` //体积
|
HSCode string `gorm:"type:varchar(255);comment:HS编码" json:"HSCode"` //HS编码
|
OriginCountryId int `gorm:"type:int(11);comment:原产地id" json:"originCountryId"` //原产地id
|
OriginCountryName string `gorm:"type:varchar(255);comment:原产地名称" json:"originCountryName"` //原产地名称
|
InStorageExplain string `gorm:"type:varchar(512);comment:入库说明" json:"inStorageExplain"` //入库说明
|
OutStorageExplain string `gorm:"type:varchar(512);comment:出库说明" json:"outStorageExplain"` //出库说明
|
InternalTransferExplain string `gorm:"type:varchar(512);comment:内部调拨说明" json:"internalTransferExplain"` //内部调拨说明
|
}
|
|
MaterialSearch struct {
|
Material
|
//MaterialTypes []constvar.MaterialType
|
Keyword string
|
//SetTemplateType constvar.SetTemplateType
|
Order string
|
PageNum int
|
PageSize int
|
Ids []string
|
Orm *gorm.DB
|
}
|
|
IdAndName struct {
|
Id string `json:"id"`
|
Name string `json:"name"`
|
}
|
)
|
|
func (slf Material) TableName() string {
|
return "material"
|
}
|
|
func NewMaterialSearch() *MaterialSearch {
|
return &MaterialSearch{Orm: mysqlx.GetDB()}
|
}
|
|
func (slf *MaterialSearch) SetOrm(tx *gorm.DB) *MaterialSearch {
|
slf.Orm = tx
|
return slf
|
}
|
|
func (slf *MaterialSearch) SetPage(page, size int) *MaterialSearch {
|
slf.PageNum, slf.PageSize = page, size
|
return slf
|
}
|
|
func (slf *MaterialSearch) SetOrder(order string) *MaterialSearch {
|
slf.Order = order
|
return slf
|
}
|
|
func (slf *MaterialSearch) SetID(id string) *MaterialSearch {
|
slf.ID = id
|
return slf
|
}
|
|
func (slf *MaterialSearch) SetIsSale(isSale bool) *MaterialSearch {
|
slf.IsSale = isSale
|
return slf
|
}
|
|
func (slf *MaterialSearch) SetIDs(ids []string) *MaterialSearch {
|
slf.Ids = ids
|
return slf
|
}
|
|
func (slf *MaterialSearch) SetName(name string) *MaterialSearch {
|
slf.Name = name
|
return slf
|
}
|
|
//func (slf *MaterialSearch) SetMaterialType(materialType constvar.MaterialType) *MaterialSearch {
|
// slf.MaterialType = materialType
|
// return slf
|
//}
|
//
|
//func (slf *MaterialSearch) SetMaterialTypes(materialTypes []constvar.MaterialType) *MaterialSearch {
|
// slf.MaterialTypes = materialTypes
|
// return slf
|
//}
|
|
func (slf *MaterialSearch) SetKeyword(keyword string) *MaterialSearch {
|
slf.Keyword = keyword
|
return slf
|
}
|
|
func (slf *MaterialSearch) SetTemplateID(id string) *MaterialSearch {
|
slf.TemplateID = id
|
return slf
|
}
|
|
//
|
//func (slf *MaterialSearch) SetSetTemplateType(setType constvar.SetTemplateType) *MaterialSearch {
|
// slf.SetTemplateType = setType
|
// return slf
|
//}
|
|
//func (slf *MaterialSearch) SetStatus(status constvar.MaterialStatus) *MaterialSearch {
|
// slf.Status = status
|
// return slf
|
//}
|
|
func (slf *MaterialSearch) build() *gorm.DB {
|
var db = slf.Orm.Table(slf.TableName())
|
|
if slf.ID != "" {
|
db = db.Where("id = ?", slf.ID)
|
}
|
|
if slf.Name != "" {
|
db = db.Where("name = ?", slf.Name)
|
}
|
|
if slf.TemplateID != "" {
|
db = db.Where("template_id = ?", slf.TemplateID)
|
}
|
|
//if slf.SetTemplateType > 0 {
|
// if slf.SetTemplateType == constvar.SetTemplateTypeWithTemplate { // 模板ID非空
|
// db = db.Where("template_id <> ?", "")
|
// } else if slf.SetTemplateType == constvar.SetTemplateTypeWithNoTemplate {
|
// db = db.Where("template_id = ?", "")
|
// }
|
//}
|
|
//if slf.MaterialType > 0 {
|
// db = db.Where("material_type = ?", slf.MaterialType)
|
//}
|
|
//if len(slf.MaterialTypes) > 0 {
|
// var query string
|
// for i, materialType := range slf.MaterialTypes {
|
// if i == 0 {
|
// query += fmt.Sprintf("(material_type = %d", materialType)
|
// } else {
|
// query += fmt.Sprintf(" or material_type = %d", materialType)
|
// }
|
// if i == len(slf.MaterialTypes)-1 {
|
// query += ")"
|
// }
|
// }
|
// db = db.Where(query)
|
//}
|
|
if slf.Keyword != "" {
|
db = db.Where("name LIKE ? or id LIKE ? ", "%"+slf.Keyword+"%", "%"+slf.Keyword+"%")
|
}
|
|
if slf.Order != "" {
|
db = db.Order(slf.Order)
|
}
|
|
//if slf.Status != 0 {
|
// db = db.Where("status = ?", slf.Status)
|
//}
|
if len(slf.Ids) > 0 {
|
db = db.Where("id in ?", slf.Ids)
|
}
|
if slf.IsSale {
|
db = db.Where("is_sale = ?", 1)
|
}
|
|
return db
|
}
|
|
// Create 单条插入
|
func (slf *MaterialSearch) Create(record *Material) error {
|
var db = slf.build()
|
|
if err := db.Create(record).Error; err != nil {
|
return fmt.Errorf("create err: %v, record: %+v", err, record)
|
}
|
|
return nil
|
}
|
|
// CreateBatch 批量插入
|
func (slf *MaterialSearch) CreateBatch(records []*Material) error {
|
var db = slf.build()
|
|
if err := db.Create(&records).Error; err != nil {
|
return fmt.Errorf("create batch err: %v, records: %+v", err, records)
|
}
|
|
return nil
|
}
|
|
func (slf *MaterialSearch) Save(record *Material) error {
|
var db = slf.build()
|
|
if err := db.Omit("CreatedAt").Save(record).Error; err != nil {
|
return fmt.Errorf("save err: %v, record: %+v", err, record)
|
}
|
|
return nil
|
}
|
|
func (slf *MaterialSearch) UpdateByMap(upMap map[string]interface{}) error {
|
var (
|
db = slf.build()
|
)
|
|
if err := db.Updates(upMap).Error; err != nil {
|
return fmt.Errorf("update by map err: %v, upMap: %+v", err, upMap)
|
}
|
|
return nil
|
}
|
|
func (slf *MaterialSearch) UpdateByQuery(query string, args []interface{}, upMap map[string]interface{}) error {
|
var (
|
db = slf.Orm.Table(slf.TableName()).Where(query, args...)
|
)
|
|
if err := db.Updates(upMap).Error; err != nil {
|
return fmt.Errorf("update by query err: %v, query: %s, args: %+v, upMap: %+v", err, query, args, upMap)
|
}
|
|
return nil
|
}
|
|
func (slf *MaterialSearch) Delete() error {
|
var db = slf.build()
|
|
if err := db.Unscoped().Delete(&Material{}).Error; err != nil {
|
return err
|
}
|
|
return nil
|
}
|
|
func (slf *MaterialSearch) First() (*Material, error) {
|
var (
|
record = new(Material)
|
db = slf.build()
|
)
|
|
if err := db.First(record).Error; err != nil {
|
return record, err
|
}
|
|
return record, nil
|
}
|
|
func (slf *MaterialSearch) Find() ([]*Material, int64, error) {
|
var (
|
records = make([]*Material, 0)
|
total int64
|
db = slf.build()
|
)
|
|
if err := db.Count(&total).Error; err != nil {
|
return records, total, fmt.Errorf("find count err: %v", err)
|
}
|
if slf.PageNum*slf.PageSize > 0 {
|
db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
|
}
|
if err := db.Find(&records).Error; err != nil {
|
return records, total, fmt.Errorf("find records err: %v", err)
|
}
|
|
return records, total, nil
|
}
|
|
func (slf *MaterialSearch) FindNotTotal() ([]*Material, error) {
|
var (
|
records = make([]*Material, 0)
|
db = slf.build()
|
)
|
|
if slf.PageNum*slf.PageSize > 0 {
|
db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
|
}
|
if err := db.Find(&records).Error; err != nil {
|
return records, fmt.Errorf("find records err: %v", err)
|
}
|
|
return records, nil
|
}
|
|
// FindByQuery 指定条件查询.
|
func (slf *MaterialSearch) FindByQuery(query string, args []interface{}) ([]*Material, int64, error) {
|
var (
|
records = make([]*Material, 0)
|
total int64
|
db = slf.Orm.Table(slf.TableName()).Where(query, args...)
|
)
|
|
if err := db.Count(&total).Error; err != nil {
|
return records, total, fmt.Errorf("find by query count err: %v", err)
|
}
|
if slf.PageNum*slf.PageSize > 0 {
|
db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
|
}
|
if err := db.Find(&records).Error; err != nil {
|
return records, total, fmt.Errorf("find by query records err: %v, query: %s, args: %+v", err, query, args)
|
}
|
|
return records, total, nil
|
}
|
|
// FindByQueryNotTotal 指定条件查询&不查询总条数.
|
func (slf *MaterialSearch) FindByQueryNotTotal(query string, args []interface{}) ([]*Material, error) {
|
var (
|
records = make([]*Material, 0)
|
db = slf.Orm.Table(slf.TableName()).Where(query, args...)
|
)
|
|
if slf.PageNum*slf.PageSize > 0 {
|
db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
|
}
|
if err := db.Find(&records).Error; err != nil {
|
return records, fmt.Errorf("find by query records err: %v, query: %s, args: %+v", err, query, args)
|
}
|
|
return records, nil
|
}
|
|
//func (slf *MaterialSearch) Upsert(materialList []*Material) error {
|
// var buffer bytes.Buffer
|
// sql := fmt.Sprintf("insert into `%s` (`id`,`created_at`,`updated_at`,`name`,`model`,`material_type`,`explain`,`code_standard_id`,`specs`,"+
|
// "`type`,`min_inventory`,`max_inventory`,`amount`,`unit`,`note`,`f_source`, `purchase_type`) values", slf.TableName())
|
// if _, err := buffer.WriteString(sql); err != nil {
|
// return err
|
// }
|
//
|
// for i, e := range materialList {
|
// buffer.WriteString(fmt.Sprintf("('%v','%v','%v','%v','%v','%v','%v','%v','%v','%v','%v','%v','%v','%v','%v','%v', '%d')", e.ID, e.CreatedAt.String(), e.UpdatedAt.String(), e.Name,
|
// e.Model, e.MaterialType, e.Explain, e.CodeStandardID, e.Specs, e.Type, e.MinInventory, e.MaxInventory, e.Amount, e.Unit, e.Note, e.FSource, int(e.PurchaseType)))
|
// if i == len(materialList)-1 {
|
// buffer.WriteString("")
|
// } else {
|
// buffer.WriteString(",")
|
// }
|
// }
|
// buffer.WriteString(fmt.Sprintf("on duplicate key update `updated_at`=values(`updated_at`), `name`=values(`name`), `specs`=values(`specs`), `type`=values(`type`), " +
|
// "`min_inventory`=values(`min_inventory`), `max_inventory`=values(`max_inventory`), `amount`=values(`amount`), `unit`=values(`unit`), `note`=values(`note`), `f_source`=values(`f_source`), `purchase_type`=values(`purchase_type`);"))
|
// err := slf.Orm.Exec(buffer.String()).Error
|
// if err != nil {
|
// logx.Errorf("Upsert sql:%v, err:%v", buffer.String(), err)
|
// }
|
// return err
|
//}
|
|
func (slf *MaterialSearch) GetMaterialListByIds(ids []string) ([]*Material, error) {
|
var (
|
records = make([]*Material, 0)
|
db = slf.Orm.Table(slf.TableName()).Where("id in (?)", ids)
|
)
|
|
if err := db.Find(&records).Error; err != nil {
|
return records, fmt.Errorf("find records err: %v", err)
|
}
|
|
return records, nil
|
}
|
|
//func ExportMaterial(materials []*Material) (string, error) {
|
// var fileName string
|
// f := excelize.NewFile()
|
//
|
// f.SetCellValue("Sheet1", "A1", "物料编码")
|
// f.SetCellValue("Sheet1", "B1", "编码说明")
|
// f.SetCellValue("Sheet1", "C1", "物料名称")
|
// f.SetCellValue("Sheet1", "D1", "物料规格")
|
// f.SetCellValue("Sheet1", "E1", "物料型号")
|
// f.SetCellValue("Sheet1", "F1", "供应商")
|
// f.SetCellValue("Sheet1", "G1", "采购价格")
|
// f.SetCellValue("Sheet1", "H1", "安全库存")
|
// f.SetCellValue("Sheet1", "I1", "剩余库存")
|
// f.SetCellValue("Sheet1", "J1", "物料类型")
|
// f.SetCellValue("Sheet1", "K1", "单位")
|
// f.SetCellValue("Sheet1", "L1", "备注")
|
//
|
// for i, m := range materials {
|
// f.SetCellValue("Sheet1", "A"+strconv.Itoa(i+2), m.ID)
|
// f.SetCellValue("Sheet1", "B"+strconv.Itoa(i+2), m.Explain)
|
// f.SetCellValue("Sheet1", "C"+strconv.Itoa(i+2), m.Name)
|
// f.SetCellValue("Sheet1", "D"+strconv.Itoa(i+2), m.Specs)
|
// f.SetCellValue("Sheet1", "E"+strconv.Itoa(i+2), m.Type)
|
// f.SetCellValue("Sheet1", "F"+strconv.Itoa(i+2), m.Supplier)
|
// f.SetCellValue("Sheet1", "G"+strconv.Itoa(i+2), m.PurchasePrice.String())
|
// f.SetCellValue("Sheet1", "H"+strconv.Itoa(i+2), m.MinInventory.String()+"-"+m.MaxInventory.String())
|
// f.SetCellValue("Sheet1", "I"+strconv.Itoa(i+2), m.Amount.String())
|
// f.SetCellValue("Sheet1", "J"+strconv.Itoa(i+2), m.Model)
|
// f.SetCellValue("Sheet1", "K"+strconv.Itoa(i+2), m.Unit)
|
// f.SetCellValue("Sheet1", "L"+strconv.Itoa(i+2), m.Note)
|
// }
|
//
|
// fileName = "material.xlsx"
|
// if err := f.SaveAs(fileName); err != nil {
|
// return fileName, err
|
// }
|
//
|
// return fileName, nil
|
//}
|
|
func (slf *MaterialSearch) MaxAutoIncr() (int64, error) {
|
type Result struct {
|
Max int64
|
}
|
|
var (
|
result Result
|
db = slf.build()
|
)
|
|
err := db.Select("MAX(auto_incr) as max").Scan(&result).Error
|
if err != nil {
|
return result.Max, fmt.Errorf("max err: %v", err)
|
}
|
return result.Max, nil
|
}
|