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