custom.vue 13 KB

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