zhaohe 3 months ago
parent
commit
0324604428
  1. 64
      doc/孵育盘管理.md
  2. 6
      doc/检测流程.md
  3. 58
      doc/耗材管理.md
  4. 183
      doc/试管及试管架管理.md
  5. 0
      doc/项目上下文管理.md
  6. 8
      src/main/java/a8k/app/hardware/type/LldType.java
  7. 7
      src/main/java/a8k/app/service/analyzer/ConsumableStateAnalyzerService.java
  8. 5
      src/main/java/a8k/app/service/mainctrl/TubeHolderSettingMgrService.java
  9. 5
      src/main/java/a8k/app/service/statemgr/ConsumablesMgrService.java
  10. 6
      src/main/java/a8k/app/service/verification/PipetteGunPerformanceValidator.java

64
doc/孵育盘管理.md

@ -0,0 +1,64 @@
```mermaid
classDiagram
%% 孵育盘状态管理器
class IncubationPlateStateMgrService {
+ IncubationSubTank getOneExpiredPlate() // 获取一个孵育完成的插槽
+ IncubatorPos takeOneIncubationIDLEPos() // 获取空闲的插槽位置
}
%% 孵育盘
class IncubationPlate {
}
%% 孵育盘反应板插槽
class IncubationSubTank {
}
%% 插槽位置
class IncubatorPos {
}
%% 插槽状态
class IncubationSubTankState {
EMPTY,//空
RESERVED,//预定
WAITING_FOR_DROP,//等待滴液
INCUBATING, //孵育中
INCUBATION_COMPLETE, //孵育完成
ERROR,//错误
}
<<enumeration>> IncubationSubTankState
IncubationSubTank "1" --> "1" IncubatorPos
IncubationSubTank "1" --> "1" IncubationSubTankState
IncubationPlate "1" --> "20" IncubationSubTank
IncubationPlateStateMgrService --> IncubationPlate
```
```mermaid
---
title: 孵育盘槽位状态变更图
---
stateDiagram-v2
[*] --> EMPTY
RESERVED --> INCUBATING: startIncubating
INCUBATING --> INCUBATION_COMPLETE: scheduled_timeout[remainTimeSec < 0]
%% 当找到一个空闲的槽位时将其状态置为预留
EMPTY --> RESERVED: takeOneIncubationIDLEPos
INCUBATION_COMPLETE --> EMPTY: reset
RESERVED --> EMPTY: reset
INCUBATING --> EMPTY: reset
```
```mermaid
classDiagram
%% 项目上下文管理器
class ProjectContextMgrService {
}
```

6
doc/检测流程.md

@ -251,7 +251,11 @@ flowchart
S14 --> S15[滴液]
%% 孵育处理
S15 --> S16[]
S15 --> S16[查询项目的孵育时间]
S16 --> S17[设置孵育开始时间和孵育时长开始孵育]
S17 --> S18[设置样本处理完成]
```

58
doc/耗材管理.md

@ -1,9 +1,23 @@
```mermaid
classDiagram
class A8kConsumableContainer
class TipContainer
class ReactionPlateContainer
class LittBottleContainer
%% 全局耗材容器
class A8kConsumableContainer
class TipContainer {
}
class ReactionPlateContainer {
}
class LittBottleContainer {
public Integer projId; //项目ID
public String projName; //项目名称
public String projShortName;//项目缩写名称
public LittleBottleConsumableType type;
public String lotId = ""; //批次号
public String color = ""; //颜色
public Integer num = 0;
public Integer reserveNum = 0;
public Boolean isInstall = false;
}
class LarBottleContainer
A8kConsumableContainer "1" --> "3" TipContainer
@ -12,7 +26,11 @@ classDiagram
A8kConsumableContainer "1" --> "6" LarBottleContainer
class ConsumablesMgrService
class ConsumablesMgrService {
+ unInstallConsumable() // 卸载耗材
+ useReserveConsumable() // 使用耗材
+ reserveConsumable() // 预留耗材
}
ConsumablesMgrService --> A8kConsumableContainer
class ConsumableInfo {
@ -21,15 +39,41 @@ classDiagram
public Integer pos; // 当前耗材信息属于哪个耗材组
}
```
```mermaid
---
title: 耗材状态更新机制
title: 耗材扫描时序图
---
sequenceDiagram
actor user
participant ConsumableScanControler
participant AppConsumablesScanService
participant GStateMgrService
participant ConsumablesScanCtrlService
user->>+ConsumableScanControler: 开始扫描
ConsumableScanControler->>+AppConsumablesScanService: scanConsumables
AppConsumablesScanService->>+GStateMgrService: isDeviceInited
GStateMgrService->>-AppConsumablesScanService: 设备初始化结果
alt 未初始化
AppConsumablesScanService->>-ConsumableScanControler: 抛出系统未初始化异常
else
AppConsumablesScanService->>+ConsumablesScanCtrlService: doScanConsumablesAction
ConsumablesScanCtrlService->>-AppConsumablesScanService: scanRawResults原始扫描结果
loop 遍历扫描结果
AppConsumablesScanService->>+AppConsumablesScanService: parseScanResult
AppConsumablesScanService->>-AppConsumablesScanService: 解析后的结果
end
loop 遍历解析后的扫描结果
AppConsumablesScanService->>+AppConsumablesScanService: loadingConsumables
AppConsumablesScanService->>-AppConsumablesScanService: 解析后的结果
end
AppConsumablesScanService->>-ConsumableScanControler:ConsumablesScanResultPacket
end
ConsumableScanControler->>-user:ConsumablesScanResultPacket
```

183
doc/试管及试管架管理.md

@ -0,0 +1,183 @@
```mermaid
classDiagram
%% 试管状态管理器
class TubeStateMgrService {
}
%% 试管设置
class TubeSetting {
public int tubeIndex; // 试管位置索引
public String userid = ""; //用户输入的样本ID,不做逻辑,只做展示
public String sampleBarcode = ""; //用于请求用户信息的条码ID
public List<Integer> projId = new ArrayList<>(); //项目编码,标明需要做的项目
public BloodType bloodType = BloodType.WHOLE_BLOOD;
}
%% 试管架设置管理器
class TubeHolderSettingMgrService {
}
%% 试管架设置
class TubeHolderSetting {
public String uuid = UUID.randomUUID().toString(); //唯一标识
public Boolean active = false;//是否激活对应前端页面的☑️
public TubeSetting[] tubeSettings = new TubeSetting[10]; // 试管设置
public Boolean lock = false;//如果后台已经使用,前端不允许修改
}
TubeHolderSettingMgrService --> TubeHolderSetting
TubeHolderSetting "1" --> "10" TubeSetting
%% 试管架设置状态
class TubeHolderSettingState {
INACTIVE,
ACTIVE,
LOCKED
}
<<enumeration>> TubeHolderSettingState
%% 试管架
class TubeHolder {
}
%% 试管架状态
class TubeHolderState {
IDLE, //没有试管架
PROCESSING, //正在处理试管架
}
<<enumeration>> TubeHolderState
%% 试管架类型
class A8kTubeHolderType {
BloodTube("0000"), //全血试管
// MiniTube("1111"), //迷你试管
MiniBlood("2222"), //阳普管
BulletTube1P5("5555"),//子弹头试管1.5mL
BulletTube0P5("4444"), //子弹头试管0.5mL
StoolTestTube("8888"); //粪便试管
}
<<enumeration>> A8kTubeHolderType
TubeHolder --> TubeHolderState
TubeHolder "1" --> "10" Tube
TubeHolder --> A8kTubeHolderType
```
```mermaid
---
title: 新增试管架配置时序图
---
sequenceDiagram
actor user
participant TubeHolderSettingMgrControler
participant TubeHolderSettingMgrService
participant AppEventBusService
user->>+TubeHolderSettingMgrControler: 添加试管架
TubeHolderSettingMgrControler->>+TubeHolderSettingMgrService: newTubeHolderSetting()
TubeHolderSettingMgrService ->>-TubeHolderSettingMgrControler: 试管架配置
TubeHolderSettingMgrService -->> AppEventBusService: 发送试管架配置更新消息
TubeHolderSettingMgrControler ->>-user: 操作成功
```
```mermaid
---
title: 激活试管架时序图
---
sequenceDiagram
actor user
participant TubeHolderSettingMgrControler
participant TubeHolderSettingMgrService
user ->>+ TubeHolderSettingMgrControler: 激活试管架
TubeHolderSettingMgrControler ->>+ TubeHolderSettingMgrService: updateActiveState(String uuid, Boolean active)
TubeHolderSettingMgrService ->>- TubeHolderSettingMgrControler: void
TubeHolderSettingMgrControler ->>- user: 操作成功
```
```mermaid
---
tilte: 扫描试管架任务时序图
---
sequenceDiagram
actor a8k
participant AC30ScanTubeHolderTask
participant TubeHolderSettingMgrService
participant AppEventBusService
a8k->>+AC30ScanTubeHolderTask:doAction
AC30ScanTubeHolderTask->>+TubeHolderSettingMgrService:getThelastActiveTubeHolderSetting
TubeHolderSettingMgrService->>-AC30ScanTubeHolderTask:TubeHolderSetting
AC30ScanTubeHolderTask->>+AC30ScanTubeHolderTask:priDoAction(tubeSetting)
AC30ScanTubeHolderTask->>+AC30ScanTubeHolderTask:doEnterTubeHolder推入试管架
AC30ScanTubeHolderTask->>-AC30ScanTubeHolderTask:推入结果
alt 推入失败
AC30ScanTubeHolderTask-->>AppEventBusService:发送推入试管架失败消息
else 推入成功
AC30ScanTubeHolderTask->>+AC30ScanTubeHolderTask:doScanHolder
AC30ScanTubeHolderTask->>-AC30ScanTubeHolderTask:TubeHolderScanResult
end
alt 扫描结果为空
AC30ScanTubeHolderTask->>+AC30ScanTubeHolderTask:doEjectHodler
AC30ScanTubeHolderTask->>-AC30ScanTubeHolderTask:void
else 扫描结果不为空
AC30ScanTubeHolderTask->>+AC30ScanTubeHolderTask:parseScanResult(scanResult, tubeHolderSetting)
AC30ScanTubeHolderTask->>-AC30ScanTubeHolderTask:TubeHolder
end
alt 试管扫描结果解析失败
AC30ScanTubeHolderTask->>+AC30ScanTubeHolderTask:doEjectHodler
AC30ScanTubeHolderTask->>-AC30ScanTubeHolderTask:void
else 扫描结果解析成功
AC30ScanTubeHolderTask->>+AC30ScanTubeHolderTask:newTubeHolder(tubeholder)
AC30ScanTubeHolderTask->>+ConsumableStateAnalyzerService: analyze
ConsumableStateAnalyzerService->>-AC30ScanTubeHolderTask: 耗材状态信息(项目还有多少耗材,当前试管架需要多少项目多少耗材)
AC30ScanTubeHolderTask->>+ConsumableStateAnalyzerService: isEnough
alt 耗材不够
ConsumableStateAnalyzerService->>-AC30ScanTubeHolderTask: 耗材不足错误
end
AC30ScanTubeHolderTask->>+ConsumableStateAnalyzerService: isHasEnoughTip
alt Tip不足
ConsumableStateAnalyzerService->>-AC30ScanTubeHolderTask: Tip头不足错误
end
loop 试管个数
AC30ScanTubeHolderTask->>+AC30ScanTubeHolderTask: newSample(生成一条检验记录)
AC30ScanTubeHolderTask->>-AC30ScanTubeHolderTask: 检验记录id
loop 项目个数
AC30ScanTubeHolderTask->>+ProjectContextMgrService: newCxt(生产项目上下文)
ProjectContextMgrService->>-AC30ScanTubeHolderTask: void
end
end
AC30ScanTubeHolderTask->>+TubeHolder: setState(TubeHolderState.PROCESSING)
TubeHolder->>-AC30ScanTubeHolderTask: void
AC30ScanTubeHolderTask->>-AC30ScanTubeHolderTask:AppError
end
alt 存在系统错误
AC30ScanTubeHolderTask->>+AC30ScanTubeHolderTask:doEjectHodler
AC30ScanTubeHolderTask->>-AC30ScanTubeHolderTask:void
end
AC30ScanTubeHolderTask->>-AC30ScanTubeHolderTask:void
AC30ScanTubeHolderTask->>-a8k: void
```
```mermaid
---
title: 一次检测时序图
---
sequenceDiagram
```

0
doc/项目上下文管理.md

8
src/main/java/a8k/app/hardware/type/LldType.java

@ -1,8 +1,16 @@
package a8k.app.hardware.type;
/**
* 液位探测方式
*/
public enum LldType {
// 电容式
kclld(0),
// 电压式
kplld(1),
// 混合式
kmixlld(2);

7
src/main/java/a8k/app/service/analyzer/ConsumableStateAnalyzerService.java

@ -47,9 +47,11 @@ public class ConsumableStateAnalyzerService {
}
public List<ConsumableStatInfo> analyze(TubeHolder tubeHolder) {
//统计所有项目
//统计一个试管架中包含的所有项目
List<Integer> projs = new ArrayList<>();
for (Tube tube : tubeHolder.getTubes()) {
// 一个试管可以有多个项目
for (Integer projId : tube.getProjIds()) {
if (!projs.contains(projId)) {
projs.add(projId);
@ -62,6 +64,7 @@ public class ConsumableStateAnalyzerService {
for (Integer projId : projs) {
ConsumableStatInfo consumableStatInfo = new ConsumableStatInfo();
consumableStatInfo.projId = projId;
// 当前项目可用的耗材总量
consumableStatInfo.totalCnt = consumablesMgrService.statisticsConsumableNum(projId);
assginProjInfo(consumableStatInfo);
consumableStatInfoList.add(consumableStatInfo);
@ -72,6 +75,8 @@ public class ConsumableStateAnalyzerService {
for (Integer projId : tube.getProjIds()) {
for (ConsumableStatInfo consumableStatInfo : consumableStatInfoList) {
if (consumableStatInfo.projId.equals(projId)) {
// 当前这个试管架需要项目多少耗材
consumableStatInfo.requireCnt++;
}
}

5
src/main/java/a8k/app/service/mainctrl/TubeHolderSettingMgrService.java

@ -77,6 +77,11 @@ public class TubeHolderSettingMgrService {
}
/**
* 删除试管架配置发出试管架配置更新事件
* @param uuid
* @throws AppException
*/
synchronized public void removeTubeHolderSetting(String uuid) throws AppException {
logger.info("removeTubeHolderSetting {}", uuid);
var setting = getTubeHolderSettingAndCheckIsEditable(uuid);

5
src/main/java/a8k/app/service/statemgr/ConsumablesMgrService.java

@ -275,6 +275,11 @@ public class ConsumablesMgrService {
}
/**
* 获取当前项目可用的耗材的总量不包含已经预留的
* @param projId 项目id
* @return 可用耗材数量
*/
synchronized public Integer statisticsConsumableNum(Integer projId) {
int total = 0;
for (int i = 0; i < cState.reactionPlateGroup.length; i++) {

6
src/main/java/a8k/app/service/verification/PipetteGunPerformanceValidator.java

@ -87,6 +87,12 @@ public class PipetteGunPerformanceValidator {
}
/**
* 移液枪页面探测
* 液面探测方式 clld电容plld压力mixlld混合
* @return
* @throws AppException
*/
public Integer lld() throws AppException {
Integer liquidPos = 0;
hbotMoveExCtrlService.moveToLargeBSSamplePosXY(ConsumableGroup.CG1);

Loading…
Cancel
Save