diff --git a/doc/TODO.md b/doc/TODO.md index bcf943f..ebd6c72 100644 --- a/doc/TODO.md +++ b/doc/TODO.md @@ -26,4 +26,5 @@ [25-01-03 16:48:33.504] [ExtAPIService ] [I] down can bin -> 350E010001005B00(16) [25-01-03 16:48:33.525] [SocketCan ] [E] send frame overtime 4. 处理一下A8kEcode.APPE_TAKE_TIP_FAIL错误 +5. 设备启动后,去3个TIP区域尝试取一个TIP头,如果取不到,说明TIP头数量设置错误,暂停设备,提醒用户检查TIP头数量设置 ``` \ No newline at end of file diff --git a/src/main/java/a8k/app/a8ktype/device/consumables/LittBottleGroup.java b/src/main/java/a8k/app/a8ktype/device/consumables/LittBottleGroup.java index 68479b7..ac3885a 100644 --- a/src/main/java/a8k/app/a8ktype/device/consumables/LittBottleGroup.java +++ b/src/main/java/a8k/app/a8ktype/device/consumables/LittBottleGroup.java @@ -37,7 +37,7 @@ public class LittBottleGroup implements Serializable { this.projShortName = projShortName; this.lotId = lotId; this.color = color; - this.num = num; - this.isInstall = true; + this.num = num; + this.isInstall = true; } } diff --git a/src/main/java/a8k/app/a8ktype/device/consumables/ReactionPlateGroup.java b/src/main/java/a8k/app/a8ktype/device/consumables/ReactionPlateGroup.java index 49709c8..5a22d18 100644 --- a/src/main/java/a8k/app/a8ktype/device/consumables/ReactionPlateGroup.java +++ b/src/main/java/a8k/app/a8ktype/device/consumables/ReactionPlateGroup.java @@ -34,4 +34,15 @@ public class ReactionPlateGroup implements Serializable { this.num = num; this.isInstall = true; } + + public void reset() { + this.projId = 0; + this.projName = ""; + this.projShortName = ""; + this.lotId = ""; + this.color = ""; + this.num = 0; + this.reserveNum = 0; + this.isInstall = false; + } } diff --git a/src/main/java/a8k/app/a8ktype/type/ConsumableScanRawResult.java b/src/main/java/a8k/app/a8ktype/type/ConsumableScanRawResult.java index 8aedcaa..10e9db8 100644 --- a/src/main/java/a8k/app/a8ktype/type/ConsumableScanRawResult.java +++ b/src/main/java/a8k/app/a8ktype/type/ConsumableScanRawResult.java @@ -2,16 +2,9 @@ package a8k.app.a8ktype.type; import a8k.app.utils.ZJsonHelper; -public class ConsumableScanRawResult { - public ConsumableOneChRawResult[] ch = new ConsumableOneChRawResult[6]; +import java.util.ArrayList; +import java.util.List; - public ConsumableScanRawResult() { - for (int i = 0; i < 6; i++) { - ch[i] = new ConsumableOneChRawResult(i); - } - } - - public String toString(){ - return ZJsonHelper.objectToJson(this); - } -} +//public class ConsumableScanRawResult { +// public List scanResults = new ArrayList<>(); +//} diff --git a/src/main/java/a8k/app/a8ktype/type/ConsumablesScanResultPacket.java b/src/main/java/a8k/app/a8ktype/type/ConsumablesScanResultPacket.java index e059c85..152bdc5 100644 --- a/src/main/java/a8k/app/a8ktype/type/ConsumablesScanResultPacket.java +++ b/src/main/java/a8k/app/a8ktype/type/ConsumablesScanResultPacket.java @@ -10,10 +10,10 @@ public class ConsumablesScanResultPacket { public List scanReports; @Schema(name = "耗材扫描原始结果") - public ConsumableOneChRawResult[] scanRawResults; + public List scanRawResults; - public ConsumablesScanResultPacket(List scanReports, ConsumableOneChRawResult[] scanRawResults) { + public ConsumablesScanResultPacket(List scanReports, List scanRawResults) { this.scanReports = scanReports; this.scanRawResults = scanRawResults; } diff --git a/src/main/java/a8k/app/controler/api/v1/app/ctrl/ConsumableScanControler.java b/src/main/java/a8k/app/controler/api/v1/app/ctrl/ConsumableScanControler.java index d1c01a4..ec7f21f 100644 --- a/src/main/java/a8k/app/controler/api/v1/app/ctrl/ConsumableScanControler.java +++ b/src/main/java/a8k/app/controler/api/v1/app/ctrl/ConsumableScanControler.java @@ -37,12 +37,12 @@ public class ConsumableScanControler { return ApiRet.success(appConsumablesScanService.scanConsumables()); } - @Operation(summary = "扫描某一组耗材(阻塞接口,耗时大概5秒)") - @PostMapping("/scanOneGroupConsumables") - public ApiRet scanOneGroupConsumables(ConsumableGroup group) throws AppException { - log.info("扫描某一组耗材"); - return ApiRet.success(appConsumablesScanService.scanOneGroupConsumables(group)); - } +// @Operation(summary = "扫描某一组耗材(阻塞接口,耗时大概5秒)") +// @PostMapping("/scanOneGroupConsumables") +// public ApiRet scanOneGroupConsumables(ConsumableGroup group) throws AppException { +// log.info("扫描某一组耗材"); +// return ApiRet.success(appConsumablesScanService.scanOneGroupConsumables(group)); +// } diff --git a/src/main/java/a8k/app/service/lowerctrl/ConsumablesScanCtrlService.java b/src/main/java/a8k/app/service/lowerctrl/ConsumablesScanCtrlService.java index 340e20f..4c38067 100644 --- a/src/main/java/a8k/app/service/lowerctrl/ConsumablesScanCtrlService.java +++ b/src/main/java/a8k/app/service/lowerctrl/ConsumablesScanCtrlService.java @@ -4,13 +4,15 @@ import a8k.app.hardware.driver.CodeScanerDriver; import a8k.app.service.param.hbotpos.Hbot2DCodeScanParamMgr; import a8k.teststate.VirtualDevice; import a8k.app.a8ktype.type.ConsumableOneChRawResult; -import a8k.app.a8ktype.type.ConsumableScanRawResult; import a8k.app.a8ktype.device.Pos2d; import a8k.app.a8ktype.exception.AppException; +import a8k.utils.DoAction; import jakarta.annotation.Resource; import org.springframework.stereotype.Component; +import java.util.ArrayList; import java.util.List; +import java.util.Objects; @Component public class ConsumablesScanCtrlService { @@ -28,65 +30,76 @@ public class ConsumablesScanCtrlService { // VIRTUAL // - ConsumableScanRawResult virtualConsumablesScanRawResult = new ConsumableScanRawResult(); - synchronized public void setVirtualConsumablesScanResult(Integer ch, ConsumableOneChRawResult result) { - virtualConsumablesScanRawResult.ch[ch] = result; + String[] virtualPbscanResult = new String[6]; + String[] virtualLittBSScanResult = new String[6]; + String[] virtualLarBSScanResult = new String[6]; + + synchronized public void setVirtualConsumablesScanResult(Integer ch, String PBScanResult, String littBSScanResult, String larBSScanResult) { + virtualPbscanResult[ch] = PBScanResult; + virtualLittBSScanResult[ch] = littBSScanResult; + virtualLarBSScanResult[ch] = larBSScanResult; } // // PUBLIC // - public ConsumableScanRawResult doScanConsumablesAction(List channels) throws AppException { - if (virtualDevice.isEnable()) { - return virtualConsumablesScanRawResult; - } + public List doScanConsumablesAction(List channels) throws AppException { + List result = new ArrayList<>(); + - ConsumableScanRawResult result = new ConsumableScanRawResult(); + String[] pbscanResult = new String[6]; + String[] littBSScanResult = new String[6]; + String[] larBSScanResult = new String[6]; for (int i = 0; i < 6; i++) { if (!channels.contains(i)) continue; - result.ch[i].PBScanResult = scanPB(i); + pbscanResult[i] = virtualDevice.isEnable() ? virtualPbscanResult[i] : scanPB(i); } for (int i = 0; i < 6; i++) { if (!channels.contains(i)) continue; - result.ch[i].littBSScanResult = scanLittBS(i); + littBSScanResult[i] = virtualDevice.isEnable() ? virtualLittBSScanResult[i] : scanLittBS(i); } for (int i = 0; i < 6; i++) { if (!channels.contains(i)) continue; - result.ch[i].larBSScanResult = scanLarBS(i); + larBSScanResult[i] = virtualDevice.isEnable() ? virtualLarBSScanResult[i] : scanLarBS(i); } - hbotMoveTo(new Pos2d(0, 0)); - /* - * 清空 result 中的所有\r - */ + + DoAction.doIt("扫描耗材", () -> hbotMoveTo(new Pos2d(0, 0))); + + for (int i = 0; i < 6; i++) { - if (result.ch[i].PBScanResult != null) { - result.ch[i].PBScanResult = result.ch[i].PBScanResult.replaceAll("\r", ""); - } - if (result.ch[i].littBSScanResult != null) { - result.ch[i].littBSScanResult = result.ch[i].littBSScanResult.replaceAll("\r", ""); - } - if (result.ch[i].larBSScanResult != null) { - result.ch[i].larBSScanResult = result.ch[i].larBSScanResult.replaceAll("\r", ""); - } + if (!channels.contains(i)) + continue; + ConsumableOneChRawResult oneChResult = new ConsumableOneChRawResult(i); + if (pbscanResult[i] != null) + oneChResult.PBScanResult = pbscanResult[i].replaceAll("\r", ""); + if (littBSScanResult[i] != null) + oneChResult.littBSScanResult = littBSScanResult[i].replaceAll("\r", ""); + if (larBSScanResult[i] != null) + oneChResult.larBSScanResult = larBSScanResult[i].replaceAll("\r", ""); + result.add(oneChResult); } return result; } - public ConsumableOneChRawResult doScanOneCh(Integer ch) throws AppException { - if (virtualDevice.isEnable()) { - return virtualConsumablesScanRawResult.ch[ch]; - } - - ConsumableOneChRawResult result = new ConsumableOneChRawResult(ch); - result.PBScanResult = scanPB(ch); - result.littBSScanResult = scanLittBS(ch); - result.larBSScanResult = scanLarBS(ch); - return result; - } +// public ConsumableOneChRawResult doScanOneCh(Integer ch) throws AppException { +// if (virtualDevice.isEnable()) { +// for (ConsumableOneChRawResult result : virtualConsumablesScanResult) { +// if (Objects.equals(result.chNum, ch)) +// return result; +// } +// return new ConsumableOneChRawResult(ch); +// } +// +// ConsumableOneChRawResult result = new ConsumableOneChRawResult(ch); +// result.PBScanResult = scanPB(ch); +// result.littBSScanResult = scanLittBS(ch); +// result.larBSScanResult = scanLarBS(ch); +// return result; +// } // diff --git a/src/main/java/a8k/app/service/mainctrl/AppConsumablesScanService.java b/src/main/java/a8k/app/service/mainctrl/AppConsumablesScanService.java index 8c57620..2fc7bed 100644 --- a/src/main/java/a8k/app/service/mainctrl/AppConsumablesScanService.java +++ b/src/main/java/a8k/app/service/mainctrl/AppConsumablesScanService.java @@ -252,55 +252,46 @@ public class AppConsumablesScanService { List scanReport = new java.util.ArrayList<>(); //执行扫描耗材动作 - ConsumableScanRawResult scanRawResult = scanCtrlService.doScanConsumablesAction(scanChannels); - - logger.info("扫描结果:{}", scanRawResult); + List scanRawResults = scanCtrlService.doScanConsumablesAction(scanChannels); + logger.info("扫描结果:{}", scanRawResults); //解析扫描结果 - for (int i = 0; i < 6; i++) { - if (!scanChannels.contains(i)) { - continue; - } - var result = parseScanResult(i, scanRawResult.ch[i]); + for (var scanRawResult : scanRawResults) { + var result = parseScanResult(scanRawResult.chNum, scanRawResult); scanReport.add(result); } - //加载耗材 - for (int i = 0; i < AppConstant.CONSUMABLE_CHANNEL_NUM; i++) { - if (scanReport.get(i).state == ConsumablesScanReportErrorType.PASS) { - loadingConsumables(i, scanReport.get(i)); - } - - if (scanReport.get(i).state == ConsumablesScanReportErrorType.PASS) { - loadingConsumables(i, scanReport.get(i)); + for (var report : scanReport) { + if (report.state == ConsumablesScanReportErrorType.PASS) { + loadingConsumables(report.chNum, report); } } - return new ConsumablesScanResultPacket(scanReport, scanRawResult.ch); + return new ConsumablesScanResultPacket(scanReport, scanRawResults); } - public ConsumablesOneChannelScanResultPacket scanOneGroupConsumables(ConsumableGroup group) throws AppException { - if (!gstate.isDeviceInited()) { - throw new AppException(A8kEcode.APPE_DEVICE_NOT_INITED); - } - - Integer chNum = group.off; - ConsumableOneChRawResult scanResult; - - scanResult = scanCtrlService.doScanOneCh(chNum); - - var scanReport = parseScanResult(chNum, scanResult); - if (scanReport.state != ConsumablesScanReportErrorType.PASS) { - loadingConsumables(chNum, scanReport); - } - - ConsumablesOneChannelScanResultPacket ret = new ConsumablesOneChannelScanResultPacket(); - ret.scanRawResult = scanResult; - ret.scanReport = scanReport; - ret.consumableState = consumablesMgrService.getState(); - - return ret; - } +// public ConsumablesOneChannelScanResultPacket scanOneGroupConsumables(ConsumableGroup group) throws AppException { +// if (!gstate.isDeviceInited()) { +// throw new AppException(A8kEcode.APPE_DEVICE_NOT_INITED); +// } +// +// Integer chNum = group.off; +// ConsumableOneChRawResult scanResult; +// +// scanResult = scanCtrlService.doScanOneCh(chNum); +// +// var scanReport = parseScanResult(chNum, scanResult); +// if (scanReport.state != ConsumablesScanReportErrorType.PASS) { +// loadingConsumables(chNum, scanReport); +// } +// +// ConsumablesOneChannelScanResultPacket ret = new ConsumablesOneChannelScanResultPacket(); +// ret.scanRawResult = scanResult; +// ret.scanReport = scanReport; +// ret.consumableState = consumablesMgrService.getState(); +// +// return ret; +// } // For Test Only public void loadingConsumablesDirectly(ConsumablesScanReport result) { diff --git a/src/main/java/a8k/app/service/statemgr/ConsumablesMgrService.java b/src/main/java/a8k/app/service/statemgr/ConsumablesMgrService.java index 0e8b2ed..a4b0436 100644 --- a/src/main/java/a8k/app/service/statemgr/ConsumablesMgrService.java +++ b/src/main/java/a8k/app/service/statemgr/ConsumablesMgrService.java @@ -15,6 +15,7 @@ import a8k.app.hardware.type.a8kcanprotocol.A8kEcode; import a8k.app.service.data.UtilsProjectColorAllocer; import cn.hutool.core.util.ObjectUtil; import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import java.util.List; @@ -33,6 +34,7 @@ import java.util.List; * setXXXX, 设置数量 */ @Component +@Slf4j public class ConsumablesMgrService { @Resource @@ -193,9 +195,9 @@ public class ConsumablesMgrService { if (deviceWorkStateMgrService.isDeviceWorking()) { throw AppException.of(A8kEcode.APPE_DO_ACTION_FAIL_DEVICE_IS_WORKING); } - cState.reactionPlateGroup[ch.off].isInstall = false; - cState.littBottleGroup[ch.off].isInstall = false; - cState.larBottleGroup[ch.off].isInstall = false; + cState.reactionPlateGroup[ch.off] = new ReactionPlateGroup(); + cState.littBottleGroup[ch.off] = new LittBottleGroup(); + cState.larBottleGroup[ch.off] = new LarBottleGroup(); stateVersion++; } @@ -212,6 +214,7 @@ public class ConsumablesMgrService { ret.add(group.off); } } + log.info("未安装耗材通道:{}", ret); return ret; } diff --git a/src/main/java/a8k/app/utils/ReactionPlate2DCodeHelper.java b/src/main/java/a8k/app/utils/ReactionPlate2DCodeHelper.java index fc60cd9..8942bd5 100644 --- a/src/main/java/a8k/app/utils/ReactionPlate2DCodeHelper.java +++ b/src/main/java/a8k/app/utils/ReactionPlate2DCodeHelper.java @@ -1,14 +1,21 @@ package a8k.app.utils; +import lombok.extern.slf4j.Slf4j; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import java.text.ParseException; import java.text.SimpleDateFormat; +@Slf4j public class ReactionPlate2DCodeHelper { + // 1||CAGGB66U||2024.03.26||1083||06 static public ReactionPlate2DCode parse(String code) { String[] parts = code.split("\\|\\|"); ReactionPlate2DCode ret = new ReactionPlate2DCode(); if (parts.length != 5) { + log.warn("2D code element num error: num:{}, code: {}", parts.length, code); return null; } ret.projId = Integer.parseInt(parts[0]); @@ -18,6 +25,7 @@ public class ReactionPlate2DCodeHelper { try { ret.expDate = sdf.parse(parts[2]); } catch (ParseException e) { + log.warn("2D code date format error: date:{}, code: {}", parts[2], code); return null; } ret.ID0 = Integer.parseInt(parts[3]); diff --git a/src/main/java/a8k/extui/page/debug/P02ConsumablesMgrDebugPage.java b/src/main/java/a8k/extui/page/debug/P02ConsumablesMgrDebugPage.java index 3d5e042..65cc48b 100644 --- a/src/main/java/a8k/extui/page/debug/P02ConsumablesMgrDebugPage.java +++ b/src/main/java/a8k/extui/page/debug/P02ConsumablesMgrDebugPage.java @@ -164,10 +164,18 @@ public class P02ConsumablesMgrDebugPage { return appConsumablesScanService.scanConsumables(); } - public ConsumablesOneChannelScanResultPacket scanOneConsumables(ConsumableGroup group) throws AppException { - return appConsumablesScanService.scanOneGroupConsumables(group); + public void unInstallConsumable(ConsumableGroup group) throws AppException { + consumablesMgrService.unInstallConsumable(group); } + public void unInstallAllConsumable() throws AppException { + consumablesMgrService.unInstallAllConsumable(); + } + +// public ConsumablesOneChannelScanResultPacket scanOneConsumables(ConsumableGroup group) throws AppException { +// return appConsumablesScanService.scanOneGroupConsumables(group); +// } + public void setTipNum(TipGroup tipGroup, Integer tiNum) throws AppException { consumablesMgrService.setTipNum(tipGroup, tiNum); } @@ -229,9 +237,14 @@ public class P02ConsumablesMgrDebugPage { var page = extApiPageMgr.newPage(this); page.newGroup("耗材操作"); page.addFunction("扫描耗材", this::scanConsumables); - page.addFunction("扫描耗材(单通道)", this::scanOneConsumables); +// page.addFunction("扫描耗材(单通道)", this::scanOneConsumables); page.addFunction("设置Tip数量", this::setTipNum); page.addFunction("设置耗材数量", this::setConsumableNum); + + page.newGroup("耗材卸载"); + page.addFunction("卸载耗材", this::unInstallConsumable); + page.addFunction("卸载耗材(全部)", this::unInstallAllConsumable); + page.newGroup("辅助调试"); page.addFunction("手动加载耗材", this::loadConsumablesManual); page.addFunction("手动加载挂载项目卡耗材", this::loadMountProjIDCardConsumablesManual); diff --git a/src/main/java/a8k/teststate/TestStateMgrService.java b/src/main/java/a8k/teststate/TestStateMgrService.java index 2aebcf6..680c550 100644 --- a/src/main/java/a8k/teststate/TestStateMgrService.java +++ b/src/main/java/a8k/teststate/TestStateMgrService.java @@ -31,19 +31,15 @@ public class TestStateMgrService { * @param lotId 批号 */ public void putVirtualConsumable(int ch, String lotId) { - ConsumableOneChRawResult consumable = new ConsumableOneChRawResult(ch); - consumable.larBSScanResult = lotId; - consumable.littBSScanResult = lotId; - consumable.PBScanResult = ReactionPlate2DCodeHelper.build2DCode(lotId); - consumablesScanCtrlService.setVirtualConsumablesScanResult(consumable.chNum, consumable); + consumablesScanCtrlService.setVirtualConsumablesScanResult(ch,ReactionPlate2DCodeHelper.build2DCode(lotId), lotId, lotId); } /** * 拿走虚拟耗材 */ public void takeAwayVirtualConsumable(int ch) { - ConsumableOneChRawResult consumable = new ConsumableOneChRawResult(ch); - consumablesScanCtrlService.setVirtualConsumablesScanResult(consumable.chNum, consumable); + // ConsumableOneChRawResult consumable = new ConsumableOneChRawResult(ch); + consumablesScanCtrlService.setVirtualConsumablesScanResult(ch, null, null, null); } } diff --git a/src/main/java/a8k/teststate/VirtualDevice.java b/src/main/java/a8k/teststate/VirtualDevice.java index 320e464..f733c6c 100644 --- a/src/main/java/a8k/teststate/VirtualDevice.java +++ b/src/main/java/a8k/teststate/VirtualDevice.java @@ -4,7 +4,6 @@ import a8k.OS; import a8k.app.a8ktype.DeviceRunMode; import a8k.app.dao.db.type.ProjExtInfoCard; import a8k.app.a8ktype.type.ConsumableOneChRawResult; -import a8k.app.a8ktype.type.ConsumableScanRawResult; import a8k.app.a8ktype.type.TubeHolderScanResult; import a8k.app.service.statemgr.GStateMgrService; import jakarta.annotation.Resource; diff --git a/src/main/java/a8k/utils/DoAction.java b/src/main/java/a8k/utils/DoAction.java index a92f388..94b2ea9 100644 --- a/src/main/java/a8k/utils/DoAction.java +++ b/src/main/java/a8k/utils/DoAction.java @@ -13,6 +13,10 @@ public class DoAction { void doAction() throws AppException; } + @FunctionalInterface + public interface Action2 { + T doAction() throws AppException; + } public static void doIt(String msg, Action action) throws AppException { VirtualDevice virtualDevice = SpringBootBeanUtil.getBean(VirtualDevice.class);