index.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432
  1. <template>
  2. <div class="airportInfo">
  3. <div class="variable">
  4. <StatisticsHeader
  5. :title="titleTop"
  6. :items="formItems"
  7. :data="formData"
  8. :eledata="eledata"
  9. with-setting
  10. :withSetting="false"
  11. :withExport="true"
  12. :set="set"
  13. :action="action"
  14. :asShow="asShow"
  15. @getFormData="getFormData"
  16. @export="tableToExcel"
  17. @upset="upset"
  18. />
  19. </div>
  20. <div class="echart">
  21. <Echarts
  22. :id="dataid"
  23. :option="tableData"
  24. v-if="picShow == true ? true : false"
  25. />
  26. <Tableformbrs
  27. :tableList="tableList"
  28. :action="action"
  29. v-if="!picShow"
  30. :set="set"
  31. />
  32. </div>
  33. </div>
  34. </template>
  35. <script>
  36. import Echarts from "../components/echart/index.vue";
  37. import Tableformbrs from "../components/echart/tableforms.vue";
  38. import StatisticsHeader from "../components/echart/statisticsHeader.vue";
  39. import { export_json_to_excel } from "@/utils/Export2Excel";
  40. import { Query } from "@/api/webApi";
  41. export default {
  42. name: "ChartsBar",
  43. data() {
  44. return {
  45. asShow: true,
  46. optiondata: [],
  47. picShow: true, //图片表格切换
  48. action: 2,
  49. dataid: "collection_ecahrt2",
  50. listqueryTemplateID: DATACONTENT_ID.modeSpecialgoods,
  51. eledata: 2,
  52. set: "",
  53. isShow: Echarts,
  54. tableList: [],
  55. tableListcop: [],
  56. listname: "",
  57. listHeader: [],
  58. tableData: {
  59. time: [],
  60. data1: [],
  61. data2: [],
  62. kg: "",
  63. tyol: "",
  64. },
  65. formData: {
  66. airport: "",
  67. dateTime: "",
  68. },
  69. titleTop: "特货统计",
  70. formItems: [
  71. {
  72. prop: "fttp",
  73. inputType: "select",
  74. placeholder: "国内国际",
  75. requiredWarning: "请先选择国内国际",
  76. clearable: true,
  77. options: [
  78. {
  79. value: "国内离港",
  80. label: "国内出港",
  81. },
  82. {
  83. value: "国际离港",
  84. label: "国际出港",
  85. },
  86. {
  87. value: "国内进港",
  88. label: "国内进港",
  89. },
  90. {
  91. value: "国际进港",
  92. label: "国际进港",
  93. },
  94. ],
  95. },
  96. {
  97. prop: "kht",
  98. inputType: "select",
  99. placeholder: "客货类型",
  100. requiredWarning: "请先选择客货类型",
  101. clearable: true,
  102. options: [
  103. {
  104. value: "客机",
  105. label: "客机",
  106. },
  107. {
  108. value: "货机",
  109. label: "货机",
  110. },
  111. {
  112. value: "其它",
  113. label: "其它",
  114. },
  115. {
  116. value: "全部",
  117. label: "全部",
  118. },
  119. ],
  120. },
  121. {
  122. prop: "td",
  123. inputType: "select",
  124. placeholder: "统计维度",
  125. requiredWarning: "请先选择统计时间维度",
  126. clearable: true,
  127. options: [
  128. {
  129. value: "月",
  130. label: "月",
  131. },
  132. {
  133. value: "年",
  134. label: "年",
  135. },
  136. ],
  137. },
  138. {
  139. prop: "spe",
  140. inputType: "select",
  141. placeholder: "特货类型",
  142. requiredWarning: "",
  143. clearable: true,
  144. options: [
  145. {
  146. value: "活",
  147. label: "活",
  148. },
  149. {
  150. value: "鲜",
  151. label: "鲜",
  152. },
  153. {
  154. value: "药",
  155. label: "药",
  156. },
  157. {
  158. value: "危",
  159. label: "危",
  160. },
  161. {
  162. value: "冷",
  163. label: "冷",
  164. },
  165. {
  166. value: "锂",
  167. label: "锂",
  168. },
  169. {
  170. value: "快",
  171. label: "快",
  172. },
  173. {
  174. value: "动",
  175. label: "动",
  176. },
  177. {
  178. value: "贵",
  179. label: "贵",
  180. },
  181. {
  182. value: "邮",
  183. label: "邮",
  184. },
  185. {
  186. value: "全部",
  187. label: "全部",
  188. },
  189. ],
  190. },
  191. {
  192. prop: "set",
  193. inputType: "select",
  194. placeholder: "统计运单",
  195. requiredWarning: "",
  196. clearable: true,
  197. options: [
  198. {
  199. value: "1",
  200. label: "统计运单",
  201. },
  202. {
  203. value: "2",
  204. label: "统计重量",
  205. },
  206. ],
  207. },
  208. {
  209. prop: "dateTime",
  210. inputType: "datePicker",
  211. clearable: true,
  212. width: "240px",
  213. options: [],
  214. },
  215. ],
  216. };
  217. },
  218. mounted() {
  219. // this.getQuery([]);
  220. },
  221. watch: {
  222. // 监听数据变化,重绘折线图
  223. option: {
  224. deep: true,
  225. handler(newVal) {},
  226. },
  227. },
  228. destroyed() {},
  229. methods: {
  230. getFormData(data) {
  231. this.tableData.time = [];
  232. this.tableData.data1 = [];
  233. this.tableData.data2 = [];
  234. this.set = data.set;
  235. let option = [
  236. {
  237. fttp: data.fttp,
  238. kht: data.kht,
  239. td: data.td,
  240. fd1: data.dateTime[0],
  241. fd2: data.dateTime[1],
  242. spe: data.spe,
  243. },
  244. ];
  245. this.optiondata = [
  246. {
  247. fttp: data.fttp,
  248. kht: data.kht,
  249. td: data.td,
  250. fd1: data.dateTime[0],
  251. fd2: data.dateTime[1],
  252. spe: data.spe,
  253. },
  254. ];
  255. this.getQuery(option, data.set);
  256. this.listname =
  257. "特货统计" +
  258. data.fttp +
  259. data.kht +
  260. data.td +
  261. data.spe +
  262. data.dateTime[0] +
  263. "--" +
  264. data.dateTime[1];
  265. this.listHeader = [
  266. "序号",
  267. "时间",
  268. "运单数(单)",
  269. "环比(%)",
  270. "重量(吨)",
  271. "环比(%)",
  272. ];
  273. },
  274. //获取表格数据
  275. async getQuery(data, dat) {
  276. try {
  277. const { code, returnData } = await Query({
  278. id: this.listqueryTemplateID,
  279. dataContent: data,
  280. });
  281. if (code == 0) {
  282. this.tableData.time = [];
  283. this.tableData.data1 = [];
  284. this.tableData.data2 = [];
  285. this.tableList = JSON.parse(JSON.stringify(returnData.listValues));
  286. this.tableListcop = JSON.parse(JSON.stringify(returnData.listValues));
  287. this.tableList.forEach((item, index) => {
  288. item.indexs = index + 1;
  289. });
  290. for (let i = 0; i < 10; i++) {
  291. if (!this.tableList[i]) {
  292. this.tableList.push({});
  293. }
  294. }
  295. this.tableListcop.forEach((item, index) => {
  296. item.indexs = index + 1;
  297. });
  298. let objar = {
  299. indexs: "合计",
  300. flightNum: returnData.listValues[0].totalFlightNum,
  301. weight: returnData.listValues[0].totalWeight,
  302. };
  303. this.tableListcop.push(objar);
  304. returnData.listValues.forEach((element) => {
  305. if (dat == 1) {
  306. this.tableData.data2.push(
  307. element.flightNum ? element.flightNum : 0
  308. );
  309. this.tableData.kg = "单位:单";
  310. } else if (dat == 2) {
  311. this.tableData.kg = "单位:吨";
  312. this.tableData.data2.push(element.weight ? element.weight : 0);
  313. }
  314. this.tableData.data1 = [];
  315. });
  316. this.tableData.data1.push(0);
  317. for (let index = 0; index < this.tableData.data2.length; index++) {
  318. if (index > 0) {
  319. const element =
  320. (this.tableData.data2[index] -
  321. this.tableData.data2[index - 1]) /
  322. this.tableData.data2[index - 1];
  323. this.tableData.data1.push(
  324. element.toFixed(2) ? element.toFixed(2) : 0
  325. );
  326. this.tableData.data1.forEach((element) => {
  327. element = Number(element);
  328. if (typeof element !== "number") {
  329. element = 0;
  330. }
  331. });
  332. }
  333. }
  334. }
  335. } catch (error) {
  336. this.page--;
  337. }
  338. },
  339. //导出
  340. tableToExcel() {
  341. import("../../../utils/Export2Excel").then((excel) => {
  342. // 设置导出表格的头部
  343. const tHeader = this.listHeader;
  344. // 将要导出的数据进行一个过滤
  345. /**
  346. * 源数据导入到excel的数据每一条重新拼成一个数组,数组里的每个元素就是filterVal里的每个字段
  347. */
  348. const data = this.tableListcop.map((item, index) => {
  349. return [
  350. item.indexs,
  351. item.dat,
  352. item.flightNum,
  353. item.flightChain,
  354. item.weight,
  355. item.weightChain,
  356. ];
  357. });
  358. data[data.length - 1].indexs = "总计";
  359. // 调用我们封装好的方法进行导出Excel
  360. excel.export_json_to_excel({
  361. // 导出的头部
  362. header: tHeader,
  363. // 导出的内容
  364. data,
  365. // 导出的文件名称
  366. filename: this.listname,
  367. // 导出的表格宽度是否自动
  368. autoWidth: true,
  369. // 导出文件的后缀类型
  370. bookType: "xlsx",
  371. });
  372. });
  373. },
  374. upset(data) {
  375. this.picShow = data;
  376. },
  377. },
  378. components: {
  379. Echarts,
  380. StatisticsHeader,
  381. Tableformbrs,
  382. },
  383. };
  384. </script>
  385. <style lang="scss" scoped>
  386. .airportInfo {
  387. position: relative;
  388. .header {
  389. width: 103%;
  390. height: 36px;
  391. display: flex;
  392. align-items: center;
  393. justify-content: center;
  394. background: #f7f7f7;
  395. position: relative;
  396. left: -23px;
  397. > .nav {
  398. padding: 0 30px 0 30px;
  399. cursor: pointer;
  400. font-size: 16px;
  401. font-family: Microsoft YaHei;
  402. font-weight: 400;
  403. color: #101116;
  404. }
  405. > .navs {
  406. height: 100%;
  407. padding: 0 30px 0 30px;
  408. cursor: pointer;
  409. display: flex;
  410. align-items: center;
  411. font-size: 16px;
  412. font-family: Microsoft YaHei;
  413. font-weight: bold;
  414. color: #ac014d;
  415. border-bottom: 2px solid #ac014d;
  416. }
  417. }
  418. .variable {
  419. width: 100%;
  420. height: 52px;
  421. }
  422. .echart {
  423. width: 100%;
  424. height: 746px;
  425. position: absolute;
  426. background: #ffffff;
  427. box-shadow: 0px 3px 3px 0px rgba(0, 0, 0, 0.1);
  428. border-radius: 4px;
  429. }
  430. }
  431. </style>