From 0db8c9b94a9ac655549d5eba5c2a6c92ac386c06 Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期四, 08 十月 2026 11:20:56 +0800
Subject: [PATCH] 提交最新代码

---
 culture/src/views/strain-library/validation/primitive-cell/confirm-detail.vue |  730 +++++++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 597 insertions(+), 133 deletions(-)

diff --git a/culture/src/views/strain-library/validation/primitive-cell/confirm-detail.vue b/culture/src/views/strain-library/validation/primitive-cell/confirm-detail.vue
index 45d90ba..06a82be 100644
--- a/culture/src/views/strain-library/validation/primitive-cell/confirm-detail.vue
+++ b/culture/src/views/strain-library/validation/primitive-cell/confirm-detail.vue
@@ -1,71 +1,138 @@
 <template>
   <Card class="confirm-detail-page">
-    <el-card class="top-card">
+    <!-- 顶部信息卡片 - 优化排版 -->
+    <el-card class="top-card" shadow="never">
       <el-row :gutter="24" class="top-info-row">
-        <el-col :span="8" class="info-col">
-          <div class="info-item"><span class="label">菌种来源:</span>{{ detail.source }}</div>
-          <div class="info-item"><span class="label">鉴别菌株编号:</span>{{ detail.strainNo }}</div>
-          <div class="info-item"><span class="label">鉴别菌株名称:</span>{{ detail.strainName }}</div>
+        <el-col :span="24" class="info-col source-col">
+          <div class="info-item source-item">
+            <span class="label">菌种来源:</span>
+            <el-tooltip
+                :content="detail.strainSource || '暂无数据'"
+                placement="top"
+                :disabled="!detail.strainSource || detail.strainSource.length < 30"
+                popper-class="source-tooltip"
+                effect="dark"
+            >
+              <span class="source-text">{{ detail.strainSource || '暂无数据' }}</span>
+            </el-tooltip>
+          </div>
         </el-col>
+
         <el-col :span="8" class="info-col">
-          <div class="info-item"><span class="label">验证实验编号:</span>{{ detail.verifyNo }}</div>
-          <div class="info-item"><span class="label">实验时间:</span>{{ detail.experimentTime }}</div>
-          <div class="info-item"></div>
+          <div class="info-item">
+            <span class="label">鉴别菌株编号:</span>
+            <span class="value">{{ detail.identifyingStrainCode || '-' }}</span>
+          </div>
+          <div class="info-item">
+            <span class="label">鉴别菌株名称:</span>
+            <span class="value">{{ detail.identifyingStrainName || '-' }}</span>
+          </div>
         </el-col>
-        <el-col :span="8" class="info-col ">
-          <div class="info-item sign-label"><span class="label">菌种实验员签字</span></div>
-          <div class="info-item signature-item">
+
+        <el-col :span="8" class="info-col">
+          <div class="info-item">
+            <span class="label">验证实验编号:</span>
+            <span class="value">{{ detail.validationExperimentCode || '-' }}</span>
+          </div>
+          <div class="info-item">
+            <span class="label">实验时间:</span>
+            <span class="value">{{ detail.experimentTime | formatDate }}</span>
+          </div>
+          <div class="info-item">
+            <span class="label">签字时间:</span>
+            <span class="value">{{ detail.handleTime || '-' }}</span>
+          </div>
+        </el-col>
+
+        <el-col :span="8" class="info-col sign-col">
+          <div class="sign-wrapper">
+            <div class="sign-label-text">菌种实验员签字</div>
             <div class="signature-area">
-              <img v-if="detail.signature" :src="detail.signature" alt="签字" />
+              <el-image
+                  v-if="detail.handleSignature"
+                  :src="getFullUrl(detail.handleSignature)"
+                  :preview-src-list="[getFullUrl(detail.handleSignature)]"
+                  alt="签字"
+                  fit="contain"
+              />
               <span v-else class="waiting-text">暂无签名</span>
             </div>
           </div>
         </el-col>
       </el-row>
     </el-card>
-    <div class="section-card" style="margin-top: 24px;">
-      <el-form label-width="100px" label-position="top">
-        <el-form-item label="实验结论">
-          <el-input type="textarea" v-model="detail.conclusion" :rows="3" placeholder="请输入" />
-        </el-form-item>
-        <el-form-item label="批准菌株用途">
-          <el-checkbox-group v-model="detail.usage">
-            <el-checkbox label="传代" />
-            <el-checkbox label="菌种保藏" />
-            <el-checkbox label="废弃" />
-          </el-checkbox-group>
-        </el-form-item>
+
+    <!-- 实验结论 & 用途 -->
+    <div class="section-card">
+      <el-form ref="form" label-width="100px" :model="detail" :rules="rules" label-position="top">
+        <el-row :gutter="24">
+          <el-col :span="14">
+            <el-form-item label="实验结论" prop="result">
+              <el-input
+                  type="textarea"
+                  v-model="detail.result"
+                  :rows="3"
+                  placeholder="请输入实验结论"
+                  maxlength="500"
+                  show-word-limit
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="10">
+            <el-form-item label="批准菌株用途" prop="purpose">
+              <el-checkbox-group v-model="detail.purpose">
+                <el-checkbox :label="1">传代</el-checkbox>
+                <el-checkbox :label="2">菌种保藏</el-checkbox>
+                <el-checkbox :label="3">废弃</el-checkbox>
+              </el-checkbox-group>
+            </el-form-item>
+          </el-col>
+        </el-row>
       </el-form>
     </div>
-    <el-button type="primary" @click="handleSave" class="el-icon-plus"> 新增</el-button>
-    <EditConditionDialog
-      :visible.sync="dialogVisible"
-      :isEdit="dialogIsEdit"
-      :isFixed="dialogIsFixed"
-      :value="dialogValue"
-      @ok="handleDialogOk"
-    />
 
-    <div class="section-card" style="margin-top: 12px;">
-      <el-table :data="tableData" border style="width: 100%;" :row-class-name="getRowClassName">
-        <el-table-column prop="condition" label="菌种培养工艺条件" />
-        <el-table-column prop="record" label="菌种培养工艺实况记录" />
-        <el-table-column prop="process" label="菌种培养标准工艺" />
-        <el-table-column label="操作" width="120">
+    <!-- 表格区域 -->
+    <div class="table-section">
+      <div class="table-header">
+        <span class="table-title">菌种培养工艺</span>
+        <el-button type="primary" size="small" icon="el-icon-plus" @click="handleAdd">新增</el-button>
+      </div>
+      <el-table
+          :data="tableData"
+          border
+          style="width: 100%"
+          :row-class-name="getRowClassName"
+          stripe
+      >
+        <el-table-column prop="conditions" label="菌种培养工艺条件" min-width="180" />
+        <el-table-column prop="record" label="菌种培养工艺实况记录" min-width="200" />
+        <el-table-column prop="workmanship" label="菌种培养标准工艺" min-width="200" />
+        <el-table-column label="操作" width="160" align="center">
           <template #default="{ row }">
-            <el-button type="text" @click="handleEdit(row)">编辑</el-button>
-            <el-button type="text" @click="handleDetail(row)">详情2</el-button>
+            <el-button type="text" size="small" @click="handleEdit(row)">编辑</el-button>
+            <el-button type="text" size="small" @click="handleDetail(row)">详情</el-button>
           </template>
         </el-table-column>
       </el-table>
     </div>
+
+    <!-- 底部按钮 -->
     <div class="footer-btns">
-      <el-button type="primary" @click="handleSave">保存</el-button>
-      <el-button @click="handleDraft">存稿</el-button>
+      <el-button type="primary" size="medium" @click="handleSave">保存</el-button>
+      <el-button size="medium" @click="handleDraft">存稿</el-button>
     </div>
+
+    <!-- 弹窗 -->
+    <EditConditionDialog
+        :visible.sync="dialogVisible"
+        :isEdit="dialogIsEdit"
+        :isFixed="dialogIsFixed"
+        :value="dialogValue"
+        @ok="handleDialogOk"
+    />
     <DetailConditionDialog
-      :visible.sync="detailDialogVisible"
-      :value="detailDialogValue"
+        :visible.sync="detailDialogVisible"
+        :value="detailDialogValue"
     />
   </Card>
 </template>
@@ -73,74 +140,258 @@
 <script>
 import EditConditionDialog from './EditConditionDialog.vue'
 import DetailConditionDialog from './DetailConditionDialog.vue'
+import {detail, confirm, saveDraft} from './service'
+import moment from 'moment'
+import { getFullUrl } from '@/utils/utils'
+
 export default {
   name: 'ConfirmDetail',
   components: { EditConditionDialog, DetailConditionDialog },
   data() {
     return {
       detail: {
-        source: '内容的内容内容内容',
-        strainNo: '3411234',
-        strainName: '名称名称名称',
-        verifyNo: '34133214',
-        experimentTime: '2025-1-23 11:10:28',
-        signature: '', // 签名图片url
-        conclusion: '',
-        usage: []
+        strainSource: '',
+        identifyingStrainCode: '',
+        identifyingStrainName: '',
+        validationExperimentCode: '',
+        experimentTime: '',
+        handleSignature: '',
+        result: '',
+        purpose: []
       },
-      activeTab: 'condition',
+      rules: {
+        result: [
+          { required: true, message: '请输入实验结论', trigger: 'blur' }
+        ],
+        purpose: [
+          { required: true, message: '请选择菌种用途', trigger: 'change' }
+        ]
+      },
       initialTableData: [
-        { condition: '平板培养基', record: '文字内容文字内容文字内容文字内容文字内容文字内容', process: '文字内容文字内容文字内容文字内容文字内容文字内容' },
-        { condition: '培养温度', record: '', process: '' },
-        { condition: '培养时间', record: '', process: '' },
-        { condition: '摇瓶培养基', record: '', process: '' },
-        { condition: '接种量', record: '', process: '' },
-        { condition: '培养时间', record: '', process: '' },
-        { condition: '发酵时间', record: '', process: '' },
-        { condition: '检测数据及结果', record: '', process: '' }
+        { conditions: '平板培养基', record: '', workmanship: '' },
+        { conditions: '培养温度', record: '', workmanship: '' },
+        { conditions: '培养时间', record: '', workmanship: '' },
+        { conditions: '摇瓶培养基', record: '', workmanship: '' },
+        { conditions: '接种量', record: '', workmanship: '' },
+        { conditions: '培养时间', record: '', workmanship: '' },
+        { conditions: '发酵时间', record: '', workmanship: '' },
+        { conditions: '检测数据及结果', record: '', workmanship: '' }
       ],
-      tableData: [
-        { condition: '平板培养基', record: '文字内容文字内容文字内容文字内容文字内容文字内容', process: '文字内容文字内容文字内容文字内容文字内容文字内容' },
-        { condition: '培养温度', record: '', process: '' },
-        { condition: '培养时间', record: '', process: '' },
-        { condition: '摇瓶培养基', record: '', process: '' },
-        { condition: '接种量', record: '', process: '' },
-        { condition: '培养时间', record: '', process: '' },
-        { condition: '发酵时间', record: '', process: '' },
-        { condition: '检测数据及结果', record: '', process: '' }
-      ],
+      tableData: [],
       dialogVisible: false,
       dialogIsEdit: false,
       dialogIsFixed: false,
       dialogValue: {},
       dialogIndex: null,
       detailDialogVisible: false,
-      detailDialogValue: {}
+      detailDialogValue: {},
+
+      cacheForm: null,
+      cacheFormtableData: null,
+      isFirstLoad: true,
+      isLoading: false,
     }
   },
+  filters: {
+    formatDate(date) {
+      if (date) {
+        return moment(date).format('YYYY-MM-DD')
+      }
+      return ''
+    }
+  },
+  // ========== 只使用 activated ==========
+  activated() {
+    console.log('activated, isFirstLoad:', this.isFirstLoad)
+
+    // 1. 首次加载 - 初始化数据并请求
+    if (this.isFirstLoad) {
+      this.isFirstLoad = false
+      // 初始化表格数据(显示默认行)
+      this.tableData = this.initialTableData.map(item => ({ ...item }))
+
+      if (this.$route.query.id) {
+        this.getDetail()
+      }
+      return
+    }
+
+    // 2. 从缓存恢复数据(非首次加载)
+    if (this.cacheForm) {
+      this.detail = JSON.parse(JSON.stringify(this.cacheForm))
+      this.tableData = JSON.parse(JSON.stringify(this.cacheFormtableData))
+      this.restorePurpose()
+    }
+
+    // 3. 如果路由参数变化,重新加载数据
+    if (this.$route.query.id && this.detail.id && this.$route.query.id !== String(this.detail.id)) {
+      this.getDetail()
+    }
+  },
+  deactivated() {
+    // 缓存当前数据
+    this.cacheForm = JSON.parse(JSON.stringify(this.detail))
+    this.cacheFormtableData = JSON.parse(JSON.stringify(this.tableData))
+    console.log('deactivated - 数据已缓存')
+  },
+  // ========== 移除 mounted,或保留仅用于调试 ==========
+  mounted() {
+    // 不做任何初始化,所有逻辑都在 activated 中
+    console.log('mounted - 仅用于调试,无初始化逻辑')
+  },
+  // ========== 方法 ==========
   methods: {
+    getFullUrl(url) {
+      if (url) {
+        return getFullUrl(url)
+      }
+      return ''
+    },
+
+    restorePurpose() {
+      if (!this.detail.purpose) {
+        this.detail.purpose = []
+        return
+      }
+
+      let purposeArray = []
+      if (typeof this.detail.purpose === 'string') {
+        purposeArray = this.detail.purpose.split(',').map(item => Number(item.trim())).filter(num => !isNaN(num))
+      } else if (Array.isArray(this.detail.purpose)) {
+        purposeArray = this.detail.purpose
+      }
+      this.detail.purpose = purposeArray
+    },
+
+    getDetail() {
+      if (this.isLoading) {
+        console.log('正在加载中,跳过重复请求')
+        return
+      }
+
+      const id = this.$route.query.id
+      if (!id) {
+        console.warn('缺少 id 参数')
+        return
+      }
+
+      this.isLoading = true
+      console.log('开始请求详情数据, id:', id)
+
+      detail({ id })
+          .then(res => {
+            console.log('详情数据返回:', res)
+
+            const data = res.data || res
+
+            // 处理 purpose
+            let purposeArray = []
+            if (data.purpose) {
+              if (typeof data.purpose === 'string') {
+                purposeArray = data.purpose.split(',').map(item => Number(item.trim())).filter(num => !isNaN(num))
+              } else if (Array.isArray(data.purpose)) {
+                purposeArray = data.purpose
+              }
+            }
+
+            // 处理 tableData
+            const tableList = data.list && data.list.length > 0 ? data.list : this.initialTableData.map(item => ({ ...item }))
+
+            // 更新数据
+            this.detail = {
+              ...data,
+              handleSignature: data.handleSignature || '',
+              purpose: purposeArray
+            }
+            this.tableData = tableList
+
+            // 更新缓存
+            this.cacheForm = JSON.parse(JSON.stringify(this.detail))
+            this.cacheFormtableData = JSON.parse(JSON.stringify(this.tableData))
+          })
+          .catch(err => {
+            console.error('获取详情失败:', err)
+            this.$message.error('加载数据失败,请重试')
+
+            // 加载失败时使用初始数据
+            this.tableData = this.initialTableData.map(item => ({ ...item }))
+          })
+          .finally(() => {
+            this.isLoading = false
+          })
+    },
+
+    handleAdd() {
+      this.dialogVisible = true
+      this.dialogIsEdit = false
+      this.dialogIsFixed = false
+      this.dialogValue = {}
+      this.dialogIndex = null
+    },
+
     handleEdit(row) {
       const idx = this.tableData.indexOf(row)
       this.dialogVisible = true
       this.dialogIsEdit = true
-      this.dialogIsFixed = idx < this.initialTableData.length
+      this.dialogIsFixed = idx < this.initialTableData?.length
       this.dialogValue = { ...row }
       this.dialogIndex = idx
     },
+
     handleDetail(row) {
       this.detailDialogVisible = true
       this.detailDialogValue = { ...row }
     },
+
     handleSave() {
-      this.dialogVisible = true
-      this.dialogIsEdit = false
-      this.dialogIsFixed = false
-      this.dialogValue = { condition: '', record: '', process: '' }
-      this.dialogIndex = null
+      this.$refs.form.validate((valid) => {
+        if (valid) {
+          const payload = {
+            ...this.detail,
+            list: this.tableData || [],
+            purpose: (this.detail.purpose || []).join(','),
+            isDraft: 0
+          }
+          confirm(payload).then(res => {
+            if (res.code == 200) {
+              this.$message.success('保存成功')
+              this.cacheForm = null
+              this.cacheFormtableData = null
+              this.$closeCurrentView('/strain/validation/primitive-cell')
+            } else {
+              this.$message.error(res.msg || '保存失败')
+            }
+          })
+        } else {
+          this.$message.error('请填写必填项')
+          return false
+        }
+      })
     },
+
     handleDraft() {
-      // 存稿逻辑
+      this.$refs.form.validate((valid) => {
+        if (valid) {
+          const payload = {
+            ...this.detail,
+            list: this.tableData || [],
+            purpose: (this.detail.purpose || []).join(',')
+          }
+
+          saveDraft(payload).then(res => {
+            if (res.code == 200) {
+              this.$message.success('存稿成功')
+              this.cacheForm = null
+              this.cacheFormtableData = null
+              this.$closeCurrentView('/strain/validation/primitive-cell')
+            } else {
+              this.$message.error(res.msg || '存稿失败')
+            }
+          })
+        }
+      })
     },
+
     handleDialogOk(val) {
       if (this.dialogIsEdit && this.dialogIndex !== null) {
         this.$set(this.tableData, this.dialogIndex, val)
@@ -148,107 +399,320 @@
         this.tableData.push(val)
       }
     },
+
     getRowClassName({ rowIndex }) {
-      return rowIndex < this.initialTableData.length ? 'fixed-row' : '';
+      return rowIndex < this.initialTableData?.length ? 'fixed-row' : ''
     }
   }
 }
 </script>
 
 <style scoped lang="less">
+.confirm-detail-page {
+  padding: 20px;
+  background: #f5f7fa;
+  min-height: 100vh;
+}
+
+// ========== 顶部卡片 ==========
 .top-card {
-  margin-bottom: 0;
-  background: rgba(239, 239, 239, 1);
-  border-radius: 16px;
+  margin-bottom: 20px;
+  background: #e3e3e3;
+  border-radius: 12px;
+  border: none;
+  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.06);
+
+  /deep/ .el-card__body {
+    padding: 20px 24px;
+  }
 }
 
 .top-info-row {
+  display: flex;
   align-items: stretch;
 }
 
 .info-col {
   display: flex;
   flex-direction: column;
-
+  justify-content: center;
+  padding: 2px 0;
 }
 
 .info-item {
   display: flex;
-  font-size: 15px;
-  height: 45px;
-  line-height: 45px;
+  align-items: center;
+  font-size: 14px;
+  line-height: 38px;
+  padding: 1px 0;
+
+  .label {
+    color: #8c8f9c;
+    font-weight: 500;
+    flex-shrink: 0;
+    min-width: 110px;
+  }
+
+  .value {
+    color: #303133;
+    font-weight: 400;
+  }
 }
 
-.label {
-  color: #666;
+// ========== 菌种来源 ==========
+.source-item {
+  width: 500px;
+
+  .source-text {
+    flex: 1;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+    color: #303133;
+    cursor: pointer;
+    padding: 0 4px;
+    font-weight: 400;
+    transition: color 0.2s;
+
+    &:hover {
+      color: #409eff;
+    }
+  }
+}
+
+// ========== 签名区域 ==========
+.sign-col {
+  align-items: center;
+  justify-content: center;
+}
+
+.sign-wrapper {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  gap: 6px;
+  width: 100%;
+}
+
+.sign-label-text {
+  font-size: 14px;
+  color: #8c8f9c;
   font-weight: 500;
 }
 
-.sign-col {
-  align-items: center;
-  text-align: center;
-}
-
-.sign-label {
-  justify-content: center;
-}
-
-.signature-item {
-  justify-content: center;
-}
-
 .signature-area {
-  min-height: 80px;
-  min-width: 120px;
-  background: #f5f7fa;
-  border: 1px solid #dcdfe6;
-  border-radius: 4px;
+  width: 130px;
+  height: 66px;
+  background: #fafbfc;
+  border: 1.5px dashed #d9dce6;
+  border-radius: 8px;
   display: flex;
   align-items: center;
   justify-content: center;
-  margin-top: 8px;
-}
+  overflow: hidden;
+  transition: border-color 0.2s;
 
-.signature-area img {
-  max-width: 100%;
-  max-height: 100%;
-  display: block;
+  &:hover {
+    border-color: #409eff;
+  }
+
+  .el-image {
+    width: 100%;
+    height: 100%;
+    object-fit: contain;
+  }
 }
 
 .waiting-text {
-  color: #909399;
-  font-size: 14px;
+  color: #b0b3bf;
+  font-size: 13px;
 }
 
-.sign-time {
-  justify-content: center;
-  text-align: center;
-  color: #666;
-  font-size: 14px;
-}
-
+// ========== 实验结论卡片 ==========
 .section-card {
-  margin-bottom: 0;
+  background: #fff;
+  border-radius: 12px;
+  padding: 20px 24px;
+  margin-bottom: 16px;
+  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.06);
+
+  /deep/ .el-form-item {
+    margin-bottom: 0;
+  }
+
+  /deep/ .el-form-item__label {
+    font-weight: 500;
+    color: #303133;
+  }
+
+  /deep/ .el-checkbox-group {
+    padding-top: 4px;
+  }
+
+  /deep/ .el-checkbox {
+    margin-right: 24px;
+
+    &:last-child {
+      margin-right: 0;
+    }
+  }
 }
 
+// ========== 表格区域 ==========
+.table-section {
+  background: #fff;
+  border-radius: 12px;
+  padding: 16px 20px 20px;
+  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.06);
+  margin-bottom: 20px;
+}
+
+.table-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 14px;
+
+  .table-title {
+    font-size: 15px;
+    font-weight: 600;
+    color: #303133;
+    position: relative;
+    padding-left: 12px;
+
+    &::before {
+      content: '';
+      position: absolute;
+      left: 0;
+      top: 50%;
+      transform: translateY(-50%);
+      width: 3px;
+      height: 16px;
+      background: #409eff;
+      border-radius: 2px;
+    }
+  }
+}
+
+/deep/ .el-table {
+  border-radius: 8px;
+  overflow: hidden;
+
+  th.el-table__cell {
+    background-color: #f5f7fa;
+    color: #303133;
+    font-weight: 600;
+  }
+
+  .fixed-row {
+    background-color: #f0f9ff !important;
+  }
+}
+
+// ========== 底部按钮 ==========
 .footer-btns {
   display: flex;
   justify-content: center;
-  padding: 24px;
-  padding-bottom: 0;
-  gap: 24px;
+  padding: 8px 0 4px;
+  gap: 20px;
+
   .el-button {
-    width: 150px;
+    width: 140px;
+    border-radius: 8px;
+    font-weight: 500;
+    letter-spacing: 1px;
   }
 }
 
-::v-deep(.fixed-row) {
-  background-color: rgb(228, 248, 250) !important;
+// ========== Tooltip ==========
+/deep/ .source-tooltip {
+  max-width: 320px !important;
+  min-width: 120px !important;
+  word-break: break-word;
+  line-height: 1.7;
+  padding: 10px 16px;
+  font-size: 13px;
+  border-radius: 6px;
 }
 
-@media (max-width: 900px) {
-  .info-col {
-    height: auto;
+// ========== 响应式 ==========
+@media (max-width: 992px) {
+  .confirm-detail-page {
+    padding: 12px;
+
+    .top-info-row {
+      flex-direction: column;
+      gap: 8px;
+    }
+
+    .info-col {
+      width: 100% !important;
+      flex: none !important;
+    }
+
+    .sign-col {
+      align-items: flex-start;
+    }
+
+    .sign-wrapper {
+      flex-direction: row;
+      gap: 16px;
+      align-items: center;
+    }
+
+    .signature-area {
+      width: 100px;
+      height: 56px;
+    }
+
+    .section-card /deep/ .el-col {
+      width: 100% !important;
+      flex: none !important;
+      margin-bottom: 12px;
+
+      &:last-child {
+        margin-bottom: 0;
+      }
+    }
   }
 }
-</style>
\ No newline at end of file
+
+@media (max-width: 576px) {
+  .confirm-detail-page {
+    padding: 8px;
+
+    .top-card /deep/ .el-card__body {
+      padding: 14px 16px;
+    }
+
+    .section-card {
+      padding: 14px 16px;
+    }
+
+    .table-section {
+      padding: 12px 14px 16px;
+    }
+
+    .footer-btns {
+      flex-direction: column;
+      align-items: center;
+      gap: 12px;
+
+      .el-button {
+        width: 100%;
+        max-width: 180px;
+      }
+    }
+
+    .info-item {
+      font-size: 13px;
+      line-height: 34px;
+
+      .label {
+        min-width: 90px;
+        font-size: 13px;
+      }
+    }
+  }
+}
+</style>

--
Gitblit v1.7.1