- arrange weimob wsc order (to local store)

This commit is contained in:
gazebo
2019-01-22 14:45:24 +08:00
parent d0bed4f40a
commit a051912b20
3 changed files with 132 additions and 3 deletions

View File

@@ -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

View File

@@ -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
}

View File

@@ -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)
}
}