index.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506
  1. <template>
  2. <div class="app-container">
  3. <el-row :gutter="20">
  4. <el-col :span="24" :xs="24">
  5. <div class="main-right-box">
  6. <div class="main-search-box">
  7. <el-form
  8. :model="queryParams"
  9. ref="queryForm"
  10. size="small"
  11. :inline="true"
  12. v-show="showSearch"
  13. >
  14. <el-form-item label="组织机构">
  15. <org-tree
  16. v-model="queryParams.orgId"
  17. @defaultKey="getDefaultKey"
  18. @defaultOrg="getDefaultOrg"
  19. @checkChange="checkChange"
  20. @click="clickTreeNode"
  21. ref="orgTree"
  22. ></org-tree>
  23. </el-form-item>
  24. <el-form-item label="设备名称" prop="deviceName">
  25. <el-input v-model="queryParams.deviceName"
  26. clearable
  27. maxlength="50"
  28. placeholder="请输入设备名称"
  29. style="width: 100%"
  30. />
  31. </el-form-item>
  32. <el-form-item label="告警分类" prop="dataType">
  33. <el-select
  34. v-model="queryParams.dataType"
  35. clearable
  36. label="告警分类"
  37. placeholder="请选择告警分类"
  38. prop="dataType"
  39. >
  40. <el-option
  41. v-for="item in alarmTypes"
  42. :key="item.value"
  43. :label="item.label"
  44. :value="item.value">
  45. </el-option>
  46. </el-select>
  47. </el-form-item>
  48. <el-form-item label="告警类型" prop="deviceType">
  49. <el-select
  50. v-model="queryParams.deviceType"
  51. clearable
  52. label="设备类型"
  53. placeholder="请选择告警类型"
  54. prop="deviceType"
  55. >
  56. <el-option
  57. v-for="item in deviceTypes"
  58. v-if="!queryParams.dataType || item.type.indexOf(queryParams.dataType) > -1"
  59. :key="item.value"
  60. :label="item.label"
  61. :value="item.value">
  62. </el-option>
  63. </el-select>
  64. </el-form-item>
  65. <el-form-item label="处置状态" prop="isDoStr">
  66. <el-select
  67. v-model="isDoStr"
  68. clearable
  69. prop="isDoStr"
  70. @change="isDoChanged"
  71. >
  72. <el-option
  73. v-for="item in dict.type.alarm_deal_status"
  74. :key="item.value"
  75. :label="item.label"
  76. :value="item.value"
  77. >
  78. </el-option>
  79. </el-select>
  80. </el-form-item>
  81. <el-form-item label="告警时间" prop="alarmTime">
  82. <DataRangePicker
  83. type="daterange"
  84. value-format="yyyy-MM-dd HH:mm:ss"
  85. :default-time="['00:00:00', '23:59:59']"
  86. start-placeholder="开始日期"
  87. end-placeholder="结束日期"
  88. v-model="queryParams.alarmTime"
  89. >
  90. </DataRangePicker>
  91. </el-form-item>
  92. <el-form-item label="恢复时间" prop="alarmEndTime">
  93. <DataRangePicker
  94. type="daterange"
  95. value-format="yyyy-MM-dd HH:mm:ss"
  96. :default-time="['00:00:00', '23:59:59']"
  97. start-placeholder="开始日期"
  98. end-placeholder="结束日期"
  99. v-model="queryParams.alarmEndTime"
  100. >
  101. </DataRangePicker>
  102. </el-form-item>
  103. <el-form-item label="处置时间" prop="alarmDealTime">
  104. <DataRangePicker
  105. type="daterange"
  106. value-format="yyyy-MM-dd HH:mm:ss"
  107. :default-time="['00:00:00', '23:59:59']"
  108. start-placeholder="开始日期"
  109. end-placeholder="结束日期"
  110. v-model="queryParams.alarmDealTime"
  111. >
  112. </DataRangePicker>
  113. </el-form-item>
  114. </el-form>
  115. <el-row :gutter="10">
  116. <el-col :span="1.5">
  117. <el-button
  118. type="primary"
  119. icon="el-icon-search"
  120. size="mini"
  121. @click="handleQuery"
  122. >搜索
  123. </el-button>
  124. </el-col>
  125. <el-col :span="1.5">
  126. <el-button
  127. type="primary"
  128. icon="el-icon-refresh"
  129. size="mini"
  130. @click="resetQuery"
  131. >重置
  132. </el-button>
  133. </el-col>
  134. <!-- <el-col :span="1.5">
  135. <el-button
  136. type="primary"
  137. icon="el-icon-download"
  138. size="mini"
  139. @click="handleExport"
  140. v-hasPermi="['core:task:export']"
  141. >导出</el-button
  142. >
  143. </el-col>-->
  144. <right-toolbar
  145. :showSearch.sync="showSearch"
  146. @queryTable="getList"
  147. ></right-toolbar>
  148. </el-row>
  149. </div>
  150. <el-table
  151. v-loading="loading"
  152. :data="alarmList"
  153. border
  154. height="600"
  155. size="small"
  156. >
  157. <el-table-column
  158. label="序号"
  159. type="index"
  160. align="center"
  161. width="100"
  162. >
  163. <template slot-scope="scope">
  164. <span>{{
  165. (queryParams.pageNum - 1) * queryParams.pageSize +
  166. scope.$index +
  167. 1
  168. }}</span>
  169. </template>
  170. </el-table-column>
  171. <el-table-column
  172. label="地区"
  173. align="center"
  174. prop="city"
  175. width="100"
  176. />
  177. <el-table-column
  178. label="行社"
  179. align="center"
  180. prop="bank"
  181. width="130"
  182. />
  183. <el-table-column
  184. label="组织机构"
  185. align="center"
  186. prop="orgName"
  187. width="150"
  188. />
  189. <el-table-column
  190. label="设备名称"
  191. align="center"
  192. prop="deviceName"
  193. width="135"
  194. :show-overflow-tooltip="showOverflowTooltip"
  195. />
  196. <el-table-column
  197. label="告警类型"
  198. align="center"
  199. prop="sourceTypeDes"
  200. width="135"
  201. />
  202. <el-table-column label="告警时间" align="center" width="180" prop="time">
  203. </el-table-column>
  204. <el-table-column label="恢复时间" align="center" width="180" prop="endTime">
  205. </el-table-column>
  206. <el-table-column
  207. label="处置时间"
  208. align="center"
  209. prop="doTime"
  210. width="180"
  211. />
  212. <el-table-column
  213. label="告警内容"
  214. align="center"
  215. prop="content"
  216. />
  217. <!--<el-table-column
  218. label="处理结果"
  219. align="center"
  220. prop="reslut"
  221. width="160"
  222. />-->
  223. <el-table-column
  224. label="操作"
  225. fixed="right"
  226. align="center"
  227. >
  228. <template slot-scope="scope">
  229. <el-button
  230. size="mini"
  231. type="text"
  232. icon="el-icon-edit-outline"
  233. v-if="!scope.row.doTime"
  234. @click="dealAlarm(scope.row)"
  235. v-hasPermi="['core:task:query']"
  236. >处置报警</el-button>
  237. <el-button
  238. size="mini"
  239. type="text"
  240. icon="el-icon-view"
  241. @click="showDetailInfo(scope.row)"
  242. v-hasPermi="['core:task:query']"
  243. >详情</el-button>
  244. </template>
  245. </el-table-column>
  246. </el-table>
  247. <pagination
  248. v-show="total > 0"
  249. :total="total"
  250. :page.sync="queryParams.pageNum"
  251. :limit.sync="queryParams.pageSize"
  252. @pagination="getList"
  253. />
  254. </div>
  255. </el-col>
  256. </el-row>
  257. <dialog-info ref="infoDialog"></dialog-info>
  258. <dialog-deal-alarm ref="dealAlarmDialog" @success="getList()"></dialog-deal-alarm>
  259. </div>
  260. </template>
  261. <script>
  262. import OrgTree from "@/components/orgTree/orgQuerySelector.vue";
  263. import DataRangePicker from "@/components/dateTime/daterange.picker.vue";
  264. import dayjs from "dayjs";
  265. import DialogInfo from "./dialog.info";
  266. import DialogDealAlarm from "./dialog.dealAlarm.vue";
  267. import {mapGetters} from "vuex";
  268. import {alarmList,deviceTypeList} from "@/api/iot/alarmRule";
  269. export default {
  270. components: { OrgTree,DataRangePicker,DialogInfo,DialogDealAlarm },
  271. name: "AlarmData",
  272. dicts: ["sys_access_cycle",'sys_yes_no','alarm_deal_status'],
  273. data() {
  274. return {
  275. isDoStr:null,
  276. alarmTypes:[
  277. {
  278. value: '0',
  279. label: '动环主机告警'
  280. },
  281. {
  282. value: '1',
  283. label: '监控主机告警'
  284. },
  285. {
  286. value: '2',
  287. label: '报警主机告警'
  288. }
  289. ],
  290. deviceTypes: [],
  291. // 遮罩层
  292. loading: false,
  293. // 选中数组
  294. ids: [],
  295. // 非单个停用
  296. single: true,
  297. // 非多个停用
  298. multiple: true,
  299. // 显示搜索条件
  300. showSearch: true,
  301. // 总条数
  302. total: 0,
  303. // 监控调阅任务表格数据
  304. alarmList: [],
  305. // 弹出层标题
  306. title: "",
  307. // 是否显示弹出层
  308. open: false,
  309. showOverflowTooltip: true,
  310. // 查询参数
  311. queryParams: {
  312. pageNum: 1,
  313. pageSize: 10,
  314. taskName: null,
  315. cycle: null,
  316. dateRange: [],
  317. alarmTime:null,
  318. alarmEndTime:null,
  319. planStartTime: null,
  320. alarmDealTime:null,
  321. isDo:null,
  322. status: null,
  323. roleId: null,
  324. checkSub: true,
  325. },
  326. selectedOrgName: "",
  327. // 表单参数
  328. form: {},
  329. // 表单校验
  330. rules: {},
  331. orgName: "",
  332. };
  333. },
  334. created() {
  335. this.queryParams.orgId = this.$store.getters.orgId;
  336. this.initDeviceTypeList();
  337. },
  338. computed: {
  339. ...mapGetters(["orgId", "orgName"]),
  340. },
  341. methods: {
  342. isDoChanged()
  343. {
  344. if(this.isDoStr)
  345. {
  346. this.queryParams.isDo=this.isDoStr=='1'? 1:0;
  347. }
  348. else{
  349. this.queryParams.isDo=null;
  350. }
  351. },
  352. initDeviceTypeList(){
  353. deviceTypeList("")
  354. .then((r) => {
  355. // 使用 map 而不是 filter 进行数据转换
  356. const transformedList = r.map((item) => ({
  357. value: item.value,
  358. label: item.label,
  359. type: item.type,
  360. }));
  361. // 将转换后的数据推送到 this.deviceTypeList
  362. this.deviceTypes.push(...transformedList);
  363. })
  364. .catch((error) => {
  365. // 处理错误
  366. console.error('Error fetching device type list:', error);
  367. });
  368. },
  369. /** 查询监控调阅任务列表 */
  370. getList() {
  371. alarmList(this.queryParams).then((response) => {
  372. this.alarmList = response.rows;
  373. this.total = response.total;
  374. this.loading = false;
  375. });
  376. },
  377. getDefaultOrg(org) {
  378. this.orgName = org.name;
  379. this.selectedOrgName = org.shortName;
  380. },
  381. getDefaultKey(key) {
  382. this.queryParams.orgId = key;
  383. this.getList();
  384. },
  385. checkChange(state) {
  386. this.queryParams.checkSub = state;
  387. this.handleQuery();
  388. },
  389. // 节点单击事件
  390. clickTreeNode(data) {
  391. this.queryParams.orgId = data.id;
  392. this.orgName = data.name;
  393. this.selectedOrgName = data.shortName;
  394. this.handleQuery();
  395. },
  396. /** 下穿状态改变*/
  397. changeCheckBox() {
  398. this.getList();
  399. },
  400. // 取消按钮
  401. cancel() {
  402. this.open = false;
  403. this.reset();
  404. },
  405. // 表单重置
  406. reset() {
  407. this.form = {
  408. id: null,
  409. planId: null,
  410. taskName: null,
  411. orgId: null,
  412. orgPath: null,
  413. orgName: null,
  414. ymdDate: null,
  415. ymdYear: null,
  416. ymdHalfyear: null,
  417. ymdQuarter: null,
  418. ymdMonth: null,
  419. ymdWeek: null,
  420. ymdDay: null,
  421. cycle: null,
  422. planStartTime: null,
  423. planEndTime: null,
  424. startTime: null,
  425. endTime: null,
  426. status: null,
  427. roleId: null,
  428. retrievalUser: null,
  429. orderNum: null,
  430. batchNum: null,
  431. submitTime: null,
  432. exceptionCount: null,
  433. };
  434. this.resetForm("form");
  435. },
  436. /** 搜索按钮操作 */
  437. handleQuery() {
  438. this.queryParams.pageNum = 1;
  439. //this.queryParams.dateRange = [];
  440. this.getList();
  441. },
  442. /** 重置按钮操作 */
  443. resetQuery() {
  444. this.resetForm("queryForm");
  445. this.queryParams.orgId = this.orgId;
  446. this.selectedOrgName = this.orgName;
  447. this.queryParams.checkSub = true;
  448. this.queryParams.dateRange = ["", ""];
  449. this.queryParams.planStartTime = null;
  450. this.$refs["orgTree"].setCheckSub(this.queryParams.checkSub);
  451. this.isDoStr=null;
  452. this.queryParams.isDo=null;
  453. this.handleQuery();
  454. },
  455. // 多选框选中数据
  456. handleSelectionChange(selection) {
  457. this.ids = selection.map((item) => item.id);
  458. this.single = selection.length !== 1;
  459. this.multiple = !selection.length;
  460. },
  461. /** 处置告警按钮操作 */
  462. dealAlarm(row) {
  463. this.$refs["dealAlarmDialog"].show(row.id, {});
  464. },
  465. /** 详情操作 */
  466. showDetailInfo(row) {
  467. this.$refs["infoDialog"].show(row.id, {});
  468. },
  469. /** 导出按钮操作 */
  470. handleExport() {
  471. if (this.total==null || this.total===0){
  472. this.$modal.alert("暂无可用数据导出");
  473. return;
  474. }
  475. if (this.total>50000){
  476. this.$modal.alert("导出数据超过5万条,请缩小查询范围后重试");
  477. return;
  478. }
  479. this.download(
  480. "core/retrievalTask/export",
  481. {
  482. ...this.queryParams,
  483. },
  484. `${
  485. this.selectedOrgName
  486. }-${this.$tab.getCurrentTabName()}-${dayjs().format("YYYYMMDD")}.xlsx`
  487. );
  488. },
  489. },
  490. };
  491. </script>
  492. <style lang="scss" scoped></style>