index.vue 24 KB

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