index.vue 22 KB

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