index.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583
  1. <template>
  2. <div class="custom-config">
  3. <div class="form-wrapper">
  4. <div class="btns" style="margin-bottom: 10px">
  5. <el-button class="buttons" size="mini" round @click="handleInsert">
  6. 新增记录
  7. </el-button>
  8. <el-button class="buttons" size="mini" round @click="export2Excel">
  9. 批量导出</el-button
  10. >
  11. <el-button class="buttons" size="mini" round @click="outExe">
  12. 模板下载</el-button
  13. >
  14. <el-upload
  15. style="display: inline; margin-left: 10px"
  16. :action="url + 'alertrule/import'"
  17. :show-file-list="false"
  18. :on-success="handleSuccess"
  19. :on-progress="handleProgress"
  20. :on-error="handleError"
  21. >
  22. <el-button
  23. class="buttons"
  24. size="mini"
  25. round
  26. @click="exportShow = true"
  27. >
  28. 批量导入</el-button
  29. >
  30. </el-upload>
  31. </div>
  32. <div class="search-wrapper">
  33. <el-select
  34. v-model="query.category"
  35. size="mini"
  36. class="search-item"
  37. popper-class="select"
  38. @change="categorychanged"
  39. >
  40. <el-option key="1" label="风机报警" value="windturbine"></el-option>
  41. <!-- <el-option
  42. key="2"
  43. label="升压站报警"
  44. value="booststation"
  45. ></el-option> -->
  46. <el-option key="3" label="光伏报警" value="inverter"></el-option>
  47. </el-select>
  48. <el-select
  49. v-model="query.wpId"
  50. clearable
  51. size="mini"
  52. class="search-item"
  53. :placeholder="'全部场站'"
  54. popper-class="select"
  55. @change="changeStation"
  56. >
  57. <el-option
  58. v-for="item in stationList"
  59. :key="item.id"
  60. :value="item.id"
  61. :label="item.aname"
  62. ></el-option>
  63. </el-select>
  64. <el-select
  65. v-model="query.relatedparts"
  66. clearable
  67. size="mini"
  68. class="search-item"
  69. placeholder="所属部件"
  70. >
  71. <el-option
  72. v-for="item in fetchList"
  73. :key="item.id"
  74. :label="item.name"
  75. :value="item.nemCode"
  76. >
  77. </el-option>
  78. </el-select>
  79. <el-select
  80. v-model="query.enabled"
  81. clearable
  82. size="mini"
  83. class="search-item"
  84. placeholder="是否可用"
  85. >
  86. <el-option
  87. v-for="item in state.isEnabled"
  88. :key="item.id"
  89. :label="item.name"
  90. :value="item.id"
  91. >
  92. </el-option>
  93. </el-select>
  94. <el-select
  95. v-model="query.modelId"
  96. clearable
  97. size="mini"
  98. class="search-item"
  99. placeholder="全部机型"
  100. popper-class="select"
  101. >
  102. <el-option
  103. v-for="item in modelList"
  104. :key="item.id"
  105. :value="item.id"
  106. :label="item.aname"
  107. ></el-option>
  108. </el-select>
  109. <!-- <el-select
  110. v-model="query.rank"
  111. clearable
  112. size="mini"
  113. class="search-item"
  114. placeholder="全部级别"
  115. popper-class="select"
  116. >
  117. <el-option
  118. v-for="item in state.rankList"
  119. :key="item.id"
  120. :value="item.id"
  121. :label="item.name"
  122. ></el-option>
  123. </el-select> -->
  124. <el-input
  125. placeholder="请输入名称"
  126. v-model="query.name"
  127. size="mini"
  128. class="search-item"
  129. clearable
  130. ></el-input>
  131. <el-button class="buttons" round size="mini" @click="getData"
  132. >搜索</el-button
  133. >
  134. </div>
  135. </div>
  136. <div class="table-wrapper">
  137. <div class="leftContent">
  138. <span>{{ pageTitle }}</span>
  139. </div>
  140. <el-table
  141. :data="state.tableData"
  142. stripe
  143. height="calc(100% - 42px - 45px)"
  144. >
  145. <el-table-column
  146. v-for="item in state.tableHeader"
  147. :key="item.code"
  148. :label="item.title"
  149. :align="
  150. item.code == 'description' ||
  151. item.code == 'expression' ||
  152. item.code == 'name'
  153. ? 'left'
  154. : 'center'
  155. "
  156. :prop="item.code"
  157. :minWidth="item.width ? item.width : 60"
  158. show-overflow-tooltip
  159. >
  160. <template #default="scope">
  161. <span v-if="item.code == 'rank'">
  162. {{ rankConvert(scope.row.rank) }}
  163. </span>
  164. <span v-else-if="item.code == 'category'">
  165. {{ categoryConvert(scope.row.category) }}
  166. </span>
  167. <span v-else-if="item.code == 'enable'">
  168. {{ enabledConvert(scope.row.enable) }}
  169. </span>
  170. <span v-else>
  171. {{ scope.row[item.code] }}
  172. </span>
  173. </template>
  174. </el-table-column>
  175. <el-table-column label="操作" align="center" width="100">
  176. <template #default="scope">
  177. <el-button
  178. type="text"
  179. style="color: #05bb4c"
  180. size="mini"
  181. @click="handleEditClick(scope.row)"
  182. >编辑</el-button
  183. >
  184. </template>
  185. </el-table-column>
  186. </el-table>
  187. <div class="pagination">
  188. <el-pagination
  189. :current-page="query.pageNum"
  190. :page-size="query.pageSize"
  191. :total="total"
  192. layout="total, sizes, prev, pager, next"
  193. :page-sizes="[22, 50, 100, 200, 500]"
  194. @size-change="
  195. (value) => {
  196. query.pageSize = value;
  197. query.pageNum = 1;
  198. getData();
  199. }
  200. "
  201. @current-change="handlePageChange"
  202. ></el-pagination>
  203. </div>
  204. </div>
  205. <customcomponents
  206. @close="dialogclose"
  207. :isVisible="state.visible"
  208. :dialogOptions="state.form"
  209. :rankList="state.rankList"
  210. :modelListAll="state.modelListAll"
  211. :fetchListAll="state.fetchListAll"
  212. />
  213. </div>
  214. </template>
  215. <script setup>
  216. import {
  217. custombj_fetchTableData,
  218. getStationinfo,
  219. fetchRelatePartAndAlarmType,
  220. fetchModel,
  221. fetchBooststation,
  222. custombj_importTemplate,
  223. getWpList,
  224. } from "@/api/zhbj/index.js";
  225. import { outExportExcel } from "@/tools/excel/exportExcel.js"; //引入文件
  226. import {
  227. ref,
  228. onMounted,
  229. provide,
  230. computed,
  231. reactive,
  232. watch,
  233. nextTick,
  234. } from "vue";
  235. import { useStore } from "vuex";
  236. import { useRouter } from "vue-router";
  237. import { ElMessageBox, ElMessage } from "element-plus";
  238. import customcomponents from "@/views/IntegratedAlarm/alarmConfig/components/custom_components.vue";
  239. const pageTitle = "预警配置";
  240. const store = useStore();
  241. const token = { token: store.state.user.authToken };
  242. const url = process.env.VUE_APP_ALARM;
  243. const router = useRouter();
  244. const query = reactive({
  245. pageNum: 1,
  246. pageSize: 22,
  247. name: "",
  248. wpId: "",
  249. rank: "",
  250. modelId: "",
  251. category: "windturbine",
  252. enabled: "",
  253. relatedparts: "",
  254. });
  255. const state = reactive({
  256. tableData: [],
  257. fetchListAll: [], //部件及预警类型
  258. modelListAll: {}, //型号所有列表
  259. isEnabled: [
  260. {
  261. id: false,
  262. name: "否",
  263. },
  264. {
  265. id: true,
  266. name: "是",
  267. },
  268. ],
  269. rankList: [
  270. {
  271. id: 1,
  272. name: "低",
  273. },
  274. {
  275. id: 2,
  276. name: "中低",
  277. },
  278. {
  279. id: 3,
  280. name: "中",
  281. },
  282. {
  283. id: 4,
  284. name: "中高",
  285. },
  286. {
  287. id: 5,
  288. name: "高",
  289. },
  290. ],
  291. visible: false,
  292. form: {},
  293. tableHeader: [
  294. { title: "编码", code: "id" },
  295. { title: "场站", code: "stationName", width: "100" },
  296. { title: "机型", code: "modelId" },
  297. { title: "规则名称", code: "name", width: "150" },
  298. { title: "表达式", code: "expression", width: "150" },
  299. { title: "描述", code: "description", width: "150" },
  300. { title: "所属部件", code: "relatedPartsName" },
  301. // { title: "级别", code: "rank" },
  302. { title: "类型", code: "category" },
  303. { title: "是否启用", code: "enable" },
  304. ],
  305. tableHeader1: [
  306. { title: "编码", code: "id" },
  307. { title: "升压站", code: "stationName" },
  308. { title: "规则名称", code: "name" },
  309. { title: "表达式", code: "expression" },
  310. { title: "描述", code: "description" },
  311. // { title: "级别", code: "rank" },
  312. { title: "类型", code: "category" },
  313. { title: "是否启用", code: "enable" },
  314. ],
  315. });
  316. //型号列表
  317. const modelList = computed(() => {
  318. if (query.wpId == "") {
  319. return [];
  320. } else {
  321. return state.modelListAll[query.wpId];
  322. }
  323. });
  324. //部件列表
  325. const fetchList = computed(() => {
  326. if (query.wpId == "") {
  327. return [];
  328. } else {
  329. if (query.wpId.includes("FDC")) {
  330. return state.fetchListAll?.fjbj;
  331. } else {
  332. return state.fetchListAll?.gfbj;
  333. }
  334. }
  335. });
  336. // 场站列表/升压站列表
  337. const stationList = ref([]);
  338. let total = ref(0);
  339. onMounted(() => {
  340. getWpArray();
  341. getfetchRelatePart();
  342. getequipmentmodel_list();
  343. getData();
  344. });
  345. const dialogclose = () => {
  346. state.visible = false;
  347. state.form = {};
  348. getData();
  349. };
  350. const getWpArray = async () => {
  351. const { data } = await getWpList(query.category);
  352. stationList.value = data;
  353. };
  354. const getData = async () => {
  355. const { data } = await custombj_fetchTableData(query);
  356. state.tableData = data.records;
  357. total.value = data.total;
  358. };
  359. //所属部件
  360. const getfetchRelatePart = async () => {
  361. const { data } = await fetchRelatePartAndAlarmType();
  362. state.fetchListAll = data;
  363. // if (router && router.currentRoute.value.query.name) {
  364. // let queryName = router.currentRoute.value.query.name;
  365. // query.relatedparts = queryName;
  366. // }
  367. // getData();
  368. };
  369. // 机型
  370. const getequipmentmodel_list = async () => {
  371. const { data } = await fetchModel();
  372. state.modelListAll = data;
  373. };
  374. const handleEditClick = (row) => {
  375. let obj = Object.assign({}, row);
  376. state.form = obj;
  377. state.visible = true;
  378. };
  379. const handleInsert = () => {
  380. state.form = {
  381. category: "windturbine",
  382. enable: true,
  383. stationId: "",
  384. expression: "",
  385. };
  386. state.visible = true;
  387. };
  388. //changeStation
  389. const changeStation = async () => {
  390. query.modelId = "";
  391. query.relatedparts = "";
  392. };
  393. //categorychanged
  394. const categorychanged = async () => {
  395. getWpArray();
  396. this.clean();
  397. getData();
  398. };
  399. // 分页导航
  400. const handlePageChange = (val) => {
  401. query.pageNum = val;
  402. getData();
  403. };
  404. // 批量导出
  405. const export2Excel = async () => {
  406. let tableHeader = [];
  407. let tableKey = [];
  408. const { data } = await custombj_fetchTableData({
  409. pageNum: 1,
  410. pageSize: total.value,
  411. ...query,
  412. });
  413. ElMessage.success(`导出成功!`);
  414. if (query.category == "windturbine") {
  415. tableHeader = state.tableHeader.map((item) => item.title);
  416. tableKey = state.tableHeader.map((item) => item.code);
  417. } else if (query.category == "booststation") {
  418. tableHeader = state.tableHeader1.map((item) => item.title);
  419. tableKey = state.tableHeader1.map((item) => item.code);
  420. }
  421. outExportExcel(
  422. tableHeader,
  423. tableKey,
  424. data.records,
  425. "自定义预警配置导出excel"
  426. );
  427. };
  428. // 模板下载
  429. const outExe = () => {
  430. custombj_importTemplate().then((response) => {
  431. const link = document.createElement("a");
  432. const blob = new Blob([response], {
  433. type: "application/vnd.ms-excel",
  434. });
  435. link.style.display = "none";
  436. link.href = URL.createObjectURL(blob);
  437. link.download = "自定义报警模板.xlsx";
  438. document.body.appendChild(link);
  439. link.click();
  440. document.body.removeChild(link);
  441. });
  442. };
  443. // 批量导入
  444. const handleSuccess = (response) => {
  445. if (response.code == "200") {
  446. ElMessage.success("导入成功!");
  447. getData();
  448. } else {
  449. ElMessage.error(response.msg);
  450. }
  451. };
  452. // 批量导入中
  453. const handleProgress = (response) => {};
  454. // 批量导入失败
  455. const handleError = (response) => {
  456. ElMessage.success("导入失败!");
  457. };
  458. // 清空字段
  459. const clean = () => {
  460. query.modelId = "";
  461. query.relatedparts = "";
  462. query.wpId = "";
  463. query.enabled = "";
  464. query.rank = "";
  465. query.name = "";
  466. query.pageNum = 1;
  467. state.tableData = [];
  468. total.value = 0;
  469. };
  470. const rankConvert = (val) => {
  471. if (val == 1) {
  472. return "低";
  473. } else if (val == 2) {
  474. return "中低";
  475. } else if (val == 3) {
  476. return "中";
  477. } else if (val == 4) {
  478. return "中高";
  479. } else if (val == 5) {
  480. return "高";
  481. }
  482. };
  483. // 类型
  484. const categoryConvert = (val) => {
  485. if (val === "windturbine") {
  486. return "风机";
  487. } else if (val === "inverter") {
  488. return "光伏";
  489. }
  490. };
  491. // 状态
  492. const enabledConvert = (val) => {
  493. if (val === false) {
  494. return "停用";
  495. } else if (val === true) {
  496. return "启用";
  497. }
  498. };
  499. </script>
  500. <style scoped lang="less">
  501. .custom-config {
  502. height: 100%;
  503. width: 100%;
  504. padding: 0 20px;
  505. padding-bottom: 10px;
  506. .form-wrapper {
  507. display: flex;
  508. padding-top: 10px;
  509. justify-content: space-between;
  510. .search-wrapper::v-deep {
  511. display: flex;
  512. align-items: center;
  513. font-size: 14px;
  514. font-family: Microsoft YaHei;
  515. font-weight: 400;
  516. color: #b3b3b3;
  517. margin-bottom: 10px;
  518. .search-item {
  519. margin-right: 10px;
  520. max-width: 190px;
  521. }
  522. }
  523. .btns {
  524. display: flex;
  525. justify-content: flex-end;
  526. margin-right: 10px;
  527. // position: absolute;
  528. // right: 0;
  529. // top: 53px;
  530. .el-button + .el-button {
  531. margin-left: 10px;
  532. }
  533. }
  534. .buttons {
  535. background-color: rgba(5, 187, 76, 0.2);
  536. border: 1px solid #3b6c53;
  537. color: #b3b3b3;
  538. font-size: 14px;
  539. &:hover {
  540. background-color: rgba(5, 187, 76, 0.5);
  541. color: #ffffff;
  542. }
  543. }
  544. }
  545. }
  546. .table-wrapper {
  547. height: calc(100% - 43px);
  548. width: 100%;
  549. .leftContent {
  550. width: 242px;
  551. height: 41px;
  552. display: flex;
  553. align-items: center;
  554. background: url("~@/assets/imgs/title_left_bg1.png") no-repeat;
  555. span {
  556. font-size: 16px;
  557. font-family: Microsoft YaHei;
  558. font-weight: 400;
  559. color: #05bb4c;
  560. margin-left: 25px;
  561. }
  562. }
  563. .el-table::v-deep {
  564. .el-table__body-wrapper {
  565. height: calc(100% - 45px) !important;
  566. }
  567. }
  568. .pagination-wrapper ::v-deep {
  569. text-align: right;
  570. margin-top: 10px;
  571. }
  572. }
  573. </style>