From 015c07410b59bafd606bd4f567a61355c4f15958 Mon Sep 17 00:00:00 2001
From: jiangshuai <291802688@qq.com>
Date: 星期五, 03 十一月 2023 11:37:20 +0800
Subject: [PATCH] Merge branch 'master' of http://192.168.5.5:10010/r/aps/WMS

---
 controllers/reorder_rule_controller.go |  311 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 311 insertions(+), 0 deletions(-)

diff --git a/controllers/reorder_rule_controller.go b/controllers/reorder_rule_controller.go
new file mode 100644
index 0000000..0c04e43
--- /dev/null
+++ b/controllers/reorder_rule_controller.go
@@ -0,0 +1,311 @@
+package controllers
+
+import (
+	"github.com/gin-gonic/gin"
+	"github.com/shopspring/decimal"
+	"gorm.io/gorm"
+	"strconv"
+	"strings"
+	"time"
+	"wms/constvar"
+	"wms/extend/code"
+	"wms/extend/util"
+	"wms/models"
+	"wms/pkg/timex"
+	"wms/request"
+)
+
+type ReorderRuleController struct {
+}
+
+// AddReorderRule
+// @Tags      閲嶈璐ц鍒�
+// @Summary   娣诲姞閲嶈璐ц鍒�
+// @Produce   application/json
+// @Param     object  body  models.ReorderRule true  "閲嶈璐ц鍒�"
+// @Success   200 {object} util.Response "鎴愬姛"
+// @Router    /api-wms/v1/reorderRule/addReorderRule [post]
+func (slf ReorderRuleController) AddReorderRule(c *gin.Context) {
+	var params models.ReorderRule
+	if err := c.BindJSON(&params); err != nil {
+		util.ResponseFormat(c, code.RequestParamError, "鍙傛暟瑙f瀽澶辫触锛屾暟鎹被鍨嬮敊璇�")
+		return
+	}
+	count, err := models.NewReorderRuleSearch().SetProductId(params.ProductId).SetLocationId(params.LocationId).Count()
+	if err != nil {
+		util.ResponseFormat(c, code.RequestError, "鏁版嵁楠岃瘉閿欒")
+		return
+	}
+	if count > 0 {
+		util.ResponseFormat(c, code.RequestError, "褰撳墠浣嶇疆宸插瓨鍦ㄧ浉鍚屼骇鍝佺殑閲嶈璐ц鍒�")
+		return
+	}
+	err = models.NewReorderRuleSearch().Create(&params)
+	if err != nil {
+		util.ResponseFormat(c, code.RequestError, "閲嶈璐ц鍒欎繚瀛樺け璐�")
+		return
+	}
+	util.ResponseFormat(c, code.Success, "淇濆瓨鎴愬姛")
+}
+
+// GetReorderRuleList
+// @Tags      閲嶈璐ц鍒�
+// @Summary   鑾峰彇閲嶈璐ц鍒欏垪琛�
+// @Produce   application/json
+// @Param     object  body  request.GetReorderRuleList true  "鍙傛暟"
+// @Success   200 {object} util.ResponseList{data=[]models.ReorderRule} "鎴愬姛"
+// @Router    /api-wms/v1/reorderRule/getReorderRuleList [post]
+func (slf ReorderRuleController) GetReorderRuleList(c *gin.Context) {
+	var params request.GetReorderRuleList
+	if err := c.BindJSON(&params); err != nil {
+		util.ResponseFormat(c, code.RequestParamError, "鍙傛暟瑙f瀽澶辫触锛屾暟鎹被鍨嬮敊璇�")
+		return
+	}
+	search := models.NewReorderRuleSearch()
+	if params.PageInfo.Check() {
+		search.SetPage(params.Page, params.PageSize)
+	}
+	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
+	}
+	productIds := make([]string, 0)
+	locationIds := make([]int, 0)
+	for _, rule := range rules {
+		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}
+	}
+	//鍦ㄥ簱
+	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
+	}
+	for _, rule := range rules {
+		for _, productAmount := range amount {
+			if rule.ProductId == productAmount.ProductId && rule.LocationId == productAmount.ToLocationId {
+				rule.Prediction = rule.Prediction.Add(productAmount.Amount)
+			}
+		}
+		rule.Prediction = rule.Amount.Add(rule.Prediction)
+	}
+	//鍑哄簱灏辩华
+	operationType = []constvar.BaseOperationType{constvar.BaseOperationTypeOutgoing, constvar.BaseOperationTypeInternal}
+	amount, err = GetProductAmount(productIds, nil, locationIds, status, operationType)
+	if err != nil {
+		util.ResponseFormat(c, code.RequestParamError, "鏌ヨ閲嶈璐ц鍒欏垪琛ㄥけ璐�")
+		return
+	}
+	for _, rule := range rules {
+		for _, productAmount := range amount {
+			if rule.ProductId == productAmount.ProductId && rule.LocationId == productAmount.FromLocationId {
+				rule.Prediction = rule.Prediction.Sub(productAmount.Amount)
+			}
+		}
+	}
+	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, result, int(total))
+}
+
+// 璁$畻鍦ㄥ簱涓庨娴嬫暟閲�
+func GetProductAmount(productIds []string, toLocationIds []int, fromLocationIds []int, status []constvar.OperationStatus,
+	operationType []constvar.BaseOperationType) ([]request.ProductAmount, error) {
+	var pa []request.ProductAmount
+	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.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)
+	}
+	if len(toLocationIds) > 0 {
+		search.Orm.Where("wms_operation.to_location_id in (?)", toLocationIds)
+	}
+	if len(fromLocationIds) > 0 {
+		search.Orm.Where("wms_operation.from_location_id in (?)", fromLocationIds)
+	}
+	if len(status) > 0 {
+		search.Orm.Where("wms_operation.status in (?)", status)
+	}
+	if len(operationType) > 0 {
+		search.Orm.Where("wms_operation.base_operation_type in (?)", operationType)
+	}
+	err := search.Orm.Find(&pa).Error
+	return pa, err
+}
+
+// GetAmountAndPrediction
+// @Tags      閲嶈璐ц鍒�
+// @Summary   鑾峰彇鍦ㄥ簱涓庨娴嬫暟閲�
+// @Produce   application/json
+// @Param     object  body  request.GetAmountAndPrediction true  "閲嶈璐ц鍒�"
+// @Success   200 {object} util.ResponseList{data=[]map[string]interface{}} "鎴愬姛"
+// @Router    /api-wms/v1/reorderRule/getAmountAndPrediction [post]
+func (slf ReorderRuleController) GetAmountAndPrediction(c *gin.Context) {
+	var params request.GetAmountAndPrediction
+	if err := c.BindJSON(&params); err != nil {
+		util.ResponseFormat(c, code.RequestParamError, "鍙傛暟瑙f瀽澶辫触锛屾暟鎹被鍨嬮敊璇�")
+		return
+	}
+	productIds := make([]string, 0)
+	locationIds := make([]int, 0)
+	productIds = append(productIds, params.ProductId)
+	locationIds = append(locationIds, params.LocationId)
+	amount := decimal.NewFromInt(0)
+	prediction := decimal.NewFromInt(0)
+	//鍦ㄥ簱
+	find, err := models.NewLocationProductAmountSearch().SetProductIds(productIds).SetLocationIds(locationIds).Find()
+	if err != nil {
+		util.ResponseFormat(c, code.RequestParamError, "鏌ヨ鍦ㄥ簱鏁伴噺澶辫触")
+		return
+	}
+	for _, productAmount := range find {
+		if params.ProductId == productAmount.ProductId && params.LocationId == productAmount.LocationId {
+			amount = amount.Add(productAmount.Amount)
+		}
+	}
+
+	//棰勬祴
+	//鍏ュ簱灏辩华
+	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
+	}
+	for _, productAmount := range list {
+		if params.ProductId == productAmount.ProductId && params.LocationId == productAmount.ToLocationId {
+			prediction = prediction.Add(productAmount.Amount)
+		}
+	}
+	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()
+	util.ResponseFormat(c, code.Success, m)
+}
+
+// UpdateReorderRule
+// @Tags      閲嶈璐ц鍒�
+// @Summary   鏇存柊閲嶈璐ц鍒�
+// @Produce   application/json
+// @Param     object  body  models.ReorderRule true  "閲嶈璐ц鍒�"
+// @Success   200 {object} util.Response "鎴愬姛"
+// @Router    /api-wms/v1/reorderRule/updateReorderRule [post]
+func (slf ReorderRuleController) UpdateReorderRule(c *gin.Context) {
+	var params models.ReorderRule
+	if err := c.BindJSON(&params); err != nil {
+		util.ResponseFormat(c, code.RequestParamError, "鍙傛暟瑙f瀽澶辫触锛屾暟鎹被鍨嬮敊璇�")
+		return
+	}
+	err := models.NewReorderRuleSearch().SetID(params.Id).Update(&params)
+	if err != nil {
+		util.ResponseFormat(c, code.RequestError, "閲嶈璐ц鍒欐洿鏂板け璐�")
+		return
+	}
+	util.ResponseFormat(c, code.Success, "鏇存柊鎴愬姛")
+}
+
+// OrderAgain
+// @Tags      閲嶈璐ц鍒�
+// @Summary   鍐嶈涓�娆�
+// @Produce   application/json
+// @Param     object  body  models.ReorderRule true  "閲嶈璐ц鍒�"
+// @Success   200 {object} util.Response "鎴愬姛"
+// @Router    /api-wms/v1/reorderRule/orderAgain [post]
+func (slf ReorderRuleController) OrderAgain(c *gin.Context) {
+	var params models.ReorderRule
+	if err := c.BindJSON(&params); err != nil {
+		util.ResponseFormat(c, code.RequestParamError, "鍙傛暟瑙f瀽澶辫触锛屾暟鎹被鍨嬮敊璇�")
+		return
+	}
+	location, err := models.NewLocationSearch().SetID(params.LocationId).First()
+	if err != nil {
+		util.ResponseFormat(c, code.RequestParamError, "鏌ヨ浣嶇疆淇℃伅澶辫触")
+		return
+	}
+	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
+	}
+	var operation models.Operation
+	var details models.OperationDetails
+	details.ProductId = params.ProductId
+	details.Amount = params.OrderNumber
+	operation.Details = append(operation.Details, &details)
+	operation.BaseOperationType = constvar.BaseOperationTypeIncoming
+	operation.Status = constvar.OperationStatus_Ready
+	operation.OperationTypeId = operationType.Id
+	operation.OperationTypeName = operationType.Name
+	operation.OperationDate = timex.TimeToString2(time.Now())
+	//todo 渚涘簲鍟嗕綅缃�
+	operation.FromLocationID = 1
+	operation.Number = strconv.FormatInt(time.Now().Unix(), 10)
+	operation.ToLocationID = params.LocationId
+
+	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(&params)
+		return err
+	})
+	if err != nil {
+		util.ResponseFormat(c, code.RequestParamError, "閲嶈澶辫触")
+		return
+	}
+	util.ResponseFormat(c, code.Success, "閲嶈鎴愬姛")
+}

--
Gitblit v1.8.0