device.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705
  1. <template>
  2. <div class="main deviceClass">
  3. <el-card class="box-card-tree">
  4. <button class="btn green" style="margin-bottom:10px" @click="handleTreeAdd()"
  5. >新增</button
  6. >
  7. <button
  8. class="btn green"
  9. @click="handleTreeDel()"
  10. :disabled="state.isDel == ''"
  11. >删除</button
  12. >
  13. <el-tree
  14. :data="state.treedata"
  15. :props="state.defaultProps"
  16. node-key="id"
  17. highlight-current
  18. :default-expanded-keys="['23']"
  19. @node-click="handleNodeClick"
  20. />
  21. </el-card>
  22. <el-card class="box-card">
  23. <el-tabs type="card" class="tab">
  24. <el-tab-pane label="传感点">
  25. <el-row :gutter="24" align="middle">
  26. <el-col :span="2">
  27. <button
  28. class="btn green"
  29. style="margin-bottom: 10px"
  30. @click="handleEdit(state.addFormData)"
  31. :disabled='state.desc.code==""'
  32. >新增</button
  33. ></el-col
  34. >
  35. <el-col :span="5">
  36. <el-input
  37. v-model="state.SearchVal"
  38. placeholder="筛选"
  39. :prefix-icon="Search"
  40. @input="fifterSearch()"
  41. size="small"
  42. />
  43. </el-col>
  44. </el-row>
  45. <el-table
  46. :data="state.fifterSearchTableData"
  47. stripe
  48. style="width: 100%"
  49. height="700"
  50. >
  51. <el-table-column type="index" width="50" />
  52. <el-table-column
  53. prop="metriccode"
  54. label="测点编码"
  55. ></el-table-column>
  56. <el-table-column label="名称">
  57. <template #default="scope">
  58. <el-popover placement="right" :width="260" trigger="click">
  59. <template #reference>
  60. <el-button type="text" style="color: #B3BDC0" size="small">{{
  61. scope.row.name
  62. }}</el-button>
  63. </template>
  64. <el-table :data="scope.row.deviceModelMetrics" max-height="400px">
  65. <el-table-column
  66. property="devicemodel"
  67. label="机型"
  68. align="center"
  69. ></el-table-column>
  70. <el-table-column
  71. property="uniformcode"
  72. label="统一编码"
  73. align="center"
  74. ></el-table-column>
  75. <el-table-column
  76. property="multiplier"
  77. label="倍率"
  78. align="center"
  79. ></el-table-column>
  80. </el-table>
  81. </el-popover>
  82. </template>
  83. </el-table-column>
  84. <el-table-column prop="unitname" label="单位"></el-table-column>
  85. <el-table-column
  86. prop="categorydata"
  87. label="测点类型"
  88. ></el-table-column>
  89. <el-table-column
  90. prop="categorysci"
  91. label="物理类型"
  92. ></el-table-column>
  93. <el-table-column prop="description" label="描述"></el-table-column>
  94. <el-table-column label="操作" width="180" align="center">
  95. <template #default="scope">
  96. <el-button
  97. type="text"
  98. style="color: #B3BDC0"
  99. @click="handleEdit(scope.row)"
  100. >编辑</el-button
  101. >
  102. <el-button
  103. type="text"
  104. style="color: #B3BDC0"
  105. @click="handleDelete(scope.row)"
  106. >删除</el-button
  107. >
  108. </template>
  109. </el-table-column>
  110. </el-table>
  111. </el-tab-pane>
  112. <el-tab-pane label="故障模式">
  113. <faultmode />
  114. </el-tab-pane>
  115. <el-tab-pane label="基本信息" style="width: 50%">
  116. <el-form :model="state.desc" label-width="100px">
  117. <el-form-item label="结构编码">
  118. <el-input v-model="state.desc.code"></el-input>
  119. </el-form-item>
  120. <el-form-item label="上级节点">
  121. <el-cascader
  122. v-model="state.desc.parentcode"
  123. :options="state.cascaderdata"
  124. :props="{ checkStrictly: true, emitPath: false }"
  125. :show-all-levels="false"
  126. clearable
  127. />
  128. </el-form-item>
  129. <el-form-item label="设备ID">
  130. <el-input v-model="state.desc.deviceid" disabled></el-input>
  131. </el-form-item>
  132. <el-form-item label="结构名称">
  133. <el-input v-model="state.desc.name"></el-input>
  134. </el-form-item>
  135. <el-form-item label="结构英文名称">
  136. <el-input v-model="state.desc.enname"></el-input>
  137. </el-form-item>
  138. <el-form-item label="描述">
  139. <el-input
  140. v-model="state.desc.description"
  141. :rows="4"
  142. clearable
  143. type="textarea"
  144. ></el-input>
  145. </el-form-item>
  146. <el-form-item label="序号">
  147. <el-input v-model="state.desc.orderno"></el-input>
  148. </el-form-item>
  149. <el-form-item label="是否有效">
  150. <el-switch
  151. class="elswitch"
  152. v-model="state.desc.enabled"
  153. active-color="#13ce66"
  154. inactive-color="#ff4949"
  155. />
  156. </el-form-item>
  157. </el-form>
  158. <button
  159. style="float: right"
  160. class="btn green"
  161. @click="savedesc"
  162. :disabled="state.desc.code == ''"
  163. >保存</button
  164. >
  165. </el-tab-pane>
  166. </el-tabs>
  167. </el-card>
  168. <!-- 传感点编辑弹出框 -->
  169. <el-dialog v-model="editVisible" width="40%" custom-class="modal">
  170. <el-form :model="editFormData" label-width="80px">
  171. <el-form-item label="指标">
  172. <el-input v-model="editFormData.metriccode"></el-input>
  173. </el-form-item>
  174. <el-row :gutter="24">
  175. <el-col :span="12">
  176. <el-form-item label="名称">
  177. <el-input v-model="editFormData.name"></el-input>
  178. </el-form-item>
  179. </el-col>
  180. <el-col :span="12">
  181. <el-form-item label="英文名称">
  182. <el-input v-model="editFormData.enname"></el-input>
  183. </el-form-item> </el-col
  184. ></el-row>
  185. <el-row :gutter="24">
  186. <el-col :span="12">
  187. <el-form-item label="标准单位">
  188. <el-input
  189. v-model="editFormData.unitname"
  190. ></el-input> </el-form-item
  191. ></el-col>
  192. <el-col :span="12">
  193. <el-form-item label="单位名称">
  194. <el-input v-model="editFormData.unitnamecn"></el-input>
  195. </el-form-item> </el-col
  196. ></el-row>
  197. <el-form-item label="描述">
  198. <el-input
  199. v-model="editFormData.description"
  200. :rows="3"
  201. type="textarea"
  202. clearable
  203. ></el-input>
  204. </el-form-item>
  205. <el-row :gutter="24">
  206. <el-col :span="12">
  207. <el-form-item label="数据类型">
  208. <el-select
  209. v-model="editFormData.categorydata"
  210. placeholder="Select"
  211. >
  212. <el-option
  213. v-for="item in state.options"
  214. :key="item.value"
  215. :label="item.label"
  216. :value="item.value"
  217. ></el-option>
  218. </el-select> </el-form-item
  219. ></el-col>
  220. <el-col :span="12">
  221. <el-form-item label="结构">
  222. <el-cascader
  223. v-model="editFormData.structurecode"
  224. :options="state.cascaderdata"
  225. :props="{ checkStrictly: true ,emitPath:false}"
  226. clearable
  227. /> </el-form-item
  228. ></el-col>
  229. </el-row>
  230. <el-row :gutter="24">
  231. <el-col :span="12">
  232. <el-form-item label="科学类型">
  233. <el-input
  234. v-model="editFormData.categorysci"
  235. ></el-input> </el-form-item
  236. ></el-col>
  237. <el-col :span="12"
  238. ><el-form-item label="系统分类">
  239. <el-input
  240. v-model="editFormData.categorysys"
  241. ></el-input> </el-form-item
  242. ></el-col>
  243. </el-row>
  244. <el-form-item label="适配机型" class="deviceModelClass">
  245. <el-select
  246. v-model="state.deviceModelSel"
  247. style="margin-right: 20px"
  248. placeholder="新增机型"
  249. size="mini"
  250. >
  251. <el-option
  252. v-for="item in state.deviceModel"
  253. :key="item.code"
  254. :label="item.code"
  255. :value="item.code"
  256. >
  257. </el-option>
  258. </el-select>
  259. <button class="btn green" v-show="state.deviceModelSel !=''" size="mini" type="primary" @click="deviceModelAdd()"
  260. >新增机型</button
  261. >
  262. <el-table
  263. :data="editFormData.deviceModelMetrics"
  264. style="width: 100%"
  265. max-height="200px"
  266. >
  267. <el-table-column prop="devicemodel" label="机型" />
  268. <el-table-column label="倍率">
  269. <template #default="scope">
  270. <el-input v-model="scope.row.multiplier" size="mini" />
  271. </template>
  272. </el-table-column>
  273. <el-table-column label="统一编码">
  274. <template #default="scope">
  275. <el-input v-model="scope.row.uniformcode" size="mini" />
  276. </template>
  277. </el-table-column>
  278. </el-table>
  279. </el-form-item>
  280. </el-form>
  281. <template #footer>
  282. <span class="dialog-footer">
  283. <button class="btn green" @click="editVisible = false">取 消</button>
  284. <button class="btn green" type="primary" @click="saveEdit">确 定</button>
  285. </span>
  286. </template>
  287. </el-dialog>
  288. <!-- tree add 弹出框 -->
  289. <el-dialog v-model="treeVisible" width="40%" custom-class="modal">
  290. <el-form :model="state.treeAddFormData" label-width="80px">
  291. <el-row :gutter="24">
  292. <el-col :span="12">
  293. <el-form-item label="结构编码">
  294. <el-input
  295. v-model="state.treeAddFormData.code"
  296. ></el-input> </el-form-item
  297. ></el-col>
  298. <el-col :span="12">
  299. <el-form-item label="上级节点" label-width="100px">
  300. <el-cascader
  301. v-model="state.treeAddFormData.parentcode"
  302. :options="state.cascaderdata"
  303. :props="{ checkStrictly: true, emitPath: false }"
  304. :show-all-levels="false"
  305. clearable
  306. /> </el-form-item
  307. ></el-col>
  308. </el-row>
  309. <el-row :gutter="24">
  310. <el-col :span="12">
  311. <el-form-item label="结构名称">
  312. <el-input
  313. v-model="state.treeAddFormData.name"
  314. ></el-input> </el-form-item
  315. ></el-col>
  316. <el-col :span="12">
  317. <el-form-item label="结构英文名称" label-width="100px">
  318. <el-input
  319. v-model="state.treeAddFormData.enname"
  320. ></el-input> </el-form-item
  321. ></el-col>
  322. </el-row>
  323. <el-row :gutter="24">
  324. <el-col :span="12"
  325. ><el-form-item label="序号">
  326. <el-input
  327. v-model="state.treeAddFormData.orderno"
  328. ></el-input> </el-form-item
  329. ></el-col>
  330. <el-col :span="4">
  331. <el-form-item label="是否有效">
  332. <el-switch
  333. v-model="state.treeAddFormData.enabled"
  334. class="elswitch"
  335. active-color="#13ce66"
  336. inactive-color="#ff4949"
  337. />
  338. </el-form-item
  339. ></el-col>
  340. <el-col :span="8">
  341. <el-form-item label="设备ID">
  342. <el-input
  343. v-model="state.treeAddFormData.deviceid"
  344. disabled
  345. ></el-input> </el-form-item
  346. ></el-col>
  347. </el-row>
  348. <el-form-item label="描述">
  349. <el-input
  350. v-model="state.treeAddFormData.description"
  351. :rows="4"
  352. clearable
  353. type="textarea"
  354. ></el-input>
  355. </el-form-item>
  356. </el-form>
  357. <template #footer>
  358. <span class="dialog-footer">
  359. <button class="btn green" @click="treeVisible = false">取 消</button>
  360. <button class="btn green" type="primary" @click="saveTreeAdd">确 定</button>
  361. </span>
  362. </template>
  363. </el-dialog>
  364. </div>
  365. </template>
  366. <script setup>
  367. import { ref, onMounted, reactive, provide, computed } from "vue";
  368. import { ElMessageBox, ElMessage, ElLoading } from "element-plus";
  369. import faultmode from "./faultmode.vue";
  370. import {
  371. tree,
  372. point,
  373. metrics,
  374. delmetrics,
  375. treeAdd,
  376. treeDel,
  377. device_list,
  378. } from "@/api/api.js";
  379. let editVisible = ref(false); //传感点
  380. let treeVisible = ref(false); //传感点
  381. let editFormData = ref({});
  382. onMounted(() => {
  383. getData();
  384. getDeviceModel();
  385. });
  386. let state = reactive({
  387. isDel: "", //是否能被删除
  388. SearchVal: "",
  389. treedata: [],
  390. cascaderdata: [],
  391. defaultProps: {
  392. children: "children",
  393. label: (a) => {
  394. return a.node.name;
  395. },
  396. },
  397. pointTableData: [],
  398. fifterSearchTableData: [],
  399. textarea: "",
  400. textarea1: "",
  401. treeCurClick: null,
  402. addFormData: {
  403. categorydata: "AI",
  404. categoryres1: null,
  405. categoryres2: null,
  406. categoryres3: null,
  407. categoryres4: null,
  408. categoryres5: null,
  409. categorysci: null,
  410. categorysys: null,
  411. description: null,
  412. deviceid: "windturbine",
  413. enname: null,
  414. id:null,
  415. metriccode: "",
  416. name: "",
  417. structurecode: "101010205",
  418. unitname: null,
  419. unitnamecn: null,
  420. deviceModelMetrics: [],
  421. },
  422. treeAddFormData: {
  423. code: "",
  424. parentcode: "",
  425. deviceid: "windturbine",
  426. name: "",
  427. enname: "",
  428. description: "",
  429. orderno: "",
  430. enabled: true,
  431. },
  432. options: [
  433. {
  434. value: "AI",
  435. label: "AI",
  436. },
  437. {
  438. value: "DI",
  439. label: "DI",
  440. },
  441. {
  442. value: "CI",
  443. label: "CI",
  444. },
  445. ],
  446. desc: {
  447. code: "",
  448. parentcode: "",
  449. deviceid: "",
  450. name: "",
  451. enname: "",
  452. description: "",
  453. orderno: "",
  454. enabled: true,
  455. },
  456. treeDelVal: "",
  457. deviceModel: [],
  458. deviceModelSel: "",
  459. });
  460. // 父子传参
  461. provide(
  462. "cascaderdata",
  463. computed(() => state.cascaderdata)
  464. );
  465. //fifterSearch
  466. const fifterSearch = () => {
  467. state.fifterSearchTableData = state.pointTableData.filter((e) => {
  468. return (
  469. e.name.includes(state.SearchVal) |
  470. e.categorydata.includes(state.SearchVal) |
  471. e.metriccode.includes(state.SearchVal)
  472. );
  473. });
  474. };
  475. // tree click
  476. const handleNodeClick = (data) => {
  477. console.log(data);
  478. state.isDel = data.children;
  479. state.desc = data.node;
  480. state.addFormData.structurecode = data.node.code
  481. getPoint(data.node);
  482. };
  483. // 测点 编辑
  484. const handleEdit = (row) => {
  485. editFormData.value = row;
  486. editVisible.value = true;
  487. };
  488. // tree add
  489. const handleTreeAdd = () => {
  490. treeVisible.value = true;
  491. };
  492. // tree Del
  493. const handleTreeDel = () => {
  494. console.warn(state.desc);
  495. if (state.isDel != null) {
  496. ElMessage.error(`不能删除该节点!!`);
  497. return;
  498. }
  499. ElMessageBox.confirm(`确定要删除 ${state.desc.name} 吗?`, "提示", {
  500. type: "warning",
  501. })
  502. .then(async () => {
  503. const res = await treeDel(state.desc.id);
  504. console.warn(res);
  505. if (res == 1) {
  506. ElMessage.success(`删除成功!`);
  507. getData();
  508. } else {
  509. ElMessage.warning(`删除失败!`);
  510. }
  511. })
  512. .catch(() => {});
  513. };
  514. // delTreeBtn
  515. const delTreeBtn = async () => {
  516. console.warn(state.treeDelVal);
  517. const res = await treeDel(state.treeDelVal);
  518. console.warn(res);
  519. if (res == 1) {
  520. ElMessage.success(`删除成功!`);
  521. getData();
  522. } else {
  523. ElMessage.warning(`删除失败!`);
  524. }
  525. state.treeDelVal = "";
  526. };
  527. //保存tree add
  528. const saveTreeAdd = async () => {
  529. const res = await treeAdd(state.treeAddFormData);
  530. console.warn(res);
  531. if (res.status == 20000) {
  532. ElMessage.success(`操作成功!`);
  533. treeVisible.value = false;
  534. getData();
  535. } else {
  536. ElMessage.warning(res.msg);
  537. }
  538. };
  539. // 测点 删除
  540. const handleDelete = (row) => {
  541. // 二次确认删除
  542. ElMessageBox.confirm("确定要删除吗?", "提示", {
  543. type: "warning",
  544. })
  545. .then(async () => {
  546. console.warn(row);
  547. const res = await delmetrics(row.id);
  548. console.warn(res);
  549. if (res == 1) {
  550. ElMessage.success(`删除成功!`);
  551. } else {
  552. ElMessage.success("删除失败");
  553. }
  554. getPoint(state.desc);
  555. })
  556. .catch(() => {});
  557. };
  558. // 保存编辑
  559. const saveEdit = async () => {
  560. postmetrics();
  561. };
  562. //测点 add
  563. const postmetrics = async () => {
  564. console.warn(editFormData.value);
  565. const res = await metrics(editFormData.value);
  566. console.warn(res);
  567. if (res.status == 20000) {
  568. ElMessage.success(`操作成功!`);
  569. editVisible.value = false;
  570. } else {
  571. ElMessage.success(res.msg);
  572. }
  573. getPoint(state.desc);
  574. };
  575. // getData
  576. const getData = async () => {
  577. const loading = ElLoading.service({
  578. lock: true,
  579. text: "数据加载中...",
  580. background: "rgba(0, 0, 0, 0.5)",
  581. });
  582. const res = await tree();
  583. loading.close();
  584. console.warn(res);
  585. state.treedata = res.children;
  586. state.cascaderdata = cascaderforEach(res);
  587. console.warn(state.cascaderdata);
  588. };
  589. //deviceModelAdd 新增机型
  590. const deviceModelAdd = async () => {
  591. if (state.deviceModelSel == "") return;
  592. console.warn();
  593. let obj = {
  594. deviceid: editFormData.value.deviceid,
  595. devicemodel: state.deviceModelSel,
  596. id: null,
  597. metriccode: editFormData.value.metriccode,
  598. multiplier: 0,
  599. uniformcode: "",
  600. };
  601. editFormData.value.deviceModelMetrics.push(obj);
  602. };
  603. //getDeviceModel
  604. const getDeviceModel = async () => {
  605. const res = await device_list();
  606. state.deviceModel = res;
  607. console.warn(res);
  608. };
  609. ///// 基本信息
  610. const savedesc = async () => {
  611. const res = await treeAdd(state.desc);
  612. console.warn(res);
  613. if (res.status == 20000) {
  614. ElMessage.success(`操作成功!`);
  615. } else {
  616. ElMessage.success(res.msg);
  617. }
  618. };
  619. ///// 基本信息
  620. // getPoint
  621. const getPoint = async (node) => {
  622. const res = await point(node.code);
  623. console.warn(res);
  624. state.pointTableData = res;
  625. fifterSearch();
  626. };
  627. // 递归解析基础数据
  628. const cascaderforEach = (val) => {
  629. if (val.children != null) {
  630. val.children.forEach((v) => {
  631. v["value"] = v.node.code;
  632. v["label"] = v.node.name;
  633. v["id"] = v.node.id;
  634. cascaderforEach(v);
  635. });
  636. return val.children;
  637. }
  638. };
  639. </script>
  640. <style lang="scss" scoped>
  641. .main {
  642. display: flex;
  643. width: 100%;
  644. height: 100%;
  645. box-sizing: border-box;
  646. justify-content: space-between;
  647. .box-card-tree {
  648. width: 20%;
  649. margin-right: 1%;
  650. overflow: auto;
  651. }
  652. .box-card {
  653. flex: 1;
  654. .desc {
  655. display: flex;
  656. margin-bottom: 30px;
  657. span {
  658. width: 100px;
  659. }
  660. }
  661. }
  662. }
  663. </style>
  664. <style lang="less" >
  665. .deviceModelClass {
  666. .el-table__header tr,
  667. .el-table__header th {
  668. padding: 0;
  669. height: 40px;
  670. }
  671. .el-table__body tr,
  672. .el-table__body td {
  673. padding: 0;
  674. height: 40px;
  675. }
  676. }
  677. .tab{
  678. .el-tabs__item.is-active{
  679. color:@green;
  680. }
  681. .el-tabs__item{
  682. color: #b7b7b7;
  683. }
  684. }
  685. .elswitch{
  686. .el-switch__input{
  687. position: absolute!important;
  688. }
  689. }
  690. .deviceClass{
  691. .el-row{
  692. margin-bottom: 16px;
  693. }
  694. }
  695. </style>