assetssMag.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839
  1. <template>
  2. <div class="global-variable">
  3. <div class="condition">
  4. <el-alert
  5. title="分析前请核对数据是否导入,点击查看是否导入即可查看"
  6. type="warning"
  7. show-icon
  8. >
  9. </el-alert>
  10. <el-form
  11. :inline="true"
  12. ref="ruleForm"
  13. :model="formInline"
  14. class="demo-form-inline"
  15. :rules="rules"
  16. >
  17. <el-form-item label="风场名称:" prop="fieldName">
  18. <el-input
  19. size="small"
  20. v-model="formInline.fieldName"
  21. placeholder="请输入风场名称"
  22. ></el-input>
  23. </el-form-item>
  24. <el-form-item>
  25. <el-button type="primary" @click="onSubmit" size="small"
  26. >查询</el-button
  27. >
  28. <el-button @click="reset('ruleForm')" size="small">重置</el-button>
  29. </el-form-item>
  30. <el-form-item class="right-align">
  31. <el-button @click="Newanalyse" size="small">创建分析</el-button>
  32. <el-button @click="examine" size="small">查看导入数据</el-button>
  33. </el-form-item>
  34. </el-form>
  35. </div>
  36. <div class="list-page">
  37. <el-table
  38. v-loading="loading"
  39. class="center-align-table"
  40. :data="tableData"
  41. border
  42. :cell-style="rowStyle"
  43. >
  44. <el-table-column
  45. align="center"
  46. fixed
  47. prop="fieldName"
  48. label="风场名称"
  49. min-width="200"
  50. >
  51. </el-table-column>
  52. <el-table-column
  53. align="center"
  54. label="分析名称"
  55. prop="analysisName"
  56. min-width="200"
  57. >
  58. </el-table-column>
  59. <el-table-column
  60. align="center"
  61. label="数据类型名称"
  62. prop="dataTypeName"
  63. min-width="200"
  64. >
  65. </el-table-column>
  66. <el-table-column
  67. prop="loginName"
  68. align="center"
  69. label="进度"
  70. min-width="150"
  71. >
  72. <template slot-scope="scope">
  73. <el-progress
  74. v-if="scope.row.analysisState == 20"
  75. :text-inside="true"
  76. :stroke-width="20"
  77. :percentage="scope.row.analysisProgress"
  78. :class="{
  79. 'indeterminate-progress': scope.row.analysisProgress < 100,
  80. 'animated-progress': true,
  81. }"
  82. ></el-progress>
  83. <span v-else>/</span>
  84. </template>
  85. </el-table-column>
  86. <el-table-column
  87. prop="loginName"
  88. align="center"
  89. label="分析状态"
  90. min-width="150"
  91. >
  92. <template slot-scope="scope">
  93. <span v-if="scope.row.analysisState == -1">未分析</span>
  94. <span
  95. v-else-if="
  96. scope.row.analysisState == 20 && scope.row.errState == 0
  97. "
  98. style="color: #f90"
  99. >分析中</span
  100. >
  101. <span v-else-if="scope.row.errState == 1" style="color: #f00"
  102. >分析异常</span
  103. >
  104. <span
  105. v-else-if="scope.row.analysisState == 30"
  106. style="color: #4caf50"
  107. >分析完成</span
  108. >
  109. <span
  110. v-else-if="scope.row.analysisState == 10"
  111. style="color: #4caf50"
  112. >排队中</span
  113. >
  114. <span v-else>/</span>
  115. </template>
  116. </el-table-column>
  117. <el-table-column
  118. prop="errState"
  119. align="center"
  120. label="异常状态"
  121. min-width="120"
  122. >
  123. <template slot-scope="scope">
  124. <span>
  125. {{
  126. scope.row.errState == 0 && scope.row.analysisState !== -1
  127. ? "未异常"
  128. : scope.row.errState === 1
  129. ? "异常"
  130. : "/"
  131. }}</span
  132. >
  133. </template>
  134. </el-table-column>
  135. <el-table-column
  136. prop="roleName"
  137. align="center"
  138. label="异常信息"
  139. min-width="120"
  140. >
  141. <template slot-scope="scope">
  142. <el-button
  143. v-if="scope.row.errState == 1"
  144. @click="abnormalDialog(scope.row, '异常详情')"
  145. type="text"
  146. size="small"
  147. >异常详情</el-button
  148. >
  149. <span v-else>/</span>
  150. </template>
  151. </el-table-column>
  152. <el-table-column
  153. prop="roleName"
  154. align="center"
  155. label="分析记录"
  156. min-width="120"
  157. >
  158. <template slot-scope="scope">
  159. <!-- 分析完成 -->
  160. <el-button
  161. v-if="scope.row.analysisState == 30 && scope.row.errState !== 1"
  162. @click="handleAssetssDetail(scope.row, '1')"
  163. type="text"
  164. size="small"
  165. >分析详情</el-button
  166. >
  167. <!-- 分析中 -->
  168. <el-button
  169. v-else-if="
  170. scope.row.analysisState == 20 && scope.row.errState == 0
  171. "
  172. @click="handleAssetssDetail(scope.row, '0')"
  173. type="text"
  174. size="small"
  175. >分析详情</el-button
  176. >
  177. <span v-else>/</span>
  178. </template>
  179. </el-table-column>
  180. <el-table-column
  181. prop="reportVos"
  182. align="center"
  183. label="报告"
  184. min-width="120"
  185. >
  186. <template slot-scope="scope">
  187. <el-dropdown v-if="scope.row.reportVos.length > 0" trigger="click">
  188. <el-button type="text" size="small" class="el-dropdown-link">
  189. 查看报告
  190. </el-button>
  191. <el-dropdown-menu slot="dropdown">
  192. <el-dropdown-item
  193. v-for="val in scope.row.reportVos"
  194. class="reportItemVal"
  195. >
  196. <div class="reportLeft">
  197. <span>{{ val.reportName }}</span>
  198. </div>
  199. <div class="reportRight">
  200. <el-button
  201. type="text"
  202. size="small"
  203. @click="detailReportAssetss(val)"
  204. >
  205. 查看
  206. </el-button>
  207. <el-button
  208. type="text"
  209. size="small"
  210. @click="downLoadeAssetss(val)"
  211. >
  212. 下载
  213. </el-button>
  214. </div>
  215. </el-dropdown-item>
  216. </el-dropdown-menu>
  217. </el-dropdown>
  218. <span v-else>/</span>
  219. <!-- <el-button type="text" size="small">
  220. {{
  221. scope.row.errState == 0 && scope.row.analysisState !== -1
  222. ? "查看报告"
  223. : "/"
  224. }}
  225. </el-button> -->
  226. </template>
  227. </el-table-column>
  228. <el-table-column
  229. prop="dataStartTime"
  230. align="center"
  231. label="开始时间"
  232. min-width="230"
  233. >
  234. </el-table-column>
  235. <el-table-column
  236. prop="dataEndTime"
  237. align="center"
  238. label="结束时间"
  239. min-width="230"
  240. >
  241. </el-table-column>
  242. <el-table-column
  243. prop="transition"
  244. align="center"
  245. fixed="right"
  246. label="操作"
  247. min-width="300"
  248. >
  249. <template slot-scope="scope">
  250. <el-button
  251. @click="abnormalDialog(scope.row, '上传报告')"
  252. type="text"
  253. size="small"
  254. >上传报告</el-button
  255. >
  256. <el-button
  257. @click="handleAssetss(scope.row)"
  258. type="text"
  259. size="small"
  260. >分析</el-button
  261. >
  262. <el-button
  263. @click="abnormalDialog(scope.row, '异常描述')"
  264. type="text"
  265. size="small"
  266. >异常描述</el-button
  267. >
  268. <el-button
  269. @click="HandleOnOffAuto(scope.row)"
  270. type="text"
  271. size="small"
  272. >{{
  273. scope.row.onOffCall === 0 ? "开启自动分析" : "关闭自动分析"
  274. }}</el-button
  275. >
  276. </template>
  277. </el-table-column>
  278. </el-table>
  279. <div class="pagination-container">
  280. <el-pagination
  281. @current-change="handleCurrentChange"
  282. :current-page.sync="formInline.pageNum"
  283. layout="total, prev, pager, next"
  284. :page-size="formInline.pageSize"
  285. :total="formInline.totalSize"
  286. >
  287. </el-pagination>
  288. </div>
  289. </div>
  290. <!-- 弹出层 -->
  291. <!-- 异常信息 /异常描述 /上传报告-->
  292. <my-dialog
  293. :visible="dialogVisible"
  294. :title="title"
  295. :rowInfo="rowInfo"
  296. @confirm="handleConfirm"
  297. @getTableList="fetchData"
  298. >
  299. <div slot="tableEl">
  300. <el-empty description="暂无数据"></el-empty>
  301. </div>
  302. </my-dialog>
  303. <!-- 查看报告详情 -->
  304. <el-dialog
  305. title="PDF 预览"
  306. :visible.sync="dialogReportVisible"
  307. :width="dialogWidth"
  308. class="pdfDialog"
  309. :before-close="handleCloses"
  310. >
  311. <span>
  312. <div
  313. style="
  314. float: right;
  315. color: #fff;
  316. cursor: pointer;
  317. position: absolute;
  318. left: 90%;
  319. top: 21px;
  320. "
  321. >
  322. <span
  323. v-if="dialogWidth === '80%'"
  324. @click="() => (dialogWidth = '100%')"
  325. >全屏查看</span
  326. >
  327. <span
  328. v-if="dialogWidth === '100%'"
  329. @click="() => (dialogWidth = '80%')"
  330. >还原</span
  331. >
  332. <!-- {{ isFullscreen ? "还原" : "全屏" }} -->
  333. </div>
  334. </span>
  335. <div class="pdf-container" ref="viewer">
  336. <iframe :src="pdfUrl" width="100%" height="100%"></iframe>
  337. </div>
  338. <div></div>
  339. </el-dialog>
  340. <!-- 创建分析弹出框 -->
  341. <el-dialog
  342. title="创建分析"
  343. :visible.sync="addDialogVisible"
  344. width="30%"
  345. :before-close="AddHandleCloses"
  346. >
  347. <el-form
  348. :model="addRuleForm"
  349. :rules="addRules"
  350. ref="addRuleForm"
  351. label-width="100px"
  352. class="add-ruleForm"
  353. >
  354. <el-form-item label="关联风场" prop="fieldCode">
  355. <el-select
  356. v-model="addRuleForm.fieldCode"
  357. placeholder="请选择关联风场"
  358. >
  359. <el-option
  360. :label="item.fieldName"
  361. v-for="item in fieldCodeList"
  362. :value="item.codeNumber"
  363. ></el-option>
  364. </el-select>
  365. </el-form-item>
  366. <el-form-item label="" prop="analysisName">
  367. <b style="color: #f00; font-size: 12px"
  368. >不填写分析名称自动采用系统生成的名称!</b
  369. >
  370. </el-form-item>
  371. <el-form-item label="分析名称" prop="analysisName">
  372. <el-input v-model="addRuleForm.analysisName"></el-input>
  373. </el-form-item>
  374. <el-form-item label="分析简述" prop="sketch">
  375. <el-input type="textarea" v-model="addRuleForm.sketch"></el-input>
  376. </el-form-item>
  377. <el-form-item>
  378. <el-button type="primary" @click="addRuleFormSubmit">提交</el-button>
  379. <el-button @click="AddHandleCloses">取消</el-button>
  380. </el-form-item>
  381. </el-form>
  382. </el-dialog>
  383. </div>
  384. </template>
  385. <script>
  386. import MyDialog from "./components/dialogCom.vue";
  387. import { downloadPDF } from "@/utils/common";
  388. import {
  389. onOffAutoAnalysis,
  390. analysisResultList,
  391. addAnalysisResult,
  392. queryCodeNum,
  393. } from "@/api/performance";
  394. import { from } from "plotly.js-dist";
  395. export default {
  396. components: {
  397. MyDialog,
  398. },
  399. data() {
  400. return {
  401. fieldCodeList: [],
  402. addDialogVisible: false,
  403. dialogWidth: "80%",
  404. intervalId: null,
  405. startTime: null,
  406. maxPollingTime: 3 * 60 * 1000, //轮询最大时间
  407. dialogVisible: false,
  408. loadingView: false,
  409. loading: false, //数据加载中
  410. errorInfo: "",
  411. addRules: {
  412. fieldCode: [
  413. { required: true, message: "请选择关联风场", trigger: "change" },
  414. ],
  415. },
  416. addRuleForm: {
  417. fieldCode: "",
  418. analysisName: "",
  419. sketch: "",
  420. },
  421. rules: {
  422. fieldName: { trigger: "blur" },
  423. },
  424. roleList: [],
  425. formInline: {
  426. fieldName: undefined,
  427. pageNum: 1,
  428. pageSize: 10,
  429. totalSize: 0,
  430. },
  431. tableData: [],
  432. rowInfo: {},
  433. title: "",
  434. viewerInstance: null, // PDF 文件 URL
  435. dialogReportVisible: false,
  436. pdfUrl: "",
  437. isPolling: false, // 轮询状态标识
  438. firstLoad: true, // 是否是第一次加载
  439. };
  440. },
  441. created() {
  442. window.addEventListener("message", this.handleMessage); //江
  443. this.getTableList();
  444. },
  445. beforeDestroy() {
  446. this.stopPolling();
  447. // 销毁消息监听器
  448. window.removeEventListener("message", this.handleMessage); //江
  449. },
  450. methods: {
  451. // 创建分析时请求
  452. async addRuleFormSubmit() {
  453. this.$refs.addRuleForm.validate(async (valid) => {
  454. if (valid) {
  455. try {
  456. const res = await addAnalysisResult(this.addRuleForm);
  457. if (res.code === 200) {
  458. this.$message({
  459. type: "success",
  460. message: "创建成功",
  461. });
  462. this.addDialogVisible = false;
  463. this.getTableList();
  464. }
  465. } catch (err) {
  466. console.error(err);
  467. }
  468. }
  469. });
  470. },
  471. AddHandleCloses(done) {
  472. this.$confirm("确认关闭?")
  473. .then((_) => {
  474. done();
  475. })
  476. .catch((_) => {});
  477. },
  478. //获取风场列表
  479. async getQueryCodeNumList() {
  480. this.loading = true;
  481. try {
  482. const result = await queryCodeNum();
  483. this.fieldCodeList = result.data.fieldCodeList;
  484. this.loading = false;
  485. } catch (error) {
  486. console.error(error);
  487. this.loading = false;
  488. }
  489. },
  490. handleCloses(done) {
  491. this.$confirm("确认关闭?")
  492. .then((_) => {
  493. done();
  494. })
  495. .catch((_) => {});
  496. },
  497. //查看pdf 文件
  498. detailReportAssetss(row) {
  499. this.dialogReportVisible = true;
  500. this.pdfUrl = row.reportAddr;
  501. },
  502. //下载pdf 文件
  503. downLoadeAssetss(row) {
  504. downloadPDF(row.reportAddr, row.reportName);
  505. },
  506. async HandleOnOffAuto(row) {
  507. try {
  508. const form = new FormData();
  509. form.append("batchCode", row.batchCode);
  510. form.append("onOffCall", row.onOffCall === 0 ? 1 : 0);
  511. const res = await onOffAutoAnalysis(form);
  512. if (res.code === 200) {
  513. this.getTableList();
  514. this.$message({
  515. type: "success",
  516. message: `${row.onOffCall === 0 ? "开启" : "关闭"}成功`,
  517. });
  518. }
  519. } catch (err) {
  520. console.error(err);
  521. }
  522. },
  523. //分析
  524. handleAssetss(row) {
  525. this.$router.push({
  526. path: "/home/performance/editAssets",
  527. query: {
  528. batchCode: row.batchCode,
  529. analysisTypeCode: row.analysisTypeCode,
  530. fieldEngineCode: row.fieldCode,
  531. },
  532. });
  533. },
  534. //分析详情
  535. handleAssetssDetail(row, state) {
  536. const navigateToDetails = () => {
  537. this.$router.push({
  538. path: "/home/performance/overview",
  539. query: {
  540. batchCode: row.batchCode,
  541. // analysisTypeCode: row.analysisTypeCode,
  542. fieldCode: row.fieldCode,
  543. },
  544. });
  545. };
  546. if (state === "0") {
  547. // 分析状态为分析中
  548. this.$confirm(
  549. "当前查看的分析记录为历史分析结果,最新分析记录还未分析完成不展示!"
  550. )
  551. .then(() => {
  552. navigateToDetails();
  553. })
  554. .catch(() => {});
  555. } else {
  556. navigateToDetails();
  557. }
  558. },
  559. abnormalDialog(row, title) {
  560. this.dialogVisible = true;
  561. if (title === "异常详情") {
  562. this.errorInfo = row.errInfo;
  563. this.rowInfo = {};
  564. } else if (title === "异常描述") {
  565. this.errorInfo = "";
  566. this.rowInfo = { ...row };
  567. } else if (title === "上传报告") {
  568. this.errorInfo = "";
  569. this.rowInfo = {};
  570. this.rowInfo.batchCode = row.batchCode;
  571. }
  572. this.title = title;
  573. },
  574. handleConfirm() {
  575. this.dialogVisible = false;
  576. },
  577. // 页码变化时才触发查询
  578. handleCurrentChange(val) {
  579. this.formInline.pageNum = val;
  580. this.getTableList();
  581. },
  582. // 修改 getTableList 方法,避免重复请求
  583. async getTableList() {
  584. // 如果正在请求中,跳过此次调用
  585. if (this.loading || this.isPolling) return;
  586. this.loading = true;
  587. try {
  588. const params = { ...this.formInline, totalSize: undefined };
  589. // 传递条件参数
  590. if (this.formInline.analysisState !== undefined) {
  591. params.analysisState = this.formInline.analysisState;
  592. }
  593. if (this.formInline.errState !== undefined) {
  594. params.errState = this.formInline.errState;
  595. }
  596. const result = await analysisResultList(params);
  597. this.tableData = result.data.list;
  598. this.formInline.totalSize = result.data.totalSize;
  599. } catch (error) {
  600. this.$message({
  601. type: "error",
  602. message: "请检查是否连接网络",
  603. });
  604. } finally {
  605. this.loading = false;
  606. }
  607. },
  608. // 改进 handleMessage,避免频繁请求
  609. handleMessage(event) {
  610. // 确保消息来自当前域
  611. if (event.origin !== window.location.origin) {
  612. return;
  613. }
  614. const { fieldName, analysisState, errState } = event.data;
  615. // 更新表单字段
  616. if (fieldName !== undefined) {
  617. this.formInline.fieldName = fieldName;
  618. console.log(fieldName, "0");
  619. }
  620. if (analysisState !== undefined) {
  621. this.formInline.analysisState = analysisState;
  622. console.log(analysisState, "2");
  623. }
  624. if (errState !== undefined) {
  625. this.formInline.errState = errState;
  626. console.log(errState, "1");
  627. }
  628. // 如果当前没有请求中,才调用 getTableList
  629. if (!this.loading) {
  630. this.getTableList();
  631. }
  632. },
  633. rowStyle() {
  634. return "text-align:center";
  635. },
  636. // 查询
  637. onSubmit() {
  638. this.getTableList();
  639. },
  640. // 重置
  641. reset(formName) {
  642. this.$refs[formName].resetFields();
  643. this.formInline.fieldName = "";
  644. this.formInline.analysisState = "";
  645. this.formInline.errState = "";
  646. this.getTableList();
  647. },
  648. // fetchData 方法在轮询中调用
  649. async fetchData() {
  650. try {
  651. const result = await analysisResultList({
  652. ...this.formInline,
  653. totalSize: undefined,
  654. });
  655. this.tableData = result.data.list;
  656. this.formInline.totalSize = result.data.totalSize;
  657. } catch (error) {
  658. this.$message({
  659. type: "error",
  660. message: "请检查是否连接网络",
  661. });
  662. }
  663. },
  664. stopPolling() {
  665. if (this.intervalId) {
  666. clearInterval(this.intervalId);
  667. this.intervalId = null;
  668. }
  669. this.isPolling = false;
  670. },
  671. // 启动轮询时,避免重复请求
  672. startPolling() {
  673. this.startTime = new Date().getTime();
  674. this.isPolling = true;
  675. this.intervalId = setInterval(() => {
  676. const currentTime = new Date().getTime();
  677. if (currentTime - this.startTime >= this.maxPollingTime) {
  678. this.stopPolling();
  679. } else {
  680. // 轮询期间不重复请求,检查是否可以调用 fetchData
  681. if (!this.loading) {
  682. this.fetchData();
  683. }
  684. }
  685. }, 3000); // 每10秒检查一次
  686. },
  687. //创建分析
  688. Newanalyse() {
  689. this.addDialogVisible = true;
  690. this.getQueryCodeNumList();
  691. },
  692. examine() {
  693. this.$router.push({
  694. path: "/home/transition",
  695. });
  696. },
  697. },
  698. mounted() {
  699. setTimeout(() => {
  700. this.startPolling();
  701. }, 5000);
  702. },
  703. };
  704. </script>
  705. <style lang="scss" scoped>
  706. @keyframes striped-flow {
  707. from {
  708. background-position: 0 100px;
  709. }
  710. to {
  711. background-position: 1.25em 1.25em;
  712. }
  713. }
  714. .general {
  715. display: flex;
  716. flex-wrap: wrap;
  717. .condition {
  718. width: 50%;
  719. display: flex;
  720. p {
  721. width: 100px;
  722. text-align: right;
  723. line-height: 40px;
  724. }
  725. span {
  726. line-height: 40px;
  727. padding-left: 20px;
  728. }
  729. .el-select {
  730. width: 100%;
  731. margin-bottom: 20px;
  732. }
  733. .el-input {
  734. margin-bottom: 20px;
  735. }
  736. }
  737. }
  738. .attachment {
  739. display: flex;
  740. padding-top: 10px;
  741. p {
  742. margin-right: 20px;
  743. color: #409eff;
  744. }
  745. }
  746. .add-ruleForm {
  747. .el-select {
  748. width: 100%;
  749. }
  750. }
  751. .addition {
  752. display: flex;
  753. justify-content: flex-end;
  754. margin-bottom: 10px;
  755. }
  756. .demo-ruleForm {
  757. .el-form-item {
  758. margin-bottom: 25px;
  759. }
  760. }
  761. ::v-deep .animated-progress .el-progress-bar__outer {
  762. height: 15px; /* Adjust height as needed */
  763. background-color: rgb(235, 238, 245);
  764. background-image: linear-gradient(
  765. 45deg,
  766. rgba(0, 0, 0, 0.1) 25%,
  767. transparent 25%,
  768. transparent 50%,
  769. rgba(0, 0, 0, 0.1) 50%,
  770. rgba(0, 0, 0, 0.1) 75%,
  771. transparent 75%,
  772. transparent
  773. );
  774. background-size: 1.25em 1.25em;
  775. animation: striped-flow 3s linear infinite;
  776. }
  777. .reportItemVal {
  778. display: flex;
  779. justify-content: space-between;
  780. align-items: center;
  781. .reportLeft {
  782. margin-right: 50px;
  783. }
  784. }
  785. ::v-deep .pdfDialog .el-dialog {
  786. height: 100vh;
  787. display: flex;
  788. flex-direction: column;
  789. margin: 0 auto !important;
  790. .el-dialog__body {
  791. // height: 100% !important;
  792. flex: 1;
  793. background: #fff;
  794. .pdf-container {
  795. display: flex;
  796. justify-content: center;
  797. align-items: center;
  798. height: 100% !important;
  799. }
  800. }
  801. }
  802. canvas {
  803. border: 1px solid #dcdfe6;
  804. }
  805. .right-align {
  806. white-space: nowrap;
  807. }
  808. </style>