gongchunyi
7 天以前 4dee4cb5b31a7f1dcd2c7b3d72f74b78d2fe3f29
src/views/qualityManagement/processInspection/components/formDia.vue
@@ -1,7 +1,7 @@
<template>
  <div>
    <el-dialog v-model="dialogFormVisible"
               :title="operationType === 'add' ? '新增过程检验' : '编辑过程检验'"
               :title="operationType === 'add' ? '新增过程检验' : operationType === 'view' ? '查看过程检验' : '编辑过程检验'"
               width="70%"
               @close="closeDia">
      <el-form :model="form"
@@ -16,7 +16,7 @@
              <el-select v-model="form.process"
                         placeholder="请选择工序"
                         clearable
                         :disabled="processQuantityDisabled"
                         :disabled="isViewMode || processQuantityDisabled"
                         style="width: 100%">
                <el-option v-for="item in processList"
                           :key="item.name"
@@ -35,7 +35,7 @@
                              @change="getModels"
                              :data="productOptions"
                              :render-after-expand="false"
                              :disabled="operationType === 'edit'"
                              :disabled="isViewMode || operationType === 'edit'"
                              style="width: 100%" />
            </el-form-item>
          </el-col>
@@ -47,7 +47,7 @@
              <el-select v-model="form.productModelId"
                         placeholder="请选择"
                         clearable
                         :disabled="operationType === 'edit'"
                         :disabled="isViewMode || operationType === 'edit'"
                         filterable
                         readonly
                         @change="handleChangeModel">
@@ -65,7 +65,8 @@
                         placeholder="请选择指标"
                         clearable
                         @change="handleTestStandardChange"
                         style="width: 100%">
                         style="width: 100%"
                         :disabled="isViewMode">
                <el-option v-for="item in testStandardOptions"
                           :key="item.id"
                           :label="item.standardName || item.standardNo"
@@ -93,7 +94,7 @@
                               placeholder="请输入"
                               clearable
                               :precision="2"
                               :disabled="processQuantityDisabled" />
                               :disabled="isViewMode || processQuantityDisabled" />
            </el-form-item>
          </el-col>
        </el-row>
@@ -108,7 +109,8 @@
                               placeholder="请输入"
                               clearable
                               :precision="2"
                               @change="handleQualifiedQuantityChange" />
                               @change="handleQualifiedQuantityChange"
                               :disabled="isViewMode" />
            </el-form-item>
          </el-col>
          <el-col :span="12">
@@ -121,7 +123,50 @@
                               placeholder="请输入"
                               clearable
                               :precision="2"
                               @change="handleUnqualifiedQuantityChange" />
                               @change="handleUnqualifiedQuantityChange"
                               :disabled="isViewMode" />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="是否抽检:"
                          prop="isSampling">
              <el-radio-group v-model="form.isSampling"
                              class="sampling-radio-group"
                              :disabled="isViewMode"
                              @change="handleSamplingChange">
                <el-radio-button :label="1">是</el-radio-button>
                <el-radio-button :label="0">否</el-radio-button>
              </el-radio-group>
            </el-form-item>
          </el-col>
          <el-col :span="12"
                  v-if="form.isSampling === 1">
            <el-form-item label="抽检数量:"
                          prop="samplingQuantity">
              <el-input-number :step="0.01"
                               :min="0"
                               style="width: 100%"
                               v-model="form.samplingQuantity"
                               placeholder="请输入"
                               clearable
                               :precision="2"
                               :disabled="isViewMode" />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30"
                v-if="operationType === 'edit'">
          <el-col :span="12">
            <el-form-item label="是否入库:"
                          prop="isStockIn">
              <el-switch v-model="form.isStockIn"
                         :active-value="1"
                         :inactive-value="0"
                         active-text="是"
                         inactive-text="否" />
              <span class="stock-in-tip">选择“是”将生成入库记录和库存,选择“否”只保存质检记录</span>
            </el-form-item>
          </el-col>
        </el-row>
@@ -131,20 +176,13 @@
                          prop="checkCompany">
              <el-input v-model="form.checkCompany"
                        placeholder="请输入"
                        clearable />
                        clearable
                        :disabled="isViewMode" />
            </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-option label="部分合格"
                           value="部分合格" />
              </el-select>
            <el-form-item label="合格率:">
              <el-tag :type="passRateTagType">{{ passRateDisplayText }}</el-tag>
            </el-form-item>
          </el-col>
        </el-row>
@@ -154,7 +192,8 @@
                          prop="checkName">
              <el-select v-model="form.checkName"
                         placeholder="请选择"
                         clearable>
                         clearable
                         :disabled="isViewMode">
                <el-option v-for="item in userList"
                           :key="item.nickName"
                           :label="item.nickName"
@@ -171,7 +210,8 @@
                              value-format="YYYY-MM-DD"
                              format="YYYY-MM-DD"
                              clearable
                              style="width: 100%" />
                              style="width: 100%"
                              :disabled="isViewMode" />
            </el-form-item>
          </el-col>
        </el-row>
@@ -183,14 +223,18 @@
                height="400">
        <template #slot="{ row }">
          <el-input v-model="row.testValue"
                    clearable />
                    clearable
                    :disabled="isViewMode" />
        </template>
      </PIMTable>
      <template #footer>
        <div class="dialog-footer">
          <el-button type="primary"
                     @click="submitForm">确认</el-button>
          <el-button @click="closeDia">取消</el-button>
          <template v-if="!isViewMode">
            <el-button type="primary"
                       @click="submitForm">确认</el-button>
            <el-button @click="closeDia">取消</el-button>
          </template>
          <el-button v-else @click="closeDia">关闭</el-button>
        </div>
      </template>
    </el-dialog>
@@ -240,7 +284,9 @@
      qualifiedQuantity: "",
      unqualifiedQuantity: "",
      checkCompany: "",
      checkResult: "",
      isSampling: 0,
      samplingQuantity: "",
      isStockIn: 0,
    },
    rules: {
      checkTime: [{ required: true, message: "请输入", trigger: "blur" }],
@@ -254,11 +300,45 @@
      qualifiedQuantity: [{ required: true, message: "请输入", trigger: "blur" }],
      unqualifiedQuantity: [{ required: true, message: "请输入", trigger: "blur" }],
      checkCompany: [{ required: false, message: "请输入", trigger: "blur" }],
      checkResult: [{ required: true, message: "请输入", trigger: "change" }],
      isSampling: [{ required: true, message: "请选择是否抽检", trigger: "change" }],
      samplingQuantity: [{ required: true, message: "请输入抽检数量", trigger: "blur" }],
    },
  });
  const userList = ref([]);
  const { form, rules } = toRefs(data);
  // 是否为查看模式
  const isViewMode = computed(() => operationType.value === 'view');
  const passRateValue = computed(() => {
    const fromApi = form.value.passRate;
    if (fromApi != null && fromApi !== '') {
      const n = Number(fromApi);
      if (!Number.isNaN(n)) return n;
    }
    const qualified = Number(form.value.qualifiedQuantity) || 0;
    const unqualified = Number(form.value.unqualifiedQuantity) || 0;
    const total = qualified + unqualified;
    if (!total || total === 0) return null;
    return (qualified / total) * 100;
  });
  const passRateDisplayText = computed(() => {
    const params = passRateValue.value;
    if (params == null || params === '') return '—';
    const n = Number(params);
    if (Number.isNaN(n)) return '—';
    return `${n.toFixed(2)}%`;
  });
  const passRateTagType = computed(() => {
    const params = passRateValue.value;
    if (params == null || params === '') return 'info';
    const n = Number(params);
    if (Number.isNaN(n)) return 'info';
    if (n >= 100) return 'success';
    if (n >= 90) return 'warning';
    return 'danger';
  });
  // 编辑时:productMainId 或 purchaseLedgerId 任一有值则工序、数量置灰
  const processQuantityDisabled = computed(() => {
    const v = form.value || {};
@@ -326,17 +406,21 @@
      unit: "",
      quantity: "",
      checkCompany: "",
      checkResult: "",
      isSampling: 0,
      samplingQuantity: "",
      isStockIn: 0,
    };
    testStandardOptions.value = [];
    tableData.value = [];
    // 先确保产品树已加载,否则编辑时产品/规格型号无法反显
    await getProductOptions();
    if (operationType.value === "edit") {
    if (operationType.value === "edit" || operationType.value === "view") {
      // 先保存 testStandardId,避免被清空
      const savedTestStandardId = row.testStandardId;
      // 先设置表单数据,但暂时清空 testStandardId,等选项加载完成后再设置
      form.value = { ...row, testStandardId: "" };
      const { passRate, ...rowWithoutPassRate } = row;
      form.value = { ...rowWithoutPassRate, testStandardId: "" };
      // 编辑时"是否入库"默认否,仅修改质检记录
      form.value.isStockIn = 0;
      currentProductId.value = row.productId || 0;
      // 关键:编辑时加载规格型号下拉选项,才能反显 productModelId
      if (currentProductId.value) {
@@ -345,7 +429,11 @@
          modelOptions.value = res || [];
          // 同步回填 model / unit(有些接口返回的 row 里可能没带全)
          if (form.value.productModelId) {
            handleChangeModel(form.value.productModelId);
            const selectedModel = modelOptions.value.find(item => item.id == form.value.productModelId);
            if (selectedModel) {
              form.value.model = selectedModel.model || "";
              form.value.unit = selectedModel.unit || "";
            }
          }
        } catch (e) {
          console.error("加载规格型号失败", e);
@@ -357,6 +445,7 @@
        // 先加载指标选项
        let params = {
          productId: currentProductId.value,
          productModelId: form.value.productModelId || undefined,
          inspectType: 1,
          process: form.value.process || "",
        };
@@ -431,6 +520,8 @@
      modelOptions.value.find(item => item.id == value)?.model || "";
    form.value.unit =
      modelOptions.value.find(item => item.id == value)?.unit || "";
    // 规格型号变化后按 产品+规格型号 重新过滤可选指标
    getList(value);
  };
  const handleQualifiedQuantityChange = (value) => {
@@ -525,7 +616,7 @@
      }
    });
  };
  const getList = () => {
  const getList = (modelId) => {
    if (!currentProductId.value) {
      testStandardOptions.value = [];
      tableData.value = [];
@@ -534,6 +625,7 @@
    const processName = form.value.process || "";
    let params = {
      productId: currentProductId.value,
      productModelId: modelId ?? form.value.productModelId ?? undefined,
      inspectType: 1,
      process: processName,
    };
@@ -557,6 +649,10 @@
    getQualityTestStandardParamByTestStandardId(testStandardId)
      .then(res => {
        tableData.value = res.data || [];
        tableData.value = tableData.value.map(item => ({
          ...item,
          id: null
        }));
      })
      .catch(error => {
        console.error("获取标准参数失败:", error);
@@ -570,6 +666,15 @@
    qualityInspectParamInfo(id).then(res => {
      tableData.value = res.data;
    });
  };
  // 是否抽检切换
  const handleSamplingChange = (value) => {
    if (value !== 1) {
      form.value.samplingQuantity = "";
      nextTick(() => {
        proxy.$refs?.formRef?.clearValidate?.("samplingQuantity");
      });
    }
  };
  // 关闭弹框
  const closeDia = () => {
@@ -586,4 +691,13 @@
</script>
<style scoped>
.sampling-radio-group {
  height: 32px;
}
.stock-in-tip {
  margin-left: 12px;
  font-size: 12px;
  color: #909399;
}
</style>