index.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798
  1. <template>
  2. <div class="dataAnalysisAgcAna" :class="!theme ? 'themeDark' : 'themeLight'">
  3. <div class="dataAnalysisAgcAnaMain">
  4. <div class="main_top">
  5. <p class="topPsty">AGC曲线偏差分析</p>
  6. <search-cop @submit="funSubmit"> </search-cop>
  7. </div>
  8. <div class="main">
  9. <div class="tableDataMain">
  10. <el-tabs v-model="activeTab" style="width: 100%">
  11. <el-tab-pane label="图表展示" name="2">
  12. <div
  13. :style="{
  14. height:
  15. typeof tableHeight === 'string'
  16. ? 'calc(' + tableHeight + ' + ' + paginationHeight + 'px)'
  17. : tableHeight + paginationHeight + 'px',
  18. width: '100%',
  19. }"
  20. class="p-[10px]"
  21. >
  22. <CurrentScatterChart
  23. ref="chartRef"
  24. :width="tableWidth"
  25. :height="`calc( ${tableHeight} + ${paginationHeight}px - 20px)`"
  26. :chartTitle="''"
  27. :xAxisData="xAxisData"
  28. :yAxisData="{ splitLine: { show: false } }"
  29. :seriesData="seriesData"
  30. :showLegend="true"
  31. :brushSelected="false"
  32. :dataSet="dataSet"
  33. @getSelected="funChartSelect"
  34. />
  35. </div>
  36. </el-tab-pane>
  37. <el-tab-pane label="表格数据" name="1">
  38. <table-cop
  39. :data="tableData"
  40. :loading="tableLoading"
  41. :column="tableColumn"
  42. :height="tableHeight"
  43. :tableId="tableShowId"
  44. :tableName="tableName"
  45. >
  46. </table-cop>
  47. <el-pagination layout="prev, pager, next" :total="50" />
  48. </el-tab-pane>
  49. <el-tab-pane
  50. :label="`超限测点 (${abnormalPoint.length}个)`"
  51. name="3"
  52. >
  53. <el-table
  54. :data="abnormalPoint"
  55. style="width: 100%"
  56. :max-height="tableHeight"
  57. >
  58. <el-table-column
  59. prop="date"
  60. label="时间"
  61. width="180"
  62. align="center"
  63. />
  64. <el-table-column
  65. filter-class-name="currentFilter"
  66. prop="name"
  67. label="超限原因 (点击定位至图表位置)"
  68. width="400"
  69. align="center"
  70. :filters="[
  71. { text: '低于下限', value: '低于下限' },
  72. { text: '高于上限', value: '高于上限' },
  73. ]"
  74. :filter-method="tableFilterMethod"
  75. >
  76. <template #default="scoped">
  77. <p style="cursor: pointer" @click="createMark(scoped.row)">
  78. <span
  79. :style="`color:${scoped.row.color}; margin-right: 8px;`"
  80. >
  81. {{ scoped.row.res }}
  82. </span>
  83. <el-icon
  84. ><component
  85. :is="scoped.row.icon"
  86. :color="scoped.row.color"
  87. /></el-icon>
  88. </p>
  89. </template>
  90. </el-table-column>
  91. <el-table-column
  92. prop="value"
  93. label="测点值"
  94. width="180"
  95. align="center"
  96. />
  97. <el-table-column
  98. prop="jud"
  99. label="限值"
  100. width="180"
  101. align="center"
  102. />
  103. </el-table>
  104. <!-- <el-pagination
  105. layout="total, sizes, prev, pager, next, jumper"
  106. v-model:current-page="paginationCurrentPage"
  107. v-model:page-size="paginationPageSize"
  108. :total="paginationTotal"
  109. :page-sizes="[50, 100, 200, 500, 1000]"
  110. @size-change="paginationSizeChange"
  111. @current-change="paginationCurrentChange"
  112. /> -->
  113. </el-tab-pane>
  114. </el-tabs>
  115. </div>
  116. </div>
  117. </div>
  118. </div>
  119. </template>
  120. <script setup name="prepare">
  121. import searchCop from "./components/search.vue";
  122. import tableCop from "@/components/generatingCapacityComponent/table.vue";
  123. import { ElMessage } from "element-plus";
  124. import { onMounted, ref, onActivated, watch } from "vue";
  125. import { useStore } from "vuex";
  126. import CurrentScatterChart from "./components/current-scatter-chart.vue";
  127. import httpRequest from "@/utils/request.js";
  128. import dayjs from "dayjs";
  129. import agcJson from "./agcJson.json";
  130. import * as echarts from "echarts";
  131. import jsonData from "./components/data.json";
  132. const tableDataSource = ref([]);
  133. const paginationCurrentPage = ref(1);
  134. const paginationPageSize = ref(100);
  135. const paginationTotal = ref(0);
  136. const paginationSizeChange = (size) => {};
  137. const paginationCurrentChange = (page) => {};
  138. const tableFilterMethod = (value, row) => {
  139. return row.res === value;
  140. };
  141. /**配置参数 */
  142. const paginationHeight = ref(10);
  143. const tableWidth = ref(window.innerWidth - 200 + "px");
  144. const tableHeight = ref(
  145. window.innerHeight - 170 - paginationHeight.value + "px"
  146. );
  147. const treeHeight = ref(window.innerHeight - 170 + "px"); //tree高度
  148. const excelHeight = ref(window.innerHeight - 170 + "px"); //excel高度
  149. /**excel 开始 */
  150. const excelList = ref([]);
  151. const funExcelChange = async (obj) => {
  152. //点击excel项时
  153. activeTab.value = "1";
  154. tableShowId.value = obj.id;
  155. tableName.value = obj.name;
  156. tableLoading.value = true;
  157. const res = await httpRequest.get("/power/prepare/show", {
  158. params: {
  159. id: obj.id,
  160. },
  161. });
  162. if (res.code === 200) {
  163. tableColumn.value = res.data.title.map((o) => {
  164. return {
  165. prop: o.key,
  166. label: o.des,
  167. width: o.des === "时间" ? 100 : 80,
  168. };
  169. });
  170. tableData.value = res.data.data;
  171. tableLoading.value = false;
  172. } else {
  173. tableLoading.value = false;
  174. }
  175. };
  176. /**tree 开始 */
  177. const treeData = ref([]);
  178. const funRepeatMap = (arr) => {
  179. return arr.map((o) => {
  180. if (o.children) {
  181. const findIndex = o.children.findIndex((p) => !!p.type);
  182. if (findIndex !== -1) {
  183. o.childs = o.children;
  184. o.children = [];
  185. }
  186. }
  187. return {
  188. ...o,
  189. children: o.children.length ? funRepeatMap(o.children) : [],
  190. };
  191. });
  192. };
  193. const funGetTree = async () => {
  194. const res = await httpRequest.get("/power/prepare/tree");
  195. treeData.value = funRepeatMap(res.data);
  196. excelList.value = [];
  197. };
  198. const funCurrentChange = ({ current, currentNode }) => {
  199. if (current.childs) {
  200. excelList.value = current.childs.map((o) => {
  201. return {
  202. id: o.id,
  203. interval: o.interval,
  204. path: o.path,
  205. prepareid: o.prepareid,
  206. station: o.station,
  207. time: o.time,
  208. type: o.type,
  209. windturbine: o.windturbine,
  210. name: o.path.substring(
  211. o.path.indexOf(o.station + "_") + (o.station + "_").length
  212. ),
  213. };
  214. });
  215. } else {
  216. excelList.value = [];
  217. }
  218. };
  219. /**table 开始 */
  220. const tableShowId = ref("");
  221. const tableName = ref("");
  222. const tableColumn = ref([]);
  223. const tableLoading = ref(false);
  224. const tableData = ref([]);
  225. /**tab */
  226. const activeTab = ref("1");
  227. /**chart Data */
  228. const xAxisData = ref([]);
  229. const chartRef = ref(); //chart 的ref
  230. const seriesData = ref([]);
  231. const dataSet = ref("");
  232. const funChartSelect = async (batch) => {
  233. return false;
  234. };
  235. const createMark = (markInfo) => {
  236. activeTab.value = "2";
  237. chartRef.value.initChart(markInfo);
  238. };
  239. /**submit */
  240. const funSubmit = async (params) => {
  241. activeTab.value = "2";
  242. tableShowId.value = "";
  243. tableName.value = "AGC曲线分析";
  244. tableLoading.value = true;
  245. const res = await httpRequest.get("/agc/deviate", {
  246. params: params,
  247. });
  248. // const res = agcJson
  249. tableColumn.value = [
  250. {
  251. prop: "ts",
  252. label: "时间",
  253. width: 100,
  254. },
  255. {
  256. prop: "ygsdxz",
  257. label: "有功设定限值",
  258. width: 80,
  259. },
  260. {
  261. prop: "sfyg",
  262. label: "实发有功",
  263. width: 80,
  264. },
  265. {
  266. prop: "llgl",
  267. label: "理论功率",
  268. width: 80,
  269. },
  270. {
  271. prop: "pcsx",
  272. label: "偏差上限",
  273. width: 80,
  274. },
  275. {
  276. prop: "pcxx",
  277. label: "偏差下限",
  278. width: 100,
  279. },
  280. ];
  281. const tableArr = [];
  282. const tsArr = [];
  283. const ygsdxz = [];
  284. const sfyg = [];
  285. const llgl = [];
  286. const pcsx = [];
  287. const pcxx = [];
  288. res["有功设定限值"].values.map((o, index) => {
  289. tsArr.push(dayjs(o.ts).format("YYYY-MM-DD HH:mm:ss"));
  290. ygsdxz.push(Number(o.value).toFixed(2));
  291. if (res["实发有功"].values.length > 0) {
  292. sfyg.push(Number(res["实发有功"].values[index].value).toFixed(2));
  293. }
  294. if (res["理论功率"].values.length > 0) {
  295. llgl.push(Number(res["理论功率"].values[index].value).toFixed(2));
  296. }
  297. if (res["偏差上限"].values.length > 0) {
  298. pcsx.push(Number(res["偏差上限"].values[index].value).toFixed(2));
  299. }
  300. if (res["偏差下限"].values.length > 0) {
  301. pcxx.push(Number(res["偏差下限"].values[index].value).toFixed(2));
  302. }
  303. tableArr.push({
  304. ts: dayjs(o.ts).format("YYYY-MM-DD HH:mm:ss"),
  305. ygsdxz: Number(o.value).toFixed(2),
  306. sfyg:
  307. res["实发有功"].values.length > 0
  308. ? Number(res["实发有功"].values[index].value).toFixed(2)
  309. : "-",
  310. llgl:
  311. res["理论功率"].values.length > 0
  312. ? Number(res["理论功率"].values[index].value).toFixed(2)
  313. : "-",
  314. pcsx:
  315. res["偏差上限"].values.length > 0
  316. ? Number(res["偏差上限"].values[index].value).toFixed(2)
  317. : "-",
  318. pcxx:
  319. res["偏差下限"].values.length > 0
  320. ? Number(res["偏差下限"].values[index].value).toFixed(2)
  321. : "-",
  322. });
  323. });
  324. xAxisData.value = tableArr.map((o) => o.ts);
  325. seriesData.value = [
  326. {
  327. name: "有功设定限值",
  328. type: "line",
  329. symbol: "line", //设定为实心点
  330. symbolSize: 0, //设定实心点的大小
  331. smooth: false, //这个是把线变成曲线
  332. data: ygsdxz,
  333. xAxisIndex: 0,
  334. lineStyle: { color: "#67c23a" },
  335. large: true,
  336. },
  337. {
  338. name: "实发有功",
  339. type: "line",
  340. symbol: "line", //设定为实心点
  341. symbolSize: 0, //设定实心点的大小
  342. smooth: false, //这个是把线变成曲线
  343. data: sfyg,
  344. xAxisIndex: 0,
  345. lineStyle: { color: "rgb(242.5, 208.5, 157.5)" },
  346. large: true,
  347. markPoint: {
  348. symbolSize: 36,
  349. itemStyle: {
  350. color: "#f60", // 特殊颜色
  351. },
  352. emphasis: {
  353. itemStyle: {
  354. color: "#fff",
  355. },
  356. },
  357. blur: {
  358. itemStyle: {
  359. opacity: 1,
  360. },
  361. },
  362. data: [],
  363. },
  364. },
  365. {
  366. name: "理论功率",
  367. type: "line",
  368. symbol: "line", //设定为实心点
  369. symbolSize: 0, //设定实心点的大小
  370. smooth: false, //这个是把线变成曲线
  371. data: llgl,
  372. xAxisIndex: 0,
  373. lineStyle: { color: "#f56c6c" },
  374. large: true,
  375. },
  376. {
  377. name: "偏差上限",
  378. type: "line",
  379. symbol: "line", //设定为实心点
  380. symbolSize: 0, //设定实心点的大小
  381. smooth: false, //这个是把线变成曲线
  382. data: pcsx,
  383. xAxisIndex: 0,
  384. lineStyle: { color: "#64b5f6", opacity: 0 },
  385. symbol: "none",
  386. large: true,
  387. },
  388. {
  389. name: "偏差下限",
  390. type: "line",
  391. symbol: "line", //设定为实心点
  392. symbolSize: 0, //设定实心点的大小
  393. smooth: false, //这个是把线变成曲线
  394. data: pcxx,
  395. xAxisIndex: 0,
  396. lineStyle: { color: "#ffb74d", opacity: 0 },
  397. symbol: "none",
  398. large: true,
  399. },
  400. ];
  401. tableData.value = tableArr;
  402. tableLoading.value = false;
  403. tableShowId.value = "1";
  404. let abnormalPointTemp = [];
  405. seriesData.value[1].data.forEach((ele, index) => {
  406. if (parseFloat(ele) > parseFloat(seriesData.value[3].data[index])) {
  407. abnormalPointTemp.push({
  408. date: tsArr[index],
  409. value: parseFloat(ele),
  410. jud: seriesData.value[3].data[index],
  411. res: "高于上限",
  412. color: "#f25656",
  413. icon: "Top",
  414. dataIndex: index,
  415. });
  416. } else if (parseFloat(ele) < parseFloat(seriesData.value[4].data[index])) {
  417. abnormalPointTemp.push({
  418. date: tsArr[index],
  419. value: parseFloat(ele),
  420. jud: seriesData.value[4].data[index],
  421. res: "低于下限",
  422. color: "#1890ff",
  423. icon: "Bottom",
  424. dataIndex: index,
  425. });
  426. }
  427. });
  428. abnormalPoint.value = abnormalPointTemp;
  429. // if (res.code === 200) {
  430. // if(res.data.sjgl?.length){
  431. // for(const wtObj of res.data.sjgl){
  432. // seriesData.value.push(
  433. // {
  434. // name: wtObj.obj.windturbine + "\n实际功率",
  435. // type: "line",
  436. // symbol: "line", //设定为实心点
  437. // symbolSize: 0, //设定实心点的大小
  438. // smooth: true, //这个是把线变成曲线
  439. // data: wtObj.sjgl || [],
  440. // xAxisIndex: 0,
  441. // },
  442. // )
  443. // wtData.value.push(wtObj.obj)
  444. // }
  445. // }
  446. // }
  447. };
  448. /**created */
  449. // funGetTree()
  450. const theme = ref(null);
  451. const echartsTheme = ref("");
  452. const store = useStore();
  453. watch(
  454. () => store.state.theme,
  455. (newVal, oldVal) => {
  456. theme.value = newVal;
  457. echartsTheme.value = !newVal ? "dark" : "";
  458. // funSubmit();
  459. },
  460. {
  461. deep: true,
  462. }
  463. );
  464. const abnormalPoint = ref([]);
  465. const initPageData = () => {
  466. activeTab.value = "2";
  467. tableShowId.value = "";
  468. tableName.value = "AGC曲线分析";
  469. tableLoading.value = true;
  470. const res = JSON.parse(JSON.stringify(jsonData.deviateData));
  471. // const res = agcJson
  472. tableColumn.value = [
  473. {
  474. prop: "ts",
  475. label: "时间",
  476. width: 100,
  477. },
  478. {
  479. prop: "ygsdxz",
  480. label: "有功设定限值",
  481. width: 80,
  482. },
  483. {
  484. prop: "sfyg",
  485. label: "实发有功",
  486. width: 80,
  487. },
  488. {
  489. prop: "llgl",
  490. label: "理论功率",
  491. width: 80,
  492. },
  493. {
  494. prop: "pcsx",
  495. label: "偏差上限",
  496. width: 80,
  497. },
  498. {
  499. prop: "pcxx",
  500. label: "偏差下限",
  501. width: 100,
  502. },
  503. ];
  504. const tableArr = [];
  505. const tsArr = [];
  506. const ygsdxz = [];
  507. const sfyg = [];
  508. const llgl = [];
  509. const pcsx = [];
  510. const pcxx = [];
  511. res["有功设定限值"].values.map((o, index) => {
  512. tsArr.push(dayjs(o.ts).format("YYYY-MM-DD HH:mm:ss"));
  513. ygsdxz.push(Number(o.value).toFixed(2));
  514. if (res["实发有功"].values.length > 0) {
  515. sfyg.push(Number(res["实发有功"].values[index].value).toFixed(2));
  516. }
  517. if (res["理论功率"].values.length > 0) {
  518. llgl.push(Number(res["理论功率"].values[index].value).toFixed(2));
  519. }
  520. if (res["偏差上限"].values.length > 0) {
  521. pcsx.push(Number(res["偏差上限"].values[index].value).toFixed(2));
  522. }
  523. if (res["偏差下限"].values.length > 0) {
  524. pcxx.push(Number(res["偏差下限"].values[index].value).toFixed(2));
  525. }
  526. tableArr.push({
  527. ts: dayjs(o.ts).format("YYYY-MM-DD HH:mm:ss"),
  528. ygsdxz: Number(o.value).toFixed(2),
  529. sfyg:
  530. res["实发有功"].values.length > 0
  531. ? Number(res["实发有功"].values[index].value).toFixed(2)
  532. : "-",
  533. llgl:
  534. res["理论功率"].values.length > 0
  535. ? Number(res["理论功率"].values[index].value).toFixed(2)
  536. : "-",
  537. pcsx:
  538. res["偏差上限"].values.length > 0
  539. ? Number(res["偏差上限"].values[index].value).toFixed(2)
  540. : "-",
  541. pcxx:
  542. res["偏差下限"].values.length > 0
  543. ? Number(res["偏差下限"].values[index].value).toFixed(2)
  544. : "-",
  545. });
  546. });
  547. xAxisData.value = tableArr.map((o) => o.ts);
  548. seriesData.value = [
  549. {
  550. name: "有功设定限值",
  551. type: "line",
  552. symbol: "line", //设定为实心点
  553. symbolSize: 0, //设定实心点的大小
  554. smooth: false, //这个是把线变成曲线
  555. data: ygsdxz,
  556. xAxisIndex: 0,
  557. lineStyle: { color: "#67c23a" },
  558. large: true,
  559. },
  560. {
  561. name: "实发有功",
  562. type: "line",
  563. symbol: "line", //设定为实心点
  564. symbolSize: 0, //设定实心点的大小
  565. smooth: false, //这个是把线变成曲线
  566. data: sfyg,
  567. xAxisIndex: 0,
  568. lineStyle: { color: "rgb(242.5, 208.5, 157.5)" },
  569. large: true,
  570. markPoint: {
  571. symbolSize: 36,
  572. itemStyle: {
  573. color: "#f60", // 特殊颜色
  574. },
  575. emphasis: {
  576. itemStyle: {
  577. color: "#fff",
  578. },
  579. },
  580. blur: {
  581. itemStyle: {
  582. opacity: 1,
  583. },
  584. },
  585. data: [],
  586. },
  587. },
  588. {
  589. name: "理论功率",
  590. type: "line",
  591. symbol: "line", //设定为实心点
  592. symbolSize: 0, //设定实心点的大小
  593. smooth: false, //这个是把线变成曲线
  594. data: llgl,
  595. xAxisIndex: 0,
  596. lineStyle: { color: "#f56c6c" },
  597. large: true,
  598. },
  599. {
  600. name: "偏差上限",
  601. type: "line",
  602. symbol: "line", //设定为实心点
  603. symbolSize: 0, //设定实心点的大小
  604. smooth: false, //这个是把线变成曲线
  605. data: pcsx,
  606. xAxisIndex: 0,
  607. lineStyle: { color: "#64b5f6", opacity: 0 },
  608. symbol: "none",
  609. large: true,
  610. },
  611. {
  612. name: "偏差下限",
  613. type: "line",
  614. symbol: "line", //设定为实心点
  615. symbolSize: 0, //设定实心点的大小
  616. smooth: false, //这个是把线变成曲线
  617. data: pcxx,
  618. xAxisIndex: 0,
  619. lineStyle: { color: "#ffb74d", opacity: 0 },
  620. symbol: "none",
  621. large: true,
  622. },
  623. ];
  624. tableData.value = tableArr;
  625. tableLoading.value = false;
  626. tableShowId.value = "1";
  627. let abnormalPointTemp = [];
  628. seriesData.value[1].data.forEach((ele, index) => {
  629. if (parseFloat(ele) > parseFloat(seriesData.value[3].data[index])) {
  630. abnormalPointTemp.push({
  631. date: tsArr[index],
  632. value: parseFloat(ele),
  633. jud: seriesData.value[3].data[index],
  634. res: "高于上限",
  635. color: "#f25656",
  636. icon: "Top",
  637. dataIndex: index,
  638. });
  639. } else if (parseFloat(ele) < parseFloat(seriesData.value[4].data[index])) {
  640. abnormalPointTemp.push({
  641. date: tsArr[index],
  642. value: parseFloat(ele),
  643. jud: seriesData.value[4].data[index],
  644. res: "低于下限",
  645. color: "#1890ff",
  646. icon: "Bottom",
  647. dataIndex: index,
  648. });
  649. }
  650. });
  651. abnormalPoint.value = abnormalPointTemp;
  652. };
  653. /**mounted */
  654. onMounted(() => {
  655. initPageData();
  656. // funSubmit();
  657. theme.value = store.state.theme;
  658. echartsTheme.value = !theme.value ? "dark" : "";
  659. tableWidth.value = window.innerWidth - 200 + "px";
  660. tableHeight.value = window.innerHeight - 170 - paginationHeight.value + "px";
  661. excelHeight.value = window.innerHeight - 170 + "px";
  662. treeHeight.value = window.innerHeight - 170 + "px";
  663. window.addEventListener("resize", () => {
  664. tableWidth.value = window.innerWidth - 200 + "px";
  665. tableHeight.value =
  666. window.innerHeight - 170 - paginationHeight.value + "px";
  667. excelHeight.value = window.innerHeight - 170 + "px";
  668. treeHeight.value = window.innerHeight - 170 + "px";
  669. });
  670. });
  671. /**activated */
  672. onActivated(() => {
  673. // funGetTree()
  674. // funSubmit()
  675. });
  676. </script>
  677. <style lang="less" scoped>
  678. .dataAnalysisAgcAna {
  679. height: 100%;
  680. .dataAnalysisAgcAnaMain {
  681. height: 100%;
  682. .main_top {
  683. height: 40px;
  684. display: flex;
  685. align-items: center;
  686. .topPsty {
  687. position: relative;
  688. top: 5px;
  689. padding: 7px 20px;
  690. font-size: 12px;
  691. font-weight: 600;
  692. margin-left: 10px;
  693. border-radius: 3px;
  694. }
  695. .seach {
  696. padding: 20px 0 0 20px;
  697. }
  698. }
  699. .main {
  700. display: flex;
  701. justify-content: space-between;
  702. // width: calc(100% - 40px);
  703. width: 100%;
  704. .tableDataMain {
  705. padding: 10px;
  706. border-radius: 10px;
  707. width: calc(100% - 20px);
  708. position: relative;
  709. .el-tabs__content,
  710. .el-tab-pane {
  711. width: 100%;
  712. }
  713. .butten_com {
  714. position: absolute;
  715. right: 20px;
  716. z-index: 111111;
  717. }
  718. }
  719. }
  720. }
  721. }
  722. .themeDark {
  723. .dataAnalysisAgcAnaMain {
  724. .main_top {
  725. .topPsty {
  726. color: #1c99ff;
  727. background: #1e2126;
  728. }
  729. }
  730. .main {
  731. background: #13171e;
  732. .treeDataMain {
  733. background: transparent;
  734. }
  735. .excelDataMain {
  736. background: #313233;
  737. }
  738. .tableDataMain {
  739. margin-top: 5px;
  740. background: #212223;
  741. }
  742. }
  743. }
  744. }
  745. .themeLight {
  746. padding: 0;
  747. .dataAnalysisAgcAnaMain {
  748. .main_top {
  749. .topPsty {
  750. color: #2778ff;
  751. background: #ffffff;
  752. }
  753. }
  754. .main {
  755. background: #e6e8f2;
  756. .treeDataMain {
  757. background: transparent;
  758. }
  759. .excelDataMain {
  760. background: #f4f6fb;
  761. }
  762. .tableDataMain {
  763. background: #fff;
  764. margin-top: 5px;
  765. }
  766. }
  767. }
  768. }
  769. </style>