From 839a34443353e898de2a84cf6e57faf4ad806220 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E5=B0=B9=E5=B2=9A?= <770236076@qq.com> Date: Mon, 18 Nov 2019 09:34:30 +0800 Subject: [PATCH 01/25] =?UTF-8?q?alpha=E6=B5=8B=E8=AF=95=E5=AE=9A=E6=97=B6?= =?UTF-8?q?=E5=95=86=E5=93=81=E5=8F=AF=E5=94=AE=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/misc/misc.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/business/jxstore/misc/misc.go b/business/jxstore/misc/misc.go index b6b83280b..87e915361 100644 --- a/business/jxstore/misc/misc.go +++ b/business/jxstore/misc/misc.go @@ -133,6 +133,8 @@ func Init() { }, []string{ "04:05:06", }) + } + if beego.BConfig.RunMode == "alpha" { ScheduleTimerFunc("ChangeStoreSkuSaleStatus", func() { cms.CurVendorSync.ChangeStoreSkuSaleStatus(jxcontext.AdminCtx, 0, true, false) }, ChangeStoreSkuSaleStatusList) From b31adda4d5c5fe336c0cc68aa30e130b2417c993 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E5=B0=B9=E5=B2=9A?= <770236076@qq.com> Date: Mon, 18 Nov 2019 09:37:52 +0800 Subject: [PATCH 02/25] =?UTF-8?q?=E5=95=86=E5=93=81=E5=8F=AF=E5=94=AE?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E8=AE=BE=E7=BD=AE=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/cms/store.go | 17 ++++++++++++++++- business/jxstore/cms/store_sku.go | 11 +++-------- business/jxstore/cms/validation.go | 15 +++++++++++++++ business/model/store.go | 16 ++++++++-------- globals/refutil/refutil.go | 2 ++ 5 files changed, 44 insertions(+), 17 deletions(-) diff --git a/business/jxstore/cms/store.go b/business/jxstore/cms/store.go index 1bdc89d63..44205af0a 100644 --- a/business/jxstore/cms/store.go +++ b/business/jxstore/cms/store.go @@ -617,7 +617,6 @@ func UpdateStore(ctx *jxcontext.Context, storeID int, payload map[string]interfa if err = dao.GetEntity(db, store); err != nil { return 0, err } - valid := dao.StrictMakeMapByStructObject(payload, store, userName) if err = checkStoreDeliveryRange(utils.Interface2String(valid["deliveryRange"])); err != nil { return 0, err @@ -733,6 +732,22 @@ func UpdateStore(ctx *jxcontext.Context, storeID int, payload map[string]interfa if valid["deliveryRange"] != nil { valid["deliveryRange"] = strings.Trim(valid["deliveryRange"].(string), ";") } + + //时间校验 + if store.OpenTime1 != 0 && store.CloseTime1 != 0 { + if err := ValidateStructPartial(store, "OpenTime1", "CloseTime1"); err != nil { + return 0, errors.New(fmt.Sprintf("门店营业时间1设置不合法!时间范围1 :[%v] 至 [%v]", store.OpenTime1, store.CloseTime1)) + } + } + if store.OpenTime2 != 0 && store.CloseTime2 != 0 { + if err := ValidateStructPartial(store, "OpenTime2", "CloseTime2"); err != nil { + return 0, errors.New(fmt.Sprintf("门店营业时间2设置不合法!时间范围2 :[%v] 至 [%v]", store.OpenTime2, store.CloseTime2)) + } + } + if beginAt, endAt := GetTimeMixByInt(store.OpenTime1, store.CloseTime1, store.OpenTime2, store.CloseTime2); beginAt != 0 && endAt != 0 { + return 0, errors.New(fmt.Sprintf("两段门店营业时间不可交叉!时间范围1 :[%v] 至 [%v], 时间范围2 :[%v] 至 [%v]", store.OpenTime1, store.CloseTime1, store.OpenTime2, store.CloseTime2)) + } + // districtCode := 0 // if valid["districtCode"] != nil { // districtCode = int(utils.MustInterface2Int64(valid["districtCode"])) diff --git a/business/jxstore/cms/store_sku.go b/business/jxstore/cms/store_sku.go index 6bdf996ad..f771ea684 100644 --- a/business/jxstore/cms/store_sku.go +++ b/business/jxstore/cms/store_sku.go @@ -122,8 +122,8 @@ type StoreSkuBindInfo struct { IsFocus int `json:"isFocus"` // -1:不关注,0:忽略,1:关注 IsSale int `json:"isSale"` // -1:不可售,0:忽略,1:可售 SubStoreID int `json:"subStoreID,omitempty"` - StatusSaleBegin int16 `json:"statusSaleBegin"` //商品可售时间范围 - StatusSaleEnd int16 `json:"statusSaleEnd"` + StatusSaleBegin int16 `json:"statusSaleBegin" validate:"max=2359,min=1,ltfield=StatusSaleEnd"` //商品可售时间范围 + StatusSaleEnd int16 `json:"statusSaleEnd" validate:"max=2359,min=1"` Skus []*StoreSkuBindSkuInfo `json:"skus,omitempty"` } @@ -1079,15 +1079,10 @@ func updateStoresSkusWithoutSync(ctx *jxcontext.Context, db *dao.DaoDB, storeIDs updateFieldMap["JxPrice"] = 1 } if skuBindInfo.StatusSaleBegin != 0 && skuBindInfo.StatusSaleEnd != 0 { - if skuBindInfo.StatusSaleBegin < 0 || skuBindInfo.StatusSaleBegin > 2359 || - skuBindInfo.StatusSaleEnd < 0 || skuBindInfo.StatusSaleEnd > 2359 { + if err := ValidateStruct(skuBindInfo); err != nil { dao.Rollback(db) return nil, fmt.Errorf("更改商品:%s, 可售时间不合法!时间范围:[%v] 至 [%v]", allBinds[0].Name, skuBindInfo.StatusSaleBegin, skuBindInfo.StatusSaleEnd) } - if skuBindInfo.StatusSaleBegin >= skuBindInfo.StatusSaleEnd { - dao.Rollback(db) - return nil, fmt.Errorf("更改商品:%s, 可售时间不允许交叉!时间范围:[%v] 至 [%v]", allBinds[0].Name, skuBindInfo.StatusSaleBegin, skuBindInfo.StatusSaleEnd) - } updateFieldMap["StatusSaleBegin"] = int(skuBindInfo.StatusSaleBegin) updateFieldMap["StatusSaleEnd"] = int(skuBindInfo.StatusSaleEnd) skuBind.StatusSaleBegin = skuBindInfo.StatusSaleBegin diff --git a/business/jxstore/cms/validation.go b/business/jxstore/cms/validation.go index fc6045e38..4797f8d39 100644 --- a/business/jxstore/cms/validation.go +++ b/business/jxstore/cms/validation.go @@ -3,6 +3,8 @@ package cms import ( "fmt" + "gopkg.in/go-playground/validator.v9" + "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/model" ) @@ -10,6 +12,7 @@ import ( var ( unitNamesMap map[string]int specUnitNamesMap map[string]int + validate = validator.New() ) func init() { @@ -33,3 +36,15 @@ func ValidateUnit(value interface{}) (err error) { func ValidateSpecUnit(value interface{}) (err error) { return validateStringInMap("SpecUnit", value, specUnitNamesMap) } + +func ValidateStruct(value interface{}) (err error) { + return validate.Struct(value) +} + +func ValidateVar(value interface{}, tag string) (err error) { + return validate.Var(value, tag) +} + +func ValidateStructPartial(value interface{}, fields ...string) (err error) { + return validate.StructPartial(value, fields...) +} diff --git a/business/model/store.go b/business/model/store.go index 6319b6cad..8b549576a 100644 --- a/business/model/store.go +++ b/business/model/store.go @@ -252,14 +252,14 @@ type Store struct { Address string `orm:"size(255)" json:"address"` Tel1 string `orm:"size(32);index" json:"tel1"` Tel2 string `orm:"size(32);index" json:"tel2"` - OpenTime1 int16 `json:"openTime1"` // 930就表示9点半,用两个的原因是为了支持中午休息,1与2的时间段不能交叉,为0表示没有 - CloseTime1 int16 `json:"closeTime1"` // 格式同上 - OpenTime2 int16 `json:"openTime2"` // 格式同上 - CloseTime2 int16 `json:"closeTime2"` // 格式同上 - Lng int `json:"-"` // 乘了10的6次方 - Lat int `json:"-"` // 乘了10的6次方 - DeliveryRangeType int8 `json:"deliveryRangeType"` // 参见相关常量定义 - DeliveryRange string `orm:"type(text)" json:"deliveryRange"` // 如果DeliveryRangeType为DeliveryRangeTypePolygon,则为逗号分隔坐标,分号分隔的坐标点(坐标与Lng和Lat一样,都是整数),比如 121361504,31189308;121420555,31150238。否则为半径,单位为米 + OpenTime1 int16 `json:"openTime1" validate:"max=2359,min=1,ltfield=CloseTime1"` // 930就表示9点半,用两个的原因是为了支持中午休息,1与2的时间段不能交叉,为0表示没有 + CloseTime1 int16 `json:"closeTime1" validate:"max=2359,min=1` // 格式同上 + OpenTime2 int16 `json:"openTime2" validate:"max=2359,min=1,ltfield=CloseTime2"` // 格式同上 + CloseTime2 int16 `json:"closeTime2" validate:"max=2359,min=1` // 格式同上 + Lng int `json:"-"` // 乘了10的6次方 + Lat int `json:"-"` // 乘了10的6次方 + DeliveryRangeType int8 `json:"deliveryRangeType"` // 参见相关常量定义 + DeliveryRange string `orm:"type(text)" json:"deliveryRange"` // 如果DeliveryRangeType为DeliveryRangeTypePolygon,则为逗号分隔坐标,分号分隔的坐标点(坐标与Lng和Lat一样,都是整数),比如 121361504,31189308;121420555,31150238。否则为半径,单位为米 Status int `json:"status"` AutoEnableAt *time.Time `orm:"type(datetime);null" json:"autoEnableAt"` // 自动营业时间(临时休息用) ChangePriceType int8 `json:"changePriceType"` // 修改价格类型,即是否需要审核 diff --git a/globals/refutil/refutil.go b/globals/refutil/refutil.go index 70ed494ff..11be3ad19 100644 --- a/globals/refutil/refutil.go +++ b/globals/refutil/refutil.go @@ -64,10 +64,12 @@ func FilterMapByStructObject(mapData map[string]interface{}, obj interface{}, ex for k, v := range mapData { if m[k] != nil && excludedMap[k] == 0 && v != nil && (!isCheckValue || !IsValueEqual(m[k], v)) { valid[k] = v + m[k] = v } else { invalid[k] = v } } + utils.Map2Struct(m, obj, true, "") return valid, invalid } From 528f58ce4ea1db73e1497b33ddbd882ecdbcc63d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E5=B0=B9=E5=B2=9A?= <770236076@qq.com> Date: Mon, 18 Nov 2019 10:11:18 +0800 Subject: [PATCH 03/25] =?UTF-8?q?=E4=BF=AE=E6=94=B9refutil?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- globals/refutil/refutil.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/globals/refutil/refutil.go b/globals/refutil/refutil.go index 11be3ad19..23900f2c3 100644 --- a/globals/refutil/refutil.go +++ b/globals/refutil/refutil.go @@ -69,7 +69,7 @@ func FilterMapByStructObject(mapData map[string]interface{}, obj interface{}, ex invalid[k] = v } } - utils.Map2Struct(m, obj, true, "") + utils.Map2StructByJson(m, obj, true) return valid, invalid } From 15a913dc0a12f5b9e4e0a37a2c99a92db7e933dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E5=B0=B9=E5=B2=9A?= <770236076@qq.com> Date: Mon, 18 Nov 2019 11:08:51 +0800 Subject: [PATCH 04/25] =?UTF-8?q?=E6=B0=B8=E8=BE=89excel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/yonghui/yonghui.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/business/jxstore/yonghui/yonghui.go b/business/jxstore/yonghui/yonghui.go index 536c12c77..c734006a0 100644 --- a/business/jxstore/yonghui/yonghui.go +++ b/business/jxstore/yonghui/yonghui.go @@ -293,7 +293,7 @@ func updateWeiMobGoods(costPrice, salePrice float64, goodsDetail *weimobapi.Good SalePrice: salePrice, CostPrice: costPrice, SkuID: skuListInfo.SkuID, - EditStockNum: 9999 - skuListInfo.EditStockNum, + EditStockNum: 9999 - skuListInfo.AvailableStockNum, OuterSkuCode: skuListInfo.OuterSkuCode, B2CSku: b2CSku, } From a1e834a0bceb16b5024d6b3db93a715309b0aa93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E5=B0=B9=E5=B2=9A?= <770236076@qq.com> Date: Mon, 18 Nov 2019 14:41:56 +0800 Subject: [PATCH 05/25] =?UTF-8?q?=E6=97=B6=E9=97=B4=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/cms/store.go | 4 +++- business/model/dao/dao_utils.go | 12 +++++++++++- globals/refutil/refutil.go | 6 ++++-- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/business/jxstore/cms/store.go b/business/jxstore/cms/store.go index 44205af0a..0e80ac1d2 100644 --- a/business/jxstore/cms/store.go +++ b/business/jxstore/cms/store.go @@ -617,7 +617,9 @@ func UpdateStore(ctx *jxcontext.Context, storeID int, payload map[string]interfa if err = dao.GetEntity(db, store); err != nil { return 0, err } - valid := dao.StrictMakeMapByStructObject(payload, store, userName) + outStore := &model.Store{} + valid := dao.StrictMakeMapByStructObject2(payload, store, outStore, userName) + fmt.Println(outStore) if err = checkStoreDeliveryRange(utils.Interface2String(valid["deliveryRange"])); err != nil { return 0, err } diff --git a/business/model/dao/dao_utils.go b/business/model/dao/dao_utils.go index b45b4386c..736a463c7 100644 --- a/business/model/dao/dao_utils.go +++ b/business/model/dao/dao_utils.go @@ -13,7 +13,7 @@ import ( func IDCULDFilterMapByStructObject(mapData map[string]interface{}, obj interface{}, isCheckValue bool) (valid map[string]interface{}, invalid map[string]interface{}) { // 这里必须用首字母小写,因为是用于访问map,是需要完全匹配的 - return refutil.FilterMapByStructObject(mapData, obj, []string{"id", "createdAt", "updatedAt", "finishedAt", "deletedAt", "syncStatus", "lastOperator"}, isCheckValue) + return refutil.FilterMapByStructObject(mapData, obj, nil, []string{"id", "createdAt", "updatedAt", "finishedAt", "deletedAt", "syncStatus", "lastOperator"}, isCheckValue) } func NormalMakeMapByStructObject(mapData map[string]interface{}, obj interface{}, userName string) (retVal map[string]interface{}) { @@ -26,6 +26,16 @@ func StrictMakeMapByStructObject(mapData map[string]interface{}, obj interface{} return retVal } +func IDCULDFilterMapByStructObject2(mapData map[string]interface{}, obj interface{}, objPtr interface{}, isCheckValue bool) (valid map[string]interface{}, invalid map[string]interface{}) { + return refutil.FilterMapByStructObject(mapData, obj, objPtr, []string{"id", "createdAt", "updatedAt", "finishedAt", "deletedAt", "syncStatus", "lastOperator"}, isCheckValue) +} + +//根据传进来的objPtr去修改它的值 +func StrictMakeMapByStructObject2(mapData map[string]interface{}, obj interface{}, objPtr interface{}, userName string) (retVal map[string]interface{}) { + retVal, _ = IDCULDFilterMapByStructObject2(mapData, obj, objPtr, true) + return retVal +} + func NormalMakeMapByFieldList(mapData map[string]interface{}, fields []string, userName string) (retVal map[string]interface{}) { retVal, _ = refutil.FilterMapByFieldList(mapData, fields) return retVal diff --git a/globals/refutil/refutil.go b/globals/refutil/refutil.go index 23900f2c3..c28475bc2 100644 --- a/globals/refutil/refutil.go +++ b/globals/refutil/refutil.go @@ -53,7 +53,7 @@ func DeSerializeData(strValue string, dataPtr interface{}) (err error) { } // todo 这里看是否需要将key值转换成标准格式(即字母大写),因为beego orm不区分,不转换也可以 -func FilterMapByStructObject(mapData map[string]interface{}, obj interface{}, excludedFields []string, isCheckValue bool) (valid map[string]interface{}, invalid map[string]interface{}) { +func FilterMapByStructObject(mapData map[string]interface{}, obj interface{}, objPtr interface{}, excludedFields []string, isCheckValue bool) (valid map[string]interface{}, invalid map[string]interface{}) { excludedMap := make(map[string]int) for _, v := range excludedFields { excludedMap[v] = 1 @@ -69,7 +69,9 @@ func FilterMapByStructObject(mapData map[string]interface{}, obj interface{}, ex invalid[k] = v } } - utils.Map2StructByJson(m, obj, true) + if objPtr != nil { + utils.Map2StructByJson(m, objPtr, true) + } return valid, invalid } From 2a3a65ff44c161f1335b91f8ef9ae183005f525a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E5=B0=B9=E5=B2=9A?= <770236076@qq.com> Date: Mon, 18 Nov 2019 14:44:34 +0800 Subject: [PATCH 06/25] =?UTF-8?q?=E6=97=B6=E9=97=B4=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/cms/store.go | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/business/jxstore/cms/store.go b/business/jxstore/cms/store.go index f7cac1325..24972b6bd 100644 --- a/business/jxstore/cms/store.go +++ b/business/jxstore/cms/store.go @@ -619,7 +619,6 @@ func UpdateStore(ctx *jxcontext.Context, storeID int, payload map[string]interfa } outStore := &model.Store{} valid := dao.StrictMakeMapByStructObject2(payload, store, outStore, userName) - fmt.Println(outStore) if err = checkStoreDeliveryRange(utils.Interface2String(valid["deliveryRange"])); err != nil { return 0, err } @@ -736,18 +735,18 @@ func UpdateStore(ctx *jxcontext.Context, storeID int, payload map[string]interfa } //时间校验 - if store.OpenTime1 != 0 && store.CloseTime1 != 0 { - if err := ValidateStructPartial(store, "OpenTime1", "CloseTime1"); err != nil { - return 0, errors.New(fmt.Sprintf("门店营业时间1设置不合法!时间范围1 :[%v] 至 [%v]", store.OpenTime1, store.CloseTime1)) + if outStore.OpenTime1 != 0 && outStore.CloseTime1 != 0 { + if err := ValidateStructPartial(outStore, "OpenTime1", "CloseTime1"); err != nil { + return 0, errors.New(fmt.Sprintf("门店营业时间1设置不合法!时间范围1 :[%v] 至 [%v]", outStore.OpenTime1, outStore.CloseTime1)) } } - if store.OpenTime2 != 0 && store.CloseTime2 != 0 { - if err := ValidateStructPartial(store, "OpenTime2", "CloseTime2"); err != nil { - return 0, errors.New(fmt.Sprintf("门店营业时间2设置不合法!时间范围2 :[%v] 至 [%v]", store.OpenTime2, store.CloseTime2)) + if outStore.OpenTime2 != 0 && outStore.CloseTime2 != 0 { + if err := ValidateStructPartial(outStore, "OpenTime2", "CloseTime2"); err != nil { + return 0, errors.New(fmt.Sprintf("门店营业时间2设置不合法!时间范围2 :[%v] 至 [%v]", outStore.OpenTime2, outStore.CloseTime2)) } } - if beginAt, endAt := GetTimeMixByInt(store.OpenTime1, store.CloseTime1, store.OpenTime2, store.CloseTime2); beginAt != 0 && endAt != 0 { - return 0, errors.New(fmt.Sprintf("两段门店营业时间不可交叉!时间范围1 :[%v] 至 [%v], 时间范围2 :[%v] 至 [%v]", store.OpenTime1, store.CloseTime1, store.OpenTime2, store.CloseTime2)) + if beginAt, endAt := GetTimeMixByInt(outStore.OpenTime1, outStore.CloseTime1, outStore.OpenTime2, outStore.CloseTime2); beginAt != 0 && endAt != 0 { + return 0, errors.New(fmt.Sprintf("两段门店营业时间不可交叉!时间范围1 :[%v] 至 [%v], 时间范围2 :[%v] 至 [%v]", outStore.OpenTime1, outStore.CloseTime1, outStore.OpenTime2, outStore.CloseTime2)) } // districtCode := 0 From ba6439b75212b8fa346549a485399a7a93f8c468 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E5=B0=B9=E5=B2=9A?= <770236076@qq.com> Date: Mon, 18 Nov 2019 15:11:45 +0800 Subject: [PATCH 07/25] =?UTF-8?q?=E5=AE=9A=E6=97=B6=E5=95=86=E5=93=81?= =?UTF-8?q?=E5=8F=AF=E5=94=AE=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/cms/sync.go | 6 ++++++ business/jxstore/misc/misc.go | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/business/jxstore/cms/sync.go b/business/jxstore/cms/sync.go index 543c09ca6..7a63d941b 100644 --- a/business/jxstore/cms/sync.go +++ b/business/jxstore/cms/sync.go @@ -670,6 +670,12 @@ func (v *VendorSync) ChangeStoreSkuSaleStatus(ctx *jxcontext.Context, storeID in } vendorIDs := partner.GetPurchasePlatformVendorIDs() dao.UpdateStoreSkuBindSyncStatus(db, vendorIDs, storeID) + if isAsync == false { + isAsync = true + } + if isContinueWhenError == false { + isContinueWhenError = true + } v.SyncStoresSkus(ctx, db, vendorIDs, storeIDs, skuIDs, false, isAsync, isContinueWhenError) return err } diff --git a/business/jxstore/misc/misc.go b/business/jxstore/misc/misc.go index 87e915361..ffbf0b5c0 100644 --- a/business/jxstore/misc/misc.go +++ b/business/jxstore/misc/misc.go @@ -136,7 +136,7 @@ func Init() { } if beego.BConfig.RunMode == "alpha" { ScheduleTimerFunc("ChangeStoreSkuSaleStatus", func() { - cms.CurVendorSync.ChangeStoreSkuSaleStatus(jxcontext.AdminCtx, 0, true, false) + cms.CurVendorSync.ChangeStoreSkuSaleStatus(jxcontext.AdminCtx, 0, true, true) }, ChangeStoreSkuSaleStatusList) } } From c8e1ccb37e789545dc6b365d2abc2c921f82b7a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E5=B0=B9=E5=B2=9A?= <770236076@qq.com> Date: Mon, 18 Nov 2019 16:12:46 +0800 Subject: [PATCH 08/25] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=97=A8=E5=BA=97?= =?UTF-8?q?=E8=90=A5=E4=B8=9A=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/cms/store.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/business/jxstore/cms/store.go b/business/jxstore/cms/store.go index 24972b6bd..833ab3cb0 100644 --- a/business/jxstore/cms/store.go +++ b/business/jxstore/cms/store.go @@ -794,9 +794,12 @@ func UpdateStore(ctx *jxcontext.Context, storeID int, payload map[string]interfa } notifyStoreOperatorChanged(store, valid["operatorPhone"]) if err == nil { + fmt.Println("更新商品可售状态") if valid["openTime1"] != 0 || valid["closeTime1"] != 0 || valid["openTime2"] != 0 || valid["closeTime2"] != 0 { err = CurVendorSync.ChangeStoreSkuSaleStatus(ctx, storeID, true, false) } + } else { + fmt.Println(err) } } } else { From 4e3f9938dd8122956d2ad71f8582c22d763950fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E5=B0=B9=E5=B2=9A?= <770236076@qq.com> Date: Mon, 18 Nov 2019 16:18:19 +0800 Subject: [PATCH 09/25] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=97=A8=E5=BA=97?= =?UTF-8?q?=E8=90=A5=E4=B8=9A=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/cms/store.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/business/jxstore/cms/store.go b/business/jxstore/cms/store.go index 833ab3cb0..3fcc94cc2 100644 --- a/business/jxstore/cms/store.go +++ b/business/jxstore/cms/store.go @@ -794,12 +794,10 @@ func UpdateStore(ctx *jxcontext.Context, storeID int, payload map[string]interfa } notifyStoreOperatorChanged(store, valid["operatorPhone"]) if err == nil { - fmt.Println("更新商品可售状态") if valid["openTime1"] != 0 || valid["closeTime1"] != 0 || valid["openTime2"] != 0 || valid["closeTime2"] != 0 { - err = CurVendorSync.ChangeStoreSkuSaleStatus(ctx, storeID, true, false) + fmt.Println(valid) + err = CurVendorSync.ChangeStoreSkuSaleStatus(ctx, storeID, true, true) } - } else { - fmt.Println(err) } } } else { From 9acd28873d66229ac9a39fb2ea022668a83b2ac6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E5=B0=B9=E5=B2=9A?= <770236076@qq.com> Date: Mon, 18 Nov 2019 16:21:11 +0800 Subject: [PATCH 10/25] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=97=A8=E5=BA=97?= =?UTF-8?q?=E8=90=A5=E4=B8=9A=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/cms/store.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/business/jxstore/cms/store.go b/business/jxstore/cms/store.go index 3fcc94cc2..e358b4704 100644 --- a/business/jxstore/cms/store.go +++ b/business/jxstore/cms/store.go @@ -794,8 +794,9 @@ func UpdateStore(ctx *jxcontext.Context, storeID int, payload map[string]interfa } notifyStoreOperatorChanged(store, valid["operatorPhone"]) if err == nil { + fmt.Println("valid") + fmt.Println(valid) if valid["openTime1"] != 0 || valid["closeTime1"] != 0 || valid["openTime2"] != 0 || valid["closeTime2"] != 0 { - fmt.Println(valid) err = CurVendorSync.ChangeStoreSkuSaleStatus(ctx, storeID, true, true) } } From bd665daa8e09b2b553aa4c308d00f654bbc7bf89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E5=B0=B9=E5=B2=9A?= <770236076@qq.com> Date: Mon, 18 Nov 2019 16:23:08 +0800 Subject: [PATCH 11/25] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=97=A8=E5=BA=97?= =?UTF-8?q?=E8=90=A5=E4=B8=9A=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/cms/store.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/business/jxstore/cms/store.go b/business/jxstore/cms/store.go index e358b4704..7893d72c0 100644 --- a/business/jxstore/cms/store.go +++ b/business/jxstore/cms/store.go @@ -794,8 +794,6 @@ func UpdateStore(ctx *jxcontext.Context, storeID int, payload map[string]interfa } notifyStoreOperatorChanged(store, valid["operatorPhone"]) if err == nil { - fmt.Println("valid") - fmt.Println(valid) if valid["openTime1"] != 0 || valid["closeTime1"] != 0 || valid["openTime2"] != 0 || valid["closeTime2"] != 0 { err = CurVendorSync.ChangeStoreSkuSaleStatus(ctx, storeID, true, true) } From 74dfe6632636e90f7b1279b983c59046c2e4afb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E5=B0=B9=E5=B2=9A?= <770236076@qq.com> Date: Mon, 18 Nov 2019 16:56:18 +0800 Subject: [PATCH 12/25] =?UTF-8?q?=E8=AF=BB=E5=8F=96=E6=B0=B8=E8=BE=89excel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/yonghui/yonghui.go | 18 +++++++++--------- controllers/financial.go | 2 +- controllers/yonghui.go | 7 ++++--- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/business/jxstore/yonghui/yonghui.go b/business/jxstore/yonghui/yonghui.go index c734006a0..7cb40abf9 100644 --- a/business/jxstore/yonghui/yonghui.go +++ b/business/jxstore/yonghui/yonghui.go @@ -84,18 +84,18 @@ const ( UpdateGoodsShelfStatusCount = 50 //微盟下架商品api限制一次50个 ) -func LoadExcelByYongHui(ctx *jxcontext.Context, files []*multipart.FileHeader, isAsync bool) (hint string, err error) { +func LoadExcelByYongHui(ctx *jxcontext.Context, files []*multipart.FileHeader, isAsync, IsContinueWhenError bool) (hint string, err error) { if len(files) == 0 { return "", errors.New("没有文件上传!") } fileHeader := files[0] file, err := fileHeader.Open() - hint, err = LoadExcelBinByYongHui(ctx, file, isAsync) + hint, err = LoadExcelBinByYongHui(ctx, file, true, true) file.Close() return hint, err } -func LoadExcelBinByYongHui(ctx *jxcontext.Context, reader io.Reader, isAsync bool) (hint string, err error) { +func LoadExcelBinByYongHui(ctx *jxcontext.Context, reader io.Reader, isAsync, IsContinueWhenError bool) (hint string, err error) { var ( skuMap = make(map[string]float64) errMsg string @@ -163,13 +163,14 @@ func LoadExcelBinByYongHui(ctx *jxcontext.Context, reader io.Reader, isAsync boo goods := batchItemList[0].(*weimobapi.GoodsInfo) goodsDetail := goods.GoodsDetailInfo spuCode := goodsDetail.OuterGoodsCode + errTmp := "" if spuCode != "" { //如果微盟商品里找得到excel中的商品 if skuMap[spuCode] != 0 { //获取京西库商品 skuList, _ := dao.GetSkus(db, nil, []int{int(utils.Str2Int64(goodsDetail.SkuMap.SingleSku.OuterSkuCode))}, nil, nil) if len(skuList) == 0 { - errMsg += fmt.Sprintf("在京西库中未找到该商品!name_id : [%v] \n", goodsDetail.SkuMap.SingleSku.OuterSkuCode) + errTmp += fmt.Sprintf("在京西库中未找到该商品!name_id : [%v] \n", goodsDetail.SkuMap.SingleSku.OuterSkuCode) } else { if skuList[0].Unit == "份" { if goodsDetail.SkuMap.SingleSku.B2CSku.Weight == 0 { @@ -189,9 +190,12 @@ func LoadExcelBinByYongHui(ctx *jxcontext.Context, reader io.Reader, isAsync boo retVal = []int64{goodsDetail.GoodsID} } } + if err == nil { + return retVal, errors.New(errTmp) + } return retVal, err } - taskParallel3 := tasksch.NewParallelTask("根据获取的微盟所有商品并更新", tasksch.NewParallelConfig().SetParallelCount(parallelCount), ctx, taskFunc3, goodsList) + taskParallel3 := tasksch.NewParallelTask("根据获取的微盟所有商品并更新", tasksch.NewParallelConfig().SetParallelCount(parallelCount).SetIsContinueWhenError(IsContinueWhenError), ctx, taskFunc3, goodsList) tasksch.HandleTask(taskParallel3, task, true).Run() goodsIDListForPutAwayInterface, err2 := taskParallel3.GetResult(0) if err = err2; err != nil { @@ -224,10 +228,6 @@ func LoadExcelBinByYongHui(ctx *jxcontext.Context, reader io.Reader, isAsync boo } else { hint = taskSeq.GetID() } - if errMsg != "" { - baseapi.SugarLogger.Debugf(errMsg) - return "", errors.New(errMsg) - } return hint, err } diff --git a/controllers/financial.go b/controllers/financial.go index 893529fcb..e4eb65fde 100644 --- a/controllers/financial.go +++ b/controllers/financial.go @@ -46,7 +46,7 @@ func (c *FinancialController) SendFilesToStores() { if params.Title != "永辉" { retVal, err = financial.SendFilesToStores(params.Ctx, files, params.Title, params.ShopName, params.IsAsync, params.Ctx.GetUserName()) } else { - retVal, err = yonghui.LoadExcelByYongHui(params.Ctx, files, params.IsAsync) + retVal, err = yonghui.LoadExcelByYongHui(params.Ctx, files, params.IsAsync, true) } return retVal, "", err }) diff --git a/controllers/yonghui.go b/controllers/yonghui.go index d714ea019..99a397640 100644 --- a/controllers/yonghui.go +++ b/controllers/yonghui.go @@ -14,8 +14,9 @@ type YongHuiController struct { // @Title 读取永辉excel文件 // @Description 读取永辉excel文件 -// @Param token header string false "认证token" -// @Param isAsync query bool false "是否异步,缺省是同步" +// @Param token header string false "认证token" +// @Param isAsync query bool true "是否异步,缺省是同步" +// @Param isContinueWhenError query bool true "单个同步失败是否继续,缺省false" // @Success 200 {object} controllers.CallResult // @Failure 200 {object} controllers.CallResult // @router /LoadExcelByYongHui [post,get] @@ -36,7 +37,7 @@ func (c *YongHuiController) LoadExcelByYongHui() { c.callLoadExcelByYongHui(func(params *tYonghuiLoadExcelByYongHuiParams) (retVal interface{}, errCode string, err error) { r := c.Ctx.Request files := r.MultipartForm.File["userfiles"] - retVal, err = yonghui.LoadExcelByYongHui(params.Ctx, files, params.IsAsync) + retVal, err = yonghui.LoadExcelByYongHui(params.Ctx, files, params.IsAsync, params.IsContinueWhenError) return retVal, "", err }) } From bfb3aa5b0ec5906c62b3050099891f45c05a7e0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E5=B0=B9=E5=B2=9A?= <770236076@qq.com> Date: Mon, 18 Nov 2019 17:14:07 +0800 Subject: [PATCH 13/25] =?UTF-8?q?=E8=AF=BB=E5=8F=96=E6=B0=B8=E8=BE=89excel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/yonghui/yonghui.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/business/jxstore/yonghui/yonghui.go b/business/jxstore/yonghui/yonghui.go index 7cb40abf9..6975d4a9c 100644 --- a/business/jxstore/yonghui/yonghui.go +++ b/business/jxstore/yonghui/yonghui.go @@ -151,7 +151,7 @@ func LoadExcelBinByYongHui(ctx *jxcontext.Context, reader io.Reader, isAsync, Is for k, _ := range skuMap { //表示excel上有,微盟上没有 if goodsInfoAndDetailMap[k] == nil { - errMsg += fmt.Sprintf("在微盟上未找到该商品!excel商品ID : [%v]\n", k) + errMsg += fmt.Sprintf("在微盟上未找到该商品!excel商品ID : [%v]", k) } } // if errMsg != "" { @@ -170,7 +170,7 @@ func LoadExcelBinByYongHui(ctx *jxcontext.Context, reader io.Reader, isAsync, Is //获取京西库商品 skuList, _ := dao.GetSkus(db, nil, []int{int(utils.Str2Int64(goodsDetail.SkuMap.SingleSku.OuterSkuCode))}, nil, nil) if len(skuList) == 0 { - errTmp += fmt.Sprintf("在京西库中未找到该商品!name_id : [%v] \n", goodsDetail.SkuMap.SingleSku.OuterSkuCode) + errTmp += fmt.Sprintf("在京西库中未找到该商品!name_id : [%v]", goodsDetail.SkuMap.SingleSku.OuterSkuCode) } else { if skuList[0].Unit == "份" { if goodsDetail.SkuMap.SingleSku.B2CSku.Weight == 0 { @@ -191,7 +191,7 @@ func LoadExcelBinByYongHui(ctx *jxcontext.Context, reader io.Reader, isAsync, Is } } if err == nil { - return retVal, errors.New(errTmp) + return retVal, errors.New(errMsg + errTmp) } return retVal, err } From ac8222c6e1598f9f5377073b1ddb16efafaaac23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E5=B0=B9=E5=B2=9A?= <770236076@qq.com> Date: Mon, 18 Nov 2019 17:26:20 +0800 Subject: [PATCH 14/25] =?UTF-8?q?=E8=AF=BB=E5=8F=96=E6=B0=B8=E8=BE=89excel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/yonghui/yonghui.go | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/business/jxstore/yonghui/yonghui.go b/business/jxstore/yonghui/yonghui.go index 6975d4a9c..060d311ec 100644 --- a/business/jxstore/yonghui/yonghui.go +++ b/business/jxstore/yonghui/yonghui.go @@ -97,11 +97,12 @@ func LoadExcelByYongHui(ctx *jxcontext.Context, files []*multipart.FileHeader, i func LoadExcelBinByYongHui(ctx *jxcontext.Context, reader io.Reader, isAsync, IsContinueWhenError bool) (hint string, err error) { var ( - skuMap = make(map[string]float64) - errMsg string - costPrice float64 //成本价 - goodsList []*weimobapi.GoodsInfo - goodsIDListForPutAway []interface{} + skuMap = make(map[string]float64) + errMsg string + costPrice float64 //成本价 + goodsList []*weimobapi.GoodsInfo + goodsIDListForPutAwayInterface []interface{} + err2 error ) db := dao.GetDB() taskSeqFunc := func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { @@ -191,19 +192,18 @@ func LoadExcelBinByYongHui(ctx *jxcontext.Context, reader io.Reader, isAsync, Is } } if err == nil { - return retVal, errors.New(errMsg + errTmp) + return retVal, errors.New(errTmp) } return retVal, err } taskParallel3 := tasksch.NewParallelTask("根据获取的微盟所有商品并更新", tasksch.NewParallelConfig().SetParallelCount(parallelCount).SetIsContinueWhenError(IsContinueWhenError), ctx, taskFunc3, goodsList) tasksch.HandleTask(taskParallel3, task, true).Run() - goodsIDListForPutAwayInterface, err2 := taskParallel3.GetResult(0) + goodsIDListForPutAwayInterface, err2 = taskParallel3.GetResult(0) if err = err2; err != nil { return "", err } - // 批量下架微盟商品 - goodsIDListForPutAway = goodsIDListForPutAwayInterface case 3: + // 批量下架微盟商品 // if errMsg == "" { taskFunc4 := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { int64Slice := []int64{} @@ -213,11 +213,14 @@ func LoadExcelBinByYongHui(ctx *jxcontext.Context, reader io.Reader, isAsync, Is PutAwayWeiMobSku(int64Slice) return retVal, err } - taskParallel4 := tasksch.NewParallelTask("下架微盟商品", tasksch.NewParallelConfig().SetParallelCount(parallelCount).SetBatchSize(UpdateGoodsShelfStatusCount), ctx, taskFunc4, goodsIDListForPutAway) + taskParallel4 := tasksch.NewParallelTask("下架微盟商品", tasksch.NewParallelConfig().SetParallelCount(parallelCount).SetBatchSize(UpdateGoodsShelfStatusCount), ctx, taskFunc4, goodsIDListForPutAwayInterface) tasksch.HandleTask(taskParallel4, task, true).Run() _, err = taskParallel4.GetResult(0) // } } + if err == nil { + return result, errors.New(errMsg + err2.Error()) + } return result, err } taskSeq := tasksch.NewSeqTask("读取永辉Excel文件修改微盟商品价格可售状态-序列任务", ctx, taskSeqFunc, 4) From 98988e2610486dc76af069d65af3b3b71bed0734 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E5=B0=B9=E5=B2=9A?= <770236076@qq.com> Date: Mon, 18 Nov 2019 17:30:37 +0800 Subject: [PATCH 15/25] =?UTF-8?q?=E8=AF=BB=E5=8F=96=E6=B0=B8=E8=BE=89excel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/yonghui/yonghui.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/business/jxstore/yonghui/yonghui.go b/business/jxstore/yonghui/yonghui.go index 060d311ec..e7fc528cf 100644 --- a/business/jxstore/yonghui/yonghui.go +++ b/business/jxstore/yonghui/yonghui.go @@ -199,8 +199,8 @@ func LoadExcelBinByYongHui(ctx *jxcontext.Context, reader io.Reader, isAsync, Is taskParallel3 := tasksch.NewParallelTask("根据获取的微盟所有商品并更新", tasksch.NewParallelConfig().SetParallelCount(parallelCount).SetIsContinueWhenError(IsContinueWhenError), ctx, taskFunc3, goodsList) tasksch.HandleTask(taskParallel3, task, true).Run() goodsIDListForPutAwayInterface, err2 = taskParallel3.GetResult(0) - if err = err2; err != nil { - return "", err + if err2 != nil { + errMsg += err2.Error() } case 3: // 批量下架微盟商品 @@ -219,7 +219,7 @@ func LoadExcelBinByYongHui(ctx *jxcontext.Context, reader io.Reader, isAsync, Is // } } if err == nil { - return result, errors.New(errMsg + err2.Error()) + return result, errors.New(errMsg) } return result, err } From 4a460c0bc8c0b3bbf6ae908edcc24f943b424aed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E5=B0=B9=E5=B2=9A?= <770236076@qq.com> Date: Mon, 18 Nov 2019 17:37:54 +0800 Subject: [PATCH 16/25] =?UTF-8?q?=E8=AF=BB=E5=8F=96=E6=B0=B8=E8=BE=89excel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/yonghui/yonghui.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/business/jxstore/yonghui/yonghui.go b/business/jxstore/yonghui/yonghui.go index e7fc528cf..3ce7101ec 100644 --- a/business/jxstore/yonghui/yonghui.go +++ b/business/jxstore/yonghui/yonghui.go @@ -218,10 +218,7 @@ func LoadExcelBinByYongHui(ctx *jxcontext.Context, reader io.Reader, isAsync, Is _, err = taskParallel4.GetResult(0) // } } - if err == nil { - return result, errors.New(errMsg) - } - return result, err + return result, errors.New(errMsg) } taskSeq := tasksch.NewSeqTask("读取永辉Excel文件修改微盟商品价格可售状态-序列任务", ctx, taskSeqFunc, 4) tasksch.HandleTask(taskSeq, nil, true).Run() From 4710055072d7bd17ddea1b17cb658dc3406680c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E5=B0=B9=E5=B2=9A?= <770236076@qq.com> Date: Mon, 18 Nov 2019 17:46:02 +0800 Subject: [PATCH 17/25] =?UTF-8?q?=E8=AF=BB=E5=8F=96=E6=B0=B8=E8=BE=89excel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/yonghui/yonghui.go | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/business/jxstore/yonghui/yonghui.go b/business/jxstore/yonghui/yonghui.go index 3ce7101ec..1ed74ef9f 100644 --- a/business/jxstore/yonghui/yonghui.go +++ b/business/jxstore/yonghui/yonghui.go @@ -97,12 +97,11 @@ func LoadExcelByYongHui(ctx *jxcontext.Context, files []*multipart.FileHeader, i func LoadExcelBinByYongHui(ctx *jxcontext.Context, reader io.Reader, isAsync, IsContinueWhenError bool) (hint string, err error) { var ( - skuMap = make(map[string]float64) - errMsg string - costPrice float64 //成本价 - goodsList []*weimobapi.GoodsInfo - goodsIDListForPutAwayInterface []interface{} - err2 error + skuMap = make(map[string]float64) + errMsg string + costPrice float64 //成本价 + goodsList []*weimobapi.GoodsInfo + goodsIDListForPutAway []interface{} ) db := dao.GetDB() taskSeqFunc := func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { @@ -191,17 +190,18 @@ func LoadExcelBinByYongHui(ctx *jxcontext.Context, reader io.Reader, isAsync, Is retVal = []int64{goodsDetail.GoodsID} } } - if err == nil { + if errTmp != "" { return retVal, errors.New(errTmp) } return retVal, err } taskParallel3 := tasksch.NewParallelTask("根据获取的微盟所有商品并更新", tasksch.NewParallelConfig().SetParallelCount(parallelCount).SetIsContinueWhenError(IsContinueWhenError), ctx, taskFunc3, goodsList) tasksch.HandleTask(taskParallel3, task, true).Run() - goodsIDListForPutAwayInterface, err2 = taskParallel3.GetResult(0) - if err2 != nil { - errMsg += err2.Error() + goodsIDListForPutAwayInterface, err2 := taskParallel3.GetResult(0) + if err = err2; err != nil { + return "", err } + goodsIDListForPutAway = goodsIDListForPutAwayInterface case 3: // 批量下架微盟商品 // if errMsg == "" { @@ -213,12 +213,15 @@ func LoadExcelBinByYongHui(ctx *jxcontext.Context, reader io.Reader, isAsync, Is PutAwayWeiMobSku(int64Slice) return retVal, err } - taskParallel4 := tasksch.NewParallelTask("下架微盟商品", tasksch.NewParallelConfig().SetParallelCount(parallelCount).SetBatchSize(UpdateGoodsShelfStatusCount), ctx, taskFunc4, goodsIDListForPutAwayInterface) + taskParallel4 := tasksch.NewParallelTask("下架微盟商品", tasksch.NewParallelConfig().SetParallelCount(parallelCount).SetBatchSize(UpdateGoodsShelfStatusCount), ctx, taskFunc4, goodsIDListForPutAway) tasksch.HandleTask(taskParallel4, task, true).Run() _, err = taskParallel4.GetResult(0) // } } - return result, errors.New(errMsg) + if errMsg != "" { + return result, errors.New(errMsg) + } + return result, err } taskSeq := tasksch.NewSeqTask("读取永辉Excel文件修改微盟商品价格可售状态-序列任务", ctx, taskSeqFunc, 4) tasksch.HandleTask(taskSeq, nil, true).Run() From 2569172477ab771b698e09dca11854d7e46c943d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E5=B0=B9=E5=B2=9A?= <770236076@qq.com> Date: Mon, 18 Nov 2019 17:52:47 +0800 Subject: [PATCH 18/25] =?UTF-8?q?=E8=AF=BB=E5=8F=96=E6=B0=B8=E8=BE=89excel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/yonghui/yonghui.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/business/jxstore/yonghui/yonghui.go b/business/jxstore/yonghui/yonghui.go index 1ed74ef9f..35d4f9568 100644 --- a/business/jxstore/yonghui/yonghui.go +++ b/business/jxstore/yonghui/yonghui.go @@ -121,7 +121,7 @@ func LoadExcelBinByYongHui(ctx *jxcontext.Context, reader io.Reader, isAsync, Is } GetCellIntoMap(sheetParam.SkuIDCol, sheetParam.SkuPriceCol, sheetParam.OrgSkuIdCol, sheetParam.OrgSkuPriceCol, skuMap, row, k, rowNum) if len(skuMap) < 1 { - errMsg += fmt.Sprintf("读取Excel数据失败,Excel格式排版可能发生了变化!sheetName: [%v]", k) + errMsg += fmt.Sprintf("读取Excel数据失败,Excel格式排版可能发生了变化!sheetName: [%v]\n", k) } } if errMsg != "" { @@ -151,7 +151,7 @@ func LoadExcelBinByYongHui(ctx *jxcontext.Context, reader io.Reader, isAsync, Is for k, _ := range skuMap { //表示excel上有,微盟上没有 if goodsInfoAndDetailMap[k] == nil { - errMsg += fmt.Sprintf("在微盟上未找到该商品!excel商品ID : [%v]", k) + errMsg += fmt.Sprintf("在微盟上未找到该商品!excel商品ID : [%v]\n", k) } } // if errMsg != "" { @@ -170,7 +170,7 @@ func LoadExcelBinByYongHui(ctx *jxcontext.Context, reader io.Reader, isAsync, Is //获取京西库商品 skuList, _ := dao.GetSkus(db, nil, []int{int(utils.Str2Int64(goodsDetail.SkuMap.SingleSku.OuterSkuCode))}, nil, nil) if len(skuList) == 0 { - errTmp += fmt.Sprintf("在京西库中未找到该商品!name_id : [%v]", goodsDetail.SkuMap.SingleSku.OuterSkuCode) + errTmp += fmt.Sprintf("在京西库中未找到该商品!name_id : [%v]\n", goodsDetail.SkuMap.SingleSku.OuterSkuCode) } else { if skuList[0].Unit == "份" { if goodsDetail.SkuMap.SingleSku.B2CSku.Weight == 0 { From 07e9f29e5a5fcd792aae09fe2336865403bfddf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E5=B0=B9=E5=B2=9A?= <770236076@qq.com> Date: Mon, 18 Nov 2019 18:19:59 +0800 Subject: [PATCH 19/25] =?UTF-8?q?=E8=AF=BB=E5=8F=96=E6=B0=B8=E8=BE=89excel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/yonghui/yonghui.go | 36 ++++++++++++++++------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/business/jxstore/yonghui/yonghui.go b/business/jxstore/yonghui/yonghui.go index 35d4f9568..1bbb1da35 100644 --- a/business/jxstore/yonghui/yonghui.go +++ b/business/jxstore/yonghui/yonghui.go @@ -146,31 +146,34 @@ func LoadExcelBinByYongHui(ctx *jxcontext.Context, reader io.Reader, isAsync, Is taskParallel2 := tasksch.NewParallelTask("获取微盟商品", tasksch.NewParallelConfig().SetParallelCount(parallelCount), ctx, taskFunc2, goodsList) tasksch.HandleTask(taskParallel2, task, true).Run() _, err = taskParallel2.GetResult(0) + case 2: //找出excel上有,微盟没有的,有就列出报错,不进行更新 goodsInfoAndDetailMap := GetGoodsInfoAndDetailMap(goodsList) - for k, _ := range skuMap { + skuMapList := GetSkuMapList(skuMap) + taskFunc := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + k := batchItemList[0].(string) //表示excel上有,微盟上没有 if goodsInfoAndDetailMap[k] == nil { - errMsg += fmt.Sprintf("在微盟上未找到该商品!excel商品ID : [%v]\n", k) + return "", errors.New(fmt.Sprintf("在微盟上未找到该商品!excel商品ID : [%v]\n", k)) } + return retVal, err } - // if errMsg != "" { - // return "", errors.New(errMsg) - // } - case 2: + taskParallel := tasksch.NewParallelTask("对比Excel上有微盟上没有的商品", tasksch.NewParallelConfig().SetIsContinueWhenError(IsContinueWhenError), ctx, taskFunc, skuMapList) + tasksch.HandleTask(taskParallel, task, true).Run() + _, err = taskParallel.GetResult(0) + case 3: //找出微盟上有,excel上没有的,有就更新,没有就下架 taskFunc3 := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { goods := batchItemList[0].(*weimobapi.GoodsInfo) goodsDetail := goods.GoodsDetailInfo spuCode := goodsDetail.OuterGoodsCode - errTmp := "" if spuCode != "" { //如果微盟商品里找得到excel中的商品 if skuMap[spuCode] != 0 { //获取京西库商品 skuList, _ := dao.GetSkus(db, nil, []int{int(utils.Str2Int64(goodsDetail.SkuMap.SingleSku.OuterSkuCode))}, nil, nil) if len(skuList) == 0 { - errTmp += fmt.Sprintf("在京西库中未找到该商品!name_id : [%v]\n", goodsDetail.SkuMap.SingleSku.OuterSkuCode) + return "", errors.New(fmt.Sprintf("在京西库中未找到该商品!name_id : [%v]\n", goodsDetail.SkuMap.SingleSku.OuterSkuCode)) } else { if skuList[0].Unit == "份" { if goodsDetail.SkuMap.SingleSku.B2CSku.Weight == 0 { @@ -190,9 +193,6 @@ func LoadExcelBinByYongHui(ctx *jxcontext.Context, reader io.Reader, isAsync, Is retVal = []int64{goodsDetail.GoodsID} } } - if errTmp != "" { - return retVal, errors.New(errTmp) - } return retVal, err } taskParallel3 := tasksch.NewParallelTask("根据获取的微盟所有商品并更新", tasksch.NewParallelConfig().SetParallelCount(parallelCount).SetIsContinueWhenError(IsContinueWhenError), ctx, taskFunc3, goodsList) @@ -202,7 +202,7 @@ func LoadExcelBinByYongHui(ctx *jxcontext.Context, reader io.Reader, isAsync, Is return "", err } goodsIDListForPutAway = goodsIDListForPutAwayInterface - case 3: + case 4: // 批量下架微盟商品 // if errMsg == "" { taskFunc4 := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { @@ -218,12 +218,9 @@ func LoadExcelBinByYongHui(ctx *jxcontext.Context, reader io.Reader, isAsync, Is _, err = taskParallel4.GetResult(0) // } } - if errMsg != "" { - return result, errors.New(errMsg) - } return result, err } - taskSeq := tasksch.NewSeqTask("读取永辉Excel文件修改微盟商品价格可售状态-序列任务", ctx, taskSeqFunc, 4) + taskSeq := tasksch.NewSeqTask("读取永辉Excel文件修改微盟商品价格可售状态-序列任务", ctx, taskSeqFunc, 5) tasksch.HandleTask(taskSeq, nil, true).Run() if !isAsync { _, err = taskSeq.GetResult(0) @@ -244,6 +241,13 @@ func PutAwayWeiMobSku(goodsIDListForPutAway []int64) (err error) { return err } +func GetSkuMapList(skuMap map[string]float64) (skuMapList []string) { + for k, _ := range skuMap { + skuMapList = append(skuMapList, k) + } + return skuMapList +} + func GetGoodsInfoAndDetailMap(goodsList []*weimobapi.GoodsInfo) (goodsMap map[string]*weimobapi.GoodsInfo) { goodsMap = make(map[string]*weimobapi.GoodsInfo) for _, v := range goodsList { From 469332db88a74ceec32352c8dd9b9bd49213fc94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E5=B0=B9=E5=B2=9A?= <770236076@qq.com> Date: Mon, 18 Nov 2019 18:40:57 +0800 Subject: [PATCH 20/25] =?UTF-8?q?=E8=AF=BB=E5=8F=96=E6=B0=B8=E8=BE=89excel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/yonghui/yonghui.go | 216 +++++++++++++--------------- 1 file changed, 97 insertions(+), 119 deletions(-) diff --git a/business/jxstore/yonghui/yonghui.go b/business/jxstore/yonghui/yonghui.go index 1bbb1da35..a32ab5727 100644 --- a/business/jxstore/yonghui/yonghui.go +++ b/business/jxstore/yonghui/yonghui.go @@ -104,130 +104,108 @@ func LoadExcelBinByYongHui(ctx *jxcontext.Context, reader io.Reader, isAsync, Is goodsIDListForPutAway []interface{} ) db := dao.GetDB() - taskSeqFunc := func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { - switch step { - case 0: - //读取excel文件 - xlsx, err := excelize.OpenReader(reader) - if err != nil { - return "", err + + //读取excel文件 + xlsx, err := excelize.OpenReader(reader) + if err != nil { + return "", err + } + for k := range sheetMap { + sheetParam := sheetMap[k] + rows, _ := xlsx.GetRows(k) + for rowNum, row := range rows { + if rowNum < sheetParam.SkuRow { + continue } - for k := range sheetMap { - sheetParam := sheetMap[k] - rows, _ := xlsx.GetRows(k) - for rowNum, row := range rows { - if rowNum < sheetParam.SkuRow { - continue - } - GetCellIntoMap(sheetParam.SkuIDCol, sheetParam.SkuPriceCol, sheetParam.OrgSkuIdCol, sheetParam.OrgSkuPriceCol, skuMap, row, k, rowNum) - if len(skuMap) < 1 { - errMsg += fmt.Sprintf("读取Excel数据失败,Excel格式排版可能发生了变化!sheetName: [%v]\n", k) - } - } - if errMsg != "" { - return "", errors.New(errMsg) - } + GetCellIntoMap(sheetParam.SkuIDCol, sheetParam.SkuPriceCol, sheetParam.OrgSkuIdCol, sheetParam.OrgSkuPriceCol, skuMap, row, k, rowNum) + if len(skuMap) < 1 { + errMsg += fmt.Sprintf("读取Excel数据失败,Excel格式排版可能发生了变化!sheetName: [%v]\n", k) } - case 1: - //获取微盟所有商品 - goodsList, err = GetWeiMobGoodsList() - if err != nil { - baseapi.SugarLogger.Errorf("GetWeiMobGoodsList error:%v", err) - } - taskFunc2 := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - v := batchItemList[0].(*weimobapi.GoodsInfo) - goodsDetail, err := api.WeimobAPI.QueryGoodsDetail(v.GoodsID) - if err != nil { - baseapi.SugarLogger.Errorf("QueryGoodsDetail error:%v", err) - } - v.GoodsDetailInfo = goodsDetail - return retVal, err - } - taskParallel2 := tasksch.NewParallelTask("获取微盟商品", tasksch.NewParallelConfig().SetParallelCount(parallelCount), ctx, taskFunc2, goodsList) - tasksch.HandleTask(taskParallel2, task, true).Run() - _, err = taskParallel2.GetResult(0) - case 2: - //找出excel上有,微盟没有的,有就列出报错,不进行更新 - goodsInfoAndDetailMap := GetGoodsInfoAndDetailMap(goodsList) - skuMapList := GetSkuMapList(skuMap) - taskFunc := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - k := batchItemList[0].(string) - //表示excel上有,微盟上没有 - if goodsInfoAndDetailMap[k] == nil { - return "", errors.New(fmt.Sprintf("在微盟上未找到该商品!excel商品ID : [%v]\n", k)) - } - return retVal, err - } - taskParallel := tasksch.NewParallelTask("对比Excel上有微盟上没有的商品", tasksch.NewParallelConfig().SetIsContinueWhenError(IsContinueWhenError), ctx, taskFunc, skuMapList) - tasksch.HandleTask(taskParallel, task, true).Run() - _, err = taskParallel.GetResult(0) - case 3: - //找出微盟上有,excel上没有的,有就更新,没有就下架 - taskFunc3 := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - goods := batchItemList[0].(*weimobapi.GoodsInfo) - goodsDetail := goods.GoodsDetailInfo - spuCode := goodsDetail.OuterGoodsCode - if spuCode != "" { - //如果微盟商品里找得到excel中的商品 - if skuMap[spuCode] != 0 { - //获取京西库商品 - skuList, _ := dao.GetSkus(db, nil, []int{int(utils.Str2Int64(goodsDetail.SkuMap.SingleSku.OuterSkuCode))}, nil, nil) - if len(skuList) == 0 { - return "", errors.New(fmt.Sprintf("在京西库中未找到该商品!name_id : [%v]\n", goodsDetail.SkuMap.SingleSku.OuterSkuCode)) - } else { - if skuList[0].Unit == "份" { - if goodsDetail.SkuMap.SingleSku.B2CSku.Weight == 0 { - costPrice = skuMap[spuCode] - } else { - costPrice = Float64Round(0.5 / goodsDetail.SkuMap.SingleSku.B2CSku.Weight * skuMap[spuCode]) - } - } else { - costPrice = skuMap[spuCode] - } - // if errMsg == "" { - _, _, err = updateWeiMobGoods(costPrice, skuMap[spuCode], goodsDetail) - // } - } - } else { - //下架微盟商品 - retVal = []int64{goodsDetail.GoodsID} - } - } - return retVal, err - } - taskParallel3 := tasksch.NewParallelTask("根据获取的微盟所有商品并更新", tasksch.NewParallelConfig().SetParallelCount(parallelCount).SetIsContinueWhenError(IsContinueWhenError), ctx, taskFunc3, goodsList) - tasksch.HandleTask(taskParallel3, task, true).Run() - goodsIDListForPutAwayInterface, err2 := taskParallel3.GetResult(0) - if err = err2; err != nil { - return "", err - } - goodsIDListForPutAway = goodsIDListForPutAwayInterface - case 4: - // 批量下架微盟商品 - // if errMsg == "" { - taskFunc4 := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - int64Slice := []int64{} - for _, v := range batchItemList { - int64Slice = append(int64Slice, v.(int64)) - } - PutAwayWeiMobSku(int64Slice) - return retVal, err - } - taskParallel4 := tasksch.NewParallelTask("下架微盟商品", tasksch.NewParallelConfig().SetParallelCount(parallelCount).SetBatchSize(UpdateGoodsShelfStatusCount), ctx, taskFunc4, goodsIDListForPutAway) - tasksch.HandleTask(taskParallel4, task, true).Run() - _, err = taskParallel4.GetResult(0) - // } } - return result, err + if errMsg != "" { + return "", errors.New(errMsg) + } } - taskSeq := tasksch.NewSeqTask("读取永辉Excel文件修改微盟商品价格可售状态-序列任务", ctx, taskSeqFunc, 5) - tasksch.HandleTask(taskSeq, nil, true).Run() - if !isAsync { - _, err = taskSeq.GetResult(0) - hint = "1" - } else { - hint = taskSeq.GetID() + + //获取微盟所有商品 + goodsList, err = GetWeiMobGoodsList() + if err != nil { + baseapi.SugarLogger.Errorf("GetWeiMobGoodsList error:%v", err) } + task := tasksch.NewParallelTask("获取微盟商品", tasksch.NewParallelConfig().SetIsContinueWhenError(IsContinueWhenError), ctx, + func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + v := batchItemList[0].(*weimobapi.GoodsInfo) + goodsDetail, err := api.WeimobAPI.QueryGoodsDetail(v.GoodsID) + if err != nil { + baseapi.SugarLogger.Errorf("QueryGoodsDetail error:%v", err) + } + v.GoodsDetailInfo = goodsDetail + return retVal, err + }, goodsList) + tasksch.HandleTask(task, nil, true).Run() + + //找出excel上有,微盟没有的,有就列出报错,不进行更新 + goodsInfoAndDetailMap := GetGoodsInfoAndDetailMap(goodsList) + skuMapList := GetSkuMapList(skuMap) + task1 := tasksch.NewParallelTask("对比Excel上有微盟上没有的商品", tasksch.NewParallelConfig().SetIsContinueWhenError(IsContinueWhenError), ctx, + func(task1 *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + k := batchItemList[0].(string) + //表示excel上有,微盟上没有 + if goodsInfoAndDetailMap[k] == nil { + return "", errors.New(fmt.Sprintf("在微盟上未找到该商品!excel商品ID : [%v]\n", k)) + } + return retVal, err + }, skuMapList) + tasksch.HandleTask(task1, nil, true).Run() + + //找出微盟上有,excel上没有的,有就更新,没有就下架 + task2 := tasksch.NewParallelTask("根据获取的微盟所有商品并更新", tasksch.NewParallelConfig().SetIsContinueWhenError(IsContinueWhenError), ctx, + func(task1 *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + goods := batchItemList[0].(*weimobapi.GoodsInfo) + goodsDetail := goods.GoodsDetailInfo + spuCode := goodsDetail.OuterGoodsCode + if spuCode != "" { + //如果微盟商品里找得到excel中的商品 + if skuMap[spuCode] != 0 { + //获取京西库商品 + skuList, _ := dao.GetSkus(db, nil, []int{int(utils.Str2Int64(goodsDetail.SkuMap.SingleSku.OuterSkuCode))}, nil, nil) + if len(skuList) == 0 { + return "", errors.New(fmt.Sprintf("在京西库中未找到该商品!name_id : [%v]\n", goodsDetail.SkuMap.SingleSku.OuterSkuCode)) + } else { + if skuList[0].Unit == "份" { + if goodsDetail.SkuMap.SingleSku.B2CSku.Weight == 0 { + costPrice = skuMap[spuCode] + } else { + costPrice = Float64Round(0.5 / goodsDetail.SkuMap.SingleSku.B2CSku.Weight * skuMap[spuCode]) + } + } else { + costPrice = skuMap[spuCode] + } + // if errMsg == "" { + _, _, err = updateWeiMobGoods(costPrice, skuMap[spuCode], goodsDetail) + // } + } + } else { + //下架微盟商品 + retVal = []int64{goodsDetail.GoodsID} + } + } + return retVal, err + }, goodsList) + tasksch.HandleTask(task2, nil, true).Run() + goodsIDListForPutAwayInterface, err := task2.GetResult(0) + goodsIDListForPutAway = goodsIDListForPutAwayInterface + // 批量下架微盟商品 + task3 := tasksch.NewParallelTask("下架微盟商品", tasksch.NewParallelConfig().SetIsContinueWhenError(IsContinueWhenError), ctx, + func(task1 *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + int64Slice := []int64{} + for _, v := range batchItemList { + int64Slice = append(int64Slice, v.(int64)) + } + PutAwayWeiMobSku(int64Slice) + return retVal, err + }, goodsIDListForPutAway) + tasksch.HandleTask(task3, nil, true).Run() return hint, err } From 4dfe0dc64fb20a4eaaab09cba1cde290b3079d0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E5=B0=B9=E5=B2=9A?= <770236076@qq.com> Date: Mon, 18 Nov 2019 19:01:12 +0800 Subject: [PATCH 21/25] =?UTF-8?q?=E8=AF=BB=E5=8F=96=E6=B0=B8=E8=BE=89excel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/yonghui/yonghui.go | 228 +++++++++++++++------------- 1 file changed, 123 insertions(+), 105 deletions(-) diff --git a/business/jxstore/yonghui/yonghui.go b/business/jxstore/yonghui/yonghui.go index a32ab5727..5e0c80c37 100644 --- a/business/jxstore/yonghui/yonghui.go +++ b/business/jxstore/yonghui/yonghui.go @@ -84,7 +84,7 @@ const ( UpdateGoodsShelfStatusCount = 50 //微盟下架商品api限制一次50个 ) -func LoadExcelByYongHui(ctx *jxcontext.Context, files []*multipart.FileHeader, isAsync, IsContinueWhenError bool) (hint string, err error) { +func LoadExcelByYongHui(ctx *jxcontext.Context, files []*multipart.FileHeader, isAsync, isContinueWhenError bool) (hint string, err error) { if len(files) == 0 { return "", errors.New("没有文件上传!") } @@ -95,7 +95,7 @@ func LoadExcelByYongHui(ctx *jxcontext.Context, files []*multipart.FileHeader, i return hint, err } -func LoadExcelBinByYongHui(ctx *jxcontext.Context, reader io.Reader, isAsync, IsContinueWhenError bool) (hint string, err error) { +func LoadExcelBinByYongHui(ctx *jxcontext.Context, reader io.Reader, isAsync, isContinueWhenError bool) (hint string, err error) { var ( skuMap = make(map[string]float64) errMsg string @@ -104,108 +104,133 @@ func LoadExcelBinByYongHui(ctx *jxcontext.Context, reader io.Reader, isAsync, Is goodsIDListForPutAway []interface{} ) db := dao.GetDB() - - //读取excel文件 - xlsx, err := excelize.OpenReader(reader) - if err != nil { - return "", err - } - for k := range sheetMap { - sheetParam := sheetMap[k] - rows, _ := xlsx.GetRows(k) - for rowNum, row := range rows { - if rowNum < sheetParam.SkuRow { - continue - } - GetCellIntoMap(sheetParam.SkuIDCol, sheetParam.SkuPriceCol, sheetParam.OrgSkuIdCol, sheetParam.OrgSkuPriceCol, skuMap, row, k, rowNum) - if len(skuMap) < 1 { - errMsg += fmt.Sprintf("读取Excel数据失败,Excel格式排版可能发生了变化!sheetName: [%v]\n", k) - } - } - if errMsg != "" { - return "", errors.New(errMsg) - } - } - - //获取微盟所有商品 - goodsList, err = GetWeiMobGoodsList() - if err != nil { - baseapi.SugarLogger.Errorf("GetWeiMobGoodsList error:%v", err) - } - task := tasksch.NewParallelTask("获取微盟商品", tasksch.NewParallelConfig().SetIsContinueWhenError(IsContinueWhenError), ctx, - func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - v := batchItemList[0].(*weimobapi.GoodsInfo) - goodsDetail, err := api.WeimobAPI.QueryGoodsDetail(v.GoodsID) + taskSeqFunc := func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { + switch step { + case 0: + //读取excel文件 + xlsx, err := excelize.OpenReader(reader) if err != nil { - baseapi.SugarLogger.Errorf("QueryGoodsDetail error:%v", err) + return "", err } - v.GoodsDetailInfo = goodsDetail - return retVal, err - }, goodsList) - tasksch.HandleTask(task, nil, true).Run() - - //找出excel上有,微盟没有的,有就列出报错,不进行更新 - goodsInfoAndDetailMap := GetGoodsInfoAndDetailMap(goodsList) - skuMapList := GetSkuMapList(skuMap) - task1 := tasksch.NewParallelTask("对比Excel上有微盟上没有的商品", tasksch.NewParallelConfig().SetIsContinueWhenError(IsContinueWhenError), ctx, - func(task1 *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - k := batchItemList[0].(string) - //表示excel上有,微盟上没有 - if goodsInfoAndDetailMap[k] == nil { - return "", errors.New(fmt.Sprintf("在微盟上未找到该商品!excel商品ID : [%v]\n", k)) - } - return retVal, err - }, skuMapList) - tasksch.HandleTask(task1, nil, true).Run() - - //找出微盟上有,excel上没有的,有就更新,没有就下架 - task2 := tasksch.NewParallelTask("根据获取的微盟所有商品并更新", tasksch.NewParallelConfig().SetIsContinueWhenError(IsContinueWhenError), ctx, - func(task1 *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - goods := batchItemList[0].(*weimobapi.GoodsInfo) - goodsDetail := goods.GoodsDetailInfo - spuCode := goodsDetail.OuterGoodsCode - if spuCode != "" { - //如果微盟商品里找得到excel中的商品 - if skuMap[spuCode] != 0 { - //获取京西库商品 - skuList, _ := dao.GetSkus(db, nil, []int{int(utils.Str2Int64(goodsDetail.SkuMap.SingleSku.OuterSkuCode))}, nil, nil) - if len(skuList) == 0 { - return "", errors.New(fmt.Sprintf("在京西库中未找到该商品!name_id : [%v]\n", goodsDetail.SkuMap.SingleSku.OuterSkuCode)) - } else { - if skuList[0].Unit == "份" { - if goodsDetail.SkuMap.SingleSku.B2CSku.Weight == 0 { - costPrice = skuMap[spuCode] - } else { - costPrice = Float64Round(0.5 / goodsDetail.SkuMap.SingleSku.B2CSku.Weight * skuMap[spuCode]) - } - } else { - costPrice = skuMap[spuCode] - } - // if errMsg == "" { - _, _, err = updateWeiMobGoods(costPrice, skuMap[spuCode], goodsDetail) - // } + for k := range sheetMap { + sheetParam := sheetMap[k] + rows, _ := xlsx.GetRows(k) + for rowNum, row := range rows { + if rowNum < sheetParam.SkuRow { + continue } - } else { - //下架微盟商品 - retVal = []int64{goodsDetail.GoodsID} + GetCellIntoMap(sheetParam.SkuIDCol, sheetParam.SkuPriceCol, sheetParam.OrgSkuIdCol, sheetParam.OrgSkuPriceCol, skuMap, row, k, rowNum) + if len(skuMap) < 1 { + errMsg += fmt.Sprintf("读取Excel数据失败,Excel格式排版可能发生了变化!sheetName: [%v]\n", k) + } + } + if errMsg != "" { + return "", errors.New(errMsg) } } - return retVal, err - }, goodsList) - tasksch.HandleTask(task2, nil, true).Run() - goodsIDListForPutAwayInterface, err := task2.GetResult(0) - goodsIDListForPutAway = goodsIDListForPutAwayInterface - // 批量下架微盟商品 - task3 := tasksch.NewParallelTask("下架微盟商品", tasksch.NewParallelConfig().SetIsContinueWhenError(IsContinueWhenError), ctx, - func(task1 *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - int64Slice := []int64{} - for _, v := range batchItemList { - int64Slice = append(int64Slice, v.(int64)) + case 1: + //获取微盟所有商品 + goodsList, err = GetWeiMobGoodsList() + if err != nil { + baseapi.SugarLogger.Errorf("GetWeiMobGoodsList error:%v", err) } - PutAwayWeiMobSku(int64Slice) - return retVal, err - }, goodsIDListForPutAway) - tasksch.HandleTask(task3, nil, true).Run() + taskFunc2 := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + v := batchItemList[0].(*weimobapi.GoodsInfo) + goodsDetail, err := api.WeimobAPI.QueryGoodsDetail(v.GoodsID) + if err != nil { + baseapi.SugarLogger.Errorf("QueryGoodsDetail error:%v", err) + } + v.GoodsDetailInfo = goodsDetail + return retVal, err + } + taskParallel2 := tasksch.NewParallelTask("获取微盟商品", tasksch.NewParallelConfig().SetParallelCount(parallelCount), ctx, taskFunc2, goodsList) + tasksch.HandleTask(taskParallel2, task, true).Run() + _, err = taskParallel2.GetResult(0) + //找出excel上有,微盟没有的,有就列出报错,不进行更新 + goodsInfoAndDetailMap := GetGoodsInfoAndDetailMap(goodsList) + for k, _ := range skuMap { + //表示excel上有,微盟上没有 + if goodsInfoAndDetailMap[k] == nil { + errMsg += fmt.Sprintf("在微盟上未找到该商品!excel商品ID : [%v]\n", k) + } + } + // if errMsg != "" { + // return "", errors.New(errMsg) + // } + case 2: + //找出微盟上有,excel上没有的,有就更新,没有就下架 + taskFunc3 := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + goods := batchItemList[0].(*weimobapi.GoodsInfo) + goodsDetail := goods.GoodsDetailInfo + spuCode := goodsDetail.OuterGoodsCode + errTmp := "" + if spuCode != "" { + //如果微盟商品里找得到excel中的商品 + if skuMap[spuCode] != 0 { + //获取京西库商品 + skuList, _ := dao.GetSkus(db, nil, []int{int(utils.Str2Int64(goodsDetail.SkuMap.SingleSku.OuterSkuCode))}, nil, nil) + if len(skuList) == 0 { + errTmp += fmt.Sprintf("在京西库中未找到该商品!name_id : [%v]\n", goodsDetail.SkuMap.SingleSku.OuterSkuCode) + } else { + if skuList[0].Unit == "份" { + if goodsDetail.SkuMap.SingleSku.B2CSku.Weight == 0 { + costPrice = skuMap[spuCode] + } else { + costPrice = Float64Round(0.5 / goodsDetail.SkuMap.SingleSku.B2CSku.Weight * skuMap[spuCode]) + } + } else { + costPrice = skuMap[spuCode] + } + // if errMsg == "" { + _, _, err = updateWeiMobGoods(costPrice, skuMap[spuCode], goodsDetail) + // } + } + } else { + //下架微盟商品 + retVal = []int64{goodsDetail.GoodsID} + } + } + if errTmp != "" { + return retVal, errors.New(errTmp) + } + return retVal, err + } + taskParallel3 := tasksch.NewParallelTask("根据获取的微盟所有商品并更新", tasksch.NewParallelConfig().SetParallelCount(parallelCount), ctx, taskFunc3, goodsList) + tasksch.HandleTask(taskParallel3, task, true).Run() + goodsIDListForPutAwayInterface, err2 := taskParallel3.GetResult(0) + if err = err2; err != nil { + return "", err + } + goodsIDListForPutAway = goodsIDListForPutAwayInterface + case 3: + // 批量下架微盟商品 + // if errMsg == "" { + taskFunc4 := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + int64Slice := []int64{} + for _, v := range batchItemList { + int64Slice = append(int64Slice, v.(int64)) + } + PutAwayWeiMobSku(int64Slice) + return retVal, err + } + taskParallel4 := tasksch.NewParallelTask("下架微盟商品", tasksch.NewParallelConfig().SetParallelCount(parallelCount).SetBatchSize(UpdateGoodsShelfStatusCount), ctx, taskFunc4, goodsIDListForPutAway) + tasksch.HandleTask(taskParallel4, task, true).Run() + _, err = taskParallel4.GetResult(0) + // } + } + if errMsg != "" { + return result, errors.New(errMsg) + } + return result, err + } + taskSeq := tasksch.NewSeqTask2("读取永辉Excel文件修改微盟商品价格可售状态-序列任务", ctx, isContinueWhenError, taskSeqFunc, 4) + tasksch.HandleTask(taskSeq, nil, true).Run() + if !isAsync { + _, err = taskSeq.GetResult(0) + hint = "1" + } else { + hint = taskSeq.GetID() + } return hint, err } @@ -219,13 +244,6 @@ func PutAwayWeiMobSku(goodsIDListForPutAway []int64) (err error) { return err } -func GetSkuMapList(skuMap map[string]float64) (skuMapList []string) { - for k, _ := range skuMap { - skuMapList = append(skuMapList, k) - } - return skuMapList -} - func GetGoodsInfoAndDetailMap(goodsList []*weimobapi.GoodsInfo) (goodsMap map[string]*weimobapi.GoodsInfo) { goodsMap = make(map[string]*weimobapi.GoodsInfo) for _, v := range goodsList { From 5b66fdfaa4e99796794ae203a5873bddfde1a7bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E5=B0=B9=E5=B2=9A?= <770236076@qq.com> Date: Mon, 18 Nov 2019 19:07:38 +0800 Subject: [PATCH 22/25] =?UTF-8?q?=E8=AF=BB=E5=8F=96=E6=B0=B8=E8=BE=89excel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/yonghui/yonghui.go | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/business/jxstore/yonghui/yonghui.go b/business/jxstore/yonghui/yonghui.go index 5e0c80c37..ecf29d9ac 100644 --- a/business/jxstore/yonghui/yonghui.go +++ b/business/jxstore/yonghui/yonghui.go @@ -163,14 +163,13 @@ func LoadExcelBinByYongHui(ctx *jxcontext.Context, reader io.Reader, isAsync, is goods := batchItemList[0].(*weimobapi.GoodsInfo) goodsDetail := goods.GoodsDetailInfo spuCode := goodsDetail.OuterGoodsCode - errTmp := "" if spuCode != "" { //如果微盟商品里找得到excel中的商品 if skuMap[spuCode] != 0 { //获取京西库商品 skuList, _ := dao.GetSkus(db, nil, []int{int(utils.Str2Int64(goodsDetail.SkuMap.SingleSku.OuterSkuCode))}, nil, nil) if len(skuList) == 0 { - errTmp += fmt.Sprintf("在京西库中未找到该商品!name_id : [%v]\n", goodsDetail.SkuMap.SingleSku.OuterSkuCode) + return "", errors.New(fmt.Sprintf("在京西库中未找到该商品!name_id : [%v]\n", goodsDetail.SkuMap.SingleSku.OuterSkuCode)) } else { if skuList[0].Unit == "份" { if goodsDetail.SkuMap.SingleSku.B2CSku.Weight == 0 { @@ -190,12 +189,9 @@ func LoadExcelBinByYongHui(ctx *jxcontext.Context, reader io.Reader, isAsync, is retVal = []int64{goodsDetail.GoodsID} } } - if errTmp != "" { - return retVal, errors.New(errTmp) - } return retVal, err } - taskParallel3 := tasksch.NewParallelTask("根据获取的微盟所有商品并更新", tasksch.NewParallelConfig().SetParallelCount(parallelCount), ctx, taskFunc3, goodsList) + taskParallel3 := tasksch.NewParallelTask("根据获取的微盟所有商品并更新", tasksch.NewParallelConfig().SetParallelCount(parallelCount).SetIsContinueWhenError(isContinueWhenError), ctx, taskFunc3, goodsList) tasksch.HandleTask(taskParallel3, task, true).Run() goodsIDListForPutAwayInterface, err2 := taskParallel3.GetResult(0) if err = err2; err != nil { From a939076b8b363ef45ac6dc9c055857fc79be3f03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E5=B0=B9=E5=B2=9A?= <770236076@qq.com> Date: Tue, 19 Nov 2019 08:56:38 +0800 Subject: [PATCH 23/25] =?UTF-8?q?=E4=B8=8B=E6=9E=B6=E5=BE=AE=E7=9B=9F?= =?UTF-8?q?=E5=95=86=E5=93=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/yonghui/yonghui.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/business/jxstore/yonghui/yonghui.go b/business/jxstore/yonghui/yonghui.go index ecf29d9ac..724bb5e14 100644 --- a/business/jxstore/yonghui/yonghui.go +++ b/business/jxstore/yonghui/yonghui.go @@ -232,7 +232,7 @@ func LoadExcelBinByYongHui(ctx *jxcontext.Context, reader io.Reader, isAsync, is func PutAwayWeiMobSku(goodsIDListForPutAway []int64) (err error) { if globals.EnableStoreWrite { - // err = api.WeimobAPI.UpdateGoodsShelfStatus(goodsIDListForPutAway, false) + err = api.WeimobAPI.UpdateGoodsShelfStatus(goodsIDListForPutAway, false) } if err != nil { baseapi.SugarLogger.Errorf("UpdateGoodsShelfStatus error:%v", err) From 34047548ed4184d38ca27d991a9dbdcb3f220a5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E5=B0=B9=E5=B2=9A?= <770236076@qq.com> Date: Tue, 19 Nov 2019 15:55:20 +0800 Subject: [PATCH 24/25] =?UTF-8?q?=E6=97=B6=E9=97=B4=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/cms/store.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/business/jxstore/cms/store.go b/business/jxstore/cms/store.go index 7893d72c0..9421f148c 100644 --- a/business/jxstore/cms/store.go +++ b/business/jxstore/cms/store.go @@ -740,11 +740,20 @@ func UpdateStore(ctx *jxcontext.Context, storeID int, payload map[string]interfa return 0, errors.New(fmt.Sprintf("门店营业时间1设置不合法!时间范围1 :[%v] 至 [%v]", outStore.OpenTime1, outStore.CloseTime1)) } } + if (outStore.OpenTime1 == 0 && outStore.CloseTime1 != 0) || (outStore.OpenTime1 != 0 && outStore.CloseTime1 == 0) { + return 0, errors.New(fmt.Sprintf("门店营业时间1设置不合法!时间范围1 :[%v] 至 [%v]", outStore.OpenTime1, outStore.CloseTime1)) + } if outStore.OpenTime2 != 0 && outStore.CloseTime2 != 0 { if err := ValidateStructPartial(outStore, "OpenTime2", "CloseTime2"); err != nil { return 0, errors.New(fmt.Sprintf("门店营业时间2设置不合法!时间范围2 :[%v] 至 [%v]", outStore.OpenTime2, outStore.CloseTime2)) } } + if (outStore.OpenTime2 == 0 && outStore.CloseTime2 != 0) || (outStore.OpenTime2 != 0 && outStore.CloseTime2 == 0) { + return 0, errors.New(fmt.Sprintf("门店营业时间2设置不合法!时间范围2 :[%v] 至 [%v]", outStore.OpenTime1, outStore.CloseTime1)) + } + if outStore.OpenTime2 > outStore.OpenTime1 { + return 0, errors.New(fmt.Sprintf("门店营业时间设置不合法!第二段营业时间应该在第一段营业时间之后!")) + } if beginAt, endAt := GetTimeMixByInt(outStore.OpenTime1, outStore.CloseTime1, outStore.OpenTime2, outStore.CloseTime2); beginAt != 0 && endAt != 0 { return 0, errors.New(fmt.Sprintf("两段门店营业时间不可交叉!时间范围1 :[%v] 至 [%v], 时间范围2 :[%v] 至 [%v]", outStore.OpenTime1, outStore.CloseTime1, outStore.OpenTime2, outStore.CloseTime2)) } From b6dced6a3cd6bd8301d50dc2c26b26a5887c62bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E5=B0=B9=E5=B2=9A?= <770236076@qq.com> Date: Wed, 20 Nov 2019 09:55:30 +0800 Subject: [PATCH 25/25] =?UTF-8?q?=E6=97=B6=E9=97=B4=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/cms/store.go | 4 ++-- business/jxstore/cms/sync.go | 6 ------ 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/business/jxstore/cms/store.go b/business/jxstore/cms/store.go index 9421f148c..1d894e076 100644 --- a/business/jxstore/cms/store.go +++ b/business/jxstore/cms/store.go @@ -617,8 +617,8 @@ func UpdateStore(ctx *jxcontext.Context, storeID int, payload map[string]interfa if err = dao.GetEntity(db, store); err != nil { return 0, err } - outStore := &model.Store{} - valid := dao.StrictMakeMapByStructObject2(payload, store, outStore, userName) + var outStore *model.Store + valid := dao.StrictMakeMapByStructObject2(payload, store, &outStore, userName) if err = checkStoreDeliveryRange(utils.Interface2String(valid["deliveryRange"])); err != nil { return 0, err } diff --git a/business/jxstore/cms/sync.go b/business/jxstore/cms/sync.go index 7a63d941b..543c09ca6 100644 --- a/business/jxstore/cms/sync.go +++ b/business/jxstore/cms/sync.go @@ -670,12 +670,6 @@ func (v *VendorSync) ChangeStoreSkuSaleStatus(ctx *jxcontext.Context, storeID in } vendorIDs := partner.GetPurchasePlatformVendorIDs() dao.UpdateStoreSkuBindSyncStatus(db, vendorIDs, storeID) - if isAsync == false { - isAsync = true - } - if isContinueWhenError == false { - isContinueWhenError = true - } v.SyncStoresSkus(ctx, db, vendorIDs, storeIDs, skuIDs, false, isAsync, isContinueWhenError) return err }