From d1cb09e7a23e7221b6c090ad33e4481a5b79f615 Mon Sep 17 00:00:00 2001 From: zhangqian <zhangqian@123.com> Date: 星期三, 29 十一月 2023 17:44:29 +0800 Subject: [PATCH] 出入库报表搜索增加几个字段 --- controllers/reorder_rule_controller.go | 184 ++++++++++++++++++++++++++++++++++++--------- 1 files changed, 145 insertions(+), 39 deletions(-) diff --git a/controllers/reorder_rule_controller.go b/controllers/reorder_rule_controller.go index 4add8d6..13002bd 100644 --- a/controllers/reorder_rule_controller.go +++ b/controllers/reorder_rule_controller.go @@ -3,15 +3,21 @@ import ( "github.com/gin-gonic/gin" "github.com/shopspring/decimal" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" "gorm.io/gorm" "strconv" "strings" "time" + "wms/conf" "wms/constvar" "wms/extend/code" "wms/extend/util" "wms/models" + "wms/pkg/logx" "wms/pkg/timex" + "wms/proto/inventory_order" + "wms/proto/purchase_wms" "wms/request" ) @@ -65,7 +71,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,30 +82,45 @@ 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} + //鍑哄簱灏辩华 + operationType = []constvar.BaseOperationType{constvar.BaseOperationTypeOutgoing, constvar.BaseOperationTypeInternal, constvar.BaseOperationTypeDisuse} amount, err = GetProductAmount(productIds, nil, locationIds, status, operationType) if err != nil { util.ResponseFormat(c, code.RequestParamError, "鏌ヨ閲嶈璐ц鍒欏垪琛ㄥけ璐�") @@ -108,13 +129,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 +154,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 +193,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 +220,19 @@ prediction = prediction.Add(productAmount.Amount) } } - prediction = amount.Add(p).Sub(prediction) + prediction = amount.Add(prediction) + //鍑哄簱灏辩华 + operationType = []constvar.BaseOperationType{constvar.BaseOperationTypeOutgoing, constvar.BaseOperationTypeInternal, constvar.BaseOperationTypeDisuse} + 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() @@ -224,6 +260,23 @@ util.ResponseFormat(c, code.Success, "鏇存柊鎴愬姛") } +var InventoryOrderServiceConn *grpc.ClientConn + +func InitInventoryOrderServiceConn() { + var err error + InventoryOrderServiceConn, err = grpc.Dial(conf.GrpcServerConf.ApsAddr, grpc.WithTransportCredentials(insecure.NewCredentials())) + if err != nil { + logx.Errorf("grpc dial product service error: %v", err.Error()) + return + } +} + +func CloseInventoryOrderServiceConn() { + if InventoryOrderServiceConn != nil { + InventoryOrderServiceConn.Close() + } +} + // OrderAgain // @Tags 閲嶈璐ц鍒� // @Summary 鍐嶈涓�娆� @@ -237,18 +290,46 @@ util.ResponseFormat(c, code.RequestParamError, "鍙傛暟瑙f瀽澶辫触锛屾暟鎹被鍨嬮敊璇�") return } + if params.Route == "閲囪喘" { + client := purchase_wms.NewPurchaseServiceClient(PurchaseServiceConn) + resp, err := client.GetSupplierListByProductId(c, &purchase_wms.GetSupplierListByProductIdRequest{ProductId: params.ProductId}) + if err != nil { + util.ResponseFormat(c, code.RequestParamError, "grpc璋冪敤澶辫触") + return + } + util.ResponseFormat(c, code.Success, resp.List) + return + } + client := inventory_order.NewInventoryOrderServiceClient(InventoryOrderServiceConn) + order, err := client.CreateNewOrder(c, &inventory_order.CreateNewOrderRequest{ + OrderNumber: params.OrderNumber.IntPart(), + Unit: params.Unit, + ProductId: params.ProductId, + Customer: "WMS鎺ㄩ��", + }) + if err != nil { + util.ResponseFormat(c, code.RequestParamError, "grpc璋冪敤澶辫触") + return + } + err = orderAgain(params, order.OrderId) + if err != nil { + util.ResponseFormat(c, code.RequestParamError, "閲嶈澶辫触") + return + } + util.ResponseFormat(c, code.Success, "閲嶈鎴愬姛") +} + +func orderAgain(params models.ReorderRule, SourceNumber string) error { location, err := models.NewLocationSearch().SetID(params.LocationId).First() if err != nil { - util.ResponseFormat(c, code.RequestParamError, "鏌ヨ浣嶇疆淇℃伅澶辫触") - return + return err } houseCode := strings.Split(location.JointName, "/")[0] var operationType models.OperationType err = models.NewOperationTypeSearch().Orm.Model(&models.OperationType{}).Joins("left join wms_warehouse on wms_job_type.warehouse_id = wms_warehouse.id"). Where("wms_job_type.base_operation_type = 1 and wms_warehouse.code = ?", houseCode).First(&operationType).Error if err != nil { - util.ResponseFormat(c, code.RequestParamError, "鏌ヨ浣嶇疆淇℃伅澶辫触") - return + return err } var operation models.Operation var details models.OperationDetails @@ -264,18 +345,43 @@ operation.FromLocationID = 1 operation.Number = strconv.FormatInt(time.Now().Unix(), 10) operation.ToLocationID = params.LocationId + operation.SourceNumber = SourceNumber err = models.WithTransaction(func(db *gorm.DB) error { if err = models.NewOperationSearch().SetOrm(db).Create(&operation); err != nil { return err } params.OrderNumber = decimal.NewFromInt(0) - err = models.NewReorderRuleSearch().SetID(params.Id).Update(¶ms) + err = models.NewReorderRuleSearch().SetOrm(db).SetID(params.Id).Update(¶ms) return err }) + + return err +} + +// SubmitOrder +// @Tags 閲嶈璐ц鍒� +// @Summary 鍐嶈涓�娆� +// @Produce application/json +// @Param object body models.ReorderRule true "鍙傛暟" +// @Success 200 {object} util.Response "鎴愬姛" +// @Router /api-wms/v1/reorderRule/submitOrder [post] +func (slf ReorderRuleController) SubmitOrder(c *gin.Context) { + var params models.ReorderRule + client := purchase_wms.NewPurchaseServiceClient(PurchaseServiceConn) + resp, err := client.CreatePurchaseByWms(c, &purchase_wms.CreatePurchaseByWmsRequest{ + SupplierId: params.SupplierId, + ProductId: params.ProductId, + Amount: params.OrderNumber.IntPart(), + Source: "APS", + }) + if err != nil { + util.ResponseFormat(c, code.RequestParamError, "grpc璋冪敤澶辫触") + return + } + err = orderAgain(params, resp.PurchaseNumber) if err != nil { util.ResponseFormat(c, code.RequestParamError, "閲嶈澶辫触") return } - util.ResponseFormat(c, code.Success, "閲嶈鎴愬姛") } -- Gitblit v1.8.0