zhangqian
2023-10-13 13194e787d51e4ce07dfc35341d536fb5db7aaa3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
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
}