Quellcode durchsuchen

add
定时补偿

18339543638 vor 1 Jahr
Ursprung
Commit
0f4698f726

+ 28 - 28
nb-service/web-service/src/main/java/com/nb/web/service/bus/hospital/HospitalManager.java

@@ -104,34 +104,34 @@ public class HospitalManager {
         this.patientService=SpringUtil.getBean(LocalBusPatientService.class);
         init(configStorageManager);
 
-        singleOffsetsDeviceExecutor.scheduleWithFixedDelay(()->{
-                    try {
-                        PatientMonitorQuery query = new PatientMonitorQuery();
-                        query.setTenantId(this.getHospitalId());
-                        query.setInfusionFinished(true);
-                        query.setDeviceStatus(Arrays.asList(0,5));
-                        List<PatientMonitorResult> patientMonitorResults = patientService.selectAll(query);
-                        if(CollectionUtil.isEmpty(patientMonitorResults)){
-                            return;
-                        }
-                        patientMonitorResults
-                                .forEach(infusionInfo->{
-                                    BusDeviceRunningEntity source = BeanUtil.toBean(infusionInfo, BusDeviceRunningEntity.class);
-                                    source.setRunState(infusionInfo.getDeviceRunState());
-                                    source.setAlarm(infusionInfo.getDeviceAlarm());
-                                    source.setInfusionId(infusionInfo.getInfusionId());
-                                    source.setUploadTime(infusionInfo.getLastUploadTime());
-                                    source.setTenantId(this.getHospitalId());
-                                    extraConfigHandler.handler(source);
-                                    autoUndoConfigHandler.handler(source);
-                                    finishMonitorConfigHandler.handler(source);
-                                });
-                    }catch (Exception e){
-                        e.printStackTrace();
-                    }
-                },
-                //1-10分钟内启动,间隔1天启动
-                RandomUtil.randomInt(1,10),  Math.addExact(1440, RandomUtil.randomInt(1,12)),TimeUnit.MINUTES);
+//        singleOffsetsDeviceExecutor.scheduleWithFixedDelay(()->{
+//                    try {
+//                        PatientMonitorQuery query = new PatientMonitorQuery();
+//                        query.setTenantId(this.getHospitalId());
+//                        query.setInfusionFinished(true);
+//                        query.setDeviceStatus(Arrays.asList(0,5));
+//                        List<PatientMonitorResult> patientMonitorResults = patientService.selectAll(query);
+//                        if(CollectionUtil.isEmpty(patientMonitorResults)){
+//                            return;
+//                        }
+//                        patientMonitorResults
+//                                .forEach(infusionInfo->{
+//                                    BusDeviceRunningEntity source = BeanUtil.toBean(infusionInfo, BusDeviceRunningEntity.class);
+//                                    source.setRunState(infusionInfo.getDeviceRunState());
+//                                    source.setAlarm(infusionInfo.getDeviceAlarm());
+//                                    source.setInfusionId(infusionInfo.getInfusionId());
+//                                    source.setUploadTime(infusionInfo.getLastUploadTime());
+//                                    source.setTenantId(this.getHospitalId());
+//                                    extraConfigHandler.handler(source);
+//                                    autoUndoConfigHandler.handler(source);
+//                                    finishMonitorConfigHandler.handler(source);
+//                                });
+//                    }catch (Exception e){
+//                        e.printStackTrace();
+//                    }
+//                },
+//                //1-10分钟内启动,间隔1天启动
+//                RandomUtil.randomInt(1,10),  Math.addExact(1440, RandomUtil.randomInt(1,12)),TimeUnit.MINUTES);
     }
 
     private void init(ConfigStorageManager configStorageManager){

+ 7 - 0
nb-service/web-service/src/main/java/com/nb/web/service/bus/hospital/config/handler/ClinicAutoFinishMonitorHandler.java

@@ -1,5 +1,7 @@
 package com.nb.web.service.bus.hospital.config.handler;
 
+import cn.hutool.core.date.DateUnit;
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.json.JSONUtil;
 import com.nb.web.api.entity.BusInfusionHistoryEntity;
 import com.nb.web.service.bus.entity.BusPatientEntity;
@@ -17,6 +19,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.util.Collections;
 import java.util.Date;
+import java.util.concurrent.TimeUnit;
 
 /**
  * @author lifang
@@ -56,6 +59,10 @@ public class ClinicAutoFinishMonitorHandler implements DelayMessageHandler {
             Date uploadTime = source.getUploadTime();
             //当延迟时间为0时,可能由于事务问题,导致此时mysql中还未及时更新数据
             if (message.getProperties().getExpire()==0||infusionHistory.getLastUploadTime().equals(uploadTime)) {
+                long seconds = message.getProperties().getTimeUnit().toSeconds(message.getProperties().getExpire());
+                if(DateUtil.between(new Date(),infusionHistory.getUpdateTime(), DateUnit.SECOND)<seconds){
+                    return;
+                }
                 log.info("延迟消息【{}】处理开始进行【{临床自动结束}】处理",JSONUtil.toJsonStr(message));
                 UndoDeviceConfig config = source.getConfig();
                 ManualUndoConfig manualUndoConfig = new ManualUndoConfig();

+ 7 - 0
nb-service/web-service/src/main/java/com/nb/web/service/bus/hospital/config/handler/DeputyDeviceAutoUndoHandler.java

@@ -1,5 +1,7 @@
 package com.nb.web.service.bus.hospital.config.handler;
 
+import cn.hutool.core.date.DateUnit;
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.json.JSONUtil;
 import com.nb.web.api.entity.BusInfusionHistoryEntity;
@@ -16,6 +18,7 @@ import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.Collections;
+import java.util.Date;
 
 /**
  * @author lifang
@@ -55,6 +58,10 @@ public class DeputyDeviceAutoUndoHandler implements DelayMessageHandler {
             BusInfusionHistoryEntity infusionHistory = infusionHistoryService.getById(infusionId);
             if(message.getProperties().getExpire()==0||ObjectUtil.equal(infusionHistory.getLastUploadTime(),source.getUploadTime())){
                 log.info("延迟消息【{}】处理开始进行【{设备自动撤泵}】处理",JSONUtil.toJsonStr(message));
+                long seconds = message.getProperties().getTimeUnit().toSeconds(message.getProperties().getExpire());
+                if(DateUtil.between(new Date(),source.getUploadTime(), DateUnit.SECOND)<seconds){
+                    return;
+                }
                 ManualUndoConfig manualUndoConfig = new ManualUndoConfig();
                 manualUndoConfig.setInfusionIds(Collections.singletonList(source.getInfusionId()));
                 manualUndoConfig.setPatientId(patient.getId());

+ 6 - 0
nb-service/web-service/src/main/java/com/nb/web/service/bus/hospital/config/handler/NoSignalHandler.java

@@ -1,5 +1,7 @@
 package com.nb.web.service.bus.hospital.config.handler;
 
+import cn.hutool.core.date.DateUnit;
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.nb.web.api.entity.BusDeviceAlarmEntity;
@@ -62,6 +64,10 @@ public class NoSignalHandler implements DelayMessageHandler {
         if(!lastUploadTime.equals(source.getUploadTime())){
             return;
         }
+        long seconds = message.getProperties().getTimeUnit().toSeconds(message.getProperties().getExpire());
+        if(DateUtil.between(new Date(),lastUploadTime, DateUnit.SECOND)<seconds){
+            return;
+        }
         BusInfusionHistoryEntity infusionHistory = infusionHistoryService.getById(source.getInfusionId());
         if (Boolean.TRUE.equals(infusionHistory.getFinished())) {
             //输注已结束

+ 189 - 0
nb-service/web-service/src/main/java/com/nb/web/service/bus/job/HospitalConfigJob.java

@@ -0,0 +1,189 @@
+package com.nb.web.service.bus.job;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.extra.spring.SpringUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.nb.common.queue.delay.manager.DelayMessageManager;
+import com.nb.common.queue.delay.message.DelayMessage;
+import com.nb.common.queue.delay.message.DelayMessageProperties;
+import com.nb.core.Value;
+import com.nb.web.api.bean.UndoDeviceConfig;
+import com.nb.web.api.entity.BusHospitalConfigEntity;
+import com.nb.web.api.entity.common.BusDeviceRunningEntity;
+import com.nb.web.api.enums.DeviceStatusEnum;
+import com.nb.web.api.feign.query.PatientMonitorQuery;
+import com.nb.web.api.feign.result.PatientMonitorResult;
+import com.nb.web.service.bus.entity.BusHospitalEntity;
+import com.nb.web.service.bus.hospital.HospitalManager;
+import com.nb.web.service.bus.hospital.HospitalManagerRegister;
+import com.nb.web.service.bus.hospital.config.HospitalDeviceAutoUndoConfigHandler;
+import com.nb.web.service.bus.hospital.config.HospitalFinishMonitorConfigHandler;
+import com.nb.web.service.bus.hospital.config.HospitalFunctionExtraConfigHandler;
+import com.nb.web.service.bus.hospital.config.bean.FunctionAutoUndoConfig;
+import com.nb.web.service.bus.hospital.config.bean.FunctionExtraConfig;
+import com.nb.web.service.bus.hospital.config.bean.FunctionFinishMonitorConfig;
+import com.nb.web.service.bus.hospital.config.handler.ClinicAutoFinishMonitorHandler;
+import com.nb.web.service.bus.hospital.config.handler.DeputyDeviceAutoUndoHandler;
+import com.nb.web.service.bus.hospital.config.handler.HandlerConstant;
+import com.nb.web.service.bus.hospital.config.handler.NoSignalHandler;
+import com.nb.web.service.bus.mapper.BusHospitalMapper;
+import com.nb.web.service.bus.service.LocalBusPatientService;
+import lombok.AllArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @ClassName : DeviceOfflineJob
+ * @Description :
+ * @Author : LF
+ * @Date: 2024年10月23日
+ */
+@Component
+@AllArgsConstructor
+public class HospitalConfigJob {
+    @Autowired
+    private BusHospitalMapper hospitalMapper;
+
+    @Autowired
+    private LocalBusPatientService patientService;
+
+    @Autowired
+    private HospitalManagerRegister hospitalManagerRegister;
+
+    @Autowired
+    private ClinicAutoFinishMonitorHandler clinicAutoFinishMonitorHandler;
+
+    @Autowired
+    private NoSignalHandler noSignalHandler;
+
+    @Autowired
+    private DeputyDeviceAutoUndoHandler deputyDeviceAutoUndoHandler;
+
+    /**
+     * 描述: 每天早上9点定时对医院的配置参数进行补偿处理
+     * @author lifang
+     * @date 2022/7/29 9:03
+     * @param
+     * @return void
+     */
+    @Scheduled(cron = "0 0 1 * * ?")
+    public void execute() {
+        List<BusHospitalEntity> hospitalList = hospitalMapper.selectList(new LambdaQueryWrapper<>());
+        for (BusHospitalEntity hospital : hospitalList) {
+            PatientMonitorQuery query = new PatientMonitorQuery();
+            query.setTenantId(hospital.getId());
+            List<PatientMonitorResult> patientMonitorResults = patientService.selectAll(query);
+            if (CollectionUtil.isEmpty(patientMonitorResults)) {
+                continue;
+            }
+            HospitalManager hospitalManager = hospitalManagerRegister.get(hospital.getId());
+            patientMonitorResults
+                    .forEach(infusionInfo -> {
+                        BusDeviceRunningEntity source = BeanUtil.toBean(infusionInfo, BusDeviceRunningEntity.class);
+                        source.setRunState(infusionInfo.getDeviceRunState());
+                        source.setAlarm(infusionInfo.getDeviceAlarm());
+                        source.setInfusionId(infusionInfo.getInfusionId());
+                        source.setUploadTime(infusionInfo.getLastUploadTime());
+                        source.setTenantId(hospital.getId());
+
+                        FunctionExtraConfig extraConfig = hospitalManager.getExtraConfigHandler().getConfig().as(FunctionExtraConfig.class);
+                        extraHandle(source,extraConfig);
+
+                        FunctionAutoUndoConfig autoUndoConfig = hospitalManager.getAutoUndoConfigHandler().getConfig().as(FunctionAutoUndoConfig.class);
+                        shutdownAutoUndo(source,autoUndoConfig);
+
+                        FunctionFinishMonitorConfig config =   hospitalManager.getFinishMonitorConfigHandler().getConfig().as(FunctionFinishMonitorConfig.class);
+                        shutDownAutoFinish(source,config);
+                        judgeNoSignalAutoFinish(source,config);
+                    });
+        }
+    }
+
+    private void extraHandle(BusDeviceRunningEntity source, FunctionExtraConfig extraConfig) {
+        if(ObjectUtil.isNull(extraConfig)){
+            return;
+        }
+        HospitalFunctionExtraConfigHandler.NoSignalEntity lastNoSignalWarn = HospitalFunctionExtraConfigHandler.NoSignalEntity.builder()
+                .deviceId(source.getDeviceId())
+                .patientId(source.getPatientId())
+                .tenantId(source.getTenantId())
+                .timestamp(new Date())
+                .historyId(source.getHistoryId())
+                .infusionId(source.getInfusionId())
+                .uploadTime(source.getUploadTime())
+                .build();
+        DelayMessage delayMessage = new DelayMessage(Value.simple(lastNoSignalWarn), HandlerConstant.NO_SIGNAL, DelayMessageProperties.of(TimeUnit.MINUTES, extraConfig.getNoSignal()));
+        noSignalHandler.handle(delayMessage);
+    }
+
+    private void shutdownAutoUndo(BusDeviceRunningEntity source, FunctionAutoUndoConfig config) {
+        if(ObjectUtil.isNull(config)){
+            return;
+        }
+        UndoDeviceConfig undoDeviceConfig = new UndoDeviceConfig();
+        undoDeviceConfig.setUndoBy(config.getUndoBy());
+        if (DeviceStatusEnum.Shutdown.equals(source.getRunState())) {
+            HospitalDeviceAutoUndoConfigHandler.UndoEntity undo = HospitalDeviceAutoUndoConfigHandler.UndoEntity.builder()
+                    .deviceId(source.getDeviceId())
+                    .patientId(source.getPatientId())
+                    .config(undoDeviceConfig)
+                    .clinicId(source.getClinicId())
+                    .infusionId(source.getInfusionId())
+                    .tenantId(source.getTenantId())
+                    .uploadTime(source.getUploadTime())
+                    .timestamp(new Date())
+                    .build();
+            DelayMessage lastShutDownDelayMessage = new DelayMessage(Value.simple(undo), HandlerConstant.DEVICE_AUTO_UNDO, DelayMessageProperties.of(TimeUnit.MINUTES, config.getShutDownInterval()));
+            deputyDeviceAutoUndoHandler.handle(lastShutDownDelayMessage);
+        }
+    }
+
+
+    private void shutDownAutoFinish(BusDeviceRunningEntity source,   FunctionFinishMonitorConfig config){
+        if(ObjectUtil.isNull(config)){
+            return;
+        }
+        UndoDeviceConfig undoDeviceConfig = new UndoDeviceConfig();
+        undoDeviceConfig.setUndoBy(config.getUndoBy());
+
+        if(DeviceStatusEnum.Shutdown.equals(source.getRunState())||Boolean.TRUE.equals(source.getFinished())){
+            HospitalFinishMonitorConfigHandler.FinishMonitorEntity body = HospitalFinishMonitorConfigHandler.FinishMonitorEntity.builder()
+                    .deviceId(source.getDeviceId())
+                    .patientId(source.getPatientId())
+                    .config(undoDeviceConfig)
+                    .uploadTime(source.getUploadTime())
+                    .infusionId(source.getInfusionId())
+                    .tenantId(source.getTenantId())
+                    .timestamp(new Date())
+                    .build();
+            DelayMessage lastShutDownFinish = new DelayMessage(Value.simple(body), HandlerConstant.CLINIC_AUTO_FINISH, DelayMessageProperties.of(TimeUnit.DAYS, config.getShutDownInterval()));
+            clinicAutoFinishMonitorHandler.handle(lastShutDownFinish);
+        }
+    }
+
+    private void judgeNoSignalAutoFinish(BusDeviceRunningEntity source,   FunctionFinishMonitorConfig config){
+        if(config==null||!Boolean.TRUE.equals(config.isEnable())|| Objects.isNull(config.getNoSignalInterval())){
+            return;
+        }
+        UndoDeviceConfig undoDeviceConfig = new UndoDeviceConfig();
+        undoDeviceConfig.setUndoBy(config.getUndoBy());
+        HospitalFinishMonitorConfigHandler.FinishMonitorEntity body = HospitalFinishMonitorConfigHandler.FinishMonitorEntity.builder()
+                .deviceId(source.getDeviceId())
+                .config(undoDeviceConfig)
+                .infusionId(source.getInfusionId())
+                .patientId(source.getPatientId())
+                .uploadTime(source.getUploadTime())
+                .tenantId(source.getTenantId())
+                .timestamp(new Date())
+                .build();
+        DelayMessage lastNoSignalFinish = new DelayMessage(Value.simple(body), HandlerConstant.CLINIC_AUTO_FINISH, DelayMessageProperties.of(TimeUnit.DAYS, config.getNoSignalInterval()));
+        clinicAutoFinishMonitorHandler.handle(lastNoSignalFinish);
+    }
+}