diff --git a/business/jxcallback/orderman/orderman_ext.go b/business/jxcallback/orderman/orderman_ext.go index cec268570..156531b8c 100644 --- a/business/jxcallback/orderman/orderman_ext.go +++ b/business/jxcallback/orderman/orderman_ext.go @@ -246,7 +246,7 @@ func (c *OrderManager) ExportMTWaybills(ctx *jxcontext.Context, fromDateStr, toD return nil, err } -func (c *OrderManager) getOrders(ctx *jxcontext.Context, isIncludeSku bool, fromDateStr, toDateStr string, params map[string]interface{}, offset, pageSize int) (orders []*model.GoodsOrderExt, totalCount int, err error) { +func (c *OrderManager) getOrders(ctx *jxcontext.Context, isIncludeSku bool, fromDateStr, toDateStr string, isDateFinish bool, params map[string]interface{}, offset, pageSize int) (orders []*model.GoodsOrderExt, totalCount int, err error) { globals.SugarLogger.Debugf("getOrders from:%s to:%s", fromDateStr, toDateStr) pageSize = jxutils.FormalizePageSize(pageSize) @@ -310,10 +310,13 @@ func (c *OrderManager) getOrders(ctx *jxcontext.Context, isIncludeSku bool, from return nil, 0, err } toDate = toDate.Add(24 * time.Hour) - - sqlWhere = ` - WHERE t1.order_created_at >= ? AND t1.order_created_at < ? - ` + if isDateFinish { + sqlWhere = ` + WHERE t1.order_finished_at >= ? AND t1.order_finished_at < ?` + } else { + sqlWhere = ` + WHERE t1.order_created_at >= ? AND t1.order_created_at < ?` + } sqlParams = []interface{}{ fromDate, toDate, @@ -423,9 +426,9 @@ func (c *OrderManager) getOrders(ctx *jxcontext.Context, isIncludeSku bool, from return orders, totalCount, err } -func (c *OrderManager) GetOrders(ctx *jxcontext.Context, fromDateStr, toDateStr string, params map[string]interface{}, offset, pageSize int) (pagedInfo *model.PagedInfo, err error) { +func (c *OrderManager) GetOrders(ctx *jxcontext.Context, fromDateStr, toDateStr string, isDateFinish bool, params map[string]interface{}, offset, pageSize int) (pagedInfo *model.PagedInfo, err error) { globals.SugarLogger.Debugf("GetOrders from:%s to:%s", fromDateStr, toDateStr) - orders, totalCount, err := c.getOrders(ctx, false, fromDateStr, toDateStr, params, offset, pageSize) + orders, totalCount, err := c.getOrders(ctx, false, fromDateStr, toDateStr, isDateFinish, params, offset, pageSize) if err == nil { pagedInfo = &model.PagedInfo{ TotalCount: totalCount, @@ -447,7 +450,7 @@ func (c *OrderManager) ExportOrders(ctx *jxcontext.Context, fromDateStr, toDateS func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { switch step { case 0: - orders, _, err = c.getOrders(ctx, true, fromDateStr, toDateStr, mapParams, 0, -1) + orders, _, err = c.getOrders(ctx, true, fromDateStr, toDateStr, true, mapParams, 0, -1) case 1: afsSkuMap, err = c.getAfsOrderSkuInfo4ExportOrders(ctx, fromDateStr, toDateStr) case 2: diff --git a/business/jxstore/cms/store.go b/business/jxstore/cms/store.go index 790c94e6a..25757d4d7 100644 --- a/business/jxstore/cms/store.go +++ b/business/jxstore/cms/store.go @@ -239,8 +239,9 @@ func GetStores(ctx *jxcontext.Context, keyword string, params map[string]interfa } if keyword != "" { keywordLike := "%" + keyword + "%" - sqlWhere += " AND (t1.name LIKE ? OR t1.tel1 LIKE ? OR t1.tel2 LIKE ? OR t1.last_operator LIKE ? OR city.name LIKE ? OR t1.address LIKE ? OR t1.printer_sn LIKE ?" - sqlWhereParams = append(sqlWhereParams, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike) + sqlWhere += ` AND (t1.name LIKE ? OR t1.tel1 LIKE ? OR t1.tel2 LIKE ? OR t1.operator_phone LIKE ? OR t1.market_man_phone LIKE ? + OR t1.last_operator LIKE ? OR city.name LIKE ? OR t1.address LIKE ? OR t1.printer_sn LIKE ?` + sqlWhereParams = append(sqlWhereParams, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike) if keywordInt64, err2 := strconv.ParseInt(keyword, 10, 64); err2 == nil { if jxutils.IsLegalMobileNumber(keywordInt64) { @@ -1391,10 +1392,12 @@ func updateVendorStoreStatusBySnapshot(db *dao.DaoDB, curSnapshotList []*model.V } }() for _, v := range storeMapList { - if snapshot := snapshotMap[jxutils.Combine2Int(v.StoreID, v.VendorID)]; snapshot != nil && v.Status != snapshot.Status { + if snapshot := snapshotMap[jxutils.Combine2Int(v.StoreID, v.VendorID)]; snapshot != nil && + (v.Status != snapshot.Status || v.DeliveryType != snapshot.DeliveryType) { v.Status = snapshot.Status v.DeliveryType = snapshot.DeliveryType - if _, err = dao.UpdateEntity(db, v, model.FieldStatus, "DeliveryType"); err != nil { + v.LastOperator = model.AdminName + if _, err = dao.UpdateEntity(db, v, model.FieldLastOperator, model.FieldUpdatedAt, model.FieldStatus, "DeliveryType"); err != nil { return err } } @@ -1649,6 +1652,7 @@ func sendStoreStatusInfo2Mobile(mobile, title, txtAlarm string) { func SaveAndSendAlarmVendorSnapshot(ctx *jxcontext.Context, vendorIDs, storeIDs []int, isAsync bool) (err error) { curSnapshotAt := getCurrentSnapshotAt(time.Now()) + prevSnapshotAt := getCurrentSnapshotAt(curSnapshotAt.Add(-1 * time.Second)) db := dao.GetDB() var curSnapshotList, prevSnapshotList []*model.VendorStoreSnapshot task := tasksch.NewSeqTask("SaveAndSendAlarmVendorSnapshot", ctx, @@ -1664,7 +1668,7 @@ func SaveAndSendAlarmVendorSnapshot(ctx *jxcontext.Context, vendorIDs, storeIDs case 1: err = SaveStoresVendorSnapshot(db, curSnapshotAt, curSnapshotList) case 2: - prevSnapshotList, err = dao.GetVendorStoreSnapshot(db, curSnapshotAt) + prevSnapshotList, err = dao.GetVendorStoreSnapshot(db, prevSnapshotAt) case 3: err = SendAlarmVendorSnapshot(ctx, task, prevSnapshotList, curSnapshotList) } diff --git a/business/jxstore/cms/store_sku.go b/business/jxstore/cms/store_sku.go index 48d940566..460fc02e9 100644 --- a/business/jxstore/cms/store_sku.go +++ b/business/jxstore/cms/store_sku.go @@ -1280,7 +1280,7 @@ func getSkuSaleStatus(inSkuBind *StoreSkuBindSkuInfo, skuBindInfo *StoreSkuBindI } // todo 应该用updateStoresSkusWithoutSync实现 -func updateStoreSkusSaleWithoutSync(ctx *jxcontext.Context, storeID int, skuBindSkuInfos []*StoreSkuBindSkuInfo, userName string) (needSyncSkus []int, err error) { +func updateStoreSkusSaleWithoutSync(ctx *jxcontext.Context, storeID int, skuBindSkuInfos []*StoreSkuBindSkuInfo, autoSaleTime time.Time, userName string) (needSyncSkus []int, err error) { var num int64 db := dao.GetDB() needSyncIDMap := make(map[int]int) @@ -1310,14 +1310,19 @@ func updateStoreSkusSaleWithoutSync(ctx *jxcontext.Context, storeID int, skuBind } else { skuBind.Status = model.StoreSkuBindStatusDontSale } - if num, err = dao.UpdateEntityLogically(db, skuBind, map[string]interface{}{ + kvs := map[string]interface{}{ model.FieldStatus: skuBind.Status, model.FieldJdSyncStatus: skuBind.JdSyncStatus | model.SyncFlagSaleMask, model.FieldEbaiSyncStatus: skuBind.EbaiSyncStatus | model.SyncFlagSaleMask, model.FieldMtwmSyncStatus: skuBind.MtwmSyncStatus | model.SyncFlagSaleMask, model.FieldElmSyncStatus: skuBind.ElmSyncStatus | model.SyncFlagSaleMask, model.FieldWscSyncStatus: skuBind.WscSyncStatus | model.SyncFlagSaleMask, - }, userName, nil); err != nil { + } + // if utils.IsTimeZero(autoSaleTime) || skuBind.Status == model.SkuStatusNormal { + // autoSaleTime = utils.DefaultTimeValue + // } + // kvs["AutoSaleAt"] = autoSaleTime + if num, err = dao.UpdateEntityLogically(db, skuBind, kvs, userName, nil); err != nil { dao.Rollback(db) return nil, err } @@ -1342,13 +1347,13 @@ func uniqueStoreSkuBind(skuBindSkuInfos []*StoreSkuBindSkuInfo) (outSkuBindSkuIn return outSkuBindSkuInfos } -func UpdateStoresSkusSale(ctx *jxcontext.Context, storeIDs []int, skuBindSkuInfos []*StoreSkuBindSkuInfo, userName string, isAsync, isContinueWhenError bool) (hint string, err error) { +func UpdateStoresSkusSale(ctx *jxcontext.Context, storeIDs []int, skuBindSkuInfos []*StoreSkuBindSkuInfo, autoSaleTime time.Time, userName string, isAsync, isContinueWhenError bool) (hint string, err error) { storeIDs = uniqueStoreIDs(storeIDs) skuBindSkuInfos = uniqueStoreSkuBind(skuBindSkuInfos) var num int64 for _, storeID := range storeIDs { - skuIDs, err2 := updateStoreSkusSaleWithoutSync(ctx, storeID, skuBindSkuInfos, userName) + skuIDs, err2 := updateStoreSkusSaleWithoutSync(ctx, storeID, skuBindSkuInfos, autoSaleTime, userName) if err = err2; err != nil { return "", err } @@ -2171,3 +2176,37 @@ func GetMissingStoreSkuFromOrder(ctx *jxcontext.Context, fromTime time.Time) (mi } return missingList, err } + +func AutoSaleStoreSku(ctx *jxcontext.Context, storeIDs []int) (err error) { + // db := dao.GetDB() + // storeSkuList, err := dao.GetAutoSaleStoreSku(db, storeIDs) + // if err != nil { + // return err + // } + // storeSkuMap := make(map[int][]*model.StoreSkuBind) + // for _, v := range storeSkuList { + // storeSkuMap[v.StoreID] = append(storeSkuMap[v.StoreID], v) + // } + // now := time.Now() + // for storeID, storeSkuList := range storeSkuMap { + // var skuIDs []int + // for _, storeSku := range storeSkuList { + // if now.Sub(storeSku.AutoSaleAt) > 0 { + // storeSku.AutoSaleAt = utils.DefaultTimeValue + // if storeSku.Status != model.SkuStatusNormal { + // storeSku.Status = model.SkuStatusNormal + // skuIDs = append(skuIDs, storeSku.SkuID) + // } + // if _, err = dao.UpdateEntity(db, storeSku, "AutoSaleAt", model.FieldStatus); err != nil { + // return err + // } + // } + // } + // if len(skuIDs) > 0 { + // if _, err = CurVendorSync.SyncStoresSkus(ctx, db, nil, []int{storeID}, skuIDs, false, true, true); err != nil { + // return err + // } + // } + // } + return err +} diff --git a/business/jxstore/cms/store_test.go b/business/jxstore/cms/store_test.go index 89b9b51c3..3c66b1d25 100644 --- a/business/jxstore/cms/store_test.go +++ b/business/jxstore/cms/store_test.go @@ -27,3 +27,9 @@ func TestSendAlarmVendorSnapshot(t *testing.T) { t.Fatal(err) } } + +func TestUpdateVendorStoreStatusBySnapshot(t *testing.T) { + db := dao.GetDB() + curSnapshotList, _ := dao.GetVendorStoreSnapshot(db, utils.Str2Time("2019-07-30 08:00:00")) + updateVendorStoreStatusBySnapshot(db, curSnapshotList) +} diff --git a/business/jxstore/misc/misc.go b/business/jxstore/misc/misc.go index c8e1857e9..4a74bb8ac 100644 --- a/business/jxstore/misc/misc.go +++ b/business/jxstore/misc/misc.go @@ -44,6 +44,12 @@ var ( updateActStatusTimeList = []string{ "00:01:00", } + + autoEnableStoreSkuTimeList = []string{ + "7:00:00", + "14:00:00", + "22:00:00", + } ) func Init() { @@ -70,6 +76,10 @@ func Init() { ScheduleTimerFunc(func() { dao.UpdateActStatusByTime(dao.GetDB(), time.Now().Add(-48*time.Hour)) }, updateActStatusTimeList) + + // ScheduleTimerFunc(func() { + // cms.AutoSaleStoreSku(jxcontext.AdminCtx, nil) + // }, autoEnableStoreSkuTimeList) } } diff --git a/business/model/dao/store.go b/business/model/dao/store.go index 008e153bf..bb7b606da 100644 --- a/business/model/dao/store.go +++ b/business/model/dao/store.go @@ -285,17 +285,12 @@ func FormalizeStoreStatus(db *DaoDB, storeID, storeStatus int) (err error) { return err } -func GetVendorStoreSnapshot(db *DaoDB, excludeSnapshotAt time.Time) (snapshotList []*model.VendorStoreSnapshot, err error) { +func GetVendorStoreSnapshot(db *DaoDB, snapshotAt 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) + WHERE t1.snapshot_at = ?` + err = GetRows(db, &snapshotList, sql, snapshotAt) return snapshotList, err } diff --git a/business/model/dao/store_sku.go b/business/model/dao/store_sku.go index 66923c9d4..89b89cfcd 100644 --- a/business/model/dao/store_sku.go +++ b/business/model/dao/store_sku.go @@ -480,3 +480,20 @@ func GetMissingStoreSkuFromOrder(db *DaoDB, storeIDs []int, fromTime time.Time) err = GetRows(db, &storeSkuList, sql, sqlParams...) return storeSkuList, err } + +func GetAutoSaleStoreSku(db *DaoDB, storeIDs []int) (storeSkuList []*model.StoreSkuBind, err error) { + sql := ` + SELECT * + FROM store_sku_bind t1 + WHERE t1.deleted_at = ? AND t1.auto_sale_at <> ?` + sqlParams := []interface{}{ + utils.DefaultTimeValue, + utils.DefaultTimeValue, + } + if len(storeIDs) > 0 { + sql += " AND t1.store_id IN (" + GenQuestionMarks(len(storeIDs)) + ")" + sqlParams = append(sqlParams, storeIDs) + } + err = GetRows(db, &storeSkuList, sql, sqlParams...) + return storeSkuList, err +} diff --git a/business/model/store_sku.go b/business/model/store_sku.go index be6942bde..4e1cfa3fa 100644 --- a/business/model/store_sku.go +++ b/business/model/store_sku.go @@ -103,6 +103,8 @@ type StoreSkuBind struct { EbaiSyncStatus int8 `orm:"default(2)"` MtwmSyncStatus int8 `orm:"default(2)"` WscSyncStatus int8 `orm:"default(2)"` + + // AutoSaleAt time.Time `orm:"type(datetime);null" json:"autoSaleAt"` } func (*StoreSkuBind) TableUnique() [][]string { diff --git a/business/partner/partner_order.go b/business/partner/partner_order.go index d78cb6491..a7bb1f987 100644 --- a/business/partner/partner_order.go +++ b/business/partner/partner_order.go @@ -48,3 +48,8 @@ type IPurchasePlatformOrderHandler interface { // // 确认收到退货 ConfirmReceivedReturnGoods(ctx *jxcontext.Context, order *model.AfsOrder) (err error) } + +type IUpdateWaybillTip interface { + // 添加快递小费,这个不是递增的,最后一次操作会覆盖之前的设置,但只能增加,不能减少,且tipFee只能为100的倍数 + UpdateWaybillTip(ctx *jxcontext.Context, order *model.GoodsOrder, tipFee int64) (err error) +} diff --git a/business/partner/purchase/jd/act.go b/business/partner/purchase/jd/act.go index 240dc81cd..fad627ae1 100644 --- a/business/partner/purchase/jd/act.go +++ b/business/partner/purchase/jd/act.go @@ -342,7 +342,7 @@ func getActFromJD(promotionID string) (act *model.Act2, actStoreSkuList []*model act.BeginAt = result.BeginTime.GoTime() } if utils.IsTimeZero(act.EndAt) { - act.BeginAt = result.EndTime.GoTime() + act.EndAt = result.EndTime.GoTime().Add(24*time.Hour - 1*time.Second) } if result.SkuResultList[0].LimitPin == 1 || result.SkuResultList[0].LimitDevice == 1 { act.LimitUser = 1 diff --git a/business/partner/purchase/jd/order.go b/business/partner/purchase/jd/order.go index 0a4b38276..2ce4c73ae 100644 --- a/business/partner/purchase/jd/order.go +++ b/business/partner/purchase/jd/order.go @@ -425,15 +425,15 @@ func (c *PurchaseHandler) ListOrders(ctx *jxcontext.Context, parentTask tasksch. } fromDate := utils.Time2Date(queryDate) toDate := fromDate.Add(24*time.Hour - 1) - params := map[string]interface{}{ - "orderPurchaseTime_begin": utils.Time2Str(fromDate), - "orderPurchaseTime_end": utils.Time2Str(toDate), - jdapi.KeyPageNo: jdapi.AllPage, + queryParam := &jdapi.OrderQueryParam{ + OrderPurchaseTimeBegin: utils.Time2Str(fromDate), + OrderPurchaseTimeEnd: utils.Time2Str(toDate), + PageNo: jdapi.AllPage, } if vendorStoreID != "" { - params["deliveryStationNo"] = vendorStoreID + queryParam.DeliveryStationNo = vendorStoreID } - orderList, _, err := api.JdAPI.OrderQuery2(params) + orderList, _, err := api.JdAPI.OrderQuery2(queryParam) if err == nil { vendorOrderIDs = make([]string, len(orderList)) for k, v := range orderList { @@ -442,3 +442,16 @@ func (c *PurchaseHandler) ListOrders(ctx *jxcontext.Context, parentTask tasksch. } return vendorOrderIDs, err } + +func (c *PurchaseHandler) UpdateWaybillTip(ctx *jxcontext.Context, order *model.GoodsOrder, tipFee int64) (err error) { + orderInfo, err := api.JdAPI.QuerySingleOrder2(order.VendorOrderID) + if err == nil { + tip2Add := int(tipFee) - orderInfo.Tips + if tip2Add > 0 { + if globals.EnableJdStoreWrite { + err = api.JdAPI.OrderAddTips(order.VendorOrderID, tip2Add, ctx.GetUserName()) + } + } + } + return err +} diff --git a/business/partner/purchase/mtwm/order.go b/business/partner/purchase/mtwm/order.go index 85a940000..2691b9d29 100644 --- a/business/partner/purchase/mtwm/order.go +++ b/business/partner/purchase/mtwm/order.go @@ -575,3 +575,10 @@ func (c *PurchaseHandler) ListOrders(ctx *jxcontext.Context, parentTask tasksch. } return vendorOrderIDs, err } + +func (c *PurchaseHandler) UpdateWaybillTip(ctx *jxcontext.Context, order *model.GoodsOrder, tipFee int64) (err error) { + if globals.EnableMtwmStoreWrite { + err = api.MtwmAPI.OrderUpdateTip(utils.Str2Int64(order.VendorOrderID), jxutils.IntPrice2Standard(tipFee)) + } + return err +} diff --git a/controllers/cms_store_sku.go b/controllers/cms_store_sku.go index 69c8154ee..16dd14bcd 100644 --- a/controllers/cms_store_sku.go +++ b/controllers/cms_store_sku.go @@ -265,6 +265,7 @@ func (c *StoreSkuController) CopyStoreSkus() { // @Param storeIDs formData string true "门店ID列表" // @Param payload formData string true "json数据,StoreSkuBindSkuInfo对象数组" // @Param isContinueWhenError formData bool false "单个同步失败是否继续,缺省false" +// @Param autoSaleAt formData string false "自动可售时间" // @Param isAsync formData bool false "是否异步操作" // @Success 200 {object} controllers.CallResult // @Failure 200 {object} controllers.CallResult @@ -276,7 +277,11 @@ func (c *StoreSkuController) UpdateStoresSkusSale() { if err = jxutils.Strings2Objs(params.StoreIDs, &storeIDs, params.Payload, &skuBindSkuInfos); err != nil { return retVal, "", err } - retVal, err = cms.UpdateStoresSkusSale(params.Ctx, storeIDs, skuBindSkuInfos, params.Ctx.GetUserName(), params.IsAsync, params.IsContinueWhenError) + timeList, err := jxutils.BatchStr2Time(params.AutoSaleAt) + if err != nil { + return retVal, "", err + } + retVal, err = cms.UpdateStoresSkusSale(params.Ctx, storeIDs, skuBindSkuInfos, timeList[0], params.Ctx.GetUserName(), params.IsAsync, params.IsContinueWhenError) return retVal, "", err }) } diff --git a/controllers/jx_order.go b/controllers/jx_order.go index e64e166f6..af0f6be8f 100644 --- a/controllers/jx_order.go +++ b/controllers/jx_order.go @@ -266,6 +266,7 @@ func (c *OrderController) ExportMTWaybills() { // @Param keyword query string false "查询关键字" // @Param fromDate query string false "开始日期(包含),格式(2006-01-02),如果订单号为空此项必须要求" // @Param toDate query string false "结束日期(包含),格式(2006-01-02),如果订单号为空此项必须要求" +// @Param isDateFinish query bool false "是否fromDate与toDate指的是订单结束日期,缺省不是" // @Param vendorIDs query string false "订单所属厂商列表[1,2,3],缺省不限制" // @Param waybillVendorIDs query string false "承运人所属厂商列表[1,2,3],缺省不限制" // @Param storeIDs query string false "京西门店ID列表[1,2,3],缺省不限制" @@ -279,7 +280,7 @@ func (c *OrderController) ExportMTWaybills() { // @router /GetOrders [get] func (c *OrderController) GetOrders() { c.callGetOrders(func(params *tOrderGetOrdersParams) (retVal interface{}, errCode string, err error) { - retVal, err = orderman.FixedOrderManager.GetOrders(params.Ctx, params.FromDate, params.ToDate, params.MapData, params.Offset, params.PageSize) + retVal, err = orderman.FixedOrderManager.GetOrders(params.Ctx, params.FromDate, params.ToDate, params.IsDateFinish, params.MapData, params.Offset, params.PageSize) return retVal, "", err }) }