质检参数项自动判断功能
涉及页面
- 质检指标维护页面(检测标准参数管理)
- 质检单填写页面(原材料检验、过程检验、出厂检验)
- 质检单详情页面
数据库变更
执行 docs/quality_auto_judge.sql 脚本,新增以下字段:
quality_test_standard_param(检测标准参数表)
| 字段 |
类型 |
说明 |
| judge_type |
VARCHAR(20) |
判断类型:大于等于/小于等于/范围/文字描述 |
| is_required |
TINYINT(1) |
是否必要判断:0-否,1-是 |
| min_value |
DECIMAL(20,4) |
范围下限值(范围类型使用) |
| max_value |
DECIMAL(20,4) |
范围上限值(范围类型使用) |
quality_inspect_param(检验记录参数表)
| 字段 |
类型 |
说明 |
| judge_type |
VARCHAR(20) |
判断类型 |
| is_required |
TINYINT(1) |
是否必要判断 |
| is_qualified |
TINYINT(1) |
单项是否合格:0-不合格,1-合格,null-未判断 |
| min_value |
DECIMAL(20,4) |
范围下限值 |
| max_value |
DECIMAL(20,4) |
范围上限值 |
quality_inspect(质检主表)
| 字段 |
类型 |
说明 |
| auto_judge_result |
VARCHAR(20) |
自动判断结果:合格/不合格/null(需手动判断) |
API
1. 单参数项自动判断
| 方法 |
路径 |
说明 |
| POST |
/quality/qualityInspect/autoJudge |
单参数项自动判断(实时调用) |
请求参数:
{
"testValue": "100",
"standardValue": "80",
"minValue": null,
"maxValue": null,
"judgeType": "大于等于"
}
| 参数 |
类型 |
必填 |
说明 |
| testValue |
String |
是 |
检验值 |
| standardValue |
String |
否 |
标准值(大于等于、小于等于类型使用) |
| minValue |
BigDecimal |
否 |
范围下限值(范围类型使用) |
| maxValue |
BigDecimal |
否 |
范围上限值(范围类型使用) |
| judgeType |
String |
是 |
判断类型:大于等于/小于等于/范围/文字描述 |
响应:
{
"code": 200,
"msg": "操作成功",
"data": {
"isQualified": true,
"message": "检验值100 >= 标准值80,合格"
}
}
2. 整体质检单参数项自动判断
| 方法 |
路径 |
说明 |
| GET |
/quality/qualityInspect/autoJudgeAll/{inspectId} |
整体质检单参数项自动判断 |
请求参数:
| 参数 |
类型 |
必填 |
说明 |
| inspectId |
Long |
是 |
质检单ID(路径参数) |
响应:
{
"code": 200,
"msg": "操作成功",
"data": {
"autoJudgeResult": "不合格",
"hasRequiredUnqualified": true,
"hasNonRequiredUnqualified": false,
"allTextDescription": false,
"paramResults": [
{
"paramId": 1,
"parameterItem": "水分含量",
"isQualified": true,
"message": "检验值12 <= 标准值15,合格",
"isRequired": true
},
{
"paramId": 2,
"parameterItem": "蛋白质含量",
"isQualified": false,
"message": "检验值18 >= 标准值20,不合格",
"isRequired": true
},
{
"paramId": 3,
"parameterItem": "外观",
"isQualified": null,
"message": "文字描述类型需手动判断",
"isRequired": false
}
]
}
}
前端修改点
1. 质检指标维护页面
表单增加字段
<el-form-item label="判断类型">
<el-select v-model="form.judgeType" placeholder="请选择判断类型" @change="handleJudgeTypeChange">
<el-option label="大于等于" value="大于等于"></el-option>
<el-option label="小于等于" value="小于等于"></el-option>
<el-option label="范围" value="范围"></el-option>
<el-option label="文字描述" value="文字描述"></el-option>
</el-select>
</el-form-item>
<el-form-item label="是否必要判断">
<el-switch v-model="form.isRequired" :active-value="1" :inactive-value="0"></el-switch>
</el-form-item>
<!-- 范围类型时显示 -->
<el-form-item label="范围下限值" v-if="form.judgeType === '范围'">
<el-input-number v-model="form.minValue" :precision="4" :min="0"></el-input-number>
</el-form-item>
<el-form-item label="范围上限值" v-if="form.judgeType === '范围'">
<el-input-number v-model="form.maxValue" :precision="4" :min="0"></el-input-number>
</el-form-item>
data 数据
data() {
return {
form: {
// ... 原有字段
judgeType: null,
isRequired: 0,
minValue: null,
maxValue: null
}
}
}
方法
methods: {
// 判断类型变更时,清空范围值
handleJudgeTypeChange(val) {
if (val !== '范围') {
this.form.minValue = null;
this.form.maxValue = null;
}
}
}
2. 质检单填写页面
参数项表格增加列
<el-table-column prop="judgeType" label="判断类型" width="100">
<template #default="{ 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 type="">文字</el-tag>
</template>
</el-table-column>
<el-table-column prop="isRequired" label="必要判断" width="80">
<template #default="{ row }">
<el-tag v-if="row.isRequired === 1" type="danger">是</el-tag>
<el-tag v-else type="info">否</el-tag>
</template>
</el-table-column>
<el-table-column prop="testValue" label="检验值" width="150">
<template #default="{ row }">
<el-input
v-model="row.testValue"
placeholder="请输入检验值"
@change="handleTestValueChange(row)"
></el-input>
</template>
</el-table-column>
<el-table-column prop="isQualified" label="是否合格" width="100">
<template #default="{ 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">
<el-option :value="1" label="合格"></el-option>
<el-option :value="0" label="不合格"></el-option>
</el-select>
</template>
</template>
</el-table-column>
整体判断结果显示
<el-form-item label="自动判断结果">
<template v-if="autoJudgeResult">
<el-tag v-if="autoJudgeResult === '合格'" type="success" size="large">合格</el-tag>
<el-tag v-else type="danger" size="large">不合格</el-tag>
<span 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-item label="最终判定" v-if="!autoJudgeResult || autoJudgeResult === '合格'">
<el-radio-group v-model="form.checkResult" :disabled="autoJudgeResult === '不合格'">
<el-radio label="合格">合格</el-radio>
<el-radio label="不合格">不合格</el-radio>
<el-radio label="部分合格">部分合格</el-radio>
</el-radio-group>
</el-form-item>
data 数据
data() {
return {
form: {
// ... 原有字段
autoJudgeResult: null
},
autoJudgeResult: null
}
}
方法
methods: {
// 检验值变更时实时自动判断
async handleTestValueChange(row) {
if (!row.testValue || !row.judgeType || row.judgeType === '文字描述') {
return;
}
try {
const res = await autoJudge({
testValue: row.testValue,
standardValue: row.standardValue,
minValue: row.minValue,
maxValue: row.maxValue,
judgeType: row.judgeType
});
if (res.code === 200) {
row.isQualified = res.data.isQualified ? 1 : 0;
this.$message.success(res.data.message);
// 触发整体判断
this.autoJudgeAll();
}
} catch (error) {
console.error('自动判断失败', error);
}
},
// 整体自动判断
async autoJudgeAll() {
try {
const res = await autoJudgeAll(this.form.id);
if (res.code === 200) {
this.autoJudgeResult = res.data.autoJudgeResult;
this.form.autoJudgeResult = res.data.autoJudgeResult;
// 更新参数项的判断结果
res.data.paramResults.forEach(item => {
const param = this.form.qualityInspectParams.find(p => p.id === item.paramId);
if (param) {
param.isQualified = item.isQualified ? 1 : (item.isQualified === false ? 0 : null);
}
});
// 如果必要判断参数不合格,自动设置检测结果
if (res.data.hasRequiredUnqualified) {
this.form.checkResult = '不合格';
}
}
} catch (error) {
console.error('整体判断失败', error);
}
}
}
3. API 请求方法
// api/quality.js
// 单参数项自动判断
export function autoJudge(data) {
return request({
url: '/quality/qualityInspect/autoJudge',
method: 'post',
data
})
}
// 整体自动判断
export function autoJudgeAll(inspectId) {
return request({
url: `/quality/qualityInspect/autoJudgeAll/${inspectId}`,
method: 'get'
})
}
判断类型说明
| 判断类型 |
符号 |
判断逻辑 |
使用字段 |
| 大于等于 |
≥ |
testValue >= standardValue |
standardValue |
| 小于等于 |
≤ |
testValue <= standardValue |
standardValue |
| 范围 | - | minValue <= testValue <= maxValue | minValue, maxValue |
| 文字描述 | - | 不自动判断,用户手动选择 | 无 |
业务逻辑说明
- 自动判断触发时机:用户填写检验值后实时自动判断
- 必要判断参数:
isRequired = 1 的参数项为必要判断参数
- 整体判断逻辑:
- 如果有任一必要判断参数不合格 → 整体判定为"不合格",禁用用户修改
- 如果所有必要判断参数都合格,但有非必要判断参数不合格 → 整体判定为"部分合格",允许用户手动选择最终结果
- 如果所有参数项都合格 → 整体判定为"合格"
- 如果全是文字描述类型 →
autoJudgeResult = null,允许用户手动选择
- 文字描述类型:不进行自动判断,由用户手动选择"合格"或"不合格"
注意事项
- 范围类型必须填写下限值和上限值,否则无法判断
- 标准值和检验值需为有效数值,否则无法判断
- 必要判断参数不合格时,最终判定强制为"不合格",不可手动修改
- 质检单提交时,系统会根据自动判断结果进行校验