- 添加对于监控平台门店状态初始版本
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
18
business/jxstore/cms/store_test.go
Normal file
18
business/jxstore/cms/store_test.go
Normal 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))
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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"` // 这个不同于CreatedAt,SnapshotAt是逻辑上的时间,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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
})
|
||||
}
|
||||
|
||||
@@ -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{})
|
||||
|
||||
3
main.go
3
main.go
@@ -48,9 +48,8 @@ func Init() {
|
||||
promotion.Init()
|
||||
|
||||
if globals.IsProductEnv() {
|
||||
misc.StartRefreshEbaiRealMobile()
|
||||
ebai.CurPurchaseHandler.StartRefreshComment()
|
||||
misc.StartDailyWork()
|
||||
misc.Init()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user