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, DeliverType: int64(detail.DeliverType), }) 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 }