zhangqian
2024-01-08 f1842bf9b5bb69b5078a215c02cb16b7e33f893a
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
package crm_aps
 
import (
    "aps_crm/constvar"
    "aps_crm/model"
    "aps_crm/model/grpc_init"
    "context"
    "github.com/shopspring/decimal"
)
 
type Server struct {
    UnimplementedCrmAndApsGrpcServiceServer
}
 
func (s *Server) GetCrmSalesDetailsList(ctx context.Context, req *GetCrmSalesDetailsListRequest) (*GetCrmSalesDetailsListResponse, error) {
    search := model.NewSalesDetailsSearch().Orm.Model(model.SalesDetails{})
    if req.StartTime != "" && req.EndTime != "" {
        if req.TimeType == "签约日期" {
            search = search.Where("sign_time between ? and ?", req.StartTime, req.EndTime)
        } else if req.TimeType == "交付日期" {
            search = search.Where("delivery_date between ? and ?", req.StartTime, req.EndTime)
        }
    }
    if req.ClientName != "" {
        search = search.Joins("Client", "LEFT").Where("Client.name like ?", "%"+req.ClientName+"%")
    }
    search = search.Preload("Member").Preload("Client").Where("status = ?", constvar.WaitConfirmed).Where("project_id = ?", "")
 
    var records = make([]*model.SalesDetails, 0)
    var total int64
    err := search.Count(&total).Error
    if err != nil {
        return nil, err
    }
    if req.Page*req.PageSize > 0 {
        search = search.Limit(int(req.PageSize)).Offset(int((req.Page - 1) * req.PageSize))
    }
    err = search.Order("id desc").Find(&records).Error
    if err != nil {
        return nil, err
    }
    sds := make([]*CrmSalesDetails, 0)
    for _, record := range records {
        var sd CrmSalesDetails
        sd.Number = record.Number
        sd.ClientName = record.Client.Name
        sd.MemberName = record.Member.Username
        sd.SignTime = record.SignTime
        sd.DeliveryDate = record.DeliveryDate
        sds = append(sds, &sd)
    }
    resp := new(GetCrmSalesDetailsListResponse)
    resp.SalesDetails = sds
    resp.Total = total
    return resp, nil
}
 
func (s *Server) SendSalesDetailsAndProjectToCrm(ctx context.Context, req *SendSalesDetailsAndProjectToCrmRequest) (*SendSalesDetailsAndProjectToCrmResponse, error) {
    details, err := model.NewSalesDetailsSearch().SetNumbers(req.SalesDetailsNumbers).SetPreload(true).FindNotTotal()
    if err != nil {
        return nil, err
    }
    for _, detail := range details {
        m := make(map[string]interface{})
        m["status"] = constvar.WaitOutbound
        m["project_id"] = req.ProjectId
 
        err := model.NewSalesDetailsSearch().SetNumber(detail.Number).UpdateByMap(m)
        if err != nil {
            return nil, err
        }
 
        products := make([]*SalesDetailsProduct, 0)
        var total decimal.Decimal
        for _, product := range detail.Products {
            var sp SalesDetailsProduct
            sp.ProductId = product.Number
            sp.Amount = product.Amount.IntPart()
            products = append(products, &sp)
            total = total.Add(product.Amount)
        }
 
        client := NewCrmAndApsGrpcServiceClient(grpc_init.CrmApsGrpcServiceConn)
        _, err = client.SendSalesDetailsToApsProject(ctx, &SendSalesDetailsToApsProjectRequest{
            Number:       detail.Number,
            ClientName:   detail.Client.Name,
            MemberName:   detail.Member.Username,
            SignTime:     detail.SignTime,
            DeliveryDate: detail.DeliveryDate,
            Source:       detail.Source,
            ProductTotal: total.IntPart(),
            ProjectId:    req.ProjectId,
            Products:     products,
        })
        if err != nil {
            return nil, err
        }
    }
    return new(SendSalesDetailsAndProjectToCrmResponse), nil
}