index.vue 25 KB

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