diff --git a/business/jxcallback/scheduler/basesch/basesch_ext.go b/business/jxcallback/scheduler/basesch/basesch_ext.go index 35d1e3fa8..ba83953db 100644 --- a/business/jxcallback/scheduler/basesch/basesch_ext.go +++ b/business/jxcallback/scheduler/basesch/basesch_ext.go @@ -55,7 +55,7 @@ func (c *BaseScheduler) CreateWaybillOnProviders(ctx *jxcontext.Context, order * } else if errList.GetErrListAsOne() == nil { err = fmt.Errorf("orderID:%s没有绑定有效的三方配送门店或没有剩下可用的三方配送", order.VendorOrderID) } else { - err = fmt.Errorf("orderID:%s所有运单失败:\n%s", order.VendorOrderID, errList.GetErrListAsOne().Error()) + err = fmt.Errorf("orderID:%s所有运单失败:%s", order.VendorOrderID, errList.GetErrListAsOne().Error()) } globals.SugarLogger.Infof("CreateWaybillOnProviders orderID:%s userName:%s error:%v", order.VendorOrderID, userName, err) return bills, err diff --git a/business/jxstore/cms/sku.go b/business/jxstore/cms/sku.go index de4f47e4d..16836bbdb 100644 --- a/business/jxstore/cms/sku.go +++ b/business/jxstore/cms/sku.go @@ -579,18 +579,18 @@ func AddSkuName(ctx *jxcontext.Context, skuNameExt *model.SkuNameExt, userName s // return nil, err // } // skuNameExt.ImgEbai = imgHintMap[model.VendorIDEBAI] - dataRes, err2 := datares.TryRegisterDataResource(ctx, skuNameExt.Name, skuNameExt.Img, true, model.ImgTypeMain, false) + 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, true, model.ImgTypeMain, true) + datares.TryRegisterDataResource(ctx, skuNameExt.Name, skuNameExt.Img2, model.ImgTypeMain, true) } if skuNameExt.DescImg != "" { - dataRes, err2 := datares.TryRegisterDataResource(ctx, skuNameExt.Name+"desc", skuNameExt.DescImg, true, model.ImgTypeDesc, false) + dataRes, err2 := datares.TryRegisterDataResource(ctx, skuNameExt.Name+"desc", skuNameExt.DescImg, model.ImgTypeDesc, false) if err = err2; err != nil { return nil, err } @@ -697,7 +697,7 @@ func UpdateSkuName(ctx *jxcontext.Context, nameID int, payload map[string]interf // } // // valid["ImgWeimob"] = imgHintMap[model.VendorIDWSC] // valid["ImgEbai"] = imgHintMap[model.VendorIDEBAI] - dataRes, err2 := datares.TryRegisterDataResource(ctx, skuName.Name, valid["img"].(string), true, model.ImgTypeMain, false) + dataRes, err2 := datares.TryRegisterDataResource(ctx, skuName.Name, valid["img"].(string), model.ImgTypeMain, false) if err = err2; err != nil { return 0, err } @@ -705,13 +705,13 @@ func UpdateSkuName(ctx *jxcontext.Context, nameID int, payload map[string]interf valid["ImgEbai"] = dataRes.EbaiURL } if valid["img2"] != nil { - datares.TryRegisterDataResource(ctx, skuName.Name, valid["img2"].(string), true, model.ImgTypeMain, true) + 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, true, model.ImgTypeDesc, false) + dataRes, err2 := datares.TryRegisterDataResource(ctx, skuName.Name+"_desc", descImg, model.ImgTypeDesc, false) if err = err2; err != nil { return 0, err } diff --git a/business/jxstore/cms/store.go b/business/jxstore/cms/store.go index a48bdd0f0..0a63ad7ff 100644 --- a/business/jxstore/cms/store.go +++ b/business/jxstore/cms/store.go @@ -524,6 +524,20 @@ func checkCreateStore(store *model.Store) (err error) { return err } +func checkStoreDeliveryRange(deliveryRange string) (err error) { + if deliveryRange != "" { + points := jxutils.CoordinateStr2Points(deliveryRange) + for _, point := range points { + for _, coord := range point { + if coord == 0 || math.IsNaN(coord) { + return fmt.Errorf("坐标点数据非法:%s", deliveryRange) + } + } + } + } + return err +} + func UpdateStore(ctx *jxcontext.Context, storeID int, payload map[string]interface{}, userName string) (num int64, err error) { globals.SugarLogger.Debugf("UpdateStore storeID:%d, payload:%s", storeID, utils.Format4Output(payload, true)) if err = checkBankBranch(utils.Interface2String(payload["payeeBankBranchName"])); err != nil { @@ -537,6 +551,9 @@ func UpdateStore(ctx *jxcontext.Context, storeID int, payload map[string]interfa } valid := dao.StrictMakeMapByStructObject(payload, store, userName) + if err = checkStoreDeliveryRange(utils.Interface2String(valid["deliveryRange"])); err != nil { + return 0, err + } if globals.EnableWXAuth2 { if err = dao.ValidateRoles(db, utils.Interface2String(valid["marketManRole"]), utils.Interface2String(valid["operatorRole"]), utils.Interface2String(valid["operatorRole2"])); err != nil { return 0, err diff --git a/business/jxstore/cms/store_sku.go b/business/jxstore/cms/store_sku.go index fd81163cb..40bf983fe 100644 --- a/business/jxstore/cms/store_sku.go +++ b/business/jxstore/cms/store_sku.go @@ -175,16 +175,55 @@ var ( } ) -func GetStoreSkus(ctx *jxcontext.Context, storeID int, skuIDs []int, isFocus bool, keyword string, isBySku bool, params map[string]interface{}, offset, pageSize int) (skuNamesInfo *StoreSkuNamesInfo, err error) { - return GetStoresSkus(ctx, []int{storeID}, skuIDs, isFocus, keyword, isBySku, params, offset, pageSize) +func GetStoreSkus(ctx *jxcontext.Context, storeID int, skuIDs []int, isFocus bool, keyword string, isBySku, isAct bool, params map[string]interface{}, offset, pageSize int) (skuNamesInfo *StoreSkuNamesInfo, err error) { + return GetStoresSkus(ctx, []int{storeID}, skuIDs, isFocus, keyword, isBySku, isAct, params, offset, pageSize) } -func getGetStoresSkusBaseSQL(db *dao.DaoDB, storeIDs, skuIDs []int, isFocus bool, keyword string, isBySku bool, params map[string]interface{}) (sql string, sqlParams []interface{}, err error) { +func getGetStoresSkusBaseSQL(db *dao.DaoDB, storeIDs, skuIDs []int, isFocus bool, keyword string, isBySku, isAct bool, params map[string]interface{}) (sql string, sqlParams []interface{}, err error) { sql = ` FROM sku_name t1 JOIN sku t2 FORCE INDEX(PRIMARY) ON t1.id = t2.name_id AND t2.deleted_at = ?/* AND t2.status = ?*/ JOIN store t3 ON t3.deleted_at = ? ` + sqlParams = []interface{}{ + utils.DefaultTimeValue, + // model.SkuStatusNormal, + utils.DefaultTimeValue, + } + if isAct { + sql += ` + JOIN ( + SELECT t2.store_id, t2.sku_id, + MIN(IF(t3.actual_act_price = 0, NULL, t3.actual_act_price)) actual_act_price, MIN(IF(t2.earning_price = 0, NULL, t2.earning_price)) earning_price /*non-zero min value*/ + FROM act t1 + JOIN act_store_sku t2 ON t2.act_id = t1.id AND t2.deleted_at = ? + JOIN act_store_sku_map t3 ON t3.bind_id = t2.id AND t3.act_id = t1.id AND (t3.sync_status & ? = 0 OR t1.type = ?) + JOIN act_map t4 ON t4.act_id = t1.id AND t4.vendor_id = t3.vendor_id AND t4.deleted_at = ? AND (t4.sync_status & ? = 0 OR t1.type = ?) + WHERE t1.deleted_at = ? AND t1.status = ? AND NOT (t1.begin_at > ? OR t1.end_at < ?)` + sqlParams = append(sqlParams, []interface{}{ + utils.DefaultTimeValue, + model.SyncFlagNewMask, + model.ActSkuFake, + utils.DefaultTimeValue, + model.SyncFlagNewMask, + model.ActSkuFake, + utils.DefaultTimeValue, + model.ActStatusCreated, + time.Now(), + time.Now(), + }) + if len(storeIDs) > 0 { + sql += " AND t2.store_id IN (" + dao.GenQuestionMarks(len(storeIDs)) + ")" + sqlParams = append(sqlParams, storeIDs) + } + if len(skuIDs) > 0 { + sql += " AND t2.sku_id IN (" + dao.GenQuestionMarks(len(skuIDs)) + ")" + sqlParams = append(sqlParams, skuIDs) + } + sql += ` + GROUP BY 1,2 + ) ta ON ta.store_id = t3.id AND ta.sku_id = t2.id` + } if !isFocus { sql += " LEFT" } @@ -193,15 +232,12 @@ func getGetStoresSkusBaseSQL(db *dao.DaoDB, storeIDs, skuIDs []int, isFocus bool LEFT JOIN sku_name_place_bind t5 ON t1.id = t5.name_id AND t3.city_code = t5.place_code WHERE t1.deleted_at = ? AND (t1.is_global = 1 OR t5.id IS NOT NULL OR 1 = ?)/* AND t1.status = ?*/ ` - sqlParams = []interface{}{ - utils.DefaultTimeValue, - // model.SkuStatusNormal, - utils.DefaultTimeValue, + sqlParams = append(sqlParams, []interface{}{ utils.DefaultTimeValue, utils.DefaultTimeValue, utils.Bool2Int(isFocus), // model.SkuStatusNormal, - } + }) if isFocus { sql += " AND ((t2.status = ? AND t1.status = ?) OR t4.status = ?)" sqlParams = append(sqlParams, model.SkuStatusNormal, model.SkuStatusNormal, model.SkuStatusNormal) @@ -318,11 +354,11 @@ func getGetStoresSkusBaseSQL(db *dao.DaoDB, storeIDs, skuIDs []int, isFocus bool return sql, sqlParams, err } -func GetStoresSkus(ctx *jxcontext.Context, storeIDs, skuIDs []int, isFocus bool, keyword string, isBySku bool, params map[string]interface{}, offset, pageSize int) (skuNamesInfo *StoreSkuNamesInfo, err error) { - return GetStoresSkusNew(ctx, storeIDs, skuIDs, isFocus, keyword, isBySku, params, offset, pageSize) +func GetStoresSkus(ctx *jxcontext.Context, storeIDs, skuIDs []int, isFocus bool, keyword string, isBySku, isAct bool, params map[string]interface{}, offset, pageSize int) (skuNamesInfo *StoreSkuNamesInfo, err error) { + return GetStoresSkusNew(ctx, storeIDs, skuIDs, isFocus, keyword, isBySku, isAct, params, offset, pageSize) } -func GetStoresSkusNew(ctx *jxcontext.Context, storeIDs, skuIDs []int, isFocus bool, keyword string, isBySku bool, params map[string]interface{}, offset, pageSize int) (skuNamesInfo *StoreSkuNamesInfo, err error) { +func GetStoresSkusNew(ctx *jxcontext.Context, storeIDs, skuIDs []int, isFocus bool, keyword string, isBySku, isAct bool, params map[string]interface{}, offset, pageSize int) (skuNamesInfo *StoreSkuNamesInfo, err error) { if !isFocus && !isBySku && (len(storeIDs) > 1 || len(storeIDs) == 0) { return nil, fmt.Errorf("未关注按SkuName只能查询单店") } @@ -330,7 +366,7 @@ func GetStoresSkusNew(ctx *jxcontext.Context, storeIDs, skuIDs []int, isFocus bo return nil, fmt.Errorf("GetStoresSkus必须指定storeIDs或skuIDs或分页") } db := dao.GetDB() - sql, sqlParams, err := getGetStoresSkusBaseSQL(db, storeIDs, skuIDs, isFocus, keyword, isBySku, params) + sql, sqlParams, err := getGetStoresSkusBaseSQL(db, storeIDs, skuIDs, isFocus, keyword, isBySku, isAct, params) if err != nil { return nil, err } diff --git a/business/jxstore/cms/store_sku_check.go b/business/jxstore/cms/store_sku_check.go index eed0d6c1f..7af18787a 100644 --- a/business/jxstore/cms/store_sku_check.go +++ b/business/jxstore/cms/store_sku_check.go @@ -330,7 +330,7 @@ func CheckSkuDiffBetweenJxAndVendor(ctx *jxcontext.Context, vendorIDList []int, if isGetJxSkuInfoData == false { //only get once jx sku info list every store id isGetJxSkuInfoData = true - jxSkuInfoData, _ := GetStoreSkus(ctx, storeID, []int{}, true, "", true, map[string]interface{}{}, 0, -1) + jxSkuInfoData, _ := GetStoreSkus(ctx, storeID, []int{}, true, "", true, false, map[string]interface{}{}, 0, -1) filterJxSkuInfoMap = GetFilterJxSkuInfoMap(jxSkuInfoData.SkuNames) } diff --git a/business/jxstore/initdata/initdata.go b/business/jxstore/initdata/initdata.go index ae9977988..0f4da6137 100644 --- a/business/jxstore/initdata/initdata.go +++ b/business/jxstore/initdata/initdata.go @@ -309,7 +309,7 @@ func UploadImg4Vendors(ctx *jxcontext.Context, isAsync, isContinueWhenError bool case 1: // 从SkuName添加缺失的图片至DataResource _, err = dao.ExecuteSQL(db, ` INSERT INTO data_resource(created_at, updated_at, last_operator, hash_code, - resource_type, name, main_url, ebai_url, qiniu_url, is_vendor) + 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, CASE WHEN INSTR(t1.desc_img, ".jpg") > 0 OR INSTR(t1.desc_img, ".jpeg") > 0 THEN @@ -324,6 +324,12 @@ func UploadImg4Vendors(ctx *jxcontext.Context, isAsync, isContinueWhenError bool 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 FROM sku_name t1 + JOIN ( + SELECT img_hash_code, MAX(id) id, COUNT(*) ct + FROM sku_name + WHERE img_hash_code <> '' AND desc_img <> '' + GROUP BY 1 + ) t3 ON t3.id = t1.id 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; `) diff --git a/business/jxstore/misc/store_score.go b/business/jxstore/misc/store_score.go index 61b40fb50..5fd90ada7 100644 --- a/business/jxstore/misc/store_score.go +++ b/business/jxstore/misc/store_score.go @@ -220,7 +220,7 @@ func GetAllStoreSkus(ctx *jxcontext.Context, parentTask tasksch.ITask, storeList taskFunc := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { storeInfo := batchItemList[0].(*cms.StoreExt) storeID := storeInfo.ID - jxSkuInfoData, _ := cms.GetStoreSkus(ctx, storeID, []int{}, true, "", true, map[string]interface{}{}, 0, -1) + jxSkuInfoData, _ := cms.GetStoreSkus(ctx, storeID, []int{}, true, "", true, false,map[string]interface{}{}, 0, -1) jxSkuPriceMapData := make(map[int]int) for _, value := range jxSkuInfoData.SkuNames { for _, skuInfo := range value.Skus2 { diff --git a/business/jxstore/misc/store_sku_sales.go b/business/jxstore/misc/store_sku_sales.go index ec5173695..b001f5145 100644 --- a/business/jxstore/misc/store_sku_sales.go +++ b/business/jxstore/misc/store_sku_sales.go @@ -75,7 +75,7 @@ func GetStoreSkuSalesInfo(ctx *jxcontext.Context, storeID int) (outStoreSkuSales //得到当前门店商品数据 storeSkuMapData := make(map[int]*cms.StoreSkuNameExt) - storeSkuData, err := cms.GetStoreSkus(ctx, storeID, citySkuIDs, true, "", true, map[string]interface{}{}, 0, -1) + storeSkuData, err := cms.GetStoreSkus(ctx, storeID, citySkuIDs, true, "", true, false, map[string]interface{}{}, 0, -1) if err == nil { for _, value := range storeSkuData.SkuNames { for _, skuInfo := range value.Skus2 { @@ -95,7 +95,7 @@ func GetStoreSkuSalesInfo(ctx *jxcontext.Context, storeID int) (outStoreSkuSales taskFunc := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { storeInfo := batchItemList[0].(*cms.StoreExt) storeID := storeInfo.ID - jxSkuInfoData, err := cms.GetStoreSkus(ctx, storeID, citySkuIDs, true, "", true, map[string]interface{}{}, 0, -1) + jxSkuInfoData, err := cms.GetStoreSkus(ctx, storeID, citySkuIDs, true, "", true, false, map[string]interface{}{}, 0, -1) jxSkuPriceMapData := make(map[int]int) for _, value := range jxSkuInfoData.SkuNames { for _, skuInfo := range value.Skus2 { diff --git a/business/jxstore/tempop/tempop.go b/business/jxstore/tempop/tempop.go index a8b3eb70a..07a97c4d0 100644 --- a/business/jxstore/tempop/tempop.go +++ b/business/jxstore/tempop/tempop.go @@ -1,7 +1,12 @@ package tempop import ( + "bytes" "fmt" + "image" + "image/jpeg" + "image/png" + "net/http" "regexp" "sync" "time" @@ -1103,3 +1108,93 @@ func CreateConsumerFromOrders(ctx *jxcontext.Context, vendorIDs []int, fromDate, } return hint, err } + +func CheckImages(ctx *jxcontext.Context, isAsync, isContinueWhenError bool) (hint string, err error) { + db := dao.GetDB() + rootTask := tasksch.NewSeqTask("检查图片的有效性", ctx, + func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { + switch step { + case 0: // 检查图片的格式与大小 + var imgList []*model.DataResource + if err = dao.GetRows(db, &imgList, ` + SELECT t1.* + FROM data_resource t1 + WHERE t1.use_type = 1 + `); err == nil && len(imgList) > 0 { + calcTask := tasksch.NewParallelTask("检查京西图片的有效性", + tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError).SetParallelCount(5), ctx, + func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + dataRes := batchItemList[0].(*model.DataResource) + binaryData, hashCode, err2 := jxutils.DownloadFileByURL(dataRes.MainURL) + if err = err2; err == nil { + errMsg := "" + if hashCode != dataRes.HashCode { + errMsg = fmt.Sprintf("hashcode:%s", hashCode) + dataRes.HashCode = hashCode + } + resType := http.DetectContentType(binaryData) + if resType != dataRes.ResourceType { + errMsg += "," + resType + dataRes.ResourceType = resType + } + var img image.Image + if dataRes.ResourceType == "image/png" { + img, err = png.Decode(bytes.NewReader(binaryData)) + } else if dataRes.ResourceType == "image/jpeg" { + img, err = jpeg.Decode(bytes.NewReader(binaryData)) + } + if err == nil { + if img != nil { + if img.Bounds().Dx() != 800 || img.Bounds().Dy() != 800 { + errMsg += fmt.Sprintf(",size:%dx%d", img.Bounds().Dx(), img.Bounds().Dy()) + } + } + } else { + errMsg += "," + err.Error() + } + if errMsg != "" { + dataRes.Remark = errMsg + dao.UpdateEntity(dao.GetDB(), dataRes, "Remark", "ResourceType", "HashCode") + } + } + return retVal, err + }, imgList) + tasksch.HandleTask(calcTask, task, false).Run() + _, err = calcTask.GetResult(0) + } + case 1: // 检查京东商品图片 + skuNameInfo, err2 := cms.GetSkuNames(ctx, "", false, map[string]interface{}{}, 0, -1) + if err = err2; err == nil && len(skuNameInfo.SkuNames) > 0 { + calcTask := tasksch.NewParallelTask("检查京东图片的有效性", + tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError).SetParallelCount(5), ctx, + func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + skuName := batchItemList[0].(*model.SkuNameExt) + for _, sku := range skuName.Skus { + if sku.JdID != 0 { + skuPageInfo, err2 := api.JdAPI.GetSkuPageInfo(sku.JdID) + 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) + skuName.ImgHashCode = "np" + dao.UpdateEntity(dao.GetDB(), &skuName.SkuName, "ImgHashCode") + } + break + } + } + return retVal, err + }, skuNameInfo.SkuNames) + tasksch.HandleTask(calcTask, task, false).Run() + _, err = calcTask.GetResult(0) + } + } + return result, err + }, 2) + tasksch.HandleTask(rootTask, nil, true).Run() + if !isAsync { + if _, err = rootTask.GetResult(0); err == nil { + hint = "1" + } + } else { + hint = rootTask.ID + } + return hint, err +} diff --git a/business/jxutils/datares/datares.go b/business/jxutils/datares/datares.go index 6f4534548..e1c36bfd5 100644 --- a/business/jxutils/datares/datares.go +++ b/business/jxutils/datares/datares.go @@ -2,8 +2,8 @@ package datares import ( "fmt" + "net/http" "strings" - "time" "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" @@ -17,12 +17,7 @@ import ( ) const ( - qiniuTokenExpires = 300 // 七牛TOKEN有效时间,5分钟 - dataResCacheTimeout = 24 * time.Hour -) - -var ( - dataResCache jxutils.SyncMapWithTimeout + qiniuTokenExpires = 300 // 七牛TOKEN有效时间,5分钟 ) type UploadResTokenInfo struct { @@ -50,7 +45,6 @@ func GetQiniuUploadToken(ctx *jxcontext.Context, suffix, hashCode string) (upTok Hit: imgURL != "", Img: imgURL, } - dataResCache.StoreWithTimeout(imgURL, hashCode, dataResCacheTimeout) return upTokenInfo, err } @@ -75,7 +69,9 @@ func getMimeTypeFromURL(resourceURL string) (mimeType string) { return mimeType } -func RegisterDataResource(ctx *jxcontext.Context, name, resourceURL, mimeType, hashCode string, resBinary []byte, imgType int, isAsync bool) (dataRes *model.DataResource, err error) { +// 此函数要求resBinary不能空,mimeType与hashCode必须是正确的 +func RegisterDataResource(ctx *jxcontext.Context, name, resourceURL, mimeType, hashCode string, resBinary []byte, imgType int, isAsyncUpload2Vendor bool) (dataRes *model.DataResource, err error) { + globals.SugarLogger.Debugf("RegisterDataResource, name:%s, resourceURL:%s, mimeType:%s, hashCode:%s, imgType:%d, isAsyncUpload2Vendor;%t", name, resourceURL, mimeType, hashCode, imgType, isAsyncUpload2Vendor) if model.ValidMimeTypes[mimeType] == nil { return nil, fmt.Errorf("MIME type:%s非法", mimeType) } @@ -84,7 +80,7 @@ func RegisterDataResource(ctx *jxcontext.Context, name, resourceURL, mimeType, h HashCode: hashCode, ResourceType: mimeType, MainURL: resourceURL, - IsVendor: int8(imgType), + UseType: int8(imgType), } vendorID := jxutils.GuessDataResourceVendor(resourceURL) @@ -106,17 +102,17 @@ func RegisterDataResource(ctx *jxcontext.Context, name, resourceURL, mimeType, h } if imgType > 0 { // 忽略上传错误 - UploadImage2Vendors(ctx, nil, dataRes, resBinary, isAsync) + UploadImage2Vendors(ctx, nil, dataRes, resBinary, isAsyncUpload2Vendor) } return dataRes, err } -func TryRegisterDataResource(ctx *jxcontext.Context, name, resourceURL string, isAllowDownLoad bool, imgType int, isAsync bool) (dataRes *model.DataResource, err error) { +func TryRegisterDataResource(ctx *jxcontext.Context, name, resourceURL string, imgType int, isAsyncUpload2Vendor bool) (dataRes *model.DataResource, err error) { + globals.SugarLogger.Debugf("TryRegisterDataResource, name:%s, resourceURL:%s, imgType:%d, isAsyncUpload2Vendor;%t", name, resourceURL, imgType, isAsyncUpload2Vendor) dataRes = &model.DataResource{ MainURL: resourceURL, } - db := dao.GetDB() - err = dao.GetEntity(db, dataRes, "MainURL") + err = dao.GetEntity(dao.GetDB(), dataRes, "MainURL") if err != nil { if !dao.IsNoRowsError(err) { return nil, err @@ -124,20 +120,11 @@ func TryRegisterDataResource(ctx *jxcontext.Context, name, resourceURL string, i } else { return dataRes, nil } - value, ok := dataResCache.Load(resourceURL) - var hashCode string - var resBinary []byte - if !ok { - if !isAllowDownLoad { - return nil, nil - } - if resBinary, hashCode, err = jxutils.DownloadFileByURL(resourceURL); err != nil { - return nil, err - } - } else { - hashCode = value.(string) + resBinary, hashCode, err := jxutils.DownloadFileByURL(resourceURL) + if err != nil { + return nil, err } - return RegisterDataResource(ctx, name, resourceURL, getMimeTypeFromURL(resourceURL), hashCode, resBinary, imgType, isAsync) + return RegisterDataResource(ctx, name, resourceURL, http.DetectContentType(resBinary), hashCode, resBinary, imgType, isAsyncUpload2Vendor) } func GetDataResource(ctx *jxcontext.Context, hashCode string) (resourceURL string, err error) { @@ -179,7 +166,7 @@ func UploadImage2Vendors(ctx *jxcontext.Context, parentTask tasksch.ITask, dataR func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { vendorID := batchItemList[0].(int) if handler := partner.GetPurchasePlatformFromVendorID(vendorID); handler != nil { - imgHint, err2 := handler.UploadImg(ctx, dataRes.MainURL, imgData, imgName, int(dataRes.IsVendor)) + imgHint, err2 := handler.UploadImg(ctx, dataRes.MainURL, imgData, imgName, int(dataRes.UseType)) if err = err2; err == nil { retVal = [][]interface{}{ []interface{}{ diff --git a/business/jxutils/datares/datares_test.go b/business/jxutils/datares/datares_test.go index 563c495c1..82080c758 100644 --- a/business/jxutils/datares/datares_test.go +++ b/business/jxutils/datares/datares_test.go @@ -6,6 +6,7 @@ import ( "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" + "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/globals/api2" "git.rosy.net.cn/jx-callback/globals/testinit" @@ -36,7 +37,7 @@ func TestGetDataResource(t *testing.T) { } func TestTryRegisterDataResource(t *testing.T) { - dataRes, err := TryRegisterDataResource(jxcontext.AdminCtx, "test", "http://image.jxc4.com/image/8552261fb928be10f6406b13dc29570e.jpg", true, true, false) + dataRes, err := TryRegisterDataResource(jxcontext.AdminCtx, "test", "http://image.jxc4.com/image/37db6b94925e669e0a7b6844ba7ce160.jpg", model.ImgTypeMain, false) if err != nil { t.Fatal(err) } diff --git a/business/model/common.go b/business/model/common.go index 16ce08a1e..661f24350 100644 --- a/business/model/common.go +++ b/business/model/common.go @@ -1,8 +1,9 @@ package model const ( - ImgTypeMain = 1 // 商品主图 - ImgTypeDesc = 2 // 商品描述详情 + ImgTypeLocal = 0 // 京西自己用的,不需要上传至平台 + ImgTypeMain = 1 // 商品主图 + ImgTypeDesc = 2 // 商品描述详情 ) var ( @@ -23,10 +24,12 @@ type DataResource struct { ResourceType string `orm:"size(48)" json:"resourceType"` // 资料的mime type Name string `orm:"size(48);index" json:"name"` - IsVendor int8 `json:"isVendor"` // 是否是平台需要的(平台需要才会上传到平台) + UseType int8 `json:"useType"` // 图资源使用方式(大于0才可能需要上传至平台) MainURL string `orm:"size(512);column(main_url);unique" json:"mainURL"` QiniuURL string `orm:"size(512);column(qiniu_url);index" json:"qiniuURL"` EbaiURL string `orm:"size(512);column(ebai_url);index" json:"ebaiURL"` MtwmURL string `orm:"size(512);column(mtwm_url);index" json:"mtwmURL"` + + Remark string `orm:"size(1024)" json:"remark"` } diff --git a/business/model/dao/common.go b/business/model/dao/common.go index fe36d8662..f3dbab71a 100644 --- a/business/model/dao/common.go +++ b/business/model/dao/common.go @@ -26,7 +26,7 @@ func GetNeedUploadDataResource(db *DaoDB) (dataResList []*model.DataResource, er sql := ` SELECT t1.* FROM data_resource t1 - WHERE t1.is_vendor <> 0 AND (t1.ebai_url = '' OR t1.mtwm_url = '')` + WHERE t1.use_type <> 0 AND (t1.ebai_url = '' OR t1.mtwm_url = '')` err = GetRows(db, &dataResList, sql) return dataResList, err } diff --git a/business/model/dao/store_sku.go b/business/model/dao/store_sku.go index f88a6d6c2..bfcd21adc 100644 --- a/business/model/dao/store_sku.go +++ b/business/model/dao/store_sku.go @@ -17,9 +17,9 @@ var ( model.VendorIDMTWM: "mtwm_url", model.VendorIDEBAI: "ebai_url", } - descImgFieldMap = map[int]string{ - model.VendorIDEBAI: "desc_img_ebai", - } + // descImgFieldMap = map[int]string{ + // model.VendorIDEBAI: "desc_img_ebai", + // } ) type SkuStoreCatInfo struct { @@ -225,13 +225,13 @@ func GetStoreSkus2(db *DaoDB, vendorID, storeID int, skuIDs []int, isDirty bool) t3.id name_id, t3.prefix, t3.name, t3.unit, t3.upc, IF(t11.%s <> '', t11.%s, t3.img) img, IF(t12.%s <> '', t12.%s, t3.img2) img2, - IF(t13.%s <> '', t13.%s, t3.%s) desc_img, + t13.%s desc_img, t4.%s_category_id vendor_vendor_cat_id` fmtParams := []interface{}{ tableName, fieldPrefix, fieldPrefix, vendorSkuNameField, GetDataResFieldName(vendorID), GetDataResFieldName(vendorID), GetDataResFieldName(vendorID), GetDataResFieldName(vendorID), - GetDataResFieldName(vendorID), GetDataResFieldName(vendorID), GetDescImgFieldName(vendorID), + GetDataResFieldName(vendorID), fieldPrefix, } if isSingleStorePF { @@ -315,7 +315,7 @@ func GetFullStoreSkus(db *DaoDB, vendorID, storeID int) (skus []*StoreSkuSyncInf t3.id name_id, t3.prefix, t3.name, t3.unit, t3.upc, IF(t11.%s <> '', t11.%s, t3.img) img, IF(t12.%s <> '', t12.%s, t3.img2) img2, - IF(t13.%s <> '', t13.%s, t3.desc_img) desc_img, + t13.%s desc_img, t4.%s_category_id vendor_vendor_cat_id, t4.%s_sync_status store_cat_sync_status, t4.%s_id vendor_cat_id, t5sku.%s_sync_status sku_store_cat_sync_status, t5sku.%s_id sku_vendor_cat_id @@ -343,7 +343,7 @@ func GetFullStoreSkus(db *DaoDB, vendorID, storeID int) (skus []*StoreSkuSyncInf fieldPrefix, GetDataResFieldName(vendorID), GetDataResFieldName(vendorID), GetDataResFieldName(vendorID), GetDataResFieldName(vendorID), - GetDataResFieldName(vendorID), GetDataResFieldName(vendorID), + GetDataResFieldName(vendorID), fieldPrefix, fieldPrefix, fieldPrefix, fieldPrefix, fieldPrefix, @@ -448,13 +448,13 @@ func GetDataResFieldName(vendorID int) (fieldName string) { return fieldName } -func GetDescImgFieldName(vendorID int) (fieldName string) { - fieldName = descImgFieldMap[vendorID] - if fieldName == "" { - fieldName = "desc_img" - } - return fieldName -} +// func GetDescImgFieldName(vendorID int) (fieldName string) { +// fieldName = descImgFieldMap[vendorID] +// if fieldName == "" { +// fieldName = "desc_img" +// } +// return fieldName +// } func GetStoresSkusInfo(db *DaoDB, storeIDs, skuIDs []int) (storeSkuList []*model.StoreSkuBind, err error) { sql := ` diff --git a/business/partner/purchase/ebai/ebai.go b/business/partner/purchase/ebai/ebai.go index 5fe6874ca..c5cd5fe05 100644 --- a/business/partner/purchase/ebai/ebai.go +++ b/business/partner/purchase/ebai/ebai.go @@ -54,7 +54,7 @@ func (p *PurchaseHandler) UploadImg(ctx *jxcontext.Context, imgURL string, imgDa if globals.EnableEbaiStoreWrite { if imgType == model.ImgTypeMain { imgHint, err = api.EbaiAPI.PictureUpload(imgURL, imgData) - } else if imgType == model.ImgTypeMain { + } else if imgType == model.ImgTypeDesc { imgHint, err = api.EbaiAPI.SkuUploadRTF(p.getShopID4UploadRTF(), ebaiapi.BuildRFTFromImgs(imgURL)) } } else { diff --git a/business/partner/purchase/mtwm/mtwm.go b/business/partner/purchase/mtwm/mtwm.go index dfb172560..d291b9629 100644 --- a/business/partner/purchase/mtwm/mtwm.go +++ b/business/partner/purchase/mtwm/mtwm.go @@ -173,7 +173,7 @@ func (p *PurchaseHandler) UploadImg(ctx *jxcontext.Context, imgURL string, imgDa return "", fmt.Errorf("找不到一个美团门店来上传图片") } if globals.EnableMtwmStoreWrite { - if imgType > 0 { + if imgType > model.ImgTypeLocal { if imgData != nil { imgHint, err = api.MtwmAPI.ImageUpload(poiCode4UploadImg, imgName, imgData) } else { diff --git a/business/userstore/food_recipe.go b/business/userstore/food_recipe.go index a72e0e5c0..f3a1a8f4a 100644 --- a/business/userstore/food_recipe.go +++ b/business/userstore/food_recipe.go @@ -190,7 +190,7 @@ func tryRegisterDataRes4Recipe(ctx *jxcontext.Context, name, mainImg string, ste } errList := errlist.New() for _, v := range imgList { - _, err := datares.TryRegisterDataResource(ctx, name, v, true, 0, true) + _, err := datares.TryRegisterDataResource(ctx, name, v, model.ImgTypeLocal, true) errList.AddErr(err) } return errList.GetErrListAsOne() diff --git a/controllers/cms.go b/controllers/cms.go index 98e25fda3..3c42dbfa7 100644 --- a/controllers/cms.go +++ b/controllers/cms.go @@ -118,7 +118,7 @@ func (c *CmsController) GetQiniuUploadToken() { // @router /RegisterDataResource [post] func (c *CmsController) RegisterDataResource() { c.callRegisterDataResource(func(params *tCmsRegisterDataResourceParams) (retVal interface{}, errCode string, err error) { - retVal, err = datares.RegisterDataResource(params.Ctx, params.Name, params.ResourceURL, params.MimeType, params.HashCode, nil, 0, true) + // retVal, err = datares.RegisterDataResource(params.Ctx, params.Name, params.ResourceURL, params.MimeType, params.HashCode, nil, model.ImgTypeLocal, true) return retVal, "", err }) } diff --git a/controllers/cms_store_sku.go b/controllers/cms_store_sku.go index f58053f15..7f495a0ab 100644 --- a/controllers/cms_store_sku.go +++ b/controllers/cms_store_sku.go @@ -39,6 +39,7 @@ type StoreSkuController struct { // @Param offset query int false "门店列表起始序号(以0开始,缺省为0)" // @Param pageSize query int false "门店列表页大小(缺省为50,-1表示全部)" // @Param isBySku query bool false "是否按SKU分拆" +// @Param isAct query bool false "是否活动商品(包括正常活动与补贴)" // @Param jdSyncStatus query int false "京东同步标识" // @Param ebaiSyncStatus query int false "饿百同步标识" // @Param mtwmSyncStatus query int false "美团外卖同步标识" @@ -49,7 +50,7 @@ func (c *StoreSkuController) GetStoreSkus() { c.callGetStoreSkus(func(params *tStoreSkuGetStoreSkusParams) (retVal interface{}, errCode string, err error) { var skuIDs []int if err = jxutils.Strings2Objs(params.SkuIDs, &skuIDs); err == nil { - retVal, err = cms.GetStoreSkus(params.Ctx, params.StoreID, skuIDs, params.IsFocus, params.Keyword, params.IsBySku, params.MapData, params.Offset, params.PageSize) + retVal, err = cms.GetStoreSkus(params.Ctx, params.StoreID, skuIDs, params.IsFocus, params.Keyword, params.IsBySku, params.IsAct, params.MapData, params.Offset, params.PageSize) } return retVal, "", err }) @@ -78,6 +79,7 @@ func (c *StoreSkuController) GetStoreSkus() { // @Param offset query int false "门店列表起始序号(以0开始,缺省为0)" // @Param pageSize query int false "门店列表页大小(缺省为50,-1表示全部)" // @Param isBySku query bool false "是否按SKU分拆" +// @Param isAct query bool false "是否活动商品(包括正常活动与补贴)" // @Param jdSyncStatus query int false "京东同步标识" // @Param ebaiSyncStatus query int false "饿百同步标识" // @Param mtwmSyncStatus query int false "美团外卖同步标识" @@ -88,7 +90,7 @@ func (c *StoreSkuController) GetStoresSkus() { c.callGetStoresSkus(func(params *tStoreSkuGetStoresSkusParams) (retVal interface{}, errCode string, err error) { var storeIDs, skuIDs []int if err = jxutils.Strings2Objs(params.StoreIDs, &storeIDs, params.SkuIDs, &skuIDs); err == nil { - retVal, err = cms.GetStoresSkus(params.Ctx, storeIDs, skuIDs, params.IsFocus, params.Keyword, params.IsBySku, params.MapData, params.Offset, params.PageSize) + retVal, err = cms.GetStoresSkus(params.Ctx, storeIDs, skuIDs, params.IsFocus, params.Keyword, params.IsBySku, params.IsAct, params.MapData, params.Offset, params.PageSize) } return retVal, "", err }) diff --git a/controllers/temp_op.go b/controllers/temp_op.go index 30260038e..4acb1cc3f 100644 --- a/controllers/temp_op.go +++ b/controllers/temp_op.go @@ -1,12 +1,10 @@ package controllers import ( - "git.rosy.net.cn/baseapi/platformapi/mtwmapi" "git.rosy.net.cn/jx-callback/business/jxstore/cms" "git.rosy.net.cn/jx-callback/business/jxstore/misc" "git.rosy.net.cn/jx-callback/business/jxstore/tempop" "git.rosy.net.cn/jx-callback/business/jxutils" - "git.rosy.net.cn/jx-callback/business/partner/purchase/mtwm" "github.com/astaxie/beego" ) @@ -238,37 +236,14 @@ func (c *TempOpController) RefreshMtpsWaybillFee() { // @Title 查询三方运单费用信息 // @Description 查询三方运单费用信息 // @Param token header string true "认证token" +// @Param isAsync query bool false "是否异步操作" +// @Param isContinueWhenError query bool false "单个同步失败是否继续,缺省false" // @Success 200 {object} controllers.CallResult // @Failure 200 {object} controllers.CallResult // @router /TestIt [get] func (c *TempOpController) TestIt() { c.callTestIt(func(params *tTempopTestItParams) (retVal interface{}, errCode string, err error) { - // // retVal, err = cms.OpenRemoteStoreByJxStatus(params.Ctx, nil, nil, false, true, true) - // // shopList, err := api.EbaiAPI.ShopList(ebaiapi.SysStatusAll) - // shopList, err := dao.GetStoresMapList(dao.GetDB(), []int{model.VendorIDEBAI}, nil, model.StoreStatusAll, model.StoreIsSyncYes, "") - // task := tasksch.NewParallelTask("TestIt", nil, params.Ctx, - // func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - // // shopID := batchItemList[0].(*ebaiapi.ShopInfo).ShopID - // shopID := utils.Int2Str(batchItemList[0].(*model.StoreMap).StoreID) - // skuInfo, err := api.EbaiAPI.SkuList(shopID, &ebaiapi.SkuListParams{}) - // if err == nil && skuInfo.Total > 500 { - // errSkuCount := 0 - // for _, sku := range skuInfo.List { - // if sku.CustomCatIDs == "" { - // errSkuCount++ - // } - // } - // if errSkuCount > len(skuInfo.List)/3 { - // retVal = []string{shopID} - // } - // } - // return retVal, err - // }, shopList) - // task.Run() - // retVal, err = task.GetResult(0) - mtwm.OnCallbackMsg(&mtwmapi.CallbackMsg{ - Cmd: mtwmapi.MsgTypePrivateNumberDowngrade, - }) + retVal, err = tempop.CheckImages(params.Ctx, params.IsAsync, params.IsContinueWhenError) return retVal, "", err }) }