Browse Source

update

tags/v0
zhaohe 10 months ago
parent
commit
3944064003
  1. 41
      README2.md
  2. 1
      src/main/java/a8k/hardware/type/a8kcanprotocol/A8kEcode.java
  3. 10
      src/main/java/a8k/service/app/appctrl/AppDeviceCtrlService.java
  4. 3
      src/main/java/a8k/service/app/appctrl/AppMainFlowCtrlService.java
  5. 12
      src/main/java/a8k/service/app/appctrl/mainflowctrl/MainFlowCtrlScheduler.java
  6. 16
      src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ4_PRE_PROCESS.java
  7. 29
      src/main/java/a8k/service/test/MainflowCtrlTestService.java
  8. 3
      src/main/java/a8k/type/ecode/AppCodeError.java
  9. 7
      src/main/java/a8k/type/ecode/AppError.java
  10. 11
      src/main/java/a8k/type/exception/AppException.java
  11. 14
      src/main/java/a8k/type/exception/MutiAppException.java
  12. 8
      src/main/java/a8k/utils/AppExceptionBuilder.java
  13. 6
      src/main/java/a8k/utils/ZFnCall.java

41
README2.md

@ -77,3 +77,44 @@ TestMode 衔接点:
```
```
TODO:
1. Mainflow测试页面添加 按钮设备初始化 OK
2. 添加完善的异常和错误打印机制 OK
2. 添加一个数据库用来备份坐标数据
3. 每个页面添加一个恢复配置的按钮
4. 添加一个页面,放置一个按键,保存当前坐标数据,添加一个坐标校验检测功能
5. 分离hbot坐标
6. 打印完善的错误信息
7. 校准预处理坐标
8. 校准其他坐标
10. 加热功能
9. 添加一个页面用来管理移液枪相关参数。
1. 液面探测,液面探测方式,c阈值,p阈值
2. 吸空检测
采用混合(电容阈值调成比较敏感)
llf_v(容器) 耗材/样本
样本-液体类型 c_thr,p_thr 耗材/样本/默认,
get耗材(固定的写死代码)
样本(已定义枚举,通过参数获得。)
1. UI选择---> 全血,血清,血浆,尿液,粪便
<!-- 血清,血浆,全血。 -->
1.根据样本类型来进行血清,血浆,全血的选择
2.
添加一个类,用来获取当前样本是否要进行,吸空检测和液面探测。
1. 如果进行,则从数据库中获取对应的参数
2. 如果不进行,则直接返回默认值。
```
```
1. 记录打印功能?
2. 支持通过U盘更新项目信息excel
3. 支持鼠标?
```

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

@ -3,6 +3,7 @@ package a8k.hardware.type.a8kcanprotocol;
public enum A8kEcode {
SUC(0),
MUTI_APPEXCEPTIONS(1),//内置无需关心
/*
* 代码错误代码没有BUG的情况下不应该出现的错误
*/

10
src/main/java/a8k/service/app/appctrl/AppDeviceCtrlService.java

@ -16,12 +16,14 @@ import a8k.type.consumables.ConsumableState;
import a8k.type.exception.AppException;
import a8k.type.type.TipGroup;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
@Component
@Slf4j
@ExtApiTab(cfg = ExtApiTabConfig.AppDeviceCtrlService)
public class AppDeviceCtrlService {
@ -57,21 +59,25 @@ public class AppDeviceCtrlService {
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
@ExtApiFn(name = "开始工作", group = "设备控制")
public void startWork() throws AppException {
log.info("开始工作");
mainFlowCtrlSampleScanService.startWork();
}
@ExtApiFn(name = "停止工作", group = "设备控制")
public void stopWork() {
log.info("停止工作");
mainFlowCtrlSampleScanService.stopWork();
}
@ExtApiFn(name = "暂停工作", group = "设备控制")
public void pauseWork() {
log.info("暂停工作");
mainFlowCtrlSampleScanService.pauseWork();
}
@ExtApiFn(name = "继续工作", group = "设备控制")
public void continueWork() {
log.info("继续工作");
mainFlowCtrlSampleScanService.continueWork();
}
@ -80,11 +86,13 @@ public class AppDeviceCtrlService {
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
@ExtApiFn(name = "扫描耗材", group = "耗材扫描")
public Map<String, Object> scanConsumables() throws AppException {
log.info("扫描耗材");
return appConsumablesScanService.scanConsumables();
}
@ExtApiFn(name = "扫描某一组耗材", group = "耗材扫描")
public Map<String, Object> scanOneGroupConsumables(ConsumableGroup group) throws AppException {
log.info("扫描某一组耗材");
return appConsumablesScanService.scanOneGroupConsumables(group);
}
@ -188,11 +196,13 @@ public class AppDeviceCtrlService {
@ExtApiFn(name = "打开蜂鸣器", group = "主机")
public void startBeepWarning() {
log.info("打开蜂鸣器");
beepState = true;
}
@ExtApiFn(name = "关闭蜂鸣器", group = "主机")
public void stopBeepWarning() {
log.info("关闭蜂鸣器");
beepState = false;
}

3
src/main/java/a8k/service/app/appctrl/AppMainFlowCtrlService.java

@ -134,6 +134,9 @@ public class AppMainFlowCtrlService {
state.errorFlag = true;
state.ecodeList = ecodeList;
state.workState = A8kWorkState.PAUSE;
}else{
state.errorFlag = false;
state.ecodeList = ecodeList;
}
}

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

@ -14,6 +14,7 @@ import a8k.service.app.appstate.type.state.A8kWorkState;
import a8k.type.ecode.AppError;
import a8k.type.ecode.UnkownExceptionError;
import a8k.type.exception.AppException;
import a8k.type.exception.MutiAppException;
import a8k.utils.ZStringUtils;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
@ -127,7 +128,18 @@ public class MainFlowCtrlScheduler {
try {
key.doaction();
return null;
} catch (MutiAppException mutiAppe) {
List<AppException> appExceptions = mutiAppe.bindExceptions;
for (AppException appe : appExceptions) {
appe.print();
}
if(appExceptions.size() > 1){
logger.warn("发生多个错误,只报告第一个错误");
}
return new A8kErrorContext(key.step, appExceptions.get(0).error);
} catch (AppException appe) {
appe.print();
return new A8kErrorContext(key.step, appe.error);
} catch (Exception exception) {
logger.error("Catch unkown exception ");

16
src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ4_PRE_PROCESS.java

@ -167,20 +167,22 @@ public class SEQ4_PRE_PROCESS extends A8kStepAction {
wait(doShakeAndTakeCapFuture);
wait(doHbotPrepareTipFuture);
List<AppError> errors = new java.util.ArrayList<>(List.of());
List<AppException> exceptions = new java.util.ArrayList<>(List.of());
List<AppError> errors = new java.util.ArrayList<>(List.of());
try {
errors.add(doPrepareReactionPlateFuture.get());
errors.add(doShakeAndTakeCapFuture.get());
errors.add(doHbotPrepareTipFuture.get());
exceptions.add(doPrepareReactionPlateFuture.get());
exceptions.add(doShakeAndTakeCapFuture.get());
exceptions.add(doHbotPrepareTipFuture.get());
} catch (InterruptedException | ExecutionException ignored) {
}
errors.removeIf(Objects::isNull);
exceptions.removeIf(Objects::isNull);
exceptions.forEach(e -> errors.add(e.getError()));
//如果依然有错误将试管状态设置为错误同时抛出异常
if (!errors.isEmpty()) {
projectProcessContextMgrService.changeTubeStateToError(gstate.getCurProcessingTube(), errors);
logger.error("准备工作出现错误:{}", errors);
throw ebuilder.buildMutiErrorAppException(errors);
throw ebuilder.buildMutiErrorAppException(exceptions);
}
projectProcessContextMgrService.tubePreProcessingOK();
}

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

@ -1,5 +1,6 @@
package a8k.service.test;
import a8k.OS;
import a8k.constant.AppConstant;
import a8k.extapi_controler.utils.ExtApiFn;
import a8k.extapi_controler.utils.ExtApiTab;
@ -8,6 +9,7 @@ import a8k.service.app.appctrl.AppDeviceCtrlService;
import a8k.service.app.appctrl.AppTubeSettingMgrService;
import a8k.service.app.appstate.ConsumablesMgrService;
import a8k.service.app.appstate.GStateService;
import a8k.service.app.appstate.type.state.A8kWorkState;
import a8k.service.app.devicectrl.ctrlservice.ConsumablesScanCtrlService;
import a8k.service.db.A8kProjIdCardDBService;
import a8k.service.db.A8kProjInfoDBService;
@ -125,13 +127,16 @@ public class MainflowCtrlTestService {
// SIMPLE_TEST
private List<CheckResult> DO_SIMPLE_TEST() throws AppException {
log.info("DO_SIMPLE_TEST");
//启动工作
List<CheckResult> checkResults = appDeviceCtrlService.initDevice();
for (CheckResult checkResult : checkResults) {
if (!checkResult.pass) {
return checkResults;
//停止工作
if (!appDeviceCtrlService.getDeviceWorkState().workState.equals(A8kWorkState.IDLE)) {
appDeviceCtrlService.stopWork();
while (appDeviceCtrlService.deviceWorkStateIsChanging()) {
log.info("等待设备停止工作....");
OS.forceSleep(1000);
}
}
//清空项目的数据库配置
resetProjDB();
//添加项目信息
@ -151,7 +156,18 @@ public class MainflowCtrlTestService {
return null;
}
@ExtApiFn(name = "开始测试")
@ExtApiFn(name = "设备初始化", order = 1)
public Object deviceInit() throws AppException {
List<CheckResult> checkResults = appDeviceCtrlService.initDevice();
for (CheckResult checkResult : checkResults) {
if (!checkResult.pass) {
return checkResults;
}
}
return checkResults;
}
@ExtApiFn(name = "开始测试", order = 2)
public Object startTest(MainFlowCtrlTestCaseType castType, Boolean virtualDevice, Boolean virtualTubeScanResult, Boolean noCheck) throws AppException {
if (gstate.isWorking()) {
throw new AppException(new AppCodeError("设备正在工作中,请先停止工作"));
@ -167,4 +183,5 @@ public class MainflowCtrlTestService {
return null;
}
}

3
src/main/java/a8k/type/ecode/AppCodeError.java

@ -1,6 +1,7 @@
package a8k.type.ecode;
import a8k.hardware.type.a8kcanprotocol.A8kEcode;
import a8k.utils.ZJsonHelper;
public class AppCodeError extends AppError {
public String exmsg;
@ -9,4 +10,6 @@ public class AppCodeError extends AppError {
super(A8kEcode.CODEERROR);
this.exmsg = exmsg;
}
}

7
src/main/java/a8k/type/ecode/AppError.java

@ -1,17 +1,18 @@
package a8k.type.ecode;
import a8k.hardware.type.a8kcanprotocol.A8kEcode;
import a8k.utils.ZJsonHelper;
public class AppError {
public A8kEcode code;
public String errorType;
public String errorType;
public AppError(A8kEcode errorCode) {
this.code = errorCode;
this.code = errorCode;
this.errorType = this.getClass().getSimpleName();
}
public String toString() {
return String.format("%s", code);
return ZJsonHelper.objectToJson(this);
}
}

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

@ -6,10 +6,13 @@ import a8k.hardware.type.a8kcanprotocol.MId;
import a8k.type.ecode.AppError;
import a8k.type.ecode.HardwareError;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Getter
public class AppException extends Exception {
// 构造函数
public AppError error;
@ -39,4 +42,12 @@ public class AppException extends Exception {
}
public void print() {
log.error("Apperror: {}", error);
log.error("exception {}", this.toString());
for (StackTraceElement ste : this.getStackTrace()) {
log.error(ste.toString());
}
}
}

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

@ -0,0 +1,14 @@
package a8k.type.exception;
import a8k.hardware.type.a8kcanprotocol.A8kEcode;
import java.util.List;
public class MutiAppException extends AppException {
public List<AppException> bindExceptions;
public MutiAppException(List<AppException> exceptions) {
super(A8kEcode.MUTI_APPEXCEPTIONS);
bindExceptions = exceptions;
}
}

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

@ -5,6 +5,7 @@ import a8k.type.ecode.AppCodeError;
import a8k.type.ecode.AppError;
import a8k.type.ecode.ConsumeNotEnoughError;
import a8k.type.exception.AppException;
import a8k.type.exception.MutiAppException;
import jakarta.annotation.Resource;
import org.slf4j.Logger;
import org.springframework.stereotype.Component;
@ -25,11 +26,8 @@ public class AppExceptionBuilder {
return new AppException(new ConsumeNotEnoughError(projName));
}
public AppException buildMutiErrorAppException(List<AppError> errors) {
if (errors.size() > 1) {
logger.error("buildMutiErrorAppException errors size > 1,drop all errors except the first one");
}
return new AppException(errors.get(0));
public AppException buildMutiErrorAppException(List<AppException> exceptions) {
return new MutiAppException(exceptions);
}
public AppException buildAppCodeErrorException(String extraMsg) {

6
src/main/java/a8k/utils/ZFnCall.java

@ -3,7 +3,9 @@ package a8k.utils;
import a8k.type.ecode.AppError;
import a8k.type.exception.AppException;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class ZFnCall {
@FunctionalInterface
@ -11,11 +13,11 @@ public class ZFnCall {
void call() throws AppException;
}
public static AppError callfn(Fn fn) {
public static AppException callfn(Fn fn) {
try {
fn.call();
} catch (AppException e) {
return e.error;
return e;
}
return null;
}

Loading…
Cancel
Save