diff --git a/business/jxstore/cms/sku.go b/business/jxstore/cms/sku.go index 75ff104d3..3e5f57b3f 100644 --- a/business/jxstore/cms/sku.go +++ b/business/jxstore/cms/sku.go @@ -9,10 +9,13 @@ import ( "strings" "time" + "git.rosy.net.cn/baseapi" "git.rosy.net.cn/baseapi/platformapi/dingdingapi" "git.rosy.net.cn/baseapi/platformapi/ebaiapi" + "github.com/360EntSecGroup-Skylar/excelize" "git.rosy.net.cn/jx-callback/business/jxutils/ddmsg" + "git.rosy.net.cn/jx-callback/business/jxutils/excel" "git.rosy.net.cn/jx-callback/business/jxutils/tasksch" "git.rosy.net.cn/baseapi/platformapi/jdapi" @@ -35,6 +38,15 @@ type SkuNamesInfo struct { SkuNames []*model.SkuNameExt `json:"skuNames"` } +type CreateUpcSkuByExcelErr struct { + Upc string `json:"商品条码"` + Name string `json:"商品名称"` + Unit string `json:"单位"` + SpecQuality string `json:"规格"` + Price int `json:"售价"` + Err string `json:"错误原因"` +} + var ( ErrInputCatsDoesntMatch = errors.New("输入的类别列表不合法,需要输入一个父ID下的所有子类别") ) @@ -1694,27 +1706,39 @@ func SendNoCatSkusToOperater(ctx *jxcontext.Context) (err error) { skuNames []*model.SkuName ) sql := ` - SELECT * FROM sku_name WHERE deleted_at = ? AND category_id = ? + SELECT * FROM sku_name WHERE deleted_at = ? AND (category_id = ? OR img = ?) AND unit <> ? ` - sqlParams := []interface{}{utils.DefaultTimeValue, model.NoCatCatgoryID} + sqlParams := []interface{}{utils.DefaultTimeValue, model.NoCatCatgoryID, model.NOSkuNameImg, model.UnitNames[0]} err = dao.GetRows(db, &skuNames, sql, sqlParams) if err != nil { return err } if len(skuNames) > 10 { - noticeMsg := "有超过10个标品未进行分类!" + noticeMsg := "有超过10个标品未进行分类和未设置图片!" for _, v := range skuNames { noticeMsg += "NameID:" + utils.Int2Str(v.ID) + ",商品名:" + v.Name + "," } for _, mobile := range sendNoCatSkusMobile { if user, err := dao.GetUserByID(db, "mobile", mobile); err != nil { - ddmsg.SendUserMessage(dingdingapi.MsgTyeText, user.UserID, "标品未分类", noticeMsg) + ddmsg.SendUserMessage(dingdingapi.MsgTyeText, user.UserID, "标品未分类和未设置图片", noticeMsg) } } } return err } +func buildCreateUpcSkuByExcelErr(v *model.SkuName, errMsg string) (createUpcSkuByExcelErr *CreateUpcSkuByExcelErr) { + createUpcSkuByExcelErr = &CreateUpcSkuByExcelErr{ + Upc: *v.Upc, + Name: v.Name, + Unit: v.Unit, + SpecQuality: utils.Float64ToStr(float64(v.SpecQuality)), + Price: v.Price, + Err: errMsg, + } + return createUpcSkuByExcelErr +} + func CreateUpcSkuByExcel(ctx *jxcontext.Context, files []*multipart.FileHeader) (err error) { if len(files) == 0 { return errors.New("没有文件上传!") @@ -1727,11 +1751,188 @@ func CreateUpcSkuByExcel(ctx *jxcontext.Context, files []*multipart.FileHeader) } func CreateUpcSkuByExcelBin(ctx *jxcontext.Context, reader io.Reader) (err error) { + var ( + db = dao.GetDB() + skuParams []*model.SkuName + createUpcSkuByExcelErrList []*CreateUpcSkuByExcelErr + excelTitle = []string{ + "商品条码", + "商品名称", + "单位", + "规格", + "售价", + "错误原因", + } + ) taskSeqFunc := func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { switch step { case 0: + xlsx, err := excelize.OpenReader(reader) + if err != nil { + return result, err + } + rows, _ := xlsx.GetRows(xlsx.GetSheetName(1)) + for rowNum, row := range rows { + if rowNum < 1 { + continue + } + var ( + skuParam = &model.SkuName{} + upc string + unit string + specQuality float32 + price int + name string + ) + for k, cell := range row { + if cell != "" { + if k == 0 { + upc = cell + } + if k == 1 { + name = cell + } + if k == 2 { + unit = cell + } + if k == 3 { + specQuality = float32(utils.Str2Float64(cell)) + } + if k == 4 { + price = int(utils.Str2Float64(cell) * 100) + } + } + } + skuParam.Upc = &upc + skuParam.Unit = unit + skuParam.SpecQuality = specQuality + skuParam.Price = price + skuParam.Name = name + skuParams = append(skuParams, skuParam) + } case 1: + for _, v := range skuParams { + skuName := &model.SkuNameExt{ + SkuName: model.SkuName{}, + Skus: []*model.SkuWithVendor{ + &model.SkuWithVendor{ + Sku: &model.Sku{}, + }, + }, + } + if v.Upc != nil { + skuName.Upc = v.Upc + } else { + createUpcSkuByExcelErrList = append(createUpcSkuByExcelErrList, buildCreateUpcSkuByExcelErr(v, "商品的条码不能为空!")) + } + skuNames, _ := dao.GetSkuNames(db, nil, []string{*v.Upc}, "") + if len(skuNames) > 0 { + createUpcSkuByExcelErrList = append(createUpcSkuByExcelErrList, buildCreateUpcSkuByExcelErr(v, "商品在京西库中已存在!")) + continue + } + productInfos, err := GetJdUpcCodeByName(ctx, "", *v.Upc) + if err != nil { + createUpcSkuByExcelErrList = append(createUpcSkuByExcelErrList, buildCreateUpcSkuByExcelErr(v, err.Error())) + continue + } + if len(productInfos) == 0 { + result, _ := api.AliUpcAPI.GetAliUpcInfo(*v.Upc) + if result == nil { + createUpcSkuByExcelErrList = append(createUpcSkuByExcelErrList, buildCreateUpcSkuByExcelErr(v, "暂不支持创建此商品!")) + continue + } + if result.Img != "" { + if resBinary, _, err := jxutils.DownloadFileByURL(result.Img); err == nil { + if downloadURL, err := jxutils.UploadExportContent(resBinary, result.Img[strings.LastIndex(result.Img, "/"):len(result.Img)]); err == nil { + resBinary2, _, err := jxutils.DownloadFileByURL(downloadURL + model.SkuNameImgStandard) + downloadURL2, err := jxutils.UploadExportContent(resBinary2, downloadURL[strings.LastIndex(downloadURL, "/"):len(downloadURL)]) + if err == nil { + skuName.Img = downloadURL2 + } else { + createUpcSkuByExcelErrList = append(createUpcSkuByExcelErrList, buildCreateUpcSkuByExcelErr(v, err.Error())) + } + } else { + createUpcSkuByExcelErrList = append(createUpcSkuByExcelErrList, buildCreateUpcSkuByExcelErr(v, err.Error())) + } + } else { + createUpcSkuByExcelErrList = append(createUpcSkuByExcelErrList, buildCreateUpcSkuByExcelErr(v, err.Error())) + } + } else { + skuName.Img = model.NOSkuNameImg + } + if v.Name != "" { + skuName.Name = v.Name + } else { + skuName.Name = result.GoodsName + } + if v.Price == 0 { + if result.Price == "" { + createUpcSkuByExcelErrList = append(createUpcSkuByExcelErrList, buildCreateUpcSkuByExcelErr(v, "商品的售价不能为空!")) + } else { + skuName.Price = int(utils.Str2Int64(result.Price) * 100) + } + } else { + skuName.Price = v.Price * 100 + } + if v.Unit != "" { + skuName.Unit = v.Unit + } else { + createUpcSkuByExcelErrList = append(createUpcSkuByExcelErrList, buildCreateUpcSkuByExcelErr(v, "商品的单位不能为空!")) + } + if v.SpecQuality != 0 { + skuName.Skus[0].SpecQuality = v.SpecQuality + skuName.Skus[0].Weight = int(utils.Str2Int64(utils.Float64ToStr(float64(v.SpecQuality)))) + } else { + createUpcSkuByExcelErrList = append(createUpcSkuByExcelErrList, buildCreateUpcSkuByExcelErr(v, "商品的重量不能为空!")) + } + skuName.Skus[0].SpecUnit = model.SpecialSpecUnit + } else { + productInfo := productInfos[0] + skuNames2, _ := dao.GetSkuNames(db, nil, nil, productInfo.Name) + if len(skuNames2) > 1 { + createUpcSkuByExcelErrList = append(createUpcSkuByExcelErrList, buildCreateUpcSkuByExcelErr(v, "此商品名在京西库中查询出了大于1个商品!")) + continue + } + //表示查到了,需要把upc更新上去,没查到就要新建 + if len(skuNames2) == 1 && (productInfo.SpecQuality == skuNames2[0].SpecQuality && productInfo.SpecUnit == skuNames2[0].SpecUnit) { + skuNames2[0].Upc = v.Upc + dao.UpdateEntity(db, skuNames2[0], "Upc") + } else { + if v.Price == 0 { + result, err := api.AliUpcAPI.GetAliUpcInfo(*v.Upc) + if err != nil { + createUpcSkuByExcelErrList = append(createUpcSkuByExcelErrList, buildCreateUpcSkuByExcelErr(v, err.Error())) + continue + } + if result.Price == "" { + createUpcSkuByExcelErrList = append(createUpcSkuByExcelErrList, buildCreateUpcSkuByExcelErr(v, "商品的售价不能为空!")) + } else { + skuName.Price = int(utils.Str2Int64(result.Price) * 100) + } + } else { + skuName.Price = v.Price * 100 + } + skuName.Skus[0].SpecQuality = productInfo.SpecQuality + skuName.Skus[0].SpecUnit = productInfo.SpecUnit + skuName.Skus[0].Weight = int(utils.Str2Int64(utils.Float64ToStr(float64(productInfo.Weight)))) + if len(productInfo.ImgList) > 0 { + skuName.Img = productInfo.ImgList[0] + } + } + } + skuName.Status = model.SkuStatusNormal + skuName.IsGlobal = model.YES + skuName.CategoryID = model.NoCatCatgoryID + skuName.Skus[0].Status = model.SkuStatusNormal + _, err = AddSkuName(ctx, skuName, ctx.GetUserName()) + if err != nil { + createUpcSkuByExcelErrList = append(createUpcSkuByExcelErrList, buildCreateUpcSkuByExcelErr(v, err.Error())) + } + } case 2: + if len(createUpcSkuByExcelErrList) > 0 { + err = writeToExcel(excelTitle, createUpcSkuByExcelErrList, task) + } } return result, err } @@ -1740,3 +1941,26 @@ func CreateUpcSkuByExcelBin(ctx *jxcontext.Context, reader io.Reader) (err error _, err = taskSeq.GetResult(0) return err } + +func writeToExcel(excelTitle []string, dataList interface{}, task *tasksch.SeqTask) (err error) { + var sheetList []*excel.Obj2ExcelSheetConfig + var downloadURL, fileName string + excelConf := &excel.Obj2ExcelSheetConfig{ + Title: "sheet1", + Data: dataList, + CaptionList: excelTitle, + } + sheetList = append(sheetList, excelConf) + if excelConf != nil { + downloadURL, fileName, err = jxutils.UploadExeclAndPushMsg(sheetList, "创建标品错误") + } else { + baseapi.SugarLogger.Debug("WriteToExcel: dataSuccess is nil!") + } + if err != nil { + baseapi.SugarLogger.Errorf("WriteToExcel:upload %s , %s failed error:%v", fileName, err) + } else { + noticeMsg := fmt.Sprintf("[详情点我]path=%s\n", downloadURL) + task.SetNoticeMsg(noticeMsg) + } + return err +} diff --git a/business/model/sku.go b/business/model/sku.go index 87741def0..16d83b98e 100644 --- a/business/model/sku.go +++ b/business/model/sku.go @@ -15,7 +15,9 @@ const ( ) const ( - NoCatCatgoryID = 291 + NoCatCatgoryID = 291 + NOSkuNameImg = "https://image.jxc4.com/noGoodsImg.jpg" + SkuNameImgStandard = "?imageMogr2/thumbnail/!800x800r/gravity/Center/crop/800x800" ) const ( diff --git a/controllers/cms_sku.go b/controllers/cms_sku.go index d6d7a3a39..b6ff5e027 100644 --- a/controllers/cms_sku.go +++ b/controllers/cms_sku.go @@ -449,3 +449,18 @@ func (c *SkuController) UpdateExianDaSkuCategory() { return retVal, "", err }) } + +// @Title 根据Excel创建标品 +// @Description 根据Excel创建标品 +// @Param token header string true "认证token" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /CreateUpcSkuByExcel [post,get] +func (c *SkuController) CreateUpcSkuByExcel() { + c.callCreateUpcSkuByExcel(func(params *tSkuCreateUpcSkuByExcelParams) (retVal interface{}, errCode string, err error) { + r := c.Ctx.Request + files := r.MultipartForm.File["userfiles"] + err = cms.CreateUpcSkuByExcel(params.Ctx, files) + return retVal, "", err + }) +} diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index e2ad284dd..21119c62b 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -1305,6 +1305,15 @@ func init() { Filters: nil, Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SkuController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SkuController"], + beego.ControllerComments{ + Method: "CreateUpcSkuByExcel", + Router: `/CreateUpcSkuByExcel`, + AllowHTTPMethods: []string{"post","get"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SkuController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SkuController"], beego.ControllerComments{ Method: "DeleteCategory",