From 0adf3e7d3165962f00850537fec622c04df76c63 Mon Sep 17 00:00:00 2001 From: gazebo Date: Wed, 26 Jun 2019 16:58:38 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E6=B7=BB=E5=8A=A0=E5=AF=B9=E4=BA=8E?= =?UTF-8?q?=E7=9B=91=E6=8E=A7=E5=B9=B3=E5=8F=B0=E9=97=A8=E5=BA=97=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E5=88=9D=E5=A7=8B=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/cms/store.go | 203 +++++++++++++++++- business/jxstore/cms/store_sku.go | 4 +- business/jxstore/cms/store_test.go | 18 ++ business/jxstore/cms/sync.go | 20 +- business/jxstore/misc/misc.go | 21 ++ business/jxutils/jxutils.go | 46 ++++ business/jxutils/jxutils_test.go | 25 +++ business/model/dao/dao_user2.go | 3 +- business/model/dao/store.go | 29 ++- business/model/store.go | 54 +++++ .../partner/purchase/mtwm/order_comment.go | 2 +- controllers/temp_op.go | 14 ++ globals/beegodb/beegodb.go | 1 + main.go | 3 +- routers/commentsRouter_controllers.go | 9 + 15 files changed, 422 insertions(+), 30 deletions(-) create mode 100644 business/jxstore/cms/store_test.go diff --git a/business/jxstore/cms/store.go b/business/jxstore/cms/store.go index 60fa9e744..fe690f73a 100644 --- a/business/jxstore/cms/store.go +++ b/business/jxstore/cms/store.go @@ -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 +} diff --git a/business/jxstore/cms/store_sku.go b/business/jxstore/cms/store_sku.go index f282dcb2a..c0fef36ac 100644 --- a/business/jxstore/cms/store_sku.go +++ b/business/jxstore/cms/store_sku.go @@ -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 } diff --git a/business/jxstore/cms/store_test.go b/business/jxstore/cms/store_test.go new file mode 100644 index 000000000..31b8a5230 --- /dev/null +++ b/business/jxstore/cms/store_test.go @@ -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)) +} diff --git a/business/jxstore/cms/sync.go b/business/jxstore/cms/sync.go index 9172e46cd..ee6b2e321 100644 --- a/business/jxstore/cms/sync.go +++ b/business/jxstore/cms/sync.go @@ -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 } diff --git a/business/jxstore/misc/misc.go b/business/jxstore/misc/misc.go index a011872bb..de755b961 100644 --- a/business/jxstore/misc/misc.go +++ b/business/jxstore/misc/misc.go @@ -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) + }) +} diff --git a/business/jxutils/jxutils.go b/business/jxutils/jxutils.go index 3b87c736d..82a3d6407 100644 --- a/business/jxutils/jxutils.go +++ b/business/jxutils/jxutils.go @@ -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 +} diff --git a/business/jxutils/jxutils_test.go b/business/jxutils/jxutils_test.go index 68fe2793d..ce1b49cfa 100644 --- a/business/jxutils/jxutils_test.go +++ b/business/jxutils/jxutils_test.go @@ -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") + } + +} diff --git a/business/model/dao/dao_user2.go b/business/model/dao/dao_user2.go index e963396f0..eb84544d8 100644 --- a/business/model/dao/dao_user2.go +++ b/business/model/dao/dao_user2.go @@ -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 } diff --git a/business/model/dao/store.go b/business/model/dao/store.go index 2031c4713..a31438515 100644 --- a/business/model/dao/store.go +++ b/business/model/dao/store.go @@ -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 +} diff --git a/business/model/store.go b/business/model/store.go index b535e9e4f..ed7af85f9 100644 --- a/business/model/store.go +++ b/business/model/store.go @@ -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 +} diff --git a/business/partner/purchase/mtwm/order_comment.go b/business/partner/purchase/mtwm/order_comment.go index ae1d8b6a7..450919a25 100644 --- a/business/partner/purchase/mtwm/order_comment.go +++ b/business/partner/purchase/mtwm/order_comment.go @@ -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 } diff --git a/controllers/temp_op.go b/controllers/temp_op.go index 08facefef..1e24b1996 100644 --- a/controllers/temp_op.go +++ b/controllers/temp_op.go @@ -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 + }) +} diff --git a/globals/beegodb/beegodb.go b/globals/beegodb/beegodb.go index c5a529b6a..a29a7ddcc 100644 --- a/globals/beegodb/beegodb.go +++ b/globals/beegodb/beegodb.go @@ -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{}) diff --git a/main.go b/main.go index 9b298a3c8..f1ac86e39 100644 --- a/main.go +++ b/main.go @@ -48,9 +48,8 @@ func Init() { promotion.Init() if globals.IsProductEnv() { - misc.StartRefreshEbaiRealMobile() ebai.CurPurchaseHandler.StartRefreshComment() - misc.StartDailyWork() + misc.Init() } } diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index 733f22671..13458a5da 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -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",