You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

346 lines
16 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

质检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); // 设置租户上下文
```