docs(qms): 重命名文件 qc通用模块.md 为 qms.md,更新质检模块文档并添加完整业务流程说明

- 重命名文件 qc通用模块.md 为 qms.md
- 添加页面分类与检测类型对应关系说明
- 新增质检任务生成流程详细说明
- 添加快照机制设计原理说明
- 新增质检结果判定逻辑说明
- 添加不合格品评审流程详细说明
- 新增核心表字段详解包括主表、结果表、模板表和检测项表
- 添加跨服务调用说明和Dubbo租户传递方法
- 完善检测类型字典和业务场景说明
master
zangch@mesnac.com 3 days ago
parent 906bc8adc1
commit e75762694e

@ -1,112 +0,0 @@
质检qms模块通用模块版本只关注qc_inspection_item、qc_inspection_item_category、qc_inspection_main、qc_inspection_main_file_relation、qc_inspection_result、qc_inspection_template、qc_template_item、qc_unqualified_record、qc_unqualified_review
**QMS质检模块** - 仅关注以下核心数据表:
- `qc_inspection_item` - 检验项目
- `qc_inspection_item_category` - 检验项目分类
- `qc_inspection_main` - 检验单主表
- `qc_inspection_main_file_relation` - 检验单附件关联
- `qc_inspection_result` - 检验结果
- `qc_inspection_template` - 检验模板
- `qc_template_item` - 模板检验项
- `qc_unqualified_record` - 不合格品记录
- `qc_unqualified_review` - 不合格品评审
#### QMS模块主子表关系详解
```
qc_inspection_type (检测类型)
qc_inspection_item_category (检测项目分类) ←→ qc_inspection_item (检测项定义)
↓ ↓
│ │
qc_inspection_template (检验模板) ←→ qc_template_item (模板检验项)
↓ │
│ │
qc_inspection_main (检验单主表) ←───────────────────┘
qc_inspection_result (检验结果)
qc_inspection_main (检验单主表) → [产生不合格] → qc_unqualified_review (不合格评审)
qc_unqualified_record (不合格记录)
```
**主子表对**:
| 主表 | 子表 | 关联字段 | 说明 |
|-----|-----|---------|-----|
| `qc_inspection_template` | `qc_template_item` | `templateId` | 检验模板包含多个检测项 |
| `qc_inspection_main` | `qc_inspection_result` | `inspectionId` | 检验单包含多个检验结果 |
| `qc_unqualified_review` | `qc_unqualified_record` | `reviewId` | 不合格评审包含多个评审记录 |
**基础数据关联**:
| 表 | 关联表 | 关联字段 | 说明 |
|---|--------|---------|-----|
| `qc_inspection_item` | `qc_inspection_item_category` | `categoryId` | 检验项目归属分类 |
| `qc_inspection_item` | `qc_inspection_type` | `inspectionType` | 检验项目归属类型 |
| `qc_inspection_main` | `qc_inspection_template` | `templateId` | 检验单引用模板 |
| `qc_inspection_result` | `qc_inspection_item` | `itemId` | 检验结果关联检测项定义 |
**关键设计特点**:
1. **模板驱动**: 检验单关联模板,模板包含多个检测项定义
2. **级联继承**: 检验结果从检测项定义继承标准值、上下限等规格参数
3. **主子分离**: 主表记录总体信息(单号、物料、数量),子表记录明细(每个检测项的检测结果)
4. **不合格评审**: 当检验结果不合格时,触发评审流程,生成评审主表及记录子表
---
## 质检模板匹配策略(核心业务规则)
**生成质检任务时按以下4级降级优先级自动匹配模板**
```
┌─────────────────────────────────────────────────────────────┐
│ 质检模板匹配策略 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 第1级物料 + 工位 + 工序 + 检测类型(精确匹配) │
│ ↓ 未找到 │
│ 第2级物料 + 工位 + 检测类型 │
│ ↓ 未找到 │
│ 第3级物料 + 检测类型 │
│ ↓ 未找到 │
│ 第4级通用模板仅检测类型 + isDefault=1
│ ↓ 未找到 → 抛出异常:"无可用检测模板" │
│ │
└─────────────────────────────────────────────────────────────┘
```
### 匹配条件说明
| 优先级 | 匹配条件 | 说明 | 业务场景 |
|-------|---------|------|---------|
| 1 | 物料 + 工位 + 工序 + 检测类型 | 最精确匹配 | 某物料在特定工位/工序有特殊质检要求 |
| 2 | 物料 + 工位 + 检测类型 | 特定工位(不限工序) | 某物料在特定工位的质检要求统一 |
| 3 | 物料 + 检测类型 | 特定物料(不限工位/工序) | 某物料的质检要求在任何工位/工序都一致 |
| 4 | 通用模板(仅检测类型) | 兜底方案 | 该检测类型的默认质检方案 |
### 检测类型字典
| 代码 | 检测类型 | 说明 |
|------|---------|------|
| 0 | 首检 | 生产开始前首批产品的检验 |
| 1 | 专检 | 专职检验员的检验 |
| 2 | 自检 | 操作工自己检验 |
| 3 | 互检 | 相互检验(上下工序互检) |
| 4 | 原材料检 | 原材料入库检验 |
| 5 | 抽检 | 抽样检验 |
| 6 | 成品检 | 成品检验 |
| 7 | 入库检 | 产品入库前的检验 |
### 通用模板规则
**定义**
- **通用模板**:不绑定具体物料、工序或工位,仅按检测类型适用的默认质检方案
- **标识字段**`is_default`0否/1是
**约束规则**
1. **唯一性**:每种检测类型只能有一个通用模板
2. **互斥性**:通用模板不能同时绑定物料、工序或工位
3. **校验方式**应用层校验Service层代码校验非数据库约束

@ -0,0 +1,345 @@
质检qms模块通用模块版本只关注qc_inspection_item、qc_inspection_item_category、qc_inspection_main、qc_inspection_main_file_relation、qc_inspection_result、qc_inspection_template、qc_template_item、qc_unqualified_record、qc_unqualified_review
**QMS质检模块** - 仅关注以下核心数据表:
- `qc_inspection_item` - 检验项目
- `qc_inspection_item_category` - 检验项目分类
- `qc_inspection_main` - 检验单主表
- `qc_inspection_main_file_relation` - 检验单附件关联
- `qc_inspection_result` - 检验结果
- `qc_inspection_template` - 检验模板
- `qc_template_item` - 模板检验项
- `qc_unqualified_record` - 不合格品记录
- `qc_unqualified_review` - 不合格品评审
#### QMS模块主子表关系详解
```
qc_inspection_type (检测类型)
qc_inspection_item_category (检测项目分类) ←→ qc_inspection_item (检测项定义)
↓ ↓
│ │
qc_inspection_template (检验模板) ←→ qc_template_item (模板检验项)
↓ │
│ │
qc_inspection_main (检验单主表) ←───────────────────┘
qc_inspection_result (检验结果)
qc_inspection_main (检验单主表) → [产生不合格] → qc_unqualified_review (不合格评审)
qc_unqualified_record (不合格记录)
```
**主子表对**:
| 主表 | 子表 | 关联字段 | 说明 |
|-----|-----|---------|-----|
| `qc_inspection_template` | `qc_template_item` | `templateId` | 检验模板包含多个检测项 |
| `qc_inspection_main` | `qc_inspection_result` | `inspectionId` | 检验单包含多个检验结果 |
| `qc_unqualified_review` | `qc_unqualified_record` | `reviewId` | 不合格评审包含多个评审记录 |
**基础数据关联**:
| 表 | 关联表 | 关联字段 | 说明 |
|---|--------|---------|-----|
| `qc_inspection_item` | `qc_inspection_item_category` | `categoryId` | 检验项目归属分类 |
| `qc_inspection_item` | `qc_inspection_type` | `inspectionType` | 检验项目归属类型 |
| `qc_inspection_main` | `qc_inspection_template` | `templateId` | 检验单引用模板 |
| `qc_inspection_result` | `qc_inspection_item` | `itemId` | 检验结果关联检测项定义 |
**关键设计特点**:
1. **模板驱动**: 检验单关联模板,模板包含多个检测项定义
2. **级联继承**: 检验结果从检测项定义继承标准值、上下限等规格参数
3. **主子分离**: 主表记录总体信息(单号、物料、数量),子表记录明细(每个检测项的检测结果)
4. **不合格评审**: 当检验结果不合格时,触发评审流程,生成评审主表及记录子表
---
## 质检模板匹配策略(核心业务规则)
**生成质检任务时按以下4级降级优先级自动匹配模板**
```
┌─────────────────────────────────────────────────────────────┐
│ 质检模板匹配策略 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 第1级物料 + 工位 + 工序 + 检测类型(精确匹配) │
│ ↓ 未找到 │
│ 第2级物料 + 工位 + 检测类型 │
│ ↓ 未找到 │
│ 第3级物料 + 检测类型 │
│ ↓ 未找到 │
│ 第4级通用模板仅检测类型 + isDefault=1
│ ↓ 未找到 → 抛出异常:"无可用检测模板" │
│ │
└─────────────────────────────────────────────────────────────┘
```
### 匹配条件说明
| 优先级 | 匹配条件 | 说明 | 业务场景 |
|-------|---------|------|---------|
| 1 | 物料 + 工位 + 工序 + 检测类型 | 最精确匹配 | 某物料在特定工位/工序有特殊质检要求 |
| 2 | 物料 + 工位 + 检测类型 | 特定工位(不限工序) | 某物料在特定工位的质检要求统一 |
| 3 | 物料 + 检测类型 | 特定物料(不限工位/工序) | 某物料的质检要求在任何工位/工序都一致 |
| 4 | 通用模板(仅检测类型) | 兜底方案 | 该检测类型的默认质检方案 |
### 检测类型字典
| 代码 | 检测类型 | 说明 |
|------|---------|------|
| 0 | 首检 | 生产开始前首批产品的检验 |
| 1 | 专检 | 专职检验员的检验 |
| 2 | 自检 | 操作工自己检验 |
| 3 | 互检 | 相互检验(上下工序互检) |
| 4 | 原材料检 | 原材料入库检验 |
| 5 | 抽检 | 抽样检验 |
| 6 | 成品检 | 成品检验 |
| 7 | 入库检 | 产品入库前的检验 |
### 通用模板规则
**定义**
- **通用模板**:不绑定具体物料、工序或工位,仅按检测类型适用的默认质检方案
- **标识字段**`is_default`0否/1是
**约束规则**
1. **唯一性**:每种检测类型只能有一个通用模板
2. **互斥性**:通用模板不能同时绑定物料、工序或工位
3. **校验方式**应用层校验Service层代码校验非数据库约束
---
## 页面分类与检测类型对应关系
**前端路由参数映射**
| 路由参数 | 页面名称 | 查询参数 | 包含的检测类型 |
|---------|---------|---------|---------------|
| `inspectionType=1` | 产品检测 | `qcInspectionTypes=['0','1','3','5','6']` | 首检、专检、互检、抽检、成品检 |
| `inspectionType=2` | 原材料检测 | `qcInspectionType='4'` | 原材料检 |
| `inspectionType=3` | 入库检测 | `qcInspectionType='7'` | 入库检 |
**注意**
- 前端使用 `qcInspectionType`(单值)或 `qcInspectionTypes`(多值)查询
- 后端通过 `qc_inspection_type.qc_inspection_type` 字典字段过滤
- **不要**使用 `inspectionType`Long 类型的 typeId 主键)进行分类查询
---
## 质检任务生成流程
### 触发方式
| 触发来源 | 接口路径 | 说明 |
|---------|---------|------|
| 上位机HMI | `POST /hmi/qcInspectionTask` | 无登录,需模拟登录传递租户 |
| PDA | `POST /pda/createInspectionTask` | 已登录用户 |
| 前端手工创建 | `POST /qms/QcInspectionMain` | 已登录用户 |
### 生成流程
```
┌─────────────────────────────────────────────────────────────────────┐
│ 质检任务生成流程 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 1. 接收请求参数(物料编码、工位、检测类型等) │
│ ↓ │
│ 2. 参数校验(物料编码、检测类型必填) │
│ ↓ │
│ 3. 工位名称 → 工位编码(如需要) │
│ ↓ │
│ 4. 匹配质检模板4级降级匹配策略
│ ↓ 未找到 → 抛出异常 │
│ 5. 调用编码规则服务生成质检单号 │
│ ↓ │
│ 6. 创建质检主表记录qc_inspection_main
│ ↓ │
│ 7. 根据模板检测项qc_template_item生成质检结果子表 │
qc_inspection_result- 快照模式 │
│ ↓ │
│ 8. 返回质检单号 │
│ │
└─────────────────────────────────────────────────────────────────────┘
```
### 快照机制
质检结果子表(`qc_inspection_result`)采用**快照模式**存储检测项信息:
| 快照字段 | 来源 | 说明 |
|---------|------|------|
| `itemCode` | `qc_template_item.item_code` | 检测项编码 |
| `itemName` | `qc_template_item.item_name` | 检测项名称 |
| `standardValue` | `qc_template_item.standard_value` | 标准值 |
| `upperLimit` | `qc_template_item.upper_limit` | 控制上限 |
| `lowerLimit` | `qc_template_item.lower_limit` | 控制下限 |
| `detectType` | `qc_template_item.detect_type` | 检测方式0定性/1定量 |
| `controlType` | `qc_template_item.control_type` | 控制类型0手动/1自动 |
**设计目的**:模板修改后不影响已创建的历史检验单数据完整性。
---
## 质检结果判定逻辑
### 单项检测结果判定
| 检测方式 | 判定规则 | 结果值 |
|---------|---------|--------|
| 定量检测 | `lowerLimit ≤ detectValue ≤ upperLimit` → 合格 | 0合格/1不合格/2未判定 |
| 定性检测 | 人工选择合格/不合格 | 0合格/1不合格/2未判定 |
### 主表结果汇总
```
IF (所有子项 detectResult = 0) THEN
主表 result = 0 (合格)
ELSE IF (任一子项 detectResult = 1) THEN
主表 result = 1 (不合格)
ELSE
主表 result = 2 (待判定)
```
### 状态流转
| 状态值 | 状态名称 | 说明 |
|-------|---------|------|
| 0 | 未处理 | 初始状态,等待检验 |
| 1 | 已完成 | 检验完成 |
---
## 不合格品评审流程
### 触发条件
当质检主表 `result = 1`(不合格)时,可触发不合格品评审流程。
### 评审结果类型
| 代码 | 评审结果 | 后续处理 |
|------|---------|---------|
| 0 | 报废 | 物料报废处理 |
| 1 | 返工 | 返回生产重新加工 |
| 2 | 退货 | 退回供应商 |
| 3 | 流转 | 继续流转到下工序 |
| 4 | 让步接收 | 降级使用或特批放行 |
### 评审流程
```
┌─────────────────────────────────────────────────────────────────────┐
│ 不合格品评审流程 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 质检结果不合格result=1
│ ↓ │
│ 创建不合格品评审单qc_unqualified_review
│ ↓ │
│ 启动工作流Warm-Flow
│ ↓ │
│ 评审人进行评审,选择评审结果 │
│ ↓ │
│ 创建评审记录qc_unqualified_record
│ ↓ │
│ 根据评审结果执行后续处理 │
│ │
└─────────────────────────────────────────────────────────────────────┘
```
---
## 核心表字段详解
### qc_inspection_main质检主表
| 字段 | 类型 | 说明 |
|------|------|------|
| `inspection_id` | Long | 主键雪花ID |
| `inspection_no` | String | 质检单号(编码规则生成) |
| `template_id` | Long | 关联模板ID |
| `material_code` | String | 物料编码 |
| `material_name` | String | 物料名称 |
| `inspection_type` | Long | 检测类型ID关联qc_inspection_type.type_id |
| `inspection_qty` | BigDecimal | 质检数量 |
| `qualified_qty` | BigDecimal | 合格数 |
| `unqualified_qty` | BigDecimal | 不合格数 |
| `result` | String | 质检结果0合格/1不合格/2待判定 |
| `status` | String | 单据状态0未处理/1完成 |
| `production_order` | String | 业务来源单号 |
| `batch_no` | String | 批次号 |
| `barcode` | String | 条码号 |
### qc_inspection_result质检结果子表
| 字段 | 类型 | 说明 |
|------|------|------|
| `result_id` | Long | 主键雪花ID |
| `inspection_id` | Long | 关联质检主表ID |
| `item_id` | Long | 关联检测项ID |
| `detect_result` | String | 检测结果0合格/1不合格/2未判定 |
| `detect_value` | BigDecimal | 定量检测值 |
| `spec_inspection` | String | 规格质检值(定性检测) |
| `problem_detail` | String | 不合格明细描述 |
| `detect_type` | String | 检测方式0定性/1定量【快照】 |
| `standard_value` | BigDecimal | 标准值【快照】 |
| `upper_limit` | BigDecimal | 控制上限【快照】 |
| `lower_limit` | BigDecimal | 控制下限【快照】 |
### qc_inspection_template检验模板
| 字段 | 类型 | 说明 |
|------|------|------|
| `template_id` | Long | 主键雪花ID |
| `template_code` | String | 模板编码 |
| `template_name` | String | 模板名称 |
| `material_code` | String | 物料编码(可空) |
| `type_id` | Long | 检测类型ID |
| `station_code` | String | 工位编码(可空) |
| `process_code` | String | 工序编码(可空) |
| `is_default` | String | 是否通用模板0否/1是 |
### qc_inspection_item检测项定义
| 字段 | 类型 | 说明 |
|------|------|------|
| `item_id` | Long | 主键雪花ID |
| `item_code` | String | 检测项编码 |
| `item_name` | String | 检测项名称 |
| `category_id` | Long | 检测项类别ID |
| `inspection_type` | Long | 检测类型ID |
| `detect_type` | String | 检测方式0定性/1定量 |
| `control_type` | String | 控制类型0手动/1自动 |
| `standard_value` | BigDecimal | 标准值 |
| `upper_limit` | BigDecimal | 控制上限 |
| `lower_limit` | BigDecimal | 控制下限 |
---
## 跨服务调用说明
### 编码规则服务
| 调用场景 | 方法 | 编码规则编码 |
|---------|------|-------------|
| 生成质检单号 | `remoteCodeRuleService.selectCodeRuleCodeWithTenant("3")` | 3 |
**注意**:上位机调用时需使用 `selectCodeRuleCodeWithTenant` 方法,通过 `RpcContext.setAttachment("tenantId", ...)` 传递租户信息。
### Dubbo 租户传递
```java
// Consumer 端(上位机服务)
StpUtil.login(userId, "login"); // 模拟登录
TenantHelper.setDynamic(tenantId); // 设置本地租户
RpcContext.getContext().setAttachment("tenantId", tenantId); // 传递给远程服务
// Provider 端(编码规则服务)
String tenantId = RpcContext.getContext().getAttachment("tenantId");
TenantHelper.setDynamic(tenantId); // 设置租户上下文
```
Loading…
Cancel
Save