|
|
|
|
# lab-lims — LIMS 核心模块
|
|
|
|
|
|
|
|
|
|
**路径:** `project_husbandry_back/lab-service/lab-lims/`
|
|
|
|
|
**包名:** `org.springblade.lims.*`
|
|
|
|
|
**规模:** 后端最大模块(约 250+ Java 源文件)
|
|
|
|
|
|
|
|
|
|
## 包结构
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
org.springblade.lims/
|
|
|
|
|
├── api/ # 内部 API DTO(3 个文件)
|
|
|
|
|
├── config/ # 模块级配置(2 个文件)
|
|
|
|
|
├── controller/ # REST 接口(47 个控制器)
|
|
|
|
|
├── demo/ # 演示/测试桩(2 个文件)
|
|
|
|
|
├── excel/ # Excel 导出处理器(13 个文件)
|
|
|
|
|
├── feign/ # Feign 客户端实现(1 个文件)
|
|
|
|
|
├── mapper/ # MyBatis-Plus Mapper(46 个文件)
|
|
|
|
|
├── Scheduled/ # 定时任务(1 个文件)
|
|
|
|
|
├── service/ # 业务逻辑(92 个文件)
|
|
|
|
|
├── tools/ # 工具类(1 个文件)
|
|
|
|
|
└── utils/ # 工具类(15 个文件)
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## 领域控制器分类
|
|
|
|
|
|
|
|
|
|
| 领域 | 关键控制器 |
|
|
|
|
|
|------|-----------|
|
|
|
|
|
| 样品/委托 | Entrust、HandleSample、RetentionSample、Simple、SimpleRel、SimpleSet、LsReservedSample |
|
|
|
|
|
| 检测/检验 | Examine、ExamineItem、ExamineResult、ExamineTask、ExamineBasis、SimpleDoExamineLog |
|
|
|
|
|
| 安全/危化品 | DangerApply、DangerApplyLog、DangerMoveLog、DangerRecoveryLog、DangerStorage |
|
|
|
|
|
| 仪器设备 | Instrument、InstrumentMaintLog、InstrumentUseLog、TemperatureControl |
|
|
|
|
|
| 试剂/实验动物 | Reagent、ReagentUseLog、ExperimentalAnimal |
|
|
|
|
|
| 质量/标准 | QualityStandard、DetermineFormula |
|
|
|
|
|
| 合同/维修 | Contract、ContractSample、RepairApplication、ScrapApplication |
|
|
|
|
|
| 环境 | EnvDict、EnvLog、DisinfectLog、SewageDischargeLog |
|
|
|
|
|
| 模板/蓝图 | Template、TaskBlueprint、LsTemplateLog |
|
|
|
|
|
| 日志/审计 | LsAuditTrailLog、LsEventLog、LsTemperatureHumidityLog |
|
|
|
|
|
| 统计/大屏 | LsDataStatistic、LargeScreen |
|
|
|
|
|
|
|
|
|
|
## 约定规范
|
|
|
|
|
|
|
|
|
|
- **CRUD**: 标准 SpringBlade 模式 controller → service(接口)→ service/impl → mapper
|
|
|
|
|
- **Excel**: 导出处理器放在 `excel/` 包下,每个实体对应一个
|
|
|
|
|
- **Mapper**: MyBatis-Plus BaseMapper 扩展,XML 映射文件在 resources 中
|
|
|
|
|
- **内部 API**: DTO 放在 `api/` 包中,仅供模块内部使用
|
|
|
|
|
- **定时任务**: `Scheduled` 包存放 @Scheduled 任务(不在 service/ 中)
|
|
|
|
|
|
|
|
|
|
## 反模式
|
|
|
|
|
|
|
|
|
|
- 无单元测试(仅有 `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` | 留样处理 |
|