379 lines
11 KiB
Vue
379 lines
11 KiB
Vue
|
<!-- 在途 - 详情 -->
|
|||
|
<template>
|
|||
|
<!-- 详情 -->
|
|||
|
<view class="details">
|
|||
|
<DetailsNav title="任务详情"></DetailsNav>
|
|||
|
<!-- 取件状态列表 -->
|
|||
|
<view class="container">
|
|||
|
<!-- 垂直滚动区域 scroll和swiper的高度都要给且是一样的高度-->
|
|||
|
<scroll-view scroll-y="true" class="swiperH">
|
|||
|
<view class="cont" v-if="Object.keys(itemData).length > 0">
|
|||
|
<!-- 通用卡片组件 - 在途 - 带开关 -->
|
|||
|
<CardCont title="基本信息" :open="true">
|
|||
|
<DetailsBaseInfo :itemData="itemData"></DetailsBaseInfo>
|
|||
|
</CardCont>
|
|||
|
<!-- 司机信息 -->
|
|||
|
<CardCont title="车辆司机信息">
|
|||
|
<view class="carInfo">
|
|||
|
<view class="line">
|
|||
|
<text class="tit">车牌号</text>
|
|||
|
<text class="ritEl">{{ itemData.licensePlate }}</text>
|
|||
|
</view>
|
|||
|
<view class="line">
|
|||
|
<text class="tit">司机姓名</text>
|
|||
|
<text class="ritEl">{{ itemData.driverName }}</text>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
</CardCont>
|
|||
|
<CardCont title="运输路线">
|
|||
|
<RouteCont :itemData="itemData"></RouteCont>
|
|||
|
</CardCont>
|
|||
|
<!-- 物品信息 -->
|
|||
|
<CardCont title="物品信息" :label="`共计: ${amount}单`">
|
|||
|
<OrderCont
|
|||
|
:itemData="orders"
|
|||
|
@searchHandle="searchHandle"
|
|||
|
></OrderCont>
|
|||
|
</CardCont>
|
|||
|
<!-- 异常信息 -->
|
|||
|
<CardCont title="异常信息">
|
|||
|
<view v-for="(item, index) in itemData.exception" :key="index">
|
|||
|
<view class="delay">
|
|||
|
<view class="info">
|
|||
|
<view class="line">
|
|||
|
<text>上报时间 </text
|
|||
|
><text class="desc"> {{ item.exceptionTime }} </text>
|
|||
|
</view>
|
|||
|
<view class="line">
|
|||
|
<text>异常类型 </text
|
|||
|
><text class="desc"> {{ item.exceptionType }} </text>
|
|||
|
</view>
|
|||
|
<view class="line">
|
|||
|
<text>继续运输 </text
|
|||
|
><text class="desc"> {{ item.processResults }} </text>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
<image
|
|||
|
@click="ExceptionHandle('?id=' + item.exceptionId)"
|
|||
|
class="goInfoIcon"
|
|||
|
src="../../static/sj_open_rit.png"
|
|||
|
mode=""
|
|||
|
></image>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
</CardCont>
|
|||
|
<!-- 交货信息 -->
|
|||
|
<CardCont title="交货信息">
|
|||
|
<view class="upPicCont">
|
|||
|
<view class="title">请拍照上传回单凭证</view>
|
|||
|
<uni-file-picker
|
|||
|
v-model="cargoPickUpPicture"
|
|||
|
fileMediatype="image"
|
|||
|
mode="grid"
|
|||
|
limit="3"
|
|||
|
@select="selectA"
|
|||
|
/>
|
|||
|
</view>
|
|||
|
<view class="upPicCont">
|
|||
|
<view class="title">请拍照上传货品照片</view>
|
|||
|
<uni-file-picker
|
|||
|
v-model="cargoPicture"
|
|||
|
fileMediatype="image"
|
|||
|
mode="grid"
|
|||
|
limit="3"
|
|||
|
@select="selectB"
|
|||
|
/>
|
|||
|
</view>
|
|||
|
</CardCont>
|
|||
|
</view>
|
|||
|
<!-- 无数据显示 -->
|
|||
|
<view v-if="Object.keys(itemData).length === 0">
|
|||
|
<EmptyPage emptyInfo="暂无数据!" />
|
|||
|
</view>
|
|||
|
<!-- end -->
|
|||
|
</scroll-view>
|
|||
|
</view>
|
|||
|
<!-- end -->
|
|||
|
</view>
|
|||
|
<!-- footer -->
|
|||
|
<view class="footCont">
|
|||
|
<view class="footButCan">
|
|||
|
<text class="buttonCancel" @click="ExceptionHandle()">上报异常</text>
|
|||
|
</view>
|
|||
|
<view class="footBut">
|
|||
|
<text v-show="isTake" class="button" @click="takeGoods()">交付</text>
|
|||
|
<text v-show="!isTake" class="buttonDis1">交付</text>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
<!-- end -->
|
|||
|
</template>
|
|||
|
<script>
|
|||
|
export default {
|
|||
|
mounted() {
|
|||
|
// #ifdef APP-NVUE
|
|||
|
const eventChannel = this.$scope.eventChannel; // 兼容APP-NVUE
|
|||
|
// #endif
|
|||
|
// #ifndef APP-NVUE
|
|||
|
const eventChannel = this.getOpenerEventChannel();
|
|||
|
// #endif
|
|||
|
eventChannel.emit('acceptDataFromOpenedPage', {
|
|||
|
data: 'data from test page',
|
|||
|
});
|
|||
|
eventChannel.emit('someEvent', {
|
|||
|
data: 'data from test page for someEvent',
|
|||
|
});
|
|||
|
// 监听acceptDataFromOpenerPage事件,获取上一页面通过eventChannel传送到当前页面的数据
|
|||
|
eventChannel.on('acceptDataFromOpenerPage');
|
|||
|
},
|
|||
|
};
|
|||
|
</script>
|
|||
|
<script setup>
|
|||
|
import { ref, reactive, onMounted, watchEffect } from 'vue';
|
|||
|
import { useStore } from 'vuex';
|
|||
|
import { positionUploadHandle } from '@/utils/index.js';
|
|||
|
// 导入接口
|
|||
|
import {
|
|||
|
GetTaskDetails,
|
|||
|
GetTaskDetailsOrders,
|
|||
|
Deliver,
|
|||
|
} from '@/pages/api/index.js';
|
|||
|
// 导入组件
|
|||
|
import DetailsNav from '@/components/DetailsNav/index.vue';
|
|||
|
import EmptyPage from '@/components/EmptyPage/index.vue';
|
|||
|
import DetailsBaseInfo from './components/DetailsBaseInfo.vue';
|
|||
|
import OrderCont from './components/OrderCont.vue';
|
|||
|
import RouteCont from './components/RouteCont.vue';
|
|||
|
// 接口调用
|
|||
|
import { upload } from '@/pages/api/index.js';
|
|||
|
// 主体部分
|
|||
|
import CardCont from '@/components/CardCont/index.vue';
|
|||
|
|
|||
|
// ------定义变量------
|
|||
|
const store = useStore(); //vuex获取储存数据
|
|||
|
const itemData = ref([]);
|
|||
|
const orders = ref([]); // 货物信息列表
|
|||
|
const amount = ref(0); // 货物信息总数
|
|||
|
|
|||
|
const id = ref(''); // 任务Id
|
|||
|
const cargoPickUpPicture = ref([]); // 提货凭证
|
|||
|
const cargoPicture = ref([]); // 货物照片
|
|||
|
const isTake = ref(false);
|
|||
|
|
|||
|
// ------生命周期------
|
|||
|
onMounted(() => {
|
|||
|
const pages = getCurrentPages();
|
|||
|
const currentPage = pages[pages.length - 1].$page.options;
|
|||
|
id.value = currentPage.id;
|
|||
|
getDetailsInfo();
|
|||
|
getOrders();
|
|||
|
});
|
|||
|
// 监听是否可以提货
|
|||
|
watchEffect(
|
|||
|
[
|
|||
|
cargoPickUpPicture,
|
|||
|
() => {
|
|||
|
isTake.value = cargoPickUpPicture.length > 0 && cargoPicture.length > 0;
|
|||
|
},
|
|||
|
],
|
|||
|
[
|
|||
|
cargoPicture,
|
|||
|
() => {
|
|||
|
isTake.value = cargoPickUpPicture.length > 0 && cargoPicture.length > 0;
|
|||
|
},
|
|||
|
]
|
|||
|
);
|
|||
|
// ------定义方法------
|
|||
|
// 获取任务详情的数据
|
|||
|
const getDetailsInfo = async () => {
|
|||
|
// 获取任务详情的数据
|
|||
|
await GetTaskDetails(id.value)
|
|||
|
.then((res) => {
|
|||
|
const { data } = res;
|
|||
|
if (res.code === 200) {
|
|||
|
itemData.value = data;
|
|||
|
getOrders(data.transportTaskId);
|
|||
|
} else {
|
|||
|
return uni.showToast({
|
|||
|
title: res.msg,
|
|||
|
duration: 1000,
|
|||
|
icon: 'none',
|
|||
|
});
|
|||
|
}
|
|||
|
})
|
|||
|
.catch((err) => {});
|
|||
|
};
|
|||
|
// 获取物品订单信息
|
|||
|
const getOrders = async (orderId, transportOrderId = '') => {
|
|||
|
const params = {
|
|||
|
transportOrderId,
|
|||
|
taskId: orderId,
|
|||
|
page: 1,
|
|||
|
pageSize: 100,
|
|||
|
};
|
|||
|
await GetTaskDetailsOrders(params)
|
|||
|
.then((res) => {
|
|||
|
if (res.code === 200) {
|
|||
|
amount.value = res.data.counts ? res.data.counts : 0;
|
|||
|
orders.value = res.data.items;
|
|||
|
} else {
|
|||
|
return uni.showToast({
|
|||
|
title: res.msg,
|
|||
|
duration: 1000,
|
|||
|
icon: 'none',
|
|||
|
});
|
|||
|
}
|
|||
|
})
|
|||
|
.catch((err) => {});
|
|||
|
};
|
|||
|
// 物品信息搜索
|
|||
|
function searchHandle(transportOrderId) {
|
|||
|
getOrders(itemData.value.transportTaskId, transportOrderId);
|
|||
|
}
|
|||
|
// 上报异常 、异常详情
|
|||
|
function ExceptionHandle(src) {
|
|||
|
uni.showToast({
|
|||
|
title: '上报异常暂时接口还在实现中!',
|
|||
|
duration: 1000,
|
|||
|
icon: 'none',
|
|||
|
});
|
|||
|
return false;
|
|||
|
const url = src ? `/pages/index/exception${src}` : '/pages/index/exception';
|
|||
|
uni.navigateTo({ url });
|
|||
|
}
|
|||
|
|
|||
|
// 交付
|
|||
|
async function takeGoods() {
|
|||
|
const cargoPickUpPictureStr = cargoPickUpPicture.value
|
|||
|
.map((n) => n.path)
|
|||
|
.join();
|
|||
|
const cargoPictureStr = cargoPicture.value.map((n) => n.path).join();
|
|||
|
const params = {
|
|||
|
id: id.value,
|
|||
|
transportCertificate: cargoPickUpPictureStr,
|
|||
|
deliverPicture: cargoPictureStr,
|
|||
|
};
|
|||
|
// 网络慢的时候添加按钮loading
|
|||
|
let times = setTimeout(() => {
|
|||
|
uni.showLoading({
|
|||
|
title: 'loading',
|
|||
|
mask:true
|
|||
|
});
|
|||
|
}, 500);
|
|||
|
await Deliver(params)
|
|||
|
.then((res) => {
|
|||
|
if (res.code === 200) {
|
|||
|
// 交付之后 上报位置
|
|||
|
positionUploadHandle(true);
|
|||
|
// 操作成功后清除loading
|
|||
|
setTimeout(function () {
|
|||
|
uni.hideLoading();
|
|||
|
}, 500);
|
|||
|
clearTimeout(times);
|
|||
|
uni.showToast({
|
|||
|
title: '提货完成',
|
|||
|
duration: 1000,
|
|||
|
icon: 'none',
|
|||
|
});
|
|||
|
uni.redirectTo({
|
|||
|
url: '/pages/index/index',
|
|||
|
});
|
|||
|
} else {
|
|||
|
return uni.showToast({
|
|||
|
title: res.msg,
|
|||
|
duration: 1000,
|
|||
|
icon: 'none',
|
|||
|
});
|
|||
|
}
|
|||
|
})
|
|||
|
.catch((err) => {});
|
|||
|
}
|
|||
|
// 图片上传
|
|||
|
const imageValue = ref([]);
|
|||
|
const upImg = ref(null);
|
|||
|
// 文件上传
|
|||
|
async function uploadHande(e, type) {
|
|||
|
await upload(e)
|
|||
|
.then((res) => {
|
|||
|
if (res.code === 200) {
|
|||
|
if (res.data) {
|
|||
|
isTake.value = true;
|
|||
|
const name = res.data.split('/')[res.data.split('/').length - 1]; // .at(-1) 新语法APP不支持
|
|||
|
let data = {
|
|||
|
url: res.data,
|
|||
|
name,
|
|||
|
extName: name.split('.')[name.split('.').length - 1],
|
|||
|
};
|
|||
|
if (type == 'cargoPickUpPicture') {
|
|||
|
cargoPickUpPicture.value = [...cargoPickUpPicture.value, data];
|
|||
|
} else {
|
|||
|
cargoPicture.value = [...cargoPicture.value, data];
|
|||
|
}
|
|||
|
}
|
|||
|
} else {
|
|||
|
return uni.showToast({
|
|||
|
title: res.msg,
|
|||
|
duration: 1000,
|
|||
|
icon: 'none',
|
|||
|
});
|
|||
|
}
|
|||
|
})
|
|||
|
.catch((err) => {
|
|||
|
uni.showToast({
|
|||
|
title: '图片上传失败!请联系管理员',
|
|||
|
duration: 1000,
|
|||
|
icon: 'none',
|
|||
|
});
|
|||
|
});
|
|||
|
}
|
|||
|
// 文件选择并上传 - 回单凭证上传
|
|||
|
async function selectA(e) {
|
|||
|
cargoPickUpPicture.value = [];
|
|||
|
const tempFiles = e.tempFiles[0];
|
|||
|
if (
|
|||
|
tempFiles.size < 1024 * 5 * 1024 &&
|
|||
|
(tempFiles.extname == 'png' ||
|
|||
|
tempFiles.extname == 'jpg' ||
|
|||
|
tempFiles.extname == 'jpeg' ||
|
|||
|
tempFiles.extname == 'gif')
|
|||
|
) {
|
|||
|
uploadHande(e, 'cargoPickUpPicture');
|
|||
|
} else {
|
|||
|
uni.showToast({
|
|||
|
title: '上传图片大小不能超过5M,格式需为jpg、png、gif',
|
|||
|
duration: 2000,
|
|||
|
icon: 'none',
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
// 文件选择并上传 - 货品照片上传
|
|||
|
async function selectB(e) {
|
|||
|
cargoPicture.value = [];
|
|||
|
const tempFiles = e.tempFiles[0];
|
|||
|
if (
|
|||
|
tempFiles.size < 1024 * 5 * 1024 &&
|
|||
|
(tempFiles.extname == 'png' ||
|
|||
|
tempFiles.extname == 'jpg' ||
|
|||
|
tempFiles.extname == 'jpeg' ||
|
|||
|
tempFiles.extname == 'gif')
|
|||
|
) {
|
|||
|
uploadHande(e, 'cargoPicture');
|
|||
|
} else {
|
|||
|
uni.showToast({
|
|||
|
title: '上传图片大小不能超过5M,格式需为jpg、png、gif',
|
|||
|
duration: 2000,
|
|||
|
icon: 'none',
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
</script>
|
|||
|
<style src="./index.scss" lang="scss"></style>
|
|||
|
<style lang="scss" scoped>
|
|||
|
.details {
|
|||
|
height: calc(100vh - 120rpx);
|
|||
|
.swiperH {
|
|||
|
height: calc(100vh - 240rpx);
|
|||
|
padding-bottom: 26rpx;
|
|||
|
}
|
|||
|
}
|
|||
|
</style>
|