From df87294d45f6ecc33eb0048da3600b3fb1129e6b Mon Sep 17 00:00:00 2001
From: zouyu <2723363702@qq.com>
Date: 星期四, 29 一月 2026 13:51:59 +0800
Subject: [PATCH] 不合格管理:新增OA审核状态、物料属性,时间区间字段;以及导出功能

---
 src/views/business/outsourcingFinishProduct/index.vue |   15 +--
 src/views/standard/standardLibrary/index.vue          |    9 +-
 src/views/business/inspectionReview/index.vue         |    2 
 src/views/business/rawMaterialInspection/index.vue    |   24 ++---
 src/api/business/unqualifiedHandler.js                |    9 ++
 src/views/business/unpass/index-manage.vue            |  140 +++++++++++++++++++++++++---------
 src/views/business/materialOrder/index.vue            |   24 +----
 7 files changed, 141 insertions(+), 82 deletions(-)

diff --git a/src/api/business/unqualifiedHandler.js b/src/api/business/unqualifiedHandler.js
index b736cc1..196e2b2 100644
--- a/src/api/business/unqualifiedHandler.js
+++ b/src/api/business/unqualifiedHandler.js
@@ -33,3 +33,12 @@
     params: query,
   });
 }
+//瀵煎嚭涓嶅悎鏍煎鐞嗚褰�
+export function exportUnqualifiedHandler(query) {
+  return request({
+    url: "/unqualifiedHandler/exportUnqualifiedHandler",
+    method: "get",
+    params: query,
+    responseType: "blob",
+  });
+}
diff --git a/src/views/business/inspectionReview/index.vue b/src/views/business/inspectionReview/index.vue
index 4c9b2a9..7002780 100644
--- a/src/views/business/inspectionReview/index.vue
+++ b/src/views/business/inspectionReview/index.vue
@@ -32,7 +32,7 @@
           </el-form-item>
 
         <el-form-item>
-          <el-button type=" primary" size="mini" @click="refreshTable">鏌ヨ</el-button>
+          <el-button type="primary" size="mini" @click="refreshTable">鏌ヨ</el-button>
               <el-button size="mini" @click="refresh">閲嶇疆</el-button>
         </el-form-item>
       </el-form>
diff --git a/src/views/business/materialOrder/index.vue b/src/views/business/materialOrder/index.vue
index 294a69c..2c6df80 100644
--- a/src/views/business/materialOrder/index.vue
+++ b/src/views/business/materialOrder/index.vue
@@ -14,23 +14,19 @@
               @keyup.enter.native="goSearch">
             </el-input>
           </el-form-item>
-
           <el-form-item label="濮旀墭缂栧彿" prop="entrustCode" v-if="tabIndex !== 0">
             <el-input v-model="entity.entrustCode" clearable placeholder="璇疯緭鍏�" size="small"
               @keyup.enter.native="goSearch">
             </el-input>
           </el-form-item>
-
           <el-form-item label="闆朵欢鍙�" prop="partNo">
             <el-input v-model="entity.partNo" clearable placeholder="璇疯緭鍏�" size="small" @keyup.enter.native="goSearch">
             </el-input>
           </el-form-item>
-
           <el-form-item label="闆朵欢鎻忚堪" prop="partDesc">
             <el-input v-model="entity.partDesc" clearable placeholder="璇疯緭鍏�" size="small" @keyup.enter.native="goSearch">
             </el-input>
           </el-form-item>
-
           <el-form-item label="鐗╂枡灞炴��" prop="materialProp">
             <el-select clearable size="small" v-model="entity.materialProp" style="width: 100%" @change="refreshTable()">
               <el-option v-for="dict in dict.type.material_prop_type" :key="dict.value" :label="dict.label"
@@ -38,43 +34,37 @@
               </el-option>
             </el-select>
           </el-form-item>
-
-          <el-form-item>
-            <el-button v-if="tabIndex === 2 || tabIndex === 3 || tabIndex === 4"
-                :icon="!more ? 'el-icon-arrow-down' : 'el-icon-arrow-up'" style="color: #3A7BFA;" type="text"
-                @click="more = !more">{{ !more ? '鏇村' : '鏀惰捣' }}</el-button>
-                <el-button size="mini" type="primary" @click="goSearch">鏌ヨ</el-button>
-                <el-button size="mini" @click="refresh()">閲嶇疆</el-button>
-          </el-form-item>
-
           <el-form-item label="渚涘簲鍟嗗悕绉�" prop="supplierName"
             v-if="(tabIndex === 2 || tabIndex === 3 || tabIndex === 4) && more">
             <el-input v-model="entity.supplierName" clearable placeholder="璇疯緭鍏�" size="small"
               @keyup.enter.native="goSearch">
             </el-input>
           </el-form-item>
-
           <el-form-item label="鏍峰搧鍨嬪彿" prop="sampleModel"
             v-if="(tabIndex === 2 || tabIndex === 3 || tabIndex === 4) && more">
             <el-input v-model="entity.sampleModel" clearable placeholder="璇疯緭鍏�" size="small"
               @keyup.enter.native="goSearch">
             </el-input>
           </el-form-item>
-
           <el-form-item label="妫�楠岀姸鎬�" prop="inspectStatus"
             v-if="(tabIndex === 2 || tabIndex === 3 || tabIndex === 4) && more">
             <el-select v-model="entity.inspectStatus" clearable size="small" @change="goSearch">
               <el-option v-for="(a, i) in inspectStatusList" :key="i" :label="a.label" :value="a.value"></el-option>
             </el-select>
           </el-form-item>
-
           <el-form-item label="涓嬪彂鏃堕棿" prop="date" v-if="(tabIndex === 2 || tabIndex === 3 || tabIndex === 4) && more">
             <el-date-picker v-model="entity.date" end-placeholder="缁撴潫鏃ユ湡" format="yyyy-MM-dd" placeholder="閫夋嫨鏃ユ湡"
               @change="goSearch" range-separator="鑷�" size="small" start-placeholder="寮�濮嬫棩鏈�" type="daterange"
               value-format="yyyy-MM-dd">
             </el-date-picker>
           </el-form-item>
-
+          <el-form-item>
+            <el-button v-if="tabIndex === 2 || tabIndex === 3 || tabIndex === 4"
+                       :icon="!more ? 'el-icon-arrow-down' : 'el-icon-arrow-up'" style="color: #3A7BFA;" type="text"
+                       @click="more = !more">{{ !more ? '鏇村' : '鏀惰捣' }}</el-button>
+            <el-button size="mini" type="primary" @click="goSearch">鏌ヨ</el-button>
+            <el-button size="mini" @click="refresh()">閲嶇疆</el-button>
+          </el-form-item>
         </el-form>
       </div>
       <div class="table">
diff --git a/src/views/business/outsourcingFinishProduct/index.vue b/src/views/business/outsourcingFinishProduct/index.vue
index 35bd105..d103971 100644
--- a/src/views/business/outsourcingFinishProduct/index.vue
+++ b/src/views/business/outsourcingFinishProduct/index.vue
@@ -41,14 +41,6 @@
               @keyup.enter.native="goSearch">
             </el-input>
           </el-form-item>
-          <el-form-item>
-            <el-button v-if="tabIndex === 2 || tabIndex === 3 || tabIndex === 4"
-              :icon="!more ? 'el-icon-arrow-down' : 'el-icon-arrow-up'" style="color: #3A7BFA;" type="text"
-              @click="more = !more">{{ !more ? '鏇村' : '鏀惰捣' }}</el-button>
-            <el-button size="mini" type="primary" @click="goSearch">鏌ヨ</el-button>
-            <el-button size="mini" @click="refresh()">閲嶇疆</el-button>
-          </el-form-item>
-
           <el-form-item label="鏍峰搧鍨嬪彿" prop="sampleModel"
             v-if="(tabIndex === 2 || tabIndex === 3 || tabIndex === 4) && more">
             <el-input v-model="entity.sampleModel" clearable placeholder="璇疯緭鍏�" size="small"
@@ -67,6 +59,13 @@
               value-format="yyyy-MM-dd">
             </el-date-picker>
           </el-form-item>
+          <el-form-item>
+            <el-button v-if="tabIndex === 2 || tabIndex === 3 || tabIndex === 4"
+                       :icon="!more ? 'el-icon-arrow-down' : 'el-icon-arrow-up'" style="color: #3A7BFA;" type="text"
+                       @click="more = !more">{{ !more ? '鏇村' : '鏀惰捣' }}</el-button>
+            <el-button size="mini" type="primary" @click="goSearch">鏌ヨ</el-button>
+            <el-button size="mini" @click="refresh()">閲嶇疆</el-button>
+          </el-form-item>
         </el-form>
       </div>
       <div class="table">
diff --git a/src/views/business/rawMaterialInspection/index.vue b/src/views/business/rawMaterialInspection/index.vue
index be19b63..7563e12 100644
--- a/src/views/business/rawMaterialInspection/index.vue
+++ b/src/views/business/rawMaterialInspection/index.vue
@@ -28,37 +28,35 @@
               @keyup.enter.native="refreshTable">
             </el-input>
           </el-form-item>
-          <el-form-item>
-            <el-button v-if="tabIndex === 3 || tabIndex === 4" :icon="!more ? 'el-icon-arrow-down' : 'el-icon-arrow-up'"
-              style="color: #3A7BFA;" type="text" @click="more = !more">{{ !more ? '鏇村' : '鏀惰捣' }}</el-button>
-            <el-button size="mini" type="primary" @click="refreshTable()">鏌ヨ</el-button>
-            <el-button size="mini" @click="refresh()" >閲嶇疆</el-button>
-          </el-form-item>
-        </el-row>
-        <el-row>
           <el-form-item label="妫�楠岀姸鎬�" prop="inspectStatus" v-if="(tabIndex === 3 || tabIndex === 4) && more">
             <el-select v-model="componentData.inspectStatus" clearable size="small" style="width: 100%;"
-              @change="refreshTable()">
+                       @change="refreshTable()">
               <el-option v-for="(a, i) in queryStatusList" :key="i" :label="a.label" :value="a.value"></el-option>
             </el-select>
           </el-form-item>
           <el-form-item label="涓嬪彂鏃堕棿" prop="date" v-if="(tabIndex === 3 || tabIndex === 4) && more">
             <el-date-picker v-model="componentData.date" end-placeholder="缁撴潫鏃ユ湡" format="yyyy-MM-dd" placeholder="閫夋嫨鏃ユ湡"
-              range-separator="鑷�" size="small" start-placeholder="寮�濮嬫棩鏈�" style="width: 100%;" type="daterange" @change="refreshTable()"
-              value-format="yyyy-MM-dd">
+                            range-separator="鑷�" size="small" start-placeholder="寮�濮嬫棩鏈�" style="width: 100%;" type="daterange" @change="refreshTable()"
+                            value-format="yyyy-MM-dd">
             </el-date-picker>
           </el-form-item>
           <el-form-item label="濮旀墭缂栧彿" prop="entrustCode" v-if="(tabIndex === 3 || tabIndex === 4) && more">
             <el-input v-model="componentData.entrustCode" clearable placeholder="璇疯緭鍏�" size="small"
-              @keyup.enter.native="refreshTable">
+                      @keyup.enter.native="refreshTable">
             </el-input>
           </el-form-item>
           <el-form-item label="閿�鍞鍗曞垎绫�" prop="orderType" v-if="(tabIndex === 3 || tabIndex === 4) && more">
             <el-select v-model="componentData.orderType" clearable size="small"
-              @keyup.enter.native="refreshTable">
+                       @keyup.enter.native="refreshTable">
               <el-option v-for="(item,index) in orderTypeList" :label="item.dictLabel" :value="item.dictValue" :key="index"></el-option>
             </el-select>
           </el-form-item>
+          <el-form-item>
+            <el-button v-if="tabIndex === 3 || tabIndex === 4" :icon="!more ? 'el-icon-arrow-down' : 'el-icon-arrow-up'"
+              style="color: #3A7BFA;" type="text" @click="more = !more">{{ !more ? '鏇村' : '鏀惰捣' }}</el-button>
+            <el-button size="mini" type="primary" @click="refreshTable()">鏌ヨ</el-button>
+            <el-button size="mini" @click="refresh()" >閲嶇疆</el-button>
+          </el-form-item>
         </el-row>
       </el-form>
     </div>
diff --git a/src/views/business/unpass/index-manage.vue b/src/views/business/unpass/index-manage.vue
index 39596e6..556c548 100644
--- a/src/views/business/unpass/index-manage.vue
+++ b/src/views/business/unpass/index-manage.vue
@@ -26,9 +26,40 @@
             <el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="entity.sample"
                       @keyup.enter.native="refreshTable()"></el-input>
           </el-form-item>
+          <el-form-item label="鐗╂枡灞炴��" prop="materialProp">
+            <el-select clearable size="small" v-model="entity.materialProp" style="width: 100%" @change="refreshTable()">
+              <el-option v-for="dict in dict.type.material_prop_type" :key="dict.value" :label="dict.label"
+                         :value="dict.value">
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="OA瀹℃牳鐘舵��" prop="operation">
+            <el-select clearable size="small" v-model="entity.operation" style="width: 100%" @change="refreshTable()">
+              <el-option v-for="dict in dict.type.oa_workflow_state" :key="dict.value" :label="dict.label"
+                         :value="dict.value">
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="鍙嶉鏃ユ湡" prop="feedbackDateTime">
+            <el-date-picker
+              type="daterange"
+              size="small"
+              start-placeholder="寮�濮嬫棩鏈�"
+              end-placeholder="缁撴潫鏃ユ湡"
+              clearable
+              value-format="yyyy-MM-dd"
+              v-model="entity.feedbackDateTime"
+              @keyup.enter.native="refreshTable()">
+            </el-date-picker>
+          </el-form-item>
+          <el-form-item label="渚涘簲鍟嗗悕绉�" prop="supplierName">
+            <el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="entity.supplierName"
+                      @keyup.enter.native="refreshTable()"></el-input>
+          </el-form-item>
           <el-form-item>
             <el-button type="primary" size="mini" @click="refreshTable">鏌ヨ</el-button>
             <el-button size="mini" @click="refresh">閲嶇疆</el-button>
+            <el-button :loading="exportLoading" type="success" size="mini" @click="exportUnqualifiedHandler">瀵煎嚭</el-button>
           </el-form-item>
         </el-form>
       </div>
@@ -79,14 +110,15 @@
 import UnPassDialog from "./components/unPassDialog.vue";
 import OAProcess from "./components/OAProcess.vue";
 import limsTable from "@/components/Table/lims-table.vue";
-import {deleteUnqualifiedHandler, page, pushOA} from "@/api/business/unqualifiedHandler";
-
+import {deleteUnqualifiedHandler, page, pushOA,exportUnqualifiedHandler} from "@/api/business/unqualifiedHandler";
+import {transformExcel} from '@/utils/file'
 export default {
   components: {
     limsTable,
     OAProcess,
     UnPassDialog,
   },
+  dicts: ['material_prop_type','oa_workflow_state'],
   data() {
     return {
       handlerId: null,
@@ -94,6 +126,10 @@
         contract: null,
         sample: null,
         specsModels: null,
+        supplierName: null,
+        feedbackDateTime:[],
+        materialProp: null,
+        operation:null
       },
       tableData: [],
       tableLoading: false,
@@ -101,7 +137,7 @@
         {
           label: 'IFS鍩�',
           prop: 'contract',
-          width: '120px',
+          width: '80px',
           dataType: 'tag',
           formatData: (params) => {
             return params
@@ -118,34 +154,25 @@
 
         },
         { label: '缂栧彿', prop: 'no', width: "160px", },
-        // {
-        //   label: "OA瀹℃牳鐘舵��",
-        //   prop: "oaState",
-        //   width: "100px",
-        //   dataType: "tag",
-        //   formatData: (params) => {
-        //     if (params == 1) {
-        //       return "寰呭鏍�";
-        //     } else if(params == 2) {
-        //       return "瀹℃牳涓�";
-        //     }  else if(params == 3) {
-        //       return "閫氳繃";
-        //     } else {
-        //       return "椹冲洖";
-        //     }
-        //   },
-        //   formatType: (params) => {
-        //     if (params == 1) {
-        //       return "warning";
-        //     } else if(params == 2) {
-        //       return "info";
-        //     }  else if(params == 3) {
-        //       return "success";
-        //     } else {
-        //       return "danger";
-        //     }
-        //   },
-        // },
+        {
+          label: "OA瀹℃牳鐘舵��",
+          prop: "operation",
+          width: "100px",
+          dataType: "tag",
+          formatData: (params) => {
+            return params
+          },
+          formatType: (params) => {
+            if(params){
+              this.dict.type.oa_workflow_state.forEach(item => {
+                if(item.value === params){
+                  params = item.raw.listClass
+                }
+              });
+            }
+            return params
+          },
+        },
         { label: '璁㈠崟鍙�', prop: 'orderNo' },
         {
           label: "闆朵欢鍙�",
@@ -154,16 +181,31 @@
           dataType: "link",
           linkMethod: "openUnPassDialog",
         },
-        { label: '闆朵欢鎻忚堪', prop: 'partDesc' },
-        { label: '鐗╂枡鍚嶇О', prop: 'materialName' },
-        { label: '鐢熶骇鎵规', prop: 'productionBatch' },
+        { label: '闆朵欢鎻忚堪', prop: 'partDesc',width: "160px" },
+        {
+          label: '鐗╂枡灞炴��',
+          prop: 'materialProp',
+          formatData: (params) => {
+            if (!params) return null
+
+            for (let i = 0; i < this.dict.type.material_prop_type.length; i++) {
+              const item = this.dict.type.material_prop_type[i]
+              if (item.value == params) {
+                return item.label
+              }
+            }
+            return null
+          }
+        },
+        { label: '鐗╂枡鍚嶇О', prop: 'materialName',width: "160px" },
+        { label: '鐢熶骇鎵规', prop: 'productionBatch',width: "160px" },
         { label: '鍒拌揣鏁伴噺', prop: 'cargoQuantity' },
         { label: '瑙勬牸鍨嬪彿', prop: 'specsModels' },
         { label: '鎶ユ鏃ユ湡', prop: 'inspectTime' },
         { label: '鐘舵��', prop: 'statusDB' },
         { label: '鍙嶉浜�', prop: 'feedbackUser' },
-        { label: '瑕佹楠岀殑閲囪喘鏁伴噺', prop: 'qtyToInspect' },
-        { label: '鍙嶉鏃ユ湡', prop: 'feedbackTime' },
+        { label: '瑕佹楠岀殑閲囪喘鏁伴噺', prop: 'qtyToInspect',width: "140px" },
+        { label: '鍙嶉鏃ユ湡', prop: 'feedbackTime',width: "100px" },
         {
           label: "鍒嗙被",
           prop: "classification",
@@ -192,7 +234,7 @@
         {
           label: "涓嶅悎鏍煎綊灞�",
           prop: "offGradeAscription",
-          width: "100px",
+          width: "120px",
           dataType: "tag",
           formatData: (params) => {
             if (params == 0) {
@@ -213,7 +255,7 @@
             }
           },
         },
-        { label: '涓嶅悎鏍兼弿杩�', prop: 'unqualifiedDesc' },
+        { label: '涓嶅悎鏍兼弿杩�', prop: 'unqualifiedDesc',width: "160px" },
         {
           dataType: 'action',
           fixed: 'right',
@@ -263,15 +305,35 @@
       submitOALoading: false, // OA娴佺▼寮规鎻愪氦鎸夐挳loading
       deleteVisible: false, // OA娴佺▼鍒犻櫎寮规
       cancelOALoading: false, // OA娴佺▼鍒犻櫎寮规鎻愪氦鎸夐挳loading
+      exportLoading:false
     };
   },
   mounted() {
     this.refreshTable()
   },
   methods: {
+    exportUnqualifiedHandler(){
+      this.exportLoading = true
+      const newEntity = { ...this.entity }
+      if (newEntity.feedbackDateTime && newEntity.feedbackDateTime.length > 0) {
+        newEntity.feedbackStartTime = newEntity.feedbackDateTime[0]
+        newEntity.feedbackEndTime = newEntity.feedbackDateTime[1]
+      }
+      exportUnqualifiedHandler({...newEntity}).then(res=>{
+        transformExcel(res,'涓嶅悎鏍煎鐞嗚褰�.xlsx')
+        this.exportLoading = false
+      }).catch(error=>{
+        console.error(error)
+      })
+    },
     refreshTable() {
       this.tableLoading = true
-      page({ ...this.page, ...this.entity }).then(res => {
+      const newEntity = { ...this.entity }
+      if (newEntity.feedbackDateTime && newEntity.feedbackDateTime.length > 0) {
+        newEntity.feedbackStartTime = newEntity.feedbackDateTime[0]
+        newEntity.feedbackEndTime = newEntity.feedbackDateTime[1]
+      }
+      page({ ...this.page, ...newEntity }).then(res => {
         this.tableLoading = false
         this.tableData = res.data.records
         this.page.total = res.data.total
diff --git a/src/views/standard/standardLibrary/index.vue b/src/views/standard/standardLibrary/index.vue
index 28059ee..1016fc7 100644
--- a/src/views/standard/standardLibrary/index.vue
+++ b/src/views/standard/standardLibrary/index.vue
@@ -6,7 +6,7 @@
           <el-row>
             <el-col :span="20">
               <el-input v-model="search" clearable placeholder="杈撳叆鍏抽敭瀛楄繘琛屾悳绱�" size="small" style="margin-bottom: 5px"
-                suffix-icon="el-icon-search" @blur="searchFilter" @clear="searchFilter"></el-input>
+                suffix-icon="el-icon-search" @keydown.enter.native="searchFilter" @blur="searchFilter" @clear="searchFilter"></el-input>
             </el-col>
             <el-col v-if="checkPermi(['standard:standardLibrary:add'])" :span="4"
               style="text-align: center; line-height: 30px">
@@ -510,13 +510,14 @@
       }
     },
     // 璋冪敤tree杩囨护鏂规硶 涓枃鑻辫繃婊�
-    filterNode(value, data, node) {
+    filterNode (value, data, node) {
       if (!value) {銆�銆�銆�銆�//濡傛灉鏁版嵁涓虹┖锛屽垯杩斿洖true,鏄剧ず鎵�鏈夌殑鏁版嵁椤�
         return true
       }
+      return data.label.indexOf(value) !== -1;
       // 鏌ヨ鍒楄〃鏄惁鏈夊尮閰嶆暟鎹紝灏嗗�煎皬鍐欙紝鍖归厤鑻辨枃鏁版嵁
-      let val = value.toLowerCase()
-      return this.chooseNode(val, data, node) // 璋冪敤杩囨护浜屽眰鏂规硶
+      // let val = value.toLowerCase()
+      // return this.chooseNode(val, data, node) // 璋冪敤杩囨护浜屽眰鏂规硶
     },
     // 杩囨护鐖惰妭鐐� / 瀛愯妭鐐� (濡傛灉杈撳叆鐨勫弬鏁版槸鐖惰妭鐐逛笖鑳藉尮閰嶏紝鍒欒繑鍥炶鑺傜偣浠ュ強鍏朵笅鐨勬墍鏈夊瓙鑺傜偣锛涘鏋滃弬鏁版槸瀛愯妭鐐癸紝鍒欒繑鍥炶鑺傜偣鐨勭埗鑺傜偣銆俷ame鏄腑鏂囧瓧绗︼紝enName鏄嫳鏂囧瓧绗�.
     chooseNode(value, data, node) {

--
Gitblit v1.9.3