From 96236f07009f7138af765633fe3ac30c8ba88b94 Mon Sep 17 00:00:00 2001
From: lishihai <dslsh@dscom>
Date: 星期三, 19 六月 2024 14:26:11 +0800
Subject: [PATCH] 产品-产品-Excel导入产品

---
 controllers/product_controller.go |   27 +++++
 service/material.go               |  199 +++++++++++++++++++++++++++++++++++++++
 models/attribute.go               |    7 +
 models/material.go                |    1 
 response/Material.go              |    7 +
 router/router.go                  |    1 
 6 files changed, 242 insertions(+), 0 deletions(-)

diff --git a/controllers/product_controller.go b/controllers/product_controller.go
index 3e9ea0c..cb0e7fc 100644
--- a/controllers/product_controller.go
+++ b/controllers/product_controller.go
@@ -18,6 +18,8 @@
 	"wms/pkg/mysqlx"
 	"wms/pkg/structx"
 	"wms/request"
+	"wms/response"
+	"wms/service"
 )
 
 type ProductController struct {
@@ -874,3 +876,28 @@
 
 	util.ResponseFormat(c, code.Success, "娣诲姞鎴愬姛")
 }
+
+// InputProduct
+//
+//	@Tags		鐗╂枡绠$悊
+//	@Summary	瀵煎叆鐗╂枡
+//	@Produce	application/xlsx
+//	@Success	200		{object}	util.Response 	"鎴愬姛"
+//	@Router		/api-wms/v1/product/inputProduct [post]
+func (slf ProductController) InputProduct(c *gin.Context) {
+	file, _, err := c.Request.FormFile("file")
+	if err != nil {
+		util.ResponseFormat(c, code.RequestParamError, err.Error())
+		return
+	}
+	defer file.Close()
+	resp := response.MaterialInputRes{InputCount: 0, ErrCount: 0, FileAddress: ""}
+	userInfo := middleware.GetUserInfo(c)
+	insertCount, err := service.InputMaterial(file, userInfo.Username)
+	if err != nil {
+		util.ResponseFormat(c, code.RequestParamError, err.Error())
+		return
+	}
+	resp.InputCount = insertCount
+	util.ResponseFormat(c, code.Success, resp)
+}
diff --git a/models/attribute.go b/models/attribute.go
index f3b0d13..31e6d90 100644
--- a/models/attribute.go
+++ b/models/attribute.go
@@ -108,6 +108,10 @@
 	slf.Name = name
 	return slf
 }
+func (slf *AttributeSearch) SetEntityType(entityType EntityType) *AttributeSearch {
+	slf.EntityType = entityType
+	return slf
+}
 
 func (slf *AttributeSearch) build() *gorm.DB {
 	var db = slf.Orm.Table(slf.TableName())
@@ -119,6 +123,9 @@
 	if slf.Order != "" {
 		db = db.Order(slf.Order)
 	}
+	if slf.EntityType != 0 {
+		db = db.Where("entity_type = ?", slf.EntityType)
+	}
 
 	if slf.Name != "" {
 		db = db.Where("name = ?", slf.Name)
diff --git a/models/material.go b/models/material.go
index 031fc32..5350fc2 100644
--- a/models/material.go
+++ b/models/material.go
@@ -96,6 +96,7 @@
 		MinInventoryRule decimal.Decimal `json:"minInventoryRule" gorm:"-"` //鏈�灏忓簱瀛�
 		MaxInventoryRule decimal.Decimal `json:"maxInventoryRule" gorm:"-"` //鏈�澶у簱瀛�
 
+		CreateBy string `gorm:"type:varchar(255);comment:瀵煎叆浜恒�佸垱寤轰汉" json:"createBy"` //鍒涘缓浜�
 	}
 
 	MaterialSearch struct {
diff --git a/response/Material.go b/response/Material.go
new file mode 100644
index 0000000..cf16384
--- /dev/null
+++ b/response/Material.go
@@ -0,0 +1,7 @@
+package response
+
+type MaterialInputRes struct {
+	InputCount  int    `json:"inputCount"`
+	ErrCount    int    `json:"errCount"`
+	FileAddress string `json:"fileAddress"`
+}
diff --git a/router/router.go b/router/router.go
index e50c74c..9376dd6 100644
--- a/router/router.go
+++ b/router/router.go
@@ -135,6 +135,7 @@
 		productAPI.GET("getUserInfo", productController.GetUserInfo)       //鑾峰彇鐧诲綍鐢ㄦ埛淇℃伅
 		productAPI.GET("getUnitInfo", productController.GetUnitInfo)       //鑾峰彇鍗曚綅淇℃伅
 		productAPI.POST("saveUnitDict", productController.SaveUnitDict)    //鏇存柊璁¢噺鍗曚綅瀛楀吀
+		productAPI.POST("inputProduct", productController.InputProduct)    //鏇存柊璁¢噺鍗曚綅瀛楀吀
 
 	}
 
diff --git a/service/material.go b/service/material.go
new file mode 100644
index 0000000..ea42769
--- /dev/null
+++ b/service/material.go
@@ -0,0 +1,199 @@
+package service
+
+import (
+	"errors"
+	"github.com/shopspring/decimal"
+	"github.com/xuri/excelize/v2"
+	"gorm.io/gorm"
+	"mime/multipart"
+	"strconv"
+	"strings"
+	"wms/constvar"
+	"wms/models"
+)
+
+func InputMaterial(file multipart.File, username string) (insertCount int, err error) {
+	existMaterials, err := models.NewMaterialSearch().FindNotTotal()
+	if err != nil {
+		return 0, err
+	}
+	mapExistMaterial := make(map[string]bool)
+	mapAttribute := make(map[string]uint)
+	for _, v := range existMaterials {
+		mapExistMaterial[v.ID] = true
+	}
+	attributes, err := models.NewAttributeSearch().SetEntityType(models.EntityTypeProduct).FindNotTotal()
+	if err != nil {
+		return 0, err
+	}
+	for _, v := range attributes {
+		mapAttribute[v.Name] = v.ID
+	}
+	f, err := excelize.OpenReader(file)
+	if err != nil {
+		return 0, err
+	}
+	defer f.Close()
+	var materialList []*models.Material
+	var attributeValueList []*models.AttributeValue
+
+	rows, err := f.GetRows("Sheet1")
+	if err != nil {
+		return 0, err
+	}
+	if len(rows) <= 1 {
+		return 0, errors.New("鏀规枃浠舵病鏈夋暟鎹唴瀹�")
+	}
+
+	inserts := rows[1:len(rows)]
+
+	for index, insert := range inserts {
+		errMsg := ""
+		if len(insert) < 4 || insert[0] == "" || insert[1] == "" || insert[2] == "" || insert[3] == "" {
+			errMsg = "绗�" + strconv.Itoa(index+2) + "琛岋紝娌℃湁濉啓蹇呭~椤归」"
+			return 0, errors.New(errMsg)
+		}
+		if mapExistMaterial[strings.Trim(insert[0], " ")] {
+			errMsg = "绗�" + strconv.Itoa(index+2) + "琛岋紝浜у搧缂栫爜锛�" + insert[0] + "锛屽凡缁忓瓨鍦�"
+			return 0, errors.New(errMsg)
+		}
+		material := new(models.Material)
+		material.CreateBy = username
+		material.ID = strings.Trim(insert[0], " ")
+		material.Name = insert[1]
+		switch insert[2] {
+		case string(constvar.MaterialModeRaw):
+			material.Model = constvar.MaterialModeRaw
+		case string(constvar.MaterialModeSemi):
+			material.Model = constvar.MaterialModeSemi
+		case string(constvar.MaterialModeFinished):
+			material.Model = constvar.MaterialModeFinished
+		case string(constvar.MaterialModeAuxiliary):
+			material.Model = constvar.MaterialModeAuxiliary
+		case string(constvar.MaterialModeConsumables):
+			material.Model = constvar.MaterialModeConsumables
+		case string(constvar.MaterialModeOther):
+			material.Model = constvar.MaterialModeOther
+		default:
+			errMsg = "绗�" + strconv.Itoa(index+2) + "琛岋紝浜у搧缂栫爜锛�" + insert[0] + "锛屾棤娉曡瘑鍒浜у搧绫诲埆"
+			return 0, errors.New(errMsg)
+		}
+
+		if len(insert) > 4 && insert[3] != "" {
+			//errMsg = "绗�" + strconv.Itoa(index+1) + "琛岋紝浜у搧缂栫爜锛�" + insert[0] + "锛屾湭濉啓鍗曚綅"
+			//return 0, errors.New(errMsg)
+			material.Unit = insert[3]
+		}
+
+		var moreUnit = true
+		if len(insert) > 5 && insert[4] != "" {
+			material.MoreUnit = &moreUnit
+			var ut models.UnitItems
+			ut.Unit = insert[4]
+			if len(insert) < 13 || insert[12] == "" {
+				errMsg = "绗�" + strconv.Itoa(index+2) + "琛岋紝浜у搧缂栫爜锛�" + insert[0] + "锛岃濉啓涓庤緟璁¢噺鍗曚綅1鐩稿叧鐨勫崟浣嶆崲绠楁瘮渚�1"
+				return 0, errors.New(errMsg)
+			}
+			ut.Amount = decimal.RequireFromString(insert[12])
+			if len(insert) < 14 || insert[13] == "" {
+				errMsg = "绗�" + strconv.Itoa(index+2) + "琛岋紝浜у搧缂栫爜锛�" + insert[0] + "锛岃濉啓涓庤緟璁¢噺鍗曚綅1鐩稿叧鐨勬槸鍚︽诞鍔ㄦ崲绠�1"
+				return 0, errors.New(errMsg)
+			}
+			if strings.Trim(insert[13], " ") == "鏄�" {
+				ut.Floating = true
+			} else {
+				ut.Floating = false
+			}
+			material.MoreUnitList = append(material.MoreUnitList, ut)
+		}
+		if len(insert) > 6 && insert[5] != "" {
+			material.MoreUnit = &moreUnit
+			var ut models.UnitItems
+			ut.Unit = insert[5]
+			if len(insert) < 15 || insert[14] == "" {
+				errMsg = "绗�" + strconv.Itoa(index+2) + "琛岋紝浜у搧缂栫爜锛�" + insert[0] + "锛岃濉啓涓庤緟璁¢噺鍗曚綅2鐩稿叧鐨勫崟浣嶆崲绠楁瘮渚�2"
+				return 0, errors.New(errMsg)
+			}
+			ut.Amount = decimal.RequireFromString(insert[14])
+			if len(insert) < 16 || insert[15] == "" {
+				errMsg = "绗�" + strconv.Itoa(index+2) + "琛岋紝浜у搧缂栫爜锛�" + insert[0] + "锛岃濉啓涓庤緟璁¢噺鍗曚綅2鐩稿叧鐨勬槸鍚︽诞鍔ㄦ崲绠�2"
+				return 0, errors.New(errMsg)
+			}
+			if strings.Trim(insert[15], " ") == "鏄�" {
+				ut.Floating = true
+			} else {
+				ut.Floating = false
+			}
+			material.MoreUnitList = append(material.MoreUnitList, ut)
+		}
+		if len(insert) > 7 && insert[6] != "" {
+			material.Specs = insert[6] //瑙勬牸
+		}
+		if len(insert) > 8 && insert[7] != "" {
+			material.Type = insert[7] //鍨嬪彿
+		}
+		if len(insert) > 9 && insert[8] != "" {
+			if mapAttribute[insert[8]] == 0 {
+				errMsg = "绗�" + strconv.Itoa(index+2) + "琛岋紝浜у搧缂栫爜锛�" + insert[0] + "锛屾湭鑳借瘑鍒潗璐ㄥ睘鎬э紝璇峰厛娣诲姞璇ュ睘鎬�"
+				return 0, errors.New(errMsg)
+			}
+			//material.Quality = insert[8] //鏉愯川
+			attributeValue1 := new(models.AttributeValue)
+			attributeValue1.EntityID = material.ID
+			attributeValue1.AttributeID = mapAttribute[insert[8]]
+			attributeValue1.Value = insert[8]
+			attributeValueList = append(attributeValueList, attributeValue1)
+		}
+		if len(insert) > 10 && insert[9] != "" {
+			if mapAttribute[insert[9]] == 0 {
+				errMsg = "绗�" + strconv.Itoa(index+2) + "琛岋紝浜у搧缂栫爜锛�" + insert[0] + "锛屾湭鑳借瘑鍒搧鐗屽睘鎬э紝璇峰厛娣诲姞璇ュ睘鎬�"
+				return 0, errors.New(errMsg)
+			}
+			//material.Brand = insert[9]   //鍝佺墝
+			attributeValue2 := new(models.AttributeValue)
+			attributeValue2.EntityID = material.ID
+			attributeValue2.AttributeID = mapAttribute[insert[9]]
+			attributeValue2.Value = insert[9]
+			attributeValueList = append(attributeValueList, attributeValue2)
+		}
+		if len(insert) > 11 && insert[10] != "" {
+			if mapAttribute[insert[10]] == 0 {
+				errMsg = "绗�" + strconv.Itoa(index+2) + "琛岋紝浜у搧缂栫爜锛�" + insert[0] + "锛屾湭鑳借瘑鍒瓑绾у睘鎬э紝璇峰厛娣诲姞璇ュ睘鎬�"
+				return 0, errors.New(errMsg)
+			}
+			//material.Level = insert[10]  //绛夌骇
+			attributeValue3 := new(models.AttributeValue)
+			attributeValue3.EntityID = material.ID
+			attributeValue3.AttributeID = mapAttribute[insert[10]]
+			attributeValue3.Value = insert[10]
+			attributeValueList = append(attributeValueList, attributeValue3)
+		}
+		if len(insert) > 12 && insert[11] != "" {
+			if mapAttribute[insert[11]] == 0 {
+				errMsg = "绗�" + strconv.Itoa(index+2) + "琛岋紝浜у搧缂栫爜锛�" + insert[0] + "锛屾湭鑳借瘑鍒簞鍙e睘鎬э紝璇峰厛娣诲姞璇ュ睘鎬�"
+				return 0, errors.New(errMsg)
+			}
+			//material.From = insert[11]   //搴勫彛
+			attributeValue4 := new(models.AttributeValue)
+			attributeValue4.EntityID = material.ID
+			attributeValue4.AttributeID = mapAttribute[insert[11]]
+			attributeValue4.Value = insert[11]
+			attributeValueList = append(attributeValueList, attributeValue4)
+		}
+
+	}
+	err = models.WithTransaction(func(db *gorm.DB) error {
+		if err := models.NewMaterialSearch().CreateBatch(materialList); err != nil {
+			return err
+		}
+		if err := models.NewAttributeValueSearch().CreateBatch(attributeValueList); err != nil {
+			return err
+		}
+		return nil
+	})
+
+	if err != nil {
+		return 0, errors.New("瀵煎叆澶辫触")
+	}
+	return len(inserts), err
+}

--
Gitblit v1.8.0