package models import ( "encoding/json" "fmt" "github.com/shopspring/decimal" "github.com/spf13/cast" "gorm.io/gorm" "strings" "wms/constvar" "wms/pkg/mysqlx" ) type ( // Material 物料 Material struct { BaseModelString Name string `gorm:"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"` PurchaseTypes string `gorm:"type:varchar(255);comment:采购类型范围" json:"-"` PurchaseTypeList []int `gorm:"-" json:"purchaseTypeList"` 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:"autoIncr"` //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"` //币种名称 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,3);comment:重量" json:"weight"` //重量 Volume decimal.Decimal `gorm:"type:decimal(20,2);comment:体积" json:"volume"` //体积 MakeAdvanceTime decimal.Decimal `gorm:"type:decimal(20,2);comment:制造前置时间" json:"makeAdvanceTime"` //制造前置时间(天) OrderAdvanceTime decimal.Decimal `gorm:"type:decimal(20,2);comment:订单准备天数" json:"orderAdvanceTime"` //订单准备天数(天) DeliveryAdvanceTime decimal.Decimal `gorm:"type:decimal(20,2);comment:客户前置时间" json:"deliveryAdvanceTime"` //客户前置时间(天) //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"` //内部调拨说明 AttachmentList []*Attachment `json:"attachmentList" gorm:"many2many:material_attachment"` IsStorage int `gorm:"type:tinyint(1);default:1;comment:是否存库(1是2否)" json:"isStorage"` //无库存的在wms以及srm中需要过滤掉 IsVirtual int `json:"isVirtual" gorm:"type:tinyint(1);default:2;comment:是否虚拟物料(1是2否)"` //虚拟物料在MRP计算时跳过该层级直接领用下级物料,虚拟物料不生成工单 ReorderRuleNum int64 `json:"reorderRuleNum"` MoreUnit *bool `json:"moreUnit" gorm:"type:tinyint(1);default:false;comment:启动多单位"` MoreUnitList []UnitItems `json:"moreUnitList" gorm:"-"` MoreUnitValue string `json:"-" gorm:"type:varchar(255);comment:多单位值"` GrossWeight decimal.Decimal `json:"grossWeight" gorm:"type:decimal(20,3);comment:毛重"` NetWeight decimal.Decimal `json:"netWeight" gorm:"type:decimal(20,3);comment:净重"` GrossUnit string `json:"grossUnit" gorm:"type:varchar(255);comment:毛重单位"` NetUnit string `json:"netUnit" gorm:"type:varchar(255);comment:净重单位"` //以下为不存库的字段 AttachmentIDs []uint `json:"attachmentIDs" gorm:"-"` PredictionAmount decimal.Decimal `json:"predictionAmount" gorm:"-"` InputAmount decimal.Decimal `json:"inputAmount" gorm:"-"` OutputAmount decimal.Decimal `json:"outputAmount" gorm:"-"` MinInventoryRule decimal.Decimal `json:"minInventoryRule" gorm:"-"` //最小库存 MaxInventoryRule decimal.Decimal `json:"maxInventoryRule" gorm:"-"` //最大库存 } MaterialSearch struct { Material //MaterialTypes []constvar.MaterialType Keyword string //SetTemplateType constvar.SetTemplateType Order string PageNum int PageSize int Ids []string Orm *gorm.DB CategoryIds []int Preload bool Fields string } IdAndName struct { Id string `json:"id"` Name string `json:"name"` } UnitItems struct { Amount decimal.Decimal `json:"amount"` Unit string `json:"unit"` Floating bool `json:"floating"` } ) func (slf Material) TableName() string { return "material" } func (slf *Material) AfterFind(tx *gorm.DB) (err error) { if slf.PurchaseTypes != "" && strings.Contains(slf.PurchaseTypes, ",") { list := strings.Split(slf.PurchaseTypes, ",") for _, v := range list { slf.PurchaseTypeList = append(slf.PurchaseTypeList, cast.ToInt(v)) } } else if slf.PurchaseType != 0 { //兼容旧数据 slf.PurchaseTypeList = append(slf.PurchaseTypeList, int(slf.PurchaseType)) } if slf.MoreUnitValue != "" { var arr []UnitItems err := json.Unmarshal([]byte(slf.MoreUnitValue), &arr) if err != nil { return err } slf.MoreUnitList = arr } return } func (slf *Material) BeforeCreate(tx *gorm.DB) (err error) { if len(slf.PurchaseTypeList) > 0 { var typeList []string for _, v := range slf.PurchaseTypeList { if v != 0 { typeList = append(typeList, cast.ToString(v)) } } slf.PurchaseTypes = strings.Join(typeList, ",") if len(slf.PurchaseTypeList) == 1 { slf.PurchaseType = constvar.PurchaseType(slf.PurchaseTypeList[0]) } } if len(slf.MoreUnitList) != 0 { str, err := json.Marshal(slf.MoreUnitList) if err != nil { return err } slf.MoreUnitValue = string(str) } return } func (slf *Material) BeforeUpdate(tx *gorm.DB) (err error) { return slf.BeforeCreate(tx) } func NewMaterialSearch() *MaterialSearch { return &MaterialSearch{Orm: mysqlx.GetDB().Where("is_storage = ?", 1)} //只查询有库存的 } 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) SetCategoryId(id int) *MaterialSearch { slf.CategoryId = id return slf } func (slf *MaterialSearch) SetCategoryIds(ids []int) *MaterialSearch { slf.CategoryIds = ids 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) SetPreload(preload bool) *MaterialSearch { slf.Preload = preload return slf } func (slf *MaterialSearch) SetFields(fields string) *MaterialSearch { slf.Fields = fields 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 ? ", "%"+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) } if slf.CategoryId > 0 { db = db.Where("category_id = ?", slf.CategoryId) } if len(slf.CategoryIds) > 0 { db = db.Where("category_id in ?", slf.CategoryIds) } if slf.Fields != "" { db = db.Select(slf.Fields) } if slf.Preload { db = db.Preload("AttachmentList") } 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.Model(&Material{}).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() (int, error) { type Result struct { Max int } 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 } type ResponseDisuseList struct { Id int `json:"id" gorm:"column:id;primary_key;AUTO_INCREMENT"` Number string `json:"number" gorm:"type:varchar(255)"` //单号 SourceNumber string `json:"sourceNumber" gorm:"type:varchar(255)"` //源单号 Status constvar.OperationStatus `json:"status" gorm:"type:int(11);not null;comment:状态"` //状态 FromLocationID int `json:"fromLocationId" gorm:"type:int;not null;comment:源位置id"` //源位置id FromLocation Location `json:"fromLocation" gorm:"foreignKey:FromLocationID;references:Id"` //源位置 ToLocation Location `json:"toLocation" gorm:"foreignKey:ToLocationID;references:Id"` //目标位置 ToLocationID int `json:"toLocationId" gorm:"type:int;not null;comment:目标位置id"` //目标位置id OperationDate string `json:"operationDate" gorm:"type:varchar(31);comment:安排日期"` ContacterID int `json:"contacterID" gorm:"type:int;comment:联系人ID"` ContacterName string `json:"contacterName" gorm:"type:varchar(63);comment:联系人姓名"` CompanyID string `json:"companyID"` //公司ID-客户 CompanyName string `json:"companyName" gorm:"type:varchar(127);comment:公司名称-客户"` Comment string `json:"comment" gorm:"type:text;comment:备注"` ProductId string `json:"productId" gorm:"type:varchar(191);not null;comment:产品id"` //产品id ProductName string `json:"productName" gorm:"type:varchar(255);not null;comment:产品名称"` //产品名称 Amount decimal.Decimal `json:"amount" gorm:"type:decimal(20,2);not null;comment:数量"` //数量 Unit string `json:"unit" gorm:"type:varchar(31);comment:单位"` BaseOperationType constvar.BaseOperationType `json:"baseOperationType" gorm:"type:tinyint;not null;comment:基础作业类型"` //基础作业类型 } func (slf *MaterialSearch) Update(record *Material) error { var db = slf.build() if err := db.Omit("CreatedAt").Updates(record).Error; err != nil { return fmt.Errorf("save err: %v, record: %+v", err, record) } return nil } func MaterialMap(records []*Material) (m map[string]*Material) { m = make(map[string]*Material, len(records)) for _, record := range records { m[record.ID] = record } return m }