index.vue 16 KB

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