Преглед изворни кода

修复实验试剂信息导入时有效期识别错误

zhonghuizhen пре 6 месеци
родитељ
комит
4c72f1c930
1 измењених фајлова са 86 додато и 8 уклоњено
  1. 86 8
      src/views/business/performance/components/reagent-info.vue

+ 86 - 8
src/views/business/performance/components/reagent-info.vue

@@ -61,7 +61,7 @@
           <el-table-column
             prop="piHao"
             label="批号"
-            width="75"
+            width="85"
             header-align="center"
             align="center"
             sortable
@@ -69,7 +69,7 @@
           <el-table-column
             prop="changJia"
             label="厂家"
-            width="100"
+            width="110"
             header-align="center"
           />
           <el-table-column
@@ -235,29 +235,53 @@ export default {
       ]
     },
     handleExport() {
+      // 处理数据,将日期字段转换为文本格式
+      const exportData = this.reagentData.map(item => ({
+        ...item,
+        youXiaoQi: this.formatDateForExport(item.youXiaoQi)
+      }))
+      
       IbpsExport.excel({
         columns: this.getColumns(),
-        data: this.reagentData,
+        data: exportData,
         nameKey: 'name',
         title: '实验试剂信息'
       }).then(() => {
         ActionUtils.success('导出成功')
       })
     },
+
+    // 新增方法:为导出格式化日期
+    formatDateForExport(dateStr) {
+      if (!dateStr) return dateStr
+      
+      // 在日期前添加单引号,强制Excel将其作为文本处理
+      // 这样导入时就不会被转换为美国格式
+      return `'${dateStr}`
+    },
     handleImport(file, options) {
       this.loading = false
       IbpsImport.xlsx(file, options).then(({ header, results }) => {
         const keys = this.getKeys(this.getColumns())
         const list = []
+        
         results.forEach((item) => {
           const obj = {}
           Object.keys(item).forEach((key) => {
             if (keys[key]) {
-              obj[keys[key]] = item[key]
+              let value = item[key]
+              
+              // 处理有效期字段的多种日期格式
+              if (keys[key] === 'youXiaoQi') {
+                value = this.normalizeDate(value)
+              }
+              
+              obj[keys[key]] = value
             }
           })
           list.push(obj)
         })
+        
         const keysValue = Object.values(keys)
         const isError = list.some((item) => keysValue.some((key) => !item[key]))
         if (isError || !list.length) {
@@ -265,22 +289,76 @@ export default {
             '导出模板中的每一项都需填写,请检查您的数据!'
           )
         }
-        const dateRegex = /^(\d{4})[-/](\d{2})(?:[-/](\d{2}))?$/
+        
+        // 放宽日期验证,支持更多格式
+        const dateRegex = /^(\d{4}[-/]\d{1,2}([-/]\d{1,2})?|\d{1,2}\/\d{1,2}\/\d{2,4})$/
         const isDateError = list.some((item) => {
-          return !dateRegex.test(item.youXiaoQi)
+          return !dateRegex.test(String(item.youXiaoQi))
         })
         if (isDateError) {
           return this.$message.warning(
-            '有效期格式支持【2024-01】、【2024/01】、【2024-01-01】、【2024/01/01】,请检查您的数据!'
+            '有效期格式不正确,请检查您的数据!支持格式:2024-01、2024/01、2024-01-01、2024/01/01、01/01/24等'
           )
         }
+        
+        // 统一格式化日期
         list.forEach((item) => {
-          item.youXiaoQi = item.youXiaoQi.replace(/\//g, '-')
+          item.youXiaoQi = this.formatToStandardDate(item.youXiaoQi)
         })
+        
         this.reagentData.push(...list)
         this.showImportTable = false
       })
     },
+
+    // 新增方法:标准化日期格式
+    normalizeDate(dateValue) {
+      if (!dateValue) return dateValue
+      
+      const dateStr = String(dateValue)
+      
+      // 处理美国格式 "MM/DD/YY" 或 "MM/DD/YYYY"
+      const usFormat = dateStr.match(/^(\d{1,2})\/(\d{1,2})\/(\d{2,4})$/)
+      if (usFormat) {
+        const month = usFormat[1].padStart(2, '0')
+        const day = usFormat[2].padStart(2, '0')
+        let year = usFormat[3]
+        
+        // 如果是两位年份,转换为四位
+        if (year.length === 2) {
+          year = '20' + year
+        }
+        
+        return `${year}-${month}-${day}`
+      }
+      
+      return dateStr
+    },
+
+    // 统一格式化为标准日期
+    formatToStandardDate(dateStr) {
+      if (!dateStr) return dateStr
+      
+      let formatted = String(dateStr).replace(/\//g, '-')
+      
+      // 移除可能存在的单引号(文本格式标记)
+      formatted = formatted.replace(/^'/, '')
+      
+      const parts = formatted.split('-')
+      if (parts.length >= 2) {
+        // 补零
+        if (parts[1]) {
+          parts[1] = parts[1].padStart(2, '0')
+        }
+        if (parts[2]) {
+          parts[2] = parts[2].padStart(2, '0')
+        }
+        
+        formatted = parts.join('-')
+      }
+      
+      return formatted
+    },
     getKeys(data) {
       return Array.isArray(data)
         ? data.reduce((acc, item) => ({ ...acc, [item.label]: item.name }), {})