windturbine.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637
  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="/sharding/warning2/import"
  33. :headers="token"
  34. :show-file-list="false"
  35. :on-success="handleSuccess"
  36. :on-progress="handleProgress"
  37. :on-error="handleError"
  38. >
  39. <el-button
  40. type="primary"
  41. icon="el-icon-lx-top"
  42. @click="exportShow = true"
  43. >
  44. 批量导入</el-button
  45. >
  46. </el-upload>
  47. </div>
  48. <div style="display: flex; flex-direction: row; margin-bottom: 10px">
  49. <el-select
  50. v-if="!isStation"
  51. v-model="query.alarmType"
  52. class="mr10"
  53. style="width: 150px"
  54. popper-class="select"
  55. @change="categorychanged"
  56. >
  57. <el-option key="2" label="升压站" value="booststation"></el-option>
  58. <el-option key="1" label="风机" value="windturbine"></el-option>
  59. <el-option key="3" label="光伏" value="inverter"></el-option>
  60. </el-select>
  61. <el-select
  62. v-model="query.wpId"
  63. clearable
  64. class="mr10"
  65. style="width: 150px"
  66. :placeholder="
  67. query.alarmType == 'windturbine' ? '全部场站' : '全部升压站'
  68. "
  69. popper-class="select"
  70. @change="changeStation"
  71. >
  72. <el-option
  73. v-for="item in stationList"
  74. :key="item.id"
  75. :value="item.id"
  76. :label="item.aname"
  77. ></el-option>
  78. </el-select>
  79. <el-select
  80. v-if="query.alarmType == 'windturbine'"
  81. v-model="query.modelId"
  82. clearable
  83. class="mr10"
  84. style="width: 150px"
  85. placeholder="全部机型"
  86. popper-class="select"
  87. >
  88. <el-option
  89. v-for="item in modelList"
  90. :key="item.id"
  91. :value="item.id"
  92. :label="item.aname"
  93. ></el-option>
  94. </el-select>
  95. <el-input
  96. placeholder="请输入名称"
  97. v-model="query.name"
  98. style="width: 150px"
  99. class="mr10"
  100. clearable
  101. ></el-input>
  102. <el-button icon="el-icon-search" type="primary" @click="getData"
  103. >搜索</el-button
  104. >
  105. </div>
  106. </el-row>
  107. <el-table :data="state.tableData" :highlight-current-row="true" border>
  108. <el-table-column
  109. v-for="item in query.alarmType == 'windturbine'
  110. ? state.tableHeader
  111. : state.tableHeader1"
  112. :key="item.code"
  113. :label="item.title"
  114. align="center"
  115. :prop="item.code"
  116. show-overflow-tooltip
  117. >
  118. <template #default="scope">
  119. <span v-if="item.code == 'rank'">
  120. {{ rankConvert(scope.row.rank) }}
  121. </span>
  122. <span v-else-if="item.code == 'alarmType'">
  123. {{ alarmTypeConvert("alarmType", scope.row.alarmType) }}
  124. </span>
  125. <span v-else-if="item.code == 'deviceType'">
  126. {{ alarmTypeConvert("deviceType", scope.row.deviceType) }}
  127. </span>
  128. <span v-else-if="item.code == 'enable'">
  129. {{ enabledConvert(scope.row.enable) }}
  130. </span>
  131. <span v-else>
  132. {{ scope.row[item.code] }}
  133. </span>
  134. </template>
  135. </el-table-column>
  136. <!-- <el-table-column label="序列号" align="center" prop="id" />
  137. <el-table-column label="统一编码" align="center" prop="uniformCode">
  138. <template #default="scope">{{
  139. // ednaValueConvert(scope.row.ednaValue)
  140. scope.row.uniformCode
  141. }}</template>
  142. </el-table-column>
  143. <el-table-column
  144. label="名称"
  145. align="left"
  146. prop="chineseText"
  147. width="180"
  148. />
  149. <el-table-column label="停机类型" align="center" prop="characteristic" />
  150. <el-table-column label="设备型号" align="center" prop="modelId" />
  151. <el-table-column label="报警类型" align="center" prop="warningTypeId" />
  152. <el-table-column label="故障编码" align="center" prop="faultCode" />
  153. <el-table-column label="报警级别" align="center" prop="levelId">
  154. <template #default="scope">{{
  155. levelIdConvert(scope.row.levelId)
  156. }}</template>
  157. </el-table-column>
  158. <el-table-column
  159. label="报警分类"
  160. align="center"
  161. prop="warningClassIfyId"
  162. min-width="50"
  163. >
  164. <template #default="scope">{{
  165. warningClassIfyIdConvert(scope.row.warningClassIfyId)
  166. }}</template>
  167. </el-table-column>
  168. <el-table-column
  169. label="是否可以复位"
  170. align="center"
  171. prop="isreset"
  172. min-width="50"
  173. >
  174. <template #default="scope">{{
  175. isresetConvert(scope.row.isreset)
  176. }}</template>
  177. </el-table-column>
  178. <el-table-column
  179. label="是否启用"
  180. align="center"
  181. prop="display"
  182. min-width="50"
  183. >
  184. <template #default="scope">{{
  185. scope.row.enabled == 1 ? "是" : "否"
  186. }}</template>
  187. </el-table-column>
  188. <el-table-column
  189. label="关联部件"
  190. align="center"
  191. prop="relatedParts"
  192. min-width="50"
  193. >
  194. <template #default="scope">
  195. <span>{{ relatePartConvert(scope.row.relatedParts) }}</span>
  196. </template>
  197. </el-table-column> -->
  198. <el-table-column label="操作" align="center" width="100">
  199. <template #default="scope">
  200. <el-button
  201. type="primary"
  202. plain
  203. round
  204. size="mini"
  205. icon="el-icon-lx-edit"
  206. @click="handleEditClick(scope.row)"
  207. >
  208. 编辑</el-button
  209. >
  210. </template>
  211. </el-table-column>
  212. </el-table>
  213. <div class="pagination">
  214. <el-pagination
  215. background
  216. layout="total, prev, pager, next"
  217. hide-on-single-page
  218. :current-page="query.pageNum"
  219. :page-size="query.pageSize"
  220. :total="total"
  221. @current-change="handlePageChange"
  222. ></el-pagination>
  223. </div>
  224. <windturbinecomponents
  225. @close="dialogclose"
  226. :isVisible="state.visible"
  227. :form="state.form"
  228. />
  229. </el-card>
  230. </template>
  231. <script setup>
  232. import {
  233. windturbinebj_fetchTableData,
  234. getStationinfo,
  235. fetchRelatePartAndAlarmType,
  236. fetchModel,
  237. getWpList,
  238. } from "/@/api/api.js";
  239. import { outExportExcel } from "/@/utils/exportExcel"; //引入文件
  240. import {
  241. ref,
  242. onMounted,
  243. provide,
  244. computed,
  245. reactive,
  246. watch,
  247. nextTick,
  248. } from "vue";
  249. import { useStore } from "vuex";
  250. import { ElMessageBox, ElMessage } from "element-plus";
  251. import windturbinecomponents from "./windturbine_components.vue";
  252. const token = { token: sessionStorage.getItem("token") };
  253. const store = useStore();
  254. onMounted(() => {
  255. getWpArray();
  256. getequipmentmodel_list();
  257. });
  258. const query = reactive({
  259. pageNum: 1,
  260. pageSize: 10,
  261. wpId: "",
  262. modelId: "",
  263. name: "",
  264. alarmType: "windturbine",
  265. });
  266. const state = reactive({
  267. tableData: [],
  268. modelList: [],
  269. modelListAll: {}, //型号所有列表
  270. visible: false,
  271. form: {},
  272. tableHeader: [
  273. { title: "编码", code: "id" },
  274. { title: "场站", code: "stationName", width: "100" },
  275. // { title: "设备", code: "deviceId", width: "100" },
  276. { title: "机型", code: "modelId" },
  277. { title: "报警描述", code: "description", width: "150" },
  278. { title: "设备部件", code: "componentsName" },
  279. { title: "特性", code: "characteristic" },
  280. { title: "设备类型", code: "deviceType" },
  281. { title: "报警类型", code: "alarmType" },
  282. // { title: "级别", code: "rankName" },
  283. { title: "是否启用", code: "enable" },
  284. { title: "是否可复位", code: "resetTableName" },
  285. ],
  286. tableHeader1: [
  287. { title: "编码", code: "id" },
  288. { title: "升压站", code: "stationName" },
  289. { title: "规则名称", code: "name" },
  290. { title: "表达式", code: "expression" },
  291. { title: "描述", code: "description" },
  292. { title: "类型", code: "alarmType" },
  293. // { title: "级别", code: "rank" },
  294. { title: "是否启用", code: "enable" },
  295. ],
  296. });
  297. // 机型
  298. const getequipmentmodel_list = async () => {
  299. const { data } = await fetchModel();
  300. state.modelListAll = data;
  301. };
  302. // 场站列表/升压站列表
  303. const stationList = ref([]);
  304. const categorychanged = async (value) => {
  305. query.alarmType = value;
  306. getWpArray();
  307. };
  308. const getWpArray = async () => {
  309. const { data } = await getWpList(query.alarmType);
  310. stationList.value = data;
  311. };
  312. //型号列表
  313. const modelList = computed(() => {
  314. if (query.wpId == "") {
  315. return [];
  316. } else {
  317. return state.modelListAll[query.wpId];
  318. }
  319. });
  320. const isStation = computed(() => store.getters.isStation);
  321. let total = ref(0);
  322. const getData = async () => {
  323. const { data: res } = await windturbinebj_fetchTableData(query);
  324. res.records.forEach((ele) => {
  325. ele.rankName = getRankName(ele.rank);
  326. ele.resetTableName = ele.resetTable ? "是" : "否";
  327. });
  328. state.tableData = res.records;
  329. total.value = res.total;
  330. };
  331. const getRankName = (rank) => {
  332. if (rank === 1) {
  333. return "低级";
  334. } else if (rank === 2) {
  335. return "低中级";
  336. } else if (rank === 3) {
  337. return "中级";
  338. } else if (rank === 4) {
  339. return "中高级";
  340. } else if (rank === 5) {
  341. return "高极";
  342. }
  343. };
  344. //changeStation
  345. const changeStation = async () => {
  346. query.modelId = "";
  347. getData();
  348. };
  349. const dialogclose = () => {
  350. state.visible = false;
  351. getData();
  352. };
  353. const handleInsert = () => {
  354. state.visible = true;
  355. };
  356. const handleEditClick = (row) => {
  357. let obj = Object.assign({}, row);
  358. obj && (obj.manufacturerCode = "");
  359. state.form = obj;
  360. state.visible = true;
  361. };
  362. // 分页导航
  363. const handlePageChange = (val) => {
  364. query.pageNum = val;
  365. getData();
  366. };
  367. const tableHeader = [
  368. "id",
  369. "报警级别(ZC_BJ:运转正常;YJ_BJ:运转状态超出标准范围;GZ_BJ:非正常停止运转;WH_BJ:停机维护;XD_BJ:限电/计划停机)",
  370. "制造商(HFYG_CS:合肥阳光电源有限公司;AMS_CS:艾默生;NRJD_CS:国电南瑞吉电新能源;MGSK_CS:美国赛康;LHDL_CS:联合动力;SYHC_CS:沈阳华创)",
  371. "名称",
  372. "上一级节点",
  373. "是否有子节点",
  374. "序列号",
  375. "类别 :正常停机,正常启动,快速停机,紧急停机",
  376. "设备型号",
  377. "全部默认为1",
  378. "统一编码",
  379. "是否展示(0:是;1:否)",
  380. "报警分类(bj:变桨;bpq:变频器;clx:齿轮箱;fdj:发电机;hh:滑环;jcjr:机舱加热;lq:冷却;ph:偏航;rh:润滑;yy:液压;zz:主轴;other:其它;kz:控制;yl:叶轮;jc:机舱;xb:箱变;dw:电网;td:塔底;fsy:风速仪)",
  381. "消缺规定时间",
  382. "是否可以复位(0:是;1:否)",
  383. "报警类型编号",
  384. "故障编码",
  385. "关联部件",
  386. ];
  387. const tableKey = [
  388. "id",
  389. "levelId",
  390. "manufacturerCode",
  391. "chineseText",
  392. "parentId",
  393. "isleaf",
  394. "sequenceNumber",
  395. "characteristic",
  396. "modelId",
  397. "codeName",
  398. "ednaValue",
  399. "display",
  400. "warningClassIfyId",
  401. "standardTime",
  402. "isreset",
  403. "warningTypeId",
  404. "faultCode",
  405. "relatedParts",
  406. ];
  407. // 批量导出
  408. const export2Excel = async () => {
  409. let { name, wpId, modelId } = query;
  410. const res = await windturbinebj_fetchTableData({
  411. pageNum: 1,
  412. pageSize: 999999,
  413. name,
  414. wpId,
  415. modelId,
  416. });
  417. ElMessage.success(`导出成功!`);
  418. outExportExcel(tableHeader, tableKey, res.records, "设备报警配置导出excel");
  419. };
  420. // 模板下载
  421. const outExe = () => {
  422. const data = [];
  423. ElMessage.success(`导出成功!`);
  424. outExportExcel(tableHeader, tableKey, data, "设备报警模板");
  425. };
  426. // 批量导入
  427. const handleSuccess = (response, file, fileList) => {
  428. ElMessage.success("导入成功!");
  429. getData();
  430. };
  431. const handleProgress = (response, file, fileList) => {};
  432. const handleError = (response, file, fileList) => {
  433. ElMessage.success("导入失败!");
  434. };
  435. //级别
  436. const rankConvert = (val) => {
  437. if (val == 1) {
  438. return "低级";
  439. } else if (val == 2) {
  440. return "低中级";
  441. } else if (val == 3) {
  442. return "中级";
  443. } else if (val == 4) {
  444. return "中高级";
  445. } else if (val == 5) {
  446. return "高级";
  447. }
  448. };
  449. // 类型
  450. const alarmTypeConvert = (type, val) => {
  451. if (type === "alarmType") {
  452. if (val === "windturbine") {
  453. return "风机";
  454. } else if (val === "booststation") {
  455. return "升压站";
  456. } else if (val === "booststation") {
  457. return "光伏";
  458. } else if (val === "custom") {
  459. return "自定义";
  460. }
  461. } else {
  462. if (val === "windturbine") {
  463. return "风机";
  464. } else if (val === "booststation") {
  465. return "升压站";
  466. } else if (val === "booststation") {
  467. return "光伏";
  468. }
  469. }
  470. };
  471. // 状态
  472. const enabledConvert = (val) => {
  473. if (val === false) {
  474. return "停用";
  475. } else if (val === true) {
  476. return "启用";
  477. }
  478. };
  479. // 报警分类
  480. const warningClassIfyIdConvert = (val) => {
  481. switch (val) {
  482. case "bj":
  483. return "变桨";
  484. break;
  485. case "bpq":
  486. return "变频器";
  487. break;
  488. case "clx":
  489. return "齿轮箱";
  490. break;
  491. case "fdj":
  492. return "发电机";
  493. break;
  494. case "hh":
  495. return "滑环";
  496. break;
  497. case "jcjr":
  498. return "机舱加热";
  499. break;
  500. case "lq":
  501. return "冷却";
  502. break;
  503. case "ph":
  504. return "偏航";
  505. break;
  506. case "rh":
  507. return "润滑";
  508. break;
  509. case "yy":
  510. return "液压";
  511. break;
  512. case "zz":
  513. return "主轴";
  514. break;
  515. case "other":
  516. return "其它";
  517. break;
  518. case "kz":
  519. return "控制";
  520. break;
  521. case "yl":
  522. return "叶轮";
  523. break;
  524. case "jc":
  525. return "机舱";
  526. break;
  527. case "xb":
  528. return "箱变";
  529. break;
  530. case "dw":
  531. return "电网";
  532. break;
  533. case "td":
  534. return "塔底";
  535. break;
  536. case "fsy":
  537. return "风速仪";
  538. break;
  539. }
  540. };
  541. // 是否可以复位
  542. const isresetConvert = (val) => {
  543. switch (val) {
  544. case 0:
  545. return "是";
  546. break;
  547. case 1:
  548. return "否";
  549. break;
  550. }
  551. };
  552. // 统一编码
  553. const ednaValueConvert = (val) => {
  554. if (val === 0) {
  555. return "";
  556. } else if (val < 100 && val > 0) {
  557. return "DI0" + val;
  558. } else if (val >= 100) {
  559. return "DI" + val;
  560. }
  561. };
  562. // 关联部件
  563. const relatePartConvert = (val) => {
  564. switch (val) {
  565. case "YP":
  566. return "叶片";
  567. break;
  568. case "LG":
  569. return "轮毂";
  570. break;
  571. case "TZ":
  572. return "塔架";
  573. break;
  574. case "JC":
  575. return "机舱";
  576. break;
  577. case "KZXT":
  578. return "控制系统";
  579. break;
  580. case "BJXT":
  581. return "变桨系统";
  582. break;
  583. case "PHXT":
  584. return "偏航系统";
  585. break;
  586. case "CLX":
  587. return "齿轮箱";
  588. break;
  589. case "FDJ":
  590. return "发电机";
  591. return;
  592. case "BPQ":
  593. return "变频器";
  594. return;
  595. case "YYXT":
  596. return "液压系统";
  597. break;
  598. case "FZXT":
  599. return "辅助系统";
  600. break;
  601. case "CFXT":
  602. return "测风系统";
  603. break;
  604. case "DWXT":
  605. return "电网系统";
  606. break;
  607. case "TDG":
  608. return "塔底柜";
  609. break;
  610. case "CDL":
  611. return "传动链";
  612. break;
  613. case "QT":
  614. return "其他";
  615. break;
  616. default:
  617. break;
  618. }
  619. };
  620. </script>
  621. <style scoped>
  622. .mr10 {
  623. margin-right: 10px;
  624. }
  625. .el-button + .el-button {
  626. margin-left: 10px;
  627. }
  628. </style>