Merge remote-tracking branch 'origin/mark' into don
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
`)
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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{}{
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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"`
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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 := `
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
})
|
||||
}
|
||||
|
||||
@@ -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
|
||||
})
|
||||
|
||||
@@ -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
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user