package crm_aps
|
|
import (
|
"aps_crm/constvar"
|
"aps_crm/model"
|
"aps_crm/model/grpc_init"
|
"aps_crm/pkg/ecode"
|
"aps_crm/service"
|
"context"
|
"errors"
|
"fmt"
|
"github.com/shopspring/decimal"
|
"gorm.io/gorm"
|
)
|
|
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
|
}
|
|
//推送到wms
|
//clientName := ""
|
//if detail.ClientId > 0 {
|
// first, err := model.NewClientSearch(nil).SetId(detail.ClientId).First()
|
// if err == nil {
|
// clientName = first.Name
|
// }
|
//}
|
//wmsProducts := make([]*product_inventory.InventoryProduct, 0)
|
//for _, product := range detail.Products {
|
// var p product_inventory.InventoryProduct
|
// p.Id = product.Number
|
// p.Amount = product.Amount.String()
|
// wmsProducts = append(wmsProducts, &p)
|
//}
|
//clientWms := product_inventory.NewProductInventoryServiceClient(grpc_init.ProductInventoryServiceConn)
|
//_, err = clientWms.CreateOperation(ctx, &product_inventory.CreateOperationRequest{
|
// Number: detail.Number,
|
// Addressee: detail.Addressee,
|
// Address: detail.Address,
|
// Phone: detail.Phone,
|
// DeliverType: int32(detail.DeliverType),
|
// Source: "CRM",
|
// ClientId: int64(detail.ClientId),
|
// ClientName: clientName,
|
// ProductList: wmsProducts,
|
//})
|
//if err != nil {
|
// //状态还原
|
// m["status"] = constvar.WaitConfirmed
|
// _ = model.NewSalesDetailsSearch().SetNumber(detail.Number).UpdateByMap(m)
|
// return nil, err
|
//}
|
|
//推送到aps
|
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: "CRM",
|
ProductTotal: total.IntPart(),
|
ProjectId: req.ProjectId,
|
Products: products,
|
})
|
if err != nil {
|
//状态还原
|
m["status"] = constvar.WaitConfirmed
|
_ = model.NewSalesDetailsSearch().SetNumber(detail.Number).UpdateByMap(m)
|
return nil, err
|
}
|
}
|
return new(SendSalesDetailsAndProjectToCrmResponse), nil
|
}
|
|
func (s *Server) GetClientList(ctx context.Context, req *GetClientListRequest) (*GetClientListResponse, error) {
|
if req.Page <= 0 || req.PageSize == 0 {
|
return nil, errors.New("参数错误")
|
}
|
clientService := new(service.ClientService)
|
params := map[string]interface{}{}
|
if req.Keyword != "" {
|
params["name"] = req.Keyword
|
}
|
clients, total, errCode := clientService.GetClientList(int(req.Page), int(req.PageSize), params)
|
if errCode != ecode.OK {
|
return nil, errors.New(fmt.Sprintf("内部错误, code:%v", errCode))
|
}
|
resp := new(GetClientListResponse)
|
resp.Total = total
|
resp.List = make([]*Client, 0, len(clients))
|
for _, client := range clients {
|
resp.List = append(resp.List, &Client{
|
Number: client.Number,
|
Name: client.Name,
|
})
|
}
|
return resp, nil
|
}
|
func (s *Server) UpdateSalesDetail(ctx context.Context, req *UpdateSalesDetailRequest) (*UpdateSalesDetailResponse, error) {
|
if req.Number == "" {
|
return nil, errors.New("销售明细编号为空")
|
}
|
if req.Status == 0 {
|
return nil, errors.New("销售明细状态为空")
|
}
|
|
status := constvar.SalesDetailsStatus(int(req.Status))
|
if !status.Valid() {
|
return nil, errors.New("销售明细状态不正确")
|
}
|
|
salesDetail, err := model.NewSalesDetailsSearch().SetNumber(req.Number).First()
|
if err == gorm.ErrRecordNotFound {
|
return nil, errors.New("销售明细不存在")
|
}
|
|
salesDetail.Status = status
|
err = model.NewSalesDetailsSearch().SetId(salesDetail.Id).Update(salesDetail)
|
if err != nil {
|
return nil, errors.New("更改CRM销售明细失败")
|
}
|
|
return &UpdateSalesDetailResponse{}, nil
|
}
|
|
func (s *Server) RemoveSalesDetail(ctx context.Context, req *RemoveSalesDetailRequest) (*RemoveSalesDetailResponse, error) {
|
if req.Number == "" {
|
return nil, errors.New("销售明细编号为空")
|
}
|
|
_, err := model.NewSalesDetailsSearch().SetNumber(req.Number).First()
|
if err == gorm.ErrRecordNotFound {
|
return nil, errors.New("销售明细不存在")
|
}
|
|
err = model.NewSalesDetailsSearch().SetNumber(req.Number).Delete()
|
if err == gorm.ErrRecordNotFound {
|
return nil, errors.New("销售明细删除失败")
|
}
|
|
return &RemoveSalesDetailResponse{}, nil
|
}
|
|
func (s *Server) GetCrmSalesDetailsProductInfo(ctx context.Context, req *GetCrmSalesDetailsProductInfoRequest) (*GetCrmSalesDetailsProductInfoResponse, error) {
|
if req.SalesDetailsNumber == "" {
|
return nil, errors.New("销售明细编号为空")
|
}
|
first, err := model.NewSalesDetailsSearch().SetPreload(true).SetNumber(req.SalesDetailsNumber).First()
|
if err != nil {
|
return nil, err
|
}
|
list := make([]*CrmSalesDetailsProductInfo, 0)
|
for _, product := range first.Products {
|
var csp CrmSalesDetailsProductInfo
|
csp.ProductId = product.Number
|
csp.ProductName = product.Name
|
csp.Specs = product.Specs
|
csp.Unit = product.Unit
|
csp.Amount = product.Amount.IntPart()
|
csp.Cost = product.Cost
|
csp.Price = product.Price.IntPart()
|
csp.Total = product.Total.IntPart()
|
csp.Profit = product.Profit
|
csp.Margin = product.Margin
|
list = append(list, &csp)
|
}
|
resp := new(GetCrmSalesDetailsProductInfoResponse)
|
resp.List = list
|
return resp, nil
|
}
|