windturbine.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407
  1. <template>
  2. <div style="width: 100%; height: 100%">
  3. <el-row type="flex" justify="space-between">
  4. <div class="handle-box" 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="`${$store.state.baseURL}/alarmconfiguration/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 style="display: flex; flex-direction: row; margin-bottom: 10px">
  34. <el-select
  35. v-if="isStation"
  36. v-model="query.stationId"
  37. clearable
  38. size="mini"
  39. style="width: 150px"
  40. placeholder="全部场站"
  41. popper-class="select"
  42. @change="changeStation()"
  43. >
  44. <el-option
  45. v-for="item in stationList"
  46. :key="item.id"
  47. :value="item.id"
  48. :label="item.name"
  49. ></el-option>
  50. </el-select>
  51. <el-select
  52. v-model="query.modelId"
  53. clearable
  54. size="mini"
  55. style="width: 150px"
  56. placeholder="全部机型"
  57. popper-class="select"
  58. >
  59. <el-option
  60. v-for="item in state.modelList"
  61. :key="item"
  62. :value="item"
  63. :label="item"
  64. ></el-option>
  65. </el-select>
  66. <el-input
  67. placeholder="请输入名称"
  68. v-model="query.name"
  69. style="width: 150px; margin-right: 10px"
  70. size="mini"
  71. clearable
  72. ></el-input>
  73. <el-button
  74. icon="Search"
  75. size="mini"
  76. round
  77. class="buttons"
  78. @click="getData"
  79. >搜索</el-button
  80. >
  81. </div>
  82. </el-row>
  83. <div class="wind-table">
  84. <el-table
  85. :data="state.tableData"
  86. size="mini"
  87. :height="`calc(100% - 65px)`"
  88. style="width: 100%; height: calc(100% - 65px)"
  89. stripe
  90. >
  91. <el-table-column
  92. v-for="item in state.tableHeader"
  93. :key="item.id"
  94. :prop="item.prop"
  95. :label="item.label"
  96. :align="item.align"
  97. header-align="center"
  98. :width="item.width"
  99. :min-width="item.minWidth"
  100. show-overflow-tooltip
  101. >
  102. <template #default="{ row }">
  103. <span v-if="item.prop == 'rank'">
  104. {{ levelIdConvert(row.rank) }}</span
  105. >
  106. <span v-else-if="item.prop == 'deviceType'">
  107. {{ warningClassIfyIdConvert(row.deviceType) }}</span
  108. >
  109. <span v-else-if="item.prop == 'resetTable'">
  110. {{ row.resetTable ? "是" : "否" }}</span
  111. >
  112. <span v-else-if="item.prop == 'enabled'">
  113. {{ row.enabled == 1 ? "是" : "否" }}</span
  114. >
  115. <span v-else>{{ row[item.prop] ? row[item.prop] : "--" }}</span>
  116. </template>
  117. </el-table-column>
  118. <el-table-column label="操作" align="center" width="100">
  119. <template #default="scope">
  120. <el-button
  121. type="text"
  122. :style="`color: ${
  123. $store.state.theme ? '#1890ff' : '#47aee7'
  124. } !important`"
  125. icon="el-icon-lx-edit"
  126. @click="handleEditClick(scope.row)"
  127. >
  128. 编辑</el-button
  129. >
  130. </template>
  131. </el-table-column>
  132. </el-table>
  133. <div class="pagination">
  134. <el-pagination
  135. class="b"
  136. layout="total, sizes, prev, pager, next"
  137. :page-sizes="[20, 50, 100, 200, 500]"
  138. @size-change="
  139. (value) => {
  140. query.pageSize = value;
  141. query.pageNum = 1;
  142. getData();
  143. }
  144. "
  145. :current-page="query.pageNum"
  146. :page-size="query.pageSize"
  147. :total="total"
  148. @current-change="handlePageChange"
  149. ></el-pagination>
  150. </div>
  151. </div>
  152. <windturbinecomponents
  153. @close="dialogclose"
  154. :isVisible="state.visible"
  155. :form="state.form"
  156. />
  157. </div>
  158. </template>
  159. <script setup>
  160. import {
  161. windturbinebj_fetchTableData,
  162. getWtModel,
  163. getWpList,
  164. } from "@/api/zhbj/index.js";
  165. import { outExportExcel } from "@/tools/excel/exportExcel.js"; //引入文件
  166. import { ref, onMounted, provide, computed, reactive, watch } from "vue";
  167. import { useStore } from "vuex";
  168. import { ElMessageBox, ElMessage } from "element-plus";
  169. import windturbinecomponents from "./windturbine_components.vue";
  170. const token = { token: sessionStorage.getItem("token") };
  171. const store = useStore();
  172. const stationList = ref([]);
  173. const getStationList = async () => {
  174. const { data } = await getWpList("windturbine");
  175. stationList.value = data || [];
  176. };
  177. const isStation = computed(() => stationList.value.length);
  178. const state = reactive({
  179. tableData: [],
  180. modelList: [],
  181. visible: false,
  182. form: {},
  183. tableHeader: [
  184. { label: "序列号", prop: "id", align: "center" },
  185. { label: "统一编码", prop: "uniformCode", align: "center" },
  186. { label: "描述", prop: "description", align: "left", width: 180 },
  187. { label: "停机类型", prop: "characteristic", align: "center" },
  188. { label: "风机型号", prop: "modelId", align: "center" },
  189. { label: "报警类型", prop: "alarmTypeName", align: "center" },
  190. { label: "故障编码", prop: "nemCode", align: "center" },
  191. { label: "报警级别", prop: "rank", align: "center" },
  192. { label: "报警分类", prop: "deviceType", align: "center", minWidth: 50 },
  193. {
  194. label: "是否可以复位",
  195. prop: "resetTable",
  196. align: "center",
  197. minWidth: 50,
  198. },
  199. { label: "是否启用", prop: "enabled", align: "center", minWidth: 50 },
  200. {
  201. label: "关联部件",
  202. prop: "componentsName",
  203. align: "center",
  204. minWidth: 50,
  205. },
  206. ],
  207. });
  208. const query = reactive({
  209. pageNum: 1,
  210. pageSize: 20,
  211. stationId: "",
  212. modelId: "",
  213. name: "",
  214. });
  215. let total = ref(0);
  216. onMounted(() => {
  217. getStationList();
  218. getData();
  219. getequipmentmodel_list();
  220. });
  221. const dialogclose = () => {
  222. state.visible = false;
  223. getData();
  224. };
  225. const getData = async () => {
  226. const { data } = await windturbinebj_fetchTableData(query);
  227. data.records.forEach((ele) => {
  228. ele.alarmTypeName = warningClassIfyIdConvert(ele.alarmType);
  229. });
  230. state.tableData = data.records;
  231. total.value = data.total;
  232. };
  233. const handleInsert = () => {
  234. state.visible = true;
  235. };
  236. const handleEditClick = (row) => {
  237. console.warn(row);
  238. let obj = Object.assign({}, row);
  239. state.form = obj;
  240. state.visible = true;
  241. };
  242. //changeStation
  243. const changeStation = async () => {
  244. query.modelId = "";
  245. await getequipmentmodel_list();
  246. };
  247. // 机型
  248. const getequipmentmodel_list = async () => {
  249. const { data } = await getWtModel(query.stationId);
  250. state.modelList = data || [];
  251. };
  252. // 分页导航
  253. const handlePageChange = (val) => {
  254. query.pageNum = val;
  255. getData();
  256. };
  257. const tableHeader = [
  258. "id",
  259. "报警级别(ZC_BJ:运转正常;YJ_BJ:运转状态超出标准范围;GZ_BJ:非正常停止运转;WH_BJ:停机维护;XD_BJ:限电/计划停机)",
  260. "制造商(HFYG_CS:合肥阳光电源有限公司;AMS_CS:艾默生;NRJD_CS:国电南瑞吉电新能源;MGSK_CS:美国赛康;LHDL_CS:联合动力;SYHC_CS:沈阳华创)",
  261. "名称",
  262. "上一级节点",
  263. "是否有子节点",
  264. "序列号",
  265. "类别 :正常停机,正常启动,快速停机,紧急停机",
  266. "风机型号",
  267. "全部默认为1",
  268. "统一编码",
  269. "是否展示(0:是;1:否)",
  270. "报警分类(bj:变桨;bpq:变频器;clx:齿轮箱;fdj:发电机;hh:滑环;jcjr:机舱加热;lq:冷却;ph:偏航;rh:润滑;yy:液压;zz:主轴;other:其它;kz:控制;yl:叶轮;jc:机舱;xb:箱变;dw:电网;td:塔底;fsy:风速仪)",
  271. "消缺规定时间",
  272. "是否可以复位(0:是;1:否)",
  273. "报警类型编号",
  274. "故障编码",
  275. "关联部件",
  276. ];
  277. const tableKey = [
  278. "id",
  279. "levelId",
  280. "manufacturerCode",
  281. "chineseText",
  282. "parentId",
  283. "isleaf",
  284. "sequenceNumber",
  285. "characteristic",
  286. "modelId",
  287. "codeName",
  288. "ednaValue",
  289. "display",
  290. "warningClassIfyId",
  291. "standardTime",
  292. "isreset",
  293. "warningTypeId",
  294. "faultCode",
  295. "relatedParts",
  296. ];
  297. // 批量导出
  298. const export2Excel = async () => {
  299. const res = await windturbinebj_fetchTableData({
  300. ...query,
  301. pageNum: 1,
  302. pageSize: 999999,
  303. });
  304. outExportExcel(
  305. state.tableHeader.map((item) => item.label),
  306. state.tableHeader.map((item) => item.prop),
  307. res.data.records.map((item) => {
  308. return {
  309. ...item,
  310. rank: levelIdConvert(item.rank),
  311. alarmTypeName: warningClassIfyIdConvert(item.alarmType),
  312. deviceType: warningClassIfyIdConvert(item.deviceType),
  313. enabled: item.enabled == 1 ? "是" : "否",
  314. resetTable: item.resetTable ? "是" : "否",
  315. };
  316. }),
  317. "设备报警配置导出excel"
  318. );
  319. };
  320. // 模板下载
  321. const outExe = () => {
  322. const data = [];
  323. ElMessage.success(`导出成功!`);
  324. outExportExcel(tableHeader, tableKey, data, "风机报警模板");
  325. };
  326. // 批量导入
  327. const handleSuccess = (response, file, fileList) => {
  328. ElMessage.success("导入成功!");
  329. getData();
  330. };
  331. const handleProgress = (response, file, fileList) => {};
  332. const handleError = (response, file, fileList) => {
  333. ElMessage.success("导入失败!");
  334. };
  335. // 报警级别
  336. const levelIdConvert = (val) => {
  337. switch (val) {
  338. case 1:
  339. return "低级";
  340. case 2:
  341. return "低中级";
  342. case 3:
  343. return "中级";
  344. case 4:
  345. return "中高级";
  346. case 5:
  347. return "高级";
  348. default:
  349. return "";
  350. }
  351. };
  352. // 报警分类
  353. const warningClassIfyIdConvert = (val) => {
  354. switch (val) {
  355. case "interver":
  356. return "光伏";
  357. case "windturbine":
  358. return "风机";
  359. case "booststation":
  360. return "升压站";
  361. default:
  362. return "";
  363. }
  364. };
  365. // 统一编码
  366. const ednaValueConvert = (val) => {
  367. if (val === 0) {
  368. return "";
  369. } else if (val < 100 && val > 0) {
  370. return "DI0" + val;
  371. } else if (val >= 100) {
  372. return "DI" + val;
  373. }
  374. };
  375. </script>
  376. <style scoped lang="less">
  377. .wind-table {
  378. height: calc(100% - 40px);
  379. }
  380. .buttons {
  381. background-color: rgba(5, 187, 76, 0.2);
  382. border: 1px solid #3b6c53;
  383. color: #b3b3b3;
  384. font-size: 14px;
  385. &:hover {
  386. background-color: rgba(5, 187, 76, 0.5);
  387. color: #ffffff;
  388. }
  389. }
  390. .el-select ::v-deep {
  391. margin-right: 10px;
  392. }
  393. .el-button + .el-button {
  394. margin-left: 10px;
  395. }
  396. .pagination {
  397. padding-top: 15px;
  398. }
  399. </style>