1、更新项目检测模块领域知识库

feature-wangxilei-dev
wxl 1 week ago
parent 614035325e
commit 5e87e96a6f
  1. 156
      lab-service/lab-lims/AGENTS.md
  2. 2
      lab-service/lab-user/src/main/java/org/springblade/system/user/config/RedissonConfig.java

@ -49,3 +49,159 @@ org.springblade.lims/
- 无单元测试(仅有 `demo/` 空壳)
- `Scheduled` 包只有单个类 — 功能可能不完整
---
## 检验业务流程(6 阶段)
```
委托登记 → 接样 → 任务分配 → 领取与检测 → 审核与报告 → 留样处理
```
### 阶段 1: 委托登记
- **控制器:** `EntrustController` (`/entrust`)
- **实体:** `f_entrust_main`(Entrust)
- **操作:** 创建委托单,填写送检单位、样品名称数量、养殖情况、免疫情况、接样日期
- **类型:** `entrustType` = 1(委托单)/ 2(合同单)
- **前端页面:** `sampleRegister.vue`
### 阶段 2: 接样
- **控制器:** `SimpleController` (`/simple`)
- **实体:** `f_entrust_simple`(Simple)
- **操作:** 确认样品、分配检测编号(`experieNum`)、设置留样/实验样数量
- **核心字段:** `samplingDate`(接样日期)、`simpleState`(样品状态)、`isReagent`(是否留样)
- **前端页面:** `sampleRecive.vue` / `receive.vue`
### 阶段 3: 任务分配
- **控制器:** `TaskBlueprint`(任务书)+ `ETask`(子任务)
- **实体:** `f_task_blueprint` / `f_etask`
- **流程:** 委托单 → 生成任务书 → 按科室拆分子任务 → 每个子任务包含对应检验项
- **科室流转:** ETask.flowTo 指向下游科室,flowTime 记录流转日期
- **ETask.status:** 0=待领取 → 1=待检测 → 流转
### 阶段 4: 领取与检测
- **控制器:** `ExamineController` (`/examine`)
- **实体:** `f_examine`(Examine)+ `f_examine_result`(ExamineResult)
- **流程:**
1. 实验员领取任务 → `receiveSubmit()``isDistribute=1`, `lockBy` 锁定人
2. 输入检测结果 → 原始记录、温湿度、仪器、试剂、图片
3. 支持多批次检测(`ExamineResult.batch`)
4. 支持撤回领取(`receiveRevoke()`)
5. 提交后更新样品所在位置(`simpleCurrPlace`)
- **isFinished:** "-1"=待检测 → "1"=已完成
- **前端页面:** `experimentItem.vue` / `testMethod.vue` / `testBasis.vue`
### 阶段 5: 审核与报告
- **控制器:** `ExamineController` + `reportlist.vue`
- **操作:** 检测完成 → 提交审核(status=3)→ 审核通过(status=4)/ 作废(status=-1)
- **审核字段:** Entrust 记录 `organizationBy`(编制人)、`verifyBy`(审核人)、`approvalBy`(审批人)
- **报告:** `isGenreport` 控制是否生成报告
- **前端页面:** 审核相关页面 / `reportlist.vue`
### 阶段 6: 留样处理
- **控制器:** `HandleSampleController` (`/handleSample`)
- **实体:** `HandleSample`
- **操作:** 留样销毁申请与审批、样品处理登记表下载
- **打印:** `simpleHandlePrint()`(销毁申请表)、`simpleRegisterPrint()`(处理登记表)
- **前端页面:** `RetentionSample.vue` / `sampleDispose.vue`
---
## 状态机定义
### Entrust.entrustStatus
| 状态值 | 含义 | 触发操作 |
|---|---|---|
| `(新建)` | 委托单创建 | 提交委托登记 |
| `-0.5` | 待重订 | 某条检验被作废时自动触发 |
| `000` | 待领取 | 任务分配后等待领取 |
| `111` | 待检测 | 实验员已领取任务 |
| `2.1` | 流转中 | 科室间流转 |
| `3` | 待审核 | 检测完成提交审核 |
| `4` | 审核通过 | 审核通过 |
| `7` / `8` | 已完成 | 流程结束 |
| `-1` | 作废 | 审核作废 |
### Examine 字段状态
| 字段 | 值含义 |
|---|---|
| `isDistribute` | 0=未分配, 1=已分配 |
| `isFinished` | "-1"=待检测, "0"=未完成, "1"=已完成 |
| `status` | -1=作废, 0=正常, 1=审核通过 |
| `examineStatus` | 自定义检验状态 |
### ETask.status
| 值 | 含义 |
|---|---|
| 0 | 待领取 |
| 1 | 待检测 |
| (其他) | 流转中 / 已完成 |
---
## 数据模型关系
```
Entrust ──→ Simple ──→ ExamineItem
(f_entrust_main) │ (t_examine_item)
│ ├── ExamineWay (t_examine_way)
│ └── ExamineBasis (t_examine_basis)
└──→ TaskBlueprint ──→ ETask ──→ Examine ──→ ExamineResult
(f_task_blueprint) (f_etask) (f_examine) (f_examine_result)
科室流转
flowTo → 下游科室
```
### 关键约束
- `Examine.examineItemId``ExamineItem.id`(检测项目)
- `Examine.examineWayId``ExamineWay.id`(检测方法)
- `Examine.examineBasisId``ExamineBasis.id`(检测依据)
- `Examine.eTaskId``ETask.id`(所属子任务)
- `Examine.entrustId``Entrust.id`(所属委托单)
- `ExamineResult.examineId``Examine.id`(所属检验)
- `ETask.taskBlueprintId``TaskBlueprint.id`(所属任务书)
- `TaskBlueprint.entrustId``Entrust.id`(所属委托单)
- `Simple.entrustId``Entrust.id`(所属委托单)
---
## 科室流转机制
核心实现在 `ExamineServiceImpl.updateSimpleCurrPlace()`
1. 当前科室检测完成 → 通过 `ETask.flowTo` 找到下游科室
2. 更新当前科室所有检验的 `simpleCurrPlace` 为科室名称
3. 更新下游科室对应检验记录,将 `simpleCurrPlace` 设置为当前科室(物理流转到下游)
4. 记录 `ETask.flowTime` = 当前时间
---
## 业务逻辑要点
- **状态驱动流程:** 每一步修改对应字段,无统一状态机,状态值在 controller/service 中硬编码字符串比较
- **双状态体系:** `Examine.status``Entrust.entrustStatus` 是两套独立状态,修改时需联动 (如 `Examine` 作废时需回写 `Entrust.entrustStatus=-0.5`)
- **领取锁:** `Examine.lockBy` 记录锁定人,防止多人同时领取同一检验
- **支持合同单:** `entrustType=2` 时关联 `Contract``ContractSample`
- **批量操作:** 新增样品 (`insertSimples`)、修改检验 (`updateExamineBatch`) 等接口支持批量
---
## 实体与数据库表映射
| 实体类 | 表名 | 说明 |
|---|---|---|
| `Entrust` | `f_entrust_main` | 委托单主表 |
| `Simple` | `f_entrust_simple` | 样品表 |
| `Examine` | `f_examine` | 检验记录 |
| `ExamineResult` | `f_examine_result` | 检验结果 |
| `ExamineItem` | `t_examine_item` | 检验项目字典 |
| `ExamineWay` | `t_examine_way` | 检验方法字典 |
| `ExamineBasis` | `t_examine_basis` | 检验依据字典 |
| `ETask` | `f_etask` | 子任务(按科室拆分) |
| `TaskBlueprint` | `f_task_blueprint` | 任务书 |
| `HandleSample` | `f_handle_sample` | 留样处理 |

@ -33,7 +33,7 @@ public class RedissonConfig {
.setAddress("redis://" + host + ":" + port)
.setDatabase(0)
.setPingConnectionInterval(2000);
// config.useSingleServer().setPassword(password);
config.useSingleServer().setPassword(password);
config.setLockWatchdogTimeout(10000L);
try{
return Redisson.create(config);

Loading…
Cancel
Save