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
|
}
|