index.vue 22 KB

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