yuxin.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  1. <template>
  2. <div id="my_index">
  3. <div class="viewBar">
  4. <div v-for="item in list">
  5. <div class="item">
  6. <div class="title"
  7. >{{ item.title }}<span>{{ item.unit }}</span></div
  8. >
  9. <div class="count">{{ item.count }}</div>
  10. </div>
  11. <div class="icon">
  12. <img :src="item.icon" />
  13. </div>
  14. </div>
  15. </div>
  16. <div>
  17. <el-row :gutter="16" class="mb-10">
  18. <el-col :span="12">
  19. <el-card shadow="always" class="box-card">
  20. <div slot="header" class="clearfix">
  21. <span>场站月用煤量对比</span>
  22. </div>
  23. <div class="grid-content">
  24. <chart-bar-line
  25. :xAxisData="monthCoalData.xAxisData"
  26. :barSeries="monthCoalData.barSeries"
  27. :lineSeries="monthCoalData.lineSeries"
  28. barYAxisName="车"
  29. height="280px"
  30. />
  31. </div>
  32. </el-card>
  33. </el-col>
  34. <el-col :span="12">
  35. <el-card shadow="always" class="box-card">
  36. <div slot="header" class="clearfix">
  37. <span>场站日用煤量对比</span>
  38. </div>
  39. <div class="grid-content">
  40. <chart-bar-line
  41. :xAxisData="dayCoalData.xAxisData"
  42. :barSeries="dayCoalData.barSeries"
  43. :lineSeries="dayCoalData.lineSeries"
  44. barYAxisName="车"
  45. height="280px"
  46. />
  47. </div>
  48. </el-card>
  49. </el-col>
  50. </el-row>
  51. <el-row :gutter="16" class="mb-10">
  52. <el-col :span="12">
  53. <el-card shadow="always" class="box-card">
  54. <div slot="header" class="clearfix">
  55. <span>场站月拉灰量对比</span>
  56. </div>
  57. <div class="grid-content">
  58. <chart-bar-line
  59. :xAxisData="monthGreyData.xAxisData"
  60. :barSeries="monthGreyData.barSeries"
  61. :lineSeries="monthGreyData.lineSeries"
  62. barYAxisName="车"
  63. height="280px"
  64. />
  65. </div>
  66. </el-card>
  67. </el-col>
  68. <el-col :span="12">
  69. <el-card shadow="always" class="box-card">
  70. <div slot="header" class="clearfix">
  71. <span>场站日拉灰量对比</span>
  72. </div>
  73. <div class="grid-content">
  74. <chart-bar-line
  75. :xAxisData="dayGreyData.xAxisData"
  76. :barSeries="dayGreyData.barSeries"
  77. :lineSeries="dayGreyData.lineSeries"
  78. barYAxisName="车"
  79. height="280px"
  80. />
  81. </div>
  82. </el-card>
  83. </el-col>
  84. </el-row>
  85. <el-row :gutter="16" class="mb-10">
  86. <el-col :span="12">
  87. <el-card shadow="always" class="box-card">
  88. <div slot="header" class="clearfix">
  89. <span>场站月拉渣量对比</span>
  90. </div>
  91. <div class="grid-content">
  92. <chart-bar-line
  93. :xAxisData="monthSlagData.xAxisData"
  94. :barSeries="monthSlagData.barSeries"
  95. :lineSeries="monthSlagData.lineSeries"
  96. barYAxisName="车"
  97. height="280px"
  98. />
  99. </div>
  100. </el-card>
  101. </el-col>
  102. <el-col :span="12">
  103. <el-card shadow="always" class="box-card">
  104. <div slot="header" class="clearfix">
  105. <span>场站日拉渣量对比</span>
  106. </div>
  107. <div class="grid-content">
  108. <chart-bar-line
  109. :xAxisData="daySlagData.xAxisData"
  110. :barSeries="daySlagData.barSeries"
  111. :lineSeries="daySlagData.lineSeries"
  112. barYAxisName="车"
  113. height="280px"
  114. />
  115. </div>
  116. </el-card>
  117. </el-col>
  118. </el-row>
  119. </div>
  120. </div>
  121. </template>
  122. <script>
  123. import indexApi from '@/api/main/index.js';
  124. import chartBarLine from '@/components/ChartBarLine/index.vue';
  125. const COAL_WAREHOUSE_MAP = {
  126. '2008474572461486082': '5#场站',
  127. '2064887500559134721': '6#场站',
  128. '2064887643979165697': '7#场站'
  129. };
  130. const GREY_WAREHOUSE_MAP = {
  131. '2008475053149696001': '5#场站',
  132. '2008475191167463426': '6#场站',
  133. '2008475309006434305': '7#场站'
  134. };
  135. const COAL_STATION_KEYS = ['2008474572461486082', '2064887500559134721', '2064887643979165697'];
  136. const GREY_STATION_KEYS = ['2008475053149696001', '2008475191167463426', '2008475309006434305'];
  137. // 各图表颜色配置
  138. const CHART_COLORS = {
  139. monthCoal: ['#3876f1', '#f8cd5d', '#5cd07b'],
  140. dayCoal: ['#5e5e5e', '#f7cd5c', '#00a1f1'],
  141. monthGrey: ['#979797', '#5df9f5', '#5cd07b'],
  142. dayGrey: ['#98aa00', '#5df9f5', '#5cd07b'],
  143. monthSlag: ['#7ca7ff', '#fef538', '#b6b6b6'],
  144. daySlag: ['#39496b', '#ff7b00', '#b6b6b6']
  145. };
  146. export default {
  147. components: { chartBarLine },
  148. data() {
  149. return {
  150. list: [
  151. {
  152. title: '来煤累计数',
  153. key: 'coalInbound',
  154. count: '',
  155. icon: require('../../../assets/index/Vector@2x.png')
  156. },
  157. {
  158. title: '用煤累计数',
  159. unit: '',
  160. key: 'coalConsumption',
  161. count: '',
  162. icon: require('../../../assets/index/Vector@2x.png')
  163. },
  164. {
  165. title: '煤库存数',
  166. count: '',
  167. key: 'coalInventory',
  168. icon: require('../../../assets/index/Vector@2x.png')
  169. },
  170. ],
  171. // 图表数据
  172. monthCoalData: { xAxisData: [], barSeries: [], lineSeries: [] },
  173. dayCoalData: { xAxisData: [], barSeries: [], lineSeries: [] },
  174. monthGreyData: { xAxisData: [], barSeries: [], lineSeries: [] },
  175. dayGreyData: { xAxisData: [], barSeries: [], lineSeries: [] },
  176. monthSlagData: { xAxisData: [], barSeries: [], lineSeries: [] },
  177. daySlagData: { xAxisData: [], barSeries: [], lineSeries: [] }
  178. };
  179. },
  180. computed: {},
  181. mounted() {
  182. this.init();
  183. this.monthCoalStatistics();
  184. this.dayCoalStatistics();
  185. this.monthGreyStatistics();
  186. this.dayGreyStatistics();
  187. this.monthSlagStatistics();
  188. this.daySlagStatistics();
  189. },
  190. methods: {
  191. async init() {
  192. let data = await indexApi.coalStatistics();
  193. this.list.forEach((item) => {
  194. item.count = data[item.key];
  195. });
  196. },
  197. /* 将接口数据转为图表格式
  198. * records: API 返回的数组
  199. * timeKey: 时间字段 'month' | 'dayTime'
  200. * colors: 颜色数组 [5#, 6#, 7#]
  201. * stationKeys: 场站 ID 顺序数组
  202. * warehouseMap: warehouseId → 场站名称映射
  203. */
  204. _formatChartData(records, timeKey, colors, stationKeys, warehouseMap) {
  205. // 生成完整的时间轴(key 用于数据匹配,label 用于显示)
  206. const now = new Date();
  207. const slots = timeKey === 'month'
  208. ? Array.from({ length: 12 }, (_, i) => {
  209. const m = String(i + 1).padStart(2, '0');
  210. return { key: `${now.getFullYear()}-${m}`, label: `${i + 1}月` };
  211. })
  212. : (() => {
  213. const y = now.getFullYear();
  214. const m = String(now.getMonth() + 1).padStart(2, '0');
  215. const lastDay = new Date(y, +m, 0).getDate();
  216. return Array.from({ length: lastDay }, (_, i) => {
  217. const d = String(i + 1).padStart(2, '0');
  218. return { key: `${y}-${m}-${d}`, label: `${i + 1}` };
  219. });
  220. })();
  221. const timeKeys = slots.map((s) => s.key);
  222. const xAxisData = slots.map((s) => s.label);
  223. // 按时间分组汇总
  224. const byTime = {};
  225. records.forEach((r) => {
  226. const t = r[timeKey];
  227. if (!t) return;
  228. if (!byTime[t]) byTime[t] = {};
  229. byTime[t][r.warehouseId] = (byTime[t][r.warehouseId] || 0) + parseFloat(r.totalQuantity || 0);
  230. });
  231. const barSeries = [];
  232. const lineSeries = [];
  233. stationKeys.forEach((wid, idx) => {
  234. const name = warehouseMap[wid];
  235. const data = timeKeys.map((t) => +(byTime[t]?.[wid] || 0).toFixed(2));
  236. const color = colors[idx];
  237. barSeries.push({ name, data, color });
  238. lineSeries.push({ name: name + '趋势', data, color });
  239. });
  240. return { xAxisData, barSeries, lineSeries };
  241. },
  242. // 宇信煤的月度统计
  243. async monthCoalStatistics() {
  244. const data = await indexApi.monthCoalStatistics();
  245. this.monthCoalData = this._formatChartData(data, 'month', CHART_COLORS.monthCoal, COAL_STATION_KEYS, COAL_WAREHOUSE_MAP);
  246. },
  247. // 宇信煤的日统计
  248. async dayCoalStatistics() {
  249. const data = await indexApi.dayCoalStatistics();
  250. this.dayCoalData = this._formatChartData(data, 'dayTime', CHART_COLORS.dayCoal, COAL_STATION_KEYS, COAL_WAREHOUSE_MAP);
  251. },
  252. // 宇信灰的月度统计
  253. async monthGreyStatistics() {
  254. const data = await indexApi.greyMonthStatistics();
  255. this.monthGreyData = this._formatChartData(data, 'month', CHART_COLORS.monthGrey, GREY_STATION_KEYS, GREY_WAREHOUSE_MAP);
  256. },
  257. // 宇信灰的日统计
  258. async dayGreyStatistics() {
  259. const data = await indexApi.greyDayStatistics();
  260. this.dayGreyData = this._formatChartData(data, 'dayTime', CHART_COLORS.dayGrey, GREY_STATION_KEYS, GREY_WAREHOUSE_MAP);
  261. },
  262. // 宇信渣的月度统计
  263. async monthSlagStatistics() {
  264. const data = await indexApi.slagMonthStatistics();
  265. this.monthSlagData = this._formatChartData(data, 'month', CHART_COLORS.monthSlag, GREY_STATION_KEYS, GREY_WAREHOUSE_MAP);
  266. },
  267. // 宇信渣的日统计
  268. async daySlagStatistics() {
  269. const data = await indexApi.slagDayStatistics();
  270. this.daySlagData = this._formatChartData(data, 'dayTime', CHART_COLORS.daySlag, GREY_STATION_KEYS, GREY_WAREHOUSE_MAP);
  271. },
  272. }
  273. };
  274. </script>
  275. <style lang="scss" scoped>
  276. #my_index {
  277. // height: calc(100vh - 96px);
  278. display: flex;
  279. width: 100%;
  280. padding: 10px;
  281. flex-direction: column;
  282. box-sizing: border-box;
  283. // background-color: #dbdbdb;
  284. .viewBar {
  285. height: 90px;
  286. width: 100%;
  287. display: flex;
  288. margin-bottom: 10px;
  289. justify-content: space-around;
  290. > div {
  291. // flex: 1;
  292. width: 25%;
  293. margin-left: 10px;
  294. background: linear-gradient(to right, #2d80ee 100%, #e9f2ff 50%);
  295. border-radius: 8px;
  296. display: flex;
  297. padding: 0 20px;
  298. box-sizing: border-box;
  299. .item {
  300. flex: 1;
  301. display: flex;
  302. flex-direction: column;
  303. .title {
  304. flex: 1;
  305. display: flex;
  306. align-items: center;
  307. font-size: 16px;
  308. color: rgba(255, 255, 255, 1);
  309. > span {
  310. font-size: 12px;
  311. }
  312. }
  313. .count {
  314. flex: 1;
  315. display: flex;
  316. align-items: center;
  317. font-size: 28px;
  318. color: rgba(255, 255, 255, 1);
  319. }
  320. }
  321. .icon {
  322. width: 50px;
  323. height: 100%;
  324. display: flex;
  325. align-items: center;
  326. justify-content: center;
  327. > img {
  328. height: 50px;
  329. width: 50px;
  330. }
  331. }
  332. }
  333. > div:first-child {
  334. margin-left: 0;
  335. }
  336. }
  337. .mb-10 {
  338. margin-bottom: 10px;
  339. }
  340. }
  341. </style>