diff --git a/src/main/java/a8k/service/appconsumable/AppConsumablesMgrService.java b/src/main/java/a8k/service/appconsumable/AppConsumablesMgrService.java index 24b9cc7..faed26f 100644 --- a/src/main/java/a8k/service/appconsumable/AppConsumablesMgrService.java +++ b/src/main/java/a8k/service/appconsumable/AppConsumablesMgrService.java @@ -10,11 +10,18 @@ import a8k.service.appconsumable.base.ReactantItem; import a8k.service.appconsumable.base.TipGroupInfo; import a8k.service.appstate.AppStateMgrService; import jakarta.annotation.Resource; +import org.slf4j.Logger; import org.springframework.stereotype.Component; + @EngineerPageTab(name = "应用-耗材管理服务", order = EnginnerPageTabOrder.AppConsumablesMgrService) @Component public class AppConsumablesMgrService { + static Logger logger = org.slf4j.LoggerFactory.getLogger(AppConsumablesMgrService.class); + static class ORDER { + static final int scanningConsumables = 1; + static final int getConsumables = 2; + } @Resource ProjectColorAllocer projectColorAllocer; @@ -23,7 +30,7 @@ public class AppConsumablesMgrService { AppStateMgrService stateMgrService; //扫描耗材 - @EnginnerPageAction(name = "扫描耗材") + @EnginnerPageAction(name = "扫描耗材", order = ORDER.scanningConsumables) public AppRet scanningConsumables() { Consumables var = new Consumables(); for (int i = 0; i < 6; i++) { @@ -43,7 +50,7 @@ public class AppConsumablesMgrService { return AppRet.success(var); } - @EnginnerPageAction(name = "获取耗材状态") + @EnginnerPageAction(name = "获取耗材状态", order = ORDER.getConsumables) public AppRet getConsumables() { return AppRet.success(stateMgrService.getConsumable()); } diff --git a/src/main/java/a8k/service/appctrl/AppCtrlService.java b/src/main/java/a8k/service/appctrl/AppCtrlService.java index f7a1747..01fc4fb 100644 --- a/src/main/java/a8k/service/appctrl/AppCtrlService.java +++ b/src/main/java/a8k/service/appctrl/AppCtrlService.java @@ -13,9 +13,12 @@ public class AppCtrlService { static final Logger logger = org.slf4j.LoggerFactory.getLogger(AppCtrlService.class); static class ORDER { - static final int initDevice = 1; - - + static final int initDevice = 1; + static final int shutdown = 2; + static final int startProcess = 3; + static final int pauseProcess = 4; + static final int forceStopProcess = 5; + static final int stopProcess = 6; } @EnginnerPageAction(name = "初始化设备", group = "设备基础控制", order = ORDER.initDevice) @@ -24,31 +27,31 @@ public class AppCtrlService { } //关机 - @EnginnerPageAction(name = "关机", group = "设备基础控制", order = 1) + @EnginnerPageAction(name = "关机", group = "设备基础控制", order = ORDER.shutdown) public AppRet shutdown() { return AppRet.success(); } //启动 - @EnginnerPageAction(name = "启动", group = "应用控制", groupOrder = 1, order = 1) + @EnginnerPageAction(name = "启动", group = "应用控制", order = ORDER.startProcess) public AppRet startProcess() { return AppRet.success(); } //暂停 - @EnginnerPageAction(name = "暂停", group = "应用控制", order = 2) + @EnginnerPageAction(name = "暂停", group = "应用控制", order = ORDER.pauseProcess) public AppRet pauseProcess() { return AppRet.success(); } //急停 - @EnginnerPageAction(name = "急停", group = "应用控制", order = 3) + @EnginnerPageAction(name = "急停", group = "应用控制", order = ORDER.forceStopProcess) public AppRet forceStopProcess() { return AppRet.success(); } //停止 - @EnginnerPageAction(name = "停止", group = "应用控制", order = 4) + @EnginnerPageAction(name = "停止", group = "应用控制", order = ORDER.stopProcess) public AppRet stopProcess() { return AppRet.success(); } diff --git a/src/main/java/a8k/service/appsettings/AppSettingsMgr.java b/src/main/java/a8k/service/appsettings/AppSettingsMgr.java index 4265b53..4e91714 100644 --- a/src/main/java/a8k/service/appsettings/AppSettingsMgr.java +++ b/src/main/java/a8k/service/appsettings/AppSettingsMgr.java @@ -3,12 +3,14 @@ package a8k.service.appsettings; import a8k.appbase.appret.AppRet; import a8k.controler.engineer.utils.EngineerPageTab; import a8k.controler.engineer.utils.EnginnerPageAction; +import a8k.controler.engineer.utils.EnginnerPageTabOrder; import a8k.db.AppSetting; import a8k.service.appsettings.base.AppSettingTab; import a8k.service.appsettings.base.AppOptionName; import a8k.service.appsettings.settingenum.AutoLogoutTime; import a8k.service.appsettings.settingenum.LISProtocol; import a8k.service.appsettings.settingenum.LISType; +import a8k.service.hardware.canbus.protocol.A8kEcode; import com.iflytop.uf.UfActiveRecord; import jakarta.annotation.PostConstruct; import org.slf4j.Logger; @@ -20,25 +22,20 @@ import java.util.Map; import java.util.Objects; @Component -@EngineerPageTab(name = "AppSettings") +@EngineerPageTab(name = "应用-系统设置", order = EnginnerPageTabOrder.AppSettingsMgr) public class AppSettingsMgr { Logger logger = org.slf4j.LoggerFactory.getLogger(AppSettingsMgr.class); - static Integer settingPageVersion = 1; - List dbGetAppSettings() { - return UfActiveRecord.find(AppSetting.class); + static class ORDER { + static final int getAppSettings = 1; + static final int getTabs = 2; + static final int setSysDate = 3; + static final int setSysTime = 4; + static final int setOptionVal = 5; } - AppSetting dbGetAppSetting(AppOptionName name) { - return UfActiveRecord.findOne(AppSetting.class, Map.of("name", name.name())); - } + static Integer settingPageVersion = 2; - void dbClearAppSettings() { - var items = dbGetAppSettings(); - for (var item : items) { - item.delete(); - } - } @PostConstruct public void init() { @@ -51,12 +48,12 @@ public class AppSettingsMgr { } } + public void initsettingdb() { AppSetting.setBuildGroup(AppSettingTab.DEVICE); AppSetting.addIntegerOption(AppOptionName.SETTING_PAGE_VERSION, settingPageVersion); AppSetting.addDateOption(AppOptionName.DATE, ""); AppSetting.addTimeOption(AppOptionName.TIME, ""); - AppSetting.addTimezoneOption(AppOptionName.TIMEZONE, ""); AppSetting.addEnumOption(AppOptionName.LANGUAGE, new String[]{"zh_CN", "en_US"}, "zh_CN"); AppSetting.addBooleanOption(AppOptionName.AUTO_PRINT, false); AppSetting.addEnumOption(AppOptionName.AUTO_LOGOUT, AutoLogoutTime.cgetValues(), AutoLogoutTime.T03_00.name()); @@ -72,13 +69,36 @@ public class AppSettingsMgr { AppSetting.addFixStringOption(AppOptionName.MCU_VERSION, "v1.0.0"); } + List dbGetAppSettings() { + return UfActiveRecord.find(AppSetting.class); + } - @EnginnerPageAction(name = "getAppSettings") + AppSetting dbGetAppSetting(AppOptionName name) { + return UfActiveRecord.findOne(AppSetting.class, Map.of("name", name.name())); + } + + Boolean isOptionLegal(AppOptionName name, String val) { + //TODO:添加校验逻辑 + return true; + } + + void dbClearAppSettings() { + var items = dbGetAppSettings(); + for (var item : items) { + item.delete(); + } + } + + // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + // EXT FUNC + // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + @EnginnerPageAction(name = "getAppSettings", order = ORDER.getAppSettings) public AppRet> getAppSettings() { return AppRet.success(dbGetAppSettings()); } - @EnginnerPageAction(name = "getTabs") + @EnginnerPageAction(name = "getTabs", order = ORDER.getTabs) public AppRet> getTabs() { List groups = new ArrayList<>(); for (AppSettingTab group : AppSettingTab.values()) { @@ -87,30 +107,28 @@ public class AppSettingsMgr { return AppRet.success(groups); } - @EnginnerPageAction(name = "setSysDate") + @EnginnerPageAction(name = "setSysDate", order = ORDER.setSysDate) public void setSysDate(Integer Year, Integer Month, Integer Day) { logger.info("setSysDate {}-{}-{}", Year, Month, Day); } - @EnginnerPageAction(name = "setSysTime") + @EnginnerPageAction(name = "setSysTime", order = ORDER.setSysTime) public void setSysTime(Integer Hour, Integer Minute, Integer Second) { logger.info("setSysTime {}:{}:{}", Hour, Minute, Second); } - @EnginnerPageAction(name = "setSysTimezone") - public void setSysTimezone(String timezone) { - logger.info("setSysTimezone {}", timezone); - } - - @EnginnerPageAction(name = "setOptionVal") - public void setOptionVal(AppOptionName optionName,String val){ + @EnginnerPageAction(name = "setOptionVal", order = ORDER.setOptionVal) + public AppRet setOptionVal(AppOptionName optionName, String val) { logger.info("setOptionVal {}={}", optionName, val); + if (!isOptionLegal(optionName, val)) { + return AppRet.fail(A8kEcode.AppOptionIsInvalid); + } AppSetting appSetting = dbGetAppSetting(optionName); - if(appSetting != null){ + if (appSetting != null) { appSetting.value = val; appSetting.save(); } + return AppRet.success(); } - } diff --git a/src/main/java/a8k/service/hardware/canbus/protocol/A8kEcode.java b/src/main/java/a8k/service/hardware/canbus/protocol/A8kEcode.java index abc2924..397f70d 100644 --- a/src/main/java/a8k/service/hardware/canbus/protocol/A8kEcode.java +++ b/src/main/java/a8k/service/hardware/canbus/protocol/A8kEcode.java @@ -40,6 +40,12 @@ public enum A8kEcode { TubeHolderCfgNotExist(200, "试管架配置不存在"), // TubeCfgNotExist(201, "试管配置不存在"), // + A8kIDCardOffline(300, "未检测到ID卡"), // + A8kIDCardContentError(301, "ID卡内容错误"), // + A8kIDCardVersionIsLow(302, "ID卡版本过低"), // + + AppOptionIsInvalid(400, "AppOptionIsInvalid"), // + // // FOR HARDWARE // diff --git a/src/main/java/a8k/service/hardware/canbus/protocol/RegIndex.java b/src/main/java/a8k/service/hardware/canbus/protocol/RegIndex.java index a2e5376..6c5de69 100644 --- a/src/main/java/a8k/service/hardware/canbus/protocol/RegIndex.java +++ b/src/main/java/a8k/service/hardware/canbus/protocol/RegIndex.java @@ -165,7 +165,7 @@ public enum RegIndex { kreg_id_card_reader_raw_sector_size(10301), // kreg_id_card_reader_raw_sector_num(10302), // - kreg_id_card_reader_is_online(10303), // + kreg_id_card_reader_is_online(10303,false), // /*********************************************************************************************************************** * 板夹仓扫码 * diff --git a/src/main/java/a8k/service/project_mgr/AppProjectItemMgrService.java b/src/main/java/a8k/service/project_mgr/AppProjectItemMgrService.java index f79267b..ab77822 100644 --- a/src/main/java/a8k/service/project_mgr/AppProjectItemMgrService.java +++ b/src/main/java/a8k/service/project_mgr/AppProjectItemMgrService.java @@ -15,10 +15,7 @@ import a8k.service.appeventbus.appevent.A8kCanBusOnConnectEvent; import a8k.service.appeventbus.appevent.A8kHardwareReport; import a8k.service.appeventbus.appevent.AppEvent; import a8k.service.hardware.canbus.A8kCanBusService; -import a8k.service.hardware.canbus.protocol.A8kPacket; -import a8k.service.hardware.canbus.protocol.CmdId; -import a8k.service.hardware.canbus.protocol.MId; -import a8k.service.hardware.canbus.protocol.RegIndex; +import a8k.service.hardware.canbus.protocol.*; import a8k.service.appstate.AppStateMgrService; import a8k.utils.wq.ZWorkQueue; import jakarta.annotation.PostConstruct; @@ -35,6 +32,13 @@ import java.util.Map; public class AppProjectItemMgrService implements AppEventListener { static Logger logger = org.slf4j.LoggerFactory.getLogger(AppProjectItemMgrService.class); + static class ORDER { + static final int readIDCardInfo = 1; + static final int saveIDCardInfo = 2; + static final int getProjectInfoList = 3; + static final int getProjectInfo = 4; + } + @Resource A8kCanBusService canBus; @@ -52,6 +56,10 @@ public class AppProjectItemMgrService implements AppEventListener { eventBus.regListener(this); } + /** + * 事件总线事件处理 + * @param event e + */ @Override public void onAppEvent(AppEvent event) { if (event instanceof A8kHardwareReport canPacket) { A8kPacket packet = canPacket.getReportPacket(); @@ -70,6 +78,11 @@ public class AppProjectItemMgrService implements AppEventListener { } } + /** + * 从数据库中获取项目信息 + * @param lotName 项目名称 + * @return 项目信息 + */ ProjectInfo dbGetProjectInfo(String lotName) { return ProjectInfo.findOne(ProjectInfo.class, Map.of("lotName", lotName)); } @@ -83,11 +96,54 @@ public class AppProjectItemMgrService implements AppEventListener { return result; } + /** + * 添加项目信息 + * @param newpinfo 项目信息 + * @return A8kEcode + */ + public A8kEcode dbSaveProjectInfo(ProjectInfo newpinfo) { + var pinfo = ProjectInfo.findOne(ProjectInfo.class, Map.of("lotName", newpinfo.lotName)); + if (pinfo != null && newpinfo.updateChipVersion < pinfo.updateChipVersion) { + return A8kEcode.A8kIDCardVersionIsLow; + } else { + if (pinfo != null) { + pinfo.delete(); + } + newpinfo.save(); + } + return A8kEcode.Success; + } + + + /** + * 判断是否是新的项目信息 + * @param newpinfo 新的项目信息 + * @return 是否是新的项目信息 + */ Boolean isNewProjectInfo(ProjectInfo newpinfo) { var pinfo = ProjectInfo.findOne(ProjectInfo.class, Map.of("lotName", newpinfo.lotName)); return pinfo == null || newpinfo.updateChipVersion >= pinfo.updateChipVersion; } + Boolean isProjectInfoLegal(ProjectInfo pinfo) { + if (pinfo == null) { + return false; + } + + if (pinfo.lotName == null || pinfo.lotName.isEmpty()) { + return false; + } + + if (pinfo.updateChipVersion == null) { + return false; + } + return true; + } + + /** + * 读取ID卡信息并构造ProjectInfo + * @return 项目信息 + */ private ProjectInfo readAndConstructProjectInfo() { //读取ID卡信息 byte[] data = null; @@ -97,8 +153,8 @@ public class AppProjectItemMgrService implements AppEventListener { //TODO: // 解析ID // 构造ProjectInfo - } catch (HardwareException e) { - throw new RuntimeException(e); + return new ProjectInfo(); + } catch (HardwareException ignored) { } return null; } @@ -114,39 +170,48 @@ public class AppProjectItemMgrService implements AppEventListener { // 存储项目信息到数据库中 // 调用 stateMgr.setCurrentIdCardInfo(); 将ID卡信息存储到状态管理器中 ProjectInfo pjinfo = readAndConstructProjectInfo(); - } // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - // PUBLIC + // EXT // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - - @EnginnerPageAction(name = "获取项目信息(简单)", order = 1) - public AppRet> getProjectInfoSimple() { - return AppRet.success(dbGetProjectInfos()); + @EnginnerPageAction(name = "读取ID卡信息", order = ORDER.readIDCardInfo) + public AppRet readIDCardInfo() { + ProjectInfo pinfo = readAndConstructProjectInfo(); + return AppRet.success(pinfo); } - @EnginnerPageAction(name = "添加项目信息", order = 2) - public AppRet addProjectInfo(ProjectInfo newpinfo) { - var pinfo = ProjectInfo.findOne(ProjectInfo.class, Map.of("lotName", newpinfo.lotName)); - if (pinfo != null && newpinfo.updateChipVersion < pinfo.updateChipVersion) { - return AppRet.success("新项目版本低于数据库中的项目版本,不更新"); - } else { - if (pinfo != null) { - pinfo.delete(); - } - newpinfo.save(); + @EnginnerPageAction(name = "保存ID卡信息", order = ORDER.saveIDCardInfo) + public AppRet saveIDCardInfo() { + ProjectInfo pinfo = readAndConstructProjectInfo(); + if (pinfo == null) { + return AppRet.fail(A8kEcode.A8kIDCardOffline); + } + if (!isProjectInfoLegal(pinfo)) { + return AppRet.fail(A8kEcode.A8kIDCardContentError); } - return AppRet.success("添加成功"); + A8kEcode ecode = dbSaveProjectInfo(pinfo); + if (ecode != A8kEcode.Success) { + return AppRet.fail(ecode); + } + return AppRet.success(pinfo); } - @EnginnerPageAction(name = "读取ID卡信息", order = 3) - public AppRet readIDCardInfo() { - ProjectInfo pinfo = readAndConstructProjectInfo(); - return AppRet.success(pinfo); + @EnginnerPageAction(name = "获取项目信息列表", order = ORDER.getProjectInfoList) + public AppRet> getProjectInfoList() { + return AppRet.success(dbGetProjectInfos()); } + @EnginnerPageAction(name = "获取项目信息", order = ORDER.getProjectInfo) + public AppRet getProjectInfo(String lotName) { + return AppRet.success(dbGetProjectInfo(lotName)); + } + + // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + // STATUS + // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + @EnginnerPageStatu(name = "ID卡状态") public Boolean idCardStatus() { try {