compete.vue 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851
  1. <template>
  2. <div>
  3. <div class="container structure-l" style="margin: 0;width: calc(75% - 15px);">
  4. <div class="container-box">
  5. <div class="mc-nomal-title">竞争对手信息统计</div>
  6. <div
  7. style="height: calc(100% - 80px);overflow-y: scroll;width: 100%;overflow-x: hidden;padding-right: 20px;margin-top: 15px;">
  8. <div class="search" style="margin-top: 0;">
  9. <mySearch :searchList="searchList" @searchInfo="searchInfo"></mySearch>
  10. </div>
  11. <div class="yysbox">
  12. <div class="yys">
  13. <h3>中国电信</h3>
  14. <div v-for="(item,index) in dxlist" :key="index" style="background: #6096E6;">
  15. <span>{{item.tariffName}}</span>
  16. <span>{{item.taffiffContent}}</span>
  17. </div>
  18. <em @click="checkallForm(1)">更多</em>
  19. </div>
  20. <div class="yys">
  21. <h3>中国联通</h3>
  22. <div v-for="(item,indext) in ltlist" :key="indext" style="background: #FFBA55;">
  23. <span>{{item.tariffName}}</span>
  24. <span>{{item.taffiffContent}}</span>
  25. </div>
  26. <em @click="checkallForm(1)">更多</em>
  27. </div>
  28. <div class="yys">
  29. <h3>其他</h3>
  30. <div v-for="(item,indexr) in ydlist" :key="indexr" style="background: #56CA95;">
  31. <span>{{item.tariffName}}</span>
  32. <span>{{item.taffiffContent}}</span>
  33. </div>
  34. <em @click="checkallForm(1)">更多</em>
  35. </div>
  36. </div>
  37. <div class="mc-total-box">
  38. <span class="mc-total-title">总览</span>
  39. <div class="mc-action-box">
  40. <span style="margin-right: 20px;cursor: pointer;" @click="checkallForm(1)">竞争对手收集信息列表</span>
  41. <span style="cursor: pointer;" @click="checkallForm(2)">新增</span>
  42. </div>
  43. </div>
  44. <div class="mc-flex-box">
  45. <div class="mc-flex-item">
  46. <div class="mc-flex-value">{{total}}</div>
  47. <div class="mc-flex-title">总量</div>
  48. </div>
  49. <div class="mc-flex-item">
  50. <div class="mc-flex-value">{{mobileTotal}}</div>
  51. <div class="mc-flex-title">移动</div>
  52. </div>
  53. <div class="mc-flex-item">
  54. <div class="mc-flex-value">{{unicomTotal}}</div>
  55. <div class="mc-flex-title">联通</div>
  56. </div>
  57. <div class="mc-flex-item">
  58. <div class="mc-flex-value">{{telcomTotal}}</div>
  59. <div class="mc-flex-title">电信</div>
  60. </div>
  61. </div>
  62. <div id="main"></div>
  63. <div v-for="(item,index) in dataList" :key="index">
  64. <div class="mc-nomal-title">{{item.violationCateName}}</div>
  65. <div class="echart-box">
  66. <div class="left-echarts echarts-cirle-top" :id="'echarts-cirle'+index"></div>
  67. <div class="right-echarts echarts-bar-top" :id="'echarts-bar'+index"></div>
  68. </div>
  69. </div>
  70. </div>
  71. </div>
  72. </div>
  73. <competeRight></competeRight>
  74. </div>
  75. </template>
  76. <script>
  77. import echarts from 'echarts'
  78. import competeRight from "../../../components/competeRight";
  79. import mySearch from "../../../components/search.vue";
  80. export default {
  81. components: {
  82. competeRight,
  83. mySearch
  84. },
  85. data() {
  86. return {
  87. region: [],
  88. mobile: [], //移动
  89. telcom: [], //电信
  90. unicom: [], //联通
  91. mobileTotal: 0, //移动
  92. telcomTotal: 0, //电信
  93. unicomTotal: 0, //联通
  94. total: 0,
  95. dataList: [],
  96. myChart: null,
  97. topCirle: null,
  98. topBar: null,
  99. searchList: [{
  100. type: 'sel',
  101. tit: '地市',
  102. value: '',
  103. width: '32%',
  104. options: [],
  105. },
  106. {
  107. type: 'date',
  108. tit: '开始时间',
  109. value: '',
  110. width: '32%',
  111. },
  112. {
  113. type: 'date',
  114. tit: '结束时间',
  115. value: '',
  116. width: '32%',
  117. }
  118. ],
  119. dxlist: [],
  120. ltlist: [],
  121. ydlist: [],
  122. params: {}
  123. }
  124. },
  125. methods: {
  126. searchInfo(v) {
  127. v[0] ? this.params.region = v[0] : this.params.region = '';
  128. v[1] ? this.params.timefrom = this.$formatDate(v[1], "YYYY-MM-DD") : this.params.timefrom = '';
  129. v[2] ? this.params.timeto = this.$formatDate(v[2], "YYYY-MM-DD") : this.params.timeto = '';
  130. this.getCompet();
  131. },
  132. //获取数据
  133. getList() {
  134. let _this = this;
  135. this.$http({
  136. url: "/market/cwcompetitor/stastics",
  137. method: "post",
  138. headers: {
  139. "Content-Type": "application/json",
  140. },
  141. data: {},
  142. }).then((res) => {
  143. this.region = res.data.body.region;
  144. this.mobile = res.data.body.mobile;
  145. this.telcom = res.data.body.telcom;
  146. this.unicom = res.data.body.unicom;
  147. this.mobileTotal = res.data.body.mobileTotal;
  148. this.telcomTotal = res.data.body.telcomTotal;
  149. this.unicomTotal = res.data.body.unicomTotal;
  150. this.total = res.data.body.total;
  151. this.getechart();
  152. });
  153. this.$http({
  154. url: "/market/cwcompetitor/catestastics",
  155. method: "post",
  156. headers: {
  157. "Content-Type": "application/json",
  158. },
  159. data: {},
  160. }).then((res) => {
  161. res.data.body.forEach(item => {
  162. item.region = [];
  163. item.mobile = [];
  164. item.telcom = [];
  165. item.unicom = [];
  166. for (let i = 0; i < item.violationItemList.length; i++) {
  167. item.region.push(item.violationItemList[i].violationItemName);
  168. item.mobile.push(item.violationItemList[i].mobileCnt * 1);
  169. item.telcom.push(item.violationItemList[i].telcomCnt * 1);
  170. item.unicom.push(item.violationItemList[i].unicomCnt * 1);
  171. }
  172. })
  173. _this.dataList = res.data.body;
  174. _this.checkData();
  175. });
  176. },
  177. //加载处理
  178. checkData() {
  179. let _this = this;
  180. let t = setInterval(function() {
  181. let txt = 'echarts-cirle0';
  182. if (document.getElementById(txt)) {
  183. for (let i = 0; i < _this.dataList.length; i++) {
  184. _this.getechartlt(_this.dataList[i], i);
  185. _this.getechartrt(_this.dataList[i], i);
  186. }
  187. clearInterval(t);
  188. }
  189. }, 500)
  190. },
  191. //折线图
  192. getechart() {
  193. this.myChart = echarts.init(document.getElementById('main'));
  194. let color = [
  195. "#0090FF",
  196. "#36CE9E",
  197. "#fe9a05",
  198. "#3FCEC8",
  199. "#FF515A",
  200. "#00CA69"
  201. ];
  202. let xData = this.region;
  203. let yidong = this.mobile;
  204. let dianxin = this.telcom;
  205. let liantong = this.unicom;
  206. this.myChart.setOption({
  207. color: color,
  208. legend: {
  209. right: 30,
  210. top: 20
  211. },
  212. tooltip: {
  213. trigger: "axis",
  214. axisPointer: {
  215. type: 'shadow'
  216. },
  217. formatter: function(params) {
  218. var html = '';
  219. for (var i = 0; i < params.length; i++) {
  220. html +=
  221. '<div style="color: #666;font-size: 14px;line-height: 24px"><span style="display:inline-block;margin-right:5px;border-radius:10px;width:10px;height:10px;background-color:' +
  222. color[params[i].componentIndex] + ';"></span>' + params[i].seriesName +
  223. ' <span style="color:' + color[params[i].componentIndex] +
  224. ';font-weight:700;font-size: 18px">' + params[i].value + '</span>';
  225. }
  226. return html
  227. },
  228. extraCssText: 'background: #fff; border-radius: 0;box-shadow: 0 0 3px rgba(0, 0, 0, 0.2);color: #333;',
  229. },
  230. grid: {
  231. top: 70,
  232. bottom: 20,
  233. left: 10,
  234. right: 20,
  235. containLabel: true
  236. },
  237. xAxis: [{
  238. type: "category",
  239. boundaryGap: true,
  240. axisLabel: {
  241. // formatter: '{value}月',
  242. textStyle: {
  243. color: "#999",
  244. fontSize: 12
  245. },
  246. interval: 0,
  247. // rotate: 30
  248. },
  249. triggerEvent: true,
  250. axisLine: {
  251. lineStyle: {
  252. color: "#D9D9D9"
  253. }
  254. },
  255. data: xData
  256. }],
  257. yAxis: [{
  258. type: "value",
  259. // name: '单位:万千瓦时',
  260. axisLabel: {
  261. textStyle: {
  262. color: "#666"
  263. }
  264. },
  265. nameTextStyle: {
  266. color: "#666",
  267. fontSize: 12,
  268. lineHeight: 40
  269. },
  270. splitLine: {
  271. lineStyle: {
  272. type: "dashed",
  273. color: "#E9E9E9"
  274. }
  275. },
  276. axisLine: {
  277. show: false
  278. },
  279. axisTick: {
  280. show: false
  281. }
  282. }],
  283. series: [{
  284. name: "移动 ",
  285. type: "bar",
  286. smooth: true,
  287. // showSymbol: false,/
  288. symbolSize: 8,
  289. zlevel: 3,
  290. lineStyle: {
  291. normal: {
  292. color: color[0],
  293. }
  294. },
  295. areaStyle: {
  296. normal: {
  297. color: new echarts.graphic.LinearGradient(
  298. 0,
  299. 0,
  300. 0,
  301. 1,
  302. [{
  303. offset: 0,
  304. color: this.hexToRgba(color[0], 0.3)
  305. },
  306. {
  307. offset: 1,
  308. color: this.hexToRgba(color[0], 0.1)
  309. }
  310. ],
  311. false
  312. ),
  313. shadowColor: this.hexToRgba(color[0], 0.1),
  314. shadowBlur: 10
  315. }
  316. },
  317. data: yidong
  318. },
  319. {
  320. name: "联通",
  321. type: "bar",
  322. smooth: true,
  323. // showSymbol: false,
  324. symbolSize: 8,
  325. zlevel: 3,
  326. lineStyle: {
  327. normal: {
  328. color: color[1],
  329. }
  330. },
  331. areaStyle: {
  332. normal: {
  333. color: new echarts.graphic.LinearGradient(
  334. 0,
  335. 0,
  336. 0,
  337. 1,
  338. [{
  339. offset: 0,
  340. color: this.hexToRgba(color[1], 0.3)
  341. },
  342. {
  343. offset: 1,
  344. color: this.hexToRgba(color[1], 0.1)
  345. }
  346. ],
  347. false
  348. ),
  349. shadowColor: this.hexToRgba(color[1], 0.1),
  350. shadowBlur: 10
  351. }
  352. },
  353. data: liantong
  354. },
  355. {
  356. name: "电信",
  357. type: "bar",
  358. smooth: true,
  359. // showSymbol: false,
  360. symbolSize: 8,
  361. zlevel: 3,
  362. lineStyle: {
  363. normal: {
  364. color: color[2],
  365. }
  366. },
  367. areaStyle: {
  368. normal: {
  369. color: new echarts.graphic.LinearGradient(
  370. 0,
  371. 0,
  372. 0,
  373. 1,
  374. [{
  375. offset: 0,
  376. color: this.hexToRgba(color[2], 0.3)
  377. },
  378. {
  379. offset: 1,
  380. color: this.hexToRgba(color[2], 0.1)
  381. }
  382. ],
  383. false
  384. ),
  385. shadowColor: this.hexToRgba(color[2], 0.1),
  386. shadowBlur: 10
  387. }
  388. },
  389. data: dianxin
  390. }
  391. ]
  392. });
  393. },
  394. //饼图
  395. getechartlt(v, n) {
  396. let txt = 'echarts-cirle' + n;
  397. this.topCirle = echarts.init(document.getElementById(txt));
  398. v.innnerProvinceCnt = v.telcomCnt * 1 + v.unicomCnt * 1 + v.mobileCnt * 1 - v.outProvinceCnt;
  399. let data = [{
  400. value: v.innnerProvinceCnt,
  401. name: '省内',
  402. },
  403. {
  404. value: v.outProvinceCnt,
  405. name: '省外',
  406. },
  407. ];
  408. let pieOpation = {
  409. title: {
  410. top: 20,
  411. left: 40,
  412. text: '地域统计',
  413. textStyle: {
  414. fontWeight: 'normal',
  415. fontSize: '16'
  416. }
  417. },
  418. color: ['#37CEC6', '#0081CC'],
  419. tooltip: {
  420. trigger: 'item',
  421. extraCssText: 'background: #fff; border-radius: 0;box-shadow: 0 0 3px rgba(0, 0, 0, 0.2);color: #333;',
  422. },
  423. series: {
  424. type: 'pie',
  425. radius: ['35%', '55%'],
  426. center: ['50%', '50%'],
  427. avoidLabelOverlap: false,
  428. label: {
  429. show: true,
  430. position: 'outer',
  431. alignTo: 'labelLine',
  432. // ·圆点
  433. backgroundColor: 'auto', //圆点颜色,auto:映射的系列色
  434. height: 0,
  435. width: 0,
  436. lineHeight: 0,
  437. // height,width.lineHeight必须为0
  438. distanceToLabelLine: 0, //圆点到labelline距离
  439. borderRadius: 2.5,
  440. padding: [2.5, -2.5, 2.5, -2.5],
  441. /*radius和padding为圆点大小,圆点半径为几radius和padding各项数值就为几
  442. 如:圆点半径为1
  443. borderRadius: 1,
  444. padding: [1, -1, 1, -1]
  445. */
  446. formatter: '{a|{b}:}{b|{d}%}',
  447. rich: {
  448. a: {
  449. padding: [0, 0, 0, 5]
  450. },
  451. b: {
  452. padding: [0, 5, 0, 0]
  453. }
  454. }
  455. },
  456. labelLine: {
  457. show: true,
  458. length: 1
  459. },
  460. data: []
  461. }
  462. };
  463. pieOpation.series.data = data;
  464. this.topCirle.setOption(pieOpation);
  465. },
  466. //条形图
  467. getechartrt(v, n) {
  468. let txt = 'echarts-bar' + n;
  469. this.topBar = echarts.init(document.getElementById(txt));
  470. let data = {
  471. region: v.region,
  472. mobile: v.mobile,
  473. telcom: v.telcom,
  474. unicom: v.unicom,
  475. };
  476. let barOpation = {
  477. title: {
  478. top: 20,
  479. left: 40,
  480. text: '项目统计',
  481. textStyle: {
  482. fontWeight: 'normal',
  483. fontSize: '16'
  484. }
  485. },
  486. tooltip: {
  487. trigger: 'axis',
  488. axisPointer: { // 坐标轴指示器,坐标轴触发有效
  489. type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
  490. }
  491. },
  492. color: ['#37CEC6', '#0081CC', '#FDD56A'],
  493. grid: {
  494. top: '25%',
  495. left: '3%',
  496. right: '4%',
  497. bottom: '13%',
  498. containLabel: true
  499. },
  500. xAxis: {
  501. type: 'value',
  502. axisTick: {
  503. show: false,
  504. },
  505. axisLine: {
  506. show: true,
  507. lineStyle: {
  508. color: "#DFDFD"
  509. }
  510. },
  511. splitLine: {
  512. show: true,
  513. lineStyle: {
  514. width: 1,
  515. type: 'dotted' //'dotted'虚线 'solid'实线
  516. }
  517. },
  518. },
  519. yAxis: {
  520. type: 'category',
  521. axisTick: {
  522. show: false
  523. },
  524. axisLine: {
  525. show: true,
  526. lineStyle: {
  527. color: "#DFDFD"
  528. }
  529. },
  530. data: []
  531. },
  532. series: [{
  533. name: '移动',
  534. type: 'bar',
  535. stack: '户数',
  536. label: {
  537. show: true,
  538. position: 'insideLeft'
  539. },
  540. data: []
  541. },
  542. {
  543. name: '联通',
  544. type: 'bar',
  545. stack: '户数',
  546. label: {
  547. show: true,
  548. position: 'insideLeft'
  549. },
  550. data: []
  551. }, {
  552. name: '电信',
  553. type: 'bar',
  554. stack: '户数',
  555. label: {
  556. show: true,
  557. position: 'insideLeft'
  558. },
  559. data: []
  560. },
  561. ]
  562. };
  563. barOpation.yAxis.data = data.region;
  564. barOpation.series[0].data = data.mobile;
  565. barOpation.series[1].data = data.unicom;
  566. barOpation.series[2].data = data.telcom;
  567. this.topBar.setOption(barOpation)
  568. },
  569. //rgbaColor
  570. hexToRgba(hex, opacity) {
  571. var rgbaColor = "";
  572. var reg = /^#[\da-f]{6}$/i;
  573. if (reg.test(hex)) {
  574. rgbaColor = rgbaColor = 'rgba(' + parseInt("0x" + hex.slice(1, 3)) + ',' + parseInt("0x" + hex
  575. .slice(
  576. 3, 5)) + ',' + parseInt("0x" + hex.slice(5, 7)) + ',' + opacity + ')'
  577. }
  578. return rgbaColor;
  579. },
  580. //跳转页面
  581. checkallForm(v) {
  582. let path = '';
  583. v === 1 ? path = '/competitor' : path = '/addCompetitor'
  584. this.$router.push(path);
  585. for (let i = 0; i < this.$store.state.tabList.length; i++) {
  586. if (this.$store.state.tabList[i].rountPath === '/competitor' && v === 1) {
  587. return
  588. }
  589. if (this.$store.state.tabList[i].rountPath === '/addCompetitor' && v === 2) {
  590. return
  591. }
  592. }
  593. let params = {
  594. children: "",
  595. name: v === 2 ? "新增竞争对手信息" : "竞争对手信息管理",
  596. rountPath: path,
  597. target: "_self",
  598. };
  599. for (let i = 0; i < this.$store.state.tabList.length; i++) {
  600. if (this.$store.state.tabList[i].name === params.name) {
  601. this.$store.state.tabList[i] = params;
  602. }
  603. }
  604. let set = new Set([...this.$store.state.tabList, params]);
  605. set.add(params);
  606. this.$store.commit("setDefaultActive", params.rountPath);
  607. this.$store.commit("setTabList", Array.from(set));
  608. },
  609. getCompet(v) {
  610. if (this.params.region == '14') {
  611. this.params.region = ''
  612. }
  613. this.$http({
  614. url: "/market/cwcompetitor/queryWcompetitorIndexList",
  615. method: "post",
  616. headers: {
  617. "Content-Type": "application/json",
  618. "page": '{"pageNo":"' + 1 + '","pageSize":"5"}'
  619. },
  620. data: {
  621. operatorCode: 'unicom',
  622. recordRegionCode: this.params.region,
  623. startTime: this.params.timefrom,
  624. endTime: this.params.timeto,
  625. },
  626. }).then((res) => {
  627. this.ltlist = res.data;
  628. });
  629. this.$http({
  630. url: "/market/cwcompetitor/queryWcompetitorIndexList",
  631. method: "post",
  632. headers: {
  633. "Content-Type": "application/json",
  634. "page": '{"pageNo":"' + 1 + '","pageSize":"5"}'
  635. },
  636. data: {
  637. operatorCode: 'telcom',
  638. recordRegionCode: this.params.region,
  639. startTime: this.params.timefrom,
  640. endTime: this.params.timeto,
  641. },
  642. }).then((res) => {
  643. this.dxlist = res.data;
  644. });
  645. this.$http({
  646. url: "/market/cwcompetitor/queryWcompetitorIndexList",
  647. method: "post",
  648. headers: {
  649. "Content-Type": "application/json",
  650. "page": '{"pageNo":"' + 1 + '","pageSize":"5"}'
  651. },
  652. data: {
  653. recordRegionCode: this.params.region,
  654. startTime: this.params.timefrom,
  655. endTime: this.params.timeto,
  656. },
  657. }).then((res) => {
  658. this.ydlist = res.data;
  659. });
  660. },
  661. getListregion() {
  662. this.$http({
  663. url: "/market/cfgDataDict/queryList",
  664. method: "post",
  665. headers: {
  666. "Content-Type": "application/json",
  667. },
  668. data: {
  669. dictCode: 'region'
  670. },
  671. }).then((res) => {
  672. this.searchList[0].options = res.data;
  673. });
  674. },
  675. },
  676. mounted() {
  677. this.getList();
  678. var _this = this;
  679. window.onresize = function() {
  680. _this.myChart.resize();
  681. _this.topCirle.resize();
  682. _this.topBar.resize();
  683. }
  684. },
  685. created() {
  686. this.getCompet();
  687. this.getListregion();
  688. },
  689. computed: {
  690. collapse() {
  691. return this.$store.state.collapse;
  692. },
  693. },
  694. watch: {
  695. collapse() {
  696. let _this = this;
  697. _this.myChart.resize();
  698. _this.topCirle.resize();
  699. _this.topBar.resize();
  700. }
  701. }
  702. }
  703. </script>
  704. <style scoped lang="scss">
  705. .yysbox {
  706. display: flex;
  707. justify-content: space-between;
  708. margin-top: 15px;
  709. .yys {
  710. display: inline-block;
  711. width: 32%;
  712. text-align: center;
  713. border: 1px solid #58B6E5;
  714. padding: 10px 20px;
  715. max-height: 330px;
  716. padding-bottom: 30px;
  717. overflow: hidden;
  718. position: relative;
  719. h3 {
  720. font-weight: normal;
  721. margin-bottom: 10px;
  722. }
  723. div {
  724. margin-bottom: 10px;
  725. border-radius: 3px;
  726. padding: 2px 5px;
  727. height: 42px;
  728. overflow: hidden;
  729. span {
  730. display: inline-block;
  731. width: 100%;
  732. color: #fff;
  733. font-size: 14px;
  734. }
  735. }
  736. em {
  737. font-style: normal;
  738. position: absolute;
  739. bottom: 0;
  740. left: 0;
  741. width: 100%;
  742. height: 30px;
  743. line-height: 30px;
  744. text-align: right;
  745. padding-right: 15px;
  746. background: #fff;
  747. }
  748. }
  749. }
  750. #main {
  751. width: 100%;
  752. min-height: 300px;
  753. height: 40vh;
  754. clear: both;
  755. }
  756. .titbox {
  757. div {
  758. float: right;
  759. margin-top: 20px;
  760. i {
  761. font-size: 22px;
  762. margin-left: 20px;
  763. cursor: pointer;
  764. }
  765. }
  766. }
  767. .container-box {
  768. background-color: white;
  769. }
  770. .mc-nomal-title {
  771. font-size: 20px;
  772. font-weight: 500;
  773. color: #333;
  774. }
  775. .mc-total-box {
  776. overflow: hidden;
  777. height: 30px;
  778. line-height: 30px;
  779. margin: 15px 0;
  780. }
  781. .mc-total-title {
  782. font-size: 18px;
  783. }
  784. .mc-action-box {
  785. float: right
  786. }
  787. .mc-flex-box {
  788. display: flex;
  789. justify-content: space-between;
  790. }
  791. .mc-flex-item {
  792. width: 30px;
  793. text-align: center;
  794. }
  795. .mc-flex-value {
  796. font-size: 16px;
  797. font-weight: 400;
  798. }
  799. .mc-flex-title {
  800. font-size: 12px;
  801. color: #BCBCBC;
  802. }
  803. .echarts-style {
  804. width: 100%;
  805. height: 300px;
  806. }
  807. .echart-box {
  808. display: flex;
  809. }
  810. .left-echarts {
  811. height: 300px;
  812. width: 50%;
  813. }
  814. .right-echarts {
  815. height: 300px;
  816. width: 50%;
  817. }
  818. </style>