Browse Source

update

tags/v0
zhaohe 10 months ago
parent
commit
b3a2fb8f99
  1. 3
      src/main/java/a8k/hardware/type/a8kcanprotocol/A8kEcode.java
  2. 42
      src/main/java/a8k/service/app/appctrl/ConsumablesScanService.java
  3. 8
      src/main/java/a8k/service/app/appctrl/mainflowctrl/CondtionMgrService.java
  4. 130
      src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java
  5. 3
      src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ3_APPLAY_RESOURCE.java
  6. 54
      src/main/java/a8k/service/app/appdata/AppProjInfoMgrService.java
  7. 2
      src/main/java/a8k/service/app/appdata/AppReactionResultMgrService.java
  8. 42
      src/main/java/a8k/service/app/appstate/EmergencySamplePosStateMgrService.java
  9. 13
      src/main/java/a8k/service/app/appstate/IncubationPlateMgrService.java
  10. 2
      src/main/java/a8k/service/app/appstate/OptScanModuleStateMgrService.java
  11. 55
      src/main/java/a8k/service/app/appstate/TubeStateMgrService.java
  12. 11
      src/main/java/a8k/service/app/appstate/type/IncubationSubTank.java
  13. 3
      src/main/java/a8k/service/app/appstate/type/OptScanModule.java
  14. 14
      src/main/java/a8k/service/app/appstate/type/ProjProcessContext.java
  15. 19
      src/main/java/a8k/service/app/appstate/type/Tube.java
  16. 2
      src/main/java/a8k/service/db/type/A8kProjectInfo.java
  17. 19
      src/main/java/a8k/type/consumables/LarBSGroup.java
  18. 18
      src/main/java/a8k/type/consumables/LittBSGroup.java
  19. 14
      src/main/java/a8k/type/consumables/ReactionPlateGroup.java
  20. 5
      src/main/java/a8k/type/consumables/ScanResultState.java
  21. 5
      src/main/java/a8k/utils/A8kProjCfg.java
  22. 27
      src/main/java/a8k/utils/ProjBriefInfo.java

3
src/main/java/a8k/hardware/type/a8kcanprotocol/A8kEcode.java

@ -60,6 +60,9 @@ public enum A8kEcode {
ConsumeNotEnough(142),//耗材不足
TipNotEnough(143),//tip不足
TakeTubeFail(143),//取试管失败
ProjIndexIsEmpty(144),//项目ID为空
CanNotFindProjInfo(145),//找不到项目信息
ProjInfoIsNotExist(146),//项目信息不存在
/**
* 特殊服务错误码

42
src/main/java/a8k/service/app/appctrl/ConsumablesScanService.java

@ -5,6 +5,8 @@ import a8k.hardware.type.a8kcanprotocol.A8kEcode;
import a8k.service.app.appdata.AppProjInfoMgrService;
import a8k.service.app.appstate.GStateService;
import a8k.service.app.devicedriver.ctrl.ConsumablesScanCtrl;
import a8k.service.db.type.A8kProjOptConfig;
import a8k.service.db.type.A8kProjectInfo;
import a8k.type.ConsumableGroup;
import a8k.type.consumables.LarBSGroup;
import a8k.type.consumables.LittBSGroup;
@ -80,10 +82,33 @@ public class ConsumablesScanService {
return ret;
}
//检查项目信息是否存在
A8kProjectInfo projInfo = appProjMgr.getProjInfoByProjIndex(rp2dcode.projIndex);
if (projInfo == null) {
ret.state = ScanResultState.UnSupportProj;
return ret;
}
Integer subProjNum = projInfo.subProjNum;
if (subProjNum == null || subProjNum <= 0) {
logger.error("项目信息不完整,项目ID:{},子项目数量为零", rp2dcode.projIndex);
ret.state = ScanResultState.CodeErrorProjInfoIsError;
return ret;
}
List<A8kProjOptConfig> projOptConfigList = appProjMgr.getProjOptConfigListByProjIndex(rp2dcode.projIndex);
if (projOptConfigList == null || projOptConfigList.size() != subProjNum) {
logger.error("项目操作配置信息不完整,项目ID:{},缺少光学配置", rp2dcode.projIndex);
ret.state = ScanResultState.CodeErrorProjInfoIsError;
return ret;
}
//通过项目ID卡获取项目需要的耗材
A8kReactionFlowType reactionType = appProjMgr.getA8kReactionFlowTypeByProjIndex(rp2dcode.projIndex);
if (reactionType == null) {
ret.state = ScanResultState.ProjInfoIsInComplete;
ret.state = ScanResultState.CodeErrorProjInfoIsInComplete;
return ret;
}
@ -117,16 +142,19 @@ public class ConsumablesScanService {
A8kIdCardInfo a8kIdCardInfo = appProjMgr.getA8kIdCardInfoByLotId(result.lotId);
A8kReactionFlowType reactionType = appProjMgr.getA8kReactionFlowTypeByProjIndex(result.projIndex);
A8kProjectInfo projInfo = appProjMgr.getProjInfoByProjIndex(result.projIndex);
assert a8kIdCardInfo != null;
assert reactionType != null;
assert projInfo != null;
cState.reactionPlateGroup[ch] = new ReactionPlateGroup(result.projIndex, a8kIdCardInfo.projName, result.lotId, a8kIdCardInfo.color, AppConstant.CONSUMABLE_NUM);
cState.reactionPlateGroup[ch] = new ReactionPlateGroup(result.projIndex, a8kIdCardInfo.projName, projInfo.projShortName, result.lotId, a8kIdCardInfo.color, AppConstant.CONSUMABLE_NUM);
if (reactionType.equals(A8kReactionFlowType.FlowType1)) {
cState.littBSGroup[ch] = new LittBSGroup(result.projIndex, a8kIdCardInfo.projName, result.lotId, a8kIdCardInfo.color, AppConstant.CONSUMABLE_NUM);
cState.littBSGroup[ch] = new LittBSGroup(result.projIndex, a8kIdCardInfo.projName, projInfo.projShortName, result.lotId, a8kIdCardInfo.color, AppConstant.CONSUMABLE_NUM);
cState.larBSGroup[ch] = new LarBSGroup();
} else if (reactionType.equals(A8kReactionFlowType.FlowType2)) {
cState.littBSGroup[ch] = new LittBSGroup(result.projIndex, a8kIdCardInfo.projName, result.lotId, a8kIdCardInfo.color, AppConstant.CONSUMABLE_NUM);
cState.larBSGroup[ch] = new LarBSGroup(result.projIndex, a8kIdCardInfo.projName, result.lotId, a8kIdCardInfo.color, AppConstant.CONSUMABLE_NUM);
cState.littBSGroup[ch] = new LittBSGroup(result.projIndex, a8kIdCardInfo.projName, projInfo.projShortName, result.lotId, a8kIdCardInfo.color, AppConstant.CONSUMABLE_NUM);
cState.larBSGroup[ch] = new LarBSGroup(result.projIndex, a8kIdCardInfo.projName, projInfo.projShortName, result.lotId, a8kIdCardInfo.color, AppConstant.CONSUMABLE_NUM);
} else {
throw new RuntimeException("未知的反应流程类型");
}
@ -172,7 +200,9 @@ public class ConsumablesScanService {
var scanResult = scanCtrlService.doScanOneCh(chNum);
var result = parseScanResult(chNum, scanResult);
LoadingConsumables(chNum, result);
if (result.state != ScanResultState.PASS) {
LoadingConsumables(chNum, result);
}
Map<String, Object> ret = new java.util.HashMap<>();
ret.put("scanResult", result);
ret.put("scanRawResult", scanResult);

8
src/main/java/a8k/service/app/appctrl/mainflowctrl/CondtionMgrService.java

@ -89,7 +89,7 @@ public class CondtionMgrService {
//没有试管在处理 或者 当前试管处理完成
Boolean cond2 = tube.state.equals(TubeState.PENDING);
//急诊有待处理的试管或者试管架正在处理
Boolean cond3 = incubationPlateMgrService.isHasEnoughIncubationIDLEPos(tube.projIndex.size());
Boolean cond3 = incubationPlateMgrService.isHasEnoughIncubationIDLEPos(tube.projInfo.size());
return cond1 && cond2 && cond3;
}
@ -103,7 +103,7 @@ public class CondtionMgrService {
//没有试管在处理 或者 当前试管处理完成
Boolean cond2 = tube.state.equals(TubeState.RESOURCE_IS_READY);
//急诊有待处理的试管或者试管架正在处理
Boolean cond3 = incubationPlateMgrService.isHasEnoughIncubationIDLEPos(tube.projIndex.size());
Boolean cond3 = incubationPlateMgrService.isHasEnoughIncubationIDLEPos(tube.projInfo.size());
return cond1 && cond2 && cond3;
}
@ -117,7 +117,7 @@ public class CondtionMgrService {
//没有试管在处理 或者 当前试管处理完成
Boolean cond2 = tube.state.equals(TubeState.PRE_PROCESSED);
//急诊有待处理的试管或者试管架正在处理
Boolean cond3 = incubationPlateMgrService.isHasEnoughIncubationIDLEPos(tube.projIndex.size());
Boolean cond3 = incubationPlateMgrService.isHasEnoughIncubationIDLEPos(tube.projInfo.size());
return cond1 && cond2 && cond3;
}
@ -131,7 +131,7 @@ public class CondtionMgrService {
//没有试管在处理 或者 当前试管处理完成
Boolean cond2 = tube.state.equals(TubeState.PROCESSED);
//急诊有待处理的试管或者试管架正在处理
Boolean cond3 = incubationPlateMgrService.isHasEnoughIncubationIDLEPos(tube.projIndex.size());
Boolean cond3 = incubationPlateMgrService.isHasEnoughIncubationIDLEPos(tube.projInfo.size());
return cond1 && cond2 && cond3;
}

130
src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java

@ -1,5 +1,7 @@
package a8k.service.app.appctrl.mainflowctrl.action;
import a8k.service.app.appdata.AppProjInfoMgrService;
import a8k.service.app.appstate.type.Tube;
import a8k.service.bases.AppEventBusService;
import a8k.service.bases.appevent.AppWarningNotifyEvent;
import a8k.hardware.A8kCanBusService;
@ -15,6 +17,7 @@ import a8k.service.app.appstate.type.TubeHolder;
import a8k.service.app.appstate.type.state.TubeHolderState;
import a8k.service.app.appstate.type.state.TubeState;
import a8k.service.app.devicedriver.ctrl.SampleScanTransportCtrl;
import a8k.service.db.type.A8kProjectInfo;
import a8k.type.exception.AppException;
import a8k.type.tube_setting.TubeHolderSetting;
import a8k.type.type.A8kTubeHolderType;
@ -59,19 +62,21 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction {
@Resource
GStateService gstate;
GStateService gstate;
@Resource
CondtionMgrService cmgr;
CondtionMgrService cmgr;
@Resource
SampleScanTransportCtrl stc;
SampleScanTransportCtrl stc;
@Resource
AppEventBusService ebus;
AppEventBusService ebus;
@Resource
A8kCanBusService canBus;
A8kCanBusService canBus;
@Resource
TubeSettingMgrService tubeSettingMgrService;
TubeSettingMgrService tubeSettingMgrService;
@Resource
TubeStateMgrService tubeStateMgrService;
TubeStateMgrService tubeStateMgrService;
@Resource
AppProjInfoMgrService appProjInfoMgr;
SampleScanResult scanTubeHodler() throws AppException {
@ -93,7 +98,6 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction {
String tubeType = stc.moveTubeRackToScanPosAndScan();
if (tubeType.isEmpty()) {
logger.warn("扫描试管架类型失败,弹出试管架");
stc.ejectTubeHolder();
ebus.pushEvent(new AppWarningNotifyEvent(A8kEcode.ScanTubeholderTypeTimeout));
return null;
}
@ -118,7 +122,6 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction {
if (!hasTube) {
logger.error("试管架中没有试管");
ebus.pushEvent(new AppWarningNotifyEvent(A8kEcode.TubeHolderTypeIsNotSupport));
stc.ejectTubeHolder();
return null;
}
result.tubeHolderType = tubeType;
@ -126,66 +129,81 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction {
return result;
}
A8kEcode parseOneTube(Tube tube, Integer i, SampleScanResult scanResult, TubeHolderSetting setting) {
if (!scanResult.tubesScanResults[i].isTubeExist) {
tube.state = TubeState.EMPTY;
return A8kEcode.NoError;
}
tube.state = TubeState.TO_BE_PROCESSED;
tube.isHighTube = scanResult.tubesScanResults[i].isHighTube;
//首先赋值默认值
tube.bloodType = BloodType.WHOLE_BLOOD;
tube.sampleBarcode = "";
tube.userid = "";
tube.projInfo = List.of();//不做任何项目
//然后赋值用户配置的数值
if (setting != null) {
tube.bloodType = setting.tubeSettings[i].bloodType;
tube.sampleBarcode = setting.tubeSettings[i].sampleBarcode;
tube.userid = setting.tubeSettings[i].userid;
tube.projInfo = appProjInfoMgr.getProjBrifInfo(setting.tubeSettings[i].projIndex);
if (tube.projInfo == null) {
logger.error("项目信息不存在,{}", setting.tubeSettings[i].projIndex);
ebus.pushEvent(new AppWarningNotifyEvent(A8kEcode.ProjInfoIsNotExist));
return A8kEcode.ProjInfoIsNotExist;
}
}
if (tube.userid.isEmpty()) {
tube.userid = genUserId(i);
}
return A8kEcode.NoError;
//补全试管中的项目信息
//最后赋值扫描到的数值
//
//TODO:添加请求后台的代码
//
// state.tubeStates[i].bloodType = ;
// state.tubeStates[i].sampleBarcode = setting.tubeSettings[i].sampleBarcode;
// state.tubeStates[i].userid = setting.tubeSettings[i].userid;
// state.tubeStates[i].projIndex = setting.tubeSettings[i].projIndex;
}
TubeHolder parseScanResult(SampleScanResult scanResult) throws AppException {
TubeHolder state = new TubeHolder();
TubeHolderSetting setting = tubeSettingMgrService.getThelastActiveTubeHolderSettingAndLock();
TubeHolder tubeholder = new TubeHolder();
TubeHolderSetting setting = tubeSettingMgrService.getThelastActiveTubeHolderSettingAndLock();
try {
//获取试管架类型
A8kTubeHolderType tubeHolderType = A8kTubeHolderType.of(scanResult.tubeHolderType);
if (tubeHolderType == null) {
logger.error("不支持的试管架类型");
ebus.pushEvent(new AppWarningNotifyEvent(A8kEcode.TubeHolderTypeIsNotSupport));
stc.ejectTubeHolder();
return null;
}
assert setting == null || setting.tubeSettings.length == state.tubes.length;
assert setting == null || setting.tubeSettings.length == tubeholder.tubes.length;
//逐个赋值试管配置信息
updaetGroupId();
for (int i = 0; i < state.tubes.length; i++) {
if (!scanResult.tubesScanResults[i].isTubeExist) {
state.tubes[i].state = TubeState.EMPTY;
continue;
}
state.tubes[i].state = TubeState.TO_BE_PROCESSED;
state.tubes[i].isHighTube = scanResult.tubesScanResults[i].isHighTube;
//首先赋值默认值
state.tubes[i].bloodType = BloodType.WHOLE_BLOOD;
state.tubes[i].sampleBarcode = "";
state.tubes[i].userid = "";
state.tubes[i].projIndex = List.of();//不做任何项目
//然后赋值用户配置的数值
if (setting != null) {
state.tubes[i].bloodType = setting.tubeSettings[i].bloodType;
state.tubes[i].sampleBarcode = setting.tubeSettings[i].sampleBarcode;
state.tubes[i].userid = setting.tubeSettings[i].userid;
state.tubes[i].projIndex = setting.tubeSettings[i].projIndex;
}
if (state.tubes[i].userid.isEmpty()) {
state.tubes[i].userid = genUserId(i);
for (int i = 0; i < tubeholder.tubes.length; i++) {
A8kEcode ecode = parseOneTube(tubeholder.tubes[i], i, scanResult, setting);
if (ecode != A8kEcode.NoError) {
ebus.pushEvent(new AppWarningNotifyEvent(ecode));
return null;
}
//最后赋值扫描到的数值
//
//TODO:添加请求后台的代码
//
// state.tubeStates[i].bloodType = ;
// state.tubeStates[i].sampleBarcode = setting.tubeSettings[i].sampleBarcode;
// state.tubeStates[i].userid = setting.tubeSettings[i].userid;
// state.tubeStates[i].projIndex = setting.tubeSettings[i].projIndex;
}
//设置试管架状态
state.state = TubeHolderState.PROCESSING;
tubeholder.state = TubeHolderState.PROCESSING;
//删除之前的试管架配置
tubeSettingMgrService.removeTubeHolderSetting(setting);
return state;
return tubeholder;
} catch (AppException e) {
//回滚部分状态
@ -199,20 +217,22 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction {
logger.info("开始扫描试管架");
var scanResult = scanTubeHodler();
if (scanResult == null) {
stc.ejectTubeHolder();
return;
}
logger.info("解析扫描结果");
TubeHolder state = parseScanResult(scanResult);
if (state == null) {
TubeHolder tubeholder = parseScanResult(scanResult);
if (tubeholder == null) {
stc.ejectTubeHolder();
return;
}
logger.info("将样本信息写入数据库");
tubeStateMgrService.createNewTubeContexts(state.tubes);
tubeStateMgrService.createNewTubeContexts(tubeholder.tubes);
logger.info("更新试管架状态");
gstate.setTubeHolder(state);
gstate.setTubeHolder(tubeholder);
}
@Override public Boolean checkCondition() {

3
src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ3_APPLAY_RESOURCE.java

@ -18,6 +18,7 @@ import a8k.type.TipPos;
import a8k.type.exception.AppException;
import a8k.service.db.type.a8kidcard.zenum.A8kReactionFlowType;
import a8k.service.db.type.A8kIdCardInfo;
import a8k.utils.ProjBriefInfo;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import org.slf4j.Logger;
@ -68,7 +69,7 @@ public class SEQ3_APPLAY_RESOURCE extends A8kStepAction {
@Override public void doaction() throws AppException {
Tube tube = gstate.getCurProcessingTube();
assert tube != null;
List<Integer> projs = gstate.getCurProcessingTube().projIndex;
List<Integer> projs = gstate.getCurProcessingTube().getProjIndex();
//检查是否有足够的耗材
for (Integer projin : projs) {

54
src/main/java/a8k/service/app/appdata/AppProjInfoMgrService.java

@ -1,6 +1,7 @@
package a8k.service.app.appdata;
import a8k.service.app.appstate.type.Tube;
import a8k.service.bases.appevent.*;
import a8k.extapi_controler.pagecontrol.ExtApiTabConfig;
import a8k.service.db.A8kProjIdCardDBService;
@ -19,12 +20,14 @@ import a8k.service.db.type.a8kidcard.zenum.A8kReactionFlowType;
import a8k.service.db.type.A8kIdCardInfo;
import a8k.utils.A8kIdCardDataParser;
import a8k.utils.A8kProjCfg;
import a8k.utils.ProjBriefInfo;
import a8k.utils.wq.ZWorkQueue;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import org.slf4j.Logger;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
@Component
@ -131,6 +134,25 @@ public class AppProjInfoMgrService {
return a8kProjIdCardDBService.getAllIdCards();
}
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// STATUS
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
@ExtApiFn(name = "ID卡状态")
public Boolean idCardStatus() {
try {
return canBus.moduleGetReg(MId.A8kIdCardReader, RegIndex.kreg_id_card_reader_is_online) == 1;
} catch (AppException ignored) {
}
return false;
}
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// 数据处理
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
public A8kIdCardInfo getA8kIdCardInfoByLotId(String lotid) {
return a8kProjIdCardDBService.getIdCard(lotid);
}
@ -147,6 +169,10 @@ public class AppProjInfoMgrService {
return projCfg;
}
public List<A8kProjOptConfig> getProjOptConfigListByProjIndex(Integer projIndex) {
return a8kProjOptConfigDBService.findByProjIndex(projIndex);
}
public String getProjNameByLotId(Integer projIndex) {
var idCard = a8kProjIdCardDBService.getProjInfoByProjIndex(projIndex);
if (idCard == null) {
@ -168,17 +194,25 @@ public class AppProjInfoMgrService {
return projInfo.reactionFlowType;
}
public ProjBriefInfo getProjBriefInfoByProjIndex(Integer projIndex) {
var projInfo = getProjInfoByProjIndex(projIndex);
if (projInfo == null) {
return null;
}
return new ProjBriefInfo(projInfo.projIndex, projInfo.projName, projInfo.projShortName, projInfo.color);
}
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// STATUS
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
@ExtApiFn(name = "ID卡状态")
public Boolean idCardStatus() {
try {
return canBus.moduleGetReg(MId.A8kIdCardReader, RegIndex.kreg_id_card_reader_is_online) == 1;
} catch (AppException ignored) {
public List<ProjBriefInfo> getProjBrifInfo(List<Integer> projIndex) {
List<ProjBriefInfo> ret = new ArrayList<>();
for (Integer index : projIndex) {
var projInfo = getProjInfoByProjIndex(index);
if (projInfo == null) {
logger.error("项目信息不存在,项目ID:{}", index);
return null;
}
ret.add(new ProjBriefInfo(projInfo.projIndex, projInfo.projName, projInfo.projShortName, projInfo.color));
}
return false;
return ret;
}
}

2
src/main/java/a8k/service/app/appdata/AppReactionResultMgrService.java

@ -56,7 +56,7 @@ public class AppReactionResultMgrService {
record.sampleBarcode = tubeContext.sampleBarcode;
record.sampleUserid = tubeContext.userid;
record.sampleId = tubeContext.sampleid;
record.projName = projContext.projName;
record.projName = projContext.projInfo.projName;
record.lotId = projContext.projCfg.idCardInfo.lotId;
record.projIndex = projContext.projCfg.idCardInfo.projIndex;
record.expiryDate = projContext.projCfg.idCardInfo.expiryDate;

42
src/main/java/a8k/service/app/appstate/EmergencySamplePosStateMgrService.java

@ -5,17 +5,25 @@ import a8k.extapi_controler.utils.EnginnerPageActionParam;
import a8k.extapi_controler.utils.ExtApiFn;
import a8k.extapi_controler.utils.ExtApiTab;
import a8k.hardware.type.a8kcanprotocol.A8kEcode;
import a8k.service.app.appdata.AppProjInfoMgrService;
import a8k.service.app.appstate.type.EmergencyTubePos;
import a8k.service.app.appstate.type.Tube;
import a8k.service.app.appstate.type.state.TubeState;
import a8k.type.exception.AppException;
import a8k.type.type.BloodType;
import a8k.utils.ProjBriefInfo;
import a8k.utils.ZJsonHelper;
import jakarta.annotation.Resource;
import org.slf4j.Logger;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
@ExtApiTab(cfg = ExtApiTabConfig.EmergencySamplePosStateMgrService)
@Component
public class EmergencySamplePosStateMgrService {
static Logger logger = org.slf4j.LoggerFactory.getLogger(EmergencySamplePosStateMgrService.class);
@Resource
GStateService gstate;
@ -23,6 +31,9 @@ public class EmergencySamplePosStateMgrService {
@Resource
TubeStateMgrService tubeStateMgrService;
@Resource
AppProjInfoMgrService appProjInfoMgrService;
/**
* 提交紧急样本设置
* @param userid 用户ID
@ -35,19 +46,34 @@ public class EmergencySamplePosStateMgrService {
@ExtApiFn(name = "提交紧急样本设置", group = "紧急样本设置")
public void commitEmergencySampleSetting(String userid, String sampleBarcode, BloodType bloodType,//
@EnginnerPageActionParam(name = "逗号分割项目列表(例子1,2,3)") String projIndexList) throws AppException {
EmergencyTubePos emergencyTubePos = gstate.getEmergencyTubePos();
Tube tube = emergencyTubePos.tube;
EmergencyTubePos emergencyTubePos = gstate.getEmergencyTubePos();
Tube tube = emergencyTubePos.tube;
List<Integer> projIndex = new ArrayList<>();
List<ProjBriefInfo> projInfo = new ArrayList<>();
if (tube.state.equals(TubeState.EMPTY) || tube.state.equals(TubeState.PROCESS_COMPLETE)) {
for (String index : projIndexList.split(",")) {
projIndex.add(Integer.parseInt(index));
}
if (projIndex.isEmpty()) {
throw new AppException(A8kEcode.ProjIndexIsEmpty);
}
projInfo = appProjInfoMgrService.getProjBrifInfo(projIndex);
if (projInfo == null || projInfo.size() != projIndex.size()) {
throw new AppException(A8kEcode.CanNotFindProjInfo);
}
tube.userid = userid;
tube.bloodType = bloodType;
tube.sampleBarcode = sampleBarcode;
tube.projIndex.clear();
tube.isEmergency = true;
for (String index : projIndexList.split(",")) {
tube.projIndex.add(Integer.parseInt(index));
}
tube.state = TubeState.TO_BE_PROCESSED;
tube.isEmergency = true;
tube.projInfo = projInfo;
tube.state = TubeState.TO_BE_PROCESSED;
tubeStateMgrService.createNewEmergencyTubeContext(tube);
logger.info("添加紧急样本设置成功 {}", ZJsonHelper.objectToJson(tube));
} else {
throw new AppException(A8kEcode.EmergencySampleIsProcessing);
}

13
src/main/java/a8k/service/app/appstate/IncubationPlateMgrService.java

@ -3,6 +3,7 @@ package a8k.service.app.appstate;
import a8k.extapi_controler.pagecontrol.ExtApiTabConfig;
import a8k.extapi_controler.utils.ExtApiTab;
import a8k.hardware.type.a8kcanprotocol.A8kEcode;
import a8k.service.app.appdata.AppProjInfoMgrService;
import a8k.service.app.appstate.type.IncubationSubTank;
import a8k.service.app.appstate.type.ProjProcessContext;
import a8k.service.app.appstate.type.Tube;
@ -21,6 +22,9 @@ public class IncubationPlateMgrService {
@Resource
GStateService gstate;
@Resource
AppProjInfoMgrService appProjInfoMgrService;
synchronized public Boolean isHasEnoughIncubationIDLEPos(Integer num) {
var incubationState = gstate.getIncubationPlate();
var subtanks = incubationState.subtanks;
@ -56,7 +60,7 @@ public class IncubationPlateMgrService {
for (IncubationSubTank subtank : subtanks) {
if (subtank.state.equals(IncubationSubTankState.INCUBATING)) {
var now = new Date();
var now = new Date();
var diff = now.getTime() - subtank.startIncubatedTime.getTime();
if (diff > subtank.incubatedTimeSec * 1000) {
return true;
@ -73,7 +77,7 @@ public class IncubationPlateMgrService {
for (IncubationSubTank subtank : subtanks) {
if (subtank.state.equals(IncubationSubTankState.INCUBATING)) {
var now = new Date();
var now = new Date();
var diff = now.getTime() - subtank.startIncubatedTime.getTime();
if (diff > subtank.incubatedTimeSec * 1000) {
return subtank;
@ -142,8 +146,7 @@ public class IncubationPlateMgrService {
subtanks[context.incubatorPos.off].bloodType = tube.bloodType;
subtanks[context.incubatorPos.off].sampleBarcode = tube.sampleBarcode;
subtanks[context.incubatorPos.off].userid = tube.userid;
subtanks[context.incubatorPos.off].projIndex = context.projIndex;
subtanks[context.incubatorPos.off].projName = context.projName;
subtanks[context.incubatorPos.off].projInfo = context.projInfo;
}
}
@ -154,7 +157,7 @@ public class IncubationPlateMgrService {
for (ProjProcessContext context : tube.projProcessContexts) {
subtanks[context.incubatorPos.off].state = IncubationSubTankState.INCUBATING;
subtanks[context.incubatorPos.off].startIncubatedTime = new Date();
subtanks[context.incubatorPos.off].incubatedTimeSec = incubatedTimeSec;
subtanks[context.incubatorPos.off].incubatedTimeSec = incubatedTimeSec;
}
}

2
src/main/java/a8k/service/app/appstate/OptScanModuleStateMgrService.java

@ -20,7 +20,7 @@ public class OptScanModuleStateMgrService {
optScanModule.bloodType = tank.bloodType;
optScanModule.sampleBarcode = tank.sampleBarcode;
optScanModule.userid = tank.userid;
optScanModule.projIndex = tank.projIndex;
optScanModule.projInfo = tank.projInfo;
optScanModule.projProcessContxt = tank.projProcessContxt;
}

55
src/main/java/a8k/service/app/appstate/TubeStateMgrService.java

@ -10,6 +10,7 @@ import a8k.type.IncubatorPos;
import a8k.type.TipPos;
import a8k.service.db.type.A8kIdCardInfo;
import a8k.utils.A8kProjCfg;
import a8k.utils.ProjBriefInfo;
import jakarta.annotation.Resource;
import org.jetbrains.annotations.NotNull;
import org.springframework.stereotype.Component;
@ -53,47 +54,47 @@ public class TubeStateMgrService {
cxt.bloodType = tube.bloodType;
cxt.sampleBarcode = tube.sampleBarcode;
cxt.userid = tube.userid;
cxt.projIndex = tube.projIndex;
cxt.projIndex = ProjBriefInfo.toPorjIndex(tube.projInfo);
cxt.projProcessContext = tube.projProcessContexts;
}
private void addSampleRecord(Tube[] state) {
private void addSampleRecord(Tube[] tube) {
Date intertime = new Date();
for (int i = 0; i < state.length; i++) {
if (state[i] == null) {
for (int i = 0; i < tube.length; i++) {
if (tube[i] == null) {
continue;
}
if (state[i].state.equals(TubeState.EMPTY)) {
if (tube[i].state.equals(TubeState.EMPTY)) {
continue;
}
SampleRecord record = new SampleRecord();
record.bloodType = state[i].bloodType;
record.sampleBarcode = state[i].sampleBarcode;
record.userid = state[i].userid;
record.bloodType = tube[i].bloodType;
record.sampleBarcode = tube[i].sampleBarcode;
record.userid = tube[i].userid;
record.date = intertime;
record.isEmergency = state[i].isEmergency;
record.isEmergency = tube[i].isEmergency;
record.sampleid = generateSampleId(intertime, i);
record.projIndex = state[i].projIndex;
state[i].sampleid = record.sampleid;
record.projIndex = ProjBriefInfo.toPorjIndex((tube[i].projInfo));
tube[i].sampleid = record.sampleid;
sampleRecordDBService.add(record);
}
}
private void addEmergencySampleRecord(Tube state) {
private void addEmergencySampleRecord(Tube tube) {
Date intertime = new Date();
SampleRecord record = new SampleRecord();
state.isEmergency = true;
tube.isEmergency = true;
record.bloodType = state.bloodType;
record.sampleBarcode = state.sampleBarcode;
record.userid = state.userid;
record.bloodType = tube.bloodType;
record.sampleBarcode = tube.sampleBarcode;
record.userid = tube.userid;
record.date = intertime;
record.isEmergency = true;
record.sampleid = generateSampleId(intertime, -1);
record.projIndex = state.projIndex;
state.sampleid = record.sampleid;
record.projIndex = ProjBriefInfo.toPorjIndex(tube.projInfo);
tube.sampleid = record.sampleid;
sampleRecordDBService.add(record);
}
@ -129,15 +130,13 @@ public class TubeStateMgrService {
synchronized public void createProjProcessContext(@NotNull Tube tube, @NotNull A8kProjCfg projCfg, @NotNull Consumable consumable, @NotNull List<TipPos> tipPos,
@NotNull IncubatorPos incubatorPos) {
ProjProcessContext context = new ProjProcessContext();
context.projIndex = projCfg.projectInfo.projIndex;
context.projName = projCfg.projectInfo.projName;
context.projShortName = projCfg.projectInfo.projShortName;
context.projCfg = projCfg;
context.consumable = consumable;
context.incubatorPos = incubatorPos;
context.tipPos = tipPos;
context.sampleId = tube.sampleid;
context.uuid = UUID.randomUUID().toString();
context.projInfo = projCfg.getProjBriefInfo();
context.projCfg = projCfg;
context.consumable = consumable;
context.incubatorPos = incubatorPos;
context.tipPos = tipPos;
context.sampleId = tube.sampleid;
context.uuid = UUID.randomUUID().toString();
tube.projProcessContexts.add(context);
}
@ -154,7 +153,7 @@ public class TubeStateMgrService {
@NotNull List<IncubatorPos> incubatorPos) {
Tube tube = gstate.getCurProcessingTube();
assert tube != null;
for (int i = 0; i < tube.projIndex.size(); i++) {
for (int i = 0; i < tube.projInfo.size(); i++) {
createProjProcessContext(tube, a8kconfig.get(i), consumable.get(i), tipPos.get(i), incubatorPos.get(i));
}
tube.state = TubeState.RESOURCE_IS_READY;

11
src/main/java/a8k/service/app/appstate/type/IncubationSubTank.java

@ -4,6 +4,7 @@ import a8k.hardware.type.a8kcanprotocol.A8kEcode;
import a8k.service.app.appstate.type.state.IncubationSubTankState;
import a8k.type.IncubatorPos;
import a8k.type.type.BloodType;
import a8k.utils.ProjBriefInfo;
import java.util.Date;
@ -15,12 +16,10 @@ public class IncubationSubTank {
public IncubationSubTankState state = IncubationSubTankState.EMPTY; //孵育盘状态
//Info
public BloodType bloodType = BloodType.WHOLE_BLOOD; //血液类型
public String sampleBarcode = ""; //用于请求用户信息的条码ID
public String userid = ""; //用户输入的样本ID不做逻辑只做展示
public Integer projIndex = 0; //项目代码
public String projName = ""; //项目名称
public BloodType bloodType = BloodType.WHOLE_BLOOD; //血液类型
public String sampleBarcode = ""; //用于请求用户信息的条码ID
public String userid = ""; //用户输入的样本ID不做逻辑只做展示
public ProjBriefInfo projInfo; //项目信息
//
public ProjProcessContext projProcessContxt;

3
src/main/java/a8k/service/app/appstate/type/OptScanModule.java

@ -2,6 +2,7 @@ package a8k.service.app.appstate.type;
import a8k.service.app.appstate.type.state.OptScanModuleState;
import a8k.type.type.BloodType;
import a8k.utils.ProjBriefInfo;
public class OptScanModule {
public OptScanModuleState state = OptScanModuleState.EMPTY; //模块状态
@ -9,7 +10,7 @@ public class OptScanModule {
public BloodType bloodType = BloodType.WHOLE_BLOOD; //血液类型
public String sampleBarcode = ""; //用于请求用户信息的条码ID
public String userid = ""; //用户输入的样本ID不做逻辑只做展示
public Integer projIndex = 0; //项目代码
public ProjBriefInfo projInfo;
public ProjProcessContext projProcessContxt;
}

14
src/main/java/a8k/service/app/appstate/type/ProjProcessContext.java

@ -3,8 +3,8 @@ package a8k.service.app.appstate.type;
import a8k.type.Consumable;
import a8k.type.IncubatorPos;
import a8k.type.TipPos;
import a8k.service.db.type.A8kIdCardInfo;
import a8k.utils.A8kProjCfg;
import a8k.utils.ProjBriefInfo;
import java.util.List;
@ -12,12 +12,10 @@ public class ProjProcessContext {
public String uuid;
public String sampleId; //样本ID-系统生成-唯一标识一个样本
public Integer projIndex;//项目代码
public String projName;
public String projShortName;
public A8kProjCfg projCfg;//项目配置
public Consumable consumable;//耗材绑定的通道号
public IncubatorPos incubatorPos;//孵育位置
public List<TipPos> tipPos;//吸头位置
public ProjBriefInfo projInfo;//项目信息
public A8kProjCfg projCfg;//项目配置
public Consumable consumable;//耗材绑定的通道号
public IncubatorPos incubatorPos;//孵育位置
public List<TipPos> tipPos;//吸头位置
}

19
src/main/java/a8k/service/app/appstate/type/Tube.java

@ -3,6 +3,7 @@ package a8k.service.app.appstate.type;
import a8k.hardware.type.a8kcanprotocol.A8kEcode;
import a8k.service.app.appstate.type.state.TubeState;
import a8k.type.type.BloodType;
import a8k.utils.ProjBriefInfo;
import java.util.ArrayList;
import java.util.List;
@ -13,15 +14,19 @@ public class Tube {
public Boolean isHighTube = false;
public Boolean isEmergency = false;
public BloodType bloodType = BloodType.WHOLE_BLOOD; //血液类型
public String sampleBarcode = ""; //用于请求用户信息的条码ID
public String userid = ""; //用户输入的样本ID不做逻辑只做展示
public List<Integer> projIndex = new ArrayList<>(); //项目代码
public List<String> projName = new ArrayList<>(); //项目名称
public BloodType bloodType = BloodType.WHOLE_BLOOD; //血液类型
public String sampleBarcode = ""; //用于请求用户信息的条码ID
public String userid = ""; //用户输入的样本ID不做逻辑只做展示
public List<ProjBriefInfo> projInfo = new ArrayList<>(); //项目信息
//
public TubeState state = TubeState.EMPTY; //样本被处理的状态
public TubeState state = TubeState.EMPTY; //样本被处理的状态
public List<ProjProcessContext> projProcessContexts;
public A8kEcode ecode = null;
public A8kEcode ecode = null;
public List<Integer> getProjIndex() {
return ProjBriefInfo.toPorjIndex(projInfo);
}
}

2
src/main/java/a8k/service/db/type/A8kProjectInfo.java

@ -9,7 +9,7 @@ public class A8kProjectInfo {
public Integer projIndex; //项目index
public String projName; //项目名称
public String projShortName;//项目缩写词
public Integer projNum; //是否是多联卡
public Integer subProjNum; //是否是多联卡
public Integer reactionTemperature; //反应温度
public String color; //项目颜色

19
src/main/java/a8k/type/consumables/LarBSGroup.java

@ -3,20 +3,23 @@ package a8k.type.consumables;
public class LarBSGroup {
public Integer projIndex; //项目ID
public String projName; //项目名称
public String lotId = ""; //批次号
public String color = ""; //颜色
public String projShortName;//项目缩写名称
public String lotId = ""; //批次号
public String color = ""; //颜色
public Integer num = 0;
public Boolean enable = false;
public LarBSGroup() {
}
public LarBSGroup(Integer projIndex, String projName, String lotId, String color, Integer num) {
this.projIndex = projIndex;
this.projName = projName;
this.lotId = lotId;
this.color = color;
this.num = num;
public LarBSGroup(Integer projIndex, String projName, String projShortName, String lotId, String color, Integer num) {
this.projIndex = projIndex;
this.projName = projName;
this.projShortName = projShortName;
this.lotId = lotId;
this.color = color;
this.num = num;
enable = true;
}
}

18
src/main/java/a8k/type/consumables/LittBSGroup.java

@ -3,7 +3,8 @@ package a8k.type.consumables;
public class LittBSGroup {
public Integer projIndex; //项目ID
public String projName; //项目名称
public String lotId = ""; //批次号
public String projShortName;//项目缩写名称
public String lotId = ""; //批次号
public String color = ""; //颜色
public Boolean enable = false;//是否可以被修改
public Integer num = 0;
@ -12,12 +13,13 @@ public class LittBSGroup {
enable = false;
}
public LittBSGroup(Integer projIndex, String projName, String lotId, String color, Integer num) {
this.projIndex = projIndex;
this.projName = projName;
this.lotId = lotId;
this.color = color;
this.num = num;
enable = true;
public LittBSGroup(Integer projIndex, String projName, String projShortName, String lotId, String color, Integer num) {
this.projIndex = projIndex;
this.projName = projName;
this.projShortName = projShortName;
this.lotId = lotId;
this.color = color;
this.num = num;
enable = true;
}
}

14
src/main/java/a8k/type/consumables/ReactionPlateGroup.java

@ -3,6 +3,7 @@ package a8k.type.consumables;
public class ReactionPlateGroup {
public Integer projIndex; //项目ID
public String projName; //项目名称
public String projShortName;//项目缩写名称
public String lotId = ""; //批次号
public String color = ""; //颜色
public Boolean enable = false;
@ -12,11 +13,12 @@ public class ReactionPlateGroup {
public ReactionPlateGroup() {
}
public ReactionPlateGroup(Integer projIndex, String projName, String lotId, String color, Integer num) {
this.projIndex = projIndex;
this.projName = projName;
this.lotId = lotId;
this.color = color;
this.num = num;
public ReactionPlateGroup(Integer projIndex, String projName, String projShortName, String lotId, String color, Integer num) {
this.projIndex = projIndex;
this.projName = projName;
this.projShortName = projShortName;
this.lotId = lotId;
this.color = color;
this.num = num;
}
}

5
src/main/java/a8k/type/consumables/ScanResultState.java

@ -13,5 +13,8 @@ public enum ScanResultState {
LarBSLotIdIsNotMatch,//大缓冲液批号不匹配
NoMatchingProjIDCardFound,//未找到匹配的项目ID卡
ProjInfoIsInComplete,//项目信息不全
IDCardProjInfoIsNotCompleted,//ID卡信息缺失
CodeErrorProjInfoIsInComplete,//项目信息不全
CodeErrorProjInfoIsError,//项目信息不全
UnSupportProj,//不支持的项目
}

5
src/main/java/a8k/utils/A8kProjCfg.java

@ -10,4 +10,9 @@ public class A8kProjCfg {
public A8kProjectInfo projectInfo;
public A8kIdCardInfo idCardInfo;
public List<A8kProjOptConfig> projOptConfigList;
public ProjBriefInfo getProjBriefInfo() {
return new ProjBriefInfo(projectInfo.projIndex, projectInfo.projName, projectInfo.projShortName, projectInfo.color);
}
}

27
src/main/java/a8k/utils/ProjBriefInfo.java

@ -0,0 +1,27 @@
package a8k.utils;
import java.util.ArrayList;
import java.util.List;
public class ProjBriefInfo {
public Integer projIndex; //项目代码
public String projName;//项目名称
public String projShotName; //项目缩写名称
public String color;
public ProjBriefInfo(Integer projIndex, String projName, String projShotName, String color) {
this.projIndex = projIndex;
this.projName = projName;
this.projShotName = projShotName;
this.color = color;
}
public static List<Integer> toPorjIndex(List<ProjBriefInfo> projBriefInfoList) {
List<Integer> projIndexList = new ArrayList<>();
for (ProjBriefInfo projBriefInfo : projBriefInfoList) {
projIndexList.add(projBriefInfo.projIndex);
}
return projIndexList;
}
}
Loading…
Cancel
Save