package service import ( "aps_crm/model" ) type ProductsService struct{} func NewProductsService() ProductsService { return ProductsService{} } func (slf ProductsService) PickRightProducts(products, sourceProducts []*model.Product) (rightProducts []*model.Product) { productIdMap, productNumberMap := slf.getMappedProducts(sourceProducts) for _, product := range products { if p, ok := productIdMap[product.Id]; ok { rightProducts = append(rightProducts, p) } else if p, ok = productNumberMap[product.Number]; ok { rightProducts = append(rightProducts, p) } } return } func (slf ProductsService) PickDiffProducts(products, sourceProducts []*model.Product) (newProducts, removedProducts []*model.Product) { productIdMap, productNumberMap := slf.getMappedProducts(sourceProducts) productNumberMap2 := make(map[string]*model.Product, len(products)) for _, product := range products { if productIdMap[product.Id] == nil && productNumberMap[product.Number] == nil { newProducts = append(newProducts, product) } else if productIdMap[product.Id] != nil && slf.CheckProductChanged(productIdMap[product.Id], product) || productNumberMap[product.Number] != nil && slf.CheckProductChanged(productNumberMap[product.Number], product) { removedProducts = append(removedProducts, product) newProducts = append(newProducts, product) } productNumberMap2[product.Number] = product } for productNumber, product := range productNumberMap { if productNumberMap2[productNumber] == nil { removedProducts = append(removedProducts, product) } } return } func (slf ProductsService) CheckProductChanged(originProduct, newProduct *model.Product) bool { return originProduct.Number != newProduct.Number || !originProduct.Amount.Equal(newProduct.Amount) || !originProduct.Price.Equal(newProduct.Price) || !originProduct.Total.Equal(newProduct.Total) } func (slf ProductsService) getMappedProducts(sourceProducts []*model.Product) (map[uint]*model.Product, map[string]*model.Product) { productIdMap := make(map[uint]*model.Product, len(sourceProducts)) productNumberMap := make(map[string]*model.Product, len(sourceProducts)) for _, product := range sourceProducts { productIdMap[product.Id] = product productNumberMap[product.Number] = product } return productIdMap, productNumberMap }