From 5e87e96a6fc0a33a718fdca499bdff1c43c44a46 Mon Sep 17 00:00:00 2001 From: wxl Date: Thu, 21 May 2026 19:44:21 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E6=9B=B4=E6=96=B0=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E6=A3=80=E6=B5=8B=E6=A8=A1=E5=9D=97=E9=A2=86=E5=9F=9F=E7=9F=A5?= =?UTF-8?q?=E8=AF=86=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lab-service/lab-lims/AGENTS.md | 156 ++++++++++++++++++ .../system/user/config/RedissonConfig.java | 2 +- 2 files changed, 157 insertions(+), 1 deletion(-) diff --git a/lab-service/lab-lims/AGENTS.md b/lab-service/lab-lims/AGENTS.md index a5c640d..bc98857 100644 --- a/lab-service/lab-lims/AGENTS.md +++ b/lab-service/lab-lims/AGENTS.md @@ -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` | 留样处理 | diff --git a/lab-service/lab-user/src/main/java/org/springblade/system/user/config/RedissonConfig.java b/lab-service/lab-user/src/main/java/org/springblade/system/user/config/RedissonConfig.java index 4202c2b..fc37bc2 100644 --- a/lab-service/lab-user/src/main/java/org/springblade/system/user/config/RedissonConfig.java +++ b/lab-service/lab-user/src/main/java/org/springblade/system/user/config/RedissonConfig.java @@ -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);