From b6c60c2cc32576cf2b0a80052d2f06e90c4a3fea Mon Sep 17 00:00:00 2001 From: gazebo Date: Wed, 24 Apr 2019 14:21:43 +0800 Subject: [PATCH 01/47] =?UTF-8?q?-=20refresh=20token=E7=9A=84=E6=97=B6?= =?UTF-8?q?=E5=80=99=E8=A6=81=E5=88=A4=E6=96=AD=E7=9B=B8=E5=BA=94API?= =?UTF-8?q?=E6=98=AF=E5=90=A6=E5=AD=98=E5=9C=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxutils/tasks/configrefresh.go | 119 +++++++++++++----------- 1 file changed, 64 insertions(+), 55 deletions(-) diff --git a/business/jxutils/tasks/configrefresh.go b/business/jxutils/tasks/configrefresh.go index 025dac7a7..aa4b9ba76 100644 --- a/business/jxutils/tasks/configrefresh.go +++ b/business/jxutils/tasks/configrefresh.go @@ -106,67 +106,76 @@ func RefreshConfig(configKey string, expiresTime time.Duration, configGetter fun return err } -func RefreshWeixinToken() error { - return RefreshConfig("wechat", weixinTokenExpires, func() (string, string) { - globals.SugarLogger.Debugf("RefreshWeixinToken RunMode:%s", beego.BConfig.RunMode) - if beego.BConfig.RunMode == "prod" { - if tokenInfo, err := api.WeixinAPI.CBRetrieveToken(); err == nil { - globals.SugarLogger.Debugf("RefreshWeixinToken tokenInfo:%s", utils.Format4Output(tokenInfo, true)) - return tokenInfo.AccessToken, "" - } else { - globals.SugarLogger.Errorf("RefreshWeixinToken RefreshToken failed with error:%v", err) - } - } - return "", "" - }, func(value string) { - api.WeixinAPI.CBSetToken(value) - }) -} - -func RefreshElmToken() error { - return RefreshConfig("eleme", elmTokenExpires, func() (string, string) { - if beego.BConfig.RunMode == "prod" { - if tokenInfo, err := api.ElmAPI.RefreshTokenIndividual(); err == nil { - tokenInfo2 := &ElmTokenForCompatible{ - Error: "", - ErrorDescription: "", - AccessToken: tokenInfo.AccessToken, - TokenType: tokenInfo.TokenType, - Expires: tokenInfo.ExpiresIn, - RefreshToken: "", - Success: true, +func RefreshWeixinToken() (err error) { + if api.WeixinAPI != nil { + err = RefreshConfig("wechat", weixinTokenExpires, func() (string, string) { + globals.SugarLogger.Debugf("RefreshWeixinToken RunMode:%s", beego.BConfig.RunMode) + if beego.BConfig.RunMode == "prod" { + if tokenInfo, err := api.WeixinAPI.CBRetrieveToken(); err == nil { + globals.SugarLogger.Debugf("RefreshWeixinToken tokenInfo:%s", utils.Format4Output(tokenInfo, true)) + return tokenInfo.AccessToken, "" + } else { + globals.SugarLogger.Errorf("RefreshWeixinToken RefreshToken failed with error:%v", err) } - return string(utils.MustMarshal(tokenInfo2)), "" } - } - return "", "" - }, func(value string) { - var tokenInfo ElmTokenForCompatible - err := utils.UnmarshalUseNumber([]byte(value), &tokenInfo) - if err == nil { - api.ElmAPI.SetToken(tokenInfo.AccessToken) - } - }) + return "", "" + }, func(value string) { + api.WeixinAPI.CBSetToken(value) + }) + } + return err } -func RefreshWeimobToken() error { - return RefreshConfig("weimob", weimobTokenExpires, func() (string, string) { - if beego.BConfig.RunMode == "prod" { - if tokenInfo, err := api.WeimobAPI.RefreshTokenByRefreshToken(); err == nil { - return string(utils.MustMarshal(tokenInfo)), utils.Time2Str(time.Now().Add((time.Duration(tokenInfo.ExpiresIn) - weimobTokenExpires/time.Second) * time.Second)) +func RefreshElmToken() (err error) { + if api.ElmAPI != nil { + err = RefreshConfig("eleme", elmTokenExpires, func() (string, string) { + if beego.BConfig.RunMode == "prod" { + if tokenInfo, err := api.ElmAPI.RefreshTokenIndividual(); err == nil { + tokenInfo2 := &ElmTokenForCompatible{ + Error: "", + ErrorDescription: "", + AccessToken: tokenInfo.AccessToken, + TokenType: tokenInfo.TokenType, + Expires: tokenInfo.ExpiresIn, + RefreshToken: "", + Success: true, + } + return string(utils.MustMarshal(tokenInfo2)), "" + } } - } - return "", "" - }, func(value string) { - var tokenInfo *weimobapi.TokenInfo - err := utils.UnmarshalUseNumber([]byte(value), &tokenInfo) - if err == nil { - api.WeimobAPI.SetToken(tokenInfo) - } - }) + return "", "" + }, func(value string) { + var tokenInfo ElmTokenForCompatible + err := utils.UnmarshalUseNumber([]byte(value), &tokenInfo) + if err == nil { + api.ElmAPI.SetToken(tokenInfo.AccessToken) + } + }) + } + return err } -func RefreshDingDingToken() error { +func RefreshWeimobToken() (err error) { + if api.WeimobAPI != nil { + err = RefreshConfig("weimob", weimobTokenExpires, func() (string, string) { + if beego.BConfig.RunMode == "prod" { + if tokenInfo, err := api.WeimobAPI.RefreshTokenByRefreshToken(); err == nil { + return string(utils.MustMarshal(tokenInfo)), utils.Time2Str(time.Now().Add((time.Duration(tokenInfo.ExpiresIn) - weimobTokenExpires/time.Second) * time.Second)) + } + } + return "", "" + }, func(value string) { + var tokenInfo *weimobapi.TokenInfo + err := utils.UnmarshalUseNumber([]byte(value), &tokenInfo) + if err == nil { + api.WeimobAPI.SetToken(tokenInfo) + } + }) + } + return err +} + +func RefreshDingDingToken() (err error) { api.DingDingAPI.RetrieveToken() return RefreshConfig("dingding", dingdingTokenExpires, func() (string, string) { globals.SugarLogger.Debugf("RefreshDingDingToken RunMode:%s", beego.BConfig.RunMode) @@ -195,7 +204,7 @@ func SaveWeimobToken(token *weimobapi.TokenInfo) (err error) { return dao.CreateOrUpdate(db, config) } -func RefreshYilianyunToken() error { +func RefreshYilianyunToken() (err error) { return RefreshConfig("yilianyun", yilianyunTokenExpires, func() (string, string) { globals.SugarLogger.Debugf("RefreshYilianyunToken RunMode:%s", beego.BConfig.RunMode) if beego.BConfig.RunMode == "prod" { From e91ab150ab20a6b2b34d04e387dd20d07515a248 Mon Sep 17 00:00:00 2001 From: gazebo Date: Wed, 24 Apr 2019 14:51:04 +0800 Subject: [PATCH 02/47] - jxgy conf --- conf/app.conf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/conf/app.conf b/conf/app.conf index a795773e1..0c1e7af46 100644 --- a/conf/app.conf +++ b/conf/app.conf @@ -148,7 +148,7 @@ dingdingCallbackURL = "http://callback.jxc4.com/dingding/msg" httpport = 8088 EnableDocs = false -dbConnectStr = "root:WebServer@1@tcp(db1.int.jxc4.com:3306)/jxgy?charset=utf8mb4&loc=Local&parseTime=true" +dbConnectStr = "root:WebServer@1@tcp(127.0.0.1:3306)/jxgy?charset=utf8mb4&loc=Local&parseTime=true" jdToken = "b9f98667-9856-45e9-a31c-9a8862b1bfde" jdAppKey = "5d5577a2506f41b8b4ec520ba83490f5" @@ -168,9 +168,9 @@ dadaIsProd = true dadaCallbackURL = "http://callback.jxc4.com/dadadelivery/msg" dadaSourceID = "6660" -dingdingAgentID = 239461075 -dingdingAppKey = "ding7iu9cptairtcls0c" -dingdingSecret = "LWrZAFeqUfuVv7n_tc8vPpCAx6PT4CwManx2XCVhJOqGsx2L5XCDuX1sAN_JtvsI" +dingdingAgentID = 258707199 +dingdingAppKey = "dingtozhutfr98qgwc7d" +dingdingSecret = "7EJ0HDbkxQri-O2RSaYUu7_ZwvvMKtRVHT8cpyfvIvK6A9n9HRwPNCNRJFuEDeT_" dingdingQRCodeAppKey = "dingoaw990o1jm9jswvwib" dingdingQRCodeSecret = "N9dyC9qB84sauQPs4_JYrILMsG5Krqm9-PSSVJ8t9hb87rrHiFUirISxGF5G57RV" From 66b6dd4f0437edb89ed4c7014b8273f3d002bbb4 Mon Sep 17 00:00:00 2001 From: gazebo Date: Wed, 24 Apr 2019 15:11:16 +0800 Subject: [PATCH 03/47] =?UTF-8?q?-=20jxgy=E6=A8=A1=E5=BC=8F=E4=B8=8B?= =?UTF-8?q?=E4=B9=9F=E8=B0=83=E7=94=A8api.DingDingAPI.RegisterCallback?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/main.go b/main.go index f29cd7676..c4a566add 100644 --- a/main.go +++ b/main.go @@ -120,7 +120,8 @@ func main() { orderman.LoadPendingOrders() // 延时的原因是等回调准备好 - if beego.BConfig.RunMode == "prod" { + if beego.BConfig.RunMode == "prod" || + beego.BConfig.RunMode == "jxgy" { utils.AfterFuncWithRecover(2*time.Second, func() { api.DingDingAPI.DeleteCallback() if err := api.DingDingAPI.RegisterCallback([]string{dingdingapi.CBTagUserAddOrg, dingdingapi.CBTagUserModifyOrg, dingdingapi.CBTagUserLeaveOrg}, beego.AppConfig.DefaultString("dingdingCallbackToken", ""), beego.AppConfig.DefaultString("dingdingCallbackAESKey", ""), beego.AppConfig.DefaultString("dingdingCallbackURL", "")); err != nil { From a1f0f505d74c41ba563e1ff4b265cf58aa5a0a74 Mon Sep 17 00:00:00 2001 From: gazebo Date: Wed, 24 Apr 2019 15:46:32 +0800 Subject: [PATCH 04/47] - jxgy token changed --- conf/app.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/app.conf b/conf/app.conf index 0c1e7af46..4f0335097 100644 --- a/conf/app.conf +++ b/conf/app.conf @@ -150,7 +150,7 @@ EnableDocs = false dbConnectStr = "root:WebServer@1@tcp(127.0.0.1:3306)/jxgy?charset=utf8mb4&loc=Local&parseTime=true" -jdToken = "b9f98667-9856-45e9-a31c-9a8862b1bfde" +jdToken = "84541069-fbe2-424b-b625-9b2ba1d4c9e6" jdAppKey = "5d5577a2506f41b8b4ec520ba83490f5" jdSecret = "0b01b9eeb15b41dab1c3d05d95c17a26" From a09437bf3dc1b8fa0c3e02c9c3f29fe063578c44 Mon Sep 17 00:00:00 2001 From: gazebo Date: Wed, 24 Apr 2019 15:56:32 +0800 Subject: [PATCH 05/47] =?UTF-8?q?-=20=E4=BA=AC=E8=A5=BF=E6=9E=9C=E5=9B=AD?= =?UTF-8?q?=E7=9A=84=E7=BC=BA=E7=9C=81=E7=B1=BB=E5=88=AB=E4=B8=BA22410?= =?UTF-8?q?=EF=BC=88=E5=85=B6=E4=BB=96=E5=9B=BD=E4=BA=A7=E6=B0=B4=E6=9E=9C?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/partner/purchase/jd/sku.go | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/business/partner/purchase/jd/sku.go b/business/partner/purchase/jd/sku.go index 997bfaad2..4066a48e0 100644 --- a/business/partner/purchase/jd/sku.go +++ b/business/partner/purchase/jd/sku.go @@ -15,11 +15,14 @@ import ( "git.rosy.net.cn/jx-callback/business/partner" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" + "github.com/astaxie/beego" ) const ( - DefBrandID = 35247 - DefJdCategoryID = 20362 + DefBrandID = 35247 + + DefJdCategoryID = 20362 + DefJdCategoryID4Jxgy = 22410 // 其他国产水果 ) type tSkuInfoExt struct { @@ -36,6 +39,13 @@ var ( } ) +func getDefJdCategoryID() int { + if beego.BConfig.RunMode == "jxgy" { + return DefJdCategoryID4Jxgy + } + return DefJdCategoryID +} + func (p *PurchaseHandler) CreateCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) (err error) { var jdPid int64 if cat.ParentID != 0 { @@ -134,7 +144,7 @@ func (p *PurchaseHandler) cuSku(db *dao.DaoDB, sku *model.Sku, handler func(skuE // shopCategories = append(shopCategories, skuInfoExt.SkuCatID) // } if skuInfoExt.JdCategoryID == 0 { - skuInfoExt.JdCategoryID = DefJdCategoryID + skuInfoExt.JdCategoryID = getDefJdCategoryID() } if skuInfoExt.BrandID == 0 { skuInfoExt.BrandID = DefBrandID From 66dc062678ddbf939bf426199334daf040895c3e Mon Sep 17 00:00:00 2001 From: gazebo Date: Wed, 24 Apr 2019 20:12:21 +0800 Subject: [PATCH 06/47] =?UTF-8?q?-=20=E9=97=A8=E5=BA=97=E8=B4=A6=E5=8D=95?= =?UTF-8?q?=E7=BB=9F=E4=B8=80=E4=BD=BF=E7=94=A8https?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/financial/financial.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/business/jxstore/financial/financial.go b/business/jxstore/financial/financial.go index a54b40bf0..21165dc60 100644 --- a/business/jxstore/financial/financial.go +++ b/business/jxstore/financial/financial.go @@ -73,7 +73,7 @@ func SendFilesToStores(ctx *jxcontext.Context, files []*multipart.FileHeader, ti db := dao.GetDB() billRec := &legacymodel.StoreBill{ Date: time.Now(), - Url: jxutils.ComposeQiniuResURL(ret.Key), + Url: jxutils.ComposeQiniuResURL(strings.Replace(ret.Key, "http://", "https://", -1)), StoreId: storeID, BillName: fileHeader.Filename, ShopName: shopName, From 7f406414b1d0bc146c48b4951da75e91f3b9759a Mon Sep 17 00:00:00 2001 From: gazebo Date: Wed, 24 Apr 2019 20:13:17 +0800 Subject: [PATCH 07/47] =?UTF-8?q?-=20=E4=BA=AC=E4=B8=9C=E5=9B=9E=E8=B0=83?= =?UTF-8?q?=EF=BC=8C=E9=9D=9E=E7=94=9F=E4=BA=A7=E7=8E=AF=E5=A2=83=E4=B8=80?= =?UTF-8?q?=E5=AE=9A=E8=BF=94=E5=9B=9E=E6=88=90=E5=8A=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controllers/jd_callback.go | 3 +++ globals/globals.go | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/controllers/jd_callback.go b/controllers/jd_callback.go index 3552b254a..1c53dae93 100644 --- a/controllers/jd_callback.go +++ b/controllers/jd_callback.go @@ -145,6 +145,9 @@ func (c *DjswController) StoreCrud() { } func (c *DjswController) transferResponse(inCallbackResponse *jdapi.CallbackResponse) (outCallbackResponse *jdapi.CallbackResponse) { + if globals.IsCallbackAlwaysReturnSuccess() { + return jdapi.SuccessResponse + } if inCallbackResponse == nil { return jdapi.SuccessResponse } diff --git a/globals/globals.go b/globals/globals.go index 54771717c..25ba12984 100644 --- a/globals/globals.go +++ b/globals/globals.go @@ -67,3 +67,7 @@ func Init() { WeimobCallbackURL = beego.AppConfig.DefaultString("weimobCallbackURL", "") WeimobStateSecret = beego.AppConfig.DefaultString("weimobStateSecret", "") } + +func IsCallbackAlwaysReturnSuccess() bool { + return beego.BConfig.RunMode == "beta" +} From 79542ae756d937dbdb238d3b2347d91fae7af075 Mon Sep 17 00:00:00 2001 From: gazebo Date: Wed, 24 Apr 2019 21:34:46 +0800 Subject: [PATCH 08/47] - MaxTaskNameLen = 50 --- business/jxutils/tasksch/task.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/business/jxutils/tasksch/task.go b/business/jxutils/tasksch/task.go index 52b991888..17f3b9507 100644 --- a/business/jxutils/tasksch/task.go +++ b/business/jxutils/tasksch/task.go @@ -26,7 +26,7 @@ const ( ) const ( - MaxTaskNameLen = 30 + MaxTaskNameLen = 50 ) var ( From 7951e949c144a636406aa7d6efeef2863b8f1019 Mon Sep 17 00:00:00 2001 From: gazebo Date: Wed, 24 Apr 2019 21:36:55 +0800 Subject: [PATCH 09/47] + ForceSyncSkuNames - refactor sync.SyncSku --- business/jxstore/cms/sync.go | 64 +++++++++++++++++++++++---- controllers/cms_sync.go | 19 ++++++++ routers/commentsRouter_controllers.go | 9 ++++ 3 files changed, 83 insertions(+), 9 deletions(-) diff --git a/business/jxstore/cms/sync.go b/business/jxstore/cms/sync.go index 435d57902..d68d9d828 100644 --- a/business/jxstore/cms/sync.go +++ b/business/jxstore/cms/sync.go @@ -242,13 +242,28 @@ func (v *VendorSync) SyncStore(ctx *jxcontext.Context, db *dao.DaoDB, vendorID, } func (v *VendorSync) SyncSku(ctx *jxcontext.Context, db *dao.DaoDB, nameID, skuID int, isAsync, isContinueWhenError bool, userName string) (hint string, err error) { - globals.SugarLogger.Debugf("SyncSku trackInfo:%s, nameID:%d, skuID:%d, userName:%s", ctx.GetTrackInfo(), nameID, skuID, userName) - return v.LoopMultiStoresVendors(ctx, db, fmt.Sprintf("同步商品信息, nameID:%d, skuID:%d", nameID, skuID), isAsync, userName, + var ( + nameIDs []int + skuIDs []int + ) + if nameID != -1 { + nameIDs = []int{nameID} + } + if skuID != -1 { + skuIDs = []int{skuID} + } + return v.SyncSkus(ctx, db, nameIDs, skuIDs, isAsync, isContinueWhenError, userName) +} + +func (v *VendorSync) SyncSkus(ctx *jxcontext.Context, db *dao.DaoDB, nameIDs []int, skuIDs []int, isAsync, isContinueWhenError bool, userName string) (hint string, err error) { + globals.SugarLogger.Debugf("SyncSku trackInfo:%s, nameIDs:%v, skuIDs:%v, userName:%s", ctx.GetTrackInfo(), nameIDs, skuIDs, userName) + return v.LoopMultiStoresVendors(ctx, db, fmt.Sprintf("同步商品信息, nameIDs:%v, skuIDs:%v", nameIDs, skuIDs), isAsync, userName, func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) { vendorID := batchItemList[0].(int) multiStoresHandler := v.GetMultiStoreHandler(vendorID) syncStatusFieldName := dao.GetSyncStatusStructField(model.VendorNames[multiStoresHandler.GetVendorID()]) dbField := dao.ConvertDBFieldPrefix(model.VendorNames[multiStoresHandler.GetVendorID()]) + skuMap := make(map[int]bool) sql := fmt.Sprintf(` SELECT DISTINCT t2.* FROM sku t1 @@ -256,14 +271,23 @@ func (v *VendorSync) SyncSku(ctx *jxcontext.Context, db *dao.DaoDB, nameID, skuI WHERE t1.%s_sync_status <> 0 `, dbField) sqlParams := []interface{}{} - if nameID != -1 { - sql += " AND t1.name_id = ?" - sqlParams = append(sqlParams, nameID) + if len(nameIDs) > 1 { + sql += " AND t1.name_id IN (" + dao.GenQuestionMarks(len(nameIDs)) + ")" + sqlParams = append(sqlParams, nameIDs) + } else if len(nameIDs) == 1 { + sql += " AND t1.name_id = ? " + sqlParams = append(sqlParams, nameIDs[0]) } - if skuID != -1 { - sql += " AND t1.id = ?" - sqlParams = append(sqlParams, skuID) + if len(skuIDs) > 0 { + sql += " AND t1.id IN(" + dao.GenQuestionMarks(len(skuIDs)) + ")" + sqlParams = append(sqlParams, skuIDs) + } else if len(skuIDs) == 1 { + sql += " AND t1.id = ? " + sqlParams = append(sqlParams, skuIDs[0]) + } + for _, v := range skuIDs { + skuMap[v] = true } sql += " ORDER BY t2.id" @@ -284,7 +308,7 @@ func (v *VendorSync) SyncSku(ctx *jxcontext.Context, db *dao.DaoDB, nameID, skuI for _, sku := range skuList { syncStatus := refutil.GetObjFieldByName(sku, syncStatusFieldName).(int8) globals.SugarLogger.Debugf("SyncSku trackInfo:%s, skuID:%d, syncStatus:%d", ctx.GetTrackInfo(), sku.ID, syncStatus) - if (skuID == -1 || skuID == sku.ID) && (syncStatus != 0) { + if (len(skuIDs) == 0 || skuMap[sku.ID]) && (syncStatus != 0) { updateFields := []string{syncStatusFieldName} if syncStatus&model.SyncFlagDeletedMask != 0 { // 删除 if syncStatus&model.SyncFlagNewMask == 0 { @@ -543,3 +567,25 @@ func isSyncError(err error) bool { _, ok := err.(*SyncError) return ok } + +func (v *VendorSync) ForceSyncSkuNames(ctx *jxcontext.Context, nameIDs []int, isAsync, isContinueWhenError bool) (hint string, err error) { + sql := ` + UPDATE sku t1 + SET t1.jd_sync_status = t1.jd_sync_status | ? + WHERE t1.deleted_at = ? + ` + sqlParams := []interface{}{ + model.SyncFlagModifiedMask, + utils.DefaultTimeValue, + } + if len(nameIDs) > 0 { + sql += " AND t1.name_id IN(" + dao.GenQuestionMarks(len(nameIDs)) + ")" + sqlParams = append(sqlParams, nameIDs) + } + + db := dao.GetDB() + if _, err = dao.ExecuteSQL(db, sql, sqlParams...); err != nil { + return "", err + } + return v.SyncSkus(ctx, db, nameIDs, nil, isAsync, isContinueWhenError, ctx.GetUserName()) +} diff --git a/controllers/cms_sync.go b/controllers/cms_sync.go index 948c4dfe2..6b5e59a17 100644 --- a/controllers/cms_sync.go +++ b/controllers/cms_sync.go @@ -139,3 +139,22 @@ func (c *SyncController) DeleteRemoteStoreSkus() { return retVal, "", err }) } + +// @Title 强制同步SKU(多门店平台) +// @Description 强制同步SKU(多门店平台) +// @Param token header string true "认证token" +// @Param nameIDs formData string false "name ID列表" +// @Param isAsync formData bool false "是否异步" +// @Param isContinueWhenError formData bool false "单个同步失败是否继续,缺省false" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /ForceSyncSkuNames [put] +func (c *SyncController) ForceSyncSkuNames() { + c.callForceSyncSkuNames(func(params *tSyncForceSyncSkuNamesParams) (retVal interface{}, errCode string, err error) { + var nameIDs []int + if err = jxutils.Strings2Objs(params.NameIDs, &nameIDs); err == nil { + retVal, err = cms.CurVendorSync.ForceSyncSkuNames(params.Ctx, nameIDs, params.IsAsync, params.IsContinueWhenError) + } + return retVal, "", err + }) +} diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index 863386ef2..b30c0d722 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -1213,6 +1213,15 @@ func init() { Filters: nil, Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SyncController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SyncController"], + beego.ControllerComments{ + Method: "ForceSyncSkuNames", + Router: `/ForceSyncSkuNames`, + AllowHTTPMethods: []string{"put"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SyncController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SyncController"], beego.ControllerComments{ Method: "FullSyncStoresSkus", From 207d8e2bf24d4efe5d6d3b9f43468593ebc32a6e Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 25 Apr 2019 08:42:35 +0800 Subject: [PATCH 10/47] =?UTF-8?q?-=20=E5=88=9B=E5=BB=BA=E4=BA=AC=E4=B8=9C?= =?UTF-8?q?=E5=95=86=E5=93=81=E6=97=B6=E5=BF=BD=E7=95=A5=E5=B7=B2=E7=BB=8F?= =?UTF-8?q?=E5=AD=98=E5=9C=A8=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/partner/purchase/jd/sku.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/business/partner/purchase/jd/sku.go b/business/partner/purchase/jd/sku.go index 4066a48e0..9dd7102bf 100644 --- a/business/partner/purchase/jd/sku.go +++ b/business/partner/purchase/jd/sku.go @@ -186,6 +186,12 @@ func (p *PurchaseHandler) CreateSku(db *dao.DaoDB, sku *model.Sku, userName stri if skuExt.IsSpu == 0 { if globals.EnableStoreWrite { vendorSkuID, err = api.JdAPI.AddSku(utils.Int2Str(sku.ID), skuExt.JdCategoryID, shopCategories, skuExt.BrandID, skuName, price, jxutils.IntWeight2Float(sku.Weight), []string{skuExt.Img}, jxStatus2jdStatus(sku.Status), true, addParams) + if err != nil { + if jdSkuID := jdapi.GetJdSkuIDFromError(err); jdSkuID > 0 { + vendorSkuID = utils.Int64ToStr(jdSkuID) + err = nil + } + } } } else { vendorSkuID, err = p.syncSkuNameAsSpu(db, sku, skuExt, price, skuName, shopCategories, addParams) From d9276e5833ad90cc34d20e3fdcf13bfe482bf3c1 Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 25 Apr 2019 08:53:55 +0800 Subject: [PATCH 11/47] - ForceSyncSkuNames to SyncSkuNames --- business/jxstore/cms/sync.go | 29 ++++++++++++++------------- controllers/cms_sync.go | 13 ++++++------ routers/commentsRouter_controllers.go | 18 ++++++++--------- 3 files changed, 31 insertions(+), 29 deletions(-) diff --git a/business/jxstore/cms/sync.go b/business/jxstore/cms/sync.go index d68d9d828..2a91f51bd 100644 --- a/business/jxstore/cms/sync.go +++ b/business/jxstore/cms/sync.go @@ -568,24 +568,25 @@ func isSyncError(err error) bool { return ok } -func (v *VendorSync) ForceSyncSkuNames(ctx *jxcontext.Context, nameIDs []int, isAsync, isContinueWhenError bool) (hint string, err error) { - sql := ` +func (v *VendorSync) SyncSkuNames(ctx *jxcontext.Context, nameIDs []int, isForce, isAsync, isContinueWhenError bool) (hint string, err error) { + db := dao.GetDB() + if isForce { + sql := ` UPDATE sku t1 SET t1.jd_sync_status = t1.jd_sync_status | ? WHERE t1.deleted_at = ? ` - sqlParams := []interface{}{ - model.SyncFlagModifiedMask, - utils.DefaultTimeValue, - } - if len(nameIDs) > 0 { - sql += " AND t1.name_id IN(" + dao.GenQuestionMarks(len(nameIDs)) + ")" - sqlParams = append(sqlParams, nameIDs) - } - - db := dao.GetDB() - if _, err = dao.ExecuteSQL(db, sql, sqlParams...); err != nil { - return "", err + sqlParams := []interface{}{ + model.SyncFlagModifiedMask, + utils.DefaultTimeValue, + } + if len(nameIDs) > 0 { + sql += " AND t1.name_id IN(" + dao.GenQuestionMarks(len(nameIDs)) + ")" + sqlParams = append(sqlParams, nameIDs) + } + if _, err = dao.ExecuteSQL(db, sql, sqlParams...); err != nil { + return "", err + } } return v.SyncSkus(ctx, db, nameIDs, nil, isAsync, isContinueWhenError, ctx.GetUserName()) } diff --git a/controllers/cms_sync.go b/controllers/cms_sync.go index 6b5e59a17..1a3048d11 100644 --- a/controllers/cms_sync.go +++ b/controllers/cms_sync.go @@ -140,20 +140,21 @@ func (c *SyncController) DeleteRemoteStoreSkus() { }) } -// @Title 强制同步SKU(多门店平台) -// @Description 强制同步SKU(多门店平台) +// @Title 同步SkuName(多门店平台) +// @Description 同步SkuName(多门店平台) // @Param token header string true "认证token" // @Param nameIDs formData string false "name ID列表" +// @Param isForce formData bool false "是否强制(设置修改标志)" // @Param isAsync formData bool false "是否异步" // @Param isContinueWhenError formData bool false "单个同步失败是否继续,缺省false" // @Success 200 {object} controllers.CallResult // @Failure 200 {object} controllers.CallResult -// @router /ForceSyncSkuNames [put] -func (c *SyncController) ForceSyncSkuNames() { - c.callForceSyncSkuNames(func(params *tSyncForceSyncSkuNamesParams) (retVal interface{}, errCode string, err error) { +// @router /SyncSkuNames [put] +func (c *SyncController) SyncSkuNames() { + c.callSyncSkuNames(func(params *tSyncSyncSkuNamesParams) (retVal interface{}, errCode string, err error) { var nameIDs []int if err = jxutils.Strings2Objs(params.NameIDs, &nameIDs); err == nil { - retVal, err = cms.CurVendorSync.ForceSyncSkuNames(params.Ctx, nameIDs, params.IsAsync, params.IsContinueWhenError) + retVal, err = cms.CurVendorSync.SyncSkuNames(params.Ctx, nameIDs, params.IsForce, params.IsAsync, params.IsContinueWhenError) } return retVal, "", err }) diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index b30c0d722..da6a6b99e 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -1213,15 +1213,6 @@ func init() { Filters: nil, Params: nil}) - beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SyncController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SyncController"], - beego.ControllerComments{ - Method: "ForceSyncSkuNames", - Router: `/ForceSyncSkuNames`, - AllowHTTPMethods: []string{"put"}, - MethodParams: param.Make(), - Filters: nil, - Params: nil}) - beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SyncController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SyncController"], beego.ControllerComments{ Method: "FullSyncStoresSkus", @@ -1249,6 +1240,15 @@ func init() { Filters: nil, Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SyncController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SyncController"], + beego.ControllerComments{ + Method: "SyncSkuNames", + Router: `/SyncSkuNames`, + AllowHTTPMethods: []string{"put"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SyncController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SyncController"], beego.ControllerComments{ Method: "SyncStoresCategory", From 1ef854a0c654475d7e8e949f83b0b43ff797a6b2 Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 25 Apr 2019 12:13:01 +0800 Subject: [PATCH 12/47] =?UTF-8?q?-=20=E5=B0=86URL=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E6=94=BE=E5=88=B0=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/financial/financial.go | 2 +- business/jxstore/initdata/initdata.go | 2 +- business/jxutils/weixinmsg/weixinmsg.go | 18 ++++++++---------- conf/app.conf | 16 ++++++++++++---- controllers/ebai_callback.go | 3 ++- globals/api/api.go | 6 +++--- globals/globals.go | 6 ++++++ 7 files changed, 33 insertions(+), 20 deletions(-) diff --git a/business/jxstore/financial/financial.go b/business/jxstore/financial/financial.go index 21165dc60..8a20b7aab 100644 --- a/business/jxstore/financial/financial.go +++ b/business/jxstore/financial/financial.go @@ -80,7 +80,7 @@ func SendFilesToStores(ctx *jxcontext.Context, files []*multipart.FileHeader, ti BillTitle: title, } if err = dao.CreateEntity(db, billRec); err == nil { - err = weixinmsg.NotifySaleBill(storeID, title, shopName, "http://www.jxc4.com/billshow/?path="+billRec.Url) + err = weixinmsg.NotifySaleBill(storeID, title, shopName, fmt.Sprintf("%s/billshow/?path=%s", globals.BackstageHost, billRec.Url)) if err != nil { globals.SugarLogger.Infof("SendFilesToStores NotifySaleBill file:%s error:%v", fileHeader.Filename, err) } diff --git a/business/jxstore/initdata/initdata.go b/business/jxstore/initdata/initdata.go index bc93b44be..d402d9ef0 100644 --- a/business/jxstore/initdata/initdata.go +++ b/business/jxstore/initdata/initdata.go @@ -423,7 +423,7 @@ func BuildSkuFromEbaiStore(ctx *jxcontext.Context, baiduShopID int64, isAsync, i err = nil continue } - qiniuImgURL := "http://image.jxc4.com/" + key + "?imageMogr2/thumbnail/x800/gravity/Center/crop/800x800" + qiniuImgURL := jxutils.ComposeQiniuResURL(key) + "?imageMogr2/thumbnail/x800/gravity/Center/crop/800x800" for _, sku := range skuNameExt.Skus { jdCatID := 22410 // 其他国产水果 if cat.Name == "进口水果" { diff --git a/business/jxutils/weixinmsg/weixinmsg.go b/business/jxutils/weixinmsg/weixinmsg.go index aba3d7454..4e2917afa 100644 --- a/business/jxutils/weixinmsg/weixinmsg.go +++ b/business/jxutils/weixinmsg/weixinmsg.go @@ -15,12 +15,10 @@ import ( ) const ( - // WX_TO_ORDER_PAGE_URL = "http://www.jxc4.com/jx/h5/#/?jxStoreId=" - // WX_TO_SHOW_COMMENTS_DETAIL_URL = "http://www.jxc4.com/jx/h5/#/assess-list?jxStoreId=" //展示差评详情的页面 - WX_TO_ORDER_PAGE_URL = "http://wx.jxc4.com/#/?jxStoreId=" - WX_TO_STORE_SKU_PAGE_URL = "http://wx.jxc4.com/#/shop?jxStoreId=" - WX_TO_SHOW_COMMENTS_DETAIL_URL = "http://wx.jxc4.com/#/assess-list?jxStoreId=" //展示差评详情的页面 - WX_TO_SHOW_MSG = "http://wx.jxc4.com/#/message-detail?msgID=%d&msgStatusID=%d" + WX_TO_ORDER_PAGE_URL = "/#/?jxStoreId=" + WX_TO_STORE_SKU_PAGE_URL = "/#/shop?jxStoreId=" + WX_TO_SHOW_COMMENTS_DETAIL_URL = "/#/assess-list?jxStoreId=" //展示差评详情的页面 + WX_TO_SHOW_MSG = "/#/message-detail?msgID=%d&msgStatusID=%d" WX_MINI_TO_ORDER_PAGE_URL = "pages/order-manager/main" WX_MINI_TO_STORE_SKU_PAGE_URL = "pages/goods-manager/main" @@ -205,7 +203,7 @@ func NotifyNewOrder(order *model.GoodsOrder) (err error) { }, } storeID := jxutils.GetSaleStoreIDFromOrder(order) - return SendMsgToStore(storeID, WX_NEWORDER_TEMPLATE_ID, fmt.Sprintf("%s%d", WX_TO_ORDER_PAGE_URL, storeID), WX_MINI_TO_ORDER_PAGE_URL, data) + return SendMsgToStore(storeID, WX_NEWORDER_TEMPLATE_ID, globals.WxBackstageHost+fmt.Sprintf("%s%d", WX_TO_ORDER_PAGE_URL, storeID), WX_MINI_TO_ORDER_PAGE_URL, data) } func NotifyWaybillStatus(bill *model.Waybill, order *model.GoodsOrder, isBillAlreadyCandidate bool) error { @@ -340,7 +338,7 @@ func PushJDBadCommentToWeiXin(comment *legacymodel.JxBadComments) (err error) { }, } storeID := int(utils.Str2Int64(comment.Jxstoreid)) - return SendMsgToStore(storeID, WX_BAD_COMMENT_PUSH_TEMPLATE_ID, fmt.Sprintf("%s%d", WX_TO_SHOW_COMMENTS_DETAIL_URL, storeID), WX_MINI_TO_SHOW_COMMENTS_DETAIL_URL, data) + return SendMsgToStore(storeID, WX_BAD_COMMENT_PUSH_TEMPLATE_ID, globals.WxBackstageHost+fmt.Sprintf("%s%d", WX_TO_SHOW_COMMENTS_DETAIL_URL, storeID), WX_MINI_TO_SHOW_COMMENTS_DETAIL_URL, data) } func NotifySaleBill(storeID int, title, shopName, fileURL string) (err error) { @@ -379,7 +377,7 @@ func NotifySaleBill(storeID int, title, shopName, fileURL string) (err error) { func NotifyStoreOpRequestStatus(isAccepted bool, storeID, nameID int, spuName string, originalUnitPrice, unitPrice int, rejectReason string) (err error) { globals.SugarLogger.Debugf("NotifyStoreOpRequestStatus isAccepted:%t, storeID:%d, nameID:%d, spuName:%s, originalUnitPrice:%d, unitPrice:%d, rejectReason:%s", isAccepted, storeID, nameID, spuName, originalUnitPrice, unitPrice, rejectReason) templateID := "" - fileURL := fmt.Sprintf("%s%d", WX_TO_STORE_SKU_PAGE_URL, storeID) + fileURL := globals.WxBackstageHost + fmt.Sprintf("%s%d", WX_TO_STORE_SKU_PAGE_URL, storeID) data := make(map[string]interface{}) if isAccepted { templateID = WX_CHANGE_APPROVED_TEMPLATE_ID @@ -426,7 +424,7 @@ func NotifyStoreOpRequestStatus(isAccepted bool, storeID, nameID int, spuName st func NotifyStoreMessage(storeID, msgID, msgStatusID int, title, content string) (err error) { globals.SugarLogger.Debugf("NotifyStoreMessage storeID:%d, msgID:%d, title:%s, content:%s", storeID, msgID, title, content) templateID := WX_NORMAL_STORE_MSG_TEMPLATE_ID - fileURL := fmt.Sprintf(WX_TO_SHOW_MSG, msgID, msgStatusID) + fileURL := globals.WxBackstageHost + fmt.Sprintf(WX_TO_SHOW_MSG, msgID, msgStatusID) data := map[string]interface{}{ "first": map[string]interface{}{ "value": content, diff --git a/conf/app.conf b/conf/app.conf index 4f0335097..9aac1c467 100644 --- a/conf/app.conf +++ b/conf/app.conf @@ -39,9 +39,15 @@ showAppSecret = "384f911735334bf7a150f3bd3bdf0c1e" weixinMsgToken = "weixin" weixinMsgKey = "duyaeVYUsz8LuKBqJeQO1NX6KmoC43yfMsbJybcRJ3e" +weixinPageAppID = "wx018dbe7daa3d5627" +weixinPageSecret = "c7a84ed3ef3ae04ac78e02fb593ffbe5" + weixinMiniAppID = "wx4b5930c13f8b1170" weixinMiniSecret = "2a57228a716ce991a52739f0ff41111d" +backstageHost = "http://www.jxc4.com" +wxBackstageHost = "http://wx.jxc4.com" + jdStorePageCookie = "YYJV3NHVBPHLD36FWP6F3EM5PTXJ2XZQS7U4HWRIDPP4IWGUKUIB4XG5N26CZRDLDF7PKOXBPD6BNTUAJLETLZOIWMCVFI3K6MYZIY4QBIXIMXYDJNUKFGJVQTN5356SAD6WPCIHWNQAG7DDMF7L7S3SHBUOPCIUXDX4MQEAYEPUFFOAD4WJECT4R3K22T24MKC7OMIRDLX7S55243TDVXLO25PP4UYSPTTPMNRUFXDNP4WPE566Q6V4AH32F7HT" ebaiStorePageCookieWMUSS = "AADIBAABbDlEpGl47c1EyBFcJSidBTBJHFHZEXyMSdBllJTZ9AUNOKV0tZFB9FlRVM73gEAIHRjBVagwAAHh98X2oPJ34Gal0ofFJBYXZ2Xnc6LCEXWQVnVxs7LDlaKBlFNz9DPCogYyZxJQhoHGVfVRIBa2oFUkEfDm1YZxZwLEwvZMjpB18rjw%7E3CaMQAo" ebaiStorePageCookieWMSTOKEN = "HwXAAB9SGxnTT8pbEwWRDQsNGB3Y09_PF5rO157QUcoLRQAAAoKlgUEiVTOhIf5LjkCoFpAwwCaAAAUr-GEu-yDBeNAQAAHNneF25-uRjhYtgX4rsAAGHurh8C5GAQAA" @@ -51,9 +57,6 @@ weimobAppSecret = "7267AA7F58261F6965599218F5A1D592" weimobStateSecret = "87ae9570-92dc-4c01-bcd9-1a15d441df6b" weimobCallbackURL = "http://callback.test.jxc4.com/weimob" -weixinPageAppID = "wx018dbe7daa3d5627" -weixinPageSecret = "c7a84ed3ef3ae04ac78e02fb593ffbe5" - dingdingAgentID = 241047291 dingdingAppKey = "dingpx4hcf55zb4ubewg" dingdingSecret = "1zooB4bmEXPesdwb1ElWASVQ1vinOSZM-1XCUFrrSjHsNAId1UuVCT5tmHSmg5_V" @@ -154,7 +157,9 @@ jdToken = "84541069-fbe2-424b-b625-9b2ba1d4c9e6" jdAppKey = "5d5577a2506f41b8b4ec520ba83490f5" jdSecret = "0b01b9eeb15b41dab1c3d05d95c17a26" -disableEbai = true +ebaiSource = "34665" +ebaiSecret = "c3db75b754ea2d89" + disableElm = true disableMtwm = true disableWeimob = true @@ -177,6 +182,9 @@ dingdingQRCodeSecret = "N9dyC9qB84sauQPs4_JYrILMsG5Krqm9-PSSVJ8t9hb87rrHiFUirISx dingdingCallbackURL = "http://callback.jxgy.jxc4.com/dingding/msg" +backstageHost = "http://www-jxgy.jxc4.com" +wxBackstageHost = "http://wx-jxgy.jxc4.com" + [prod2] httpport = 8082 diff --git a/controllers/ebai_callback.go b/controllers/ebai_callback.go index d9e3de22b..d16f7299d 100644 --- a/controllers/ebai_callback.go +++ b/controllers/ebai_callback.go @@ -4,6 +4,7 @@ import ( "net/http" "git.rosy.net.cn/jx-callback/business/partner/purchase/ebai" + "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" "github.com/astaxie/beego" ) @@ -18,7 +19,7 @@ func (c *EbaiController) Msg() { if callbackResponse == nil { callbackResponse = ebai.OnCallbackMsg(obj) } - if callbackResponse == nil { + if callbackResponse == nil || globals.IsCallbackAlwaysReturnSuccess() { callbackResponse = api.EbaiAPI.Err2CallbackResponse(obj.Cmd, nil, nil) } c.Data["json"] = callbackResponse diff --git a/globals/api/api.go b/globals/api/api.go index fd0dff206..1fb59f9fb 100644 --- a/globals/api/api.go +++ b/globals/api/api.go @@ -33,9 +33,9 @@ var ( MtpsAPI *mtpsapi.API DadaAPI *dadaapi.API MtwmAPI *mtwmapi.API - WeixinAPI *weixinapi.API - WeixinMiniAPI *weixinapi.API - WeixinPageAPI *weixinapi.API + WeixinAPI *weixinapi.API // 微信公众号 + WeixinMiniAPI *weixinapi.API // 小程序 + WeixinPageAPI *weixinapi.API // 用户微信扫码登录 AutonaviAPI *autonavi.API QiniuAPI *qbox.Mac diff --git a/globals/globals.go b/globals/globals.go index 25ba12984..c6ab1223a 100644 --- a/globals/globals.go +++ b/globals/globals.go @@ -34,6 +34,9 @@ var ( QiniuBucket string WeimobCallbackURL string WeimobStateSecret string + + BackstageHost string + WxBackstageHost string ) func init() { @@ -66,6 +69,9 @@ func Init() { WeimobCallbackURL = beego.AppConfig.DefaultString("weimobCallbackURL", "") WeimobStateSecret = beego.AppConfig.DefaultString("weimobStateSecret", "") + + BackstageHost = beego.AppConfig.DefaultString("backstageHost", "") + WxBackstageHost = beego.AppConfig.DefaultString("wxBackstageHost", "") } func IsCallbackAlwaysReturnSuccess() bool { From 4e0a6a369061630e5ee5edff1d8273ff891b42f5 Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 25 Apr 2019 12:18:21 +0800 Subject: [PATCH 13/47] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=E6=9E=9C=E5=9B=AD?= =?UTF-8?q?=E5=9B=9E=E8=B0=83=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/app.conf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/app.conf b/conf/app.conf index 9aac1c467..280c3fc44 100644 --- a/conf/app.conf +++ b/conf/app.conf @@ -170,7 +170,7 @@ mtpsAppKey = "3c0a05d464c247c19d7ec13accc78605" mtpsSecret = "b1M}9?:sTbsB[OF2gNORnN(|(iy9rB8(`7]|[wGLnbmt`evfM>E:A90DjHAW:UPE" dadaIsProd = true -dadaCallbackURL = "http://callback.jxc4.com/dadadelivery/msg" +dadaCallbackURL = "http://callback-jxgy.jxc4.com/dadadelivery/msg" dadaSourceID = "6660" dingdingAgentID = 258707199 @@ -180,7 +180,7 @@ dingdingSecret = "7EJ0HDbkxQri-O2RSaYUu7_ZwvvMKtRVHT8cpyfvIvK6A9n9HRwPNCNRJFuEDe dingdingQRCodeAppKey = "dingoaw990o1jm9jswvwib" dingdingQRCodeSecret = "N9dyC9qB84sauQPs4_JYrILMsG5Krqm9-PSSVJ8t9hb87rrHiFUirISxGF5G57RV" -dingdingCallbackURL = "http://callback.jxgy.jxc4.com/dingding/msg" +dingdingCallbackURL = "http://callback-jxgy.jxc4.com/dingding/msg" backstageHost = "http://www-jxgy.jxc4.com" wxBackstageHost = "http://wx-jxgy.jxc4.com" From 38a95330f59dc50059ec02782858cdc656829f6c Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 25 Apr 2019 12:33:47 +0800 Subject: [PATCH 14/47] - up --- controllers/ebai_callback.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/controllers/ebai_callback.go b/controllers/ebai_callback.go index d16f7299d..bd0ae5b17 100644 --- a/controllers/ebai_callback.go +++ b/controllers/ebai_callback.go @@ -3,6 +3,7 @@ package controllers import ( "net/http" + "git.rosy.net.cn/baseapi/platformapi/ebaiapi" "git.rosy.net.cn/jx-callback/business/partner/purchase/ebai" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" @@ -20,7 +21,7 @@ func (c *EbaiController) Msg() { callbackResponse = ebai.OnCallbackMsg(obj) } if callbackResponse == nil || globals.IsCallbackAlwaysReturnSuccess() { - callbackResponse = api.EbaiAPI.Err2CallbackResponse(obj.Cmd, nil, nil) + callbackResponse = api.EbaiAPI.Err2CallbackResponse(ebaiapi.GetCmd(c.Ctx.Request), nil, nil) } c.Data["json"] = callbackResponse c.ServeJSON() From ed17aac89f82df81362ef7d720c3006c6624ad0a Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 25 Apr 2019 12:44:54 +0800 Subject: [PATCH 15/47] - fk --- controllers/ebai_callback.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/controllers/ebai_callback.go b/controllers/ebai_callback.go index bd0ae5b17..89500cba6 100644 --- a/controllers/ebai_callback.go +++ b/controllers/ebai_callback.go @@ -4,6 +4,7 @@ import ( "net/http" "git.rosy.net.cn/baseapi/platformapi/ebaiapi" + "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/partner/purchase/ebai" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" @@ -23,6 +24,7 @@ func (c *EbaiController) Msg() { if callbackResponse == nil || globals.IsCallbackAlwaysReturnSuccess() { callbackResponse = api.EbaiAPI.Err2CallbackResponse(ebaiapi.GetCmd(c.Ctx.Request), nil, nil) } + globals.SugarLogger.Debugf("ebai Msg callbackResponse:%s", utils.Format4Output(callbackResponse, false)) c.Data["json"] = callbackResponse c.ServeJSON() } else { From e193e7f7fd22187a7c753c45b23841735d4095bb Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 25 Apr 2019 12:56:03 +0800 Subject: [PATCH 16/47] - fk --- conf/app.conf | 4 ++-- controllers/ebai_callback.go | 5 +---- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/conf/app.conf b/conf/app.conf index 280c3fc44..67a07978a 100644 --- a/conf/app.conf +++ b/conf/app.conf @@ -157,8 +157,8 @@ jdToken = "84541069-fbe2-424b-b625-9b2ba1d4c9e6" jdAppKey = "5d5577a2506f41b8b4ec520ba83490f5" jdSecret = "0b01b9eeb15b41dab1c3d05d95c17a26" -ebaiSource = "34665" -ebaiSecret = "c3db75b754ea2d89" +ebaiSource = "62289" +ebaiSecret = "d3ec2358d6a819ea" disableElm = true disableMtwm = true diff --git a/controllers/ebai_callback.go b/controllers/ebai_callback.go index 89500cba6..267109b4a 100644 --- a/controllers/ebai_callback.go +++ b/controllers/ebai_callback.go @@ -4,9 +4,7 @@ import ( "net/http" "git.rosy.net.cn/baseapi/platformapi/ebaiapi" - "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/partner/purchase/ebai" - "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" "github.com/astaxie/beego" ) @@ -21,10 +19,9 @@ func (c *EbaiController) Msg() { if callbackResponse == nil { callbackResponse = ebai.OnCallbackMsg(obj) } - if callbackResponse == nil || globals.IsCallbackAlwaysReturnSuccess() { + if callbackResponse == nil { callbackResponse = api.EbaiAPI.Err2CallbackResponse(ebaiapi.GetCmd(c.Ctx.Request), nil, nil) } - globals.SugarLogger.Debugf("ebai Msg callbackResponse:%s", utils.Format4Output(callbackResponse, false)) c.Data["json"] = callbackResponse c.ServeJSON() } else { From 536de947304078f94e769cfb80d91e782ec05207 Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 25 Apr 2019 12:59:56 +0800 Subject: [PATCH 17/47] =?UTF-8?q?-=20=E4=BA=AC=E8=A5=BF=E6=9E=9C=E5=9B=AD?= =?UTF-8?q?=E6=AD=A3=E5=BC=8FKEY?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/app.conf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/app.conf b/conf/app.conf index 67a07978a..6650de7b5 100644 --- a/conf/app.conf +++ b/conf/app.conf @@ -157,8 +157,8 @@ jdToken = "84541069-fbe2-424b-b625-9b2ba1d4c9e6" jdAppKey = "5d5577a2506f41b8b4ec520ba83490f5" jdSecret = "0b01b9eeb15b41dab1c3d05d95c17a26" -ebaiSource = "62289" -ebaiSecret = "d3ec2358d6a819ea" +ebaiSource = "35957" +ebaiSecret = "10013fbb7c2ddad7" disableElm = true disableMtwm = true From 05bcae3dd93e8374a30f106f6df2edec81927d08 Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 25 Apr 2019 14:25:54 +0800 Subject: [PATCH 18/47] - fk --- business/partner/purchase/ebai/store.go | 1 + 1 file changed, 1 insertion(+) diff --git a/business/partner/purchase/ebai/store.go b/business/partner/purchase/ebai/store.go index aa8a949d4..d2d43a84b 100644 --- a/business/partner/purchase/ebai/store.go +++ b/business/partner/purchase/ebai/store.go @@ -166,6 +166,7 @@ func (p *PurchaseHandler) UpdateStore(db *dao.DaoDB, storeID int, userName strin shopID = store.ID } store2, err2 := p.ReadStore(store.VendorStoreID) + globals.SugarLogger.Debugf("ebai UpdateStore2 store2:%s, err2:%v", utils.Format4Output(store2, true), err2) if err = err2; err == nil { if store2.ID == store.ID { shopID = -1 From 170bd34a155ee0cf6e4749ebb7785e92674aa19c Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 25 Apr 2019 14:28:23 +0800 Subject: [PATCH 19/47] - enableEbaiStoreWrite = true for jxgy --- business/partner/purchase/ebai/store.go | 2 +- conf/app.conf | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/business/partner/purchase/ebai/store.go b/business/partner/purchase/ebai/store.go index d2d43a84b..778ee025c 100644 --- a/business/partner/purchase/ebai/store.go +++ b/business/partner/purchase/ebai/store.go @@ -166,7 +166,7 @@ func (p *PurchaseHandler) UpdateStore(db *dao.DaoDB, storeID int, userName strin shopID = store.ID } store2, err2 := p.ReadStore(store.VendorStoreID) - globals.SugarLogger.Debugf("ebai UpdateStore2 store2:%s, err2:%v", utils.Format4Output(store2, true), err2) + // globals.SugarLogger.Debugf("ebai UpdateStore2 store2:%s, err2:%v", utils.Format4Output(store2, true), err2) if err = err2; err == nil { if store2.ID == store.ID { shopID = -1 diff --git a/conf/app.conf b/conf/app.conf index 6650de7b5..70190dc5f 100644 --- a/conf/app.conf +++ b/conf/app.conf @@ -165,6 +165,7 @@ disableMtwm = true disableWeimob = true enableStoreWrite = true +enableEbaiStoreWrite = true mtpsAppKey = "3c0a05d464c247c19d7ec13accc78605" mtpsSecret = "b1M}9?:sTbsB[OF2gNORnN(|(iy9rB8(`7]|[wGLnbmt`evfM>E:A90DjHAW:UPE" From 1c8642e39f595875c3d08262dc2275a9fb9bc65a Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 25 Apr 2019 15:45:23 +0800 Subject: [PATCH 20/47] =?UTF-8?q?-=20jxgy=E7=94=A8=E6=AD=A3=E5=BC=8F?= =?UTF-8?q?=E5=85=AC=E4=BC=97=E5=8F=B7=E7=9A=84KEY?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/app.conf | 3 +++ 1 file changed, 3 insertions(+) diff --git a/conf/app.conf b/conf/app.conf index 70190dc5f..abe7a4774 100644 --- a/conf/app.conf +++ b/conf/app.conf @@ -174,6 +174,9 @@ dadaIsProd = true dadaCallbackURL = "http://callback-jxgy.jxc4.com/dadadelivery/msg" dadaSourceID = "6660" +weixinAppID = "wx2bb99eb5d2c9b82c" +weixinSecret = "6bbbed1443cc062c20a015a64c07a531" + dingdingAgentID = 258707199 dingdingAppKey = "dingtozhutfr98qgwc7d" dingdingSecret = "7EJ0HDbkxQri-O2RSaYUu7_ZwvvMKtRVHT8cpyfvIvK6A9n9HRwPNCNRJFuEDeT_" From efefe0ff5280d08e92ca7284042fdba679cfc23a Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 25 Apr 2019 16:04:40 +0800 Subject: [PATCH 21/47] =?UTF-8?q?-=20=E6=97=A0=E8=AE=BA=E6=88=90=E5=8A=9F?= =?UTF-8?q?=E4=B8=8E=E5=90=A6=EF=BC=8C=E9=83=BD=E5=AD=98=E5=82=A8verifyCod?= =?UTF-8?q?e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/auth2/authprovider/mobile/mobile.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/business/auth2/authprovider/mobile/mobile.go b/business/auth2/authprovider/mobile/mobile.go index 193861264..27c246ca7 100644 --- a/business/auth2/authprovider/mobile/mobile.go +++ b/business/auth2/authprovider/mobile/mobile.go @@ -49,8 +49,9 @@ func (a *Auther) SendVerifyCode(mobileNumber string) error { response, err := smsClient.Execute(globals.AliKey, globals.AliSecret, mobileNumber, "京西菜市", "SMS_84655036", string(utils.MustMarshal(map[string]interface{}{ "code": code, }))) + a.SaveVerifyCode(mobileNumber, code) if err == nil && response.Code == aliyunsmsclient.ResponseCodeOk { - a.SaveVerifyCode(mobileNumber, code) + // a.SaveVerifyCode(mobileNumber, code) } else { if err == nil { if warningMap[response.Code] == 1 { From c87b104fa4bd639ae38d84196a928e5ad1fb65a1 Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 25 Apr 2019 16:13:57 +0800 Subject: [PATCH 22/47] =?UTF-8?q?-=20jxgy=E5=B0=8F=E7=A8=8B=E5=BA=8Fkey?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/app.conf | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/conf/app.conf b/conf/app.conf index abe7a4774..19a69713c 100644 --- a/conf/app.conf +++ b/conf/app.conf @@ -177,6 +177,12 @@ dadaSourceID = "6660" weixinAppID = "wx2bb99eb5d2c9b82c" weixinSecret = "6bbbed1443cc062c20a015a64c07a531" +weixinMiniAppID = "wx2d6949f724b2541d" +weixinMiniSecret = "11f3c380551c4683c149990b004d6df9" + +backstageHost = "http://www-jxgy.jxc4.com" +wxBackstageHost = "http://wx-jxgy.jxc4.com" + dingdingAgentID = 258707199 dingdingAppKey = "dingtozhutfr98qgwc7d" dingdingSecret = "7EJ0HDbkxQri-O2RSaYUu7_ZwvvMKtRVHT8cpyfvIvK6A9n9HRwPNCNRJFuEDeT_" @@ -186,9 +192,6 @@ dingdingQRCodeSecret = "N9dyC9qB84sauQPs4_JYrILMsG5Krqm9-PSSVJ8t9hb87rrHiFUirISx dingdingCallbackURL = "http://callback-jxgy.jxc4.com/dingding/msg" -backstageHost = "http://www-jxgy.jxc4.com" -wxBackstageHost = "http://wx-jxgy.jxc4.com" - [prod2] httpport = 8082 From d940b7d12f6d7d0dc46fbf9a62a4a166664ed632 Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 25 Apr 2019 16:17:37 +0800 Subject: [PATCH 23/47] =?UTF-8?q?-=20=E8=B0=83=E6=95=B4=E4=B8=80=E4=B8=8B?= =?UTF-8?q?=E5=BB=BA=E8=A1=A8=E9=A1=BA=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- globals/beegodb/beegodb.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/globals/beegodb/beegodb.go b/globals/beegodb/beegodb.go index 45862f24e..87226de45 100644 --- a/globals/beegodb/beegodb.go +++ b/globals/beegodb/beegodb.go @@ -36,15 +36,15 @@ func Init() { orm.RegisterModel(&model.Promotion{}, &model.PromotionStore{}, &model.PromotionSku{}) orm.RegisterModel(&model.AuthBind{}, &model.User{}) - orm.RegisterModel(&model.OrderFinancial{}, &model.AfsOrder{}, &model.OrderDiscountFinancial{}, &model.OrderSkuFinancial{}) - // orm.RegisterModel(&model.ActivityForSku{}) - // orm.RegisterModel(&legacymodel.JxBadComments2{}) if globals.EnablePendingChange { orm.RegisterModel(&model.StoreOpRequest{}) } + + // 如下语句建表时要出错(INDEX名字太长了),暂时放一下,必须放最后一句 + orm.RegisterModel(&model.OrderFinancial{}, &model.AfsOrder{}, &model.OrderDiscountFinancial{}, &model.OrderSkuFinancial{}) // create table orm.RunSyncdb("default", false, true) } From 788ede6ac469de6c4dbae9e345a81f1b30a1eddb Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 25 Apr 2019 17:26:30 +0800 Subject: [PATCH 24/47] - test --- business/partner/purchase/weimob/wsc/wsc_test.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/business/partner/purchase/weimob/wsc/wsc_test.go b/business/partner/purchase/weimob/wsc/wsc_test.go index 7e9325197..c14454fee 100644 --- a/business/partner/purchase/weimob/wsc/wsc_test.go +++ b/business/partner/purchase/weimob/wsc/wsc_test.go @@ -3,6 +3,8 @@ package wsc import ( "testing" + "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" + "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxutils/tasks" "git.rosy.net.cn/jx-callback/globals" @@ -19,7 +21,7 @@ func init() { } func TestGetVendorCategories(t *testing.T) { - vendorCatList, err := new(PurchaseHandler).GetVendorCategories() + vendorCatList, err := new(PurchaseHandler).GetVendorCategories(jxcontext.AdminCtx) if err != nil { t.Fatal(err.Error()) } From 973b6c6869021ec24f2746d9e5c869ec6d10d8b6 Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 25 Apr 2019 21:35:33 +0800 Subject: [PATCH 25/47] =?UTF-8?q?-=20=E5=BF=BD=E7=95=A5=E5=9C=A8jd=20store?= =?UTF-8?q?Crud=E6=B6=88=E6=81=AF=E6=97=B6=E6=89=BE=E4=B8=8D=E5=88=B0?= =?UTF-8?q?=E9=97=A8=E5=BA=97=E7=9A=84=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/cms/storeman.go | 4 ++-- business/partner/purchase/jd/store.go | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/business/jxstore/cms/storeman.go b/business/jxstore/cms/storeman.go index 52a62b84d..1dd9b8cce 100644 --- a/business/jxstore/cms/storeman.go +++ b/business/jxstore/cms/storeman.go @@ -63,7 +63,7 @@ func (s *StoreManager) OnStoreStatusChanged(vendorStoreID string, vendorID int, } }() if storeKV != nil { - globals.SugarLogger.Debugf("OnStoreStatusChanged venvendorStoreID:%s, storeKV:%d", vendorStoreID, utils.Format4Output(storeKV, true)) + globals.SugarLogger.Debugf("OnStoreStatusChanged venvendorStoreID:%s, storeKV:%s", vendorStoreID, utils.Format4Output(storeKV, true)) store := &model.Store{} store.ID = storeDetail.Store.ID if err = utils.CallFuncLogError(func() error { @@ -74,7 +74,7 @@ func (s *StoreManager) OnStoreStatusChanged(vendorStoreID string, vendorID int, } } if storeMapKV != nil { - globals.SugarLogger.Debugf("OnStoreStatusChanged venvendorStoreID:%s, storeMapKV:%d", vendorStoreID, utils.Format4Output(storeMapKV, true)) + globals.SugarLogger.Debugf("OnStoreStatusChanged venvendorStoreID:%s, storeMapKV:%s", vendorStoreID, utils.Format4Output(storeMapKV, true)) if err = utils.CallFuncLogError(func() error { _, err = dao.UpdateEntityLogically(db, &model.StoreMap{}, storeMapKV, model.AdminName, map[string]interface{}{ model.FieldStoreID: storeDetail.Store.ID, diff --git a/business/partner/purchase/jd/store.go b/business/partner/purchase/jd/store.go index e7b0216d5..1fb193740 100644 --- a/business/partner/purchase/jd/store.go +++ b/business/partner/purchase/jd/store.go @@ -301,6 +301,7 @@ func (p *PurchaseHandler) GetStoreStatus(ctx *jxcontext.Context, vendorStoreID s return storeStatus, err } +// 当前京东的storeCrud消息不会在门店状态改变时发送,所以意义不大,先放在这里 func (c *PurchaseHandler) onStoreMsg(msg *jdapi.CallbackOrderMsg) (response *jdapi.CallbackResponse) { var err error if msg.StatusID == jdapi.StatusIDUpdateStore { @@ -308,6 +309,11 @@ func (c *PurchaseHandler) onStoreMsg(msg *jdapi.CallbackOrderMsg) (response *jda vendorStoreID := msg.BillID if storeStatus, err = c.GetStoreStatus(jxcontext.AdminCtx, vendorStoreID); err == nil { err = partner.CurStoreManager.OnStoreStatusChanged(vendorStoreID, model.VendorIDJD, storeStatus) + } else { + // 可能在门店删除的情况下会出查不到门店的错误 + if errExt, ok := err.(*utils.ErrorWithCode); ok && errExt.IntCode() == 4 { + err = nil + } } } return jdapi.Err2CallbackResponse(err, "") From aa72951154005c81b618945620b50fa4c710ed92 Mon Sep 17 00:00:00 2001 From: gazebo Date: Fri, 26 Apr 2019 11:23:39 +0800 Subject: [PATCH 26/47] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8Dmsghub=E4=B8=AD?= =?UTF-8?q?=E7=9A=84ServerMsgKeyOrderStatusChanged=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/msghub/msghub.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/business/msghub/msghub.go b/business/msghub/msghub.go index 578eb78c9..463028925 100644 --- a/business/msghub/msghub.go +++ b/business/msghub/msghub.go @@ -67,7 +67,7 @@ func routinueFunc() { registerMsg := msg.MsgData.(*MsgOp) delete(channelMap[registerMsg.StoreID], registerMsg.Chan2Listen) close(registerMsg.Chan2Close) - case ServerMsgNewOrder: + case ServerMsgNewOrder, ServerMsgKeyOrderStatusChanged: globals.SugarLogger.Debugf("msghub routinueFunc, msg:%s", utils.Format4Output(msg, false)) utils.CallFuncAsync(func() { for chan2Send := range channelMap[msg.StoreID] { From b01968e4518fcd7347373f6d16d8ea326b452d46 Mon Sep 17 00:00:00 2001 From: gazebo Date: Fri, 26 Apr 2019 11:32:28 +0800 Subject: [PATCH 27/47] =?UTF-8?q?-=20ServerMsgKeyOrderStatusChanged?= =?UTF-8?q?=E6=8E=A8=E9=80=81=E6=95=B4=E4=B8=AA=E8=AE=A2=E5=8D=95=E4=BF=A1?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/msghub/msghub.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/business/msghub/msghub.go b/business/msghub/msghub.go index 463028925..7766a0d95 100644 --- a/business/msghub/msghub.go +++ b/business/msghub/msghub.go @@ -171,7 +171,7 @@ func OnKeyOrderStatusChanged(order *model.GoodsOrder) { msgChan <- &ServerMsg{ Type: ServerMsgKeyOrderStatusChanged, StoreID: jxutils.GetSaleStoreIDFromOrder(order), - MsgData: 1, + MsgData: order, // MsgData: []*model.GoodsOrderExt{ // &model.GoodsOrderExt{ // GoodsOrder: *order, From 59cb7706a050140c2f198514920ff9079f126e87 Mon Sep 17 00:00:00 2001 From: gazebo Date: Fri, 26 Apr 2019 11:56:57 +0800 Subject: [PATCH 28/47] =?UTF-8?q?-=20=E9=9D=9E=E7=94=9F=E4=BA=A7=E7=8E=AF?= =?UTF-8?q?=E5=A2=83=E4=B8=8D=E9=99=90=E5=88=B6GetMsg=E7=9A=84=E7=AD=89?= =?UTF-8?q?=E5=BE=85=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/msghub/msghub.go | 10 ++++++---- globals/globals.go | 4 ++++ 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/business/msghub/msghub.go b/business/msghub/msghub.go index 7766a0d95..39144e0f3 100644 --- a/business/msghub/msghub.go +++ b/business/msghub/msghub.go @@ -125,10 +125,12 @@ func GetMsg(ctx *jxcontext.Context, storeID int, lastOrderTime time.Time, lastOr pollingDuration := defPollingDuration if waitingSecond != 0 { pollingDuration = time.Duration(waitingSecond) * time.Second - if pollingDuration > maxPollingDuration { - pollingDuration = maxPollingDuration - } else if pollingDuration < minPollingDuration { - pollingDuration = minPollingDuration + if globals.IsProductEnv() { + if pollingDuration > maxPollingDuration { + pollingDuration = maxPollingDuration + } else if pollingDuration < minPollingDuration { + pollingDuration = minPollingDuration + } } } timer := time.NewTimer(pollingDuration) diff --git a/globals/globals.go b/globals/globals.go index c6ab1223a..22a71c863 100644 --- a/globals/globals.go +++ b/globals/globals.go @@ -77,3 +77,7 @@ func Init() { func IsCallbackAlwaysReturnSuccess() bool { return beego.BConfig.RunMode == "beta" } + +func IsProductEnv() bool { + return beego.BConfig.RunMode == "prod" || beego.BConfig.RunMode == "jxgy" +} From c8d404516717db167ee06f411a4e2bef91b84f50 Mon Sep 17 00:00:00 2001 From: gazebo Date: Fri, 26 Apr 2019 14:36:00 +0800 Subject: [PATCH 29/47] =?UTF-8?q?-=20=E9=A5=BF=E7=99=BE=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E9=97=A8=E5=BA=97=E5=95=86=E5=93=81=E6=97=B6=EF=BC=8C=E6=A3=80?= =?UTF-8?q?=E6=9F=A5=E6=94=B9=E4=BB=B7=EF=BC=8C=E5=8F=AF=E5=94=AE=E6=A0=87?= =?UTF-8?q?=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/partner/purchase/ebai/store_sku.go | 24 ++++++++++++--------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/business/partner/purchase/ebai/store_sku.go b/business/partner/purchase/ebai/store_sku.go index 51c04f081..96c1848b1 100644 --- a/business/partner/purchase/ebai/store_sku.go +++ b/business/partner/purchase/ebai/store_sku.go @@ -387,16 +387,13 @@ func (p *PurchaseHandler) RefreshStoresAllSkusID(ctx *jxcontext.Context, parentT func genSkuParamsFromStoreSkuInfo(storeSku *tStoreSkuFullInfo) (params map[string]interface{}) { price := jxutils.CaculateSkuVendorPrice(storeSku.Price, storeSku.PricePercentage) params = map[string]interface{}{ - "name": jxutils.ComposeSkuName(storeSku.Prefix, storeSku.Name, storeSku.Comment, storeSku.Unit, storeSku.SpecQuality, storeSku.SpecUnit, 0), - "status": jxSkuStatus2Ebai(jxutils.MergeSkuStatus(storeSku.SkuStatus, storeSku.Status)), - "left_num": model.MaxStoreSkuStockQty, - "sale_price": price, - "market_price": price, - "category_id": storeSku.CatEbaiID, - "cat1_id": getEbaiCat(storeSku.EbaiCat1ID, 1), - "cat2_id": getEbaiCat(storeSku.EbaiCat2ID, 2), - "cat3_id": getEbaiCat(storeSku.EbaiCat3ID, 3), - "weight": storeSku.Weight, + "name": jxutils.ComposeSkuName(storeSku.Prefix, storeSku.Name, storeSku.Comment, storeSku.Unit, storeSku.SpecQuality, storeSku.SpecUnit, 0), + "left_num": model.MaxStoreSkuStockQty, + "category_id": storeSku.CatEbaiID, + "cat1_id": getEbaiCat(storeSku.EbaiCat1ID, 1), + "cat2_id": getEbaiCat(storeSku.EbaiCat2ID, 2), + "cat3_id": getEbaiCat(storeSku.EbaiCat3ID, 3), + "weight": storeSku.Weight, "photos": []map[string]interface{}{ map[string]interface{}{ "is_master": true, @@ -404,6 +401,13 @@ func genSkuParamsFromStoreSkuInfo(storeSku *tStoreSkuFullInfo) (params map[strin }, }, } + if storeSku.EbaiSyncStatus&(model.SyncFlagPriceMask|model.SyncFlagNewMask) != 0 { + params["sale_price"] = price + params["market_price"] = price + } + if storeSku.EbaiSyncStatus&(model.SyncFlagSaleMask|model.SyncFlagNewMask) != 0 { + params["status"] = jxSkuStatus2Ebai(jxutils.MergeSkuStatus(storeSku.SkuStatus, storeSku.Status)) + } // todo 饿百如果给的UPC是空要报错,但如果我要删除UPC怎么弄? if storeSku.Upc != "" { params["upc"] = storeSku.Upc From 7e0dcbc8ec0becce3141466e276232d6bc2aa07f Mon Sep 17 00:00:00 2001 From: gazebo Date: Fri, 26 Apr 2019 14:41:06 +0800 Subject: [PATCH 30/47] =?UTF-8?q?-=20AdjustOrder=E4=B8=ADreason=E4=B8=BA?= =?UTF-8?q?=E5=BC=BA=E5=88=B6=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controllers/jx_order.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/controllers/jx_order.go b/controllers/jx_order.go index 25da377cf..a40bf5863 100644 --- a/controllers/jx_order.go +++ b/controllers/jx_order.go @@ -362,7 +362,7 @@ func skuList2Map(skuList []*model.OrderSku) (skuMap map[int]*model.OrderSku) { // @Param vendorOrderID formData string true "订单ID" // @Param vendorID formData int true "订单所属厂商ID" // @Param removedSkuInfo formData string true "要去除的商品信息,只有skuID与Count字段有效" -// @Param reason formData string false "调整原因" +// @Param reason formData string true "调整原因" // @Success 200 {object} controllers.CallResult // @Failure 200 {object} controllers.CallResult // @router /AdjustOrder [put] @@ -371,7 +371,8 @@ func (c *OrderController) AdjustOrder() { var skuList []*model.OrderSku err = jxutils.Strings2Objs(params.RemovedSkuInfo, &skuList) if err == nil { - order, err := partner.CurOrderManager.LoadOrder(params.VendorOrderID, params.VendorID) + var order *model.GoodsOrder + order, err = partner.CurOrderManager.LoadOrder(params.VendorOrderID, params.VendorID) if err == nil { orderSkuMap := skuList2Map(order.Skus) removeSkuMap := skuList2Map(skuList) From d6ec47ed6c2b2e3aaa5ddec5013d38b1cd4bd58f Mon Sep 17 00:00:00 2001 From: gazebo Date: Fri, 26 Apr 2019 17:46:18 +0800 Subject: [PATCH 31/47] - refactor http.Get --- business/jxstore/initdata/initdata.go | 16 +++++++++++----- business/jxutils/jxutils_cms.go | 4 +--- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/business/jxstore/initdata/initdata.go b/business/jxstore/initdata/initdata.go index d402d9ef0..0036ec031 100644 --- a/business/jxstore/initdata/initdata.go +++ b/business/jxstore/initdata/initdata.go @@ -9,6 +9,8 @@ import ( "net/http" "strings" + "git.rosy.net.cn/baseapi/platformapi" + "git.rosy.net.cn/baseapi/platformapi/autonavi" "git.rosy.net.cn/baseapi/platformapi/jdapi" "git.rosy.net.cn/baseapi/utils" @@ -153,11 +155,15 @@ func InitSkuName(ctx *jxcontext.Context, isForce, isAsync, isContinueWhenError b response, err := http.Get(skuName.Img) if err == nil { defer response.Body.Close() - data, err2 := ioutil.ReadAll(response.Body) - if err = err2; err == nil { - skuName.ImgHashCode = fmt.Sprintf("%X", md5.Sum(data)) - db := dao.GetDB() - _, err = dao.UpdateEntity(db, skuName, "ImgHashCode") + if response.StatusCode == http.StatusOK { + data, err2 := ioutil.ReadAll(response.Body) + if err = err2; err == nil { + skuName.ImgHashCode = fmt.Sprintf("%X", md5.Sum(data)) + db := dao.GetDB() + _, err = dao.UpdateEntity(db, skuName, "ImgHashCode") + } + } else { + err = platformapi.ErrHTTPCodeIsNot200 } } } diff --git a/business/jxutils/jxutils_cms.go b/business/jxutils/jxutils_cms.go index 27d20d07a..8b045aa36 100644 --- a/business/jxutils/jxutils_cms.go +++ b/business/jxutils/jxutils_cms.go @@ -270,9 +270,7 @@ func (s SkuList) Swap(i, j int) { func DownloadFileByURL(fileURL string) (bodyData []byte, fileMD5 string, err error) { response, err := http.Get(fileURL) if err == nil { - defer func() { - response.Body.Close() - }() + defer response.Body.Close() if response.StatusCode == http.StatusOK { if bodyData, err = ioutil.ReadAll(response.Body); err == nil { fileMD5 = fmt.Sprintf("%X", md5.Sum(bodyData)) From 3b2a5d9b1c387a12355a341d4da234dfaaa1be52 Mon Sep 17 00:00:00 2001 From: gazebo Date: Fri, 26 Apr 2019 17:50:25 +0800 Subject: [PATCH 32/47] - eventhub - sys/GetWXToken --- business/jxutils/eventhub/eventhub.go | 263 ++++++++++++++++++ .../eventhub/syseventhub/syseventhub.go | 81 ++++++ business/jxutils/tasks/configrefresh.go | 66 ++++- conf/app.conf | 6 + controllers/sys.go | 31 +++ globals/globals.go | 6 + routers/commentsRouter_controllers.go | 9 + routers/router.go | 5 + 8 files changed, 460 insertions(+), 7 deletions(-) create mode 100644 business/jxutils/eventhub/eventhub.go create mode 100644 business/jxutils/eventhub/syseventhub/syseventhub.go create mode 100644 controllers/sys.go diff --git a/business/jxutils/eventhub/eventhub.go b/business/jxutils/eventhub/eventhub.go new file mode 100644 index 000000000..6beacfa71 --- /dev/null +++ b/business/jxutils/eventhub/eventhub.go @@ -0,0 +1,263 @@ +package eventhub + +import ( + "fmt" + "strings" + "sync" + "time" + + "git.rosy.net.cn/jx-callback/globals" + + "git.rosy.net.cn/baseapi/utils" +) + +const ( + cmdRegisterConsumer = 1 + cmdUnregisterConsumer = 2 + cmdNewEvent = 3 +) + +const ( + maxGetOrderTimeDuration = 24 * time.Hour + minPollingDuration = 1 * time.Minute + defPollingDuration = 5 * time.Minute + maxPollingDuration = 10 * time.Minute +) + +const ( + cmdChanLen = 100 +) + +const ( + allEventType = "" +) + +type IEventProducer interface { + GetEvent(eventTypeList []string, criteria interface{}) (event *EventInfo, err error) + IsCriteriaMatch(eventInfo *EventInfo, criteria interface{}) bool +} + +type EventInfo struct { + Type string + Data interface{} +} + +type tRegisterInfo struct { + notifyChan chan *EventInfo + eventCategory string + eventTypeList []string + criteria interface{} +} + +type tUnregisterInfo struct { + notifyChan chan *EventInfo + closeChan chan struct{} +} + +type tCmd struct { + cmdType int + data interface{} + // regisgerInfo *RegisterInfo // CmdRegisterConsumer + // unregisterInfo *UnregisterInfo // CmdUnregisterConsumer + // eventInfo *EventInfo // CmdNewEvent +} + +type EventHub struct { + cmdChan chan *tCmd + + chanMap map[chan *EventInfo]*tRegisterInfo + typeChanMap map[string]map[chan *EventInfo]bool + + eventCatMap map[string]IEventProducer + locker sync.RWMutex +} + +func eventRoutine(eventHub *EventHub) { + eventHub.eventRoutine() +} + +func New() (eventHub *EventHub) { + eventHub = &EventHub{ + cmdChan: make(chan *tCmd, cmdChanLen), + chanMap: make(map[chan *EventInfo]*tRegisterInfo), + typeChanMap: make(map[string]map[chan *EventInfo]bool), + eventCatMap: make(map[string]IEventProducer), + } + utils.CallFuncAsync(func() { + eventRoutine(eventHub) + }) + return eventHub +} + +func (e *EventHub) eventRoutine() { + for { + cmd, ok := <-e.cmdChan + if ok { + switch cmd.cmdType { + case cmdRegisterConsumer: + regisgerInfo := cmd.data.(*tRegisterInfo) + e.chanMap[regisgerInfo.notifyChan] = regisgerInfo + for _, eventType := range regisgerInfo.eventTypeList { + if e.typeChanMap[eventType] == nil { + e.typeChanMap[eventType] = make(map[chan *EventInfo]bool) + } + e.typeChanMap[eventType][regisgerInfo.notifyChan] = true + } + case cmdUnregisterConsumer: + unregisgerInfo := cmd.data.(*tUnregisterInfo) + e.removeChan(unregisgerInfo.notifyChan) + close(unregisgerInfo.closeChan) + case cmdNewEvent: + eventInfo := cmd.data.(*EventInfo) + typeList := []string{allEventType, eventInfo.Type} + tmpChanMap := make(map[chan *EventInfo]*tRegisterInfo) + for _, eventType := range typeList { + for notifyChan := range e.typeChanMap[eventType] { + tmpChanMap[notifyChan] = e.chanMap[notifyChan] + } + } + for notifyChan, registerInfo := range tmpChanMap { + eventCategory, _ := splitEventType(eventInfo.Type) + if eventProducer := e.getEventProducer(eventCategory); eventProducer != nil { + if eventProducer.IsCriteriaMatch(eventInfo, registerInfo.criteria) { + notifyChan <- eventInfo + e.removeChan(notifyChan) + } + } else { + globals.SugarLogger.Warnf("eventRoutine, eventCategory:%s producer is nil") + } + } + } + } else { + break + } + } +} + +func (e *EventHub) removeChan(notifyChann chan *EventInfo) { + typeList := e.chanMap[notifyChann].eventTypeList + for _, eventType := range typeList { + delete(e.typeChanMap[eventType], notifyChann) + } + delete(e.chanMap, notifyChann) +} + +func (e *EventHub) Close() { + close(e.cmdChan) +} + +func (e *EventHub) RegisterProducer(eventCategory string, producer IEventProducer) (err error) { + e.locker.Lock() + if e.eventCatMap[eventCategory] != nil { + err = fmt.Errorf("eventCategory:%s已经被注册了", eventCategory) + } else { + e.eventCatMap[eventCategory] = producer + } + e.locker.Unlock() + return err +} + +// 正常不应该是动态的经常调用注册与反注册Producer,只是退出进程前礼貌的调用 +func (e *EventHub) UnregisterProducer(eventCategory string) (err error) { + e.locker.Lock() + if e.eventCatMap[eventCategory] == nil { + err = fmt.Errorf("eventCategory:%s没有注册", eventCategory) + } else { + delete(e.eventCatMap, eventCategory) + } + e.locker.Unlock() + return err +} + +func (e *EventHub) registerConsumer(eventCategory string, eventTypeList []string, criteria interface{}) (notifyChan chan *EventInfo) { + if len(eventTypeList) == 0 { + eventTypeList = []string{allEventType} + } + realEventTypeList := make([]string, len(eventTypeList)) + for index, eventType := range eventTypeList { + realEventTypeList[index] = composeEventType(eventCategory, eventType) + } + info := &tRegisterInfo{ + eventCategory: eventCategory, + eventTypeList: eventTypeList, + notifyChan: make(chan *EventInfo, 1), + criteria: criteria, + } + e.cmdChan <- &tCmd{ + cmdType: cmdRegisterConsumer, + data: info, + } + return info.notifyChan +} + +func (e *EventHub) unregisterConsumer(notifyChan chan *EventInfo) { + info := &tUnregisterInfo{ + notifyChan: notifyChan, + closeChan: make(chan struct{}), + } + e.cmdChan <- &tCmd{ + cmdType: cmdUnregisterConsumer, + data: info, + } + <-info.closeChan +} + +func (e *EventHub) PostNewEvent(eventCategory string, event *EventInfo) { + newEvent := *event + newEvent.Type = composeEventType(eventCategory, event.Type) + e.cmdChan <- &tCmd{ + cmdType: cmdNewEvent, + data: event, + } +} + +func (e *EventHub) GetEvent(eventCategory string, eventTypeList []string, criteria interface{}, waitTime time.Duration) (event *EventInfo, err error) { + eventProducer := e.getEventProducer(eventCategory) + if eventProducer == nil { + return nil, fmt.Errorf("eventCategory:%s没有注册", eventCategory) + } + event, err = eventProducer.GetEvent(eventTypeList, criteria) + if err == nil && event == nil { + notifyChan := e.registerConsumer(eventCategory, eventTypeList, criteria) + pollingDuration := defPollingDuration + if waitTime != 0 { + pollingDuration = waitTime + if globals.IsProductEnv() { + if pollingDuration > maxPollingDuration { + pollingDuration = maxPollingDuration + } else if pollingDuration < minPollingDuration { + pollingDuration = minPollingDuration + } + } + } + timer := time.NewTimer(pollingDuration) + select { + case tmpEvent, ok := <-notifyChan: + timer.Stop() + if ok { + event = tmpEvent + } + case <-timer.C: + e.unregisterConsumer(notifyChan) + } + close(notifyChan) + } + return event, err +} + +func (e *EventHub) getEventProducer(eventCategory string) IEventProducer { + e.locker.RLock() + defer e.locker.RUnlock() + return e.eventCatMap[eventCategory] +} + +func composeEventType(eventCategory, eventType string) string { + return eventCategory + "/" + eventType +} + +func splitEventType(eventType string) (eventCategory, pureEventType string) { + typeList := strings.Split(eventType, "/") + eventCategory = typeList[0] + pureEventType = typeList[1] + return eventCategory, pureEventType +} diff --git a/business/jxutils/eventhub/syseventhub/syseventhub.go b/business/jxutils/eventhub/syseventhub/syseventhub.go new file mode 100644 index 000000000..784092f54 --- /dev/null +++ b/business/jxutils/eventhub/syseventhub/syseventhub.go @@ -0,0 +1,81 @@ +package syseventhub + +import ( + "time" + + "git.rosy.net.cn/jx-callback/business/jxutils/eventhub" + "git.rosy.net.cn/jx-callback/globals/api" +) + +const ( + EventCategory = "sys" + + EventTypeWXToken = "wxtoken" +) + +type Hub struct { + eventHub *eventhub.EventHub +} + +type Criteria struct { +} + +var ( + SysEventHub *Hub +) + +func init() { + SysEventHub = New() +} + +func New() (hub *Hub) { + hub = &Hub{ + eventHub: eventhub.New(), + } + hub.eventHub.RegisterProducer(EventCategory, hub) + return hub +} + +func (h *Hub) GetEvent(eventTypeList []string, criteria interface{}) (event *eventhub.EventInfo, err error) { + for _, eventType := range eventTypeList { + switch eventType { + case EventTypeWXToken: + return h.getWXToken(criteria) + } + } + return event, err +} + +func (h *Hub) getWXToken(criteria interface{}) (event *eventhub.EventInfo, err error) { + criteriaToken := "" + if criteria != nil { + criteriaToken = criteria.(string) + } + token := api.WeixinAPI.CBGetToken() + if token != criteriaToken { + return &eventhub.EventInfo{ + Type: EventTypeWXToken, + Data: token, + }, nil + } + return nil, nil +} + +func (h *Hub) IsCriteriaMatch(eventInfo *eventhub.EventInfo, criteria interface{}) bool { + return true +} + +func (h *Hub) OnNewWXToken(token string) { + h.eventHub.PostNewEvent(EventCategory, &eventhub.EventInfo{ + Type: EventTypeWXToken, + Data: token, + }) +} + +func (h *Hub) GetWXToken(oldToken string, waitTime time.Duration) (token string) { + eventInfo, err := h.eventHub.GetEvent(EventCategory, []string{EventTypeWXToken}, oldToken, waitTime) + if err == nil && eventInfo != nil { + token = eventInfo.Data.(string) + } + return token +} diff --git a/business/jxutils/tasks/configrefresh.go b/business/jxutils/tasks/configrefresh.go index aa4b9ba76..120a1316d 100644 --- a/business/jxutils/tasks/configrefresh.go +++ b/business/jxutils/tasks/configrefresh.go @@ -1,8 +1,15 @@ package tasks import ( + "fmt" + "io/ioutil" + "net/http" + "strings" "time" + "git.rosy.net.cn/baseapi/platformapi" + + "git.rosy.net.cn/jx-callback/business/jxutils/eventhub/syseventhub" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/business/model/dao" "git.rosy.net.cn/jx-callback/business/model/legacymodel" @@ -36,6 +43,12 @@ type ElmTokenForCompatible struct { Success bool `json:"success"` } +type CallResult struct { + Code string `json:"code"` + Desc string `json:"desc"` + Data string `json:"data"` +} + func RefreshConfig(configKey string, expiresTime time.Duration, configGetter func() (string, string), configSetter func(value string)) error { sleepGap := expiresTime / 10 needRefreshGap := expiresTime * 8 / 10 @@ -108,18 +121,23 @@ func RefreshConfig(configKey string, expiresTime time.Duration, configGetter fun func RefreshWeixinToken() (err error) { if api.WeixinAPI != nil { - err = RefreshConfig("wechat", weixinTokenExpires, func() (string, string) { + err = RefreshConfig("wechat", weixinTokenExpires, func() (token string, expireTimeStr string) { globals.SugarLogger.Debugf("RefreshWeixinToken RunMode:%s", beego.BConfig.RunMode) - if beego.BConfig.RunMode == "prod" { - if tokenInfo, err := api.WeixinAPI.CBRetrieveToken(); err == nil { - globals.SugarLogger.Debugf("RefreshWeixinToken tokenInfo:%s", utils.Format4Output(tokenInfo, true)) - return tokenInfo.AccessToken, "" + if globals.IsProductEnv() { + if beego.BConfig.RunMode == "prod" { + if tokenInfo, err := api.WeixinAPI.CBRetrieveToken(); err == nil { + globals.SugarLogger.Debugf("RefreshWeixinToken tokenInfo:%s", utils.Format4Output(tokenInfo, true)) + token = tokenInfo.AccessToken + } else { + globals.SugarLogger.Errorf("RefreshWeixinToken RefreshToken failed with error:%v", err) + } } else { - globals.SugarLogger.Errorf("RefreshWeixinToken RefreshToken failed with error:%v", err) + token = getWXTokenFromProd(api.WeixinAPI.CBGetToken()) } } - return "", "" + return token, "" }, func(value string) { + syseventhub.SysEventHub.OnNewWXToken(value) api.WeixinAPI.CBSetToken(value) }) } @@ -223,3 +241,37 @@ func RefreshYilianyunToken() (err error) { } }) } + +func getWXTokenFromProd(oldToken string) (token string) { + token = oldToken + if globals.GetWeixinTokenKey != "" && globals.GetWeixinTokenURL != "" { + for { + waitSecond := 5 * 60 + response, err := http.Get(fmt.Sprintf("%s?accessKey=%s&oldToken=%s&waitSecond=%d", globals.GetWeixinTokenURL, globals.GetWeixinTokenKey, oldToken, waitSecond)) + if err == nil { + defer response.Body.Close() + if response.StatusCode == http.StatusOK { + data, err2 := ioutil.ReadAll(response.Body) + if err = err2; err == nil { + var result CallResult + if err = utils.UnmarshalUseNumber(data, &result); err == nil { + if result.Code == "0" { + token = strings.Replace(result.Data, "\"", "", -1) + break + } else { + err = fmt.Errorf("return code is:%s", result.Code) + } + } + } + } else { + err = platformapi.ErrHTTPCodeIsNot200 + } + } + if err != nil { + globals.SugarLogger.Infof("getWXTokenFromProd failed with error:%v", err) + time.Sleep(30 * time.Second) + } + } + } + return token +} diff --git a/conf/app.conf b/conf/app.conf index 19a69713c..f2a3decd9 100644 --- a/conf/app.conf +++ b/conf/app.conf @@ -81,6 +81,8 @@ yilianyunClientSecret = "4885d07c2997b661102e4b6099c0bf3b" zhongwuAppID = 8000192 zhongwuAppSecret = "29435497822f52f3cf659c65da548a79" +getWeixinTokenKey = "c928ed0d-87a3-441a-8517-f92f0167296f" + [dev] jdToken = "df97f334-f7d8-4b36-9664-5784d8ae0baf" jdAppKey = "06692746f7224695ad4788ce340bc854" @@ -107,6 +109,8 @@ weixinToken = "17_roSCZgkCxhRnyFVtei0KdfHwdGP8PmLzJFhCieka4_X4_d-lgfaTxF6oIS6FE5 dbConnectStr = "root:WebServer@1@tcp(127.0.0.1:3306)/jxd_dev_0?charset=utf8mb4&loc=Local&parseTime=true" +getWeixinTokenURL = "http://beta.jxc4.com/v2/sys/GetWXToken" + [prod] EnableDocs = false @@ -192,6 +196,8 @@ dingdingQRCodeSecret = "N9dyC9qB84sauQPs4_JYrILMsG5Krqm9-PSSVJ8t9hb87rrHiFUirISx dingdingCallbackURL = "http://callback-jxgy.jxc4.com/dingding/msg" +getWeixinTokenURL = "http://www.jxc4.com/v2/sys/GetWXToken" + [prod2] httpport = 8082 diff --git a/controllers/sys.go b/controllers/sys.go new file mode 100644 index 000000000..49ec6a78f --- /dev/null +++ b/controllers/sys.go @@ -0,0 +1,31 @@ +package controllers + +import ( + "time" + + "git.rosy.net.cn/jx-callback/globals" + + "git.rosy.net.cn/jx-callback/business/jxutils/eventhub/syseventhub" + "github.com/astaxie/beego" +) + +type SysController struct { + beego.Controller +} + +// @Title 得到京西门店信息 +// @Description 得到京西门店信息,如下条件之间是与的关系 +// @Param accessKey query string true "假token" +// @Param oldToken query string true "之前的token" +// @Param waitSecond query int false "等待秒数" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /GetWXToken [get] +func (c *SysController) GetWXToken() { + c.callGetWXToken(func(params *tSysGetWXTokenParams) (retVal interface{}, errCode string, err error) { + if params.AccessKey == globals.GetWeixinTokenKey { + retVal = syseventhub.SysEventHub.GetWXToken(params.OldToken, time.Duration(params.WaitSecond)*time.Second) + } + return retVal, "", err + }) +} diff --git a/globals/globals.go b/globals/globals.go index 22a71c863..eab441301 100644 --- a/globals/globals.go +++ b/globals/globals.go @@ -37,6 +37,9 @@ var ( BackstageHost string WxBackstageHost string + + GetWeixinTokenURL string + GetWeixinTokenKey string ) func init() { @@ -72,6 +75,9 @@ func Init() { BackstageHost = beego.AppConfig.DefaultString("backstageHost", "") WxBackstageHost = beego.AppConfig.DefaultString("wxBackstageHost", "") + + GetWeixinTokenURL = beego.AppConfig.DefaultString("getWeixinTokenURL", "") + GetWeixinTokenKey = beego.AppConfig.DefaultString("getWeixinTokenKey", "") } func IsCallbackAlwaysReturnSuccess() bool { diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index da6a6b99e..1261ef2b0 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -1267,6 +1267,15 @@ func init() { Filters: nil, Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SysController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SysController"], + beego.ControllerComments{ + Method: "GetWXToken", + Router: `/GetWXToken`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:TaskController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:TaskController"], beego.ControllerComments{ Method: "CancelTask", diff --git a/routers/router.go b/routers/router.go index 72a2a7e2d..d6a0285aa 100644 --- a/routers/router.go +++ b/routers/router.go @@ -101,6 +101,11 @@ func init() { &controllers.TempOpController{}, ), ), + beego.NSNamespace("/sys", + beego.NSInclude( + &controllers.SysController{}, + ), + ), ) beego.AddNamespace(ns) From beb6482a1aa19bcda93d6e41c7e975980d6cf929 Mon Sep 17 00:00:00 2001 From: gazebo Date: Sat, 27 Apr 2019 10:58:19 +0800 Subject: [PATCH 33/47] =?UTF-8?q?-=20WaybillStatusFailed=E4=B9=9F=E4=BC=9A?= =?UTF-8?q?=E9=87=8D=E6=96=B0=E5=88=9B=E5=BB=BA=E4=B8=89=E6=96=B9=E8=BF=90?= =?UTF-8?q?=E5=8D=95=20-=20dadaapi.OrderStatusExpired=E6=98=A0=E5=B0=84?= =?UTF-8?q?=E4=B8=BAWaybillStatusCanceled=EF=BC=88=E4=B9=8B=E5=89=8D?= =?UTF-8?q?=E4=B8=BAWaybillStatusFailed=EF=BC=89=20-=20=E8=BE=BE=E8=BE=BE?= =?UTF-8?q?=E9=87=8D=E6=96=B0=E5=88=9B=E5=BB=BA=E8=BF=90=E5=8D=95=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E5=88=A4=E6=96=AD=E4=B9=8B=E5=89=8D=E7=9A=84=E8=BF=90?= =?UTF-8?q?=E5=8D=95=E7=8A=B6=E6=80=81=EF=BC=8C=E5=A6=82=E6=9E=9C=E6=98=AF?= =?UTF-8?q?WaybillStatusFailed=EF=BC=8C=E5=88=99=E4=B8=BA=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E8=AE=A2=E5=8D=95=20-=20=E5=8E=BB=E6=8E=89dao.=20Wrap?= =?UTF-8?q?DB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jxcallback/scheduler/defsch/defsch.go | 15 +------ business/jxstore/tempop/tempop.go | 4 +- business/model/const.go | 2 +- business/model/dao/dao.go | 4 -- business/partner/delivery/dada/waybill.go | 40 +++++++++---------- business/partner/delivery/delivery.go | 8 ++-- business/partner/delivery/mtps/waybill.go | 9 ++--- 7 files changed, 29 insertions(+), 53 deletions(-) diff --git a/business/jxcallback/scheduler/defsch/defsch.go b/business/jxcallback/scheduler/defsch/defsch.go index 5db3e672e..9b160bfcc 100644 --- a/business/jxcallback/scheduler/defsch/defsch.go +++ b/business/jxcallback/scheduler/defsch/defsch.go @@ -409,20 +409,7 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo // s.ProxyCancelWaybill(order, bill, partner.CancelWaybillReasonNotAcceptIntime, partner.CancelWaybillReasonStrNotAcceptIntime) globals.SugarLogger.Infof("OnWaybillStatusChanged CourierArrived order(%d, %s) bill(%d, %s), bill:%v shouldn't get here", order.WaybillVendorID, order.VendorWaybillID, bill.WaybillVendorID, bill.VendorWaybillID, bill) } - case model.WaybillStatusFailed: // todo WaybillStatusFailed理解成订单整个失败了,不需要再尝试创建运单了,注意这里应该加个zabbix日志的报警 - s.removeWaybillFromMap(savedOrderInfo, bill.WaybillVendorID) - if s.isBillCandidate(order, bill) { - s.resetTimer(savedOrderInfo, bill, isPending) - if !isPending { - globals.SugarLogger.Infof("OnWaybillStatusChanged WaybillStatusFailed, bill:%v", bill) - bill.WaybillVendorID = model.VendorIDUnknown - s.updateOrderByBill(order, bill, false) - } - } else { - // 创建运单失败时,可能到这里来(比如:818874313000121) - globals.SugarLogger.Infof("OnWaybillStatusChanged Failed bill:%v shouldn't got here, order details:%v", bill, order) - } - case model.WaybillStatusCanceled: + case model.WaybillStatusCanceled, model.WaybillStatusFailed: s.removeWaybillFromMap(savedOrderInfo, bill.WaybillVendorID) if s.isBillCandidate(order, bill) || order.WaybillVendorID == model.VendorIDUnknown { s.resetTimer(savedOrderInfo, nil, isPending) diff --git a/business/jxstore/tempop/tempop.go b/business/jxstore/tempop/tempop.go index 1074ce8ee..cb4ffdcc8 100644 --- a/business/jxstore/tempop/tempop.go +++ b/business/jxstore/tempop/tempop.go @@ -23,7 +23,6 @@ import ( "git.rosy.net.cn/jx-callback/business/partner/purchase/ebai" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" - "github.com/astaxie/beego/orm" ) var innerDataPat *regexp.Regexp @@ -605,8 +604,7 @@ func CreateOrderFromOriginal(ctx *jxcontext.Context, isAsync, isContinueWhenErro WHERE t2.id IS NULL LIMIT ?; ` - rawDB := orm.NewOrm() - db := dao.WrapDB(rawDB) + db := dao.GetDB() var orderList []*GoodsOrderOriginalEx if err = dao.GetRows(db, &orderList, sql, sqlBatchCount); err != nil { return nil, err diff --git a/business/model/const.go b/business/model/const.go index 6a61674f7..e24837af5 100644 --- a/business/model/const.go +++ b/business/model/const.go @@ -215,7 +215,7 @@ const ( WaybillStatusEndBegin = 100 // 以下的状态就是结束状态 WaybillStatusDelivered = 105 // todo 这个应该改为110,与订单对应 WaybillStatusCanceled = 115 - WaybillStatusFailed = 120 // todo 这个应该要去掉 + WaybillStatusFailed = 120 // 这个状态存在的意义是区分于WaybillStatusCanceled,比如达达平台在这种状态下再次创建运单的方式不一样 WaybillStatusNeverSend = 125 // 这个状态指的是平台方不愿意配送,门店自己想办法。与WaybillStatusAcceptCanceled不一样,WaybillStatusAcceptCanceled可能之后还会尝试配送 ) diff --git a/business/model/dao/dao.go b/business/model/dao/dao.go index 994f42748..257b5c067 100644 --- a/business/model/dao/dao.go +++ b/business/model/dao/dao.go @@ -59,10 +59,6 @@ func GetDB() *DaoDB { return &DaoDB{Db: orm.NewOrm()} } -func WrapDB(ormDb orm.Ormer) *DaoDB { - return &DaoDB{Db: ormDb} -} - func Begin(db *DaoDB) (err error) { if db.transactionLevel == 0 { err = db.Db.Begin() diff --git a/business/partner/delivery/dada/waybill.go b/business/partner/delivery/dada/waybill.go index 685c1425b..1061337b8 100644 --- a/business/partner/delivery/dada/waybill.go +++ b/business/partner/delivery/dada/waybill.go @@ -15,7 +15,6 @@ import ( "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" "github.com/astaxie/beego" - "github.com/astaxie/beego/orm" ) const ( @@ -70,9 +69,9 @@ func (c *DeliveryHandler) onWaybillMsg(msg *dadaapi.CallbackMsg) (retVal *dadaap order.Status = model.WaybillStatusDelivering case dadaapi.OrderStatusFinished: order.Status = model.WaybillStatusDelivered - case dadaapi.OrderStatusCanceled: + case dadaapi.OrderStatusCanceled, dadaapi.OrderStatusExpired: order.Status = model.WaybillStatusCanceled - case dadaapi.OrderStatusExpired, dadaapi.OrderStatusAddOrderFailed: + case dadaapi.OrderStatusAddOrderFailed: order.Status = model.WaybillStatusFailed default: order.Status = model.WaybillStatusUnknown @@ -102,7 +101,7 @@ func (c *DeliveryHandler) callbackMsg2Waybill(msg *dadaapi.CallbackMsg) (retVal // IDeliveryPlatformHandler func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, policy partner.CreateWaybillPolicy) (bill *model.Waybill, err error) { - db := orm.NewOrm() + db := dao.GetDB() deliveryFee, addFee, err := delivery.CalculateOrderDeliveryFee(order, time.Now(), db) if err != nil { return nil, err @@ -133,17 +132,18 @@ func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, policy partner. if globals.EnableStoreWrite { // 达达要求第二次创建运单,调用函数不同。所以查找两天内有无相同订单号的运单 - var lists []orm.ParamsList - num, err2 := db.Raw(` - SELECT vendor_waybill_id - FROM waybill - WHERE waybill_created_at > DATE_ADD(NOW(), interval -2 day) - AND vendor_order_id = ? - AND waybill_vendor_id = ? - `, jxutils.ComposeUniversalOrderID(order.VendorOrderID, order.VendorID), model.VendorIDDada).ValuesList(&lists) + var waybillList []*model.Waybill + err2 := dao.GetRows(db, &waybillList, ` + SELECT * + FROM waybill + WHERE waybill_created_at > DATE_ADD(NOW(), interval -2 day) + AND vendor_order_id = ? + AND waybill_vendor_id = ? + ORDER BY id DESC + `, jxutils.ComposeUniversalOrderID(order.VendorOrderID, order.VendorID), model.VendorIDDada) var result *dadaapi.CreateOrderResponse - if err = err2; err == nil && num > 0 { - globals.SugarLogger.Debugf("CreateWaybill orderID:%s num=%d use ReaddOrder", order.VendorOrderID, num) + if err = err2; err == nil && len(waybillList) > 0 && waybillList[0].Status != model.WaybillStatusFailed { + globals.SugarLogger.Debugf("CreateWaybill orderID:%s len(waybillList)=%d use ReaddOrder", order.VendorOrderID, len(waybillList)) result, err = api.DadaAPI.ReaddOrder(billParams, addParams) } else { if err != nil { @@ -192,7 +192,7 @@ func (c *DeliveryHandler) CancelWaybill(bill *model.Waybill, cancelReasonID int, return err } -func (c *DeliveryHandler) getDataCityCodeFromOrder(order *model.GoodsOrder, db orm.Ormer) (retVal string, err error) { +func (c *DeliveryHandler) getDataCityCodeFromOrder(order *model.GoodsOrder, db *dao.DaoDB) (retVal string, err error) { jxStoreID := jxutils.GetSaleStoreIDFromOrder(order) sql := ` SELECT t2.tel_code @@ -200,11 +200,10 @@ func (c *DeliveryHandler) getDataCityCodeFromOrder(order *model.GoodsOrder, db o JOIN place t2 on t1.city_code = t2.code WHERE t1.id = ? ` - db2 := dao.WrapDB(db) codeInfo := &struct { TelCode string }{} - if err = dao.GetRow(db2, codeInfo, sql, jxStoreID); err != nil { + if err = dao.GetRow(db, codeInfo, sql, jxStoreID); err != nil { globals.SugarLogger.Errorf("GetDataCityCodeFromOrder can not find store info for vendorID:%d, store:%s, error:%v", order.VendorID, order.VendorStoreID, err) if err == nil { err = ErrCanNotFindDadaCityCode @@ -214,11 +213,10 @@ func (c *DeliveryHandler) getDataCityCodeFromOrder(order *model.GoodsOrder, db o return codeInfo.TelCode, nil } -func (c *DeliveryHandler) getDadaShopID(order *model.GoodsOrder, db orm.Ormer) (retVal string, err error) { +func (c *DeliveryHandler) getDadaShopID(order *model.GoodsOrder, db *dao.DaoDB) (retVal string, err error) { saleStoreID := jxutils.GetSaleStoreIDFromOrder(order) - db2 := dao.WrapDB(db) - storeCourierList, err2 := dao.GetOpenedStoreCouriersByStoreID(db2, saleStoreID, model.VendorIDDada) - if err = err2; err != nil && err != orm.ErrNoRows { + storeCourierList, err2 := dao.GetOpenedStoreCouriersByStoreID(db, saleStoreID, model.VendorIDDada) + if err = err2; err != nil && !dao.IsNoRowsError(err) { return "", err } if len(storeCourierList) == 0 { diff --git a/business/partner/delivery/delivery.go b/business/partner/delivery/delivery.go index 225f68456..9fb2e5492 100644 --- a/business/partner/delivery/delivery.go +++ b/business/partner/delivery/delivery.go @@ -12,7 +12,6 @@ import ( "git.rosy.net.cn/jx-callback/business/model/dao" "git.rosy.net.cn/jx-callback/business/partner" "git.rosy.net.cn/jx-callback/globals" - "github.com/astaxie/beego/orm" ) const ( @@ -57,10 +56,10 @@ func CallCreateWaybillPolicy(policy partner.CreateWaybillPolicy, refDeliveryFee, return nil } -func CalculateOrderDeliveryFee(order *model.GoodsOrder, billTime time.Time, db orm.Ormer) (deliveryFee, addFee int64, err error) { +func CalculateOrderDeliveryFee(order *model.GoodsOrder, billTime time.Time, db *dao.DaoDB) (deliveryFee, addFee int64, err error) { globals.SugarLogger.Debugf("CalculateOrderDeliveryFee orderID:%s", order.VendorOrderID) if db == nil { - db = orm.NewOrm() + db = dao.GetDB() } jxStoreID := jxutils.GetSaleStoreIDFromOrder(order) var lng, lat float64 @@ -69,8 +68,7 @@ func CalculateOrderDeliveryFee(order *model.GoodsOrder, billTime time.Time, db o Lng int Lat int }{} - db2 := dao.WrapDB(db) - if err = dao.GetRow(db2, priceInfo, ` + if err = dao.GetRow(db, priceInfo, ` SELECT t2.mtps_price price, t1.lng, t1.lat FROM store t1 JOIN place t2 ON t1.city_code = t2.code diff --git a/business/partner/delivery/mtps/waybill.go b/business/partner/delivery/mtps/waybill.go index afd92c1dc..41a78e228 100644 --- a/business/partner/delivery/mtps/waybill.go +++ b/business/partner/delivery/mtps/waybill.go @@ -115,7 +115,7 @@ func (c *DeliveryHandler) callbackMsg2Waybill(msg *mtpsapi.CallbackOrderMsg) (re // IDeliveryPlatformHandler func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, policy partner.CreateWaybillPolicy) (bill *model.Waybill, err error) { - db := orm.NewOrm() + db := dao.GetDB() deliveryFee, addFee, err := delivery.CalculateOrderDeliveryFee(order, time.Now(), db) if err == nil { if err = delivery.CallCreateWaybillPolicy(policy, deliveryFee, addFee, deliveryFee, order, model.VendorIDMTPS); err != nil { @@ -201,16 +201,15 @@ func (c *DeliveryHandler) CancelWaybill(bill *model.Waybill, cancelReasonID int, return nil } -func (c *DeliveryHandler) getDeliveryID(order *model.GoodsOrder, db orm.Ormer) (retVal int64, err error) { +func (c *DeliveryHandler) getDeliveryID(order *model.GoodsOrder, db *dao.DaoDB) (retVal int64, err error) { // jxorder表当前已经有50多万条记录了,加100万避免冲突 // 508505 return order.ID + 1000000, nil } -func (c *DeliveryHandler) getMTPSShopID(order *model.GoodsOrder, db orm.Ormer) (retVal string, err error) { +func (c *DeliveryHandler) getMTPSShopID(order *model.GoodsOrder, db *dao.DaoDB) (retVal string, err error) { saleStoreID := jxutils.GetSaleStoreIDFromOrder(order) - db2 := dao.WrapDB(db) - storeCourierList, err2 := dao.GetOpenedStoreCouriersByStoreID(db2, saleStoreID, model.VendorIDMTPS) + storeCourierList, err2 := dao.GetOpenedStoreCouriersByStoreID(db, saleStoreID, model.VendorIDMTPS) if err = err2; err != nil && err != orm.ErrNoRows { return "", err } From dbd9e3a3d22a5016b812e1851ea4058c022a5c0e Mon Sep 17 00:00:00 2001 From: gazebo Date: Sat, 27 Apr 2019 15:44:26 +0800 Subject: [PATCH 34/47] =?UTF-8?q?-=20=E8=A7=A3=E5=86=B3wxtoken=E7=9A=84?= =?UTF-8?q?=E5=88=B7=E6=96=B0=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxutils/eventhub/eventhub.go | 48 ++++++++--------- .../eventhub/syseventhub/syseventhub.go | 51 ++++++++----------- business/jxutils/tasks/configrefresh.go | 21 +++++--- 3 files changed, 54 insertions(+), 66 deletions(-) diff --git a/business/jxutils/eventhub/eventhub.go b/business/jxutils/eventhub/eventhub.go index 6beacfa71..4b3e02991 100644 --- a/business/jxutils/eventhub/eventhub.go +++ b/business/jxutils/eventhub/eventhub.go @@ -33,7 +33,6 @@ const ( ) type IEventProducer interface { - GetEvent(eventTypeList []string, criteria interface{}) (event *EventInfo, err error) IsCriteriaMatch(eventInfo *EventInfo, criteria interface{}) bool } @@ -212,36 +211,29 @@ func (e *EventHub) PostNewEvent(eventCategory string, event *EventInfo) { } func (e *EventHub) GetEvent(eventCategory string, eventTypeList []string, criteria interface{}, waitTime time.Duration) (event *EventInfo, err error) { - eventProducer := e.getEventProducer(eventCategory) - if eventProducer == nil { - return nil, fmt.Errorf("eventCategory:%s没有注册", eventCategory) - } - event, err = eventProducer.GetEvent(eventTypeList, criteria) - if err == nil && event == nil { - notifyChan := e.registerConsumer(eventCategory, eventTypeList, criteria) - pollingDuration := defPollingDuration - if waitTime != 0 { - pollingDuration = waitTime - if globals.IsProductEnv() { - if pollingDuration > maxPollingDuration { - pollingDuration = maxPollingDuration - } else if pollingDuration < minPollingDuration { - pollingDuration = minPollingDuration - } + notifyChan := e.registerConsumer(eventCategory, eventTypeList, criteria) + pollingDuration := defPollingDuration + if waitTime != 0 { + pollingDuration = waitTime + if globals.IsProductEnv() { + if pollingDuration > maxPollingDuration { + pollingDuration = maxPollingDuration + } else if pollingDuration < minPollingDuration { + pollingDuration = minPollingDuration } } - timer := time.NewTimer(pollingDuration) - select { - case tmpEvent, ok := <-notifyChan: - timer.Stop() - if ok { - event = tmpEvent - } - case <-timer.C: - e.unregisterConsumer(notifyChan) - } - close(notifyChan) } + timer := time.NewTimer(pollingDuration) + select { + case tmpEvent, ok := <-notifyChan: + timer.Stop() + if ok { + event = tmpEvent + } + case <-timer.C: + e.unregisterConsumer(notifyChan) + } + close(notifyChan) return event, err } diff --git a/business/jxutils/eventhub/syseventhub/syseventhub.go b/business/jxutils/eventhub/syseventhub/syseventhub.go index 784092f54..baedfe79a 100644 --- a/business/jxutils/eventhub/syseventhub/syseventhub.go +++ b/business/jxutils/eventhub/syseventhub/syseventhub.go @@ -20,6 +20,11 @@ type Hub struct { type Criteria struct { } +type WXTokenInfo struct { + IsNew bool `json:"isNew"` + Token string `json:"token"` +} + var ( SysEventHub *Hub ) @@ -36,31 +41,6 @@ func New() (hub *Hub) { return hub } -func (h *Hub) GetEvent(eventTypeList []string, criteria interface{}) (event *eventhub.EventInfo, err error) { - for _, eventType := range eventTypeList { - switch eventType { - case EventTypeWXToken: - return h.getWXToken(criteria) - } - } - return event, err -} - -func (h *Hub) getWXToken(criteria interface{}) (event *eventhub.EventInfo, err error) { - criteriaToken := "" - if criteria != nil { - criteriaToken = criteria.(string) - } - token := api.WeixinAPI.CBGetToken() - if token != criteriaToken { - return &eventhub.EventInfo{ - Type: EventTypeWXToken, - Data: token, - }, nil - } - return nil, nil -} - func (h *Hub) IsCriteriaMatch(eventInfo *eventhub.EventInfo, criteria interface{}) bool { return true } @@ -72,10 +52,21 @@ func (h *Hub) OnNewWXToken(token string) { }) } -func (h *Hub) GetWXToken(oldToken string, waitTime time.Duration) (token string) { - eventInfo, err := h.eventHub.GetEvent(EventCategory, []string{EventTypeWXToken}, oldToken, waitTime) - if err == nil && eventInfo != nil { - token = eventInfo.Data.(string) +func (h *Hub) GetWXToken(oldToken string, waitTime time.Duration) (tokenInfo *WXTokenInfo) { + token := api.WeixinAPI.CBGetToken() + if token != oldToken { + tokenInfo = &WXTokenInfo{ + IsNew: false, + Token: token, + } + } else { + eventInfo, err := h.eventHub.GetEvent(EventCategory, []string{EventTypeWXToken}, nil, waitTime) + if err == nil && eventInfo != nil { + tokenInfo = &WXTokenInfo{ + IsNew: true, + Token: eventInfo.Data.(string), + } + } } - return token + return tokenInfo } diff --git a/business/jxutils/tasks/configrefresh.go b/business/jxutils/tasks/configrefresh.go index 120a1316d..ada99e360 100644 --- a/business/jxutils/tasks/configrefresh.go +++ b/business/jxutils/tasks/configrefresh.go @@ -4,7 +4,6 @@ import ( "fmt" "io/ioutil" "net/http" - "strings" "time" "git.rosy.net.cn/baseapi/platformapi" @@ -132,10 +131,14 @@ func RefreshWeixinToken() (err error) { globals.SugarLogger.Errorf("RefreshWeixinToken RefreshToken failed with error:%v", err) } } else { - token = getWXTokenFromProd(api.WeixinAPI.CBGetToken()) + tokenInfo := getWXTokenFromProd(api.WeixinAPI.CBGetToken()) + if !tokenInfo.IsNew { + expireTimeStr = utils.Time2Str(time.Now().Add(-weixinTokenExpires)) + } + token = tokenInfo.Token } } - return token, "" + return token, expireTimeStr }, func(value string) { syseventhub.SysEventHub.OnNewWXToken(value) api.WeixinAPI.CBSetToken(value) @@ -242,8 +245,7 @@ func RefreshYilianyunToken() (err error) { }) } -func getWXTokenFromProd(oldToken string) (token string) { - token = oldToken +func getWXTokenFromProd(oldToken string) (tokenInfo *syseventhub.WXTokenInfo) { if globals.GetWeixinTokenKey != "" && globals.GetWeixinTokenURL != "" { for { waitSecond := 5 * 60 @@ -256,8 +258,11 @@ func getWXTokenFromProd(oldToken string) (token string) { var result CallResult if err = utils.UnmarshalUseNumber(data, &result); err == nil { if result.Code == "0" { - token = strings.Replace(result.Data, "\"", "", -1) - break + if result.Data != "" { + if err = utils.UnmarshalUseNumber(data, &tokenInfo); err == nil && tokenInfo != nil { + break + } + } } else { err = fmt.Errorf("return code is:%s", result.Code) } @@ -273,5 +278,5 @@ func getWXTokenFromProd(oldToken string) (token string) { } } } - return token + return tokenInfo } From e73eb787108478f18d4dc8294a344114cb258144 Mon Sep 17 00:00:00 2001 From: gazebo Date: Sat, 27 Apr 2019 16:06:39 +0800 Subject: [PATCH 35/47] - fk --- business/jxutils/eventhub/eventhub.go | 1 + controllers/sys.go | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/business/jxutils/eventhub/eventhub.go b/business/jxutils/eventhub/eventhub.go index 4b3e02991..c34d323c3 100644 --- a/business/jxutils/eventhub/eventhub.go +++ b/business/jxutils/eventhub/eventhub.go @@ -223,6 +223,7 @@ func (e *EventHub) GetEvent(eventCategory string, eventTypeList []string, criter } } } + globals.SugarLogger.Debugf("GetEvent pollingDuration:%d seconds", pollingDuration/time.Second) timer := time.NewTimer(pollingDuration) select { case tmpEvent, ok := <-notifyChan: diff --git a/controllers/sys.go b/controllers/sys.go index 49ec6a78f..a74b792ee 100644 --- a/controllers/sys.go +++ b/controllers/sys.go @@ -16,7 +16,7 @@ type SysController struct { // @Title 得到京西门店信息 // @Description 得到京西门店信息,如下条件之间是与的关系 // @Param accessKey query string true "假token" -// @Param oldToken query string true "之前的token" +// @Param oldToken query string false "之前的token" // @Param waitSecond query int false "等待秒数" // @Success 200 {object} controllers.CallResult // @Failure 200 {object} controllers.CallResult From 0f85ed964ef50293b30584c1779cf13dcf253e53 Mon Sep 17 00:00:00 2001 From: gazebo Date: Sat, 27 Apr 2019 16:17:32 +0800 Subject: [PATCH 36/47] - fk --- business/jxutils/eventhub/syseventhub/syseventhub.go | 4 ++++ business/jxutils/tasks/configrefresh.go | 2 ++ 2 files changed, 6 insertions(+) diff --git a/business/jxutils/eventhub/syseventhub/syseventhub.go b/business/jxutils/eventhub/syseventhub/syseventhub.go index baedfe79a..5ef2c63de 100644 --- a/business/jxutils/eventhub/syseventhub/syseventhub.go +++ b/business/jxutils/eventhub/syseventhub/syseventhub.go @@ -3,6 +3,9 @@ package syseventhub import ( "time" + "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/globals" + "git.rosy.net.cn/jx-callback/business/jxutils/eventhub" "git.rosy.net.cn/jx-callback/globals/api" ) @@ -68,5 +71,6 @@ func (h *Hub) GetWXToken(oldToken string, waitTime time.Duration) (tokenInfo *WX } } } + globals.SugarLogger.Debugf("GetWXToken tokenInfo:%s", utils.Format4Output(tokenInfo, true)) return tokenInfo } diff --git a/business/jxutils/tasks/configrefresh.go b/business/jxutils/tasks/configrefresh.go index ada99e360..92fb29045 100644 --- a/business/jxutils/tasks/configrefresh.go +++ b/business/jxutils/tasks/configrefresh.go @@ -140,6 +140,7 @@ func RefreshWeixinToken() (err error) { } return token, expireTimeStr }, func(value string) { + globals.SugarLogger.Debugf("RefreshWeixinToken setter value:%s", value) syseventhub.SysEventHub.OnNewWXToken(value) api.WeixinAPI.CBSetToken(value) }) @@ -260,6 +261,7 @@ func getWXTokenFromProd(oldToken string) (tokenInfo *syseventhub.WXTokenInfo) { if result.Code == "0" { if result.Data != "" { if err = utils.UnmarshalUseNumber(data, &tokenInfo); err == nil && tokenInfo != nil { + globals.SugarLogger.Debugf("getWXTokenFromProd:%s", utils.Format4Output(tokenInfo, false)) break } } From 94484a92b75dbe1e77995eb1bce718d5e9ddefd4 Mon Sep 17 00:00:00 2001 From: gazebo Date: Sat, 27 Apr 2019 17:41:33 +0800 Subject: [PATCH 37/47] =?UTF-8?q?-=20jxgy=E5=88=B7=E6=96=B0token?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxutils/tasks/configrefresh.go | 53 ++++++++++++++----------- 1 file changed, 29 insertions(+), 24 deletions(-) diff --git a/business/jxutils/tasks/configrefresh.go b/business/jxutils/tasks/configrefresh.go index 92fb29045..4c34e4409 100644 --- a/business/jxutils/tasks/configrefresh.go +++ b/business/jxutils/tasks/configrefresh.go @@ -28,8 +28,11 @@ const ( dingdingTokenExpires = 7200 * time.Second elmTokenExpires = 20 * 24 * 3600 * time.Second weimobTokenExpires = 7200 * time.Second - maxRefreshGap = 5 * 60 * time.Second yilianyunTokenExpires = 30 * 24 * 3600 * time.Second + + maxRefreshGap = 5 * 60 * time.Second + errRefreshGap = 10 * time.Second + minRefreshGap = 1 * time.Second ) type ElmTokenForCompatible struct { @@ -49,12 +52,14 @@ type CallResult struct { } func RefreshConfig(configKey string, expiresTime time.Duration, configGetter func() (string, string), configSetter func(value string)) error { - sleepGap := expiresTime / 10 needRefreshGap := expiresTime * 8 / 10 + sleepGap := expiresTime / 10 if sleepGap > maxRefreshGap { sleepGap = maxRefreshGap } - refreshFunc := func() (string, error) { + + refreshFunc := func() (sleepDuration time.Duration) { + sleepDuration = sleepGap curConfig := &legacymodel.Config{ Thirdparty: configKey, } @@ -64,7 +69,7 @@ func RefreshConfig(configKey string, expiresTime time.Duration, configGetter fun if err := db.Read(curConfig, "Thirdparty"); err != nil { if err != orm.ErrNoRows { globals.SugarLogger.Errorf("db error:%v, curConfig:%v", err, curConfig) - return "", err + return errRefreshGap } handleType = 2 } else { @@ -77,15 +82,18 @@ func RefreshConfig(configKey string, expiresTime time.Duration, configGetter fun if curConfig.Token, curConfig.Date = configGetter(); curConfig.Token == "" { if beego.BConfig.RunMode == "prod" { globals.SugarLogger.Errorf("RefreshConfig %s get empty token", configKey) + sleepDuration = errRefreshGap } else { globals.SugarLogger.Infof("RefreshConfig %s get empty token", configKey) } - return "", nil + return sleepDuration } globals.SugarLogger.Debugf("RefreshConfig refresh %s, value:%s", configKey, curConfig.Token) - + configSetter(curConfig.Token) if curConfig.Date == "" { curConfig.Date = utils.GetCurTimeStr() + } else { + sleepDuration = expiresTime - time.Now().Sub(utils.Str2Time(curConfig.Date)) } var num int64 var err error @@ -97,25 +105,20 @@ func RefreshConfig(configKey string, expiresTime time.Duration, configGetter fun } if err != nil || num == 0 { globals.SugarLogger.Errorf("db error:%v, num:%d, curConfig:%v", err, num, curConfig) - return "", err } - configSetter(curConfig.Token) } - return curConfig.Token, nil - } - token, err := refreshFunc() // 这样写的目的是强制第一次调用时要刷新一次 - if err == nil { - if token != "" { - configSetter(token) + if sleepDuration < minRefreshGap { + sleepDuration = minRefreshGap + } else if sleepDuration > maxRefreshGap { + sleepDuration = maxRefreshGap } - utils.CallFuncAsync(func() { - for { - time.Sleep(sleepGap) - refreshFunc() - } - }) + return sleepDuration } - return err + utils.CallFuncAsync(func() { + sleepGap := refreshFunc() + time.Sleep(sleepGap) + }) + return nil } func RefreshWeixinToken() (err error) { @@ -250,7 +253,9 @@ func getWXTokenFromProd(oldToken string) (tokenInfo *syseventhub.WXTokenInfo) { if globals.GetWeixinTokenKey != "" && globals.GetWeixinTokenURL != "" { for { waitSecond := 5 * 60 + globals.SugarLogger.Debugf("getWXTokenFromProd1") response, err := http.Get(fmt.Sprintf("%s?accessKey=%s&oldToken=%s&waitSecond=%d", globals.GetWeixinTokenURL, globals.GetWeixinTokenKey, oldToken, waitSecond)) + globals.SugarLogger.Debugf("getWXTokenFromProd2 error:%v", err) if err == nil { defer response.Body.Close() if response.StatusCode == http.StatusOK { @@ -260,7 +265,7 @@ func getWXTokenFromProd(oldToken string) (tokenInfo *syseventhub.WXTokenInfo) { if err = utils.UnmarshalUseNumber(data, &result); err == nil { if result.Code == "0" { if result.Data != "" { - if err = utils.UnmarshalUseNumber(data, &tokenInfo); err == nil && tokenInfo != nil { + if err = utils.UnmarshalUseNumber([]byte(result.Data), &tokenInfo); err == nil && tokenInfo != nil { globals.SugarLogger.Debugf("getWXTokenFromProd:%s", utils.Format4Output(tokenInfo, false)) break } @@ -274,9 +279,9 @@ func getWXTokenFromProd(oldToken string) (tokenInfo *syseventhub.WXTokenInfo) { err = platformapi.ErrHTTPCodeIsNot200 } } + globals.SugarLogger.Infof("getWXTokenFromProd failed with error:%v", err) if err != nil { - globals.SugarLogger.Infof("getWXTokenFromProd failed with error:%v", err) - time.Sleep(30 * time.Second) + time.Sleep(errRefreshGap) } } } From 9bac02f9aa7e150ae979faa017f65f0aec61476d Mon Sep 17 00:00:00 2001 From: gazebo Date: Sat, 27 Apr 2019 17:58:36 +0800 Subject: [PATCH 38/47] - fk --- business/jxutils/tasks/configrefresh.go | 19 ++++++++++++------- globals/globals.go | 8 ++++++-- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/business/jxutils/tasks/configrefresh.go b/business/jxutils/tasks/configrefresh.go index 4c34e4409..c9d3f5573 100644 --- a/business/jxutils/tasks/configrefresh.go +++ b/business/jxutils/tasks/configrefresh.go @@ -74,7 +74,7 @@ func RefreshConfig(configKey string, expiresTime time.Duration, configGetter fun handleType = 2 } else { configSetter(curConfig.Token) - if curConfig.Date <= utils.Time2Str(time.Now().Add(-needRefreshGap)) { + if curConfig.Date <= utils.Time2Str(time.Now().Add(-needRefreshGap)) || IsGetWXTokenFromRemote() { handleType = 1 } } @@ -134,11 +134,12 @@ func RefreshWeixinToken() (err error) { globals.SugarLogger.Errorf("RefreshWeixinToken RefreshToken failed with error:%v", err) } } else { - tokenInfo := getWXTokenFromProd(api.WeixinAPI.CBGetToken()) - if !tokenInfo.IsNew { - expireTimeStr = utils.Time2Str(time.Now().Add(-weixinTokenExpires)) + if tokenInfo := getWXTokenFromRemote(api.WeixinAPI.CBGetToken()); tokenInfo != nil { + if !tokenInfo.IsNew { + expireTimeStr = utils.Time2Str(time.Now().Add(-weixinTokenExpires)) + } + token = tokenInfo.Token } - token = tokenInfo.Token } } return token, expireTimeStr @@ -249,8 +250,8 @@ func RefreshYilianyunToken() (err error) { }) } -func getWXTokenFromProd(oldToken string) (tokenInfo *syseventhub.WXTokenInfo) { - if globals.GetWeixinTokenKey != "" && globals.GetWeixinTokenURL != "" { +func getWXTokenFromRemote(oldToken string) (tokenInfo *syseventhub.WXTokenInfo) { + if IsGetWXTokenFromRemote() { for { waitSecond := 5 * 60 globals.SugarLogger.Debugf("getWXTokenFromProd1") @@ -287,3 +288,7 @@ func getWXTokenFromProd(oldToken string) (tokenInfo *syseventhub.WXTokenInfo) { } return tokenInfo } + +func IsGetWXTokenFromRemote() bool { + return !globals.IsMainProductEnv() && globals.GetWeixinTokenKey != "" && globals.GetWeixinTokenURL != "" +} diff --git a/globals/globals.go b/globals/globals.go index eab441301..117aa7758 100644 --- a/globals/globals.go +++ b/globals/globals.go @@ -84,6 +84,10 @@ func IsCallbackAlwaysReturnSuccess() bool { return beego.BConfig.RunMode == "beta" } -func IsProductEnv() bool { - return beego.BConfig.RunMode == "prod" || beego.BConfig.RunMode == "jxgy" +func IsMainProductEnv() bool { + return beego.BConfig.RunMode == "prod" +} + +func IsProductEnv() bool { + return IsMainProductEnv() || beego.BConfig.RunMode == "jxgy" } From 5bd457c143e5c4da521b3f4ac14681920cf6532b Mon Sep 17 00:00:00 2001 From: gazebo Date: Sat, 27 Apr 2019 18:03:15 +0800 Subject: [PATCH 39/47] - fk --- business/jxutils/tasks/configrefresh.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/business/jxutils/tasks/configrefresh.go b/business/jxutils/tasks/configrefresh.go index c9d3f5573..6090848f1 100644 --- a/business/jxutils/tasks/configrefresh.go +++ b/business/jxutils/tasks/configrefresh.go @@ -112,6 +112,9 @@ func RefreshConfig(configKey string, expiresTime time.Duration, configGetter fun } else if sleepDuration > maxRefreshGap { sleepDuration = maxRefreshGap } + if IsGetWXTokenFromRemote() { + sleepDuration = minRefreshGap + } return sleepDuration } utils.CallFuncAsync(func() { From 730136bbb04ae73e52eedc9897b372588065b603 Mon Sep 17 00:00:00 2001 From: gazebo Date: Sat, 27 Apr 2019 18:27:04 +0800 Subject: [PATCH 40/47] - fk --- business/jxutils/tasks/configrefresh.go | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/business/jxutils/tasks/configrefresh.go b/business/jxutils/tasks/configrefresh.go index 6090848f1..980235ddd 100644 --- a/business/jxutils/tasks/configrefresh.go +++ b/business/jxutils/tasks/configrefresh.go @@ -74,7 +74,7 @@ func RefreshConfig(configKey string, expiresTime time.Duration, configGetter fun handleType = 2 } else { configSetter(curConfig.Token) - if curConfig.Date <= utils.Time2Str(time.Now().Add(-needRefreshGap)) || IsGetWXTokenFromRemote() { + if curConfig.Date <= utils.Time2Str(time.Now().Add(-needRefreshGap)) { handleType = 1 } } @@ -88,7 +88,6 @@ func RefreshConfig(configKey string, expiresTime time.Duration, configGetter fun } return sleepDuration } - globals.SugarLogger.Debugf("RefreshConfig refresh %s, value:%s", configKey, curConfig.Token) configSetter(curConfig.Token) if curConfig.Date == "" { curConfig.Date = utils.GetCurTimeStr() @@ -112,14 +111,13 @@ func RefreshConfig(configKey string, expiresTime time.Duration, configGetter fun } else if sleepDuration > maxRefreshGap { sleepDuration = maxRefreshGap } - if IsGetWXTokenFromRemote() { - sleepDuration = minRefreshGap - } return sleepDuration } utils.CallFuncAsync(func() { - sleepGap := refreshFunc() - time.Sleep(sleepGap) + for { + sleepGap := refreshFunc() + time.Sleep(sleepGap) + } }) return nil } From f48ff514d83bc668e8d982e3f9ec4f6bf260e8ec Mon Sep 17 00:00:00 2001 From: gazebo Date: Sat, 27 Apr 2019 18:31:53 +0800 Subject: [PATCH 41/47] - up --- business/jxutils/tasks/configrefresh.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/business/jxutils/tasks/configrefresh.go b/business/jxutils/tasks/configrefresh.go index 980235ddd..2a7309aef 100644 --- a/business/jxutils/tasks/configrefresh.go +++ b/business/jxutils/tasks/configrefresh.go @@ -127,7 +127,7 @@ func RefreshWeixinToken() (err error) { err = RefreshConfig("wechat", weixinTokenExpires, func() (token string, expireTimeStr string) { globals.SugarLogger.Debugf("RefreshWeixinToken RunMode:%s", beego.BConfig.RunMode) if globals.IsProductEnv() { - if beego.BConfig.RunMode == "prod" { + if globals.IsMainProductEnv() { if tokenInfo, err := api.WeixinAPI.CBRetrieveToken(); err == nil { globals.SugarLogger.Debugf("RefreshWeixinToken tokenInfo:%s", utils.Format4Output(tokenInfo, true)) token = tokenInfo.AccessToken @@ -138,6 +138,8 @@ func RefreshWeixinToken() (err error) { if tokenInfo := getWXTokenFromRemote(api.WeixinAPI.CBGetToken()); tokenInfo != nil { if !tokenInfo.IsNew { expireTimeStr = utils.Time2Str(time.Now().Add(-weixinTokenExpires)) + } else { + expireTimeStr = utils.Time2Str(time.Now().Add(-weixinTokenExpires / 2)) } token = tokenInfo.Token } From 8249f1727f3cf135647d0f975a8b9dedd20f3e02 Mon Sep 17 00:00:00 2001 From: gazebo Date: Sat, 27 Apr 2019 18:39:00 +0800 Subject: [PATCH 42/47] - up --- business/jxutils/eventhub/eventhub.go | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/business/jxutils/eventhub/eventhub.go b/business/jxutils/eventhub/eventhub.go index c34d323c3..d2953a0a1 100644 --- a/business/jxutils/eventhub/eventhub.go +++ b/business/jxutils/eventhub/eventhub.go @@ -202,12 +202,14 @@ func (e *EventHub) unregisterConsumer(notifyChan chan *EventInfo) { } func (e *EventHub) PostNewEvent(eventCategory string, event *EventInfo) { - newEvent := *event - newEvent.Type = composeEventType(eventCategory, event.Type) - e.cmdChan <- &tCmd{ - cmdType: cmdNewEvent, - data: event, - } + utils.CallFuncAsync(func() { + newEvent := *event + newEvent.Type = composeEventType(eventCategory, event.Type) + e.cmdChan <- &tCmd{ + cmdType: cmdNewEvent, + data: event, + } + }) } func (e *EventHub) GetEvent(eventCategory string, eventTypeList []string, criteria interface{}, waitTime time.Duration) (event *EventInfo, err error) { @@ -251,6 +253,10 @@ func composeEventType(eventCategory, eventType string) string { func splitEventType(eventType string) (eventCategory, pureEventType string) { typeList := strings.Split(eventType, "/") eventCategory = typeList[0] - pureEventType = typeList[1] + if len(typeList) > 1 { + pureEventType = typeList[1] + } else { + globals.SugarLogger.Warnf("splitEventType eventType:%s", eventType) + } return eventCategory, pureEventType } From 554b0351a6fb6e509ae5e67ee10f3bd127e11915 Mon Sep 17 00:00:00 2001 From: gazebo Date: Sat, 27 Apr 2019 18:47:58 +0800 Subject: [PATCH 43/47] - up --- business/jxutils/eventhub/eventhub.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/business/jxutils/eventhub/eventhub.go b/business/jxutils/eventhub/eventhub.go index d2953a0a1..422f3057c 100644 --- a/business/jxutils/eventhub/eventhub.go +++ b/business/jxutils/eventhub/eventhub.go @@ -123,7 +123,7 @@ func (e *EventHub) eventRoutine() { e.removeChan(notifyChan) } } else { - globals.SugarLogger.Warnf("eventRoutine, eventCategory:%s producer is nil") + globals.SugarLogger.Warnf("eventRoutine, eventCategory:%s producer is nil", eventCategory) } } } @@ -207,7 +207,7 @@ func (e *EventHub) PostNewEvent(eventCategory string, event *EventInfo) { newEvent.Type = composeEventType(eventCategory, event.Type) e.cmdChan <- &tCmd{ cmdType: cmdNewEvent, - data: event, + data: &newEvent, } }) } From 25cd0463febd49a9bee1956ec8b88583595a24f7 Mon Sep 17 00:00:00 2001 From: gazebo Date: Sat, 27 Apr 2019 19:00:17 +0800 Subject: [PATCH 44/47] - up --- business/jxutils/tasks/configrefresh.go | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/business/jxutils/tasks/configrefresh.go b/business/jxutils/tasks/configrefresh.go index 2a7309aef..6270b951d 100644 --- a/business/jxutils/tasks/configrefresh.go +++ b/business/jxutils/tasks/configrefresh.go @@ -136,11 +136,7 @@ func RefreshWeixinToken() (err error) { } } else { if tokenInfo := getWXTokenFromRemote(api.WeixinAPI.CBGetToken()); tokenInfo != nil { - if !tokenInfo.IsNew { - expireTimeStr = utils.Time2Str(time.Now().Add(-weixinTokenExpires)) - } else { - expireTimeStr = utils.Time2Str(time.Now().Add(-weixinTokenExpires / 2)) - } + expireTimeStr = utils.Time2Str(time.Now().Add(-weixinTokenExpires)) token = tokenInfo.Token } } From 857451feb2f23c140ca218a20063777cad8c9af2 Mon Sep 17 00:00:00 2001 From: gazebo Date: Sun, 28 Apr 2019 10:14:42 +0800 Subject: [PATCH 45/47] =?UTF-8?q?-=20auth.GetWeiXinUserInfo=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E8=B0=83=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxcallback/auth/weixin/weixin.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/business/jxcallback/auth/weixin/weixin.go b/business/jxcallback/auth/weixin/weixin.go index cc0bf5896..d33fafba5 100644 --- a/business/jxcallback/auth/weixin/weixin.go +++ b/business/jxcallback/auth/weixin/weixin.go @@ -87,7 +87,7 @@ func GetWeiXinUserInfo(code string, state string) (userInfo *UserInfoExt, err er SNSUserInfo: *wxUserinfo, TempPassword: utils.GetUUID(), } - globals.SugarLogger.Debugf("GetUserInfo code:%s, pwd:%s", code, userInfo.TempPassword) + globals.SugarLogger.Debugf("GetUserInfo code:%s, userInfo:%s", code, utils.Format4Output(userInfo, true)) cacheSNSInfo(wxUserinfo, userInfo.TempPassword, DefTempPasswordDuration) user, err2 := dao.GetWeiXinUserByIDs(dao.GetDB(), "", wxUserinfo.UnionID, wxUserinfo.OpenID, "") if err = err2; err == nil { From 1df08e93602c45f39ac43d11a826dce61fcd7ebf Mon Sep 17 00:00:00 2001 From: gazebo Date: Sun, 28 Apr 2019 12:09:35 +0800 Subject: [PATCH 46/47] =?UTF-8?q?-=20=E5=B9=B3=E5=8F=B0=E5=8F=96=E6=B6=88?= =?UTF-8?q?=E7=94=B3=E8=AF=B7=E5=AE=A1=E6=A0=B8=E6=97=B6=E9=99=90=E5=8F=82?= =?UTF-8?q?=E6=95=B0=20-=20=E4=B8=80=E4=BA=9B=E8=AE=A2=E5=8D=95=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=E6=A0=87=E8=AE=B0=20-=20LockStatusTime?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxcallback/orderman/order.go | 19 +++++---- .../scheduler/basesch/basesch_ext.go | 20 ++++++++++ .../jxcallback/scheduler/defsch/defsch.go | 11 ++--- business/jxstore/cms/cms.go | 1 + business/jxutils/netprinter/netprinter.go | 10 +++-- business/model/const.go | 34 ++++++++++++++++ business/model/dao/dao_order.go | 40 ++++++++++--------- business/model/order.go | 3 +- controllers/jx_order.go | 2 +- 9 files changed, 102 insertions(+), 38 deletions(-) diff --git a/business/jxcallback/orderman/order.go b/business/jxcallback/orderman/order.go index 05e756dc7..1a48d195b 100644 --- a/business/jxcallback/orderman/order.go +++ b/business/jxcallback/orderman/order.go @@ -359,24 +359,27 @@ func (c *OrderManager) addOrderStatus(orderStatus *model.OrderStatus, db *dao.Da if (model.IsOrderLockStatus(orderStatus.Status) || model.IsOrderUnlockStatus(orderStatus.Status)) || (model.IsOrderMainStatus(orderStatus.Status) && orderStatus.Status >= order.Status) { // todo 要求status不能回绕 order.VendorStatus = orderStatus.VendorStatus - order.StatusTime = orderStatus.StatusTime updateFields := []string{ - "VendorStatus", "StatusTime", + "VendorStatus", } if model.IsOrderMainStatus(orderStatus.Status) { - order.LockStatus = model.OrderStatusUnknown order.Status = orderStatus.Status - updateFields = append(updateFields, "Status", "LockStatus") + order.StatusTime = orderStatus.StatusTime + updateFields = append(updateFields, "Status", "StatusTime") + if order.LockStatus != model.OrderStatusUnknown { + order.LockStatus = model.OrderStatusUnknown + order.LockStatusTime = orderStatus.StatusTime + updateFields = append(updateFields, "LockStatus", "LockStatusTime") + } } else { if model.IsOrderUnlockStatus(orderStatus.Status) { order.LockStatus = model.OrderStatusUnknown - updateFields = append(updateFields, "LockStatus") - } else if model.IsOrderLockStatus(orderStatus.Status) { + } else { order.LockStatus = orderStatus.Status - updateFields = append(updateFields, "LockStatus") } + order.LockStatusTime = orderStatus.StatusTime + updateFields = append(updateFields, "LockStatus", "LockStatusTime") } - // orderStatus.LockStatus = order.LockStatus if model.IsOrderFinalStatus(orderStatus.Status) { order.OrderFinishedAt = orderStatus.StatusTime updateFields = append(updateFields, "OrderFinishedAt") diff --git a/business/jxcallback/scheduler/basesch/basesch_ext.go b/business/jxcallback/scheduler/basesch/basesch_ext.go index 34fcb209d..b1da476f4 100644 --- a/business/jxcallback/scheduler/basesch/basesch_ext.go +++ b/business/jxcallback/scheduler/basesch/basesch_ext.go @@ -133,6 +133,13 @@ func (c *BaseScheduler) AcceptOrRefuseFailedGetOrder(ctx *jxcontext.Context, ord if c.IsReallyCallPlatformAPI { err = partner.GetPurchasePlatformFromVendorID(order.VendorID).AcceptOrRefuseFailedGetOrder(ctx, order, isAcceptIt) } + if err == nil { + flag := int8(model.OrderFlagAgreeFailedGetGoods) + if !isAcceptIt { + flag = model.OrderFlagRefuseFailedGetGoods + } + dao.SetOrderFlag(dao.GetDB(), ctx.GetUserName(), order.VendorOrderID, order.VendorID, flag) + } return err } @@ -140,6 +147,9 @@ func (c *BaseScheduler) CallPMCourier(ctx *jxcontext.Context, order *model.Goods if c.IsReallyCallPlatformAPI { err = partner.GetPurchasePlatformFromVendorID(order.VendorID).CallCourier(ctx, order) } + if err == nil { + dao.SetOrderFlag(dao.GetDB(), ctx.GetUserName(), order.VendorOrderID, order.VendorID, model.OrderFlagMaskCallPMCourier) + } return err } @@ -147,6 +157,9 @@ func (c *BaseScheduler) ConfirmReceiveGoods(ctx *jxcontext.Context, order *model if c.IsReallyCallPlatformAPI { err = partner.GetPurchasePlatformFromVendorID(order.VendorID).ConfirmReceiveGoods(ctx, order) } + if err == nil { + dao.SetOrderFlag(dao.GetDB(), ctx.GetUserName(), order.VendorOrderID, order.VendorID, model.OrderFlagMaskFailedDeliver) + } return err } @@ -154,5 +167,12 @@ func (c *BaseScheduler) AgreeOrRefuseCancel(ctx *jxcontext.Context, order *model if c.IsReallyCallPlatformAPI { err = partner.GetPurchasePlatformFromVendorID(order.VendorID).AgreeOrRefuseCancel(ctx, order, isAcceptIt, reason) } + if err == nil { + flag := int8(model.OrderFlagAgreeUserApplyCancel) + if !isAcceptIt { + flag = model.OrderFlagRefuseUserApplyCancel + } + dao.SetOrderFlag(dao.GetDB(), ctx.GetUserName(), order.VendorOrderID, order.VendorID, flag) + } return err } diff --git a/business/jxcallback/scheduler/defsch/defsch.go b/business/jxcallback/scheduler/defsch/defsch.go index 9b160bfcc..0cf2a351a 100644 --- a/business/jxcallback/scheduler/defsch/defsch.go +++ b/business/jxcallback/scheduler/defsch/defsch.go @@ -113,11 +113,12 @@ func (s *WatchOrderInfo) updateOrderStoreFeature(order *model.GoodsOrder) (err e } s.autoPickupTimeoutMinute = int(storeMap.AutoPickup) s.storeDeliveryType = FixedScheduler.GetStoreDeliveryType(order, storeMap) - if s.storeDeliveryType == scheduler.StoreDeliveryTypeByStore && (order.DeliveryFlag&model.OrderDeliveryFlagMaskPurcahseDisabled) == 0 { - order.DeliveryFlag |= model.OrderDeliveryFlagMaskPurcahseDisabled - err = partner.CurOrderManager.UpdateOrderStatusAndFlag(order) - } - globals.SugarLogger.Debugf("updateOrderStoreFeature orderID:%s, s.storeDeliveryType:%d, order.DeliveryFlag:%d", order.VendorOrderID, s.storeDeliveryType, order.DeliveryFlag) + globals.SugarLogger.Debugf("updateOrderStoreFeature orderID:%s, s.storeDeliveryType:%d", order.VendorOrderID, s.storeDeliveryType) + // if s.storeDeliveryType == scheduler.StoreDeliveryTypeByStore && (order.DeliveryFlag&model.OrderDeliveryFlagMaskPurcahseDisabled) == 0 { + // order.DeliveryFlag |= model.OrderDeliveryFlagMaskPurcahseDisabled + // err = partner.CurOrderManager.UpdateOrderStatusAndFlag(order) + // } + // globals.SugarLogger.Debugf("updateOrderStoreFeature orderID:%s, s.storeDeliveryType:%d, order.DeliveryFlag:%d", order.VendorOrderID, s.storeDeliveryType, order.DeliveryFlag) } return err } diff --git a/business/jxstore/cms/cms.go b/business/jxstore/cms/cms.go index 1dbac5fdc..a9c18fae0 100644 --- a/business/jxstore/cms/cms.go +++ b/business/jxstore/cms/cms.go @@ -54,6 +54,7 @@ func InitServiceInfo(version string, buildTime time.Time, gitCommit string) { "storeMsgSendStatusName": model.StoreMsgSendStatusName, "shopChineseNames": model.ShopChineseNames, "printerVendorInfo": model.PrinterVendorInfo, + "purchaseVendorInfo": model.PurchaseVendorInfo, }, } Init() diff --git a/business/jxutils/netprinter/netprinter.go b/business/jxutils/netprinter/netprinter.go index e3ae5f97f..b0d5b892f 100644 --- a/business/jxutils/netprinter/netprinter.go +++ b/business/jxutils/netprinter/netprinter.go @@ -54,10 +54,12 @@ func PrintOrderByOrder(ctx *jxcontext.Context, order *model.GoodsOrder) (printRe return &partner.PrinterStatus{ PrintResult: partner.PrintResultNoPrinter, }, nil - } else { - if globals.EnableStoreWrite { - printResult, err = handler.PrintOrder(ctx, store, order) - } + } + if globals.EnableStoreWrite { + printResult, err = handler.PrintOrder(ctx, store, order) + } + if err == nil { + dao.SetOrderPrintFlag(db, ctx.GetUserName(), order.VendorOrderID, order.VendorID, true) } } if err != nil { diff --git a/business/model/const.go b/business/model/const.go index e24837af5..e42b6f55d 100644 --- a/business/model/const.go +++ b/business/model/const.go @@ -1,5 +1,11 @@ package model +import ( + "git.rosy.net.cn/baseapi/platformapi/ebaiapi" + "git.rosy.net.cn/baseapi/platformapi/jdapi" + "git.rosy.net.cn/baseapi/platformapi/mtwmapi" +) + // VendorIDJD, VendorIDMTWM与VendorIDELM的定义和老系统是兼容的 const ( VendorIDUnknown = -1 @@ -42,6 +48,7 @@ var ( VendorIDYiLianYun: "Yilianyun", VendorIDZhongWu: "ZhongWu", } + VendorChineseNames = map[int]string{ VendorIDJD: "京东到家", VendorIDMTWM: "美团外卖", @@ -58,6 +65,21 @@ var ( VendorIDZhongWu: "中午云", } + PurchaseVendorInfo = map[int]map[string]interface{}{ + VendorIDJD: map[string]interface{}{ + "chineseName": VendorChineseNames[VendorIDJD], + "userApplyCancelWaitMinute": jdapi.UserApplyCancelWaitMinute, + }, + VendorIDMTWM: map[string]interface{}{ + "chineseName": VendorChineseNames[VendorIDMTWM], + "userApplyCancelWaitMinute": mtwmapi.UserApplyCancelWaitMinute, + }, + VendorIDEBAI: map[string]interface{}{ + "chineseName": VendorChineseNames[VendorIDEBAI], + "userApplyCancelWaitMinute": ebaiapi.UserApplyCancelWaitMinute, + }, + } + ShopChineseNames = map[int]string{ VendorIDJD: "京西菜市", VendorIDMTWM: "美好菜市", @@ -240,8 +262,20 @@ const ( OrderDeliveryFlagMaskScheduleDisabled = 1 // 禁止三方配送调度 OrderDeliveryFlagMaskPurcahseDisabled = 2 // 购物平台已不配送(一般为门店配送类型本身为自配送,或已经转自配送) ) + const ( OrderFlagMaskPrinted = 1 // 已经打印 + + OrderFlagMaskUserApplyCancel = 6 + OrderFlagAgreeUserApplyCancel = 2 + OrderFlagRefuseUserApplyCancel = 6 + + OrderFlagMaskFailedGetGoods = 24 + OrderFlagAgreeFailedGetGoods = 8 + OrderFlagRefuseFailedGetGoods = 24 + + OrderFlagMaskFailedDeliver = 32 + OrderFlagMaskCallPMCourier = 64 // 取货失败后召唤平台配送 ) func IsPurchaseVendorExist(vendorID int) bool { diff --git a/business/model/dao/dao_order.go b/business/model/dao/dao_order.go index 487141567..2c3c82909 100644 --- a/business/model/dao/dao_order.go +++ b/business/model/dao/dao_order.go @@ -25,27 +25,29 @@ func GetStoreOrderAfterTime(db *DaoDB, storeID int, orderTime time.Time, lastOrd return orderList, GetRows(db, &orderList, sql, sqlParams...) } -func SetOrderPrintFlag(db *DaoDB, vendorOrderID string, vendorID int, isPrinted bool) (err error) { - var ( - sql string - sqlParams []interface{} - ) +func SetOrderPrintFlag(db *DaoDB, userName string, vendorOrderID string, vendorID int, isPrinted bool) (err error) { if isPrinted { - sql = ` - UPDATE goods_order - SET flag = flag | ? - WHERE vendor_order_id = ? AND vendor_id = ? - ` - sqlParams = append(sqlParams, model.OrderFlagMaskPrinted) + err = SetOrderFlag(db, userName, vendorOrderID, vendorID, model.OrderFlagMaskPrinted) } else { - sql = ` - UPDATE goods_order - SET flag = flag & ? - WHERE vendor_order_id = ? AND vendor_id = ? - ` - sqlParams = append(sqlParams, ^model.OrderFlagMaskPrinted) + err = SetOrderFlag(db, userName, vendorOrderID, vendorID, ^int8(model.OrderFlagMaskPrinted)) } - sqlParams = append(sqlParams, vendorOrderID, vendorID) - _, err = ExecuteSQL(db, sql, sqlParams...) + return err +} + +func SetOrderFlag(db *DaoDB, userName string, vendorOrderID string, vendorID int, flag int8) (err error) { + _, err = ExecuteSQL(db, ` + UPDATE goods_order + SET flag = flag | ? + WHERE vendor_order_id = ? AND vendor_id = ? + `, flag, vendorOrderID, vendorID) + return err +} + +func ClearOrderFlag(db *DaoDB, userName string, vendorOrderID string, vendorID int, flag int8) (err error) { + _, err = ExecuteSQL(db, ` + UPDATE goods_order + SET flag = flag & ? + WHERE vendor_order_id = ? AND vendor_id = ? + `, flag, vendorOrderID, vendorID) return err } diff --git a/business/model/order.go b/business/model/order.go index 87ea6f1ac..a0a2a9629 100644 --- a/business/model/order.go +++ b/business/model/order.go @@ -32,7 +32,8 @@ type GoodsOrder struct { Status int `json:"status"` // 参见OrderStatus*相关的常量定义 VendorStatus string `orm:"size(255)" json:"-"` LockStatus int `json:"lockStatus"` - OrderSeq int `json:"orderSeq"` // 门店订单序号 + LockStatusTime time.Time `orm:"type(datetime);null" json:"-"` // last lock status time + OrderSeq int `json:"orderSeq"` // 门店订单序号 BuyerComment string `orm:"size(255)" json:"buyerComment"` BusinessType int `json:"businessType"` ExpectedDeliveredTime time.Time `orm:"type(datetime)" json:"expectedDeliveredTime"` // 预期送达时间 diff --git a/controllers/jx_order.go b/controllers/jx_order.go index a40bf5863..d9f05b48b 100644 --- a/controllers/jx_order.go +++ b/controllers/jx_order.go @@ -309,7 +309,7 @@ func (c *OrderController) RefreshOrderRealMobile() { // @router /SetOrderPrintStatus [put] func (c *OrderController) SetOrderPrintStatus() { c.callSetOrderPrintStatus(func(params *tOrderSetOrderPrintStatusParams) (retVal interface{}, errCode string, err error) { - err = dao.SetOrderPrintFlag(dao.GetDB(), params.VendorOrderID, params.VendorID, params.IsPrinted) + err = dao.SetOrderPrintFlag(dao.GetDB(), params.Ctx.GetUserName(), params.VendorOrderID, params.VendorID, params.IsPrinted) return retVal, "", err }) } From 7bdcf5bb95aab901d38a4bb8ca44b9b3b20f9bd7 Mon Sep 17 00:00:00 2001 From: gazebo Date: Sun, 28 Apr 2019 14:37:18 +0800 Subject: [PATCH 47/47] =?UTF-8?q?-=20=E5=9C=A8=E9=87=8D=E5=A4=8DLockStatus?= =?UTF-8?q?=E6=97=B6=E6=8A=A5=E8=AD=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxcallback/orderman/order.go | 4 ++++ business/jxstore/cms/user.go | 8 ++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/business/jxcallback/orderman/order.go b/business/jxcallback/orderman/order.go index 1a48d195b..44f11826d 100644 --- a/business/jxcallback/orderman/order.go +++ b/business/jxcallback/orderman/order.go @@ -346,6 +346,7 @@ func (c *OrderManager) updateOrderOtherInfo(order *model.GoodsOrder, db *dao.Dao } func (c *OrderManager) addOrderStatus(orderStatus *model.OrderStatus, db *dao.DaoDB) (isDuplicated bool, order *model.GoodsOrder, err error) { + globals.SugarLogger.Debugf("addOrderStatus refOrderID:%s, orderID:%s", orderStatus.RefVendorOrderID, orderStatus.VendorOrderID) if db == nil { db = dao.GetDB() } @@ -375,6 +376,9 @@ func (c *OrderManager) addOrderStatus(orderStatus *model.OrderStatus, db *dao.Da if model.IsOrderUnlockStatus(orderStatus.Status) { order.LockStatus = model.OrderStatusUnknown } else { + if order.LockStatus != model.OrderStatusUnknown { + globals.SugarLogger.Warnf("addOrderStatus refOrderID:%s, orderID:%s, order.LockStatus:%d, status.LockStatus:%d", orderStatus.RefVendorOrderID, orderStatus.VendorOrderID, order.LockStatus, orderStatus.Status) + } order.LockStatus = orderStatus.Status } order.LockStatusTime = orderStatus.StatusTime diff --git a/business/jxstore/cms/user.go b/business/jxstore/cms/user.go index 6263d164f..15c993990 100644 --- a/business/jxstore/cms/user.go +++ b/business/jxstore/cms/user.go @@ -46,7 +46,9 @@ func GetStoreUsers(ctx *jxcontext.Context, storeID int) (storeUserInfos []*dao.S } func GetUserInfo(ctx *jxcontext.Context, mobile string) (storeUserInfo *dao.StoreUserInfo, err error) { - return dao.GetUserStoreInfo(dao.GetDB(), "tel", mobile) + storeUserInfo, err = dao.GetUserStoreInfo(dao.GetDB(), "tel", mobile) + globals.SugarLogger.Debugf("GetUserInfo:%s, token:%s, mobile:%s, storeUserInfo:%s, err:%v", ctx.GetTrackInfo(), ctx.GetToken(), mobile, utils.Format4Output(storeUserInfo, true), err) + return storeUserInfo, err } func GetSelfInfo(ctx *jxcontext.Context) (storeUserInfo *dao.StoreUserInfo, err error) { @@ -58,7 +60,9 @@ func GetSelfInfo(ctx *jxcontext.Context) (storeUserInfo *dao.StoreUserInfo, err if fieldName == "" { return nil, auth.ErrIllegalLoginType } - return dao.GetUserStoreInfo(dao.GetDB(), fieldName, loginInfo.GetAuthID()) + storeUserInfo, err = dao.GetUserStoreInfo(dao.GetDB(), fieldName, loginInfo.GetAuthID()) + globals.SugarLogger.Debugf("GetSelfInfo:%s, token:%s, storeUserInfo:%s, err:%v", ctx.GetTrackInfo(), ctx.GetToken(), utils.Format4Output(storeUserInfo, true), err) + return storeUserInfo, err } func UnbindMobile(ctx *jxcontext.Context, mobile string) (num int64, err error) {