index.vue 29 KB

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