From a051912b202a76ecc972345a0805b8b85ab2c39e Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 22 Jan 2019 14:45:24 +0800 Subject: [PATCH] - arrange weimob wsc order (to local store) --- business/jxutils/jxutils_cms.go | 16 ++++- business/model/dao/store.go | 55 ++++++++++++++++ business/partner/purchase/weimob/wsc/order.go | 64 ++++++++++++++++++- 3 files changed, 132 insertions(+), 3 deletions(-) diff --git a/business/jxutils/jxutils_cms.go b/business/jxutils/jxutils_cms.go index d8345d920..292f7a1c5 100644 --- a/business/jxutils/jxutils_cms.go +++ b/business/jxutils/jxutils_cms.go @@ -90,7 +90,10 @@ func GetPolygonFromCircle(lng, lat, distance float64, pointCount int) (points [] } func GetPolygonFromCircleStr(lng, lat, distance float64, pointCount int) string { - points := GetPolygonFromCircle(lng, lat, distance, pointCount) + return CoordinatePoints2Str(GetPolygonFromCircle(lng, lat, distance, pointCount)) +} + +func CoordinatePoints2Str(points [][2]float64) string { points2 := make([]string, len(points)) for k, v := range points { points2[k] = fmt.Sprintf("%.6f,%.6f", v[0], v[1]) @@ -98,6 +101,17 @@ func GetPolygonFromCircleStr(lng, lat, distance float64, pointCount int) string return strings.Join(points2, ";") } +func CoordinateStr2Points(pointsStr string) (points [][2]float64) { + strPoints := strings.Split(pointsStr, ";") + for _, v := range strPoints { + strPoint := strings.Split(v, ",") + if len(strPoint) >= 2 { + points = append(points, [2]float64{utils.Str2Float64(strPoint[0]), utils.Str2Float64(strPoint[1])}) + } + } + return points +} + func IntMap2List(intMap map[int]int) []int { retVal := make([]int, len(intMap)) index := 0 diff --git a/business/model/dao/store.go b/business/model/dao/store.go index 8fb3b832f..6196cfa23 100644 --- a/business/model/dao/store.go +++ b/business/model/dao/store.go @@ -39,3 +39,58 @@ func GetStoreDetail(db *DaoDB, storeID, vendorID int) (storeDetail *StoreDetail, } return nil, err } + +func GetPossibleStoresByPlaceName(db *DaoDB, cityName, provinceName string) (storeList []*StoreDetail, err error) { + sqlList := []string{ + ` + SELECT t1.*, t5.vendor_store_id + FROM store t1 + JOIN place t2 ON t2.code = t1.city_code AND t2.name = ? + LEFT JOIN store_map t5 ON t1.id = t5.store_id AND t5.vendor_id = ? AND t5.deleted_at = ? + WHERE t1.status = ? + `, + ` + SELECT t1.* + FROM store t1, t5.vendor_store_id + JOIN place t2 ON t2.code = t1.city_code + JOIN place t3 ON t3.code = t2.parent_code AND t3.name = ? + LEFT JOIN store_map t5 ON t1.id = t5.store_id AND t5.vendor_id = ? AND t5.deleted_at = ? + WHERE t1.status = ? + `, + ` + SELECT t1.*, t5.vendor_store_id + FROM store t1 + LEFT JOIN store_map t5 ON t1.id = t5.store_id AND t5.vendor_id = ? AND t5.deleted_at = ? + WHERE t1.status = ? + `, + } + sqlParamsList := [][]interface{}{ + []interface{}{ + cityName, + model.VendorIDWSC, + utils.DefaultTimeValue, + model.StoreStatusOpened, + }, + []interface{}{ + provinceName, + model.VendorIDWSC, + utils.DefaultTimeValue, + model.StoreStatusOpened, + }, + []interface{}{ + model.VendorIDWSC, + utils.DefaultTimeValue, + model.StoreStatusOpened, + }, + } + for k := range sqlList { + if err = GetRows(db, &storeList, sqlList[k], sqlParamsList[k]); err != nil { + return nil, err + } + if len(storeList) > 0 { + return storeList, nil + } + } + // 正常是不应该达到这里的 + return storeList, err +} diff --git a/business/partner/purchase/weimob/wsc/order.go b/business/partner/purchase/weimob/wsc/order.go index f6a8d7bd5..2fed4fded 100644 --- a/business/partner/purchase/weimob/wsc/order.go +++ b/business/partner/purchase/weimob/wsc/order.go @@ -1,12 +1,14 @@ package wsc import ( + "sort" "time" "git.rosy.net.cn/baseapi/platformapi/weimobapi" "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/business/model/dao" "git.rosy.net.cn/jx-callback/business/partner" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" @@ -137,6 +139,7 @@ func (p *PurchaseHandler) GetOrder(vendorOrderID string) (order *model.GoodsOrde order.SalePrice += sku.SalePrice * int64(sku.Count) order.Weight += sku.Weight * sku.Count } + p.arrangeSaleStore(order, utils.Interface2String(logisticsDeliveryDetail["receiverCity"]), utils.Interface2String(logisticsDeliveryDetail["receiverProvince"])) return order, err } @@ -149,8 +152,12 @@ func (p *PurchaseHandler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptI if !isAcceptIt { err = api.WeimobAPI.CancelOrder(utils.Str2Int64(order.VendorOrderID), "") } else { - // 微商城没有确认,只有取消,模拟接受 - p.postFakeMsg(utils.Str2Int64(order.VendorOrderID), FakeOrderStatusAccepted) + if jxutils.GetSaleStoreIDFromOrder(order) == 0 { + // 微商城没有确认,只有取消,模拟接受 + p.postFakeMsg(utils.Str2Int64(order.VendorOrderID), FakeOrderStatusAccepted) + } else { + err = api.WeimobAPI.CancelOrder(utils.Str2Int64(order.VendorOrderID), "没有找到合适的配送店") + } } } return err @@ -195,3 +202,56 @@ func (p *PurchaseHandler) postFakeMsg(orderNo int64, fakeStatus int) { OnCallbackMsg(msg) }() } + +func (p *PurchaseHandler) arrangeSaleStore(order *model.GoodsOrder, cityName, provinceName string) { + globals.SugarLogger.Debugf("arrangeSaleStore orderID:%s cityName:%s, provinceName:%s", order.VendorOrderID, cityName, provinceName) + const ( + maxTryStoreWhenArrange = 5 + ) + db := dao.GetDB() + storeList, err := dao.GetPossibleStoresByPlaceName(db, cityName, provinceName) + if err != nil { + globals.SugarLogger.Errorf("arrangeSaleStore failed with error:%v", err) + } + var selectedStore *model.Store + if len(storeList) > 0 { + distanceList := make(utils.SortList, 0) + userLng := jxutils.IntCoordinate2Standard(order.ConsigneeLng) + userLat := jxutils.IntCoordinate2Standard(order.ConsigneeLat) + for k, store := range storeList { + // 展示门店自身不参与排单 + if store.VendorStoreID != order.VendorStoreID { + sortItem := &utils.SortItem{ + CompareValue: int64(jxutils.EarthDistance(userLng, userLat, jxutils.IntCoordinate2Standard(store.Lng), jxutils.IntCoordinate2Standard(store.Lat)) * 1000), + Index: k, + } + distanceList = append(distanceList, sortItem) + } + } + sort.Sort(distanceList) + if len(distanceList) > maxTryStoreWhenArrange { + distanceList = distanceList[:maxTryStoreWhenArrange] + } + for _, v := range distanceList { + selectedStore = &storeList[v.Index].Store + if selectedStore.DeliveryRangeType == model.DeliveryRangeTypeRadius { + distance := v.CompareValue + if distance < utils.Str2Int64(selectedStore.DeliveryRange) { + break + } + } else { + points := jxutils.CoordinateStr2Points(selectedStore.DeliveryRange) + if utils.IsPointInPolygon(userLng, userLat, points) { + break + } + } + selectedStore = nil + } + } + if selectedStore != nil { + order.StoreID = selectedStore.ID + globals.SugarLogger.Debugf("arrangeSaleStore orderID:%s arranged to store:%d", order.VendorOrderID, selectedStore.ID) + } else { + globals.SugarLogger.Errorf("arrangeSaleStore orderID:%s 找不到门店", order.VendorOrderID) + } +}