index.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469
  1. <template>
  2. <el-tabs v-model="activeName" type="border-card" @tab-click="handleClick" stretch="true">
  3. <el-tab-pane label="温湿度信息" name="first">
  4. <div id="body" :style="{width: width - 300 + 'px'}">
  5. <!-- 单据信息 -->
  6. <el-timeline>
  7. <el-timeline>
  8. <el-descriptions>
  9. <el-descriptions-item label="订单编号">{{this.basicData.billCode}}</el-descriptions-item>
  10. <el-descriptions-item label="车牌号">{{this.basicData.plateNumber}}</el-descriptions-item>
  11. </el-descriptions>
  12. <el-descriptions>
  13. <el-descriptions-item label="开始时间">{{this.basicData.startTime}}</el-descriptions-item>
  14. <el-descriptions-item label="结束时间">{{this.basicData.endTime}}</el-descriptions-item>
  15. </el-descriptions>
  16. </el-timeline>
  17. </el-timeline>
  18. <el-timeline>
  19. <!--导出按钮-->
  20. <el-button class="OutCss" v-print="'#body'" type="primary">导出</el-button>
  21. <!-- 数据表 -->
  22. <h2>订单温湿度列表</h2>
  23. <el-table
  24. :data="tableData2"
  25. stripe
  26. border
  27. style="width: 97%">
  28. <el-table-column
  29. prop="temperature"
  30. label="温度"
  31. align="center"
  32. min-width="300">
  33. </el-table-column>
  34. <el-table-column
  35. prop="hisDate"
  36. label="时间点"
  37. align="center"
  38. min-width="400">
  39. </el-table-column>
  40. <el-table-column
  41. prop="address"
  42. label="地址"
  43. min-width="500">
  44. </el-table-column>
  45. </el-table>
  46. </el-timeline>
  47. </div>
  48. <br>
  49. <div id="body" :style="{width: width - 300 + 'px'}">
  50. <el-timeline>
  51. <h2>订单温度折线图</h2>
  52. <div class="echart" id="mychart" :style="myChartStyle"></div>
  53. </el-timeline>
  54. </div>
  55. </el-tab-pane>
  56. <el-tab-pane label="运输信息" name="second">
  57. <div id="body" :style="{width: width - 300 + 'px'}">
  58. <!-- 单据信息 -->
  59. <el-timeline>
  60. <el-timeline>
  61. <el-descriptions>
  62. <el-descriptions-item label="订单编号">{{this.basicData.billCode}}</el-descriptions-item>
  63. <el-descriptions-item label="车牌号">{{this.basicData.plateNumber}}</el-descriptions-item>
  64. </el-descriptions>
  65. <el-descriptions>
  66. <el-descriptions-item label="开始时间">{{this.basicData.startTime}}</el-descriptions-item>
  67. <el-descriptions-item label="结束时间">{{this.basicData.endTime}}</el-descriptions-item>
  68. </el-descriptions>
  69. </el-timeline>
  70. </el-timeline>
  71. <!-- 地图 -->
  72. <div id="container"></div>
  73. <!-- 订单温湿度列表 -->
  74. <el-timeline>
  75. <br>
  76. <h2>订单温湿度列表</h2>
  77. <el-table
  78. :data="tableData1"
  79. height="200"
  80. style="width: 97%">
  81. <el-table-column
  82. prop="maxTemperature"
  83. label="温度最大值"
  84. align="center"
  85. min-width="100">
  86. </el-table-column>
  87. <el-table-column
  88. prop="avgTemperature"
  89. label="温度平均值"
  90. align="center"
  91. min-width="100">
  92. </el-table-column>
  93. <el-table-column
  94. prop="minTemperature"
  95. label="温度最小值"
  96. align="center"
  97. min-width="100">
  98. </el-table-column>
  99. <el-table-column
  100. prop="maxHumidity"
  101. label="湿度最大值"
  102. align="center"
  103. min-width="100">
  104. </el-table-column>
  105. <el-table-column
  106. prop="avgHumidity"
  107. label="湿度平均值"
  108. align="center"
  109. min-width="100">
  110. </el-table-column>
  111. <el-table-column
  112. prop="minHumidity"
  113. label="湿度最小值"
  114. align="center"
  115. min-width="100">
  116. </el-table-column>
  117. <el-table-column
  118. prop="startTime"
  119. label="开始时间"
  120. align="center"
  121. min-width="250">
  122. </el-table-column>
  123. <el-table-column
  124. prop="endTime"
  125. align="center"
  126. label="结束时间"
  127. min-width="250">
  128. </el-table-column>
  129. </el-table>
  130. </el-timeline>
  131. </div>
  132. </el-tab-pane>
  133. </el-tabs>
  134. </template>
  135. <script>
  136. import AMapLoader from '@amap/amap-jsapi-loader'
  137. window._AMapSecurityConfig = {
  138. securityJsCode: '8e23904a0cf421675353f31fd1fc213c'
  139. }
  140. import historyApi from '@/api/WMS/historical-route'
  141. import * as echarts from "echarts";
  142. export default {
  143. data() {
  144. return {
  145. width: document.documentElement.clientWidth - 10,
  146. param: this.$route.query,
  147. basicData:{
  148. billCode: "",
  149. plateNumber: "",
  150. startTime: "",
  151. endTime: ""
  152. },
  153. //标签页
  154. activeName: 'first',
  155. //地图对象
  156. map: null,
  157. //图表
  158. myChart: {},
  159. xData: [], //横坐标
  160. temperatureData: [], //温度数据
  161. humidityData: [], //湿度数据
  162. myChartStyle: { float: "left", width: "100%", height: "400px" }, //图表样式
  163. position: [],
  164. //运输信息表单数据
  165. tableData1:[],
  166. //运输信息表单数据准备
  167. modelData1:[{
  168. maxTemperature:"",
  169. avgTemperature:"",
  170. minTemperature:"",
  171. maxHumidity:"",
  172. avgHumidity:"",
  173. minHumidity:"",
  174. startTime:"",
  175. endTime:""
  176. }],
  177. tableData2:[],
  178. resData:[],
  179. resX:[],
  180. resYTemperature:[],
  181. resYHumidity:[],
  182. carMessage:{
  183. billCode: "",
  184. plateNumber: "",
  185. startTime: "",
  186. endTime: ""
  187. },
  188. option:{}
  189. };
  190. },
  191. mounted() {
  192. //DOM初始化完成进行地图初始化
  193. this.initMap();
  194. // this.initEcharts();
  195. },
  196. methods: {
  197. handleClick(tab, event) {
  198. console.log(tab, event);
  199. this.handleGeocodeRepo(this.carMessage);
  200. },
  201. //地图初始化
  202. initMap() {
  203. AMapLoader.load({
  204. key: 'f953210b2d5276ffbf5a2bc01ef80f55', // 申请好的Web端开发者Key,首次调用 load 时必填
  205. version: '2.0', // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
  206. plugins: [''] // 需要使用的的插件列表,如比例尺'AMap.Scale'等
  207. })
  208. .then(AMap => {
  209. this.map = new AMap.Map('container', {
  210. //设置地图容器id
  211. viewMode: '3D', //是否为3D地图模式
  212. zoom: 13, //初始化地图级别
  213. center: [112.976376,28.195318] //初始化地图中心点位置
  214. })
  215. })
  216. .catch(e => {
  217. console.log(e)
  218. })
  219. },
  220. //渲染图表
  221. initEcharts() {
  222. this.option = {
  223. tooltip: {
  224. trigger: 'axis'
  225. },
  226. grid: {
  227. left: '3%',
  228. right: '4%',
  229. bottom: '5%',
  230. containLabel: true
  231. },
  232. toolbox: {
  233. feature: {
  234. saveAsImage: {}
  235. }
  236. },
  237. xAxis: {
  238. data: this.xData
  239. },
  240. legend: { // 图例
  241. data: ["温度", "湿度/100"],
  242. // bottom: "0%"
  243. },
  244. yAxis: {},
  245. series: [
  246. {
  247. name: "温度",
  248. data: this.temperatureData,
  249. type: "line", // 类型设置为折线图
  250. label: {
  251. show: true,
  252. position: "top",
  253. textStyle: {
  254. fontSize: 16
  255. }
  256. },
  257. }
  258. // {
  259. // name: "湿度/100",
  260. // data: this.humidityData,
  261. // type: "line", // 类型设置为折线图
  262. // label: {
  263. // show: true,
  264. // position: "bottom",
  265. // textStyle: {
  266. // fontSize: 16
  267. // }
  268. // }
  269. // }
  270. ]
  271. };
  272. this.windowSize();
  273. },
  274. //随着屏幕大小调节图表
  275. windowSize() {
  276. this.myChart = echarts.init(document.getElementById("mychart"));
  277. this.myChart.setOption(this.option);
  278. window.addEventListener("resize", () => {
  279. this.myChart.resize();
  280. });
  281. },
  282. handleGeocodeRepo(data) {
  283. // let data = {
  284. // billCode: "CS01",
  285. // plateNumber: "湘A79D2R",
  286. // startTime: "2023-02-01",
  287. // endTime: "2023-02-02"
  288. // }
  289. console.log(data, 'data');
  290. historyApi.queryAddress(data).then(res => {
  291. console.log(res, 'res-----------------');
  292. // //X轴时间数据
  293. // this.xData = res.data.map(item => {return item.hisDate});
  294. // //温度数据转换
  295. // this.temperatureData = res.data.map(item => {return item.temperature});
  296. // //湿度数据转换
  297. // this.humidityData = res.data.map(item => {return item.humidity});
  298. let { code, data } = res;
  299. // let text;
  300. let count = 0;
  301. if (code == 200) {
  302. //定义经纬度不为0的数组[i]为起点
  303. for (let i = 0; i < data.length; i++) {
  304. if (data[i].gpsLatitude != 0 && data[i].gpsLongitude != 0) {
  305. //定义经纬度不为0的数组[j]为终点
  306. for (let j = data.length - 1; j > i; j--) {
  307. if (data[j].gpsLatitude != 0 && data[j].gpsLongitude != 0) {
  308. var map, route;
  309. //基本地图加载
  310. map = new AMap.Map("container", {
  311. resizeEnable: true
  312. });
  313. //绘制初始路径
  314. var path = [];
  315. path.push([data[i].gpsLongitude, data[i].gpsLatitude]);
  316. //起点数据
  317. this.resData[0] = res.data[i];
  318. this.resX[0] = res.data[i].hisDate;
  319. this.resYTemperature[0] = res.data[i].temperature;
  320. this.resYHumidity[0] = res.data[i].humidity / 100;
  321. //定义递增值
  322. let increment = Math.trunc((j - i) / 14);
  323. //途径点数据
  324. for (let z = i + increment; z < j; z = z + increment) {
  325. // for (let z = i; z < j; z++) {
  326. if(data[z].gpsLongitude != 0 && data[z].gpsLatitude != 0) {
  327. path.push([data[z].gpsLongitude, data[z].gpsLatitude]);
  328. this.resData[count + 1] = res.data[z];
  329. this.resX[count + 1] = res.data[z].hisDate;
  330. this.resYTemperature[count + 1] = res.data[z].temperature;
  331. this.resYHumidity[count + 1] = res.data[z].humidity / 100;
  332. count++;
  333. }
  334. }
  335. path.push([data[j].gpsLongitude, data[j].gpsLatitude]);
  336. //终点数据
  337. this.resData[count] = res.data[j];
  338. this.resX[count] = res.data[j].hisDate;
  339. this.resYTemperature[count] = res.data[j].temperature;
  340. this.resYHumidity[count] = res.data[j].humidity / 100;
  341. map.plugin("AMap.DragRoute", function() {
  342. route = new AMap.DragRoute(map, path, AMap.DrivingPolicy.LEAST_FEE); //构造拖拽导航类
  343. route.search(); //查询导航路径并开启拖拽导航
  344. });
  345. this.xData = res.data.temperature;
  346. this.tableData2 = this.resData;
  347. this.xData = this.resX;
  348. this.temperatureData = this.resYTemperature;
  349. this.humidityData = this.resYHumidity;
  350. //计算订单温湿度列表值
  351. let maxT = data[i].temperature;
  352. let maxH = data[i].humidity;
  353. let minT = data[i].temperature;
  354. let minH = data[i].humidity;
  355. let aggT = 0;
  356. let aggH = 0;
  357. // let test1 = 0;
  358. // let test2 = 0;
  359. for (let x = i; x < j; x++) {
  360. //温度最大值
  361. if (res.data[x].temperature > maxT) {
  362. maxT = res.data[x].temperature;
  363. }
  364. //湿度最大值
  365. if (res.data[x].humidity > maxH) {
  366. maxH = res.data[x].humidity;
  367. }
  368. //温度最小值
  369. if (res.data[x].temperature < minT) {
  370. minT = res.data[x].temperature
  371. }
  372. //湿度最小值
  373. if (res.data[x].humidity < minH) {
  374. minH = res.data[x].humidity
  375. }
  376. // test1 += res.data[x].temperature + ", "
  377. // test2 += res.data[x].humidity + ", "
  378. aggT += parseFloat(res.data[x].temperature);
  379. aggH += parseFloat(res.data[x].humidity);
  380. }
  381. // console.log(aggT, 'aggt');
  382. // console.log(aggH, 'aggh');
  383. // console.log(test1, 'test');
  384. // console.log(test2, 'test2');
  385. // console.log(i, 'i')
  386. // console.log(j, 'j')
  387. let avgT = aggT / (j - i);
  388. let avgH = aggH / (j - i);
  389. //对订单温湿度列表进行赋值
  390. this.modelData1[0].maxTemperature = maxT;
  391. this.modelData1[0].maxHumidity = maxH;
  392. this.modelData1[0].minTemperature = minT;
  393. this.modelData1[0].minHumidity = minH;
  394. this.modelData1[0].avgTemperature = avgT.toFixed(2);
  395. this.modelData1[0].avgHumidity = avgH.toFixed(1);
  396. this.modelData1[0].startTime = res.data[i].hisDate;
  397. this.modelData1[0].endTime = res.data[j].hisDate;
  398. this.tableData1 = this.modelData1;
  399. //对基础数据进行赋值
  400. this.basicData.billCode = this.resData[i].billCode;
  401. this.basicData.plateNumber = this.resData[i].measuringPointName;
  402. this.basicData.startTime = this.modelData1[0].startTime
  403. this.basicData.endTime = this.modelData1[0].endTime
  404. //渲染图表
  405. this.initEcharts();
  406. return;
  407. }
  408. }
  409. }
  410. }
  411. }
  412. })
  413. // queryAddress({})
  414. }
  415. },
  416. created() {
  417. console.log(this.$route.query,'this.$route')
  418. this.carMessage = this.$route.query;
  419. this.handleGeocodeRepo(this.carMessage);
  420. }
  421. };
  422. </script>
  423. <style scoped>
  424. #container {
  425. padding: 100px;
  426. margin: 10px;
  427. width: 1000;
  428. height: 800px;
  429. }
  430. .Button {
  431. padding-top:3px;
  432. padding-left:1000px;
  433. padding-right:3px;
  434. padding-bottom:100px;
  435. }
  436. .OutCss {
  437. float: right;
  438. }
  439. #body {
  440. /* padding: 0px 200px 0px 200px; */
  441. margin: 0 auto;
  442. }
  443. @media print {
  444. @page {
  445. margin: 0;
  446. size: portrait;
  447. /* size: A4 landscape; size: landscape横向,size: portrait;纵向,如果不设置,则页面有横向和纵向的选择框 */
  448. }
  449. #body {
  450. /* margin: 20cm; */
  451. margin: 0 auto;
  452. /* 打印时缩放,防止页面溢出 */
  453. zoom: 0.6;
  454. }
  455. }
  456. </style>