yuxin.vue 12 KB

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