From 0a3cd80cb9e319e2bc5533a0d648dbb92ec2343e Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期一, 01 六月 2026 13:01:12 +0800
Subject: [PATCH] 新疆马铃薯 1.质量检验功能修改

---
 src/views/qualityManagement/processInspection/components/formDia.vue           |   68 +-
 src/views/qualityManagement/finalInspection/components/quickCheckDia.vue       |  327 ++++++++++++++
 src/views/qualityManagement/metricMaintenance/StandardFormDialog.vue           |   12 
 src/views/qualityManagement/processInspection/components/quickCheckDia.vue     |  327 ++++++++++++++
 src/views/qualityManagement/rawMaterialInspection/components/quickCheckDia.vue |  327 ++++++++++++++
 src/views/qualityManagement/finalInspection/components/formDia.vue             |   53 ++
 src/views/qualityManagement/rawMaterialInspection/components/formDia.vue       |   10 
 src/views/qualityManagement/metricMaintenance/index.vue                        |   12 
 src/views/qualityManagement/rawMaterialInspection/index.vue                    |   35 -
 src/views/qualityManagement/finalInspection/index.vue                          |   34 -
 src/views/qualityManagement/processInspection/index.vue                        |   55 --
 src/views/qualityManagement/metricBinding/index.vue                            |   14 
 12 files changed, 1,092 insertions(+), 182 deletions(-)

diff --git a/src/views/qualityManagement/finalInspection/components/formDia.vue b/src/views/qualityManagement/finalInspection/components/formDia.vue
index 458ab96..9fcb6b1 100644
--- a/src/views/qualityManagement/finalInspection/components/formDia.vue
+++ b/src/views/qualityManagement/finalInspection/components/formDia.vue
@@ -190,7 +190,7 @@
 import {userListNoPage} from "@/api/system/user.js";
 import {qualityInspectDetailByProductId, getQualityTestStandardParamByTestStandardId} from "@/api/qualityManagement/metricMaintenance.js";
 import {qualityInspectParamInfo} from "@/api/qualityManagement/qualityInspectParam.js";
-import {ledgerListNoPage} from "@/api/salesManagement/salesLedger.js";
+import {ledgerListNoPage, productList} from "@/api/salesManagement/salesLedger.js";
 const { proxy } = getCurrentInstance()
 const emit = defineEmits(['close'])
 
@@ -216,18 +216,18 @@
     salesContractNo: "",
   },
   rules: {
-    checkTime: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
-    process: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    checkTime: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
+    process: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
     checkName: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
     productId: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
     productModelId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
     testStandardId: [{ required: false, message: "璇烽�夋嫨鎸囨爣", trigger: "change" }],
     unit: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
-    quantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
-    qualifiedQuantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
-    unqualifiedQuantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    quantity: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
+    qualifiedQuantity: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
+    unqualifiedQuantity: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
     checkCompany: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
-    checkResult: [{ required: true, message: "璇疯緭鍏�", trigger: "change" }],
+    checkResult: [{ required: false, message: "璇疯緭鍏�", trigger: "change" }],
   },
 });
 const { form, rules } = toRefs(data);
@@ -296,6 +296,30 @@
   form.value = {}
   testStandardOptions.value = [];
   tableData.value = [];
+
+  // 鏂板妯″紡涓嬶紝榛樿璁剧疆浜у搧鍚嶇О涓�"椹搩钖洩鑺辩矇"(id=320)
+  if (operationType.value === 'add') {
+    const defaultProductId = 320;
+    form.value.productId = defaultProductId;
+    currentProductId.value = defaultProductId;
+    form.value.productName = '椹搩钖洩鑺辩矇';
+    // 鍔犺浇瑙勬牸鍨嬪彿鍒楄〃
+    try {
+      const modelRes = await modelList({ id: defaultProductId });
+      modelOptions.value = modelRes || [];
+      // 榛樿閫変腑绗竴涓鏍煎瀷鍙�
+      if (modelOptions.value.length > 0) {
+        const firstModel = modelOptions.value[0];
+        form.value.productModelId = firstModel.id;
+        form.value.model = firstModel.model || '';
+        form.value.unit = firstModel.unit || '';
+      }
+      // 鍔犺浇鎸囨爣閫夐」
+      getList();
+    } catch (e) {
+      console.error('鍔犺浇榛樿浜у搧瑙勬牸鍨嬪彿澶辫触', e);
+    }
+  }
 
   if (operationType.value === 'edit' || operationType.value === 'view') {
     // 鍏堜繚瀛� testStandardId锛岄伩鍏嶈娓呯┖
@@ -387,12 +411,25 @@
 }
 
 // 閿�鍞鍗曢�夋嫨鍙樺寲澶勭悊
-const handleSalesLedgerChange = (value) => {
+const handleSalesLedgerChange = async (value) => {
   const selectedItem = salesLedgerOptions.value.find(item => item.id == value);
   if (selectedItem) {
     form.value.salesContractNo = selectedItem.salesContractNo || '';
+    // 鏍规嵁閿�鍞鍗旾D鏌ヨ浜у搧淇℃伅锛屽彧璧嬪�兼暟閲�
+    try {
+      const res = await productList({ salesLedgerId: value, type: 1 });
+      const productData = res.data && res.data.length > 0 ? res.data[0] : null;
+      if (productData) {
+        // 鍙嚜鍔ㄥ甫鍏ユ暟閲�
+        form.value.quantity = productData.quantity || 0;
+      }
+    } catch (e) {
+      console.error('鏌ヨ閿�鍞鍗曚骇鍝佷俊鎭け璐�', e);
+      proxy.$modal.msgError('鏌ヨ閿�鍞鍗曚骇鍝佷俊鎭け璐�');
+    }
   } else {
     form.value.salesContractNo = '';
+    form.value.quantity = undefined;
   }
 }
 
diff --git a/src/views/qualityManagement/finalInspection/components/quickCheckDia.vue b/src/views/qualityManagement/finalInspection/components/quickCheckDia.vue
new file mode 100644
index 0000000..cf78973
--- /dev/null
+++ b/src/views/qualityManagement/finalInspection/components/quickCheckDia.vue
@@ -0,0 +1,327 @@
+<template>
+  <div>
+    <el-dialog
+      v-model="dialogVisible"
+      title="蹇�熸楠�"
+      width="70%"
+      @close="closeDialog"
+    >
+      <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="checkResult">
+              <el-select v-model="form.checkResult" placeholder="璇烽�夋嫨妫�娴嬬粨鏋�" style="width: 100%" @change="handleCheckResultChange">
+                <el-option label="鍚堟牸" value="鍚堟牸" />
+                <el-option label="涓嶅悎鏍�" value="涓嶅悎鏍�" />
+                <el-option label="閮ㄥ垎鍚堟牸" value="閮ㄥ垎鍚堟牸" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鎸囨爣閫夋嫨锛�" prop="testStandardId">
+              <el-select v-model="form.testStandardId" placeholder="璇烽�夋嫨鎸囨爣" style="width: 100%" @change="handleTestStandardChange">
+                <el-option
+                  v-for="item in testStandardOptions"
+                  :key="item.id"
+                  :label="item.standardName || item.standardNo"
+                  :value="item.id"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <template v-if="form.checkResult">
+          <el-row :gutter="30">
+            <el-col :span="12">
+              <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" @change="handleQuantityChange"/>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="妫�娴嬪崟浣嶏細" prop="checkCompany">
+                <el-input v-model="form.checkCompany" placeholder="璇疯緭鍏ユ娴嬪崟浣�" clearable/>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row :gutter="30">
+            <el-col :span="12">
+              <el-form-item label="鍚堟牸鏁伴噺锛�" prop="qualifiedQuantity">
+                <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.qualifiedQuantity" placeholder="璇疯緭鍏ュ悎鏍兼暟閲�" clearable :precision="2" @change="handleQualifiedQuantityChange"/>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="涓嶅悎鏍兼暟閲忥細" prop="unqualifiedQuantity">
+                <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.unqualifiedQuantity" placeholder="璇疯緭鍏ヤ笉鍚堟牸鏁伴噺" clearable :precision="2" @change="handleUnqualifiedQuantityChange"/>
+              </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-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-date-picker
+                  v-model="form.checkTime"
+                  type="date"
+                  placeholder="璇烽�夋嫨妫�娴嬫棩鏈�"
+                  value-format="YYYY-MM-DD"
+                  format="YYYY-MM-DD"
+                  clearable
+                  style="width: 100%"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </template>
+      </el-form>
+      <PIMTable
+        rowKey="id"
+        :column="tableColumn"
+        :tableData="tableData"
+        :tableLoading="tableLoading"
+        height="400"
+      >
+        <template #slot="{ row }">
+          <el-input v-model="row.testValue" clearable/>
+        </template>
+      </PIMTable>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitForm">纭</el-button>
+          <el-button @click="closeDialog">鍙栨秷</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+import { ref, reactive, toRefs, getCurrentInstance, nextTick } from "vue";
+import { userListNoPage } from "@/api/system/user.js";
+import { batchQuickInspect } from "@/api/qualityManagement/rawMaterialInspection.js";
+import { qualityInspectDetailByProductId, getQualityTestStandardParamByTestStandardId } from "@/api/qualityManagement/metricMaintenance.js";
+
+const { proxy } = getCurrentInstance();
+const emit = defineEmits(['close', 'success']);
+
+const dialogVisible = ref(false);
+const userList = ref([]);
+const selectedIds = ref([]);
+const selectedRows = ref([]);
+const testStandardOptions = ref([]);
+const inspectType = ref(2); // 鍑哄巶妫�楠岀被鍨�
+
+const data = reactive({
+  form: {
+    checkResult: '',
+    testStandardId: '',
+    quantity: undefined,
+    qualifiedQuantity: undefined,
+    unqualifiedQuantity: undefined,
+    checkCompany: '',
+    checkName: '',
+    checkTime: '',
+  },
+  rules: {
+    checkResult: [{ required: true, message: "璇烽�夋嫨妫�娴嬬粨鏋�", trigger: "change" }],
+    testStandardId: [{ required: true, message: "璇烽�夋嫨鎸囨爣", trigger: "change" }],
+    quantity: [{ required: true, message: "璇疯緭鍏ユ暟閲�", trigger: "blur" }],
+    qualifiedQuantity: [{ required: true, message: "璇疯緭鍏ュ悎鏍兼暟閲�", trigger: "blur" }],
+    unqualifiedQuantity: [{ required: true, message: "璇疯緭鍏ヤ笉鍚堟牸鏁伴噺", trigger: "blur" }],
+    checkCompany: [{ required: true, message: "璇疯緭鍏ユ娴嬪崟浣�", trigger: "blur" }],
+    checkName: [{ required: true, message: "璇烽�夋嫨妫�楠屽憳", trigger: "change" }],
+    checkTime: [{ required: true, message: "璇烽�夋嫨妫�娴嬫棩鏈�", trigger: "change" }],
+  },
+});
+const { form, rules } = toRefs(data);
+
+const tableColumn = ref([
+  {
+    label: "鎸囨爣",
+    prop: "parameterItem",
+  },
+  {
+    label: "鍗曚綅",
+    prop: "unit",
+  },
+  {
+    label: "鏍囧噯鍊�",
+    prop: "standardValue",
+  },
+  {
+    label: "鍐呮帶鍊�",
+    prop: "controlValue",
+  },
+  {
+    label: "妫�楠屽��",
+    prop: "testValue",
+    dataType: 'slot',
+    slot: 'slot',
+  },
+]);
+const tableData = ref([]);
+const tableLoading = ref(false);
+
+// 鎵撳紑寮规
+const openDialog = async (ids, rows) => {
+  selectedIds.value = ids;
+  selectedRows.value = rows;
+  dialogVisible.value = true;
+  
+  // 鍔犺浇鐢ㄦ埛鍒楄〃
+  const userListsRes = await userListNoPage();
+  userList.value = userListsRes.data;
+  
+  // 鍔犺浇鎸囨爣閫夐」锛堟牴鎹涓�涓�変腑琛岀殑浜у搧ID锛�
+  if (rows && rows.length > 0 && rows[0].productId) {
+    const params = {
+      productId: rows[0].productId,
+      inspectType: 2
+    };
+    const res = await qualityInspectDetailByProductId(params);
+    testStandardOptions.value = res.data || [];
+  } else {
+    testStandardOptions.value = [];
+  }
+  
+  // 閲嶇疆琛ㄥ崟
+  form.value = {
+    checkResult: '',
+    testStandardId: '',
+    quantity: undefined,
+    qualifiedQuantity: undefined,
+    unqualifiedQuantity: undefined,
+    checkCompany: '',
+    checkName: '',
+    checkTime: '',
+  };
+  tableData.value = [];
+  
+  await nextTick();
+  proxy.$refs.formRef?.clearValidate();
+};
+
+// 鎸囨爣閫夋嫨鍙樺寲澶勭悊
+const handleTestStandardChange = async (testStandardId) => {
+  if (!testStandardId) {
+    tableData.value = [];
+    return;
+  }
+  tableLoading.value = true;
+  try {
+    const res = await getQualityTestStandardParamByTestStandardId(testStandardId);
+    tableData.value = (res.data || []).map(item => ({
+      ...item,
+      id: null,
+      testValue: ''
+    }));
+  } catch (error) {
+    console.error('鑾峰彇鏍囧噯鍙傛暟澶辫触:', error);
+    tableData.value = [];
+  } finally {
+    tableLoading.value = false;
+  }
+};
+
+// 妫�娴嬬粨鏋滃彉鍖栧鐞�
+const handleCheckResultChange = (value) => {
+  if (value === '鍚堟牸') {
+    // 鍚堟牸鏃讹紝鍚堟牸鏁伴噺绛変簬鏁伴噺锛屼笉鍚堟牸鏁伴噺涓�0
+    form.value.qualifiedQuantity = form.value.quantity || 0;
+    form.value.unqualifiedQuantity = 0;
+  } else if (value === '涓嶅悎鏍�') {
+    // 涓嶅悎鏍兼椂锛屽悎鏍兼暟閲忎负0锛屼笉鍚堟牸鏁伴噺绛変簬鏁伴噺
+    form.value.qualifiedQuantity = 0;
+    form.value.unqualifiedQuantity = form.value.quantity || 0;
+  }
+};
+
+// 鏁伴噺鍙樺寲澶勭悊
+const handleQuantityChange = (value) => {
+  if (form.value.checkResult === '鍚堟牸') {
+    form.value.qualifiedQuantity = value || 0;
+    form.value.unqualifiedQuantity = 0;
+  } else if (form.value.checkResult === '涓嶅悎鏍�') {
+    form.value.qualifiedQuantity = 0;
+    form.value.unqualifiedQuantity = value || 0;
+  }
+};
+
+// 鍚堟牸鏁伴噺鍙樺寲澶勭悊
+const handleQualifiedQuantityChange = (value) => {
+  const quantity = form.value.quantity || 0;
+  if (value > quantity) {
+    proxy.$modal.msgWarning("鍚堟牸鏁伴噺涓嶈兘澶т簬鎬绘暟閲�");
+    form.value.qualifiedQuantity = quantity;
+    form.value.unqualifiedQuantity = 0;
+  } else {
+    form.value.unqualifiedQuantity = Number((quantity - value).toFixed(2));
+  }
+  updateCheckResult();
+};
+
+// 涓嶅悎鏍兼暟閲忓彉鍖栧鐞�
+const handleUnqualifiedQuantityChange = (value) => {
+  const quantity = form.value.quantity || 0;
+  if (value > quantity) {
+    proxy.$modal.msgWarning("涓嶅悎鏍兼暟閲忎笉鑳藉ぇ浜庢�绘暟閲�");
+    form.value.unqualifiedQuantity = quantity;
+    form.value.qualifiedQuantity = 0;
+  } else {
+    form.value.qualifiedQuantity = Number((quantity - value).toFixed(2));
+  }
+  updateCheckResult();
+};
+
+// 鏍规嵁鍚堟牸/涓嶅悎鏍兼暟閲忔洿鏂版娴嬬粨鏋�
+const updateCheckResult = () => {
+  const qualified = form.value.qualifiedQuantity || 0;
+  const unqualified = form.value.unqualifiedQuantity || 0;
+  const quantity = form.value.quantity || 0;
+  
+  if (qualified === quantity && unqualified === 0) {
+    form.value.checkResult = '鍚堟牸';
+  } else if (unqualified === quantity && qualified === 0) {
+    form.value.checkResult = '涓嶅悎鏍�';
+  } else if (qualified > 0 && unqualified > 0) {
+    form.value.checkResult = '閮ㄥ垎鍚堟牸';
+  }
+};
+
+// 鎻愪氦琛ㄥ崟
+const submitForm = () => {
+  proxy.$refs.formRef.validate((valid) => {
+    if (valid) {
+      const data = {
+        ids: selectedIds.value,
+        inspectType: inspectType.value,
+        ...form.value,
+        paramList: tableData.value
+      };
+      batchQuickInspect(data).then(res => {
+        proxy.$modal.msgSuccess(res.msg || "蹇�熸楠屽畬鎴�");
+        emit('success');
+        closeDialog();
+      });
+    }
+  });
+};
+
+// 鍏抽棴寮规
+const closeDialog = () => {
+  dialogVisible.value = false;
+  emit('close');
+};
+
+defineExpose({
+  openDialog,
+});
+</script>
+
+<style scoped>
+</style>
diff --git a/src/views/qualityManagement/finalInspection/index.vue b/src/views/qualityManagement/finalInspection/index.vue
index 81d5595..88ba755 100644
--- a/src/views/qualityManagement/finalInspection/index.vue
+++ b/src/views/qualityManagement/finalInspection/index.vue
@@ -69,6 +69,9 @@
              @close="handleQuery"></FormDia>
     <files-dia ref="filesDia"
                @close="handleQuery"></files-dia>
+    <QuickCheckDia ref="quickCheckDia"
+                   @close="handleQuery"
+                   @success="getList"></QuickCheckDia>
     <el-dialog v-model="dialogFormVisible"
                title="缂栬緫妫�楠屽憳"
                width="30%"
@@ -115,6 +118,7 @@
   } from "vue";
   import InspectionFormDia from "@/views/qualityManagement/finalInspection/components/inspectionFormDia.vue";
   import FormDia from "@/views/qualityManagement/finalInspection/components/formDia.vue";
+  import QuickCheckDia from "@/views/qualityManagement/finalInspection/components/quickCheckDia.vue";
   import { ElMessageBox } from "element-plus";
   import {
     downloadQualityInspect,
@@ -122,7 +126,6 @@
     qualityInspectListPage,
     qualityInspectUpdate,
     submitQualityInspect,
-    batchQuickInspect,
   } from "@/api/qualityManagement/rawMaterialInspection.js";
   import FilesDia from "@/views/qualityManagement/finalInspection/components/filesDia.vue";
   import dayjs from "dayjs";
@@ -322,6 +325,7 @@
   const formDia = ref();
   const filesDia = ref();
   const inspectionFormDia = ref();
+  const quickCheckDia = ref();
   const { proxy } = getCurrentInstance();
   const userStore = useUserStore();
   const userList = ref([]);
@@ -402,32 +406,8 @@
       return;
     }
 
-    const totalCount = selectedRows.value.length;
-    const submittedCount = totalCount - unSubmittedRows.length;
-
-    let confirmMessage = `宸查�夋嫨 ${totalCount} 鏉℃楠屽崟`;
-    if (submittedCount > 0) {
-      confirmMessage += `锛堝叾涓� ${submittedCount} 鏉″凡鎻愪氦锛屽皢鑷姩璺宠繃锛塦;
-    }
-    confirmMessage += `\n\n纭鍚庡皢鑷姩锛歕n路 妫�楠岀粨鏋滆涓�"鍚堟牸"\n路 鍚堟牸鏁伴噺璁句负鎬绘暟\n路 涓嶅悎鏍兼暟閲忚涓� 0\n路 鎻愪氦骞跺叆搴揱;
-
-    ElMessageBox.confirm(confirmMessage, "蹇�熸楠�", {
-      confirmButtonText: "纭",
-      cancelButtonText: "鍙栨秷",
-      type: "warning",
-      dangerouslyUseHTMLString: false,
-    })
-      .then(() => {
-        // 璋冪敤鎵归噺蹇�熸楠屾帴鍙�
-        const ids = unSubmittedRows.map(item => item.id);
-        batchQuickInspect(ids).then(res => {
-          proxy.$modal.msgSuccess(res.msg || "蹇�熸楠屽畬鎴�");
-          getList();
-        });
-      })
-      .catch(() => {
-        proxy.$modal.msg("宸插彇娑�");
-      });
+    const ids = unSubmittedRows.map(item => item.id);
+    quickCheckDia.value?.openDialog(ids, unSubmittedRows);
   };
 
   // 鎵撳紑鏂板妫�楠屽脊妗�
diff --git a/src/views/qualityManagement/metricBinding/index.vue b/src/views/qualityManagement/metricBinding/index.vue
index 1ac268a..5d115d6 100644
--- a/src/views/qualityManagement/metricBinding/index.vue
+++ b/src/views/qualityManagement/metricBinding/index.vue
@@ -141,8 +141,8 @@
       </el-form>
       <template #footer>
         <span class="dialog-footer">
-          <el-button @click="closeBindingDialog">鍙栨秷</el-button>
           <el-button type="primary" @click="submitBinding">纭畾</el-button>
+          <el-button @click="closeBindingDialog">鍙栨秷</el-button>
         </span>
       </template>
     </el-dialog>
@@ -215,18 +215,6 @@
     formatData: (val) => {
       const map = { 0: '鍘熸潗鏂欐楠�', 1: '杩囩▼妫�楠�', 2: '鍑哄巶妫�楠�' }
       return map[val] || val
-    }
-  },
-  {
-    label: '宸ュ簭',
-    prop: 'processId',
-    align: 'center',
-    dataType: 'tag',
-    formatData: (val) => {
-      const target = processOptions.value.find(
-        (item) => String(item.value) === String(val)
-      )
-      return target?.label || val
     }
   },
   {
diff --git a/src/views/qualityManagement/metricMaintenance/StandardFormDialog.vue b/src/views/qualityManagement/metricMaintenance/StandardFormDialog.vue
index 38d535a..381dac4 100644
--- a/src/views/qualityManagement/metricMaintenance/StandardFormDialog.vue
+++ b/src/views/qualityManagement/metricMaintenance/StandardFormDialog.vue
@@ -27,16 +27,6 @@
           <el-option label="鍑哄巶妫�楠�" value="2" />
         </el-select>
       </el-form-item>
-      <el-form-item label="宸ュ簭" prop="processId">
-        <el-select v-model="form.processId" placeholder="璇烽�夋嫨宸ュ簭" style="width: 100%">
-          <el-option
-            v-for="item in processOptions"
-            :key="item.value"
-            :label="item.label"
-            :value="item.value"
-          />
-        </el-select>
-      </el-form-item>
       <el-form-item label="鐘舵��" prop="state">
         <el-select v-model="form.state" placeholder="璇烽�夋嫨鐘舵��" style="width: 100%">
           <el-option label="鑽夌" value="0" />
@@ -96,7 +86,7 @@
 
 const formRef = ref(null)
 
-const computedTitle = computed(() => {
+  const computedTitle = computed(() => {
   if (props.operationType === 'edit') return '缂栬緫妫�娴嬫爣鍑�'
   if (props.operationType === 'copy') return '澶嶅埗妫�娴嬫爣鍑�'
   return '鏂板妫�娴嬫爣鍑�'
diff --git a/src/views/qualityManagement/metricMaintenance/index.vue b/src/views/qualityManagement/metricMaintenance/index.vue
index deb3e5f..8d1dd1c 100644
--- a/src/views/qualityManagement/metricMaintenance/index.vue
+++ b/src/views/qualityManagement/metricMaintenance/index.vue
@@ -310,18 +310,6 @@
     }
   },
   {
-    label: '宸ュ簭',
-    prop: 'processId',
-    align: 'center',
-    dataType: 'tag',
-    formatData: (val) => {
-      const target = processOptions.value.find(
-        (item) => String(item.value) === String(val)
-      )
-      return target?.label || val
-    }
-  },
-  {
     label: '鐘舵��',
     prop: 'state',
     headerSlot: 'stateHeader',
diff --git a/src/views/qualityManagement/processInspection/components/formDia.vue b/src/views/qualityManagement/processInspection/components/formDia.vue
index 635360f..f34c963 100644
--- a/src/views/qualityManagement/processInspection/components/formDia.vue
+++ b/src/views/qualityManagement/processInspection/components/formDia.vue
@@ -11,17 +11,18 @@
                ref="formRef">
         <el-row :gutter="30">
           <el-col :span="12">
-            <el-form-item label="宸ュ簭锛�"
-                          prop="process">
-              <el-select v-model="form.process"
-                         placeholder="璇烽�夋嫨宸ュ簭"
+            <el-form-item label="閲囪喘鍚堝悓鍙凤細"
+                          prop="purchaseContractNo">
+              <el-select v-model="form.purchaseContractNo"
+                         placeholder="璇烽�夋嫨"
                          clearable
-                         :disabled="isViewMode || processQuantityDisabled"
+                         filterable
+                         :disabled="isViewMode"
                          style="width: 100%">
-                <el-option v-for="item in processList"
-                           :key="item.name"
-                           :label="item.name"
-                           :value="item.name" />
+                <el-option v-for="item in purchaseContractList"
+                           :key="item.id"
+                           :label="item.purchaseContractNo"
+                           :value="item.purchaseContractNo" />
               </el-select>
             </el-form-item>
           </el-col>
@@ -216,7 +217,7 @@
     getCurrentInstance,
     nextTick,
   } from "vue";
-  import { getOptions } from "@/api/procurementManagement/procurementLedger.js";
+  import { getOptions, getSalesNo } from "@/api/procurementManagement/procurementLedger.js";
   import { modelList, productTreeList } from "@/api/basicData/product.js";
   import {
     qualityInspectAdd,
@@ -228,7 +229,7 @@
   } from "@/api/qualityManagement/metricMaintenance.js";
   import { userListNoPage } from "@/api/system/user.js";
   import { qualityInspectParamInfo } from "@/api/qualityManagement/qualityInspectParam.js";
-  import { list } from "@/api/productionManagement/productionProcess";
+
   import qualified from "@/views/inventoryManagement/stockManagement/Qualified.vue";
   const { proxy } = getCurrentInstance();
   const emit = defineEmits(["close"]);
@@ -238,7 +239,6 @@
   const data = reactive({
     form: {
       checkTime: "",
-      process: "",
       checkName: "",
       productName: "",
       productId: "",
@@ -251,20 +251,21 @@
       unqualifiedQuantity: "",
       checkCompany: "",
       checkResult: "",
+      purchaseContractNo: "",
     },
     rules: {
-      checkTime: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
-      process: [{ required: true, message: "璇烽�夋嫨宸ュ簭", trigger: "change" }],
+      checkTime: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
       checkName: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
       productId: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
       productModelId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
       testStandardId: [{ required: false, message: "璇烽�夋嫨鎸囨爣", trigger: "change" }],
       unit: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
-      quantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
-      qualifiedQuantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
-      unqualifiedQuantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+      quantity: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
+      qualifiedQuantity: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
+      unqualifiedQuantity: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
       checkCompany: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
-      checkResult: [{ required: true, message: "璇疯緭鍏�", trigger: "change" }],
+      purchaseContractNo: [{ required: false, message: "璇烽�夋嫨", trigger: "change" }],
+      checkResult: [{ required: false, message: "璇疯緭鍏�", trigger: "change" }],
     },
   });
   const userList = ref([]);
@@ -276,9 +277,10 @@
     const v = form.value || {};
     return !!(v.productMainId != null || v.purchaseLedgerId != null);
   });
-  const processList = ref([]); // 宸ュ簭涓嬫媺鍒楄〃锛堝伐搴忓悕绉� name锛�
+
   const supplierList = ref([]);
   const productOptions = ref([]);
+  const purchaseContractList = ref([]); // 閲囪喘鍚堝悓鍙峰垪琛�
   const tableColumn = ref([
     {
       label: "鎸囨爣",
@@ -315,20 +317,19 @@
     getOptions().then(res => {
       supplierList.value = res.data;
     });
-    // 鍔犺浇宸ュ簭涓嬫媺鍒楄〃
-    try {
-      const res = await list({ size: -1, current: -1 });
-      processList.value = res.data.records || [];
-    } catch (e) {
-      console.error("鍔犺浇宸ュ簭鍒楄〃澶辫触", e);
-      processList.value = [];
-    }
     let userLists = await userListNoPage();
     userList.value = userLists.data;
-    // 鍏堥噸缃〃鍗曟暟鎹紙淇濇寔瀛楁瀹屾暣锛岄伩鍏嶅脊绐楅娆℃覆鏌撴椂瑙﹀彂蹇呭~绾㈡鈥滈棯涓�涓嬧�濓級
+    // 鍔犺浇閲囪喘鍚堝悓鍙峰垪琛�
+    try {
+      const contractRes = await getSalesNo();
+      purchaseContractList.value = contractRes || [];
+    } catch (e) {
+      console.error("鍔犺浇閲囪喘鍚堝悓鍙峰け璐�", e);
+      purchaseContractList.value = [];
+    }
+    // 鍏堥噸缃〃鍗曟暟鎹紙淇濇寔瀛楁瀹屾暣锛岄伩鍏嶅脊绐楅娆℃覆鏌撴椂瑙﹀彂蹇呭~绾㈡"闂竴涓�"锛�
     form.value = {
       checkTime: "",
-      process: "",
       checkName: "",
       productName: "",
       productId: "",
@@ -339,6 +340,7 @@
       quantity: "",
       checkCompany: "",
       checkResult: "",
+      purchaseContractNo: "",
     };
     testStandardOptions.value = [];
     tableData.value = [];
@@ -370,7 +372,6 @@
         let params = {
           productId: currentProductId.value,
           inspectType: 1,
-          process: form.value.process || "",
         };
         qualityInspectDetailByProductId(params).then(res => {
           testStandardOptions.value = res.data || [];
@@ -518,9 +519,16 @@
           return;
         }
 
+        // 鏍规嵁閲囪喘鍚堝悓鍙锋煡鎵惧搴旂殑 purchaseLedgerId
+        const selectedContract = purchaseContractList.value.find(
+          item => item.purchaseContractNo === form.value.purchaseContractNo
+        );
+        const purchaseLedgerId = selectedContract ? selectedContract.id : null;
+
         const data = {
           ...form.value,
           process: processName, // 淇濈暀 process 瀛楁浠ュ吋瀹瑰悗绔�
+          purchaseLedgerId: purchaseLedgerId, // 鎻愪氦 purchaseLedgerId
           qualityInspectParams: tableData.value,
         };
         if (operationType.value === "add") {
diff --git a/src/views/qualityManagement/processInspection/components/quickCheckDia.vue b/src/views/qualityManagement/processInspection/components/quickCheckDia.vue
new file mode 100644
index 0000000..0aa069b
--- /dev/null
+++ b/src/views/qualityManagement/processInspection/components/quickCheckDia.vue
@@ -0,0 +1,327 @@
+<template>
+  <div>
+    <el-dialog
+      v-model="dialogVisible"
+      title="蹇�熸楠�"
+      width="70%"
+      @close="closeDialog"
+    >
+      <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="checkResult">
+              <el-select v-model="form.checkResult" placeholder="璇烽�夋嫨妫�娴嬬粨鏋�" style="width: 100%" @change="handleCheckResultChange">
+                <el-option label="鍚堟牸" value="鍚堟牸" />
+                <el-option label="涓嶅悎鏍�" value="涓嶅悎鏍�" />
+                <el-option label="閮ㄥ垎鍚堟牸" value="閮ㄥ垎鍚堟牸" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鎸囨爣閫夋嫨锛�" prop="testStandardId">
+              <el-select v-model="form.testStandardId" placeholder="璇烽�夋嫨鎸囨爣" style="width: 100%" @change="handleTestStandardChange">
+                <el-option
+                  v-for="item in testStandardOptions"
+                  :key="item.id"
+                  :label="item.standardName || item.standardNo"
+                  :value="item.id"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <template v-if="form.checkResult">
+          <el-row :gutter="30">
+            <el-col :span="12">
+              <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" @change="handleQuantityChange"/>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="妫�娴嬪崟浣嶏細" prop="checkCompany">
+                <el-input v-model="form.checkCompany" placeholder="璇疯緭鍏ユ娴嬪崟浣�" clearable/>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row :gutter="30">
+            <el-col :span="12">
+              <el-form-item label="鍚堟牸鏁伴噺锛�" prop="qualifiedQuantity">
+                <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.qualifiedQuantity" placeholder="璇疯緭鍏ュ悎鏍兼暟閲�" clearable :precision="2" @change="handleQualifiedQuantityChange"/>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="涓嶅悎鏍兼暟閲忥細" prop="unqualifiedQuantity">
+                <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.unqualifiedQuantity" placeholder="璇疯緭鍏ヤ笉鍚堟牸鏁伴噺" clearable :precision="2" @change="handleUnqualifiedQuantityChange"/>
+              </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-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-date-picker
+                  v-model="form.checkTime"
+                  type="date"
+                  placeholder="璇烽�夋嫨妫�娴嬫棩鏈�"
+                  value-format="YYYY-MM-DD"
+                  format="YYYY-MM-DD"
+                  clearable
+                  style="width: 100%"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </template>
+      </el-form>
+      <PIMTable
+        rowKey="id"
+        :column="tableColumn"
+        :tableData="tableData"
+        :tableLoading="tableLoading"
+        height="400"
+      >
+        <template #slot="{ row }">
+          <el-input v-model="row.testValue" clearable/>
+        </template>
+      </PIMTable>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitForm">纭</el-button>
+          <el-button @click="closeDialog">鍙栨秷</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+import { ref, reactive, toRefs, getCurrentInstance, nextTick } from "vue";
+import { userListNoPage } from "@/api/system/user.js";
+import { batchQuickInspect } from "@/api/qualityManagement/rawMaterialInspection.js";
+import { qualityInspectDetailByProductId, getQualityTestStandardParamByTestStandardId } from "@/api/qualityManagement/metricMaintenance.js";
+
+const { proxy } = getCurrentInstance();
+const emit = defineEmits(['close', 'success']);
+
+const dialogVisible = ref(false);
+const userList = ref([]);
+const selectedIds = ref([]);
+const selectedRows = ref([]);
+const testStandardOptions = ref([]);
+const inspectType = ref(1); // 杩囩▼妫�楠岀被鍨�
+
+const data = reactive({
+  form: {
+    checkResult: '',
+    testStandardId: '',
+    quantity: undefined,
+    qualifiedQuantity: undefined,
+    unqualifiedQuantity: undefined,
+    checkCompany: '',
+    checkName: '',
+    checkTime: '',
+  },
+  rules: {
+    checkResult: [{ required: true, message: "璇烽�夋嫨妫�娴嬬粨鏋�", trigger: "change" }],
+    testStandardId: [{ required: true, message: "璇烽�夋嫨鎸囨爣", trigger: "change" }],
+    quantity: [{ required: true, message: "璇疯緭鍏ユ暟閲�", trigger: "blur" }],
+    qualifiedQuantity: [{ required: true, message: "璇疯緭鍏ュ悎鏍兼暟閲�", trigger: "blur" }],
+    unqualifiedQuantity: [{ required: true, message: "璇疯緭鍏ヤ笉鍚堟牸鏁伴噺", trigger: "blur" }],
+    checkCompany: [{ required: true, message: "璇疯緭鍏ユ娴嬪崟浣�", trigger: "blur" }],
+    checkName: [{ required: true, message: "璇烽�夋嫨妫�楠屽憳", trigger: "change" }],
+    checkTime: [{ required: true, message: "璇烽�夋嫨妫�娴嬫棩鏈�", trigger: "change" }],
+  },
+});
+const { form, rules } = toRefs(data);
+
+const tableColumn = ref([
+  {
+    label: "鎸囨爣",
+    prop: "parameterItem",
+  },
+  {
+    label: "鍗曚綅",
+    prop: "unit",
+  },
+  {
+    label: "鏍囧噯鍊�",
+    prop: "standardValue",
+  },
+  {
+    label: "鍐呮帶鍊�",
+    prop: "controlValue",
+  },
+  {
+    label: "妫�楠屽��",
+    prop: "testValue",
+    dataType: 'slot',
+    slot: 'slot',
+  },
+]);
+const tableData = ref([]);
+const tableLoading = ref(false);
+
+// 鎵撳紑寮规
+const openDialog = async (ids, rows) => {
+  selectedIds.value = ids;
+  selectedRows.value = rows;
+  dialogVisible.value = true;
+  
+  // 鍔犺浇鐢ㄦ埛鍒楄〃
+  const userListsRes = await userListNoPage();
+  userList.value = userListsRes.data;
+  
+  // 鍔犺浇鎸囨爣閫夐」锛堟牴鎹涓�涓�変腑琛岀殑浜у搧ID锛�
+  if (rows && rows.length > 0 && rows[0].productId) {
+    const params = {
+      productId: rows[0].productId,
+      inspectType: 1
+    };
+    const res = await qualityInspectDetailByProductId(params);
+    testStandardOptions.value = res.data || [];
+  } else {
+    testStandardOptions.value = [];
+  }
+  
+  // 閲嶇疆琛ㄥ崟
+  form.value = {
+    checkResult: '',
+    testStandardId: '',
+    quantity: undefined,
+    qualifiedQuantity: undefined,
+    unqualifiedQuantity: undefined,
+    checkCompany: '',
+    checkName: '',
+    checkTime: '',
+  };
+  tableData.value = [];
+  
+  await nextTick();
+  proxy.$refs.formRef?.clearValidate();
+};
+
+// 鎸囨爣閫夋嫨鍙樺寲澶勭悊
+const handleTestStandardChange = async (testStandardId) => {
+  if (!testStandardId) {
+    tableData.value = [];
+    return;
+  }
+  tableLoading.value = true;
+  try {
+    const res = await getQualityTestStandardParamByTestStandardId(testStandardId);
+    tableData.value = (res.data || []).map(item => ({
+      ...item,
+      id: null,
+      testValue: ''
+    }));
+  } catch (error) {
+    console.error('鑾峰彇鏍囧噯鍙傛暟澶辫触:', error);
+    tableData.value = [];
+  } finally {
+    tableLoading.value = false;
+  }
+};
+
+// 妫�娴嬬粨鏋滃彉鍖栧鐞�
+const handleCheckResultChange = (value) => {
+  if (value === '鍚堟牸') {
+    // 鍚堟牸鏃讹紝鍚堟牸鏁伴噺绛変簬鏁伴噺锛屼笉鍚堟牸鏁伴噺涓�0
+    form.value.qualifiedQuantity = form.value.quantity || 0;
+    form.value.unqualifiedQuantity = 0;
+  } else if (value === '涓嶅悎鏍�') {
+    // 涓嶅悎鏍兼椂锛屽悎鏍兼暟閲忎负0锛屼笉鍚堟牸鏁伴噺绛変簬鏁伴噺
+    form.value.qualifiedQuantity = 0;
+    form.value.unqualifiedQuantity = form.value.quantity || 0;
+  }
+};
+
+// 鏁伴噺鍙樺寲澶勭悊
+const handleQuantityChange = (value) => {
+  if (form.value.checkResult === '鍚堟牸') {
+    form.value.qualifiedQuantity = value || 0;
+    form.value.unqualifiedQuantity = 0;
+  } else if (form.value.checkResult === '涓嶅悎鏍�') {
+    form.value.qualifiedQuantity = 0;
+    form.value.unqualifiedQuantity = value || 0;
+  }
+};
+
+// 鍚堟牸鏁伴噺鍙樺寲澶勭悊
+const handleQualifiedQuantityChange = (value) => {
+  const quantity = form.value.quantity || 0;
+  if (value > quantity) {
+    proxy.$modal.msgWarning("鍚堟牸鏁伴噺涓嶈兘澶т簬鎬绘暟閲�");
+    form.value.qualifiedQuantity = quantity;
+    form.value.unqualifiedQuantity = 0;
+  } else {
+    form.value.unqualifiedQuantity = Number((quantity - value).toFixed(2));
+  }
+  updateCheckResult();
+};
+
+// 涓嶅悎鏍兼暟閲忓彉鍖栧鐞�
+const handleUnqualifiedQuantityChange = (value) => {
+  const quantity = form.value.quantity || 0;
+  if (value > quantity) {
+    proxy.$modal.msgWarning("涓嶅悎鏍兼暟閲忎笉鑳藉ぇ浜庢�绘暟閲�");
+    form.value.unqualifiedQuantity = quantity;
+    form.value.qualifiedQuantity = 0;
+  } else {
+    form.value.qualifiedQuantity = Number((quantity - value).toFixed(2));
+  }
+  updateCheckResult();
+};
+
+// 鏍规嵁鍚堟牸/涓嶅悎鏍兼暟閲忔洿鏂版娴嬬粨鏋�
+const updateCheckResult = () => {
+  const qualified = form.value.qualifiedQuantity || 0;
+  const unqualified = form.value.unqualifiedQuantity || 0;
+  const quantity = form.value.quantity || 0;
+  
+  if (qualified === quantity && unqualified === 0) {
+    form.value.checkResult = '鍚堟牸';
+  } else if (unqualified === quantity && qualified === 0) {
+    form.value.checkResult = '涓嶅悎鏍�';
+  } else if (qualified > 0 && unqualified > 0) {
+    form.value.checkResult = '閮ㄥ垎鍚堟牸';
+  }
+};
+
+// 鎻愪氦琛ㄥ崟
+const submitForm = () => {
+  proxy.$refs.formRef.validate((valid) => {
+    if (valid) {
+      const data = {
+        ids: selectedIds.value,
+        inspectType: inspectType.value,
+        ...form.value,
+        paramList: tableData.value
+      };
+      batchQuickInspect(data).then(res => {
+        proxy.$modal.msgSuccess(res.msg || "蹇�熸楠屽畬鎴�");
+        emit('success');
+        closeDialog();
+      });
+    }
+  });
+};
+
+// 鍏抽棴寮规
+const closeDialog = () => {
+  dialogVisible.value = false;
+  emit('close');
+};
+
+defineExpose({
+  openDialog,
+});
+</script>
+
+<style scoped>
+</style>
diff --git a/src/views/qualityManagement/processInspection/index.vue b/src/views/qualityManagement/processInspection/index.vue
index 85e3811..fef9b15 100644
--- a/src/views/qualityManagement/processInspection/index.vue
+++ b/src/views/qualityManagement/processInspection/index.vue
@@ -2,13 +2,6 @@
   <div class="app-container">
     <div class="search_form mb20">
       <div>
-        <span class="search_title">宸ュ簭锛�</span>
-        <el-input v-model="searchForm.process"
-                  style="width: 240px"
-                  placeholder="璇疯緭鍏ュ伐搴忔悳绱�"
-                  @change="handleQuery"
-                  clearable
-                  :prefix-icon="Search" />
         <span style="margin-left: 10px"
               class="search_title">妫�娴嬫棩鏈燂細</span>
         <el-date-picker v-model="searchForm.entryDate"
@@ -18,14 +11,6 @@
                         placeholder="璇烽�夋嫨"
                         clearable
                         @change="changeDaterange" />
-        <span style="margin-left: 10px"
-              class="search_title">鐢熶骇宸ュ崟鍙凤細</span>
-        <el-input v-model="searchForm.workOrderNo"
-                  style="width: 240px"
-                  placeholder="璇疯緭鍏ョ敓浜у伐鍗曞彿鎼滅储"
-                  @change="handleQuery"
-                  clearable
-                  :prefix-icon="Search" />
         <el-button type="primary"
                    @click="handleQuery"
                    style="margin-left: 10px">鎼滅储</el-button>
@@ -54,6 +39,9 @@
              @close="handleQuery"></FormDia>
     <files-dia ref="filesDia"
                @close="handleQuery"></files-dia>
+    <QuickCheckDia ref="quickCheckDia"
+                   @close="handleQuery"
+                   @success="getList"></QuickCheckDia>
     <el-dialog v-model="dialogFormVisible"
                title="缂栬緫妫�楠屽憳"
                width="30%"
@@ -100,6 +88,7 @@
   } from "vue";
   import InspectionFormDia from "@/views/qualityManagement/processInspection/components/inspectionFormDia.vue";
   import FormDia from "@/views/qualityManagement/processInspection/components/formDia.vue";
+  import QuickCheckDia from "@/views/qualityManagement/processInspection/components/quickCheckDia.vue";
   import { ElMessageBox } from "element-plus";
   import {
     downloadQualityInspect,
@@ -107,7 +96,6 @@
     qualityInspectListPage,
     qualityInspectUpdate,
     submitQualityInspect,
-    batchQuickInspect,
   } from "@/api/qualityManagement/rawMaterialInspection.js";
   import FilesDia from "@/views/qualityManagement/processInspection/components/filesDia.vue";
   import dayjs from "dayjs";
@@ -116,7 +104,6 @@
 
   const data = reactive({
     searchForm: {
-      process: "",
       entryDate: undefined, // 褰曞叆鏃ユ湡
       workOrderNo: "",
       entryDateStart: undefined,
@@ -133,11 +120,6 @@
       label: "妫�娴嬫棩鏈�",
       prop: "checkTime",
       width: 120,
-    },
-    {
-      label: "宸ュ簭",
-      prop: "process",
-      width: 230,
     },
     {
       label: "妫�楠屽憳",
@@ -311,6 +293,7 @@
   const formDia = ref();
   const filesDia = ref();
   const inspectionFormDia = ref();
+  const quickCheckDia = ref();
   const { proxy } = getCurrentInstance();
   const userStore = useUserStore();
   const changeDaterange = value => {
@@ -385,32 +368,8 @@
       return;
     }
 
-    const totalCount = selectedRows.value.length;
-    const submittedCount = totalCount - unSubmittedRows.length;
-
-    let confirmMessage = `宸查�夋嫨 ${totalCount} 鏉℃楠屽崟`;
-    if (submittedCount > 0) {
-      confirmMessage += `锛堝叾涓� ${submittedCount} 鏉″凡鎻愪氦锛屽皢鑷姩璺宠繃锛塦;
-    }
-    confirmMessage += `\n\n纭鍚庡皢鑷姩锛歕n路 妫�楠岀粨鏋滆涓�"鍚堟牸"\n路 鍚堟牸鏁伴噺璁句负鎬绘暟\n路 涓嶅悎鏍兼暟閲忚涓� 0\n路 鎻愪氦骞跺叆搴揱;
-
-    ElMessageBox.confirm(confirmMessage, "蹇�熸楠�", {
-      confirmButtonText: "纭",
-      cancelButtonText: "鍙栨秷",
-      type: "warning",
-      dangerouslyUseHTMLString: false,
-    })
-      .then(() => {
-        // 璋冪敤鎵归噺蹇�熸楠屾帴鍙�
-        const ids = unSubmittedRows.map(item => item.id);
-        batchQuickInspect(ids).then(res => {
-          proxy.$modal.msgSuccess(res.msg || "蹇�熸楠屽畬鎴�");
-          getList();
-        });
-      })
-      .catch(() => {
-        proxy.$modal.msg("宸插彇娑�");
-      });
+    const ids = unSubmittedRows.map(item => item.id);
+    quickCheckDia.value?.openDialog(ids, unSubmittedRows);
   };
 
   // 鎵撳紑鏂板妫�楠屽脊妗�
diff --git a/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue b/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue
index 8bcc72b..8c91275 100644
--- a/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue
+++ b/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue
@@ -197,18 +197,18 @@
     checkResult: "",
   },
   rules: {
-    checkTime: [{required: true, message: "璇疯緭鍏�", trigger: "blur"},],
+    checkTime: [{required: false, message: "璇疯緭鍏�", trigger: "blur"},],
     supplier: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
     checkName: [{required: false, message: "璇疯緭鍏�", trigger: "blur"}],
     productId: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
     productModelId: [{required: true, message: "璇烽�夋嫨浜у搧鍨嬪彿", trigger: "change"}],
     testStandardId: [{required: false, message: "璇烽�夋嫨鎸囨爣", trigger: "change"}],
     unit: [{required: false, message: "璇疯緭鍏�", trigger: "blur"}],
-    quantity: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
-    qualifiedQuantity: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
-    unqualifiedQuantity: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
+    quantity: [{required: false, message: "璇疯緭鍏�", trigger: "blur"}],
+    qualifiedQuantity: [{required: false, message: "璇疯緭鍏�", trigger: "blur"}],
+    unqualifiedQuantity: [{required: false, message: "璇疯緭鍏�", trigger: "blur"}],
     checkCompany: [{required: false, message: "璇疯緭鍏�", trigger: "blur"}],
-    checkResult: [{required: true, message: "璇烽�夋嫨妫�娴嬬粨鏋�", trigger: "change"}],
+    checkResult: [{required: false, message: "璇烽�夋嫨妫�娴嬬粨鏋�", trigger: "change"}],
   },
 });
 const tableColumn = ref([
diff --git a/src/views/qualityManagement/rawMaterialInspection/components/quickCheckDia.vue b/src/views/qualityManagement/rawMaterialInspection/components/quickCheckDia.vue
new file mode 100644
index 0000000..b8229ef
--- /dev/null
+++ b/src/views/qualityManagement/rawMaterialInspection/components/quickCheckDia.vue
@@ -0,0 +1,327 @@
+<template>
+  <div>
+    <el-dialog
+      v-model="dialogVisible"
+      title="蹇�熸楠�"
+      width="70%"
+      @close="closeDialog"
+    >
+      <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="checkResult">
+              <el-select v-model="form.checkResult" placeholder="璇烽�夋嫨妫�娴嬬粨鏋�" style="width: 100%" @change="handleCheckResultChange">
+                <el-option label="鍚堟牸" value="鍚堟牸" />
+                <el-option label="涓嶅悎鏍�" value="涓嶅悎鏍�" />
+                <el-option label="閮ㄥ垎鍚堟牸" value="閮ㄥ垎鍚堟牸" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鎸囨爣閫夋嫨锛�" prop="testStandardId">
+              <el-select v-model="form.testStandardId" placeholder="璇烽�夋嫨鎸囨爣" style="width: 100%" @change="handleTestStandardChange">
+                <el-option
+                  v-for="item in testStandardOptions"
+                  :key="item.id"
+                  :label="item.standardName || item.standardNo"
+                  :value="item.id"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <template v-if="form.checkResult">
+          <el-row :gutter="30">
+            <el-col :span="12">
+              <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" @change="handleQuantityChange"/>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="妫�娴嬪崟浣嶏細" prop="checkCompany">
+                <el-input v-model="form.checkCompany" placeholder="璇疯緭鍏ユ娴嬪崟浣�" clearable/>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row :gutter="30">
+            <el-col :span="12">
+              <el-form-item label="鍚堟牸鏁伴噺锛�" prop="qualifiedQuantity">
+                <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.qualifiedQuantity" placeholder="璇疯緭鍏ュ悎鏍兼暟閲�" clearable :precision="2" @change="handleQualifiedQuantityChange"/>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="涓嶅悎鏍兼暟閲忥細" prop="unqualifiedQuantity">
+                <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.unqualifiedQuantity" placeholder="璇疯緭鍏ヤ笉鍚堟牸鏁伴噺" clearable :precision="2" @change="handleUnqualifiedQuantityChange"/>
+              </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-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-date-picker
+                  v-model="form.checkTime"
+                  type="date"
+                  placeholder="璇烽�夋嫨妫�娴嬫棩鏈�"
+                  value-format="YYYY-MM-DD"
+                  format="YYYY-MM-DD"
+                  clearable
+                  style="width: 100%"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </template>
+      </el-form>
+      <PIMTable
+        rowKey="id"
+        :column="tableColumn"
+        :tableData="tableData"
+        :tableLoading="tableLoading"
+        height="400"
+      >
+        <template #slot="{ row }">
+          <el-input v-model="row.testValue" clearable/>
+        </template>
+      </PIMTable>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitForm">纭</el-button>
+          <el-button @click="closeDialog">鍙栨秷</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+import { ref, reactive, toRefs, getCurrentInstance, nextTick } from "vue";
+import { userListNoPage } from "@/api/system/user.js";
+import { batchQuickInspect } from "@/api/qualityManagement/rawMaterialInspection.js";
+import { qualityInspectDetailByProductId, getQualityTestStandardParamByTestStandardId } from "@/api/qualityManagement/metricMaintenance.js";
+
+const { proxy } = getCurrentInstance();
+const emit = defineEmits(['close', 'success']);
+
+const dialogVisible = ref(false);
+const userList = ref([]);
+const selectedIds = ref([]);
+const selectedRows = ref([]);
+const testStandardOptions = ref([]);
+const inspectType = ref(0); // 鍘熸潗鏂欐楠岀被鍨�
+
+const data = reactive({
+  form: {
+    checkResult: '',
+    testStandardId: '',
+    quantity: undefined,
+    qualifiedQuantity: undefined,
+    unqualifiedQuantity: undefined,
+    checkCompany: '',
+    checkName: '',
+    checkTime: '',
+  },
+  rules: {
+    checkResult: [{ required: true, message: "璇烽�夋嫨妫�娴嬬粨鏋�", trigger: "change" }],
+    testStandardId: [{ required: true, message: "璇烽�夋嫨鎸囨爣", trigger: "change" }],
+    quantity: [{ required: true, message: "璇疯緭鍏ユ暟閲�", trigger: "blur" }],
+    qualifiedQuantity: [{ required: true, message: "璇疯緭鍏ュ悎鏍兼暟閲�", trigger: "blur" }],
+    unqualifiedQuantity: [{ required: true, message: "璇疯緭鍏ヤ笉鍚堟牸鏁伴噺", trigger: "blur" }],
+    checkCompany: [{ required: true, message: "璇疯緭鍏ユ娴嬪崟浣�", trigger: "blur" }],
+    checkName: [{ required: true, message: "璇烽�夋嫨妫�楠屽憳", trigger: "change" }],
+    checkTime: [{ required: true, message: "璇烽�夋嫨妫�娴嬫棩鏈�", trigger: "change" }],
+  },
+});
+const { form, rules } = toRefs(data);
+
+const tableColumn = ref([
+  {
+    label: "鎸囨爣",
+    prop: "parameterItem",
+  },
+  {
+    label: "鍗曚綅",
+    prop: "unit",
+  },
+  {
+    label: "鏍囧噯鍊�",
+    prop: "standardValue",
+  },
+  {
+    label: "鍐呮帶鍊�",
+    prop: "controlValue",
+  },
+  {
+    label: "妫�楠屽��",
+    prop: "testValue",
+    dataType: 'slot',
+    slot: 'slot',
+  },
+]);
+const tableData = ref([]);
+const tableLoading = ref(false);
+
+// 鎵撳紑寮规
+const openDialog = async (ids, rows) => {
+  selectedIds.value = ids;
+  selectedRows.value = rows;
+  dialogVisible.value = true;
+  
+  // 鍔犺浇鐢ㄦ埛鍒楄〃
+  const userListsRes = await userListNoPage();
+  userList.value = userListsRes.data;
+  
+  // 鍔犺浇鎸囨爣閫夐」锛堟牴鎹涓�涓�変腑琛岀殑浜у搧ID锛�
+  if (rows && rows.length > 0 && rows[0].productId) {
+    const params = {
+      productId: rows[0].productId,
+      inspectType: 0
+    };
+    const res = await qualityInspectDetailByProductId(params);
+    testStandardOptions.value = res.data || [];
+  } else {
+    testStandardOptions.value = [];
+  }
+  
+  // 閲嶇疆琛ㄥ崟
+  form.value = {
+    checkResult: '',
+    testStandardId: '',
+    quantity: undefined,
+    qualifiedQuantity: undefined,
+    unqualifiedQuantity: undefined,
+    checkCompany: '',
+    checkName: '',
+    checkTime: '',
+  };
+  tableData.value = [];
+  
+  await nextTick();
+  proxy.$refs.formRef?.clearValidate();
+};
+
+// 鎸囨爣閫夋嫨鍙樺寲澶勭悊
+const handleTestStandardChange = async (testStandardId) => {
+  if (!testStandardId) {
+    tableData.value = [];
+    return;
+  }
+  tableLoading.value = true;
+  try {
+    const res = await getQualityTestStandardParamByTestStandardId(testStandardId);
+    tableData.value = (res.data || []).map(item => ({
+      ...item,
+      id: null,
+      testValue: ''
+    }));
+  } catch (error) {
+    console.error('鑾峰彇鏍囧噯鍙傛暟澶辫触:', error);
+    tableData.value = [];
+  } finally {
+    tableLoading.value = false;
+  }
+};
+
+// 妫�娴嬬粨鏋滃彉鍖栧鐞�
+const handleCheckResultChange = (value) => {
+  if (value === '鍚堟牸') {
+    // 鍚堟牸鏃讹紝鍚堟牸鏁伴噺绛変簬鏁伴噺锛屼笉鍚堟牸鏁伴噺涓�0
+    form.value.qualifiedQuantity = form.value.quantity || 0;
+    form.value.unqualifiedQuantity = 0;
+  } else if (value === '涓嶅悎鏍�') {
+    // 涓嶅悎鏍兼椂锛屽悎鏍兼暟閲忎负0锛屼笉鍚堟牸鏁伴噺绛変簬鏁伴噺
+    form.value.qualifiedQuantity = 0;
+    form.value.unqualifiedQuantity = form.value.quantity || 0;
+  }
+};
+
+// 鏁伴噺鍙樺寲澶勭悊
+const handleQuantityChange = (value) => {
+  if (form.value.checkResult === '鍚堟牸') {
+    form.value.qualifiedQuantity = value || 0;
+    form.value.unqualifiedQuantity = 0;
+  } else if (form.value.checkResult === '涓嶅悎鏍�') {
+    form.value.qualifiedQuantity = 0;
+    form.value.unqualifiedQuantity = value || 0;
+  }
+};
+
+// 鍚堟牸鏁伴噺鍙樺寲澶勭悊
+const handleQualifiedQuantityChange = (value) => {
+  const quantity = form.value.quantity || 0;
+  if (value > quantity) {
+    proxy.$modal.msgWarning("鍚堟牸鏁伴噺涓嶈兘澶т簬鎬绘暟閲�");
+    form.value.qualifiedQuantity = quantity;
+    form.value.unqualifiedQuantity = 0;
+  } else {
+    form.value.unqualifiedQuantity = Number((quantity - value).toFixed(2));
+  }
+  updateCheckResult();
+};
+
+// 涓嶅悎鏍兼暟閲忓彉鍖栧鐞�
+const handleUnqualifiedQuantityChange = (value) => {
+  const quantity = form.value.quantity || 0;
+  if (value > quantity) {
+    proxy.$modal.msgWarning("涓嶅悎鏍兼暟閲忎笉鑳藉ぇ浜庢�绘暟閲�");
+    form.value.unqualifiedQuantity = quantity;
+    form.value.qualifiedQuantity = 0;
+  } else {
+    form.value.qualifiedQuantity = Number((quantity - value).toFixed(2));
+  }
+  updateCheckResult();
+};
+
+// 鏍规嵁鍚堟牸/涓嶅悎鏍兼暟閲忔洿鏂版娴嬬粨鏋�
+const updateCheckResult = () => {
+  const qualified = form.value.qualifiedQuantity || 0;
+  const unqualified = form.value.unqualifiedQuantity || 0;
+  const quantity = form.value.quantity || 0;
+  
+  if (qualified === quantity && unqualified === 0) {
+    form.value.checkResult = '鍚堟牸';
+  } else if (unqualified === quantity && qualified === 0) {
+    form.value.checkResult = '涓嶅悎鏍�';
+  } else if (qualified > 0 && unqualified > 0) {
+    form.value.checkResult = '閮ㄥ垎鍚堟牸';
+  }
+};
+
+// 鎻愪氦琛ㄥ崟
+const submitForm = () => {
+  proxy.$refs.formRef.validate((valid) => {
+    if (valid) {
+      const data = {
+        ids: selectedIds.value,
+        inspectType: inspectType.value,
+        ...form.value,
+        paramList: tableData.value
+      };
+      batchQuickInspect(data).then(res => {
+        proxy.$modal.msgSuccess(res.msg || "蹇�熸楠屽畬鎴�");
+        emit('success');
+        closeDialog();
+      });
+    }
+  });
+};
+
+// 鍏抽棴寮规
+const closeDialog = () => {
+  dialogVisible.value = false;
+  emit('close');
+};
+
+defineExpose({
+  openDialog,
+});
+</script>
+
+<style scoped>
+</style>
diff --git a/src/views/qualityManagement/rawMaterialInspection/index.vue b/src/views/qualityManagement/rawMaterialInspection/index.vue
index 609176e..df33f61 100644
--- a/src/views/qualityManagement/rawMaterialInspection/index.vue
+++ b/src/views/qualityManagement/rawMaterialInspection/index.vue
@@ -55,6 +55,9 @@
              @close="handleQuery"></FormDia>
     <files-dia ref="filesDia"
                @close="handleQuery"></files-dia>
+    <QuickCheckDia ref="quickCheckDia"
+                   @close="handleQuery"
+                   @success="getList"></QuickCheckDia>
     <el-dialog v-model="dialogFormVisible"
                title="缂栬緫妫�楠屽憳"
                width="30%"
@@ -101,6 +104,7 @@
   } from "vue";
   import InspectionFormDia from "@/views/qualityManagement/rawMaterialInspection/components/inspectionFormDia.vue";
   import FormDia from "@/views/qualityManagement/rawMaterialInspection/components/formDia.vue";
+  import QuickCheckDia from "@/views/qualityManagement/rawMaterialInspection/components/quickCheckDia.vue";
   import { ElMessageBox } from "element-plus";
   import {
     downloadQualityInspect,
@@ -108,7 +112,6 @@
     qualityInspectListPage,
     qualityInspectUpdate,
     submitQualityInspect,
-    batchQuickInspect,
   } from "@/api/qualityManagement/rawMaterialInspection.js";
   import FilesDia from "@/views/qualityManagement/rawMaterialInspection/components/filesDia.vue";
   import dayjs from "dayjs";
@@ -322,6 +325,7 @@
   const formDia = ref();
   const filesDia = ref();
   const inspectionFormDia = ref();
+  const quickCheckDia = ref();
   const { proxy } = getCurrentInstance();
   const userStore = useUserStore();
   const changeDaterange = value => {
@@ -396,33 +400,8 @@
       return;
     }
 
-    const totalCount = selectedRows.value.length;
-    const unSubmittedCount = unSubmittedRows.length;
-    const submittedCount = totalCount - unSubmittedCount;
-
-    let confirmMessage = `宸查�夋嫨 ${totalCount} 鏉℃楠屽崟`;
-    if (submittedCount > 0) {
-      confirmMessage += `锛堝叾涓� ${submittedCount} 鏉″凡鎻愪氦锛屽皢鑷姩璺宠繃锛塦;
-    }
-    confirmMessage += `\n\n纭鍚庡皢鑷姩锛歕n路 妫�楠岀粨鏋滆涓�"鍚堟牸"\n路 鍚堟牸鏁伴噺璁句负鎬绘暟\n路 涓嶅悎鏍兼暟閲忚涓� 0\n路 鎻愪氦骞跺叆搴揱;
-
-    ElMessageBox.confirm(confirmMessage, "蹇�熸楠�", {
-      confirmButtonText: "纭",
-      cancelButtonText: "鍙栨秷",
-      type: "warning",
-      dangerouslyUseHTMLString: false,
-    })
-      .then(() => {
-        // 璋冪敤鎵归噺蹇�熸楠屾帴鍙�
-        const ids = unSubmittedRows.map(item => item.id);
-        batchQuickInspect(ids).then(res => {
-          proxy.$modal.msgSuccess(res.msg || "蹇�熸楠屽畬鎴�");
-          getList();
-        });
-      })
-      .catch(() => {
-        proxy.$modal.msg("宸插彇娑�");
-      });
+    const ids = unSubmittedRows.map(item => item.id);
+    quickCheckDia.value?.openDialog(ids, unSubmittedRows);
   };
   // 鎵撳紑闄勪欢寮规
   const openFilesFormDia = (type, row) => {

--
Gitblit v1.9.3