liujiandao
2024-03-30 de71e109b1959fe8ad86007c1c59658622933290
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
package purchase_wms
 
import (
    "context"
    "errors"
    "github.com/shopspring/decimal"
    "gorm.io/gorm"
    "strconv"
    "strings"
    "time"
    "wms/constvar"
    "wms/models"
    "wms/pkg/timex"
)
 
type Server struct {
    UnimplementedPurchaseServiceServer
}
 
func (s *Server) PurchaseToWms(c context.Context, req *PurchaseToWmsRequest) (*PurchaseToWmsResponse, error) {
    var operation models.Operation
    var details []*models.OperationDetails
    operation.SourceNumber = req.Number
    operation.OperationDate = timex.TimeToString2(time.Now())
    operation.Number = strconv.FormatInt(time.Now().Unix(), 10)
    operation.Status = constvar.OperationStatus_Ready
    operation.CompanyName = req.SupplierName
    operation.CompanyID = int(req.SupplierId)
    operation.Source = req.Source
    operation.OperationSource = constvar.OperationSource(req.OperationSource)
    operation.SalesDetailsNumber = req.SalesDetailsNumber
    warehouse, err := models.NewWarehouseSearch().SetName(req.WarehouseName).First()
    if err != nil {
        return nil, err
    }
    operationType, err := models.NewOperationTypeSearch().SetWarehouseId(warehouse.Id).SetBaseOperationType(constvar.BaseOperationTypeIncoming).First()
    if err != nil {
        return nil, err
    }
    operation.OperationTypeName = operationType.Name
    operation.OperationTypeId = operationType.Id
    location, err := models.NewLocationSearch().SetID(warehouse.LocationId).First()
    if err != nil {
        return nil, err
    }
    first, err := models.NewLocationSearch().SetType(int(constvar.LocationTypeVendor)).First()
    if err != nil {
        return nil, err
    }
    operation.LocationID = location.Id
    operation.BaseOperationType = constvar.BaseOperationTypeIncoming
    for _, product := range req.Product {
        var detail models.OperationDetails
        detail.ProductId = product.Id
        detail.Amount = decimal.NewFromInt(product.Amount)
        detail.FromLocationID = first.Id
        detail.ToLocationID = location.Id
        details = append(details, &detail)
    }
    err = models.WithTransaction(func(db *gorm.DB) error {
        err := models.NewOperationSearch().SetOrm(db).Create(&operation)
        if err != nil {
            return err
        }
        for _, detail := range details {
            detail.OperationID = operation.Id
        }
        err = models.NewOperationDetailsSearch().SetOrm(db).CreateBatch(details)
        return err
    })
    if err != nil {
        return nil, err
    }
    resp := new(PurchaseToWmsResponse)
    resp.Warehouse = warehouse.Name
    return resp, nil
}
 
func (s *Server) SrmGetWarehouseInfo(c context.Context, req *SrmGetWarehouseInfoRequest) (*SrmGetWarehouseInfoResponse, error) {
    warehouses, err := models.NewWarehouseSearch().FindNotTotal()
    resp := new(SrmGetWarehouseInfoResponse)
    if err != nil {
        return resp, err
    }
    for _, warehouse := range warehouses {
        var info SrmWarehouseInfo
        info.Name = warehouse.Name
        info.Address = warehouse.Address
        info.Principal = warehouse.Contacts
        resp.Info = append(resp.Info, &info)
    }
    return resp, nil
}
 
func (s *Server) SrmGetOperationInfo(c context.Context, req *SrmGetOperationInfoRequest) (*SrmGetOperationInfoResponse, error) {
    if req.Number == "" && req.SalesDetailsNumber == "" && req.OperationSource == 0 {
        return nil, errors.New("参数缺失")
    }
    operations, err := models.NewOperationSearch().SetSourceNumber(req.Number).
        SetOperationSource(constvar.OperationSource(req.OperationSource)).
        SetSalesDetailsNumber(req.SalesDetailsNumber).
        SetPreload(true).FindNotTotal()
    if err != nil {
        return nil, err
    }
    srm := make([]*SrmOperation, 0)
    for _, operation := range operations {
        var so SrmOperation
        so.Number = operation.Number
        index := strings.LastIndex(operation.OperationTypeName, "-")
        so.WarehouseName = operation.OperationTypeName[:index]
        so.Status = int64(operation.Status)
        so.OverTime = operation.CreateTime
        for _, detail := range operation.Details {
            s := so
            s.ProductId = detail.ProductId
            s.Amount = detail.Amount.IntPart()
            s.ProductName = detail.Product.Name
            srm = append(srm, &s)
        }
    }
    var resp = new(SrmGetOperationInfoResponse)
    resp.Operations = srm
    return resp, nil
}