doum
5 天以前 4c05c83588cdf21c1a8da3e41ad09dfc4f043b55
支付宝支付ddd
已修改4个文件
600 ■■■■ 文件已修改
small-program/pages/delivery-order-detail/delivery-order-detail.vue 398 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
small-program/pages/evaluate/evaluate.vue 173 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
small-program/pages/itinerary/itinerary.vue 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
small-program/utils/http.api.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
small-program/pages/delivery-order-detail/delivery-order-detail.vue
@@ -1,21 +1,21 @@
<template>
    <view class="detail">
        <view class="head" :style="{ height: statusbarHeight + navHeight + 'px' }">
        <view :class="info.type === 1?'head head1':'head head0'" :style="{ height: statusbarHeight + navHeight + 'px' }">
            <view :style="{width: '100%', height: statusbarHeight + 'px'}"></view>
            <view class="head-nav" :style="{width: '100%', height: navHeight + 'px'}">
                <image src="/static/icon/nav_ic_back.png" mode="widthFix"></image>
                <image src="/static/icon/nav_ic_back.png" mode="widthFix"  @click="goBack"></image>
                <text>寄存订单</text>
                <image src="/static/icon/nav_ic_back.png" mode="widthFix" style="opacity: 0;"></image>
                <image src="/static/icon/nav_ic_back.png" @click="goBack" mode="widthFix" style="opacity: 0;"></image>
            </view>
        </view>
        <view :style="{ width: '100%', height: statusbarHeight + navHeight + 'px' }"></view>
        <view class="nr">
        <view :class="info.type === 1?'nr head1':'nr head0'">
            <view class="nr-status">
                <text>待配送</text>
                <view class="nr-status-type">寄送</view>
                <view class="nr-status-type1">寄送</view>
                <text>{{info.statusName|| ''}}</text>
                <view class="nr-status-type1" v-if="info.type === 0">就地寄存</view>
                <view class="nr-status-type" v-else>同城寄送</view>
            </view>
            <view class="nr-desc">门店已接单,正在为您安排配送司机~</view>
            <view class="nr-desc" v-if="info.statusDesc">{{info.statusDesc || ''}}</view>
            <view class="item" style="padding: 10rpx;">
                <map name="mapAddr"></map>
            </view>
@@ -25,44 +25,44 @@
                        <view class="ji bg">寄</view>
                        <view class="xiantiao"></view>
                        <view class="addr-item-top">
                            <text>安徽省合肥市蜀山区莲花科技产业园F401</text>
                            <text>{{info.depositShopName || ''}}</text>
                            <image src="/static/icon/ar_jicundian@2x.png" mode="widthFix"></image>
                        </view>
                        <text>张海涛 18733987653</text>
                        <text>{{info.takeUser || ''}} {{info.takePhone || ''}}</text>
                    </view>
                    <view class="addr-item">
                        <view class="ji bg1">收</view>
                        <view class="addr-item-top">
                            <text>安徽省合肥市蜀山区莲花科技产业园F401</text>
                            <text>{{info.takeShopName || info.takeLocation || ''}}</text>
                            <image src="/static/icon/ar_jicundian@2x.png" mode="widthFix"></image>
                        </view>
                        <text>张海涛 18733987653</text>
                        <text>{{info.takeUser || ''}} {{info.takePhone || ''}}</text>
                    </view>
                </view>
                <view class="item-qrcode">
                    <image src="/static/image/btn_upload@2x.png" mode="widthFix"></image>
                    <text>767889</text>
                    <text>{{info.memberVerifyCode || ''}}</text>
                    <text>取件码</text>
                </view>
                <view class="item-x"></view>
                <view class="item-list">
                    <view class="item-list-row">
                        <view class="item-form-label">预计到店时间</view>
                        <view class="item-form-val">2026-04-12 12:00</view>
                        <view class="item-form-val">{{info.expectedDepositTime || ''}}</view>
                    </view>
                    <view class="item-list-row">
                        <view class="item-form-label">预计取件时间</view>
                        <view class="item-form-val">2026-04-14 12:00</view>
                        <view class="item-form-val">{{info.expectedTakeTime || ''}}</view>
                    </view>
                    <view class="item-list-row">
                        <view class="item-form-label">物品名称</view>
                        <view class="item-form-val">衣服</view>
                        <view class="item-form-val">{{info.typeName || ''}}</view>
                    </view>
                    <view class="item-list-row">
                        <view class="item-form-label">物品照片</view>
                        <view class="item-form-list">
                            <view class="item-form-list-row">
                                <image src="/static/image/tx@2x.png" mode="widthFix"></image>
                        <view class="item-form-list" v-if="info.orderImages && info.orderImages.length">
                            <view class="item-form-list-row" v-for="(item,index) in info.orderImages" key="item">
                                <image :src="item" mode="widthFix" @click="previewImage(info.orderImages,index)"></image>
                            </view>
                        </view>
                    </view>
@@ -72,60 +72,42 @@
                <view class="tuikuan">
                    <view class="tuikuan-top">
                        <text>退款金额</text>
                        <text>115.00</text>
                        <text>¥{{((info.refundAmount || 0)/100).toFixed(2)}}</text>
                    </view>
                    <view class="tuikuan-bottom">
                        <text>已退回您的支付账户</text>
                        <text>2026-04-12 12:32:00</text>
                        <text v-if="info.refundStatus === 0">退款中</text>
                        <text v-if="info.refundStatus === 1">已退回您的支付账户</text>
                        <text v-if="info.refundStatus === 2">退款失败</text>
                        <text>{{info.refundTime || ''}}</text>
                    </view>
                </view>
            </view>
            <view class="item">
            <view class="item" v-if="info.detailList">
                <view class="xl">
                    <view class="xl-item">
                    <view v-for="goods in info.detailList " :key="goods.luggageName" class="xl-item">
                        <view class="xl-item-top">
                            <text>大件行李箱</text>
                            <text>¥35</text>
                            <text>{{ goods.luggageName ||'' }}</text>
                            <text>¥{{((goods.subtotal || 0)/100).toFixed(2) }}</text>
                        </view>
                        <view class="xl-item-bottom">
                            <text>24-28寸</text>
                            <text>x1</text>
                            <text>{{ goods.luggageDetail || '' }}</text>
                            <text>x{{ goods.num || 1}}</text>
                        </view>
                    </view>
                    <view class="xl-item">
                        <view class="xl-item-top">
                            <text>中件行李箱</text>
                            <text>¥35</text>
                        </view>
                        <view class="xl-item-bottom">
                            <text>24-28寸</text>
                            <text>x1</text>
                        </view>
                    </view>
                    <view class="xl-item">
                        <view class="xl-item-top">
                            <text>小件行李箱</text>
                            <text>¥35</text>
                        </view>
                        <view class="xl-item-bottom">
                            <text>24-28寸</text>
                            <text>x1</text>
                        </view>
                    </view>
                    </view>
                </view>
                <view class="item-x"></view>
                <view class="item-list">
                    <view class="item-list-row">
                        <view class="item-form-label" style="color: #333333; font-size: 28rpx;">配送费</view>
                        <view class="item-form-val" style="color: #333333; font-size: 24rpx;">¥105.00</view>
                        <view class="item-form-label" style="color: #333333; font-size: 28rpx;">报价金额</view>
                        <view class="item-form-val" style="color: #333333; font-size: 24rpx;">¥{{((info.declaredAmount || 0)/100).toFixed(2)}}</view>
                    </view>
                    <view class="item-list-row">
                        <view class="item-form-label" style="color: #333333; font-size: 28rpx;">行李保费</view>
                        <view class="item-form-val" style="color: #333333; font-size: 24rpx;">¥10.00</view>
                        <view class="item-form-val" style="color: #333333; font-size: 24rpx;">¥{{((info.declaredFee || 0)/100).toFixed(2)}}</view>
                    </view>
                    <view class="item-list-row">
                        <view class="item-form-label" style="color: #222222; font-size: 30rpx; font-weight: 600;">实付款</view>
                        <view class="item-form-val price" style="color: #FE2C2E; font-size: 36rpx;">115.00</view>
                        <view class="item-form-val price" style="color: #FE2C2E; font-size: 36rpx;">{{((info.actualPayAmount || 0)/100).toFixed(2)}}</view>
                    </view>
                </view>
            </view>
@@ -135,20 +117,20 @@
                    <view class="item-infos-item">
                        <view class="item-infos-item-left">订单编号:</view>
                        <view class="item-infos-item-right">
                            <text>202107131742520001</text>
                            <text>{{info.code ||''}}</text>
                            <image src="/static/icon/ic_cppy@2x.png" mode="widthFix"></image>
                        </view>
                    </view>
                    <view class="item-infos-item">
                        <view class="item-infos-item-left">创建时间:</view>
                        <view class="item-infos-item-right">
                            <text>2026-04-12 12:00:00</text>
                            <text>{{info.createTime ||''}}</text>
                        </view>
                    </view>
                    <view class="item-infos-item">
                    <view class="item-infos-item" v-if="info.payTime">
                        <view class="item-infos-item-left">支付时间:</view>
                        <view class="item-infos-item-right">
                            <text>2026-04-12 12:00:00</text>
                            <text>{{info.payTime ||''}}</text>
                        </view>
                    </view>
                    <view class="item-infos-item">
@@ -157,51 +139,141 @@
                            <text>微信支付</text>
                        </view>
                    </view>
                    <view class="item-infos-item">
                    <view class="item-infos-item" v-if="info.outTradeNo">
                        <view class="item-infos-item-left">交易号:</view>
                        <view class="item-infos-item-right">
                            <text>2025080698723178237189237123</text>
                            <text>{{info.outTradeNo || ''}}</text>
                        </view>
                    </view>
                    <view class="item-infos-item">
                        <view class="item-infos-item-left">订单备注:</view>
                        <view class="item-infos-item-right">
                            <text>-</text>
                            <text>{{info.remark || ''}}</text>
                        </view>
                    </view>
                    <view class="item-infos-item">
                    <view class="item-infos-item" v-if="info.refundTime">
                        <view class="item-infos-item-left">申请退款:</view>
                        <view class="item-infos-item-right">
                            <text>2026-04-12 12:30:00</text>
                            <text>{{info.refundTime || ''}}</text>
                        </view>
                    </view>
                    <view class="item-infos-item">
                    <view class="item-infos-item" v-if="info.refundAmount">
                        <view class="item-infos-item-left">退款金额:</view>
                        <view class="item-infos-item-right">
                            <text>¥115.00</text>
                            <text>¥{{((info.refundAmount || 0)/100).toFixed(2)}}</text>
                        </view>
                    </view>
                    <view class="item-infos-item">
                    <view class="item-infos-item"  v-if="info.refundRemark">
                        <view class="item-infos-item-left">退款原因:</view>
                        <view class="item-infos-item-right">
                            <text>协商一致退款</text>
                            <text>{{info.refundRemark || ''}}</text>
                        </view>
                    </view>
                </view>
            </view>
            <view style="width: 100%; height: calc(210rpx + env(safe-area-inset-bottom));"></view>
        </view>
        <view class="tips">
        <view class="tips" v-if="info.overdue">
            <image src="/static/icon/ic_waring@2x.png" mode="widthFix"></image>
            <text>已超过取件时间,超时费用:¥10.00</text>
        </view>
        <view class="footer">
            <text>已超过取件时间,超时费用:¥{{((info.overdueFee || 0)/100).toFixed(2)}}元</text>
        </view>
        <view cclass="footer" v-if="info.type===0">
            <view class="footer-btns">
                <view class="btn kong">删除订单</view>
                <view class="btn you">评价订单</view>
                <view class="btn kong" @click="contactPhone(info,0)" v-if="info.status ===1 || info.status==2 || info.status===98">联系门店</view>
                <view class="btn kong" v-if="info.status ===0 || info.status ===1"  @click="cancelOrder(info)">取消订单</view>
                <view class="btn kong" @click="deleteOrder(info)" v-if="info.status ===7 || info.status===96 || info.status == 99">删除订单</view>
                <view class="btn you"  @click="payOrder(info)" v-if="info.status ===0">立即支付</view>
                <view class="btn you" v-if="info.status >=1 &&info.status <7 " @click="openQrcode(info)" >核销码</view>
                <view class="btn you" @click="evaluateOrder(info)" v-if="info.status ===7 && !info.commentStatus ">评价订单</view>
            </view>
            <view style="width: 100%; height: env(safe-area-inset-bottom);"></view>
        </view>
        <view class="footer" v-else>
            <view class="footer-btns">
                <view class="btn kong" @click="contactPhone(info,0)" v-if="info.status ===1 || info.status ==2">联系门店</view>
                <view class="btn kong" @click="contactPhone(info,2)" v-if="info.status ===3 || info.status ===4 ">联系骑手</view>
                <view class="btn kong" @click="contactPhone(info,1)" v-if="info.status ===5">联系门店</view>
                <view class="btn kong" v-if="info.status ===0"  @click="cancelOrder(info)">取消订单</view>
                <view class="btn you" @click="payOrder(info)" v-if="info.status ===0">立即支付</view>
                <view class="btn kong" @click="deleteOrder(info)" v-if="info.status ===7 || info.status===96 || info.status == 99">删除订单</view>
                <view class="btn you" @click="cancelOrder(info)" v-if="info.status ===1">申请退款</view>
                <view class="btn you" v-if="info.status ===1 || (info.takeShopId && info.status ===5)" @click="openQrcode(info)" >核销码</view>
                <view class="btn you"  @click="doneOrder(info)"  v-if="!info.takeShopId && info.status ===5">确认收货</view>
                <view class="btn you"  @click="evaluateOrder(info)" v-if="info.status ===7 && !info.commentStatus ">评价订单</view>
            </view>
        </view>
        <u-popup :show="showPhone" round="15" mode="bottom" :safeAreaInsetBottom="true"  @close="contactPhone()" :closeable="true" :closeOnClickOverlay="true">
            <view class="phone">
                <view class="phone-head">
                    <view></view>
                    <text>联系客户</text>
                </view>
                 <view class="phone-item" >
                     <view>
                        <image src="/static/icon/ic_call@2x.png" mode="widthFix" @click="contactPhoneDo()" ></image>
                        <text>{{linkinfo.linkname||''}} </text>
                        <text style="margin-left: 10px;"> {{linkinfo.linkphone||''}}</text>
                    </view>
                 </view>
                 <view style="width: 100%; height: 30rpx;"></view>
            </view>
        </u-popup>
        <!-- 确认收货 -->
        <u-popup :show="showDone" round="15" :safeAreaInsetBottom="false" mode="center">
            <view class="tc">
                <view class="tc-contemt">
                    <view class="tc-contemt-title">确认收货提醒</view>
                    <view class="tc-contemt-nr">
                        您确认已经收到您的行李了吗?
                    </view>
                </view>
                <view class="tc-btn">
                    <view class="tc-btn-item" @click="showDone = false;currentOrder=null;">取消</view>
                    <view class="tc-btn-item" style="color: #004096;" @click="doneOrderDo()">确认收货</view>
                </view>
            </view>
        </u-popup>
        <u-popup :show="showCancel" round="15" :safeAreaInsetBottom="false" mode="center">
            <view class="tc">
                <view class="tc-contemt">
                    <view class="tc-contemt-title">确定取消提醒</view>
                    <view class="tc-contemt-nr">
                        您确认取消该订单吗?
                    </view>
                </view>
                <view class="tc-btn">
                    <view class="tc-btn-item" @click="showCancel = false;currentOrder=null;">我再想想</view>
                    <view class="tc-btn-item" style="color: red;" @click="cancelOrderDo">确认取消</view>
                </view>
            </view>
        </u-popup>
        <!-- 删除订单 -->
        <u-popup :show="showDelete" round="15" :safeAreaInsetBottom="false" mode="center">
            <view class="tc">
                <view class="tc-contemt">
                    <view class="tc-contemt-title">确认删除提醒</view>
                    <view class="tc-contemt-nr">
                        您确认删除该订单吗?
                    </view>
                </view>
                <view class="tc-btn">
                    <view class="tc-btn-item" @click="showDelete = false;currentOrder=null;">我再想想</view>
                    <view class="tc-btn-item" style="color: red;" @click="deleteOrderDo">确认删除</view>
                </view>
            </view>
        </u-popup>
        <u-popup :show="showQrcode" round="15" @close="openQrcode()"   :safeAreaInsetBottom="false" mode="bottom"  :closeable="true" :closeOnClickOverlay="false">
            <view class="tc" style="height: 700rpx;width: 100%; ">
                <view class="tc-contemt" style="text-align: center;">
                    <view class="tc-contemt-title" style="text-align: center;">核销码</view>
                    <view class="qrcode-box">
                        <canvas canvas-id="qrcodeCanvas" id="qrcodeCanvas" style="width: 100px; height: 100px;"></canvas>
                        <image class="qrcode-image" :src="qrcodeImage" mode="widthFix"></image>
                    </view>
                    <text class="pickup-code">{{ currentOrder.memberVerifyCode||'' }}</text>
                    <text class="pickup-tip" @tap="copyCode">点击复制自提码</text>
                </view>
            </view>
        </u-popup>
    </view>
</template>
@@ -214,11 +286,172 @@
        },
        data() {
            return {
                id:null,
                info:{},
                showDone:false,
                showCancel:false,
                showDelete:false,
                showQrcode:false,
                showPay:false,
                showPhone:false
            }
        },
        methods: {
        onShow() {
            this.info={}
            this.showDone=false
            this.showCancel=false
            this.showDelete=false
            this.showQrcode=false
            this.showPay=false
            this.showPhone=false
            this.getUserDetail()
        },
        onLoad(options) {
            this.id = options.id
        },
        methods:{
            previewImage(images,index = 0) {
                uni.previewImage({
                    current: index,
                    urls: images
                });
            },
            payOrder(){
                var that = this;
                uni.showLoading({ title: '发起支付中...', mask: true })
                this.$u.api.continuePayOrder({
                    orderId: this.id
                }).then(res => {
                    uni.hideLoading()
                    if (res.code === 200 && res.data) {
                        let paymentData = res.data.response
                        uni.requestPayment({
                            provider: 'wxpay',
                            timeStamp: paymentData.timeStamp || '',
                            nonceStr: paymentData.nonceStr || '',
                            package: paymentData.package || '',
                            signType: paymentData.signType || 'MD5',
                            paySign: paymentData.paySign || '',
                            success: (res) => {
                                that.getUserDetail()
                            },
                            fail: (err) => {
                                if (err.errMsg.includes('cancel')) {
                                    uni.showToast({ title: '已取消支付', icon: 'none' })
                                } else {
                                    uni.showToast({ title: '支付失败', icon: 'none' })
                                }
                            }
                        })
                    } else {
                        uni.showToast({ title: res.msg || '支付失败', icon: 'none' })
                    }
                }).catch(err => {
                    uni.hideLoading()
                    uni.showToast({ title: '支付失败', icon: 'none' })
                })
            },
            doneOrder(item){
                this.showDone = !this.showDone
            },
            async  doneOrderDo(){
                var that =this
                let res = await this.$u.api.confirmReceipt({ orderId: this.id  });
                if (res.code === 200 ) {
                    that.showDone = false
                    that.getUserDetail()
                }
            },
            contactPhone(){
                 this.showPhone = !this.showPhone
            },
            contactPhoneDo(){
                if(this.info.linkphone !=null && this.info.linkphone!=''){
                    uni.makePhoneCall({
                       phoneNumber: this.info.linkphone
                    })
                }
            },
            cancelOrder(item){
                this.showCancel = !this.showCancel
            },
            deleteOrder(item){
                this.showDelete = !this.showDelete
            },
            async cancelOrderDo(){
                var that =this
                let res = await that.$u.api.cancelOrder({ orderId: this.id });
                if (res.code === 200 ) {
                    this.showCancel = false
                    uni.$emit('updateOrder',{info:this.info,delete:0})
                }
            },
            async deleteOrderDo(){
                if( this.currentOrder==null || this.currentOrder.id == null) {
                    return
                }
                var that =this
                let res = await that.$u.api.deleteOrder({ orderId: this.currentOrder.id  });
                if (res.code === 200 ) {
                    this.showDelete = false
                    uni.$emit('updateOrder',{info:this.info,delete:1})
                    this.goBack()
                }
            },
            copyCode() {
                if (!this.currentOrder || !this.info.memberVerifyCode) {
                    return
                }
                uni.setClipboardData({
                    data: this.info.memberVerifyCode,
                    success: () => {
                        uni.showToast({
                            title: '已复制自提码',
                            icon: 'none'
                        })
                    }
                })
            },
            async openQrcode(){
                this.qrcodeImage=null
                var that =this
                if(!this.showQrcode){
                    this.showQrcode =true
                    drawQrcode({
                        canvasId: 'qrcodeCanvas',
                        text: this.info.memberVerifyCode,
                        width: 100,
                        height: 100,
                        correctLevel: 2
                    })
                    setTimeout(() => {
                        uni.canvasToTempFilePath({
                            canvasId: 'qrcodeCanvas',
                            success: (res) => {
                                that.qrcodeImage = res.tempFilePath
                            }
                        }, this)
                    }, 100)
                }else{
                    this.showQrcode = false
                }
            },
            evaluateOrder(){
                uni.navigateTo({
                    url:"/pages/evaluate/evaluate?id="+this.info.id
                })
            },
            goBack(){
                uni.navigateBack({delta:-1})
            },
            async  getUserDetail(){
                var that =this
                let res = await this.$u.api.getOrderDetail( this.id  )
                if (res.code === 200) {
                    this.info = res.data
                    uni.$emit('updateOrder',{info:this.info,delete:0})
                }
            }
        }
    }
</script>
@@ -292,9 +525,14 @@
                }
            }
        }
        .head0{
            background: #1ba8fa;
        }
        .head1{
            background: #E4730B;
        }
        .head {
            width: 100%;
            background: #E4730B;
            padding: 0 30rpx;
            box-sizing: border-box;
            position: fixed;
@@ -322,7 +560,7 @@
            height: 264rpx;
            padding: 22rpx 30rpx;
            box-sizing: border-box;
            background-color: #E4730B;
            // background-color: #E4730B;
            .nr-status {
                display: flex;
                align-items: baseline;
@@ -333,7 +571,7 @@
                    margin-right: 16rpx;
                }
                .nr-status-type {
                    width: 64rpx;
                    width: 164rpx;
                    height: 38rpx;
                    display: flex;
                    align-items: center;
@@ -345,7 +583,7 @@
                    color: #FA8010;
                }
                .nr-status-type1 {
                    width: 88rpx;
                    width: 188rpx;
                    height: 38rpx;
                    display: flex;
                    align-items: center;
small-program/pages/evaluate/evaluate.vue
@@ -4,7 +4,7 @@
            <view class="rate-block">
                <view class="title-row">
                    <text class="title-label">寄件门店:</text>
                    <text class="title-value">中铁快运南站旗舰店</text>
                    <text class="title-value">{{info.depositShopName||''}}</text>
                </view>
                <view class="star-row">
                    <view class="star-list">
@@ -12,11 +12,11 @@
                            v-for="n in 5"
                            :key="'shop-' + n"
                            class="star-item"
                            :class="{ active: n <= shopRate, dashed: n === 1 || n === 3 }"
                            @tap="shopRate = n"
                            :class="{ active: n < form.depositScore, dashed: n === 1 || n === 3 }"
                            @tap="form.depositScore = n+1"
                        >★</view>
                    </view>
                    <text class="rate-text">{{ shopRate }}星</text>
                    <text class="rate-text">{{ form.depositScore }}星</text>
                </view>
            </view>
@@ -25,65 +25,67 @@
            <view class="rate-block">
                <view class="title-row">
                    <text class="title-label">配送司机:</text>
                    <text class="title-value">张伟</text>
                    <text class="title-value">{{info.driverName || ''}}</text>
                </view>
                <view class="star-row no-text-row">
                <view class="star-row">
                    <view class="star-list">
                        <view
                            v-for="n in 5"
                            :key="'driver-' + n"
                            class="star-item"
                            :class="{ active: n <= driverRate, dashed: n === 1 }"
                            @tap="driverRate = n"
                            :class="{ active: n < form.driverScore, dashed: n === 1 }"
                            @tap=" form.driverScore = n+1"
                        >★</view>
                    </view>
                    <text class="rate-text">{{ form.driverScore }}星</text>
                </view>
            </view>
            <view class="divider"></view>
            <view class="rate-block">
            <view class="rate-block" v-if="info.type ===1 && info.takeShopId ">
                <view class="title-row">
                    <text class="title-label">收件门店:</text>
                    <text class="title-value">中铁快运合肥站旗舰店</text>
                    <text class="title-value">{{info.takeShopName || 0}}</text>
                </view>
                <view class="star-row no-text-row">
                <view class="star-row">
                    <view class="star-list">
                        <view
                            v-for="n in 5"
                            :key="'receive-' + n"
                            class="star-item"
                            :class="{ active: n <= receiveRate, dashed: n === 1 }"
                            @tap="receiveRate = n"
                            :class="{ active: n < form.takeScore, dashed: n === 1 }"
                            @tap="form.takeScore = n+1"
                        >★</view>
                    </view>
                    <text class="rate-text">{{ form.takeScore }}星</text>
                </view>
            </view>
            <view class="divider"></view>
            <view class="upload-row">
                <view class="upload-box">
                <view class="upload-box" @click="chooseAndUploadImage(9)">
                    <view class="upload-plus">+</view>
                    <text class="upload-text">上传照片</text>
                </view>
                <view v-for="(item, index) in photoList" :key="index" class="photo-box">
                    <image class="photo-image" :src="item" mode="aspectFill"></image>
                    <text class="photo-delete">删除</text>
                    <image class="photo-image" :src="item.url" mode="aspectFill"></image>
                    <text class="photo-delete" @click="deleteImage(index)">删除</text>
                </view>
            </view>
            <view class="textarea-box">
                <view class="textarea-placeholder-wrap">
                    <view class="textarea-icon"></view>
                    <textarea v-model="content" class="textarea" maxlength="200" placeholder="请说说您对本次服务的感受" placeholder-class="textarea-placeholder"></textarea>
                    <textarea v-model="form.content" class="textarea" maxlength="200" placeholder="请说说您对本次服务的感受" placeholder-class="textarea-placeholder"></textarea>
                </view>
                <text class="textarea-count">{{ content.length }}/200</text>
                <text class="textarea-count">{{ form.content.length }}/200</text>
            </view>
        </view>
        <view class="submit-wrap">
            <view class="submit-btn">提交评价</view>
            <view class="submit-btn" @click="orderComment">提交评价</view>
        </view>
    </view>
</template>
@@ -92,15 +94,140 @@
    export default {
        data() {
            return {
                shopRate: 2,
                driverRate: 0,
                receiveRate: 0,
                content: '',
                id:null,
                info:{},
                form:{
                   content: "",
                   depositScore: 5,
                   driverScore: 5,
                   orderId: null,
                   takeScore: 5,
                   fileList:[]
                },
                photoList: [
                    '/static/icon/nav_home_sel@2x.png',
                    '/static/icon/nav_xingcheng_sel@2x.png'
                ]
            }
        },
        onShow() {
            this.info={}
            this.getUserDetail()
        },
        onLoad(options) {
            this.id = options.id
            this.photoList=[]
            this.form={
               content: "",
               depositScore: 5,
               driverScore: 5,
               orderId: this.id,
               takeScore: 5,
               images:[]
            }
        },
        methods:{
            deleteImage(index) {
                this.photoList.splice(index, 1)
                this.form.images.splice(index, 1)
            },
            async uploadFiles(filePaths, maxCount = 9) {
                if (!filePaths || filePaths.length === 0) {
                    return []
                }
                const limitedPaths = filePaths.slice(0, maxCount)
                const uploadTasks = limitedPaths.map(filePath => {
                    return new Promise((resolve, reject) => {
                        uni.uploadFile({
                            url: this.$baseUrl + '/web/public/upload',
                            filePath: filePath,
                            name: 'file',
                            formData: {
                                folder: 'orders'
                            },
                            success: (res) => {
                                if (res.statusCode === 200) {
                                    const data = JSON.parse(res.data)
                                    if (data.code === 200) {
                                        resolve(data.data)
                                    } else {
                                        reject(new Error(data.msg || '上传失败'))
                                    }
                                } else {
                                    reject(new Error('上传失败'))
                                }
                            },
                            fail: (err) => {
                                reject(err)
                            }
                        })
                    })
                })
                try {
                    const results = await Promise.all(uploadTasks)
                    return results
                } catch (error) {
                    uni.showToast({
                        title: '上传失败',
                        icon: 'none'
                    })
                    throw error
                }
            },
            async chooseAndUploadImage(maxCount = 9) {
                const currentCount = this.form.images.length
                const remainingCount = maxCount - currentCount
                if (remainingCount <= 0) {
                    uni.showToast({
                        title: `最多上传${maxCount}张图片`,
                        icon: 'none'
                    })
                    return
                }
                var that = this
                uni.chooseImage({
                    count: remainingCount,
                    sizeType: ['compressed'],
                    sourceType: ['album', 'camera'],
                    success: async (res) => {
                        const tempFilePaths = res.tempFilePaths
                        uni.showLoading({
                            title: '上传中...',
                            mask: true
                        })
                        try {
                            const uploadResults = await that.uploadFiles(tempFilePaths, maxCount)
                            const fullPaths = uploadResults.map(item => item.url || item.path || item)
                            that.photoList = [...that.photoList, ...fullPaths.map(url => ({ url }))]
                            that.form.images = [...that.form.images, ...fullPaths]
                            uni.hideLoading()
                            uni.showToast({
                                title: '上传成功',
                                icon: 'success'
                            })
                        } catch (error) {
                            uni.hideLoading()
                        }
                    }
                })
            },
            async orderComment(){
                var that =this
                let res = await that.$u.api.orderComment(this.form);
                if (res.code === 200 ) {
                    this.info.commentStatus == 1
                    uni.$emit('updateOrder',{info:this.info,delete:0})
                    uni.navigateBack({delta:-1})
                }
            },
            async  getUserDetail(){
                var that =this
                let res = await this.$u.api.getOrderDetail( this.id  )
                if (res.code === 200) {
                    this.info = res.data
                    uni.$emit('updateOrder',{info:this.info,delete:0})
                }
            }
        }
    }
</script>
small-program/pages/itinerary/itinerary.vue
@@ -26,7 +26,7 @@
        <view class="content-wrap">
            <view class="page-padding card-list">
                <view v-for="(item, index) in dataList" :key="item.id" class="order-card">
                    <view class="order-head" :class="item.mode === 'city' ? 'city-head-bg' : 'local-head-bg'">
                    <view class="order-head" :class="item.mode === 'city' ? 'city-head-bg' : 'local-head-bg'"  @click="jumpOrderDetail(item.id)">
                        <view v-if="item.type === 0" class="head-local">
                            <view class="mode-tag local-tag">就地寄存</view>
                            <view class="head-copy single-copy">
@@ -34,7 +34,7 @@
                                <text class="head-user">{{ item.takeUser ||'' }}</text>
                            </view>
                            <text v-if="item.status < 7" class=" status-text status-orange">{{ item.statusName||'' }}</text>
                            <text v-else-if="item.status ===7" class=" status-text">{{ item.statusName||'' }}</text>
                            <text v-else-if="item.status ===7" class=" status-text  status-grey">{{ item.statusName||'' }}</text>
                            <text v-else-if="item.status >7" class=" status-text status-grey">{{ item.statusName||'' }}</text>
                        </view>    
                        <view v-else class="head-city">
@@ -49,15 +49,14 @@
                            </view>
                            <view class="head-copy city-right align-right">
                                <text v-if="item.status < 7" class=" status-text status-orange">{{ item.statusName||'' }}</text>
                                <text v-else-if="item.status ===7" class="status-text">{{ item.statusName||'' }}</text>
                                <text v-else-if="item.status ===7" class="status-text  status-grey" >{{ item.statusName||'' }}</text>
                                <text v-else-if="item.status >7" class=" status-text status-grey">{{ item.statusName||'' }}</text>
                                <text class="head-name text-ellipsis">{{ item.takeShopName||'对对对' }}</text>
                                <text class="head-name text-ellipsis">{{ item.takeShopName || item.takeLocation||'' }}</text>
                                <text class="head-user">{{ item.takeUser||'' }}</text>
                            </view>
                        </view>
                    </view>
                    <view class="goods-area" v-if="item.detailList">
                    <view class="goods-area" v-if="item.detailList" @click="jumpOrderDetail(item.id)">
                        <view v-for="goods in item.detailList " :key="goods.luggageName" class="goods-row">
                            <view class="goods-left">
                                <text class="goods-name">{{ goods.luggageName ||'' }}</text>
@@ -94,7 +93,7 @@
                            <view class="footer-btn contact-btn" @click="deleteOrder(item)" v-if="item.status ===7 || item.status===96 || item.status == 99">删除订单</view>
                            <view class="footer-btn primary-btn"  @click="payOrder(item)" v-if="item.status ===0">立即支付</view>
                            <view class="footer-btn primary-btn" v-if="item.status >=1 &&item.status <7 " @click="openQrcode(item)" >核销码</view>
                            <view class="footer-btn primary-btn" v-if="item.status ===7 && !commentStatus ">评价订单</view>
                            <view class="footer-btn primary-btn" @click="evaluateOrder(item)" v-if="item.status ===7 && !item.commentStatus ">评价订单</view>
                        </view>
                        <view class="footer-actions" v-else>
                            <view class="footer-btn contact-btn" @click="contactPhone(item,0)" v-if="item.status ===1 || item.status ==2">联系门店</view> 
@@ -106,7 +105,7 @@
                            <view class="footer-btn primary-btn" @click="cancelOrder(item)" v-if="item.status ===1">申请退款</view>
                            <view class="footer-btn primary-btn" v-if="item.status ===1 || (item.takeShopId && item.status ===5)" @click="openQrcode(item)" >核销码</view>
                            <view class="footer-btn primary-btn"  @click="doneOrder(item)"  v-if="!item.takeShopId && item.status ===5">确认收货</view>
                            <view class="footer-btn primary-btn" v-if="item.status ===7 && !commentStatus ">评价订单</view>
                            <view class="footer-btn primary-btn"  @click="evaluateOrder(item)" v-if="item.status ===7 && !item.commentStatus ">评价订单</view>
                        </view>
                    </view>
                </view>
@@ -197,11 +196,13 @@
                </view>
            </view>
        </u-popup>
        <custom-tabbar></custom-tabbar>
    </view>
</template>
<script>
    import { mapState } from 'vuex'
    import CustomTabbar from '@/components/custom-tabbar/custom-tabbar.vue'
    import drawQrcode from 'weapp-qrcode'
    export default {
        computed: {
@@ -261,6 +262,7 @@
                        if(item.id==data.info.orderId){
                             console.log('监听到事件来自 update 02:' ,data);
                            item.status = data.info.orderStatus
                            item.commentStatus = data.info.commentStatus
                        }
                    }) 
                }
@@ -473,7 +475,12 @@
            },
            jumpOrderDetail(id){
                uni.navigateTo({
                    url:'/pages/details-entry/details-entry?userType='+this.userType+'&id='+id
                    url:'/pages/delivery-order-detail/delivery-order-detail?userType=0&id='+id
                })
            },
            evaluateOrder(item){
                uni.navigateTo({
                    url:"/pages/evaluate/evaluate?id="+item.id
                })
            }
        }
@@ -675,9 +682,11 @@
    }
    .text-ellipsis {
        display: block;
        white-space: nowrap;
        overflow: hidden;
        text-overflow: ellipsis;
        max-width: 100%;
    }
    .city-arrow {
small-program/utils/http.api.js
@@ -35,8 +35,10 @@
    let cancelOrder = (data = {}) => vm.$u.http.post('web/order/cancel', data);    // 取消订单
    let confirmReceipt = (data = {}) => vm.$u.http.post('web/order/confirmReceipt/'+data.orderId, data);    // 会员确认收货 
    let continuePayOrder = (data = {}) => vm.$u.http.post('web/order/continuePay/'+data.orderId, data);    //继续发起支付
    let orderComment = (data = {}) => vm.$u.http.post('web/order/comment', data);    //订单评价
    
    vm.$u.api = {
        orderComment,
        confirmReceipt,
        cancelOrder,
        deleteOrder,