zhangqian
2024-01-12 a10d59528a36dc5a1fbe4d9caa6b4abf25ab828c
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
package purchase_wms
 
import (
    "context"
    "github.com/shopspring/decimal"
    "gorm.io/gorm"
    "strconv"
    "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.Source = req.Source
    warehouse, err := models.NewWarehouseSearch().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
}