diff --git a/ruoyi-modules/hwmom-qms/qc通用模块.md b/ruoyi-modules/hwmom-qms/qc通用模块.md deleted file mode 100644 index 7b29b516..00000000 --- a/ruoyi-modules/hwmom-qms/qc通用模块.md +++ /dev/null @@ -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层代码校验,非数据库约束) diff --git a/ruoyi-modules/hwmom-qms/qms.md b/ruoyi-modules/hwmom-qms/qms.md new file mode 100644 index 00000000..61a49114 --- /dev/null +++ b/ruoyi-modules/hwmom-qms/qms.md @@ -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); // 设置租户上下文 +```