vBottomMenu.vue 47 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450
  1. <template>
  2. <div class="btm-box">
  3. <img class="light" src="../assets/images/integrated/btm-light.png"/>
  4. <div class="btm-left" :class="btmTipIndent">
  5. <div class="btm-left-tip">
  6. <div class="btm-left-block btm-left-state-c1"></div>
  7. 新上报
  8. </div>
  9. <div class="btm-left-tip">
  10. <div class="btm-left-block btm-left-state-c2"></div>
  11. 催办
  12. </div>
  13. <div class="btm-left-tip">
  14. <div class="btm-left-block btm-left-state-c3"></div>
  15. 已签收
  16. </div>
  17. <!-- div class="btm-left-tip">
  18. <div class="btm-left-block btm-left-state-c4"></div>
  19. 联动
  20. </div> -->
  21. <div class="btm-left-tip">
  22. <div class="btm-left-block btm-left-state-c5"></div>
  23. 办结
  24. </div>
  25. <div class="btm-left-tip">
  26. <div class="btm-left-block btm-left-state-c6"></div>
  27. 归档
  28. </div>
  29. <div class="btm-legend" @click="btmIndent">
  30. <span>图例</span>
  31. <i class="el-icon-caret-right" v-if="this.btmTipIndent !== 'btm-tip-to-right'"></i>
  32. <i class="el-icon-caret-left" v-if="this.btmTipIndent == 'btm-tip-to-right'"></i>
  33. </div>
  34. </div>
  35. <div class="bottom-menu-normal">
  36. <div v-for="(fastMenu,index) in fastMenu" :key="index" class="btm-m-con">
  37. <a><i :class="fastMenu.icon" @click.stop="showDialog(fastMenu.click)"></i><a
  38. @click.stop="showDialog(fastMenu.click)">{{ fastMenu.name }}</a>
  39. <div v-if="showChild && fastMenu.click == 'layerSwitching'" class="nav-child">
  40. <el-button type="primary"
  41. @click.stop="choseLayerSwitching(null,true)"
  42. class="nav-child-btn" plain>矢量图
  43. </el-button>
  44. <el-button type="primary"
  45. @click.stop="choseLayerSwitching('http://121.36.228.94:8090/iserver/services/map-baishan/rest/maps/baishanyingxiang',true)"
  46. class="nav-child-btn" plain>影像图
  47. </el-button>
  48. <!-- <el-button type="danger" icon="el-icon-close" style="position: absolute;right: 0;top: 0;width: 1rem;height: 1rem;padding:0;"
  49. @click.stop="closeChild"></el-button> -->
  50. </div>
  51. <!-- 林斑 -->
  52. <div v-show="showBanChild && fastMenu.click == 'forestban'" class="nav-child">
  53. <div class="forestban">
  54. <div class="forestban-con">
  55. <!-- <el-input-->
  56. <!-- placeholder="输入关键字进行过滤"-->
  57. <!-- v-model="filterbanText">-->
  58. <!-- </el-input>-->
  59. <el-tree :data="deptBanOptionsLiandong" ref="banDept" node-key="id" :check-strictly="true"
  60. :filter-node-method="filterbanNode" @node-click="handlebanNodeClick" :accordion="true" empty-text=""
  61. :props="defaultProps"></el-tree>
  62. </div>
  63. <div class="forestban-right">
  64. <el-input placeholder="请输入内容" prefix-icon="el-icon-search" v-model="filterban" @change="searchFilterban(filterchang)">
  65. </el-input>
  66. <el-checkbox-group v-model="banCheckList_Data">
  67. <el-checkbox v-for="(item,index) in filterbanList" :label="item"
  68. @change="handleCheckedCitiesChangeBan_Data">
  69. {{ item.farmName }}
  70. </el-checkbox>
  71. </el-checkbox-group>
  72. </div>
  73. <el-button type="danger" icon="el-icon-close"
  74. style="position: absolute;right: 0;top: 0;width: 1rem;height: 1rem;padding:0;"
  75. @click.stop="closeBanChild"></el-button>
  76. </div>
  77. </div>
  78. <!-- 林场 -->
  79. <div v-show="showChangChild && fastMenu.click == 'forestchang'" class="nav-child">
  80. <div class="forestban">
  81. <div class="forestban-con">
  82. <!-- <el-input-->
  83. <!-- placeholder="输入关键字进行过滤"-->
  84. <!-- v-model="filterchangText">-->
  85. <!-- </el-input>-->
  86. <el-tree :data="deptChangOptionsLiandong" ref="changDept" node-key="id"
  87. :check-strictly="true" :filter-node-method="filterchangNode"
  88. @node-click="handlechangNodeClick" :accordion="true" empty-text="加载中,请稍候"
  89. :props="defaultProps"></el-tree>
  90. </div>
  91. <div class="forestban-right">
  92. <el-input placeholder="请输入内容" prefix-icon="el-icon-search" v-model="filterchang"
  93. @change="searchFilterchang(filterchang)">
  94. </el-input>
  95. <el-checkbox-group v-model="changCheckList" @change="handleCheckedCitiesChangeChang">
  96. <el-checkbox v-for="(item,index) in filterchangList" :label="item.farmAddress">
  97. {{ item.farmName }}
  98. </el-checkbox>
  99. </el-checkbox-group>
  100. </div>
  101. <el-button type="danger" icon="el-icon-close"
  102. style="position: absolute;right: 0;top: 0;width: 1rem;height: 1rem;padding:0;"
  103. @click.stop="closeChangChild"></el-button>
  104. </div>
  105. </div>
  106. </a>
  107. </div>
  108. </div>
  109. <div class="btm-right">
  110. <el-popover placement="top" trigger="click">
  111. <div class="btm-r-pop-info">
  112. <div class="btm-r-pop-info-box" v-for="(item,index) in taskList">
  113. <div class="btm-r-pop-info-tit">
  114. <h3>{{ item.taskSourceValue }}</h3>
  115. </div>
  116. <div class="btm-r-pop-info-con">
  117. <div class="btm-r-pop-info-list">
  118. <div class="btm-r-pop-info-list-name">标题</div>
  119. <div class="btm-r-pop-info-list-text">{{ item.taskTitle }}</div>
  120. </div>
  121. <div class="btm-r-pop-info-list">
  122. <div class="btm-r-pop-info-list-name">发起人</div>
  123. <div class="btm-r-pop-info-list-text">{{ item.sendPersonName }}</div>
  124. </div>
  125. <div class="btm-r-pop-info-list">
  126. <div class="btm-r-pop-info-list-name">发起时间</div>
  127. <div class="btm-r-pop-info-list-text">{{ item.taskSendTime }}</div>
  128. </div>
  129. <div class="btm-r-pop-info-list">
  130. <div class="btm-r-pop-info-list-name">关联事件</div>
  131. <div class="btm-r-pop-info-list-text">{{ item.eventName }}</div>
  132. </div>
  133. <div class="btm-r-pop-info-list">
  134. <div class="btm-r-pop-info-list-name">催办状态</div>
  135. <div class="btm-r-pop-info-list-text" style="color: red" v-if="item.isUrged==1">
  136. 任务催办中,请及时处理!!
  137. </div>
  138. <div class="btm-r-pop-info-list-text" v-else>正常</div>
  139. </div>
  140. </div>
  141. <div class="btm-r-pop-info-btm">
  142. <el-link type="success" @click="showEventDialog( item.eventCode )">查看详情</el-link>
  143. <div class="btm-r-pop-info-btm-btn">
  144. <el-button type="danger" @click="selectTaskDtpts(item.taskId,item.eventCode,'jj')">拒绝
  145. </el-button>
  146. <el-button type="primary" @click="selectTaskDtpts(item.taskId,item.eventCode,'lq')">领取
  147. </el-button>
  148. </div>
  149. </div>
  150. </div>
  151. </div>
  152. <el-badge :value="taskCount" slot="reference">
  153. <el-button size="small" icon="el-icon-bank-card">任务</el-button>
  154. </el-badge>
  155. </el-popover>
  156. <el-popover placement="top" trigger="click">
  157. <div class="btm-r-pop-info">
  158. <div class="btm-r-pop-info-box" v-for="(item,index) in messageList">
  159. <div class="btm-r-pop-info-con">
  160. <div class="btm-r-pop-info-list">
  161. <div class="btm-r-pop-info-list-name">{{ item.title }}</div>
  162. <div class="btm-r-pop-info-list-text">{{ item.content }}</div>
  163. </div>
  164. </div>
  165. <div class="btm-r-pop-info-btm">
  166. <el-link type="success" @click="selectMessageById(item.id)">标记已读</el-link>
  167. </div>
  168. </div>
  169. </div>
  170. <el-badge :value="messageCount" slot="reference">
  171. <el-button size="small" icon="el-icon-chat-line-round">消息</el-button>
  172. </el-badge>
  173. </el-popover>
  174. <!-- 警报铃 必须放在这,放在别处不好使 -->
  175. <div class="bell" v-if="eventWarn" @click="updateAlertFalse">
  176. <div class="dot"></div>
  177. <div class="pulse"></div>
  178. <div class="pulse-big"></div>
  179. </div>
  180. <!--<el-badge type="primary">-->
  181. <!--<el-button size="small" icon="el-icon-bell" @click="updateAlertFalse">警报</el-button>-->
  182. <!--</el-badge>-->
  183. <el-badge type="warning">
  184. <el-button size="small" icon="el-icon-refresh-right" @click="refresh">刷新</el-button>
  185. </el-badge>
  186. </div>
  187. <!-- 事件详情弹层 -->
  188. <el-dialog title="事件详情" :visible.sync="eventDialog" v-if="eventDialog" customClass="customWidth" append-to-body
  189. @close="cancelEventShow()">
  190. <div class="dia-event-info">
  191. <el-row>
  192. <!-- 左侧 -->
  193. <el-col :span="18" class="dia-left">
  194. <div ref="imageTofile" style="height: 75vh;">
  195. <!-- 应急预案 -->
  196. <div class="dia-left-top">
  197. <div class="dia-left-top-tit">应急预案</div>
  198. <div class="dia-left-top-carousel">
  199. <el-carousel height="30px" direction="vertical" :interval="2000">
  200. <el-carousel-item v-if="visuForestCloudYuAnBo!=null">
  201. <a
  202. :href="visuForestCloudYuAnBo.fileUrl">{{ visuForestCloudYuAnBo.reserveName }}</a>
  203. </el-carousel-item>
  204. <el-carousel-item v-else>
  205. <a href="#">未选预案</a>
  206. </el-carousel-item>
  207. </el-carousel>
  208. </div>
  209. </div>
  210. <!-- 应急预案end -->
  211. <!-- 地图 -->
  212. <supermapTaskDialog ref="supermapTaskDialog" style="position: absolute; top:0;left: 0;"
  213. :mapDiv="'taskDialogSuperMap'"
  214. :mapSite="{zoom:12,doubleClickZoom:false,dragging:false,scrollWheelZoom:false}"
  215. :codes="['9fa5']" :isSideBySide="false" :isdynamicPlotting="false"/>
  216. <!-- 地图end -->
  217. </div>
  218. </el-col>
  219. <!-- 左侧end -->
  220. <!-- 右侧 -->
  221. <el-col :span="6" class="dia-right">
  222. <div class="e-right">
  223. <div class="forthis1-1">
  224. <dv-border-box-7 backgroundColor="#040b1f" :color="['#25335d', '#5baffd']"
  225. style="padding-bottom:1rem ;">
  226. <div class="i-list-con">
  227. <div class="this-con">
  228. <div class="z-info-list" style="margin-top: 0;">
  229. <el-timeline>
  230. <el-timeline-item color="#2bacf7" :timestamp="item.createTime"
  231. placement="top" v-for="(item,index) in eventLogList">
  232. <el-card style="width: 40vh">
  233. <div class="z-info-list-con">
  234. <div class="user-and-time flex-d">
  235. <span>{{ item.createName }}</span>
  236. <span
  237. v-if="eventLogList.length - 1 == index&&address!=null&&address!=''"><i
  238. class="el-icon-location"></i>
  239. {{ address }}</span>
  240. <span v-else></span>
  241. </div>
  242. <div class="z-info">
  243. <div class="this-con-list-info">
  244. {{ item.logContent }}
  245. </div>
  246. <div>
  247. <router-link to="#"
  248. @click.native="clickFile(itemfile.fileUrl,itemfile.fileName,itemfile.fileType)"
  249. v-for="(itemfile,indexfile) in item.fileVOs">
  250. <el-image :src="itemfile.fileUrl"
  251. v-if="itemfile.fileType=='image'"
  252. :preview-src-list="assetTypeAnImage(item.fileVOs)"
  253. style="width:3rem; height:3rem;margin: 2px;"
  254. :title="itemfile.fileName">
  255. </el-image>
  256. <img v-else-if="itemfile.fileType=='video'"
  257. style="width:3rem; height:3rem;margin: 2px;"
  258. :src="require('@/assets/fileTypeImage/mp4.png')"
  259. :title="itemfile.fileName">
  260. </img>
  261. <img v-else-if="itemfile.fileType=='word'"
  262. style="width:3rem; height:3rem;margin: 2px;"
  263. :src="require('@/assets/fileTypeImage/word.png')"
  264. :title="itemfile.fileName">
  265. </img>
  266. <img v-else-if="itemfile.fileType=='excel'"
  267. style="width:3rem; height:3rem;margin: 2px;"
  268. :src="require('@/assets/fileTypeImage/excel.png')"
  269. :title="itemfile.fileName">
  270. </img>
  271. <img v-else
  272. style="width:3rem; height:3rem;margin: 2px;"
  273. :src="require('@/assets/fileTypeImage/file.png')"
  274. :title="itemfile.fileName">
  275. </img>
  276. </router-link>
  277. </div>
  278. </div>
  279. </div>
  280. </el-card>
  281. </el-timeline-item>
  282. </el-timeline>
  283. </div>
  284. </div>
  285. </div>
  286. </dv-border-box-7>
  287. </div>
  288. <!-- <div class="forthis">-->
  289. <!-- <dv-border-box-7 backgroundColor="#040b1f" :color="['#25335d', '#5baffd']">-->
  290. <!-- <div class="i-list-con">-->
  291. <!-- <div class="this-con h-25 no-padding">-->
  292. <!-- <div class="z-info-list" style="margin-top: 0;">-->
  293. <!-- <div class="z-info-btm-grp">-->
  294. <!-- <div class="z-info-btm-grp-top">-->
  295. <!-- <div class="z-info-btm-grp-left">-->
  296. <!-- &lt;!&ndash; <el-button size="small" icon="el-icon-s-flag">责任制&ndash;&gt;-->
  297. <!-- &lt;!&ndash; </el-button>&ndash;&gt;-->
  298. <!-- <el-button size="small" icon="el-icon-upload" @click="showEventLogUpload()">上传-->
  299. <!-- </el-button>-->
  300. <!-- <el-button size="small" icon="el-icon-download" @click="toImage()">保存-->
  301. <!-- </el-button>-->
  302. <!-- </div>-->
  303. <!-- <div class="z-info-btm-grp-right">-->
  304. <!-- <el-button size="small" icon="el-icon-mic">会议-->
  305. <!-- </el-button>-->
  306. <!-- </div>-->
  307. <!-- </div>-->
  308. <!-- </div>-->
  309. <!-- </div>-->
  310. <!-- </div>-->
  311. <!-- </div>-->
  312. <!-- </dv-border-box-7>-->
  313. <!-- </div>-->
  314. </div>
  315. </el-col>
  316. <!-- 左侧end -->
  317. </el-row>
  318. </div>
  319. </el-dialog>
  320. <!-- 任务选择领取部门弹层 -->
  321. <el-dialog title="选择部门" :visible.sync="showDeptConfirm" v-if="showDeptConfirm" width="30%" append-to-body
  322. @close="cancelEventConfirm()">
  323. <el-form label-width="80px">
  324. <el-form-item label="选择部门">
  325. <el-select v-model="deptName" multiple placeholder="请选择部门" class="m-r-1rem" @change="setValue">
  326. <el-option v-for="item in deptOptions" :key="item.taskDeptId" :label="item.taskDeptName"
  327. :value="{value:item.taskDeptId,label:item.taskDeptName}">
  328. <!--:disabled="item.eventStatus=='未处理' ? false:true"-->
  329. </el-option>
  330. </el-select>
  331. </el-form-item>
  332. <el-button size="mini" type="primary" v-if="taskStatusButton=='lq'"
  333. @click="receiveTask(taskId,eventCode)">领取
  334. </el-button>
  335. <el-button size="mini" type="primary" v-if="taskStatusButton=='jj'"
  336. @click="refusedTask(taskId,eventCode)">拒绝
  337. </el-button>
  338. </el-form>
  339. </el-dialog>
  340. <!-- 图片,视频预览 -->
  341. <el-dialog title="视频预览" :visible.sync="showTcPlayer" width="40%" append-to-body>
  342. <TcPlayer ref="TcPlayer" :playVideo="playVideo" :widthHeigt="[100,100]"></TcPlayer>
  343. </el-dialog>
  344. </div>
  345. </template>
  346. <script>
  347. import {
  348. selectTaskBO,
  349. getEventDetail,
  350. selectTaskDtpts,
  351. receiveTask,
  352. refusedTask,
  353. selectMessageCount,
  354. selectMessageList,
  355. selectMessageById
  356. } from '@/api/forest'
  357. import {
  358. selectFarmByDeptId,linBanTreeselect,selectBanBylinBanTreesId,userDeptSelect
  359. } from '@/api/vBottomMenu'
  360. import supermapTaskDialog from '@/components/supermap' //超图
  361. import TcPlayer from '@/components/TcPlayer' //视频预览
  362. import Cookies from 'js-cookie'
  363. import { selectConfigKey } from '@/api/system/config'
  364. export default {
  365. components: {
  366. supermapTaskDialog,
  367. TcPlayer
  368. },
  369. watch: {
  370. filterbanText(val) {
  371. console.log(this.$refs)
  372. this.$refs.banDept.filter(val)
  373. },
  374. filterchangText(val) {
  375. console.log(this.$refs)
  376. this.$refs.changDept.filter(val)
  377. }
  378. },
  379. data() {
  380. return {
  381. playVideo: '', //视频预览地址
  382. showTcPlayer: false, //视频预览弹窗
  383. filterbanText: '',
  384. filterchangText: '',
  385. filterbanList: [],
  386. filterbanListAll: [],
  387. filterchangList: [],
  388. filterchangListAll: [],
  389. eventId: null,
  390. eventCode: null,
  391. longitude: null,
  392. latitude: null,
  393. eventLogList: [], //事件详情日志
  394. eventDialog: false, //事件详情弹层
  395. taskStatusButton: null, //任务按钮
  396. visuForestCloudYuAnBo: null,
  397. address: null, //事件上报地址
  398. taskId: null, //任务ID
  399. showDeptConfirm: false, //任务领取选择部门弹窗
  400. deptOptions: [], //任务领取部门列表
  401. centerTaskTaskDepts: [], //任务领取部门
  402. deptName: [], //任务领取部门
  403. taskCount: 0, //任务数量
  404. taskList: 0, //任务列表
  405. btmTipIndent: '', //图例收起弹出
  406. eventLocationVisible: false,
  407. showChild: false,
  408. showBanChild: false, //林斑
  409. showChangChild: false, //林场
  410. fastMenu: [
  411. {
  412. name: '事件定位',
  413. icon: 'iconfont sj-icon-sjdw',
  414. click: 'eventLocation'
  415. },
  416. // {
  417. // name: '图层切换',
  418. // icon: 'iconfont sj-icon-tcqh',
  419. // click: 'layerSwitching'
  420. // },
  421. {
  422. name: '测量工具',
  423. icon: 'iconfont sj-icon-clgj',
  424. click: 'editableLayers'
  425. },
  426. {
  427. name: '林班',
  428. icon: 'iconfont sj-icon-lbzy',
  429. click: 'forestban'
  430. },
  431. {
  432. name: '林场',
  433. icon: 'iconfont sj-icon-lczy',
  434. click: 'forestchang'
  435. },
  436. {
  437. name: '电视墙',
  438. icon: 'el-icon-s-grid',
  439. click: 'TVWall'
  440. },
  441. {
  442. name: '无人机',
  443. icon: 'iconfont sj-icon-landing',
  444. click: 'wrj'
  445. }
  446. ],
  447. deptChangOptionsLiandong: [],//查询林场部门树结构
  448. deptBanOptionsLiandong: [],//查询林班层级树结构
  449. // deptOptionsLiandong_baishan: [
  450. // {
  451. // label: '板石头国有林场',
  452. // id: 1,
  453. // children: [
  454. // ]
  455. // }, {
  456. // label: '五间房国有林场',
  457. // id: 2,
  458. // children: []
  459. // }, {
  460. // label: '三道沟国有林场',
  461. // id: 3,
  462. // children: []
  463. // }, {
  464. // label: '大镜沟国有林场',
  465. // id: 4,
  466. // children: []
  467. // }, {
  468. // label: '实验国有林场',
  469. // id: 5,
  470. // children: []
  471. // }
  472. // ],
  473. defaultProps: {
  474. children: 'children',
  475. label: 'label'
  476. },
  477. banCheckList: [], //林班
  478. banCheckList_Data: [], //林班 带数据图层
  479. changCheckList: [], //林场
  480. filterban: '', //林班搜索
  481. filterchang: '', //林场搜索
  482. btmCurrent: '',
  483. eventWarn: false, //webSocket事件问题警报标记
  484. messageCount: 0, //消息数量
  485. messageList: 0,//消息列表
  486. websock: '',
  487. wsurl:'',
  488. postName:'',
  489. setIntervalWesocketPush: null,
  490. websockSid: {
  491. userId: ''
  492. },
  493. }
  494. },
  495. created() {
  496. },
  497. mounted() {
  498. this.websockSid.userId=Cookies.get("userId")
  499. },
  500. methods: {
  501. deptTreeselect(){
  502. /** 查询林场部门树结构 */
  503. userDeptSelect().then(response => {
  504. this.deptChangOptionsLiandong = response.data
  505. })
  506. },
  507. initWebSocket(wsurl,postName,userId) {
  508. this.postName=postName
  509. this.wsurl=wsurl
  510. selectConfigKey(wsurl).then(res => {
  511. //初始化weosocket
  512. //const wsuri = 'ws://127.0.0.1:10003/eventPush/' + userId + '/' + eventTypeDl + '/' + eventType
  513. const wsuri = res.data +postName+ userId
  514. // const wsuri = 'ws://172.28.20.82:10012/taskPush/'+userId
  515. this.websock = new WebSocket(wsuri)
  516. //console.log('建立websocket连接' + wsuri)
  517. this.websock.onopen = this.websocketonopen
  518. this.websock.onmessage = this.websocketonmessage
  519. this.websock.onerror = this.websocketonerror
  520. })
  521. },
  522. websocketonopen() { //连接建立之后执行send方法发送数据
  523. console.log('websocket连接成功')
  524. this.weosocket = true
  525. this.sendPing()
  526. },
  527. websocketonerror() { //连接建立失败重连
  528. this.initWebSocket(this.wsurl,this.postName,this.websockSid.userId)
  529. },
  530. websocketonmessage(e) { //数据接收
  531. console.log('接收数据', e.data)
  532. // let data = "{\"fromId\":\"farming\"}";
  533. // 处理收到的消息
  534. this.handleWebSoceketEvent(e.data)
  535. },
  536. handleWebSoceketEvent(val) {
  537. let that = this
  538. let data = JSON.parse(val)
  539. console.log('数据数据数据数据',data)
  540. /**
  541. * that.markersList.filter( item => data.eventCode == item.parameter).length == 0 如果地图中不存在当前事件则添加
  542. * eventPush: 事件列表消息
  543. * */
  544. let message=data.centermessageTPushrecord
  545. let message2=data.centertaskTTask
  546. if (null!=message)
  547. {
  548. console.log(message)
  549. this.messageList.push(message)
  550. this.messageCount++
  551. }else if (null!=message2)
  552. {
  553. this.taskList.push(message2)
  554. this.taskCount ++
  555. }
  556. // if (data.tag == "eventPush" && that.markersList.filter( item => data.eventCode == item.parameter).length == 0) {
  557. // getEventPush({eventCode: data.eventCode}).then((res) => {
  558. // if (res.data != undefined) {
  559. // //插入到第一条
  560. // this.eventList.unshift(res.data)
  561. // // 插入后删除最后一条 保证列表中为10条数据
  562. // if (this.eventList.length > 9)
  563. // this.eventList.splice(10, 1)
  564. // // 将收到的数据在地图上添加
  565. // this.getWebSocketEvent(res.data)
  566. // }
  567. // })
  568. // }
  569. console.log(data)
  570. },
  571. websocketsend(Data) { //数据发送
  572. this.websock.send(Data)
  573. },
  574. websocketclose(e) { //关闭
  575. console.log('断开连接', e)
  576. // clearInterval(this.setIntervalWesocketPush)
  577. this.weosocket = false
  578. },
  579. /**发送心跳
  580. * @param {number} time 心跳间隔毫秒 默认5000
  581. * @param {string} ping 心跳名称 默认字符串ping
  582. */
  583. sendPing(time = 60000, ping = {
  584. 'fromId': 'farming'
  585. }) {
  586. clearInterval(this.setIntervalWesocketPush)
  587. this.setIntervalWesocketPush = setInterval(() => {
  588. if (this.weosocket) {
  589. this.websock.send(JSON.stringify(ping))
  590. } else {
  591. // this.initWebSocket()
  592. }
  593. }, time)
  594. },
  595. linBanTreeselect(){
  596. /** 查询林班层级树结构 */
  597. linBanTreeselect().then(response => {
  598. this.deptBanOptionsLiandong = response.data
  599. })
  600. },
  601. selectMessageById(id) {
  602. selectMessageById(id).then(response => {
  603. /** 获取消息列表 */
  604. this.selectMessageList()
  605. })
  606. },
  607. /** 获取消息个数 */
  608. selectMessageCount() {
  609. selectMessageCount(Cookies.get('userId')).then(response => {
  610. this.messageCount = response.data
  611. })
  612. },
  613. /** 获取消息列表 */
  614. selectMessageList() {
  615. selectMessageList(Cookies.get('userId')).then(response => {
  616. this.messageList = response.data
  617. this.messageCount = response.data.length
  618. })
  619. this.initWebSocket('MESSAGE_SOCKET','/messagePush/',this.websockSid.userId)
  620. },
  621. filterbanNode(value, data) {
  622. //树搜索
  623. if (!value) return true
  624. return data.label.indexOf(value) !== -1
  625. },
  626. filterchangNode(value, data) {
  627. //树搜索
  628. if (!value) return true
  629. return data.label.indexOf(value) !== -1
  630. },
  631. handlechangNodeClick(node, data, value) {
  632. //获取林场列表
  633. this.filterchang = ''
  634. selectFarmByDeptId({
  635. deptId: node.id
  636. }).then(res => {
  637. this.filterchangList = res.data
  638. this.filterchangListAll = res.data
  639. })
  640. },
  641. handlebanNodeClick(node, data, value) {
  642. //获取林班列表
  643. this.filterban = ''
  644. selectBanBylinBanTreesId(node.id).then(res => {
  645. this.filterbanList = res.data
  646. this.filterbanListAll = res.data
  647. })
  648. // if(node.id==1){
  649. // this.filterbanList=[
  650. // {
  651. // farmAddress: 'http://121.36.228.94:8090/iserver/services/map-baishan/rest/maps/BanShiTouGuoYouLinChang',
  652. // farmName: '板石街道',
  653. // datasetNames: ['bs:banshijiedao'],
  654. // name: 'banshijiedao@bs'
  655. // },
  656. // {
  657. // farmAddress: 'http://121.36.228.94:8090/iserver/services/map-baishan/rest/maps/BanShiTouGuoYouLinChang',
  658. // farmName: '河口街道',
  659. // datasetNames: ['bs:hekoujiedao'],
  660. // name: 'hekoujiedao@bs'
  661. // },
  662. // {
  663. // farmAddress: 'http://121.36.228.94:8090/iserver/services/map-baishan/rest/maps/BanShiTouGuoYouLinChang',
  664. // farmName: '七道江镇',
  665. // datasetNames: ['bs:qidaojiangzhen'],
  666. // name: 'qidaojiangzhen@bs'
  667. // },
  668. // ]
  669. // }else if (node.id==2){
  670. // this.filterbanList=[
  671. // {
  672. // farmAddress: 'http://121.36.228.94:8090/iserver/services/map-baishan/rest/maps/WuJianFangGuoYouLinChang',
  673. // farmName: '六道江镇',
  674. // datasetNames: ['bs:WuJianFangGuoYouLinChang'],
  675. // name: 'WuJianFangGuoYouLinChang@bs'
  676. // },
  677. // ]
  678. // }else if (node.id==3){
  679. // this.filterbanList=[
  680. // {
  681. // farmAddress: 'http://121.36.228.94:8090/iserver/services/map-baishan/rest/maps/SanDaoGouGuoYouLinChang',
  682. // farmName: '三道沟镇',
  683. // datasetNames: ['bs:SanDaoGouGuoYouLinChang'],
  684. // name: 'SanDaoGouGuoYouLinChang@bs'
  685. // },
  686. // ]
  687. // }else if (node.id==4){
  688. // this.filterbanList=[
  689. // {
  690. // farmAddress: 'http://121.36.228.94:8090/iserver/services/map-baishan/rest/maps/DaJingGouGuoYouLinChang',
  691. // farmName: '红土崖镇',
  692. // datasetNames: ['bs:DaJingGouGuoYouLinChang'],
  693. // name: 'DaJingGouGuoYouLinChang@bs'
  694. // },
  695. // ]
  696. // }else if (node.id==5){
  697. // this.filterbanList=[
  698. // {
  699. // farmAddress: 'http://121.36.228.94:8090/iserver/services/map-baishan/rest/maps/ShiYanGuoYouLinChang',
  700. // farmName: '大阳岔镇',
  701. // datasetNames: ['bs:ShiYanGuoYouLinChang'],
  702. // name: 'ShiYanGuoYouLinChang@bs'
  703. // }
  704. // ]
  705. // }
  706. },
  707. // 返回图片列表
  708. assetTypeAnImage(filePath) {
  709. let imageList = []
  710. if (filePath != null && filePath.length > 0) {
  711. for (let i = 0; i < filePath.length; i++) {
  712. if (filePath[i].fileType == 'image') {
  713. imageList.push(filePath[i].fileUrl)
  714. }
  715. }
  716. }
  717. return imageList
  718. },
  719. clickFile(fileUrl, fileName, fileType) {
  720. if (fileType == 'image') {
  721. return
  722. } else if (fileType == 'video') {
  723. this.showTcPlayer = true
  724. setTimeout(() => {
  725. this.playVideo = fileUrl
  726. }, 500)
  727. } else {
  728. let a = document.createElement('a')
  729. a.download = fileName
  730. a.href = fileUrl
  731. a.target = '_blank'
  732. a.click()
  733. }
  734. },
  735. setValue(event) {
  736. this.centerTaskTaskDepts = []
  737. //签收选择部门
  738. if (event != null && event.length > 0) {
  739. for (let i = 0; i < event.length; i++) {
  740. if (event[i].label != undefined && event[i].value != undefined) {
  741. this.centerTaskTaskDepts.push({
  742. taskDeptId: event[i].value,
  743. taskDeptName: event[i].label
  744. })
  745. }
  746. }
  747. }
  748. },
  749. receiveTask(taskId, eventCode) {
  750. let param = {
  751. taskId: taskId,
  752. eventCode: eventCode,
  753. centerTaskTaskDepts: this.centerTaskTaskDepts
  754. }
  755. receiveTask(param).then(res => {
  756. //任务领取
  757. if (res.code == 200) {
  758. this.$message.success(`任务领取成功!`)
  759. this.deptOptions = []
  760. this.deptName = []
  761. this.centerTaskTaskDepts = []
  762. //刷新任务列表
  763. this.selectTaskList()
  764. this.showDeptConfirm = false
  765. }
  766. })
  767. },
  768. refusedTask(taskId, eventCode) {
  769. let param = {
  770. taskId: taskId,
  771. eventCode: eventCode,
  772. centerTaskTaskDepts: this.centerTaskTaskDepts
  773. }
  774. refusedTask(param).then(res => {
  775. //任务拒绝
  776. if (res.code == 200) {
  777. this.$message.success(`任务拒绝成功!`)
  778. this.deptOptions = []
  779. this.deptName = []
  780. this.centerTaskTaskDepts = []
  781. //刷新任务列表
  782. this.selectTaskList()
  783. this.showDeptConfirm = false
  784. }
  785. })
  786. },
  787. selectTaskDtpts(taskId, eventCode, state) {
  788. this.taskId = taskId
  789. this.eventCode = eventCode
  790. selectTaskDtpts({
  791. taskId: taskId
  792. }).then(res => {
  793. //任务领取部门列表
  794. if (res.code == 200) {
  795. this.deptOptions = res.data
  796. this.taskStatusButton = state
  797. this.showDeptConfirm = true
  798. }
  799. })
  800. },
  801. cancelEventShow() {
  802. console.log('关闭事件弹窗')
  803. this.eventCode = null
  804. this.eventLogList = []
  805. },
  806. cancelEventConfirm() {
  807. console.log('关闭任务选择部门')
  808. this.eventCode = null
  809. this.deptOptions = []
  810. this.deptName = []
  811. this.centerTaskTaskDepts = []
  812. },
  813. showEventDialog(eventCode) {
  814. this.eventCode = eventCode
  815. let that = this
  816. //获取事件详情
  817. getEventDetail({
  818. eventCode: eventCode
  819. }).then(res => {
  820. this.eventDialog = true
  821. this.eventLogList = res.data.eventlog
  822. this.visuForestCloudYuAnBo = res.data.visuForestCloudYuAnBo //应急预案
  823. this.address = res.data.catalogue.address
  824. this.eventType = res.data.catalogue.eventType
  825. this.eventId = res.data.catalogue.id
  826. this.longitude = res.data.catalogue.longitude
  827. this.latitude = res.data.catalogue.latitude
  828. let markersMap = {
  829. lng: 124.59,
  830. lat: 43.02,
  831. icon: 'marker',
  832. bindPopupHtml: '',
  833. click: '',
  834. parameter: '',
  835. keepBindPopup: false,
  836. isAggregation: false,
  837. radius: 0
  838. }
  839. if (res.data.catalogue.eventStatusValue == 'forest_event_status_1' && res.data.catalogue
  840. .urgeCount == 0) {
  841. markersMap.icon = 'sj-icon-map-xinshangbao'
  842. }
  843. if (res.data.catalogue.eventStatusValue == 'forest_event_status_1' && res.data.catalogue
  844. .urgeCount > 0) {
  845. markersMap.icon = 'sj-icon-map-cuiban'
  846. } else if (res.data.catalogue.eventStatusValue == 'forest_event_status_2') {
  847. markersMap.icon = 'sj-icon-map-qianshou'
  848. } else if (res.data.catalogue.eventStatusValue == 'forest_event_status_5') {
  849. markersMap.icon = 'sj-icon-map-banjie'
  850. } else if (res.data.catalogue.eventStatusValue == 'forest_event_status_6') {
  851. markersMap.icon = 'sj-icon-map-guidang'
  852. }
  853. markersMap.lng = res.data.catalogue.longitude
  854. markersMap.lat = res.data.catalogue.latitude
  855. if (res.data.eventdetail != null && res.data.eventdetail.length > 0 && res.data.eventdetail[0]
  856. .fireRadius != null && res.data.eventdetail[0].fireRadius != '' && res.data.eventdetail[0]
  857. .fireRadius > 0) {
  858. markersMap.radius = res.data.eventdetail[0].fireRadius
  859. }
  860. setTimeout(() => {
  861. // that.$refs.supermapTaskDialog.dynamicPlotting()//弹出动态绘制窗口,防止截图位置改变
  862. that.$refs.supermapTaskDialog.clearM(false)
  863. that.$refs.supermapTaskDialog.setMarkersRadius([markersMap])
  864. that.$refs.supermapTaskDialog.dropLocation(res.data.catalogue.latitude, res.data
  865. .catalogue.longitude)
  866. }, 1000)
  867. })
  868. },
  869. selectTaskList: async function() {
  870. //获取任务列表
  871. selectTaskBO().then(res => {
  872. this.taskList = res.data
  873. this.taskCount = res.data.length
  874. })
  875. this.initWebSocket('TASK_SOCKET','/taskPush/',this.websockSid.userId)
  876. },
  877. handleCheckedCitiesChangeBan(value) {
  878. this.choseLayerSwitchingList(this.banCheckList)
  879. },
  880. handleCheckedCitiesChangeBan_Data(value) {
  881. if(this.banCheckList_Data.length > 1){
  882. this.banCheckList_Data.splice(0,1)
  883. }
  884. this.choseLayerSwitchingList_Data(this.banCheckList_Data)
  885. },
  886. handleCheckedCitiesChangeChang(value) {
  887. this.choseLayerSwitchingList(this.changCheckList)
  888. },
  889. refresh() {
  890. window.location.reload()
  891. },
  892. showDialog(click) {
  893. window.showDialog(click)
  894. },
  895. choseLayerSwitching(url, isClear) {
  896. window.choseLayerSwitching(url, isClear)
  897. },
  898. choseLayerSwitchingList(urlList) { //选择图层(传递数组)
  899. window.choseLayerSwitchingList(urlList)
  900. },
  901. choseLayerSwitchingList_Data(urlList) { //选择图层(传递数组)
  902. window.choseLayerSwitchingList_Data(urlList)
  903. },
  904. forestban() {
  905. alert(111)
  906. window.forestban()
  907. console.log('林班')
  908. },
  909. forestchang() {
  910. alert(222)
  911. window.forestchang()
  912. console.log('林场')
  913. },
  914. closeBanChild() {
  915. this.banCheckList = []
  916. this.showBanChild = false
  917. },
  918. closeChangChild() {
  919. this.changCheckList = []
  920. this.showChangChild = false
  921. },
  922. //图例收起弹出
  923. btmIndent() {
  924. if (this.btmTipIndent == '') {
  925. this.btmTipIndent = 'btm-tip-to-right'
  926. } else if (this.btmTipIndent == 'btm-tip-to-right') {
  927. this.btmTipIndent = ''
  928. }
  929. },
  930. searchFilterchang(filterchang) {
  931. //林场列表搜索
  932. let searchFilterchangnew = []
  933. if (filterchang != null && filterchang != '') {
  934. for (var i = 0; i < this.filterchangListAll.length; i++) {
  935. if (this.filterchangListAll[i].farmName.indexOf(filterchang) > -1) {
  936. searchFilterchangnew.push(this.filterchangListAll[i])
  937. }
  938. }
  939. this.filterchangList = searchFilterchangnew
  940. } else {
  941. this.filterchangList = this.filterchangListAll
  942. }
  943. },
  944. searchFilterban(filterban) {
  945. //林场列表搜索
  946. let searchFilterbannew = []
  947. if (filterban != null && filterban != '') {
  948. for (var i = 0; i < this.filterbanListAll.length; i++) {
  949. if (this.filterbanListAll[i].farmName.indexOf(filterban) > -1) {
  950. searchFilterbannew.push(this.filterbanListAll[i])
  951. }
  952. }
  953. this.filterbanList = searchFilterbannew
  954. } else {
  955. this.filterbanList = this.filterbanListAll
  956. }
  957. },
  958. //标记警报
  959. updateAlert() {
  960. this.eventWarn = true
  961. },
  962. updateAlertFalse() {
  963. this.eventWarn = false
  964. this.$emit('stopAudio')
  965. }
  966. }
  967. }
  968. </script>
  969. <style rel="stylesheet/scss" lang="scss" scoped>
  970. @import '@/assets/styles/base.scss';
  971. .dotClass {
  972. width: 10px;
  973. height: 10px;
  974. border-radius: 50%;
  975. display: block;
  976. margin: -5px;
  977. }
  978. .redClass {
  979. background-color: red;
  980. width: 10px;
  981. height: 10px;
  982. border-radius: 50%;
  983. display: block;
  984. }
  985. .btm-box {
  986. width: 100%;
  987. height: auto;
  988. background: linear-gradient($btmMemu);
  989. position: absolute;
  990. z-index: 999;
  991. bottom: 0;
  992. height: 2.5rem;
  993. display: flex;
  994. align-items: center;
  995. z-index: 9999;
  996. .light {
  997. position: absolute;
  998. top: -.5rem;
  999. }
  1000. .btm-left {
  1001. position: absolute;
  1002. font-size: .7rem;
  1003. height: 2rem;
  1004. line-height: 2rem;
  1005. border: 1px $searchBorder;
  1006. border-left: none;
  1007. color: $inBlue;
  1008. display: flex;
  1009. -webkit-transform: translateX(-21rem) !important;
  1010. transform: translateX(-21rem) !important;
  1011. transition: all 0.5s ease-in-out !important;
  1012. .btm-legend {
  1013. height: 2rem;
  1014. text-align: center;
  1015. color: $inBlue;
  1016. padding: 0 .5rem;
  1017. cursor: pointer;
  1018. }
  1019. .btm-legend:hover {
  1020. background-color: $tipHover;
  1021. color: $white;
  1022. }
  1023. .btm-left-tip {
  1024. display: flex;
  1025. align-items: center;
  1026. margin: 0 .5rem;
  1027. .btm-left-block {
  1028. width: 1rem;
  1029. height: 1rem;
  1030. margin-right: .3rem;
  1031. border-radius: .2rem;
  1032. }
  1033. .btm-left-state-c1 {
  1034. background-color: $eventStateColor-xsb;
  1035. }
  1036. .btm-left-state-c2 {
  1037. background-color: $eventStateColor-cb;
  1038. }
  1039. .btm-left-state-c3 {
  1040. background-color: $eventStateColor-yqs;
  1041. }
  1042. .btm-left-state-c4 {
  1043. background-color: $eventStateColor-ld;
  1044. }
  1045. .btm-left-state-c5 {
  1046. background-color: $eventStateColor-bj;
  1047. }
  1048. .btm-left-state-c6 {
  1049. background-color: $eventStateColor-tb;
  1050. }
  1051. }
  1052. }
  1053. .btm-tip-to-right {
  1054. -webkit-transform: translateX(0) !important;
  1055. transform: translateX(0) !important;
  1056. transition: all 0.5s ease-in-out !important;
  1057. }
  1058. .bottom-menu-normal {
  1059. max-width: 70%;
  1060. padding: 0 3rem;
  1061. position: absolute;
  1062. left: 50%;
  1063. transform: translateX(-50%);
  1064. bottom: 0;
  1065. z-index: 999;
  1066. border-radius: 5px;
  1067. display: flex;
  1068. justify-content: center;
  1069. align-items: center;
  1070. // background: url(../assets/images/integrated/btm-menu.png) center no-repeat;
  1071. // background-size: cover;
  1072. .btm-m-con {
  1073. position: relative;
  1074. color: $inBlue;
  1075. font-size: .5rem;
  1076. padding: .6rem 1rem;
  1077. display: flex;
  1078. align-items: center;
  1079. justify-content: center;
  1080. -webkit-transform: translateY(0);
  1081. transform: translateY(0);
  1082. transition: all 0.2s ease-in-out;
  1083. cursor: pointer;
  1084. white-space: nowrap;
  1085. i {
  1086. font-size: 1rem;
  1087. color: $inBlue;
  1088. text-shadow: 0 0 10px rgba($color: $inBlue, $alpha: .6);
  1089. margin-right: 0.2rem;
  1090. }
  1091. .nav-child {
  1092. text-shadow: none !important;
  1093. position: absolute;
  1094. bottom: 3rem;
  1095. border: 1px solid saddlebrown;
  1096. padding: .5rem;
  1097. -moz-border-radius-topleft: 0;
  1098. -moz-border-radius-bottomright: 0;
  1099. background-color: $barBgc;
  1100. box-shadow: $barShadow;
  1101. border: 1px $barBorder;
  1102. left: 50%;
  1103. transform: translateX(-50%);
  1104. color: $inBlue;
  1105. .nav-child-btn {
  1106. padding: .2rem;
  1107. }
  1108. .forestban {
  1109. display: flex;
  1110. .forestban-con {
  1111. width: 20rem;
  1112. height: 20rem;
  1113. overflow-y: scroll;
  1114. border: 1px solid rgba(51, 70, 127, 0.7);
  1115. }
  1116. .forestban-right {
  1117. width: 10rem;
  1118. height: 20rem;
  1119. overflow-y: scroll;
  1120. padding: 0 1rem;
  1121. .el-checkbox-group {
  1122. display: flex;
  1123. flex-direction: column;
  1124. label {
  1125. padding: .4rem 0;
  1126. }
  1127. .el-checkbox {
  1128. color: $white;
  1129. }
  1130. }
  1131. }
  1132. }
  1133. }
  1134. }
  1135. .btm-m-con:hover,
  1136. .on {
  1137. text-shadow: 0 0 20px rgba($color: $inBlueHover, $alpha: 1.0);
  1138. -webkit-transform: translateX(0.2rem);
  1139. transform: translateX(0.2rem);
  1140. transition: all 0.2s ease-in-out;
  1141. .nav-child {
  1142. text-shadow: none !important;
  1143. }
  1144. i {
  1145. color: $inBlueHover;
  1146. text-shadow: 0 0 20px rgba($color: $inBlueHover, $alpha: 1.0);
  1147. }
  1148. }
  1149. }
  1150. .btm-right {
  1151. position: absolute;
  1152. font-size: .7rem;
  1153. height: 2rem;
  1154. display: flex;
  1155. right: 1rem;
  1156. align-items: center;
  1157. .el-badge {
  1158. display: flex !important;
  1159. margin-left: 1.5rem;
  1160. button {
  1161. padding: 0 .3rem;
  1162. height: 1.5rem;
  1163. background-color: #112543;
  1164. color: $inBlue;
  1165. border: 1px $searchBorder;
  1166. }
  1167. }
  1168. .el-badge:hover {
  1169. -webkit-transform: translateX(0.1rem);
  1170. transform: translateX(0.1rem);
  1171. transition: all 0.2s ease-in-out;
  1172. button {
  1173. text-shadow: 0 0 15px rgba($color: $inBlueHover, $alpha: 1.0);
  1174. }
  1175. }
  1176. }
  1177. }
  1178. .btm-r-pop-info {
  1179. display: flex;
  1180. width: 35rem;
  1181. flex-direction: column;
  1182. max-height: 85vh;
  1183. min-height: fit-content;
  1184. overflow-y: scroll;
  1185. padding: 1rem;
  1186. .btm-r-pop-info-box:hover {
  1187. box-shadow: $shadowListHover;
  1188. color: $inBlue;
  1189. border: 1px $countBorder;
  1190. }
  1191. .btm-r-pop-info-box {
  1192. width: 100%;
  1193. display: flex;
  1194. flex-direction: column;
  1195. background-color: $deepBG;
  1196. padding: .5rem;
  1197. border-radius: .5rem;
  1198. color: $inBlue;
  1199. border: 1px $searchBorder;
  1200. margin-bottom: 1rem;
  1201. .btm-r-pop-info-tit {
  1202. display: flex;
  1203. padding: .5rem;
  1204. h3 {
  1205. font-weight: bolder;
  1206. }
  1207. }
  1208. .btm-r-pop-info-con {
  1209. padding: .5rem;
  1210. display: flex;
  1211. flex-direction: column;
  1212. border-top: 1px $searchBorder;
  1213. border-bottom: 1px $searchBorder;
  1214. .btm-r-pop-info-list {
  1215. display: flex;
  1216. padding: .3rem 0;
  1217. .btm-r-pop-info-list-name {
  1218. width: 3.6rem;
  1219. text-align: right;
  1220. margin-right: 1rem;
  1221. }
  1222. .btm-r-pop-info-list-text {
  1223. }
  1224. }
  1225. }
  1226. .btm-r-pop-info-btm {
  1227. padding: .5rem;
  1228. display: flex;
  1229. justify-content: space-between;
  1230. .btm-r-pop-info-btm-btn {
  1231. button {
  1232. padding: .5rem;
  1233. }
  1234. }
  1235. }
  1236. }
  1237. }
  1238. //警铃
  1239. .fire-tip {
  1240. text-align: center;
  1241. width: 100%;
  1242. font-size: 44px;
  1243. color: #ff0000;
  1244. text-shadow: 0 0 1px #ffffff;
  1245. }
  1246. .fire-address {
  1247. text-align: center;
  1248. width: 100%;
  1249. font-size: 14px;
  1250. color: rgba(255, 255, 255, 0.8);
  1251. margin-top: 44px;
  1252. }
  1253. .fire-handle {
  1254. display: block;
  1255. text-align: center;
  1256. background: #00BFF0;
  1257. color: #ffffff;
  1258. border-radius: 20px;
  1259. font-size: 14px;
  1260. width: 80px;
  1261. height: 40px;
  1262. line-height: 40px;
  1263. margin: 24px auto;
  1264. text-decoration: none
  1265. }
  1266. .fire-handle:hover {
  1267. background: #06a2ca;
  1268. }
  1269. .bell {
  1270. position: absolute;
  1271. right: 10px;
  1272. bottom: -20px;
  1273. width: 100%;
  1274. height: 320px;
  1275. z-index: 999;
  1276. }
  1277. .bell canvas {
  1278. display: block;
  1279. position: absolute;
  1280. left: 0;
  1281. top: -9px;
  1282. }
  1283. /* 保持大小不变的小圆圈 */
  1284. .dot {
  1285. position: absolute;
  1286. width: 96px;
  1287. height: 96px;
  1288. left: 160px;
  1289. top: 160px;
  1290. background: url('../assets/images/bell.gif') no-repeat;
  1291. // background: url(.) no-repeat;
  1292. background-size: 100%;
  1293. z-index: 200;
  1294. }
  1295. /* 产生动画(向外扩散变大)的圆圈 */
  1296. .pulse,
  1297. .pulse-big {
  1298. position: absolute;
  1299. width: 420px;
  1300. height: 420px;
  1301. border: 2px solid #EF2D02;
  1302. background: rgba(239, 45, 2, 0.8);
  1303. border-radius: 50%;
  1304. z-index: 100;
  1305. opacity: 0;
  1306. }
  1307. .pulse {
  1308. background: rgba(239, 45, 2, 0.6) !important;
  1309. -webkit-animation: warn 0.9s ease-out;
  1310. -moz-animation: warn 0.9s ease-out;
  1311. animation: warn 0.9s ease-out;
  1312. -webkit-animation-iteration-count: infinite;
  1313. -moz-animation-iteration-count: infinite;
  1314. animation-iteration-count: infinite;
  1315. box-shadow: 1px 1px 30px #EF2D02;
  1316. }
  1317. .pulse-big {
  1318. background: rgba(239, 45, 2, 0.6) !important;
  1319. -webkit-animation: warn1 0.9s ease-out;
  1320. -moz-animation: warn1 0.9s ease-out;
  1321. animation: warn1 0.9s ease-out;
  1322. -webkit-animation-iteration-count: infinite;
  1323. -moz-animation-iteration-count: infinite;
  1324. animation-iteration-count: infinite;
  1325. box-shadow: 1px 1px 30px #EF2D02;
  1326. }
  1327. @keyframes warn {
  1328. 0% {
  1329. -moz-transform: scale(0);
  1330. transform: scale(0);
  1331. opacity: 1;
  1332. }
  1333. 100% {
  1334. -moz-transform: scale(1);
  1335. transform: scale(1);
  1336. opacity: 0;
  1337. }
  1338. }
  1339. @keyframes warn1 {
  1340. 0% {
  1341. -o-transform: scale(0);
  1342. transform: scale(0);
  1343. opacity: 1;
  1344. }
  1345. 100% {
  1346. -o-transform: scale(0.6);
  1347. transform: scale(0.6);
  1348. opacity: 0;
  1349. }
  1350. }
  1351. </style>