productionSchedule.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824
  1. <template>
  2. <vue-fullscreen
  3. class="box-container"
  4. v-model="isFullscreen"
  5. fullscreenClass="box-container"
  6. :exit-on-click-wrapper="false"
  7. v-cloak
  8. >
  9. <div class="box-container">
  10. <div class="box-header">
  11. <div class="logo">
  12. </div>
  13. <div class="title"> 生产进度看板 </div>
  14. <div class="time">
  15. <span
  16. style="color: #7fa7ce; margin: 5px 10px 15px 0; cursor: pointer"
  17. @click.passive="onFullscreen"
  18. >
  19. <i
  20. v-if="isFullscreen"
  21. title="取消全屏"
  22. class="el-icon-_screen-restore"
  23. ></i>
  24. <i v-else title="全屏" class="el-icon-_screen-full"></i>
  25. </span>
  26. <div style="margin-right: 10px">
  27. <span style="color: #7fa7ce">{{ date }}</span>
  28. <span style="color: rgb(210 215 221); padding: 0 5px">{{
  29. time
  30. }}</span>
  31. <span style="color: #7fa7ce">{{ week }} </span>
  32. </div>
  33. </div>
  34. </div>
  35. <div class="box-middle">
  36. <template v-for="item in borderData">
  37. <div class="box-middle-content">
  38. <dvBorderContent :objD="item"></dvBorderContent>
  39. </div>
  40. </template>
  41. </div>
  42. <div class="box-footer">
  43. <div class="box-footer-left">
  44. <div class="box-echarts">
  45. <div class="box-echarts-top">
  46. <span class="box-top-name">合格数统计</span>
  47. <!-- <span class="box-top-unit">(万元)</span> -->
  48. </div>
  49. <div class="monthly_sales_volume">
  50. <div
  51. v-if="isFlag"
  52. id="monthly_sales_volume"
  53. ref="monthly_sales_volume"
  54. ></div>
  55. </div>
  56. </div>
  57. <div class="box-echarts">
  58. <div class="box-echarts-top">
  59. <span class="box-top-name">月度产量统计</span>
  60. <!-- <span class="box-top-unit">(KG)</span> -->
  61. </div>
  62. <div class="monthly_output">
  63. <div v-if="isFlag" id="monthly_output" ref="monthly_output"></div>
  64. </div>
  65. </div>
  66. </div>
  67. <div class="box-footer-right">
  68. <div class="box-echarts-top">
  69. <span class="box-top-name">生产工单进度</span>
  70. </div>
  71. <dv-scroll-board
  72. v-if="isFlag"
  73. :config="config"
  74. style="width: 90%; height: 87%; transform: translate(5%, 1%)"
  75. />
  76. </div>
  77. </div>
  78. </div>
  79. </vue-fullscreen>
  80. </template>
  81. <script>
  82. import dvBorderContent from './dv-border-content.vue';
  83. import * as echarts from 'echarts';
  84. import { component } from 'vue-fullscreen';
  85. import { isFullscreen } from 'ele-admin';
  86. import { count, getSalesFinishListAPI, completionCount } from '@/api/mes/productionSchedule'
  87. export default {
  88. name: 'index',
  89. components: {
  90. dvBorderContent,
  91. VueFullscreen: component
  92. },
  93. computed: {
  94. contentWidth() {
  95. return this.$store.state.theme.contentWidth;
  96. }
  97. },
  98. watch: {
  99. isFullscreen: {
  100. handler() {
  101. this.isFlag = false;
  102. this.$nextTick(() => {
  103. let { clientWidth: deviceWidth, clientHeight: deviceHeight } =
  104. document.documentElement;
  105. let eleAdminHeaderHeight =
  106. (!this.isFullscreen &&
  107. document.getElementsByClassName('ele-admin-header')[0]
  108. ?.offsetHeight) ||
  109. 0;
  110. let eleAdminSidebarWidth =
  111. (!this.isFullscreen &&
  112. document.getElementsByClassName('ele-admin-sidebar')[0]
  113. ?.offsetWidth) ||
  114. 0;
  115. let eleAdminTabsWidth =
  116. (!this.isFullscreen &&
  117. document.getElementsByClassName('ele-admin-tabs')[0]
  118. ?.offsetHeight) ||
  119. 0;
  120. const setContainerSize = (item) => {
  121. item.style.height =
  122. deviceHeight - eleAdminHeaderHeight - eleAdminTabsWidth + 'px';
  123. item.style.width = deviceWidth - eleAdminSidebarWidth + 'px';
  124. };
  125. let boxContainer = [
  126. ...document.getElementsByClassName('box-container')
  127. ];
  128. boxContainer.forEach(setContainerSize);
  129. document.documentElement.style.fontSize = this.isFullscreen
  130. ? '24px'
  131. : '16px';
  132. this.isFlag = true;
  133. this.$nextTick(() => {
  134. let chartDom = this.$refs.monthly_sales_volume;
  135. this.salesChart = echarts.init(chartDom);
  136. let chartDom2 = this.$refs.monthly_output;
  137. this.outputChart = echarts.init(chartDom2);
  138. this.getMonthlySalesStatistic();
  139. this.getMonthlyProduceStatistic();
  140. });
  141. });
  142. },
  143. immediate: true
  144. },
  145. contentWidth: {
  146. handler() {
  147. this.isFlag = false;
  148. this.$nextTick(() => {
  149. let { clientWidth: deviceWidth, clientHeight: deviceHeight } =
  150. document.documentElement;
  151. let eleAdminHeaderHeight =
  152. (!this.isFullscreen &&
  153. document.getElementsByClassName('ele-admin-header')[0]
  154. ?.offsetHeight) ||
  155. 0;
  156. let eleAdminSidebarWidth =
  157. (!this.isFullscreen &&
  158. document.getElementsByClassName('ele-admin-sidebar')[0]
  159. ?.offsetWidth) ||
  160. 0;
  161. let eleAdminTabsWidth =
  162. (!this.isFullscreen &&
  163. document.getElementsByClassName('ele-admin-tabs')[0]
  164. ?.offsetHeight) ||
  165. 0;
  166. const setContainerSize = (item) => {
  167. item.style.height =
  168. deviceHeight - eleAdminHeaderHeight - eleAdminTabsWidth + 'px';
  169. item.style.width = deviceWidth - eleAdminSidebarWidth + 'px';
  170. };
  171. let boxContainer = [
  172. ...document.getElementsByClassName('box-container')
  173. ];
  174. boxContainer.forEach(setContainerSize);
  175. document.documentElement.style.fontSize = this.isFullscreen
  176. ? '24px'
  177. : '16px';
  178. this.isFlag = true;
  179. this.$nextTick(() => {
  180. let chartDom = this.$refs.monthly_sales_volume;
  181. this.salesChart = echarts.init(chartDom);
  182. let chartDom2 = this.$refs.monthly_output;
  183. this.outputChart = echarts.init(chartDom2);
  184. this.getMonthlySalesStatistic();
  185. this.getMonthlyProduceStatistic();
  186. });
  187. });
  188. },
  189. immediate: true
  190. }
  191. },
  192. deactivated() {
  193. clearInterval(this.updateTimer);
  194. },
  195. data() {
  196. return {
  197. isFullscreen: false, // 是否是全屏
  198. isFlag: false, // 是否展示图表
  199. date: '',
  200. time: '',
  201. week: '',
  202. signedTotal: 0,
  203. deliveryTotal: 0,
  204. salesTotal: 0,
  205. WeightGainTotal: 0,
  206. WeightStorageTotal: 0,
  207. salesChart: null,
  208. outputChart: null,
  209. borderData: [
  210. {
  211. titleName: '生产总数',
  212. titleUnit: '',
  213. value: '0',
  214. },
  215. {
  216. titleName: '待生产数量',
  217. titleUnit: '',
  218. value: '0',
  219. },
  220. {
  221. titleName: '已完成数量',
  222. titleUnit: '',
  223. value: '0',
  224. },
  225. // {
  226. // titleName: '工时统计',
  227. // titleUnit: '',
  228. // value: '0',
  229. // fun: () => getIncreaseWeightAPI()
  230. // },
  231. {
  232. titleName: '生产中数量',
  233. titleUnit: '',
  234. value: '',
  235. }
  236. ],
  237. monthlySalesVolumeOption: {
  238. legend: {
  239. left: 'center',
  240. selectedMode: false,
  241. itemGap: 30,
  242. textStyle: {
  243. fontSize: '0.7rem',
  244. color: '#fff',
  245. lineHeight: 0,
  246. padding: [10, 0, 0, 0]
  247. }
  248. },
  249. grid: {
  250. bottom: '5%', // 组件离容器底部的距离
  251. containLabel: true // 包含坐标轴的标签
  252. },
  253. xAxis: {
  254. type: 'category',
  255. data: [],
  256. axisLabel: {
  257. interval: 0,
  258. formatter: function (value, index) {
  259. let month = value.split('-');
  260. return month[1] + '月';
  261. },
  262. textStyle: {
  263. color: '#fff', // 修改字体颜色为红色
  264. fontSize: '0.7rem',
  265. fontFamily: 'AlibabaPuHuiTi' // 修改字体为Arial
  266. }
  267. }
  268. },
  269. yAxis: [{
  270. type: 'value',
  271. axisLabel: {
  272. textStyle: {
  273. color: '#fff', // 修改字体颜色为红色
  274. fontSize: '0.7rem',
  275. fontFamily: 'AlibabaPuHuiTi' // 修改字体为Arial
  276. }
  277. }
  278. }, {
  279. type: 'value',
  280. max: 100,
  281. min: 0,
  282. axisLabel: {
  283. textStyle: {
  284. color: '#fff', // 修改字体颜色为红色
  285. fontSize: '0.7rem',
  286. fontFamily: 'AlibabaPuHuiTi' // 修改字体为Arial
  287. },
  288. show: true,
  289. formatter: "{value}%", //右侧Y轴文字显示
  290. }
  291. }],
  292. series: []
  293. },
  294. monthlyOutputOption: {
  295. legend: {
  296. left: 'center',
  297. selectedMode: false,
  298. itemGap: 40,
  299. textStyle: {
  300. color: '#fff',
  301. lineHeight: 0,
  302. fontSize: '0.7rem',
  303. padding: [10, 0, 0, 0]
  304. }
  305. },
  306. grid: {
  307. bottom: '5%', // 组件离容器底部的距离
  308. containLabel: true // 包含坐标轴的标签
  309. },
  310. xAxis: {
  311. type: 'category',
  312. data: [],
  313. axisLabel: {
  314. interval: 0,
  315. formatter: function (value, index) {
  316. let month = value.split('-');
  317. return month[1] + '月';
  318. },
  319. textStyle: {
  320. color: '#fff', // 修改字体颜色为红色
  321. fontSize: '0.7rem',
  322. fontFamily: 'AlibabaPuHuiTi' // 修改字体为Arial
  323. }
  324. }
  325. },
  326. yAxis: {
  327. type: 'value',
  328. axisLabel: {
  329. textStyle: {
  330. color: '#fff', // 修改字体颜色为红色
  331. fontSize: '0.7rem',
  332. fontFamily: 'AlibabaPuHuiTi' // 修改字体为Arial
  333. }
  334. }
  335. },
  336. series: []
  337. },
  338. tableHeader: [
  339. '客户代号',
  340. '生产工单号',
  341. '编码',
  342. '名称',
  343. '当前工序',
  344. '交付状态'
  345. ],
  346. config: {
  347. header: [],
  348. data: [],
  349. align: ['center', 'center', 'center', 'center', 'center', 'center'],
  350. headerBGC: '#031d42',
  351. columnWidth: [110,200],
  352. headerHeight: 20,
  353. oddRowBGC: '#031d42',
  354. evenRowBGC: '#031d42',
  355. waitTime: 5000,
  356. rowNum: 12
  357. },
  358. // 1未交付2提前3按时4延期
  359. deliveryStatusList: [
  360. {
  361. dictKey: 1,
  362. dictValue: '未交付'
  363. },
  364. {
  365. dictKey: 2,
  366. dictValue: '提前'
  367. },
  368. {
  369. dictKey: 3,
  370. dictValue: '按时'
  371. },
  372. {
  373. dictKey: 4,
  374. dictValue: '延期'
  375. }
  376. ],
  377. //1未生产2已生产3已完成
  378. produceStatusList: [
  379. {
  380. dictKey: 1,
  381. dictValue: '未生产'
  382. },
  383. {
  384. dictKey: 2,
  385. dictValue: '已生产'
  386. },
  387. {
  388. dictKey: 3,
  389. dictValue: '已完成'
  390. }
  391. ],
  392. //1未采购2已采购3已入库
  393. purchaseStatusList: [
  394. {
  395. dictKey: 1,
  396. dictValue: '未采购'
  397. },
  398. {
  399. dictKey: 2,
  400. dictValue: '已采购'
  401. },
  402. {
  403. dictKey: 3,
  404. dictValue: '已入库'
  405. }
  406. ],
  407. //scheduleStatus 排产状态 1待排产2已排产 integer(int32)*/
  408. scheduleStatusList: [
  409. {
  410. dictKey: 1,
  411. dictValue: '待排产'
  412. },
  413. {
  414. dictKey: 2,
  415. dictValue: '已排产'
  416. }
  417. ]
  418. };
  419. },
  420. created() {
  421. this.updateTimer = setInterval(this.updateTime, 1000);
  422. },
  423. mounted() {
  424. this.getAllAmount();
  425. this.getSalesFinishList();
  426. setInterval(() => {
  427. this.getAllAmount();
  428. this.getSalesFinishList();
  429. }, 600000);
  430. },
  431. methods: {
  432. /* 全屏切换 */
  433. onFullscreen() {
  434. this.isFullscreen = !this.isFullscreen;
  435. },
  436. //获取头部统计
  437. async getAllAmount() {
  438. let rest = await count({factoriesId: 0});
  439. this.borderData.forEach(async (item) => {
  440. if (item.titleName === '生产总数') {
  441. item.value = rest.formingNum || 0;
  442. } else if (item.titleName === '待生产数量') {
  443. item.value = rest.pendingProductionCount || 0;
  444. } else if (item.titleName === '已完成数量') {
  445. item.value = rest.formedNum || 0;
  446. } else if (item.titleName === '生产中数量') {
  447. item.value = rest.inProgressWorkOrderCount || 0;
  448. }
  449. });
  450. // console.log(rest, 'rest');
  451. },
  452. //获取合格数统计
  453. async getMonthlySalesStatistic() {
  454. let params = {
  455. startDate: new Date().getFullYear() + '-01-01',
  456. endDate: new Date().getFullYear() + '-12-31',
  457. factoriesId: 0
  458. }
  459. let data = await completionCount(params);
  460. let series = [
  461. {
  462. field: 'formedNum',
  463. name: '合格数量',
  464. data: [],
  465. type: 'bar',
  466. itemStyle: {
  467. color: '#03c391'
  468. }
  469. },
  470. {
  471. field: 'noQualifiedSum',
  472. name: '不合格数量',
  473. data: [],
  474. type: 'bar',
  475. itemStyle: {
  476. color: '#ea5082'
  477. }
  478. },
  479. {
  480. field: 'qualifiedRate',
  481. name: '合格率',
  482. data: [],
  483. type: 'line',
  484. }
  485. ];
  486. this.monthlySalesVolumeOption.xAxis.data = data.map(
  487. (item) => item.inProductDate
  488. );
  489. series.forEach((item) => {
  490. item.data = data.map((i) => {
  491. if (item.field === 'qualifiedRate' && i['formedNum'] > 0) {
  492. return 100
  493. }
  494. return i[item.field]
  495. });
  496. });
  497. this.monthlySalesVolumeOption.series = series;
  498. this.salesChart.setOption(this.monthlySalesVolumeOption);
  499. },
  500. //获取月度产量统计
  501. async getMonthlyProduceStatistic() {
  502. let params = {
  503. startDate: new Date().getFullYear() + '-01-01',
  504. endDate: new Date().getFullYear() + '-12-31',
  505. factoriesId: 0
  506. }
  507. let data = await completionCount(params);
  508. let series = [
  509. {
  510. field: 'inWarehouseCount',
  511. name: '成品入库数量',
  512. data: [],
  513. type: 'bar',
  514. itemStyle: {
  515. color: '#e9ac80'
  516. }
  517. },
  518. {
  519. field: 'packingWeightSum',
  520. name: '成品入库重量',
  521. data: [],
  522. type: 'bar',
  523. itemStyle: {
  524. color: '#03c391'
  525. }
  526. }
  527. ];
  528. this.monthlyOutputOption.xAxis.data = data.map((item) => item.inProductDate);
  529. series.forEach((item) => {
  530. item.data = data.map((i) => i[item.field]);
  531. });
  532. this.monthlyOutputOption.series = series;
  533. this.outputChart.setOption(this.monthlyOutputOption);
  534. },
  535. //生产工单
  536. async getSalesFinishList() {
  537. /*serialNo 客户代号 string
  538. days 交付状态 N剩余N天 0已完成 -1延期 integer(int32)
  539. productName 名称 integer(int32)
  540. productCode 设备编码 1未采购2已采购3已入库 integer(int32)
  541. code 工单号 string
  542. taskName 当前工序 */
  543. let data = await getSalesFinishListAPI({factoriesId: 0});
  544. this.config = {
  545. header: this.tableHeader.map(
  546. (item) =>
  547. `<div style="color: #f4d29c;font-size: 0.9rem;font-weight: bold">${item}</div>`
  548. ),
  549. data:
  550. data.map((item) => {
  551. let list = [];
  552. for (let i in item) {
  553. let div = '';
  554. if (i === 'serialNo') {
  555. div = `<div class="white" style="font-size: 0.8rem;">${item[i] || '无'}</div>`;
  556. list[0] = div;
  557. }
  558. if (i === 'code') {
  559. div = `<div class="white" style="font-size: 0.8rem;">${item[i]}</div>`;
  560. list[1] = div;
  561. }
  562. if (i === 'productCode') {
  563. div = `<div class="yellow" style="font-size: 0.8rem;">${item[i]}</div>`;
  564. list[2] = div;
  565. }
  566. if (i === 'productName') {
  567. div = `<div class="white" style="font-size: 0.8rem;">${item[i]}</div>`;
  568. list[3] = div;
  569. }
  570. if (i === 'taskName') {
  571. div = `<div class="yellow" style="font-size: 0.8rem;">${item[i]}</div>`;
  572. list[4] = div;
  573. }
  574. if (i === 'days') {
  575. //0已完成,-1延期,大于0剩余N天
  576. if (item[i] == '-1') {
  577. div = `<div class="white" style="font-size: 0.8rem;color:red">已延期</div>`;
  578. list[5] = div;
  579. }
  580. if (item[i] == '0') {
  581. div = `<div class="green" style="font-size: 0.8rem;">已完成</div>`;
  582. list[5] = div;
  583. }
  584. if (item[i] > 0) {
  585. div = `<div class="yellow" style="font-size: 0.8rem;">剩余${item[i]}天</div>`;
  586. list[5] = div;
  587. }
  588. }
  589. }
  590. return list;
  591. }) ?? [],
  592. align: ['center', 'center', 'center', 'center', 'center', 'center'],
  593. headerBGC: '#031d42',
  594. columnWidth: [100,200],
  595. headerHeight: 30,
  596. oddRowBGC: '#031d42',
  597. evenRowBGC: '#031d42',
  598. waitTime: 5000,
  599. rowNum: 10
  600. };
  601. },
  602. //实时更新日期
  603. updateTime() {
  604. let now = new Date();
  605. let hours = now.getHours();
  606. let minutes = now.getMinutes();
  607. let seconds = now.getSeconds();
  608. this.time =
  609. hours.toString().padStart(2, '0') +
  610. ':' +
  611. minutes.toString().padStart(2, '0') +
  612. ':' +
  613. seconds.toString().padStart(2, '0');
  614. let year = now.getFullYear();
  615. let month = now.getMonth() + 1;
  616. let day = now.getDate();
  617. this.date = year + '年' + month + '月' + day + '日';
  618. let weekInfo = {
  619. 1: '一',
  620. 2: '二',
  621. 3: '三',
  622. 4: '四',
  623. 5: '五',
  624. 6: '六',
  625. 0: '日'
  626. };
  627. this.week = '星期' + weekInfo[now.getDay()];
  628. }
  629. }
  630. };
  631. </script>
  632. <style lang="scss" scoped>
  633. .box-container {
  634. font-size: 16px;
  635. font-family: 'AlibabaPuHuiTi';
  636. background: #011635;
  637. display: flex;
  638. flex-direction: column;
  639. .box-header {
  640. background-image: url('@/assets/border2.png');
  641. background-repeat: no-repeat;
  642. background-size: 100% 100%;
  643. display: flex;
  644. width: 100% !important;
  645. height: 10%;
  646. justify-content: space-between;
  647. .title {
  648. font-family: '优设标题黑';
  649. font-size: 2.75rem;
  650. flex: 1;
  651. display: flex;
  652. justify-content: center;
  653. align-items: center;
  654. color: #fff;
  655. transform: translateY(-10%);
  656. letter-spacing: 0.4rem;
  657. }
  658. .logo {
  659. display: inline-block;
  660. width: 20%;
  661. }
  662. .time {
  663. width: 20%;
  664. display: flex;
  665. align-items: center;
  666. justify-content: space-around;
  667. flex-direction: column;
  668. align-items: flex-end;
  669. justify-content: flex-start;
  670. font-size: 0.8rem;
  671. }
  672. }
  673. .box-middle {
  674. width: 100% !important;
  675. height: 10% !important;
  676. display: flex;
  677. justify-content: space-evenly;
  678. margin: 5px 0 10px 0;
  679. .box-middle-content {
  680. width: 15%;
  681. height: 100%;
  682. background-image: url('@/assets/border1.png');
  683. background-repeat: no-repeat;
  684. background-size: 100% 100%;
  685. margin: 0px 28px 10px 0px;
  686. }
  687. .border-box-content {
  688. }
  689. }
  690. .box-footer {
  691. flex: 1;
  692. display: flex;
  693. justify-content: space-around;
  694. .box-footer-left {
  695. width: 50%;
  696. height: 100%;
  697. .box-echarts {
  698. width: 100%;
  699. height: 50%;
  700. display: flex;
  701. flex-direction: column;
  702. background-image: url('@/assets/border3.png');
  703. background-repeat: no-repeat;
  704. background-size: 100% 100%;
  705. .box-echarts-top {
  706. height: 20%;
  707. width: 100%;
  708. display: flex;
  709. align-items: center;
  710. /* justify-content: space-around; */
  711. transform: translateX(6%);
  712. color: #fff;
  713. .box-top-name {
  714. display: inline-block;
  715. font-size: 1.3rem;
  716. font-weight: bold;
  717. }
  718. .box-top-unit {
  719. display: inline-block;
  720. font-size: 0.75rem;
  721. transform: translate(0px, 20%);
  722. letter-spacing: 1px;
  723. font-weight: bold;
  724. }
  725. }
  726. .monthly_sales_volume {
  727. transform: translateX(-7%);
  728. flex: 1;
  729. //width: 100%;
  730. //height: 100%;
  731. #monthly_sales_volume {
  732. width: 113%;
  733. height: 100%;
  734. }
  735. }
  736. .monthly_output {
  737. transform: translateX(-7%);
  738. flex: 1;
  739. #monthly_output {
  740. width: 113%;
  741. height: 100%;
  742. //width: 100%;
  743. //height: 100%;
  744. }
  745. }
  746. }
  747. }
  748. .box-footer-right {
  749. width: 50%;
  750. height: 100%;
  751. background-image: url('@/assets/border4.png');
  752. background-repeat: no-repeat;
  753. background-size: 100% 100%;
  754. .box-echarts-top {
  755. height: 10.5%;
  756. width: 100%;
  757. display: flex;
  758. align-items: center;
  759. /* justify-content: space-around; */
  760. transform: translateX(8%);
  761. color: #fff;
  762. font-size: 1.1rem;
  763. letter-spacing: 2px;
  764. .box-top-name {
  765. display: inline-block;
  766. font-size: 1.3rem;
  767. font-weight: bold;
  768. }
  769. }
  770. }
  771. }
  772. }
  773. [v-cloak] {
  774. display: none;
  775. }
  776. </style>
  777. <style>
  778. .white {
  779. color: #ffffff;
  780. }
  781. .yellow {
  782. color: #ffd16c;
  783. }
  784. .green {
  785. color: green;
  786. }
  787. .red {
  788. color: red;
  789. }
  790. </style>