From 3c6566a26c6bb6f68deed9f2c8e7b6eab1209134 Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期五, 28 八月 2026 15:42:42 +0800
Subject: [PATCH] feat(order): 添加产品检验项选择功能并增加导入导出功能 - 实现产品检验项的选择状态管理和计数显示功能 - 添加标准物质和设备管理模块的导入导出功能 - 新增导入模板下载和上传验证机制 - 调整表单验证规则,移除生产单位必填限制

---
 src/views/CNAS/resourceDemand/standardMaterial/index.vue |  150 +++++++++++++++++++++++++++++++------------------
 1 files changed, 95 insertions(+), 55 deletions(-)

diff --git a/src/views/CNAS/resourceDemand/standardMaterial/index.vue b/src/views/CNAS/resourceDemand/standardMaterial/index.vue
index 6483368..79cf6dc 100644
--- a/src/views/CNAS/resourceDemand/standardMaterial/index.vue
+++ b/src/views/CNAS/resourceDemand/standardMaterial/index.vue
@@ -5,49 +5,65 @@
         <el-form :model="searchForm" ref="searchForm" size="small" :inline="true">
           <el-form-item label="鏍囧噯鐗╄川鍚嶇О" prop="name">
             <el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="searchForm.name"
-                      @keyup.enter.native="searchList"></el-input>
+              @keyup.enter.native="searchList"></el-input>
           </el-form-item>
           <el-form-item label="鐢熶骇鍘傚" prop="factoryManufacturer">
             <el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="searchForm.factoryManufacturer"
-                      @keyup.enter.native="searchList"></el-input>
+              @keyup.enter.native="searchList"></el-input>
           </el-form-item>
           <el-form-item>
-            <el-button type="primary" icon="el-icon-search" size="mini" @click="searchList">鏌� 璇�</el-button>
-            <el-button icon="el-icon-refresh" size="mini" @click="resetSearchForm">閲� 缃�</el-button>
+            <el-button type="primary" size="mini" @click="searchList">鏌ヨ</el-button>
+            <el-button size="mini" @click="resetSearchForm">閲嶇疆</el-button>
           </el-form-item>
         </el-form>
       </div>
       <div>
-        <el-button size="medium" @click="exportFun">瀵� 鍑�</el-button>
-        <el-button size="medium" type="primary" @click="openFormDia('add')">鏂� 澧�</el-button>
+        <el-button size="small" @click="exportFun">瀵� 鍑�</el-button>
+        <el-button size="small" type="primary" @click="importVisible = true">瀵� 鍏�</el-button>
+        <el-button size="small" type="primary" @click="openFormDia('add')">鏂� 澧�</el-button>
       </div>
     </div>
     <div class="table">
       <lims-table :tableData="tableData" :column="tableColumn" :height="'calc(100vh - 250px)'" @pagination="pagination"
-                  :page="page" :tableLoading="tableLoading"></lims-table>
+        :page="page" :tableLoading="tableLoading"></lims-table>
     </div>
     <form-dia v-if="formDia" ref="formDia" @closeYearDia="closeYearDia"></form-dia>
     <borrow-dia v-if="borrowDia" ref="borrowDia" @closeYearDia="closeBorrowDia"></borrow-dia>
     <return-dia v-if="returnDia" ref="returnDia" @closeYearDia="closeReturnDia"></return-dia>
+    <el-dialog title="鏍囧噯鐗╄川瀵煎叆" :visible.sync="importVisible" width="500px" @closed="resetImport">
+      <div style="margin-bottom: 12px;">
+        璇蜂娇鐢ㄦ爣鍑嗙墿璐ㄥ鍏ユā鏉垮~鍐欐暟鎹紝鍗曚釜鏂囦欢涓嶈秴杩�10MB銆�
+        <el-button type="text" @click="downloadTemplate">涓嬭浇瀵煎叆妯℃澘</el-button>
+      </div>
+      <el-upload ref="standardSubstanceUpload" drag name="file" accept=".xlsx" :action="importAction"
+                 :headers="uploadHeader" :auto-upload="false" :limit="1" :file-list="importFiles"
+                 :before-upload="beforeImport" :on-success="importSuccess" :on-error="importError">
+        <i class="el-icon-upload"></i>
+        <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
+      </el-upload>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="importVisible = false">鍙栨秷</el-button>
+        <el-button type="primary" :loading="importing" @click="submitImport">瀵煎叆</el-button>
+      </span>
+    </el-dialog>
   </div>
 
 </template>
 
 <script>
 
-// import FormDia from '../do/a6-standard-material-list/formDia.vue';
-// import BorrowDia from '../do/a6-standard-material-list/borrowDia.vue';
-// import ReturnDia from '../do/a6-standard-material-list/returnDia.vue';
 import limsTable from '@/components/Table/lims-table.vue'
 import {
   getPageStandardSubstance,
   removeStandardSubstance,
-  exportOfStandardSubstanceList
+  exportOfStandardSubstanceList,
+  downloadStandardSubstanceImportTemplate
 } from '@/api/cnas/resourceDemand/standardMaterial/standardMaterial'
 import FormDia from '../standardMaterial/component/formDia.vue';
 import BorrowDia from '../standardMaterial/component/borrowDia.vue';
 import ReturnDia from '../standardMaterial/component/returnDia.vue';
 export default {
+  name: 'StandardMaterial',
   components: {
     limsTable,
     FormDia,
@@ -121,11 +137,6 @@
           prop: 'remark',
           minWidth: '100'
         },
-        // {
-        //   label: '鍒涘缓浜�',
-        //   prop: 'createUser',
-        //   minWidth: '100'
-        // },
         {
           label: '鍒涘缓鏃堕棿',
           prop: 'createTime',
@@ -180,67 +191,96 @@
       formDia: false,
       borrowDia: false,
       returnDia: false,
+      importVisible: false,
+      importing: false,
+      importFiles: [],
+    }
+  },
+  computed: {
+    importAction() {
+      return this.javaApi + '/feStandardSubstance/importStandardSubstance'
     }
   },
   mounted() {
     this.searchList()
   },
-  methods :{
+  methods: {
+    downloadTemplate() {
+      downloadStandardSubstanceImportTemplate().then(res => {
+        this.$download.saveAs(new Blob([res]), '鏍囧噯鐗╄川瀵煎叆妯℃澘.xlsx')
+      })
+    },
+    submitImport() {
+      if (!this.$refs.standardSubstanceUpload.uploadFiles.length) {
+        this.$message.warning('璇烽�夋嫨闇�瑕佸鍏ョ殑Excel鏂囦欢')
+        return
+      }
+      this.$refs.standardSubstanceUpload.submit()
+    },
+    beforeImport(file) {
+      if (!file.name.toLowerCase().endsWith('.xlsx')) {
+        this.$message.error('浠呮敮鎸�.xlsx鏍煎紡鏂囦欢')
+        return false
+      }
+      if (file.size > 10 * 1024 * 1024) {
+        this.$message.error('瀵煎叆鏂囦欢涓嶈兘瓒呰繃10MB')
+        return false
+      }
+      this.importing = true
+      return true
+    },
+    importSuccess(response) {
+      this.importing = false
+      if (response.code !== 200) {
+        this.$message.error(response.message || response.msg || '瀵煎叆澶辫触')
+        return
+      }
+      this.$message.success(`鎴愬姛瀵煎叆${response.data}鏉℃爣鍑嗙墿璐╜)
+      this.importVisible = false
+      this.searchList()
+    },
+    importError() {
+      this.importing = false
+      this.$message.error('瀵煎叆澶辫触')
+    },
+    resetImport() {
+      this.importing = false
+      this.importFiles = []
+      if (this.$refs.standardSubstanceUpload) {
+        this.$refs.standardSubstanceUpload.clearFiles()
+      }
+    },
     exportFun() {
       this.outLoading = true
-      exportOfStandardSubstanceList(this.searchForm).then(res =>{
+      exportOfStandardSubstanceList(this.searchForm).then(res => {
         this.outLoading = false
-        const blob = new Blob([res], {type: 'application/octet-stream'},false);
-        let reader = new FileReader();
-        reader.readAsText(blob, 'utf-8');
-        reader.onload = () => {
-          try {
-            let result = JSON.parse(reader.result);
-            if (result.message) {
-              this.$message.error(result.message);
-            } else {
-              const url = URL.createObjectURL(blob);
-              const link = document.createElement('a');
-              link.href = url;
-              link.download = '鏍囧噯鐗╄川娓呭崟.xlsx';
-              link.click();
-              this.$message.success('瀵煎嚭鎴愬姛')
-            }
-          } catch (err) {
-            console.log(err);
-            const url = URL.createObjectURL(blob);
-            const link = document.createElement('a');
-            link.href = url;
-            link.download = '鏍囧噯鐗╄川娓呭崟.xlsx';
-            link.click();
-            this.$message.success('瀵煎嚭鎴愬姛')
-          }
-        }
+        const blob = new Blob([res], { type: 'application/octet-stream' }, false);
+        this.$download.saveAs(blob, '鏍囧噯鐗╄川娓呭崟.xlsx')
       })
     },
     // 鏌ヨ鍒楄〃
-    searchList () {
+    searchList() {
       this.tableLoading = true
       getPageStandardSubstance({
         ...this.page,
         ...this.searchForm
       }).then(res => {
         this.tableLoading = false
-        if (res.code === 200){
+        if (res.code === 200) {
           this.tableData = res.data.records
           this.page.total = res.data.total
         }
       })
     },
     // 鍒犻櫎
-    delPlan (row) {
+    delPlan(row) {
       this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?', '鎻愮ず', {
         confirmButtonText: '纭畾',
         cancelButtonText: '鍙栨秷',
         type: 'warning'
       }).then(() => {
         this.tableLoading = true
-        removeStandardSubstance({id:row.id}).then(res => {
+        removeStandardSubstance({ id: row.id }).then(res => {
           this.tableLoading = false
           if (res.code === 200) {
             this.$message.success('鍒犻櫎鎴愬姛')
@@ -257,40 +297,40 @@
       });
     },
     // 鏂板锛岀紪杈戯紝鎵瑰噯寮规
-    openFormDia (type, row) {
+    openFormDia(type, row) {
       this.formDia = true
       this.$nextTick(() => {
         this.$refs.formDia.openDia(type, row)
       })
     },
-    closeYearDia () {
+    closeYearDia() {
       this.formDia = false
       this.searchList()
     },
     // 鍊熺敤
-    borrow (row) {
+    borrow(row) {
       this.borrowDia = true
       this.$nextTick(() => {
         this.$refs.borrowDia.openDia(row)
       })
     },
-    closeBorrowDia () {
+    closeBorrowDia() {
       this.borrowDia = false
       this.searchList()
     },
     // 褰掕繕
-    return (row) {
+    return(row) {
       this.returnDia = true
       this.$nextTick(() => {
         this.$refs.returnDia.openDia(row)
       })
     },
-    closeReturnDia () {
+    closeReturnDia() {
       this.returnDia = false
       this.searchList()
     },
     // 閲嶇疆鏌ヨ鏉′欢
-    resetSearchForm () {
+    resetSearchForm() {
       this.searchForm.name = '';
       this.searchForm.factoryManufacturer = '';
       this.searchList()

--
Gitblit v1.9.3