- arrange weimob wsc order (to local store)
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user