diff --git a/business/jxcallback/orderman/order.go b/business/jxcallback/orderman/order.go index 89bc4004b..bf62b7346 100644 --- a/business/jxcallback/orderman/order.go +++ b/business/jxcallback/orderman/order.go @@ -1321,6 +1321,139 @@ func setJdsOrderSeq(order *model.GoodsOrder) (err error) { return err } +func MergeJdsOrders(ctx *jxcontext.Context, vendorOrderIDs []string) (vendorOrderIDJds string, err error) { + globals.SugarLogger.Debugf("jds MergeJdsOrders vendorOrderIDs: %v", vendorOrderIDs) + var ( + db = dao.GetDB() + orders []*model.GoodsOrder + orderSkus []*model.OrderSku + orderIDs []string + storeDuplicate = make(map[int]int) + storeID int + ) + for _, vendorOrderID := range vendorOrderIDs { + order, _ := dao.GetSimpleOrder(db, vendorOrderID) + if err != nil || order == nil { + return "", fmt.Errorf("未查询到该订单!订单号:[%v]", vendorOrderID) + } + if order.Status >= model.OrderStatusDelivering && order.Status != model.OrderStatusCanceled { + return "", fmt.Errorf("暂不支持此状态的订单进行转移!订单号:[%v]", vendorOrderID) + } + if order.VendorID != model.VendorIDJDShop { + return "", fmt.Errorf("暂不支持非京狗的订单进行转移!订单号:[%v]", vendorOrderID) + } + storeDuplicate[jxutils.GetSaleStoreIDFromOrder(order)] = jxutils.GetSaleStoreIDFromOrder(order) + orders = append(orders, order) + + //订单商品 + skus, _ := dao.GetSimpleOrderSkus(db, order.VendorOrderID, nil) + orderSkus = append(orderSkus, skus...) + + orderIDs = append(orderIDs, vendorOrderID) + } + if len(storeDuplicate) > 1 { + return "", fmt.Errorf("只能选择相同门店的订单进行合并!") + } else { + storeID = jxutils.GetSaleStoreIDFromOrder(orders[0]) + } + for _, order := range orders { + var waybill *model.Waybill + //将订单和运单取消 + waybills, err := dao.GetWaybills(db, order.VendorOrderID) + if err != nil { + return "", err + } + if len(waybills) > 0 { + for _, v := range waybills { + if v.Status != model.WaybillStatusCanceled { + waybill = v + } + } + if waybill != nil { + if waybill.WaybillVendorID != model.VendorIDJDWL { + if handler := partner.GetDeliveryPlatformFromVendorID(waybill.WaybillVendorID); handler != nil { + err = handler.Handler.CancelWaybill(waybill, 0, "订单合并被取消") + } + } + } + } + if err = jdshop.ChangeOrderStatus(order.VendorOrderID, model.OrderStatusCanceled, "订单合并被取消"); err != nil { + return "", err + } + } + //重新构建order的数据 + storeMaps, err := dao.GetStoresMapList(db, []int{model.VendorIDJDShop}, []int{storeID}, nil, model.StoreStatusAll, model.StoreIsSyncAll, "", "") + if err != nil || len(storeMaps) == 0 { + return "", fmt.Errorf("该门店未绑定京狗平台,请先绑定后再转移!门店:[%v]", storeID) + } + stores, _ := dao.GetStoreList(db, []int{storeID}, nil, nil, nil, "") + store := stores[0] + order := &model.GoodsOrder{ + StoreID: storeID, + StoreName: store.Name, + VendorStoreID: storeMaps[0].VendorStoreID, + VendorOrderID: utils.Int64ToStr(utils.Str2Int64(orders[0].VendorOrderID2)*10000) + utils.Int2Str(99), + VendorOrderID2: strings.Join(orderIDs, ","), + Status: model.OrderStatusNew, + } + setJdsOrderSeq(order) + var ( + opentime1 = jxutils.JxOperationTime2TimeByDate(store.OpenTime1, time.Now()) + opentime2 = jxutils.JxOperationTime2TimeByDate(store.OpenTime2, time.Now()) + closetime1 = jxutils.JxOperationTime2TimeByDate(store.CloseTime1, time.Now()) + closetime2 = jxutils.JxOperationTime2TimeByDate(store.CloseTime2, time.Now()) + orderCreatedAt = time.Now() + ) + if store.OpenTime1 == 0 || store.CloseTime1 == 0 { + return "", fmt.Errorf("该门店没有营业时间,不能接单!门店:[%v]", storeID) + } + if !(orderCreatedAt.Sub(opentime1) >= 0 && orderCreatedAt.Sub(closetime1) <= 0) { + if store.OpenTime2 != 0 && store.CloseTime2 != 0 { + if !(orderCreatedAt.Sub(opentime2) >= 0 && orderCreatedAt.Sub(closetime2) <= 0) { + if orderCreatedAt.Sub(opentime1) < 0 { + order.ExpectedDeliveredTime = opentime1 + order.BusinessType = model.BusinessTypeDingshida + } else { + if orderCreatedAt.Sub(opentime2) < 0 { + order.ExpectedDeliveredTime = opentime2 + } else { + order.ExpectedDeliveredTime = opentime1.AddDate(0, 0, 1) + } + order.BusinessType = model.BusinessTypeDingshida + } + } + } else { + if orderCreatedAt.Sub(opentime1) < 0 { + order.ExpectedDeliveredTime = opentime1 + } else { + order.ExpectedDeliveredTime = opentime1.AddDate(0, 0, 1) + } + order.BusinessType = model.BusinessTypeDingshida + } + } else { + order.BusinessType = model.BusinessTypeImmediate + order.ExpectedDeliveredTime = time.Now().Add(time.Hour) + } + //结算类型 + if store.PayPercentage < 50 { + order.EarningType = model.EarningTypePoints + } else { + order.EarningType = model.EarningTypeQuote + } + if storeID != model.JdShopMainStoreID { + order.DeliveryFlag = model.NO + } + //skus + for _, sku := range orderSkus { + sku.VendorOrderID = order.VendorOrderID + sku.ID = 0 + } + order.Skus = orderSkus + err = partner.CurOrderManager.OnOrderNew(order, model.Order2Status(order)) + vendorOrderIDJds = order.VendorOrderID + return vendorOrderIDJds, err +} + func TransferJdsOrder(ctx *jxcontext.Context, vendorOrderID string, storeID int) (vendorOrderIDJds string, err error) { globals.SugarLogger.Debugf("jds TransferJdsOrder vendorOrderID: %v, storeID : %v", vendorOrderID, storeID) var ( @@ -1354,10 +1487,8 @@ func TransferJdsOrder(ctx *jxcontext.Context, vendorOrderID string, storeID int) } if waybill != nil { if waybill.WaybillVendorID != model.VendorIDJDWL { - handler := partner.DeliveryPlatformHandlers[waybill.WaybillVendorID] - err = handler.Handler.CancelWaybill(waybill, 0, "订单转移被取消") - if err != nil { - return "", err + if handler := partner.GetDeliveryPlatformFromVendorID(waybill.WaybillVendorID); handler != nil { + err = handler.Handler.CancelWaybill(waybill, 0, "订单转移被取消") } } } diff --git a/business/partner/purchase/jx/localjx/order.go b/business/partner/purchase/jx/localjx/order.go index 76b87e0cc..389ca3740 100644 --- a/business/partner/purchase/jx/localjx/order.go +++ b/business/partner/purchase/jx/localjx/order.go @@ -118,6 +118,7 @@ type JxOrderInfo struct { IsBuyNowPrice int `json:"isBuyNowPrice"` IsPriceDefend int `json:"isPriceDefend"` OrderID2 string `json:"-"` + UserID string `json:"userID"` } type DeliveryTimeItem struct { @@ -878,6 +879,9 @@ func generateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64 if jxOrder.OrderType == model.OrderTypeDefendPrice { outJxOrder.Skus[0].DefendPrice = jxOrder.Skus[0].DefendPrice } + if jxOrder.UserID != "" { + outJxOrder.UserID = jxOrder.UserID + } } else { outJxOrder = nil deliveryAddress = nil @@ -954,6 +958,12 @@ func jxOrder2GoodsOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, deliveryAd } order.OrderCreatedAt = order.StatusTime order.VendorUserID = order.UserID + if order.UserID == "" && order.VendorUserID == "" { + if jxOrder.UserID != "" { + order.UserID = jxOrder.UserID + order.VendorUserID = jxOrder.UserID + } + } if jxOrder.ExpectedDeliveredTimestamp != 0 { order.ExpectedDeliveredTime = utils.Timestamp2Time(jxOrder.ExpectedDeliveredTimestamp) order.BusinessType = model.BusinessTypeDingshida @@ -1963,6 +1973,8 @@ func CreateOrderByPriceDefend(ctx *jxcontext.Context) (err error) { userOrderMap[v.AddressID] = append(userOrderMap[v.AddressID], v) } for kk, vv := range userOrderMap { + addressList, _, _ := dao.QueryUserDeliveryAddress(db, kk, nil, 0, 0) + address := addressList[0] if len(vv) == 1 { jxOrder := &JxOrderInfo{ BuyerComment: "守价订单", @@ -1975,6 +1987,7 @@ func CreateOrderByPriceDefend(ctx *jxcontext.Context) (err error) { }, IsPriceDefend: model.YES, OrderID: utils.Str2Int64(vv[0].VendorOrderID), + UserID: address.UserID, } if _, err := CreateOrder(ctx, jxOrder, kk, OrderCreateTypeNormal, 0, false); err == nil { err = SettleDiscountActByPriceDefend(ctx, vv[0], false) @@ -1989,6 +2002,7 @@ func CreateOrderByPriceDefend(ctx *jxcontext.Context) (err error) { StoreID: vv[0].StoreID, IsPriceDefend: model.YES, OrderID: GenOrderNo(ctx), + UserID: address.UserID, } for _, priceDefend := range vv { sku := &JxSkuInfo{ diff --git a/controllers/jx_order.go b/controllers/jx_order.go index fcc814a48..b4367b17d 100644 --- a/controllers/jx_order.go +++ b/controllers/jx_order.go @@ -1077,6 +1077,20 @@ func (c *OrderController) TransferJdsOrder() { }) } +// @Title 合并订单(京东商城用) +// @Description 合并订单(京东商城用) +// @Param token header string true "认证token" +// @Param vendorOrderIDs formData string true "订单号s" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /MergeJdsOrders [post] +func (c *OrderController) MergeJdsOrders() { + c.callMergeJdsOrders(func(params *tOrderMergeJdsOrdersParams) (retVal interface{}, errCode string, err error) { + + return retVal, "", err + }) +} + // @Title 京东商城订单发送京东物流 // @Description 京东商城订单发送京东物流 // @Param token header string true "认证token" diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index fc918404a..cc4663135 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -1224,6 +1224,15 @@ func init() { Filters: nil, Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"], + beego.ControllerComments{ + Method: "MergeJdsOrders", + Router: `/MergeJdsOrders`, + AllowHTTPMethods: []string{"post"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"], beego.ControllerComments{ Method: "PartRefundOrder",