zhangqian
2024-04-07 a8914a16b23e93f6bfd12bcfd5cbe8b24cf7eb84
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
package inventory_order
 
import (
    "context"
    "errors"
    "github.com/shopspring/decimal"
    "strconv"
    "time"
    "wms/constvar"
    "wms/models"
    "wms/pkg/timex"
)
 
type Server struct {
    UnimplementedInventoryOrderServiceServer
}
 
func (s *Server) CreateOperationList(ctx context.Context, req *CreateOperationListRequest) (*CreateOperationListResponse, error) {
    var operations []*models.Operation
    id := 0
    if req.WarehouseId != "" {
        id, _ = strconv.Atoi(req.WarehouseId)
    }
    warehouse, err := models.NewWarehouseSearch().SetID(id).First()
    if err != nil {
        return nil, err
    }
    fromLocation, err := models.NewLocationSearch().SetID(warehouse.LocationId).First()
    if err != nil {
        return nil, err
    }
    toLocation, err := models.NewLocationSearch().SetType(int(constvar.LocationTypeCustomer)).First()
    if err != nil {
        return nil, err
    }
    tp := constvar.BaseOperationTypeOutgoing
    if req.OperationType == 1 {
        tp = constvar.BaseOperationTypeIncoming
        fromLocation, err = models.NewLocationSearch().SetType(int(constvar.LocationTypeVendor)).First()
        if err != nil {
            return nil, err
        }
        toLocation, err = models.NewLocationSearch().SetID(warehouse.LocationId).First()
        if err != nil {
            return nil, err
        }
    }
    operationType, err := models.NewOperationTypeSearch().SetWarehouseId(warehouse.Id).SetBaseOperationType(tp).First()
    if err != nil {
        return nil, err
    }
    operationResp := make([]*OperationResponse, 0)
    for _, list := range req.List {
        var operation models.Operation
        var details []*models.OperationDetails
        var or OperationResponse
        operation.SourceNumber = list.SourceNumber
        operation.SalesDetailsNumber = list.SalesDetailsNumber
        operation.OperationDate = timex.TimeToString2(time.Now())
        operation.Number = strconv.FormatInt(time.Now().Unix(), 10)
        operation.Status = constvar.OperationStatus_Ready
        operation.OperationTypeName = operationType.Name
        operation.OperationTypeId = operationType.Id
        operation.BaseOperationType = constvar.BaseOperationTypeOutgoing
        operation.Source = req.Source
        operation.OperationSource = constvar.OperationSource(req.OperationSource)
        operation.LocationID = fromLocation.Id
        if req.OperationType == 1 {
            operation.LocationID = toLocation.Id
        }
        or.WorkOrderId = operation.SourceNumber
        or.Number = operation.Number
        operationResp = append(operationResp, &or)
        if req.OperationType == 1 {
            operation.BaseOperationType = constvar.BaseOperationTypeIncoming
        }
        for _, product := range list.Products {
            var detail models.OperationDetails
            detail.ProductId = product.ProductNumber
            detail.Amount = decimal.NewFromInt(product.Amount)
            detail.FromLocationID = fromLocation.Id
            detail.ToLocationID = toLocation.Id
            details = append(details, &detail)
        }
        operation.Details = details
        operations = append(operations, &operation)
    }
    err = models.NewOperationSearch().CreateBatch(operations)
    resp := new(CreateOperationListResponse)
    resp.List = operationResp
    return resp, err
}
 
func (s *Server) GetWarehouseInfo(ctx context.Context, req *GetWarehouseInfoRequest) (*GetWarehouseInfoResponse, error) {
    warehouses, err := models.NewWarehouseSearch().FindNotTotal()
    if err != nil {
        return nil, err
    }
    list := make([]*WarehouseInfo, 0)
    for _, warehouse := range warehouses {
        var wi WarehouseInfo
        wi.Id = strconv.Itoa(warehouse.Id)
        wi.Name = warehouse.Name
        list = append(list, &wi)
    }
    resp := new(GetWarehouseInfoResponse)
    resp.List = list
    return resp, nil
}
 
func (s *Server) GetOperationInfo(ctx context.Context, req *GetOperationInfoRequest) (*GetOperationInfoResponse, error) {
    if len(req.SourceNumber) == 0 && len(req.SalesDetailsNumber) == 0 {
        return nil, errors.New("来源编码和销售明细编码不能同时为空")
    }
    operations, err := models.NewOperationSearch().SetSourceNumbers(req.SourceNumber).SetSalesDetailsNumbers(req.SalesDetailsNumber).
        SetStatus(constvar.OperationStatus(req.Status)).SetPreload(true).FindNotTotal()
    if err != nil {
        return nil, err
    }
    resp := new(GetOperationInfoResponse)
    list := make([]*OperationInfo, 0)
    for _, operation := range operations {
        var ol OperationInfo
        ol.SourceNumber = operation.SourceNumber
        ol.SalesDetailsNumber = operation.SalesDetailsNumber
        for _, detail := range operation.Details {
            o := ol
            o.ProductId = detail.ProductId
            o.Amount = detail.Amount.IntPart()
            list = append(list, &o)
        }
    }
    resp.List = list
    return resp, nil
}