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