From 29be8639dc16b5d82bddc6099b1fa5cdca75f77a Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期二, 20 十月 2026 16:28:22 +0800
Subject: [PATCH] feat(import): 统一导入弹框与模板,修复模板日期格式及上传报错

---
 src/views/CNAS/process/ensureResults/qualityControlPlan/index.vue |  303 ++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 245 insertions(+), 58 deletions(-)

diff --git a/src/views/CNAS/process/ensureResults/qualityControlPlan/index.vue b/src/views/CNAS/process/ensureResults/qualityControlPlan/index.vue
index 25611e0..fe29f64 100644
--- a/src/views/CNAS/process/ensureResults/qualityControlPlan/index.vue
+++ b/src/views/CNAS/process/ensureResults/qualityControlPlan/index.vue
@@ -5,7 +5,7 @@
       <div style="display: flex;justify-content: space-between">
         <div style="display: flex;">
           <div style="margin-bottom: 18px;margin-right: 10px;display: flex;align-items: center;line-height: 32px;">
-            <span style="width: 88px;font-size: 14px;font-weight: 700;color: #606266;">璁″垝鍚嶇О</span>
+            <span style="width: 88px;font-size: 14px;font-weight: 700;color: var(--lims-text-2);">璁″垝鍚嶇О</span>
             <el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="yearForm.superviseName"
                       @keyup.enter="getYearPlanList"></el-input>
           </div>
@@ -25,18 +25,12 @@
       <div style="display: flex;justify-content: space-between">
         <div style="display: flex;">
           <div style="margin-bottom: 18px;margin-right: 10px;display: flex;align-items: center;line-height: 32px;">
-            <el-radio-group v-model="yearDetailForm.causeType" @change="getYearDetailPlan" size="small">
-              <el-radio-button :value="1">瀹氭湡鐩戠潱</el-radio-button>
-              <el-radio-button :value="2">鍔ㄦ�佺洃鐫�</el-radio-button>
-            </el-radio-group>
-          </div>
-          <div style="margin-bottom: 18px;margin-right: 10px;display: flex;align-items: center;line-height: 32px;">
-            <span style="width: 88px;font-size: 14px;font-weight: 700;color: #606266;">鐩戞帶鐩殑</span>
+            <span style="width: 88px;font-size: 14px;font-weight: 700;color: var(--lims-text-2);">鐩戞帶鐩殑</span>
             <el-input v-model="yearDetailForm.supervisePurpose" placeholder="璇疯緭鍏�" size="small"
                       @keyup.enter="getYearDetailPlan"></el-input>
           </div>
           <div style="margin-bottom: 18px;margin-right: 10px;display: flex;align-items: center;line-height: 32px;">
-            <span style="width: 88px;font-size: 14px;font-weight: 700;color: #606266;">鐩戞帶椤圭洰</span>
+            <span style="width: 88px;font-size: 14px;font-weight: 700;color: var(--lims-text-2);">鐩戞帶椤圭洰</span>
             <el-input v-model="yearDetailForm.superviseProject" placeholder="璇疯緭鍏�" size="small"
                       @keyup.enter="getYearDetailPlan"></el-input>
           </div>
@@ -74,12 +68,43 @@
         <el-button :loading="ratifyLoading" type="primary" @click="handleRatify(1)">鎵� 鍑�</el-button>
       </span></template>
     </el-dialog>
-    <el-dialog v-model="downloadDialog" title="瀵煎嚭" width="600px">
-      <span>
-        <el-button plain type="primary" :disabled="download.recordStatus !== 3" @click="controlDown">璁板綍鍗曞鍑�</el-button>
-        <el-button plain type="primary" :disabled="download.accordingStatus !== 3" @click="processingDown">澶勭悊鍗曞鍑�</el-button>
-        <el-button plain type="primary" :disabled="download.correctStatus !== 3" @click="supervisoryDown">绾犳鍗曞鍑�</el-button>
-      </span>
+    <el-dialog v-model="downloadDialog" title="瀵煎嚭" width="640px">
+      <div class="doc-card">
+        <div class="doc-card-head">
+          <span class="doc-card-name">鏃ュ父鐩戠潱妫�鏌ヨ褰曡〃锛堣褰曞崟锛�</span>
+          <el-tag :type="download.recordStatus === 3 ? 'success' : 'info'" size="small">
+            {{ download.recordStatus === 3 ? '宸叉壒鍑�' : '鏈壒鍑�' }}
+          </el-tag>
+        </div>
+        <div class="doc-card-foot">
+          <el-button type="primary" :disabled="download.recordStatus !== 3" @click="controlDown">瀵� 鍑�</el-button>
+        </div>
+      </div>
+      <div class="doc-card">
+        <div class="doc-card-head">
+          <span class="doc-card-name">涓嶇鍚堝伐浣滄帶鍒跺崟锛堝鐞嗗崟锛�</span>
+          <el-tag :type="download.accordingStatus === 3 ? 'success' : 'info'" size="small">
+            {{ download.accordingStatus === 3 ? '宸叉壒鍑�' : '鏈壒鍑�' }}
+          </el-tag>
+        </div>
+        <div class="doc-card-foot">
+          <el-button type="primary" :disabled="download.accordingStatus !== 3" @click="processingDown">瀵� 鍑�</el-button>
+        </div>
+      </div>
+      <div class="doc-card">
+        <div class="doc-card-head">
+          <span class="doc-card-name">绾犳鎺柦澶勭悊鍗曪紙绾犳鍗曪級</span>
+          <el-tag :type="download.correctStatus === 3 ? 'success' : 'info'" size="small">
+            {{ download.correctStatus === 3 ? '宸叉壒鍑�' : '鏈壒鍑�' }}
+          </el-tag>
+        </div>
+        <div class="doc-card-foot">
+          <el-button type="primary" :disabled="download.correctStatus !== 3" @click="supervisoryDown">瀵� 鍑�</el-button>
+        </div>
+      </div>
+      <div class="down-tip">
+        浠�"宸叉壒鍑�"鐨勮〃鍗曞彲瀵煎嚭锛岀伆鑹茶〃绀哄搴旇〃鍗曞皻鏈壒鍑嗘垨鏆傛棤鏁版嵁
+      </div>
       <template #footer><span  class="dialog-footer">
         <el-button @click="downloadDialog = false">鍙� 娑�</el-button>
       </span></template>
@@ -87,33 +112,46 @@
     <!--瀵煎叆璁″垝-->
     <el-dialog v-model="uploadDia" title="鏁版嵁瀵煎叆" width="500px" :close-on-click-modal="false"
       :close-on-press-escape="false">
-      <div style="display: flex; align-items: center;">
-        <span style="width: 80px">骞翠唤锛�</span>
-        <el-date-picker v-model="superviseYear" type="year" value-format="YYYY" clearable size="small" format="YYYY"
-          placeholder="閫夋嫨骞�">
-        </el-date-picker>
-        <span style="width: 110px">鐩戠潱鍛橈細</span>
-        <el-select v-model="recordUserIds" placeholder="璇烽�夋嫨" size="small" @change="splitList" :multiple-limit="2"
-          filterable multiple style="width: 100%">
-          <el-option v-for="item in userList" :key="item.id" :label="item.name" :value="item.id"></el-option>
-        </el-select>
-      </div>
-      <div style="display: flex;align-items: center;margin: 10px 0">
-        <div style="width: 60px">鎵瑰噯浜猴細</div>
-        <el-select v-model="ratifyUserId" clearable filterable size="small" style="width: 50%;">
-          <el-option v-for="item in userList" :key="item.id" :label="item.name" :value="item.id">
-          </el-option>
-        </el-select>
+      <el-form label-width="70px" size="small">
+        <el-form-item label="骞翠唤">
+          <el-date-picker v-model="superviseYear" type="year" value-format="YYYY" clearable format="YYYY"
+            placeholder="閫夋嫨骞�" style="width: 100%">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="鐩戠潱鍛�">
+          <el-select v-model="recordUserIds" placeholder="璇烽�夋嫨" @change="splitList" :multiple-limit="2"
+            filterable multiple style="width: 100%">
+            <el-option v-for="item in userList" :key="item.id" :label="item.name" :value="item.id"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="鎵瑰噯浜�">
+          <el-select v-model="ratifyUserId" clearable filterable style="width: 100%">
+            <el-option v-for="item in userList" :key="item.id" :label="item.name" :value="item.id">
+            </el-option>
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <div style="display: flex; align-items: center; gap: 8px; margin-bottom: 10px; padding: 8px 12px; border-radius: 4px; background: var(--el-color-primary-light-9); font-size: 13px;">
+        <span>绗竴娆″鍏ヨ鍏堜笅杞芥ā鏉匡紝鎸夋ā鏉挎牸寮忓~鍐欏悗鍐嶄笂浼犮��</span>
+        <el-button link type="primary" @click="downloadTemplate">涓嬭浇瀵煎叆妯℃澘</el-button>
       </div>
       <div style="margin: 0 auto;">
         <el-upload ref="upload1" :action="action" :auto-upload="false" :file-list="fileList" :headers="uploadHeader"
-          :limit="1" accept='.jpg,.jpeg,.png,.gif,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.pdf,.zip,.rar'
+          :limit="1" accept=".xls,.xlsx"
           :on-change="beforeUpload" :on-error="onError" :on-success="handleSuccessUp" drag
           :data="{ recordUserIds: recordUserIds1, superviseYear: superviseYear, ratifyUserId: ratifyUserId }"
           name="file">
           <lims-icon name="el-icon-upload"></lims-icon>
           <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
         </el-upload>
+      </div>
+      <div style="margin-top: 10px; color: var(--el-text-color-secondary); font-size: 12px; line-height: 20px;">
+        <div>鏀寔鏍煎紡锛�.xls銆�.xlsx锛涘崟涓枃浠朵笉瓒呰繃10MB銆�</div>
+        <div>鐩戠潱鏃ユ湡銆佺洃鎺ч」鐩�佽鐩戠潱浜哄憳涓哄繀濉」銆�</div>
+        <div>鐩戠潱鏃ユ湡寤鸿濉�滃勾.鏈堚�濓紙濡� 2026.3锛夛紱濉垚 2026-03-15 涔熷彲浠ワ紝绯荤粺浼氳嚜鍔ㄦ崲绠椾负 2026.3銆�</div>
+        <div>琚洃鐫d汉鍛樺繀椤诲~鍐欑郴缁熶腑宸插瓨鍦ㄧ殑浜哄憳濮撳悕锛屽惁鍒欐暣鎵瑰鍏ュけ璐ャ��</div>
+        <div>瀵煎叆鍙鍙栨ā鏉跨殑绗竴涓伐浣滆〃銆�</div>
+        <div style="color: var(--el-color-warning);">瀵煎叆鍚庤鍒掍负鈥滃緟鎵瑰噯鈥濓細闇�浣跨敤鎵�閫夋壒鍑嗕汉璐﹀彿鐧诲綍骞剁偣鍑烩�滄壒鍑嗏�濓紝鎵瑰噯鍚庢墠鑳戒笅鍙戝拰瀵煎嚭銆�</div>
       </div>
       <template #footer><span  class="dialog-footer">
         <el-button @click="closeUploadDia">鍙� 娑�</el-button>
@@ -131,7 +169,7 @@
 import limsTable from "@/components/Table/lims-table.vue";
 import {
   delQualitySupervise, delQualitySuperviseDetail,
-  exportQualitySupervise, exportSuperviseDetailRecord,
+  exportQualitySupervise, exportSuperviseDetailRecord, issueQualitySupervise,
   pageQualitySupervise, pageQualitySuperviseDetail,
   ratifyQualitySupervise, superviseDetailAccordingExport,
   exportSuperviseDetaillCorrect
@@ -177,7 +215,7 @@
             } else if (params === 1) {
               return '鎵瑰噯';
             } else {
-              return null;
+              return '寰呮壒鍑�';
             }
           },
           formatType: (params) => {
@@ -186,7 +224,7 @@
             } else if (params === 1) {
               return 'success';
             } else {
-              return null;
+              return 'warning';
             }
           }
         }, {
@@ -199,6 +237,25 @@
           label: '鎵瑰噯鏃ユ湡',
           prop: 'ratifyTime',
           width: '160'
+        }, {
+          dataType: 'tag',
+          label: '涓嬪彂鐘舵��',
+          prop: 'issueStatus',
+          width: '100',
+          formatData: (params) => {
+            if (params === 1) {
+              return '宸蹭笅鍙�';
+            } else {
+              return '鏈笅鍙�';
+            }
+          },
+          formatType: (params) => {
+            if (params === 1) {
+              return 'success';
+            } else {
+              return 'info';
+            }
+          }
         }, {
           dataType: 'action',
           label: '鎿嶄綔',
@@ -215,6 +272,20 @@
               },
               clickFun: (row) => {
                 this.approvalPlan(row)
+              }
+            },
+            {
+              name: '涓嬪彂',
+              type: 'text',
+              disabled: (row) => {
+                if (row.ratifyStatus !== 1 || row.issueStatus === 1) {
+                  return true
+                } else {
+                  return false
+                }
+              },
+              clickFun: (row) => {
+                this.issuePlan(row)
               }
             },
             {
@@ -252,8 +323,7 @@
       yearLoading: false,
       yearDetailForm: {
         supervisePurpose: '',
-        superviseProject: '',
-        causeType: 1
+        superviseProject: ''
       },
       yearDetailColumnData: [
         {
@@ -389,6 +459,13 @@
               type: 'text',
               clickFun: (row) => {
                 this.records(row)
+              },
+              disabled: () => {
+                if (this.currentPlan.issueStatus !== 1) {
+                  return true
+                } else {
+                  return false
+                }
               }
             },
             {
@@ -446,6 +523,7 @@
       },
       currentScrollPosition: 0,
       superviseId: '',
+      currentPlan: {},
       formDia: false,
       recordsDia: false,
       processingDia: false,
@@ -498,13 +576,29 @@
       this.yearPage.size = limit;
       this.getYearPlanList();
     },
+    // 涓嬭浇瀵煎叆妯℃澘
+    downloadTemplate() {
+      const link = document.createElement('a')
+      // 甯︾増鏈弬鏁伴伩鍏嶆祻瑙堝櫒缁х画浣跨敤缂撳瓨閲岀殑鏃фā鏉�
+      link.href = '/import-templates/璐ㄩ噺鐩戠潱璁″垝瀵煎叆妯℃澘.xlsx?v=3'
+      link.download = '璐ㄩ噺鐩戠潱璁″垝瀵煎叆妯℃澘.xlsx'
+      document.body.appendChild(link)
+      link.click()
+      document.body.removeChild(link)
+    },
     // 瀵煎叆娴佺▼
     beforeUpload(file) {
+      if (!/\.(xls|xlsx)$/i.test(file.name || '')) {
+        this.$message.error('璇烽�夋嫨 .xls 鎴� .xlsx 鏍煎紡鐨勬枃浠�');
+        this.$refs.upload1.clearFiles()
+        return false;
+      }
       if (file.size > 1024 * 1024 * 10) {
         this.$message.error('涓婁紶鏂囦欢涓嶈秴杩�10M');
         this.$refs.upload1.clearFiles()
         return false;
       }
+      return true;
     },
     onError(err, file, fileList) {
       this.$message.error('涓婁紶澶辫触')
@@ -513,7 +607,13 @@
     handleSuccessUp(response) {
       this.uploading = false;
       if (response.code == 200) {
-        this.$message.success('涓婁紶鎴愬姛');
+        const approver = this.userList.find(item => Number(item.id) === Number(this.ratifyUserId))
+        const approverName = approver ? approver.name : '鎵�閫夋壒鍑嗕汉'
+        if (Number(this.ratifyUserId) === Number(this.userId)) {
+          this.$message.success('瀵煎叆鎴愬姛锛岃鍦ㄥ垪琛ㄤ腑鐐瑰嚮鈥滄壒鍑嗏�濆畬鎴愭壒鍑嗭紝鎵瑰噯鍚庢墠鑳戒笅鍙戝拰瀵煎嚭')
+        } else {
+          this.$message.success(`瀵煎叆鎴愬姛锛岃鍒掑凡鎻愪氦缁�${approverName}鎵瑰噯锛涜鐢ㄨ璐﹀彿鐧诲綍鎵瑰噯锛屾壒鍑嗗悗鎵嶈兘涓嬪彂鍜屽鍑篳)
+        }
         this.recordUserIds = []
         this.superviseYear = ''
         this.fileList = []
@@ -562,8 +662,14 @@
       this.getUserList()
     },
     getUserList() {
-      selectUserCondition({ type: 2 }).then((res) => {
-        this.userList = res.data;
+      // 璐ㄩ噺鐩戠潱闈㈠悜鍏ㄥ疄楠屽, 浜哄憳鍒楄〃涓嶆寜閮ㄩ棬绛涢��
+      selectUserCondition({ type: 1 }).then((res) => {
+        const list = res.data || []
+        // 褰撳墠鐧诲綍鐢ㄦ埛鍙兘鍥犺鑹诧紙濡� admin锛夎鎺ュ彛杩囨护锛屼粛鍏佽閫夎嚜宸变綔涓烘壒鍑嗕汉锛岄伩鍏嶅鍏ュ悗鏃犱汉鍙壒鍑�
+        if (this.userId && !list.some(item => Number(item.id) === Number(this.userId))) {
+          list.unshift({ id: this.userId, name: this.nickName })
+        }
+        this.userList = list
       })
     },
     // 鎵瑰噯
@@ -592,14 +698,29 @@
     // 瀵煎嚭
     handleDown(row) {
       exportQualitySupervise({ superviseId: row.superviseId }).then(res => {
-        try {
-          this.outLoading = false
-          const blob = new Blob([res], { type: 'application/msword' });
-          this.$download.saveAs(blob, row.superviseName + '.docx')
-        } catch (error) {
-          console.error('鍒涘缓Blob瀵硅薄鏃跺嚭閿�:', error);
-        }
+        this.outLoading = false
+        this.saveDocx(res, row.superviseName + '.docx')
+      }).catch(err => {
+        console.log('err---', err);
       })
+    },
+    // 淇濆瓨瀵煎嚭鏂囦欢: 鍚庣瀵煎嚭澶辫触鏃朵細杩斿洖閿欒JSON, 姝ゆ椂寮规彁绀鸿�屼笉鏄瓨鎴愭崯鍧忕殑docx
+    saveDocx(res, filename) {
+      const reader = new FileReader();
+      reader.readAsText(res, 'utf-8');
+      reader.onload = () => {
+        const text = (reader.result || '').trim();
+        if (text.startsWith('{') || text.startsWith('[')) {
+          let msg = '瀵煎嚭澶辫触';
+          try { msg = JSON.parse(text).msg || msg; } catch (e) { }
+          this.$message.error(msg);
+        } else {
+          this.$download.saveAs(new Blob([res], { type: 'application/msword' }), filename);
+        }
+      };
+      reader.onerror = () => {
+        this.$download.saveAs(new Blob([res], { type: 'application/msword' }), filename);
+      };
     },
     // 鍒犻櫎杩涘害璁″垝琛�
     delPlan(row) {
@@ -627,7 +748,31 @@
     // 骞村害璁″垝琛ㄦ牸锛岀偣鍑昏鏁版嵁鍚庡埛鏂拌鎯�
     rowClick(row) {
       this.superviseId = row.superviseId
+      this.currentPlan = row
       this.getYearDetailPlan()
+    },
+    // 涓嬪彂璁″垝
+    issuePlan(row) {
+      this.$confirm('涓嬪彂鍚庣洃鐫e憳涓庣浉鍏虫娴嬩汉鍛樺皢鏀跺埌閫氱煡, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        this.yearLoading = true
+        issueQualitySupervise({ superviseId: row.superviseId }).then(res => {
+          this.yearLoading = false
+          this.$message.success('涓嬪彂鎴愬姛')
+          this.getYearPlanList()
+        }).catch(err => {
+          this.yearLoading = false
+          console.log('err---', err);
+        })
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '宸插彇娑堜笅鍙�'
+        });
+      });
     },
     getYearDetailPlan () {
       this.yearDetailPage.current = 1
@@ -635,18 +780,30 @@
       this.getYearDetailPlanList()
     },
     // 鑾峰彇骞村害鏄庣粏琛�
+    // 鐩戠潱鏃ユ湡缁熶竴鎴� "YYYY.M"锛氬吋瀹� 2026-03-15 / 2026/3/15 / 2026骞�3鏈�15鏃� 绛夊鍏ュ啓娉�
+    normalizeSuperviseMonth(value) {
+      if (!value) return value
+      const text = String(value).trim()
+      const matched = text.match(/^(\d{4})\s*[./骞�-]\s*(\d{1,2})(?:\s*[./鏈�-]\s*\d{1,2}\s*鏃�?)?$/)
+      if (!matched) return text
+      const month = Number(matched[2])
+      return month >= 1 && month <= 12 ? `${matched[1]}.${month}` : text
+    },
     getYearDetailPlanList() {
       const entity = {
         superviseId: this.superviseId,
         supervisePurpose: this.yearDetailForm.supervisePurpose,
         superviseProject: this.yearDetailForm.superviseProject,
-        causeType: this.yearDetailForm.causeType,
       }
       const page = this.yearDetailPage
       this.yearDetailLoading = true
       pageQualitySuperviseDetail({ ...entity, ...page }).then(res => {
         this.yearDetailLoading = false
-        this.yearDetailTableData = res.data.records
+        // 鍘嗗彶瀵煎叆鐨勭洃鐫f棩鏈熷彲鑳芥槸 2026/3/15銆�2026-03-15 绛夊畬鏁存棩鏈燂紝缁熶竴鏄剧ず鎴� 2026.3
+        this.yearDetailTableData = (res.data.records || []).map(item => ({
+          ...item,
+          superviseTime: this.normalizeSuperviseMonth(item.superviseTime)
+        }))
         this.yearDetailPage.total = res.data.total
       }).catch(err => {
         console.log('err---', err);
@@ -667,7 +824,7 @@
     showDialog(type, row) {
       this.formDia = true
       this.$nextTick(() => {
-        this.$refs.formDia.openDia(type, row, this.yearDetailForm.causeType)
+        this.$refs.formDia.openDia(type, row)
       })
     },
     closeDia() {
@@ -715,8 +872,7 @@
     // 瀵煎嚭璁板綍
     controlDown() {
       exportSuperviseDetailRecord({ superviseDetailsId: this.download.superviseDetailsId }).then(res => {
-        const blob = new Blob([res], { type: 'application/msword' });
-        this.$download.saveAs(blob, '璁板綍瀵煎嚭.docx')
+        this.saveDocx(res, '璁板綍瀵煎嚭.docx')
       }).catch(err => {
         console.log('err---', err);
       })
@@ -724,8 +880,7 @@
     // 澶勭悊鍗曞鍑�
     processingDown() {
       superviseDetailAccordingExport({ superviseDetailsId: this.download.superviseDetailsId }).then(res => {
-        const blob = new Blob([res], { type: 'application/msword' });
-        this.$download.saveAs(blob, '涓嶇鍚堥」瀵煎嚭.docx')
+        this.saveDocx(res, '涓嶇鍚堥」瀵煎嚭.docx')
       }).catch(err => {
         console.log('err---', err);
       })
@@ -733,8 +888,9 @@
     // 绾犳鍗曞鍑�
     supervisoryDown() {
       exportSuperviseDetaillCorrect({ superviseDetailsCorrectId: this.download.superviseDetailsCorrectId }).then(res => {
-        const blob = new Blob([res], { type: 'application/msword' });
-        this.$download.saveAs(blob, '鐩戠潱绾犳鎺柦.docx')
+        this.saveDocx(res, '鐩戠潱绾犳鎺柦.docx')
+      }).catch(err => {
+        console.log('err---', err);
       })
     },
     // 鍒犻櫎骞村害璇︽儏鍒楄〃
@@ -761,7 +917,7 @@
     action() {
       return this.javaApi + '/qualitySupervise/importQualitySupervise'
     },
-    ...mapGetters(["userId"]),
+    ...mapGetters(["userId", "nickName"]),
   },
 };
 </script>
@@ -793,6 +949,37 @@
   margin: 0 5px;
 }
 
+.doc-card {
+  padding: 12px 16px;
+  margin-bottom: 12px;
+  background-color: #f7f8fa;
+  border: 1px solid #ebeef5;
+  border-radius: 6px;
+}
+
+.doc-card-head {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+}
+
+.doc-card-name {
+  font-size: 14px;
+  color: var(--lims-text-2, #303133);
+}
+
+.doc-card-foot {
+  display: flex;
+  justify-content: flex-end;
+  margin-top: 10px;
+}
+
+.down-tip {
+  margin-top: 10px;
+  color: #909399;
+  font-size: 12px;
+}
+
 .search {
   width: 150px;
   padding: 0 16px;

--
Gitblit v1.9.3