dangerDetail.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569
  1. <template>
  2. <div class="main" v-cloak>
  3. <Header/>
  4. <div class="main_t">
  5. <div class="main_t_t">
  6. <i class="main_t_t_l">当前位置:首页 &gt;</i>
  7. <i>安全隐患统计</i>
  8. </div>
  9. <div class="main_t_b" id="danger_chart"></div>
  10. </div>
  11. <div class="main_btn">
  12. <i :key="index" :class='currentIndex==index?"active":""' v-for="(item,index) in btnList" @click="btnFun(index)">{{item}}</i>
  13. </div>
  14. <div class="main_b">
  15. <!--查询条件-->
  16. <el-form :model="editForm" ref="queryParams" class="form-box" :inline="true" style="margin:20px;">
  17. <el-form-item label="隐患类型" prop="dangerId" label-width="98px">
  18. <el-select v-model="editForm.optionId" popper-class="select-big-data" placeholder="请选择隐患类型">
  19. <el-option
  20. v-for="item in dangerList"
  21. :key="item.id"
  22. :label="item.name"
  23. :value="item.id">
  24. </el-option>
  25. </el-select>
  26. </el-form-item>
  27. <el-form-item label="实验室" prop="dangerId" label-width="98px">
  28. <el-select v-model="editForm.subId" popper-class="select-big-data" placeholder="请选择实验室">
  29. <el-option
  30. v-for="item in labList"
  31. :key="item.id"
  32. :label="item.name"
  33. :value="item.id">
  34. </el-option>
  35. </el-select>
  36. </el-form-item>
  37. <el-form-item label="日期" prop="dateRange" label-width="68px">
  38. <el-date-picker
  39. popper-class="select-big-data-time"
  40. v-model="dateRange"
  41. size="small"
  42. style="width: 240px"
  43. value-format="yyyy-MM-dd"
  44. type="daterange"
  45. range-separator="-"
  46. start-placeholder="开始日期"
  47. end-placeholder="结束日期"
  48. ></el-date-picker>
  49. </el-form-item>
  50. <el-form-item label-width="0">
  51. <el-button type="primary" @click.native.prevent="onSearch" native-type="submit">查询</el-button>
  52. <el-button @click="resetForm('searchForm')">重置</el-button>
  53. </el-form-item>
  54. </el-form>
  55. <!--列表-->
  56. <el-table :data="tableData" style="width: 100%" height="420" :row-class-name="tableRowClassName">
  57. <el-table-column align="center" header-align='center' type="index" :index="indexMethod" label="序号" width="60"></el-table-column>
  58. <el-table-column align="center" header-align='center' prop="optionName" label="隐患类型"></el-table-column>
  59. <el-table-column align="center" header-align='center' prop="subName" label="实验室名称"></el-table-column>
  60. <el-table-column align="center" header-align='center' prop="typeName" label="安全分类"></el-table-column>
  61. <el-table-column align="center" header-align='center' prop="levelName" label="安全分级"></el-table-column>
  62. <el-table-column align="center" header-align='center' prop="count" label="数量"></el-table-column>
  63. </el-table>
  64. <el-pagination
  65. style="margin-top: 14px"
  66. background
  67. @current-change="handleCurrentChange"
  68. :page-sizes="[10, 20, 30, 40]"
  69. :current-page.sync="editForm.pageNum"
  70. :page-size="editForm.pageSize"
  71. layout="total,prev, pager, next"
  72. :total="totalNum">
  73. </el-pagination>
  74. </div>
  75. </div>
  76. </template>
  77. <script>
  78. import {
  79. checkOptionList,
  80. departmentsList,
  81. getSubjectDict,
  82. optionChartDetails,
  83. optionCharts, optionLabCharts
  84. } from "../api/http"
  85. import Header from '@/components/header.vue'
  86. export default {
  87. components: {
  88. Header
  89. },
  90. data() {
  91. return {
  92. editForm:{
  93. deptLevel:'',//这个是登陆后,刘波给你的院校的类型
  94. schoolDeptId:'',//院系id
  95. optionId:'',//隐患类型
  96. subId:'',//实验室类型
  97. beginTimeStr:'',//开始时间
  98. endTimeStr:'',//结束时间
  99. pageNum:1,
  100. pageSize:10
  101. },
  102. subjectOptions:[],//院系
  103. dangerList:[],//隐患类型
  104. labList:[],//实验室
  105. dateRange:[],//时间
  106. totalNum:0,
  107. tableData:[],
  108. btnList:['按隐患类型统计','按实验室统计'],
  109. currentIndex:0,
  110. }
  111. },
  112. methods: {
  113. btnFun(index){
  114. this.currentIndex = index
  115. console.log(this.currentIndex)
  116. if(this.currentIndex==0){
  117. this.getAjaxData()
  118. }else{
  119. this.getLabAjaxData()
  120. }
  121. },
  122. back(){
  123. this.$router.push('/')
  124. },
  125. tableRowClassName({ rowIndex}) {
  126. if (rowIndex%2 === 0) {
  127. return 'success-row';
  128. } else{
  129. return 'warning-row';
  130. }
  131. },
  132. indexMethod(index) {
  133. return (this.editForm.pageNum - 1) * this.editForm.pageSize + index + 1;
  134. },
  135. //隐患类型
  136. checkOptionList:function () {
  137. let _this=this;
  138. checkOptionList({}).then((res) =>{
  139. if(res.code==200){
  140. let data=res.data;
  141. _this.dangerList=data
  142. }
  143. })
  144. },
  145. //查询院系
  146. departmentsList:function () {
  147. let _this=this;
  148. departmentsList().then((res) =>{
  149. if(res.code==200){
  150. let data=res.data;
  151. _this.subjectOptions=data
  152. }
  153. })
  154. },
  155. //查询实验室
  156. getSubjectDict:function () {
  157. let _this=this;
  158. getSubjectDict().then((res) =>{
  159. if(res.code==200){
  160. let data=res.data;
  161. _this.labList=data
  162. }
  163. })
  164. },
  165. //请求列表
  166. getAjaxList:function (){
  167. let _this=this;
  168. //列表
  169. let obj={
  170. 'type':localStorage.getItem('deptLevel'),
  171. 'optionId':this.editForm.optionId,
  172. 'subId':this.editForm.subId,
  173. 'pageNum':this.editForm.pageNum,
  174. 'pageSize':this.editForm.pageSize,
  175. 'startTime':this.editForm.beginTimeStr,
  176. 'endTime':this.editForm.endTimeStr,
  177. }
  178. optionChartDetails(obj).then((res) =>{
  179. if(res.code==200){
  180. let data = res.rows;
  181. if(data && data.length>0){
  182. _this.tableData = data;
  183. _this.totalNum = parseInt(res.total);
  184. }else{
  185. _this.tableData = [];
  186. _this.totalNum = 0;
  187. }
  188. }
  189. })
  190. },
  191. //查询图表
  192. getAjaxData: function () {
  193. let _this=this;
  194. //人员违规统计图表
  195. let obj={
  196. 'type':localStorage.getItem('deptLevel'),
  197. 'subId':this.editForm.subId,
  198. 'startTime':this.editForm.beginTimeStr,
  199. 'endTime':this.editForm.endTimeStr,
  200. }
  201. optionCharts(obj).then((res) =>{
  202. if(res.code==200){
  203. let dataX=[];
  204. let dataCount=[];
  205. let data=res.data.list;
  206. for (var i = 0; i < data.length; i++) {
  207. dataX.push( data[i].optionName)
  208. dataCount.push(data[i].count)
  209. }
  210. _this.safetyDetailFun(dataX,dataCount,false)
  211. }
  212. })
  213. },
  214. getLabAjaxData: function () {
  215. let _this=this;
  216. //人员违规统计图表
  217. let obj={
  218. 'pageNum':1,
  219. 'pageSize':50,
  220. }
  221. optionLabCharts(obj).then((res) =>{
  222. if(res.code==200){
  223. let dataX=[];
  224. let dataCount=[];
  225. let data=res.data;
  226. for (var i = 0; i < data.length; i++) {
  227. dataX.push( data[i].subName)
  228. dataCount.push(data[i].count)
  229. }
  230. _this.safetyDetailFun(dataX,dataCount,true)
  231. }
  232. })
  233. },
  234. /*查询*/
  235. onSearch() {
  236. if(this.dateRange.length>0){
  237. this.editForm.beginTimeStr = this.dateRange[0];
  238. this.editForm.endTimeStr = this.dateRange[1];
  239. }
  240. this.editForm.pageNum =1;
  241. this.currentIndex=0;
  242. this.getAjaxList();
  243. this.getAjaxData();
  244. },
  245. /*重置*/
  246. resetForm() {
  247. this.editForm.schoolDeptId = "";
  248. this.editForm.optionId = "";
  249. this.editForm.subId = "";
  250. this.editForm.beginTimeStr = "";
  251. this.editForm.endTimeStr = "";
  252. this.dateRange = [];
  253. this.onSearch();
  254. },
  255. handleCurrentChange(val) {
  256. this.editForm.pageNum = val;
  257. this.getAjaxList();
  258. },
  259. /*安全隐患详情图表*/
  260. safetyDetailFun:function (dataX,dataCount,SlideType) {
  261. let safetydetailOption = {
  262. color: ['#3398DB'],
  263. tooltip : {
  264. /* trigger: 'axis',
  265. axisPointer : { // 坐标轴指示器,坐标轴触发有效
  266. type : 'shadow' // 默认为直线,可选为:'line' | 'shadow'
  267. }*/
  268. },
  269. grid: {
  270. left: '3%',
  271. right: '4%',
  272. bottom: '8%',
  273. containLabel: true
  274. },
  275. xAxis : [
  276. {
  277. type : 'category',
  278. data : dataX,
  279. axisLabel: {
  280. textStyle: {//改变X轴字体颜色
  281. color: '#fff',
  282. },
  283. //设置一行显示几个字,自己设置
  284. formatter: function (params) {
  285. var newParamsName = "";
  286. var paramsNameNumber = params.length;
  287. var provideNumber = 6;
  288. var rowNumber = Math.ceil(paramsNameNumber / provideNumber);
  289. if (paramsNameNumber > provideNumber) {
  290. for (var p = 0; p < rowNumber; p++) {
  291. var tempStr = "";
  292. var start = p * provideNumber;
  293. var end = start + provideNumber;
  294. if (p == rowNumber - 1) {
  295. tempStr = params.substring(start, paramsNameNumber);
  296. } else {
  297. tempStr = params.substring(start, end) + "\n";
  298. }
  299. newParamsName += tempStr;
  300. }
  301. } else {
  302. newParamsName = params;
  303. }
  304. return newParamsName;
  305. }
  306. },
  307. lineStyle: {
  308. "color": "#486CC2",
  309. width:2,
  310. },
  311. axisTick: {
  312. show: false,
  313. },
  314. axisLine:{
  315. lineStyle:{
  316. color:'#2E4C74',//改变X轴颜色
  317. width:2,
  318. }
  319. },
  320. }
  321. ],
  322. yAxis : [
  323. {
  324. type : 'value',
  325. splitLine: { // 分隔线
  326. show: false, // 默认显示,属性show控制显示与否
  327. lineStyle: { // 属性lineStyle(详见lineStyle)控制线条样式
  328. color: ['#fff'],
  329. width: 1,
  330. type: 'solid',
  331. opacity:0.15
  332. },
  333. },
  334. axisLabel: {
  335. textStyle: {//改变X轴字体颜色
  336. color: '#fff',
  337. },
  338. },
  339. axisTick:{//去掉X轴刻度
  340. show:false,
  341. },
  342. axisLine:{
  343. show:true,
  344. lineStyle:{
  345. color:'#2E4C74',//改变X轴颜色
  346. width: '2',
  347. }
  348. },
  349. }
  350. ],
  351. dataZoom: [
  352. {
  353. type: "slider",
  354. show: SlideType,
  355. xAxisIndex: [0],
  356. start: 0,
  357. end: 50,
  358. bottom:'-4%',
  359. textStyle:{
  360. color:"#ccd7d7"
  361. }
  362. },
  363. ],
  364. series : [
  365. {
  366. name:'安全隐患',
  367. label: {
  368. normal: {
  369. show: true,
  370. position: 'top',
  371. textStyle: {
  372. color: '#fff',
  373. }
  374. }
  375. },
  376. itemStyle: {
  377. normal: {
  378. color: new this.$echarts.graphic.LinearGradient(
  379. 0, 0, 0, 1,
  380. [
  381. {offset: 0, color: 'rgba(22, 31, 63, 0.5)'},
  382. {offset: 1, color: '#00D1FF'}
  383. ]
  384. )
  385. },
  386. },
  387. type:'bar',
  388. barWidth: '60%',
  389. barMaxWidth: '10%',
  390. data:dataCount
  391. }
  392. ]
  393. };
  394. var danger_chart = this.$echarts.init(document.getElementById('danger_chart'));
  395. danger_chart.setOption(safetydetailOption);
  396. }
  397. },
  398. mounted() {
  399. this.checkOptionList()
  400. this.departmentsList()
  401. this.getSubjectDict()
  402. this.getAjaxData()
  403. this.getAjaxList()
  404. },
  405. }
  406. </script>
  407. <!-- Add "scoped" attribute to limit CSS to this component only -->
  408. <style lang="scss" scoped>
  409. @function rw($px){
  410. @return $px*100/1920 *1vw;
  411. }
  412. @function rh($px){
  413. @return $px*100/1080 *1vh;
  414. }
  415. * {
  416. padding: 0;
  417. margin: 0;
  418. box-sizing: border-box;
  419. }
  420. .main {
  421. width: rw(1920);
  422. height: rh(1080);
  423. /* background: url("../img/index_bg.png") no-repeat;
  424. background-size: 100% 100%;*/
  425. position: relative;
  426. left: 0;
  427. top: 0;
  428. z-index: 50;
  429. background: #062338;
  430. .main_btn{
  431. position: absolute;
  432. top: rh(140);
  433. right: rw(102);
  434. z-index: 1000;
  435. width: rw(260);
  436. height: rh(40);
  437. border: 1px solid #1ED0F8;
  438. border-radius: 0px rw(4) rh(4) 0px;
  439. display: flex;
  440. overflow: hidden;
  441. >i{
  442. flex: 1;
  443. font-size: rh(14);
  444. font-family: Microsoft YaHei;
  445. font-weight: 400;
  446. color: #999999;
  447. background: none;
  448. line-height:rh(40);
  449. text-align: center;
  450. }
  451. .active{
  452. color: #FFFFFF;
  453. background: #1ED0F8;
  454. }
  455. }
  456. .header {
  457. width: 100%;
  458. position: absolute;
  459. left: rw(0);
  460. top: rh(0);
  461. z-index: 100;
  462. display: flex;
  463. justify-content: flex-start;
  464. .header_l {
  465. width: rw(182);
  466. height: rh(44);
  467. margin: rh(10) 0 0 rw(40);
  468. }
  469. .header_c {
  470. width: rw(1180);
  471. height: rh(152);
  472. margin-left: rw(136);
  473. background: url("~@/assets/image/index_icon2.png") no-repeat;
  474. background-size: 100% 100%;
  475. font-size: rh(30);
  476. font-family: Microsoft YaHei;
  477. font-weight: bold;
  478. color: #FFFFFF;
  479. line-height: rh(30);
  480. text-align: center;
  481. padding-top: rh(26);
  482. }
  483. .header_r {
  484. margin-left: rw(264);
  485. width: rw(82);
  486. height: rh(32);
  487. margin-top: rh(18);
  488. }
  489. }
  490. .main_t{
  491. width: rw(1852);
  492. height: rh(352);
  493. position: absolute;
  494. left: rw(34);
  495. top: rh(86);
  496. z-index: 200;
  497. background: rgba(9, 55, 81, 0.6);
  498. .main_t_t{
  499. margin: rh(20) 0 0 rw(18);
  500. >i{
  501. font-size: rh(16);
  502. font-family: Microsoft YaHei;
  503. font-weight: bold;
  504. color: #FFFFFF;
  505. line-height: rh(16);
  506. }
  507. >i:nth-of-type(1){
  508. }
  509. >i:nth-of-type(2){
  510. color: #1ED0F8;
  511. }
  512. }
  513. .main_t_b{
  514. width: rw(1852);
  515. height: rh(302);
  516. }
  517. }
  518. .main_b{
  519. background: rgba(9, 55, 81, 0.6);
  520. padding: 0 rw(32);
  521. width: rw(1852);
  522. height: rh(602);
  523. position: absolute;
  524. left: rw(34);
  525. top: rh(468);
  526. z-index: 200;
  527. }
  528. }
  529. </style>
  530. <style lang="scss">
  531. li{list-style:none}
  532. i,em,b{font-style:normal;font-weight:100;}
  533. body{margin: 0}
  534. </style>