device.vue 22 KB

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