7b3ca2f595eb2019abf8a094fdd9c39a4d6b8a4d.svn-base 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697
  1. <!-- -->
  2. <template>
  3. <div>
  4. <div style="width:100%;" :style="{'height': colHeight - 40 + 'px'}" ref="normal_bar_chart"></div>
  5. </div>
  6. </template>
  7. <script>
  8. //这里可以导入其他文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)
  9. //例如:import 《组件名称》 from '《组件路径》';
  10. import echarts from 'echarts'
  11. import request from "@util/gw_ajax_request"
  12. export default {
  13. //import引入的组件需要注入到对象中才能使用
  14. props: ['addForm', 'addForms', 'addFormt', 'isClear', 'testBool','singleOrMach'],
  15. components: {},
  16. data() {
  17. //这里存放数据
  18. return {
  19. countToNormal: 0,//专业饼图的一般问题数量
  20. countToHeavier: 0,//专业饼图的较重问题数量
  21. countToSerious: 0,//专业饼图的严重问题数量
  22. countToIfCasePblmfdx: 0,
  23. countToIfCasePblmdx: 0,
  24. countTotalHeavier_Serious_normal: 0,//柱状图 一般较重严重总数,用于算占比线
  25. countTotalHeavier_Serious: 0,//柱状图 一般较重严重总数,用于算占比线
  26. countTotalHeavier_Normal: 0,//柱状图 一般较重严重总数,用于算占比线
  27. countTotalSerious_Normal: 0,//柱状图 一般较重严重总数,用于算占比线
  28. // problemNumCount:[],
  29. // problemNumName:[],
  30. heavier_Serious_normal_Lists: [],//专业柱状图数据集
  31. zrtz_mainBodyNum_list: [],//专业柱状图较总数
  32. problemNumCountHeavier: [],//专业柱状图较重数据
  33. problemNumCountSerious: [],//专业柱状图严重数据
  34. problemNumCountNormal: [],//专业柱状图一般数据
  35. problemName: [],//专业柱状图横轴
  36. nhs_zb: [],//专业柱状图占比数据
  37. nhs_zb_n: [],//专业柱状图占比数据
  38. nhs_zb_h: [],//专业柱状图占比数据
  39. nhs_zb_s: [],//专业柱状图占比数据
  40. nhs_zb_nh: [],//专业柱状图占比数据
  41. nhs_zb_ns: [],//专业柱状图占比数据
  42. nhs_zb_hs: [],//专业柱状图占比数据
  43. barData_zy: {},
  44. pieData_zy: [],
  45. pieData_ifDx: [],
  46. barData: [],
  47. mySeries: [],
  48. scale: 1,
  49. rich: {
  50. yellow: {
  51. color: "#ffc72b",
  52. fontSize: 30 * this.scale,
  53. padding: [5, 4],
  54. align: 'center'
  55. },
  56. black: {
  57. // color: "#3a3a3a",
  58. fontSize: 30 * this.scale,
  59. padding: [5, 4],
  60. align: 'center'
  61. },
  62. blackSmall: {
  63. // color: "#3a3a3a",
  64. fontSize: 16 * this.scale,
  65. padding: [5, 4],
  66. align: 'center'
  67. },
  68. total: {
  69. // color: "#ffc72b",
  70. fontSize: 40 * this.scale,
  71. align: 'center'
  72. },
  73. white: {
  74. // color: "#fff",
  75. align: 'center',
  76. fontSize: 14 * this.scale,
  77. padding: [21, 0]
  78. },
  79. blue: {
  80. color: '#49dff0',
  81. fontSize: 16 * this.scale,
  82. align: 'center'
  83. },
  84. hr: {
  85. borderColor: '#3a3a3a',
  86. width: '100%',
  87. borderWidth: 1,
  88. height: 0,
  89. }
  90. },
  91. colHeight: window.innerHeight - 90,
  92. option: {},
  93. isChangeOrAdd: "",
  94. chart: {},
  95. selectNum: 1,
  96. flag: true,
  97. // testBool:true,
  98. radius_in: "",
  99. radius_out: "",
  100. selectLegend: null,
  101. isMuch:null
  102. }
  103. },
  104. //监听属性 类似于data概念
  105. computed: {},
  106. //监控data中的数据变化
  107. watch: {
  108. "singleOrMach": {
  109. handler(newVal, oldVal) {
  110. //debugger
  111. var _self = this;
  112. _self.isMuch = false;
  113. if(newVal=="much"){
  114. _self.isMuch = true
  115. }
  116. if (this.testBool) {
  117. _self.getDataChartData(_self.addForm)
  118. }
  119. },
  120. deep: true
  121. },
  122. "addForm.year": {
  123. handler(newVal, oldVal) {
  124. //debugger
  125. var _self = this;
  126. if (this.testBool) {
  127. _self.getDataChartData(_self.addForm)
  128. }
  129. },
  130. deep: true
  131. },
  132. "addForm.years": {
  133. handler(newVal, oldVal) {
  134. //debugger
  135. var _self = this;
  136. if (this.testBool) {
  137. _self.getDataChartData(_self.addForm)
  138. }
  139. },
  140. deep: true
  141. },
  142. "addForm.batch": {
  143. handler(newVal, oldVal) {
  144. //debugger
  145. var _self = this;
  146. if (this.testBool) {
  147. _self.getDataChartData(_self.addForm)
  148. }
  149. },
  150. deep: true
  151. },
  152. "addForm.rgstrId": {
  153. handler(newVal, oldVal) {
  154. //debugger
  155. if(newVal) {
  156. var _self = this;
  157. if (this.testBool) {
  158. _self.getDataChartData(_self.addForm)
  159. }
  160. }
  161. },
  162. deep: true
  163. },
  164. // "addForms.year": {
  165. // handler(newVal, oldVal) {
  166. // if(newVal) {
  167. // var _self = this;
  168. // console.log("newVal:" + newVal + ", oldVal:" + oldVal)
  169. // this.selectNum = 2;
  170. // this.mySeries = [];
  171. // this.selectLegend = null;
  172. // if (this.testBool) {
  173. // _self.getDataChartData(_self.addForms, _self.selectNum)
  174. // }
  175. // }
  176. // },
  177. // deep: true
  178. // },
  179. // "addForms.batch": {
  180. // handler(newVal, oldVal) {
  181. // if(newVal) {
  182. // var _self = this;
  183. // console.log("newVal:" + newVal + ", oldVal:" + oldVal)
  184. // this.selectNum = 2;
  185. // this.mySeries = [];
  186. // this.selectLegend = null;
  187. // if (this.testBool) {
  188. // _self.getDataChartData(_self.addForms, _self.selectNum)
  189. // }
  190. // }
  191. // },
  192. // deep: true
  193. // },
  194. // "addForms.rgstrId": {
  195. // handler(newVal, oldVal) {
  196. // if(newVal) {
  197. // var _self = this;
  198. // console.log("newVal:" + newVal + ", oldVal:" + oldVal)
  199. // this.selectNum = 2;
  200. // this.mySeries = [];
  201. // this.selectLegend = null;
  202. // if (this.testBool) {
  203. // _self.getDataChartData(_self.addForms, _self.selectNum)
  204. // }
  205. // }
  206. // },
  207. // deep: true
  208. // },
  209. // "addFormt.year": {
  210. // handler(newVal, oldVal) {
  211. // if(newVal) {
  212. // var _self = this;
  213. // console.log("newVal:" + newVal + ", oldVal:" + oldVal)
  214. // this.selectNum = 3;
  215. // this.mySeries = [];
  216. // this.selectLegend = null;
  217. // if (this.testBool) {
  218. // _self.getDataChartData(_self.addFormt, _self.selectNum)
  219. // }
  220. // }
  221. // },
  222. // deep: true
  223. // },
  224. // "addFormt.batch": {
  225. // handler(newVal, oldVal) {
  226. // if(newVal) {
  227. // var _self = this;
  228. // console.log("newVal:" + newVal + ", oldVal:" + oldVal)
  229. // this.selectNum = 3;
  230. // this.mySeries = [];
  231. // this.selectLegend = null;
  232. // if (this.testBool) {
  233. // _self.getDataChartData(_self.addFormt, _self.selectNum)
  234. // }
  235. // }
  236. // },
  237. // deep: true
  238. // },
  239. // "addFormt.rgstrId": {
  240. // handler(newVal, oldVal) {
  241. // if(newVal) {
  242. // var _self = this;
  243. // console.log("newVal:" + newVal + ", oldVal:" + oldVal)
  244. // this.selectNum = 3;
  245. // this.mySeries = [];
  246. // this.selectLegend = null;
  247. // if (this.testBool) {
  248. // _self.getDataChartData(_self.addFormt, _self.selectNum)
  249. // }
  250. // }
  251. // },
  252. // deep: true
  253. // },
  254. },
  255. //方法集合
  256. methods: {
  257. changeYears(years){
  258. var _self = this;
  259. if (this.testBool) {
  260. _self.addForm.years = years;
  261. _self.getDataChartData(_self.addForm)
  262. }
  263. },
  264. uniqueArr(obj){
  265. var list = [];
  266. if(Object.keys(obj).length>0){
  267. for(var k in obj){
  268. for(var i = 0;i<obj[k].length;i++){
  269. if(list.length==0){
  270. list.push(obj[k][i].name);
  271. }else{
  272. var isFlag = false;
  273. for(var j = 0;j<list.length;j++){
  274. if(obj[k][i].name==list[j]){
  275. isFlag = true;
  276. }
  277. }
  278. if(!isFlag){
  279. list.push(obj[k][i].name);
  280. }
  281. }
  282. }
  283. }
  284. }
  285. return list;
  286. },
  287. //饼图-专业
  288. getDataChartData(params) {
  289. //debugger
  290. var obj = {};
  291. if(this.isMuch==true){
  292. obj.rgstrId = params.rgstrId;
  293. if(params.years instanceof Array){
  294. obj.years = params.years.length>0?params.years.join(","):"";
  295. }else{
  296. obj.years = params.years;
  297. }
  298. }else{
  299. obj.years = params.year;
  300. obj.batch = params.batch
  301. obj.rgstrId = params.rgstrId;
  302. }
  303. var _self = this;
  304. _self.loading = true;
  305. var xList = [];
  306. var mySeries = [];
  307. request.post(`/tac/pblm/info/countPblmInfoByStbNew`, obj).then(res => {
  308. if (res.success) {
  309. xList = _self.uniqueArr(res.data);
  310. var v = 0;
  311. var dataL = Object.keys(res.data).length==0?100:100/Object.keys(res.data).length;
  312. for(var k in res.data){
  313. v++;
  314. var sum = 0;
  315. var NormalCount = 0;
  316. var HeavierCount = 0;
  317. var SeriousCount = 0;
  318. var countToIfCasePblmfdx = 0;
  319. var countToIfCasePblmdx = 0;
  320. for(var m = 0;m<res.data[k].length;m++){
  321. sum+= parseInt(res.data[k][m].count==null?0:res.data[k][m].count);
  322. NormalCount+=(res.data[k][m].normal==null?0:parseInt(res.data[k][m].normal));
  323. HeavierCount+=(res.data[k][m].heavier==null?0:parseInt(res.data[k][m].heavier));
  324. SeriousCount+=(res.data[k][m].serious==null?0:parseInt(res.data[k][m].serious));
  325. countToIfCasePblmfdx +=(res.data[k][m].isNotCasePblmCount==null?0:parseInt(res.data[k][m].isNotCasePblmCount));
  326. countToIfCasePblmdx +=(res.data[k][m].isCasePblmCount==null?0:parseInt(res.data[k][m].isCasePblmCount));
  327. }
  328. let line = {
  329. name: "占比",
  330. type: "line",
  331. yAxisIndex: 1, //使用的 y 轴的 index,在单个图表实例中存在多个 y轴的时候有用
  332. showAllSymbol: true, //显示所有图形。
  333. symbol: "circle", //标记的图形为实心圆
  334. symbolSize: 10, //标记的大小
  335. itemStyle: {
  336. //折线拐点标志的样式
  337. color: "#49dff0"
  338. },
  339. lineStyle: {
  340. color: "#49dff0"
  341. },
  342. areaStyle: {
  343. color: "rgba(5,140,255, 0.2)"
  344. },
  345. data: []
  346. };
  347. let barNormal = {
  348. name: "一般问题",
  349. stack: k,
  350. type: "bar",
  351. barWidth: 25,
  352. label: {
  353. show: true
  354. },
  355. itemStyle: {
  356. normal: {
  357. color: "#5ce9c7"
  358. }
  359. },
  360. // data: [47,47,35,36,35,15,15]
  361. data: [],
  362. }
  363. let barHeavier = {
  364. name: "较重问题",
  365. stack: k,
  366. type: "bar",
  367. barWidth: 25,
  368. label: {
  369. show: true
  370. },
  371. itemStyle: {
  372. normal: {
  373. color: "#fed172"
  374. }
  375. },
  376. // data: [47,47,35,36,35,15,15]
  377. data: [],
  378. }
  379. let barSerious = {
  380. name: "严重问题",
  381. stack: k,
  382. type: "bar",
  383. barWidth: 25,
  384. label: {
  385. show: true
  386. },
  387. itemStyle: {
  388. normal: {
  389. color: "#fb6086"
  390. }
  391. },
  392. // data: [47,47,35,36,35,15,15]
  393. data: [],
  394. }
  395. let count = {
  396. name: "问题总数",
  397. type: "bar",
  398. stack: k+1,
  399. barWidth: 25,
  400. barGap: '-100%',
  401. itemStyle: {
  402. normal: {
  403. color: "#0195f2"
  404. }
  405. },
  406. data: [],
  407. label: {
  408. show: true,
  409. normal: {
  410. show: true,
  411. fontSize: 16,
  412. fontWeight: 'bold',
  413. color: '#333',
  414. position: 'top',
  415. },
  416. formatter: function (params) {
  417. return params.value
  418. }
  419. }
  420. }
  421. let pieYanZhongChengDu = {
  422. name: '严重程度分布情况',
  423. type: 'pie',
  424. radius: ['0%','15%'],
  425. center: ['85%', (dataL/1.8)*v+"%"],
  426. color: ['#5ce9c7', '#fed172', '#fb6086'],
  427. data: [
  428. {name:"一般",value:0},
  429. {name:"较重",value:0},
  430. {name:"严重",value:0}
  431. ],
  432. itemStyle: {
  433. emphasis: {
  434. shadowBlur: 10,
  435. shadowOffsetX: 0,
  436. shadowColor: 'rgba(0, 0, 0, 0.5)'
  437. }
  438. },
  439. label: {
  440. formatter: k+'年:{b}{c}({d}%)'
  441. }
  442. }
  443. let pieDianXingWenTi = {
  444. name: '典型问题分布',
  445. type: 'pie',
  446. radius: ['0%', "15%"],
  447. center: ['95%', (dataL/1.5)*v+"%"],
  448. color: ['#fb6086', '#fed172'],
  449. data: [
  450. {name:'典型',value:0},
  451. {name:'非典型',value:0}
  452. ],
  453. itemStyle: {
  454. emphasis: {
  455. shadowBlur: 10,
  456. shadowOffsetX: 0,
  457. shadowColor: 'rgba(0, 0, 0, 0.5)'
  458. }
  459. },
  460. label: {
  461. formatter: k+':{b}{c}({d}%)'
  462. }
  463. }
  464. pieYanZhongChengDu.data[0].value = NormalCount;
  465. pieYanZhongChengDu.data[1].value = HeavierCount;
  466. pieYanZhongChengDu.data[2].value = SeriousCount;
  467. pieDianXingWenTi.data[0].value = countToIfCasePblmdx;
  468. pieDianXingWenTi.data[1].value = countToIfCasePblmfdx;
  469. for(var j = 0;j<xList.length;j++){
  470. for(var l = 0;l<res.data[k].length;l++){
  471. if(xList[j] == res.data[k][l].name){
  472. var countv = 0;
  473. barNormal.data.push({value:res.data[k][l].normal==null?0:res.data[k][l].normal,year:k});
  474. barHeavier.data.push(res.data[k][l].heavier==null?0:res.data[k][l].heavier);
  475. barSerious.data.push(res.data[k][l].serious==null?0:res.data[k][l].serious);
  476. countv+=(res.data[k][l].normal==null?0:parseInt(res.data[k][l].normal));
  477. countv+=(res.data[k][l].heavier==null?0:parseInt(res.data[k][l].heavier));
  478. countv+=(res.data[k][l].serious==null?0:parseInt(res.data[k][l].serious));
  479. count.data.push(countv);
  480. line.data.push((countv/sum*100).toFixed(2));
  481. }
  482. }
  483. }
  484. mySeries.push(barNormal,barHeavier,barSerious,count,line,pieYanZhongChengDu);
  485. }
  486. var chart = echarts.init(this.$refs['normal_bar_chart']);
  487. let option = {
  488. toolbox: {
  489. show: true,
  490. orient: "vertical",
  491. left: "right",
  492. top: "top",
  493. feature: {
  494. saveAsImage: { show: true }, // 保存图表
  495. },
  496. },
  497. title: {
  498. // text: _self.barData_zy.pc1.count + '个问题分布情况',
  499. textStyle: {
  500. align: 'center',
  501. // color: '#fff',
  502. fontSize: 20,
  503. },
  504. top: '3%',
  505. left: '5%',
  506. },
  507. // backgroundColor: '#0f375f',
  508. grid: {
  509. top: "15%",
  510. bottom: "15%",
  511. left: "5%",
  512. right: "30%",
  513. containLabel: true
  514. },
  515. tooltip: {
  516. trigger: "axis",
  517. axisPointer: {
  518. type: "shadow",
  519. label: {
  520. show: true
  521. }
  522. },
  523. formatter: function (params) {
  524. var relVal = "";
  525. for (var i = 0, l = params.length; i < l; i++) {
  526. if(params[i].data.year){
  527. if(i==0){
  528. relVal += params[i].name+"("+params[i].data.year+")";
  529. relVal += '<br/>' + params[i].marker + params[i].seriesName + ': ' + params[i].value + "个"
  530. }else{
  531. relVal += '<br/>' +params[i].name+"("+params[i].data.year+")";
  532. relVal += '<br/>' + params[i].marker + params[i].seriesName + ': ' + params[i].value + "个"
  533. }
  534. }else{
  535. if(params[i].seriesName=="占比"){
  536. relVal += '<br/>' + params[i].marker + params[i].seriesName + ': ' + params[i].value + "%";
  537. }else{
  538. relVal += '<br/>' + params[i].marker + params[i].seriesName + ': ' + params[i].value + "个"
  539. }
  540. }
  541. }
  542. return relVal;
  543. }
  544. },
  545. legend: {
  546. data: ["占比", "一般问题", "较重问题", "严重问题", "问题总数"],
  547. top: "5%",
  548. textStyle: {
  549. //color: "#ffffff"
  550. },
  551. selected: {
  552. "问题总数": false //图例为‘全部’的一项默认置灰
  553. }
  554. },
  555. xAxis: {
  556. data: xList,
  557. axisLine: {
  558. show: true //隐藏X轴轴线
  559. },
  560. axisTick: {
  561. show: true //隐藏X轴刻度
  562. },
  563. axisLabel: {
  564. rotate: 15,
  565. show: true,
  566. textStyle: {
  567. // color: "#ebf8ac" //X轴文字颜色
  568. }
  569. }
  570. },
  571. yAxis: [
  572. {
  573. type: "value",
  574. name: "个",
  575. nameTextStyle: {
  576. // color: "#ebf8ac"
  577. },
  578. splitLine: {
  579. show: false
  580. },
  581. axisTick: {
  582. show: true
  583. },
  584. axisLine: {
  585. show: true
  586. },
  587. axisLabel: {
  588. show: true,
  589. textStyle: {
  590. // color: "#ebf8ac"
  591. }
  592. },
  593. },
  594. {
  595. type: "value",
  596. name: "占比",
  597. nameTextStyle: {
  598. // color: "#ebf8ac"
  599. },
  600. position: "right",
  601. splitLine: {
  602. show: false
  603. },
  604. splitLine: {
  605. show: false
  606. },
  607. axisTick: {
  608. show: true
  609. },
  610. axisLine: {
  611. show: true
  612. },
  613. axisLabel: {
  614. show: true,
  615. formatter: "{value} %", //右侧Y轴文字显示
  616. textStyle: {
  617. // color: "#ebf8ac"
  618. }
  619. }
  620. },
  621. {
  622. type: "value",
  623. gridIndex: 0,
  624. min: 50,
  625. max: 100,
  626. splitNumber: 8,
  627. splitLine: {
  628. show: false
  629. },
  630. axisLine: {
  631. show: false
  632. },
  633. axisTick: {
  634. show: false
  635. },
  636. axisLabel: {
  637. show: false
  638. },
  639. splitArea: {
  640. show: true,
  641. areaStyle: {
  642. color: ["rgba(250,250,250,0.0)", "rgba(250,250,250,0.05)"]
  643. }
  644. }
  645. }
  646. ],
  647. series:mySeries,
  648. };
  649. chart.clear();
  650. chart.setOption(option);
  651. window.addEventListener("resize", () => {
  652. chart.resize();
  653. });
  654. }
  655. })
  656. }
  657. },
  658. //生命周期 - 创建完成(可以访问当前this实例)
  659. created() {
  660. },
  661. //生命周期 - 挂载完成(可以访问DOM元素)
  662. mounted() {
  663. this.isMuch = false;
  664. if(this.singleOrMach == "much"){
  665. this.isMuch = true;
  666. }
  667. this.getDataChartData(this.addForm)
  668. },
  669. beforeCreate() {
  670. }, //生命周期 - 创建之前
  671. beforeMount() {
  672. }, //生命周期 - 挂载之前
  673. beforeUpdate() {
  674. }, //生命周期 - 更新之前
  675. updated() {
  676. }, //生命周期 - 更新之后
  677. beforeDestroy() {
  678. }, //生命周期 - 销毁之前
  679. destroyed() {
  680. }, //生命周期 - 销毁完成
  681. activated() {
  682. }, //如果页面有keep-alive缓存功能,这个函数会触发
  683. }
  684. </script>
  685. <style scoped>
  686. </style>