Browse Source

修复卸载耗材和耗材扫描相关BUG

tags/v0
zhaohe 7 months ago
parent
commit
89b9140ad4
  1. 1
      doc/TODO.md
  2. 4
      src/main/java/a8k/app/a8ktype/device/consumables/LittBottleGroup.java
  3. 11
      src/main/java/a8k/app/a8ktype/device/consumables/ReactionPlateGroup.java
  4. 17
      src/main/java/a8k/app/a8ktype/type/ConsumableScanRawResult.java
  5. 4
      src/main/java/a8k/app/a8ktype/type/ConsumablesScanResultPacket.java
  6. 12
      src/main/java/a8k/app/controler/api/v1/app/ctrl/ConsumableScanControler.java
  7. 85
      src/main/java/a8k/app/service/lowerctrl/ConsumablesScanCtrlService.java
  8. 69
      src/main/java/a8k/app/service/mainctrl/AppConsumablesScanService.java
  9. 9
      src/main/java/a8k/app/service/statemgr/ConsumablesMgrService.java
  10. 8
      src/main/java/a8k/app/utils/ReactionPlate2DCodeHelper.java
  11. 19
      src/main/java/a8k/extui/page/debug/P02ConsumablesMgrDebugPage.java
  12. 10
      src/main/java/a8k/teststate/TestStateMgrService.java
  13. 1
      src/main/java/a8k/teststate/VirtualDevice.java
  14. 4
      src/main/java/a8k/utils/DoAction.java

1
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头数量设置
```

4
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;
}
}

11
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;
}
}

17
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<ConsumableOneChRawResult> scanResults = new ArrayList<>();
//}

4
src/main/java/a8k/app/a8ktype/type/ConsumablesScanResultPacket.java

@ -10,10 +10,10 @@ public class ConsumablesScanResultPacket {
public List<ConsumablesScanReport> scanReports;
@Schema(name = "耗材扫描原始结果")
public ConsumableOneChRawResult[] scanRawResults;
public List<ConsumableOneChRawResult> scanRawResults;
public ConsumablesScanResultPacket(List<ConsumablesScanReport> scanReports, ConsumableOneChRawResult[] scanRawResults) {
public ConsumablesScanResultPacket(List<ConsumablesScanReport> scanReports, List<ConsumableOneChRawResult> scanRawResults) {
this.scanReports = scanReports;
this.scanRawResults = scanRawResults;
}

12
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<ConsumablesOneChannelScanResultPacket> scanOneGroupConsumables(ConsumableGroup group) throws AppException {
log.info("扫描某一组耗材");
return ApiRet.success(appConsumablesScanService.scanOneGroupConsumables(group));
}
// @Operation(summary = "扫描某一组耗材(阻塞接口,耗时大概5秒)")
// @PostMapping("/scanOneGroupConsumables")
// public ApiRet<ConsumablesOneChannelScanResultPacket> scanOneGroupConsumables(ConsumableGroup group) throws AppException {
// log.info("扫描某一组耗材");
// return ApiRet.success(appConsumablesScanService.scanOneGroupConsumables(group));
// }

85
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<Integer> channels) throws AppException {
if (virtualDevice.isEnable()) {
return virtualConsumablesScanRawResult;
}
public List<ConsumableOneChRawResult> doScanConsumablesAction(List<Integer> channels) throws AppException {
List<ConsumableOneChRawResult> 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;
// }
//

69
src/main/java/a8k/app/service/mainctrl/AppConsumablesScanService.java

@ -252,55 +252,46 @@ public class AppConsumablesScanService {
List<ConsumablesScanReport> scanReport = new java.util.ArrayList<>();
//执行扫描耗材动作
ConsumableScanRawResult scanRawResult = scanCtrlService.doScanConsumablesAction(scanChannels);
logger.info("扫描结果:{}", scanRawResult);
List<ConsumableOneChRawResult> 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) {

9
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;
}

8
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]);

19
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);

10
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);
}
}

1
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;

4
src/main/java/a8k/utils/DoAction.java

@ -13,6 +13,10 @@ public class DoAction {
void doAction() throws AppException;
}
@FunctionalInterface
public interface Action2 <T> {
T doAction() throws AppException;
}
public static void doIt(String msg, Action action) throws AppException {
VirtualDevice virtualDevice = SpringBootBeanUtil.getBean(VirtualDevice.class);

Loading…
Cancel
Save