- 添加对于监控平台门店状态初始版本

This commit is contained in:
gazebo
2019-06-26 16:58:38 +08:00
parent f7ec972d2e
commit 0adf3e7d31
15 changed files with 422 additions and 30 deletions

View File

@@ -8,6 +8,8 @@ import (
"strings"
"time"
"git.rosy.net.cn/jx-callback/business/auth2"
"git.rosy.net.cn/baseapi/platformapi/dadaapi"
"git.rosy.net.cn/baseapi/platformapi/feieapi"
"git.rosy.net.cn/baseapi/platformapi/jdapi"
@@ -15,6 +17,7 @@ import (
"git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/jxutils/excel"
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
"git.rosy.net.cn/jx-callback/business/jxutils/msg"
"git.rosy.net.cn/jx-callback/business/jxutils/netprinter"
"git.rosy.net.cn/jx-callback/business/jxutils/tasksch"
"git.rosy.net.cn/jx-callback/business/model"
@@ -91,6 +94,13 @@ var (
"deliveryRange": 1,
"status": 1,
}
WatchVendorStoreTimeList = []string{
"8:00:00",
"10:00:00",
"11:00:00",
"15:00:00",
}
)
// todo 门店绑定信息可以考虑以数组形式返回,而不是现在这样
@@ -1077,7 +1087,7 @@ func composeDadaStoreName(storeDetail *dao.StoreDetail2) (storeName string) {
func ExportShopsHealthInfo(ctx *jxcontext.Context, vendorIDs, storeIDs []int, isAsync, isContinueWhenError bool) (hint string, err error) {
db := dao.GetDB()
vendorID := model.VendorIDEBAI
storeMapList, err := dao.GetStoresMapList(db, []int{vendorID}, storeIDs, model.StoreStatusAll)
storeMapList, err := dao.GetStoresMapList(db, []int{vendorID}, storeIDs, model.StoreStatusAll, model.StoreIsSyncYes)
if err != nil {
return "", err
}
@@ -1161,3 +1171,194 @@ func GetCorporationInfo(ctx *jxcontext.Context, licenceCode string) (corporation
corporationInfo, err = api.JdAPI.GetCorporationInfo("", licenceCode)
return corporationInfo, err
}
func GetStoresVendorSnapshot(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorIDs, storeIDs []int) (vendorStoreSnapshotList []*model.VendorStoreSnapshot, err error) {
db := dao.GetDB()
storeMapList, err := dao.GetStoresMapList(db, vendorIDs, storeIDs, model.StoreStatusAll, model.StoreIsSyncYes)
if err != nil {
return nil, err
}
task := tasksch.NewParallelTask("GetStoresVendorSnapshot", tasksch.NewParallelConfig().SetIsContinueWhenError(true), ctx,
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
storeMap := batchItemList[0].(*model.StoreMap)
if handler := partner.GetPurchasePlatformFromVendorID(storeMap.VendorID); handler != nil {
store, err2 := handler.ReadStore(storeMap.VendorStoreID)
if err = err2; err == nil {
retVal = []interface{}{&model.VendorStoreSnapshot{
StoreID: storeMap.StoreID,
VendorID: storeMap.VendorID,
VendorStoreID: storeMap.VendorStoreID,
Status: store.Status,
OpenTime1: store.OpenTime1,
CloseTime1: store.CloseTime1,
OpenTime2: store.OpenTime2,
CloseTime2: store.CloseTime2,
}}
}
}
return retVal, err
}, storeMapList)
tasksch.HandleTask(task, parentTask, true).Run()
resultList, err := task.GetResult(0)
if len(resultList) > 0 {
err = nil // 强制忽略
for _, v := range resultList {
dao.WrapAddIDCULDEntity(v, ctx.GetUserName())
vendorStoreSnapshotList = append(vendorStoreSnapshotList, v.(*model.VendorStoreSnapshot))
}
}
return vendorStoreSnapshotList, err
}
func getCurrentSnapshotAt(now time.Time) (snapshotAt time.Time) {
return jxutils.GetLastTimeFromList(now, WatchVendorStoreTimeList)
}
func SaveStoresVendorSnapshot(db *dao.DaoDB, snapshotAt time.Time, curSnapshotList []*model.VendorStoreSnapshot) (err error) {
dao.Begin(db)
defer func() {
if r := recover(); r != nil || err != nil {
dao.Rollback(db)
if r != nil {
panic(r)
}
}
}()
for _, v := range curSnapshotList {
v.SnapshotAt = snapshotAt
dao.DeleteEntity(db, v, "VendorStoreID", "VendorID", "SnapshotAt")
if err = dao.CreateEntity(db, v); err != nil {
return err
}
}
dao.Commit(db)
return err
}
func SendAlarmVendorSnapshot(ctx *jxcontext.Context, parentTask tasksch.ITask, prevSnapshotList, curSnapshotList []*model.VendorStoreSnapshot) (err error) {
prevSnapshotMap := make(map[string]*model.VendorStoreSnapshot)
for _, v := range prevSnapshotList {
prevSnapshotMap[v.GenMapKey()] = v
}
alarmMap := make(map[int]map[int]*model.VendorStoreSnapshot)
storeDetailMap := make(map[int]*dao.StoreDetail)
userMap := make(map[string][]int)
db := dao.GetDB()
for _, v := range curSnapshotList {
prevSnapshot := prevSnapshotMap[v.GenMapKey()]
if prevSnapshot != nil {
if ((prevSnapshot == nil || prevSnapshot.Status == model.StoreStatusOpened) && v.Status != model.StoreStatusOpened) ||
v.CompareOperationTime(prevSnapshot) < 0 {
if alarmMap[v.StoreID] == nil {
alarmMap[v.StoreID] = make(map[int]*model.VendorStoreSnapshot)
storeDetail, _ := dao.GetStoreDetail(db, v.StoreID, v.VendorID)
if storeDetail != nil {
storeDetailMap[v.StoreID] = storeDetail
userMap[storeDetail.Tel1] = append(userMap[storeDetail.Tel1], v.StoreID)
userMap[storeDetail.MarketManPhone] = append(userMap[storeDetail.MarketManPhone], v.StoreID)
userMap[storeDetail.OperatorPhone] = append(userMap[storeDetail.OperatorPhone], v.StoreID)
}
}
alarmMap[v.StoreID][v.VendorID] = v
}
}
}
var mobileList []string
for mobile := range userMap {
if mobile != "" {
mobileList = append(mobileList, mobile)
}
}
if len(mobileList) > 0 {
task := tasksch.NewParallelTask("SendAlarmVendorSnapshot", tasksch.NewParallelConfig().SetIsContinueWhenError(true), ctx,
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
mobile := batchItemList[0].(string)
var dataList []map[string]interface{}
captionList := []string{"京西门店ID", "门店名"}
isFirstRow := true
for _, storeID := range userMap[mobile] {
snapshotMap := alarmMap[storeID]
data := map[string]interface{}{
"京西门店ID": storeID,
"门店名": storeDetailMap[storeID].Store.Name,
}
for _, vendorID := range []int{model.VendorIDJD, model.VendorIDEBAI, model.VendorIDMTWM} {
if isFirstRow {
captionList = append(captionList, model.VendorChineseNames[vendorID]+"ID",
model.VendorChineseNames[vendorID]+"之前状态", model.VendorChineseNames[vendorID]+"当前状态",
model.VendorChineseNames[vendorID]+"之前营业时间", model.VendorChineseNames[vendorID]+"当前营业时间")
}
data[model.VendorChineseNames[vendorID]+"ID"] = ""
data[model.VendorChineseNames[vendorID]+"之前状态"] = ""
data[model.VendorChineseNames[vendorID]+"当前状态"] = ""
data[model.VendorChineseNames[vendorID]+"之前营业时间"] = ""
data[model.VendorChineseNames[vendorID]+"当前营业时间"] = ""
snapshot := snapshotMap[vendorID]
if snapshot != nil {
data[model.VendorChineseNames[vendorID]+"ID"] = snapshot.VendorStoreID
data[model.VendorChineseNames[vendorID]+"当前状态"] = model.StoreStatusName[snapshot.Status]
data[model.VendorChineseNames[vendorID]+"当前营业时间"] = jxutils.OperationTimeStr4VendorStore(snapshot)
if p := prevSnapshotMap[snapshot.GenMapKey()]; p != nil {
data[model.VendorChineseNames[vendorID]+"之前状态"] = model.StoreStatusName[p.Status]
data[model.VendorChineseNames[vendorID]+"之前营业时间"] = jxutils.OperationTimeStr4VendorStore(p)
}
}
}
dataList = append(dataList, data)
isFirstRow = false
}
excelConf := &excel.Obj2ExcelSheetConfig{
Title: "平台门店重要信息",
Data: dataList,
CaptionList: captionList,
}
excelBin := excel.Obj2Excel([]*excel.Obj2ExcelSheetConfig{excelConf})
key := "export/" + mobile + time.Now().Format("20060102T150405") + ".xlsx"
excelURL, err2 := jxutils.UploadExportContent(excelBin, key)
if err2 != nil {
globals.SugarLogger.Warnf("SendAlarmVendorSnapshot, send %s failed with error:%v", key, err2)
}
sendStoreStatusInfo2Mobile(mobile, excelURL)
return nil, nil
}, mobileList)
tasksch.HandleTask(task, parentTask, true).Run()
_, err = task.GetResult(0)
}
return err
}
func sendStoreStatusInfo2Mobile(mobile, excelURL string) {
if user := userProvider.GetUser(mobile, auth2.AuthTypeMobile); user != nil {
globals.SugarLogger.Debugf("sendStoreStatusInfo2Mobile %s:%s", mobile, excelURL)
msg.SendUserMessage(user.GetID(), "平台门店重要信息", fmt.Sprintf("详情见: %s", excelURL))
}
}
func SaveAndSendAlarmVendorSnapshot(ctx *jxcontext.Context, vendorIDs, storeIDs []int) (err error) {
curSnapshotAt := getCurrentSnapshotAt(time.Now())
db := dao.GetDB()
var curSnapshotList, prevSnapshotList []*model.VendorStoreSnapshot
task := tasksch.NewSeqTask("SaveAndSendAlarmVendorSnapshot", ctx,
func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
switch step {
case 0:
curSnapshotList, err = GetStoresVendorSnapshot(ctx, task, vendorIDs, storeIDs)
case 1:
err = SaveStoresVendorSnapshot(db, curSnapshotAt, curSnapshotList)
case 2:
prevSnapshotList, err = dao.GetVendorStoreSnapshot(db, curSnapshotAt)
case 3:
err = SendAlarmVendorSnapshot(ctx, task, prevSnapshotList, curSnapshotList)
}
return nil, err
}, 4)
tasksch.ManageTask(task).Run()
_, err = task.GetResult(0)
return err
}

View File

@@ -500,7 +500,7 @@ func GetStoresSkus(ctx *jxcontext.Context, storeIDs, skuIDs []int, isFocus bool,
}
func getValidStoreVendorMap(db *dao.DaoDB, storeIDs []int) (realVendorMap map[int]int, err error) {
storeMapList, err := dao.GetStoresMapList(db, nil, storeIDs, model.StoreStatusAll)
storeMapList, err := dao.GetStoresMapList(db, nil, storeIDs, model.StoreStatusAll, model.StoreIsSyncYes)
if err != nil {
return nil, err
}
@@ -1649,7 +1649,7 @@ func RefreshStoresSkuByVendor(ctx *jxcontext.Context, storeIDs []int, vendorID i
return "", fmt.Errorf("此功能当前只支持京东到家平台")
}
db := dao.GetDB()
storeMapList, err := dao.GetStoresMapList(db, nil, storeIDs, model.StoreStatusAll)
storeMapList, err := dao.GetStoresMapList(db, nil, storeIDs, model.StoreStatusAll, model.StoreIsSyncAll)
if err != nil {
return "", err
}

View File

@@ -0,0 +1,18 @@
package cms
import (
"testing"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
"git.rosy.net.cn/jx-callback/business/model"
)
func TestGetStoresVendorSnapshot(t *testing.T) {
result, err := GetStoresVendorSnapshot(jxcontext.AdminCtx, nil, []int{model.VendorIDEBAI}, nil)
if err != nil {
t.Fatal(err)
}
t.Log(utils.Format4Output(result, false))
t.Log(len(result))
}

View File

@@ -518,28 +518,10 @@ func (v *VendorSync) DeleteRemoteStoreSkus(ctx *jxcontext.Context, db *dao.DaoDB
}
func (v *VendorSync) LoopStoresMap2(ctx *jxcontext.Context, db *dao.DaoDB, taskName string, isAsync, isManageIt bool, vendorIDs []int, storeIDs []int, handler tasksch.WorkFunc, isContinueWhenError bool) (task tasksch.ITask, hint string, err error) {
sql := `
SELECT t1.*
FROM store_map t1
WHERE t1.is_sync = 1 AND t1.deleted_at = ?
`
sqlParams := []interface{}{
utils.DefaultTimeValue,
}
if len(vendorIDs) > 0 {
sql += " AND t1.vendor_id IN (" + dao.GenQuestionMarks(len(vendorIDs)) + ")"
sqlParams = append(sqlParams, vendorIDs)
}
if len(storeIDs) > 0 {
sql += " AND t1.store_id IN (" + dao.GenQuestionMarks(len(storeIDs)) + ")"
sqlParams = append(sqlParams, storeIDs)
}
sql += " ORDER BY t1.store_id, t1.vendor_id"
var storeMapList []*model.StoreMap
if err = dao.GetRows(db, &storeMapList, sql, sqlParams...); err != nil {
if storeMapList, err = dao.GetStoresMapList(db, vendorIDs, storeIDs, model.StoreStatusAll, model.StoreIsSyncYes); err != nil {
return nil, "", err
}
if len(storeMapList) == 0 {
return nil, "", nil
}

View File

@@ -16,6 +16,16 @@ import (
"git.rosy.net.cn/jx-callback/globals"
)
func Init() {
StartRefreshEbaiRealMobile()
StartDailyWork()
if globals.ReallyCallPlatformAPI {
ScheduleTimerFunc(func() {
cms.SaveAndSendAlarmVendorSnapshot(jxcontext.AdminCtx, nil, nil)
}, cms.WatchVendorStoreTimeList)
}
}
func StartRefreshEbaiRealMobile() {
if globals.ReallyCallPlatformAPI {
utils.AfterFuncWithRecover(5*time.Second, func() {
@@ -144,3 +154,14 @@ func doDailyWork() {
// cms.CurVendorSync.FullSyncStoresSkus(jxcontext.AdminCtx, dao.GetDB(), []int{model.VendorIDJD}, nil, true, true)
cms.CurVendorSync.SyncStoresSkus(jxcontext.AdminCtx, dao.GetDB(), []int{model.VendorIDJD, model.VendorIDEBAI, model.VendorIDMTWM}, nil, nil, false, true, true)
}
func ScheduleTimerFunc(handler func(), timeList []string) {
now := time.Now()
nextTime := jxutils.GetNextTimeFromList(now, timeList)
duration := nextTime.Sub(now) + 1*time.Second
globals.SugarLogger.Debugf("ScheduleTimerFunc, duration:%v", duration)
utils.AfterFuncWithRecover(duration, func() {
handler()
ScheduleTimerFunc(handler, timeList)
})
}

View File

@@ -581,3 +581,49 @@ func TaskResult2Hint(resultList []interface{}) (hint string) {
func Combine2Int(int1, int2 int) (outInt int64) {
return int64(int1)*100000 + int64(int2)
}
func GetLastTimeFromList(now time.Time, timeList []string) (snapshotAt time.Time) {
dateStr := utils.Time2DateStr(now)
selectTime := utils.Str2Time(utils.Time2DateStr(now.Add(-24*time.Hour)) + " " + timeList[len(timeList)-1])
for _, v := range timeList {
tmpTime := utils.Str2Time(dateStr + " " + v)
if tmpTime.Sub(now) > 0 {
break
}
selectTime = tmpTime
}
return selectTime
}
func GetNextTimeFromList(now time.Time, timeList []string) (snapshotAt time.Time) {
dateStr := utils.Time2DateStr(now)
timeListLen := len(timeList)
selectTime := utils.Str2Time(utils.Time2DateStr(now.Add(24*time.Hour)) + " " + timeList[0])
for k := range timeList {
v := timeList[timeListLen-k-1]
tmpTime := utils.Str2Time(dateStr + " " + v)
if tmpTime.Sub(now) < 0 {
break
}
selectTime = tmpTime
}
return selectTime
}
func OperationTime2Str(opTime int16) (str string) {
str = fmt.Sprintf("%02d:%02d", opTime/100, opTime%100)
return str
}
func OperationTime2Str2(openTime, closeTime int16) (str string) {
str = fmt.Sprintf("%s-%s", OperationTime2Str(openTime), OperationTime2Str(closeTime))
return str
}
func OperationTimeStr4VendorStore(v *model.VendorStoreSnapshot) (str string) {
str = fmt.Sprintf("%s", OperationTime2Str2(v.OpenTime1, v.CloseTime1))
if v.OpenTime2 > 0 && v.CloseTime2 > 0 {
str += fmt.Sprintf("|%s", OperationTime2Str2(v.OpenTime2, v.CloseTime2))
}
return str
}

View File

@@ -158,3 +158,28 @@ func TestGetPossibleVendorIDFromVendorOrderID(t *testing.T) {
}
}
}
func TestGetLastTimeFromList(t *testing.T) {
timeList := []string{
"08:00:00",
"23:00:00",
}
time1 := GetLastTimeFromList(utils.Str2Time("2019-06-17 07:59:59"), timeList)
if time1.Sub(utils.Str2Time("2019-06-16 23:00:00")) != 0 {
t.Fatal("GetLastTimeFromList wrong1")
}
time1 = GetLastTimeFromList(utils.Str2Time("2019-06-17 08:59:59"), timeList)
if time1.Sub(utils.Str2Time("2019-06-17 08:00:00")) != 0 {
t.Fatal("GetLastTimeFromList wrong2")
}
time1 = GetNextTimeFromList(utils.Str2Time("2019-06-17 08:59:59"), timeList)
if time1.Sub(utils.Str2Time("2019-06-17 23:00:00")) != 0 {
t.Fatal("GetNextTimeFromList wrong1")
}
time1 = GetNextTimeFromList(utils.Str2Time("2019-06-17 23:01:59"), timeList)
if time1.Sub(utils.Str2Time("2019-06-18 08:00:00")) != 0 {
t.Fatal("GetNextTimeFromList wrong2")
}
}

View File

@@ -5,7 +5,6 @@ import (
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/globals"
)
func GetUserByID(db *DaoDB, fieldName, fieldValue string) (user *model.User, err error) {
@@ -19,7 +18,7 @@ func GetUserByID(db *DaoDB, fieldName, fieldValue string) (user *model.User, err
model.UserStatusNormal,
fieldValue,
}
globals.SugarLogger.Debugf("GetUserByID sql:%s, sqlParams:%s", sql, utils.Format4Output(sqlParams, false))
// globals.SugarLogger.Debugf("GetUserByID sql:%s, sqlParams:%s", sql, utils.Format4Output(sqlParams, false))
err = GetRow(db, &user, sql, sqlParams...)
return user, err
}

View File

@@ -1,6 +1,8 @@
package dao
import (
"time"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/model"
)
@@ -19,7 +21,8 @@ type StoreDetail struct {
DeliveryCompetition int8 `orm:"default(1)" json:"deliveryCompetition"` // 是否支持配送竞争
IsSync int8 `orm:"default(1)" json:"isSync"` // 是否同步
model.Place // district info
model.Place // district info
DistrictName string `json:"-"`
}
type StoreDetail2 struct {
@@ -35,7 +38,7 @@ func getStoreDetail(db *DaoDB, storeID, vendorID int, vendorStoreID string) (sto
SELECT t1.*,
t2.vendor_store_id, t2.status vendor_status, t2.delivery_fee, t2.sync_status,
t2.price_percentage, t2.auto_pickup, t2.delivery_type, t2.delivery_competition, t2.is_sync,
district.code, district.name, district.parent_code, district.level, district.tel_code, district.jd_code, district.ebai_code, district.enabled, district.mtps_price
district.code, district.name district_name, district.parent_code, district.level, district.tel_code, district.jd_code, district.ebai_code, district.enabled, district.mtps_price
FROM store t1
JOIN store_map t2 ON t1.id = t2.store_id AND t2.vendor_id = ? AND t2.deleted_at = ?
LEFT JOIN place district ON t1.district_code = district.code
@@ -56,6 +59,7 @@ func getStoreDetail(db *DaoDB, storeID, vendorID int, vendorStoreID string) (sto
}
storeDetail = &StoreDetail{}
if err = GetRow(db, storeDetail, sql, sqlParams...); err == nil {
storeDetail.Place.Name = storeDetail.DistrictName
return storeDetail, nil
}
return nil, err
@@ -181,7 +185,7 @@ func GetStoreCourierList(db *DaoDB, storeID, status int) (courierStoreList []*mo
return nil, err
}
func GetStoresMapList(db *DaoDB, vendorIDs, storeIDs []int, status int) (storeMapList []*model.StoreMap, err error) {
func GetStoresMapList(db *DaoDB, vendorIDs, storeIDs []int, status, isSync int) (storeMapList []*model.StoreMap, err error) {
sql := `
SELECT t1.*
FROM store_map t1
@@ -202,6 +206,11 @@ func GetStoresMapList(db *DaoDB, vendorIDs, storeIDs []int, status int) (storeMa
sql += " AND t1.status = ?"
sqlParams = append(sqlParams, status)
}
if isSync != model.StoreIsSyncAll {
sql += " AND t1.is_sync = ?"
sqlParams = append(sqlParams, isSync)
}
sql += " ORDER BY t1.store_id, t1.vendor_id"
if err = GetRows(db, &storeMapList, sql, sqlParams...); err == nil {
return storeMapList, nil
}
@@ -256,3 +265,17 @@ func FormalizeStoreStatus(db *DaoDB, storeID, storeStatus int) (err error) {
}
return err
}
func GetVendorStoreSnapshot(db *DaoDB, excludeSnapshotAt time.Time) (snapshotList []*model.VendorStoreSnapshot, err error) {
sql := `
SELECT *
FROM vendor_store_snapshot t1
WHERE t1.snapshot_at = (
SELECT MAX(snapshot_at) snapshot_at
FROM vendor_store_snapshot
WHERE snapshot_at > ? AND snapshot_at <> ?
)
`
err = GetRows(db, &snapshotList, sql, time.Now().Add(-48*time.Hour), excludeSnapshotAt)
return snapshotList, err
}

View File

@@ -1,11 +1,21 @@
package model
import (
"time"
"git.rosy.net.cn/baseapi/utils"
)
const (
StoreStatusAll = -9
StoreStatusDisabled = -2
StoreStatusClosed = -1
StoreStatusHaveRest = 0
StoreStatusOpened = 1
StoreIsSyncAll = -1
StoreIsSyncNo = 0
StoreIsSyncYes = 1
)
const (
@@ -243,3 +253,47 @@ func (*StoreCourierMap) TableUnique() [][]string {
[]string{"VendorStoreID", "VendorID", "DeletedAt"},
}
}
type VendorStoreSnapshot struct {
ModelIDCULD
StoreID int `orm:"column(store_id)" json:"storeID"`
VendorID int `orm:"column(vendor_id)" json:"vendorID"`
VendorStoreID string `orm:"column(vendor_store_id);size(48)" json:"vendorStoreID"`
SnapshotAt time.Time `orm:"type(datetime)" json:"snapshotAt"` // 这个不同于CreatedAtSnapshotAt是逻辑上的时间CreatedAt是实际存储的时间
Status int `json:"status"` // 取值同Store.Status
OpenTime1 int16 `json:"openTime1"` // 930就表示9点半用两个的原因是为了支持中午休息1与2的时间段不能交叉为0表示没有
CloseTime1 int16 `json:"closeTime1"` // 格式同上
OpenTime2 int16 `json:"openTime2"` // 格式同上
CloseTime2 int16 `json:"closeTime2"` // 格式同上
}
func (*VendorStoreSnapshot) TableUnique() [][]string {
return [][]string{
[]string{"VendorStoreID", "VendorID", "SnapshotAt"},
}
}
func (*VendorStoreSnapshot) TableIndex() [][]string {
return [][]string{
[]string{"SnapshotAt"},
}
}
func (v *VendorStoreSnapshot) GenMapKey() string {
return v.VendorStoreID + utils.Int2Str(v.VendorID)
}
func (v *VendorStoreSnapshot) CompareOperationTime(s2 *VendorStoreSnapshot) int {
if s2 == nil {
return 1
}
if v.OpenTime1 == s2.OpenTime1 && v.CloseTime1 == s2.CloseTime1 &&
v.OpenTime2 == s2.OpenTime2 && v.CloseTime2 == s2.CloseTime2 {
return 0
} else if v.OpenTime1 > s2.OpenTime1 || v.CloseTime1 < s2.CloseTime2 {
return -1
}
return 1
}

View File

@@ -38,7 +38,7 @@ func (c *PurchaseHandler) refreshCommentOnce() {
func (c *PurchaseHandler) RefreshComment(fromTime, toTime time.Time) (err error) {
if globals.EnableMtwmStoreWrite {
storeMapList, err2 := dao.GetStoresMapList(dao.GetDB(), []int{model.VendorIDMTWM}, nil, model.StoreStatusAll)
storeMapList, err2 := dao.GetStoresMapList(dao.GetDB(), []int{model.VendorIDMTWM}, nil, model.StoreStatusAll, model.StoreIsSyncAll)
if err = err2; err != nil {
return err
}

View File

@@ -1,6 +1,7 @@
package controllers
import (
"git.rosy.net.cn/jx-callback/business/jxstore/cms"
"git.rosy.net.cn/jx-callback/business/jxstore/tempop"
"git.rosy.net.cn/jx-callback/business/jxutils"
"github.com/astaxie/beego"
@@ -230,3 +231,16 @@ func (c *TempOpController) RefreshMtpsWaybillFee() {
return retVal, "", err
})
}
// @Title 查询三方运单费用信息
// @Description 查询三方运单费用信息
// @Param token header string true "认证token"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /TestIt [get]
func (c *TempOpController) TestIt() {
c.callTestIt(func(params *tTempopTestItParams) (retVal interface{}, errCode string, err error) {
err = cms.SaveAndSendAlarmVendorSnapshot(params.Ctx, nil, nil)
return retVal, "", err
})
}

View File

@@ -37,6 +37,7 @@ func Init() {
orm.RegisterModel(&model.AuthBind{}, &model.User{})
orm.RegisterModel(&model.PageShop{})
orm.RegisterModel(&model.VendorStoreSnapshot{})
// orm.RegisterModel(&model.ActivityForSku{})
// orm.RegisterModel(&legacymodel.JxBadComments2{})

View File

@@ -48,9 +48,8 @@ func Init() {
promotion.Init()
if globals.IsProductEnv() {
misc.StartRefreshEbaiRealMobile()
ebai.CurPurchaseHandler.StartRefreshComment()
misc.StartDailyWork()
misc.Init()
}
}

View File

@@ -1528,6 +1528,15 @@ func init() {
Filters: nil,
Params: nil})
beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:TempOpController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:TempOpController"],
beego.ControllerComments{
Method: "TestIt",
Router: `/TestIt`,
AllowHTTPMethods: []string{"get"},
MethodParams: param.Make(),
Filters: nil,
Params: nil})
beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:TempOpController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:TempOpController"],
beego.ControllerComments{
Method: "UpdateAllWeiXinRemark",