# 质检参数项自动判断功能 ## 涉及页面 - 质检指标维护页面(检测标准参数管理) - 质检单填写页面(原材料检验、过程检验、出厂检验) - 质检单详情页面 ## 数据库变更 执行 `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. **文字描述类型**:不进行自动判断,由用户手动选择"合格"或"不合格" ## 注意事项 - 范围类型必须填写下限值和上限值,否则无法判断 - 标准值和检验值需为有效数值,否则无法判断 - 必要判断参数不合格时,最终判定强制为"不合格",不可手动修改 - 质检单提交时,系统会根据自动判断结果进行校验