From bd33bea0f3b44e608fcb4d9aa9d1f51a2f5bcf17 Mon Sep 17 00:00:00 2001 From: zhangqian <zhangqian@123.com> Date: 星期日, 07 四月 2024 19:26:17 +0800 Subject: [PATCH] 新增按仓库分组的发货准备接口 --- api/v1/salesDetails.go | 128 ++++++++++++++++++++++++++++++++ model/response/salesDetails.go | 6 + router/salesDetails.go | 9 +- docs/swagger.yaml | 21 +++++ docs/docs.go | 33 ++++++++ docs/swagger.json | 33 ++++++++ 6 files changed, 226 insertions(+), 4 deletions(-) diff --git a/api/v1/salesDetails.go b/api/v1/salesDetails.go index 910847a..4f00785 100644 --- a/api/v1/salesDetails.go +++ b/api/v1/salesDetails.go @@ -290,6 +290,7 @@ type GetWarehouseProductInfoReq struct { SaleDetailID int `json:"saleDetailID,omitempty"` SaleDetailNumber string `json:"saleDetailNumber,omitempty"` + GroupByWarehouse bool `json:"groupByWarehouse"` } // GetDeliveryPrepareInfo @@ -396,6 +397,133 @@ ctx.OkWithDetailed(storeList) } +// GetDeliveryPrepareInfoByWarehouse +// @Tags SalesDetails +// @Summary 鑾峰彇浜у搧鍏ュ簱淇℃伅鎸変粨搴撳垎缁� +// @Produce application/json +// @Param object body GetWarehouseProductInfoReq true "鏄庣粏缂栫爜" +// @Success 200 {object} response.ListResponse +// @Router /api/salesDetails/getDeliveryPrepareInfoByWarehouse [post] +func (s *SalesDetailsApi) GetDeliveryPrepareInfoByWarehouse(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 + grpcInputList := grpcResp.InputList + inputProductMap := make(map[int64]map[string]*response.StoreInfo) + outputProductMap := make(map[int64]map[string]*response.OutputSimpleInfo) + warehouseIds := make([]int64, 0) + warehouseIdMap := make(map[int64]string, 0) + for _, v := range grpcOutputList { + if productMap[v.Number] == nil { + continue + } + if outputProductMap[v.WareHouseID] == nil { + outputProductMap[v.WareHouseID] = make(map[string]*response.OutputSimpleInfo) + } + if outputProductMap[v.WareHouseID][v.Number] == nil { + simpleInfo := &response.OutputSimpleInfo{ + Number: v.Number, + } + amount, _ := decimal.NewFromString(v.Amount) + simpleInfo.Amount = amount + outputProductMap[v.WareHouseID][v.Number] = simpleInfo + } else { + amount, _ := decimal.NewFromString(v.Amount) + outputProductMap[v.WareHouseID][v.Number].Amount = outputProductMap[v.WareHouseID][v.Number].Amount.Add(amount) + } + } + + for _, v := range grpcInputList { + if _, ok := warehouseIdMap[v.WareHouseID]; !ok { + warehouseIds = append(warehouseIds, v.WareHouseID) + warehouseIdMap[v.WareHouseID] = v.Warehouse + } + if productMap[v.Number] == nil { + continue + } + if inputProductMap[v.WareHouseID] == nil { + inputProductMap[v.WareHouseID] = make(map[string]*response.StoreInfo) + } + if inputProductMap[v.WareHouseID][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.WareHouseID][v.Number] = storeInfo + } else { + finishAmount, _ := decimal.NewFromString(v.Amount) + inputProductMap[v.WareHouseID][v.Number].FinishAmount = inputProductMap[v.WareHouseID][v.Number].FinishAmount.Add(finishAmount) + inputProductMap[v.WareHouseID][v.Number].AvailableAmount = inputProductMap[v.WareHouseID][v.Number].FinishAmount + } + } + + data := make([]*response.StoreInfoWithWarehouse, 0) + for _, houseId := range warehouseIds { + storeList := make([]*response.StoreInfo, 0, len(salesDetails.Products)) + for _, product := range salesDetails.Products { + storeInfo := inputProductMap[houseId][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[houseId][product.Number] != nil { + outputInfo := outputProductMap[houseId][product.Number] + storeInfo.LeftAmount = storeInfo.LeftAmount.Sub(outputInfo.Amount) //鍓╀綑鍙戣揣鏁伴噺 = 璁㈠崟鏁伴噺 - 宸插彂璐ф暟閲� + storeInfo.AvailableAmount = storeInfo.AvailableAmount.Sub(outputInfo.Amount) //鍙敤鏁伴噺 = 鍏ュ簱瀹屾垚鏁伴噺 - 宸插彂璐ф暟閲� + } + } + storeList = append(storeList, storeInfo) + } + data = append(data, &response.StoreInfoWithWarehouse{ + WarehouseId: houseId, + WarehouseName: warehouseIdMap[houseId], + StoreInfoList: storeList, + }) + } + + ctx.OkWithDetailed(data) +} + // ConfirmOutput // @Tags SalesDetails // @Summary 纭鍙戣揣 diff --git a/docs/docs.go b/docs/docs.go index 875b1b9..ef7fd5c 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -7205,6 +7205,36 @@ } } }, + "/api/salesDetails/getDeliveryPrepareInfoByWarehouse": { + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "SalesDetails" + ], + "summary": "鑾峰彇浜у搧鍏ュ簱淇℃伅鎸変粨搴撳垎缁�", + "parameters": [ + { + "description": "鏄庣粏缂栫爜", + "name": "object", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1.GetWarehouseProductInfoReq" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.ListResponse" + } + } + } + } + }, "/api/salesDetails/getProductInventoryInfo/{number}": { "get": { "produces": [ @@ -20159,6 +20189,9 @@ "v1.GetWarehouseProductInfoReq": { "type": "object", "properties": { + "groupByWarehouse": { + "type": "boolean" + }, "saleDetailID": { "type": "integer" }, diff --git a/docs/swagger.json b/docs/swagger.json index a2f030c..0616a95 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -7193,6 +7193,36 @@ } } }, + "/api/salesDetails/getDeliveryPrepareInfoByWarehouse": { + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "SalesDetails" + ], + "summary": "鑾峰彇浜у搧鍏ュ簱淇℃伅鎸変粨搴撳垎缁�", + "parameters": [ + { + "description": "鏄庣粏缂栫爜", + "name": "object", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1.GetWarehouseProductInfoReq" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.ListResponse" + } + } + } + } + }, "/api/salesDetails/getProductInventoryInfo/{number}": { "get": { "produces": [ @@ -20147,6 +20177,9 @@ "v1.GetWarehouseProductInfoReq": { "type": "object", "properties": { + "groupByWarehouse": { + "type": "boolean" + }, "saleDetailID": { "type": "integer" }, diff --git a/docs/swagger.yaml b/docs/swagger.yaml index a7535cd..544bb9c 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -6578,6 +6578,8 @@ type: object v1.GetWarehouseProductInfoReq: properties: + groupByWarehouse: + type: boolean saleDetailID: type: integer saleDetailNumber: @@ -11015,6 +11017,25 @@ summary: 鑾峰彇浜у搧鍏ュ簱淇℃伅 tags: - SalesDetails + /api/salesDetails/getDeliveryPrepareInfoByWarehouse: + post: + parameters: + - description: 鏄庣粏缂栫爜 + in: body + name: object + required: true + schema: + $ref: '#/definitions/v1.GetWarehouseProductInfoReq' + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/response.ListResponse' + summary: 鑾峰彇浜у搧鍏ュ簱淇℃伅鎸変粨搴撳垎缁� + tags: + - SalesDetails /api/salesDetails/getProductInventoryInfo/{number}: get: parameters: diff --git a/model/response/salesDetails.go b/model/response/salesDetails.go index b348199..98e4d06 100644 --- a/model/response/salesDetails.go +++ b/model/response/salesDetails.go @@ -134,3 +134,9 @@ Margin string `json:"margin"` //姣涘埄鐜� } + +type StoreInfoWithWarehouse struct { + WarehouseId int64 `json:"warehouseId,omitempty"` + WarehouseName string `json:"warehouseName,omitempty"` + StoreInfoList []*StoreInfo `json:"storeInfoList,omitempty"` +} diff --git a/router/salesDetails.go b/router/salesDetails.go index 0ab6f54..67f4360 100644 --- a/router/salesDetails.go +++ b/router/salesDetails.go @@ -22,10 +22,11 @@ salesDetailsRouter.GET("getApsProjectList", salesDetailsApi.GetApsProjectList) // 鑾峰彇aps椤圭洰鍒楄〃 salesDetailsRouter.POST("sendSalesDetailsToOtherSystem", salesDetailsApi.SendSalesDetailsToOtherSystem) // 鎺ㄩ�侀攢鍞槑缁嗕俊鎭埌鍏朵粬绯荤粺 // 鍒涘缓浜у搧鍑哄簱淇℃伅 - salesDetailsRouter.POST("getDeliveryPrepareInfo", salesDetailsApi.GetDeliveryPrepareInfo) // 鍙戣揣鍑嗗 - salesDetailsRouter.POST("getDeliveryList", salesDetailsApi.GetDeliveryList) // 鍙戣揣鏄庣粏 - salesDetailsRouter.POST("confirmOutput", salesDetailsApi.ConfirmOutput) // 纭鍙戣揣 - salesDetailsRouter.POST("confirmOutputOver", salesDetailsApi.ConfirmOutputOver) // 鍙戣揣瀹屾垚 + salesDetailsRouter.POST("getDeliveryPrepareInfo", salesDetailsApi.GetDeliveryPrepareInfo) // 鍙戣揣鍑嗗 + salesDetailsRouter.POST("getDeliveryPrepareInfoByWarehouse", salesDetailsApi.GetDeliveryPrepareInfoByWarehouse) // 鍙戣揣鍑嗗,鎸変粨搴撳垎缁� + salesDetailsRouter.POST("getDeliveryList", salesDetailsApi.GetDeliveryList) // 鍙戣揣鏄庣粏 + salesDetailsRouter.POST("confirmOutput", salesDetailsApi.ConfirmOutput) // 纭鍙戣揣 + salesDetailsRouter.POST("confirmOutputOver", salesDetailsApi.ConfirmOutputOver) // 鍙戣揣瀹屾垚 } } -- Gitblit v1.8.0