product.go 3.5 KB
package domain

import (
	"fmt"
	"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils"
	"strconv"
	"time"
)

// 产品信息
type Product struct {
	// 企业id
	CompanyId int `json:"companyId,omitempty"`
	// 组织ID
	OrgId int `json:"orgId,omitempty"`
	// 产品ID
	ProductId int `json:"productId,omitempty"`
	// 产品编号 编码规则为“CP”+2 位年+2 位月+2 位日+3 位流水码,如 CP211229001
	ProductCode string `json:"productCode,omitempty"`
	// 产品名称
	ProductName string `json:"productName,omitempty"`
	// 产品类别
	ProductCategory string `json:"productCategory,omitempty"`
	// 产品规格
	ProductSpec *UnitQuantity `json:"productSpec,omitempty"`
	// 创建时间
	CreatedAt time.Time `json:"createdAt,omitempty"`
	// 更新时间
	UpdatedAt time.Time `json:"updatedAt,omitempty"`
	// 删除时间
	DeletedAt time.Time `json:"deletedAt,omitempty"`
	// 扩展数据
	Ext *Ext `json:"ext,omitempty"`
}

type ProductRepository interface {
	Save(product *Product) (*Product, error)
	Remove(product *Product) (*Product, error)
	FindOne(queryOptions map[string]interface{}) (*Product, error)
	Find(queryOptions map[string]interface{}) (int64, []*Product, error)
}

func (product *Product) Identify() interface{} {
	if product.ProductId == 0 {
		return nil
	}
	return product.ProductId
}

func (product *Product) Update(data map[string]interface{}) error {
	if productCode, ok := data["productCode"]; ok {
		product.ProductCode = productCode.(string)
	}
	if productName, ok := data["productName"]; ok {
		product.ProductName = productName.(string)
	}
	if productCategory, ok := data["productCategory"]; ok {
		product.ProductCategory = productCategory.(string)
	}
	if product.ProductSpec == nil {
		product.ProductSpec = &UnitQuantity{}
	}
	if unit, ok := data["unit"]; ok {
		product.ProductSpec.Unit = unit.(string)
	}
	if unitWeight, ok := data["unitWeight"]; ok {
		product.ProductSpec.UnitWeight = unitWeight.(float64)
	}
	if product.Ext == nil {
		product.Ext = &Ext{}
	}
	if orgName, ok := data["orgName"]; ok {
		product.Ext.OrgName = orgName.(string)
	}
	product.UpdatedAt = time.Now()
	return nil
}

func (item *Product) ProductWeigh(quality float64) float64 {
	if quality <= 0 {
		return 0
	}
	return item.ProductSpec.UnitWeight * quality
}

// 导入数据体
type ImportProductItem struct {
	// 产品编号 编码规则为“CP”+2 位年+2 位月+2 位日+3 位流水码,如 CP211229001
	ProductCode string `json:"productCode,omitempty"`
	// 产品名称
	ProductName string `json:"productName,omitempty"`
	// 产品类别
	ProductCategory string `json:"productCategory,omitempty"`
	// 单位
	Unit string `json:"unit,omitempty"`
	// 单份重量(原材料)
	UnitWeight string `json:"unitWeight,omitempty"`
	// 失败理由
	FailReason string `json:"failReason"`
}

func (item *ImportProductItem) Valid() error {
	if len(item.ProductCode) == 0 {
		return fmt.Errorf("产品编号不能为空")
	}
	//if len(item.ProductName) == 0 {
	//	return fmt.Errorf("品名不能为空")
	//}
	//if len(item.Unit) == 0 {
	//	return fmt.Errorf("规格不能为空")
	//}
	//if len(item.ProductCategory) == 0 {
	//	return fmt.Errorf("类别不能为空")
	//}
	if len(item.UnitWeight) == 0 {
		item.UnitWeight = "0"
	}
	if _, err := strconv.ParseFloat(item.UnitWeight, 64); err != nil {
		return fmt.Errorf("投入单份重量格式有误")
	}
	return nil
}

type Products []*Product

func (products Products) ProductCodes() []string {
	var result = utils.NewSet()
	for _, v := range products {
		result.Add(v.ProductCode)
	}
	return result.KeysStr()
}