index.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786
  1. <template>
  2. <div
  3. class="history-warning"
  4. v-loading="tableLoading"
  5. element-loading-text="加载中..."
  6. element-loading-background="rgba(4, 12, 11, 0.8)"
  7. >
  8. <div class="form-wrapper">
  9. <div class="search-wrapper">
  10. <div class="search-item">
  11. <span class="label">类型:</span>
  12. <div class="search-content">
  13. <el-select
  14. v-model="state.typeVal"
  15. clearable
  16. size="mini"
  17. placeholder="全部"
  18. popper-class="select"
  19. @change="
  20. () => {
  21. getStationList();
  22. typechange();
  23. }
  24. "
  25. >
  26. <el-option
  27. v-for="item in state.typeList"
  28. :key="item.value"
  29. :value="item.value"
  30. :label="item.label"
  31. >
  32. </el-option>
  33. </el-select>
  34. </div>
  35. </div>
  36. <div class="search-item">
  37. <span class="label">{{
  38. state.isshowwindturbineName ? "场站:" : "升压站:"
  39. }}</span>
  40. <div class="search-content">
  41. <el-select
  42. v-model="state.stationId"
  43. clearable
  44. size="mini"
  45. placeholder="全部"
  46. popper-class="select"
  47. @change="getWindturbineList"
  48. >
  49. <el-option
  50. v-for="item in stationList"
  51. :key="item.id"
  52. :value="item.id"
  53. :label="item.name"
  54. ></el-option>
  55. </el-select>
  56. </div>
  57. </div>
  58. <div class="search-item" v-if="state.isshowwindturbineName">
  59. <span class="label">机组:</span>
  60. <div class="search-content">
  61. <el-select
  62. v-model="state.deviceId"
  63. clearable
  64. size="mini"
  65. placeholder="全部"
  66. popper-class="select"
  67. >
  68. <el-option
  69. v-for="item in state.windturbineList"
  70. :key="item.id"
  71. :value="item.id"
  72. :label="item.name"
  73. >
  74. </el-option>
  75. </el-select>
  76. </div>
  77. </div>
  78. <div class="search-item" v-if="state.isshowwindturbineName">
  79. <span class="label">型号:</span>
  80. <div class="search-content">
  81. <el-select
  82. v-model="state.modelId"
  83. clearable
  84. size="mini"
  85. placeholder="全部"
  86. popper-class="select"
  87. >
  88. <el-option
  89. v-for="item in modelList"
  90. :key="item.id"
  91. :value="item.id"
  92. :label="item.name"
  93. >
  94. </el-option>
  95. </el-select>
  96. </div>
  97. </div>
  98. <div class="search-item" v-if="state.isshowwindturbineName">
  99. <span class="label">部件:</span>
  100. <div class="search-content">
  101. <el-select
  102. v-model="state.components"
  103. clearable
  104. size="mini"
  105. placeholder="全部"
  106. popper-class="select"
  107. >
  108. <el-option
  109. v-for="item in componentList"
  110. :key="item.id"
  111. :value="item.id"
  112. :label="item.name"
  113. >
  114. </el-option>
  115. </el-select>
  116. </div>
  117. </div>
  118. <div class="search-item">
  119. <span class="label">描述:</span>
  120. <div class="search-content"></div>
  121. <el-input
  122. v-model="state.description"
  123. placeholder="请输入..."
  124. size="mini"
  125. ></el-input>
  126. </div>
  127. <div class="search-item">
  128. <span class="label">日期:</span>
  129. <div class="search-content">
  130. <el-date-picker
  131. v-model="state.dateTime"
  132. size="mini"
  133. type="datetimerange"
  134. range-separator="-"
  135. format="YYYY-MM-DD HH:mm:ss"
  136. value-format="YYYY-MM-DD HH:mm:ss"
  137. start-placeholder="开始"
  138. end-placeholder="结束"
  139. >
  140. </el-date-picker>
  141. </div>
  142. </div>
  143. </div>
  144. <div class="btns">
  145. <el-button class="buttons" size="mini" @click="getAlarmHistoryt"
  146. >查询</el-button
  147. >
  148. <el-button
  149. size="mini"
  150. class="buttons"
  151. @click="export2Excel"
  152. :disabled="state.tableData?.length == 0 ? true : false"
  153. >
  154. 导出</el-button
  155. >
  156. <el-button
  157. class="buttons"
  158. size="mini"
  159. :disabled="!state.tableData?.length"
  160. @click="confirmItem(state.tableData)"
  161. >确认本页</el-button
  162. >
  163. </div>
  164. </div>
  165. <div class="table-wrapper">
  166. <div class="leftContent">
  167. <span>{{ pageTitle }}</span>
  168. </div>
  169. <el-table
  170. size="mini"
  171. :data="state.tableData"
  172. height="calc(100% - 35px - 55px)"
  173. style="width: 100%"
  174. stripe
  175. >
  176. <template v-if="state.isshowwindturbineName">
  177. <el-table-column
  178. v-for="item in state.tableHeader"
  179. :label="item.title"
  180. :prop="item.code"
  181. :key="item.code"
  182. :width="item.width || ''"
  183. show-overflow-tooltip
  184. header-align="center"
  185. >
  186. <template #default="scope">
  187. <p :style="item.style && item.style(scope.row)">
  188. <span v-if="item.code == 'rank'">
  189. {{ tableFilter(scope.row.rank) }}
  190. </span>
  191. <span v-else-if="item.code == 'alarmtype'">
  192. {{ tableFilter(scope.row.alarmtype) }}
  193. </span>
  194. <span v-else-if="item.code == 'ts'">
  195. {{ formatTime(scope.row.ts) }}
  196. </span>
  197. <span
  198. :style="`color:${
  199. scope.row.confirmed ? '#05bb4c' : 'var(--el-color-danger)'
  200. }`"
  201. v-else-if="item.code == 'confirmed'"
  202. >
  203. {{ scope.row.confirmed ? "是" : "否" }}
  204. </span>
  205. <span v-else>
  206. {{
  207. scope.row[item.code] != "NULL" ? scope.row[item.code] : "--"
  208. }}
  209. </span>
  210. </p>
  211. </template>
  212. </el-table-column>
  213. <el-table-column
  214. label="操作"
  215. width="100"
  216. header-align="center"
  217. align="center"
  218. >
  219. <template #default="scope">
  220. <el-button
  221. type="text"
  222. style="color: #05bb4c"
  223. @click="confirmItem([scope.row])"
  224. >确认本条</el-button
  225. >
  226. </template>
  227. </el-table-column>
  228. </template>
  229. <template v-else>
  230. <el-table-column
  231. v-for="item in state.tableHeader1"
  232. :label="item.title"
  233. :prop="item.code"
  234. :key="item.code"
  235. :width="item.width || ''"
  236. show-overflow-tooltip
  237. header-align="center"
  238. >
  239. <template #default="scope">
  240. <p :style="item.style && item.style(scope.row)">
  241. <span v-if="item.code == 'rank'">
  242. {{ tableFilter(scope.row.rank) }}
  243. </span>
  244. <span v-else-if="item.code == 'alarmtype'">
  245. {{ tableFilter(scope.row.alarmtype) }}
  246. </span>
  247. <span v-else-if="item.code == 'ts'">
  248. {{ formatTime(scope.row.ts) }}
  249. </span>
  250. <span
  251. :style="`color:${
  252. scope.row.confirmed ? '#05bb4c' : 'var(--el-color-danger)'
  253. }`"
  254. v-else-if="item.code == 'confirmed'"
  255. >
  256. {{ scope.row.confirmed ? "是" : "否" }}
  257. </span>
  258. <span v-else>
  259. {{
  260. scope.row[item.code] != "NULL" ? scope.row[item.code] : "--"
  261. }}
  262. </span>
  263. </p>
  264. </template>
  265. </el-table-column>
  266. <el-table-column
  267. label="操作"
  268. width="100"
  269. header-align="center"
  270. align="center"
  271. fixed="right"
  272. >
  273. <template #default="scope">
  274. <el-button type="text" style="color: #05bb4c" @click="confirmItem([scope.row])"
  275. >确认本条</el-button
  276. >
  277. </template>
  278. </el-table-column>
  279. </template>
  280. </el-table>
  281. <div class="pagination-wrapper">
  282. <el-pagination
  283. layout="total, sizes, prev, pager, next"
  284. :current-page="query.page"
  285. :page-size="query.limit"
  286. :page-sizes="[20, 100, 500, 1000]"
  287. :total="query.pageTotal"
  288. @size-change="
  289. (value) => {
  290. query.page = 1;
  291. query.limit = value;
  292. getAlarmHistoryt();
  293. }
  294. "
  295. @current-change="handlePageChange"
  296. ></el-pagination>
  297. </div>
  298. </div>
  299. </div>
  300. </template>
  301. <script setup name="historyWarning">
  302. import { watch, reactive, nextTick, computed, onMounted, ref } from "vue";
  303. import { useRouter, useRoute } from "vue-router";
  304. import dayjs from "dayjs";
  305. import {
  306. alarm_history,
  307. new_alarm_history,
  308. fetchWindturbineList,
  309. fetchModel,
  310. fetchRelatePartAndAlarmType,
  311. getWpList,
  312. confirmAlart,
  313. } from "@/api/zhbj/index.js";
  314. import { ElMessageBox, ElMessage } from "element-plus";
  315. import { outExportExcel } from "@/tools/excel/exportExcel.js"; //引入文件
  316. import { useStore } from "vuex";
  317. const pageTitle = "报警查询";
  318. const store = useStore();
  319. const route = useRoute();
  320. const tableLoading = ref(false);
  321. onMounted(() => {
  322. state.dateTime = [
  323. dayjs().startOf("day").format("YYYY-MM-DD HH:mm:ss"),
  324. dayjs().format("YYYY-MM-DD HH:mm:ss"),
  325. ];
  326. if (route.params.typeVal != "booststation") {
  327. state.deviceId = route.params.deviceId || "";
  328. state.alarmId = route.params.alarmId || "";
  329. state.typeVal = route.params.typeVal || "windturbine";
  330. } else {
  331. state.stationName = route.params.deviceId;
  332. state.deviceId = "";
  333. state.alarmId = route.params.alarmId || "";
  334. state.typeVal = route.params.typeVal || "booststation";
  335. }
  336. state.isshowwindturbineName = state.typeVal == "booststation" ? false : true;
  337. if (route.params.ts) {
  338. state.dateTime = [
  339. `${dayjs(Number(route.params.ts)).format("YYYY-MM-DD")} 00:00:00`,
  340. dayjs(Number(route.params.ts)).format("YYYY-MM-DD HH:mm:ss"),
  341. ];
  342. }
  343. // getStationList(); //场站
  344. getequipmentmodel_list(); //机型
  345. getfetchRelatePart(); //部件
  346. });
  347. // 机型
  348. const getequipmentmodel_list = async () => {
  349. const { data } = await fetchModel();
  350. state.modelListAll = data;
  351. };
  352. //所属部件
  353. const getfetchRelatePart = async () => {
  354. const { data } = await fetchRelatePartAndAlarmType();
  355. state.fetchListAll = data;
  356. };
  357. const confirmItem = (alarmItem) => {
  358. ElMessageBox("您确定要执行此操作吗?", "提示", {
  359. confirmButtonText: "确定",
  360. cancelButtonText: "取消",
  361. type: "warning",
  362. })
  363. .then(() => {
  364. confirmAlart(alarmItem)
  365. .then((res) => {
  366. if (res.code === 200) {
  367. ElMessage.success("确认成功");
  368. store.commit("removeWarning", alarmItem);
  369. getAlarmHistoryt();
  370. }
  371. })
  372. .catch(() => {
  373. ElMessage.error("确认失败,请重试");
  374. });
  375. })
  376. .catch(() => {});
  377. };
  378. const getColumnStyle = (columnItem) => {
  379. let style = "color:";
  380. if (columnItem.endts) {
  381. style += " #05bb4c";
  382. } else {
  383. style += "var(--el-color-danger)";
  384. }
  385. return style;
  386. };
  387. const state = reactive({
  388. typeList: [
  389. {
  390. label: "升压站",
  391. value: "booststation",
  392. },
  393. // {
  394. // label: "自定义",
  395. // value: "custom",
  396. // },
  397. {
  398. label: "风机",
  399. value: "windturbine",
  400. },
  401. {
  402. label: "光伏",
  403. value: "inverter",
  404. },
  405. ],
  406. typeVal: "windturbine",
  407. stationId: "",
  408. stationName: "",
  409. alarmId: "",
  410. windturbineList: [],
  411. deviceId: "",
  412. modelListAll: {},
  413. fetchListAll: {},
  414. modelId: "", //型号
  415. components: "", //部件
  416. description: "", //描述
  417. dateTime: [],
  418. startDate: null,
  419. endDate: null,
  420. tableData: [],
  421. isshowwindturbineName: true,
  422. ts: "",
  423. tableHeader: [
  424. { title: "时间", code: "ts", width: "150" },
  425. { title: "场站", code: "stationname", width: "150" },
  426. { title: "机组", code: "devicename", width: "150" },
  427. { title: "报警信息", code: "description", width: "180" },
  428. { title: "故障原因", code: "faultCause" },
  429. // { title: "级别", code: "rank", width: "80" },
  430. { title: "故障编码", code: "nemCode", width: "100" },
  431. // { title: "故障解决方法", code: "resolvent" },
  432. { title: "报警解除时间", code: "endtsName", width: "150" },
  433. {
  434. title: "状态",
  435. code: "isCloseName",
  436. // width: "80",
  437. style: getColumnStyle,
  438. width: 100,
  439. },
  440. { title: "是否确认", code: "confirmed", width: "100" },
  441. { title: "类型", code: "alarmTypeName", width: "80" },
  442. ],
  443. tableHeader1: [
  444. { title: "时间", code: "ts", width: "150" },
  445. { title: "升压站", code: "stationname", width: "150" },
  446. { title: "报警信息", code: "description" },
  447. // { title: "级别", code: "rank", width: "80" },
  448. { title: "报警解除时间", code: "endtsName", width: "150" },
  449. {
  450. title: "状态",
  451. code: "isCloseName",
  452. style: getColumnStyle,
  453. width: 100,
  454. // width: "80",
  455. },
  456. { title: "是否确认", code: "confirmed", width: "100" },
  457. { title: "类型", code: "alarmTypeName", width: "80" },
  458. ],
  459. });
  460. // 场站列表/升压站列表
  461. const stationList = ref([]);
  462. //获取场站列表
  463. const getStationList = async () => {
  464. const { data } = await getWpList(state.typeVal);
  465. stationList.value = data;
  466. if (state.deviceId && state.typeVal != "booststation") {
  467. let station = data.find((i) => {
  468. let st = i.id.split("_")[2];
  469. let dt = state.deviceId.split("_")[2];
  470. if (st == dt) {
  471. return i;
  472. }
  473. });
  474. state.stationId = station?.id;
  475. } else if (state.typeVal == "booststation") {
  476. let station = data.find((i) => i.name == state.stationName);
  477. state.stationId = station ? station?.id : data[0]?.id;
  478. } else {
  479. state.stationId = data[0]?.id;
  480. }
  481. state.stationId = route.params.stationId || state.stationId;
  482. route.params.stationId
  483. ? (state.modelId = modelList.value?.[0]?.id || "")
  484. : "";
  485. if (stationList.value.length) {
  486. getWindturbineList();
  487. }
  488. };
  489. // watch(
  490. // () => stationList,
  491. // (val, old) => {
  492. // val?.value?.length &&
  493. // nextTick(async () => {
  494. // await getWindturbineList();
  495. // });
  496. // },
  497. // {
  498. // deep: true,
  499. // immediate: true,
  500. // }
  501. // );
  502. watch(
  503. () => route,
  504. (val, old) => {
  505. if (route.params.typeVal != "booststation") {
  506. state.deviceId = route.params.deviceId || "";
  507. state.alarmId = route.params.alarmId || "";
  508. state.typeVal = route.params.typeVal || "windturbine";
  509. } else {
  510. state.stationName = route.params.deviceId;
  511. state.stationId = route.params.stationId;
  512. state.deviceId = "";
  513. state.alarmId = route.params.alarmId || "";
  514. state.typeVal = route.params.typeVal || "booststation";
  515. }
  516. state.isshowwindturbineName =
  517. state.typeVal == "booststation" ? false : true;
  518. getStationList();
  519. },
  520. {
  521. deep: true,
  522. immediate: true,
  523. }
  524. );
  525. //型号列表
  526. const modelList = computed(() => {
  527. if (state.typeVal == "windturbine") {
  528. if (state.stationId == "") {
  529. return [];
  530. } else {
  531. state.modelId = route.params.deviceId
  532. ? ""
  533. : state.modelListAll[state.stationId]?.[0]?.id || "";
  534. return state.modelListAll[state.stationId];
  535. }
  536. } else {
  537. return [];
  538. }
  539. });
  540. //部件列表
  541. const componentList = computed(() => {
  542. if (state.typeVal == "windturbine") {
  543. if (state.stationId == "") {
  544. return [];
  545. } else {
  546. if (state.stationId.includes("FDC")) {
  547. return state.fetchListAll?.fjbj;
  548. } else {
  549. return state.fetchListAll?.gfbj;
  550. }
  551. }
  552. } else {
  553. return [];
  554. }
  555. });
  556. //get 风机
  557. const getWindturbineList = async () => {
  558. const { data } = await fetchWindturbineList(state.stationId);
  559. state.windturbineList = data;
  560. state.modelId = modelList.value?.[0]?.id || "";
  561. await getAlarmHistoryt();
  562. };
  563. const query = reactive({
  564. page: 1,
  565. limit: 20,
  566. pageTotal: null,
  567. });
  568. // 获取历史记录表
  569. const getAlarmHistoryt = async () => {
  570. // if (route.params.deviceId && route.params.alarmId) {
  571. // state.stationId = "";
  572. // }
  573. tableLoading.value = true;
  574. let params = {
  575. pageNum: query.page,
  576. pageSize: query.limit,
  577. alarmId: state.alarmId,
  578. alarmType: state.typeVal,
  579. stationid: state.stationId,
  580. deviceid: state.typeVal == "booststation" ? "" : state.deviceId,
  581. modelId: state.typeVal == "booststation" ? "" : state.modelId,
  582. components: state.components,
  583. description: state.description,
  584. begin: state.dateTime[0],
  585. end: state.dateTime[1],
  586. };
  587. const { data } = await alarm_history(params);
  588. tableLoading.value = false;
  589. query.pageTotal = data?.total;
  590. data?.ls?.forEach((ele) => {
  591. ele.isCloseName = ele.endts ? "已解除" : "未解除";
  592. ele.alarmTypeName =
  593. ele.alarmType === "booststation"
  594. ? "升压站"
  595. : ele.alarmType === "windturbine"
  596. ? "风机"
  597. : ele.alarmType === "inverter"
  598. ? "光伏"
  599. : "";
  600. ele.endtsName = ele.endts > 0 ? formatTime(ele.endts) : "";
  601. });
  602. state.tableData = data?.ls;
  603. };
  604. //报警类型变化
  605. const typechange = () => {
  606. state.alarmId = "";
  607. state.deviceId = "";
  608. state.isshowwindturbineName = state.typeVal == "booststation" ? false : true;
  609. };
  610. // 批量导出
  611. const export2Excel = async () => {
  612. let params = {
  613. pageNum: query.page,
  614. pageSize: query.pageTotal,
  615. alarmType: state.typeVal,
  616. stationid: state.stationId,
  617. deviceid: state.typeVal == "booststation" ? "" : state.deviceId,
  618. modelId: state.modelId,
  619. components: state.components,
  620. description: state.description,
  621. begin: state.dateTime[0],
  622. end: state.dateTime[1],
  623. };
  624. if (state.dateTime[1] - state.dateTime[0] > 6 * 24 * 60 * 60 * 1000) {
  625. this.$message({
  626. message: "导出时间范围不能大于7天",
  627. type: "warning",
  628. });
  629. } else {
  630. let tableHeader = [];
  631. let tableKey = [];
  632. const { data } = await alarm_history(params);
  633. if (state.isshowwindturbineName) {
  634. tableHeader = state.tableHeader.map((item) => item.title);
  635. tableKey = state.tableHeader.map((item) => item.code);
  636. } else {
  637. tableHeader = state.tableHeader1.map((item) => item.title);
  638. tableKey = state.tableHeader1.map((item) => item.code);
  639. }
  640. const stationName = stationList.value.find((ele) => {
  641. return ele.id === state.stationId;
  642. }).name;
  643. const fileName = `${stationName} ${state.dateTime[0]} ~ ${state.dateTime[1]} 数据表`;
  644. outExportExcel(
  645. tableHeader,
  646. tableKey,
  647. data.ls.map((item) => {
  648. return {
  649. ...item,
  650. ts: formatTime(item.ts),
  651. rank: tableFilter(item.rank),
  652. alarmtype: tableFilter(item.alarmtype),
  653. };
  654. }),
  655. fileName
  656. );
  657. ElMessage.success(`导出成功!`);
  658. }
  659. };
  660. // 分页导航
  661. const handlePageChange = (val) => {
  662. query.page = val;
  663. getAlarmHistoryt();
  664. };
  665. // 时间格式化
  666. const formatTime = (val) => {
  667. return dayjs(val).format("YYYY-MM-DD HH:mm:ss");
  668. };
  669. // 格式化
  670. const obj = {
  671. 1: "低级",
  672. 2: "低中级",
  673. 3: "中级",
  674. 4: "中高级",
  675. 5: "高级",
  676. booststation: "升压站",
  677. custom: "自定义",
  678. windturbine: "风机",
  679. };
  680. const messageTypeObj = {
  681. 1: "触发",
  682. 3: "解除",
  683. };
  684. const tableFilter = (val) => {
  685. return obj[val];
  686. };
  687. const messageTypeFilter = (val) => {
  688. return messageTypeObj[val];
  689. };
  690. </script>
  691. <style scoped lang="less">
  692. p {
  693. padding: 0;
  694. margin: 0;
  695. }
  696. .history-warning {
  697. height: 100%;
  698. width: 100%;
  699. padding: 0 20px;
  700. padding-bottom: 10px;
  701. .form-wrapper ::v-deep {
  702. display: flex;
  703. flex-direction: column;
  704. padding-top: 10px;
  705. .search-wrapper {
  706. display: flex;
  707. align-items: center;
  708. font-size: 14px;
  709. font-family: Microsoft YaHei;
  710. font-weight: 400;
  711. color: #b3b3b3;
  712. margin-bottom: 10px;
  713. .search-item {
  714. display: flex;
  715. margin-right: 10px;
  716. max-width: 220px;
  717. align-items: center;
  718. .label {
  719. margin-right: 10px;
  720. text-align: right;
  721. white-space: nowrap;
  722. // width: 60px;
  723. }
  724. .search-content {
  725. flex: 1;
  726. }
  727. }
  728. }
  729. .btns {
  730. display: flex;
  731. justify-content: flex-end;
  732. margin-right: 10px;
  733. }
  734. .buttons {
  735. background-color: rgba(5, 187, 76, 0.2);
  736. border: 1px solid #3b6c53;
  737. color: #b3b3b3;
  738. font-size: 14px;
  739. &:hover {
  740. background-color: rgba(5, 187, 76, 0.5);
  741. color: #ffffff;
  742. }
  743. }
  744. }
  745. .table-wrapper {
  746. height: calc(100% - 82px);
  747. width: 100%;
  748. .leftContent {
  749. width: 242px;
  750. height: 41px;
  751. display: flex;
  752. align-items: center;
  753. background: url("~@/assets/imgs/title_left_bg1.png") no-repeat;
  754. span {
  755. font-size: 16px;
  756. font-family: Microsoft YaHei;
  757. font-weight: 400;
  758. color: #05bb4c;
  759. margin-left: 25px;
  760. }
  761. }
  762. .pagination-wrapper :deep {
  763. text-align: right;
  764. margin-top: 10px;
  765. }
  766. }
  767. }
  768. </style>