From 4a9bc4b7c84985047c7ebe0b991e8c8364bb56a2 Mon Sep 17 00:00:00 2001 From: liujiandao <274878379@qq.com> Date: 星期五, 03 十一月 2023 10:58:25 +0800 Subject: [PATCH] 重订货规则修改 --- models/location.go | 1 models/location_product_amount.go | 15 +- request/reorder_rule_request.go | 15 +- controllers/reorder_rule_controller.go | 94 ++++++++++++------ docs/swagger.yaml | 28 +++++ controllers/location.go | 28 +++++ docs/docs.go | 47 +++++++++ docs/swagger.json | 47 +++++++++ router/router.go | 1 9 files changed, 231 insertions(+), 45 deletions(-) diff --git a/controllers/location.go b/controllers/location.go index 5bfec45..2ef2a95 100644 --- a/controllers/location.go +++ b/controllers/location.go @@ -76,6 +76,34 @@ util.ResponseFormatList(c, code.Success, list, int(total)) } +// GetLocationTreeList +// @Tags 浣嶇疆 +// @Summary 鑾峰彇浣嶇疆鍒楄〃鏍� +// @Produce application/json +// @Success 200 {object} util.ResponseList{data=[]models.Location} "鎴愬姛" +// @Router /api-wms/v1/location/getLocationTreeList [get] +func (slf LocationController) GetLocationTreeList(c *gin.Context) { + all, err := models.NewLocationSearch().SetType(3).FindAll() + if err != nil { + util.ResponseFormat(c, code.RequestParamError, "鏌ユ壘澶辫触") + return + } + var tree []*models.Location + m := make(map[int]*models.Location) + for _, location := range all { + m[location.Id] = location + } + for _, location := range all { + if location.ParentId == 0 { + tree = append(tree, location) + } else { + m[location.ParentId].Children = append(m[location.ParentId].Children, location) + } + } + + util.ResponseFormat(c, code.Success, tree) +} + // GetLocationDetails // @Tags 浣嶇疆 // @Summary 鑾峰彇浣嶇疆璇︽儏 diff --git a/controllers/reorder_rule_controller.go b/controllers/reorder_rule_controller.go index 4add8d6..0c04e43 100644 --- a/controllers/reorder_rule_controller.go +++ b/controllers/reorder_rule_controller.go @@ -65,7 +65,7 @@ if params.PageInfo.Check() { search.SetPage(params.Page, params.PageSize) } - rules, total, err := search.SetPreload(true).SetKeyword(params.KeyWord).Find() + rules, total, err := search.SetPreload(true).SetKeyword(params.KeyWord).SetLocationId(params.LocationId).SetProductId(params.ProductId).Find() if err != nil { util.ResponseFormat(c, code.RequestParamError, "鏌ヨ閲嶈璐ц鍒欏垪琛ㄥけ璐�") return @@ -76,29 +76,44 @@ productIds = append(productIds, rule.ProductId) locationIds = append(locationIds, rule.LocationId) } + if params.LocationId != 0 { + locationIds = []int{params.LocationId} + } + if params.ProductId != "" { + productIds = []string{params.ProductId} + } //鍦ㄥ簱 - var status = []constvar.OperationStatus{constvar.OperationStatus_Finish, constvar.OperationStatus_Ready} + amounts, err := models.NewLocationProductAmountSearch().SetProductIds(productIds).SetLocationIds(locationIds).Find() + if err != nil { + util.ResponseFormat(c, code.RequestParamError, "鏌ヨ鍦ㄥ簱鏁伴噺澶辫触") + return + } + for _, rule := range rules { + for _, amount := range amounts { + if rule.ProductId == amount.ProductId && rule.LocationId == amount.LocationId { + rule.Amount = rule.Amount.Add(amount.Amount) + } + } + } + + //棰勬祴 + //鍏ュ簱灏辩华 + var status = []constvar.OperationStatus{constvar.OperationStatus_Ready} var operationType = []constvar.BaseOperationType{constvar.BaseOperationTypeIncoming, constvar.BaseOperationTypeInternal} amount, err := GetProductAmount(productIds, locationIds, nil, status, operationType) if err != nil { util.ResponseFormat(c, code.RequestParamError, "鏌ヨ閲嶈璐ц鍒欏垪琛ㄥけ璐�") return } - mp := make(map[int]decimal.Decimal) for _, rule := range rules { for _, productAmount := range amount { - if rule.ProductId == productAmount.ProductId && rule.LocationId == productAmount.ToLocationId && - productAmount.Status == constvar.OperationStatus_Finish { - rule.Amount = rule.Amount.Add(productAmount.Amount) - } - if rule.ProductId == productAmount.ProductId && rule.LocationId == productAmount.ToLocationId && - productAmount.Status == constvar.OperationStatus_Ready { - mp[rule.Id] = mp[rule.Id].Add(productAmount.Amount) + if rule.ProductId == productAmount.ProductId && rule.LocationId == productAmount.ToLocationId { + rule.Prediction = rule.Prediction.Add(productAmount.Amount) } } + rule.Prediction = rule.Amount.Add(rule.Prediction) } - //棰勬祴 - status = []constvar.OperationStatus{constvar.OperationStatus_Finish, constvar.OperationStatus_Ready} + //鍑哄簱灏辩华 operationType = []constvar.BaseOperationType{constvar.BaseOperationTypeOutgoing, constvar.BaseOperationTypeInternal} amount, err = GetProductAmount(productIds, nil, locationIds, status, operationType) if err != nil { @@ -108,13 +123,22 @@ for _, rule := range rules { for _, productAmount := range amount { if rule.ProductId == productAmount.ProductId && rule.LocationId == productAmount.FromLocationId { - rule.Prediction = rule.Prediction.Add(productAmount.Amount) + rule.Prediction = rule.Prediction.Sub(productAmount.Amount) } } - rule.Prediction = rule.Amount.Add(mp[rule.Id]).Sub(rule.Prediction) + } + var result []*models.ReorderRule + if params.Type == "" { + result = rules + } else { + for _, rule := range rules { + if rule.MinInventory.GreaterThan(rule.Prediction) { + result = append(result, rule) + } + } } - util.ResponseFormatList(c, code.Success, rules, int(total)) + util.ResponseFormatList(c, code.Success, result, int(total)) } // 璁$畻鍦ㄥ簱涓庨娴嬫暟閲� @@ -124,7 +148,7 @@ search := models.NewOperationDetailsSearch() search.Orm = search.Orm.Model(&models.OperationDetails{}). Select("wms_operation_details.product_id, wms_operation_details.amount, wms_operation.to_location_id as to_location_id, " + - "wms_operation.from_location_id as from_location_id, wms_operation.status"). + "wms_operation.from_location_id as from_location_id, wms_operation.base_operation_type"). Joins("left join wms_operation on wms_operation_details.operation_id = wms_operation.id") if len(productIds) > 0 { search.Orm.Where("wms_operation_details.product_id in (?)", productIds) @@ -163,30 +187,24 @@ productIds = append(productIds, params.ProductId) locationIds = append(locationIds, params.LocationId) amount := decimal.NewFromInt(0) - p := decimal.NewFromInt(0) prediction := decimal.NewFromInt(0) //鍦ㄥ簱 - var status = []constvar.OperationStatus{constvar.OperationStatus_Finish, constvar.OperationStatus_Ready} - var operationType = []constvar.BaseOperationType{constvar.BaseOperationTypeIncoming, constvar.BaseOperationTypeInternal} - list, err := GetProductAmount(productIds, locationIds, nil, status, operationType) + find, err := models.NewLocationProductAmountSearch().SetProductIds(productIds).SetLocationIds(locationIds).Find() if err != nil { - util.ResponseFormat(c, code.RequestParamError, "鏌ヨ閲嶈璐ц鍒欏垪琛ㄥけ璐�") + util.ResponseFormat(c, code.RequestParamError, "鏌ヨ鍦ㄥ簱鏁伴噺澶辫触") return } - for _, productAmount := range list { - if params.ProductId == productAmount.ProductId && params.LocationId == productAmount.ToLocationId && - productAmount.Status == constvar.OperationStatus_Finish { + for _, productAmount := range find { + if params.ProductId == productAmount.ProductId && params.LocationId == productAmount.LocationId { amount = amount.Add(productAmount.Amount) } - if params.ProductId == productAmount.ProductId && params.LocationId == productAmount.ToLocationId && - productAmount.Status == constvar.OperationStatus_Ready { - p = p.Add(productAmount.Amount) - } } + //棰勬祴 - status = []constvar.OperationStatus{constvar.OperationStatus_Finish, constvar.OperationStatus_Ready} - operationType = []constvar.BaseOperationType{constvar.BaseOperationTypeOutgoing, constvar.BaseOperationTypeInternal} - list, err = GetProductAmount(productIds, nil, locationIds, status, operationType) + //鍏ュ簱灏辩华 + var status = []constvar.OperationStatus{constvar.OperationStatus_Ready} + var operationType = []constvar.BaseOperationType{constvar.BaseOperationTypeIncoming, constvar.BaseOperationTypeInternal} + list, err := GetProductAmount(productIds, locationIds, nil, status, operationType) if err != nil { util.ResponseFormat(c, code.RequestParamError, "鏌ヨ閲嶈璐ц鍒欏垪琛ㄥけ璐�") return @@ -196,7 +214,19 @@ prediction = prediction.Add(productAmount.Amount) } } - prediction = amount.Add(p).Sub(prediction) + prediction = amount.Add(prediction) + //鍑哄簱灏辩华 + operationType = []constvar.BaseOperationType{constvar.BaseOperationTypeOutgoing, constvar.BaseOperationTypeInternal} + list, err = GetProductAmount(productIds, nil, locationIds, status, operationType) + if err != nil { + util.ResponseFormat(c, code.RequestParamError, "鏌ヨ閲嶈璐ц鍒欏垪琛ㄥけ璐�") + return + } + for _, productAmount := range list { + if params.ProductId == productAmount.ProductId && params.LocationId == productAmount.FromLocationId { + prediction = prediction.Sub(productAmount.Amount) + } + } m := make(map[string]int64) m["amount"] = amount.IntPart() m["prediction"] = prediction.IntPart() diff --git a/docs/docs.go b/docs/docs.go index 4e9ca24..575933f 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -572,6 +572,40 @@ } } }, + "/api-wms/v1/location/getLocationTreeList": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "浣嶇疆" + ], + "summary": "鑾峰彇浣嶇疆鍒楄〃鏍�", + "responses": { + "200": { + "description": "鎴愬姛", + "schema": { + "allOf": [ + { + "$ref": "#/definitions/util.ResponseList" + }, + { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/definitions/models.Location" + } + } + } + } + ] + } + } + } + } + }, "/api-wms/v1/location/updateLocation": { "post": { "produces": [ @@ -2445,6 +2479,12 @@ "models.Location": { "type": "object", "properties": { + "children": { + "type": "array", + "items": { + "$ref": "#/definitions/models.Location" + } + }, "companyId": { "description": "鍏徃id", "type": "integer" @@ -3438,6 +3478,9 @@ "keyWord": { "type": "string" }, + "locationId": { + "type": "integer" + }, "page": { "description": "椤电爜", "type": "integer" @@ -3445,6 +3488,10 @@ "pageSize": { "description": "姣忛〉澶у皬", "type": "integer" + }, + "type": { + "description": "绫诲瀷:bh=琛ヨ揣", + "type": "string" } } }, diff --git a/docs/swagger.json b/docs/swagger.json index 953fc06..16eff99 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -560,6 +560,40 @@ } } }, + "/api-wms/v1/location/getLocationTreeList": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "浣嶇疆" + ], + "summary": "鑾峰彇浣嶇疆鍒楄〃鏍�", + "responses": { + "200": { + "description": "鎴愬姛", + "schema": { + "allOf": [ + { + "$ref": "#/definitions/util.ResponseList" + }, + { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/definitions/models.Location" + } + } + } + } + ] + } + } + } + } + }, "/api-wms/v1/location/updateLocation": { "post": { "produces": [ @@ -2433,6 +2467,12 @@ "models.Location": { "type": "object", "properties": { + "children": { + "type": "array", + "items": { + "$ref": "#/definitions/models.Location" + } + }, "companyId": { "description": "鍏徃id", "type": "integer" @@ -3426,6 +3466,9 @@ "keyWord": { "type": "string" }, + "locationId": { + "type": "integer" + }, "page": { "description": "椤电爜", "type": "integer" @@ -3433,6 +3476,10 @@ "pageSize": { "description": "姣忛〉澶у皬", "type": "integer" + }, + "type": { + "description": "绫诲瀷:bh=琛ヨ揣", + "type": "string" } } }, diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 5a13e9c..c318180 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -244,6 +244,10 @@ type: object models.Location: properties: + children: + items: + $ref: '#/definitions/models.Location' + type: array companyId: description: 鍏徃id type: integer @@ -937,12 +941,17 @@ properties: keyWord: type: string + locationId: + type: integer page: description: 椤电爜 type: integer pageSize: description: 姣忛〉澶у皬 type: integer + type: + description: 绫诲瀷:bh=琛ヨ揣 + type: string type: object request.GetRuleList: properties: @@ -1701,6 +1710,25 @@ summary: 鑾峰彇浣嶇疆鍒楄〃 tags: - 浣嶇疆 + /api-wms/v1/location/getLocationTreeList: + get: + produces: + - application/json + responses: + "200": + description: 鎴愬姛 + schema: + allOf: + - $ref: '#/definitions/util.ResponseList' + - properties: + data: + items: + $ref: '#/definitions/models.Location' + type: array + type: object + summary: 鑾峰彇浣嶇疆鍒楄〃鏍� + tags: + - 浣嶇疆 /api-wms/v1/location/updateLocation: post: parameters: diff --git a/models/location.go b/models/location.go index ef755e6..028e875 100644 --- a/models/location.go +++ b/models/location.go @@ -26,6 +26,7 @@ RecentlyCount string `json:"recentlyCount" gorm:"type:varchar(255);comment:鏈�杩戠洏鐐�"` //鏈�杩戠洏鐐� NextCount string `json:"nextCount" gorm:"type:varchar(255);comment:涓嬫鐩樼偣"` //涓嬫鐩樼偣 JointName string `json:"jointName" gorm:"type:varchar(255);comment:鎷兼帴鍚嶇О"` //鎷兼帴鍚嶇О + Children []*Location `json:"children" gorm:"-"` } LocationSearch struct { diff --git a/models/location_product_amount.go b/models/location_product_amount.go index 00c7b92..94cf597 100644 --- a/models/location_product_amount.go +++ b/models/location_product_amount.go @@ -34,6 +34,7 @@ Preload bool //LocationProductIds []int LocationIds []int + ProductIds []string } LocationProductAmountWithOperation struct { @@ -102,10 +103,10 @@ return slf } -//func (slf *LocationProductAmountSearch) SetLocationProductIds(ids []int) *LocationProductAmountSearch { -// slf.LocationProductIds = ids -// return slf -//} +func (slf *LocationProductAmountSearch) SetProductIds(ids []string) *LocationProductAmountSearch { + slf.ProductIds = ids + return slf +} func (slf *LocationProductAmountSearch) SetLocationIds(ids []int) *LocationProductAmountSearch { slf.LocationIds = ids @@ -132,9 +133,9 @@ //if slf.LocationProductId != 0 { // db = db.Where("location_product_id=?", slf.LocationProductId) //} - //if len(slf.LocationProductIds) > 0 { - // db = db.Where("location_product_id in (?)", slf.LocationProductIds) - //} + if len(slf.ProductIds) > 0 { + db = db.Where("product_id in (?)", slf.ProductIds) + } if len(slf.LocationIds) > 0 { db = db.Where("location_id in (?)", slf.LocationIds) diff --git a/request/reorder_rule_request.go b/request/reorder_rule_request.go index bd33ec4..53e5c53 100644 --- a/request/reorder_rule_request.go +++ b/request/reorder_rule_request.go @@ -7,15 +7,18 @@ type GetReorderRuleList struct { PageInfo - KeyWord string `json:"keyWord"` + KeyWord string `json:"keyWord"` + LocationId int `json:"locationId"` + ProductId string `json:"productId"` + Type string `json:"type"` //绫诲瀷:bh=琛ヨ揣 } type ProductAmount struct { - ProductId string `json:"productId"` - ToLocationId int `json:"toLocationId"` - FromLocationId int `json:"fromLocationId"` - Amount decimal.Decimal `json:"amount"` - Status constvar.OperationStatus `json:"status"` + ProductId string `json:"productId"` + ToLocationId int `json:"toLocationId"` + FromLocationId int `json:"fromLocationId"` + Amount decimal.Decimal `json:"amount"` + BaseOperationType constvar.BaseOperationType `json:"baseOperationType"` } type GetAmountAndPrediction struct { diff --git a/router/router.go b/router/router.go index a591cf7..7d527e8 100644 --- a/router/router.go +++ b/router/router.go @@ -61,6 +61,7 @@ locationAPI.POST("updateLocation", locationController.UpdateLocation) //淇敼浣嶇疆 locationAPI.GET("getLocationDetails/:id", locationController.GetLocationDetails) //鑾峰彇浣嶇疆璇︽儏 locationAPI.DELETE("deleteLocation/:id", locationController.DeleteLocation) //鍒犻櫎浣嶇疆 + locationAPI.GET("getLocationTreeList", locationController.GetLocationTreeList) //鑾峰彇浣嶇疆鍒楄〃鏍� } // 涓氬姟绫诲瀷 -- Gitblit v1.8.0