- RefreshWeixinToken and RefreshElmToken firs time run must completed before main workflow going.
This commit is contained in:
@@ -219,7 +219,7 @@ func (s *DefScheduler) cancelOtherWaybills(savedOrderInfo *WatchOrderInfo, bill
|
|||||||
globals.SugarLogger.Debugf("cancelOtherWaybills, order:%v, bill:%v", savedOrderInfo.order, bill)
|
globals.SugarLogger.Debugf("cancelOtherWaybills, order:%v, bill:%v", savedOrderInfo.order, bill)
|
||||||
for _, v := range savedOrderInfo.waybills {
|
for _, v := range savedOrderInfo.waybills {
|
||||||
if bill == nil || (v.WaybillVendorID != bill.OrderVendorID && !(v.WaybillVendorID == bill.WaybillVendorID && v.VendorWaybillID == bill.VendorWaybillID)) {
|
if bill == nil || (v.WaybillVendorID != bill.OrderVendorID && !(v.WaybillVendorID == bill.WaybillVendorID && v.VendorWaybillID == bill.VendorWaybillID)) {
|
||||||
globals.SugarLogger.Debugf("cancelOtherWaybills, cancel bill:%v", bill)
|
globals.SugarLogger.Debugf("cancelOtherWaybills, cancel bill:%v", v)
|
||||||
_ = s.GetDeliveryPlatformFromVendorID(v.WaybillVendorID).CancelWaybill(v)
|
_ = s.GetDeliveryPlatformFromVendorID(v.WaybillVendorID).CancelWaybill(v)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package tasks
|
package tasks
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"git.rosy.net.cn/jx-callback/globals/api"
|
"git.rosy.net.cn/jx-callback/globals/api"
|
||||||
@@ -29,60 +30,70 @@ type ElmTokenForCompatible struct {
|
|||||||
Success bool `json:"success"`
|
Success bool `json:"success"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func RefreshConfig(configKey string, expiresTime time.Duration, configGetter func() string, configSetter func(value string)) {
|
func RefreshConfig(configKey string, expiresTime time.Duration, configGetter func() string, configSetter func(value string)) error {
|
||||||
go func() {
|
sleepGap := expiresTime / 10
|
||||||
sleepGap := expiresTime / 10
|
needRefreshGap := expiresTime * 8 / 10
|
||||||
needRefreshGap := expiresTime * 8 / 10
|
if sleepGap > maxRefreshGap {
|
||||||
if sleepGap > maxRefreshGap {
|
sleepGap = maxRefreshGap
|
||||||
sleepGap = maxRefreshGap
|
}
|
||||||
|
refreshFunc := func() error {
|
||||||
|
curConfig := &models.Config{
|
||||||
|
Thirdparty: configKey,
|
||||||
}
|
}
|
||||||
for {
|
db := orm.NewOrm()
|
||||||
curConfig := &models.Config{
|
// 0: don't refresh, 1 update, 2 insert
|
||||||
Thirdparty: configKey,
|
handleType := 0
|
||||||
}
|
if err := db.Read(curConfig, "Thirdparty"); err != nil {
|
||||||
|
if err != orm.ErrNoRows {
|
||||||
db := orm.NewOrm()
|
globals.SugarLogger.Errorf("db error:%v, curConfig:%v", err, curConfig)
|
||||||
// 0: don't refresh, 1 update, 2 insert
|
return err
|
||||||
handleType := 0
|
|
||||||
if err := db.Read(curConfig, "Thirdparty"); err != nil {
|
|
||||||
if err != orm.ErrNoRows {
|
|
||||||
globals.SugarLogger.Errorf("db error:%v, curConfig:%v", err, curConfig)
|
|
||||||
} else {
|
|
||||||
curConfig.Token = configGetter()
|
|
||||||
handleType = 2
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
latestTimeStr := utils.Time2Str(time.Now().Add(-needRefreshGap))
|
curConfig.Token = configGetter()
|
||||||
if curConfig.Date <= latestTimeStr {
|
handleType = 2
|
||||||
curConfig.Token = configGetter()
|
|
||||||
handleType = 1
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
if handleType != 0 {
|
latestTimeStr := utils.Time2Str(time.Now().Add(-needRefreshGap))
|
||||||
globals.SugarLogger.Debugf("refresh %s, value:%s", configKey, curConfig.Token)
|
if curConfig.Date <= latestTimeStr {
|
||||||
curConfig.Date = utils.GetCurTimeStr()
|
if curConfig.Token = configGetter(); curConfig.Token == "" {
|
||||||
var num int64
|
return fmt.Errorf("can not get token for %s", configKey)
|
||||||
var err error
|
|
||||||
|
|
||||||
if handleType == 1 {
|
|
||||||
num, err = db.Update(curConfig, "Token", "Date")
|
|
||||||
} else {
|
|
||||||
num, err = db.Insert(curConfig)
|
|
||||||
}
|
|
||||||
if err != nil || num == 0 {
|
|
||||||
globals.SugarLogger.Errorf("db error:%v, num:%d, curConfig:%v", err, num, curConfig)
|
|
||||||
} else {
|
|
||||||
configSetter(curConfig.Token)
|
|
||||||
}
|
}
|
||||||
|
handleType = 1
|
||||||
}
|
}
|
||||||
time.Sleep(sleepGap)
|
|
||||||
}
|
}
|
||||||
}()
|
if handleType != 0 {
|
||||||
|
globals.SugarLogger.Debugf("refresh %s, value:%s", configKey, curConfig.Token)
|
||||||
|
curConfig.Date = utils.GetCurTimeStr()
|
||||||
|
var num int64
|
||||||
|
var err error
|
||||||
|
|
||||||
|
if handleType == 1 {
|
||||||
|
num, err = db.Update(curConfig, "Token", "Date")
|
||||||
|
} else {
|
||||||
|
num, err = db.Insert(curConfig)
|
||||||
|
}
|
||||||
|
if err != nil || num == 0 {
|
||||||
|
globals.SugarLogger.Errorf("db error:%v, num:%d, curConfig:%v", err, num, curConfig)
|
||||||
|
return err
|
||||||
|
} else {
|
||||||
|
configSetter(curConfig.Token)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
err := refreshFunc() // 这样写的目的是强制第一次调用时要刷新一次
|
||||||
|
if err == nil {
|
||||||
|
go func() {
|
||||||
|
for {
|
||||||
|
time.Sleep(sleepGap)
|
||||||
|
refreshFunc()
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func RefreshWeixinToken() {
|
func RefreshWeixinToken() error {
|
||||||
RefreshConfig("wechat", weixinTokenExpires, func() string {
|
return RefreshConfig("wechat", weixinTokenExpires, func() string {
|
||||||
if tokenInfo, err := api.WeixinAPI.RefreshToken(); err == nil {
|
if tokenInfo, err := api.WeixinAPI.RefreshToken(); err == nil {
|
||||||
return tokenInfo.AccessToken
|
return tokenInfo.AccessToken
|
||||||
}
|
}
|
||||||
@@ -93,8 +104,8 @@ func RefreshWeixinToken() {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func RefreshElmToken() {
|
func RefreshElmToken() error {
|
||||||
RefreshConfig("eleme", elmTokenExpires, func() string {
|
return RefreshConfig("eleme", elmTokenExpires, func() string {
|
||||||
if tokenInfo, err := api.ElmAPI.RefreshTokenIndividual(); err == nil {
|
if tokenInfo, err := api.ElmAPI.RefreshTokenIndividual(); err == nil {
|
||||||
tokenInfo2 := &ElmTokenForCompatible{
|
tokenInfo2 := &ElmTokenForCompatible{
|
||||||
Error: "",
|
Error: "",
|
||||||
|
|||||||
11
main.go
11
main.go
@@ -2,6 +2,7 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
bzcon "git.rosy.net.cn/jx-callback/business/controller"
|
bzcon "git.rosy.net.cn/jx-callback/business/controller"
|
||||||
|
"git.rosy.net.cn/jx-callback/globals"
|
||||||
"git.rosy.net.cn/jx-callback/legacy/jd/controller"
|
"git.rosy.net.cn/jx-callback/legacy/jd/controller"
|
||||||
"git.rosy.net.cn/jx-callback/legacy/tasks"
|
"git.rosy.net.cn/jx-callback/legacy/tasks"
|
||||||
_ "git.rosy.net.cn/jx-callback/routers"
|
_ "git.rosy.net.cn/jx-callback/routers"
|
||||||
@@ -10,9 +11,15 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
if beego.BConfig.RunMode == "prod" {
|
if beego.BConfig.RunMode == "prod" {
|
||||||
|
if err := tasks.RefreshWeixinToken(); err != nil {
|
||||||
|
globals.SugarLogger.Errorf("RefreshWeixinToken failed with error:%s", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err := tasks.RefreshElmToken(); err != nil {
|
||||||
|
globals.SugarLogger.Errorf("RefreshElmToken failed with error:%s", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
controller.InitOrder()
|
controller.InitOrder()
|
||||||
tasks.RefreshWeixinToken()
|
|
||||||
tasks.RefreshElmToken()
|
|
||||||
}
|
}
|
||||||
bzcon.OrderManager.LoadPendingOrders()
|
bzcon.OrderManager.LoadPendingOrders()
|
||||||
bzcon.WaybillManager.LoadPendingWaybills()
|
bzcon.WaybillManager.LoadPendingWaybills()
|
||||||
|
|||||||
Reference in New Issue
Block a user