diff --git a/business/jxstore/cms/cms.go b/business/jxstore/cms/cms.go index f867d8a17..654e76d99 100644 --- a/business/jxstore/cms/cms.go +++ b/business/jxstore/cms/cms.go @@ -55,7 +55,15 @@ func GetServiceInfo(ctx *jxcontext.Context) interface{} { return serviceInfo } -func GetQiniuUploadToken(ctx *jxcontext.Context, suffix string) (upTokenInfo map[string]interface{}, err error) { +func GetQiniuUploadToken(ctx *jxcontext.Context, suffix, hashCode string) (upTokenInfo map[string]interface{}, err error) { + imgURL := "" + if hashCode != "" { + db := dao.GetDB() + if skuName, err := dao.GetSkuNameByHashCode(db, hashCode); err == nil { + imgURL = skuName.Img + } + } + putPolicy := storage.PutPolicy{ Scope: globals.QiniuBucket, Expires: qiniuTokenExpires, @@ -64,6 +72,8 @@ func GetQiniuUploadToken(ctx *jxcontext.Context, suffix string) (upTokenInfo map "token": putPolicy.UploadToken(api.QiniuAPI), "expires": putPolicy.Expires, "fileName": genPicFileName(suffix), + "hit": imgURL != "", + "img": imgURL, } return upTokenInfo, err } diff --git a/business/jxstore/initdata/initdata.go b/business/jxstore/initdata/initdata.go index 333a51458..e44030973 100644 --- a/business/jxstore/initdata/initdata.go +++ b/business/jxstore/initdata/initdata.go @@ -1,9 +1,15 @@ package initdata import ( + "crypto/md5" + "fmt" + "io/ioutil" + "net/http" + "git.rosy.net.cn/baseapi/platformapi/autonavi" "git.rosy.net.cn/baseapi/utils" "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/model" "git.rosy.net.cn/jx-callback/business/model/dao" "git.rosy.net.cn/jx-callback/globals/api" @@ -118,3 +124,41 @@ func InitPlace(ctx *jxcontext.Context) (err error) { } return err } + +func InitSkuName(ctx *jxcontext.Context, isForce, isAsync, isContinueWhenError bool) (hint string, err error) { + db := dao.GetDB() + var skuNameList []*model.SkuName + if err = dao.GetRows(db, &skuNameList, ` + SELECT * + FROM sku_name + WHERE deleted_at = ? AND img <> '' + ORDER BY id + `, utils.DefaultTimeValue); err != nil { + return "", err + } + + task := tasksch.NewParallelTask("InitSkuName calculate md5", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx.GetUserName(), func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + skuName := batchItemList[0].(*model.SkuName) + if skuName.ImgHashCode == "" || isForce { + response, err := http.Get(skuName.Img) + if err == nil { + defer response.Body.Close() + data, err2 := ioutil.ReadAll(response.Body) + if err = err2; err == nil { + skuName.ImgHashCode = fmt.Sprintf("%X", md5.Sum(data)) + db := dao.GetDB() + _, err = dao.UpdateEntity(db, skuName, "ImgHashCode") + } + } + } + return nil, err + }, skuNameList) + task.Run() + + if !isAsync { + _, err = task.GetResult(0) + } else { + hint = task.ID + } + return hint, err +} diff --git a/business/model/dao/sku.go b/business/model/dao/sku.go index 610dbe003..1dbc74652 100644 --- a/business/model/dao/sku.go +++ b/business/model/dao/sku.go @@ -34,3 +34,19 @@ func DeleteSkuNamePlace(db *DaoDB, nameID int, placeCodes []int) (num int64, err } return ExecuteSQL(db, sql, sqlParams...) } + +func GetSkuNameByHashCode(db *DaoDB, hashCode string) (skuName *model.SkuName, err error) { + sql := ` + SELECT * + FROM sku_name + WHERE img_hash_code = ? + ` + sqlParams := []interface{}{ + hashCode, + } + skuName = &model.SkuName{} + if err = GetRow(db, skuName, sql, sqlParams...); err == nil { + return skuName, nil + } + return nil, err +} diff --git a/controllers/cms.go b/controllers/cms.go index 328750b5d..516c138c6 100644 --- a/controllers/cms.go +++ b/controllers/cms.go @@ -77,15 +77,16 @@ func (c *CmsController) GetServiceInfo() { } // @Title 得到七牛上传服务临时token -// @Description 得到七牛上传服务临时token,当前设置为5分钟内有效。正常使用场景为每次上传资源前实时获取,而不是保存下来一直使用 +// @Description 得到七牛上传服务临时token,当前设置为5分钟内有效。正常使用场景为每次上传资源前实时获取,而不是保存下来一直使用,如果hashCode有值,且本地有,可能直接返回URL // @Param token header string true "认证token" -// @Param suffix query string true "门店所属的厂商ID" +// @Param suffix query string true "前缀" +// @Param hashCode query string false "图片hash" // @Success 200 {object} controllers.CallResult // @Failure 200 {object} controllers.CallResult // @router /GetQiniuUploadToken [get] func (c *CmsController) GetQiniuUploadToken() { c.callGetQiniuUploadToken(func(params *tCmsGetQiniuUploadTokenParams) (retVal interface{}, errCode string, err error) { - retVal, err = cms.GetQiniuUploadToken(params.Ctx, params.Suffix) + retVal, err = cms.GetQiniuUploadToken(params.Ctx, params.Suffix, params.HashCode) return retVal, "", err }) } diff --git a/controllers/init_data.go b/controllers/init_data.go index 3f4f61349..f45609485 100644 --- a/controllers/init_data.go +++ b/controllers/init_data.go @@ -21,3 +21,19 @@ func (c *InitDataController) InitPlace() { return retVal, "", err }) } + +// @Title 初始化skuname(当前主要是计算md5) +// @Description 初始化skuname(当前主要是计算md5) +// @Param token header string true "认证token" +// @Param isForce formData bool false "是否强刷,即即使本地已经有了hashCode也重新计算,缺省为false" +// @Param isAsync formData bool false "是否异步操作" +// @Param isContinueWhenError formData bool false "单个同步失败是否继续,缺省false" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /InitSkuName [post] +func (c *InitDataController) InitSkuName() { + c.callInitSkuName(func(params *tInitdataInitSkuNameParams) (retVal interface{}, errCode string, err error) { + retVal, err = initdata.InitSkuName(params.Ctx, params.IsForce, params.IsAsync, params.IsContinueWhenError) + return retVal, "", err + }) +} diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index 877729dcf..18bc5e3ba 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -151,6 +151,14 @@ func init() { MethodParams: param.Make(), Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:InitDataController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:InitDataController"], + beego.ControllerComments{ + Method: "InitSkuName", + Router: `/InitSkuName`, + AllowHTTPMethods: []string{"post"}, + MethodParams: param.Make(), + Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"], beego.ControllerComments{ Method: "CreateWaybillOnProviders",