index.vue 15 KB

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