dangerComponents.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370
  1. <!-- 危险源总数排行 -->
  2. <template>
  3. <div class="dangerComponents">
  4. <title-page-img-components :propsData="propsData"></title-page-img-components>
  5. <div class="eCharts-max-big-box">
  6. <div class="danger-num">
  7. <div class="danger-left-box">
  8. <p>危险源总数:</p>
  9. <p>{{hazardTotal}}</p>
  10. </div>
  11. <div class="danger-right-box">
  12. <p>今日新增危险源:</p>
  13. <p>{{newHazard}}</p>
  14. </div>
  15. </div>
  16. <div id="dangerComponentsECharts" v-if="dataList[0]"></div>
  17. <div class="position-num-max-name-box" v-if="dataList[0]" v-for="(item,index) in dataList" :key="index">
  18. <div class="position-for-box" v-for="(item,index) in dataList" :key="index">
  19. {{item.deptSortName}}
  20. </div>
  21. </div>
  22. <div class="position-num-max-big-box" v-if="dataList[0]">
  23. <div class="position-for-box" v-for="(item,index) in dataList" :key="index">
  24. <p>总数:{{item.total}}</p>
  25. <p>丨</p>
  26. <p>危险品:{{item.chemical}}</p>
  27. <p>丨</p>
  28. <p>冷热设备:{{item.coolHotdevice}}</p>
  29. </div>
  30. </div>
  31. <p v-if="!dataList[0]" style="color:#dedede;font-size:18px;line-height:200px;text-align: center;">暂无数据</p>
  32. </div>
  33. </div>
  34. </template>
  35. <script>
  36. import {
  37. reportReportBigDataHazardTotalSort,
  38. } from "@/api/index";
  39. import titlePageImgComponents from '@/components/titlePageImgComponents.vue'
  40. export default {
  41. name: 'dangerComponents',
  42. components: {
  43. titlePageImgComponents
  44. },
  45. data() {
  46. return {
  47. propsData:{
  48. title:'危险源总数排行',
  49. checkType:'dangerComponents', //二级未开发-暂时注掉
  50. },
  51. //eCharts定时器
  52. eChartsTimer:null,
  53. dataList:[],
  54. hazardTotal:0,
  55. newHazard:0,
  56. refreshNum:0,
  57. maxData:[],
  58. maxNum:[],
  59. mxaText:[],
  60. dataIndex:0,
  61. }
  62. },
  63. created() {
  64. },
  65. mounted() {
  66. this.timedRefresh();
  67. },
  68. methods: {
  69. timedRefresh(){
  70. let self = this;
  71. self.getData();
  72. //定时动画
  73. window.clearInterval(self.eChartsTimer);
  74. self.eChartsTimer = setInterval(function(){
  75. self.judgmentData();
  76. },1000*30);
  77. },
  78. //执行判断
  79. judgmentData(){
  80. this.dataIndex++
  81. if(this.maxData[this.dataIndex]){
  82. this.setData();
  83. }else{
  84. this.getData();
  85. }
  86. },
  87. //滚动数据
  88. setData(){
  89. this.$set(this,'dataList',this.maxData[this.dataIndex]);
  90. this.$nextTick(()=>{
  91. this.eChartsMethod();
  92. })
  93. },
  94. //获取数据
  95. getData(){
  96. reportReportBigDataHazardTotalSort().then( response => {
  97. this.$set(this,'hazardTotal',response.data.hazardTotal?response.data.hazardTotal:0);
  98. this.$set(this,'newHazard',response.data.newHazard?response.data.newHazard:0);
  99. let maxList = [];
  100. let list = [];
  101. let maxNum = [];
  102. let numList = [];
  103. let mxaText = [];
  104. let textList = [];
  105. let num = 0;
  106. for(let i=0;i<response.data.hazardTotalSortSubs.length;i++){
  107. if(num < 5){
  108. list.push(response.data.hazardTotalSortSubs[i])
  109. numList.unshift(response.data.hazardTotalSortSubs[i].ratio)
  110. textList.push(response.data.hazardTotalSortSubs[i].ratio+'%')
  111. num++
  112. if((i+1)==response.data.hazardTotalSortSubs.length){
  113. maxList.push(list);
  114. maxList = JSON.parse(JSON.stringify(maxList));
  115. maxNum.push(numList);
  116. maxNum = JSON.parse(JSON.stringify(maxNum));
  117. mxaText.push(textList);
  118. mxaText = JSON.parse(JSON.stringify(mxaText));
  119. list = [response.data.hazardTotalSortSubs[i]];
  120. numList = [response.data.hazardTotalSortSubs[i].ratio];
  121. textList = [response.data.hazardTotalSortSubs[i].ratio+'%'];
  122. }
  123. }else{
  124. maxList.push(list);
  125. maxList = JSON.parse(JSON.stringify(maxList));
  126. maxNum.push(numList);
  127. maxNum = JSON.parse(JSON.stringify(maxNum));
  128. mxaText.push(textList);
  129. mxaText = JSON.parse(JSON.stringify(mxaText));
  130. list = [response.data.hazardTotalSortSubs[i]];
  131. numList = [response.data.hazardTotalSortSubs[i].ratio];
  132. textList = [response.data.hazardTotalSortSubs[i].ratio+'%'];
  133. num = 1;
  134. }
  135. }
  136. this.$set(this,'maxData',maxList);
  137. this.$set(this,'maxNum',maxNum);
  138. this.$set(this,'mxaText',mxaText);
  139. this.$set(this,'dataIndex',0);
  140. this.setData();
  141. });
  142. },
  143. eChartsMethod(list,text) {
  144. let msg = {
  145. data: this.maxNum[this.dataIndex],
  146. total: 100,
  147. percentdata: this.mxaText[this.dataIndex],
  148. leftname: [
  149. '',
  150. '',
  151. '',
  152. '',
  153. ''
  154. ]
  155. }
  156. let data = []
  157. let data2 = []
  158. let totaldata = []
  159. let percentdata = []
  160. msg.data.forEach((value)=>{
  161. totaldata.push(100)
  162. data.push((55 * value) / 100)
  163. data2.push(100)
  164. percentdata.push(Math.round((value / msg.total) * 100) + '%')
  165. })
  166. let fillImg = 'data:image/png;base64,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'
  167. let fillImg2 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAYAAAAAQCAYAAAAf1qhIAAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAAADoSURBVHic7dwxisMwEEBRyQHBNql1Ft8fn0V1mgVBUJo1iDQWrAsbvVfZ419MN53jtm0/OednrfURQggppXcp5bWu62/4M9KMdhqNRnPn5kq7/LdZ+mEIIdRaHznn5/7eWotHzWin0Wg0d26utMsZzdIP+4/7c4yxHTWjnUaj0dy5udIuZzTL9xCAOTgAAJNyAAAm5QAATMoBAJiUAwAwKQcAYFIOAMCkHACASTkAAJNyAAAmtaSU3t/DftZai0fNaKfRaDR3bq60yxnNUkp59R/334Tu7zHGdtSMdhqNRnPn5kq7nNF8AE2zWuT1ZhqKAAAAAElFTkSuQmCC'
  168. let option = {
  169. grid: {
  170. top: '4%',
  171. left: '4.5%',
  172. bottom: '4%'
  173. },
  174. xAxis: [
  175. {
  176. show: false
  177. }
  178. ],
  179. yAxis: [
  180. {
  181. name: '',
  182. nameGap: '50',
  183. nameTextStyle: {
  184. color: '#000',
  185. fontSize: '16'
  186. },
  187. axisLine: {
  188. lineStyle: {
  189. color: 'rgba(0,0,0,0)'
  190. }
  191. },
  192. data: []
  193. }
  194. ],
  195. series: [
  196. {
  197. name: '', // blue bar
  198. type: 'pictorialBar',
  199. symbol: 'image://' + fillImg2,
  200. barWidth: '100%',
  201. symbolOffset: [0, 0],
  202. itemStyle: {
  203. normal: {
  204. barBorderRadius: 5,
  205. color: '#6DE8FA'
  206. }
  207. },
  208. symbolSize: ['55%', 16],
  209. symbolBoundingData: 100,
  210. symbolClip: true,
  211. data: data2,
  212. label: {
  213. normal: {
  214. show: false
  215. }
  216. },
  217. animationEasing: 'elasticOut'
  218. },
  219. {
  220. name: '', // blue bar
  221. type: 'pictorialBar',
  222. symbol: 'image://' + fillImg,
  223. barWidth: '100%',
  224. symbolOffset: [0, 0],
  225. itemStyle: {
  226. normal: {
  227. barBorderRadius: 5,
  228. color: '#6DE8FA'
  229. }
  230. },
  231. symbolSize: ['55%', 16],
  232. symbolBoundingData: 100,
  233. symbolClip: true,
  234. data: data,
  235. label: {
  236. normal: {
  237. show: false
  238. }
  239. },
  240. animationEasing: 'elasticOut'
  241. }
  242. ]
  243. }
  244. let echartsBox = this.$echarts.init(document.getElementById('dangerComponentsECharts'));
  245. echartsBox.clear();
  246. echartsBox.setOption(option);
  247. }
  248. },
  249. beforeDestroy() {
  250. //清除定时器
  251. window.clearInterval(this.eChartsTimer);
  252. },
  253. destroyed() {
  254. //清除定时器
  255. window.clearInterval(this.eChartsTimer);
  256. }
  257. }
  258. </script>
  259. <style scoped lang="scss">
  260. .dangerComponents {
  261. height: 492px;
  262. width: 800px;
  263. .eCharts-max-big-box {
  264. background: linear-gradient(180deg, rgba(4, 117, 129, 0.2) 0%, rgba(0, 15, 22, 0) 100%);
  265. overflow: hidden;
  266. position: relative;
  267. .danger-num {
  268. width:731px;
  269. height: 80px;
  270. margin:20px 34px 0;
  271. background: no-repeat;
  272. background-image: url("../../../assets/ZDimages/img_bg_wxytj@1x.png");
  273. background-size: 100%;
  274. display: flex;
  275. .danger-left-box{
  276. display: flex;
  277. margin:22px 0 0 90px;
  278. height: 36px;
  279. p:nth-child(1){
  280. line-height:36px;
  281. font-size:24px;
  282. color:#fff;
  283. }
  284. p:nth-child(2){
  285. width:105px;
  286. text-align: right;
  287. line-height:36px;
  288. font-size:36px;
  289. background: -webkit-linear-gradient(0deg, #FFD7BA, #FF6A00); /* Chrome, Safari */
  290. background: linear-gradient(0deg, #FFD7BA, #FF6A00); /* 标准语法 */
  291. -webkit-background-clip: text; /* Chrome, Safari */
  292. background-clip: text;
  293. -webkit-text-fill-color: transparent; /* Chrome, Safari */
  294. color: transparent; /* 其他浏览器 */
  295. font-family: 'alimmFonts', sans-serif;
  296. }
  297. }
  298. .danger-right-box{
  299. display: flex;
  300. margin:22px 0 0 0;
  301. height: 36px;
  302. p:nth-child(1){
  303. margin-left:80px;
  304. line-height:36px;
  305. font-size:24px;
  306. color:#fff;
  307. }
  308. p:nth-child(2){
  309. line-height:36px;
  310. font-size:36px;
  311. width:85px;
  312. text-align: right;
  313. background: -webkit-linear-gradient(0deg, #FFD7BA, #FF6A00); /* Chrome, Safari */
  314. background: linear-gradient(0deg, #FFD7BA, #FF6A00); /* 标准语法 */
  315. -webkit-background-clip: text; /* Chrome, Safari */
  316. background-clip: text;
  317. -webkit-text-fill-color: transparent; /* Chrome, Safari */
  318. color: transparent; /* 其他浏览器 */
  319. font-family: 'alimmFonts', sans-serif;
  320. }
  321. }
  322. }
  323. #dangerComponentsECharts {
  324. width: 800px;
  325. height: 330px;
  326. }
  327. .position-num-max-name-box{
  328. z-index:5;
  329. position: absolute;
  330. top:112px;
  331. left:35px;
  332. div{
  333. color:#fff;
  334. line-height:18px;
  335. font-size:18px;
  336. margin-bottom:43px;
  337. }
  338. }
  339. .position-num-max-big-box{
  340. z-index:5;
  341. position: absolute;
  342. top:135px;
  343. left:450px;
  344. .position-for-box{
  345. display: flex;
  346. p{
  347. color:#fff;
  348. line-height:18px;
  349. font-size:18px;
  350. margin-bottom:43px;
  351. }
  352. p:nth-child(1){
  353. }
  354. p:nth-child(2){
  355. padding:0 8px;
  356. }
  357. p:nth-child(3){
  358. }
  359. p:nth-child(4){
  360. padding:0 8px;
  361. }
  362. p:nth-child(5){
  363. }
  364. }
  365. }
  366. }
  367. }
  368. </style>