index.vue 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792
  1. <template>
  2. <div class="supervision-doc-number-manage">
  3. <div class="supervision-doc-content-container">
  4. <!-- 左侧分类树 -->
  5. <div class="category-tree">
  6. <el-input
  7. v-model="filterText"
  8. style="width: 80%"
  9. placeholder="输入关键字进行过滤"
  10. clearable
  11. prefix-icon="el-icon-search"
  12. ></el-input>
  13. <el-tree
  14. ref="typeTree"
  15. :data="categoryData"
  16. node-key="id"
  17. default-expand-all
  18. :props="{
  19. label: 'documentName',
  20. value: 'id',
  21. }"
  22. :expand-on-click-node="false"
  23. :filter-node-method="filterNode"
  24. @node-click="handleNodeClick"
  25. ></el-tree>
  26. </div>
  27. <!-- 右侧内容区域 -->
  28. <div class="right-content">
  29. <!-- 搜索区域 -->
  30. <div class="search-plane">
  31. <el-form :inline="true" size="small">
  32. <!-- 文号名称输入框 -->
  33. <el-form-item label="文号名称:">
  34. <el-input
  35. v-model="searchForm.whName"
  36. placeholder="请输入"
  37. clearable
  38. ></el-input>
  39. </el-form-item>
  40. <!-- 搜索和重置按钮 -->
  41. <el-form-item>
  42. <el-button
  43. icon="el-icon-search"
  44. type="primary"
  45. @click="handleSearch"
  46. >
  47. 搜索
  48. </el-button>
  49. <el-button
  50. plain
  51. type="primary"
  52. icon="el-icon-refresh"
  53. @click="handleReset"
  54. >
  55. 重置
  56. </el-button>
  57. </el-form-item>
  58. </el-form>
  59. </div>
  60. <!-- 操作按钮区域 -->
  61. <div class="operation-bar">
  62. <!-- v-region-permission="{
  63. category: 'auditDocNoManage',
  64. action: 'add',
  65. }" -->
  66. <el-button
  67. plain
  68. type="success"
  69. icon="el-icon-circle-plus"
  70. @click="handleAdd"
  71. >
  72. 添加
  73. </el-button>
  74. <el-button
  75. v-region-permission="{
  76. category: 'auditDocNoManage',
  77. action: 'delete',
  78. }"
  79. plain
  80. type="danger"
  81. icon="el-icon-delete"
  82. :disabled="selectedRows.length === 0"
  83. @click="handleDelete"
  84. >
  85. 删除
  86. </el-button>
  87. </div>
  88. <!-- 数据表格 -->
  89. <CostAuditTable
  90. ref="costAuditTable"
  91. :table-data="tableData"
  92. :columns="columns"
  93. :show-selection="true"
  94. :show-index="true"
  95. :show-pagination="true"
  96. :show-action-column="true"
  97. :pagination="{
  98. currentPage: currentPage,
  99. pageSize: pageSize,
  100. total: total,
  101. }"
  102. @selection-change="handleSelectionChange"
  103. @pagination-change="handlePaginationChange"
  104. >
  105. <template #updateTime="{ row }">
  106. <div>
  107. {{ row.updateTime ? row.updateTime.split(' ')[0] : '' }}
  108. </div>
  109. <div>
  110. {{ row.updateTime ? row.updateTime.split(' ')[1] : '' }}
  111. </div>
  112. </template>
  113. <template #action="{ row }">
  114. <!-- v-region-permission="{
  115. category: 'auditReviewDocManage',
  116. action: 'view',
  117. }" -->
  118. <el-button type="text" size="mini" @click="handleDetail(row)">
  119. 详情
  120. </el-button>
  121. <!-- v-region-permission="{
  122. category: 'auditReviewDocManage',
  123. action: 'edit',
  124. }" -->
  125. <el-button type="text" size="mini" @click="handleEdit(row)">
  126. 修改
  127. </el-button>
  128. <!-- v-region-permission="{
  129. category: 'auditReviewDocManage',
  130. action: 'delete',
  131. }" -->
  132. <el-button
  133. type="text"
  134. size="mini"
  135. class="delete-btn"
  136. @click="handleDeleteRow(row)"
  137. >
  138. 删除
  139. </el-button>
  140. </template>
  141. </CostAuditTable>
  142. <!-- 添加/修改弹窗 -->
  143. <el-dialog
  144. :title="dialogTitle"
  145. :visible.sync="dialogVisible"
  146. width="65%"
  147. :close-on-click-modal="false"
  148. >
  149. <!-- 弹窗内容保持不变 -->
  150. <div class="dialog-content">
  151. <el-form
  152. ref="docForm"
  153. :model="formData"
  154. :rules="formRules"
  155. label-width="120px"
  156. size="small"
  157. :disabled="dialogTitle == '详情'"
  158. >
  159. <el-row :gutter="20">
  160. <el-col :span="12">
  161. <!-- 适用区域 -->
  162. <el-form-item label="适用区域:" prop="areaCode" required>
  163. <el-cascader
  164. v-model="formData.areaCode"
  165. style="width: 100%"
  166. :options="districtTree"
  167. :props="districtTreeCascaderProps"
  168. :show-all-levels="false"
  169. clearable
  170. ></el-cascader>
  171. </el-form-item>
  172. </el-col>
  173. <el-col :span="12">
  174. <el-form-item label="文号分类:" prop="whType" required>
  175. <el-select v-model="formData.whType" style="width: 100%">
  176. <el-option
  177. v-for="item in whTypeOptions"
  178. :key="item.id"
  179. :label="item.documentName"
  180. :value="item.id"
  181. ></el-option>
  182. </el-select>
  183. </el-form-item>
  184. </el-col>
  185. </el-row>
  186. <el-row :gutter="20">
  187. <el-col :span="12">
  188. <!-- 文号名称 -->
  189. <el-form-item label="文号名称:" prop="whName" required>
  190. <el-input
  191. v-model="formData.whName"
  192. v-pinyin-abbreviation="{
  193. target: 'formData.alias',
  194. }"
  195. placeholder="请输入"
  196. maxlength="50"
  197. show-word-limit
  198. ></el-input>
  199. </el-form-item>
  200. </el-col>
  201. <el-col :span="12">
  202. <!-- 文号别名 -->
  203. <el-form-item label="文号别名:" prop="alias" required>
  204. <el-input
  205. v-model="formData.alias"
  206. placeholder="请输入"
  207. ></el-input>
  208. </el-form-item>
  209. </el-col>
  210. </el-row>
  211. <el-row :gutter="20">
  212. <el-col :span="12">
  213. <el-form-item label="文号前缀:" prop="prefixText" required>
  214. <el-input
  215. v-model="formData.prefixText"
  216. placeholder="请输入文号前缀,例如:晋"
  217. ></el-input>
  218. </el-form-item>
  219. </el-col>
  220. <el-col :span="12">
  221. <el-form-item label="年号:" prop="year" required>
  222. <el-input
  223. v-model="formData.year"
  224. placeholder="请输入年号,例如:2025"
  225. ></el-input>
  226. </el-form-item>
  227. </el-col>
  228. </el-row>
  229. <el-row :gutter="20">
  230. <el-col :span="12">
  231. <el-form-item
  232. label="当前流水号值:"
  233. prop="currentValue"
  234. required
  235. >
  236. <el-input
  237. v-model="formData.currentValue"
  238. placeholder="请输入当前流水号值"
  239. ></el-input>
  240. </el-form-item>
  241. </el-col>
  242. <el-col :span="12">
  243. <!-- 文号规则 -->
  244. <el-form-item label="文号规则:" prop="rulePattern" required>
  245. <el-input
  246. v-model="formData.rulePattern"
  247. placeholder="请输入"
  248. show-word-limit
  249. ></el-input>
  250. 例如: {文号前缀}成审 {年份} {当前流水号值}号
  251. </el-form-item>
  252. </el-col>
  253. </el-row>
  254. <el-row :gutter="20">
  255. <el-col :span="12">
  256. <!-- : incremental-递增, daily-每天生成, monthly-每月生成, yearly-每年生成-->
  257. <el-form-item label="生成类型:" prop="generateType" required>
  258. <el-radio-group v-model="formData.generateType">
  259. <el-radio
  260. v-for="item in dictData['whGenerateType']"
  261. :key="item.id"
  262. :label="item.key"
  263. >
  264. {{ item.name }}
  265. </el-radio>
  266. </el-radio-group>
  267. </el-form-item>
  268. </el-col>
  269. <el-col :span="12">
  270. <!-- 文号长度 -->
  271. <el-form-item label="文号长度:" prop="serialLength">
  272. <el-input
  273. v-model.number="formData.serialLength"
  274. placeholder="请输入"
  275. type="number"
  276. min="1"
  277. max="20"
  278. ></el-input>
  279. </el-form-item>
  280. </el-col>
  281. </el-row>
  282. <el-row :gutter="20">
  283. <el-col :span="12">
  284. <!-- 初始值 -->
  285. <el-form-item label="初始值:" prop="initialValue">
  286. <el-input
  287. v-model.number="formData.initialValue"
  288. placeholder="请输入"
  289. type="number"
  290. min="0"
  291. show-word-limit
  292. ></el-input>
  293. </el-form-item>
  294. </el-col>
  295. </el-row>
  296. <!-- 步长 -->
  297. <!-- <el-row :gutter="20">
  298. <el-col :span="12">
  299. <el-form-item label="步长:" prop="step">
  300. <el-input
  301. v-model.number="formData.step"
  302. placeholder="请输入"
  303. type="number"
  304. min="1"
  305. ></el-input>
  306. </el-form-item>
  307. </el-col>
  308. <el-col :span="12">
  309. <div class="step-desc">
  310. <p>
  311. 这个增加值表示文号部分(NO)的增加值,如2015102700001,步长为1,则文号部分的增加值为00001。
  312. </p>
  313. </div>
  314. </el-col>
  315. </el-row> -->
  316. </el-form>
  317. </div>
  318. <div slot="footer" class="dialog-footer">
  319. <el-button type="primary" @click="handleSave">确认</el-button>
  320. <el-button @click="dialogVisible = false">取消</el-button>
  321. </div>
  322. </el-dialog>
  323. </div>
  324. </div>
  325. </div>
  326. </template>
  327. <script>
  328. import {
  329. getData,
  330. addEntity,
  331. updateEntity,
  332. deleteById,
  333. batchDelete,
  334. getDetail,
  335. } from '@/api/auditDocNoManage'
  336. import { getWhCateList } from '@/api/auditReviewDocManage.js'
  337. import { dictMixin, regionMixin } from '@/mixins/useDict'
  338. import CostAuditTable from '@/components/costAudit/CostAuditTable.vue'
  339. export default {
  340. name: 'SupervisionDocNumberManage',
  341. components: {
  342. CostAuditTable,
  343. },
  344. mixins: [dictMixin, regionMixin],
  345. data() {
  346. return {
  347. dictData: {
  348. whGenerateType: [],
  349. },
  350. filterText: '',
  351. isExpand: true,
  352. // 搜索表单数据
  353. searchForm: {
  354. whName: '',
  355. whType: '',
  356. },
  357. // 分类树数据 - 增加更多分类 使用字典
  358. categoryData: [
  359. {
  360. documentName: '文号分类',
  361. children: [],
  362. },
  363. ],
  364. // 表格数据
  365. tableData: [],
  366. // 当前页码
  367. currentPage: 1,
  368. // 每页显示条数
  369. pageSize: 50,
  370. // 总记录数
  371. total: 0,
  372. // 选中的行数据
  373. selectedRows: [],
  374. // 选中的分类
  375. selectedCategories: [],
  376. // 弹窗相关
  377. dialogVisible: false,
  378. dialogTitle: '',
  379. isEdit: false,
  380. // 详情弹窗相关
  381. detailVisible: false,
  382. detailData: {},
  383. // 表单数据 - 完整结构
  384. formData: {
  385. whName: '',
  386. alias: '',
  387. currentValue: '',
  388. rulePattern: '{prefixText}成审 {year} {currentValue}号',
  389. generateType: '',
  390. serialLength: 5,
  391. initialValue: 1,
  392. // step: 1,
  393. areaCode: [],
  394. whType: '',
  395. },
  396. // 表单验证规则
  397. formRules: {
  398. whName: [
  399. { required: true, message: '请输入文号名称', trigger: 'blur' },
  400. { max: 50, message: '文号名称不能超过50个字符', trigger: 'blur' },
  401. ],
  402. alias: [
  403. { required: true, message: '请输入文号别名', trigger: 'blur' },
  404. ],
  405. currentValue: [
  406. { required: true, message: '请输入当前流水号值', trigger: 'blur' },
  407. ],
  408. rulePattern: [
  409. { required: true, message: '请输入文号规则', trigger: 'blur' },
  410. ],
  411. generateType: [
  412. { required: true, message: '请选择生成类型', trigger: 'change' },
  413. ],
  414. serialLength: [
  415. { required: true, message: '请输入文号长度', trigger: 'blur' },
  416. ],
  417. initialValue: [
  418. { required: true, message: '请输入初始值', trigger: 'blur' },
  419. ],
  420. // step: [{ required: true, message: '请输入步长', trigger: 'blur' }],
  421. areaCode: [
  422. { required: true, message: '请选择适用区域', trigger: 'change' },
  423. ],
  424. },
  425. whTypeOptions: [],
  426. // 表格列配置
  427. columns: [
  428. {
  429. prop: 'whType',
  430. label: '文号分类',
  431. showOverflowTooltip: true,
  432. align: 'center',
  433. formatter: (row) => {
  434. let documentName =
  435. this.whTypeOptions.find((item) => item.id == row.whType)
  436. ?.documentName || '-'
  437. return documentName
  438. },
  439. },
  440. {
  441. prop: 'whName',
  442. label: '文号名称',
  443. showOverflowTooltip: true,
  444. align: 'center',
  445. },
  446. {
  447. prop: 'areaCode',
  448. label: '适用区域',
  449. showOverflowTooltip: true,
  450. align: 'center',
  451. formatter: (row) => this.regionNameMap[row.areaCode] || '-',
  452. },
  453. {
  454. prop: 'generateType',
  455. label: '生成类型',
  456. showOverflowTooltip: true,
  457. align: 'center',
  458. width: 120,
  459. formatter: (row) =>
  460. this.getDictName('whGenerateType', row.generateType),
  461. },
  462. {
  463. prop: 'createBy',
  464. label: '创建人',
  465. showOverflowTooltip: true,
  466. align: 'center',
  467. width: 120,
  468. },
  469. {
  470. prop: 'updateTime',
  471. label: '最后更新时间',
  472. showOverflowTooltip: true,
  473. align: 'center',
  474. width: 120,
  475. slotName: 'updateTime',
  476. },
  477. {
  478. prop: 'action',
  479. label: '操作',
  480. align: 'center',
  481. width: 150,
  482. slotName: 'action',
  483. },
  484. ],
  485. }
  486. },
  487. watch: {
  488. // 添加对filterText的监听,当它变化时触发树的过滤
  489. filterText(val) {
  490. if (this.$refs.typeTree) {
  491. this.$refs.typeTree.filter(val)
  492. }
  493. },
  494. },
  495. mounted() {
  496. // 加载分类数据
  497. this.getCategoryData()
  498. // 页面加载时获取数据
  499. this.getTableData()
  500. },
  501. methods: {
  502. async getCategoryData() {
  503. try {
  504. const res = await getWhCateList()
  505. this.categoryData[0].children = res.value || []
  506. this.whTypeOptions = res.value
  507. } catch (error) {
  508. console.error('获取分类数据失败:', error)
  509. }
  510. },
  511. // 节点点击事件处理
  512. handleNodeClick(data) {
  513. // 如果点击的是子节点,直接使用其dictValue
  514. // 如果点击的是父节点,不进行筛选
  515. if (!data.children) {
  516. this.selectedCategories = [data.id]
  517. this.searchForm.whType = data.id
  518. // 重置分页并重新获取数据
  519. this.currentPage = 1
  520. this.getTableData()
  521. }
  522. },
  523. // 过滤树节点
  524. filterNode(value, data) {
  525. if (!value) return true
  526. const searchValue = value.toLowerCase()
  527. const dictLabelMatch =
  528. data.documentName &&
  529. data.documentName.toLowerCase().includes(searchValue)
  530. return dictLabelMatch
  531. },
  532. // 获取表格数据
  533. async getTableData() {
  534. try {
  535. const params = {
  536. pageSize: this.pageSize,
  537. page: this.currentPage,
  538. ...this.searchForm,
  539. }
  540. const response = await getData(params)
  541. this.tableData = response.value.records || []
  542. this.total = response.value.total || 0
  543. this.fetchRegionNames(this.tableData, 'areaCode')
  544. } catch (error) {
  545. console.error('获取数据失败:', error)
  546. }
  547. },
  548. // 搜索按钮点击事件
  549. handleSearch() {
  550. this.currentPage = 1
  551. this.getTableData()
  552. },
  553. // 重置按钮点击事件
  554. handleReset() {
  555. this.searchForm = {
  556. whName: '',
  557. }
  558. this.selectedCategories = []
  559. this.currentPage = 1
  560. this.getTableData()
  561. },
  562. // 添加按钮点击事件
  563. handleAdd() {
  564. this.isEdit = false
  565. this.dialogTitle = '添加文号'
  566. this.formData = {
  567. whName: '',
  568. alias: '',
  569. currentValue: '',
  570. rulePattern: '{prefixText}成审 {year} {currentValue}号',
  571. generateType: '',
  572. serialLength: 5,
  573. initialValue: 1,
  574. // step: 1,
  575. areaCode: [],
  576. whType: this.searchForm.whType,
  577. }
  578. // 清空表单验证
  579. this.$nextTick(() => {
  580. this.$refs.docForm.clearValidate()
  581. })
  582. this.dialogVisible = true
  583. },
  584. // 修改按钮点击事件
  585. handleEdit(row) {
  586. this.isEdit = true
  587. this.dialogTitle = '修改文号'
  588. getDetail({ id: row.id }).then((res) => {
  589. this.formData = {
  590. ...res.value,
  591. areaCode: [
  592. res.value.province,
  593. ...(row.areaLevel >= 1 ? [res.value.city] : []),
  594. ...(row.areaLevel === 2 ? [res.value.areaCode] : []),
  595. ].filter(Boolean),
  596. whType: Number(res.value.whType),
  597. rulePattern: '{prefixText}成审 {year} {currentValue}号',
  598. }
  599. // 清空表单验证
  600. this.$nextTick(() => {
  601. this.$refs.docForm.clearValidate()
  602. })
  603. this.dialogVisible = true
  604. })
  605. },
  606. // 保存按钮点击事件 - 添加错误提示
  607. async handleSave() {
  608. this.$refs.docForm.validate(async (valid) => {
  609. if (valid) {
  610. let data = {
  611. ...this.formData,
  612. areaCode:
  613. this.formData.areaCode[this.formData.areaCode.length - 1],
  614. areaLevel: this.formData.areaCode.length - 1,
  615. }
  616. try {
  617. if (this.isEdit) {
  618. // 处理修改逻辑
  619. await updateEntity(data)
  620. this.$message.success('修改成功')
  621. } else {
  622. // 处理添加逻辑
  623. await addEntity(data)
  624. this.$message.success('添加成功')
  625. }
  626. this.dialogVisible = false
  627. // 重新获取数据
  628. this.getTableData()
  629. } catch (error) {
  630. console.error('保存失败:', error)
  631. // this.$message.error('保存失败,请重试')
  632. }
  633. } else {
  634. this.$message.error('请填写表单数据')
  635. }
  636. })
  637. },
  638. // 删除按钮点击事件
  639. async handleDelete() {
  640. if (this.selectedRows.length === 0) {
  641. this.$message.warning('请先选择要删除的记录')
  642. return
  643. }
  644. this.$confirm('确定要删除选中的记录吗?', '提示', {
  645. confirmButtonText: '确定',
  646. cancelButtonText: '取消',
  647. type: 'warning',
  648. })
  649. .then(async () => {
  650. try {
  651. // 获取选中行的ID列表
  652. const ids = this.selectedRows.map((row) => row.id)
  653. // 调用批量删除API
  654. const response = await batchDelete(ids)
  655. this.$message.success('删除成功')
  656. // 重新获取数据
  657. this.getTableData()
  658. this.selectedRows = []
  659. } catch (error) {
  660. console.error('删除失败:', error)
  661. }
  662. })
  663. .catch(() => {
  664. this.$message.info('已取消删除')
  665. })
  666. },
  667. // 选中行变化事件
  668. handleSelectionChange(val) {
  669. this.selectedRows = val
  670. },
  671. // 分类树选中变化事件 - 用于筛选表格数据
  672. handleCategoryChange(checkedKeys, halfCheckedKeys) {
  673. this.selectedCategories = checkedKeys
  674. // 重置分页
  675. this.currentPage = 1
  676. // 重新获取数据
  677. this.getTableData()
  678. },
  679. // 详情按钮点击事件 - 打开详情弹窗
  680. handleDetail(row) {
  681. getDetail({ id: row.id }).then((res) => {
  682. this.formData = {
  683. ...res.value,
  684. areaCode: [
  685. res.value.province,
  686. ...(row.areaLevel >= 1 ? [res.value.city] : []),
  687. ...(row.areaLevel === 2 ? [res.value.areaCode] : []),
  688. ].filter(Boolean),
  689. whType: Number(res.value.whType),
  690. }
  691. // 清空表单验证
  692. this.$nextTick(() => {
  693. this.$refs.docForm.clearValidate()
  694. })
  695. this.dialogVisible = true
  696. this.dialogVisible = true
  697. this.dialogTitle = '详情'
  698. })
  699. },
  700. // 单个删除按钮点击事件
  701. async handleDeleteRow(row) {
  702. this.$confirm('确定要删除该记录吗?', '提示', {
  703. confirmButtonText: '确定',
  704. cancelButtonText: '取消',
  705. type: 'warning',
  706. })
  707. .then(async () => {
  708. try {
  709. // 调用单个删除API
  710. const response = await deleteById({ id: row.id })
  711. this.$message.success('删除成功')
  712. // 重新获取数据
  713. this.getTableData()
  714. } catch (error) {
  715. console.error('删除失败:', error)
  716. }
  717. })
  718. .catch(() => {
  719. this.$message.info('已取消删除')
  720. })
  721. },
  722. // 分页变化事件处理
  723. handlePaginationChange({ currentPage, pageSize }) {
  724. this.currentPage = currentPage
  725. this.pageSize = pageSize
  726. this.getTableData()
  727. },
  728. },
  729. }
  730. </script>
  731. <style scoped lang="scss">
  732. @import '@/styles/costAudit.scss';
  733. /* 内容容器 - 包含左侧分类树和右侧内容 */
  734. .supervision-doc-number-manage {
  735. width: 100%;
  736. padding: 20px;
  737. }
  738. .supervision-doc-content-container {
  739. display: flex;
  740. }
  741. /* 左侧分类树样式 */
  742. .category-tree {
  743. width: 240px;
  744. flex-shrink: 0;
  745. border: 1px solid #dbd8d8;
  746. padding: 10px;
  747. height: calc(100vh - 260px);
  748. overflow-y: auto;
  749. }
  750. /* 右侧内容区域 */
  751. .right-content {
  752. width: 80%;
  753. margin-left: 20px;
  754. /* 确保在小屏幕上有足够空间 */
  755. min-width: 0;
  756. }
  757. /* 弹窗内容区域样式 */
  758. .dialog-content {
  759. max-height: 500px;
  760. overflow-y: auto;
  761. }
  762. /* 详情弹窗描述项样式 */
  763. .el-descriptions__label {
  764. font-weight: bold;
  765. }
  766. </style>