From f42a646e394dbf4b68cb1beba0015ca8de03a61c Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期三, 27 五月 2026 14:19:43 +0800
Subject: [PATCH] 君歌 1.不合格管理修改

---
 src/views/qualityManagement/nonconformingManagement/components/formDia.vue |  539 ++++++++++++++++++-----------------
 src/api/qualityManagement/nonconformingManagement.js                       |   49 +-
 src/views/qualityManagement/nonconformingManagement/index.vue              |  293 +++++++++----------
 3 files changed, 434 insertions(+), 447 deletions(-)

diff --git a/src/api/qualityManagement/nonconformingManagement.js b/src/api/qualityManagement/nonconformingManagement.js
index 50a1b74..ca14b76 100644
--- a/src/api/qualityManagement/nonconformingManagement.js
+++ b/src/api/qualityManagement/nonconformingManagement.js
@@ -1,50 +1,45 @@
 import request from "@/utils/request";
 
-// 鏌ヨ涓嶅悎鏍肩鐞嗗垪琛�
+// 鏌ヨ涓嶅悎鏍煎搧澶勭悊鍗曞垪琛�
 export function qualityUnqualifiedListPage(query) {
   return request({
-    url: "/quality/qualityUnqualified/listPage",
+    url: "/qualityUnqualifiedOrder/listPage",
     method: "get",
     params: query,
   });
 }
-// 鏂板涓嶅悎鏍肩鐞嗗垪琛�
-export function qualityUnqualifiedAdd(query) {
+
+// 鏂板涓嶅悎鏍煎搧澶勭悊鍗�
+export function qualityUnqualifiedAdd(data) {
   return request({
-    url: "/quality/qualityUnqualified/add",
+    url: "/qualityUnqualifiedOrder/save",
     method: "post",
-    data: query,
+    data: data,
   });
 }
-// 淇敼涓嶅悎鏍肩鐞嗗垪琛�
-export function qualityUnqualifiedUpdate(query) {
+
+// 淇敼涓嶅悎鏍煎搧澶勭悊鍗�
+export function qualityUnqualifiedUpdate(data) {
   return request({
-    url: "/quality/qualityUnqualified/update",
-    method: "post",
-    data: query,
+    url: "/qualityUnqualifiedOrder/update",
+    method: "put",
+    data: data,
   });
 }
-// 涓嶅悎鏍煎鐞�
-export function qualityUnqualifiedDeal(query) {
+
+// 鍒犻櫎涓嶅悎鏍煎搧澶勭悊鍗�
+export function qualityUnqualifiedDel(ids) {
   return request({
-    url: "/quality/qualityUnqualified/deal",
-    method: "post",
-    data: query,
-  });
-}
-// 鍒犻櫎涓嶅悎鏍肩鐞嗗垪琛�
-export function qualityUnqualifiedDel(query) {
-  return request({
-    url: "/quality/qualityUnqualified/del",
+    url: "/qualityUnqualifiedOrder/delete",
     method: "delete",
-    data: query,
+    data: ids,
   });
 }
-// 鏌ヨ涓嶅悎鏍肩鐞嗕俊鎭�
-export function getQualityUnqualifiedInfo(query) {
+
+// 鏌ヨ涓嶅悎鏍煎搧澶勭悊鍗曡鎯�
+export function getQualityUnqualifiedInfo(id) {
   return request({
-    url: "/quality/qualityUnqualified/" + query,
+    url: "/qualityUnqualifiedOrder/listPage?current=1&size=1&id=" + id,
     method: "get",
-    data: query,
   });
 }
diff --git a/src/views/qualityManagement/nonconformingManagement/components/formDia.vue b/src/views/qualityManagement/nonconformingManagement/components/formDia.vue
index 20d01e0..6358d87 100644
--- a/src/views/qualityManagement/nonconformingManagement/components/formDia.vue
+++ b/src/views/qualityManagement/nonconformingManagement/components/formDia.vue
@@ -2,70 +2,108 @@
   <div>
     <el-dialog
         v-model="dialogFormVisible"
-        :title="operationType === 'add' ? '鏂板涓嶅悎鏍肩鐞�' : '缂栬緫涓嶅悎鏍肩鐞�'"
-        width="70%"
+        :title="operationType === 'add' ? '鏂板涓嶅悎鏍煎搧澶勭悊鍗�' : '缂栬緫涓嶅悎鏍煎搧澶勭悊鍗�'"
+        width="80%"
         @close="closeDia"
     >
       <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
+        <!-- 绗竴琛岋細椤圭洰鍚嶇О銆侀」鐩紪鍙� -->
         <el-row :gutter="30">
           <el-col :span="12">
-            <el-form-item label="绫诲埆锛�" prop="inspectType">
-              <el-select v-model="form.inspectType">
-                <el-option label="鍘熸潗鏂欐楠�" :value="0" />
-                <el-option label="杩囩▼妫�楠�" :value="1" />
-                <el-option label="鍑哄巶妫�楠�" :value="2" />
-              </el-select>
+            <el-form-item label="椤圭洰鍚嶇О锛�" prop="projectName">
+              <el-input v-model="form.projectName" placeholder="璇疯緭鍏ラ」鐩悕绉�" clearable/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="椤圭洰缂栧彿锛�" prop="projectNo">
+              <el-input v-model="form.projectNo" placeholder="璇疯緭鍏ラ」鐩紪鍙�" clearable/>
             </el-form-item>
           </el-col>
         </el-row>
+        
+        <!-- 绗簩琛岋細璁惧鍚嶇О銆佽澶囧浘鍙� -->
         <el-row :gutter="30">
           <el-col :span="12">
-            <el-form-item label="浜у搧鍚嶇О锛�" prop="productId">
-              <el-tree-select
-                  v-model="form.productId"
-                  placeholder="璇烽�夋嫨"
-                  clearable
-                  check-strictly
-                  @change="getModels"
-                  :data="productOptions"
-                  :render-after-expand="false"
-                  style="width: 100%"
-              />
+            <el-form-item label="璁惧鍚嶇О锛�" prop="equipmentName">
+              <el-input v-model="form.equipmentName" placeholder="璇疯緭鍏ヨ澶囧悕绉�" clearable/>
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="model">
-              <el-select v-model="form.model" placeholder="璇烽�夋嫨" clearable :disabled="operationType === 'edit'"
-                          filterable readonly @change="handleChangeModel">
-              <el-option v-for="item in modelOptions" :key="item.id" :label="item.model" :value="item.id" />
-            </el-select>
+            <el-form-item label="璁惧鍥惧彿锛�" prop="equipmentDrawingNo">
+              <el-input v-model="form.equipmentDrawingNo" placeholder="璇疯緭鍏ヨ澶囧浘鍙�" clearable/>
             </el-form-item>
           </el-col>
         </el-row>
+        
+        <!-- 绗笁琛岋細鐗╂枡/閮ㄤ欢鍚嶇О銆佺墿鏂欏浘鍙� -->
         <el-row :gutter="30">
           <el-col :span="12">
-            <el-form-item label="鍗曚綅锛�" prop="unit">
-              <el-input v-model="form.unit" placeholder="璇疯緭鍏�" clearable/>
+            <el-form-item label="鐗╂枡/閮ㄤ欢鍚嶇О锛�" prop="materialName">
+              <el-input v-model="form.materialName" placeholder="璇疯緭鍏ョ墿鏂�/閮ㄤ欢鍚嶇О" clearable/>
             </el-form-item>
           </el-col>
           <el-col :span="12">
+            <el-form-item label="鐗╂枡鍥惧彿锛�" prop="materialDrawingNo">
+              <el-input v-model="form.materialDrawingNo" placeholder="璇疯緭鍏ョ墿鏂欏浘鍙�" clearable/>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        
+        <!-- 绗洓琛岋細鍨嬪彿瑙勬牸銆佹潗璐ㄣ�佹暟閲忋�佷笉鍚堟牸鏁� -->
+        <el-row :gutter="30">
+          <el-col :span="6">
+            <el-form-item label="鍨嬪彿瑙勬牸锛�" prop="specificationModel">
+              <el-input v-model="form.specificationModel" placeholder="璇疯緭鍏ュ瀷鍙疯鏍�" clearable/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="鏉愯川锛�" prop="materialQuality">
+              <el-input v-model="form.materialQuality" placeholder="璇疯緭鍏ユ潗璐�" clearable/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
             <el-form-item label="鏁伴噺锛�" prop="quantity">
-              <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.quantity" placeholder="璇疯緭鍏�" clearable :precision="2"/>
+              <el-input-number :step="1" :min="0" style="width: 100%" v-model="form.quantity" placeholder="璇疯緭鍏ユ暟閲�" :precision="0"/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="涓嶅悎鏍兼暟锛�" prop="unqualifiedQuantity">
+              <el-input-number :step="1" :min="0" style="width: 100%" v-model="form.unqualifiedQuantity" placeholder="璇疯緭鍏ヤ笉鍚堟牸鏁�" :precision="0"/>
             </el-form-item>
           </el-col>
         </el-row>
+        
+        <!-- 绗簲琛岋細涓嶅悎鏍煎伐搴忋�佷緵璐у晢鍚嶇О -->
         <el-row :gutter="30">
           <el-col :span="12">
-            <el-form-item label="妫�楠屽憳锛�" prop="checkName">
-              <el-select v-model="form.checkName" placeholder="璇烽�夋嫨" clearable style="width: 100%">
+            <el-form-item label="涓嶅悎鏍煎伐搴忥細" prop="unqualifiedProcess">
+              <el-radio-group v-model="form.unqualifiedProcess">
+                <el-radio :label="1">鏉ユ枡</el-radio>
+                <el-radio :label="2">鍒剁▼</el-radio>
+                <el-radio :label="3">鎴愬搧</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="渚涜揣鍟嗗悕绉帮細" prop="supplierName">
+              <el-input v-model="form.supplierName" placeholder="璇疯緭鍏ヤ緵璐у晢鍚嶇О" clearable/>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        
+        <!-- 绗叚琛岋細妫�楠屽憳銆佹楠屾棩鏈熴�佽矗浠讳汉銆佽矗浠婚儴闂� -->
+        <el-row :gutter="30">
+          <el-col :span="6">
+            <el-form-item label="妫�楠屽憳锛�" prop="inspectorName">
+              <el-select v-model="form.inspectorName" placeholder="璇烽�夋嫨" clearable style="width: 100%">
                 <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" :value="item.nickName"/>
               </el-select>
             </el-form-item>
           </el-col>
-          <el-col :span="12">
-            <el-form-item label="妫�娴嬫棩鏈燂細" prop="checkTime">
+          <el-col :span="6">
+            <el-form-item label="妫�楠屾棩鏈燂細" prop="inspectDate">
               <el-date-picker
-                  v-model="form.checkTime"
+                  v-model="form.inspectDate"
                   type="date"
                   placeholder="璇烽�夋嫨鏃ユ湡"
                   value-format="YYYY-MM-DD"
@@ -75,93 +113,142 @@
               />
             </el-form-item>
           </el-col>
-        </el-row>
-        <el-row :gutter="30">
-          <el-col :span="12">
-            <el-form-item label="涓嶅悎鏍肩幇璞★細" prop="defectivePhenomena">
-              <el-input v-model="form.defectivePhenomena" placeholder="璇疯緭鍏�" clearable/>
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="澶勭悊缁撴灉锛�" prop="dealResult">
-              <el-select v-model="form.dealResult" placeholder="璇烽�夋嫨" clearable>
-                <el-option :label="item.label" :value="item.value" v-for="item in rejection_handling" :key="item.value" />
-              </el-select>
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="30">
-          <el-col :span="12">
-            <el-form-item label="澶勭悊浜猴細" prop="dealName">
-              <el-select v-model="form.dealName" placeholder="璇烽�夋嫨" clearable style="width: 100%">
+          <el-col :span="6">
+            <el-form-item label="璐d换浜猴細" prop="responsiblePerson">
+              <el-select v-model="form.responsiblePerson" placeholder="璇烽�夋嫨" clearable style="width: 100%">
                 <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" :value="item.nickName"/>
               </el-select>
             </el-form-item>
           </el-col>
-          <el-col :span="12">
-            <el-form-item label="澶勭悊鏃ユ湡锛�" prop="dealTime">
-              <el-date-picker
-                  v-model="form.dealTime"
-                  type="date"
-                  placeholder="璇烽�夋嫨鏃ユ湡"
-                  value-format="YYYY-MM-DD"
-                  format="YYYY-MM-DD"
+          <el-col :span="6">
+            <el-form-item label="璐d换閮ㄩ棬锛�" prop="responsibleDept">
+              <el-input v-model="form.responsibleDept" placeholder="璇疯緭鍏ヨ矗浠婚儴闂�" clearable/>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        
+        <!-- 绗竷琛岋細闂鎻忚堪 -->
+        <el-row :gutter="30">
+          <el-col :span="24">
+            <el-form-item label="闂鎻忚堪锛�" prop="problemDescription">
+              <el-input
+                  v-model="form.problemDescription"
+                  type="textarea"
+                  :rows="3"
+                  placeholder="璇疯緭鍏ラ棶棰樻弿杩�"
                   clearable
-                  style="width: 100%"
               />
             </el-form-item>
           </el-col>
         </el-row>
+        
+        <!-- 绗叓琛岋細鍘熷洜鍒嗘瀽鍙婂缓璁� -->
         <el-row :gutter="30">
-          <el-col :span="12">
-            <el-form-item label="宸ユ椂鎹熷け锛�" prop="lossWorking">
-              <el-input-number
-                  v-model="form.lossWorking"
-                  :min="0"
-                  :step="0.01"
-                  :precision="2"
-                  style="width: 100%"
-                  placeholder="璇疯緭鍏�"
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="鏉愭枡璐规崯澶憋細" prop="lossMaterial">
-              <el-input-number
-                  v-model="form.lossMaterial"
-                  :min="0"
-                  :step="0.01"
-                  :precision="2"
-                  style="width: 100%"
-                  placeholder="璇疯緭鍏�"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="30">
-          <el-col :span="12">
-            <el-form-item label="鍘熷洜鍒嗘瀽锛�" prop="reasonAnalysis">
+          <el-col :span="24">
+            <el-form-item label="鍘熷洜鍒嗘瀽鍙婂缓璁細" prop="reasonAnalysis">
               <el-input
                   v-model="form.reasonAnalysis"
                   type="textarea"
                   :rows="4"
-                  placeholder="璇疯緭鍏�"
-                  clearable
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="棰勯槻涓庣籂姝f帾鏂斤細" prop="preventiveCorrective">
-              <el-input
-                  v-model="form.preventiveCorrective"
-                  type="textarea"
-                  :rows="4"
-                  placeholder="璇疯緭鍏�"
+                  placeholder="璇疯緭鍏ュ師鍥犲垎鏋愬強寤鸿"
                   clearable
               />
             </el-form-item>
           </el-col>
         </el-row>
+        
+        <!-- 绗節琛岋細绾犳鎺柦 -->
+        <el-row :gutter="30">
+          <el-col :span="24">
+            <el-form-item label="绾犳鎺柦锛�" prop="correctionAction">
+              <el-input
+                  v-model="form.correctionAction"
+                  type="textarea"
+                  :rows="3"
+                  placeholder="璇疯緭鍏ョ籂姝f帾鏂�"
+                  clearable
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        
+        <!-- 绗崄琛岋細澶勭疆鏂瑰紡 -->
+        <el-row :gutter="30">
+          <el-col :span="24">
+            <el-form-item label="澶勭疆鏂瑰紡锛�" prop="disposalMethod">
+              <el-radio-group v-model="form.disposalMethod">
+                <el-radio :label="1">璁╂鎺ユ敹</el-radio>
+                <el-radio :label="2">鍘傚唴缁翠慨</el-radio>
+                <el-radio :label="3">杩斿巶缁翠慨</el-radio>
+                <el-radio :label="4">鎹㈣揣</el-radio>
+                <el-radio :label="5">閫�璐�</el-radio>
+                <el-radio :label="6">鎶ュ簾</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        
+        <!-- 绗崄涓�琛岋細鍘傚唴/杩斿巶缁翠慨璇勪及 -->
+        <el-row :gutter="30">
+          <el-col :span="24">
+            <el-form-item label="鍘傚唴/杩斿巶缁翠慨璇勪及锛�" prop="repairEvaluation">
+              <el-input
+                  v-model="form.repairEvaluation"
+                  type="textarea"
+                  :rows="3"
+                  placeholder="璇疯緭鍏ュ巶鍐�/杩斿巶缁翠慨璇勪及"
+                  clearable
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        
+        <!-- 绗崄浜岃锛氶闃叉帾鏂� -->
+        <el-row :gutter="30">
+          <el-col :span="24">
+            <el-form-item label="棰勯槻鎺柦锛�" prop="preventiveAction">
+              <el-input
+                  v-model="form.preventiveAction"
+                  type="textarea"
+                  :rows="3"
+                  placeholder="璇疯緭鍏ラ闃叉帾鏂�"
+                  clearable
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        
+        <!-- 绗崄涓夎锛氱姸鎬� -->
+        <el-row :gutter="30">
+          <el-col :span="24">
+            <el-form-item label="鐘舵�侊細" prop="status">
+              <el-radio-group v-model="form.status">
+                <el-radio :label="0">鑽夌</el-radio>
+                <el-radio :label="1">寰呭鏍�</el-radio>
+                <el-radio :label="2">瀹℃壒涓�</el-radio>
+                <el-radio :label="3">宸插畬鎴�</el-radio>
+                <el-radio :label="4">宸查┏鍥�</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        
+        <!-- 绗崄鍥涜锛氬娉� -->
+        <el-row :gutter="30">
+          <el-col :span="24">
+            <el-form-item label="澶囨敞锛�" prop="remark">
+              <el-input
+                  v-model="form.remark"
+                  type="textarea"
+                  :rows="3"
+                  placeholder="璇疯緭鍏ュ娉�"
+                  clearable
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        
+        <!-- 绗崄浜旇锛氫笉鑹搧鐓х墖 -->
         <el-row :gutter="30">
           <el-col :span="24">
             <el-form-item label="涓嶈壇鍝佺収鐗囷細" prop="defectivePhotos">
@@ -181,7 +268,7 @@
                 <el-button type="primary" v-if="operationType !== 'view'">涓婁紶</el-button>
                 <template #tip v-if="operationType !== 'view'">
                   <div class="el-upload__tip">
-                    鏂囦欢鏍煎紡鏀寔 doc锛宒ocx锛寈ls锛寈lsx锛宲pt锛宲ptx锛宲df锛宼xt锛寈ml锛宩pg锛宩peg锛宲ng锛実if锛宐mp锛宺ar锛寊ip锛�7z
+                    鏂囦欢鏍煎紡鏀寔 jpg锛宩peg锛宲ng锛実if锛宐mp
                   </div>
                 </template>
               </el-upload>
@@ -200,8 +287,7 @@
 </template>
 
 <script setup>
-import { ref, reactive, toRefs, getCurrentInstance, watch } from "vue";
-import {modelList, productTreeList} from "@/api/basicData/product.js";
+import { ref, reactive, toRefs, getCurrentInstance } from "vue";
 import {
   getQualityUnqualifiedInfo,
   qualityUnqualifiedAdd,
@@ -216,54 +302,62 @@
 
 const dialogFormVisible = ref(false);
 const operationType = ref('')
-const { rejection_handling } = proxy.useDict("rejection_handling")
 const defectivePhotoFileList = ref([]);
 const defectivePhotoUploadRef = ref(null);
 const upload = reactive({
   url: import.meta.env.VITE_APP_BASE_API + "/file/upload",
   headers: { Authorization: "Bearer " + getToken() },
 });
+
 const data = reactive({
   form: {
-    checkTime: "",
-    process: "",
-    checkName: "",
-    productName: "",
-    productId: "",
-    model: "",
-    unit: "",
-    quantity: "",
-    checkCompany: "",
-    checkResult: "",
-    inspectType: '',
-    defectivePhenomena: '',
+    // 鍩烘湰淇℃伅
+    projectName: '',
+    projectNo: '',
+    equipmentName: '',
+    equipmentDrawingNo: '',
+    materialName: '',
+    materialDrawingNo: '',
+    specificationModel: '',
+    materialQuality: '',
+    quantity: 0,
+    unqualifiedQuantity: 0,
+    unqualifiedProcess: undefined,
+    supplierName: '',
+    inspectorName: '',
+    inspectDate: '',
+    responsiblePerson: '',
+    responsibleDept: '',
+    
+    // 闂鎻忚堪鍜屽鐞�
+    problemDescription: '',
+    reasonAnalysis: '',
+    correctionAction: '',
+    disposalMethod: undefined,
+    repairEvaluation: '',
+    preventiveAction: '',
+    
+    // 鐘舵��
+    status: 0,
+    remark: '',
+    
+    // 闄勪欢
     defectivePhotos: '',
     tempFileIds: [],
-    dealResult: '',
-    dealName: '',
-    dealTime: '',
-    reasonAnalysis: '',
-    preventiveCorrective: '',
-    lossWorking: 0,
-    lossMaterial: 0,
   },
   rules: {
-    checkTime: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" },],
-    process: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
-    checkName: [{ required: true, message: "璇烽�夋嫨妫�楠屽憳", trigger: "change" }],
-    productId: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
-    model: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
-    unit: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
-    quantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
-    checkCompany: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
-    checkResult: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
-    dealName: [{ required: true, message: "璇烽�夋嫨澶勭悊浜�", trigger: "change" }],
+    projectName: [{ required: true, message: "璇疯緭鍏ラ」鐩悕绉�", trigger: "blur" }],
+    materialName: [{ required: true, message: "璇疯緭鍏ョ墿鏂�/閮ㄤ欢鍚嶇О", trigger: "blur" }],
+    quantity: [{ required: true, message: "璇疯緭鍏ユ暟閲�", trigger: "blur" }],
+    unqualifiedQuantity: [{ required: true, message: "璇疯緭鍏ヤ笉鍚堟牸鏁�", trigger: "blur" }],
+    inspectorName: [{ required: true, message: "璇烽�夋嫨妫�楠屽憳", trigger: "change" }],
+    inspectDate: [{ required: true, message: "璇烽�夋嫨妫�楠屾棩鏈�", trigger: "change" }],
+    problemDescription: [{ required: true, message: "璇疯緭鍏ラ棶棰樻弿杩�", trigger: "blur" }],
   },
 });
+
 const { form, rules } = toRefs(data);
-const productOptions = ref([]);
-const modelOptions = ref([]);
-const userList = ref([]); // 妫�楠屽憳/澶勭悊浜轰笅鎷夊垪琛�
+const userList = ref([]); // 妫�楠屽憳/璐d换浜轰笅鎷夊垪琛�
 
 // 鎵撳紑寮规
 const openDialog = async (type, row) => {
@@ -279,95 +373,57 @@
   if (operationType.value === 'add') {
     defectivePhotoFileList.value = [];
     form.value = {
-      checkName: userStore.nickName || '',
-      dealName: '',
-      dealTime: '',
-      dealResult: '',
-      defectivePhenomena: '',
+      projectName: '',
+      projectNo: '',
+      equipmentName: '',
+      equipmentDrawingNo: '',
+      materialName: '',
+      materialDrawingNo: '',
+      specificationModel: '',
+      materialQuality: '',
+      quantity: 0,
+      unqualifiedQuantity: 0,
+      unqualifiedProcess: undefined,
+      supplierName: '',
+      inspectorName: userStore.nickName || '',
+      inspectDate: '',
+      responsiblePerson: '',
+      responsibleDept: '',
+      problemDescription: '',
+      reasonAnalysis: '',
+      correctionAction: '',
+      disposalMethod: undefined,
+      repairEvaluation: '',
+      preventiveAction: '',
+      status: 0,
+      remark: '',
       defectivePhotos: '',
       tempFileIds: [],
-      inspectType: '',
-      checkTime: '',
-      productId: '',
-      model: '',
-      unit: '',
-      quantity: '',
-      productName: '',
-      reasonAnalysis: '',
-      preventiveCorrective: '',
-      lossWorking: 0,
-      lossMaterial: 0,
     };
   } else {
     defectivePhotoFileList.value = [];
     form.value = {};
   }
-  getProductOptions();
+  
   if (operationType.value === 'edit') {
     getQualityUnqualifiedInfo(row.id).then(res => {
-      const { inspectState, ...rest } = (res.data || {})
-      form.value = {
-        reasonAnalysis: '',
-        preventiveCorrective: '',
-        lossWorking: 0,
-        lossMaterial: 0,
-        ...rest
-      }
+      const data = res.data?.records?.[0] || res.data || {}
+      form.value = { ...data }
     })
   }
 }
-const getProductOptions = () => {
-  productTreeList().then((res) => {
-    productOptions.value = convertIdToValue(res);
-  });
-};
-const getModels = (value) => {
-  form.value.productName = findNodeById(productOptions.value, value);
-  modelList({ id: value }).then((res) => {
-    modelOptions.value = res;
-  })
-};
-const findNodeById = (nodes, productId) => {
-  for (let i = 0; i < nodes.length; i++) {
-    if (nodes[i].value === productId) {
-      return nodes[i].label; // 鎵惧埌鑺傜偣锛岃繑鍥炶鑺傜偣
-    }
-    if (nodes[i].children && nodes[i].children.length > 0) {
-      const foundNode = findNodeById(nodes[i].children, productId);
-      if (foundNode) {
-        return foundNode; // 鍦ㄥ瓙鑺傜偣涓壘鍒帮紝杩斿洖璇ヨ妭鐐�
-      }
-    }
-  }
-  return null; // 娌℃湁鎵惧埌鑺傜偣锛岃繑鍥瀗ull
-};
-function convertIdToValue(data) {
-  return data.map((item) => {
-    const { id, children, ...rest } = item;
-    const newItem = {
-      ...rest,
-      value: id, // 灏� id 鏀逛负 value
-    };
-    if (children && children.length > 0) {
-      newItem.children = convertIdToValue(children);
-    }
-    
-    return newItem;
-  });
-}
+
 // 鎻愪氦浜у搧琛ㄥ崟
 const submitForm = () => {
   proxy.$refs.formRef.validate(valid => {
     if (valid) {
-      // 鐘舵�佸瓧娈典笉鍦ㄨ〃鍗曞~鍐欙紝涔熶笉浼犵粰鍚庣
-      const { inspectState, ...payload } = (form.value || {})
       if (operationType.value === "add") {
-        qualityUnqualifiedAdd(payload).then(res => {
+        qualityUnqualifiedAdd(form.value).then(res => {
           proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
           closeDia();
         })
       } else {
-        qualityUnqualifiedUpdate(payload).then(res => {
+        qualityUnqualifiedUpdate(form.value).then(res => {
           proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
           closeDia();
         })
@@ -376,16 +432,18 @@
   })
 }
 
-// 涓婁紶鍓嶆牎妫�锛堝弬鑰冨崗鍚屽鎵归檮浠朵笂浼狅級
+// 涓婁紶鍓嶆牎妫�
 function handleBeforeUpload() {
   proxy.$modal.loading("姝e湪涓婁紶鏂囦欢锛岃绋嶅��...");
   return true;
 }
+
 function handleUploadError() {
   proxy.$modal.msgError("涓婁紶鏂囦欢澶辫触");
   proxy.$modal.closeLoading();
 }
-// 涓嶈壇鍝佺収鐗囦笂浼犳垚鍔燂細淇濆瓨 tempId 涓� tempPath锛屽苟鍥炲啓鍒拌〃鍗�
+
+// 涓嶈壇鍝佺収鐗囦笂浼犳垚鍔�
 function handleDefectivePhotoUploadSuccess(res, file) {
   proxy.$modal.closeLoading();
   if (res?.code === 200) {
@@ -396,76 +454,29 @@
     if (!form.value.tempFileIds) form.value.tempFileIds = [];
     if (tempId) form.value.tempFileIds.push(tempId);
 
-    // el-upload 鍒楄〃鍥炴樉闇�瑕� url/name
-    file.id = tempId || file.id;
+    file.url = tempPath;
     file.name = originalName;
-    file.url = tempPath ? (import.meta.env.VITE_APP_BASE_API + tempPath) : file.url;
-
-    // 浠モ�滆矾寰勫瓧绗︿覆鈥濆舰寮忎紶缁欐柊澧�/缂栬緫鎺ュ彛锛堝悗绔嫢鍙 tempFileIds 涔熶笉鍐茬獊锛�
-    syncDefectivePhotosFromFileList();
-    proxy.$modal.msgSuccess("涓婁紶鎴愬姛");
   } else {
     proxy.$modal.msgError(res?.msg || "涓婁紶澶辫触");
-    defectivePhotoUploadRef.value?.handleRemove(file);
   }
 }
 
-function handleDefectivePhotoRemove(file) {
-  // 鍚屾绉婚櫎 tempFileIds
-  const tempId = file?.id || file?.response?.data?.tempId;
-  if (tempId && Array.isArray(form.value.tempFileIds)) {
-    form.value.tempFileIds = form.value.tempFileIds.filter(id => id !== tempId);
+// 涓嶈壇鍝佺収鐗囩Щ闄�
+function handleDefectivePhotoRemove(file, fileList) {
+  const tempId = file?.response?.data?.tempId;
+  if (tempId && form.value.tempFileIds) {
+    const idx = form.value.tempFileIds.indexOf(tempId);
+    if (idx > -1) form.value.tempFileIds.splice(idx, 1);
   }
-  syncDefectivePhotosFromFileList();
+  defectivePhotoFileList.value = fileList;
 }
 
-function syncDefectivePhotosFromFileList() {
-  const base = import.meta.env.VITE_APP_BASE_API;
-  const paths = (defectivePhotoFileList.value || [])
-    .map(f => f?.url || f?.response?.data?.tempPath || f?.response?.data?.url)
-    .filter(Boolean)
-    .map(url => (typeof url === "string" ? url.replace(base, "") : ""))
-    .filter(Boolean);
-  form.value.defectivePhotos = paths.join(",");
-}
-
-// 缂栬緫/璇︽儏鏃讹紝鎶婂悗绔繑鍥炵殑 defectivePhotos 璺緞涓茶浆鎴� el-upload 鍙洖鏄剧殑 fileList
-watch(
-  () => form.value?.defectivePhotos,
-  val => {
-    if (!val) {
-      defectivePhotoFileList.value = [];
-      return;
-    }
-    const base = import.meta.env.VITE_APP_BASE_API;
-    const list = String(val)
-      .split(",")
-      .map((p, idx) => {
-        const path = p?.trim();
-        if (!path) return null;
-        return {
-          name: `鍥剧墖${idx + 1}`,
-          url: path.startsWith("http") ? path : base + path,
-          id: undefined,
-        };
-      })
-      .filter(Boolean);
-    defectivePhotoFileList.value = list;
-  },
-  { immediate: true }
-);
-// 鍏抽棴寮规
 const closeDia = () => {
-  defectivePhotoFileList.value = []
-  proxy.resetForm("formRef");
   dialogFormVisible.value = false;
   emit('close')
-};
+}
+
 defineExpose({
   openDialog,
-});
+})
 </script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/qualityManagement/nonconformingManagement/index.vue b/src/views/qualityManagement/nonconformingManagement/index.vue
index 132921a..97e2f6d 100644
--- a/src/views/qualityManagement/nonconformingManagement/index.vue
+++ b/src/views/qualityManagement/nonconformingManagement/index.vue
@@ -1,38 +1,40 @@
-// 涓嶅悎鏍肩鐞�
+// 涓嶅悎鏍煎搧澶勭悊鍗�
 <template>
   <div class="app-container">
     <div class="search_form">
       <div style="display: flex;flex-direction: row;align-items: center;">
         <div>
-          <span class="search_title">绫诲瀷锛�</span>
-          <el-select v-model="searchForm.inspectType" clearable style="width: 200px" @change="handleQuery">
-            <el-option label="鍘熸潗鏂欐楠�" :value="0" />
-            <el-option label="杩囩▼妫�楠�" :value="1" />
-            <el-option label="鍑哄巶妫�楠�" :value="2" />
-          </el-select>
-        </div>
-        <div style="margin-left: 10px">
           <span class="search_title">鐘舵�侊細</span>
-          <el-select v-model="searchForm.inspectState" clearable style="width: 200px" @change="handleQuery">
-            <el-option label="寰呭鐞�" :value="0" />
-            <el-option label="宸插鐞�" :value="1" />
+          <el-select v-model="searchForm.status" clearable style="width: 200px" @change="handleQuery">
+            <el-option label="鑽夌" :value="0" />
+            <el-option label="寰呭鏍�" :value="1" />
+            <el-option label="瀹℃壒涓�" :value="2" />
+            <el-option label="宸插畬鎴�" :value="3" />
+            <el-option label="宸查┏鍥�" :value="4" />
           </el-select>
         </div>
         <div style="margin-left: 10px">
-          <span class="search_title">浜у搧鍚嶇О锛�</span>
+          <span class="search_title">椤圭洰鍚嶇О锛�</span>
           <el-input
-              v-model="searchForm.productName"
+              v-model="searchForm.projectName"
               style="width: 200px"
-              placeholder="璇疯緭鍏ヤ骇鍝佸悕绉版悳绱�"
+              placeholder="璇疯緭鍏ラ」鐩悕绉版悳绱�"
               @change="handleQuery"
               clearable
               :prefix-icon="Search"
           />
         </div>
-        <span  style="margin-left: 10px" class="search_title">妫�娴嬫棩鏈燂細</span>
-        <el-date-picker  v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
-												 style="width: 300px"
-                         placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
+        <div style="margin-left: 10px">
+          <span class="search_title">澶勭悊鍗曞彿锛�</span>
+          <el-input
+              v-model="searchForm.orderNo"
+              style="width: 200px"
+              placeholder="璇疯緭鍏ュ鐞嗗崟鍙锋悳绱�"
+              @change="handleQuery"
+              clearable
+              :prefix-icon="Search"
+          />
+        </div>
         <el-button type="primary" @click="handleQuery" style="margin-left: 10px">鎼滅储</el-button>
       </div>
       <div>
@@ -55,9 +57,7 @@
       >
       </PIMTable>
     </div>
-    <DetailDia ref="detailDiaRef" />
     <FormDia ref="formDia" @close="handleQuery"></FormDia>
-    <InspectionFormDia ref="inspectionFormDia" @close="handleQuery"></InspectionFormDia>
   </div>
 </template>
 
@@ -67,136 +67,130 @@
 import FormDia from "@/views/qualityManagement/nonconformingManagement/components/formDia.vue";
 import {ElMessageBox} from "element-plus";
 import {qualityUnqualifiedDel, qualityUnqualifiedListPage} from "@/api/qualityManagement/nonconformingManagement.js";
-import InspectionFormDia from "@/views/qualityManagement/nonconformingManagement/components/inspectionFormDia.vue";
-import DetailDia from "@/views/qualityManagement/nonconformingManagement/components/detailDia.vue";
-import dayjs from "dayjs";
 
 const data = reactive({
   searchForm: {
-    inspectType: "",
-    inspectState: "",
-    productName: "",
-    entryDate: undefined, // 褰曞叆鏃ユ湡
-    entryDateStart: undefined,
-    entryDateEnd: undefined,
+    status: "",
+    projectName: "",
+    orderNo: "",
   },
 });
 const { searchForm } = toRefs(data);
 const tableColumn = ref([
   {
     label: "鐘舵��",
-    prop: "inspectState",
+    prop: "status",
     dataType: "tag",
+    width: 100,
     formatData: (params) => {
-      if (params == 0) {
-        return "寰呭鐞�";
-      } else if (params == 1) {
-        return "宸插鐞�";
-      } else {
-        return null;
-      }
+      const statusMap = {
+        0: "鑽夌",
+        1: "寰呭鏍�",
+        2: "瀹℃壒涓�",
+        3: "宸插畬鎴�",
+        4: "宸查┏鍥�"
+      };
+      return statusMap[params] || "-";
     },
     formatType: (params) => {
-      if (params == '涓嶅悎鏍�') {
-        return "danger";
-      } else if (params == '鍚堟牸') {
-        return "success";
-      } else {
-        return null;
-      }
+      const typeMap = {
+        0: "info",
+        1: "warning",
+        2: "primary",
+        3: "success",
+        4: "danger"
+      };
+      return typeMap[params] || "info";
     },
   },
   {
-    label: "妫�娴嬫棩鏈�",
-    prop: "checkTime",
+    label: "澶勭悊鍗曞彿",
+    prop: "orderNo",
+    width: 160
+  },
+  {
+    label: "椤圭洰鍚嶇О",
+    prop: "projectName",
+    width: 140
+  },
+  {
+    label: "椤圭洰缂栧彿",
+    prop: "projectNo",
+    width: 140
+  },
+  {
+    label: "璁惧鍚嶇О",
+    prop: "equipmentName",
+    width: 140
+  },
+  {
+    label: "鐗╂枡/閮ㄤ欢鍚嶇О",
+    prop: "materialName",
+    width: 160
+  },
+  {
+    label: "鍨嬪彿瑙勬牸",
+    prop: "specificationModel",
     width: 120
-  },
-  {
-    label: "绫诲埆",
-    prop: "inspectType",
-    dataType: "tag",
-    width: 120,
-    formatData: (params) => {
-      if (params == 0) {
-        return "鍘熸潗鏂欐楠�";
-      } else if (params == 1) {
-        return "杩囩▼妫�楠�";
-      } else {
-        return '鍑哄巶妫�楠�';
-      }
-    },
-    formatType: (params) => {
-      if (params == '涓嶅悎鏍�') {
-        return "info";
-      } else if (params == '鍚堟牸') {
-        return "success";
-      } else {
-        return 'primary';
-      }
-    },
-  },
-  {
-    label: "妫�楠屽憳",
-    prop: "checkName",
-  },
-  {
-    label: "浜у搧鍚嶇О",
-    prop: "productName",
-  },
-  {
-    label: "瑙勬牸鍨嬪彿",
-    prop: "model",
-  },
-  {
-    label: "鍗曚綅",
-    prop: "unit",
   },
   {
     label: "鏁伴噺",
     prop: "quantity",
+    width: 80
+  },
+  {
+    label: "涓嶅悎鏍兼暟",
+    prop: "unqualifiedQuantity",
+    width: 90
+  },
+  {
+    label: "涓嶅悎鏍煎伐搴�",
+    prop: "unqualifiedProcess",
+    width: 100,
+    formatData: (params) => {
+      const processMap = {
+        1: "鏉ユ枡",
+        2: "鍒剁▼",
+        3: "鎴愬搧"
+      };
+      return processMap[params] || "-";
+    },
+  },
+  {
+    label: "妫�楠屽憳",
+    prop: "inspectorName",
     width: 100
   },
   {
-    label: "涓嶅悎鏍肩幇璞�",
-    prop: "defectivePhenomena",
+    label: "妫�楠屾棩鏈�",
+    prop: "inspectDate",
     width: 120
   },
   {
-    label: "澶勭悊缁撴灉",
-    prop: "dealResult",
+    label: "璐d换浜�",
+    prop: "responsiblePerson",
+    width: 100
+  },
+  {
+    label: "璐d换閮ㄩ棬",
+    prop: "responsibleDept",
     width: 120
   },
   {
-    label: "澶勭悊浜�",
-    prop: "dealName",
-    width: 120
-  },
-  {
-    label: "澶勭悊鏃ユ湡",
-    prop: "dealTime",
-    width: 120
-  },
-  {
-    label: "鍘熷洜鍒嗘瀽",
-    prop: "reasonAnalysis",
-    slot: "reasonAnalysis",
-    width: 120
-  },
-  {
-    label: "棰勯槻涓庣籂姝f帾鏂�",
-    prop: "preventiveCorrective",
-    slot: "preventiveCorrective",
-    width: 120
-  },
-  {
-    label: "宸ユ椂鎹熷け",
-    prop: "lossWorking",
-    width: 140
-  },
-  {
-    label: "鏉愭枡璐规崯澶�",
-    prop: "lossMaterial",
-    width: 140
+    label: "澶勭疆鏂瑰紡",
+    prop: "disposalMethod",
+    width: 100,
+    formatData: (params) => {
+      const disposalMap = {
+        1: "璁╂鎺ユ敹",
+        2: "鍘傚唴缁翠慨",
+        3: "杩斿巶缁翠慨",
+        4: "鎹㈣揣",
+        5: "閫�璐�",
+        6: "鎶ュ簾"
+      };
+      return disposalMap[params] || "-";
+    },
   },
   {
     dataType: "action",
@@ -206,19 +200,18 @@
     width: 140,
     operation: [
       {
-        name: "璇︽儏",
+        name: "缂栬緫",
         type: "text",
         clickFun: (row) => {
-          openDetailDialog(row);
+          openForm("edit", row);
         },
       },
       {
-        name: "澶勭悊",
+        name: "鍒犻櫎",
         type: "text",
         clickFun: (row) => {
-          openInspectionForm("edit", row);
+          handleDeleteRow(row);
         },
-        disabled: (row) => row.inspectState === 1,
       },
     ],
   },
@@ -232,19 +225,8 @@
   total: 0
 });
 const formDia = ref()
-const inspectionFormDia = ref()
-const detailDiaRef = ref()
 const { proxy } = getCurrentInstance()
 
-const changeDaterange = (value) => {
-  searchForm.value.entryDateStart = undefined;
-  searchForm.value.entryDateEnd = undefined;
-  if (value) {
-    searchForm.value.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
-    searchForm.value.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
-  }
-  getList();
-};
 // 鏌ヨ鍒楄〃
 /** 鎼滅储鎸夐挳鎿嶄綔 */
 const handleQuery = () => {
@@ -259,7 +241,6 @@
 const getList = () => {
   tableLoading.value = true;
   const params = { ...searchForm.value, ...page };
-  params.entryDate = undefined
   qualityUnqualifiedListPage(params).then(res => {
     tableLoading.value = false;
     tableData.value = res.data.records
@@ -275,27 +256,27 @@
 
 // 鎵撳紑寮规
 const openForm = (type, row) => {
-  if (type !== 'add' && row?.inspectState === 1) {
-    proxy.$modal.msgWarning("宸插鐞嗙殑鏁版嵁涓嶈兘鍐嶇紪杈�");
-    return;
-  }
   nextTick(() => {
     formDia.value?.openDialog(type, row)
   })
 };
-// 鎵撳紑澶勭悊寮规
-const openInspectionForm = (type, row) => {
-  if (row?.inspectState === 1) {
-    proxy.$modal.msgWarning("宸插鐞嗙殑鏁版嵁涓嶈兘鍐嶅鐞�");
-    return;
-  }
-  nextTick(() => {
-    inspectionFormDia.value?.openDialog(type, row)
+
+// 鍒犻櫎鍗曡
+const handleDeleteRow = (row) => {
+  ElMessageBox.confirm("纭鍒犻櫎璇ヤ笉鍚堟牸鍝佸鐞嗗崟锛�", "鎻愮ず", {
+    confirmButtonText: "纭",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
   })
-};
-// 鎵撳紑璇︽儏寮规
-const openDetailDialog = (row) => {
-  detailDiaRef.value?.openDialog(row);
+      .then(() => {
+        qualityUnqualifiedDel([row.id]).then((res) => {
+          proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+          getList();
+        });
+      })
+      .catch(() => {
+        proxy.$modal.msg("宸插彇娑�");
+      });
 };
 
 // 鍒犻櫎
@@ -307,7 +288,7 @@
     proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
     return;
   }
-  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
+  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鎻愮ず", {
     confirmButtonText: "纭",
     cancelButtonText: "鍙栨秷",
     type: "warning",
@@ -330,7 +311,7 @@
     type: "warning",
   })
       .then(() => {
-        proxy.download("/quality/qualityUnqualified/export", {}, "涓嶅悎鏍肩鐞�.xlsx");
+        proxy.download("/qualityUnqualifiedOrder/export", {}, "涓嶅悎鏍煎搧澶勭悊鍗�.xlsx");
       })
       .catch(() => {
         proxy.$modal.msg("宸插彇娑�");

--
Gitblit v1.9.3