整理DataResource相关的内容

This commit is contained in:
gazebo
2019-12-06 15:20:22 +08:00
parent b9421e7979
commit 7fb09f99d1
6 changed files with 201 additions and 240 deletions

View File

@@ -615,39 +615,18 @@ func AddSkuName(ctx *jxcontext.Context, skuNameExt *model.SkuNameExt, userName s
skuNameExt.SpecUnit = skuNameExt.Skus[0].SpecUnit skuNameExt.SpecUnit = skuNameExt.Skus[0].SpecUnit
} }
if globals.EnableStoreWrite { for _, imgName := range []string{skuNameExt.Img, skuNameExt.Img2} {
// imgContent, imgMD5, err := jxutils.DownloadFileByURL(skuNameExt.Img) if imgName != "" {
// if err != nil { _, err2 := datares.TryRegisterDataResource(ctx, skuNameExt.Name, imgName, model.ImgTypeMain, false)
// return nil, err
// }
// if skuNameExt.ImgHashCode == "" {
// skuNameExt.ImgHashCode = imgMD5
// } else if skuNameExt.ImgHashCode != imgMD5 {
// return nil, errors.New("图片HASH值不同")
// }
// imgHintMap, err := UploadImg2Platforms(ctx, nil, skuNameExt.Img, imgContent, "")
// if err != nil {
// return nil, err
// }
// skuNameExt.ImgEbai = imgHintMap[model.VendorIDEBAI]
dataRes, err2 := datares.TryRegisterDataResource(ctx, skuNameExt.Name, skuNameExt.Img, model.ImgTypeMain, false)
if err = err2; err != nil {
return nil, err
}
// skuNameExt.ImgHashCode = dataRes.HashCode
skuNameExt.ImgEbai = dataRes.EbaiURL
if skuNameExt.Img2 != "" {
datares.TryRegisterDataResource(ctx, skuNameExt.Name, skuNameExt.Img2, model.ImgTypeMain, true)
}
if skuNameExt.DescImg != "" {
dataRes, err2 := datares.TryRegisterDataResource(ctx, skuNameExt.Name+"desc", skuNameExt.DescImg, model.ImgTypeDesc, false)
if err = err2; err != nil { if err = err2; err != nil {
return nil, err return nil, err
} }
skuNameExt.DescImgEbai = dataRes.EbaiURL
} }
if err != nil { }
if skuNameExt.DescImg != "" {
_, err2 := datares.TryRegisterDataResource(ctx, skuNameExt.Name+"desc", skuNameExt.DescImg, model.ImgTypeDesc, false)
if err = err2; err != nil {
return nil, err return nil, err
} }
} }
@@ -724,10 +703,6 @@ func UpdateSkuName(ctx *jxcontext.Context, nameID int, payload map[string]interf
} }
delete(payload, "isSpu") delete(payload, "isSpu")
delete(payload, "imgHashCode")
delete(payload, "imgWeimob")
delete(payload, "imgEbai")
delete(payload, "descImgEbai")
delete(payload, "seq") delete(payload, "seq")
valid := dao.StrictMakeMapByStructObject(payload, skuName, userName) valid := dao.StrictMakeMapByStructObject(payload, skuName, userName)
@@ -747,31 +722,27 @@ func UpdateSkuName(ctx *jxcontext.Context, nameID int, payload map[string]interf
} }
err = nil err = nil
} }
if globals.EnableStoreWrite { for _, imgName := range []string{"img", "img2"} {
if valid["img"] != nil { if valid[imgName] != nil {
dataRes, err2 := datares.TryRegisterDataResource(ctx, skuName.Name, valid["img"].(string), model.ImgTypeMain, false) if imgStr := utils.Interface2String(valid[imgName]); imgStr != "" {
if err = err2; err != nil { _, err2 := datares.TryRegisterDataResource(ctx, skuName.Name, valid[imgName].(string), model.ImgTypeMain, true)
return 0, err
}
valid["ImgEbai"] = dataRes.EbaiURL
}
if valid["img2"] != nil {
datares.TryRegisterDataResource(ctx, skuName.Name, valid["img2"].(string), model.ImgTypeMain, true)
}
if valid["descImg"] != nil {
descImg := valid["descImg"].(string)
if descImg != "" {
dataRes, err2 := datares.TryRegisterDataResource(ctx, skuName.Name+"_desc", descImg, model.ImgTypeDesc, false)
if err = err2; err != nil { if err = err2; err != nil {
return 0, err return 0, err
} }
valid["descImgEbai"] = dataRes.EbaiURL
} else {
valid["descImgEbai"] = ""
} }
} }
} }
if valid["descImg"] != nil {
descImg := valid["descImg"].(string)
if descImg != "" {
_, err2 := datares.TryRegisterDataResource(ctx, skuName.Name+"_desc", descImg, model.ImgTypeDesc, false)
if err = err2; err != nil {
return 0, err
}
}
}
dao.Begin(db) dao.Begin(db)
defer func() { defer func() {
if r := recover(); r != nil { if r := recover(); r != nil {

View File

@@ -5,8 +5,6 @@ import (
"git.rosy.net.cn/baseapi/platformapi/autonavi" "git.rosy.net.cn/baseapi/platformapi/autonavi"
"git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/jxutils/datares"
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
"git.rosy.net.cn/jx-callback/business/jxutils/tasksch" "git.rosy.net.cn/jx-callback/business/jxutils/tasksch"
"git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/business/model"
@@ -190,88 +188,88 @@ func InitVendorCategory(ctx *jxcontext.Context, vendorID int, isAsync bool) (hin
} }
func UploadImg4Vendors(ctx *jxcontext.Context, isAsync, isContinueWhenError bool) (hint string, err error) { func UploadImg4Vendors(ctx *jxcontext.Context, isAsync, isContinueWhenError bool) (hint string, err error) {
db := dao.GetDB() // db := dao.GetDB()
rootTask := tasksch.NewSeqTask("合并SkuName图片至DataResource", ctx, // rootTask := tasksch.NewSeqTask("合并SkuName图片至DataResource", ctx,
func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { // func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
switch step { // switch step {
case 0: // 计算SkuName中缺失的hashCode注意是DescImg不是Img // case 0: // 计算SkuName中缺失的hashCode注意是DescImg不是Img
var skuNameList []*model.SkuName // var skuNameList []*model.SkuName
if err = dao.GetRows(db, &skuNameList, ` // if err = dao.GetRows(db, &skuNameList, `
SELECT t1.* // SELECT t1.*
FROM sku_name t1 // FROM sku_name t1
WHERE t1.desc_img <> '' AND t1.img_hash_code = '' // WHERE t1.desc_img <> '' AND t1.img_hash_code = ''
`); err == nil && len(skuNameList) > 0 { // `); err == nil && len(skuNameList) > 0 {
calcTask := tasksch.NewParallelTask("UploadImg4Vendors calc hashCode", // calcTask := tasksch.NewParallelTask("UploadImg4Vendors calc hashCode",
tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError).SetParallelCount(5), ctx, // tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError).SetParallelCount(5), ctx,
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { // func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
skuName := batchItemList[0].(*model.SkuName) // skuName := batchItemList[0].(*model.SkuName)
_, skuName.ImgHashCode, err = jxutils.DownloadFileByURL(skuName.DescImg) // _, skuName.ImgHashCode, err = jxutils.DownloadFileByURL(skuName.DescImg)
if err == nil { // if err == nil {
dao.UpdateEntity(db, skuName, "ImgHashCode") // dao.UpdateEntity(db, skuName, "ImgHashCode")
} // }
return retVal, err // return retVal, err
}, skuNameList) // }, skuNameList)
tasksch.HandleTask(calcTask, task, false).Run() // tasksch.HandleTask(calcTask, task, false).Run()
_, err = calcTask.GetResult(0) // _, err = calcTask.GetResult(0)
} // }
case 1: // 从SkuName添加缺失的图片至DataResource // case 1: // 从SkuName添加缺失的图片至DataResource
_, err = dao.ExecuteSQL(db, ` // _, err = dao.ExecuteSQL(db, `
INSERT INTO data_resource(created_at, updated_at, last_operator, hash_code, // INSERT INTO data_resource(created_at, updated_at, last_operator, hash_code,
resource_type, name, main_url, ebai_url, qiniu_url, use_type) // resource_type, name, main_url, ebai_url, qiniu_url, use_type)
SELECT t1.created_at, t1.created_at, t1.last_operator, t1.img_hash_code, // SELECT t1.created_at, t1.created_at, t1.last_operator, t1.img_hash_code,
CASE // CASE
WHEN INSTR(t1.desc_img, ".jpg") > 0 OR INSTR(t1.desc_img, ".jpeg") > 0 THEN // WHEN INSTR(t1.desc_img, ".jpg") > 0 OR INSTR(t1.desc_img, ".jpeg") > 0 THEN
'image/jpeg' // 'image/jpeg'
WHEN INSTR(t1.desc_img, ".png") > 0 OR INSTR(t1.desc_img, ".peg") > 0 THEN // WHEN INSTR(t1.desc_img, ".png") > 0 OR INSTR(t1.desc_img, ".peg") > 0 THEN
'image/png' // 'image/png'
WHEN INSTR(t1.desc_img, ".gif") THEN // WHEN INSTR(t1.desc_img, ".gif") THEN
'image/gif' // 'image/gif'
ELSE // ELSE
'' // ''
END resource_type, // END resource_type,
CONCAT(t1.name, '_desc'), desc_img main_url, t1.desc_img_ebai ebai_url, // CONCAT(t1.name, '_desc'), desc_img main_url, t1.desc_img_ebai ebai_url,
IF(INSTR(t1.desc_img, "image.jxc4.com") > 0, t1.desc_img, '') qiniu_url, 2 // IF(INSTR(t1.desc_img, "image.jxc4.com") > 0, t1.desc_img, '') qiniu_url, 2
FROM sku_name t1 // FROM sku_name t1
JOIN ( // JOIN (
SELECT img_hash_code, MAX(id) id, COUNT(*) ct // SELECT img_hash_code, MAX(id) id, COUNT(*) ct
FROM sku_name // FROM sku_name
WHERE img_hash_code <> '' AND desc_img <> '' // WHERE img_hash_code <> '' AND desc_img <> ''
GROUP BY 1 // GROUP BY 1
) t3 ON t3.id = t1.id // ) t3 ON t3.id = t1.id
LEFT JOIN data_resource t2 ON (t2.main_url <> '' AND t2.main_url = t1.desc_img) // LEFT JOIN data_resource t2 ON (t2.main_url <> '' AND t2.main_url = t1.desc_img)
WHERE t1.desc_img <> '' AND t1.img_hash_code <> '' AND t2.id IS NULL; // WHERE t1.desc_img <> '' AND t1.img_hash_code <> '' AND t2.id IS NULL;
`) // `)
case 2: // 统一SkuName中同hashCode不同图片地址至同一地址 // case 2: // 统一SkuName中同hashCode不同图片地址至同一地址
_, err = dao.ExecuteSQL(db, ` // _, err = dao.ExecuteSQL(db, `
UPDATE sku_name t1 // UPDATE sku_name t1
JOIN data_resource t2 ON t2.hash_code = t1.img_hash_code AND t2.main_url <> '' // JOIN data_resource t2 ON t2.hash_code = t1.img_hash_code AND t2.main_url <> ''
SET t1.desc_img = t2.main_url // SET t1.desc_img = t2.main_url
WHERE t1.img_hash_code <> '' AND t1.desc_img <> t2.main_url; // WHERE t1.img_hash_code <> '' AND t1.desc_img <> t2.main_url;
`) // `)
case 3: // 上传DataResource中缺失的平台图片 // case 3: // 上传DataResource中缺失的平台图片
dataResList, err2 := dao.GetNeedUploadDataResource(db) // dataResList, err2 := dao.GetNeedUploadDataResource(db)
if err = err2; err == nil && len(dataResList) > 0 { // if err = err2; err == nil && len(dataResList) > 0 {
uploadTask := tasksch.NewParallelTask("批量上传图片至平台", // uploadTask := tasksch.NewParallelTask("批量上传图片至平台",
tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError).SetParallelCount(2), ctx, // tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError).SetParallelCount(2), ctx,
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { // func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
dataRes := batchItemList[0].(*model.DataResource) // dataRes := batchItemList[0].(*model.DataResource)
_, err = datares.UploadImage2Vendors(ctx, task, dataRes, nil, false) // _, err = datares.UploadImage2Vendors(ctx, task, dataRes, nil, false)
return nil, err // return nil, err
}, dataResList) // }, dataResList)
tasksch.HandleTask(uploadTask, task, true).Run() // tasksch.HandleTask(uploadTask, task, true).Run()
_, err = uploadTask.GetResult(0) // _, err = uploadTask.GetResult(0)
} // }
} // }
return result, err // return result, err
}, 4) // }, 4)
tasksch.HandleTask(rootTask, nil, true).Run() // tasksch.HandleTask(rootTask, nil, true).Run()
if !isAsync { // if !isAsync {
if _, err = rootTask.GetResult(0); err == nil { // if _, err = rootTask.GetResult(0); err == nil {
hint = "1" // hint = "1"
} // }
} else { // } else {
hint = rootTask.ID // hint = rootTask.ID
} // }
return hint, err return hint, err
} }

View File

@@ -4,10 +4,6 @@ import (
"bytes" "bytes"
"context" "context"
"fmt" "fmt"
"image"
"image/jpeg"
"image/png"
"net/http"
"regexp" "regexp"
"strings" "strings"
"sync" "sync"
@@ -1046,92 +1042,92 @@ func CreateConsumerFromOrders(ctx *jxcontext.Context, vendorIDs []int, fromDate,
} }
func CheckImages(ctx *jxcontext.Context, isAsync, isContinueWhenError bool) (hint string, err error) { func CheckImages(ctx *jxcontext.Context, isAsync, isContinueWhenError bool) (hint string, err error) {
db := dao.GetDB() // db := dao.GetDB()
rootTask := tasksch.NewSeqTask("检查图片的有效性", ctx, // rootTask := tasksch.NewSeqTask("检查图片的有效性", ctx,
func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { // func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
switch step { // switch step {
case 0: // 检查图片的格式与大小 // case 0: // 检查图片的格式与大小
var imgList []*model.DataResource // var imgList []*model.DataResource
if err = dao.GetRows(db, &imgList, ` // if err = dao.GetRows(db, &imgList, `
SELECT t1.* // SELECT t1.*
FROM data_resource t1 // FROM data_resource t1
WHERE t1.use_type = 1 // WHERE t1.use_type = 1
`); err == nil && len(imgList) > 0 { // `); err == nil && len(imgList) > 0 {
calcTask := tasksch.NewParallelTask("检查京西图片的有效性", // calcTask := tasksch.NewParallelTask("检查京西图片的有效性",
tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError).SetParallelCount(5), ctx, // tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError).SetParallelCount(5), ctx,
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { // func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
dataRes := batchItemList[0].(*model.DataResource) // dataRes := batchItemList[0].(*model.DataResource)
binaryData, hashCode, err2 := jxutils.DownloadFileByURL(dataRes.MainURL) // binaryData, hashCode, err2 := jxutils.DownloadFileByURL(dataRes.MainURL)
if err = err2; err == nil { // if err = err2; err == nil {
errMsg := "" // errMsg := ""
if hashCode != dataRes.HashCode { // if hashCode != dataRes.HashCode {
errMsg = fmt.Sprintf("hashcode:%s", hashCode) // errMsg = fmt.Sprintf("hashcode:%s", hashCode)
dataRes.HashCode = hashCode // dataRes.HashCode = hashCode
} // }
resType := http.DetectContentType(binaryData) // resType := http.DetectContentType(binaryData)
if resType != dataRes.ResourceType { // if resType != dataRes.ResourceType {
errMsg += "," + resType // errMsg += "," + resType
dataRes.ResourceType = resType // dataRes.ResourceType = resType
} // }
var img image.Image // var img image.Image
if dataRes.ResourceType == "image/png" { // if dataRes.ResourceType == "image/png" {
img, err = png.Decode(bytes.NewReader(binaryData)) // img, err = png.Decode(bytes.NewReader(binaryData))
} else if dataRes.ResourceType == "image/jpeg" { // } else if dataRes.ResourceType == "image/jpeg" {
img, err = jpeg.Decode(bytes.NewReader(binaryData)) // img, err = jpeg.Decode(bytes.NewReader(binaryData))
} // }
if err == nil { // if err == nil {
if img != nil { // if img != nil {
if img.Bounds().Dx() != 800 || img.Bounds().Dy() != 800 { // if img.Bounds().Dx() != 800 || img.Bounds().Dy() != 800 {
errMsg += fmt.Sprintf(",size:%dx%d", img.Bounds().Dx(), img.Bounds().Dy()) // errMsg += fmt.Sprintf(",size:%dx%d", img.Bounds().Dx(), img.Bounds().Dy())
} // }
} // }
} else { // } else {
errMsg += "," + err.Error() // errMsg += "," + err.Error()
} // }
if errMsg != "" { // if errMsg != "" {
dataRes.Remark = errMsg // dataRes.Remark = errMsg
dao.UpdateEntity(dao.GetDB(), dataRes, "Remark", "ResourceType", "HashCode") // dao.UpdateEntity(dao.GetDB(), dataRes, "Remark", "ResourceType", "HashCode")
} // }
} // }
return retVal, err // return retVal, err
}, imgList) // }, imgList)
tasksch.HandleTask(calcTask, task, false).Run() // tasksch.HandleTask(calcTask, task, false).Run()
_, err = calcTask.GetResult(0) // _, err = calcTask.GetResult(0)
} // }
case 1: // 检查京东商品图片 // case 1: // 检查京东商品图片
skuNameInfo, err2 := cms.GetSkuNames(ctx, "", false, map[string]interface{}{}, 0, -1) // skuNameInfo, err2 := cms.GetSkuNames(ctx, "", false, map[string]interface{}{}, 0, -1)
if err = err2; err == nil && len(skuNameInfo.SkuNames) > 0 { // if err = err2; err == nil && len(skuNameInfo.SkuNames) > 0 {
calcTask := tasksch.NewParallelTask("检查京东图片的有效性", // calcTask := tasksch.NewParallelTask("检查京东图片的有效性",
tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError).SetParallelCount(5), ctx, // tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError).SetParallelCount(5), ctx,
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { // func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
skuName := batchItemList[0].(*model.SkuNameExt) // skuName := batchItemList[0].(*model.SkuNameExt)
for _, sku := range skuName.Skus { // for _, sku := range skuName.Skus {
if sku.JdID != 0 { // if sku.JdID != 0 {
skuPageInfo, err2 := api.JdAPI.GetSkuPageInfo(sku.JdID) // skuPageInfo, err2 := api.JdAPI.GetSkuPageInfo(sku.JdID)
if err = err2; err == nil && skuPageInfo.FixedStatus && len(skuPageInfo.Image) == 0 { // if err = err2; err == nil && skuPageInfo.FixedStatus && len(skuPageInfo.Image) == 0 {
err = fmt.Errorf("skuName:%d, sku:%d, jdid:%d, 没有图片", skuName.ID, sku.ID, sku.JdID) // err = fmt.Errorf("skuName:%d, sku:%d, jdid:%d, 没有图片", skuName.ID, sku.ID, sku.JdID)
skuName.ImgHashCode = "np" // skuName.ImgHashCode = "np"
dao.UpdateEntity(dao.GetDB(), &skuName.SkuName, "ImgHashCode") // dao.UpdateEntity(dao.GetDB(), &skuName.SkuName, "ImgHashCode")
} // }
break // break
} // }
} // }
return retVal, err // return retVal, err
}, skuNameInfo.SkuNames) // }, skuNameInfo.SkuNames)
tasksch.HandleTask(calcTask, task, false).Run() // tasksch.HandleTask(calcTask, task, false).Run()
_, err = calcTask.GetResult(0) // _, err = calcTask.GetResult(0)
} // }
} // }
return result, err // return result, err
}, 2) // }, 2)
tasksch.HandleTask(rootTask, nil, true).Run() // tasksch.HandleTask(rootTask, nil, true).Run()
if !isAsync { // if !isAsync {
if _, err = rootTask.GetResult(0); err == nil { // if _, err = rootTask.GetResult(0); err == nil {
hint = "1" // hint = "1"
} // }
} else { // } else {
hint = rootTask.ID // hint = rootTask.ID
} // }
return hint, err return hint, err
} }

View File

@@ -108,8 +108,10 @@ func RegisterDataResource(ctx *jxcontext.Context, name, resourceURL, mimeType, h
return dataRes, err return dataRes, err
} }
if imgType > 0 { if imgType > 0 {
// 忽略上传错误 if globals.EnableStoreWrite {
UploadImage2Vendors(ctx, nil, dataRes, resBinary, isAsyncUpload2Vendor) // 忽略上传错误
UploadImage2Vendors(ctx, nil, dataRes, resBinary, isAsyncUpload2Vendor)
}
} }
return dataRes, err return dataRes, err
} }

View File

@@ -12,16 +12,10 @@ import (
) )
var ( var (
// imgFieldMap = map[int]string{
// model.VendorIDEBAI: "img_ebai",
// }
dataResFieldMap = map[int]string{ dataResFieldMap = map[int]string{
model.VendorIDMTWM: "mtwm_url", model.VendorIDMTWM: "mtwm_url",
model.VendorIDEBAI: "ebai_url", model.VendorIDEBAI: "ebai_url",
} }
// descImgFieldMap = map[int]string{
// model.VendorIDEBAI: "desc_img_ebai",
// }
) )
type SkuStoreCatInfo struct { type SkuStoreCatInfo struct {

View File

@@ -173,13 +173,13 @@ type SkuName struct {
SpecUnit string `orm:"size(8)" json:"-"` // 为份必然为克这个主要作用只是用于确保SkuName的唯一性 SpecUnit string `orm:"size(8)" json:"-"` // 为份必然为克这个主要作用只是用于确保SkuName的唯一性
Price int `json:"price"` // 单位为分标准价不为份的就为实际标准价为份的为每市斤价实际还要乘质量。todo 为份的确定必须有质量 Price int `json:"price"` // 单位为分标准价不为份的就为实际标准价为份的为每市斤价实际还要乘质量。todo 为份的确定必须有质量
Img string `orm:"size(512)" json:"img"` Img string `orm:"size(512)" json:"img"`
Img2 string `orm:"size(512)" json:"img2"` // 第二张图片 Img2 string `orm:"size(512)" json:"img2"` // 第二张图片
ImgEbai string `orm:"size(255)" json:"imgEbai"` // 饿百图片地址 // ImgEbai string `orm:"size(255)" json:"imgEbai"` // 饿百图片地址
ImgHashCode string `orm:"size(255);index" json:"img_hash_code"` // ImgHashCode string `orm:"size(255);index" json:"img_hash_code"`
DescImg string `orm:"size(255)" json:"descImg"` // 商品详情图片描述 DescImg string `orm:"size(255)" json:"descImg"` // 商品详情图片描述
DescImgEbai string `orm:"size(255)" json:"descImgEbai"` // 饿百的商品详情图片描述RTF // DescImgEbai string `orm:"size(255)" json:"descImgEbai"` // 饿百的商品详情图片描述RTF
Upc string `orm:"size(20);index"` Upc string `orm:"size(20);index"`
Status int `orm:"default(1)" json:"status"` // skuname状态取值同sku.Status Status int `orm:"default(1)" json:"status"` // skuname状态取值同sku.Status