| | |
| | | </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> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="检测单位:" |
| | | prop="checkCompany"> |
| | | <el-input v-model="form.checkCompany" |
| | |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="检测结果:" |
| | | prop="checkResult"> |
| | | <el-select v-model="form.checkResult" :disabled="isViewMode"> |
| | | <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> |
| | |
| | | qualifiedQuantity: "", |
| | | unqualifiedQuantity: "", |
| | | checkCompany: "", |
| | | checkResult: "", |
| | | isSampling: 0, |
| | | samplingQuantity: "", |
| | | isStockIn: 0, |
| | | }, |
| | | rules: { |
| | | checkTime: [{ required: true, message: "请输入", trigger: "blur" }], |
| | |
| | | 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 || {}; |
| | |
| | | unit: "", |
| | | quantity: "", |
| | | checkCompany: "", |
| | | checkResult: "", |
| | | isSampling: 0, |
| | | samplingQuantity: "", |
| | | isStockIn: 0, |
| | | }; |
| | | testStandardOptions.value = []; |
| | | tableData.value = []; |
| | |
| | | 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) { |
| | |
| | | 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); |
| | |
| | | // 先加载指标选项 |
| | | let params = { |
| | | productId: currentProductId.value, |
| | | productModelId: form.value.productModelId || undefined, |
| | | inspectType: 1, |
| | | process: form.value.process || "", |
| | | }; |
| | |
| | | modelOptions.value.find(item => item.id == value)?.model || ""; |
| | | form.value.unit = |
| | | modelOptions.value.find(item => item.id == value)?.unit || ""; |
| | | // 规格型号变化后按 产品+规格型号 重新过滤可选指标 |
| | | getList(value); |
| | | }; |
| | | |
| | | const handleQualifiedQuantityChange = (value) => { |
| | |
| | | } |
| | | }); |
| | | }; |
| | | const getList = () => { |
| | | const getList = (modelId) => { |
| | | if (!currentProductId.value) { |
| | | testStandardOptions.value = []; |
| | | tableData.value = []; |
| | |
| | | const processName = form.value.process || ""; |
| | | let params = { |
| | | productId: currentProductId.value, |
| | | productModelId: modelId ?? form.value.productModelId ?? undefined, |
| | | inspectType: 1, |
| | | process: processName, |
| | | }; |
| | |
| | | tableData.value = res.data; |
| | | }); |
| | | }; |
| | | // 是否抽检切换 |
| | | const handleSamplingChange = (value) => { |
| | | if (value !== 1) { |
| | | form.value.samplingQuantity = ""; |
| | | nextTick(() => { |
| | | proxy.$refs?.formRef?.clearValidate?.("samplingQuantity"); |
| | | }); |
| | | } |
| | | }; |
| | | // 关闭弹框 |
| | | const closeDia = () => { |
| | | proxy.resetForm("formRef"); |
| | |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .sampling-radio-group { |
| | | height: 32px; |
| | | } |
| | | |
| | | .stock-in-tip { |
| | | margin-left: 12px; |
| | | font-size: 12px; |
| | | color: #909399; |
| | | } |
| | | </style> |