From 3288c6f7bbb3cc6cf101238a453479a9d9b8a795 Mon Sep 17 00:00:00 2001 From: zhangqian <zhangqian@123.com> Date: 星期四, 21 三月 2024 14:31:19 +0800 Subject: [PATCH] fix --- api/v1/salesDetails.go | 386 +++++++++++++++++++++++++++++++++++++++++++++--------- 1 files changed, 319 insertions(+), 67 deletions(-) diff --git a/api/v1/salesDetails.go b/api/v1/salesDetails.go index 6b71e25..29dc637 100644 --- a/api/v1/salesDetails.go +++ b/api/v1/salesDetails.go @@ -1,7 +1,6 @@ package v1 import ( - "aps_crm/conf" "aps_crm/constvar" "aps_crm/model" "aps_crm/model/grpc_init" @@ -16,9 +15,9 @@ "aps_crm/utils" "github.com/gin-gonic/gin" "github.com/shopspring/decimal" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials/insecure" + "gorm.io/gorm" "strconv" + "strings" ) type SalesDetailsApi struct{} @@ -170,7 +169,12 @@ salesDetailsModel.DeliverType = salesDetails.DeliverType salesDetailsModel.QuotationId = salesDetails.QuotationId salesDetailsModel.Status = salesDetails.Status - salesDetailsModel.Source = salesDetails.Source + if salesDetails.Source == "" { + salesDetailsModel.Source = "CRM鑷缓" + } else { + salesDetailsModel.Source = salesDetails.Source + } + salesDetailsModel.ProjectId = salesDetails.ProjectId return ecode.OK, salesDetailsModel } @@ -234,29 +238,10 @@ ctx.Ok() } -var ( - ProductInventoryServiceConn *grpc.ClientConn -) - -func InitProductInventoryServiceConn() { - var err error - ProductInventoryServiceConn, err = grpc.Dial(conf.Conf.GrpcServiceAddr.WMS, grpc.WithTransportCredentials(insecure.NewCredentials())) - if err != nil { - logx.Errorf("grpc dial product service error: %v", err.Error()) - return - } -} - -func CloseProductInventoryServiceConn() { - if ProductInventoryServiceConn != nil { - ProductInventoryServiceConn.Close() - } -} - // GetProductInventoryInfo // // @Tags SalesDetails -// @Summary 鑾峰彇浜у搧搴撳瓨淇℃伅 +// @Summary 鑾峰彇浜у搧鍙戣揣淇℃伅 // @Produce application/json // @Param number path string true "鏄庣粏缂栫爜" // @Success 200 {object} response.ListResponse @@ -268,67 +253,294 @@ return } number := c.Param("number") - client := product_inventory.NewProductInventoryServiceClient(ProductInventoryServiceConn) - info, err := client.GetInventoryProductInfo(ctx.GetCtx(), &product_inventory.GetInventoryProductInfoRequest{Number: number}) + client := product_inventory.NewProductInventoryServiceClient(grpc_init.ProductInventoryServiceConn) + info, err := client.GetOrderInputAndOutputInfo(ctx.GetCtx(), &product_inventory.GetOrderInputAndOutputInfoRequest{Number: number}) if err != nil { + if strings.Contains(err.Error(), "record not found") { + ctx.Ok() + return + } logx.Errorf("GetProductInfo err: %v", err.Error()) ctx.FailWithMsg(ecode.UnknownErr, "grpc璋冪敤閿欒") return } var list []response.ProductInfo - err = structx.AssignTo(info.ProductList, &list) + err = structx.AssignTo(info.OutputList, &list) if err != nil { ctx.FailWithMsg(ecode.UnknownErr, "杞崲閿欒") return } + + products, err := salesDetailsService.GetProducts(number) + m := make(map[string]*model.Product) + + for _, product := range products { + m[product.Number] = product + } + for k, v := range list { + if m[v.Number] == nil { + continue + } + list[k].OrderAmount = m[v.Number].Amount.String() + } + ctx.OkWithDetailed(list) } -// CreateOperation -// +type GetWarehouseProductInfoReq struct { + SaleDetailID int `json:"saleDetailID,omitempty"` + SaleDetailNumber string `json:"saleDetailNumber,omitempty"` +} + +// GetDeliveryPrepareInfo // @Tags SalesDetails -// @Summary 鍒涘缓浜у搧鍑哄簱淇℃伅 +// @Summary 鑾峰彇浜у搧鍏ュ簱淇℃伅 // @Produce application/json -// @Param object body request.SalesDetails true "鏌ヨ鍙傛暟" +// @Param object body GetWarehouseProductInfoReq true "鏄庣粏缂栫爜" // @Success 200 {object} response.ListResponse -// -// @Router /api/salesDetails/createOperation [post] -func (s *SalesDetailsApi) CreateOperation(c *gin.Context) { - var params request.SalesDetails +// @Router /api/salesDetails/getDeliveryPrepareInfo [post] +func (s *SalesDetailsApi) GetDeliveryPrepareInfo(c *gin.Context) { + var params GetWarehouseProductInfoReq ctx, ok := contextx.NewContext(c, ¶ms) if !ok { return } - m := make(map[string]interface{}) - m["status"] = params.Status - err := model.NewSalesDetailsSearch().SetNumber(params.Number).UpdateByMap(m) - if err != nil { - ctx.FailWithMsg(ecode.UnknownErr, "鐘舵�佹洿鏂板け璐�") + if params.SaleDetailID == 0 { + ctx.FailWithMsg(ecode.ParamsErr, "鍙傛暟缂哄け") return } - client := product_inventory.NewProductInventoryServiceClient(ProductInventoryServiceConn) - products := make([]*product_inventory.InventoryProduct, 0) - for _, product := range params.Products { - var p product_inventory.InventoryProduct - p.Id = product.Number - p.Amount = product.Amount.String() - products = append(products, &p) + salesDetails, err := salesDetailsService.GetSalesDetails(params.SaleDetailID) + if err == gorm.ErrRecordNotFound || salesDetails.Number != params.SaleDetailNumber { + ctx.FailWithMsg(ecode.ParamsErr, "閿�鍞鍗曚笉瀛樺湪") + return } - _, err = client.CreateOperation(ctx.GetCtx(), &product_inventory.CreateOperationRequest{ - Number: params.Number, - Addressee: params.Addressee, - Address: params.Address, - Phone: params.Phone, - DeliverType: int32(params.DeliverType), - ProductList: products, + + productMap := model.ProductMap(salesDetails.Products) + client := product_inventory.NewProductInventoryServiceClient(grpc_init.ProductInventoryServiceConn) + grpcResp, err := client.GetOrderInputAndOutputInfo(ctx.GetCtx(), &product_inventory.GetOrderInputAndOutputInfoRequest{ + Number: params.SaleDetailNumber, }) if err != nil { - logx.Errorf("CreateOperation err: %v", err.Error()) + if strings.Contains(err.Error(), "record not found") { + ctx.Ok() + return + } + logx.Errorf("GetOrderInputAndOutputInfo err: %v", err.Error()) ctx.FailWithMsg(ecode.UnknownErr, "grpc璋冪敤閿欒") return } - ctx.Ok() + + grpcOutputList := grpcResp.OutputList + grpcInputList := grpcResp.InputList + inputProductMap := make(map[string]*response.StoreInfo) + outputProductMap := make(map[string]*response.OutputSimpleInfo) + for _, v := range grpcOutputList { + if productMap[v.Number] == nil { + continue + } + if outputProductMap[v.Number] == nil { + simpleInfo := &response.OutputSimpleInfo{ + Number: v.Number, + } + amount, _ := decimal.NewFromString(v.Amount) + simpleInfo.Amount = amount + outputProductMap[v.Number] = simpleInfo + } else { + amount, _ := decimal.NewFromString(v.Amount) + outputProductMap[v.Number].Amount = outputProductMap[v.Number].Amount.Add(amount) + } + } + for _, v := range grpcInputList { + if productMap[v.Number] == nil { + continue + } + if inputProductMap[v.Number] == nil { + storeInfo := &response.StoreInfo{ + Number: v.Number, + Name: v.Name, + OrderAmount: productMap[v.Number].Amount, + } + finishAmount, _ := decimal.NewFromString(v.Amount) + storeInfo.FinishAmount = finishAmount + storeInfo.AvailableAmount = finishAmount + storeInfo.LeftAmount = storeInfo.OrderAmount + inputProductMap[v.Number] = storeInfo + } else { + finishAmount, _ := decimal.NewFromString(v.Amount) + inputProductMap[v.Number].FinishAmount = inputProductMap[v.Number].FinishAmount.Add(finishAmount) + inputProductMap[v.Number].AvailableAmount = inputProductMap[v.Number].FinishAmount + } + } + storeList := make([]*response.StoreInfo, 0, len(salesDetails.Products)) + for _, product := range salesDetails.Products { + storeInfo := inputProductMap[product.Number] + if storeInfo == nil { //娌℃湁鍏ュ簱淇℃伅 + storeInfo = &response.StoreInfo{ + Name: product.Name, + Number: product.Number, + OrderAmount: product.Amount, + FinishAmount: decimal.Decimal{}, + LeftAmount: product.Amount, + AvailableAmount: decimal.Decimal{}, + } + } else { //鏈夊叆搴撴暟閲忓啀鏌ュ嚭搴擄紝绠楀嚭鏈彂璐ф暟閲� + if outputProductMap[product.Number] != nil { + outputInfo := outputProductMap[product.Number] + storeInfo.LeftAmount = storeInfo.LeftAmount.Sub(outputInfo.Amount) //鍓╀綑鍙戣揣鏁伴噺 = 璁㈠崟鏁伴噺 - 宸插彂璐ф暟閲� + storeInfo.AvailableAmount = storeInfo.AvailableAmount.Sub(outputInfo.Amount) //鍙敤鏁伴噺 = 鍏ュ簱瀹屾垚鏁伴噺 - 宸插彂璐ф暟閲� + } + } + storeList = append(storeList, storeInfo) + } + ctx.OkWithDetailed(storeList) +} + +// ConfirmOutput +// @Tags SalesDetails +// @Summary 纭鍙戣揣 +// @Produce application/json +// @Param object body request.ConfirmOutput true "鏄庣粏缂栫爜" +// @Success 200 {object} response.ListResponse +// @Router /api/salesDetails/confirmOutput [post] +func (s *SalesDetailsApi) ConfirmOutput(c *gin.Context) { + var params request.ConfirmOutput + ctx, ok := contextx.NewContext(c, ¶ms) + if !ok { + return + } + if len(params.Products) == 0 || params.SaleDetailNumber == "" { + ctx.FailWithMsg(ecode.ParamsErr, "鍙傛暟缂哄け") + return + } + var flag bool + for _, p := range params.Products { + if p.OutputAmount.GreaterThan(decimal.Zero) { + flag = true + } + } + if !flag { + ctx.FailWithMsg(ecode.ParamsErr, "鍙戣揣鏁伴噺缂哄け") + return + } + + products := make([]*product_inventory.OutputProduct, 0, len(params.Products)) + for _, product := range params.Products { + products = append(products, &product_inventory.OutputProduct{ + Number: product.Number, + Amount: product.OutputAmount.String(), + }) + } + client := product_inventory.NewProductInventoryServiceClient(grpc_init.ProductInventoryServiceConn) + _, err := client.OrderProductOutput(ctx.GetCtx(), &product_inventory.OrderProductOutputRequest{ + OrderNumber: params.SaleDetailNumber, + Products: products, + }) + + if err != nil { + logx.Errorf("product_inventory.OrderProductOutput err:%v, params:%v", err, params) + ctx.FailWithMsg(ecode.UnknownErr, "鍙戣揣澶辫触"+err.Error()) + return + } + + ctx.OkWithDetailed(nil) +} + +// confirmOutputOver +// @Tags SalesDetails +// @Summary 纭鍙戣揣 +// @Produce application/json +// @Param object body request.ConfirmOutputOver true "鏄庣粏缂栫爜" +// @Success 200 {object} response.ListResponse +// @Router /api/salesDetails/confirmOutputOver [post] +func (s *SalesDetailsApi) ConfirmOutputOver(c *gin.Context) { + var params request.ConfirmOutput + ctx, ok := contextx.NewContext(c, ¶ms) + if !ok { + return + } + if params.SaleDetailNumber == "" { + ctx.FailWithMsg(ecode.ParamsErr, "鍙傛暟缂哄け") + return + } + + salesDetails, err := salesDetailsService.GetSalesDetailsByNumber(params.SaleDetailNumber) + if err == gorm.ErrRecordNotFound || salesDetails.Number != params.SaleDetailNumber { + ctx.FailWithMsg(ecode.ParamsErr, "閿�鍞鍗曚笉瀛樺湪") + return + } + + err = model.NewSalesDetailsSearch().SetId(salesDetails.Id).UpdateByMap(map[string]interface{}{"status": constvar.OverOutbound}) + + if err != nil { + ctx.FailWithMsg(ecode.DBErr, "淇敼澶辫触") + return + } + + ctx.OkWithDetailed(nil) +} + +// GetDeliveryList +// @Tags SalesDetails +// @Summary 鍙戣揣鏄庣粏 +// @Produce application/json +// @Param object body GetWarehouseProductInfoReq true "鏄庣粏缂栫爜" +// @Success 200 {object} response.ListResponse +// @Router /api/salesDetails/getDeliveryList [post] +func (s *SalesDetailsApi) GetDeliveryList(c *gin.Context) { + var params GetWarehouseProductInfoReq + ctx, ok := contextx.NewContext(c, ¶ms) + if !ok { + return + } + if params.SaleDetailID == 0 { + ctx.FailWithMsg(ecode.ParamsErr, "鍙傛暟缂哄け") + return + } + + salesDetails, err := salesDetailsService.GetSalesDetails(params.SaleDetailID) + if err == gorm.ErrRecordNotFound || salesDetails.Number != params.SaleDetailNumber { + ctx.FailWithMsg(ecode.ParamsErr, "閿�鍞鍗曚笉瀛樺湪") + return + } + + productMap := model.ProductMap(salesDetails.Products) + client := product_inventory.NewProductInventoryServiceClient(grpc_init.ProductInventoryServiceConn) + grpcResp, err := client.GetOrderInputAndOutputInfo(ctx.GetCtx(), &product_inventory.GetOrderInputAndOutputInfoRequest{ + Number: params.SaleDetailNumber, + }) + if err != nil { + if strings.Contains(err.Error(), "record not found") { + ctx.Ok() + return + } + logx.Errorf("GetOrderInputAndOutputInfo err: %v", err.Error()) + ctx.FailWithMsg(ecode.UnknownErr, "grpc璋冪敤閿欒") + return + } + + grpcOutputList := grpcResp.OutputList + outputList := make([]*response.OutputInfo, 0, len(grpcOutputList)) + for _, v := range grpcOutputList { + outputInfo := &response.OutputInfo{ + Number: v.Number, + Name: v.Name, + OrderAmount: productMap[v.Number].Amount.String(), + Unit: v.Unit, + Invoice: v.Invoice, + Carrier: v.Carrier, + Waybill: v.Waybill, + SalePrice: v.SalePrice, + Valorem: v.Valorem, + Warehouse: v.Warehouse, + Amount: v.Amount, + Status: int(v.Status), + Specs: productMap[v.Number].Specs, + CreateTime: v.CreateTime, + } + outputList = append(outputList, outputInfo) + } + ctx.OkWithDetailed(outputList) } // GetApsProjectList @@ -347,47 +559,83 @@ client := crm_aps.NewCrmAndApsGrpcServiceClient(grpc_init.CrmApsGrpcServiceConn) projectList, err := client.GetApsProjectList(c, &crm_aps.GetApsProjectListRequest{}) if err != nil { - ctx.FailWithMsg(ecode.UnknownErr, "grpc璋冪敤閿欒: "+err.Error()) + logx.Errorf("grpc GetApsProjectList err: %v", err.Error()) + ctx.FailWithMsg(ecode.UnknownErr, "鑾峰彇aps椤圭洰鍒楄〃澶辫触") return } ctx.OkWithDetailed(projectList.List) } -// SendSalesDetailsToApsProject +// SendSalesDetailsToOtherSystem // // @Tags SalesDetails -// @Summary 鎺ㄩ�侀攢鍞槑缁嗕俊鎭埌aps椤圭洰妯″潡 +// @Summary 鎺ㄩ�侀攢鍞槑缁嗕俊鎭埌鍏朵粬绯荤粺 // @Produce application/json // @Param object body request.SalesDetails true "鏌ヨ鍙傛暟" // @Success 200 {object} response.ListResponse // -// @Router /api/salesDetails/sendSalesDetailsToApsProject [post] -func (s *SalesDetailsApi) SendSalesDetailsToApsProject(c *gin.Context) { +// @Router /api/salesDetails/sendSalesDetailsToOtherSystem [post] +func (s *SalesDetailsApi) SendSalesDetailsToOtherSystem(c *gin.Context) { var params request.SalesDetails ctx, ok := contextx.NewContext(c, ¶ms) if !ok { return } + //clientName := "" + //if params.ClientId > 0 { + // first, err := model.NewClientSearch(nil).SetId(params.ClientId).First() + // if err != nil { + // ctx.FailWithMsg(ecode.UnknownErr, "瀹㈡埛淇℃伅鏌ヨ澶辫触") + // return + // } + // clientName = first.Name + //} m := make(map[string]interface{}) m["status"] = params.Status + m["project_id"] = params.ProjectId err := model.NewSalesDetailsSearch().SetNumber(params.Number).UpdateByMap(m) if err != nil { ctx.FailWithMsg(ecode.UnknownErr, "鐘舵�佹洿鏂板け璐�") return } - products := make([]*crm_aps.SalesDetailsProduct, 0) + //鎺ㄩ�佸埌wms + //wmsProducts := make([]*product_inventory.InventoryProduct, 0) + //for _, product := range params.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.GetCtx(), &product_inventory.CreateOperationRequest{ + // Number: params.Number, + // Addressee: params.Addressee, + // Address: params.Address, + // Phone: params.Phone, + // DeliverType: int32(params.DeliverType), + // Source: "CRM", + // ClientId: int64(params.ClientId), + // ClientName: clientName, + // ProductList: wmsProducts, + //}) + //if err != nil { + // logx.Errorf("grpc CreateOperation err: %v", err.Error()) + //} + + //鎺ㄩ�佸埌aps + ApsProducts := make([]*crm_aps.SalesDetailsProduct, 0) var total decimal.Decimal for _, product := range params.Products { var sp crm_aps.SalesDetailsProduct sp.ProductId = product.Number sp.Amount = product.Amount.IntPart() - products = append(products, &sp) + ApsProducts = append(ApsProducts, &sp) total = total.Add(product.Amount) } - client := crm_aps.NewCrmAndApsGrpcServiceClient(grpc_init.CrmApsGrpcServiceConn) - _, err = client.SendSalesDetailsToApsProject(c, &crm_aps.SendSalesDetailsToApsProjectRequest{ + clientAps := crm_aps.NewCrmAndApsGrpcServiceClient(grpc_init.CrmApsGrpcServiceConn) + _, err = clientAps.SendSalesDetailsToApsProject(c, &crm_aps.SendSalesDetailsToApsProjectRequest{ Number: params.Number, ClientName: params.Client.Name, MemberName: params.Member.Username, @@ -396,10 +644,14 @@ Source: params.Source, ProductTotal: total.IntPart(), ProjectId: params.ProjectId, - Products: products, + Products: ApsProducts, }) if err != nil { - ctx.FailWithMsg(ecode.UnknownErr, "grpc璋冪敤閿欒: "+err.Error()) + //鐘舵�佽繕鍘� + m["status"] = constvar.WaitConfirmed + _ = model.NewSalesDetailsSearch().SetNumber(params.Number).UpdateByMap(m) + logx.Errorf("grpc SendSalesDetailsToApsProject err: %v", err.Error()) + ctx.FailWithMsg(ecode.UnknownErr, "鎺ㄩ�佸け璐�,璇锋鏌ュ弬鏁版槸鍚︽纭�") return } ctx.Ok() -- Gitblit v1.8.0