Browse Source

update

tags/v0
zhaohe 9 months ago
parent
commit
6f338a3d5c
  1. 17
      src/main/java/a8k/OS.java
  2. 15
      src/main/java/a8k/controler/api/v1/app/assistant/ApiRetTestControler.java
  3. 1
      src/main/java/a8k/extapi_controler/pagecontrol/ExtApiTabConfig.java
  4. 9
      src/main/java/a8k/hardware/A8kCanBusService.java
  5. 163
      src/main/java/a8k/hardware/type/a8kcanprotocol/A8kEcode.java
  6. 20
      src/main/java/a8k/service/app/appctrl/AppTubeSettingMgrService.java
  7. 4
      src/main/java/a8k/service/app/appctrl/mainflowctrl/MainFlowCtrlScheduler.java
  8. 4
      src/main/java/a8k/service/app/appctrl/mainflowctrl/action/PLATE_OPT_SCAN.java
  9. 2
      src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java
  10. 13
      src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ3_APPLAY_RESOURCE.java
  11. 64
      src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ5_PROCESS.java
  12. 6
      src/main/java/a8k/service/app/appdata/ReactionRecordMgrService.java
  13. 25
      src/main/java/a8k/service/app/appstate/statemgr/IncubationPlateStateMgrService.java
  14. 24
      src/main/java/a8k/service/app/appstate/statemgr/ProjectContextMgrService.java
  15. 11
      src/main/java/a8k/service/app/appstate/statemgr/TubeStateMgrService.java
  16. 12
      src/main/java/a8k/service/app/appstate/type/IncubationSubTank.java
  17. 4
      src/main/java/a8k/service/app/appstate/type/ProjectTaskContext.java
  18. 1
      src/main/java/a8k/service/app/devicectrl/ctrlservice/ConsumablesScanCtrlService.java
  19. 5
      src/main/java/a8k/service/app/devicectrl/ctrlservice/DeviceInitCtrlService.java
  20. 2
      src/main/java/a8k/service/app/devicectrl/ctrlservice/HbotCtrlService.java
  21. 3
      src/main/java/a8k/service/app/devicectrl/ctrlservice/OptScanModuleCtrlService.java
  22. 6
      src/main/java/a8k/service/app/devicectrl/ctrlservice/PlateBoxCtrlService.java
  23. 4
      src/main/java/a8k/service/app/devicectrl/ctrlservice/TubePreProcesCtrlService.java
  24. 6
      src/main/java/a8k/service/app/devicectrl/ctrlservice/TurnableMoveCtrlService.java
  25. 2
      src/main/java/a8k/service/app/devicectrl/exdriver/HbotBaseMoveExDriver.java
  26. 4
      src/main/java/a8k/service/app/devicectrl/exdriver/TubeTransportExDriver.java
  27. 5
      src/main/java/a8k/service/app/devicectrl/param/calibration/OptModuleParamCalibration.java
  28. 2
      src/main/java/a8k/service/app/devicectrl/param/calibration/PipetteGunLLDParamCalibration.java
  29. 6
      src/main/java/a8k/service/app/devicectrl/param/ext_param_mgr/PipetteGunParamExMgr.java
  30. 20
      src/main/java/a8k/service/app/devicectrl/script/DeviceCtrlScripter.java
  31. 26
      src/main/java/a8k/service/app/erroranalyzer/ErrorAnalyzer.java
  32. 123
      src/main/java/a8k/service/bases/ActionReactorService.java
  33. 2
      src/main/java/a8k/service/test/MainflowCtrlTestService.java
  34. 2
      src/main/java/a8k/service/test/PipetteGunTest.java
  35. 4
      src/main/java/a8k/type/appret/ApiV1Ret.java
  36. 4
      src/main/java/a8k/type/appret/AppRetV1.java
  37. 30
      src/main/java/a8k/type/ecode/AECodeError.java
  38. 13
      src/main/java/a8k/type/ecode/AECommonError.java
  39. 22
      src/main/java/a8k/type/ecode/AEUnkownExceptionError.java
  40. 16
      src/main/java/a8k/type/exception/AppException.java
  41. 22
      src/main/java/a8k/type/exception/MutiAppException.java
  42. 7
      src/main/java/a8k/type/exception/ZAppInterruptException.java
  43. 53
      src/main/java/a8k/utils/ActionParallerExceutor.java
  44. 1
      src/main/java/a8k/utils/AppExceptionBuilder.java
  45. 22
      src/main/java/a8k/utils/ProjProcessContextUtils.java
  46. 9
      src/main/java/a8k/utils/ZJsonHelper.java

17
src/main/java/a8k/OS.java

@ -4,22 +4,11 @@ import a8k.hardware.type.a8kcanprotocol.A8kEcode;
import a8k.type.exception.AppException; import a8k.type.exception.AppException;
public class OS { public class OS {
public static void hsleep(int ms) throws AppException {
try {
Thread.sleep(ms);
} catch (InterruptedException e) {
throw new AppException(A8kEcode.OS_INTERRUPT);
}
public static void hsleep(int ms) {
forceSleep(ms);
} }
public static void forceSleep(Integer mills) { public static void forceSleep(Integer mills) {
// int end = mills + (int) System.currentTimeMillis();
// while (System.currentTimeMillis() < end) {
// try {
// threadSleep(50);
// } catch (InterruptedException ignored) {
// }
// }
try { try {
threadSleep(mills); threadSleep(mills);
} catch (InterruptedException e) { } catch (InterruptedException e) {
@ -28,6 +17,6 @@ public class OS {
} }
public static void threadSleep(Integer mills) throws InterruptedException { public static void threadSleep(Integer mills) throws InterruptedException {
Thread.sleep(mills);
Thread.sleep(mills);
} }
} }

15
src/main/java/a8k/controler/api/v1/app/assistant/ApiRetTestControler.java

@ -42,13 +42,6 @@ public class ApiRetTestControler {
); );
} }
@Operation(description = "获取通用错误返回值")
@PostMapping("getAppComonError")
public ApiV1Ret<AECommonError> getAppComonError() {
return ApiV1Ret.fail(//
new AECommonError("和AppCodeError类似,只不过这个可能是一些通用错误,一般用户碰不到该错误,只是为了方便开发人员排查问题")
);
}
@Operation(description = "获取消耗不足错误返回值,此类错误需要前端提示用户缺少了哪个项目的耗材") @Operation(description = "获取消耗不足错误返回值,此类错误需要前端提示用户缺少了哪个项目的耗材")
@PostMapping("getConsumeNotEnoughError") @PostMapping("getConsumeNotEnoughError")
@ -66,12 +59,4 @@ public class ApiRetTestControler {
); );
} }
@Operation(description = "获取未知异常错误,此错误发生在,当后台没有捕获到某些异常时,目的是为了辅助后端找到代码BUG,需要显示详细的栈信息")
@PostMapping("getUnkownExceptionError")
public ApiV1Ret<AEUnkownExceptionError> getUnkownExceptionError() {
var exception = new AppException(A8kEcode.CODEERROR);
return ApiV1Ret.fail(//
new AEUnkownExceptionError(exception)
);
}
} }

1
src/main/java/a8k/extapi_controler/pagecontrol/ExtApiTabConfig.java

@ -30,7 +30,6 @@ public enum ExtApiTabConfig {
A8kPipetteCtrlModule("硬件驱动.移液枪测试", true), A8kPipetteCtrlModule("硬件驱动.移液枪测试", true),
StepMotorCtrlDriver("硬件驱动.步进电机测试", false), StepMotorCtrlDriver("硬件驱动.步进电机测试", false),
ActionReactorService("底层调试.单步调试", false),//OK
HbotControlService("HbotControlService", false), HbotControlService("HbotControlService", false),
TubeTubeFeedingModule("硬件控制.入料模块", false), TubeTubeFeedingModule("硬件控制.入料模块", false),

9
src/main/java/a8k/hardware/A8kCanBusService.java

@ -7,6 +7,7 @@ import a8k.type.PlateInfo;
import a8k.hardware.custom_param_mgr.A8kModCustomParamMgr; import a8k.hardware.custom_param_mgr.A8kModCustomParamMgr;
import a8k.hardware.type.a8kcanprotocol.*; import a8k.hardware.type.a8kcanprotocol.*;
import a8k.hardware.type.a8kcanprotocol.MId; import a8k.hardware.type.a8kcanprotocol.MId;
import a8k.type.ecode.AECodeError;
import a8k.type.ecode.AEHardwareError; import a8k.type.ecode.AEHardwareError;
import a8k.type.exception.AppException; import a8k.type.exception.AppException;
import a8k.service.bases.appevent.A8kHardwareReport; import a8k.service.bases.appevent.A8kHardwareReport;
@ -166,7 +167,6 @@ public class A8kCanBusService {
} }
public void plateCodeScanerPushCardAndScan(MId id, Integer finalStopPos) throws AppException { public void plateCodeScanerPushCardAndScan(MId id, Integer finalStopPos) throws AppException {
callcmd(id.toInt(), CmdId.plate_code_scaner_push_card_and_scan.toInt(), finalStopPos); callcmd(id.toInt(), CmdId.plate_code_scaner_push_card_and_scan.toInt(), finalStopPos);
} }
@ -307,7 +307,7 @@ public class A8kCanBusService {
} else if (ioid.mtype == ModuleType.kmini_servo_motor_module) { } else if (ioid.mtype == ModuleType.kmini_servo_motor_module) {
return callcmd(ioid.mid.toInt(), CmdId.mini_servo_read_io_state.toInt(), ioid.ioIndex).getContentI32(0) != 0; return callcmd(ioid.mid.toInt(), CmdId.mini_servo_read_io_state.toInt(), ioid.ioIndex).getContentI32(0) != 0;
} else { } else {
throw AppException.of(new AEHardwareError(A8kEcode.CODEERROR_ILLEGAL_OPERATION, ioid.mid, null));
throw new AppException(new AECodeError(String.format("IOID MODULE TYPE %s NOT SUPPORT", ioid.mtype)));
} }
} }
@ -328,8 +328,7 @@ public class A8kCanBusService {
if (ioid.mtype == ModuleType.kboard) { if (ioid.mtype == ModuleType.kboard) {
callcmd(ioid.mid.toInt(), CmdId.extboard_write_outio.toInt(), ioid.ioIndex, val ? 1 : 0); callcmd(ioid.mid.toInt(), CmdId.extboard_write_outio.toInt(), ioid.ioIndex, val ? 1 : 0);
} else { } else {
// throw new AppException(ioid.mid, A8kEcode.IllegalOperation.index);
throw AppException.of(new AEHardwareError(A8kEcode.CODEERROR_ILLEGAL_OPERATION, ioid.mid, null));
throw new AppException(new AECodeError("IOID MODULE TYPE %s NOT SUPPORT", ioid.mtype));
} }
} }
@ -426,7 +425,7 @@ public class A8kCanBusService {
CmdId cmdid = CmdId.valueOf(pack.getCmdId()); CmdId cmdid = CmdId.valueOf(pack.getCmdId());
if (cmdid == null) { if (cmdid == null) {
// throw new AppException(MId.valueOf(pack.getModuleId()), A8kEcode.CmdNotSupport.index); // throw new AppException(MId.valueOf(pack.getModuleId()), A8kEcode.CmdNotSupport.index);
throw AppException.of(new AEHardwareError(A8kEcode.CODEERROR_CMD_NOT_SUPPORT, MId.valueOf(pack.getModuleId()), null));
throw AppException.of(new AEHardwareError(A8kEcode.LOW_EXT_ERROR_CMD_NOT_SUPPORT, MId.valueOf(pack.getModuleId()), null));
} }
if (debugFlag && pack.isTrace()) { if (debugFlag && pack.isTrace()) {
String packstr = pack.toString(); String packstr = pack.toString();

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

@ -1,88 +1,80 @@
package a8k.hardware.type.a8kcanprotocol; package a8k.hardware.type.a8kcanprotocol;
/**
* 错误分类
* 10,
* 为代码错误代码没有BUG的情况下这个错误时不会出现的前端打印出错误和错误携带的栈信息方便产品维护时非程序员能够提供详细的错误的信息
*
*
*
*
*
*/
public enum A8kEcode { public enum A8kEcode {
SUC(0), SUC(0),
MUTI_APPEXCEPTIONS(1),//内置无需关心
COMMON_ERROR(2),//通用错误只需显示携带错误信息
/*
* 代码错误代码没有BUG的情况下不应该出现的错误
*/
//
// 代码错误代码没有BUG的情况下前端直接打印错误信息和栈信息即可
//
CODEERROR(10), //代码错误 CODEERROR(10), //代码错误
CODEERROR_GET_PARAM_FAIL(11), //代码错误,获取参数失败
CODEERROR_PARSE_PARAM_FAIL(12), //代码错误,解析参数失败
CODEERROR_UNKOWN_EXCEPTION(13), //代码错误,未知异常
CODEERROR_UNKOWN_ERROR(14), //代码错误,未知错误
CODEERROR_ILLEGAL_OPERATION(15),//代码错误,非法操作
CODEERROR_PARAM_OUT_OF_RANGE(16), //代码错误,参数超出范围
CODEERROR_CMD_NOT_SUPPORT(17), //代码错误,命令不支持
CODEERROR_ZM_NOT_AT_ZERO_POS_WHEN_HBOT_TRY_MOVE(18),//Z轴电机不在Z轴位置
CODEERROR_SHAKE_MOD_GRIPPER_ZMOTOR_NOT_IN_ZERO_POS(19), //摇匀模组Z轴向电机不在零点
CODEERROR_MOTOR_NOT_IN_ZERO_POS(20),//电机不在零点
CODEERROR_END(50),
/*
* 用户错误
*/
USR_ALREADY_EXIST(100),//用户已存在
USR_NOT_EXIT(101), //用户不存在
USR_PASSWORD_ERROR(102),//用户密码错误
/*
* 业务流程中的错误要求通过错误码能够定位到业务流中的哪个点发生的错误
*/
APPE_PUT_TIP_FAIL(200),//丢弃tip失败
APPE_TAKE_TIP_FAIL(201),//取tip失败
APPE_PLATE_STUCK_DETECTOR_SENSOR_TRIGGER(202),//卡板检测传感器触发
APPE_PULLERM_INIT_POS_ERROR(203),//初始化阶段拉板电机处于错误位置没有在零点
APPE_PUSHERM_INIT_POS_ERROR(204),//初始化阶段推板电机处于错误位置没有在零点
APPE_PULL_PLATE_FAIL(205),//推板失败
APPE_SCAN_TIMEOUT(206),//扫描超时
APPE_SCAN_TUBEHOLDER_TYPE_TIMEOUT(207),//扫描试管架类型超时
APPE_TUBE_X_CHANNEL_IS_NOT_EMPTY(208),//试管架通道有异物
APPE_INFEED_OVERTIME_FAIL(209),//入料超时失败
APPE_EJECT_TUBEHOLDER_TIMEOUT(210),//弹出试管架超时
APPE_PLATE_BOX_NOT_COVER(211),//板夹仓未盖
APPE_RECYCLE_BIN_OVERFLOW(212),//废料箱满
APPE_DEVICE_NOT_INITED(213), //设备未初始化
APPE_A8K_ID_CARD_NOT_MOUNTED(214),//ID卡未挂载
APPE_A8K_PLATE_2D_CODE_FORMAT_ERROR(215),//巴迪泰反应板2D码格式错误
APPE_A8K_ID_CARD_LOT_ID_IS_EMPTY(216),//ID卡批号为空
APPE_NO_TUBE_IN_HOLDER(217),//试管架中没有试管
APPE_TUBE_HOLDER_SETTING_IS_LOCKED(218),//试管架设置被锁定
APPE_TUBE_HOLDER_SETTING_NOT_FOUND(219),//试管架设置未找到
APPE_TUBE_HOLDER_TYPE_IS_NOT_SUPPORT(220),//试管架类型不支持
APPE_EMERGENCY_SAMPLE_IS_PROCESSING(221),//急诊样本正在处理中
//
// 参数错误
//
PE_PARAM_OUT_OF_RANGE(100),//参数超出范围
//
// 用户错误
//
USR_ALREADY_EXIST(110),//用户已存在
USR_NOT_EXIT(111), //用户不存在
USR_PASSWORD_ERROR(112),//用户密码错误
//
// ID卡错误
//
APPE_A8K_ID_CARD_NOT_MOUNTED(120), //ID卡未挂载
//
// 试管配置管理服务相关错误码
//
APPE_TUBE_HOLDER_SETTING_IS_LOCKED(130),//试管架设置被锁定,已锁定的,说明当前后台正在使用这个配置是不允许修改
//
// 急诊错误
//
APPE_EMERGENCY_SAMPLE_IS_PROCESSING(141), //添加急诊样本失败急诊样本还没有处理完成 这个错误发生在前端没有做好状态检测
APPE_ADD_EMERGENCY_ACTION_IS_NOT_ALLOWED_WHEN_WORKING(142),//添加急诊样本失败设备正在运行中 这个错误发生在前端没有做好状态检测
//
// 业务流程中的错误
// 1. 点击开始运行后设备在运行过程中出现的错误
// 2. 下面错误中文情况下直接显示注释信息即可
//
//入料阶段错误
APPE_SCAN_TUBEHOLDER_TYPE_TIMEOUT(200),//扫描试管架类型超时
APPE_TUBE_HOLDER_TYPE_IS_NOT_SUPPORT(201),//试管架类型不支持
APPE_INFEED_OVERTIME_FAIL(202),//入料超时失败
//样本处理过程中的错误
APPE_PUT_TIP_FAIL(210),//丢弃Tip失败
APPE_TAKE_TIP_FAIL(211),//取Tip失败
//出料阶段错误
APPE_EJECT_TUBEHOLDER_TIMEOUT(220),//弹出试管架超时
APPE_NO_TUBE_IN_HOLDER(221),//试管架中没有试管
APPE_CONSUME_NOT_ENOUGH(222),//耗材不足 APPE_CONSUME_NOT_ENOUGH(222),//耗材不足
APPE_TIP_NOT_ENOUGH(223),//tip不足 APPE_TIP_NOT_ENOUGH(223),//tip不足
APPE_TAKE_TUBE_FAIL(224),//取试管失败
APPE_ACTION_IS_NOT_ALLOWED_WHEN_WORKING(228),//设备运行中下不允许执行该操作
/**
* OS错误
*/
OS_INTERRUPT(500),//Sleep被中断
APPE_A8K_PROJ_CARD_PARSE_ERROR(600), //ID卡解析错误
APPE_A8K_PROJ_CARD_EXPIRYED(601), //ID卡过期
APPE_A8K_PROJ_ID_IS_EMPTY(602), //项目ID为空
APPE_A8K_PROJ_UNSUPPORTED(603), //项目不支持
APPE_A8K_PROJ_INFO_IS_ERROR(604), //项目信息异常
/*
* 调试使用无需关心
*/
ACTION_REACTOR_SERVICE_BREAKBYUSR(900),//
TEST_SCRIP_ERROR_DEVICE_IS_BUSY(901),
//校验流程错误
//运行中的公用错误
APPE_A8K_PROJ_CARD_PARSE_ERROR(300), //ID卡解析错误
APPE_A8K_PROJ_CARD_EXPIRYED(301), //ID卡过期
APPE_A8K_PROJ_ID_IS_EMPTY(302), //项目ID为空
APPE_A8K_PROJ_UNSUPPORTED(303), //项目不支持
APPE_A8K_PROJ_INFO_IS_ERROR(304), //项目信息异常
APPE_PULLERM_INIT_POS_ERROR(305), //初始化阶段拉板电机没有处于零点位置
APPE_PUSHERM_INIT_POS_ERROR(306), //初始化阶段推板电机没有处于零点位置
APPE_PLATE_STUCK_DETECTOR_SENSOR_TRIGGER(307), //卡板检测传感器触发
APPE_TUBE_X_CHANNEL_IS_NOT_EMPTY(308), //试管架通道有异物
APPE_PLATE_BOX_NOT_COVER(309), //板夹仓未盖
APPE_DEVICE_NOT_INITED(310), //设备未初始化
// //
// LowBoard 底层错误按照字面意思翻译即可或者不翻译直接打印错误英文
// LowBoard 底层错误直接打印错误英文
// //
LOW_ERROR_HARDWARE_ERROR_START(1000), LOW_ERROR_HARDWARE_ERROR_START(1000),
LOW_ERROR_BOARD_COMMON_ERROR(1001), LOW_ERROR_BOARD_COMMON_ERROR(1001),
@ -159,8 +151,15 @@ public enum A8kEcode {
LOW_ERROR_WATER_COOLING_TEMPERATURE_SENSOR_ERROR(1902), LOW_ERROR_WATER_COOLING_TEMPERATURE_SENSOR_ERROR(1902),
LOW_ERROR_WATER_COOLING_PUMP_IS_ERROR(1903), LOW_ERROR_WATER_COOLING_PUMP_IS_ERROR(1903),
LOW_ERROR_WATER_COOLING_PELTER_IS_ERROR(1904), LOW_ERROR_WATER_COOLING_PELTER_IS_ERROR(1904),
//
// 底层扩展错误码由java定义
//
LOW_EXT_ERROR_UNKOWN_INDEX_ERROR(5000), //代码错误,未知错误
LOW_EXT_ERROR_CMD_NOT_SUPPORT(5001), //代码错误,未知错误
LOW_EXT_ERROR_MOTOR_AT_WRONG_POS(5002),//电机在错误的位置
; ;
public final int index; public final int index;
public int rawindex = 0; public int rawindex = 0;
@ -168,9 +167,6 @@ public enum A8kEcode {
this.index = index; this.index = index;
} }
public int toInt() {
return index;
}
static public A8kEcode fromInt(int index) { static public A8kEcode fromInt(int index) {
for (var e : A8kEcode.values()) { for (var e : A8kEcode.values()) {
@ -178,18 +174,9 @@ public enum A8kEcode {
return e; return e;
} }
} }
A8kEcode.CODEERROR_UNKOWN_ERROR.rawindex = index;
return A8kEcode.CODEERROR_UNKOWN_ERROR;
A8kEcode.LOW_EXT_ERROR_UNKOWN_INDEX_ERROR.rawindex = index;
return A8kEcode.LOW_EXT_ERROR_UNKOWN_INDEX_ERROR;
} }
public static String toDisPlayString(int id) {
for (var e : A8kEcode.values()) {
if (e.index == id) {
return e.name();
}
}
return String.format("unkown(%d)", id);
}
} }

20
src/main/java/a8k/service/app/appctrl/AppTubeSettingMgrService.java

@ -42,7 +42,7 @@ public class AppTubeSettingMgrService {
private TubeHolderSetting getTubeHolderSettingAndCheckIsEditable(String uuid) throws AppException { private TubeHolderSetting getTubeHolderSettingAndCheckIsEditable(String uuid) throws AppException {
TubeHolderSetting setting = getTubeHolderSetting(uuid); TubeHolderSetting setting = getTubeHolderSetting(uuid);
if (setting == null) { if (setting == null) {
throw new AppException(A8kEcode.APPE_TUBE_HOLDER_SETTING_NOT_FOUND);
return null;
} }
if (setting.lock) { if (setting.lock) {
throw new AppException(A8kEcode.APPE_TUBE_HOLDER_SETTING_IS_LOCKED); throw new AppException(A8kEcode.APPE_TUBE_HOLDER_SETTING_IS_LOCKED);
@ -71,21 +71,28 @@ public class AppTubeSettingMgrService {
synchronized public void removeTubeHolderSetting(String uuid) throws AppException { synchronized public void removeTubeHolderSetting(String uuid) throws AppException {
logger.info("removeTubeHolderSetting {}", uuid); logger.info("removeTubeHolderSetting {}", uuid);
getTubeHolderSettingAndCheckIsEditable(uuid);
tubeHolderSettings.removeIf(setting -> setting.uuid.equals(uuid));
var setting = getTubeHolderSettingAndCheckIsEditable(uuid);
if (setting == null)
return;
tubeHolderSettings.remove(setting);
} }
synchronized public void updateActiveState(String uuid, Boolean active) throws AppException { synchronized public void updateActiveState(String uuid, Boolean active) throws AppException {
logger.info("tubeHodlerSettingSetActiveState {} {}", uuid, active); logger.info("tubeHodlerSettingSetActiveState {} {}", uuid, active);
TubeHolderSetting setting = getTubeHolderSettingAndCheckIsEditable(uuid); TubeHolderSetting setting = getTubeHolderSettingAndCheckIsEditable(uuid);
if (setting == null) {
return;
}
setting.active = active; setting.active = active;
} }
synchronized public void resetTubeSetting(String uuid, Integer tubeIndex) throws AppException { synchronized public void resetTubeSetting(String uuid, Integer tubeIndex) throws AppException {
logger.info("resetTubeSetting {} {}", uuid, tubeIndex); logger.info("resetTubeSetting {} {}", uuid, tubeIndex);
TubeHolderSetting thSetting = getTubeHolderSettingAndCheckIsEditable(uuid); TubeHolderSetting thSetting = getTubeHolderSettingAndCheckIsEditable(uuid);
if (thSetting == null) {
return;
}
thSetting.tubeSettings[tubeIndex].reset(); thSetting.tubeSettings[tubeIndex].reset();
} }
@ -94,10 +101,11 @@ public class AppTubeSettingMgrService {
logger.info("updateTubeSetting {} {}", uuid, setting); logger.info("updateTubeSetting {} {}", uuid, setting);
TubeHolderSetting thSetting = getTubeHolderSetting(uuid); TubeHolderSetting thSetting = getTubeHolderSetting(uuid);
if (thSetting == null) { if (thSetting == null) {
throw AppException.of("无效UUID");
logger.warn("无效UUID");
return;
} }
if (setting.tubeIndex >= thSetting.tubeSettings.length) { if (setting.tubeIndex >= thSetting.tubeSettings.length) {
throw AppException.of("tubeIndex参数错误");
throw AppException.ofAECodeError("tubeIndex参数错误");
} }
thSetting.tubeSettings[setting.tubeIndex] = setting; thSetting.tubeSettings[setting.tubeIndex] = setting;

4
src/main/java/a8k/service/app/appctrl/mainflowctrl/MainFlowCtrlScheduler.java

@ -8,7 +8,7 @@ import a8k.service.app.appstate.type.DeviceWorkState;
import a8k.service.app.appstate.type.state.A8kWorkState; import a8k.service.app.appstate.type.state.A8kWorkState;
import a8k.service.bases.AppEventBusService; import a8k.service.bases.AppEventBusService;
import a8k.service.bases.appevent.A8kEcodeContextListPromptEvent; import a8k.service.bases.appevent.A8kEcodeContextListPromptEvent;
import a8k.type.ecode.AEUnkownExceptionError;
import a8k.type.ecode.AECodeError;
import a8k.type.ecode.AppError; import a8k.type.ecode.AppError;
import a8k.type.exception.AppException; import a8k.type.exception.AppException;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
@ -165,7 +165,7 @@ public class MainFlowCtrlScheduler implements ApplicationListener<ApplicationSta
return action.doAction(); return action.doAction();
} catch (Exception exception) { } catch (Exception exception) {
logger.error("error {}", exception.getMessage(), exception); logger.error("error {}", exception.getMessage(), exception);
return List.of(new AEUnkownExceptionError(exception));
return List.of(new AECodeError(exception));
} }
}); });
} }

4
src/main/java/a8k/service/app/appctrl/mainflowctrl/action/PLATE_OPT_SCAN.java

@ -11,7 +11,7 @@ import a8k.service.app.appdata.ReactionRecordMgrService;
import a8k.service.app.appstate.GStateService; import a8k.service.app.appstate.GStateService;
import a8k.service.app.appstate.statemgr.OptScanModuleStateMgrService; import a8k.service.app.appstate.statemgr.OptScanModuleStateMgrService;
import a8k.service.app.appstate.statemgr.ProjectContextMgrService; import a8k.service.app.appstate.statemgr.ProjectContextMgrService;
import a8k.service.app.appstate.type.ProjectContext;
import a8k.service.app.appstate.type.ProjectTaskContext;
import a8k.service.app.appstate.type.state.OptScanModuleState; import a8k.service.app.appstate.type.state.OptScanModuleState;
import a8k.service.app.devicectrl.ctrlservice.OptScanModuleCtrlService; import a8k.service.app.devicectrl.ctrlservice.OptScanModuleCtrlService;
import a8k.service.dao.type.a8kidcard.zenum.A8kOptType; import a8k.service.dao.type.a8kidcard.zenum.A8kOptType;
@ -69,7 +69,7 @@ public class PLATE_OPT_SCAN extends A8kStepAction {
} }
List<ReactionResult> doOptScanXX(ProjectContext cxt) throws AppException {
List<ReactionResult> doOptScanXX(ProjectTaskContext cxt) throws AppException {
List<ReactionResult> reactionResults = new ArrayList<>(); List<ReactionResult> reactionResults = new ArrayList<>();
if (virtualDevice.isEnable()) { if (virtualDevice.isEnable()) {

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

@ -191,7 +191,7 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction {
//如果测试模式设置好了试管扫描结果那么直接使用虚拟扫描结果 //如果测试模式设置好了试管扫描结果那么直接使用虚拟扫描结果
if (testModeState.getVirtualTubeScanResult() != null) { if (testModeState.getVirtualTubeScanResult() != null) {
if (result != null && result.isHasTubeInIt()) { if (result != null && result.isHasTubeInIt()) {
throw AppException.of("试管架中有试管,但是测试模式中设置了虚拟试管扫描结果");
throw AppException.ofAECodeError("试管架中有试管,但是测试模式中设置了虚拟试管扫描结果");
} }
result = testModeState.getVirtualTubeScanResult(); result = testModeState.getVirtualTubeScanResult();
} }

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

@ -7,7 +7,7 @@ import a8k.service.app.appctrl.mainflowctrl.base.A8kStepAction;
import a8k.service.app.appctrl.mainflowctrl.base.MainFlowProcesser; import a8k.service.app.appctrl.mainflowctrl.base.MainFlowProcesser;
import a8k.service.app.appdata.ProjInfoMgrService; import a8k.service.app.appdata.ProjInfoMgrService;
import a8k.service.app.appstate.statemgr.*; import a8k.service.app.appstate.statemgr.*;
import a8k.service.app.appstate.type.ProjectContext;
import a8k.service.app.appstate.type.ProjectTaskContext;
import a8k.service.app.appstate.type.Tube; import a8k.service.app.appstate.type.Tube;
import a8k.service.app.appstate.type.state.TubeState; import a8k.service.app.appstate.type.state.TubeState;
import a8k.service.bases.AppEventBusService; import a8k.service.bases.AppEventBusService;
@ -18,11 +18,8 @@ import a8k.type.ecode.AEConsumeNotEnoughError;
import a8k.type.ecode.AppError; import a8k.type.ecode.AppError;
import a8k.type.pos.Consumable; import a8k.type.pos.Consumable;
import a8k.type.pos.TipPos; import a8k.type.pos.TipPos;
import a8k.utils.ProjBuildinInfo;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.Assert; import org.springframework.util.Assert;
@ -140,8 +137,8 @@ public class SEQ3_APPLAY_RESOURCE extends A8kStepAction {
break; break;
} }
ProjExtInfoCard projInfo = projConfigMgrService.getProjExtInfoCard(consumable.getLotid());
ProjectContext cxt = projectContextMgrService.findCxt(tube.getSampleId(), toDoProj.getProjId());
ProjExtInfoCard projInfo = projConfigMgrService.getProjExtInfoCard(consumable.getLotid());
ProjectTaskContext cxt = projectContextMgrService.findCxt(tube.getSampleId(), toDoProj.getProjId());
cxt.setConsumable(consumable); cxt.setConsumable(consumable);
cxt.setTipPos(tipPos); cxt.setTipPos(tipPos);
cxt.setIncubatorPos(incubatorPos); cxt.setIncubatorPos(incubatorPos);
@ -153,12 +150,12 @@ public class SEQ3_APPLAY_RESOURCE extends A8kStepAction {
void backProjectResource(Tube tube) { void backProjectResource(Tube tube) {
for (var toDoProj : tube.getProjInfo()) { for (var toDoProj : tube.getProjInfo()) {
ProjectContext cxt = projectContextMgrService.findCxt(tube.getSampleId(), toDoProj.getProjId());
ProjectTaskContext cxt = projectContextMgrService.findCxt(tube.getSampleId(), toDoProj.getProjId());
backProjectResource(cxt); backProjectResource(cxt);
} }
} }
void backProjectResource(ProjectContext cxt) {
void backProjectResource(ProjectTaskContext cxt) {
var consumable = cxt.getConsumable(); var consumable = cxt.getConsumable();
var tipPos = cxt.getTipPos(); var tipPos = cxt.getTipPos();
var incubatorPos = cxt.getIncubatorPos(); var incubatorPos = cxt.getIncubatorPos();

64
src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ5_PROCESS.java

@ -7,13 +7,14 @@ import a8k.service.app.appctrl.mainflowctrl.base.*;
import a8k.service.app.appstate.statemgr.IncubationPlateStateMgrService; import a8k.service.app.appstate.statemgr.IncubationPlateStateMgrService;
import a8k.service.app.appstate.statemgr.ProjectContextMgrService; import a8k.service.app.appstate.statemgr.ProjectContextMgrService;
import a8k.service.app.appstate.statemgr.TubeStateMgrService; import a8k.service.app.appstate.statemgr.TubeStateMgrService;
import a8k.service.app.appstate.type.ProjectContext;
import a8k.service.app.appstate.type.ProjectTaskContext;
import a8k.service.app.appstate.type.Tube; import a8k.service.app.appstate.type.Tube;
import a8k.service.app.appstate.type.TubeHolder; import a8k.service.app.appstate.type.TubeHolder;
import a8k.service.app.appstate.type.state.TubeState; import a8k.service.app.appstate.type.state.TubeState;
import a8k.service.app.devicectrl.ctrlservice.PlateBoxCtrlService; import a8k.service.app.devicectrl.ctrlservice.PlateBoxCtrlService;
import a8k.service.app.devicectrl.ctrlservice.TubePreProcesCtrlService; import a8k.service.app.devicectrl.ctrlservice.TubePreProcesCtrlService;
import a8k.service.app.devicectrl.script.DeviceCtrlScripter; import a8k.service.app.devicectrl.script.DeviceCtrlScripter;
import a8k.service.app.erroranalyzer.ErrorAnalyzer;
import a8k.service.test.state.TestModeState; import a8k.service.test.state.TestModeState;
import a8k.service.test.state.VirtualDevice; import a8k.service.test.state.VirtualDevice;
import a8k.type.IncubatorPos; import a8k.type.IncubatorPos;
@ -63,9 +64,9 @@ public class SEQ5_PROCESS extends A8kStepAction {
// Base // Base
// //
@Resource @Resource
TestModeState testModeState;
TestModeState testModeState;
@Resource @Resource
VirtualDevice virtualDevice;
VirtualDevice virtualDevice;
// //
//State //State
// //
@ -76,16 +77,16 @@ public class SEQ5_PROCESS extends A8kStepAction {
@Resource @Resource
PublicAreaResourceMgr publicAreaResourceMgr; PublicAreaResourceMgr publicAreaResourceMgr;
@Resource @Resource
TubeStateMgrService tubeStateMgrService;
TubeStateMgrService tubeStateMgrService;
// //
// CtrlService // CtrlService
// //
@Resource @Resource
DeviceCtrlScripter deviceCtrlScripter;
DeviceCtrlScripter deviceCtrlScripter;
@Resource @Resource
PlateBoxCtrlService plateBoxCtrlService;
PlateBoxCtrlService plateBoxCtrlService;
@Resource @Resource
TubePreProcesCtrlService tubePreProcesCtrlService;
TubePreProcesCtrlService tubePreProcesCtrlService;
// //
@ -101,6 +102,7 @@ public class SEQ5_PROCESS extends A8kStepAction {
BoolCondition sampleIsReady = new BoolCondition(); BoolCondition sampleIsReady = new BoolCondition();
BoolCondition sampleProcessFinished = new BoolCondition(); BoolCondition sampleProcessFinished = new BoolCondition();
//待设置状态的孵育盘
List<IncubationStateCache> incubationStateCache = new ArrayList<>(); List<IncubationStateCache> incubationStateCache = new ArrayList<>();
@ -126,18 +128,16 @@ public class SEQ5_PROCESS extends A8kStepAction {
@Override public List<AppError> doAction() { @Override public List<AppError> doAction() {
if(virtualDevice.isEnable()){
futures.add(doActionTask("sampleProcess", this::samplePrepareVirtual));
futures.add(doActionTask("paltePrepare", this::paltePrepareVirtual));
futures.add(doActionTask("sampleProcess", this::sampleProcessVirtual));
}else{
futures.add(doActionTask("sampleProcess", this::samplePrepare));
futures.add(doActionTask("paltePrepare", this::paltePrepare));
futures.add(doActionTask("sampleProcess", this::sampleProcess));
}
if (virtualDevice.isEnable()) {
futures.add(doActionTask("sampleProcess", this::samplePrepareVirtual));
futures.add(doActionTask("paltePrepare", this::paltePrepareVirtual));
futures.add(doActionTask("sampleProcess", this::sampleProcessVirtual));
} else {
futures.add(doActionTask("sampleProcess", this::samplePrepare));
futures.add(doActionTask("paltePrepare", this::paltePrepare));
futures.add(doActionTask("sampleProcess", this::sampleProcess));
}
return wait(futures); return wait(futures);
} }
@ -146,10 +146,27 @@ public class SEQ5_PROCESS extends A8kStepAction {
*/ */
@Override @Override
public List<AppError> afterDoAction(List<AppError> errors) { public List<AppError> afterDoAction(List<AppError> errors) {
Tube tube = tubeStateMgrService.getCurProcessingTube();
List<ProjectTaskContext> ctxs = projectContextMgrService.findCxts(tube.getSampleId());
if (!errors.isEmpty()) { if (!errors.isEmpty()) {
return errors;
if (ErrorAnalyzer.isContainFatalError(errors)) {
return errors;
}
for (ProjectTaskContext cxt : ctxs) {
incubationPlateStateMgrService.setIncubationToErrorState(cxt.getIncubatorPos(), errors);
}
tubeStateMgrService.changeTubeStateToError(errors);
return List.of();
} }
tubeStateMgrService.changeTubeStateToProcessed(); tubeStateMgrService.changeTubeStateToProcessed();
for (IncubationStateCache cache : incubationStateCache) {
incubationPlateStateMgrService.startIncubating(cache.pos, cache.startIncubatedTime, cache.incubatedTimeSec);
}
return List.of(); return List.of();
} }
@ -233,9 +250,9 @@ public class SEQ5_PROCESS extends A8kStepAction {
// REAL // REAL
// //
List<ProjectContext> cxts = projectContextMgrService.findCxts(tube.getSampleId());
List<ProjectTaskContext> cxts = projectContextMgrService.findCxts(tube.getSampleId());
for (ProjectContext cxt : cxts) {
for (ProjectTaskContext cxt : cxts) {
IncubatorPos incubatorPos = cxt.getIncubatorPos(); IncubatorPos incubatorPos = cxt.getIncubatorPos();
try ( try (
@ -245,7 +262,6 @@ public class SEQ5_PROCESS extends A8kStepAction {
plateBoxCtrlService.pushPlateQuick(cxt.getConsumable().getGroup(), incubatorPos); plateBoxCtrlService.pushPlateQuick(cxt.getConsumable().getGroup(), incubatorPos);
} }
reactionPlateReady.set(); reactionPlateReady.set();
} }
} }
@ -256,14 +272,14 @@ public class SEQ5_PROCESS extends A8kStepAction {
//准备第一个项目的tip头 //准备第一个项目的tip头
List<ProjectContext> cxts = projectContextMgrService.findCxts(tube.getSampleId());
List<ProjectTaskContext> cxts = projectContextMgrService.findCxts(tube.getSampleId());
Assert.isTrue(!cxts.isEmpty(), "项目上下文不能为空"); Assert.isTrue(!cxts.isEmpty(), "项目上下文不能为空");
try ( try (
var ignored = publicAreaResourceMgr.apply(PublicAreaResource.HbotArea); var ignored = publicAreaResourceMgr.apply(PublicAreaResource.HbotArea);
) { ) {
for (ProjectContext cxt : cxts) {
for (ProjectTaskContext cxt : cxts) {
deviceCtrlScripter.doSampleProcessPrepare(cxt); deviceCtrlScripter.doSampleProcessPrepare(cxt);
sampleIsReady.waitTrue(); sampleIsReady.waitTrue();
deviceCtrlScripter.doSampleProcess(cxt); deviceCtrlScripter.doSampleProcess(cxt);

6
src/main/java/a8k/service/app/appdata/ReactionRecordMgrService.java

@ -3,7 +3,7 @@ package a8k.service.app.appdata;
import a8k.service.dao.ReactionRecordDao; import a8k.service.dao.ReactionRecordDao;
import a8k.service.dao.type.ReactionResultRecord; import a8k.service.dao.type.ReactionResultRecord;
import a8k.service.app.appstate.GStateService; import a8k.service.app.appstate.GStateService;
import a8k.service.app.appstate.type.ProjectContext;
import a8k.service.app.appstate.type.ProjectTaskContext;
import a8k.type.ReactionResult; import a8k.type.ReactionResult;
import a8k.type.db.CommonPage; import a8k.type.db.CommonPage;
import a8k.utils.ZJsonHelper; import a8k.utils.ZJsonHelper;
@ -34,11 +34,11 @@ public class ReactionRecordMgrService {
} }
public void addRecord(ProjectContext projContext, List<ReactionResult> results) {
public void addRecord(ProjectTaskContext projContext, List<ReactionResult> results) {
addRecord(projContext, results.toArray(new ReactionResult[0])); addRecord(projContext, results.toArray(new ReactionResult[0]));
} }
public void addRecord(ProjectContext projContext, ReactionResult... reactionResults) {
public void addRecord(ProjectTaskContext projContext, ReactionResult... reactionResults) {
if (reactionResults == null || reactionResults.length == 0) { if (reactionResults == null || reactionResults.length == 0) {
return; return;
} }

25
src/main/java/a8k/service/app/appstate/statemgr/IncubationPlateStateMgrService.java

@ -3,14 +3,17 @@ package a8k.service.app.appstate.statemgr;
import a8k.service.app.appstate.GStateService; import a8k.service.app.appstate.GStateService;
import a8k.service.app.appstate.type.IncubationPlate; import a8k.service.app.appstate.type.IncubationPlate;
import a8k.service.app.appstate.type.IncubationSubTank; import a8k.service.app.appstate.type.IncubationSubTank;
import a8k.service.app.appstate.type.SampleInfo;
import a8k.service.app.appstate.type.state.IncubationSubTankState; import a8k.service.app.appstate.type.state.IncubationSubTankState;
import a8k.type.IncubatorPos; import a8k.type.IncubatorPos;
import a8k.type.ecode.AppError;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.Date; import java.util.Date;
import java.util.List;
@Component @Component
@Slf4j @Slf4j
@ -105,6 +108,17 @@ public class IncubationPlateStateMgrService {
} }
} }
synchronized public void setIncubationToErrorState(IncubatorPos pos, List<AppError> errors) {
var subtanks = incubationPlate.subtanks;
for (IncubationSubTank subtank : subtanks) {
if (subtank.getPos().equals(pos)) {
subtank.state = IncubationSubTankState.ERROR;
subtank.errors = errors;
break;
}
}
}
synchronized public void resetAll() { synchronized public void resetAll() {
var subtanks = incubationPlate.subtanks; var subtanks = incubationPlate.subtanks;
for (IncubationSubTank subtank : subtanks) { for (IncubationSubTank subtank : subtanks) {
@ -112,12 +126,17 @@ public class IncubationPlateStateMgrService {
} }
} }
synchronized public void syncSampleInfo(IncubatorPos pos,SampleInfo sampleInfo){
var subtanks = incubationPlate.subtanks;
subtanks[pos.off]
}
synchronized public void startIncubating(IncubatorPos pos, Integer incubationTimeMin) {
synchronized public void startIncubating(IncubatorPos pos, Long startIncubatedTime,Integer incubatedTimeSec) {
var subtanks = incubationPlate.subtanks; var subtanks = incubationPlate.subtanks;
subtanks[pos.off].state = IncubationSubTankState.INCUBATING; subtanks[pos.off].state = IncubationSubTankState.INCUBATING;
subtanks[pos.off].startIncubatedTime = System.currentTimeMillis();
subtanks[pos.off].incubatedTimeSec = incubationTimeMin * 60;
subtanks[pos.off].startIncubatedTime = startIncubatedTime;
subtanks[pos.off].incubatedTimeSec = incubatedTimeSec;
log.info("{} 开始孵育,开始时间:{},孵育时间:{}s", subtanks[pos.off].getPos(), subtanks[pos.off].startIncubatedTime, log.info("{} 开始孵育,开始时间:{},孵育时间:{}s", subtanks[pos.off].getPos(), subtanks[pos.off].startIncubatedTime,
subtanks[pos.off].incubatedTimeSec); subtanks[pos.off].incubatedTimeSec);
} }

24
src/main/java/a8k/service/app/appstate/statemgr/ProjectContextMgrService.java

@ -27,11 +27,11 @@ public class ProjectContextMgrService {
@Resource @Resource
ConsumablesMgrService consumablesMgrService; ConsumablesMgrService consumablesMgrService;
List<ProjectContext> contexts = new ArrayList<>();
List<ProjectTaskContext> contexts = new ArrayList<>();
private void priRemoveCxt(String sampleId) { private void priRemoveCxt(String sampleId) {
List<ProjectContext> toBeRemoved = new ArrayList<>();
for (ProjectContext cxt : contexts) {
List<ProjectTaskContext> toBeRemoved = new ArrayList<>();
for (ProjectTaskContext cxt : contexts) {
if (cxt.getSampleInfo().sampleId.equals(sampleId)) { if (cxt.getSampleInfo().sampleId.equals(sampleId)) {
log.info("移除项目处理上下文 sampleId:{} projId:{}", sampleId, cxt.getSampleInfo().projId); log.info("移除项目处理上下文 sampleId:{} projId:{}", sampleId, cxt.getSampleInfo().projId);
toBeRemoved.add(cxt); toBeRemoved.add(cxt);
@ -55,11 +55,11 @@ public class ProjectContextMgrService {
sampleInfo.tubeHolderType = holder != null ? holder.getTubeHolderType() : null; sampleInfo.tubeHolderType = holder != null ? holder.getTubeHolderType() : null;
ProjectContext projectContext = new ProjectContext(String.format("S{}-P{}", tube.getSampleId(), projId), sampleInfo);
projectContext.setProjBuildinInfo(buildinInfo);
ProjectTaskContext projectTaskContext = new ProjectTaskContext(String.format("S{}-P{}", tube.getSampleId(), projId), sampleInfo);
projectTaskContext.setProjBuildinInfo(buildinInfo);
contexts.add(projectContext);
log.info("newProjCxt {}", ZJsonHelper.objectToJson(projectContext));
contexts.add(projectTaskContext);
log.info("newProjCxt {}", ZJsonHelper.objectToJson(projectTaskContext));
} }
synchronized public void newCxt(TubeHolder holder, Tube tube, List<ProjBuildinInfo> buildinInfos) { synchronized public void newCxt(TubeHolder holder, Tube tube, List<ProjBuildinInfo> buildinInfos) {
@ -86,8 +86,8 @@ public class ProjectContextMgrService {
// //
// findCxt // findCxt
// //
synchronized public ProjectContext findCxt(String sampleId, Integer projId) {
for (ProjectContext context : contexts) {
synchronized public ProjectTaskContext findCxt(String sampleId, Integer projId) {
for (ProjectTaskContext context : contexts) {
SampleInfo sampleInfo = context.getSampleInfo(); SampleInfo sampleInfo = context.getSampleInfo();
if (sampleInfo.sampleId.equals(sampleId) && sampleInfo.projId.equals(projId)) { if (sampleInfo.sampleId.equals(sampleId) && sampleInfo.projId.equals(projId)) {
return context; return context;
@ -96,9 +96,9 @@ public class ProjectContextMgrService {
return null; return null;
} }
synchronized public List<ProjectContext> findCxts(String sampleId) {
List<ProjectContext> ret = new ArrayList<>();
for (ProjectContext context : contexts) {
synchronized public List<ProjectTaskContext> findCxts(String sampleId) {
List<ProjectTaskContext> ret = new ArrayList<>();
for (ProjectTaskContext context : contexts) {
SampleInfo sampleInfo = context.getSampleInfo(); SampleInfo sampleInfo = context.getSampleInfo();
if (sampleInfo.sampleId.equals(sampleId)) { if (sampleInfo.sampleId.equals(sampleId)) {
ret.add(context); ret.add(context);

11
src/main/java/a8k/service/app/appstate/statemgr/TubeStateMgrService.java

@ -13,7 +13,7 @@ import a8k.service.dao.DeviceStatisticDao;
import a8k.service.dao.SampleRecordDBDao; import a8k.service.dao.SampleRecordDBDao;
import a8k.service.dao.type.SampleRecord; import a8k.service.dao.type.SampleRecord;
import a8k.service.dao.type.StatisticType; import a8k.service.dao.type.StatisticType;
import a8k.type.ProjBriefInfo;
import a8k.type.ecode.AppError;
import a8k.type.exception.AppException; import a8k.type.exception.AppException;
import a8k.type.type.BloodType; import a8k.type.type.BloodType;
import a8k.utils.ProjBuildinInfo; import a8k.utils.ProjBuildinInfo;
@ -33,7 +33,7 @@ import java.util.List;
@Slf4j @Slf4j
public class TubeStateMgrService { public class TubeStateMgrService {
@Resource @Resource
GStateService gstate;
GStateService gstate;
@Resource @Resource
ProjInfoMgrService projInfoMgrService; ProjInfoMgrService projInfoMgrService;
@Resource @Resource
@ -144,11 +144,11 @@ public class TubeStateMgrService {
*/ */
synchronized public void commitEmergencySampleSetting(String userid, String sampleBarcode, BloodType bloodType,// synchronized public void commitEmergencySampleSetting(String userid, String sampleBarcode, BloodType bloodType,//
List<Integer> projIds) throws AppException { List<Integer> projIds) throws AppException {
Tube tube = emergencyTubePos.tube;
Tube tube = emergencyTubePos.tube;
List<ProjBuildinInfo> projBuildInInfos = new ArrayList<>(); List<ProjBuildinInfo> projBuildInInfos = new ArrayList<>();
if (deviceWorkStateMgrService.getDeviceWorkState().workState.equals(A8kWorkState.WORKING)) { if (deviceWorkStateMgrService.getDeviceWorkState().workState.equals(A8kWorkState.WORKING)) {
throw new AppException(A8kEcode.APPE_ACTION_IS_NOT_ALLOWED_WHEN_WORKING);
throw new AppException(A8kEcode.APPE_ADD_EMERGENCY_ACTION_IS_NOT_ALLOWED_WHEN_WORKING);
} }
if (projIds.isEmpty()) { if (projIds.isEmpty()) {
@ -235,8 +235,9 @@ public class TubeStateMgrService {
curProcessingTube.setState(TubeState.PROCESSED); curProcessingTube.setState(TubeState.PROCESSED);
} }
synchronized public void changeTubeStateToError() {
synchronized public void changeTubeStateToError(List<AppError> errors) {
curProcessingTube.setState(TubeState.ERROR); curProcessingTube.setState(TubeState.ERROR);
curProcessingTube.setErrors(errors);
} }
synchronized public void changeTubeStateToProcessComplete() { synchronized public void changeTubeStateToProcessComplete() {

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

@ -16,7 +16,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
@Getter @Getter
public class IncubationSubTank implements Serializable {
public class IncubationSubTank implements Serializable {
//位置 //位置
@Schema(description = "位置") @Schema(description = "位置")
IncubatorPos pos; IncubatorPos pos;
@ -34,6 +34,12 @@ public class IncubationSubTank implements Serializable {
@Schema(description = "项目信息,用于显示") @Schema(description = "项目信息,用于显示")
ProjBriefInfo projInfo = new ProjBriefInfo(); //项目信息 ProjBriefInfo projInfo = new ProjBriefInfo(); //项目信息
@Schema(description = "样本ID,系统内部使用(不显示)")
String sampleId = "";
@Schema(description = "项目ID")
Integer projId = 0;
// //
//孵育时间 //孵育时间
@Schema(description = "开始孵育时间(ms时间戳)") @Schema(description = "开始孵育时间(ms时间戳)")
@ -41,10 +47,6 @@ public class IncubationSubTank implements Serializable {
@Schema(description = "目标孵育时间(s)") @Schema(description = "目标孵育时间(s)")
public Integer incubatedTimeSec = 0; //目标孵育时间 public Integer incubatedTimeSec = 0; //目标孵育时间
@Schema(description = "样本ID,系统内部使用(不显示)")
String sampleId = "";
@Schema(description = "项目ID")
Integer projId = 0;
@Setter @Setter
@Schema(description = "错误信息,用来标识当前孵育盘的错误信息,例如推出的反应板夹有问题") @Schema(description = "错误信息,用来标识当前孵育盘的错误信息,例如推出的反应板夹有问题")

4
src/main/java/a8k/service/app/appstate/type/ProjectContext.java → src/main/java/a8k/service/app/appstate/type/ProjectTaskContext.java

@ -11,7 +11,7 @@ import cn.hutool.core.util.ObjectUtil;
import java.util.List; import java.util.List;
public class ProjectContext {
public class ProjectTaskContext {
// 样本信息 // 样本信息
String cxtId; String cxtId;
SampleInfo sampleInfo = new SampleInfo(); SampleInfo sampleInfo = new SampleInfo();
@ -31,7 +31,7 @@ public class ProjectContext {
OptScanResult fOptScanResults = null; OptScanResult fOptScanResults = null;
public ProjectContext(String cxtId, SampleInfo sampleInfo) {
public ProjectTaskContext(String cxtId, SampleInfo sampleInfo) {
this.cxtId = cxtId; this.cxtId = cxtId;
this.sampleInfo = sampleInfo; this.sampleInfo = sampleInfo;
} }

1
src/main/java/a8k/service/app/devicectrl/ctrlservice/ConsumablesScanCtrlService.java

@ -2,7 +2,6 @@ package a8k.service.app.devicectrl.ctrlservice;
import a8k.service.app.devicectrl.exdriver.CodeScanerExDriver; import a8k.service.app.devicectrl.exdriver.CodeScanerExDriver;
import a8k.service.app.devicectrl.exdriver.HbotBaseMoveExDriver; import a8k.service.app.devicectrl.exdriver.HbotBaseMoveExDriver;
import a8k.service.bases.ActionReactorService;
import a8k.service.app.devicectrl.param.param_mgr.Hbot2DCodeScanParamMgr; import a8k.service.app.devicectrl.param.param_mgr.Hbot2DCodeScanParamMgr;
import a8k.service.test.state.VirtualDevice; import a8k.service.test.state.VirtualDevice;
import a8k.type.ConsumableOneChRawResult; import a8k.type.ConsumableOneChRawResult;

5
src/main/java/a8k/service/app/devicectrl/ctrlservice/DeviceInitCtrlService.java

@ -11,21 +11,16 @@ import a8k.service.app.devicectrl.driver.type.StepMotorMId;
import a8k.service.app.devicectrl.exdriver.HbotBaseMoveExDriver; import a8k.service.app.devicectrl.exdriver.HbotBaseMoveExDriver;
import a8k.service.app.devicectrl.exdriver.MotorEnableExDriver; import a8k.service.app.devicectrl.exdriver.MotorEnableExDriver;
import a8k.service.app.devicectrl.script.DeviceCtrlScripter; import a8k.service.app.devicectrl.script.DeviceCtrlScripter;
import a8k.service.bases.ActionReactorService;
import a8k.service.test.state.TestModeState;
import a8k.service.test.state.VirtualDevice; import a8k.service.test.state.VirtualDevice;
import a8k.type.CheckPointType; import a8k.type.CheckPointType;
import a8k.type.checkpoint.CheckResult; import a8k.type.checkpoint.CheckResult;
import a8k.type.checkpoint.Checkpoint; import a8k.type.checkpoint.Checkpoint;
import a8k.service.app.appstate.GStateService; import a8k.service.app.appstate.GStateService;
import a8k.service.app.devicectrl.driver.HbotDriver;
import a8k.type.exception.AppException; import a8k.type.exception.AppException;
import jakarta.annotation.PostConstruct; import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.ArrayList; import java.util.ArrayList;

2
src/main/java/a8k/service/app/devicectrl/ctrlservice/HbotCtrlService.java

@ -46,7 +46,7 @@ public class HbotCtrlService {
public void checkTipIndex(TipGroup tipGroup, Integer index) throws AppException { public void checkTipIndex(TipGroup tipGroup, Integer index) throws AppException {
if (index >= AppConstant.TIP_NUM) { if (index >= AppConstant.TIP_NUM) {
throw new AppException(A8kEcode.CODEERROR_PARAM_OUT_OF_RANGE);
throw new AppException(A8kEcode.PE_PARAM_OUT_OF_RANGE);
} }
} }

3
src/main/java/a8k/service/app/devicectrl/ctrlservice/OptScanModuleCtrlService.java

@ -11,7 +11,6 @@ import a8k.service.app.devicectrl.driver.type.OptModuleRegIndex;
import a8k.service.app.devicectrl.driver.type.StepMotorMId; import a8k.service.app.devicectrl.driver.type.StepMotorMId;
import a8k.service.app.devicectrl.param.param_mgr.OptModuleExtParamsMgr; import a8k.service.app.devicectrl.param.param_mgr.OptModuleExtParamsMgr;
import a8k.service.app.devicectrl.param.param_mgr.OptModuleParamsMgr; import a8k.service.app.devicectrl.param.param_mgr.OptModuleParamsMgr;
import a8k.service.bases.ActionReactorService;
import a8k.service.dao.type.OptRawScanData; import a8k.service.dao.type.OptRawScanData;
import a8k.service.dao.type.ProjOptInfo; import a8k.service.dao.type.ProjOptInfo;
import a8k.service.dao.type.ProjectBaseInfo; import a8k.service.dao.type.ProjectBaseInfo;
@ -36,8 +35,6 @@ public class OptScanModuleCtrlService {
@Resource @Resource
StepMotorCtrlDriver stepMotorCtrlDriver; StepMotorCtrlDriver stepMotorCtrlDriver;
@Resource @Resource
ActionReactorService actionReactor;
@Resource
OptModuleDriver optModuleDriver; OptModuleDriver optModuleDriver;
@Resource @Resource

6
src/main/java/a8k/service/app/devicectrl/ctrlservice/PlateBoxCtrlService.java

@ -1,11 +1,8 @@
package a8k.service.app.devicectrl.ctrlservice; package a8k.service.app.devicectrl.ctrlservice;
import a8k.extapi_controler.pagecontrol.ExtApiTabConfig;
import a8k.extapi_controler.utils.ExtApiTab;
import a8k.service.app.devicectrl.driver.StepMotorCtrlDriver; import a8k.service.app.devicectrl.driver.StepMotorCtrlDriver;
import a8k.service.app.devicectrl.driver.type.StepMotorMId; import a8k.service.app.devicectrl.driver.type.StepMotorMId;
import a8k.service.app.devicectrl.param.param_mgr.PlatesBoxPosParamMgr; import a8k.service.app.devicectrl.param.param_mgr.PlatesBoxPosParamMgr;
import a8k.service.bases.ActionReactorService;
import a8k.type.ConsumableGroup; import a8k.type.ConsumableGroup;
import a8k.type.IncubatorPos; import a8k.type.IncubatorPos;
import a8k.type.exception.AppException; import a8k.type.exception.AppException;
@ -21,8 +18,7 @@ public class PlateBoxCtrlService {
@Resource @Resource
StepMotorCtrlDriver stepMotorCtrlDriver; StepMotorCtrlDriver stepMotorCtrlDriver;
@Resource
ActionReactorService actionReactor;
@Resource @Resource

4
src/main/java/a8k/service/app/devicectrl/ctrlservice/TubePreProcesCtrlService.java

@ -55,12 +55,12 @@ public class TubePreProcesCtrlService {
//Z轴在原点 //Z轴在原点
if (!stepMotorCtrlDriver.stepMotorReadIoState(StepMotorMId.ShakeModGripperZM, 0)) { if (!stepMotorCtrlDriver.stepMotorReadIoState(StepMotorMId.ShakeModGripperZM, 0)) {
throw AppException.of(A8kEcode.CODEERROR_MOTOR_NOT_IN_ZERO_POS, MId.ShakeModGripperZM);
throw AppException.of(A8kEcode.LOW_EXT_ERROR_MOTOR_AT_WRONG_POS, MId.ShakeModGripperZM);
} }
//Y轴在零点附近 //Y轴在零点附近
if (!ZEQ.IntEq(miniServoDriver.miniServoReadPos(MiniServoMId.ShakeModGripperYSV), MiniServoConstant.getZeroPos(MiniServoMId.ShakeModGripperYSV), 30)) { if (!ZEQ.IntEq(miniServoDriver.miniServoReadPos(MiniServoMId.ShakeModGripperYSV), MiniServoConstant.getZeroPos(MiniServoMId.ShakeModGripperYSV), 30)) {
throw AppException.of(A8kEcode.CODEERROR_MOTOR_NOT_IN_ZERO_POS, MId.ShakeModGripperYSV);
throw AppException.of(A8kEcode.LOW_EXT_ERROR_MOTOR_AT_WRONG_POS, MId.ShakeModGripperYSV);
} }
tubePreProcesModuleExDriver.clampingMReleaseTube(); tubePreProcesModuleExDriver.clampingMReleaseTube();

6
src/main/java/a8k/service/app/devicectrl/ctrlservice/TurnableMoveCtrlService.java

@ -1,11 +1,8 @@
package a8k.service.app.devicectrl.ctrlservice; package a8k.service.app.devicectrl.ctrlservice;
import a8k.extapi_controler.pagecontrol.ExtApiTabConfig;
import a8k.extapi_controler.utils.ExtApiTab;
import a8k.service.app.devicectrl.driver.StepMotorCtrlDriver; import a8k.service.app.devicectrl.driver.StepMotorCtrlDriver;
import a8k.service.app.devicectrl.driver.type.StepMotorMId; import a8k.service.app.devicectrl.driver.type.StepMotorMId;
import a8k.service.app.devicectrl.param.param_mgr.TurntablePosParamMgr; import a8k.service.app.devicectrl.param.param_mgr.TurntablePosParamMgr;
import a8k.service.bases.ActionReactorService;
import a8k.type.IncubatorPos; import a8k.type.IncubatorPos;
import a8k.type.exception.AppException; import a8k.type.exception.AppException;
import a8k.hardware.A8kCanBusService; import a8k.hardware.A8kCanBusService;
@ -26,8 +23,7 @@ public class TurnableMoveCtrlService {
A8kCanBusService canBus; A8kCanBusService canBus;
@Resource @Resource
StepMotorCtrlDriver stepMotorCtrlDriver; StepMotorCtrlDriver stepMotorCtrlDriver;
@Resource
ActionReactorService actionReactor;
@Resource @Resource
TurntablePosParamMgr turntablePosParamMgr; TurntablePosParamMgr turntablePosParamMgr;

2
src/main/java/a8k/service/app/devicectrl/exdriver/HbotBaseMoveExDriver.java

@ -69,7 +69,7 @@ public class HbotBaseMoveExDriver {
pipetteCtrlDriver.zMotorMoveToZeroPointQuickBlock(); pipetteCtrlDriver.zMotorMoveToZeroPointQuickBlock();
} }
if (!pipetteCtrlDriver.zAixsZeroPointIsTrigger()) { if (!pipetteCtrlDriver.zAixsZeroPointIsTrigger()) {
throw new AppException(A8kEcode.CODEERROR_ZM_NOT_AT_ZERO_POS_WHEN_HBOT_TRY_MOVE);
throw new AppException(A8kEcode.LOW_EXT_ERROR_MOTOR_AT_WRONG_POS);
} }
// HBot移动 // HBot移动

4
src/main/java/a8k/service/app/devicectrl/exdriver/TubeTransportExDriver.java

@ -2,7 +2,6 @@ package a8k.service.app.devicectrl.exdriver;
import a8k.OS; import a8k.OS;
import a8k.constant.MiniServoConstant; import a8k.constant.MiniServoConstant;
import a8k.extapi_controler.utils.ExtApiFn;
import a8k.hardware.A8kCanBusService; import a8k.hardware.A8kCanBusService;
import a8k.hardware.type.a8kcanprotocol.A8kEcode; import a8k.hardware.type.a8kcanprotocol.A8kEcode;
import a8k.hardware.type.a8kcanprotocol.MId; import a8k.hardware.type.a8kcanprotocol.MId;
@ -10,7 +9,6 @@ import a8k.service.app.devicectrl.driver.MiniServoDriver;
import a8k.service.app.devicectrl.driver.StepMotorCtrlDriver; import a8k.service.app.devicectrl.driver.StepMotorCtrlDriver;
import a8k.service.app.devicectrl.driver.type.MiniServoMId; import a8k.service.app.devicectrl.driver.type.MiniServoMId;
import a8k.service.app.devicectrl.driver.type.StepMotorMId; import a8k.service.app.devicectrl.driver.type.StepMotorMId;
import a8k.service.app.devicectrl.param.param_mgr.TubeFeedingModuleParamMgr;
import a8k.type.TargetPosMeasureDirection; import a8k.type.TargetPosMeasureDirection;
import a8k.type.exception.AppException; import a8k.type.exception.AppException;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
@ -43,7 +41,7 @@ public class TubeTransportExDriver {
*/ */
public void moveTubeRackTo(Integer pos, TargetPosMeasureDirection moveDiretion, Boolean moveToZero) throws AppException { public void moveTubeRackTo(Integer pos, TargetPosMeasureDirection moveDiretion, Boolean moveToZero) throws AppException {
if (!stepMotorCtrlDriver.stepMotorReadIoState(StepMotorMId.ShakeModGripperZM, 0)) { if (!stepMotorCtrlDriver.stepMotorReadIoState(StepMotorMId.ShakeModGripperZM, 0)) {
throw new AppException(A8kEcode.CODEERROR_SHAKE_MOD_GRIPPER_ZMOTOR_NOT_IN_ZERO_POS);
throw new AppException(A8kEcode.LOW_EXT_ERROR_MOTOR_AT_WRONG_POS);
} }
//打开扫码夹具 //打开扫码夹具
scanClampModRelease(); scanClampModRelease();

5
src/main/java/a8k/service/app/devicectrl/param/calibration/OptModuleParamCalibration.java

@ -14,6 +14,7 @@ import a8k.service.app.devicectrl.param.type.OptModuleExtParam;
import a8k.service.dao.type.Parameter; import a8k.service.dao.type.Parameter;
import a8k.service.dao.type.a8kidcard.zenum.A8kOptType; import a8k.service.dao.type.a8kidcard.zenum.A8kOptType;
import a8k.type.*; import a8k.type.*;
import a8k.type.ecode.AECodeError;
import a8k.type.exception.AppException; import a8k.type.exception.AppException;
import a8k.utils.opt_gain_convert.OptGainConvert; import a8k.utils.opt_gain_convert.OptGainConvert;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
@ -147,7 +148,7 @@ public class OptModuleParamCalibration {
@ExtApiFn(name = "设置F光学扫描偏移", group = "F光学", order = 300) @ExtApiFn(name = "设置F光学扫描偏移", group = "F光学", order = 300)
public void setFOptScanShift(Integer shift) throws AppException { public void setFOptScanShift(Integer shift) throws AppException {
if (shift < 0) { if (shift < 0) {
throw AppException.of("扫描偏移量必须大于0");
throw AppException.ofAECodeError("扫描偏移量必须大于0");
} }
optModuleExtParamsMgr.setOptParam(OptModuleExtParam.FOptScanShift, shift); optModuleExtParamsMgr.setOptParam(OptModuleExtParam.FOptScanShift, shift);
} }
@ -178,7 +179,7 @@ public class OptModuleParamCalibration {
@ExtApiFn(name = "设置T光学扫描偏移", group = "T光学", order = 400) @ExtApiFn(name = "设置T光学扫描偏移", group = "T光学", order = 400)
public void setTOptScanShift(Integer shift) throws AppException { public void setTOptScanShift(Integer shift) throws AppException {
if (shift < 0) { if (shift < 0) {
throw AppException.of("扫描偏移量必须大于0");
throw AppException.ofAECodeError("扫描偏移量必须大于0");
} }
optModuleExtParamsMgr.setOptParam(OptModuleExtParam.TOptScanShift, shift); optModuleExtParamsMgr.setOptParam(OptModuleExtParam.TOptScanShift, shift);
} }

2
src/main/java/a8k/service/app/devicectrl/param/calibration/PipetteGunLLDParamCalibration.java

@ -87,7 +87,7 @@ public class PipetteGunLLDParamCalibration {
@ExtApiFn(name = "LDD测量液体属性", group = "测试", order = 103) @ExtApiFn(name = "LDD测量液体属性", group = "测试", order = 103)
public Object lldCalibrate() throws AppException { public Object lldCalibrate() throws AppException {
if (lldStartPos > lldEndPos) { if (lldStartPos > lldEndPos) {
throw AppException.of("开始位置大于结束位置");
throw AppException.ofAECodeError("开始位置大于结束位置");
} }
pipetteCtrlDriver.zMotorEnable(1); pipetteCtrlDriver.zMotorEnable(1);

6
src/main/java/a8k/service/app/devicectrl/param/ext_param_mgr/PipetteGunParamExMgr.java

@ -1,6 +1,6 @@
package a8k.service.app.devicectrl.param.ext_param_mgr; package a8k.service.app.devicectrl.param.ext_param_mgr;
import a8k.service.app.appstate.type.ProjectContext;
import a8k.service.app.appstate.type.ProjectTaskContext;
import a8k.service.app.devicectrl.param.ext_param_mgr.base.PipetteGunBindActionType; import a8k.service.app.devicectrl.param.ext_param_mgr.base.PipetteGunBindActionType;
import a8k.service.app.devicectrl.param.ext_param_mgr.base.LLDParamPack; import a8k.service.app.devicectrl.param.ext_param_mgr.base.LLDParamPack;
import a8k.service.app.devicectrl.param.ext_param_mgr.base.LLFParamPack; import a8k.service.app.devicectrl.param.ext_param_mgr.base.LLFParamPack;
@ -42,7 +42,7 @@ public class PipetteGunParamExMgr {
* @param cxt 上下文 * @param cxt 上下文
* @return 液面探测相关参数 * @return 液面探测相关参数
*/ */
public LLDParamPack getLLDParam(PipetteGunBindActionType type, ProjectContext cxt) {
public LLDParamPack getLLDParam(PipetteGunBindActionType type, ProjectTaskContext cxt) {
LLDParamPack paramPack = null; LLDParamPack paramPack = null;
switch (type) { switch (type) {
case SAMPLE -> { case SAMPLE -> {
@ -81,7 +81,7 @@ public class PipetteGunParamExMgr {
* @param cxt 上下文 * @param cxt 上下文
* @return 液面跟随相关参数 * @return 液面跟随相关参数
*/ */
public LLFParamPack getLLFParam(PipetteGunBindActionType type, ProjectContext cxt) {
public LLFParamPack getLLFParam(PipetteGunBindActionType type, ProjectTaskContext cxt) {
LLFParamPack paramPack = null; LLFParamPack paramPack = null;
switch (type) { switch (type) {
// 取样 // 取样

20
src/main/java/a8k/service/app/devicectrl/script/DeviceCtrlScripter.java

@ -1,6 +1,6 @@
package a8k.service.app.devicectrl.script; package a8k.service.app.devicectrl.script;
import a8k.service.app.appstate.type.ProjectContext;
import a8k.service.app.appstate.type.ProjectTaskContext;
import a8k.service.app.devicectrl.ctrlservice.HbotCtrlService; import a8k.service.app.devicectrl.ctrlservice.HbotCtrlService;
import a8k.service.app.devicectrl.ctrlservice.OptScanModuleCtrlService; import a8k.service.app.devicectrl.ctrlservice.OptScanModuleCtrlService;
import a8k.service.app.devicectrl.ctrlservice.TurnableMoveCtrlService; import a8k.service.app.devicectrl.ctrlservice.TurnableMoveCtrlService;
@ -14,7 +14,6 @@ import a8k.service.app.devicectrl.param.ext_param_mgr.base.LLFParamPack;
import a8k.service.app.devicectrl.param.param_mgr.HbotFixedPosParamMgr; import a8k.service.app.devicectrl.param.param_mgr.HbotFixedPosParamMgr;
import a8k.service.app.devicectrl.param.param_mgr.HbotSamplePosParamMgr; import a8k.service.app.devicectrl.param.param_mgr.HbotSamplePosParamMgr;
import a8k.service.app.devicectrl.param.type.A8kSamplePos; import a8k.service.app.devicectrl.param.type.A8kSamplePos;
import a8k.service.bases.ActionReactorService;
import a8k.service.dao.type.a8kidcard.zenum.A8kReactionFlowType; import a8k.service.dao.type.a8kidcard.zenum.A8kReactionFlowType;
import a8k.type.cfg.Pos3d; import a8k.type.cfg.Pos3d;
import a8k.type.exception.AppException; import a8k.type.exception.AppException;
@ -31,8 +30,7 @@ import org.springframework.util.Assert;
@Slf4j @Slf4j
public class DeviceCtrlScripter { public class DeviceCtrlScripter {
@Resource
ActionReactorService actionReactor;
@Resource @Resource
PipetteCtrlDriver pipetteCtrlDriver; PipetteCtrlDriver pipetteCtrlDriver;
@Resource @Resource
@ -81,7 +79,7 @@ public class DeviceCtrlScripter {
} }
void distribute(PipetteGunBindActionType actionType, ProjectContext ctx, Integer ul) throws AppException {
void distribute(PipetteGunBindActionType actionType, ProjectTaskContext ctx, Integer ul) throws AppException {
LLFParamPack llfParamPack = pipetteGunParamExMgr.getLLFParam(actionType, ctx); LLFParamPack llfParamPack = pipetteGunParamExMgr.getLLFParam(actionType, ctx);
pipetteCtrlDriver.aspirateSetLlfVelocity(llfParamPack.llfVel); pipetteCtrlDriver.aspirateSetLlfVelocity(llfParamPack.llfVel);
pipetteCtrlDriver.setLlfStartZ(llfParamPack.llfStartPos); pipetteCtrlDriver.setLlfStartZ(llfParamPack.llfStartPos);
@ -89,7 +87,7 @@ public class DeviceCtrlScripter {
pipetteCtrlDriver.aspirateBlock(-ul); pipetteCtrlDriver.aspirateBlock(-ul);
} }
void mix(PipetteGunBindActionType actionType, ProjectContext ctx, Integer ul, Integer times) throws AppException {
void mix(PipetteGunBindActionType actionType, ProjectTaskContext ctx, Integer ul, Integer times) throws AppException {
LLFParamPack llfParamPack = pipetteGunParamExMgr.getLLFParam(actionType, ctx); LLFParamPack llfParamPack = pipetteGunParamExMgr.getLLFParam(actionType, ctx);
pipetteCtrlDriver.aspirateSetLlfVelocity(llfParamPack.llfVel); pipetteCtrlDriver.aspirateSetLlfVelocity(llfParamPack.llfVel);
pipetteCtrlDriver.setLlfStartZ(llfParamPack.llfStartPos); pipetteCtrlDriver.setLlfStartZ(llfParamPack.llfStartPos);
@ -98,7 +96,7 @@ public class DeviceCtrlScripter {
} }
void aspirate(PipetteGunBindActionType actionType, ProjectContext ctx, Integer ul) throws AppException {
void aspirate(PipetteGunBindActionType actionType, ProjectTaskContext ctx, Integer ul) throws AppException {
LLFParamPack llfParamPack = pipetteGunParamExMgr.getLLFParam(actionType, ctx); LLFParamPack llfParamPack = pipetteGunParamExMgr.getLLFParam(actionType, ctx);
log.info("吸液 {} , llfvel {} , llfStartPos {} , llfEndPos {}", ul, llfParamPack.llfVel, llfParamPack.llfStartPos, llfParamPack.llfEndPos); log.info("吸液 {} , llfvel {} , llfStartPos {} , llfEndPos {}", ul, llfParamPack.llfVel, llfParamPack.llfStartPos, llfParamPack.llfEndPos);
@ -109,7 +107,7 @@ public class DeviceCtrlScripter {
} }
void lld(PipetteGunBindActionType actionType, ProjectContext ctx) throws AppException {
void lld(PipetteGunBindActionType actionType, ProjectTaskContext ctx) throws AppException {
pipetteCtrlDriver.lldPrepareBlock(); pipetteCtrlDriver.lldPrepareBlock();
log.info("液面探测 {}", actionType); log.info("液面探测 {}", actionType);
@ -143,7 +141,7 @@ public class DeviceCtrlScripter {
} }
public void doSampleProcessPrepare(ProjectContext ctx) throws AppException {
public void doSampleProcessPrepare(ProjectTaskContext ctx) throws AppException {
A8kReactionFlowType type = ctx.getProjBuildinInfo().getReactionFlowType(); A8kReactionFlowType type = ctx.getProjBuildinInfo().getReactionFlowType();
if (type.equals(A8kReactionFlowType.FlowType1)) { if (type.equals(A8kReactionFlowType.FlowType1)) {
log.info("样本预处理,刺破小瓶缓冲液"); log.info("样本预处理,刺破小瓶缓冲液");
@ -208,7 +206,7 @@ public class DeviceCtrlScripter {
} }
} }
public void doSampleProcess(ProjectContext ctx) throws AppException {
public void doSampleProcess(ProjectTaskContext ctx) throws AppException {
Integer sampleul = ProjProcessContextUtils.getSampleVol(ctx); Integer sampleul = ProjProcessContextUtils.getSampleVol(ctx);
Integer reactionul = ProjProcessContextUtils.getReactionPlateDropletVolUl(ctx); Integer reactionul = ProjProcessContextUtils.getReactionPlateDropletVolUl(ctx);
@ -244,7 +242,7 @@ public class DeviceCtrlScripter {
} }
public void doSampleProcessPostProcess(ProjectContext ctx) throws AppException {
public void doSampleProcessPostProcess(ProjectTaskContext ctx) throws AppException {
Integer sampleul = ProjProcessContextUtils.getSampleVol(ctx); Integer sampleul = ProjProcessContextUtils.getSampleVol(ctx);
Integer reactionul = ProjProcessContextUtils.getReactionPlateDropletVolUl(ctx); Integer reactionul = ProjProcessContextUtils.getReactionPlateDropletVolUl(ctx);

26
src/main/java/a8k/service/app/erroranalyzer/ErrorAnalyzer.java

@ -0,0 +1,26 @@
package a8k.service.app.erroranalyzer;
import a8k.hardware.type.a8kcanprotocol.A8kEcode;
import a8k.type.ecode.AppError;
import java.util.List;
public class ErrorAnalyzer {
static public Boolean isFatalError(A8kEcode ecode) {
if (ecode.index >= A8kEcode.LOW_ERROR_HARDWARE_ERROR_START.index) {
//部分底层错误属于非必须停机的错误
return !ecode.equals(A8kEcode.LOW_ERROR_PIPETTE_ERROR_TIP_POP_ERROR)
&& !ecode.equals(A8kEcode.LOW_ERROR_PIPETTE_ERROR_LLD_ERROR);
}
return false;
}
static public Boolean isContainFatalError(List<AppError> errors) {
for (AppError error : errors) {
if (isFatalError(error.code)) {
return true;
}
}
return false;
}
}

123
src/main/java/a8k/service/bases/ActionReactorService.java

@ -1,123 +0,0 @@
package a8k.service.bases;
import a8k.extapi_controler.pagecontrol.ExtApiTabConfig;
import a8k.extapi_controler.utils.ExtApiStatu;
import a8k.extapi_controler.utils.ExtApiFn;
import a8k.extapi_controler.utils.ExtApiTab;
import a8k.hardware.type.a8kcanprotocol.A8kEcode;
import a8k.type.ZFunction;
import a8k.type.exception.AppException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
/**
* 动作单步调试服务
* 所有使用dosome接口的动作都可以被单步调试
*/
@Component
@ExtApiTab(cfg = ExtApiTabConfig.ActionReactorService)
public class ActionReactorService {
public enum DoWhatNext {
DoNextAction,
ReDoAction,
}
static Logger logger = LoggerFactory.getLogger(ActionReactorService.class);
static class ORDER {
static final int doNextStep = 1;
static final int reDoStep = 2;
static final int breakAction = 3;
static final int fullSpeedRun = 6;
static final int singleStepRun = 7;
}
Boolean reDo = false;
Boolean doNext = false;
Boolean breakAction = false;
Boolean fullSpeedRun = true;
String curStep;
DoWhatNext breakpoint() throws AppException {
while (true) {
if (reDo) {
reDo = false;
return DoWhatNext.ReDoAction;
}
if (doNext) {
doNext = false;
return DoWhatNext.DoNextAction;
}
if (breakAction) {
breakAction = false;
throw new AppException(A8kEcode.ACTION_REACTOR_SERVICE_BREAKBYUSR);
}
if (fullSpeedRun) {
return DoWhatNext.DoNextAction;
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
throw new AppException(A8kEcode.ACTION_REACTOR_SERVICE_BREAKBYUSR);
}
}
}
public void dosome(String mark, ZFunction action) throws AppException{
while (true) {
logger.info("do {}", mark);
curStep = mark;
action.fn();
DoWhatNext next = breakpoint();
if (next == DoWhatNext.DoNextAction) {
break;
}
}
curStep = "";
}
@ExtApiFn(name = "下一步", order = ORDER.doNextStep)
public void doNextStep() {
doNext = true;
}
@ExtApiFn(name = "重新执行当前步骤", order = ORDER.reDoStep)
public void reDoStep() {
reDo = true;
}
@ExtApiFn(name = "中断动作", order = ORDER.breakAction)
public void breakAction() {
breakAction = true;
}
@ExtApiFn(name = "全速模式", order = ORDER.fullSpeedRun)
public void fullSpeedRun() {
fullSpeedRun = true;
}
@ExtApiFn(name = "单步模式", order = ORDER.singleStepRun)
public void singleStepRun() {
fullSpeedRun = false;
}
@ExtApiStatu(name = "全速运行")
public Boolean getFullSpeedRun() {
return fullSpeedRun;
}
@ExtApiStatu(name = "当前步骤")
public String getCurStep() {
return curStep;
}
}

2
src/main/java/a8k/service/test/MainflowCtrlTestService.java

@ -239,7 +239,7 @@ public class MainflowCtrlTestService {
void doOnceSimpleTest(FakeProjInfo proj, ConsumableGroup consumablegroup, Integer tubeNum) throws AppException { void doOnceSimpleTest(FakeProjInfo proj, ConsumableGroup consumablegroup, Integer tubeNum) throws AppException {
if (tubeNum <= 0) { if (tubeNum <= 0) {
throw AppException.of("试管数量必须大于0");
throw AppException.ofAECodeError("试管数量必须大于0");
} }
gstate.setDeviceInited(true); gstate.setDeviceInited(true);

2
src/main/java/a8k/service/test/PipetteGunTest.java

@ -85,7 +85,7 @@ public class PipetteGunTest {
@ExtApiFn(name = "LDD测量液体属性", group = "测试", order = 103) @ExtApiFn(name = "LDD测量液体属性", group = "测试", order = 103)
public Object lldCalibrate() throws AppException { public Object lldCalibrate() throws AppException {
if (lldStartPos > lldEndPos) { if (lldStartPos > lldEndPos) {
throw AppException.of("开始位置大于结束位置");
throw AppException.ofAECodeError("开始位置大于结束位置");
} }
pipetteCtrlDriver.zMotorEnable(1); pipetteCtrlDriver.zMotorEnable(1);

4
src/main/java/a8k/type/appret/ApiV1Ret.java

@ -58,9 +58,9 @@ public class ApiV1Ret<T> {
if (e instanceof AppException hexcep) { if (e instanceof AppException hexcep) {
r.data = hexcep.error; r.data = hexcep.error;
} else if (e instanceof ValidationException ex) { } else if (e instanceof ValidationException ex) {
r.data = new AECodeError(A8kEcode.CODEERROR_PARAM_OUT_OF_RANGE, ex.getLocalizedMessage());
r.data = new AECodeError( ex.getLocalizedMessage());
} else if (e instanceof HandlerMethodValidationException validationE) { } else if (e instanceof HandlerMethodValidationException validationE) {
r.data = new AECodeError(A8kEcode.CODEERROR_PARAM_OUT_OF_RANGE, validationE.getMessage());
r.data = new AECodeError(validationE.getMessage());
} else { } else {
r.data = new AECodeError(e.getMessage()); r.data = new AECodeError(e.getMessage());
} }

4
src/main/java/a8k/type/appret/AppRetV1.java

@ -43,9 +43,9 @@ public class AppRetV1 {
if (e instanceof AppException hexcep) { if (e instanceof AppException hexcep) {
r.ecode = hexcep.error; r.ecode = hexcep.error;
} else if (e instanceof ValidationException ex) { } else if (e instanceof ValidationException ex) {
r.ecode = new AECodeError(A8kEcode.CODEERROR_PARAM_OUT_OF_RANGE, ex.getLocalizedMessage());
r.ecode = new AECodeError( ex.getLocalizedMessage());
} else if (e instanceof HandlerMethodValidationException validationE) { } else if (e instanceof HandlerMethodValidationException validationE) {
r.ecode = new AECodeError(A8kEcode.CODEERROR_PARAM_OUT_OF_RANGE, validationE.getMessage());
r.ecode = new AECodeError( validationE.getMessage());
} else { } else {
r.ecode = new AECodeError(e.getMessage()); r.ecode = new AECodeError(e.getMessage());
} }

30
src/main/java/a8k/type/ecode/AECodeError.java

@ -1,17 +1,39 @@
package a8k.type.ecode; package a8k.type.ecode;
import a8k.hardware.type.a8kcanprotocol.A8kEcode; import a8k.hardware.type.a8kcanprotocol.A8kEcode;
import a8k.type.exception.AppException;
import a8k.utils.ZJsonHelper;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
public class AECodeError extends AppError { public class AECodeError extends AppError {
@Schema(description = "异常栈信息")
public StackTraceElement[] stackTraceElements;
public AECodeError(String exmsg) { public AECodeError(String exmsg) {
super(A8kEcode.CODEERROR); super(A8kEcode.CODEERROR);
this.exmsg = exmsg;
this.exmsg = exmsg;
stackTraceElements = Thread.currentThread().getStackTrace();
} }
public AECodeError(A8kEcode ecode, String exmsg) {
super(ecode);
this.exmsg = exmsg;
public AECodeError(String fmt, Object... args) {
super(A8kEcode.CODEERROR);
this.exmsg = String.format(fmt, args);
stackTraceElements = Thread.currentThread().getStackTrace();
} }
public AECodeError(Exception e) {
super(A8kEcode.CODEERROR);
this.exmsg = e.getMessage();
stackTraceElements = e.getStackTrace();
}
public static void main(String[] args) {
try {
throw new Exception("test");
} catch (Exception e) {
AECodeError aeCodeError = new AECodeError(e);
System.out.println(ZJsonHelper.objToPrettyJson(aeCodeError));
}
}
} }

13
src/main/java/a8k/type/ecode/AECommonError.java

@ -1,13 +0,0 @@
package a8k.type.ecode;
import a8k.hardware.type.a8kcanprotocol.A8kEcode;
import io.swagger.v3.oas.annotations.media.Schema;
public class AECommonError extends AppError {
public AECommonError(String exmsg) {
super(A8kEcode.COMMON_ERROR);
this.exmsg = exmsg;
}
}

22
src/main/java/a8k/type/ecode/AEUnkownExceptionError.java

@ -1,22 +0,0 @@
package a8k.type.ecode;
import a8k.hardware.type.a8kcanprotocol.A8kEcode;
import io.swagger.v3.oas.annotations.media.Schema;
import java.util.Arrays;
public class AEUnkownExceptionError extends AppError {
@Schema(description = "异常描述")
public String decription;
@Schema(description = "异常栈信息")
public String stackTrace;
Exception exception;
public AEUnkownExceptionError(Exception exception) {
super(A8kEcode.CODEERROR_UNKOWN_EXCEPTION);
this.decription = exception.getMessage();
this.stackTrace = Arrays.toString(exception.getStackTrace());
this.exception = exception;
}
}

16
src/main/java/a8k/type/exception/AppException.java

@ -3,7 +3,7 @@ package a8k.type.exception;
import a8k.hardware.type.a8kcanprotocol.A8kEcode; import a8k.hardware.type.a8kcanprotocol.A8kEcode;
import a8k.hardware.type.a8kcanprotocol.CmdId; import a8k.hardware.type.a8kcanprotocol.CmdId;
import a8k.hardware.type.a8kcanprotocol.MId; import a8k.hardware.type.a8kcanprotocol.MId;
import a8k.type.ecode.AECommonError;
import a8k.type.ecode.AECodeError;
import a8k.type.ecode.AppError; import a8k.type.ecode.AppError;
import a8k.type.ecode.AEHardwareError; import a8k.type.ecode.AEHardwareError;
import lombok.Getter; import lombok.Getter;
@ -35,23 +35,13 @@ public class AppException extends Exception {
return new AppException(new AEHardwareError(errorCode, mid, null)); return new AppException(new AEHardwareError(errorCode, mid, null));
} }
public static AppException of(AEHardwareError AEHardwareError) { public static AppException of(AEHardwareError AEHardwareError) {
return new AppException(AEHardwareError); return new AppException(AEHardwareError);
} }
public static AppException of(String message) {
return new AppException(new AECommonError(message));
public static AppException ofAECodeError(String fmt, Object... args) {
return new AppException(new AECodeError(fmt, args));
} }
//
// public void print() {
//// printStackTrace();
// log.error("error {}",this.getMessage(), this);
//// log.error("exception {}", this.toString());
//// for (StackTraceElement ste : this.getStackTrace()) {
//// log.error(ste.toString());
//// }
// }
} }

22
src/main/java/a8k/type/exception/MutiAppException.java

@ -1,22 +0,0 @@
package a8k.type.exception;
import a8k.hardware.type.a8kcanprotocol.A8kEcode;
import a8k.type.ecode.AppError;
import a8k.utils.AppExceptionUtils;
import com.fasterxml.jackson.annotation.JsonIgnore;
import java.util.List;
public class MutiAppException extends AppException {
public List<AppException> bindExceptions;
public MutiAppException(List<AppException> exceptions) {
super(A8kEcode.MUTI_APPEXCEPTIONS);
bindExceptions = exceptions;
}
@JsonIgnore
public List<AppError> getErrors() {
return AppExceptionUtils.toAppErrorList(bindExceptions);
}
}

7
src/main/java/a8k/type/exception/ZAppInterruptException.java

@ -1,11 +1,4 @@
package a8k.type.exception; package a8k.type.exception;
import a8k.hardware.type.a8kcanprotocol.A8kEcode;
import a8k.hardware.type.a8kcanprotocol.CmdId;
import a8k.hardware.type.a8kcanprotocol.MId;
import a8k.type.ecode.AECommonError;
import a8k.type.ecode.AEHardwareError;
import a8k.type.ecode.AppError;
import lombok.Getter; import lombok.Getter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;

53
src/main/java/a8k/utils/ActionParallerExceutor.java

@ -1,53 +0,0 @@
package a8k.utils;
import a8k.OS;
import a8k.type.exception.AppException;
import a8k.type.exception.MutiAppException;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.*;
public class ActionParallerExceutor {
ThreadPoolExecutor executor = new ThreadPoolExecutor(3, 3, 0, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(10));
List<Future<AppException>> futures = new ArrayList<>();
// var doPrepareReactionPlateFuture = executor.submit(() -> ZFnCall.callfn(this::prepareReactionPlate));
//摇匀并取盖
// var doShakeAndTakeCapFuture = executor.submit(() -> ZFnCall.callfn(this::shakeAndTakeCap));
//准备Hbot Tip
// var doHbotPrepareTipFuture = executor.submit(() -> ZFnCall.callfn(this::hbotPrepareTip));
public void submit(ZFnCall.Fn fn) {
var future = executor.submit(() -> ZFnCall.callfn(fn));
futures.add(future);
}
public MutiAppException waitAll() {
futures.forEach(this::wait);
List<AppException> exceptions = new java.util.ArrayList<>(List.of());
try {
for (Future<AppException> future : futures) {
exceptions.add(future.get());
}
} catch (InterruptedException | ExecutionException ignored) {
}
exceptions.removeIf(Objects::isNull);
if (exceptions.isEmpty()) {
return null;
}
return new MutiAppException(exceptions);
// List<AppError> errors = new java.util.ArrayList<>(List.of());
// exceptions.forEach(e -> errors.add(e.getError()));
}
void wait(Future<?> future) {
while (!future.isDone()) {
OS.forceSleep(100);
}
}
}

1
src/main/java/a8k/utils/AppExceptionBuilder.java

@ -5,7 +5,6 @@ import a8k.type.ecode.AECodeError;
import a8k.type.ecode.AppError; import a8k.type.ecode.AppError;
import a8k.type.ecode.AEConsumeNotEnoughError; import a8k.type.ecode.AEConsumeNotEnoughError;
import a8k.type.exception.AppException; import a8k.type.exception.AppException;
import a8k.type.exception.MutiAppException;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;

22
src/main/java/a8k/utils/ProjProcessContextUtils.java

@ -2,7 +2,7 @@ package a8k.utils;
import a8k.SpringBootBeanUtil; import a8k.SpringBootBeanUtil;
import a8k.service.app.appstate.statemgr.ProjectContextMgrService; import a8k.service.app.appstate.statemgr.ProjectContextMgrService;
import a8k.service.app.appstate.type.ProjectContext;
import a8k.service.app.appstate.type.ProjectTaskContext;
import a8k.service.app.appstate.type.Tube; import a8k.service.app.appstate.type.Tube;
import a8k.service.app.devicectrl.param.ext_param_mgr.HbotConsumableParamMgr; import a8k.service.app.devicectrl.param.ext_param_mgr.HbotConsumableParamMgr;
import a8k.service.app.devicectrl.param.type.A8kSamplePos; import a8k.service.app.devicectrl.param.type.A8kSamplePos;
@ -16,7 +16,7 @@ import java.util.List;
public class ProjProcessContextUtils { public class ProjProcessContextUtils {
public static Integer getShakeTimes(List<ProjectContext> cxts) {
public static Integer getShakeTimes(List<ProjectTaskContext> cxts) {
int shakeTimes = 0; int shakeTimes = 0;
for (var cxt : cxts) { for (var cxt : cxts) {
ProjInfo projCfg = cxt.getProjInfo(); ProjInfo projCfg = cxt.getProjInfo();
@ -36,11 +36,11 @@ public class ProjProcessContextUtils {
} }
public static Integer getTakeLargeBSVolume(ProjectContext ctx) {
public static Integer getTakeLargeBSVolume(ProjectTaskContext ctx) {
return ctx.getProjInfo().projBaseInfo.bigBufferSampleUl; return ctx.getProjInfo().projBaseInfo.bigBufferSampleUl;
} }
public static Boolean isDoMixTubeSample(ProjectContext ctx) {
public static Boolean isDoMixTubeSample(ProjectTaskContext ctx) {
A8kTubeHolderType type = ctx.getSampleInfo().tubeHolderType; A8kTubeHolderType type = ctx.getSampleInfo().tubeHolderType;
if (type == null) { if (type == null) {
return true; return true;
@ -58,7 +58,7 @@ public class ProjProcessContextUtils {
// //
public static Integer getShakeTimes(Tube tube) { public static Integer getShakeTimes(Tube tube) {
ProjectContextMgrService service = SpringBootBeanUtil.getBean(ProjectContextMgrService.class); ProjectContextMgrService service = SpringBootBeanUtil.getBean(ProjectContextMgrService.class);
List<ProjectContext> cxts = service.findCxts(tube.getSampleId());
List<ProjectTaskContext> cxts = service.findCxts(tube.getSampleId());
return getShakeTimes(cxts); return getShakeTimes(cxts);
} }
@ -66,7 +66,7 @@ public class ProjProcessContextUtils {
// //
// 试管混匀次数 // 试管混匀次数
// //
public static Integer getTubeMixingCount(ProjectContext ctx) {
public static Integer getTubeMixingCount(ProjectTaskContext ctx) {
var projCfg = ctx.getProjInfo(); var projCfg = ctx.getProjInfo();
var idcard = ctx.getProjExtInfoCard(); var idcard = ctx.getProjExtInfoCard();
var defaultVal = projCfg.projBaseInfo; var defaultVal = projCfg.projBaseInfo;
@ -80,7 +80,7 @@ public class ProjProcessContextUtils {
// //
// 混合液混匀次数 // 混合液混匀次数
// //
public static Integer getBSMixingCnt(ProjectContext ctx) {
public static Integer getBSMixingCnt(ProjectTaskContext ctx) {
var projCfg = ctx.getProjInfo(); var projCfg = ctx.getProjInfo();
var idcard = ctx.getProjExtInfoCard(); var idcard = ctx.getProjExtInfoCard();
var defaultVal = projCfg.projBaseInfo; var defaultVal = projCfg.projBaseInfo;
@ -94,7 +94,7 @@ public class ProjProcessContextUtils {
// //
// 获取反混合液滴定体积 // 获取反混合液滴定体积
// //
public static Integer getReactionPlateDropletVolUl(ProjectContext ctx) {
public static Integer getReactionPlateDropletVolUl(ProjectTaskContext ctx) {
var projCfg = ctx.getProjInfo(); var projCfg = ctx.getProjInfo();
var idcard = ctx.getProjExtInfoCard(); var idcard = ctx.getProjExtInfoCard();
var defaultVal = projCfg.projBaseInfo; var defaultVal = projCfg.projBaseInfo;
@ -108,7 +108,7 @@ public class ProjProcessContextUtils {
// //
// 样本取样体积 // 样本取样体积
// //
public static Integer getSampleVol(ProjectContext ctx) {
public static Integer getSampleVol(ProjectTaskContext ctx) {
var projCfg = ctx.getProjInfo(); var projCfg = ctx.getProjInfo();
var idcard = ctx.getProjExtInfoCard(); var idcard = ctx.getProjExtInfoCard();
var defaultVal = projCfg.projBaseInfo; var defaultVal = projCfg.projBaseInfo;
@ -134,7 +134,7 @@ public class ProjProcessContextUtils {
// 获取取样位置 // 获取取样位置
// //
static public A8kSamplePos getSamplePos(ProjectContext ctx) {
static public A8kSamplePos getSamplePos(ProjectTaskContext ctx) {
Boolean isEmergency = ctx.getSampleInfo().isEmergency; Boolean isEmergency = ctx.getSampleInfo().isEmergency;
Boolean isHighTube = ctx.getSampleInfo().isHighTube; Boolean isHighTube = ctx.getSampleInfo().isHighTube;
A8kTubeHolderType tubeHolderType = ctx.getSampleInfo().tubeHolderType; A8kTubeHolderType tubeHolderType = ctx.getSampleInfo().tubeHolderType;
@ -165,7 +165,7 @@ public class ProjProcessContextUtils {
} }
static public Pos3d getReactionEndPos(ProjectContext ctx) {
static public Pos3d getReactionEndPos(ProjectTaskContext ctx) {
HbotConsumableParamMgr hbotConsumableParamMgr = SpringBootBeanUtil.getBean(HbotConsumableParamMgr.class); HbotConsumableParamMgr hbotConsumableParamMgr = SpringBootBeanUtil.getBean(HbotConsumableParamMgr.class);
A8kReactionFlowType type = ctx.getProjInfo().projBaseInfo.reactionFlowType; A8kReactionFlowType type = ctx.getProjInfo().projBaseInfo.reactionFlowType;
return switch (type) { return switch (type) {

9
src/main/java/a8k/utils/ZJsonHelper.java

@ -15,6 +15,15 @@ public class ZJsonHelper {
} }
} }
public static String objToPrettyJson(Object obj) {
ObjectMapper mapper = new ObjectMapper();
try {
return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static ObjectNode createObjectNode() { public static ObjectNode createObjectNode() {
return new ObjectMapper().createObjectNode(); return new ObjectMapper().createObjectNode();
} }

Loading…
Cancel
Save