微信小程序获取当前订单+导航

map.js

// 拒绝授权后,弹框提示是否手动打开位置授权
export function openConfirm() {
    return new Promise((resolve, reject) => {
        uni.showModal({
            title: "请求授权当前位置",
            content: "我们需要获取地理位置信息,为您提供导航",
            success: (res) => {
                if (res.confirm) {
                    uni.openSetting().then((res) => {
                        if (res[1].authSetting["scope.userLocation"] === true) {
                            resolve(); // 打开地图权限设置
                        } else {
                            reject();
                        }
                    });
                } else if (res.cancel) {
                    reject();
                }
            },
        });
    });
}
// 彻底拒绝位置获取
export function rejectGetLocation() {
    uni.showToast({
        title: "你拒绝了授权,无法获得周边信息",
        icon: "none",
        duration: 2000,
    });
}


//进行经纬度转换为距离的计算
export function Rad(d) {
    return d * Math.PI / 180.0; //经纬度转换成三角函数中度分表形式。
}
/*
             计算距离,参数分别为第一点的纬度,经度;第二点的纬度,经度
             默认单位km
            */
export function getMapDistance(lat1, lng1, lat2, lng2) {
    var radLat1 = Rad(lat1);
    var radLat2 = Rad(lat2);
    var a = radLat1 - radLat2;
    var b = Rad(lng1) - Rad(lng2);
    var s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) +
        Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)));
    s = s * 6378.137; // EARTH_RADIUS;
    s = Math.round(s * 10000) / 10000; //输出为公里
    //s=s.toFixed(2);
    return s;
}
//计算距离
//   初次位置授权
export function getAuthorize() {
    return new Promise((resolve, reject) => {
        uni.authorize({
            scope: "scope.userLocation",
            success: () => {
                resolve(); // 允许授权
            },
            fail: () => {
                reject(); // 拒绝授权
            },
        });
    });
}
//打开地图
export function openMap(lon, lat) {
    console.log("获取经纬度ssssfff", lon, lat);
    //打开地图,并将门店位置传入
    uni.getLocation({
        success: res => {
            // res.latitude=lat;
            // res.longitude=lon;
            console.log('location success', parseFloat(lat), parseFloat(lon))
            uni.openLocation({
                latitude: parseFloat(lat),
                longitude: parseFloat(lon),
                scale: 18
            })
        }

    })
}

 

主要看onshow和getLocationInfo

 

<!-- 服务计划 -->
<template>
    <view>
        <order-box v-for="(order, index) in orders" :key="index" :serviceName="order.name" :distance="order.distance"
            :name="order.contactPerson" :phone="order.contact" :startTime="order.createTime"
            :gdnumber="order.workOrderId" :fwtype="order.serviceType" :address="order.address" :buttons="order.buttons"
            :orderIndex="index" @invokeMethod="invokeMethod" @navigateToDetail="navigateToDetail" />

        <view>
            <!-- 普通弹窗 -->
            <uni-popup ref="popup" background-color="#fff">
                <view class="popup-content padding" :class="{ 'popup-height': type === 'left' || type === 'right' }">
                    <view class="text" style="text-align: center;width: 50vw;font-size:16px;font-weight: bold;">开始服务
                    </view>
                    <!-- 表单部分 -->
                    <view class="content margin-top">

                        <!-- 图片上传 -->
                        <view class="form-item">
                            <view class="label" style="width:30%;">图片</view>
                            <view class="image-upload">
                                <img v-if="image" :src="image" alt="Uploaded Image" />
                                <view v-else class="image-placeholder" @click="uploadImage">📷</view>
                            </view>
                        </view>

                        <!-- 位置显示 -->
                        <view class="form-item ">
                            <view class="label" style="width: 30%;">位置</view>
                            <view class="coordinates flex flex-direction">
                                <text>纬度: {{ latitude }} </text>
                                <text>经度: {{ longitude }}</text>
                            </view>
                        </view>
                    </view>

                    <!-- 按钮部分 -->
                    <view class="footer ">
                        <view class="btn cancel" @click="cancel" style="margin-right: 20px;">取消</view>
                        <view class="btn confirm" @click="confirm">确定</view>
                    </view>
                </view>
            </uni-popup>
        </view>
    </view>
</template>

<script>
    import OrderBox from '@/components/OrderBox/OrderBox.vue'
    import {
        getStaffOrderPlan
    } from '@/api/choose/index.js'
    import {
        getAuthorize,openMap
    } from '../../utils/map.js'
    
    export default {
        components: {
            OrderBox
        },
        data() {
            return {
                status: '0',
                latitude: '117.237508',
                longitude: '31.852055',
                orders: []
            };
        },
        onReady() {
            //   wx请求获取位置权限
            getAuthorize()
                .then(() => {
                    //   同意后获取
                    this.getLocationInfo();
                    console.log("启用")
                })
                .catch(() => {
                    //   不同意给出弹框,再次确认
                    openConfirm()
                        .then(() => {
                            this.getLocationInfo();
                        })
                        .catch(() => {
                            rejectGetLocation();
                        });
                });
        },
        methods: {
            // 确认授权后,获取用户位置
            getLocationInfo() {
                const that = this;
                console.log("世界经济")
            
                uni.getLocation({
                    type: "gcj02",
                    success: function(res) {
                        // 暂时
                        that.longitude = res.longitude; //118.787575;
                        that.latitude = res.latitude; //32.05024;
                        console.log("获取当前的用户经度", that.longitude);
                        console.log("获取当前的用户纬度", that.latitude);
                        var long = 0;
                        var lat = 0;
                        //小数点保留六位  经度
                        if (that.longitude.toString().indexOf('.') > 0) {
                            const longlatsplit = that.longitude.toString().split('.');
                            if (longlatsplit.length >= 2) {
                                long = parseFloat(longlatsplit[0] === "" ? 0 : longlatsplit[0]) + parseFloat(
                                    "." + longlatsplit[1].slice(0, 6));
                            }
                        }
                        if (that.latitude.toString().indexOf('.') > 0) {
                            const longlatsplit1 = that.latitude.toString().split('.');
                            if (longlatsplit1.length >= 2) {
                                lat = parseFloat(longlatsplit1[0] === "" ? 0 : longlatsplit1[0]) + parseFloat(
                                    "." + longlatsplit1[1].slice(0, 6));
                            }
                        }
                        getStaffOrderPlan(that.status, that.latitude, that.longitude)
                            .then(res => {
                                console.log(that.status)
                                console.log(that.latitude)
                                console.log(that.longitude)
                                console.log("返回的内容:", res); // 打印返回的内容
                                that.orders = res.data.map(order => {
                                    return {
                                        ...order,
                                        buttons: [{
                                                label: '联系客户',
                                                onClick: 'handleConfirmAcceptOrder',
                                                style: {
                                                    backgroundColor: '#FAC427',
                                                    color: '#ffffff',
                                                    marginLeft: '8px',
                                                    marginRight: '0px'
                                                }
                                            },
                                            {
                                                label: '导航',
                                                onClick: 'handleRejectOrder',
                                                style: {
                                                    backgroundColor: '#00B96B',
                                                    color: '#ffffff',
                                                    marginLeft: '8px',
                                                    marginRight: '0px'
                                                }
                                            },
                                            {
                                                label: '前往',
                                                onClick: 'handleQianWang',
                                                style: {
                                                    backgroundColor: '#D3E3FD',
                                                    color: '#ffffff',
                                                    marginLeft: '8px',
                                                    marginRight: '0px'
                                                }
                                            }
                                        ]
                                    };
                                });
                            })
                            .catch(error => {
                                console.error(error);
                            });
                    },
                    fail: function(res) {
                        uni.showToast({
                            title: "定位服务未开启"
                        })
                    }
            
                });
                console.log("世界经济" + that.data)
            },
            handleConfirmAcceptOrder(index) {
                uni.showModal({
                    title: '提示',
                    content: '请确定当前的登录使用的手机号是本机号码,否则会呼叫失败',
                    success: function(res) {
                        if (res.confirm) {
                            console.log(`第${index+1}条: 用户点击确定`);
                        } else if (res.cancel) {
                            console.log(`第${index+1}条: 用户点击取消`);
                        }
                    }
                });
            },
            handleRejectOrder(index) {
                console.log(`第${index+1}条: 用户点击导航`);
                openMap(this.longitude,this.latitude)
            },
            handleQianWang(index) {
                console.log(`第${index+1}条: 用户点击前往`);
                this.$refs.popup.open();
            },
            dialogInputConfirm(e) {
                console.log('输入框内容: ', e.detail.value);
                this.$refs.inputDialog.close();
            },
            invokeMethod(methodName, index) {
                if (this[methodName]) {
                    this[methodName](index);
                } else {
                    console.warn(`Method ${methodName} is not defined`);
                }
            },
            navigateToDetail(index) {
                const order = this.orders[index];
                uni.navigateTo({
                    url: '/pages/order/OrderDetail/OrderDetail?order=' + encodeURIComponent(JSON.stringify(order))
                });
            },
            uploadImage() {
                // 图片上传逻辑
                // 这里可以使用 HTML 的 <input type="file">,或在小程序中使用 API 来上传图片
            },
            cancel() {
                // 取消逻辑
                console.log('取消');
                this.$refs.popup.close();
            },
            confirm() {
                // 确定逻辑
                console.log('纬度:', this.latitude, '经度:', this.longitude);
                this.$refs.popup.close();
            },
        }
    }
</script>

<style scoped>
    .modal {
        width: 300px;
        padding: 16px;
        background-color: white;
        border-radius: 8px;
        box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.1);
    }

    .header {
        text-align: center;
        margin-bottom: 16px;
    }

    .title {
        color: red;
        font-size: 16px;
    }

    .content {
        margin-bottom: 16px;
    }

    .form-item {
        display: flex;
        margin-bottom: 12px;
    }

    .label {
        color: #666;
    }

    .input {
        border: 1px solid #ddd;
        padding: 4px;
        width: 150px;
    }

    .image-upload {
        display: flex;
        justify-content: center;
        align-items: center;
        border: 1px solid #ddd;
        width: 100px;
        height: 100px;
    }

    .image-placeholder {
        display: flex;
        justify-content: center;
        align-items: center;
        width: 100%;
        height: 100%;
        background-color: #f5f5f5;
        cursor: pointer;
    }

    .coordinates {
        color: #666;
    }

    .footer {
        display: flex;
        justify-content: space-between;
        text-align: center;
    }

    .btn {
        padding: 2px 16px;
        border: none;
        border-radius: 4px;
        cursor: pointer;
        margin: 0 !important;
        width: 20vw;
        font-size: 16px;
    }

    .cancel {
        background-color: #f0f0f0;
        color: #333;
    }

    .confirm {
        background-color: #FAC427;
        color: white;
    }
</style>

 

posted @ 2024-10-18 15:50  有只小菜猫  阅读(19)  评论(0编辑  收藏  举报