index.vue 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967
  1. <template>
  2. <div class="draught-fan-list">
  3. <div class="form-wrapper">
  4. <div class="search mg-b-8">
  5. <div class="search-items">
  6. <div class="search-item">
  7. <div class="lable">电站:</div>
  8. <div class="search-content">
  9. <el-select
  10. v-model="station"
  11. clearable
  12. size="mini"
  13. placeholder="请选择"
  14. popper-class="select"
  15. @change="
  16. (station) => {
  17. getWt(station, true);
  18. }
  19. "
  20. >
  21. <el-option
  22. v-for="item in wpArray"
  23. :key="item.id"
  24. :value="item.id"
  25. :label="item.name"
  26. />
  27. </el-select>
  28. </div>
  29. </div>
  30. <div class="search-item">
  31. <div class="lable">设备:</div>
  32. <div class="search-content">
  33. <el-select
  34. v-model="inverters"
  35. clearable
  36. :multiple="isMultiple"
  37. collapse-tags
  38. collapse-tags-tooltip
  39. size="mini"
  40. placeholder="请选择"
  41. popper-class="select"
  42. >
  43. <el-checkbox
  44. v-if="isMultiple"
  45. v-model="checked"
  46. :indeterminate="indeterminate"
  47. @change="selectAll"
  48. >全选</el-checkbox
  49. >
  50. <el-option
  51. v-for="item in wtArray"
  52. :key="item.id"
  53. :value="item.id"
  54. :label="item.name"
  55. />
  56. </el-select>
  57. </div>
  58. </div>
  59. <div class="search-item">
  60. <div class="lable">开始时间:</div>
  61. <div class="search-content">
  62. <el-date-picker
  63. v-model="startdate"
  64. type="datetime"
  65. size="mini"
  66. :disabled-date="disabledDate"
  67. placeholder="选择日期时间"
  68. popper-class="date-select"
  69. >
  70. </el-date-picker>
  71. </div>
  72. </div>
  73. <div class="search-item">
  74. <div class="lable">结束时间:</div>
  75. <div class="search-content">
  76. <el-date-picker
  77. v-model="enddate"
  78. type="datetime"
  79. :disabled-date="disabledDate2"
  80. size="mini"
  81. placeholder="选择日期时间"
  82. popper-class="date-select"
  83. >
  84. </el-date-picker>
  85. </div>
  86. </div>
  87. <div class="search-item custom">
  88. <div class="lable">等间隔:</div>
  89. <div class="search-content" style="width: 530px">
  90. <el-radio-group v-model="interval">
  91. <el-radio
  92. v-for="item in radioList"
  93. :key="item.code"
  94. size="mini"
  95. :label="item.code"
  96. >{{ item.name }}</el-radio
  97. >
  98. </el-radio-group>
  99. </div>
  100. </div>
  101. </div>
  102. <div class="search-actions">
  103. <el-button size="mini" class="btn-search" @click="search"
  104. >曲线拟合</el-button
  105. >
  106. <!-- <el-button
  107. size="mini"
  108. :class="{ 'btn-active': isChartArea }"
  109. :disabled="!seriesData?.length"
  110. @click="funChartArea"
  111. >区域划分</el-button
  112. > -->
  113. </div>
  114. </div>
  115. <div class="search mg-b-8">
  116. <div class="search-items">
  117. <div class="search-item">
  118. <div class="lable">最大辐照强度:</div>
  119. <div class="search-content">
  120. <el-input-number
  121. v-model="maxs"
  122. size="mini"
  123. clearable
  124. :min="mins + 1"
  125. :max="5000"
  126. placeholder="请选择"
  127. popper-class="select"
  128. >
  129. </el-input-number>
  130. </div>
  131. </div>
  132. <div class="search-item">
  133. <div class="lable">最小辐照强度:</div>
  134. <div class="search-content">
  135. <el-input-number
  136. v-model="mins"
  137. size="mini"
  138. clearable
  139. :min="0"
  140. :max="maxs - 1"
  141. placeholder="请选择"
  142. popper-class="select"
  143. >
  144. </el-input-number>
  145. </div>
  146. </div>
  147. <div class="search-item">
  148. <div class="lable">最大功率:</div>
  149. <div class="search-content">
  150. <el-input-number
  151. v-model="maxpower"
  152. size="mini"
  153. clearable
  154. :min="minpower + 1"
  155. placeholder="请选择"
  156. popper-class="select"
  157. >
  158. </el-input-number>
  159. </div>
  160. </div>
  161. <div class="search-item">
  162. <div class="lable">最小功率:</div>
  163. <div class="search-content">
  164. <el-input-number
  165. v-model="minpower"
  166. size="mini"
  167. :min="0"
  168. clearable
  169. placeholder="请选择"
  170. popper-class="select"
  171. >
  172. </el-input-number>
  173. </div>
  174. </div>
  175. <div class="search-item">
  176. <div class="lable">多项式:</div>
  177. <div class="search-content">
  178. <el-select v-model="dimension" size="mini">
  179. <el-option
  180. v-for="item in 10"
  181. :key="item"
  182. :value="item"
  183. :label="item"
  184. />
  185. </el-select>
  186. </div>
  187. </div>
  188. <div class="search-item">
  189. <div class="lable">拟合方式:</div>
  190. <div class="search-content">
  191. <el-select v-model="mode" size="mini">
  192. <el-option
  193. v-for="item in selectList"
  194. :key="item.code"
  195. size="mini"
  196. :value="item.code"
  197. :label="item.name"
  198. />
  199. </el-select>
  200. </div>
  201. </div>
  202. </div>
  203. </div>
  204. </div>
  205. <div style="height: calc(100% - 40px); padding-bottom: 10px">
  206. <el-tabs v-model="activeTab">
  207. <el-tab-pane label="图表展示" name="2"> </el-tab-pane>
  208. <div style="height: 100%">
  209. <CurrentScatterChart
  210. ref="chartRef"
  211. width="100%"
  212. height="100%"
  213. :chartTitle="''"
  214. :xAxisData="xAxisData"
  215. :yAxisData="{ splitLine: { show: false } }"
  216. :seriesData="seriesData"
  217. :showLegend="true"
  218. :brushSelected="isChartArea"
  219. :dataSet="dataSet"
  220. @getSelected="funChartSelect"
  221. @closeBrush="
  222. (val) => {
  223. isChartArea = val;
  224. }
  225. "
  226. />
  227. </div>
  228. </el-tabs>
  229. </div>
  230. <el-dialog v-model="wtDialog" width="60%" top="120px" draggable>
  231. <template #title>
  232. <div class="dialog-title">
  233. <div class="title">设备功率点位</div>
  234. </div>
  235. </template>
  236. <el-tabs v-model="wtTab">
  237. <el-tab-pane label="数据" name="table">
  238. <el-table :data="wtData" row-key="id" :max-height="550">
  239. <el-table-column property="inverter" align="center" label="设备" />
  240. <el-table-column
  241. property="datetime"
  242. sortable
  243. width="200"
  244. align="center"
  245. label="时间"
  246. />
  247. <el-table-column
  248. property="S"
  249. sortable
  250. width="140"
  251. align="center"
  252. label="光照(W/m²)"
  253. />
  254. <el-table-column
  255. property="actualP"
  256. sortable
  257. width="140"
  258. align="center"
  259. label="功率(kW)"
  260. />
  261. <el-table-column
  262. property="T"
  263. sortable
  264. width="140"
  265. align="center"
  266. label="温度(℃)"
  267. />
  268. <el-table-column
  269. property="filter"
  270. sortable
  271. width="140"
  272. align="center"
  273. label="是否有用点"
  274. />
  275. </el-table>
  276. </el-tab-pane>
  277. <el-tab-pane label="故障" name="problem" disabled> </el-tab-pane>
  278. <el-tab-pane label="预警" name="warning" disabled> </el-tab-pane>
  279. </el-tabs>
  280. </el-dialog>
  281. </div>
  282. </template>
  283. <script>
  284. // import ScatterLineChart from "@com/chart/combination/scatter-line-chart.vue";
  285. import tableCop from "./components/table.vue";
  286. import CurrentScatterChart from "./components/current-scatter-chart.vue";
  287. import api1 from "@api/economic/index.js";
  288. // import api from "@api/wisdomOverhaul/energy/index.js";
  289. import dayjs from "dayjs";
  290. import {
  291. getIntervers,
  292. getPowerFittingGF,
  293. getPowerHotChartGF,
  294. getPowerFittingChart,
  295. getPowerFittingTable,
  296. getPowerFittingSelectedChartGF,
  297. } from "@/api/powerAnalyse.js";
  298. export default {
  299. // 名称
  300. name: "powerHotAnalyse",
  301. // 使用组件
  302. components: {
  303. // ScatterLineChart,
  304. CurrentScatterChart,
  305. tableCop,
  306. },
  307. // 数据
  308. data() {
  309. return {
  310. activeTab: "2",
  311. checkList: [
  312. { name: "非并网", code: "isfbw" },
  313. { name: "非合理值", code: "isfhl" },
  314. { name: "并网后十分钟", code: "isbw" },
  315. { name: "停机前十分钟", code: "istj" },
  316. { name: "功率曲线偏差", code: "isglpc" },
  317. ],
  318. selectList: [
  319. { name: "单台拟合", code: 0 },
  320. { name: "合并拟合", code: 1 },
  321. // { name: "同名拟合", code: 2 },
  322. ],
  323. radioList: [
  324. { name: "一秒钟", code: 1 },
  325. { name: "一分钟", code: 60 },
  326. { name: "十分钟", code: 600 },
  327. { name: "十五分钟", code: 900 },
  328. ],
  329. isAsc: "asc",
  330. wpArray: [],
  331. wtArray: [],
  332. station: "",
  333. inverters: "",
  334. startdate: dayjs()
  335. .add(-1, "month")
  336. // .startOf("month")
  337. .startOf("day")
  338. .format("YYYY-MM-DD HH:mm:ss"),
  339. enddate: dayjs().startOf("day").format("YYYY-MM-DD HH:mm:ss"),
  340. interval: 600,
  341. maxs: 5000,
  342. mins: 0,
  343. maxpower: 2500,
  344. minpower: 0,
  345. checkedList: ["isfbw", "isfhl", "isbw", "istj", "isglpc"],
  346. dimension: 10,
  347. mode: 0,
  348. fittingId: "",
  349. seriesData: [],
  350. avgObj: {
  351. //平均cpz等
  352. title: "",
  353. cpavg: "",
  354. frequency: "",
  355. pcratio: "",
  356. },
  357. markDot: {
  358. //3-5 point点等
  359. pcl5: null,
  360. pcl10: null,
  361. pcl12: null,
  362. pcl25: null,
  363. },
  364. xAxisData: [],
  365. dataSet: "",
  366. isChartArea: true,
  367. tableShowId: "",
  368. tableColumn: [],
  369. tableLoading: false,
  370. tableName: "",
  371. tableData: [],
  372. wtTab: "table",
  373. wtDialog: false,
  374. wtData: [],
  375. isMultiple: false,
  376. checked: false,
  377. indeterminate: false,
  378. };
  379. },
  380. created() {
  381. this.getWp();
  382. },
  383. watch: {
  384. mode(val) {
  385. if (val == 0) {
  386. this.isMultiple = false;
  387. this.inverters =
  388. typeof this.inverters == "string"
  389. ? this.inverters
  390. : this.inverters.length
  391. ? this.inverters[0]
  392. : [];
  393. } else {
  394. this.isMultiple = true;
  395. this.inverters =
  396. typeof this.inverters == "string"
  397. ? [this.inverters]
  398. : [...this.inverters];
  399. }
  400. },
  401. inverters: {
  402. handler(newVal, oldVal) {
  403. this.$nextTick(() => {
  404. if (this.isMultiple) {
  405. this.inverters = newVal;
  406. if (this.wtArray.length && this.inverters) {
  407. if (this.inverters.length === this.wtArray.length) {
  408. this.checked = true;
  409. this.indeterminate = false;
  410. } else if (this.inverters.length < this.wtArray.length) {
  411. this.checked = false;
  412. if (this.inverters.length != 0) {
  413. this.indeterminate = true;
  414. }
  415. if (newVal.length == 0) {
  416. this.$message.error("必须至少选择一项");
  417. this.inverters = oldVal;
  418. }
  419. }
  420. }
  421. }
  422. });
  423. },
  424. immediate: true,
  425. },
  426. },
  427. // 函数
  428. methods: {
  429. selectAll() {
  430. if (this.checked) {
  431. this.wtArray.forEach((item) => {
  432. this.inverters.push(item.id);
  433. });
  434. this.inverters = [...new Set(this.inverters)];
  435. this.indeterminate = false;
  436. } else {
  437. this.inverters = [this.wtArray[0].id];
  438. }
  439. },
  440. // 时间选择器第一个禁用
  441. disabledDate(time) {
  442. if (this.enddate) {
  443. return time.getTime() > Date.parse(this.enddate);
  444. } else {
  445. return null;
  446. }
  447. },
  448. // 时间选择器第二个禁用
  449. disabledDate2(time) {
  450. if (this.startdate) {
  451. return time.getTime() < Date.parse(this.startdate);
  452. } else {
  453. return null;
  454. }
  455. },
  456. // 获取风场
  457. getWp(reGetWp) {
  458. api1
  459. .getWpList({
  460. type: "-2",
  461. })
  462. .then((res) => {
  463. if (res.data.code === 200) {
  464. this.wpArray = res.data.data;
  465. this.station = res.data.data[0].id;
  466. this.getWt(this.station, reGetWp);
  467. }
  468. });
  469. },
  470. // 获取风机
  471. getWt(wpid, reGetWp) {
  472. if (wpid) {
  473. getIntervers({
  474. wpids: wpid,
  475. }).then(({ data: res }) => {
  476. if (res.code === 200) {
  477. this.wtArray = res.data;
  478. this.inverters = res.data.length
  479. ? this.isMultiple
  480. ? [res.data[0].id]
  481. : res.data[0].id
  482. : "";
  483. if (!reGetWp) {
  484. this.search();
  485. }
  486. }
  487. });
  488. }
  489. },
  490. //获取拟合id
  491. getChartId() {
  492. this.BASE.showLoading();
  493. this.activeTab = "2";
  494. let params = {
  495. station: this.station,
  496. inverters: this.isMultiple ? this.inverters.join(",") : this.inverters,
  497. startdate: dayjs(this.startdate).valueOf(),
  498. enddate: dayjs(this.enddate).valueOf(),
  499. interval: this.interval,
  500. maxs: this.maxs,
  501. mins: this.mins,
  502. maxpower: this.maxpower,
  503. minpower: this.minpower,
  504. };
  505. this.getChartData(params);
  506. },
  507. //清空数据
  508. clear() {
  509. this.fittingId = "";
  510. this.seriesData = [];
  511. this.avgObj = {
  512. //平均cpz等
  513. title: "",
  514. cpavg: "",
  515. frequency: "",
  516. pcratio: "",
  517. };
  518. this.markDot = {
  519. //3-5 point点等
  520. pcl5: null,
  521. pcl10: null,
  522. pcl12: null,
  523. pcl25: null,
  524. };
  525. this.xAxisData = [];
  526. this.dataSet = "";
  527. },
  528. //是否区域划分
  529. funChartArea() {
  530. this.BASE.showLoading();
  531. if (this.seriesData.length) {
  532. if (!this.isChartArea) {
  533. // 请求一下
  534. this.seriesData[0] = {
  535. ...this.seriesData[0],
  536. markLine: {
  537. symbol: "none",
  538. label: {
  539. show: false,
  540. },
  541. lineStyle: {
  542. color: "rgba(96,174,255, 1)",
  543. },
  544. data: [
  545. {
  546. xAxis: 3,
  547. valueIndex: 0,
  548. },
  549. {
  550. xAxis: 5,
  551. valueIndex: 0,
  552. },
  553. {
  554. xAxis: 10,
  555. valueIndex: 0,
  556. },
  557. {
  558. xAxis: 12,
  559. valueIndex: 0,
  560. },
  561. {
  562. xAxis: 25,
  563. valueIndex: 0,
  564. },
  565. ],
  566. },
  567. markArea: {
  568. label: {
  569. fontSize: 13,
  570. color: "#ccc",
  571. fontWeight: "normal",
  572. fontFamily: "Arial",
  573. },
  574. itemStyle: {
  575. color: "rgba(236,245,255, 0)",
  576. },
  577. emphasis: {
  578. itemStyle: {
  579. color: "rgba(96,174,255, 0.5)",
  580. },
  581. },
  582. data: [
  583. [
  584. {
  585. name: `3~5m 偏差率: ${this.markDot.pcl5}%`,
  586. xAxis: 3,
  587. },
  588. {
  589. xAxis: 5,
  590. },
  591. ],
  592. [
  593. {
  594. name: `5~10m 偏差率: ${this.markDot.pcl10}%`,
  595. xAxis: 5,
  596. },
  597. {
  598. xAxis: 10,
  599. },
  600. ],
  601. [
  602. {
  603. name: `10~12m 偏差率: ${this.markDot.pcl12}%`,
  604. xAxis: 10,
  605. },
  606. {
  607. xAxis: 12,
  608. },
  609. ],
  610. [
  611. {
  612. name: `12~25m 偏差率: ${this.markDot.pcl25}%`,
  613. xAxis: 12,
  614. },
  615. {
  616. xAxis: 25,
  617. },
  618. ],
  619. ],
  620. },
  621. };
  622. this.isChartArea = true;
  623. this.BASE.closeLoading();
  624. } else {
  625. this.seriesData[0] = {
  626. ...this.seriesData[0],
  627. markLine: null,
  628. markArea: null,
  629. };
  630. this.isChartArea = false;
  631. this.BASE.closeLoading();
  632. }
  633. }
  634. },
  635. // // 获取表格数据
  636. // getTableData() {
  637. // this.tableLoading = true;
  638. // getPowerFittingTable({
  639. // id: this.fittingId,
  640. // }).then((res) => {
  641. // if (res.code == 200) {
  642. // this.tableColumn = res.data.title.map((o) => {
  643. // return {
  644. // prop: o.key,
  645. // width: o.des === "时间" ? 100 : 80,
  646. // label: o.des,
  647. // };
  648. // });
  649. // this.tableData = res.data.data;
  650. // this.$message.success(res.msg);
  651. // }
  652. // this.tableLoading = false;
  653. // });
  654. // },
  655. // 获取图表数据
  656. getChartData(params) {
  657. getPowerHotChartGF(params).then((res) => {
  658. this.tableData = [];
  659. let chartRes = {};
  660. if (res.code == 200) {
  661. chartRes = res.data;
  662. this.dataSet = JSON.stringify([
  663. {
  664. source: chartRes.wyd,
  665. },
  666. {
  667. source: chartRes.yyd,
  668. },
  669. ]);
  670. this.seriesData = [
  671. {
  672. name: "拟合功率",
  673. type: "line",
  674. lineStyle: {
  675. width: 3,
  676. color: "#3d54be",
  677. },
  678. symbol: "line", //设定为实心点
  679. symbolSize: 0, //设定实心点的大小
  680. smooth: true, //这个是把线变成曲线
  681. data: chartRes.yydnh,
  682. xAxisIndex: 0,
  683. },
  684. {
  685. type: "effectScatter",
  686. showEffectOn: "emphasis",
  687. rippleEffect: {
  688. scale: 1,
  689. },
  690. itemStyle: {
  691. color: "#ccc",
  692. },
  693. name: "无用点",
  694. symbolSize: (data) => {
  695. return data.s ? (data.s > 10 ? 10 : data.s) : 4;
  696. },
  697. datasetIndex: 0,
  698. encode: {
  699. x: "x",
  700. y: "y",
  701. },
  702. xAxisIndex: 0,
  703. yAxisIndex: 0,
  704. },
  705. {
  706. type: "effectScatter",
  707. showEffectOn: "emphasis",
  708. rippleEffect: {
  709. scale: 1,
  710. },
  711. itemStyle: {
  712. color: [
  713. {
  714. type: "linear",
  715. colorStops: [
  716. { offset: 0, color: "#000" },
  717. { offset: 0.2, color: "rgb(75,11,106)" },
  718. { offset: 0.4, color: "rgb(210,70,69)" },
  719. { offset: 0.6, color: "rgb(247,126,21)", },
  720. { offset: 1, color: "rgb(249,252,156)" },
  721. ],
  722. globalCoord: false,
  723. },
  724. ],
  725. },
  726. name: "有用点",
  727. symbolSize: (data) => {
  728. return data.s ? (data.s > 10 ? 10 : data.s) : 4;
  729. },
  730. datasetIndex: 1,
  731. encode: {
  732. x: "x",
  733. y: "y",
  734. },
  735. xAxisIndex: 0,
  736. yAxisIndex: 0,
  737. },
  738. ];
  739. this.$message.success(res.msg);
  740. } else {
  741. this.xAxisData = {};
  742. this.seriesData = {};
  743. }
  744. this.BASE.closeLoading();
  745. });
  746. },
  747. //拟合按钮
  748. search() {
  749. this.isChartArea = true;
  750. if (!this.station || !this.inverters) {
  751. this.BASE.showMsg({
  752. msg: "场站与风机为必选项",
  753. });
  754. } else {
  755. this.getChartId();
  756. }
  757. },
  758. async funChartSelect(batch) {
  759. const wDataArr = [];
  760. const yDataArr = [];
  761. let scatterls = [];
  762. let scatterhs = [];
  763. let dataSetObj = [];
  764. this.wtData = [];
  765. if (batch?.length && this.dataSet) {
  766. scatterls = batch[0].selected[1].dataIndex;
  767. scatterhs = batch[0].selected[2].dataIndex;
  768. if (scatterls?.length || scatterhs?.length) {
  769. dataSetObj = JSON.parse(this.dataSet);
  770. if (scatterls?.length) {
  771. for (const scatterIndex of scatterls) {
  772. wDataArr.push(dataSetObj[0].source[scatterIndex].k);
  773. }
  774. }
  775. if (scatterhs?.length) {
  776. for (const scatterIndex1 of scatterhs) {
  777. yDataArr.push(dataSetObj[1].source[scatterIndex1].k);
  778. }
  779. }
  780. const wtRes = await getPowerFittingSelectedChartGF({
  781. yk: yDataArr.join(","),
  782. wk: wDataArr.join(","),
  783. });
  784. if (wtRes.code === 200) {
  785. let id = 1;
  786. const tempArr = []; //用于以风机id 聚合dataArr
  787. if (wtRes.data?.length) {
  788. for (const data of wtRes.data) {
  789. if (tempArr.length) {
  790. const findIndex = tempArr.findIndex(
  791. (o) => o.wtId === data.wtId
  792. );
  793. if (findIndex !== -1) {
  794. if (!tempArr[findIndex].children) {
  795. tempArr[findIndex].children = [];
  796. }
  797. tempArr[findIndex].children.push({
  798. ...data,
  799. id: id,
  800. filter: data.filter === 0 ? "是" : "否",
  801. });
  802. id++;
  803. } else {
  804. tempArr.push({
  805. ...data,
  806. id: id,
  807. filter: data.filter === 0 ? "是" : "否",
  808. });
  809. id++;
  810. }
  811. } else {
  812. tempArr.push({
  813. ...data,
  814. id: id,
  815. filter: data.filter === 0 ? "是" : "否",
  816. });
  817. id++;
  818. }
  819. }
  820. this.wtDialog = true;
  821. this.$nextTick(() => {
  822. this.wtTab = "table";
  823. this.wtData = tempArr;
  824. });
  825. }
  826. }
  827. }
  828. }
  829. },
  830. },
  831. unmounted() {},
  832. };
  833. </script>
  834. <style lang="less" scoped>
  835. .draught-fan-list {
  836. width: 100%;
  837. height: 100%;
  838. display: flex;
  839. flex-direction: column;
  840. padding: 10px 20px;
  841. .form-wrapper ::v-deep {
  842. .el-checkbox__input {
  843. display: block;
  844. }
  845. .el-input-number {
  846. width: 100%;
  847. .el-input-number__decrease,
  848. .el-input-number__increase {
  849. background: rgba(67, 81, 107, 0.2) !important;
  850. position: absolute;
  851. z-index: 10;
  852. border: 0;
  853. // height: 33px;
  854. // line-height: 33px;
  855. &:hover {
  856. color: #05be4c;
  857. }
  858. }
  859. }
  860. .el-date-editor {
  861. width: 100%;
  862. }
  863. .el-select {
  864. width: 100%;
  865. .el-select__tags {
  866. max-width: 140px !important;
  867. .el-select__tags-text {
  868. max-width: 62px !important;
  869. }
  870. }
  871. }
  872. .el-radio-group {
  873. width: 100%;
  874. display: flex;
  875. .el-radio {
  876. flex: 1;
  877. }
  878. }
  879. .search {
  880. display: flex;
  881. align-items: center;
  882. .search-items {
  883. display: flex;
  884. align-items: center;
  885. .search-item {
  886. width: 296px;
  887. display: flex;
  888. align-items: center;
  889. margin-right: 10px;
  890. .lable {
  891. font-size: 14px;
  892. font-family: Microsoft YaHei;
  893. font-weight: 400;
  894. color: #b3b3b3;
  895. margin-right: 5px;
  896. width: 84px;
  897. text-align: right;
  898. white-space: nowrap;
  899. }
  900. .search-content {
  901. flex: 1;
  902. }
  903. &:nth-last-child(1) {
  904. margin-right: 0;
  905. }
  906. }
  907. .custom {
  908. width: auto;
  909. }
  910. }
  911. .search-actions {
  912. top: 152px;
  913. right: 75px;
  914. position: absolute;
  915. z-index: 88;
  916. .el-button {
  917. background-color: rgba(5, 187, 76, 0.3);
  918. border: 1px solid #3b6c53;
  919. color: #b3b3b3;
  920. font-size: 14px;
  921. border: none;
  922. width: 108px;
  923. min-height: 25px !important;
  924. &.btn-search:hover {
  925. background-color: rgba(5, 187, 76, 0.6);
  926. color: #ffffff;
  927. }
  928. }
  929. .btn-active {
  930. background-color: rgba(5, 187, 76, 0.6);
  931. color: #ffffff;
  932. }
  933. }
  934. &:nth-last-child(1) {
  935. justify-content: space-between;
  936. }
  937. }
  938. }
  939. .el-tabs ::v-deep {
  940. height: 100%;
  941. .el-tabs__item {
  942. color: #b3b3b3;
  943. }
  944. .el-tabs__nav-wrap::after {
  945. background-color: #14221f;
  946. }
  947. .el-tabs__active-bar {
  948. background-color: #05bb4c;
  949. }
  950. .el-tabs__item.is-active,
  951. .el-tabs__item:hover {
  952. color: #05bb4c;
  953. }
  954. .el-tabs__content {
  955. height: calc(100% - 40px);
  956. }
  957. }
  958. }
  959. </style>