| | |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="检验规则" prop="inspectRule"> |
| | | <el-radio-group v-model="form.inspectRule"> |
| | | <el-radio-group v-model="form.inspectRule" :disabled="isViewMode"> |
| | | <el-radio :label="0">全检</el-radio> |
| | | <el-radio :label="1">抽检</el-radio> |
| | | </el-radio-group> |
| | |
| | | </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-radio-group v-model="form.checkResult" :disabled="isViewMode || autoJudgeResult === '不合格'"> |
| | | <el-radio label="合格">合格</el-radio> |
| | | <el-radio label="不合格">不合格</el-radio> |
| | | <el-radio label="部分合格">部分合格</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | |
| | | </el-col> |
| | | </el-row> |
| | | </el-form> |
| | | <PIMTable |
| | | rowKey="id" |
| | | :column="tableColumn" |
| | | :tableData="tableData" |
| | | :tableLoading="tableLoading" |
| | | height="400" |
| | | > |
| | | <template #slot="{ row }"> |
| | | <el-input v-model="row.testValue" clearable :disabled="isViewMode"/> |
| | | </template> |
| | | </PIMTable> |
| | | <PIMTable |
| | | rowKey="id" |
| | | :column="tableColumn" |
| | | :tableData="tableData" |
| | | :tableLoading="tableLoading" |
| | | :isShowPagination="false" |
| | | height="400" |
| | | > |
| | | <template #judgeTypeSlot="{ row }"> |
| | | <el-tag v-if="row.judgeType === '≥'" type="success">≥</el-tag> |
| | | <el-tag v-else-if="row.judgeType === '≤'" type="warning">≤</el-tag> |
| | | <el-tag v-else-if="row.judgeType === '范围'" type="info">范围</el-tag> |
| | | <el-tag v-else>文字</el-tag> |
| | | </template> |
| | | <template #isRequiredSlot="{ row }"> |
| | | <el-tag v-if="row.isRequired === 1" type="danger">是</el-tag> |
| | | <el-tag v-else type="info">否</el-tag> |
| | | </template> |
| | | <template #testValueSlot="{ row }"> |
| | | <el-input v-model="row.testValue" clearable :disabled="isViewMode" @input="handleTestValueChange(row)" /> |
| | | </template> |
| | | <template #isQualifiedSlot="{ row }"> |
| | | <template v-if="row.judgeType !== '文字描述'"> |
| | | <el-tag v-if="row.isQualified === 1" type="success">合格</el-tag> |
| | | <el-tag v-else-if="row.isQualified === 0" type="danger">不合格</el-tag> |
| | | <span v-else>-</span> |
| | | </template> |
| | | <template v-else> |
| | | <el-select v-model="row.isQualified" placeholder="请选择" size="small" :disabled="isViewMode" @change="handleTextResultChange"> |
| | | <el-option :value="1" label="合格" /> |
| | | <el-option :value="0" label="不合格" /> |
| | | </el-select> |
| | | </template> |
| | | </template> |
| | | </PIMTable> |
| | | |
| | | <div v-if="!isViewMode" style="margin-top: 16px;"> |
| | | <el-form label-width="120px"> |
| | | <el-form-item label="自动判断结果"> |
| | | <template v-if="autoJudgeResult"> |
| | | <el-tag v-if="autoJudgeResult === '合格'" type="success" size="large">合格</el-tag> |
| | | <el-tag v-else-if="autoJudgeResult === '部分合格'" type="warning" size="large">部分合格</el-tag> |
| | | <el-tag v-else type="danger" size="large">不合格</el-tag> |
| | | <span v-if="autoJudgeResult === '不合格'" style="margin-left: 10px; color: #909399;"> |
| | | (必要判断参数有不合格项,不可手动修改) |
| | | </span> |
| | | <span v-if="autoJudgeResult === '部分合格'" style="margin-left: 10px; color: #909399;"> |
| | | (必要判断参数均合格,非必要参数有不合格项,可手动选择最终结果) |
| | | </span> |
| | | </template> |
| | | <template v-else> |
| | | <el-tag type="info" size="large">需手动判断</el-tag> |
| | | <span style="margin-left: 10px; color: #909399;"> |
| | | (所有参数均为文字描述类型,请手动选择) |
| | | </span> |
| | | </template> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <template v-if="!isViewMode"> |
| | |
| | | model: "", |
| | | testStandardId: "", |
| | | unit: "", |
| | | quantity: "", |
| | | quantity: undefined, |
| | | qualifiedQuantity: "", |
| | | unqualifiedQuantity: "", |
| | | checkCompany: "", |
| | |
| | | const supplierList = ref([]); |
| | | const productOptions = ref([]); |
| | | const tableColumn = ref([ |
| | | { |
| | | label: "指标", |
| | | prop: "parameterItem", |
| | | }, |
| | | { |
| | | label: "单位", |
| | | prop: "unit", |
| | | }, |
| | | { |
| | | label: "厂家标准值", |
| | | prop: "standardValue", |
| | | }, |
| | | { |
| | | label: "内控值", |
| | | prop: "controlValue", |
| | | }, |
| | | { |
| | | label: "检验值", |
| | | prop: "testValue", |
| | | dataType: 'slot', |
| | | slot: 'slot', |
| | | }, |
| | | { label: "指标", prop: "parameterItem" }, |
| | | { label: "单位", prop: "unit" }, |
| | | { label: "厂家标准值", prop: "standardValue" }, |
| | | { label: "下限值", prop: "minValue" }, |
| | | { label: "上限值", prop: "maxValue" }, |
| | | { label: "内控值", prop: "controlValue" }, |
| | | { label: "判断类型", prop: "judgeType", dataType: 'slot', slot: 'judgeTypeSlot' }, |
| | | { label: "必要判断", prop: "isRequired", dataType: 'slot', slot: 'isRequiredSlot' }, |
| | | { label: "检验值", prop: "testValue", dataType: 'slot', slot: 'testValueSlot' }, |
| | | { label: "是否合格", prop: "isQualified", dataType: 'slot', slot: 'isQualifiedSlot' }, |
| | | ]); |
| | | const tableData = ref([]); |
| | | const tableLoading = ref(false); |
| | | const autoJudgeResult = ref(null); |
| | | const userList = ref([]); |
| | | const currentProductId = ref(0); |
| | | const testStandardOptions = ref([]); // 指标选择下拉框数据 |
| | |
| | | const openDialog = async (type, row) => { |
| | | operationType.value = type; |
| | | dialogFormVisible.value = true; |
| | | autoJudgeResult.value = null; |
| | | // 先清空表单验证状态,避免闪烁 |
| | | await nextTick(); |
| | | proxy.$refs.formRef?.clearValidate(); |
| | |
| | | |
| | | const handleQualifiedQuantityChange = (value) => { |
| | | if (value === null || value === undefined) { |
| | | form.value.qualifiedQuantity = 0; |
| | | form.value.qualifiedQuantity = undefined; |
| | | return; |
| | | } |
| | | const quantity = parseFloat(form.value.quantity) || 0; |
| | | const quantity = parseFloat(form.value.quantity); |
| | | if (isNaN(quantity) || quantity <= 0) return; |
| | | const qualified = parseFloat(value) || 0; |
| | | form.value.qualifiedQuantity = qualified > quantity?quantity:qualified; |
| | | form.value.qualifiedQuantity = Math.min(qualified, quantity); |
| | | form.value.unqualifiedQuantity = Math.max(0, quantity - qualified); |
| | | }; |
| | | |
| | | const handleUnqualifiedQuantityChange = (value) => { |
| | | if (value === null || value === undefined) { |
| | | form.value.unqualifiedQuantity = 0; |
| | | form.value.unqualifiedQuantity = undefined; |
| | | return; |
| | | } |
| | | const quantity = parseFloat(form.value.quantity) || 0; |
| | | const quantity = parseFloat(form.value.quantity); |
| | | if (isNaN(quantity) || quantity <= 0) return; |
| | | const unqualified = parseFloat(value) || 0; |
| | | form.value.unqualifiedQuantity = unqualified > quantity?quantity:unqualified; |
| | | form.value.unqualifiedQuantity = Math.min(unqualified, quantity); |
| | | form.value.qualifiedQuantity = Math.max(0, quantity - unqualified); |
| | | }; |
| | | |
| | |
| | | return newItem; |
| | | }); |
| | | } |
| | | const handleTestValueChange = (row) => { |
| | | if (isViewMode.value) return; |
| | | if (!row.testValue || !row.judgeType || row.judgeType === '文字描述') { |
| | | return; |
| | | } |
| | | const testVal = parseFloat(row.testValue); |
| | | if (isNaN(testVal)) return; |
| | | |
| | | let qualified = false; |
| | | if (row.judgeType === '≥') { |
| | | const stdVal = parseFloat(row.standardValue); |
| | | if (isNaN(stdVal)) return; |
| | | qualified = testVal >= stdVal; |
| | | } else if (row.judgeType === '≤') { |
| | | const stdVal = parseFloat(row.standardValue); |
| | | if (isNaN(stdVal)) return; |
| | | qualified = testVal <= stdVal; |
| | | } else if (row.judgeType === '范围') { |
| | | const minVal = parseFloat(row.minValue); |
| | | const maxVal = parseFloat(row.maxValue); |
| | | if (isNaN(minVal) || isNaN(maxVal)) return; |
| | | qualified = testVal >= minVal && testVal <= maxVal; |
| | | } else { |
| | | return; |
| | | } |
| | | row.isQualified = qualified ? 1 : 0; |
| | | performAutoJudgeAll(); |
| | | }; |
| | | |
| | | const handleTextResultChange = () => { |
| | | performAutoJudgeAll() |
| | | }; |
| | | |
| | | const performAutoJudgeAll = () => { |
| | | if (!tableData.value.length) return; |
| | | const allTextDesc = tableData.value.every(item => item.judgeType === '文字描述'); |
| | | if (allTextDesc) { |
| | | autoJudgeResult.value = null; |
| | | return; |
| | | } |
| | | const requiredParams = tableData.value.filter(item => item.isRequired === 1); |
| | | if (requiredParams.length === 0) { |
| | | autoJudgeResult.value = null; |
| | | return; |
| | | } |
| | | const hasUnqualified = requiredParams.some(item => item.isQualified === 0); |
| | | const allJudged = requiredParams.every(item => item.isQualified === 1 || item.isQualified === 0); |
| | | if (!allJudged) { |
| | | autoJudgeResult.value = null; |
| | | return; |
| | | } |
| | | if (hasUnqualified) { |
| | | autoJudgeResult.value = '不合格'; |
| | | form.value.checkResult = '不合格'; |
| | | return; |
| | | } |
| | | const nonRequiredUnqualified = tableData.value.filter(item => item.isRequired !== 1 && item.isQualified === 0); |
| | | if (nonRequiredUnqualified.length > 0) { |
| | | autoJudgeResult.value = '部分合格'; |
| | | form.value.checkResult = '部分合格'; |
| | | } else { |
| | | autoJudgeResult.value = '合格'; |
| | | form.value.checkResult = '合格'; |
| | | } |
| | | }; |
| | | |
| | | // 提交产品表单 |
| | | const submitForm = () => { |
| | | proxy.$refs.formRef.validate(valid => { |
| | | if (valid) { |
| | | form.value.inspectType = 2; |
| | | if (operationType.value === "add") { |
| | | 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 => { |
| | | proxy.$modal.msgSuccess("提交成功"); |
| | | closeDia(); |
| | | }); |
| | | } |
| | | performAutoJudgeAll(); |
| | | form.value.inspectType = 2; |
| | | if (operationType.value === "add") { |
| | | 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 => { |
| | | proxy.$modal.msgSuccess("提交成功"); |
| | | closeDia(); |
| | | }); |
| | | } |
| | | } |
| | | }); |
| | | } |
| | |
| | | tableData.value = []; |
| | | testStandardOptions.value = []; |
| | | form.value.testStandardId = ''; |
| | | autoJudgeResult.value = null; |
| | | dialogFormVisible.value = false; |
| | | emit('close'); |
| | | } |