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:] headers := rows[0] attributesColumns := make([]int, 0) for i, header := range headers { if mapAttribute[header] != 0 { attributesColumns = append(attributesColumns, i) } } 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] + ",未能识别庄口属性,请先添加该属性" 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) } */ materialList = append(materialList, material) } //保存动态属性 for _, attributesColumn := range attributesColumns { attributeValueList = append(attributeValueList, &models.AttributeValue{ EntityID: material.ID, //AttributeID: mapAttribute[insert[attributesColumn]], AttributeID: mapAttribute[headers[attributesColumn]], Value: insert[attributesColumn], }) } } if len(materialList) == 0 { return 0, errors.New("物料数据为空") } err = models.WithTransaction(func(db *gorm.DB) error { if err := models.NewMaterialSearch().SetOrm(db).CreateBatch(materialList); err != nil { return err } if len(attributeValueList) != 0 { if err := models.NewAttributeValueSearch().SetOrm(db).CreateBatch(attributeValueList); err != nil { return err } } return nil }) if err != nil { return 0, errors.New("导入失败") } return len(inserts), err }