zhangqian
2024-03-28 0475de865b0ecb57cdcbf80bd38e67fd72206e25
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package service
 
import (
    "github.com/shopspring/decimal"
    "time"
    "wms/constvar"
    "wms/models"
)
 
type OutputInfo struct {
    LocationID   int
    WarehouseID  int
    Products     []*ProductInfo
    OperationID  int
    SourceNumber string
}
 
type ProductInfo struct {
    ProductID string
    Amount    decimal.Decimal
}
 
func AddOutputOperations(outputList []*OutputInfo) (err error) {
    //查找operationID
    warehouseIds := make([]int, 0)
    for _, output := range outputList {
        warehouseIds = append(warehouseIds, output.WarehouseID)
    }
    opTypes, err := models.NewOperationTypeSearch().SetWarehouseIds(warehouseIds).SetBaseOperationType(constvar.BaseOperationTypeOutgoing).FindNotTotal()
    if err != nil {
        return err
    }
 
    autoCode, codeStandard, maxAutoIncr, err := GetAutoCode(constvar.CodeStandardType_Outgoing)
    if err != nil {
        return err
    }
 
    opTypeMap := make(map[int]*models.OperationType, len(opTypes))
    for _, opType := range opTypes {
        opTypeMap[opType.WarehouseId] = opType
    }
    operations := make([]*models.Operation, 0, len(outputList))
    for _, output := range outputList {
        location, err := models.NewLocationSearch().SetType(int(constvar.LocationTypeCustomer)).First()
        if err != nil {
            return err
        }
        details := make([]*models.OperationDetails, 0, len(output.Products))
        for _, product := range output.Products {
            details = append(details, &models.OperationDetails{
                OperationID:    0,
                ProductId:      product.ProductID,
                Amount:         product.Amount,
                FromLocationID: output.LocationID,
                ToLocationID:   location.Id,
            })
        }
        if opTypeMap[output.WarehouseID] == nil {
            continue
        }
        operation := &models.Operation{
            Id:                0,
            Number:            autoCode,
            SourceNumber:      output.SourceNumber,
            OperationTypeId:   opTypeMap[output.WarehouseID].Id,
            OperationTypeName: opTypeMap[output.WarehouseID].Name,
            Status:            constvar.OperationStatus_Ready,
            OperationDate:     time.Now().Format("2006-01-02 15:04:05"),
            ContacterID:       0,
            ContacterName:     "",
            CompanyID:         0,
            CompanyName:       "",
            Comment:           "crm发货申请",
            LogisticCompanyId: "",
            LogisticCompany:   models.LogisticCompany{},
            WaybillNumber:     "",
            Weight:            decimal.Decimal{},
            LogisticWeight:    decimal.Decimal{},
            Source:            "crm",
            Details:           details,
            BaseOperationType: constvar.BaseOperationTypeOutgoing,
            LocationID:        output.LocationID,
            OperationSource:   constvar.OperationSourceSaleDelivery,
        }
        operations = append(operations, operation)
        autoCode = models.GetAutoCode(maxAutoIncr, codeStandard)
        maxAutoIncr++
    }
 
    return models.NewOperationSearch().CreateBatch(operations)
}