faultmode.vue 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. <template>
  2. <div style="width: 100%; height: 100%">
  3. <div class="btns">
  4. <el-button
  5. size="mini"
  6. class="buttons"
  7. round
  8. @click="handleEdit(state.addFormData)"
  9. >新增</el-button
  10. >
  11. <el-upload
  12. style="display: inline-block; margin: 0 10px 10px 10px"
  13. class="upload-demo"
  14. action="/sharding/device/faultmode/input"
  15. :show-file-list="false"
  16. :on-success="handleSuccess"
  17. :on-progress="handleProgress"
  18. :on-error="handleError"
  19. >
  20. <el-button
  21. size="mini"
  22. class="buttons"
  23. round
  24. :disabled="state.faultmodeTableData.length == 0"
  25. >导入</el-button
  26. >
  27. </el-upload>
  28. <el-button
  29. size="mini"
  30. class="buttons"
  31. round
  32. @click="export2Excel"
  33. :disabled="state.faultmodeTableData.length == 0"
  34. >导出</el-button
  35. >
  36. </div>
  37. <el-table
  38. :data="state.faultmodeTableData"
  39. stripe
  40. style="width: 100%"
  41. height="calc(100% - 38px)"
  42. >
  43. <el-table-column type="index" width="50" />
  44. <el-table-column prop="name" label="名称"></el-table-column>
  45. <el-table-column prop="code" label="故障编码"></el-table-column>
  46. <el-table-column label="频度" width="50">
  47. <template #default="scope">
  48. {{ rank(scope.row.occurence) }}
  49. </template>
  50. </el-table-column>
  51. <el-table-column label="严酷度" width="70">
  52. <template #default="scope">
  53. {{ rank(scope.row.severity) }}
  54. </template>
  55. </el-table-column>
  56. <el-table-column label="难检度" width="70">
  57. <template #default="scope">
  58. {{ rank(scope.row.detection) }}
  59. </template>
  60. </el-table-column>
  61. <el-table-column prop="cause" label="原因"></el-table-column>
  62. <el-table-column prop="effects" label="导致结果"></el-table-column>
  63. <el-table-column prop="measure" label="处理方法"></el-table-column>
  64. <el-table-column label="操作" width="180" align="center">
  65. <template #default="scope">
  66. <el-button
  67. type="text"
  68. style="color: #05bb4c"
  69. @click="handleEdit(scope.row)"
  70. >编辑</el-button
  71. >
  72. <el-button
  73. type="text"
  74. style="color: red"
  75. @click="handleDelete(scope.row)"
  76. >删除</el-button
  77. >
  78. </template>
  79. </el-table-column>
  80. </el-table>
  81. <!-- 传感点编辑弹出框 -->
  82. <el-dialog v-model="editVisible" width="40%">
  83. <el-form :model="editFormData" label-width="80px">
  84. <el-form-item label="故障编码">
  85. <el-input v-model="editFormData.code"></el-input>
  86. </el-form-item>
  87. <el-form-item label="名称">
  88. <el-input v-model="editFormData.name"></el-input>
  89. </el-form-item>
  90. <el-form-item label="导致结果">
  91. <el-input
  92. v-model="editFormData.effects"
  93. :rows="2"
  94. clearable
  95. type="textarea"
  96. ></el-input>
  97. </el-form-item>
  98. <el-form-item label="原因">
  99. <el-input
  100. v-model="editFormData.cause"
  101. :rows="2"
  102. clearable
  103. type="textarea"
  104. ></el-input>
  105. </el-form-item>
  106. <el-form-item label="处理方法">
  107. <el-input
  108. v-model="editFormData.measure"
  109. :rows="3"
  110. clearable
  111. type="textarea"
  112. ></el-input>
  113. </el-form-item>
  114. <el-row :gutter="24">
  115. <el-col :span="12">
  116. <el-form-item label="严酷度">
  117. <el-select v-model="editFormData.severity">
  118. <el-option
  119. v-for="item in selectOptions"
  120. :key="item.value"
  121. :label="item.label"
  122. :value="item.value"
  123. >
  124. </el-option>
  125. </el-select>
  126. </el-form-item>
  127. </el-col>
  128. <el-col :span="12">
  129. <el-form-item label="频度">
  130. <el-select v-model="editFormData.occurence">
  131. <el-option
  132. v-for="item in selectOptions"
  133. :key="item.value"
  134. :label="item.label"
  135. :value="item.value"
  136. >
  137. </el-option
  138. ></el-select> </el-form-item
  139. ></el-col>
  140. </el-row>
  141. <el-row :gutter="24">
  142. <el-col :span="12"
  143. ><el-form-item label="难检度">
  144. <el-select v-model="editFormData.detection">
  145. <el-option
  146. v-for="item in selectOptions"
  147. :key="item.value"
  148. :label="item.label"
  149. :value="item.value"
  150. >
  151. </el-option
  152. ></el-select>
  153. </el-form-item>
  154. </el-col>
  155. <el-col :span="12">
  156. <el-form-item label="结构">
  157. <el-cascader
  158. v-model="editFormData.structurecode"
  159. :options="cascaderdata"
  160. :props="{ checkStrictly: true, emitPath: false }"
  161. clearable
  162. /> </el-form-item
  163. ></el-col>
  164. </el-row>
  165. </el-form>
  166. <template #footer>
  167. <span class="footerButton">
  168. <el-button size="mini" round @click="editVisible = false"
  169. >取 消</el-button
  170. >
  171. <el-button size="mini" round type="primary" @click="saveEdit"
  172. >确 定</el-button
  173. >
  174. </span>
  175. </template>
  176. </el-dialog>
  177. </div>
  178. </template>
  179. <script setup>
  180. import { ref, onMounted, reactive, inject, watch } from "vue";
  181. import { ElMessageBox, ElMessage } from "element-plus";
  182. import { outExportExcel } from "@/tools/excel/exportExcel.js"; //引入文件
  183. import {
  184. faultmode_windturbine,
  185. faultmode_structurecode,
  186. faultmode_delete,
  187. faultmode_add_edit,
  188. } from "@/api/zhbj/index.js";
  189. let cascaderdata = inject("cascaderdata");
  190. let desc = inject("desc");
  191. let treeId = inject("treeId");
  192. watch(
  193. () => treeId,
  194. (val, old) => {
  195. getfaultmode(desc.value.code);
  196. },
  197. {
  198. deep: true,
  199. }
  200. );
  201. let editVisible = ref(false);
  202. let editFormData = ref({});
  203. onMounted(() => {
  204. getfaultmode(desc.value.code);
  205. });
  206. const selectV = {
  207. 1: "I",
  208. 2: "II",
  209. 3: "III",
  210. 4: "IV",
  211. 5: "V",
  212. };
  213. const selectOptions = [
  214. {
  215. label: "I",
  216. value: 1,
  217. },
  218. {
  219. label: "II",
  220. value: 2,
  221. },
  222. {
  223. label: "III",
  224. value: 3,
  225. },
  226. {
  227. label: "IV",
  228. value: 4,
  229. },
  230. {
  231. label: "V",
  232. value: 5,
  233. },
  234. ];
  235. const rank = (v) => {
  236. return selectV[v] || "";
  237. };
  238. let state = reactive({
  239. faultmodeTableData: [],
  240. addFormData: {
  241. code: "",
  242. name: "",
  243. effects: "",
  244. cause: "",
  245. measure: "",
  246. severity: null,
  247. occurence: null,
  248. detection: null,
  249. deviceid: "windturbine",
  250. structurecode: "",
  251. models: null,
  252. },
  253. });
  254. // 新增 编辑
  255. const handleEdit = (row) => {
  256. editFormData.value = row;
  257. editVisible.value = true;
  258. };
  259. // 测点 删除
  260. const handleDelete = (row) => {
  261. // 二次确认删除
  262. ElMessageBox.confirm("确定要删除吗?", "提示", {
  263. type: "warning",
  264. })
  265. .then(async () => {
  266. const res = await faultmode_delete(row.id);
  267. if (res == 1) {
  268. ElMessage.success(`删除成功!`);
  269. } else {
  270. ElMessage.success("删除失败");
  271. }
  272. getfaultmode(desc.value.code);
  273. })
  274. .catch(() => {});
  275. };
  276. // 保存编辑
  277. const saveEdit = async () => {
  278. const res = await faultmode_add_edit(editFormData.value);
  279. if (res.code === 200) {
  280. ElMessage.success(`操作成功!`);
  281. editVisible.value = false;
  282. getfaultmode(desc.value.code);
  283. } else {
  284. ElMessage.success(res.msg);
  285. }
  286. };
  287. // getData
  288. const getfaultmode = async (code) => {
  289. const res = await faultmode_structurecode(code);
  290. state.faultmodeTableData = res;
  291. };
  292. // 批量导入
  293. const handleSuccess = (response, file, fileList) => {
  294. ElMessage.success(response.msg);
  295. getfaultmode(desc.value.code);
  296. };
  297. const handleProgress = (response, file, fileList) => {};
  298. const handleError = (response, file, fileList) => {
  299. ElMessage.success("导入失败!");
  300. };
  301. // 批量导出
  302. const export2Excel = () => {
  303. const tableData = state.faultmodeTableData;
  304. // loading.close();
  305. ElMessage.success(`导出成功!`);
  306. const tableHeader = [
  307. "上级结构编码",
  308. "名称",
  309. "故障编码",
  310. "频度",
  311. "严酷度",
  312. "难检度",
  313. "原因",
  314. "导致结果",
  315. "处理方法",
  316. ];
  317. const tableKey = [
  318. "structurecode",
  319. "name",
  320. "code",
  321. "occurence",
  322. "severity",
  323. "detection",
  324. "cause",
  325. "effects",
  326. "measure",
  327. ];
  328. outExportExcel(tableHeader, tableKey, tableData, "故障模式导出excel");
  329. };
  330. </script>
  331. <style lang="less" scoped>
  332. .buttons {
  333. background-color: rgba(5, 187, 76, 0.2);
  334. border: 1px solid #3b6c53;
  335. color: #b3b3b3;
  336. font-size: 14px;
  337. &:hover {
  338. background-color: rgba(5, 187, 76, 0.5);
  339. color: #ffffff;
  340. }
  341. }
  342. </style>