This commit is contained in:
邹宗楠
2023-09-06 13:51:43 +08:00
parent a235007153
commit ab6db54205
26 changed files with 278 additions and 110 deletions

View File

@@ -2,14 +2,15 @@ package cms
import (
"fmt"
"git.rosy.net.cn/baseapi/platformapi/autonavi"
"git.rosy.net.cn/baseapi/platformapi/baidunavi"
"math"
"reflect"
"regexp"
"strconv"
"strings"
"time"
"git.rosy.net.cn/baseapi/platformapi/baidunavi"
"git.rosy.net.cn/jx-callback/business/partner/purchase/ebai"
"git.rosy.net.cn/baseapi/utils/errlist"
@@ -100,6 +101,9 @@ var (
},
},
}
AutonaviKeyList = []string{autonavi.AMAPCyclingPlanKey1, autonavi.AMAPCyclingPlanKey2, autonavi.AMAPCyclingPlanKey3, autonavi.AMAPCyclingPlanKey4, autonavi.AMAPCyclingPlanKey5}
AutonaviKeyIndex = 0
)
func InitServiceInfo(version string, buildTime time.Time, gitCommit string) {
@@ -586,8 +590,8 @@ func GetCityBankBranches(ctx *jxcontext.Context, cityCode int, bankCode string)
return info, err
}
// GetSToUWalkingDistance 获取商家与用户间步行距离
func GetSToURidingDistance(sLng, sLat, uLng, uLat float64) (stepInfo interface{}, err error) {
// GetSToURidingDistance 获取商家与用户间步行距离
func GetSToURidingDistance(sLng, sLat, uLng, uLat float64, orderId string) (stepInfo interface{}, err error) {
var coords []*baidunavi.Coordinate
coords = append(coords, &baidunavi.Coordinate{
Lng: sLng,
@@ -605,3 +609,109 @@ func GetSToURidingDistance(sLng, sLat, uLng, uLat float64) (stepInfo interface{}
}
return 0, err
}
// GetSToURidingDistance2 获取商家与用户间步行距离
func GetSToURidingDistance2(sLng, sLat, uLng, uLat float64, orderId string) (wayBill *model.Waybill, err error) {
var (
origin = fmt.Sprintf("%f,%f", sLng, sLat)
destination = fmt.Sprintf("%f,%f", uLng, uLat)
db = dao.GetDB()
)
for {
// 骑手坐标
waybills, err := dao.GetWaybills(db, orderId, nil)
if err != nil {
return nil, err
}
for _, v := range waybills {
if v.Status == model.WaybillStatusCanceled {
continue
}
//if v.Status >= model.WaybillStatusAccepted && v.Status <= model.WaybillStatusCanceled {
// 获取骑行路线图
if v.OriginalData == "" {
originalData, distance, durationTime, err := GetCyclingLine(origin, destination)
if err != nil {
return nil, err
}
v.OriginalData = strings.Join(originalData, ";")
v.Distance = distance
v.DurationTime = durationTime
}
//}
// 如果是三方配送,更新骑手信息
if handler := partner.GetDeliveryPlatformFromVendorID(v.WaybillVendorID); handler != nil {
riderInfo, _ := handler.Handler.GetRiderInfo(v.VendorOrderID, v.ID+1000000, v.VendorWaybillID)
if riderInfo != nil {
v.CourierCoordinate = fmt.Sprintf("%s,%s", riderInfo.Longitude, riderInfo.Latitude)
if (v.CourierName == "" || v.CourierMobile == "") && riderInfo.CourierName != "" {
v.CourierName = riderInfo.CourierName
v.CourierMobile = riderInfo.CourierPhone
}
}
}
// 如果是平台配送,获取骑手信息
if handler := partner.GetPurchaseOrderHandlerFromVendorID(v.WaybillVendorID); handler != nil {
riderInfo, _ := handler.OrderLogisticsStatus(v.VendorOrderID)
if riderInfo != nil {
v.CourierCoordinate = fmt.Sprintf("%s,%s", riderInfo.Longitude, riderInfo.Latitude)
if (v.CourierName == "" || v.CourierMobile == "") && riderInfo.CourierName != "" {
v.CourierName = riderInfo.CourierName
v.CourierMobile = riderInfo.CourierPhone
}
}
}
// 当这个运单为假物流/门店真实自送/获取运单骑手信息为空的时候使用假的骑手信息
if v.WaybillVendorID == model.VendorJXFakeWL || v.WaybillVendorID == model.VendorIDUnknown || v.CourierCoordinate == "" {
riderLine := strings.Split(v.OriginalData, ";") // 路线坐标点
courierDistance := float64(time.Now().Unix()-v.WaybillCreatedAt.Unix()) * (float64(v.Distance) / float64(v.DurationTime)) // 当前骑手骑行距离
nowCourierDrop := int64(math.Ceil((courierDistance / float64(v.Distance)) * float64(len(riderLine)))) // 当前骑手骑行距离,占中的骑行距离百分比.
if nowCourierDrop >= int64(len(riderLine)) {
v.CourierCoordinate = riderLine[nowCourierDrop-2]
}
if nowCourierDrop <= 0 {
v.CourierCoordinate = riderLine[0]
}
if v.Status == model.WaybillStatusDelivered {
v.CourierCoordinate = riderLine[len(riderLine)-1]
}
}
dao.UpdateEntity(db, v, "OriginalData", "CourierCoordinate", "Distance", "DurationTime")
if v.CourierName == "" || v.CourierMobile == "" {
v.CourierName = "暂无骑手"
v.CourierMobile = "暂无电话"
}
return v, nil
}
}
}
// GetCyclingLine 获取骑行路线
func GetCyclingLine(origin, destination string) (polyLineList []string, distance, duration int64, errCode error) {
for {
polyLineList, distance, duration, errCode = api.AutonaviAPI.GetCyclingPlan(origin, destination)
if errCode != nil {
ddmsg.SendUserMessage(dingdingapi.MsgTyeText, "2452A93EEB9111EC9B06525400E86DC0", "高德地图骑行方案获取错误:", utils.Format4Output(errCode, false))
}
if errCode != nil && errCode.Error() == autonavi.DAILYQUERYOVERLIMIT {
AutonaviKeyIndex += model.YES
if AutonaviKeyIndex >= len(AutonaviKeyList) {
AutonaviKeyIndex = model.NO
}
api.AutonaviAPI.SetKey(AutonaviKeyList[AutonaviKeyIndex])
} else if errCode != nil {
return nil, 0, 0, errCode
}
if len(polyLineList) > model.NO {
return polyLineList, distance, duration, errCode
}
}
}