gaoluyang
2026-04-09 1ba8a855aeff2c61db619a3147b45b98bb990714
src/views/qualityManagement/processInspection/components/formDia.vue
@@ -8,11 +8,13 @@
    >
      <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="process">
              <el-input v-model="form.process" placeholder="请输入工序" clearable />
            </el-form-item>
          </el-col>
<!--          <el-col :span="12">-->
<!--            <el-form-item label="工序:" prop="process">-->
<!--              <el-select v-model="form.process" placeholder="请选择工序" clearable :disabled="processQuantityDisabled" style="width: 100%">-->
<!--                <el-option v-for="item in processList" :key="item.name" :label="item.name" :value="item.name"/>-->
<!--              </el-select>-->
<!--            </el-form-item>-->
<!--          </el-col>-->
          <el-col :span="12">
            <el-form-item label="产品名称:" prop="productId">
              <el-tree-select
@@ -28,53 +30,53 @@
              />
            </el-form-item>
          </el-col>
               <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>
                  </el-form-item>
               </el-col>
        </el-row>
        <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>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="指标选择:" prop="testStandardId">
              <el-select
                v-model="form.testStandardId"
                placeholder="请选择指标"
                clearable
                @change="handleTestStandardChange"
                style="width: 100%"
              >
                <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-col :span="12">
                  <el-form-item label="指标选择:" prop="testStandardId">
                     <el-select
                        v-model="form.testStandardId"
                    placeholder="请选择指标"
                    clearable
                    @change="handleTestStandardChange"
                    style="width: 100%"
                     >
                        <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-col :span="12">
                  <el-form-item label="单位:" prop="unit">
                     <el-input v-model="form.unit" placeholder="请输入" disabled/>
                  </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="请输入" 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"/>
              <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.quantity" placeholder="请输入" clearable :precision="2" :disabled="processQuantityDisabled"/>
            </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="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">
@@ -83,16 +85,17 @@
              </el-select>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="检验员:" prop="checkName">
               <el-col :span="12">
                  <el-form-item label="检验员:" prop="checkName">
                     <el-select v-model="form.checkName" placeholder="请选择" clearable>
                        <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName"
                                        :value="item.nickName"/>
                               :value="item.nickName"/>
                     </el-select>
            </el-form-item>
          </el-col>
                  </el-form-item>
               </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="检测日期:" prop="checkTime">
              <el-date-picker
@@ -130,22 +133,25 @@
</template>
<script setup>
import {ref, reactive, toRefs, getCurrentInstance, nextTick} from "vue";
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 {qualityInspectDetailByProductId, getQualityTestStandardParamByTestStandardId} 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";
const { proxy } = getCurrentInstance()
const emit = defineEmits(['close'])
const dialogFormVisible = ref(false);
const operationType = ref('')
const data = reactive({
  form: {
    checkTime: "",
    process: "",
    // process: "",
    checkName: "",
    productName: "",
    productId: "",
@@ -159,10 +165,10 @@
  },
  rules: {
    checkTime: [{ required: true, message: "请输入", trigger: "blur" },],
    process: [{ required: true, message: "请输入工序", trigger: "blur" }],
    // process: [{ required: true, message: "请选择工序", trigger: "change" }],
    checkName: [{ required: false, message: "请输入", trigger: "blur" }],
    productId: [{ required: true, message: "请输入", trigger: "blur" }],
    productModelId: [{ required: false, message: "请选择", trigger: "change" }],
    productModelId: [{ required: true, message: "请选择", trigger: "change" }],
    testStandardId: [{required: false, message: "请选择指标", trigger: "change"}],
    unit: [{ required: false, message: "请输入", trigger: "blur" }],
    quantity: [{ required: true, message: "请输入", trigger: "blur" }],
@@ -172,6 +178,12 @@
});
const userList = ref([]);
const { form, rules } = toRefs(data);
// 编辑时:productMainId 或 purchaseLedgerId 任一有值则工序、数量置灰
const processQuantityDisabled = computed(() => {
  const v = form.value || {};
  return !!(v.productMainId != null || v.purchaseLedgerId != null);
});
const processList = ref([]); // 工序下拉列表(工序名称 name)
const supplierList = ref([]);
const productOptions = ref([]);
const tableColumn = ref([
@@ -207,29 +219,65 @@
// 打开弹框
const openDialog = async (type, row) => {
   operationType.value = type;
   dialogFormVisible.value = true;
   getOptions().then((res) => {
      supplierList.value = res.data;
   });
   // 加载工序下拉列表
   try {
      const res = await list();
      processList.value = res.data || [];
   } catch (e) {
      console.error("加载工序列表失败", e);
      processList.value = [];
   }
   let userLists = await userListNoPage();
   userList.value = userLists.data;
   form.value = {}
   // 先重置表单数据(保持字段完整,避免弹窗首次渲染时触发必填红框“闪一下”)
   form.value = {
      checkTime: "",
      // process: "",
      checkName: "",
      productName: "",
      productId: "",
      productModelId: "",
      model: "",
      testStandardId: "",
      unit: "",
      quantity: "",
      checkCompany: "",
      checkResult: "",
   }
   testStandardOptions.value = [];
   tableData.value = [];
   getProductOptions();
   // 先确保产品树已加载,否则编辑时产品/规格型号无法反显
   await getProductOptions();
   if (operationType.value === 'edit') {
      // 先保存 testStandardId,避免被清空
      const savedTestStandardId = row.testStandardId;
      // 先设置表单数据,但暂时清空 testStandardId,等选项加载完成后再设置
      form.value = {...row, testStandardId: ''}
      currentProductId.value = row.productId || 0
      // 关键:编辑时加载规格型号下拉选项,才能反显 productModelId
      if (currentProductId.value) {
         try {
            const res = await modelList({ id: currentProductId.value });
            modelOptions.value = res || [];
            // 同步回填 model / unit(有些接口返回的 row 里可能没带全)
            if (form.value.productModelId) {
               handleChangeModel(form.value.productModelId);
            }
         } catch (e) {
            console.error("加载规格型号失败", e);
            modelOptions.value = [];
         }
      }
      // 编辑模式下,先加载指标选项,然后加载参数列表
      if (currentProductId.value) {
         // 先加载指标选项
         let params = {
            productId: currentProductId.value,
            inspectType: 1,
            process: form.value.process || ''
            // process: form.value.process || ''
         }
         qualityInspectDetailByProductId(params).then(res => {
            testStandardOptions.value = res.data || [];
@@ -264,10 +312,16 @@
         getQualityInspectParamList(row.id);
      }
   }
   // 最后再打开弹窗,并清理校验态,避免必填提示闪烁
   dialogFormVisible.value = true;
   nextTick(() => {
      proxy.$refs?.formRef?.clearValidate?.();
   });
}
const getProductOptions = () => {
  productTreeList().then((res) => {
  return productTreeList().then((res) => {
    productOptions.value = convertIdToValue(res);
      return productOptions.value;
  });
};
const getModels = (value) => {
@@ -323,7 +377,7 @@
  proxy.$refs.formRef.validate(valid => {
    if (valid) {
      form.value.inspectType = 1
         const processName = form.value.process || '';
         // const processName = form.value.process || '';
         if (operationType.value === "add") {
            tableData.value.forEach((item) => {
               delete item.id
@@ -331,7 +385,7 @@
         }
         const data = {
            ...form.value, 
            process: processName, // 保留 process 字段以兼容后端
            // process: processName, // 保留 process 字段以兼容后端
            qualityInspectParams: tableData.value
         }
      if (operationType.value === "add") {
@@ -354,11 +408,11 @@
      tableData.value = [];
      return;
   }
   const processName = form.value.process || '';
   // const processName = form.value.process || '';
   let params = {
      productId: currentProductId.value,
      inspectType: 1,
      process: processName
      // process: processName
   }
   qualityInspectDetailByProductId(params).then(res => {
      // 保存下拉框选项数据