index.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857
  1. <template>
  2. <div class="transition-page">
  3. <el-collapse v-model="activeNames" class="transition-collapse">
  4. <el-collapse-item title="基础信息" name="1">
  5. <p @click="database" class="CPC">
  6. 数据入库风场统计数: <span>{{ windFarmCount || 0 }}</span>个
  7. </p>
  8. <el-drawer
  9. title="入库统计"
  10. :visible.sync="drawer"
  11. custom-class="transition-drawer"
  12. >
  13. <div class="card" v-for="(item, index) in Rklist" :key="index">
  14. <p>{{ item.windFarmName }}</p>
  15. <ul>
  16. <li
  17. v-for="(type, typeIndex) in item.typeCountDataList"
  18. :key="typeIndex"
  19. @click="details(item.windFarmCode, type)"
  20. >
  21. <span class="sp1">{{ type.transferName }}</span>
  22. <span class="sp2">{{ type.count }}</span>
  23. <span class="sp3">{{
  24. type.latestStorageTime || "无数据"
  25. }}</span>
  26. </li>
  27. </ul>
  28. </div>
  29. </el-drawer>
  30. <el-dialog
  31. title="统计信息"
  32. :visible.sync="dialogVisible"
  33. width="50%"
  34. custom-class="transition-dialog"
  35. >
  36. <ul class="scrollable-list">
  37. <li v-for="(item, index) in dataset" :key="index">
  38. 任务名称: <span>{{ item.taskName }}</span> 时间跨度:<span>{{
  39. item.dataMinTime
  40. }}</span
  41. >~<span>{{ item.dataMaxTime }}</span>
  42. </li>
  43. </ul>
  44. </el-dialog>
  45. <el-descriptions
  46. class="incoming-desc"
  47. title="最新入库详情"
  48. :column="4"
  49. size="small"
  50. border
  51. >
  52. <el-descriptions-item label="任务名称">{{
  53. incoming.taskName || "--"
  54. }}</el-descriptions-item>
  55. <el-descriptions-item label="数据类型">{{
  56. incoming.transferTypeName || "--"
  57. }}</el-descriptions-item>
  58. <el-descriptions-item label="时间颗粒度">
  59. {{ incoming.timeGranularity ? `${incoming.timeGranularity}(秒)` : "--" }}
  60. </el-descriptions-item>
  61. <el-descriptions-item label="时间范围">
  62. {{
  63. incoming.dataMinTime && incoming.dataMaxTime
  64. ? `${incoming.dataMinTime}~${incoming.dataMaxTime}`
  65. : "--"
  66. }}
  67. </el-descriptions-item>
  68. <el-descriptions-item label="风场名称">{{
  69. incoming.windFarmName || "--"
  70. }}</el-descriptions-item>
  71. <el-descriptions-item label="机组数量">{{
  72. incoming.engineCount || "--"
  73. }}</el-descriptions-item>
  74. <el-descriptions-item label="入库时间">{{
  75. incoming.transferFinishTime || "--"
  76. }}</el-descriptions-item>
  77. <el-descriptions-item label="收资人">{{
  78. incoming.dataCollector || "--"
  79. }}</el-descriptions-item>
  80. </el-descriptions>
  81. </el-collapse-item>
  82. </el-collapse>
  83. <div class="condition">
  84. <div class="condition-item">
  85. <span class="condition-label">风场名称</span>
  86. <el-select v-model="windvalue" placeholder="请选择" size="small" clearable>
  87. <el-option
  88. v-for="item in windoptions"
  89. :key="item.fieldCode"
  90. :label="item.fieldName"
  91. :value="item.fieldCode"
  92. >
  93. </el-option>
  94. </el-select>
  95. </div>
  96. <div class="condition-item">
  97. <span class="condition-label">导入类型</span>
  98. <el-select v-model="typevalue" placeholder="请选择" size="small" clearable>
  99. <el-option
  100. v-for="item in typeoptions"
  101. :key="item.paramKey"
  102. :label="item.paramValue"
  103. :value="item.paramKey"
  104. >
  105. </el-option>
  106. </el-select>
  107. </div>
  108. <div class="condition-item">
  109. <span class="condition-label">导入状态</span>
  110. <el-select v-model="statevalue" placeholder="请选择" size="small" clearable>
  111. <el-option
  112. v-for="item in stateoptions"
  113. :key="item.transferStatus"
  114. :label="item.label"
  115. :value="item.transferStatus"
  116. >
  117. </el-option>
  118. </el-select>
  119. </div>
  120. <div class="condition-actions">
  121. <el-button size="small" @click="query">查询</el-button>
  122. <el-button size="small" @click="reset">重置</el-button>
  123. <el-button size="small" @click="newtransition" type="primary">新增转换</el-button>
  124. </div>
  125. </div>
  126. <el-dialog
  127. title="转换"
  128. :visible.sync="transitionShow"
  129. width="30%"
  130. custom-class="transition-dialog"
  131. >
  132. <el-form ref="form" :model="form" :rules="formRules" label-width="80px">
  133. <el-form-item label="选择风场" prop="wind">
  134. <el-select v-model="form.wind" clearable placeholder="请选择风场">
  135. <el-option
  136. v-for="item in windoptions"
  137. :key="item.fieldCode"
  138. :label="item.fieldName"
  139. :value="item.fieldCode"
  140. />
  141. </el-select>
  142. </el-form-item>
  143. <el-form-item label="转换类型" prop="type">
  144. <el-select v-model="form.type" clearable placeholder="请选择转换类型">
  145. <el-option
  146. v-for="item in typeoptions"
  147. :key="item.paramKey"
  148. :label="item.paramValue"
  149. :value="item.paramKey"
  150. />
  151. </el-select>
  152. </el-form-item>
  153. <el-form-item label="读取路径" prop="path">
  154. <el-input v-model="form.path" clearable />
  155. </el-form-item>
  156. <el-form-item label="收资人" prop="name">
  157. <el-input v-model="form.name" clearable />
  158. </el-form-item>
  159. <el-form-item>
  160. <el-button type="primary" @click="onSubmit">提交</el-button>
  161. </el-form-item>
  162. </el-form>
  163. <el-dialog
  164. width="40%"
  165. title="提交"
  166. :visible.sync="innerVisible"
  167. append-to-body
  168. custom-class="transition-dialog"
  169. >
  170. <div class="renwu">
  171. <p>
  172. 任务名称:<el-input
  173. placeholder="请输入内容"
  174. v-model="nameinput"
  175. clearable
  176. >
  177. </el-input>
  178. </p>
  179. <el-button @click="onruku">确定</el-button>
  180. </div>
  181. </el-dialog>
  182. </el-dialog>
  183. <div class="table-section">
  184. <el-table :data="tableData" style="width: 100%">
  185. <el-table-column type="expand">
  186. <template slot-scope="props">
  187. <el-form label-position="left" inline class="demo-table-expand">
  188. <el-form-item label="风场编号:">
  189. <span>{{ props.row.windFarmCode }}</span>
  190. </el-form-item>
  191. <el-form-item label="风场名称:">
  192. <span>{{ props.row.windFarmName }}</span>
  193. </el-form-item>
  194. <el-form-item label="任务名称:">
  195. <span>{{ props.row.taskName }}</span>
  196. </el-form-item>
  197. <el-form-item label="收资人:">
  198. <span>{{ props.row.dataCollector }}</span>
  199. </el-form-item>
  200. <el-form-item label="原始数据读取路径:">
  201. <span>{{ props.row.readDir }}</span>
  202. </el-form-item>
  203. <el-form-item label="标准化数据保存路径:">
  204. <span>{{ props.row.archivePath }}</span>
  205. </el-form-item>
  206. <el-form-item label="时间跨度:">
  207. <span
  208. >{{ props.row.dataMinTime }}~{{ props.row.dataMaxTime }}</span
  209. >
  210. </el-form-item>
  211. <el-form-item label="时间颗粒度(秒):">
  212. <span>{{ props.row.timeGranularity }}</span>
  213. </el-form-item>
  214. <el-form-item label="异常信息:" class="form-item">
  215. <span>{{ props.row.errInfo }}</span>
  216. </el-form-item>
  217. </el-form>
  218. </template>
  219. </el-table-column>
  220. <el-table-column label="风场名称" prop="windFarmName" width="200">
  221. </el-table-column>
  222. <el-table-column label="任务名称" prop="taskName"> </el-table-column>
  223. <el-table-column label="转换类型" prop="transferTypeName" width="130">
  224. </el-table-column>
  225. <el-table-column label="导入状态" prop="transferStatus" width="100">
  226. <template slot-scope="scope">
  227. <span v-if="scope.row.transferStatus === -1">等待导入</span>
  228. <span v-if="scope.row.transferStatus === 0">导入中</span>
  229. <span v-if="scope.row.transferStatus === 1">导入成功</span>
  230. <span v-if="scope.row.transferStatus === 2">导入失败</span>
  231. </template>
  232. </el-table-column>
  233. <el-table-column label="创建时间" prop="createTime" width="300">
  234. </el-table-column>
  235. <el-table-column label="操作" prop="desc" width="150">
  236. <template slot-scope="scope">
  237. <el-button @click="editor(scope.row)" type="text" size="small">
  238. 编辑
  239. </el-button>
  240. <el-button
  241. @click="restart(scope.row)"
  242. type="text"
  243. size="small"
  244. v-if="scope.row.transferStatus !== 1"
  245. >
  246. 重新导入
  247. </el-button>
  248. </template></el-table-column
  249. >
  250. </el-table>
  251. <el-pagination
  252. class="fenye"
  253. @size-change="handleSizeChange"
  254. @current-change="handleCurrentChange"
  255. :page-size="pageSize"
  256. layout="total, prev, pager, next"
  257. :total="total"
  258. ></el-pagination>
  259. </div>
  260. </div>
  261. </template>
  262. <script>
  263. import axios from "axios";
  264. import { getWindFieldNames } from "@/api/ledger.js";
  265. import { log } from "plotly.js-dist";
  266. export default {
  267. data() {
  268. return {
  269. dialogVisible: false,
  270. dataset: [],
  271. windFarmCount: "",
  272. typevalue: "",
  273. typeoptions: [],
  274. statevalue: "",
  275. incoming: {},
  276. stateoptions: [
  277. {
  278. transferStatus: -1,
  279. label: "等待导入",
  280. },
  281. {
  282. transferStatus: 0,
  283. label: "导入中",
  284. },
  285. {
  286. transferStatus: 1,
  287. label: "导入成功",
  288. },
  289. {
  290. transferStatus: 2,
  291. label: "导入失败",
  292. },
  293. ],
  294. activeNames: ["1"],
  295. windvalue: "",
  296. windoptions: [],
  297. currentPage: 1, // 当前页
  298. pageSize: 10, // 每页显示条数
  299. total: 0,
  300. drawer: false,
  301. tableData: [],
  302. Rklist: [],
  303. nameinput: "",
  304. transitionShow: false,
  305. innerVisible: false,
  306. form: {
  307. wind: "",
  308. type: "",
  309. path: "",
  310. name: "",
  311. id: null,
  312. },
  313. formRules: {
  314. wind: [{ required: true, message: "请选择风场", trigger: "blur" }],
  315. type: [{ required: true, message: "请选择转换类型", trigger: "blur" }],
  316. path: [{ required: true, message: "请输入读取路径", trigger: "blur" }],
  317. name: [{ required: true, message: "请输入收资人", trigger: "blur" }],
  318. },
  319. };
  320. },
  321. created() {
  322. this.getchaxun();
  323. this.gettongji();
  324. this.getzuijin();
  325. this.windsite();
  326. this.query();
  327. },
  328. methods: {
  329. load() {
  330. this.count += 2;
  331. },
  332. async getchaxun() {
  333. const params = {
  334. type: "trans_type", // 假设 trans_type 是你传递的参数
  335. };
  336. try {
  337. const res = await axios.get("/ETLapi/sysConf/getByType", { params });
  338. this.typeoptions = res.data.datas;
  339. } catch (error) {
  340. console.error("Error fetching data:", error);
  341. }
  342. },
  343. async gettongji() {
  344. try {
  345. const res = await axios.post("/ETLapi/dataTransfer/getStatisticalData");
  346. this.windFarmCount = res.data.datas.windFarmCount;
  347. } catch (error) {
  348. console.error("Error fetching data:", error);
  349. }
  350. },
  351. async getzuijin() {
  352. try {
  353. const res = await axios.post(
  354. "/ETLapi/dataTransfer/recentlyImportedSuccessfulData"
  355. );
  356. this.incoming = res.data.datas;
  357. } catch (error) {
  358. console.error("Error fetching data:", error);
  359. }
  360. },
  361. async windsite() {
  362. try {
  363. const res = await getWindFieldNames();
  364. this.windoptions = res.data;
  365. } catch (error) {
  366. console.error("Error fetching data:", error);
  367. }
  368. },
  369. async query() {
  370. const params = {
  371. pageNo: this.currentPage,
  372. pageSize: this.pageSize,
  373. transferStatus: this.statevalue,
  374. transferType: this.typevalue,
  375. windFarmCode: this.windvalue,
  376. };
  377. try {
  378. const res = await axios.post(
  379. "/ETLapi/dataTransfer/getDataTransfer",
  380. params
  381. );
  382. this.tableData = res.data.datas;
  383. this.total = res.data.totalCount;
  384. } catch (error) {
  385. console.error("Error fetching data:", error);
  386. }
  387. },
  388. handleSizeChange(newSize) {
  389. this.pageSize = newSize;
  390. this.query(); // 更新后重新请求数据
  391. },
  392. // 处理页码变化
  393. handleCurrentChange(page) {
  394. this.currentPage = page; // 更新当前页
  395. this.query(); // 重新请求数据
  396. },
  397. reset() {
  398. this.windvalue = "";
  399. this.typevalue = "";
  400. this.statevalue = "";
  401. this.currentPage = 1;
  402. this.query();
  403. },
  404. restart(row) {
  405. axios
  406. .get(`/ETLapi/dataTransfer/reTransfer/${row.id}`)
  407. .then((res) => {
  408. if (res.data.code === 200) {
  409. this.$message({
  410. message: "重新导入成功",
  411. type: "success",
  412. });
  413. this.query();
  414. }
  415. if (res.data.code === 500) {
  416. this.$message.error(res.data.message);
  417. }
  418. })
  419. .catch((error) => {
  420. console.error("Error fetching data:", error);
  421. });
  422. },
  423. database() {
  424. this.drawer = true;
  425. axios
  426. .post(`/ETLapi/dataTransfer/classificationImportDataDetails`)
  427. .then((res) => {
  428. if (res.data.code === 200) {
  429. this.Rklist = res.data.datas;
  430. }
  431. if (res.data.code === 500) {
  432. this.$message.error(res.data.message);
  433. }
  434. })
  435. .catch((error) => {
  436. console.error("Error fetching data:", error);
  437. });
  438. },
  439. details(windFarmCode, type) {
  440. // console.log(windFarmCode, type);
  441. // return;
  442. const params = {
  443. pageNo: "1",
  444. pageSize: "999",
  445. transferStatus: 1,
  446. transferType: type.transferType,
  447. windFarmCode: windFarmCode,
  448. };
  449. axios
  450. .post("/ETLapi/dataTransfer/getDataTransfer", params)
  451. .then((res) => {
  452. if (res.data.datas.length === 0) {
  453. // 判断是否为0,避免与字符串 "0" 比较
  454. this.$message("当前数据暂无入库信息!");
  455. } else {
  456. this.dialogVisible = true;
  457. this.dataset = res.data.datas;
  458. }
  459. })
  460. .catch((error) => {
  461. console.error("Error fetching data:", error);
  462. });
  463. },
  464. newtransition() {
  465. this.transitionShow = true;
  466. },
  467. editor(row) {
  468. // return
  469. this.transitionShow = true;
  470. this.form.name = row.dataCollector;
  471. this.form.path = row.readDir;
  472. this.form.type = row.transferType;
  473. this.form.wind = row.windFarmCode;
  474. this.form.id = row.id;
  475. },
  476. onSubmit() {
  477. this.$refs.form.validate((valid) => {
  478. if (valid) {
  479. // 表单验证通过,执行提交操作
  480. const currentTime = this.$formatDateTWO(new Date());
  481. const selectedWind = this.windoptions.find(
  482. (option) => option.fieldCode === this.form.wind
  483. );
  484. const selectedType = this.typeoptions.find(
  485. (option) => option.paramKey === this.form.type
  486. );
  487. const windLabel = selectedWind ? selectedWind.fieldName : "";
  488. const typeLabel = selectedType ? selectedType.paramValue : "";
  489. // 拼接 nameinput
  490. this.nameinput = `${windLabel}${typeLabel}${currentTime}`;
  491. this.innerVisible = true;
  492. } else {
  493. console.log("表单验证失败");
  494. }
  495. });
  496. },
  497. onruku() {
  498. const params = {
  499. dataCollector: this.form.name,
  500. readDir: this.form.path,
  501. taskName: this.nameinput,
  502. transferType: this.form.type,
  503. windFarmCode: this.form.wind,
  504. windFarmName:
  505. this.windoptions.find((option) => option.fieldCode === this.form.wind)
  506. ?.fieldName || "",
  507. };
  508. let apiUrl = "/ETLapi/dataTransfer/addDataTransferTask"; // 默认是新增
  509. if (this.form.id) {
  510. // 如果有 id,说明是编辑
  511. apiUrl = "/ETLapi/dataTransfer/editDataTransferTask";
  512. params.id = this.form.id; // 传递 id
  513. }
  514. axios.post(apiUrl, params).then((res) => {
  515. this.innerVisible = false;
  516. this.transitionShow = false;
  517. if (res.data.code === 200) {
  518. this.$message({
  519. message: "操作成功",
  520. type: "success",
  521. });
  522. this.query();
  523. }
  524. if (res.data.code === 500) {
  525. this.$message.error(res.data.message);
  526. }
  527. });
  528. },
  529. },
  530. };
  531. </script>
  532. <style lang="scss" scoped>
  533. .transition-page {
  534. min-height: calc(100vh - 120px);
  535. width: 100%;
  536. padding: 12px 16px;
  537. background: var(--transition-page-bg, var(--panel-bg, #ffffff));
  538. color: var(--transition-page-text, #303133);
  539. box-sizing: border-box;
  540. ::v-deep .transition-collapse {
  541. border: 1px solid var(--transition-border-color, #ebeef5) !important;
  542. border-radius: 4px;
  543. overflow: hidden;
  544. .el-collapse-item__header {
  545. height: 40px;
  546. line-height: 40px;
  547. padding: 0 12px;
  548. font-weight: 600;
  549. font-size: 15px;
  550. background: var(--transition-collapse-header-bg, var(--primary-color, #008080)) !important;
  551. color: var(--transition-collapse-header-text, #ffffff) !important;
  552. border-bottom-color: var(--transition-border-color, #ebeef5) !important;
  553. }
  554. .el-collapse-item__wrap {
  555. background: var(--transition-collapse-body-bg, #ffffff) !important;
  556. border-bottom-color: var(--transition-border-color, #ebeef5) !important;
  557. }
  558. .el-collapse-item__content {
  559. padding: 10px 12px 6px;
  560. color: var(--transition-page-text, #303133);
  561. background: var(--transition-collapse-body-bg, #ffffff);
  562. }
  563. }
  564. .incoming-desc {
  565. margin-top: 8px;
  566. ::v-deep .el-descriptions__header {
  567. margin-bottom: 8px;
  568. }
  569. ::v-deep .el-descriptions__title {
  570. font-size: 14px;
  571. color: var(--transition-page-text, #303133);
  572. }
  573. ::v-deep .el-descriptions__label {
  574. color: #606266;
  575. }
  576. ::v-deep .el-descriptions__content {
  577. color: var(--transition-page-text, #303133);
  578. }
  579. ::v-deep .el-descriptions-item__cell {
  580. padding: 6px 10px !important;
  581. }
  582. }
  583. .condition {
  584. display: flex;
  585. flex-wrap: wrap;
  586. align-items: center;
  587. gap: 12px 16px;
  588. padding: 10px 0 8px;
  589. margin-top: 4px;
  590. border-bottom: 1px solid var(--transition-border-color, #ebeef5);
  591. }
  592. .condition-item {
  593. display: flex;
  594. align-items: center;
  595. gap: 8px;
  596. }
  597. .condition-label {
  598. color: var(--transition-label-color, #606266);
  599. white-space: nowrap;
  600. font-size: 14px;
  601. }
  602. .condition-actions {
  603. display: flex;
  604. align-items: center;
  605. gap: 8px;
  606. margin-left: auto;
  607. }
  608. .table-section {
  609. margin-top: 8px;
  610. }
  611. }
  612. .CPC {
  613. border: 1px solid var(--transition-badge-border, var(--primary-color, #008080));
  614. background: var(--transition-badge-bg, rgba(0, 128, 128, 0.08));
  615. display: inline-block;
  616. padding: 6px 12px;
  617. margin: 0 0 4px;
  618. color: var(--transition-page-text, #303133);
  619. border-radius: 4px;
  620. cursor: pointer;
  621. font-size: 14px;
  622. line-height: 1.4;
  623. span {
  624. color: var(--transition-badge-accent, var(--primary-color, #008080));
  625. font-weight: 600;
  626. }
  627. &:hover {
  628. background: var(--transition-badge-bg-hover, rgba(0, 128, 128, 0.15));
  629. }
  630. }
  631. .demo-table-expand {
  632. font-size: 0;
  633. }
  634. .demo-table-expand label {
  635. width: 90px;
  636. color: var(--transition-label-color, #606266);
  637. }
  638. .demo-table-expand .el-form-item {
  639. margin-right: 0;
  640. margin-bottom: 0;
  641. width: 50%;
  642. }
  643. .fenye {
  644. display: flex;
  645. justify-content: center;
  646. padding: 12px 0 4px;
  647. }
  648. .card {
  649. margin: 8px 16px;
  650. border-radius: 4px;
  651. padding: 12px 16px;
  652. border: 1px solid var(--transition-border-color, #ebeef5);
  653. background: var(--transition-card-bg, #ffffff);
  654. color: var(--transition-page-text, #303133);
  655. box-shadow: none;
  656. p {
  657. font-weight: 600;
  658. font-size: 15px;
  659. margin: 0 0 8px;
  660. }
  661. ul {
  662. padding-left: 0;
  663. margin: 0;
  664. list-style: none;
  665. li {
  666. padding: 6px 8px;
  667. border-radius: 4px;
  668. }
  669. li:hover {
  670. background: var(--transition-card-hover-bg, rgba(0, 128, 128, 0.08));
  671. color: var(--transition-page-text, #303133);
  672. cursor: pointer;
  673. }
  674. span {
  675. display: inline-block;
  676. }
  677. .sp1 {
  678. width: 120px;
  679. }
  680. .sp2 {
  681. width: 50px;
  682. }
  683. }
  684. }
  685. .renwu {
  686. display: flex;
  687. .el-input {
  688. width: 400px;
  689. margin-right: 20px;
  690. }
  691. }
  692. .demo-table-expand {
  693. display: flex;
  694. flex-wrap: wrap;
  695. /* 允许换行 */
  696. gap: 0px;
  697. /* 子元素间距 */
  698. }
  699. .demo-table-expand .el-form-item {
  700. flex: 1 1 100%;
  701. /* 每个表单项占满一行 */
  702. display: inline-flex;
  703. /* 让每个项都在一行显示 */
  704. margin-bottom: 0;
  705. /* 去掉多余的底部边距 */
  706. }
  707. .demo-table-expand .el-form-item label {
  708. width: 120px;
  709. /* 可以根据需要调整标签宽度 */
  710. margin-right: 10px;
  711. /* 标签和内容的间距 */
  712. }
  713. .demo-table-expand .el-form-item span {
  714. flex: 1;
  715. /* 内容占满剩余空间 */
  716. }
  717. /* 确保 label 能根据内容换行 */
  718. .form-item {
  719. display: flex;
  720. /* 使用 Flexbox 布局 */
  721. flex-wrap: wrap;
  722. /* 允许换行 */
  723. align-items: center;
  724. /* 标签和内容在垂直方向上对齐 */
  725. }
  726. .form-item label {
  727. white-space: normal;
  728. /* 允许标签文本换行 */
  729. word-wrap: break-word;
  730. /* 自动断行 */
  731. max-width: 150px;
  732. /* 限制标签宽度,防止过长 */
  733. }
  734. .form-item span {
  735. flex: 1;
  736. /* 内容部分占满剩余空间 */
  737. word-wrap: break-word;
  738. /* 内容部分也允许换行 */
  739. white-space: normal;
  740. /* 内容部分的文本能自动换行 */
  741. }
  742. .scrollable-list {
  743. height: 400px;
  744. overflow-y: auto;
  745. color: var(--transition-page-text, #303133);
  746. padding: 0;
  747. margin: 0;
  748. list-style: none;
  749. }
  750. .scrollable-list::-webkit-scrollbar {
  751. width: 8px;
  752. }
  753. .scrollable-list::-webkit-scrollbar-track {
  754. background: var(--transition-scrollbar-track, #f5f7fa);
  755. border-radius: 4px;
  756. }
  757. .scrollable-list::-webkit-scrollbar-thumb {
  758. background: var(--transition-scrollbar-thumb, #dcdfe6);
  759. border-radius: 4px;
  760. }
  761. .scrollable-list::-webkit-scrollbar-thumb:hover {
  762. background: var(--transition-scrollbar-thumb-hover, #c0c4cc);
  763. }
  764. ::v-deep .transition-drawer .el-drawer__header > :first-child,
  765. ::v-deep .transition-dialog .el-dialog__title {
  766. font-size: 16px;
  767. font-weight: 600;
  768. color: var(--transition-page-text, #303133);
  769. }
  770. .demo-table-expand {
  771. padding-left: 60px;
  772. }
  773. </style>