diff --git a/business/jxcallback/orderman/order_afs.go b/business/jxcallback/orderman/order_afs.go index 942271fb2..f550d9555 100644 --- a/business/jxcallback/orderman/order_afs.go +++ b/business/jxcallback/orderman/order_afs.go @@ -38,7 +38,7 @@ func (c *OrderManager) OnAfsOrderNew(afsOrder *model.AfsOrder, orderStatus *mode func (c *OrderManager) onAfsOrderNew(afsOrder *model.AfsOrder, orderStatus *model.OrderStatus, isAdjust bool) (err error) { db := dao.GetDB() - // globals.SugarLogger.Debugf("onAfsOrderNew1 afsOrder:%s", utils.Format4Output(afsOrder, true)) + globals.SugarLogger.Debugf("onAfsOrderNew1 orderID:%s", afsOrder.VendorOrderID) c.setAfsOrderID(db, orderStatus) if afsOrder.AfsOrderID == "" { afsOrder.AfsOrderID = orderStatus.VendorOrderID @@ -49,7 +49,7 @@ func (c *OrderManager) onAfsOrderNew(afsOrder *model.AfsOrder, orderStatus *mode if afsOrder.Status == model.OrderStatusUnknown { afsOrder.Status = orderStatus.Status } - // globals.SugarLogger.Debugf("onAfsOrderNew2 afsOrder:%s", utils.Format4Output(afsOrder, true)) + globals.SugarLogger.Debugf("onAfsOrderNew2 orderID:%s", afsOrder.VendorOrderID) dao.Begin(db) defer func() { if r := recover(); r != nil || err != nil { @@ -374,3 +374,44 @@ func composeAfsOrderID(vendorOrderID string, index int) (afsOrderID string) { utils.Int2Str(index), }, "-") } + +func (c *OrderManager) CreateAfsOrderFromOrder(vendorOrderID string, vendorID int) (afsOrder *model.AfsOrder, err error) { + order, err := c.LoadOrder(vendorOrderID, vendorID) + // globals.SugarLogger.Debug(utils.Format4Output(order, false)) + if err == nil { + afsOrder = &model.AfsOrder{ + VendorID: vendorID, + VendorOrderID: vendorOrderID, + JxStoreID: order.JxStoreID, + VendorStoreID: order.VendorStoreID, + StoreID: order.StoreID, + } + } else { + globals.SugarLogger.Warnf("CreateAfsOrderFromOrder, orderID:%s is not found from partner.CurOrderManager.LoadOrder", vendorOrderID) + return nil, err + } + + for _, sku := range order.Skus { + orderSkuFinancial := &model.OrderSkuFinancial{ + VendorID: sku.VendorID, + VendorOrderID: sku.VendorOrderID, + // OrderFinancialID: sku.VendorOrderID, + // ConfirmTime: afsOrder.AfsCreateAt, + VendorStoreID: afsOrder.VendorStoreID, + StoreID: afsOrder.StoreID, + JxStoreID: afsOrder.JxStoreID, + VendorSkuID: sku.VendorSkuID, + SkuID: sku.SkuID, + PromotionType: sku.PromotionType, + Name: sku.SkuName, + ShopPrice: sku.ShopPrice, + SalePrice: sku.SalePrice, + Count: sku.Count, + // UserMoney: sku.UserMoney, + // PmSubsidyMoney: sku.PmSubsidyMoney, + IsAfsOrder: 1, + } + afsOrder.Skus = append(afsOrder.Skus, orderSkuFinancial) + } + return afsOrder, nil +} diff --git a/business/jxcallback/orderman/orderman_ext.go b/business/jxcallback/orderman/orderman_ext.go index aa004da4d..e3ceefd1c 100644 --- a/business/jxcallback/orderman/orderman_ext.go +++ b/business/jxcallback/orderman/orderman_ext.go @@ -227,223 +227,9 @@ func (c *OrderManager) ExportMTWaybills(ctx *jxcontext.Context, fromDateStr, toD return nil, err } -func (c *OrderManager) getOrders(ctx *jxcontext.Context, isIncludeSku, isIncludeFake bool, fromDateStr, toDateStr string, isDateFinish bool, skuIDs []int, isJxFirst 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) - isPurchase, _ := params["isPurchase"].(bool) - userID := "" - if !isPurchase { - if user := ctx.GetFullUser(); user != nil { - userID = user.GetID() - if user.Type&model.UserTypeNonConsumer == 0 { - isPurchase = true - } - } - } - pageSize = jxutils.FormalizePageSize(pageSize) - if offset < 0 { - offset = 0 - } - sql := fmt.Sprintf(` - SELECT SQL_CALC_FOUND_ROWS t1.*, - CAST(IF(t1.earning_price <> 0, t1.earning_price, IF(t1.shop_price <> 0 && t1.shop_price < t1.sale_price, t1.shop_price, t1.sale_price) * IF(t5.pay_percentage > 0, t5.pay_percentage, %d) / 100) AS SIGNED) earning_price, - t2.status waybill_status, t2.courier_name, t2.courier_mobile, - t2.actual_fee, t2.desired_fee, t2.waybill_created_at, t2.waybill_finished_at`, model.DefaultEarningPricePercentage) - if isIncludeSku { - sql += `, - IF(t3.jx_sku_id > 0, t3.jx_sku_id, t3.sku_id) sku_id, - t3.count sku_count2, - t3.shop_price sku_shop_price, - t3.earning_price sku_earning_price, - t3.sale_price sku_sale_price` - } - sql += ` - FROM goods_order t1 - LEFT JOIN waybill t2 ON t1.vendor_waybill_id = t2.vendor_waybill_id AND t1.waybill_vendor_id = t2.waybill_vendor_id - LEFT JOIN store t5 ON t5.id = IF(t1.jx_store_id <> 0, t1.jx_store_id, t1.store_id)` - if isIncludeSku { - sql += ` - JOIN order_sku t3 ON t3.vendor_order_id = t1.vendor_order_id AND t3.vendor_id = t1.vendor_id` - } - var ( - sqlWhere string - sqlParams []interface{} - ) - // 如果搜索关键字可能为订单号,则当成订单号查询 - if params["keyword"] != nil { - if jxutils.GetPossibleVendorIDFromVendorOrderID(params["keyword"].(string)) > model.VendorIDUnknown { - params["vendorOrderID"] = params["keyword"] - } - } - if params["orderID"] != nil || params["vendorOrderID"] != nil { - sqlWhere = " WHERE (t1.vendor_order_id = ? OR t1.vendor_order_id2 = ?)" - vendorOrderID := params["vendorOrderID"] - if vendorOrderID == nil { - vendorOrderID = params["orderID"] - } - sqlParams = []interface{}{ - vendorOrderID, - vendorOrderID, - } - } else { - timeList, err2 := jxutils.BatchStr2Time(fromDateStr, toDateStr) - if err = err2; err != nil { - return nil, 0, err - } - if utils.IsTimeZero(timeList[0]) { - return nil, 0, fmt.Errorf("在没有指定订单号时,必须指定查询日期范围") - } - if utils.IsTimeZero(timeList[1]) { - timeList[1] = timeList[0] - } - timeList[1] = timeList[1].Add(24 * time.Hour) - 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{}{ - timeList[0], - timeList[1], - } - if params["keyword"] != nil { - keyword := params["keyword"].(string) - keywordLike := "%" + keyword + "%" - sqlWhere += ` - AND (t1.store_name LIKE ? OR t1.vendor_order_id LIKE ? OR t1.vendor_order_id2 LIKE ? OR t1.vendor_store_id LIKE ? - OR t1.consignee_name LIKE ? OR t1.consignee_mobile LIKE ? OR t1.consignee_mobile2 LIKE ? OR t1.consignee_address LIKE ? - OR t2.vendor_waybill_id LIKE ? OR t2.courier_name LIKE ? OR t2.courier_mobile LIKE ? - ` - sqlParams = append(sqlParams, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike) - if keywordInt64, err2 := strconv.ParseInt(keyword, 10, 64); err2 == nil { - sqlWhere += " OR t1.store_id = ? OR t1.jx_store_id = ?" - sqlParams = append(sqlParams, keywordInt64, keywordInt64) - } - sqlWhere += ")" - } - if params["waybillVendorIDs"] != nil { - var waybillVendorIDs []int - if err = utils.UnmarshalUseNumber([]byte(params["waybillVendorIDs"].(string)), &waybillVendorIDs); err != nil { - return nil, 0, err - } - if len(waybillVendorIDs) > 0 { - sqlWhere += " AND t1.waybill_vendor_id IN (" + dao.GenQuestionMarks(len(waybillVendorIDs)) + ")" - sqlParams = append(sqlParams, waybillVendorIDs) - } - } - if params["storeIDs"] != nil { - var storeIDs []int - if err = utils.UnmarshalUseNumber([]byte(params["storeIDs"].(string)), &storeIDs); err != nil { - return nil, 0, err - } - if len(storeIDs) > 0 { - if storeIDs[0] == 0 { // 容错 - sqlWhere += " AND 1 = 0" - } else { - sqlWhere += " AND IF(t1.jx_store_id != 0, t1.jx_store_id, t1.store_id) IN (" + dao.GenQuestionMarks(len(storeIDs)) + ")" - sqlParams = append(sqlParams, storeIDs) - } - } - } - if params["statuss"] != nil { - var statuss []int - if err = utils.UnmarshalUseNumber([]byte(params["statuss"].(string)), &statuss); err != nil { - return nil, 0, err - } - if len(statuss) > 0 { - sqlWhere += " AND t1.status IN (" + dao.GenQuestionMarks(len(statuss)) + ")" - sqlParams = append(sqlParams, statuss) - } - } - if params["lockStatuss"] != nil { - var lockStatuss []int - if err = utils.UnmarshalUseNumber([]byte(params["lockStatuss"].(string)), &lockStatuss); err != nil { - return nil, 0, err - } - if len(lockStatuss) > 0 { - sqlWhere += " AND t1.lock_status IN (" + dao.GenQuestionMarks(len(lockStatuss)) + ")" - sqlParams = append(sqlParams, lockStatuss) - } - } - if params["cities"] != nil { - var cities []int - if err = utils.UnmarshalUseNumber([]byte(params["cities"].(string)), &cities); err != nil { - return nil, 0, err - } - if len(cities) > 0 { - sqlWhere += " AND t5.city_code IN (" + dao.GenQuestionMarks(len(cities)) + ") AND t5.id IS NOT NULL" - sqlParams = append(sqlParams, cities) - } - } - if !isIncludeFake { - sqlWhere += " AND (t1.flag & ?) = 0" - sqlParams = append(sqlParams, model.OrderFlagMaskFake) - } - if len(skuIDs) > 0 { - sqlWhere += " AND (SELECT COUNT(*) FROM order_sku t11 WHERE t11.vendor_order_id = t1.vendor_order_id AND t11.vendor_id = t1.vendor_id AND t11.jx_sku_id IN (" + dao.GenQuestionMarks(len(skuIDs)) + ")) > 0" - sqlParams = append(sqlParams, skuIDs) - } - if params["adjustCount"] != nil { - sqlWhere += " AND t1.adjust_count >= ?" - sqlParams = append(sqlParams, params["adjustCount"]) - } - if mustInvoice, ok := params["mustInvoice"].(bool); ok && mustInvoice { - sqlWhere += " AND t1.invoice_taxer_id <> ''" - } - } - if params["vendorIDs"] != nil { - var vendorIDs []int - if err = utils.UnmarshalUseNumber([]byte(params["vendorIDs"].(string)), &vendorIDs); err != nil { - return nil, 0, err - } - if len(vendorIDs) > 0 { - sqlWhere += " AND t1.vendor_id IN (" + dao.GenQuestionMarks(len(vendorIDs)) + ")" - sqlParams = append(sqlParams, vendorIDs) - } - } - if isPurchase { - sqlWhere += " AND t1.user_id = ?" - sqlParams = append(sqlParams, userID) - } - db := dao.GetDB() - sql += sqlWhere - if isIncludeSku { - sql += ` - ORDER BY t1.id` - } else { - if isJxFirst { - sql += ` - ORDER BY IF(t1.status < ?, IF(t1.vendor_id = ?, 0, 1), 0), t1.order_created_at DESC` - sqlParams = append(sqlParams, model.OrderStatusEndBegin, model.VendorIDJX) - } else { - sql += ` - ORDER BY t1.order_created_at DESC` - } - sql += ` - LIMIT ? OFFSET ?` - sqlParams = append(sqlParams, pageSize, offset) - - dao.Begin(db) - defer func() { - if r := recover(); r != nil { - dao.Rollback(db) - panic(r) - } - }() - } - if err = dao.GetRows(db, &orders, sql, sqlParams...); err == nil { - totalCount = dao.GetLastTotalRowCount(db) - } - if !isIncludeSku { - dao.Commit(db) - } - return orders, totalCount, err -} - func (c *OrderManager) GetOrders(ctx *jxcontext.Context, isIncludeFake bool, fromDateStr, toDateStr string, isDateFinish bool, skuIDs []int, isJxFirst 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, isIncludeFake, fromDateStr, toDateStr, isDateFinish, skuIDs, isJxFirst, params, offset, pageSize) + orders, totalCount, err := dao.GetOrders(dao.GetDB(), nil, false, isIncludeFake, fromDateStr, toDateStr, isDateFinish, skuIDs, isJxFirst, "", params, offset, pageSize) if err == nil { pagedInfo = &model.PagedInfo{ TotalCount: totalCount, @@ -456,19 +242,21 @@ func (c *OrderManager) GetOrders(ctx *jxcontext.Context, isIncludeFake bool, fro func (c *OrderManager) ExportOrders(ctx *jxcontext.Context, fromDateStr, toDateStr string, mapParams map[string]interface{}) (hint string, err error) { globals.SugarLogger.Debugf("ExportOrders from:%s to:%s", fromDateStr, toDateStr) var ( - orders, orders2 []*model.GoodsOrderExt - order *model.GoodsOrderExt - afsSkuMap map[string]map[int]*model.OrderSkuFinancial - excelBin []byte + orders []*model.GoodsOrderExt + afsSkuMap map[string]map[int]*model.OrderSkuFinancial + excelBin []byte ) task := tasksch.NewSeqTask("导出订单SKU信息", ctx, func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { switch step { case 0: - orders, _, err = c.getOrders(ctx, true, true, fromDateStr, toDateStr, true, nil, false, mapParams, 0, -1) + orders, _, err = dao.GetOrders(dao.GetDB(), nil, true, true, fromDateStr, toDateStr, true, nil, false, "", mapParams, 0, model.UnlimitedPageSize) + globals.SugarLogger.Debugf("orders:%d, er:%v", len(orders), err) case 1: afsSkuMap, err = c.getAfsOrderSkuInfo4ExportOrders(ctx, fromDateStr, toDateStr) case 2: + var order *model.GoodsOrderExt + var orders2 []*model.GoodsOrderExt for _, v := range orders { if afsInfo := afsSkuMap[jxutils.ComposeUniversalOrderID(v.VendorOrderID, v.VendorID)]; afsInfo != nil { if afsInfo[v.SkuID] != nil && afsInfo[v.SkuID].Count > 0 { @@ -499,10 +287,11 @@ func (c *OrderManager) ExportOrders(ctx *jxcontext.Context, fromDateStr, toDateS } } } + orders = orders2 case 3: excelConf := &excel.Obj2ExcelSheetConfig{ Title: "订单导出", - Data: orders2, + Data: orders, CaptionList: []string{ "vendorOrderID", "vendorOrderID2", @@ -581,9 +370,7 @@ func (c *OrderManager) GetWaybills(ctx *jxcontext.Context, fromDateStr, toDateSt } toDate = toDate.Add(24 * time.Hour) pageSize = jxutils.FormalizePageSize(pageSize) - if offset < 0 { - offset = 0 - } + offset = jxutils.FormalizePageOffset(offset) sql := ` SELECT SQL_CALC_FOUND_ROWS t1.*, t2.store_name, IF(t1.jx_store_id != 0, t1.jx_store_id, t1.store_id) store_id @@ -680,9 +467,7 @@ func (c *OrderManager) GetOrderStatusList(ctx *jxcontext.Context, vendorOrderID func (c *OrderManager) GetOrdersFinancial(ctx *jxcontext.Context, fromDateStr, toDateStr string, params map[string]interface{}, offset, pageSize int) (pagedInfo *model.PagedInfo, err error) { globals.SugarLogger.Debugf("GetOrdersFinancial from:%s to:%s", fromDateStr, toDateStr) pageSize = jxutils.FormalizePageSize(pageSize) - if offset < 0 { - offset = 0 - } + offset = jxutils.FormalizePageOffset(offset) sql := ` SELECT SQL_CALC_FOUND_ROWS t1.*, t2.store_name,t2.vendor_store_id,t2.store_id,t2.jx_store_id,t2.status,t2.order_finished_at @@ -922,9 +707,7 @@ func (c *OrderManager) GetAfsOrders(ctx *jxcontext.Context, keyword, afsOrderID, globals.SugarLogger.Debugf("GetAfsOrders") pageSize = jxutils.FormalizePageSize(pageSize) - if offset < 0 { - offset = 0 - } + offset = jxutils.FormalizePageOffset(offset) sql := ` SELECT SQL_CALC_FOUND_ROWS t1.* @@ -1121,6 +904,10 @@ func (c *OrderManager) AmendMissingOrders(ctx *jxcontext.Context, vendorIDs []in toDate = fromDate } toDate = utils.Time2Date(toDate) + curDate := utils.Time2Date(time.Now()) + if toDate.Sub(curDate) > 0 { + toDate = curDate + } if toDate.Sub(fromDate) > 7*24*time.Hour { return "", fmt.Errorf("最多一次一周,请调整时间") } diff --git a/business/jxcallback/scheduler/defsch/defsch.go b/business/jxcallback/scheduler/defsch/defsch.go index 7f06ad3fe..45487d5c2 100644 --- a/business/jxcallback/scheduler/defsch/defsch.go +++ b/business/jxcallback/scheduler/defsch/defsch.go @@ -35,6 +35,9 @@ const ( second2AutoPickupGap = 60 //随机60秒 time2AutoPickupAhead = 20 * time.Second // 有最后拣货时间的提前值 + switch2SelfDeliverRetryGap = 3 * time.Second // 转自送失败尝试的时间间隙 + switch2SelfDeliverRetryCount = 2 // 转自送失败尝试次数 + // (把pending order timerout 在-pendingOrderTimerMinMinSecond至pendingOrderTimerMaxSecond映射到pendingOrderTimerMinSecond至pendingOrderTimerMaxSecond) pendingOrderTimerMinMinSecond = 5 * 60 // 5分钟 pendingOrderTimerMinSecond = 2 @@ -296,18 +299,21 @@ func init() { ShouldSetTimer: func(savedOrderInfo *WatchOrderInfo, bill *model.Waybill) bool { // 饿百转自送的时机不太清楚,暂时禁用超时转自送,在饿百运单取消时还是会自动创建 // 非自配送商家使用 - return savedOrderInfo.isDeliveryCompetition && - model.IsOrderDeliveryByPlatform(savedOrderInfo.order) && - savedOrderInfo.order.VendorID == bill.WaybillVendorID && - savedOrderInfo.order.VendorID != model.VendorIDEBAI && - savedOrderInfo.order.DeliveryType != model.OrderDeliveryTypeSelfTake + order := savedOrderInfo.order + return order.VendorID != model.VendorIDEBAI && + order.VendorID == bill.WaybillVendorID && + savedOrderInfo.isDeliveryCompetition && + model.IsOrderDeliveryByPlatform(order) && + order.DeliveryType != model.OrderDeliveryTypeSelfTake && + isOrderCanSwitch2SelfDeliver(order) && + (order.Status >= model.OrderStatusFinishedPickup && order.Status < model.OrderStatusEndBegin) }, }, //* model.WaybillStatusCanceled: &StatusActionConfig{ StatusActionParams: partner.StatusActionParams{ TimerType: partner.TimerTypeBaseNow, - Timeout: 5 * time.Second, + Timeout: 1 * time.Second, }, TimeoutAction: func(savedOrderInfo *WatchOrderInfo, bill *model.Waybill) (err error) { return sch.createWaybillOn3rdProviders(savedOrderInfo, ebaiCancelWaybillMaxFee, nil) @@ -315,12 +321,13 @@ func init() { ShouldSetTimer: func(savedOrderInfo *WatchOrderInfo, bill *model.Waybill) bool { order := savedOrderInfo.order // 非自配送商家使用 - return (order.Status >= model.OrderStatusFinishedPickup && order.Status < model.OrderStatusEndBegin) && + return order.VendorID == model.VendorIDEBAI && + order.VendorID == bill.WaybillVendorID && savedOrderInfo.isDeliveryCompetition && - savedOrderInfo.order.VendorID == bill.WaybillVendorID && - model.IsOrderDeliveryByPlatform(savedOrderInfo.order) && - order.VendorID == model.VendorIDEBAI && - savedOrderInfo.order.DeliveryType != model.OrderDeliveryTypeSelfTake + model.IsOrderDeliveryByPlatform(order) && + order.DeliveryType != model.OrderDeliveryTypeSelfTake && + isOrderCanSwitch2SelfDeliver(order) && + (order.Status >= model.OrderStatusFinishedPickup && order.Status < model.OrderStatusEndBegin) }, }, //*/ @@ -511,7 +518,7 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo } s.notify3rdPartyWaybill(order, bill, isBillAlreadyCandidate) } else { - s.swtich2SelfDeliverWithRetry(savedOrderInfo, bill, 2, 10*time.Second) + s.swtich2SelfDeliverWithRetry(savedOrderInfo, bill, switch2SelfDeliverRetryCount, switch2SelfDeliverRetryGap) } } } else if !s.isBillCandidate(order, bill) && bill.WaybillVendorID != order.VendorID { @@ -1276,3 +1283,11 @@ func (s *DefScheduler) notify3rdPartyWaybill(order *model.GoodsOrder, bill *mode }) } } + +func isOrderCanSwitch2SelfDeliver(order *model.GoodsOrder) (isCan bool) { + isCan = true + if handler := partner.GetPurchaseOrderHandlerFromVendorID(order.VendorID); handler != nil { + isCan, _ = handler.CanSwitch2SelfDeliver(order) + } + return isCan +} diff --git a/business/jxstore/act/act.go b/business/jxstore/act/act.go index a370b7c00..0b1d54a1e 100644 --- a/business/jxstore/act/act.go +++ b/business/jxstore/act/act.go @@ -952,32 +952,36 @@ func ForceUpdateVendorPrice(ctx *jxcontext.Context, vendorID int, actType int, s } storeSkuBind.DeletedAt = utils.DefaultTimeValue if err = dao.GetEntity(db, storeSkuBind, model.FieldStoreID, model.FieldSkuID, model.FieldDeletedAt); err == nil { - if v.VendorPrice != 0 { - if err2 := checkDiscountValidation(actType, float64(v.ActualActPrice)*100/float64(v.VendorPrice)); err2 != nil { + vendorPrice := int(v.VendorPrice) + if vendorPrice != 0 { + if err2 := checkDiscountValidation(actType, float64(v.ActPrice)*100/float64(v.VendorPrice)); err2 != nil { v.ErrMsg = err2.Error() + v.ActualActPrice = v.ActPrice wrongSkuList = append(wrongSkuList, v) storeSkuBind = nil } } else { - vendorPrice := dao.GetStoreSkuBindVendorPrice(storeSkuBind, vendorID) - if checkDiscountValidation(actType, float64(v.ActualActPrice)*100/float64(vendorPrice)) != nil { + vendorPrice = dao.GetStoreSkuBindVendorPrice(storeSkuBind, vendorID) + if checkDiscountValidation(actType, float64(v.ActPrice)*100/float64(vendorPrice)) != nil { if actType == model.ActSkuSecKill { - vendorPrice = int(v.ActualActPrice)*100/maxDiscount4SkuSecKill + 10 + vendorPrice = int(v.ActPrice)*100/maxDiscount4SkuSecKill + 10 } else if actType == model.ActSkuDirectDown { - vendorPrice = int(v.ActualActPrice) + 10 + vendorPrice = int(v.ActPrice) + 10 } - dao.SetStoreSkuBindVendorPrice(storeSkuBind, vendorID, vendorPrice) - if vendorID != model.VendorIDJX { - dao.SetStoreSkuBindSyncStatus(storeSkuBind, vendorID, dao.GetStoreSkuBindSyncStatus(storeSkuBind, vendorID)|model.SyncFlagPriceMask) - } - storeSkuBind.LastOperator = ctx.GetUserName() + } else { + storeSkuBind = nil } } if storeSkuBind != nil { + dao.SetStoreSkuBindVendorPrice(storeSkuBind, vendorID, vendorPrice) + if vendorID != model.VendorIDJX { + dao.SetStoreSkuBindSyncStatus(storeSkuBind, vendorID, dao.GetStoreSkuBindSyncStatus(storeSkuBind, vendorID)|model.SyncFlagPriceMask) + } + storeSkuBind.LastOperator = ctx.GetUserName() storeSkuBindList = append(storeSkuBindList, storeSkuBind) } } else { - errList.AddErr(err) + errList.AddErr(fmt.Errorf("获取门店:%d商品:%d出错:%s", v.StoreID, v.SkuID, err)) } } if err = errList.GetErrListAsOne(); err != nil { diff --git a/business/jxstore/act/act_test.go b/business/jxstore/act/act_test.go index 47c393cf9..dd76e8cf3 100644 --- a/business/jxstore/act/act_test.go +++ b/business/jxstore/act/act_test.go @@ -192,16 +192,18 @@ func TestSyncAct(t *testing.T) { } func TestForceUpdateVendorPrice(t *testing.T) { - _, err := ForceUpdateVendorPrice(jxcontext.AdminCtx, model.VendorIDJD, model.ActSkuDirectDown, []*ActStoreSkuParam{ + hint, err := ForceUpdateVendorPrice(jxcontext.AdminCtx, model.VendorIDJD, model.ActSkuDirectDown, []*ActStoreSkuParam{ &ActStoreSkuParam{ ActStoreSku: model.ActStoreSku{ - StoreID: 100118, - SkuID: 22509, + StoreID: 100118, + SkuID: 22509, + ActPrice: 9900, }, - ActualActPrice: 9900, + VendorPrice: 19900, }, }, false) if err != nil { t.Fatal(err) } + t.Log(hint) } diff --git a/business/jxstore/cms/store.go b/business/jxstore/cms/store.go index 9ede205ee..fe5dd272f 100644 --- a/business/jxstore/cms/store.go +++ b/business/jxstore/cms/store.go @@ -1207,9 +1207,7 @@ func TmpGetJxBadCommentsByStoreId(ctx *jxcontext.Context, keyword string, storeI } sql += " ORDER BY t1.createtime DESC" pageSize = jxutils.FormalizePageSize(pageSize) - if offset < 0 { - offset = 0 - } + offset = jxutils.FormalizePageOffset(offset) sql += " LIMIT ? OFFSET ?" sqlParams = append(sqlParams, pageSize, offset) var commentList []*JxBadCommentsExt diff --git a/business/jxstore/cms/store_sku.go b/business/jxstore/cms/store_sku.go index de46a02a4..32202afb3 100644 --- a/business/jxstore/cms/store_sku.go +++ b/business/jxstore/cms/store_sku.go @@ -193,7 +193,7 @@ func GetStoreSkus(ctx *jxcontext.Context, storeID int, skuIDs []int, isFocus boo return GetStoresSkus(ctx, []int{storeID}, skuIDs, isFocus, keyword, isBySku, isAct, params, offset, pageSize) } -func getGetStoresSkusBaseSQL(db *dao.DaoDB, storeIDs, skuIDs []int, isFocus bool, keyword string, isBySku, isAct bool, params map[string]interface{}) (sql string, sqlParams []interface{}, err error) { +func getGetStoresSkusBaseSQL(db *dao.DaoDB, storeIDs, skuIDs []int, isFocus bool, keyword string, isBySku, isAct bool, actVendorID int, params map[string]interface{}) (sql string, sqlParams []interface{}, err error) { sql = ` FROM sku_name t1 JOIN sku t2 FORCE INDEX(PRIMARY) ON t1.id = t2.name_id AND t2.deleted_at = ?/* AND t2.status = ?*/ @@ -227,6 +227,10 @@ func getGetStoresSkusBaseSQL(db *dao.DaoDB, storeIDs, skuIDs []int, isFocus bool time.Now(), time.Now(), }) + if actVendorID >= 0 { + sql += " AND t1.vendor_mask & ? <> 0" + sqlParams = append(sqlParams, model.GetVendorMask(actVendorID)) + } if len(storeIDs) > 0 { sql += " AND t2.store_id IN (" + dao.GenQuestionMarks(len(storeIDs)) + ")" sqlParams = append(sqlParams, storeIDs) @@ -380,8 +384,12 @@ func GetStoresSkusNew(ctx *jxcontext.Context, storeIDs, skuIDs []int, isFocus bo if len(storeIDs) == 0 && len(skuIDs) == 0 && pageSize == -1 { return nil, fmt.Errorf("GetStoresSkus必须指定storeIDs或skuIDs或分页") } + actVendorID := -1 + if params["actVendorID"] != nil { + actVendorID = int(utils.Interface2Int64WithDefault(params["actVendorID"], -1)) + } db := dao.GetDB() - sql, sqlParams, err := getGetStoresSkusBaseSQL(db, storeIDs, skuIDs, isFocus, keyword, isBySku, isAct, params) + sql, sqlParams, err := getGetStoresSkusBaseSQL(db, storeIDs, skuIDs, isFocus, keyword, isBySku, isAct, actVendorID, params) if err != nil { return nil, err } @@ -499,10 +507,6 @@ func GetStoresSkusNew(ctx *jxcontext.Context, storeIDs, skuIDs []int, isFocus bo if true { //!(offset == 0 && pageSize == model.UnlimitedPageSize) { storeIDs, skuIDs = GetStoreAndSkuIDsFromInfo(skuNamesInfo) } - actVendorID := -1 - if params["actVendorID"] != nil { - actVendorID = int(utils.Interface2Int64WithDefault(params["actVendorID"], -1)) - } beginTime := time.Now() err = updateActPrice4StoreSkuNameNew(db, storeIDs, skuIDs, skuNamesInfo, actVendorID) globals.SugarLogger.Debugf("GetStoresSkusNew updateActPrice4StoreSkuName:%v", time.Now().Sub(beginTime)) diff --git a/business/jxstore/cms/user2.go b/business/jxstore/cms/user2.go index 4f54b5b91..1eb096103 100644 --- a/business/jxstore/cms/user2.go +++ b/business/jxstore/cms/user2.go @@ -11,6 +11,7 @@ import ( "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/auth2" "git.rosy.net.cn/jx-callback/business/auth2/authprovider/dingding" + "git.rosy.net.cn/jx-callback/business/auth2/authprovider/weixin" "git.rosy.net.cn/jx-callback/business/authz" "git.rosy.net.cn/jx-callback/business/authz/autils" "git.rosy.net.cn/jx-callback/business/jxutils" @@ -201,7 +202,7 @@ func HandleOrder4Consignee(order *model.GoodsOrder) (err error) { if mobileNumber == "" && order.VendorUserID == "" { return fmt.Errorf("订单:%s手机号与平台用户标识都是空", order.VendorOrderID) } - authType := jxutils.GetAuthType4Vendor(order.VendorID) + authType := dao.GetAuthType4Vendor(order.VendorID) if authType == "" { msg := fmt.Sprintf("平台ID:%d当前不被支持,请联系开发", order.VendorID) globals.SugarLogger.Warn(msg) @@ -470,7 +471,7 @@ func AddRoles4User(ctx *jxcontext.Context, userID string, rList []*authz.RoleInf if err = api2.RoleMan.AddRole4User(userID, v); err != nil { errList.AddErr(err) } else if v.StoreID > 0 { - jxutils.HandleUserWXRemark(dao.GetDB(), userID, true) + HandleUserWXRemark(dao.GetDB(), userID, true) } } else { errList.AddErr(err) @@ -485,7 +486,7 @@ func DeleteRoles4User(ctx *jxcontext.Context, userID string, rList []*authz.Role if err = api2.RoleMan.DeleteRole4User(userID, v); err != nil { errList.AddErr(err) } else if v.StoreID > 0 { - jxutils.HandleUserWXRemark(dao.GetDB(), userID, true) + HandleUserWXRemark(dao.GetDB(), userID, true) } } return errList.GetErrListAsOne() @@ -504,7 +505,7 @@ func AddUsers4Role(ctx *jxcontext.Context, r *authz.RoleInfo, userIDList []strin if err = api2.RoleMan.AddRole4User(v, r); err != nil { errList.AddErr(err) } else if r.StoreID > 0 { - jxutils.HandleUserWXRemark(dao.GetDB(), v, true) + HandleUserWXRemark(dao.GetDB(), v, true) } } return errList.GetErrListAsOne() @@ -516,7 +517,7 @@ func DeleteUsers4Role(ctx *jxcontext.Context, r *authz.RoleInfo, userIDList []st if err = api2.RoleMan.DeleteRole4User(v, r); err != nil { errList.AddErr(err) } else if r.StoreID > 0 { - jxutils.HandleUserWXRemark(dao.GetDB(), v, true) + HandleUserWXRemark(dao.GetDB(), v, true) } } return errList.GetErrListAsOne() @@ -713,3 +714,66 @@ func GetSelfInfo(ctx *jxcontext.Context) (user *model.User, err error) { } return user, err } + +func HandleUserWXRemark(db *dao.DaoDB, mobile string, mobileIsUerID bool) (err error) { + if db == nil { + db = dao.GetDB() + } + openIDs := []string{} + storeID := 0 + remark := "" + + // if !globals.DisableWXAuth1 { + // wxinfo, err := dao.GetUserStoreInfo(db, "tel", mobile) + // if err == nil { + // openIDs = []string{wxinfo.OpenID} + // storeID = wxinfo.JxStoreID + // } + // } + if globals.EnableWXAuth2 { + userID := "" + if mobileIsUerID { + userID = mobile + } else { + userList, _, err2 := dao.GetUsers(db, model.UserTypeStoreBoss, "", nil, "", mobile, 0, -1) + if err = err2; len(userList) > 0 { + userID = userList[0].GetID() + } + } + if userID != "" { + authBindList, err2 := dao.GetUserBindAuthInfo(db, userID, model.AuthBindTypeAuth, []string{weixin.AuthTypeMP}, "", "") + if err = err2; err == nil { + for _, v := range authBindList { + openIDs = append(openIDs, v.AuthID) + } + } + roleList, err2 := api2.RoleMan.GetUserRoleList(userID) + if err = err2; err == nil && len(roleList) > 0 { + storeID = roleList[0].StoreID + } + } + } + + if len(openIDs) > 0 { + if storeID > 0 { + store := &model.Store{} + store.ID = storeID + if err = dao.GetEntity(db, store); err == nil { + city := &model.Place{ + Code: store.CityCode, + } + if err = dao.GetEntity(db, city, "Code"); err == nil { + remark = city.Name + "-" + store.Name + } + } + } + if err == nil { + if globals.EnableStoreWrite { + for _, openID := range openIDs { + err = api.WeixinAPI.CBUpdateRemark(openID, remark) + } + } + } + } + return err +} diff --git a/business/jxstore/misc/misc.go b/business/jxstore/misc/misc.go index d5ecebe95..db7f4a550 100644 --- a/business/jxstore/misc/misc.go +++ b/business/jxstore/misc/misc.go @@ -7,6 +7,7 @@ import ( "time" "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/jxcallback/orderman" "git.rosy.net.cn/jx-callback/business/jxstore/act" "git.rosy.net.cn/jx-callback/business/jxstore/cms" "git.rosy.net.cn/jx-callback/business/jxutils" @@ -122,6 +123,9 @@ func Init() { }, updateActStatusTimeList) ScheduleScoreStore() ScheduleCheckStoreAlert() + ScheduleTimerFunc("ChangeStoreSkuSaleStatus", func() { + cms.CurVendorSync.ChangeStoreSkuSaleStatus(jxcontext.AdminCtx, 0, true, true) + }, ChangeStoreSkuSaleStatusList) } ScheduleTimerFunc("AutoSaleStoreSku", func() { cms.AutoSaleStoreSku(jxcontext.AdminCtx, nil, false) @@ -134,11 +138,6 @@ func Init() { "04:05:06", }) } - if beego.BConfig.RunMode == "alpha" { - ScheduleTimerFunc("ChangeStoreSkuSaleStatus", func() { - cms.CurVendorSync.ChangeStoreSkuSaleStatus(jxcontext.AdminCtx, 0, true, true) - }, ChangeStoreSkuSaleStatusList) - } } func doDailyWork() { @@ -157,6 +156,10 @@ func doDailyWork() { SaveImportantTaskID(TaskNameSyncStoreSku, taskID) InitEx() + + // 每天补全前一天与当天的订单 + curDate := utils.Time2Date(time.Now()) + orderman.FixedOrderManager.AmendMissingOrders(jxcontext.AdminCtx, nil, 0, curDate.Add(-24*time.Hour), curDate, true, true) } func RefreshRealMobile(ctx *jxcontext.Context, vendorID int, fromTime, toTime time.Time, isAsync, isContinueWhenError bool) (hint string, err error) { diff --git a/business/jxstore/tempop/tempop.go b/business/jxstore/tempop/tempop.go index 8005bb8bb..7282cd430 100644 --- a/business/jxstore/tempop/tempop.go +++ b/business/jxstore/tempop/tempop.go @@ -11,6 +11,7 @@ import ( "mime/multipart" "net/http" "regexp" + "sort" "strings" "sync" "time" @@ -49,6 +50,7 @@ var ( titleList = []string{ "用户名", "关联门店", + "状态", } ) @@ -60,6 +62,7 @@ type GetJdUsersStruct struct { type JdUserStruct struct { UserName string `json:"用户名"` StoreIDs string `json:"关联门店"` + Status string `json:"状态"` } func init() { @@ -954,7 +957,7 @@ func UpdateAllWeiXinRemark(ctx *jxcontext.Context, isAsync, isContinueWhenError rootTask := tasksch.NewParallelTask("刷新微信备注", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { tel := batchItemList[0].(string) - err = jxutils.HandleUserWXRemark(dao.GetDB(), tel, false) + err = cms.HandleUserWXRemark(dao.GetDB(), tel, false) return nil, err }, mobileList) tasksch.ManageTask(rootTask).Run() @@ -1470,18 +1473,32 @@ func ExecuteFileName(filename string) (name string) { func GetJdUsers(ctx *jxcontext.Context, isAsync, isContinueWhenError bool) (hint string, err error) { var ( jxVendorIDsMap = make(map[string]string) + pageNoList []int + storeUserList []interface{} ) - //获取京东有效的店 db := dao.GetDB() + //获取京东商城所有用户 + _, _, toatlPage, _ := api.JdAPI.PrivilegeSearchUser(1) + for i := 1; i <= toatlPage; i++ { + pageNoList = append(pageNoList, i) + } storeMapList, err := dao.GetStoreMapsListWithoutDisabled(db, []int{model.VendorIDJD}, model.StoreStatusDisabled) for _, v := range storeMapList { - jxVendorIDsMap[v.VendorStoreID] = v.VendorStoreID + jxVendorIDsMap[v.VendorStoreID] = utils.Int64ToStr(int64(v.StoreID)) } - //获取京东商城所有用户 - storeUserList, err := api.JdAPI.PrivilegeSearchUserAll() taskSeqFunc := func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { switch step { case 0: + taskFunc1 := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + pageNo := batchItemList[0].(int) + storeUserLists, _, _, err := api.JdAPI.PrivilegeSearchUser(pageNo) + retVal = storeUserLists + return retVal, err + } + taskParallel1 := tasksch.NewParallelTask("获取京东商城所有用户列表", tasksch.NewParallelConfig(), ctx, taskFunc1, pageNoList) + tasksch.HandleTask(taskParallel1, task, true).Run() + storeUserList, err = taskParallel1.GetResult(0) + case 1: taskFunc := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { vv := batchItemList[0].(*jdapi.StoreUserInfo) vendorStoreIDs, err := api.JdAPI.GetJdUserBindStoreIDs(vv.ID) @@ -1491,30 +1508,35 @@ func GetJdUsers(ctx *jxcontext.Context, isAsync, isContinueWhenError bool) (hint if jxVendorIDsMap[v] == "" { continue } - vendorStoreIDsMap[v] = v + vendorStoreIDsMap[v] = jxVendorIDsMap[v] } if len(vendorStoreIDsMap) == 0 { - jdStruct := JdUserStruct{vv.LoginName, ""} + if vv.LoginName == "jd_jxcs1223" || vv.LoginName == "jd_jxgy" { + jdStruct := JdUserStruct{vv.LoginName, "管理员", vv.LockStatus} + jdUsersStruct.AppendData(jdStruct) + } + jdStruct := JdUserStruct{vv.LoginName, "", vv.LockStatus} jdUsersStruct.AppendData(jdStruct) } else { for _, m := range vendorStoreIDsMap { vendorStoreIDsResult = append(vendorStoreIDsResult, m) } - jdStruct := JdUserStruct{vv.LoginName, strings.Join(vendorStoreIDsResult, ",")} + sort.Strings(vendorStoreIDsResult[:]) + jdStruct := JdUserStruct{vv.LoginName, strings.Join(vendorStoreIDsResult, ","), vv.LockStatus} jdUsersStruct.AppendData(jdStruct) } return retVal, err } - taskParallel := tasksch.NewParallelTask("获取京东商城用户列表", tasksch.NewParallelConfig(), ctx, taskFunc, storeUserList) + taskParallel := tasksch.NewParallelTask("获取京东商城用户关联门店列表", tasksch.NewParallelConfig(), ctx, taskFunc, storeUserList) tasksch.HandleTask(taskParallel, task, true).Run() _, err = taskParallel.GetResult(0) - case 1: + case 2: //写excel WriteToExcel(task, jdUsersStruct.userMap) } return result, err } - taskSeq := tasksch.NewSeqTask2("获取京东商城用户列表-序列任务", ctx, isContinueWhenError, taskSeqFunc, 2) + taskSeq := tasksch.NewSeqTask2("获取京东商城用户关联门店列表-序列任务", ctx, isContinueWhenError, taskSeqFunc, 3) tasksch.HandleTask(taskSeq, nil, true).Run() if !isAsync { _, err = taskSeq.GetResult(0) diff --git a/business/jxstore/yonghui/yonghui.go b/business/jxstore/yonghui/yonghui.go index aab686d96..73ec9e8ee 100644 --- a/business/jxstore/yonghui/yonghui.go +++ b/business/jxstore/yonghui/yonghui.go @@ -133,7 +133,7 @@ var ( SkuRow: 1, }, "净配": &SheetParam{ SkuIDCol: 0, - SkuPriceCol: 12, + SkuPriceCol: 14, SkuNameCol: 1, OrgSkuIdCol: 4, OrgSkuPriceCol: 7, @@ -237,14 +237,15 @@ func LoadExcelByYongHui(ctx *jxcontext.Context, files []*multipart.FileHeader, i func LoadExcelBinByYongHui(ctx *jxcontext.Context, reader io.Reader, isAsync, isContinueWhenError bool) (hint string, err error) { var ( skuMap = make(map[string]*ExcelParam) - errMsg string costPrice float64 //成本价 goodsList []*weimobapi.GoodsInfo goodsIDListForPutAway []interface{} isCompare bool + isExecute = false ) db := dao.GetDB() taskSeqFunc := func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { + var errMsg string switch step { case 0: //读取excel文件 @@ -256,22 +257,20 @@ func LoadExcelBinByYongHui(ctx *jxcontext.Context, reader io.Reader, isAsync, is sheetParam := sheetMap[k] rows, _ := xlsx.GetRows(k) for rowNum, row := range rows { - if rowNum < sheetParam.SkuRow { - continue - } - GetCellIntoMap(sheetParam, skuMap, row, k, rowNum) - if len(skuMap) < 1 { - errMsg += fmt.Sprintf("读取Excel数据失败,Excel格式排版可能发生了变化!sheetName: [%v]\n", k) - } - } - if errMsg != "" { - return "", errors.New(errMsg) + errMsg += GetCellIntoMap(sheetParam, skuMap, row, k, rowNum) } } //修改分组名 // 分类名格式为:可定XX日 // XX为上传永辉 提供的 价格表时间 +2天 - isCompare, err = UpdateClassifyAndGetLastClassify() + if errMsg == "" { + isExecute = true + } else { + return "", fmt.Errorf(errMsg) + } + if isExecute { + isCompare, err = UpdateClassifyAndGetLastClassify() + } case 1: //获取微盟所有商品 param := &weimobapi.QueryGoodsListParam{ @@ -305,7 +304,6 @@ func LoadExcelBinByYongHui(ctx *jxcontext.Context, reader io.Reader, isAsync, is Comment: "在微盟上未找到该商品", } dataFailed.AppendData2(outPutData) - // errMsg += fmt.Sprintf("在微盟上未找到该商品xxx", xxx) } } case 2: @@ -326,7 +324,6 @@ func LoadExcelBinByYongHui(ctx *jxcontext.Context, reader io.Reader, isAsync, is Comment: "在京西库中未找到该商品", } dataFailed.AppendData2(outPutData) - // return "", errors.New(fmt.Sprintf("在京西库中未找到该商品!name_id : [%v]\n", goodsDetail.SkuMap.SingleSku.OuterSkuCode)) } else { if skuList[0].Unit == "份" { if goodsDetail.SkuMap.SingleSku.B2CSku.Weight == 0 { @@ -337,7 +334,9 @@ func LoadExcelBinByYongHui(ctx *jxcontext.Context, reader io.Reader, isAsync, is } else { costPrice = skuMap[spuCode].Price } - _, _, _ = updateWeiMobGoods(costPrice, skuMap[spuCode].Price, skuList[0].Unit, isCompare, goodsDetail) + if isExecute { + _, _, _ = updateWeiMobGoods(costPrice, skuMap[spuCode].Price, skuList[0].Unit, isCompare, goodsDetail) + } } } else { //下架微盟商品 @@ -360,7 +359,9 @@ func LoadExcelBinByYongHui(ctx *jxcontext.Context, reader io.Reader, isAsync, is for _, v := range batchItemList { int64Slice = append(int64Slice, v.(int64)) } - PutAwayWeiMobSku(int64Slice) + if isExecute { + PutAwayWeiMobSku(int64Slice) + } return retVal, err } taskParallel4 := tasksch.NewParallelTask("下架微盟商品", tasksch.NewParallelConfig().SetParallelCount(parallelCount).SetBatchSize(UpdateGoodsShelfStatusCount), ctx, taskFunc4, goodsIDListForPutAway) @@ -369,9 +370,7 @@ func LoadExcelBinByYongHui(ctx *jxcontext.Context, reader io.Reader, isAsync, is case 4: WriteToExcel(task, dataSuccess.dataSuccessList, dataFailed.dataFailedList) } - // if errMsg != "" { - // return result, errors.New(errMsg) - // } + return result, err } taskSeq := tasksch.NewSeqTask2("读取永辉Excel文件修改微盟商品价格可售状态-序列任务", ctx, isContinueWhenError, taskSeqFunc, 5) @@ -403,17 +402,6 @@ func GetGoodsInfoAndDetailMap(goodsList []*weimobapi.GoodsInfo) (goodsMap map[st return goodsMap } -// func getSelectedClassifyLeafList(l []weimobapi.SelectedClassifyList) (list []int64) { -// for _, v := range l { -// if v.ChildrenClassify == nil { -// list = append(list, v.ClassifyID) -// } else { -// subList := getSelectedClassifyLeafList(v.ChildrenClassify) -// } -// } -// return list -// } - func updateWeiMobGoods(costPrice, salePrice float64, unit string, isCompare bool, goodsDetail *weimobapi.GoodsDetailInfo) (goodsID int64, skuMap map[string]int64, err error) { var ( categoryList []*weimobapi.CategoryList @@ -579,7 +567,7 @@ func IsChineseChar(str string) bool { return false } -func GetCellIntoMap(sheetParam *SheetParam, skuMap map[string]*ExcelParam, row []string, sheetName string, rowNum int) { +func GetCellIntoMap(sheetParam *SheetParam, skuMap map[string]*ExcelParam, row []string, sheetName string, rowNum int) (errMsg string) { var ( skuID string orgSkuID string @@ -596,19 +584,27 @@ func GetCellIntoMap(sheetParam *SheetParam, skuMap map[string]*ExcelParam, row [ ) for k, cell := range row { if cell != "" { - if !IsChineseChar(cell) { - if k == skuIDCol && skuIDCol >= 0 { - skuID = cell + if k == skuIDCol && skuIDCol >= 0 { + skuID = cell + } + if k == skuPriceCol && skuPriceCol >= 0 { + if rowNum == sheetParam.SkuRow-1 { + if !strings.Contains(cell, "今日供价") && !strings.Contains(cell, "单价") { + errMsg += fmt.Sprintf("sheet页:[%v],Excel排版发生变化!第[%v]列今日供价附近可能增加或减少了一列,请确认!", sheetName, k+1) + } } - if k == skuPriceCol && skuPriceCol >= 0 { - skuPrice = Float64Round(utils.Str2Float64WithDefault(cell, 0)) - } - if k == orgSkuIDCol && orgSkuIDCol >= 0 { - orgSkuID = "0" + cell - } - if k == orgSkuPriceCol && orgSkuPriceCol >= 0 { - orgSkuPrice = Float64Round(utils.Str2Float64WithDefault(cell, 0)) + skuPrice = Float64Round(utils.Str2Float64WithDefault(cell, 0)) + } + if k == orgSkuIDCol && orgSkuIDCol >= 0 { + orgSkuID = "0" + cell + } + if k == orgSkuPriceCol && orgSkuPriceCol >= 0 { + if rowNum == sheetParam.SkuRow-1 { + if !strings.Contains(cell, "进价") { + errMsg += fmt.Sprintf("sheet页:[%v],Excel排版发生变化!第[%v]列进价附近可能增加或减少了一列,请确认!", sheetName, k+1) + } } + orgSkuPrice = Float64Round(utils.Str2Float64WithDefault(cell, 0)) } if k == skuNameCol && skuNameCol >= 0 { skuName = cell @@ -618,34 +614,50 @@ func GetCellIntoMap(sheetParam *SheetParam, skuMap map[string]*ExcelParam, row [ } } } - if len(skuMap) > 0 { - if skuMap[skuID] != nil { - if skuMap[skuID].Price != 0 && skuMap[skuID].Price != skuPrice && skuPrice != 0 { - if skuPrice > skuMap[skuID].Price { + if rowNum >= sheetParam.SkuRow { + if rowNum == sheetParam.SkuRow { + if IsChineseChar(skuID) { + if IsChineseChar(skuID) { + errMsg += fmt.Sprintf("sheet页:[%v],Excel排版发生变化!第[%v]行附近可能增加了一行,请确认!", sheetName, rowNum) + } + } + } + if len(skuMap) > 0 { + if skuMap[skuID] != nil { + if skuMap[skuID].Price != 0 && skuMap[skuID].Price != skuPrice && skuPrice != 0 { + if skuPrice > skuMap[skuID].Price { + BuildSkuMap(skuID, skuName, skuPrice, skuMap) + } + } else { BuildSkuMap(skuID, skuName, skuPrice, skuMap) } - } else { + } else if skuPrice != 0 { BuildSkuMap(skuID, skuName, skuPrice, skuMap) } - } else if skuPrice != 0 { - BuildSkuMap(skuID, skuName, skuPrice, skuMap) - } - if skuMap[orgSkuID] != nil { - if skuMap[orgSkuID].Price != 0 && skuMap[orgSkuID].Price != orgSkuPrice && orgSkuPrice != 0 { - if orgSkuPrice > skuMap[orgSkuID].Price { + if skuMap[orgSkuID] != nil { + if skuMap[orgSkuID].Price != 0 && skuMap[orgSkuID].Price != orgSkuPrice && orgSkuPrice != 0 { + if orgSkuPrice > skuMap[orgSkuID].Price { + BuildSkuMap(orgSkuID, orgSkuName, orgSkuPrice, skuMap) + } + } else if orgSkuPriceCol >= 0 && orgSkuIDCol >= 0 && orgSkuNameCol >= 0 { BuildSkuMap(orgSkuID, orgSkuName, orgSkuPrice, skuMap) } - } else if orgSkuPriceCol >= 0 && orgSkuIDCol >= 0 && orgSkuNameCol >= 0 { + } else if orgSkuPrice != 0 { BuildSkuMap(orgSkuID, orgSkuName, orgSkuPrice, skuMap) } - } else if orgSkuPrice != 0 { + } else { + BuildSkuMap(skuID, skuName, skuPrice, skuMap) BuildSkuMap(orgSkuID, orgSkuName, orgSkuPrice, skuMap) } + delete(skuMap, "") } else { - BuildSkuMap(skuID, skuName, skuPrice, skuMap) - BuildSkuMap(orgSkuID, orgSkuName, orgSkuPrice, skuMap) + for i := rowNum; i < sheetParam.SkuRow; i++ { + if !IsChineseChar(skuID) { + errMsg += fmt.Sprintf("sheet页:[%v],Excel排版发生变化!第[%v]行附近可能减少了一行,请确认!", sheetName, rowNum) + } + } } - delete(skuMap, "") + return errMsg } func BuildSkuMap(id, name string, price float64, skuMap map[string]*ExcelParam) { excelParam := &ExcelParam{ @@ -753,7 +765,7 @@ func WriteToExcel(task *tasksch.SeqTask, dataSuccess []DataSuccess, dataFailed [ if err != nil { baseapi.SugarLogger.Errorf("WriteToExcel:upload %s , %s failed error:%v", fileName1, fileName2, err) } else { - noticeMsg := fmt.Sprintf("[详情点我]path1=%s, path2=%s \n", globals.BackstageHost, downloadURL1, downloadURL2) + noticeMsg := fmt.Sprintf("[详情点我]path1=%s, path2=%s \n", downloadURL1, downloadURL2) task.SetNoticeMsg(noticeMsg) baseapi.SugarLogger.Debugf("WriteToExcel:upload %s ,%s success, downloadURL1:%s ,downloadURL2:%s", fileName1, fileName2, downloadURL1, downloadURL2) } @@ -909,7 +921,7 @@ func WriteToExcel3(task *tasksch.SeqTask, dataSuccess []DataStoreSkusSuccess, da if err != nil { baseapi.SugarLogger.Errorf("WriteToExcel:upload %s , %s failed error:%v", fileName1, fileName2, err) } else { - noticeMsg := fmt.Sprintf("[详情点我]path1=%s, path2=%s \n", globals.BackstageHost, downloadURL1, downloadURL2) + noticeMsg := fmt.Sprintf("[详情点我]path1=%s, path2=%s \n", downloadURL1, downloadURL2) task.SetNoticeMsg(noticeMsg) baseapi.SugarLogger.Debugf("WriteToExcel:upload %s ,%s success, downloadURL1:%s ,downloadURL2:%s", fileName1, fileName2, downloadURL1, downloadURL2) } diff --git a/business/jxutils/jxutils.go b/business/jxutils/jxutils.go index 0de80c472..0761ffea0 100644 --- a/business/jxutils/jxutils.go +++ b/business/jxutils/jxutils.go @@ -15,12 +15,9 @@ import ( "git.rosy.net.cn/baseapi/platformapi/autonavi" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/baseapi/utils/routinepool" - "git.rosy.net.cn/jx-callback/business/auth2/authprovider/weixin" "git.rosy.net.cn/jx-callback/business/model" - "git.rosy.net.cn/jx-callback/business/model/dao" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" - "git.rosy.net.cn/jx-callback/globals/api2" "github.com/qiniu/api.v7/storage" ) @@ -457,69 +454,6 @@ func Strings2Objs(strAndObjAddPairs ...interface{}) (err error) { return nil } -func HandleUserWXRemark(db *dao.DaoDB, mobile string, mobileIsUerID bool) (err error) { - if db == nil { - db = dao.GetDB() - } - openIDs := []string{} - storeID := 0 - remark := "" - - // if !globals.DisableWXAuth1 { - // wxinfo, err := dao.GetUserStoreInfo(db, "tel", mobile) - // if err == nil { - // openIDs = []string{wxinfo.OpenID} - // storeID = wxinfo.JxStoreID - // } - // } - if globals.EnableWXAuth2 { - userID := "" - if mobileIsUerID { - userID = mobile - } else { - userList, _, err2 := dao.GetUsers(db, model.UserTypeStoreBoss, "", nil, "", mobile, 0, -1) - if err = err2; len(userList) > 0 { - userID = userList[0].GetID() - } - } - if userID != "" { - authBindList, err2 := dao.GetUserBindAuthInfo(db, userID, model.AuthBindTypeAuth, []string{weixin.AuthTypeMP}, "", "") - if err = err2; err == nil { - for _, v := range authBindList { - openIDs = append(openIDs, v.AuthID) - } - } - roleList, err2 := api2.RoleMan.GetUserRoleList(userID) - if err = err2; err == nil && len(roleList) > 0 { - storeID = roleList[0].StoreID - } - } - } - - if len(openIDs) > 0 { - if storeID > 0 { - store := &model.Store{} - store.ID = storeID - if err = dao.GetEntity(db, store); err == nil { - city := &model.Place{ - Code: store.CityCode, - } - if err = dao.GetEntity(db, city, "Code"); err == nil { - remark = city.Name + "-" + store.Name - } - } - } - if err == nil { - if globals.EnableStoreWrite { - for _, openID := range openIDs { - err = api.WeixinAPI.CBUpdateRemark(openID, remark) - } - } - } - } - return err -} - func RefreshOrderSkuRelated(order *model.GoodsOrder) *model.GoodsOrder { order.SkuCount = 0 order.GoodsCount = 0 @@ -723,14 +657,6 @@ func GetRealMobile4Order(order *model.GoodsOrder) (mobileNumber string) { return mobileNumber } -func GetAuthType4Vendor(vendorID int) (authType string) { - authType = dao.ConvertJsonFieldPrefix(model.VendorNames[vendorID]) - if authType != "" { - authType = "vendor." + authType - } - return authType -} - func GuessDataResourceVendor(resourceURL string) (vendorID int) { vendorID = -1 for tmpVendorID, urlList := range resourceTypeMap { diff --git a/business/jxutils/jxutils_cms.go b/business/jxutils/jxutils_cms.go index 8d6265932..11449a847 100644 --- a/business/jxutils/jxutils_cms.go +++ b/business/jxutils/jxutils_cms.go @@ -20,7 +20,6 @@ import ( "git.rosy.net.cn/baseapi/platformapi" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/model" - "git.rosy.net.cn/jx-callback/business/model/dao" "git.rosy.net.cn/jx-callback/globals" "github.com/boombuler/barcode" "github.com/boombuler/barcode/code128" @@ -370,11 +369,19 @@ func IsEmptyID(id int64) bool { } func FormalizePageSize(pageSize int) int { - return dao.FormalizePageSize(pageSize) + if pageSize == 0 { + return model.DefPageSize + } else if pageSize < 0 { + return model.UnlimitedPageSize + } + return pageSize } -func FormalizePageOffset(pageSize int) int { - return dao.FormalizePageOffset(pageSize) +func FormalizePageOffset(offset int) int { + if offset < 0 { + offset = 0 + } + return offset } func FormalizeName(name string) string { diff --git a/business/model/api.go b/business/model/api.go index e6c6a6796..4e2d1c2c8 100644 --- a/business/model/api.go +++ b/business/model/api.go @@ -10,6 +10,15 @@ const ( UnlimitedPageSize = math.MaxInt32 ) +type ShortSkuInfo struct { + SkuID int `orm:"column(sku_id)" json:"skuID,omitempty"` + SkuShopPrice int `json:"skuShopPrice"` + SkuSalePrice int `json:"skuSalePrice"` + SkuEarningPrice int `json:"skuEarningPrice,omitempty"` + SkuCount2 int `json:"skuCount2"` + SkuName string `orm:"size(255)" json:"skuName"` +} + type GoodsOrderExt struct { GoodsOrder EarningPrice int64 `json:"earningPrice"` // 预估结算给门店老板的钱 @@ -26,12 +35,12 @@ type GoodsOrderExt struct { WaybillCreatedAt time.Time `orm:"type(datetime);index" json:"waybillCreatedAt"` WaybillFinishedAt time.Time `orm:"type(datetime)" json:"waybillFinishedAt"` - SkuID int `orm:"column(sku_id)" json:"skuID,omitempty"` - SkuShopPrice int `json:"skuShopPrice,omitempty"` - SkuSalePrice int `json:"skuSalePrice,omitempty"` - SkuEarningPrice int `json:"skuEarningPrice,omitempty"` - SkuCount2 int `json:"skuCount2,omitempty"` - SkuInfo string `json:"skuInfo,omitempty"` + DistrictName string `json:"districtName"` + CityName string `json:"cityName"` + + SkuInfo string `json:"skuInfo,omitempty"` + ShortSkuInfo `json:"-"` + SkuList []*ShortSkuInfo `json:"skuList,omitempty"` } type OrderSkuExt struct { diff --git a/business/model/dao/act.go b/business/model/dao/act.go index a599d8d43..4b524e839 100644 --- a/business/model/dao/act.go +++ b/business/model/dao/act.go @@ -7,6 +7,7 @@ import ( "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/model" ) @@ -71,8 +72,8 @@ func GetActVendorInfo(db *DaoDB, actID int, vendorIDs []int) (actMap map[int]*mo func GetActStoreSkuVendorList(db *DaoDB, actID int, vendorIDs, storeIDs, skuIDs []int, keyword string, offset, pageSize int) (totalCount int, actStoreSkuList []*model.ActStoreSku2, err error) { globals.SugarLogger.Debugf("GetActStoreSkuVendorList actID:%d", actID) - offset = FormalizePageOffset(offset) - pageSize = FormalizePageSize(pageSize) + offset = jxutils.FormalizePageOffset(offset) + pageSize = jxutils.FormalizePageSize(pageSize) leftOrEmpty := "" if len(vendorIDs) == 1 && (vendorIDs[0] == -1 || vendorIDs[0] == model.VendorIDJX) { @@ -178,8 +179,8 @@ func QueryActs(db *DaoDB, actID int, offset, pageSize int, syncStatus int, keywo if actID == 0 && utils.IsTimeZero(createdAtFrom) && utils.IsTimeZero(beginAt) { return nil, fmt.Errorf("actID,createdAtFrom和beginAt中,至少要指定一个条件") } - offset = FormalizePageOffset(offset) - pageSize = FormalizePageSize(pageSize) + offset = jxutils.FormalizePageOffset(offset) + pageSize = jxutils.FormalizePageSize(pageSize) isGetAll := offset == 0 && pageSize == model.UnlimitedPageSize sql := ` diff --git a/business/model/dao/dao_order.go b/business/model/dao/dao_order.go index 673e06405..2d5c62775 100644 --- a/business/model/dao/dao_order.go +++ b/business/model/dao/dao_order.go @@ -2,10 +2,13 @@ package dao import ( "fmt" + "strconv" "time" "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/model" + "git.rosy.net.cn/jx-callback/globals" ) const ( @@ -80,12 +83,11 @@ func QueryOrders(db *DaoDB, vendorOrderID string, actID int, vendorIDs []int, st AND t2.store_id = IF(t4.jx_store_id <> 0, t4.jx_store_id, t4.store_id) AND t4.order_created_at BETWEEN t1.begin_at AND t1.end_at WHERE t1.status = 1 - AND t1.type = ? AND t1.id = ? GROUP BY 1,2 )s ON s.vendor_order_id = a.vendor_order_id AND s.vendor_id = a.vendor_id ` - sqlParams = append(sqlParams, model.ActSkuFake, actID) + sqlParams = append(sqlParams, actID) } sql += ` WHERE 1=1 @@ -712,3 +714,207 @@ func GetOrderPayList(db *DaoDB, vendorOrderID string, vendorID int) (payList []* } return payList, GetRows(db, &payList, sql, sqlParams) } + +func GetOrders(db *DaoDB, ids []int64, isIncludeSku, isIncludeFake bool, fromDateStr, toDateStr string, isDateFinish bool, skuIDs []int, isJxFirst bool, userID string, params map[string]interface{}, offset, pageSize int) (orders []*model.GoodsOrderExt, totalCount int, err error) { + globals.SugarLogger.Debugf("dao GetOrders ids:%v from:%s to:%s", ids, fromDateStr, toDateStr) + pageSize = jxutils.FormalizePageSize(pageSize) + offset = jxutils.FormalizePageOffset(offset) + + sql := fmt.Sprintf(` + SELECT SQL_CALC_FOUND_ROWS + t1.*, + CAST(IF(t1.earning_price <> 0, t1.earning_price, IF(t1.shop_price <> 0 && t1.shop_price < t1.sale_price, t1.shop_price, t1.sale_price) * IF(t5.pay_percentage > 0, t5.pay_percentage, %d) / 100) AS SIGNED) earning_price, + t2.status waybill_status, t2.courier_name, t2.courier_mobile, + t2.actual_fee, t2.desired_fee, t2.waybill_created_at, t2.waybill_finished_at, + city.name city_name, district.name district_name`, model.DefaultEarningPricePercentage) + if isIncludeSku { + sql += `, + IF(t3.jx_sku_id > 0, t3.jx_sku_id, t3.sku_id) sku_id, + t3.count sku_count2, + t3.shop_price sku_shop_price, + t3.earning_price sku_earning_price, + t3.sale_price sku_sale_price, + t3.sku_name` + } + sql += ` + FROM goods_order t1 + LEFT JOIN waybill t2 ON t1.vendor_waybill_id = t2.vendor_waybill_id AND t1.waybill_vendor_id = t2.waybill_vendor_id + LEFT JOIN store t5 ON t5.id = IF(t1.jx_store_id <> 0, t1.jx_store_id, t1.store_id) + LEFT JOIN place city ON city.code = t5.city_code + LEFT JOIN place district ON district.code = t5.district_code` + if isIncludeSku { + sql += ` + JOIN order_sku t3 ON t3.vendor_order_id = t1.vendor_order_id AND t3.vendor_id = t1.vendor_id` + } + sqlWhere := " WHERE 1 = 1" + var ( + sqlParams []interface{} + ) + if len(ids) > 0 { // 如果给定了ids,忽略其它所有条件 + sqlWhere += " AND t1.id IN (" + GenQuestionMarks(len(ids)) + ")" + sqlParams = append(sqlParams, ids) + } else { + // 如果搜索关键字可能为订单号,则当成订单号查询 + if params["keyword"] != nil { + if jxutils.GetPossibleVendorIDFromVendorOrderID(params["keyword"].(string)) > model.VendorIDUnknown { + params["vendorOrderID"] = params["keyword"] + } + } + if params["orderID"] != nil || params["vendorOrderID"] != nil { + sqlWhere += " AND (t1.vendor_order_id = ? OR t1.vendor_order_id2 = ?)" + vendorOrderID := params["vendorOrderID"] + if vendorOrderID == nil { + vendorOrderID = params["orderID"] + } + sqlParams = []interface{}{ + vendorOrderID, + vendorOrderID, + } + } else { + timeList, err2 := jxutils.BatchStr2Time(fromDateStr, toDateStr) + if err = err2; err != nil { + return nil, 0, err + } + if utils.IsTimeZero(timeList[0]) { + return nil, 0, fmt.Errorf("在没有指定订单号时,必须指定查询日期范围") + } + if utils.IsTimeZero(timeList[1]) { + timeList[1] = timeList[0] + } + timeList[1] = timeList[1].Add(24 * time.Hour) + if isDateFinish { + sqlWhere += ` + AND t1.order_finished_at >= ? AND t1.order_finished_at < ?` + } else { + sqlWhere += ` + AND t1.order_created_at >= ? AND t1.order_created_at < ?` + } + sqlParams = []interface{}{ + timeList[0], + timeList[1], + } + if params["keyword"] != nil { + keyword := params["keyword"].(string) + keywordLike := "%" + keyword + "%" + sqlWhere += ` + AND (t1.store_name LIKE ? OR t1.vendor_order_id LIKE ? OR t1.vendor_order_id2 LIKE ? OR t1.vendor_store_id LIKE ? + OR t1.consignee_name LIKE ? OR t1.consignee_mobile LIKE ? OR t1.consignee_mobile2 LIKE ? OR t1.consignee_address LIKE ? + OR t2.vendor_waybill_id LIKE ? OR t2.courier_name LIKE ? OR t2.courier_mobile LIKE ? + ` + sqlParams = append(sqlParams, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike) + if keywordInt64, err2 := strconv.ParseInt(keyword, 10, 64); err2 == nil { + sqlWhere += " OR t1.store_id = ? OR t1.jx_store_id = ?" + sqlParams = append(sqlParams, keywordInt64, keywordInt64) + } + sqlWhere += ")" + } + if params["waybillVendorIDs"] != nil { + var waybillVendorIDs []int + if err = utils.UnmarshalUseNumber([]byte(params["waybillVendorIDs"].(string)), &waybillVendorIDs); err != nil { + return nil, 0, err + } + if len(waybillVendorIDs) > 0 { + sqlWhere += " AND t1.waybill_vendor_id IN (" + GenQuestionMarks(len(waybillVendorIDs)) + ")" + sqlParams = append(sqlParams, waybillVendorIDs) + } + } + if params["storeIDs"] != nil { + var storeIDs []int + if err = utils.UnmarshalUseNumber([]byte(params["storeIDs"].(string)), &storeIDs); err != nil { + return nil, 0, err + } + if len(storeIDs) > 0 { + if storeIDs[0] == 0 { // 容错 + sqlWhere += " AND 1 = 0" + } else { + sqlWhere += " AND IF(t1.jx_store_id != 0, t1.jx_store_id, t1.store_id) IN (" + GenQuestionMarks(len(storeIDs)) + ")" + sqlParams = append(sqlParams, storeIDs) + } + } + } + if params["statuss"] != nil { + var statuss []int + if err = utils.UnmarshalUseNumber([]byte(params["statuss"].(string)), &statuss); err != nil { + return nil, 0, err + } + if len(statuss) > 0 { + sqlWhere += " AND t1.status IN (" + GenQuestionMarks(len(statuss)) + ")" + sqlParams = append(sqlParams, statuss) + } + } + if params["lockStatuss"] != nil { + var lockStatuss []int + if err = utils.UnmarshalUseNumber([]byte(params["lockStatuss"].(string)), &lockStatuss); err != nil { + return nil, 0, err + } + if len(lockStatuss) > 0 { + sqlWhere += " AND t1.lock_status IN (" + GenQuestionMarks(len(lockStatuss)) + ")" + sqlParams = append(sqlParams, lockStatuss) + } + } + if params["cities"] != nil { + var cities []int + if err = utils.UnmarshalUseNumber([]byte(params["cities"].(string)), &cities); err != nil { + return nil, 0, err + } + if len(cities) > 0 { + sqlWhere += " AND t5.city_code IN (" + GenQuestionMarks(len(cities)) + ") AND t5.id IS NOT NULL" + sqlParams = append(sqlParams, cities) + } + } + if !isIncludeFake { + sqlWhere += " AND (t1.flag & ?) = 0" + sqlParams = append(sqlParams, model.OrderFlagMaskFake) + } + if len(skuIDs) > 0 { + sqlWhere += " AND (SELECT COUNT(*) FROM order_sku t11 WHERE t11.vendor_order_id = t1.vendor_order_id AND t11.vendor_id = t1.vendor_id AND t11.jx_sku_id IN (" + GenQuestionMarks(len(skuIDs)) + ")) > 0" + sqlParams = append(sqlParams, skuIDs) + } + if params["adjustCount"] != nil { + sqlWhere += " AND t1.adjust_count >= ?" + sqlParams = append(sqlParams, params["adjustCount"]) + } + if mustInvoice, ok := params["mustInvoice"].(bool); ok && mustInvoice { + sqlWhere += " AND t1.invoice_taxer_id <> ''" + } + } + if params["vendorIDs"] != nil { + var vendorIDs []int + if err = utils.UnmarshalUseNumber([]byte(params["vendorIDs"].(string)), &vendorIDs); err != nil { + return nil, 0, err + } + if len(vendorIDs) > 0 { + sqlWhere += " AND t1.vendor_id IN (" + GenQuestionMarks(len(vendorIDs)) + ")" + sqlParams = append(sqlParams, vendorIDs) + } + } + if userID != "" { + sqlWhere += " AND t1.user_id = ?" + sqlParams = append(sqlParams, userID) + } + } + sql += sqlWhere + if isJxFirst { + sql += ` + ORDER BY IF(t1.status < ?, IF(t1.vendor_id = ?, 0, 1), 0), t1.order_created_at DESC` + sqlParams = append(sqlParams, model.OrderStatusEndBegin, model.VendorIDJX) + } else { + if isIncludeSku { + sql += ` + ORDER BY t1.id` + } else { + sql += ` + ORDER BY t1.order_created_at DESC` + } + } + sql += ` + LIMIT ? OFFSET ?` + sqlParams = append(sqlParams, pageSize, offset) + + Begin(db) + defer Commit(db) + if err = GetRows(db, &orders, sql, sqlParams...); err == nil { + totalCount = GetLastTotalRowCount(db) + } + return orders, totalCount, err +} diff --git a/business/model/dao/dao_user2.go b/business/model/dao/dao_user2.go index 08e497ec7..51572c40d 100644 --- a/business/model/dao/dao_user2.go +++ b/business/model/dao/dao_user2.go @@ -5,6 +5,7 @@ import ( "time" "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/model" ) @@ -38,8 +39,8 @@ func GetUserByID(db *DaoDB, fieldName, fieldValue string) (user *model.User, err } func GetUsers(db *DaoDB, userType int, keyword string, userIDs []string, userID2, mobile string, offset, pageSize int) (userList []*model.User, totalCount int, err error) { - offset = FormalizePageOffset(offset) - pageSize = FormalizePageSize(pageSize) + offset = jxutils.FormalizePageOffset(offset) + pageSize = jxutils.FormalizePageSize(pageSize) if userType == 0 { userType = 255 } @@ -182,8 +183,8 @@ func QueryUserDeliveryAddress(db *DaoDB, addressID int64, userIDs []string, offs sql += " AND t1.user_id IN (" + GenQuestionMarks(len(userIDs)) + ")" sqlParams = append(sqlParams, userIDs) } - offset = FormalizePageOffset(offset) - pageSize = FormalizePageSize(pageSize) + offset = jxutils.FormalizePageOffset(offset) + pageSize = jxutils.FormalizePageSize(pageSize) sql += ` ORDER BY t1.is_default DESC, t1.consignee_name LIMIT ? OFFSET ?` diff --git a/business/model/dao/dao_utils.go b/business/model/dao/dao_utils.go index 736a463c7..8a36c2adc 100644 --- a/business/model/dao/dao_utils.go +++ b/business/model/dao/dao_utils.go @@ -201,18 +201,10 @@ func IsVendorThingIDEmpty(vendorThingID string) bool { return vendorThingID == "" || vendorThingID == "0" } -func FormalizePageSize(pageSize int) int { - if pageSize == 0 { - return model.DefPageSize - } else if pageSize < 0 { - return model.UnlimitedPageSize +func GetAuthType4Vendor(vendorID int) (authType string) { + authType = ConvertJsonFieldPrefix(model.VendorNames[vendorID]) + if authType != "" { + authType = "vendor." + authType } - return pageSize -} - -func FormalizePageOffset(offset int) int { - if offset < 0 { - offset = 0 - } - return offset + return authType } diff --git a/business/model/dao/food_recipe.go b/business/model/dao/food_recipe.go index 5228c87c3..f2b1854d9 100644 --- a/business/model/dao/food_recipe.go +++ b/business/model/dao/food_recipe.go @@ -2,6 +2,7 @@ package dao import ( "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/model" ) @@ -72,8 +73,8 @@ func QueryFoodRecipes(db *DaoDB, keyword string, recipeID int, authorID, userID ) > 0` sqlParams = append(sqlParams, skuIDs) } - offset = FormalizePageOffset(offset) - pageSize = FormalizePageSize(pageSize) + offset = jxutils.FormalizePageOffset(offset) + pageSize = jxutils.FormalizePageSize(pageSize) sql += ` ORDER BY t1.created_at DESC LIMIT ? OFFSET ?` diff --git a/business/model/dao/food_recipe_test.go b/business/model/dao/food_recipe_test.go index 471c44e8a..b3b064046 100644 --- a/business/model/dao/food_recipe_test.go +++ b/business/model/dao/food_recipe_test.go @@ -6,7 +6,7 @@ import ( func TestQueryRecipes(t *testing.T) { db := GetDB() - recipeList, _, err := QueryFoodRecipes(db, "", 0, "", "", 0, 0) + recipeList, _, err := QueryFoodRecipes(db, "", 0, "", "", nil, 0, 0) if err != nil { t.Fatal(err) } diff --git a/business/model/dao/page_store.go b/business/model/dao/page_store.go index 676f6d68b..fe413e2f6 100644 --- a/business/model/dao/page_store.go +++ b/business/model/dao/page_store.go @@ -1,6 +1,7 @@ package dao import ( + "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/model" ) @@ -76,8 +77,8 @@ func QueryPageStores(db *DaoDB, pageSize, offset int, keyword string, vendorStor ORDER BY t1.recent_order_num DESC LIMIT ? OFFSET ? ` - pageSize = FormalizePageSize(pageSize) - offset = FormalizePageOffset(offset) + pageSize = jxutils.FormalizePageSize(pageSize) + offset = jxutils.FormalizePageOffset(offset) sqlParams = append(sqlParams, pageSize, offset) var shopList []*PageShopWithPlaceName Begin(db) diff --git a/business/model/sku.go b/business/model/sku.go index cc8036ce2..70a727723 100644 --- a/business/model/sku.go +++ b/business/model/sku.go @@ -138,10 +138,10 @@ type SkuCategory struct { EbaiCategoryID int64 `orm:"column(ebai_category_id)" json:"ebaiCategoryID"` // 这个是指对应的饿百商品类别 MtwmCategoryID int64 `orm:"column(mtwm_category_id)" json:"mtwmCategoryID"` // 这个是指对应的美团外卖商品类别 - ElmCategoryID int64 `orm:"column(elm_category_id)" json:"elmCategoryID"` // 这个是指对应的饿了么商品类别 - WscCategoryID int64 `orm:"column(wsc_category_id)" json:"wscCategoryID"` // 这个是指对应的美团外卖商品类别 + // ElmCategoryID int64 `orm:"column(elm_category_id)" json:"elmCategoryID"` // 这个是指对应的饿了么商品类别 + // WscCategoryID int64 `orm:"column(wsc_category_id)" json:"wscCategoryID"` // 这个是指对应的美团外卖商品类别 - JdID int64 `orm:"column(jd_id);null" json:"jdID"` // 这个是指商家自己的商品类别在京东平台上的ID + JdID int64 `orm:"column(jd_id)" json:"jdID"` // 这个是指商家自己的商品类别在京东平台上的ID JdSyncStatus int8 `orm:"default(2)" json:"jdSyncStatus"` } diff --git a/business/partner/delivery/mtps/waybill.go b/business/partner/delivery/mtps/waybill.go index 105381db3..25fca1ea7 100644 --- a/business/partner/delivery/mtps/waybill.go +++ b/business/partner/delivery/mtps/waybill.go @@ -36,8 +36,10 @@ type DeliveryHandler struct { } func init() { - curDeliveryHandler = new(DeliveryHandler) - partner.RegisterDeliveryPlatform(curDeliveryHandler, true) + if api.MtpsAPI != nil { + curDeliveryHandler = new(DeliveryHandler) + partner.RegisterDeliveryPlatform(curDeliveryHandler, true) + } } func (c *DeliveryHandler) GetVendorID() int { diff --git a/business/partner/partner.go b/business/partner/partner.go index 102304630..7327885f9 100644 --- a/business/partner/partner.go +++ b/business/partner/partner.go @@ -93,6 +93,7 @@ type IOrderManager interface { OnWaybillStatusChanged(bill *model.Waybill) (err error) + CreateAfsOrderFromOrder(vendorOrderID string, vendorID int) (afsOrder *model.AfsOrder, err error) LoadOrder(vendorOrderID string, vendorID int) (order *model.GoodsOrder, err error) LoadOrder2(vendorOrderID2 string, vendorID int) (order *model.GoodsOrder, err error) @@ -190,6 +191,10 @@ func (p *BasePurchasePlatform) GetStatusActionTimeout(order *model.GoodsOrder, s return params } +func (c *BasePurchasePlatform) CanSwitch2SelfDeliver(order *model.GoodsOrder) (isCan bool, err error) { + return true, nil +} + func init() { PurchasePlatformHandlers = make(map[int]IPurchasePlatformHandler) PurchaseOrderHandlers = make(map[int]IPurchasePlatformOrderHandler) diff --git a/business/partner/partner_order.go b/business/partner/partner_order.go index 99d290b67..442a87ce3 100644 --- a/business/partner/partner_order.go +++ b/business/partner/partner_order.go @@ -22,6 +22,8 @@ type IPurchasePlatformOrderHandler interface { CallCourier(ctx *jxcontext.Context, order *model.GoodsOrder) (err error) // 取货失败后再次招唤平台配送 ConfirmReceiveGoods(ctx *jxcontext.Context, order *model.GoodsOrder) (err error) // 投递失败后确认收到退货 + // 是否可能转商家自送 + CanSwitch2SelfDeliver(order *model.GoodsOrder) (isCan bool, err error) // 将订单从购物平台配送转为自送 Swtich2SelfDeliver(order *model.GoodsOrder, userName string) (err error) diff --git a/business/partner/purchase/ebai/order.go b/business/partner/purchase/ebai/order.go index 2658dc3f1..e891e83fa 100644 --- a/business/partner/purchase/ebai/order.go +++ b/business/partner/purchase/ebai/order.go @@ -32,6 +32,7 @@ const ( fakeUserUndoApplyCancel = "fake_user_undo_apply_cancel" fakeAcceptOrder = "fake_accept_order" fakeOrderAdjustFinished = "fake_order_adjust_finished" + fakeOrderCanceled = "fake_order_canceled" ) // 饿百的接单会直接召唤配送,为了统一将饿百的接单影射成拣货完成,然后模拟一个接单消息 @@ -50,6 +51,7 @@ var ( fakeOrderAdjustFinished: model.OrderStatusAdjust, fakeUserApplyCancel: model.OrderStatusApplyCancel, fakeUserUndoApplyCancel: model.OrderStatusUndoApplyCancel, + fakeOrderCanceled: model.OrderStatusCanceled, } skuActTypeMap = map[string]int{ @@ -341,8 +343,11 @@ func (p *PurchaseHandler) Swtich2SelfDeliver(order *model.GoodsOrder, userName s if err = api.EbaiAPI.OrderSwitchselfdelivery(order.VendorOrderID); err != nil { if utils.IsErrMatch(err, "301251", nil) { if deliveryStatus, err2 := api.EbaiAPI.OrderDeliveryGet(order.VendorOrderID); err2 == nil { - if utils.Int64ToStr(utils.MustInterface2Int64(deliveryStatus["status"])) == ebaiapi.WaybillStatusSelfDelivery { + deliveryStatus := utils.Int64ToStr(utils.MustInterface2Int64(deliveryStatus["status"])) + if deliveryStatus == ebaiapi.WaybillStatusSelfDelivery { err = nil + } else if deliveryStatus == ebaiapi.WaybillStatusDeliveryCancled { + p.trySyncCancelStatus(order.VendorOrderID) } } } @@ -355,6 +360,16 @@ func (p *PurchaseHandler) Swtich2SelfDeliver(order *model.GoodsOrder, userName s return err } +func (p *PurchaseHandler) trySyncCancelStatus(vendorOrderID string) (err error) { + orderInfo, err := api.EbaiAPI.OrderGet2(vendorOrderID) + if err == nil { + if utils.Int2Str(orderInfo.Order.Status) == ebaiapi.OrderStatusCanceled { + p.postFakeMsg(vendorOrderID, fakeOrderCanceled) + } + } + return err +} + // 将订单从购物平台配送转为自送后又送达 func (p *PurchaseHandler) Swtich2SelfDelivered(order *model.GoodsOrder, userName string) (err error) { globals.SugarLogger.Debugf("ebai Swtich2SelfDelivered orderID:%s", order.VendorOrderID) diff --git a/business/partner/purchase/ebai/order_afs.go b/business/partner/purchase/ebai/order_afs.go index 05da43af4..eb499879e 100644 --- a/business/partner/purchase/ebai/order_afs.go +++ b/business/partner/purchase/ebai/order_afs.go @@ -101,8 +101,9 @@ func (c *PurchaseHandler) onAfsOrderMsg(msg *ebaiapi.CallbackMsg) (retVal *ebaia afsOrder.Skus = append(afsOrder.Skus, orderSku) } } else if msg.Cmd == ebaiapi.CmdOrderUserCancel { - if orderFinancial, err2 := partner.CurOrderManager.LoadOrderFinancial(orderStatus.RefVendorOrderID, model.VendorIDEBAI); err2 == nil { - afsOrder = c.OrderFinancialDetail2Refund(orderFinancial, msg) + if afsOrder := c.createAfsOrder(msg); afsOrder != nil { + // if orderFinancial, err2 := partner.CurOrderManager.LoadOrderFinancial(orderStatus.RefVendorOrderID, model.VendorIDEBAI); err2 == nil { + // afsOrder = c.OrderFinancialDetail2Refund(orderFinancial, msg) cancelData := msg.Data.(*ebaiapi.CBUserCancelInfo) afsOrder.AfsOrderID = orderStatus.VendorOrderID afsOrder.RefundType = model.AfsTypeFullRefund @@ -124,6 +125,18 @@ func (c *PurchaseHandler) onAfsOrderMsg(msg *ebaiapi.CallbackMsg) (retVal *ebaia return retVal } +func (p *PurchaseHandler) createAfsOrder(msg *ebaiapi.CallbackMsg) (afsOrder *model.AfsOrder) { + cancelData := msg.Data.(*ebaiapi.CBUserCancelInfo) + afsOrder, err := partner.CurOrderManager.CreateAfsOrderFromOrder(utils.Int64ToStr(cancelData.OrderID), model.VendorIDEBAI) + if err == nil { + afsOrder.AfsOrderID = afsOrder.VendorOrderID + afsOrder.AfsCreatedAt = utils.Timestamp2Time(msg.Timestamp) + } else { + afsOrder = nil + } + return afsOrder +} + func (c *PurchaseHandler) convertAfsReasonType(vendorReasonType string) int8 { return model.AfsReasonNotOthers } diff --git a/business/partner/purchase/ebai/waybill.go b/business/partner/purchase/ebai/waybill.go index 12a9f4a27..0d7564fdd 100644 --- a/business/partner/purchase/ebai/waybill.go +++ b/business/partner/purchase/ebai/waybill.go @@ -1,6 +1,8 @@ package ebai import ( + "time" + "git.rosy.net.cn/baseapi/platformapi/ebaiapi" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/model" @@ -9,6 +11,10 @@ import ( "git.rosy.net.cn/jx-callback/globals/api" ) +const ( + timeout4WaybillCancel = 10 * time.Minute // 饿百发送运单取消消息10分钟后,如果没有转自送,就要取消订单,且不再发送订单取消消息 +) + var ( VendorWaybillStatus2StatusMap = map[string]int{ ebaiapi.WaybillStatusNew: model.WaybillStatusUnknown, @@ -44,6 +50,14 @@ func (c *PurchaseHandler) onWaybillMsg(msg *ebaiapi.CallbackMsg) (retVal *ebaiap order.CourierName = utils.Interface2String(result["name"]) order.CourierMobile = utils.Interface2String(result["phone"]) } + } else if order.Status == model.WaybillStatusCanceled { + utils.AfterFuncWithRecover(timeout4WaybillCancel, func() { + if localOrder, err2 := partner.CurOrderManager.LoadOrder(order.VendorOrderID, model.VendorIDEBAI); err2 == nil { + if localOrder.Status < model.OrderStatusEndBegin { + c.trySyncCancelStatus(order.VendorOrderID) + } + } + }) } return api.EbaiAPI.Err2CallbackResponse(msg.Cmd, partner.CurOrderManager.OnWaybillStatusChanged(order), order.VendorStatus) } diff --git a/business/partner/purchase/jx/localjx/order.go b/business/partner/purchase/jx/localjx/order.go index dd31afc09..3bd71af27 100644 --- a/business/partner/purchase/jx/localjx/order.go +++ b/business/partner/purchase/jx/localjx/order.go @@ -100,6 +100,39 @@ func init() { orderNoBeginTimestamp = utils.Str2Time("2010-01-01 00:00:00").Unix() } +func GetMyOrders(ctx *jxcontext.Context, fromDateStr, toDateStr string, params map[string]interface{}, offset, pageSize int) (pagedInfo *model.PagedInfo, err error) { + db := dao.GetDB() + tmpOrderList, totalCount, err := dao.GetOrders(db, nil, false, false, fromDateStr, toDateStr, false, nil, false, ctx.GetUserID(), params, offset, pageSize) + if err == nil { + pagedInfo = &model.PagedInfo{ + TotalCount: totalCount, + } + if totalCount > 0 { + var ids []int64 + for _, v := range tmpOrderList { + ids = append(ids, v.ID) + } + orderSkuList, _, err2 := dao.GetOrders(db, ids, true, false, "", "", false, nil, false, "", nil, 0, model.UnlimitedPageSize) + if err = err2; err == nil { + orderMap := make(map[string]*model.GoodsOrderExt) + var orderList []*model.GoodsOrderExt + for _, v := range orderSkuList { + universalOrderID := jxutils.ComposeUniversalOrderID(v.VendorOrderID, v.VendorID) + if orderMap[universalOrderID] == nil { + orderMap[universalOrderID] = v + orderList = append(orderList, v) + } + orderMap[universalOrderID].SkuList = append(orderMap[universalOrderID].SkuList, &v.ShortSkuInfo) + } + pagedInfo.Data = orderList + } else { + pagedInfo = nil + } + } + } + return pagedInfo, err +} + func CreateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64, createType int) (outJxOrder *JxOrderInfo, err error) { outJxOrder, deliveryAddress, err := generateOrder(ctx, jxOrder, addressID) if err != nil { diff --git a/business/partner/purchase/mtwm/order.go b/business/partner/purchase/mtwm/order.go index 732e44146..29ca7481b 100644 --- a/business/partner/purchase/mtwm/order.go +++ b/business/partner/purchase/mtwm/order.go @@ -468,6 +468,11 @@ func (p *PurchaseHandler) ConfirmReceiveGoods(ctx *jxcontext.Context, order *mod return err } +// 美团预定单不能转商家自送 +func (c *PurchaseHandler) CanSwitch2SelfDeliver(order *model.GoodsOrder) (isCan bool, err error) { + return order.BusinessType != model.BusinessTypeDingshida, nil +} + func (c *PurchaseHandler) Swtich2SelfDeliver(order *model.GoodsOrder, userName string) (err error) { globals.SugarLogger.Debugf("mtwm Swtich2SelfDeliver orderID:%s", order.VendorOrderID) if globals.EnableMtwmStoreWrite { diff --git a/business/partner/purchase/mtwm/order_afs.go b/business/partner/purchase/mtwm/order_afs.go index 7928e33bc..70a4a65d9 100644 --- a/business/partner/purchase/mtwm/order_afs.go +++ b/business/partner/purchase/mtwm/order_afs.go @@ -142,47 +142,15 @@ func (c *PurchaseHandler) onAfsOrderMsg(msg *mtwmapi.CallbackMsg) (retVal *mtwma } func (p *PurchaseHandler) createAfsOrder(orderData url.Values) (afsOrder *model.AfsOrder) { - afsOrder = &model.AfsOrder{ - VendorID: model.VendorIDMTWM, - AfsOrderID: orderData.Get("refund_id"), - VendorOrderID: orderData.Get("order_id"), - AfsCreatedAt: utils.Timestamp2Time(utils.Str2Int64(orderData.Get("timestamp"))), - } - if afsOrder.AfsOrderID == "" { - afsOrder.AfsOrderID = afsOrder.VendorOrderID - } - order, err := partner.CurOrderManager.LoadOrder(afsOrder.VendorOrderID, afsOrder.VendorID) - globals.SugarLogger.Debug(utils.Format4Output(order, false)) + afsOrder, err := partner.CurOrderManager.CreateAfsOrderFromOrder(orderData.Get("refund_id"), model.VendorIDMTWM) if err == nil { - afsOrder.JxStoreID = order.JxStoreID - afsOrder.VendorStoreID = order.VendorStoreID - afsOrder.StoreID = order.StoreID - } else { - globals.SugarLogger.Warnf("mtwm AfsOrderDetail2Financial, afsOrderID:%s is not found from partner.CurOrderManager.LoadOrder", afsOrder.VendorOrderID) - return nil - } - - for _, sku := range order.Skus { - orderSkuFinancial := &model.OrderSkuFinancial{ - VendorID: sku.VendorID, - VendorOrderID: sku.VendorOrderID, - // OrderFinancialID: sku.VendorOrderID, - // ConfirmTime: afsOrder.AfsCreateAt, - VendorStoreID: afsOrder.VendorStoreID, - StoreID: afsOrder.StoreID, - JxStoreID: afsOrder.JxStoreID, - VendorSkuID: sku.VendorSkuID, - SkuID: sku.SkuID, - PromotionType: sku.PromotionType, - Name: sku.SkuName, - ShopPrice: sku.ShopPrice, - SalePrice: sku.SalePrice, - Count: sku.Count, - // UserMoney: sku.UserMoney, - // PmSubsidyMoney: sku.PmSubsidyMoney, - IsAfsOrder: 1, + afsOrder.AfsOrderID = orderData.Get("refund_id") + afsOrder.AfsCreatedAt = utils.Timestamp2Time(utils.Str2Int64(orderData.Get("timestamp"))) + if afsOrder.AfsOrderID == "" { + afsOrder.AfsOrderID = afsOrder.VendorOrderID } - afsOrder.Skus = append(afsOrder.Skus, orderSkuFinancial) + } else { + afsOrder = nil } return afsOrder } diff --git a/conf/app.conf b/conf/app.conf index 3dbee43ff..c347eea59 100644 --- a/conf/app.conf +++ b/conf/app.conf @@ -58,7 +58,7 @@ wxpayNotifyURL = "http://callback.test.jxc4.com/wxpay/msg/" backstageHost = "http://www.jxc4.com" wxBackstageHost = "http://wx.jxc4.com" -jdStorePageCookie = "YYJV3NHVBPHLD36FWP6F3EM5PTXJ2XZQS7U4HWRIDPP4IWGUKUIB4XG5N26CZRDLDF7PKOXBPD6BNTUAJLETLZOIWMCVFI3K6MYZIY4QBIXIMXYDJNUKFGJVQTN5356SAD6WPCIHWNQAG7DDMF7L7S3SHCT3RM3CQG7IJIPUQ3THS5UIUYWMKINM7ETUOQB7OBPOPZVCT3ZJY55243TDVXLO25PP4UYSPTTPMNQ7HPMWOJKJ3BJWGVHD243MXH7NZWW264TKN5UOCJBSSSOKD2QQII" +jdStorePageCookie = "OPJQMA7B3FTKCAUGO7FHCH5NMBGAWGGXYRNLEHYYZNGNPNIBCAM4IOEPG3NT3RIA44G5C3535Q5LGG4F4SR4AZVLGYKYTKFJJKEAOXENVBL5VXNILRP3GLNVVWA26XZ3VGSYOHA72RICMVZS3G53DTEH3LYUCSS54VI6WPOAGGDK532VYPEWWVCXUFRWENWDI4PEKM7SXBZ5BJO6DBLLERUA74YR2CVCGP4WUROCAHAMXKJ2VBGHTZYRL2DHR3BMXAHCTBAHYQLL24K5YI2PULRJL2UGAVD7VFRMEYTOXYHWCYVDXJ6HYFIPWIN3ULLXDDLN2ICON4GRK" ebaiStorePageCookieWMUSS = "B0AAFQCAAAGbhkuMCsvcyYBDkkyAxBGIBlgXAQYVwc7VwYZFkx2HDoPSmo5eV1femopWgJRawhgAALG04cg1RUmhUakBbJRdgPS0tNEhnQhNRewwuWwYYBDEFPCQSDXV5YWA6PAVRHUJ9SnVGMThYAjNjLw9pRxIbS04-XFo05AQgBl%7ERLA33vWcR73gEAKZ" ebaiStorePageCookieWMSTOKEN = "gAALgNAAAGfBI5YEBHSQdZY1InIS8CVQU9aBU1f3VLWVQqKHAAAc5LnRLZ1QLLx0S5IuzCSX8ZQ7oUwAAUr-GEm9JpRc9AQAAsLkLHHXzuhh2lZkbyrcAAAWBESKg3ZA" mtpsStoreToken = "M0p9VatZSeSHfrosD5IViAVl73IcA8mlcuHIV5sG6Zpv83a7JE0wY3t26aEhrrs_MR5gtLSFF1UIkt8HAjaXow" @@ -181,7 +181,7 @@ dbConnectStr = "root:WebServer@1@tcp(127.0.0.1:3306)/jxgy?charset=utf8mb4&loc=Lo jdToken = "84541069-fbe2-424b-b625-9b2ba1d4c9e6" jdAppKey = "5d5577a2506f41b8b4ec520ba83490f5" jdSecret = "0b01b9eeb15b41dab1c3d05d95c17a26" -jdStorePageCookie = "YDYCWYUGKSROMV3MKJQIFINJ5CLPYH6IRVFUMFJD3JI6VQKHX3YPHTWDIDBNMCBUKSY3P7SKAHHKR7PHQDSFRXZEWXA4XOUTALIQDGDYIEUCMDPWSYGDVT42DJ27CD27QKCR3UN7KF7EPIHGPR7GCRTBD6NFNB5MFIV6EPYE6RGXH6K2VN6O67WVPV5PLGYFIAKGHFCQNCPB4GL5IIBN4ARWFQ23OEMGXQRC77UCFGE7JOWTZG2KLEWZL5JBAVSZUYFDYFEFHXZNSJPWMFCADAJTUQ" +jdStorePageCookie = "YDYCWYUGKSROMV3MKJQIFINJ5CLPYH6IRVFUMFJD3JI6VQKHX3YPHTWDIDBNMCBUKSY3P7SKAHHKR7PHQDSFRXZEWXA4XOUTALIQDGDYIEUCMDPWSYGDVT42DJ27CD27QKCR3UN7KF7EPIHGPR7GCRTBD5DAHYMIODMDYESTI4PQWPK4CSWXGB2U4Y7R57ZUWN2T5LH4LE5SSAFFJCY53F5ZPCFR2RAUWYMCKHC4Y4QRFKYYLPHHZ2B3SCDWNLTVJOU24WJL4PVF3PPYDNTOLLXDABUFAZSE6C6CNOMI6L2TAK43JJIJQRQAQUQSU537ZFLVPGBYFDJYY" ebaiSource = "35957" ebaiSecret = "10013fbb7c2ddad7" @@ -229,6 +229,66 @@ getYLYTokenURL = "http://www.jxc4.com/v2/sys/GetYLYToken" storeName = "京西果园" +[jd] +httpport = 8089 +EnableDocs = false + +dbConnectStr = "root:WebServer@1@tcp(127.0.0.1:3306)/jd?charset=utf8mb4&loc=Local&parseTime=true" + +jdToken = "84541069-fbe2-424b-b625-9b2ba1d4c9e6" +jdAppKey = "5d5577a2506f41b8b4ec520ba83490f5" +jdSecret = "0b01b9eeb15b41dab1c3d05d95c17a26" +jdStorePageCookie = "YDYCWYUGKSROMV3MKJQIFINJ5CLPYH6IRVFUMFJD3JI6VQKHX3YPHTWDIDBNMCBUKSY3P7SKAHHKR7PHQDSFRXZEWXA4XOUTALIQDGDYIEUCMDPWSYGDVT42DJ27CD27QKCR3UN7KF7EPIHGPR7GCRTBD6NFNB5MFIV6EPYE6RGXH6K2VN6O67WVPV5PLGYFIAKGHFCQNCPB4GL5IIBN4ARWFQ23OEMGXQRC77UCFGE7JOWTZG2KLEWZL5JBAVSZUYFDYFEFHXZNSJPWMFCADAJTUQ" + +disableEbai = true +# ebaiSource = "35957" +# ebaiSecret = "10013fbb7c2ddad7" +# ebaiStorePageCookieWMUSS = "YBAABKPRplPSpTCX4YSUAvSg8dSjYpIwF3FzBsGEw7agNbNT90GnwfbAYdBU5cjRX%7EjwAAMxhrUGEheAUicBtSXDIeGB0hclFgZ2tcBlhhIlwwfRBHaV8pClctLEhIfSR6HDwXPC5nHBVTeBsrWjwHCjoXUCN1eS1NBKLzB9E9WREwhfALlGMDAJsPmAwAAO" +# ebaiStorePageCookieWMSTOKEN = "gAAA4OkFSZBsOayRIAnRqd24YRRVvWgRFE2w2CGtjKlAIsYg1sNHEIQlwsBKLzB5sulw9nVQAA0tyyFu-F2xVbAQAAi6OrHIFNnBwgJlQdmb8AAHssrx9_zgABBgAABQ" + +disableMtwm = true +# mtwmAppID = "4123" +# mtwmSecret = "df2c88338b85f830cebce2a9eab56628" +# mtwmCallbackURL = "http://callback-jxgy.jxc4.com" + +enableStoreWrite = true +enableJdStoreWrite = true +# enableEbaiStoreWrite = true +# enableMtwmStoreWrite = true + +disableMtps = true +# mtpsAppKey = "3c0a05d464c247c19d7ec13accc78605" +# mtpsSecret = "b1M}9?:sTbsB[OF2gNORnN(|(iy9rB8(`7]|[wGLnbmt`evfM>E:A90DjHAW:UPE" + +dadaIsProd = true +dadaCallbackURL = "http://callback-jd.jxc4.com/dadadelivery/msg" +dadaSourceID = "6660" + +weixinAppID = "wx2bb99eb5d2c9b82c" +weixinSecret = "6bbbed1443cc062c20a015a64c07a531" + +weixinMiniAppID = "wx2d6949f724b2541d" +weixinMiniSecret = "11f3c380551c4683c149990b004d6df9" + +wxpayNotifyURL = "http://callback-jd.jxc4.com/wxpay/msg/" + +backstageHost = "http://www-jd.jxc4.com" +wxBackstageHost = "http://wx-jd.jxc4.com" + +# dingdingAgentID = 258707199 +# dingdingAppKey = "dingtozhutfr98qgwc7d" +# dingdingSecret = "7EJ0HDbkxQri-O2RSaYUu7_ZwvvMKtRVHT8cpyfvIvK6A9n9HRwPNCNRJFuEDeT_" + +# dingdingQRCodeAppKey = "dingoaw990o1jm9jswvwib" +# dingdingQRCodeSecret = "N9dyC9qB84sauQPs4_JYrILMsG5Krqm9-PSSVJ8t9hb87rrHiFUirISxGF5G57RV" + +dingdingCallbackURL = "http://callback-jd.jxc4.com/dingding/msg" + +getWeixinTokenURL = "http://www.jxc4.com/v2/sys/GetWXToken" +getYLYTokenURL = "http://www.jxc4.com/v2/sys/GetYLYToken" + +storeName = "京西京东" + [test] jdToken = "df97f334-f7d8-4b36-9664-5784d8ae0baf" jdAppKey = "06692746f7224695ad4788ce340bc854" diff --git a/controllers/act.go b/controllers/act.go index 8f94495af..9163a28fb 100644 --- a/controllers/act.go +++ b/controllers/act.go @@ -315,7 +315,7 @@ func (c *ActController) ForceUpdateVendorPrice() { c.callForceUpdateVendorPrice(func(params *tActForceUpdateVendorPriceParams) (retVal interface{}, errCode string, err error) { var actStoreSkuList []*act.ActStoreSkuParam if err = jxutils.Strings2Objs(params.ActStoreSkuList, &actStoreSkuList); err == nil { - act.ForceUpdateVendorPrice(params.Ctx, params.VendorID, params.Type, actStoreSkuList, params.IsAsync) + retVal, err = act.ForceUpdateVendorPrice(params.Ctx, params.VendorID, params.Type, actStoreSkuList, params.IsAsync) } return retVal, "", err }) diff --git a/controllers/cms.go b/controllers/cms.go index e0c5d79ed..3d73e6e06 100644 --- a/controllers/cms.go +++ b/controllers/cms.go @@ -18,6 +18,7 @@ type CmsController struct { // @Title 得到地点(省,城市,区)信息 // @Description 得到地点(省,城市,区)信息。 +// @Param token header string false "认证token" // @Param keyword query string false "查询关键字(可以为空,为空表示不限制)" // @Param parentCode query int false "上级地点code,这个指的是国家标准CODE(中国为:100000,北京为:110000,北京市为:110100),不是数据库中的ID" // @Param level query int false "地点级别:省为1,市为2,区为3,注意直辖市也要分省与市级" diff --git a/controllers/cms_food_recipe.go b/controllers/cms_food_recipe.go index c5017f30c..95be21b8a 100644 --- a/controllers/cms_food_recipe.go +++ b/controllers/cms_food_recipe.go @@ -72,6 +72,7 @@ func (c *FoodRecipeController) UpdateFoodRecipe() { // @Title 查询菜谱列表 // @Description 查询菜谱列表 +// @Param token header string false "认证token" // @Param keyword query string false "关键字" // @Param authorID query string false "创建者ID" // @Param skuIDs query string false "skuID列表" @@ -92,6 +93,7 @@ func (c *FoodRecipeController) QueryFoodRecipes() { // @Title 得到我的推荐菜谱列表 // @Description 得到我的推荐菜谱列表 +// @Param token header string false "认证token" // @Param keyword query string false "关键字" // @Param offset query int false "菜谱列表起始序号(以0开始,缺省为0)" // @Param pageSize query int false "菜谱列表页大小(缺省为50,-1表示全部)" @@ -107,6 +109,7 @@ func (c *FoodRecipeController) GetRecommendFoodRecipes() { // @Title 得到菜谱详情 // @Description 得到菜谱详情 +// @Param token header string false "认证token" // @Param recipeID query int true "菜谱ID" // @Success 200 {object} controllers.CallResult // @Failure 200 {object} controllers.CallResult diff --git a/controllers/cms_sku.go b/controllers/cms_sku.go index e94bf11ec..164d6df80 100644 --- a/controllers/cms_sku.go +++ b/controllers/cms_sku.go @@ -31,6 +31,7 @@ func (c *SkuController) GetVendorCategories() { // @Title 得到商品类别 // @Description 得到商品类别(区别于厂商家SKU类别) +// @Param token header string false "认证token" // @Param parentID query int false "父ID,-1表示所有,缺省为-1" // @Success 200 {object} controllers.CallResult // @Failure 200 {object} controllers.CallResult diff --git a/controllers/cms_store.go b/controllers/cms_store.go index 22d1b4420..6d43d09c3 100644 --- a/controllers/cms_store.go +++ b/controllers/cms_store.go @@ -534,6 +534,7 @@ func (c *StoreController) SyncStoresCourierInfo() { // @Title 根据位置得到推荐门店列表 // @Description 根据位置得到推荐门店列表 +// @Param token header string false "认证token" // @Param lng query float64 true "经度" // @Param lat query float64 true "纬度" // @Param needWalkDistance query bool false "是否需要返回步行距离(且以步行距离排序)" diff --git a/controllers/cms_store_sku.go b/controllers/cms_store_sku.go index 3aa15fb22..61bfeaa45 100644 --- a/controllers/cms_store_sku.go +++ b/controllers/cms_store_sku.go @@ -59,6 +59,7 @@ func (c *StoreSkuController) GetStoreSkus() { // @Title 得到商家商品信息 // @Description 得到商家商品信息,如下条件之间是与的关系。对于没有认领的商品,按城市限制。但对于已经认领的商品就不限制了,因为已经在平台上可售,可以操作(改价等等) +// @Param token header string false "认证token" // @Param storeIDs query string false "门店ID" // @Param isFocus query bool true "是否已关注(认领)" // @Param keyword query string false "查询关键字(可以为空,为空表示不限制)" diff --git a/controllers/jx_order.go b/controllers/jx_order.go index 80a424c8c..4fe21002f 100644 --- a/controllers/jx_order.go +++ b/controllers/jx_order.go @@ -279,7 +279,6 @@ func (c *OrderController) ExportMTWaybills() { // @Param isJxFirst query bool false "排序是否京西订单优先(缺省为否)" // @Param adjustCount query int false "最小调整次数" // @Param mustInvoice query bool false "是否必须要求开发票" -// @Param isPurchase query bool false "是否是用户自已的订单,如果角色只有consumer,会被强制设为true" // @Param offset query int false "结果起始序号(以0开始,缺省为0)" // @Param pageSize query int false "结果页大小(缺省为50,-1表示全部)" // @Success 200 {object} controllers.CallResult diff --git a/controllers/jx_order2.go b/controllers/jx_order2.go index f59c01de5..8135d1a02 100644 --- a/controllers/jx_order2.go +++ b/controllers/jx_order2.go @@ -72,3 +72,23 @@ func (c *JxOrderController) GetOrderPay() { return retVal, "", err }) } + +// @Title 查询自己的订单 +// @Description 查询自己的订单 +// @Param token header string true "认证token" +// @Param vendorOrderID query string false "订单号,如果此项不为空,忽略其它所有查询条件" +// @Param keyword query string false "查询关键字" +// @Param fromDate query string false "开始日期(包含),格式(2006-01-02),如果订单号为空此项必须要求" +// @Param toDate query string false "结束日期(包含),格式(2006-01-02),如果订单号为空此项必须要求" +// @Param statuss query string false "订单状态列表[1,2,3],缺省不限制" +// @Param offset query int false "结果起始序号(以0开始,缺省为0)" +// @Param pageSize query int false "结果页大小(缺省为50,-1表示全部)" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /GetMyOrders [get] +func (c *JxOrderController) GetMyOrders() { + c.callGetMyOrders(func(params *tJxorderGetMyOrdersParams) (retVal interface{}, errCode string, err error) { + retVal, err = localjx.GetMyOrders(params.Ctx, params.FromDate, params.ToDate, params.MapData, params.Offset, params.PageSize) + return retVal, "", err + }) +} diff --git a/controllers/net_spider.go b/controllers/net_spider.go index d94268a10..8b2979ddb 100644 --- a/controllers/net_spider.go +++ b/controllers/net_spider.go @@ -66,8 +66,8 @@ func (c *NetSpiderController) QueryPageStores() { params.VendorID = -1 } var lng, lat, lng1, lat1, lng2, lat2 float64 - params.Offset = dao.FormalizePageOffset(params.Offset) - params.PageSize = dao.FormalizePageSize(params.PageSize) + params.Offset = jxutils.FormalizePageOffset(params.Offset) + params.PageSize = jxutils.FormalizePageSize(params.PageSize) offset := params.Offset pageSize := params.PageSize if params.Radius > 0 { diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index 85fd512be..ed1770ced 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -610,6 +610,15 @@ func init() { Filters: nil, Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:JxOrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:JxOrderController"], + beego.ControllerComments{ + Method: "GetMyOrders", + Router: `/GetMyOrders`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:JxOrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:JxOrderController"], beego.ControllerComments{ Method: "GetOrderPay",