From 1572f45e72cc0fa15c029f9ee2a08474104435e6 Mon Sep 17 00:00:00 2001
From: selfcheer <selfcheer@gmail.com>
Date: 星期五, 19 七月 2024 00:48:43 +0800
Subject: [PATCH] 采购单产品列表去掉过滤重复产品的逻辑

---
 proto/purchase_wms/server.go |  192 ++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 179 insertions(+), 13 deletions(-)

diff --git a/proto/purchase_wms/server.go b/proto/purchase_wms/server.go
index 089b7cd..523a7b8 100644
--- a/proto/purchase_wms/server.go
+++ b/proto/purchase_wms/server.go
@@ -20,8 +20,12 @@
 	if req.Number == "" {
 		return nil, errors.New("閲囪喘缂栧彿涓嶈兘涓虹┖")
 	}
-	err := global.GVA_DB.Model(&purchase.Purchase{}).Where("number = ?", req.Number).
-		Updates(map[string]interface{}{"status": purchase.OrderStatusStored}).Error
+	m := make(map[string]interface{})
+	m["status"] = purchase.OrderStatusStored
+	if req.Status > 0 {
+		m["status"] = req.Status
+	}
+	err := global.GVA_DB.Model(&purchase.Purchase{}).Where("number = ?", req.Number).Updates(m).Error
 	return new(UpdatePurchaseStatusResponse), err
 }
 
@@ -54,21 +58,34 @@
 	if req.ProductId == "" {
 		return nil, errors.New("浜у搧id涓虹┖")
 	}
-	var pt purchase.PurchaseType
-	err := global.GVA_DB.Model(&purchase.PurchaseType{}).First(&pt).Error
-	if err != nil {
-		return nil, err
-	}
 	var product test.SupplierMaterial
-	err = global.GVA_DB.Model(&test.SupplierMaterial{}).Where("number = ? and supplier_id = ?", req.ProductId, req.SupplierId).First(&product).Error
+	err := global.GVA_DB.Model(&test.SupplierMaterial{}).Where("number = ?", req.ProductId).Order("id desc").First(&product).Error
 	if err != nil {
-		return nil, err
+		if err == gorm.ErrRecordNotFound {
+			var material test.Material
+			err = global.GVA_DB.Model(&test.Material{}).Where("id = ?", req.ProductId).First(&material).Error
+			if err != nil {
+				return nil, err
+			}
+			product.Name = material.Name
+			product.Number = material.ID
+			product.Unit = material.Unit
+			product.PurchasePrice = material.PurchasePrice.InexactFloat64()
+			product.Specifications = material.Specs
+			product.ModelNumber = material.Type
+			err = global.GVA_DB.Create(&product).Error
+			if err != nil {
+				return nil, err
+			}
+		} else {
+			return nil, err
+		}
 	}
 
 	//閲囪喘鍗�
 	var purchaseRecord purchase.Purchase
-	purchaseRecord.PurchaseTypeId = int(pt.ID)
-	purchaseRecord.SupplierId = int(req.SupplierId)
+
+	//purchaseRecord.SupplierId = int(req.SupplierId)
 	if req.Source == "WMS" {
 		purchaseRecord.OrderSource = "WMS鎺ㄩ��"
 		purchaseRecord.Name = "WMS琛ヨ揣"
@@ -126,17 +143,166 @@
 	if err != nil {
 		return nil, err
 	}
+	purchaseIds := make([]uint, 0)
+	for _, p := range ps {
+		purchaseIds = append(purchaseIds, p.ID)
+	}
+	if len(purchaseIds) == 0 {
+		return nil, errors.New("娌℃湁鏌ュ埌閲囪喘鍗�")
+	}
+	pps := make([]*purchase.PurchaseProducts, 0)
+	err = global.GVA_DB.Model(&purchase.PurchaseProducts{}).Where("purchase_id in (?)", purchaseIds).Preload("Product").Find(&pps).Error
+	if err != nil {
+		return nil, err
+	}
 	infos := make([]*PurchaseInfo, 0)
 	for _, p := range ps {
 		var info PurchaseInfo
 		info.PurchaseNumber = p.Number
 		info.PurchaseName = p.Name
 		info.SupplierName = p.Supplier.Name
-		info.Amount = p.Quantity.IntPart()
 		info.Status = int64(p.Status)
-		infos = append(infos, &info)
+		if p.Status == purchase.OrderStatusStored || p.Status == purchase.OrderStatusCompleted {
+			info.FinishAmount = info.Amount
+		}
+		for _, pp := range pps {
+			if int(p.ID) == pp.PurchaseId {
+				ni := info
+				ni.ProductId = pp.Product.Number
+				ni.ProductName = pp.Product.Name
+				ni.Specs = pp.Product.Specifications
+				ni.Unit = pp.Product.Unit
+				ni.Amount = pp.Amount.IntPart()
+				infos = append(infos, &ni)
+			}
+		}
 	}
 	resp := new(GetPurchaseInfoResponse)
 	resp.Infos = infos
 	return resp, nil
 }
+
+func (s *Server) ExistSupplier(ctx context.Context, req *ExistSupplierRequest) (*ExistSupplierResponse, error) {
+	resp := new(ExistSupplierResponse)
+	if len(req.ProductId) == 0 {
+		resp.Exist = false
+		return resp, nil
+	}
+	var products []test.SupplierMaterial
+	err := global.GVA_DB.Model(&test.SupplierMaterial{}).Where("number in (?)", req.ProductId).Find(&products).Error
+	if err != nil {
+		return nil, err
+	}
+	for _, number := range req.ProductId {
+		exit := false
+		for _, product := range products {
+			if number == product.Number && product.SupplierId > 0 {
+				exit = true
+				break
+			}
+		}
+		if !exit {
+			resp.Exist = exit
+			return resp, nil
+		}
+	}
+	resp.Exist = true
+	return resp, nil
+}
+
+func (s *Server) CreatePurchaseByAps(ctx context.Context, req *CreatePurchaseByApsRequest) (*CreatePurchaseByWmsResponse, error) {
+	if len(req.Req) == 0 {
+		return nil, errors.New("浜у搧id涓虹┖")
+	}
+	productIds := make([]string, 0)
+	amount := int64(0)
+	numMap := make(map[string]int64)
+	for _, request := range req.Req {
+		productIds = append(productIds, request.ProductId)
+		numMap[request.ProductId] = request.Amount
+		amount += request.Amount
+	}
+	var products []test.SupplierMaterial
+	var newProducts []test.SupplierMaterial
+	err := global.GVA_DB.Model(&test.SupplierMaterial{}).Where("number in (?)", productIds).Order("id desc").Find(&products).Error
+	if err != nil {
+		return nil, err
+	}
+	for _, id := range productIds {
+		flag := false
+		for _, product := range products {
+			if id == product.Number {
+				newProducts = append(newProducts, product)
+				flag = true
+				break
+			}
+		}
+		if !flag {
+			var material test.Material
+			var product test.SupplierMaterial
+			err = global.GVA_DB.Model(&test.Material{}).Where("id = ?", id).First(&material).Error
+			if err != nil {
+				return nil, err
+			}
+			product.Name = material.Name
+			product.Number = material.ID
+			product.Unit = material.Unit
+			product.PurchasePrice = material.PurchasePrice.InexactFloat64()
+			product.Specifications = material.Specs
+			product.ModelNumber = material.Type
+			err = global.GVA_DB.Create(&product).Error
+			if err != nil {
+				return nil, err
+			}
+			newProducts = append(newProducts, product)
+		}
+	}
+
+	//閲囪喘鍗�
+	var purchaseRecord purchase.Purchase
+	purchaseRecord.OrderSource = "APS鎺ㄩ��"
+	purchaseRecord.Name = "APS閲囪喘"
+	purchaseRecord.ID = 0
+	purchaseRecord.Status = purchase.OrderStatusConfirmed
+	purchaseRecord.HandledBy = "admin"
+	purchaseRecord.Creator = "admin"
+	purchaseRecord.Number = fmt.Sprintf("CG%v", time.Now().Unix())
+	purchaseRecord.Principal = "admin"
+	purchaseRecord.OrderType = "閲囪喘璁㈠崟"
+	purchaseRecord.Quantity = decimal.NewFromInt(amount)
+	purchaseRecord.SourceOrder = req.SourceOrder
+
+	price := float64(0)
+	var pps []purchase.PurchaseProducts
+	for _, product := range newProducts {
+		//浜у搧
+		var pp purchase.PurchaseProducts
+		pp.ProductId = int(product.ID)
+		pp.Amount = decimal.NewFromInt(numMap[product.Number])
+		pp.Price = decimal.NewFromFloat(product.PurchasePrice)
+		price += product.PurchasePrice
+		pp.Total = pp.Amount.Mul(pp.Price)
+		pp.Remark = "APS閲囪喘"
+		pps = append(pps, pp)
+	}
+	purchaseRecord.TotalPrice = purchaseRecord.Quantity.Mul(decimal.NewFromFloat(price))
+	purchaseRecord.UnInvoiceAmount = purchaseRecord.TotalPrice
+	purchaseRecord.ShouldPayAmount = purchaseRecord.TotalPrice
+
+	err = global.GVA_DB.Transaction(func(tx *gorm.DB) error {
+		err = tx.Create(&purchaseRecord).Error
+		if err != nil {
+			return err
+		}
+		for i := 0; i < len(pps); i++ {
+			pps[i].PurchaseId = int(purchaseRecord.ID)
+		}
+		return tx.Create(&pps).Error
+	})
+	if err != nil {
+		return nil, err
+	}
+	resp := new(CreatePurchaseByWmsResponse)
+	resp.PurchaseNumber = purchaseRecord.Number
+	return resp, nil
+}

--
Gitblit v1.8.0