<template>  
 | 
    <view class="main_app">  
 | 
        <view class="head_bg"></view>  
 | 
        <view class="info">  
 | 
            <view class="head">  
 | 
                <view class="title">运输单号:{{info.transportCode}}</view>  
 | 
                <view class="status">{{info.logisticsStatus == 0 ? '待执行' : info.logisticsStatus == 1 ? '执行中(在途)' : '完成(到货)'}}  
 | 
                </view>  
 | 
            </view>  
 | 
            <view class="content">  
 | 
                <view class="line">  
 | 
                    <view class="la">物资类型</view>  
 | 
                    <view class="val">{{ info.materialType == '1' ? '成品' : '托盘' }}</view>  
 | 
                </view>  
 | 
                <view class="line">  
 | 
                    <view class="la">业务类型</view>  
 | 
                    <view class="val" v-if="info.businessType == 1">成品销售</view>  
 | 
                    <view class="val" v-if="info.businessType == 2">成品移库</view>  
 | 
                    <view class="val" v-if="info.businessType == 3">空托盘-工业调剂</view>  
 | 
                    <view class="val" v-if="info.businessType == 4">空托盘-商业回收</view>  
 | 
                    <view class="val" v-if="info.businessType == 5">空托盘-托盘带回</view>  
 | 
                </view>  
 | 
                <view class="line">  
 | 
                    <view class="la">是否托盘联运</view>  
 | 
                    <view class="val">{{ info.isPalletTransport == 1 ? '是' : '否' }}</view>  
 | 
                </view>  
 | 
                <view class="line">  
 | 
                    <view class="la">发货点</view>  
 | 
                    <view class="val">{{ info.startCity }}</view>  
 | 
                </view>  
 | 
                <view class="line">  
 | 
                    <view class="la">卸货点</view>  
 | 
                    <view class="val">{{ info.endCity }}</view>  
 | 
                </view>  
 | 
                <view class="line">  
 | 
                    <view class="la">车牌号</view>  
 | 
                    <view class="val">{{ info.plateNumber }}</view>  
 | 
                </view>  
 | 
                <view class="line">  
 | 
                    <view class="la">司机</view>  
 | 
                    <view class="val">{{ info.driverName }}</view>  
 | 
                </view>  
 | 
                <view class="line">  
 | 
                    <view class="la">任务下达时间</view>  
 | 
                    <view class="val">{{ info.receiveDate }}</view>  
 | 
                </view>  
 | 
            </view>  
 | 
        </view>  
 | 
        <!--  -->  
 | 
        <view class="record">  
 | 
            <view class="title">品规明细</view>  
 | 
            <view class="table_scroll">  
 | 
                <view class="table">  
 | 
                    <view class="head line">  
 | 
                        <view class="ite con">合同号</view>  
 | 
                        <view class="ite name">品规名称</view>  
 | 
                        <view class="ite num">数量</view>  
 | 
                        <view class="ite time">最早到货时间</view>  
 | 
                        <view class="ite time">最迟到货时间</view>  
 | 
                    </view>  
 | 
                    <view class="line" v-for="item in info.productDetails">  
 | 
                        <view class="ite con">{{item.contractNumber}}</view>  
 | 
                        <view class="ite name">{{item.productName}}</view>  
 | 
                        <view class="ite num">{{item.packageSize}}</view>  
 | 
                        <view class="ite time">{{item.earliestReachDate}}</view>  
 | 
                        <view class="ite time">{{item.latestReachDate}}</view>  
 | 
                    </view>  
 | 
                </view>  
 | 
            </view>  
 | 
        </view>  
 | 
        <!--  -->  
 | 
        <view class="flow_wrap">  
 | 
            <view class="title">任务流程</view>  
 | 
            <view class="list">  
 | 
                <view class="item" v-for="item,i in info.transportStops">  
 | 
                    <view v-if="i < info.transportStops.length - 1" class="dian"></view>  
 | 
                    <view class="top1">  
 | 
                        <view class="left_icon">  
 | 
                            <image v-if="(info.logisticsStatus == 1 && item.actualArrivedDate) || info.logisticsStatus == 2"  
 | 
                                src="@/static/waybill/ic_daohuo_sel@2x.png" mode=""></image>  
 | 
                            <image v-else src="@/static/waybill/ic_dingdan@2x.png" mode=""></image>  
 | 
                        </view>  
 | 
                        <view class="content">  
 | 
                            <view class="name" :class="{primaryColor: (info.logisticsStatus == 1 && item.actualArrivedDate) || info.logisticsStatus == 2}">{{item.receiveLocation}}</view>  
 | 
                            <view class="status">  
 | 
                                <view v-if="info.logisticsStatus == 0" class="btn">到货</view>  
 | 
                                <view v-else-if="info.logisticsStatus == 1 && !item.actualArrivedDate" @click="startAri(item.stopNumber)"  
 | 
                                    class="btn pri">到货</view>  
 | 
                                <template v-else>  
 | 
                                    <image src="@/static/checkbox_sel@2x.png" mode="" class="icon"></image>  
 | 
                                    <text class="primaryColor">已到货</text>  
 | 
                                </template>  
 | 
                            </view>  
 | 
                        </view>  
 | 
                    </view>  
 | 
                    <view class="top1">  
 | 
                        <view class="left_icon"></view>  
 | 
                        <view class="time" v-if="item.actualArrivedDate">到货时间:{{ item.actualArrivedDate}}</view> 
 | 
                        <view class="time" style="margin-top: -10rpx;" v-else>-</view>  
 | 
                    </view>  
 | 
                </view>  
 | 
            </view>  
 | 
        </view>  
 | 
        <view v-if="info.logisticsStatus == 0" @click="startTrans" class="start_btn">启运</view>  
 | 
        <!--  --> 
 | 
        <view v-if="showTip" class="tip_wrap"> 
 | 
            <view class="title">提示</view> 
 | 
            <view class="text">车辆刚启运,暂无法进行到</view> 
 | 
            <view class="text">货操作,请5分钟后再试</view> 
 | 
            <view class="btn" @click="showTip = false">我知道了</view> 
 | 
        </view> 
 | 
        <view  v-if="showTip" class="shade"></view> 
 | 
    </view>  
 | 
</template>  
 | 
  
 | 
<script>  
 | 
    import {  
 | 
        putTaskDetail,  
 | 
        putDriverArrival,  
 | 
        putDriverStart,  
 | 
    } from '@/api'  
 | 
    export default {  
 | 
        data() {  
 | 
            return {  
 | 
                info: {  
 | 
                    productDetails: [],  
 | 
                    transportStop: []  
 | 
                }, 
 | 
                showTip: false  
 | 
            };  
 | 
        },  
 | 
        onLoad(options) {  
 | 
            this.id = options.id  
 | 
            this.getDetail()  
 | 
        },  
 | 
        methods: {  
 | 
            getDetail() {  
 | 
                putTaskDetail({  
 | 
                    id: this.id  
 | 
                }).then(res => {  
 | 
                    this.info = res.data  
 | 
                })  
 | 
            },  
 | 
            startTrans() {  
 | 
                uni.showModal({  
 | 
                    title: '提示',  
 | 
                    content: '确认启运么?',  
 | 
                    success: (res) => {  
 | 
                        if (res.confirm) {  
 | 
                            putDriverStart({  
 | 
                                id: this.id,  
 | 
                                optType: 0  
 | 
                            }).then((ress) => {  
 | 
                                if (ress.code == 200) { 
 | 
                                    const transportList = uni.getStorageSync('transportList') || [] 
 | 
                                    transportList.push({ id: this.id, time: new Date().getTime() }) 
 | 
                                    uni.setStorageSync('transportList', transportList)  
 | 
                                    this.showToast('启运成功') 
 | 
                                    this.getDetail()  
 | 
                                }  
 | 
                            })  
 | 
                        }  
 | 
                    }  
 | 
                });  
 | 
            },  
 | 
            startAri(stopNumber) {  
 | 
                uni.showModal({  
 | 
                    title: '提示',  
 | 
                    content: '确认到货么?',  
 | 
                    success: (res) => {  
 | 
                        if (res.confirm) { 
 | 
                            const transportList = uni.getStorageSync('transportList') || [] 
 | 
                            const item = transportList.find(i => i.id == this.id) 
 | 
                            if(item && item.id){ 
 | 
                                const timeN = new Date().getTime() - item.time 
 | 
                                if(timeN < 5 * 60 * 1000){ 
 | 
                                    this.showTip = true 
 | 
                                    return 
 | 
                                } 
 | 
                            }  
 | 
                            putDriverArrival({  
 | 
                                stopNumber,  
 | 
                                optType: 1,  
 | 
                                id: this.id  
 | 
                            }).then(ress => {  
 | 
                                if (ress.code == 200) {  
 | 
                                    this.showToast('到货成功') 
 | 
                                    this.getDetail()  
 | 
                                }  
 | 
                            })  
 | 
                        }  
 | 
                    }  
 | 
                });  
 | 
            }  
 | 
        }  
 | 
    }  
 | 
</script>  
 | 
  
 | 
<style lang="scss">  
 | 
    page {  
 | 
        background-color: #f7f7f7;  
 | 
    } 
 | 
    .shade{ 
 | 
        width: 100vw; 
 | 
        height: 100vh; 
 | 
        background: #000000; 
 | 
        opacity: 0.4; 
 | 
        position: fixed; 
 | 
        left: 0; 
 | 
        top: 0; 
 | 
        z-index: 99; 
 | 
    }  
 | 
    .tip_wrap{ 
 | 
        position: fixed; 
 | 
        top: 0; 
 | 
        left: 0; 
 | 
        bottom: 0; 
 | 
        right: 0; 
 | 
        margin: auto; 
 | 
        width: 560rpx; 
 | 
        height: 328rpx; 
 | 
        background: #FFFFFF; 
 | 
        border-radius: 24rpx; 
 | 
        text-align: center; 
 | 
        z-index: 999; 
 | 
        .title{ 
 | 
            font-weight: 500; 
 | 
            font-size: 32rpx; 
 | 
            color: #111111; 
 | 
            margin: 40rpx 0 30rpx; 
 | 
        } 
 | 
        .text{ 
 | 
            font-weight: 400; 
 | 
            font-size: 28rpx; 
 | 
            color: #333333; 
 | 
        } 
 | 
        .btn{ 
 | 
            margin-top: 32rpx; 
 | 
            height: 100rpx; 
 | 
            display: flex; 
 | 
            justify-content: center; 
 | 
            align-items: center; 
 | 
            border-top: 1rpx solid #E5E5E5; 
 | 
            color: #279BAA; 
 | 
            font-size: 32rpx; 
 | 
        } 
 | 
    }  
 | 
    .head_bg {  
 | 
        width: 750rpx;  
 | 
        height: 240rpx;  
 | 
        background: linear-gradient(180deg, #279BAA 0%, rgba(39, 155, 170, 0) 100%);  
 | 
        position: absolute;  
 | 
        top: 0;  
 | 
        left: 0;  
 | 
    }  
 | 
  
 | 
    .info {  
 | 
        border-radius: 8rpx;  
 | 
        overflow: hidden;  
 | 
        margin-top: 30rpx;  
 | 
        background: #FFFFFF;  
 | 
        position: relative; 
 | 
        z-index: 1;  
 | 
        .head {  
 | 
            display: flex;  
 | 
            justify-content: space-between;  
 | 
            align-items: center;  
 | 
            height: 84rpx;  
 | 
            background: linear-gradient(270deg, #FEFEFF 0%, #E1F7FE 100%);  
 | 
            padding: 0 30rpx;  
 | 
  
 | 
            .title {  
 | 
                font-weight: 500;  
 | 
                font-size: 32rpx;  
 | 
                color: #222222;  
 | 
            }  
 | 
  
 | 
            .status {  
 | 
                font-size: 26rpx;  
 | 
                color: $uni-color-primary;  
 | 
            }  
 | 
        }  
 | 
  
 | 
        .content {  
 | 
            padding: 30rpx 30rpx 10rpx;  
 | 
            font-size: 30rpx;  
 | 
  
 | 
            .line {  
 | 
                display: flex;  
 | 
                align-items: center;  
 | 
                justify-content: space-between;  
 | 
                margin-bottom: 20rpx;  
 | 
  
 | 
                .la {  
 | 
                    color: #666666;  
 | 
                }  
 | 
  
 | 
                .val {}  
 | 
            }  
 | 
        }  
 | 
    }  
 | 
  
 | 
    .record {  
 | 
        margin-top: 20rpx;  
 | 
        width: 690rpx;  
 | 
        background: #FFFFFF;  
 | 
        border-radius: 16rpx;  
 | 
        padding: 30rpx;  
 | 
  
 | 
        .title {  
 | 
            font-weight: 500;  
 | 
            font-size: 32rpx;  
 | 
            color: #222222;  
 | 
            margin-bottom: 24rpx;  
 | 
        }  
 | 
  
 | 
        .table_scroll {  
 | 
            width: 630rpx;  
 | 
            overflow-x: auto;  
 | 
  
 | 
            .table {  
 | 
                width: 960rpx;  
 | 
                color: #222222;  
 | 
  
 | 
                .line {  
 | 
                    min-height: 68rpx;  
 | 
                    align-items: center;  
 | 
                    display: flex;  
 | 
                    border-bottom: 1px solid #E5E5E5;  
 | 
                    padding: 0 20rpx;  
 | 
  
 | 
                    .ite {  
 | 
                        width: 280rpx;  
 | 
                        flex-shrink: 0;  
 | 
                        overflow: hidden;  
 | 
                    }  
 | 
  
 | 
                    .con {  
 | 
                        width: 160rpx;  
 | 
                    }  
 | 
  
 | 
                    .time {  
 | 
                        width: 195rpx;  
 | 
                    }  
 | 
  
 | 
                    .num {  
 | 
                        width: 100rpx;  
 | 
                    }  
 | 
  
 | 
                }  
 | 
  
 | 
                .head {  
 | 
                    font-weight: 500;  
 | 
                    background: #F4F7FC;  
 | 
                    border: none;  
 | 
                }  
 | 
  
 | 
            }  
 | 
        }  
 | 
    }  
 | 
  
 | 
    .flow_wrap {  
 | 
        background: #FFFFFF;  
 | 
        border-radius: 16rpx;  
 | 
        padding: 30rpx;  
 | 
        margin-top: 20rpx;  
 | 
        margin-bottom: 20rpx;  
 | 
        .title {  
 | 
            font-weight: 500;  
 | 
            font-size: 32rpx;  
 | 
            color: #222222;  
 | 
            margin-bottom: 24rpx;  
 | 
        }  
 | 
  
 | 
        .list {  
 | 
            .item {  
 | 
                position: relative;  
 | 
                padding-bottom: 24rpx; 
 | 
                &:nth-last-child(1){ 
 | 
                    padding-bottom: 0; 
 | 
                }  
 | 
                .dian {  
 | 
                    border: 1rpx dashed #CCCCCC;  
 | 
                    height: calc(100% - 48rpx);  
 | 
                    width: 1rpx;  
 | 
                    position: absolute;  
 | 
                    top: 48rpx;  
 | 
                    left: 22rpx;  
 | 
                }  
 | 
  
 | 
                .top1 {  
 | 
                    display: flex;  
 | 
                    .left_icon {  
 | 
                        width: 78rpx;  
 | 
  
 | 
                        image {  
 | 
                            width: 48rpx;  
 | 
                            height: 48rpx;  
 | 
                        }  
 | 
                    }  
 | 
  
 | 
                    .content {  
 | 
                        flex: 1;  
 | 
                        display: flex;  
 | 
                        justify-content: space-between;  
 | 
                        // align-items: center;  
 | 
                        margin-bottom: 12rpx;  
 | 
  
 | 
                        .name {  
 | 
                            font-weight: 600;  
 | 
                            font-size: 32rpx;  
 | 
                            overflow: hidden;  
 | 
                            flex: 1;  
 | 
                        }  
 | 
  
 | 
                        .status {  
 | 
                            display: flex;  
 | 
                            // align-items: center;  
 | 
                            font-size: 26rpx;  
 | 
  
 | 
                            .btn {  
 | 
                                color: #999999;  
 | 
                                border-radius: 30rpx;  
 | 
                                border: 1rpx solid #999999;  
 | 
                                width: 116rpx;  
 | 
                                height: 60rpx;  
 | 
                                display: flex;  
 | 
                                justify-content: center;  
 | 
                                align-items: center;  
 | 
                            }  
 | 
  
 | 
                            .pri {  
 | 
                                color: #fff;  
 | 
                                background-color: $uni-color-primary; 
 | 
                                border: 1rpx solid $uni-color-primary;  
 | 
                            }  
 | 
  
 | 
                            image {  
 | 
                                width: 40rpx;  
 | 
                                height: 40rpx;  
 | 
                                margin-right: 10rpx;  
 | 
                            }  
 | 
                        }  
 | 
                    }  
 | 
  
 | 
                    .time {  
 | 
                        font-size: 24rpx;  
 | 
                        color: #999999;  
 | 
                    }  
 | 
                }  
 | 
            }  
 | 
        }  
 | 
    }  
 | 
  
 | 
    .start_btn {  
 | 
        width: 690rpx;  
 | 
        height: 88rpx;  
 | 
        background: $uni-color-primary;  
 | 
        border-radius: 44rpx;  
 | 
        font-size: 32rpx;  
 | 
        color: #FFFFFF;  
 | 
        display: flex;  
 | 
        align-items: center;  
 | 
        justify-content: center;  
 | 
        margin: 30rpx auto;  
 | 
    }  
 | 
</style> 
 |