From a4057a4ccd9d0da5f7dc7b5f75b552a06ce8bb30 Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期三, 15 四月 2026 16:23:32 +0800
Subject: [PATCH] fix:发货分批发货

---
 src/views/qualityManagement/rawMaterialInspection/components/formDia.vue |  623 +++++++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 476 insertions(+), 147 deletions(-)

diff --git a/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue b/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue
index 7e373bf..12f5d71 100644
--- a/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue
+++ b/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue
@@ -1,26 +1,32 @@
 <template>
   <div>
     <el-dialog
-        v-model="dialogFormVisible"
-        :title="operationType === 'add' ? '鏂板鍘熸潗鏂欐楠�' : '缂栬緫鍘熸潗鏂欐楠�'"
-        width="70%"
-        @close="closeDia"
+      v-model="dialogFormVisible"
+      :title="operationType === 'add' ? '鏂板鍘熸潗鏂欐楠�' : '缂栬緫鍘熸潗鏂欐楠�'"
+      width="70%"
+      @close="closeDia"
     >
-      <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
+      <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="supplier">
               <el-select
-                  v-model="form.supplier"
-                  placeholder="璇烽�夋嫨"
-                  clearable
-                  :disabled="supplierQuantityDisabled"
+                v-model="form.supplier"
+                placeholder="璇烽�夋嫨"
+                clearable
+                :disabled="supplierQuantityDisabled"
               >
                 <el-option
-                    v-for="item in supplierList"
-                    :key="item.id"
-                    :label="item.supplierName"
-                    :value="item.supplierName"
+                  v-for="item in supplierList"
+                  :key="item.id"
+                  :label="item.supplierName"
+                  :value="item.supplierName"
                 />
               </el-select>
             </el-form-item>
@@ -28,15 +34,15 @@
           <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"
-                  :disabled="operationType === 'edit'"
-                  style="width: 100%"
+                v-model="form.productId"
+                placeholder="璇烽�夋嫨"
+                clearable
+                check-strictly
+                @change="getModels"
+                :data="productOptions"
+                :render-after-expand="false"
+                :disabled="operationType === 'edit'"
+                style="width: 100%"
               />
             </el-form-item>
           </el-col>
@@ -44,9 +50,21 @@
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="productModelId">
-              <el-select v-model="form.productModelId" 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
+                v-model="form.productModelId"
+                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>
           </el-col>
@@ -72,66 +90,194 @@
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="鍗曚綅锛�" prop="unit">
-              <el-input v-model="form.unit" disabled/>
+              <el-input v-model="form.unit" disabled />
             </el-form-item>
           </el-col>
           <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" :disabled="supplierQuantityDisabled"/>
+            <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"
+                :disabled="supplierQuantityDisabled"
+              />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
-            <el-form-item label="妫�娴嬪崟浣嶏細" prop="checkCompany">
-              <el-input v-model="form.checkCompany" placeholder="璇疯緭鍏�" clearable/>
+            <el-form-item label="妫�鍝佹暟閲忥細" prop="inspectedQuantity">
+              <el-input-number
+                :step="0.01"
+                :min="0"
+                style="width: 100%"
+                v-model="form.inspectedQuantity"
+                placeholder="璇疯緭鍏ワ紝涓嶅ぇ浜庢�绘暟閲�"
+                clearable
+                :precision="2"
+              />
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="妫�娴嬬粨鏋滐細" prop="checkResult">
-              <el-select v-model="form.checkResult">
-                <el-option label="鍚堟牸" value="鍚堟牸"/>
-                <el-option label="涓嶅悎鏍�" value="涓嶅悎鏍�"/>
-              </el-select>
-            </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-form-item label="鐢熶骇鏃ユ湡锛�" prop="productionDate">
               <el-date-picker
-                  v-model="form.checkTime"
+                v-model="form.productionDate"
+                type="date"
+                placeholder="璇烽�夋嫨鏃ユ湡"
+                value-format="YYYY-MM-DD"
+                format="YYYY-MM-DD"
+                clearable
+                style="width: 100%"
+                @change="calculateValidityDate"
+              />
+            </el-form-item>
+          </el-col>
+          <!-- <el-col :span="12">
+            <el-form-item label="鏈夋晥鏈燂細" prop="validityDate">
+              <el-date-picker
+                  v-model="form.validityDate"
                   type="date"
-                  placeholder="璇烽�夋嫨鏃ユ湡"
+                  placeholder="鑷姩璁$畻鎴栨墜鍔ㄩ�夋嫨"
                   value-format="YYYY-MM-DD"
                   format="YYYY-MM-DD"
                   clearable
                   style="width: 100%"
               />
             </el-form-item>
+          </el-col> -->
+          <el-col :span="12">
+            <el-form-item label="UID鐮侊細" prop="uidNo">
+              <el-input v-model="form.uidNo" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鎵瑰彿锛�" prop="batchNo">
+              <el-input
+                v-model="form.batchNo"
+                placeholder="璇疯緭鍏�"
+                clearable
+                :disabled="operationType === 'edit'"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="30">
+          <el-col :span="12">
+            <el-form-item label="妫�娴嬪崟浣嶏細" prop="checkCompany">
+              <el-input
+                v-model="form.checkCompany"
+                placeholder="璇疯緭鍏�"
+                clearable
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="妫�娴嬬粨鏋滐細" prop="checkResult">
+              <el-select v-model="form.checkResult">
+                <el-option label="鍚堟牸" value="鍚堟牸" />
+                <el-option label="涓嶅悎鏍�" value="涓嶅悎鏍�" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <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>
       </el-form>
-<!--      <div style="margin-bottom: 10px;text-align: right">-->
-<!--        <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>-->
-<!--      </div>-->
+      <!--      <div style="margin-bottom: 10px;text-align: right">-->
+      <!--        <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>-->
+      <!--      </div>-->
       <PIMTable
-          rowKey="id"
-          :column="tableColumn"
-          :tableData="tableData"
-          :tableLoading="tableLoading"
-          height="400"
+        rowKey="id"
+        :column="tableColumn"
+        :tableData="tableData"
+        :tableLoading="tableLoading"
+        height="400"
       >
-        <template #slot="{ row }">
-          <el-input v-model="row.testValue" clearable/>
+        <template #instrument="{ row }">
+          <el-select
+            v-model="row.instrument"
+            placeholder="璇烽�夋嫨鎴栬緭鍏�"
+            filterable
+            allow-create
+            default-first-option
+            clearable
+            style="width: 100%"
+            @change="handleInstrumentChange(row)"
+          >
+            <el-option label="鐩祴" value="鐩祴" />
+            <el-option
+              v-for="item in deviceList"
+              :key="item.id"
+              :label="
+                item.deviceName +
+                (item.deviceModel ? ' / ' + item.deviceModel : '')
+              "
+              :value="item.deviceName"
+            />
+          </el-select>
+        </template>
+        <template #deviceStatus="{ row }">
+          <el-select
+            v-model="row.deviceStatus"
+            placeholder="璇烽�夋嫨"
+            default-first-option
+            clearable
+            style="width: 100%"
+          >
+            <el-option label="姝e父" value="姝e父" />
+            <el-option label="鍋滄満" value="鍋滄満" />
+            <el-option label="杩愯" value="杩愯" />
+            <el-option label="缁翠慨" value="缁翠慨" />
+            <el-option label="/" value="/" />
+          </el-select>
+        </template>
+        <template #result="{ row }">
+          <el-input v-model="row.result" placeholder="璇疯緭鍏�" clearable />
+        </template>
+        <template #resultJudgment="{ row }">
+          <el-select
+            v-model="row.resultJudgment"
+            placeholder="璇烽�夋嫨"
+            clearable
+            style="width: 100%"
+            @change="changeResult"
+          >
+            <el-option label="鍚堟牸" value="鍚堟牸" />
+            <el-option label="涓嶅悎鏍�" value="涓嶅悎鏍�" />
+            <el-option label="/" value="/" />
+          </el-select>
         </template>
       </PIMTable>
       <template #footer>
@@ -145,19 +291,45 @@
 </template>
 
 <script setup>
-import {ref, reactive, toRefs, computed, getCurrentInstance, nextTick} from "vue";
-import {getOptions} from "@/api/procurementManagement/procurementLedger.js";
-import {modelList, productTreeList} from "@/api/basicData/product.js";
-import {qualityInspectAdd, qualityInspectUpdate} from "@/api/qualityManagement/rawMaterialInspection.js";
-import {qualityInspectParamDel, qualityInspectParamInfo} from "@/api/qualityManagement/qualityInspectParam.js";
-import {qualityInspectDetailByProductId, getQualityTestStandardParamByTestStandardId} from "@/api/qualityManagement/metricMaintenance.js";
-import {userListNoPage} from "@/api/system/user.js";
+import {
+  ref,
+  reactive,
+  toRefs,
+  computed,
+  getCurrentInstance,
+  nextTick,
+} from "vue";
+import { getOptions } from "@/api/procurementManagement/procurementLedger.js";
+import { modelList, productTreeList } from "@/api/basicData/product.js";
+import {
+  qualityInspectAdd,
+  qualityInspectUpdate,
+} from "@/api/qualityManagement/rawMaterialInspection.js";
+import {
+  qualityInspectParamDel,
+  qualityInspectParamInfo,
+} from "@/api/qualityManagement/qualityInspectParam.js";
+import {
+  qualityInspectDetailByProductId,
+  getQualityTestStandardParamByTestStandardId,
+} from "@/api/qualityManagement/metricMaintenance.js";
+import { deviceList as qualityInspectParamDeviceList } from "@/api/energyManagement/index.js";
+import { userListNoPage } from "@/api/system/user.js";
 
-const {proxy} = getCurrentInstance()
-const emit = defineEmits(['close'])
+const { proxy } = getCurrentInstance();
+const emit = defineEmits(["close"]);
 
 const dialogFormVisible = ref(false);
-const operationType = ref('')
+const operationType = ref("");
+
+const validateBatchNo = (rule, value, callback) => {
+  if (value === undefined || value === null || String(value).trim() === "") {
+    callback(new Error("璇疯緭鍏ユ壒鍙�"));
+    return;
+  }
+  callback();
+};
+
 const data = reactive({
   form: {
     checkTime: "",
@@ -167,59 +339,113 @@
     productId: "",
     productModelId: "",
     model: "",
+    uidNo: "",
+    batchNo: "",
     testStandardId: "",
     unit: "",
     quantity: "",
+    inspectedQuantity: "",
+    inspectMaterialCondition: "",
+    productionDate: "",
+    validityDate: "",
     checkCompany: "",
     checkResult: "",
   },
   rules: {
-    checkTime: [{required: true, 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"}],
-    checkCompany: [{required: false, message: "璇疯緭鍏�", trigger: "blur"}],
-    checkResult: [{required: true, message: "璇烽�夋嫨妫�娴嬬粨鏋�", trigger: "change"}],
+    checkTime: [{ required: true, 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" }],
+    inspectedQuantity: [
+      { required: true, message: "璇疯緭鍏ユ鍝佹暟閲�", trigger: "blur" },
+      {
+        validator: (rule, value, callback) => {
+          if (value !== "" && value !== null && value !== undefined) {
+            const qty = Number(form.value.quantity);
+            const inspectedQty = Number(value);
+            if (!isNaN(qty) && !isNaN(inspectedQty) && inspectedQty > qty) {
+              callback(new Error("妫�鍝佹暟閲忎笉鑳藉ぇ浜庢�绘暟閲�"));
+            } else {
+              callback();
+            }
+          } else {
+            callback();
+          }
+        },
+        trigger: "blur",
+      },
+    ],
+    checkCompany: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
+    batchNo: [{ required: true, validator: validateBatchNo, trigger: "blur" }],
+    checkResult: [
+      { required: true, message: "璇烽�夋嫨妫�娴嬬粨鏋�", trigger: "change" },
+    ],
   },
 });
 const tableColumn = ref([
   {
-    label: "鎸囨爣",
+    label: "妫�娴嬮」鐩�",
     prop: "parameterItem",
+    width: 150,
+  },
+  {
+    label: "鏍囧噯瑕佹眰",
+    prop: "standardValue",
+    width: 180,
   },
   {
     label: "鍗曚綅",
     prop: "unit",
+    width: 70,
   },
   {
-    label: "鏍囧噯鍊�",
-    prop: "standardValue",
+    label: "妫�娴嬪櫒鍏�",
+    prop: "instrument",
+    dataType: "slot",
+    slot: "instrument",
+    width: 220,
   },
   {
-    label: "鍐呮帶鍊�",
-    prop: "controlValue",
+    label: "璁惧鐘舵��",
+    prop: "deviceStatus",
+    dataType: "slot",
+    slot: "deviceStatus",
+    width: 120,
   },
   {
-    label: "妫�楠屽��",
-    prop: "testValue",
-    dataType: 'slot',
-    slot: 'slot',
+    label: "妫�娴嬬粨鏋�",
+    prop: "result",
+    dataType: "slot",
+    slot: "result",
+    width: 150,
+  },
+  {
+    label: "缁撴灉鍒ゆ柇",
+    prop: "resultJudgment",
+    dataType: "slot",
+    slot: "resultJudgment",
+    width: 120,
   },
 ]);
 const tableData = ref([]);
 const tableLoading = ref(false);
 
-const {form, rules} = toRefs(data);
+const { form, rules } = toRefs(data);
 const supplierList = ref([]);
 const productOptions = ref([]);
 const currentProductId = ref(0);
 const testStandardOptions = ref([]); // 鎸囨爣閫夋嫨涓嬫媺妗嗘暟鎹�
 const modelOptions = ref([]);
 const userList = ref([]); // 妫�楠屽憳涓嬫媺鍒楄〃
+const deviceList = ref([]);
 
 // 缂栬緫鏃讹細productMainId 鎴� purchaseLedgerId 浠讳竴鏈夊�煎垯渚涘簲鍟嗐�佹暟閲忕疆鐏�
 const supplierQuantityDisabled = computed(() => {
@@ -241,8 +467,11 @@
     console.error("鍔犺浇妫�楠屽憳鍒楄〃澶辫触", e);
     userList.value = [];
   }
+
+  // 鍔犺浇璁惧鍙拌处鍒楄〃
+  loadDeviceList();
   // 鍏堥噸缃〃鍗曟暟鎹紙淇濇寔瀛楁瀹屾暣锛岄伩鍏嶅脊绐楅娆℃覆鏌撴椂瑙﹀彂蹇呭~绾㈡鈥滈棯涓�涓嬧�濓級
-	form.value = {
+  form.value = {
     checkTime: "",
     supplier: "",
     checkName: "",
@@ -250,21 +479,27 @@
     productId: "",
     productModelId: "",
     model: "",
+    uidNo: "",
+    batchNo: "",
     testStandardId: "",
     unit: "",
     quantity: "",
+    inspectedQuantity: "",
+    inspectMaterialCondition: "",
+    productionDate: "",
+    validityDate: "",
     checkCompany: "",
     checkResult: "",
-  }
+  };
   testStandardOptions.value = [];
   tableData.value = [];
   // 鍏堢‘淇濅骇鍝佹爲宸插姞杞斤紝鍚﹀垯缂栬緫鏃朵骇鍝�/瑙勬牸鍨嬪彿鏃犳硶鍙嶆樉
   await getProductOptions();
-  if (operationType.value === 'edit') {
+  if (operationType.value === "edit") {
     // 鍏堜繚瀛� testStandardId锛岄伩鍏嶈娓呯┖
     const savedTestStandardId = row.testStandardId;
-    form.value = {...row}
-    currentProductId.value = row.productId || 0
+    form.value = { ...row };
+    currentProductId.value = row.productId || 0;
     // 鍏抽敭锛氱紪杈戞椂鍔犺浇瑙勬牸鍨嬪彿涓嬫媺閫夐」锛屾墠鑳藉弽鏄� productModelId
     if (currentProductId.value) {
       try {
@@ -284,9 +519,9 @@
       // 鍏堝姞杞芥寚鏍囬�夐」
       let params = {
         productId: currentProductId.value,
-        inspectType: 0
-      }
-      qualityInspectDetailByProductId(params).then(res => {
+        inspectType: 0,
+      };
+      qualityInspectDetailByProductId(params).then((res) => {
         testStandardOptions.value = res.data || [];
         // 浣跨敤 nextTick 鍜� setTimeout 纭繚閫夐」宸茬粡娓叉煋鍒� DOM
         nextTick(() => {
@@ -294,8 +529,10 @@
             // 濡傛灉缂栬緫鏁版嵁涓湁 testStandardId锛屽垯璁剧疆骞跺姞杞藉搴旂殑鍙傛暟
             if (savedTestStandardId) {
               // 纭繚绫诲瀷鍖归厤锛坕tem.id 鍙兘鏄暟瀛楁垨瀛楃涓诧級
-              const matchedOption = testStandardOptions.value.find(item => 
-                item.id == savedTestStandardId || String(item.id) === String(savedTestStandardId)
+              const matchedOption = testStandardOptions.value.find(
+                (item) =>
+                  item.id == savedTestStandardId ||
+                  String(item.id) === String(savedTestStandardId)
               );
               if (matchedOption) {
                 // 纭繚浣跨敤鍖归厤椤圭殑 id锛堜繚鎸佺被鍨嬩竴鑷达級
@@ -304,7 +541,12 @@
                 getQualityInspectParamList(row.id);
               } else {
                 // 濡傛灉鎵句笉鍒板尮閰嶉」锛屽皾璇曠洿鎺ヤ娇鐢ㄥ師鍊�
-                console.warn('鏈壘鍒板尮閰嶇殑鎸囨爣閫夐」锛宼estStandardId:', savedTestStandardId, '鍙敤閫夐」:', testStandardOptions.value);
+                console.warn(
+                  "鏈壘鍒板尮閰嶇殑鎸囨爣閫夐」锛宼estStandardId:",
+                  savedTestStandardId,
+                  "鍙敤閫夐」:",
+                  testStandardOptions.value
+                );
                 form.value.testStandardId = savedTestStandardId;
                 getQualityInspectParamList(row.id);
               }
@@ -324,7 +566,7 @@
   nextTick(() => {
     proxy.$refs?.formRef?.clearValidate?.();
   });
-}
+};
 const getProductOptions = () => {
   return productTreeList().then((res) => {
     productOptions.value = convertIdToValue(res);
@@ -334,21 +576,31 @@
 const getModels = (value) => {
   form.value.productModelId = undefined;
   form.value.unit = undefined;
+  form.value.uidNo = undefined;
+  form.value.batchNo = "";
   modelOptions.value = [];
-  currentProductId.value = value
+  currentProductId.value = value;
   form.value.productName = findNodeById(productOptions.value, value);
   modelList({ id: value }).then((res) => {
     modelOptions.value = res;
-  })
+  });
   if (currentProductId.value) {
     getList();
   }
 };
 
 const handleChangeModel = (value) => {
-  form.value.model = modelOptions.value.find(item => item.id == value)?.model || '';
-  form.value.unit = modelOptions.value.find(item => item.id == value)?.unit || '';
-}
+  form.value.model =
+    modelOptions.value.find((item) => item.id == value)?.model || "";
+  form.value.unit =
+    modelOptions.value.find((item) => item.id == value)?.unit || "";
+  form.value.uidNo =
+    modelOptions.value.find((item) => item.id == value)?.uidNo || "";
+  // 閫夋嫨瑙勬牸鍨嬪彿鍚庯紝濡傛灉宸叉湁鐢熶骇鏃ユ湡鍒欓噸鏂拌绠楁湁鏁堟湡
+  if (form.value.productionDate) {
+    calculateValidityDate();
+  }
+};
 
 const findNodeById = (nodes, productId) => {
   for (let i = 0; i < nodes.length; i++) {
@@ -367,7 +619,7 @@
 
 function convertIdToValue(data) {
   return data.map((item) => {
-    const {id, children, ...rest} = item;
+    const { id, children, ...rest } = item;
     const newItem = {
       ...rest,
       value: id, // 灏� id 鏀逛负 value
@@ -382,29 +634,29 @@
 
 // 鎻愪氦浜у搧琛ㄥ崟
 const submitForm = () => {
-  proxy.$refs.formRef.validate(valid => {
+  proxy.$refs.formRef.validate((valid) => {
     if (valid) {
-      form.value.inspectType = 0
-			if (operationType.value === "add") {
-				tableData.value.forEach((item) => {
-					delete item.id
-				})
-			}
-      const data = {...form.value, qualityInspectParams: tableData.value}
+      form.value.inspectType = 0;
       if (operationType.value === "add") {
-        qualityInspectAdd(data).then(res => {
+        tableData.value.forEach((item) => {
+          delete item.id;
+        });
+      }
+      const data = { ...form.value, qualityInspectParams: tableData.value };
+      if (operationType.value === "add") {
+        qualityInspectAdd(data).then((res) => {
           proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
           closeDia();
-        })
+        });
       } else {
-        qualityInspectUpdate(data).then(res => {
+        qualityInspectUpdate(data).then((res) => {
           proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
           closeDia();
-        })
+        });
       }
     }
-  })
-}
+  });
+};
 
 const getList = () => {
   if (!currentProductId.value) {
@@ -414,17 +666,17 @@
   }
   let params = {
     productId: currentProductId.value,
-    inspectType: 0
-  }
-  qualityInspectDetailByProductId(params).then(res => {
+    inspectType: 0,
+  };
+  qualityInspectDetailByProductId(params).then((res) => {
     // 淇濆瓨涓嬫媺妗嗛�夐」鏁版嵁
     testStandardOptions.value = res.data || [];
     // 娓呯┖琛ㄦ牸鏁版嵁锛岀瓑寰呯敤鎴烽�夋嫨鎸囨爣
     tableData.value = [];
     // 娓呯┖鎸囨爣閫夋嫨
-    form.value.testStandardId = '';
-  })
-}
+    form.value.testStandardId = "";
+  });
+};
 
 // 鎸囨爣閫夋嫨鍙樺寲澶勭悊
 const handleTestStandardChange = (testStandardId) => {
@@ -433,35 +685,112 @@
     return;
   }
   tableLoading.value = true;
-  getQualityTestStandardParamByTestStandardId(testStandardId).then(res => {
-    tableData.value = res.data || [];
-  }).catch(error => {
-    console.error('鑾峰彇鏍囧噯鍙傛暟澶辫触:', error);
-    tableData.value = [];
-  }).finally(() => {
-    tableLoading.value = false;
-  })
-}
+  getQualityTestStandardParamByTestStandardId(testStandardId)
+    .then((res) => {
+      tableData.value = res.data || [];
+    })
+    .catch((error) => {
+      console.error("鑾峰彇鏍囧噯鍙傛暟澶辫触:", error);
+      tableData.value = [];
+    })
+    .finally(() => {
+      tableLoading.value = false;
+    });
+};
 
 const getQualityInspectParamList = (id) => {
-  qualityInspectParamInfo(id).then(res => {
-    tableData.value = res.data;
-  })
-}
+  qualityInspectParamInfo(id).then((res) => {
+    tableData.value = (res.data || []).map((item) => ({ ...item }));
+  });
+};
+
+// 鑾峰彇璁惧鍙拌处鍒楄〃
+const loadDeviceList = () => {
+  qualityInspectParamDeviceList().then((res) => {
+    deviceList.value = res.data || [];
+  });
+};
+
+// 璁惧鐘舵�侀鑹叉槧灏�
+const getDeviceStatusType = (status) => {
+  const map = {
+    姝e父: "success",
+    杩愯: "primary",
+    鍋滄満: "warning",
+    缁翠慨: "danger",
+  };
+  return map[status] || "info";
+};
+
+// 妫�娴嬪櫒鍏峰彉鍖栨椂锛岃嚜鍔ㄥ~鍏呰澶囩姸鎬�
+const handleInstrumentChange = (row) => {
+  if (row.instrument === "鐩祴") {
+    row.deviceId = null;
+    row.deviceName = "鐩祴";
+    row.deviceStatus = "";
+    return;
+  }
+  const device = deviceList.value.find((d) => d.deviceName === row.instrument);
+  if (device) {
+    row.deviceId = device.id;
+    row.deviceName = device.deviceName;
+    row.deviceStatus = device.status || "";
+  } else {
+    row.deviceId = null;
+    row.deviceName = row.instrument || "";
+    row.deviceStatus = "";
+  }
+};
+
+// 璁$畻鏈夋晥鏈燂紙鐢熶骇鏃ユ湡 + 瑙勬牸鍨嬪彿涓殑鏈夋晥鏈燂級
+const calculateValidityDate = async () => {
+  if (!form.value.productionDate) {
+    form.value.validityDate = "";
+    return;
+  }
+  // 鑾峰彇瑙勬牸鍨嬪彿鐨勬湁鏁堟湡
+  const selectedModel = modelOptions.value.find(
+    (item) => item.id == form.value.productModelId
+  );
+  if (selectedModel && selectedModel.validityPeriod) {
+    const productionDate = new Date(form.value.productionDate);
+    const validityPeriod = parseFloat(selectedModel.validityPeriod);
+    const validityDate = new Date(productionDate);
+    validityDate.setFullYear(
+      validityDate.getFullYear() + Math.floor(validityPeriod)
+    );
+    validityDate.setMonth(
+      validityDate.getMonth() + Math.round((validityPeriod % 1) * 12)
+    );
+    form.value.validityDate = validityDate.toISOString().split("T")[0];
+  }
+};
+
 // 鍏抽棴寮规
 const closeDia = () => {
   proxy.resetForm("formRef");
   tableData.value = [];
   testStandardOptions.value = [];
-  form.value.testStandardId = '';
+  form.value.testStandardId = "";
   dialogFormVisible.value = false;
-  emit('close')
+  emit("close");
+};
+
+// 淇敼妫�娴嬬粨鏋�
+const changeResult = () => {
+  let result = "鍚堟牸";
+  tableData.value.forEach((item) => {
+    if (item.resultJudgment !== "/") {
+      if (item.resultJudgment === "涓嶅悎鏍�") {
+        result = "涓嶅悎鏍�";
+      }
+    }
+  });
+  form.value.checkResult = result;
 };
 defineExpose({
   openDialog,
 });
 </script>
 
-<style scoped>
-
-</style>
\ No newline at end of file
+<style scoped></style>

--
Gitblit v1.9.3