From 88807f6d70089534e4dae694744f8f1fc1d59b35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=87=A4=E5=90=89?= Date: Sat, 19 Apr 2025 20:45:29 +0800 Subject: [PATCH 1/9] =?UTF-8?q?=E8=87=AA=E5=8A=A8=E7=99=BB=E5=87=BA?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/a8k/app/config/WebConfig.java | 20 ++ .../api/v1/app/setting/DeviceSettingControler.java | 1 + .../app/interceptor/RefreshAccessInterceptor.java | 27 ++ .../a8k/app/service/data/AppUserMgrService.java | 282 +++++++++++++-------- .../app/service/setting/AppSettingsMgrService.java | 5 + 5 files changed, 229 insertions(+), 106 deletions(-) create mode 100644 src/main/java/a8k/app/config/WebConfig.java create mode 100644 src/main/java/a8k/app/interceptor/RefreshAccessInterceptor.java diff --git a/src/main/java/a8k/app/config/WebConfig.java b/src/main/java/a8k/app/config/WebConfig.java new file mode 100644 index 0000000..f59c752 --- /dev/null +++ b/src/main/java/a8k/app/config/WebConfig.java @@ -0,0 +1,20 @@ +package a8k.app.config; + +import a8k.app.interceptor.RefreshAccessInterceptor; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class WebConfig implements WebMvcConfigurer { + private final RefreshAccessInterceptor refreshInterceptor; + + public WebConfig(RefreshAccessInterceptor refreshInterceptor) { + this.refreshInterceptor = refreshInterceptor; + } + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(refreshInterceptor).addPathPatterns("/api/**"); + } +} \ No newline at end of file diff --git a/src/main/java/a8k/app/controler/api/v1/app/setting/DeviceSettingControler.java b/src/main/java/a8k/app/controler/api/v1/app/setting/DeviceSettingControler.java index efa1c0a..c0f1b39 100644 --- a/src/main/java/a8k/app/controler/api/v1/app/setting/DeviceSettingControler.java +++ b/src/main/java/a8k/app/controler/api/v1/app/setting/DeviceSettingControler.java @@ -1,5 +1,6 @@ package a8k.app.controler.api.v1.app.setting; +import a8k.app.service.data.AppUserMgrService; import a8k.app.type.exception.AppException; import a8k.app.type.ui.ApiRet; import a8k.app.dao.type.db.DeviceSetting; diff --git a/src/main/java/a8k/app/interceptor/RefreshAccessInterceptor.java b/src/main/java/a8k/app/interceptor/RefreshAccessInterceptor.java new file mode 100644 index 0000000..9843872 --- /dev/null +++ b/src/main/java/a8k/app/interceptor/RefreshAccessInterceptor.java @@ -0,0 +1,27 @@ +package a8k.app.interceptor; + +import a8k.app.service.data.AppUserMgrService; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.jetbrains.annotations.NotNull; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; + +/** + * Interceptor that refreshes the last-access timestamp on each HTTP request. + */ +@Component +public class RefreshAccessInterceptor implements HandlerInterceptor { + + private final AppUserMgrService userMgr; + + public RefreshAccessInterceptor(AppUserMgrService userMgr) { + this.userMgr = userMgr; + } + + @Override + public boolean preHandle(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response, @NotNull Object handler) { + userMgr.recordAccess(); + return true; + } +} diff --git a/src/main/java/a8k/app/service/data/AppUserMgrService.java b/src/main/java/a8k/app/service/data/AppUserMgrService.java index 6d09445..10a6c0d 100644 --- a/src/main/java/a8k/app/service/data/AppUserMgrService.java +++ b/src/main/java/a8k/app/service/data/AppUserMgrService.java @@ -1,123 +1,193 @@ package a8k.app.service.data; import a8k.app.dao.AppUsrDao; +import a8k.app.dao.DeviceSettingDao; import a8k.app.dao.type.db.AppUser; +import a8k.app.dao.type.db.DeviceSetting; import a8k.app.hardware.type.A8kEcode; import a8k.app.type.exception.AppException; +import jakarta.annotation.PostConstruct; import jakarta.annotation.Resource; import org.slf4j.Logger; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; +import java.time.Duration; +import java.time.Instant; import java.util.List; @Component +@EnableScheduling //Enable scheduled tasks public class AppUserMgrService { - static Logger logger = org.slf4j.LoggerFactory.getLogger(AppUserMgrService.class); - - @Resource - AppUsrDao appUsrDao; - - AppUser loginUsr = null; - - - // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - // EXT FUNC - // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - - - public AppUser login(int id, String password) throws AppException { - var usr = appUsrDao.getUsrById(id); - if (usr == null) - throw new AppException(A8kEcode.USR_NOT_EXIT); - - if (!usr.password.equals(password)) { - throw new AppException(A8kEcode.USR_PASSWORD_ERROR); - } - loginUsr = usr; - return (usr); - } - - - public Void unlogin() { - loginUsr = null; - return null; - } - - - synchronized public AppUser getLoginUsr() { - return (loginUsr); - } - - - public List getUsrlist() { - return (appUsrDao.getAllUsr()); - } - - - public AppUser addUser(String account, String password, AppUser.UsrRole type) throws AppException { - var user = appUsrDao.getUsrByAccount(account); - if (user != null) { - throw new AppException(A8kEcode.USR_ALREADY_EXIST); - } - user = new AppUser(account, password, type); - appUsrDao.addUser(user); - return appUsrDao.getUsrByAccount(account); - } - - - public Void delUser(Integer id) { - appUsrDao.deleteUserById(id); - return null; - } - - public AppUser updateUsr(AppUser usr) { - appUsrDao.updateUser(usr); - return usr; - } - - public AppUser modifyUsrPwd(Integer id, String oldpasswd,String password) throws AppException { - var user = appUsrDao.getUsrById(id); - if (user == null) { - throw new AppException(A8kEcode.USR_NOT_EXIT); - } - - if(!user.password.equals(oldpasswd)){ - throw new AppException(A8kEcode.USR_OLD_PASSWORD_ERROR); - } - - if (password.isEmpty()) { - throw new AppException(A8kEcode.USR_PASSWORD_IS_EMPTY); - } - - user.password = password; - appUsrDao.updateUser(user); - return user; - } - - - public AppUser modifyUsrRole(Integer id, AppUser.UsrRole usrRole) throws AppException { - var user = appUsrDao.getUsrById(id); - if (user == null) { - throw new AppException(A8kEcode.USR_NOT_EXIT); - } - user.usrRole = usrRole; - appUsrDao.updateUser(user); - return user; - - } - - - public AppUser modifyUsrAccount(Integer id, String newaccount) throws AppException { - var user = appUsrDao.getUsrById(id); - if (user == null) { - throw new AppException(A8kEcode.USR_NOT_EXIT); - } - user.account = newaccount; - appUsrDao.updateUser(user); - return user; - - } - + static Logger logger = org.slf4j.LoggerFactory.getLogger(AppUserMgrService.class); + + /** + * current user + */ + @Resource + AppUsrDao appUsrDao; + @Resource + DeviceSettingDao deviceSettingDao; + + AppUser loginUsr = null; + + /** + * timestamp of last access + */ + private volatile Instant lastAccess; + + /** + * auto logout time out duration + */ + private volatile Duration autoLogoutTimeout; + + /** + * flag to enable auto logout + */ + private volatile boolean autoLogout; + + // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + // EXT FUNC + // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + /** + * load timeout and switch + */ + @PostConstruct + public void init() { + DeviceSetting deviceSetting = deviceSettingDao.get(); + int minutes = deviceSetting.getAutoLogoutTimeout(); + this.autoLogoutTimeout = Duration.ofMinutes(minutes); + boolean autoLogout = deviceSetting.getAutoLogout(); + this.autoLogout = autoLogout; + logger.debug("initialized autoLogout={}, timeout={} minutes", autoLogout, minutes); + } + + + public AppUser login(int id, String password) throws AppException { + var usr = appUsrDao.getUsrById(id); + if (usr == null) + throw new AppException(A8kEcode.USR_NOT_EXIT); + + if (!usr.password.equals(password)) { + throw new AppException(A8kEcode.USR_PASSWORD_ERROR); + } + loginUsr = usr; + return (usr); + } + + + public Void unlogin() { + loginUsr = null; + return null; + } + + + /** + * refresh lastAccess on each intercepted request + */ + public synchronized void recordAccess() { + if (loginUsr != null) { + this.lastAccess = Instant.now(); + } + } + + public synchronized void updateAutoLogout(boolean autoLogout) { + this.autoLogout = autoLogout; + logger.debug("updated cache autoLogout:{}", autoLogout); + } + + public synchronized void updateAutoLogoutTimeout(int autoLogoutTimeout) { + this.autoLogoutTimeout = Duration.ofMinutes(autoLogoutTimeout); + logger.debug("updated cache autoLogoutTimeout {} minutes", autoLogoutTimeout); + } + + + synchronized public AppUser getLoginUsr() { + return (loginUsr); + } + + + public List getUsrlist() { + return (appUsrDao.getAllUsr()); + } + + + public AppUser addUser(String account, String password, AppUser.UsrRole type) throws AppException { + var user = appUsrDao.getUsrByAccount(account); + if (user != null) { + throw new AppException(A8kEcode.USR_ALREADY_EXIST); + } + user = new AppUser(account, password, type); + appUsrDao.addUser(user); + return appUsrDao.getUsrByAccount(account); + } + + + public Void delUser(Integer id) { + appUsrDao.deleteUserById(id); + return null; + } + + public AppUser updateUsr(AppUser usr) { + appUsrDao.updateUser(usr); + return usr; + } + + public AppUser modifyUsrPwd(Integer id, String oldpasswd, String password) throws AppException { + var user = appUsrDao.getUsrById(id); + if (user == null) { + throw new AppException(A8kEcode.USR_NOT_EXIT); + } + + if (!user.password.equals(oldpasswd)) { + throw new AppException(A8kEcode.USR_OLD_PASSWORD_ERROR); + } + + if (password.isEmpty()) { + throw new AppException(A8kEcode.USR_PASSWORD_IS_EMPTY); + } + + user.password = password; + appUsrDao.updateUser(user); + return user; + } + + + public AppUser modifyUsrRole(Integer id, AppUser.UsrRole usrRole) throws AppException { + var user = appUsrDao.getUsrById(id); + if (user == null) { + throw new AppException(A8kEcode.USR_NOT_EXIT); + } + user.usrRole = usrRole; + appUsrDao.updateUser(user); + return user; + + } + + + public AppUser modifyUsrAccount(Integer id, String newaccount) throws AppException { + var user = appUsrDao.getUsrById(id); + if (user == null) { + throw new AppException(A8kEcode.USR_NOT_EXIT); + } + user.account = newaccount; + appUsrDao.updateUser(user); + return user; + + } + + @Scheduled(fixedDelay = 60_000) + public void autoLogoutTask() { + if (!autoLogout || loginUsr == null) { + return; + } + if (Duration.between(lastAccess, Instant.now()).compareTo(autoLogoutTimeout) >= 0) { + logger.info("auto logout user {} after {} minutes inactivity", loginUsr.account, autoLogoutTimeout.toMinutes()); + unlogin(); + } + } } diff --git a/src/main/java/a8k/app/service/setting/AppSettingsMgrService.java b/src/main/java/a8k/app/service/setting/AppSettingsMgrService.java index 8f03735..af64911 100644 --- a/src/main/java/a8k/app/service/setting/AppSettingsMgrService.java +++ b/src/main/java/a8k/app/service/setting/AppSettingsMgrService.java @@ -1,5 +1,6 @@ package a8k.app.service.setting; +import a8k.app.service.data.AppUserMgrService; import a8k.app.type.exception.AppException; import a8k.app.dao.DeviceSettingDao; import a8k.app.dao.LISSettingDao; @@ -16,6 +17,8 @@ import org.springframework.stereotype.Component; @Component public class AppSettingsMgrService { Logger logger = org.slf4j.LoggerFactory.getLogger(AppSettingsMgrService.class); + @Resource + AppUserMgrService appUserMgrService; @Resource DeviceSettingDao deviceSettingDao; @@ -61,12 +64,14 @@ public class AppSettingsMgrService { DeviceSetting setting = deviceSettingDao.get(); setting.autoLogoutTimeout = val; deviceSettingDao.update(setting); + appUserMgrService.updateAutoLogoutTimeout(val); } public void setAutoLogout(Boolean val) { DeviceSetting setting = deviceSettingDao.get(); setting.autoLogout = val; deviceSettingDao.update(setting); + appUserMgrService.updateAutoLogout(val); } From 48d0f5228a0d164e93067688b2f6c21de2d603cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=87=A4=E5=90=89?= Date: Sun, 20 Apr 2025 14:50:08 +0800 Subject: [PATCH 2/9] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=80=97=E6=9D=90?= =?UTF-8?q?=E4=B8=8D=E8=B6=B3=E6=97=B6=E5=BC=82=E5=B8=B8=E5=88=A4=E6=96=AD?= =?UTF-8?q?=E7=A9=BA=E6=8C=87=E9=92=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/a8k/app/type/error/AEConsumeNotEnoughError.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/a8k/app/type/error/AEConsumeNotEnoughError.java b/src/main/java/a8k/app/type/error/AEConsumeNotEnoughError.java index c182c93..ab44899 100644 --- a/src/main/java/a8k/app/type/error/AEConsumeNotEnoughError.java +++ b/src/main/java/a8k/app/type/error/AEConsumeNotEnoughError.java @@ -13,6 +13,7 @@ public class AEConsumeNotEnoughError extends AppError { public AEConsumeNotEnoughError(List consumableStatInfos) { super(A8kEcode.APPE_CONSUME_NOT_ENOUGH); + this.consumableStatInfos = consumableStatInfos; } } From e2551d33938d80712b7beb864811e83561636699 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=87=A4=E5=90=89?= Date: Sun, 20 Apr 2025 14:50:56 +0800 Subject: [PATCH 3/9] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=B8=A5=E9=87=8D?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E6=96=87=E5=AD=97=E6=8F=8F=E8=BF=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/a8k/app/i18n/Internationalization.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/a8k/app/i18n/Internationalization.java b/src/main/java/a8k/app/i18n/Internationalization.java index b589f51..aa86bc0 100644 --- a/src/main/java/a8k/app/i18n/Internationalization.java +++ b/src/main/java/a8k/app/i18n/Internationalization.java @@ -18,7 +18,7 @@ public class Internationalization { case APPE_TUBE_HOLDER_SETTING_IS_LOCKED -> "试管架设置被锁定,已锁定的."; case APPE_EMERGENCY_SAMPLE_IS_PROCESSING -> "添加急诊样本失败,急诊样本还没有处理完成"; case APPE_ADD_EMERGENCY_ACTION_IS_NOT_ALLOWED_WHEN_WORKING -> "添加急诊样本失败,设备正在运行中"; - case APPE_DEVICE_IS_IN_FATAL_ERROR -> "设备处于严重错误,请重新初始化后再启动"; + case APPE_DEVICE_IS_IN_FATAL_ERROR -> "设备处于严重错误,请关闭电源重启设备"; case APPE_SCAN_TUBEHOLDER_TYPE_TIMEOUT -> "扫描试管架类型超时"; case APPE_TUBE_HOLDER_TYPE_IS_NOT_SUPPORT -> "试管架类型不支持"; case APPE_INFEED_OVERTIME_FAIL -> "入料超时失败"; From d4465bb53ca26669cd57f21a0d6220f9a0efb176 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=87=A4=E5=90=89?= Date: Sun, 20 Apr 2025 16:04:25 +0800 Subject: [PATCH 4/9] =?UTF-8?q?vals=E6=B2=A1=E6=9C=89=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=88=B0table=E4=B8=AD=EF=BC=8C=E5=AF=BC=E8=87=B4=E5=89=8D?= =?UTF-8?q?=E7=AB=AF=E9=A1=B5=E9=9D=A2=E6=97=A0=E6=98=BE=E7=A4=BA=E5=85=B7?= =?UTF-8?q?=E4=BD=93=E7=BC=BA=E5=B0=91=E7=9A=84=E8=80=97=E6=9D=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/a8k/app/factory/ZAppPromoptFactory.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/a8k/app/factory/ZAppPromoptFactory.java b/src/main/java/a8k/app/factory/ZAppPromoptFactory.java index 0e30f90..10f0ea3 100644 --- a/src/main/java/a8k/app/factory/ZAppPromoptFactory.java +++ b/src/main/java/a8k/app/factory/ZAppPromoptFactory.java @@ -66,6 +66,7 @@ public class ZAppPromoptFactory { } else { vals[2] = new ZAppPromoptTable.Val(MessageLevel.Info, consumableStatInfo.requireCnt.toString()); } + table.addVar(vals); } return new ZAppPromopt(MessageLevel.Error, "耗材不足", null, table); } else if (error instanceof AETubeError appError) { From 70719561b926eedeacdd01b380d95be179fac646 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=87=A4=E5=90=89?= Date: Sun, 20 Apr 2025 16:05:14 +0800 Subject: [PATCH 5/9] =?UTF-8?q?=E5=8F=AA=E6=9C=89=E5=9C=A8=E8=80=97?= =?UTF-8?q?=E6=9D=90=E5=85=85=E8=B6=B3=E7=9A=84=E6=83=85=E5=86=B5=E4=B8=8B?= =?UTF-8?q?=E6=89=8D=E8=A6=86=E7=9B=96tubeHolder?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mainctrl/mainflowctrl/action/AC30ScanTubeHolderTask.java | 1 - src/main/java/a8k/app/service/statemgr/TubeStateMgrService.java | 7 ++++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC30ScanTubeHolderTask.java b/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC30ScanTubeHolderTask.java index d642eb1..8a3d82f 100644 --- a/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC30ScanTubeHolderTask.java +++ b/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC30ScanTubeHolderTask.java @@ -153,7 +153,6 @@ public class AC30ScanTubeHolderTask extends A8kActionTask { log.info("试管架配置 {}", setting); TubeHolder tubeholder = new TubeHolder(); - Assert.isTrue(setting == null || setting.tubeSettings.length == tubeholder.getTubes().length, "试管架配置信息与试管数量不匹配"); //获取试管架类型 A8kTubeHolderType tubeHolderType = A8kTubeHolderType.of(scanResult.tubeHolderType); diff --git a/src/main/java/a8k/app/service/statemgr/TubeStateMgrService.java b/src/main/java/a8k/app/service/statemgr/TubeStateMgrService.java index 5d5aa57..78d8196 100644 --- a/src/main/java/a8k/app/service/statemgr/TubeStateMgrService.java +++ b/src/main/java/a8k/app/service/statemgr/TubeStateMgrService.java @@ -124,8 +124,8 @@ public class TubeStateMgrService { //试管状态管理 // public synchronized AppError newTubeHolder(TubeHolder tubeHolder) throws AppException { - this.tubeHolder = tubeHolder; - var tubes = tubeHolder.getTubes(); +// this.tubeHolder = tubeHolder; +// var tubes = tubeHolder.getTubes(); List statInfos = consumableStateAnalyzerService.analyze(tubeHolder); @@ -140,7 +140,8 @@ public class TubeStateMgrService { return new AppError(A8kEcode.APPE_TIP_NOT_ENOUGH); } - + this.tubeHolder = tubeHolder; + var tubes = tubeHolder.getTubes(); for (Tube tube : tubes) { if (tube.getState().equals(TubeState.EMPTY)) { continue; From ac1b1719fb2fb2ad663c527248e3e30a3579b705 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=87=A4=E5=90=89?= Date: Sun, 20 Apr 2025 16:08:55 +0800 Subject: [PATCH 6/9] =?UTF-8?q?=E5=A6=82=E6=9E=9C=E5=89=A9=E4=BD=99?= =?UTF-8?q?=E8=80=97=E6=9D=902=E4=B8=AA=EF=BC=8C=E5=BD=93=E5=89=8D?= =?UTF-8?q?=E8=AF=95=E7=AE=A1=E6=9E=B6=E9=9C=80=E8=A6=813=E4=B8=AA?= =?UTF-8?q?=E5=88=99=E8=80=97=E6=9D=90=E4=B8=8D=E8=B6=B3=E6=8E=A8=E5=87=BA?= =?UTF-8?q?=E8=AF=95=E7=AE=A1=E6=9E=B6=20=E4=BD=86=E6=98=AF=E8=80=97?= =?UTF-8?q?=E6=9D=90=E8=BF=98=E5=89=A9=E4=B8=8B2=E4=B8=AA=EF=BC=8C?= =?UTF-8?q?=E9=82=A3=E4=B9=88=E4=B8=8B=E4=B8=80=E4=B8=AA=E8=AF=95=E7=AE=A1?= =?UTF-8?q?=E6=9E=B6=E5=A6=82=E6=9E=9C=E6=BB=A1=E8=B6=B32=E4=B8=AA?= =?UTF-8?q?=E5=88=99=E5=BA=94=E8=AF=A5=E5=85=81=E8=AE=B8=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E8=BF=9B=E8=A1=8C=E6=93=8D=E4=BD=9C=EF=BC=8C=E8=80=97=E6=9D=90?= =?UTF-8?q?=E4=B8=8D=E8=B6=B3=E6=97=B6=E5=8F=AA=E5=BD=B1=E5=93=8D=E5=BD=93?= =?UTF-8?q?=E5=89=8D=E9=82=A3=E6=9E=B6=E7=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/mainctrl/mainflowctrl/action/AC30ScanTubeHolderTask.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC30ScanTubeHolderTask.java b/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC30ScanTubeHolderTask.java index 8a3d82f..2e5fefb 100644 --- a/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC30ScanTubeHolderTask.java +++ b/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC30ScanTubeHolderTask.java @@ -91,9 +91,7 @@ public class AC30ScanTubeHolderTask extends A8kActionTask { } public Boolean isReady() { - return tubeStateMgrService.isTubeHolderProcessCompleted() && - getTubeholderEnterPosPPS() && - !deviceWorkStateMgrService.getConsumeNotEnoughErrorFlag(); + return tubeStateMgrService.isTubeHolderProcessCompleted() && getTubeholderEnterPosPPS(); } public String toDisplayString() { @@ -223,6 +221,7 @@ public class AC30ScanTubeHolderTask extends A8kActionTask { } ebus.pushEvent(new AppWarningNotifyEvent(error)); doEjectHodler(); + deviceWorkStateMgrService.clearConsumeNotEnoughErrorFlag(); return false; } return true; From b6c8e57a035c0f47b095e213438da6bf45c8869f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=87=A4=E5=90=89?= Date: Sun, 20 Apr 2025 20:15:37 +0800 Subject: [PATCH 7/9] =?UTF-8?q?=E5=A6=82=E6=9E=9C=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E6=9C=AA=E5=90=AF=E5=8A=A8=E5=AE=8C=E6=AF=95=E5=88=99=E4=B8=8D?= =?UTF-8?q?=E8=83=BD=E8=BF=9B=E8=A1=8C=E5=88=9D=E5=A7=8B=E5=8C=96=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=20=E5=88=9D=E5=A7=8B=E5=8C=96=E6=97=B6=E5=A6=82?= =?UTF-8?q?=E6=9E=9C=E6=A3=80=E6=B5=8B=E5=88=B0=E8=AE=BE=E5=A4=87=E6=9C=AA?= =?UTF-8?q?=E5=90=AF=E5=8A=A8=E5=AE=8C=E6=AF=95=EF=BC=8C=E5=88=99=E6=8A=9B?= =?UTF-8?q?=E5=87=BADEVICE=5FSTARTUP=5FIN=5FPROGRESS=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/a8k/app/hardware/type/A8kEcode.java | 1 + .../java/a8k/app/service/lowerctrl/DeviceMoveToZeroCtrlService.java | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/a8k/app/hardware/type/A8kEcode.java b/src/main/java/a8k/app/hardware/type/A8kEcode.java index 2f73770..b4bc6f0 100644 --- a/src/main/java/a8k/app/hardware/type/A8kEcode.java +++ b/src/main/java/a8k/app/hardware/type/A8kEcode.java @@ -61,6 +61,7 @@ public enum A8kEcode { APPE_DO_ACTION_FAIL_DEVICE_IS_WORKING(152),//设备正在工作中,不允许执行操作 APPE_CONSUMABLES_IS_IN_USE_NOT_ALLOW_UNSTALL(153),//耗材正在使用中,不允许卸载 + DEVICE_STARTUP_IN_PROGRESS(154), // 设备启动中,请稍后 // // 业务流程中的错误 // 1. 点击开始运行后,设备在运行过程中出现的错误 diff --git a/src/main/java/a8k/app/service/lowerctrl/DeviceMoveToZeroCtrlService.java b/src/main/java/a8k/app/service/lowerctrl/DeviceMoveToZeroCtrlService.java index 5299bcd..57ebf31 100644 --- a/src/main/java/a8k/app/service/lowerctrl/DeviceMoveToZeroCtrlService.java +++ b/src/main/java/a8k/app/service/lowerctrl/DeviceMoveToZeroCtrlService.java @@ -273,7 +273,9 @@ public class DeviceMoveToZeroCtrlService { if (workThread != null && workThread.isAlive()) { throw AppException.ofAECodeError("设备正在初始化中"); } - + if(!gstate.getBoardParamInited()){ + throw AppException.of(A8kEcode.DEVICE_STARTUP_IN_PROGRESS); + } if (workThread != null) { try { workThread.join(); From 8e457ab1ecdecd03594d839c090a54a37f21d6cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=87=A4=E5=90=89?= Date: Sun, 20 Apr 2025 20:17:42 +0800 Subject: [PATCH 8/9] =?UTF-8?q?=E5=A6=82=E6=9E=9C=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E6=9C=AA=E5=90=AF=E5=8A=A8=E5=AE=8C=E6=AF=95=E5=88=99=E4=B8=8D?= =?UTF-8?q?=E8=83=BD=E8=BF=9B=E8=A1=8C=E5=88=9D=E5=A7=8B=E5=8C=96=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=20=E5=88=9D=E5=A7=8B=E5=8C=96=E6=97=B6=E5=A6=82?= =?UTF-8?q?=E6=9E=9C=E6=A3=80=E6=B5=8B=E5=88=B0=E8=AE=BE=E5=A4=87=E6=9C=AA?= =?UTF-8?q?=E5=90=AF=E5=8A=A8=E5=AE=8C=E6=AF=95=EF=BC=8C=E5=88=99=E6=8A=9B?= =?UTF-8?q?=E5=87=BADEVICE=5FSTARTUP=5FIN=5FPROGRESS=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/a8k/app/i18n/Internationalization.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/a8k/app/i18n/Internationalization.java b/src/main/java/a8k/app/i18n/Internationalization.java index aa86bc0..bef1cfe 100644 --- a/src/main/java/a8k/app/i18n/Internationalization.java +++ b/src/main/java/a8k/app/i18n/Internationalization.java @@ -66,6 +66,7 @@ public class Internationalization { case IP_FORMAT_ERROR -> "IP格式错误"; case SHUTDOWN_ERROR_DEVICE_IS_WORKING -> "设备正在工作中,不允许关机"; case LOGIN_OUT_ERROR_DEVICE_IS_WORKING -> "设备正在工作中,不允许注销"; + case DEVICE_STARTUP_IN_PROGRESS -> "设备启动中,请稍后"; default -> ecode.toString(); }; } From 052229d95cc47519777f7096bc882366a2518f02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=87=A4=E5=90=89?= Date: Sun, 20 Apr 2025 20:29:37 +0800 Subject: [PATCH 9/9] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E8=AE=BE=E5=A4=87=E6=98=AF=E5=90=A6=E5=AE=8C=E6=88=90=E5=90=AF?= =?UTF-8?q?=E5=8A=A8=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/v1/app/ctrl/DeviceInitControler.java | 36 +++++++++++++--------- .../api/v1/app/ws/AppWebSocketEndpointMgr.java | 1 - 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/src/main/java/a8k/app/controler/api/v1/app/ctrl/DeviceInitControler.java b/src/main/java/a8k/app/controler/api/v1/app/ctrl/DeviceInitControler.java index d17fe71..51132d8 100644 --- a/src/main/java/a8k/app/controler/api/v1/app/ctrl/DeviceInitControler.java +++ b/src/main/java/a8k/app/controler/api/v1/app/ctrl/DeviceInitControler.java @@ -2,11 +2,11 @@ package a8k.app.controler.api.v1.app.ctrl; import a8k.app.service.lowerctrl.DeviceMoveToZeroCtrlService; import a8k.app.service.mainctrl.DeviceInitService; -import a8k.app.type.ui.ApiRet; +import a8k.app.service.statemgr.GStateMgrService; import a8k.app.type.exception.AppException; +import a8k.app.type.ui.ApiRet; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.annotation.Resource; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Controller; @@ -21,19 +21,27 @@ import org.springframework.web.bind.annotation.ResponseBody; @ResponseBody @RequiredArgsConstructor public class DeviceInitControler { - private final DeviceInitService deviceInitService; + private final DeviceInitService deviceInitService; + private final GStateMgrService gStateMgrService; + + @Operation(description = "初始化设备") + @PostMapping("/initDevice") + public ApiRet initDevice() throws AppException { + deviceInitService.initDeviceAsync(); + return ApiRet.success(); + } + - @Operation(description = "初始化设备") - @PostMapping("/initDevice") - public ApiRet initDevice() throws AppException { - deviceInitService.initDeviceAsync(); - return ApiRet.success(); - } + @Operation(description = "获取设备初始化状态") + @PostMapping("/getDeviceInitedTaskState") + public ApiRet getDeviceInitedTaskState() { + return ApiRet.success(deviceInitService.getDeviceInitedTaskState()); + } + @Operation(description = "获取设备是否完成启动") + @PostMapping("/isBoardParamInited") + public ApiRet isBoardParamInited() { + return ApiRet.success(gStateMgrService.getBoardParamInited()); + } - @Operation(description = "获取设备初始化状态") - @PostMapping("/getDeviceInitedTaskState") - public ApiRet getDeviceInitedTaskState() { - return ApiRet.success(deviceInitService.getDeviceInitedTaskState()); - } } diff --git a/src/main/java/a8k/app/controler/api/v1/app/ws/AppWebSocketEndpointMgr.java b/src/main/java/a8k/app/controler/api/v1/app/ws/AppWebSocketEndpointMgr.java index 1653111..7270323 100644 --- a/src/main/java/a8k/app/controler/api/v1/app/ws/AppWebSocketEndpointMgr.java +++ b/src/main/java/a8k/app/controler/api/v1/app/ws/AppWebSocketEndpointMgr.java @@ -156,7 +156,6 @@ public class AppWebSocketEndpointMgr { reportState("TubeHolderSetting", tubeHolderSettingMgrService.getTubeHolderSettings()); } - @Scheduled(fixedDelay = 200) public void reportDeviceState() { reportState("DeviceWorkState", deviceWorkStateMgrService.getDeviceWorkState());