You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
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)
- 流程:
- 实验员领取任务 →
receiveSubmit() → isDistribute=1, lockBy 锁定人
- 输入检测结果 → 原始记录、温湿度、仪器、试剂、图片
- 支持多批次检测(
ExamineResult.batch)
- 支持撤回领取(
receiveRevoke())
- 提交后更新样品所在位置(
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():
- 当前科室检测完成 → 通过
ETask.flowTo 找到下游科室
- 更新当前科室所有检验的
simpleCurrPlace 为科室名称
- 更新下游科室对应检验记录,将
simpleCurrPlace 设置为当前科室(物理流转到下游)
- 记录
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 |
留样处理 |