123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669 |
- <template>
- <div id="print">
- <el-tabs v-model="activeName" type="border-card" stretch @tab-click="handleClick">
- <el-tab-pane label="温湿度信息" name="first">
- <div id="body" :style="{width: width - 300 + 'px'}">
- <!-- 单据信息 -->
- <el-timeline>
- <el-timeline>
- <el-descriptions>
- <el-descriptions-item label="订单编号">{{this.basicData.billCode}}</el-descriptions-item>
- <el-descriptions-item label="车牌号">{{this.basicData.plateNumber}}</el-descriptions-item>
- </el-descriptions>
- <el-descriptions>
- <el-descriptions-item label="开始时间">{{this.basicData.startTime}}</el-descriptions-item>
- <el-descriptions-item label="结束时间">{{this.basicData.endTime}}</el-descriptions-item>
- </el-descriptions>
- <!--导出按钮-->
- <el-button class="OutCss" v-print="'#print'" type="primary">导出</el-button>
- </el-timeline>
- </el-timeline>
- <el-timeline>
- <!-- 数据表 -->
- <h2>订单温湿度列表</h2>
- <el-table :data="tableData2" stripe border style="width: 97%">
- <el-table-column prop="measuringPointName" label="车牌号或保温箱" align="center" min-width="150" />
- <el-table-column prop="measuringPointAddr" label="探头" align="center" min-width="90" />
- <el-table-column prop="temperature" label="温度" align="center" min-width="80" />
- <el-table-column prop="hisDate" label="时间点" align="center" min-width="200" />
- <el-table-column prop="measuringPointName1" label="车牌号或保温箱" align="center" min-width="150" />
- <el-table-column prop="measuringPointAddr1" label="探头" align="center" min-width="90" />
- <el-table-column prop="temperature1" label="温度" align="center" min-width="80" />
- <el-table-column prop="hisDate1" label="时间点" align="center" min-width="200" />
- <!-- <el-table-column prop="address" label="地址" width="400" /> -->
- </el-table>
- </el-timeline>
- </div>
- <br>
- <div id="body" :style="{width: width - 300 + 'px'}">
- <el-timeline>
- <h2>订单温度折线图</h2>
- <div class="echart" id="mychart" :style="myChartStyle"></div>
- </el-timeline>
- </div>
- </el-tab-pane>
- <el-tab-pane label="运输信息" name="second">
- <div id="body" :style="{width: width - 300 + 'px'}">
- <!-- 单据信息 -->
- <el-timeline>
- <el-timeline>
- <el-descriptions>
- <el-descriptions-item label="订单编号">{{this.basicData.billCode}}</el-descriptions-item>
- <el-descriptions-item label="车牌号">{{this.basicData.plateNumber}}</el-descriptions-item>
- </el-descriptions>
- <el-descriptions>
- <el-descriptions-item label="开始时间">{{this.basicData.startTime}}</el-descriptions-item>
- <el-descriptions-item label="结束时间">{{this.basicData.endTime}}</el-descriptions-item>
- </el-descriptions>
- </el-timeline>
- </el-timeline>
- <!-- 地图 -->
- <div id="container"></div>
- <!-- 订单温湿度列表 -->
- <el-timeline>
- <br>
- <h2>订单温湿度列表</h2>
- <el-table :data="tableData1" height="200" style="width: 97%">
- <el-table-column prop="maxTemperature" label="温度最大值" align="center" min-width="100" />
- <el-table-column prop="avgTemperature" label="温度平均值" align="center" min-width="100" />
- <el-table-column prop="minTemperature" label="温度最小值" align="center" min-width="100" />
- <el-table-column prop="maxHumidity" label="湿度最大值" align="center" min-width="100" />
- <el-table-column prop="avgHumidity" label="湿度平均值" align="center" min-width="100" />
- <el-table-column prop="minHumidity" label="湿度最小值" align="center" min-width="100" />
- <el-table-column prop="startTime" label="开始时间" align="center" min-width="250" />
- <el-table-column prop="endTime" label="结束时间" align="center" min-width="250" />
- </el-table>
- </el-timeline>
- </div>
- </el-tab-pane>
- </el-tabs>
- </div>
- </template>
- <script>
- import AMapLoader from '@amap/amap-jsapi-loader'
- window._AMapSecurityConfig = {
- securityJsCode: '8e23904a0cf421675353f31fd1fc213c'
- }
- import historyApi from '@/api/WMS/historical-route'
- import * as echarts from "echarts";
- export default {
- data() {
- return {
- width: document.documentElement.clientWidth - 10,
- param: this.$route.query,
- basicData: {
- billCode: "",
- plateNumber: "",
- startTime: "",
- endTime: ""
- },
- //标签页
- activeName: 'first',
- //地图对象
- map: null,
- //图表
- myChart: {},
- xData: [], //横坐标
- temperatureData: [], //温度数据
- humidityData: [], //湿度数据
- myChartStyle: {
- float: "left",
- width: "100%",
- height: "400px"
- }, //图表样式
- //运输信息表单数据
- tableData1: [],
- //运输信息表单数据准备
- modelData1: [{
- maxTemperature: "",
- avgTemperature: "",
- minTemperature: "",
- maxHumidity: "",
- avgHumidity: "",
- minHumidity: "",
- startTime: "",
- endTime: ""
- }],
- //温湿度信息表单数据
- tableData2: [],
- resData: [],
- carMessage: {
- billCode: "",
- plateNumber: "",
- boxCode: [],
- startTime: "",
- endTime: ""
- },
- option: {},
- //表单各值
- maxT: 0,
- maxH: 0,
- minT: 0,
- minH: 0,
- aggT: 0,
- aggH: 0,
- avgT: 0,
- avgH: 0
- };
- },
- mounted() {
- //DOM初始化完成进行地图初始化
- this.initMap();
- },
- created() {
- //把传参中的保温箱转换成数组
- this.carMessage = this.$route.query;
- if (this.carMessage.boxCode != null) {
- this.carMessage.boxCode = this.$route.query.boxCode.split(',');
- }
- //当结束时间为空时,默认为当前时间
- if (this.carMessage.endTime == '' || this.carMessage.endTime == null) {
- this.carMessage.endTime = this.formatDateTime(this.getCurrentTime(), 'yyyy-MM-dd HH:mm:ss');
- }
- console.log(this.carMessage, 'this.carMessage')
- this.handleGeocodeRepo(this.carMessage);
- },
- methods: {
- //通过传参查询数据
- handleGeocodeRepo(data) {
- historyApi.queryAddress(data).then(res => {
- console.log(res, 'res-----------------');
- if (res.code == 200) {
- //定义路线数组
- let path = [];
- //筛选含经纬度的数组
- let latitudeLongitude = [];
- let count = 0;
- for (let i = 0; i < res.data.length; i++) {
- if (res.data[i].gpsLatitude != 0 && res.data[i].gpsLongitude != 0) {
- latitudeLongitude[count++] = res.data[i];
- }
- }
- //定义整数递增值,并且绘制初始路径
- if (latitudeLongitude.length >= 14) {
- this.increment = Math.trunc(latitudeLongitude.length / 14);
- for (let i = 0; i < latitudeLongitude.length; i = i + this.increment) {
- path.push([latitudeLongitude[i].gpsLongitude, latitudeLongitude[i].gpsLatitude]);
- }
- } else {
- for (let i = 0; i < latitudeLongitude.length; i++) {
- path.push([latitudeLongitude[i].gpsLongitude, latitudeLongitude[i].gpsLatitude]);
- }
- }
- //计算各值
- this.calculate(res.data);
- //对订单温湿度列表进行赋值
- this.assignmentTable1(res.data);
- //提取探头种类数量
- let probeSum = [];
- let probe = [];
- for (let i = 0; i < latitudeLongitude.length; i++) {
- probeSum[i] = latitudeLongitude[i].measuringPointAddr;
- }
- probe = Array.from(new Set(probeSum));
- //车辆温度数组
- let c, d;
- this.initEcharts();
- for (let i = 0; i < probe.length; i++) {
- let carForm = {
- name: this.carMessage.plateNumber + '/' + probe[i],
- data: [],
- type: "line",
- smooth: true,
- showSymbol: false,
- label: {
- show: true,
- position: "top",
- textStyle: {
- fontSize: 12
- }
- },
- markArea: {
- itemStyle: {
- color: 'rgba(255, 0, 0)'
- },
- data: [
- [{
- name: '冷藏温度警戒线',
- yAxis: '8'
- },
- {
- yAxis: '8.1'
- }
- ],
- [{
- name: '冷藏温度警戒线',
- yAxis: '2'
- },
- {
- yAxis: '1.9'
- }
- ],
- [{
- name: '冷冻温度警戒线',
- yAxis: '-15'
- },
- {
- yAxis: '-14.9'
- }
- ],
- [{
- name: '冷冻温度警戒线',
- yAxis: '-25'
- },
- {
- yAxis: '-25.1'
- }
- ]
- ]
- }
- }
- // count = 0;
- for (let j = 0; j < latitudeLongitude.length; j++) {
- if (carForm.name.indexOf(latitudeLongitude[j].measuringPointAddr) != -1) {
- c = latitudeLongitude[j].hisDate;
- d = latitudeLongitude[j].temperature;
- carForm.data.push([c, d]);
- }
- }
- this.option.series.push(carForm);
- this.option.legend.data.push(carForm.name);
- }
- //筛选保温箱的数组
- if (this.carMessage.boxCode != null) {
- let e, f;
- for (let i = 0; i < this.carMessage.boxCode.length; i++) {
- let boxForm = {
- name: this.carMessage.boxCode[i],
- data: [],
- type: "line",
- smooth: true,
- showSymbol: false,
- label: {
- show: true,
- position: "top",
- textStyle: {
- fontSize: 12
- }
- },
- markArea: {
- itemStyle: {
- color: 'rgba(255, 0, 0)'
- },
- data: [
- [{
- name: '冷藏温度警戒线',
- yAxis: '8'
- },
- {
- yAxis: '8.1'
- }
- ],
- [{
- name: '冷藏温度警戒线',
- yAxis: '2'
- },
- {
- yAxis: '1.9'
- }
- ],
- [{
- name: '冷冻温度警戒线',
- yAxis: '-15'
- },
- {
- yAxis: '-14.9'
- }
- ],
- [{
- name: '冷冻温度警戒线',
- yAxis: '-25'
- },
- {
- yAxis: '-25.1'
- }
- ]
- ]
- }
- }
- // count = 0;
- for (let j = 0; j < res.data.length; j++) {
- if (boxForm.name == res.data[j].measuringPointName) {
- e = res.data[j].hisDate;
- f = res.data[j].temperature;
- boxForm.data.push([e, f]);
- }
- }
- this.option.series.push(boxForm);
- this.option.legend.data.push(boxForm.name);
- }
- }
- //如果车辆温度数组为空,则其它数组前移一位
- for (let i = 1;;) {
- if (this.option.series[0].data.length == 0) {
- for (let j = 0; j < this.option.series.length - i; j++) {
- this.option.series[j] = this.option.series[j + 1];
- this.option.legend.data[j] = this.option.legend.data[j + 1];
- }
- this.option.series[this.option.series.length - i] = '';
- this.option.legend.data[this.option.series.length - i++] = '';
- }
- if (this.option.series[0].data.length != 0) {
- break;
- }
- }
- this.windowSize();
- //对基础数据进行赋值
- this.basicData.billCode = this.carMessage.billCode;
- this.basicData.plateNumber = this.carMessage.plateNumber;
- this.basicData.startTime = this.xData[0];
- this.basicData.endTime = this.xData[this.xData.length - 1];
- //基本地图加载
- this.loadMap(path);
- }
- })
- },
- handleClick(tab, event) {
- console.log(tab, event);
- this.handleGeocodeRepo(this.carMessage);
- },
- //地图初始化
- initMap() {
- AMapLoader.load({
- //申请好的Web端开发者Key,首次调用 load 时必填
- key: 'f953210b2d5276ffbf5a2bc01ef80f55',
- //指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
- version: '2.0',
- //需要使用的的插件列表,如比例尺'AMap.Scale'等
- plugins: ['']
- })
- .then(AMap => {
- this.map = new AMap.Map('container', {
- //设置地图容器id
- //是否为3D地图模式
- viewMode: '3D',
- //初始化地图级别
- zoom: 13,
- //初始化地图中心点位置
- center: [112.976376, 28.195318]
- })
- })
- .catch(e => {
- console.log(e)
- })
- },
- //基本地图加载
- loadMap(path) {
- var map, route;
- map = new AMap.Map("container", {
- resizeEnable: true
- });
- map.plugin("AMap.DragRoute", function () {
- //构造拖拽导航类
- route = new AMap.DragRoute(map, path, AMap.DrivingPolicy.LEAST_FEE);
- //查询导航路径并开启拖拽导航
- route.search();
- });
- },
- //图表属性赋值
- initEcharts() {
- this.option = {
- tooltip: {
- trigger: 'axis',
- axisPointer: {
- type: 'cross'
- }
- },
- grid: {
- x: 22,
- y: 30,
- x2: 20,
- y2: 18,
- borderWidth: 1,
- },
- toolbox: {
- //保存图
- // show: true,
- // feature: {
- // saveAsImage: {}
- // }
- },
- xAxis: {
- type: 'category',
- boundaryGap: false,
- data: this.xData
- },
- //图例
- legend: {
- data: [],
- // bottom: "0%"
- },
- yAxis: {
- name: '温度',
- // Y轴最大值
- max: 10,
- // Y轴最大值
- min: -30,
- splitNumber: 2,
- // 间隔值
- // interval: 3
- },
- //加上dataZoom可实现缩放
- dataZoom: [{
- //x轴
- type: 'slider',
- xAxisIndex: 0,
- },
- {
- //x轴
- type: 'inside',
- xAxisIndex: 0,
- /**
- * 如何触发缩放。可选值为:true:表示不按任何功能键,鼠标滚轮能触发缩放。false:表示鼠标滚轮不能触发缩放。
- * 'shift':表示按住 shift和鼠标滚轮能触发缩放。
- * 'ctrl':表示按住 ctrl 和鼠标滚轮能触发缩放。'alt':表示按住 alt 和鼠标滚轮能触发缩放。
- */
- zoomOnMouseWheel: 'true',
- },
- ],
- /**
- * series中的参数:
- * smooth:是否曲线,showSymbol:是否显示数据和数据点
- */
- series: [],
- }
- },
- //渲染图表
- windowSize() {
- this.myChart = echarts.init(document.getElementById("mychart"));
- this.myChart.setOption(this.option);
- window.addEventListener("resize", () => {
- this.myChart.resize();
- });
- },
- //计算各值
- calculate(array) {
- //数组中的温度湿度的字符串转成浮点
- for (let i = 0; i < array.length; i++) {
- array[i].temperature = parseFloat(array[i].temperature);
- array[i].humidity = parseFloat(array[i].humidity);
- }
- //定义初始值
- this.maxT = array[0].temperature;
- this.maxH = array[0].humidity;
- this.minT = array[0].temperature;
- this.minH = array[0].humidity;
- this.aggT = 0;
- this.aggH = 0;
- let x = [];
- for (let i = 0; i < array.length; i++) {
- //对X轴的时间进行赋值
- x[i] = array[i].hisDate;
- //对Y轴的温度进行赋值
- // this.temperatureData[i] = array[i].temperature;
- //温度最大值
- if (array[i].temperature > this.maxT) {
- this.maxT = array[i].temperature;
- }
- //湿度最大值
- if (array[i].humidity > this.maxH) {
- this.maxH = array[i].humidity;
- }
- //温度最小值
- if (array[i].temperature < this.minT) {
- this.minT = array[i].temperature
- }
- //湿度最小值
- if (array[i].humidity < this.minH) {
- this.minH = array[i].humidity
- }
- //温湿度合计值
- this.aggT += array[i].temperature;
- this.aggH += array[i].humidity;
- }
- //x数组去重
- x = Array.from(new Set(x));
- let xSort = [];
- for (let i = 0; i < x.length; i++) {
- xSort[i] = new Date(x[i]);
- }
- xSort.sort(function (a, b) {
- return a - b;
- })
- for (let i = 0; i < xSort.length; i++) {
- x[i] = this.formatDateTime(xSort[i], 'yyyy-MM-dd HH:mm:ss');
- }
- this.xData = x;
- //温湿度平均值
- this.avgT = this.aggT / array.length;
- this.avgH = this.aggH / array.length;
- },
- //对订单温湿度列表进行赋值
- assignmentTable1(array) {
- this.modelData1[0].maxTemperature = this.maxT;
- this.modelData1[0].maxHumidity = this.maxH;
- this.modelData1[0].minTemperature = this.minT;
- this.modelData1[0].minHumidity = this.minH;
- this.modelData1[0].avgTemperature = this.avgT.toFixed(2);
- this.modelData1[0].avgHumidity = this.avgH.toFixed(1);
- this.modelData1[0].startTime = array[0].hisDate;
- this.modelData1[0].endTime = array[array.length - 1].hisDate;
- this.tableData1 = this.modelData1;
- let median = (array.length / 2).toFixed(0);
- let table = []
- for (let i = 0; i < median; i++) {
- table[i] = {
- measuringPointName: '',
- measuringPointAddr: '',
- temperature: '',
- hisDate: '',
- measuringPointName1: '',
- measuringPointAddr1: '',
- temperature1: '',
- hisDate1: ''
- }
- }
- if (array.length % 2 == 0) {
- for (let i = 0, j = 0, z = 1; i < median; i++, j = j + 2, z = z + 2) {
- table[i].measuringPointName = array[j].measuringPointName;
- table[i].measuringPointAddr = array[j].measuringPointAddr;
- table[i].temperature = array[j].temperature;
- table[i].hisDate = array[j].hisDate;
- table[i].measuringPointName1 = array[z].measuringPointName;
- table[i].measuringPointAddr1 = array[z].measuringPointAddr;
- table[i].temperature1 = array[z].temperature;
- table[i].hisDate1 = array[z].hisDate;
- }
- } else {
- for (let i = 0, j = 0, z = 1; i < median; i++, j = j + 2, z = z + 2) {
- table[i].measuringPointName = array[j].measuringPointName;
- table[i].measuringPointAddr = array[j].measuringPointAddr;
- table[i].temperature = array[j].temperature;
- table[i].hisDate = array[j].hisDate;
- if (i != median - 1) {
- table[i].measuringPointName1 = array[z].measuringPointName;
- table[i].measuringPointAddr1 = array[z].measuringPointAddr;
- table[i].temperature1 = array[z].temperature;
- table[i].hisDate1 = array[z].hisDate;
- }
- }
- }
- this.tableData2 = table;
- },
- //获取当前时间
- getCurrentTime() {
- let date = new Date();
- return date;
- },
- //日期名称格式化
- formatDateTime(date, format) {
- const o = {
- 'M+': date.getMonth() + 1, // 月份
- 'd+': date.getDate(), // 日
- 'h+': date.getHours() % 12 === 0 ? 12 : date.getHours() % 12, // 小时
- 'H+': date.getHours(), // 小时
- 'm+': date.getMinutes(), // 分
- 's+': date.getSeconds(), // 秒
- 'q+': Math.floor((date.getMonth() + 3) / 3), // 季度
- S: date.getMilliseconds(), // 毫秒
- a: date.getHours() < 12 ? '上午' : '下午', // 上午/下午
- A: date.getHours() < 12 ? 'AM' : 'PM', // AM/PM
- };
- if (/(y+)/.test(format)) {
- format = format.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length));
- }
- for (let k in o) {
- if (new RegExp('(' + k + ')').test(format)) {
- format = format.replace(
- RegExp.$1,
- RegExp.$1.length === 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length)
- );
- }
- }
- return format;
- },
- }
- };
- </script>
- <style scoped>
- #container {
- padding: 100px;
- margin: 10px;
- width: 1000;
- height: 800px;
- }
- .OutCss {
- float: right;
- }
- #body {
- /* padding: 0px 200px 0px 200px; */
- margin: 0 auto;
- }
- @media print {
- @page {
- margin: 0;
- size: portrait;
- /* size: A4 landscape; size: landscape横向,size: portrait;纵向,如果不设置,则页面有横向和纵向的选择框 */
- }
- #body {
- /* margin: 20cm; */
- margin: 0 auto;
- /* 打印时缩放,防止页面溢出 */
- zoom: 0.6;
- }
- }
- </style>
|