根据excel创建标品

This commit is contained in:
苏尹岚
2020-04-08 13:58:31 +08:00
parent 93fd64c711
commit 7c8e2400b8
4 changed files with 255 additions and 5 deletions

View File

@@ -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
}

View File

@@ -16,6 +16,8 @@ const (
const (
NoCatCatgoryID = 291
NOSkuNameImg = "https://image.jxc4.com/noGoodsImg.jpg"
SkuNameImgStandard = "?imageMogr2/thumbnail/!800x800r/gravity/Center/crop/800x800"
)
const (

View File

@@ -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
})
}

View File

@@ -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",