diff --git a/business/jxstore/cms/sku.go b/business/jxstore/cms/sku.go index 504424677..5feb73558 100644 --- a/business/jxstore/cms/sku.go +++ b/business/jxstore/cms/sku.go @@ -522,7 +522,10 @@ func GetSkuNames(ctx *jxcontext.Context, keyword string, isBySku bool, params ma t1.status, t1.is_spu, t1.desc_img, - t1.upc` + t1.upc, + t1.ex_prefix, + t1.ex_prefix_begin, + t1.ex_prefix_end` if isBySku { sql += `, t2.id` @@ -551,6 +554,9 @@ func GetSkuNames(ctx *jxcontext.Context, keyword string, isBySku bool, params ma t1.upc, t1.jd_id, t1.jd_sync_status, + t1.ex_prefix, + t1.ex_prefix_begin, + t1.ex_prefix_end, CONCAT("[", GROUP_CONCAT(DISTINCT CONCAT('{"id":', t2.id, ',"comment":"', t2.comment, '","status":', t2.status, ',"createdAt":"', CONCAT(REPLACE(t2.created_at," ","T"),"+08:00"), '","updatedAt":"', CONCAT(REPLACE(t2.updated_at," ","T"),"+08:00"), '","lastOperator":"', t2.last_operator, '","specQuality":', t2.spec_quality, ',"specUnit":"', t2.spec_unit, @@ -581,6 +587,15 @@ func GetSkuNames(ctx *jxcontext.Context, keyword string, isBySku bool, params ma var skuIDs []int for _, skuName := range skuNamesInfo.SkuNames { + if skuName.ExPrefixEnd != utils.ZeroTimeValue && skuName.ExPrefixBegin != utils.ZeroTimeValue { + if time.Now().Before(skuName.ExPrefixEnd) && time.Now().After(skuName.ExPrefixBegin) { + skuName.FullName = skuName.ExPrefix + jxutils.ComposeSkuName(skuName.Prefix, skuName.Name, "", "", 0, "", 0) + } else { + skuName.FullName = jxutils.ComposeSkuName(skuName.Prefix, skuName.Name, "", "", 0, "", 0) + } + } else { + skuName.FullName = jxutils.ComposeSkuName(skuName.Prefix, skuName.Name, "", "", 0, "", 0) + } if skuName.SkusStr != "" { if err = utils.UnmarshalUseNumber([]byte(skuName.SkusStr), &skuName.Skus); err != nil { dao.Rollback(db) @@ -852,7 +867,6 @@ func UpdateSkuName(ctx *jxcontext.Context, nameID int, payload map[string]interf } } } - skuList, err2 := dao.GetSkus(db, nil, []int{nameID}, nil, nil) if err = err2; err == nil { for _, v := range skuList { @@ -871,7 +885,6 @@ func UpdateSkuName(ctx *jxcontext.Context, nameID int, payload map[string]interf } } } - skuIDs, err2 := dao.GetSkuIDByNames(db, []int{nameID}) if err = err2; err != nil { dao.Rollback(db) @@ -1331,3 +1344,35 @@ func GetJdUpcCodeByName(ctx *jxcontext.Context, name, upcCode string) (productIn } return productInfos, err } + +func UpdateSkuNamesExPrefix(ctx *jxcontext.Context, nameIDs []int, exPrefix, fromTime, toTime string, isAsync, isContinueWhenError bool) (hint string, err error) { + var ( + fromTimeP time.Time + toTimeP time.Time + ) + if fromTime != "" { + fromTimeP = utils.Str2Time(fromTime) + } + if toTime != "" { + toTimeP = utils.Str2Time(toTime) + } + task := tasksch.NewParallelTask("批量设置商品前缀", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx, + func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + nameID := batchItemList[0].(int) + payload := map[string]interface{}{ + "exPrefix": exPrefix, + "exPrefixBegin": fromTimeP, + "exPrefixEnd": toTimeP, + } + _, err = UpdateSkuName(ctx, nameID, payload) + return retVal, err + }, nameIDs) + tasksch.HandleTask(task, nil, true).Run() + if !isAsync { + _, err = task.GetResult(0) + hint = "1" + } else { + hint = task.GetID() + } + return hint, err +} diff --git a/business/jxstore/cms/sync2.go b/business/jxstore/cms/sync2.go index 10962053d..c986b80ff 100644 --- a/business/jxstore/cms/sync2.go +++ b/business/jxstore/cms/sync2.go @@ -143,7 +143,17 @@ func SyncSkus(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorIDs []int, if skuVendorInfo.BindID == 0 { return nil, fmt.Errorf("商品:%d的数据异常", skuVendorInfo.SkuID) } - skuVendorInfo.SkuName = jxutils.ComposeSkuName(skuVendorInfo.Prefix, skuVendorInfo.Name, skuVendorInfo.Comment, skuVendorInfo.Unit, skuVendorInfo.SpecQuality, skuVendorInfo.SpecUnit, 0) + skuName := "" + if skuVendorInfo.ExPrefixEnd != utils.ZeroTimeValue && skuVendorInfo.ExPrefixBegin != utils.ZeroTimeValue { + if time.Now().Before(skuVendorInfo.ExPrefixEnd) && time.Now().After(skuVendorInfo.ExPrefixBegin) { + skuName = skuVendorInfo.ExPrefix + jxutils.ComposeSkuName(skuVendorInfo.Prefix, skuVendorInfo.Name, skuVendorInfo.Comment, skuVendorInfo.Unit, skuVendorInfo.SpecQuality, skuVendorInfo.SpecUnit, 0) + } else { + skuName = jxutils.ComposeSkuName(skuVendorInfo.Prefix, skuVendorInfo.Name, skuVendorInfo.Comment, skuVendorInfo.Unit, skuVendorInfo.SpecQuality, skuVendorInfo.SpecUnit, 0) + } + } else { + skuName = jxutils.ComposeSkuName(skuVendorInfo.Prefix, skuVendorInfo.Name, skuVendorInfo.Comment, skuVendorInfo.Unit, skuVendorInfo.SpecQuality, skuVendorInfo.SpecUnit, 0) + } + skuVendorInfo.SkuName = skuName skuVendorInfo.MergedStatus = jxutils.MergeSkuStatus(skuVendorInfo.Status, skuVendorInfo.NameStatus) if multiStoresHandler, ok := partner.GetPurchasePlatformFromVendorID(skuVendorInfo.VendorID).(partner.IMultipleStoresHandler); ok { if model.IsSyncStatusDelete(skuVendorInfo.SkuSyncStatus) { //删除 diff --git a/business/model/dao/sku.go b/business/model/dao/sku.go index 2884efab4..763293ecc 100644 --- a/business/model/dao/sku.go +++ b/business/model/dao/sku.go @@ -260,7 +260,9 @@ func GetSkusWithVendor(db *DaoDB, vendorIDs []int, appOrgCodes []string, nameIDs IF(t11.resource_type IS NULL OR t11.resource_type <> ?, t2.img, '') img, IF(t12.resource_type IS NULL OR t12.resource_type <> ?, t2.img2, '') img2, t2.desc_img, - + t2.ex_prefix, + t2.ex_prefix_begin, + t2.ex_prefix_end, t3.jd_category_id vendor_vendor_cat_id, t3m.sync_status cat_sync_status, @@ -307,7 +309,6 @@ func GetSkusWithVendor(db *DaoDB, vendorIDs []int, appOrgCodes []string, nameIDs sqlParams = append(sqlParams, skuIDs) } sql += " ORDER BY t1.seq" - if err = GetRows(db, &skuList, sql, sqlParams...); err == nil { skuPlaceList, err2 := GetSkuNamePlaces(db, nameIDs, skuIDs) if err = err2; err == nil { diff --git a/business/model/dao/store_sku.go b/business/model/dao/store_sku.go index e8d758482..1a970d05d 100644 --- a/business/model/dao/store_sku.go +++ b/business/model/dao/store_sku.go @@ -56,7 +56,10 @@ type StoreSkuSyncInfo struct { model.Sku // sku_name - Prefix string + Prefix string + ExPrefix string + ExPrefixBegin time.Time + ExPrefixEnd time.Time // NameID int `orm:"column(name_id)"` VendorNameID string `orm:"column(vendor_name_id)"` // 暂时无用 Name string @@ -305,7 +308,7 @@ func newGetStoreSkus2(db *DaoDB, vendorID, storeID int, skuIDs []int, mustDirty %s vendor_sku_id, t1.%s_sync_status sku_sync_status, t1.%s_price vendor_price, t1.store_id, t1.deleted_at bind_deleted_at,t1.status_sale_begin,t1.status_sale_end, t2.*, - t3.id name_id, t3.prefix, t3.name, t3.unit, t3.upc, + t3.id name_id, t3.prefix, t3.name, t3.unit, t3.upc, t3.ex_prefix, t3.ex_prefix_begin, t3.ex_prefix_end, IF(t11.%s <> '', t11.%s, t3.img) img, IF(t12.%s <> '', t12.%s, t3.img2) img2, t13.%s desc_img, @@ -410,7 +413,7 @@ func oldGetStoreSkus2(db *DaoDB, vendorID, storeID int, skuIDs []int, mustDirty %s.%s_id vendor_sku_id, t1.%s_sync_status sku_sync_status, t1.%s_price vendor_price, t1.store_id, t1.deleted_at bind_deleted_at,t1.status_sale_begin,t1.status_sale_end, t2.*, - t3.id name_id, t3.prefix, t3.name, t3.unit, t3.upc, + t3.id name_id, t3.prefix, t3.name, t3.unit, t3.upc,t3.ex_prefix, t3.ex_prefix_begin, t3.ex_prefix_end, IF(t11.%s <> '', t11.%s, t3.img) img, IF(t12.%s <> '', t12.%s, t3.img2) img2, t13.%s desc_img, diff --git a/business/model/sku.go b/business/model/sku.go index e2e51cf03..7823dc903 100644 --- a/business/model/sku.go +++ b/business/model/sku.go @@ -1,5 +1,7 @@ package model +import "time" + const ( SkuCategoryNormal = 0 SkuCategorySpecial = 1 @@ -166,8 +168,12 @@ func (*SkuCategory) TableIndex() [][]string { type SkuName struct { ModelIDCULD - Prefix string `orm:"size(255)" json:"prefix"` - Name string `orm:"size(255);index" json:"name"` + Prefix string `orm:"size(255)" json:"prefix"` + Name string `orm:"size(255);index" json:"name"` + ExPrefix string `orm:"size(255)" json:"exPrefix"` + + ExPrefixBegin time.Time `orm:"type(datetime);null" json:"exPrefixBegin"` + ExPrefixEnd time.Time `orm:"type(datetime);null" json:"exPrefixEnd"` BrandID int `orm:"column(brand_id);default(0)" json:"brandID"` // todo,此属性暂时没有使用,且有问题,应该是不同平台都有一个brandid CategoryID int `orm:"column(category_id);index" json:"categoryID"` // 标准类别 @@ -255,9 +261,9 @@ type SkuWithVendor struct { type SkuNameExt struct { SkuName - Skus []*SkuWithVendor `orm:"-" json:"skus"` - SkusStr string `json:"-"` - - Places []int `orm:"-" json:"places"` - PlacesStr string `json:"-"` + Skus []*SkuWithVendor `orm:"-" json:"skus"` + SkusStr string `json:"-"` + FullName string `json:"fullName"` + Places []int `orm:"-" json:"places"` + PlacesStr string `json:"-"` } diff --git a/business/partner/purchase/ebai/store_sku2.go b/business/partner/purchase/ebai/store_sku2.go index df5508141..c57a99aa3 100644 --- a/business/partner/purchase/ebai/store_sku2.go +++ b/business/partner/purchase/ebai/store_sku2.go @@ -244,8 +244,18 @@ func genSkuParamsFromStoreSkuInfo2(storeSku *dao.StoreSkuSyncInfo, isCreate bool "url": storeSku.Img2, }) } + skuName := "" + if storeSku.ExPrefixEnd != utils.ZeroTimeValue && storeSku.ExPrefixBegin != utils.ZeroTimeValue { + if time.Now().Before(storeSku.ExPrefixEnd) && time.Now().After(storeSku.ExPrefixBegin) { + skuName = storeSku.ExPrefix + utils.LimitUTF8StringLen(utils.FilterEmoji(storeSku.SkuName), ebaiapi.MaxSkuNameByteCount) + } else { + skuName = utils.LimitUTF8StringLen(utils.FilterEmoji(storeSku.SkuName), ebaiapi.MaxSkuNameByteCount) + } + } else { + skuName = utils.LimitUTF8StringLen(utils.FilterEmoji(storeSku.SkuName), ebaiapi.MaxSkuNameByteCount) + } params = map[string]interface{}{ - "name": utils.LimitMixedStringLen(storeSku.SkuName, ebaiapi.MaxSkuNameByteCount), + "name": skuName, "left_num": model.MaxStoreSkuStockQty, "category_id": utils.Str2Int64(storeSku.VendorCatID), "predict_cat": 0, // 不使用推荐类目 diff --git a/business/partner/purchase/jd/sku.go b/business/partner/purchase/jd/sku.go index 214aea54b..23030971a 100644 --- a/business/partner/purchase/jd/sku.go +++ b/business/partner/purchase/jd/sku.go @@ -4,6 +4,7 @@ package jd import ( "fmt" + "time" "unicode/utf8" "git.rosy.net.cn/baseapi/platformapi/jdapi" @@ -140,7 +141,16 @@ func (p *PurchaseHandler) cuSku(db *dao.DaoDB, sku *model.Sku, handler func(skuE addParams[jdapi.KeyIfViewDesc] = 1 } if err == nil { - skuName := jxutils.ComposeSkuName(skuInfoExt.Prefix, skuInfoExt.Name, sku.Comment, skuInfoExt.Unit, sku.SpecQuality, sku.SpecUnit, jdapi.MaxSkuNameCharCount) + skuName := "" + if skuInfoExt.ExPrefixEnd != utils.ZeroTimeValue && skuInfoExt.ExPrefixBegin != utils.ZeroTimeValue { + if time.Now().Before(skuInfoExt.ExPrefixEnd) && time.Now().After(skuInfoExt.ExPrefixBegin) { + skuName = skuInfoExt.ExPrefix + jxutils.ComposeSkuName(skuInfoExt.Prefix, skuInfoExt.Name, sku.Comment, skuInfoExt.Unit, sku.SpecQuality, sku.SpecUnit, jdapi.MaxSkuNameCharCount) + } else { + skuName = jxutils.ComposeSkuName(skuInfoExt.Prefix, skuInfoExt.Name, sku.Comment, skuInfoExt.Unit, sku.SpecQuality, sku.SpecUnit, jdapi.MaxSkuNameCharCount) + } + } else { + skuName = jxutils.ComposeSkuName(skuInfoExt.Prefix, skuInfoExt.Name, sku.Comment, skuInfoExt.Unit, sku.SpecQuality, sku.SpecUnit, jdapi.MaxSkuNameCharCount) + } skuPrice := jxutils.CaculateSkuPrice(skuInfoExt.Price, sku.SpecQuality, sku.SpecUnit, skuInfoExt.Unit) if skuInfoExt.Upc != "" { addParams[jdapi.KeyUpcCode] = skuInfoExt.Upc diff --git a/business/partner/purchase/mtwm/store_sku2.go b/business/partner/purchase/mtwm/store_sku2.go index 6c52ec66a..e3f1f3bf0 100644 --- a/business/partner/purchase/mtwm/store_sku2.go +++ b/business/partner/purchase/mtwm/store_sku2.go @@ -3,6 +3,7 @@ package mtwm import ( "regexp" "strings" + "time" "git.rosy.net.cn/baseapi/platformapi/mtwmapi" "git.rosy.net.cn/baseapi/utils" @@ -245,7 +246,17 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI }, } foodData["skus"] = skus - foodData["name"] = utils.LimitUTF8StringLen(utils.FilterEmoji(storeSku.SkuName), mtwmapi.MaxSkuNameCharCount) + skuName := "" + if storeSku.ExPrefixEnd != utils.ZeroTimeValue && storeSku.ExPrefixBegin != utils.ZeroTimeValue { + if time.Now().Before(storeSku.ExPrefixEnd) && time.Now().After(storeSku.ExPrefixBegin) { + skuName = storeSku.ExPrefix + utils.LimitUTF8StringLen(utils.FilterEmoji(storeSku.SkuName), mtwmapi.MaxSkuNameCharCount) + } else { + skuName = utils.LimitUTF8StringLen(utils.FilterEmoji(storeSku.SkuName), mtwmapi.MaxSkuNameCharCount) + } + } else { + skuName = utils.LimitUTF8StringLen(utils.FilterEmoji(storeSku.SkuName), mtwmapi.MaxSkuNameCharCount) + } + foodData["name"] = skuName foodData["description"] = storeSku.Comment if isNeedUpdatePrice { foodData["price"] = jxutils.IntPrice2Standard(storeSku.VendorPrice) diff --git a/controllers/cms_sku.go b/controllers/cms_sku.go index b8605f96a..71e2e97b8 100644 --- a/controllers/cms_sku.go +++ b/controllers/cms_sku.go @@ -390,3 +390,25 @@ func (c *SkuController) GetJdUpcCodeByName() { return retVal, "", err }) } + +// @Title 批量设置商品额外前缀 +// @Description 批量设置商品额外前缀 +// @Param token header string true "认证token" +// @Param nameIDs formData string true "商品nameIDs" +// @Param exPrefix formData string true "商品额外前缀" +// @Param fromTime formData string true "生效开始时间,格式 2006-01-01 00:00:00" +// @Param toTime formData string true "生效结束时间,格式 2006-01-01 00:00:00" +// @Param isAsync formData bool false "是否异步" +// @Param isContinueWhenError formData bool false "单个同步失败是否继续,缺省false" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /UpdateSkuNamesExPrefix [put] +func (c *SkuController) UpdateSkuNamesExPrefix() { + c.callUpdateSkuNamesExPrefix(func(params *tSkuUpdateSkuNamesExPrefixParams) (retVal interface{}, errCode string, err error) { + var skuIDList []int + if err = jxutils.Strings2Objs(params.NameIDs, &skuIDList); err == nil { + retVal, err = cms.UpdateSkuNamesExPrefix(params.Ctx, skuIDList, params.ExPrefix, params.FromTime, params.ToTime, params.IsAsync, params.IsContinueWhenError) + } + return retVal, "", err + }) +} diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index 6f94c278f..ed40b9d40 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -1278,6 +1278,15 @@ func init() { Filters: nil, Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SkuController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SkuController"], + beego.ControllerComments{ + Method: "UpdateSkuNamesExPrefix", + Router: `/UpdateSkuNamesExPrefix`, + AllowHTTPMethods: []string{"put"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreController"], beego.ControllerComments{ Method: "AddStoreCourierMap",