# 质检参数项自动判断功能
## 涉及页面
- 质检指标维护页面(检测标准参数管理)
- 质检单填写页面(原材料检验、过程检验、出厂检验)
- 质检单详情页面
## 数据库变更
执行 `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 | 单参数项自动判断(实时调用) |
**请求参数:**
```json
{
"testValue": "100",
"standardValue": "80",
"minValue": null,
"maxValue": null,
"judgeType": "大于等于"
}
```
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| testValue | String | 是 | 检验值 |
| standardValue | String | 否 | 标准值(大于等于、小于等于类型使用) |
| minValue | BigDecimal | 否 | 范围下限值(范围类型使用) |
| maxValue | BigDecimal | 否 | 范围上限值(范围类型使用) |
| judgeType | String | 是 | 判断类型:大于等于/小于等于/范围/文字描述 |
**响应:**
```json
{
"code": 200,
"msg": "操作成功",
"data": {
"isQualified": true,
"message": "检验值100 >= 标准值80,合格"
}
}
```
### 2. 整体质检单参数项自动判断
| 方法 | 路径 | 说明 |
|------|------|------|
| GET | /quality/qualityInspect/autoJudgeAll/{inspectId} | 整体质检单参数项自动判断 |
**请求参数:**
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| inspectId | Long | 是 | 质检单ID(路径参数) |
**响应:**
```json
{
"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. 质检指标维护页面
#### 表单增加字段
```html
```
#### data 数据
```js
data() {
return {
form: {
// ... 原有字段
judgeType: null,
isRequired: 0,
minValue: null,
maxValue: null
}
}
}
```
#### 方法
```js
methods: {
// 判断类型变更时,清空范围值
handleJudgeTypeChange(val) {
if (val !== '范围') {
this.form.minValue = null;
this.form.maxValue = null;
}
}
}
```
### 2. 质检单填写页面
#### 参数项表格增加列
```html
≥
≤
范围
文字
是
否
合格
不合格
-
```
#### 整体判断结果显示
```html
合格
不合格
(必要判断参数有不合格项,不可手动修改)
需手动判断
(所有参数均为文字描述类型,请手动选择)
合格
不合格
部分合格
```
#### data 数据
```js
data() {
return {
form: {
// ... 原有字段
autoJudgeResult: null
},
autoJudgeResult: null
}
}
```
#### 方法
```js
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 请求方法
```js
// 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 |
| 文字描述 | - | 不自动判断,用户手动选择 | 无 |
## 业务逻辑说明
1. **自动判断触发时机**:用户填写检验值后实时自动判断
2. **必要判断参数**:`isRequired = 1` 的参数项为必要判断参数
3. **整体判断逻辑**:
- 如果有任一必要判断参数不合格 → 整体判定为"不合格",禁用用户修改
- 如果所有必要判断参数都合格,但有非必要判断参数不合格 → 整体判定为"部分合格",允许用户手动选择最终结果
- 如果所有参数项都合格 → 整体判定为"合格"
- 如果全是文字描述类型 → `autoJudgeResult = null`,允许用户手动选择
4. **文字描述类型**:不进行自动判断,由用户手动选择"合格"或"不合格"
## 注意事项
- 范围类型必须填写下限值和上限值,否则无法判断
- 标准值和检验值需为有效数值,否则无法判断
- 必要判断参数不合格时,最终判定强制为"不合格",不可手动修改
- 质检单提交时,系统会根据自动判断结果进行校验