package com.coffee.bus.hospital; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.extra.spring.SpringUtil; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.coffee.bus.bean.Script; import com.coffee.bus.entity.*; import com.coffee.bus.hospital.config.*; import com.coffee.bus.hospital.config.bean.*; import com.coffee.bus.hospital.his.HisScriptSession; import com.coffee.bus.hospital.his.strategy.HisStrategyEnum; import com.coffee.bus.registry.device.DeviceRegistry; import com.coffee.bus.registry.patient.PatientRegistry; import com.coffee.bus.hospital.script.ScriptManager; import com.coffee.bus.hospital.script.ScriptParse; import com.coffee.bus.service.*; import com.coffee.bus.service.constant.LocalBusConMixService; import com.coffee.bus.utils.WsPublishUtils; import com.coffee.bus.websocket.HisConnectionHandler; import com.coffee.common.cache.ConfigStorage; import com.coffee.common.cache.manager.ConfigStorageManager; import com.coffee.common.util.RedissonUtil; import com.fasterxml.jackson.databind.ObjectMapper; import io.netty.util.concurrent.DefaultEventExecutor; import io.netty.util.concurrent.SingleThreadEventExecutor; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.PageRequest; import java.util.*; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; /** * @author lifang * @version 1.0.0 * @ClassName HospitalManage.java * @Description 医院管理器 * @createTime 2022年05月20日 08:33:00 */ @Data @Slf4j public class HospitalManager { private String hospitalId; private HisScriptSession scriptSession; private HospitalAutoUndoConfigHandler autoUndoConfigHandler; private HospitalFinishMonitorConfigHandler finishMonitorConfigHandler; private HospitalFunctionAnalConfigHandler analConfigHandler; private HospitalFunctionExtraConfigHandler extraConfigHandler; private HospitalPatientCodeHandler codeHandler; private LocalBusHospitalConfigService hospitalConfigService; private ScriptManager scriptManager; private ConfigStorage storage; private HisUpdateEntity updateConfig; private ScheduledExecutorService singleThreadEventExecutor= Executors.newSingleThreadScheduledExecutor(); private ScheduledFuture schedule=null; private LocalBusHospitalService hospitalService; private LocalBusPatientService patientService; private LocalBusInfusionHistoryService infusionHistoryService; public HospitalManager(String hospitalId, DeviceRegistry deviceRegistry, WsPublishUtils wsPublishUtils, ScriptManager scriptManager, ConfigStorageManager configStorageManager, RedissonUtil redissonUtil) { this.hospitalId = hospitalId; this.hospitalService= SpringUtil.getBean(LocalBusHospitalService.class); this.hospitalConfigService = SpringUtil.getBean(LocalBusHospitalConfigService.class); this.scriptManager = scriptManager; this.storage=configStorageManager.getStorage(hospitalId); this.autoUndoConfigHandler=new HospitalAutoUndoConfigHandler(storage,hospitalId,redissonUtil,SpringUtil.getBean(LocalBusInfusionHistoryService.class),deviceRegistry,wsPublishUtils,SpringUtil.getBean(LocalBusPatientService.class)); this.finishMonitorConfigHandler=new HospitalFinishMonitorConfigHandler(storage,hospitalId,redissonUtil,SpringUtil.getBean(LocalBusInfusionHistoryService.class),deviceRegistry,wsPublishUtils,SpringUtil.getBean(LocalBusPatientService.class)); this.analConfigHandler=new HospitalFunctionAnalConfigHandler(storage,hospitalId,redissonUtil,SpringUtil.getBean(LocalBusInfusionHistoryService.class),deviceRegistry,wsPublishUtils,SpringUtil.getBean(LocalBusDeviceAlarmService.class)); this.extraConfigHandler=new HospitalFunctionExtraConfigHandler(storage,hospitalId,redissonUtil,SpringUtil.getBean(LocalBusInfusionHistoryService.class),deviceRegistry,wsPublishUtils,finishMonitorConfigHandler,autoUndoConfigHandler,SpringUtil.getBean(LocalBusDeviceAlarmService.class),SpringUtil.getBean(LocalBusPatientService.class)); this.codeHandler=new HospitalPatientCodeHandler(storage,hospitalId,redissonUtil,SpringUtil.getBean(LocalBusInfusionHistoryService.class),deviceRegistry,wsPublishUtils); this.infusionHistoryService=SpringUtil.getBean(LocalBusInfusionHistoryService.class); init(configStorageManager); } private void init(ConfigStorageManager configStorageManager){ this.scriptSession=new HisScriptSession(hospitalId,scriptManager,configStorageManager); refreshInfo(); refreshConfig(); refreshScript(); } /** * 描述: 刷新医院信息 * @author lifang * @date 2022/5/20 8:47 * @param * @return void */ public void refreshInfo(){ BusHospitalEntity hospital = hospitalService.getById(hospitalId); log.info("医院【{}】,刷新信息,info【{}】,strategy【{}】",hospitalId,hospital,hospital.getStrategy()); storage.setConfig("info",hospital); storage.setConfig("strategy",hospital.getStrategy()); } public HisStrategyEnum getStrategy(){ return storage.getConfig("strategy").as(HisStrategyEnum.class); } public BusHospitalEntity getInfo(){ return storage.getConfig("info").as(BusHospitalEntity.class); } /** * 描述: 刷新配置 * @author lifang * @date 2022/5/20 8:47 * @param * @return void */ public void refreshConfig(){ List hospitalConfig = hospitalConfigService.list(new QueryWrapper().lambda().eq(BusHospitalConfigEntity::getTenantId, hospitalId)); //设置默认参数 for (BusHospitalConfigEntity config : hospitalConfig) { Map param = config.getConfig(); switch (config.getType()) { case undo: FunctionUndoConfig functionUndoConfig = JSONUtil.toBean(JSONUtil.toJsonStr(param), FunctionUndoConfig.class); //自动撤泵 FunctionAutoUndoConfig autoUndo = functionUndoConfig.getAuto(); autoUndoConfigHandler.setConfig(autoUndo); //自动结束临床管理 FunctionFinishMonitorConfig finishMonitor = functionUndoConfig.getFinishMonitor(); finishMonitorConfigHandler.setConfig(finishMonitor); break; case other: FunctionOtherConfig otherConfig = JSONUtil.toBean(JSONUtil.toJsonStr(param), FunctionOtherConfig.class); //镇痛不足 FunctionAnalConfig anal = otherConfig.getAnal(); analConfigHandler.setConfig(anal); //其他 FunctionExtraConfig extraConfig = otherConfig.getOther(); extraConfigHandler.setConfig(extraConfig); break; case patientCode: FunctionPatientCodeConfig codeConfig = JSONUtil.toBean(JSONUtil.toJsonStr(param), FunctionPatientCodeConfig.class); codeHandler.setConfig(codeConfig); break; default:break; } } } /** * 描述: 对设备发来消息进行处理 * @author lifang * @date 2022/5/20 8:50 * @param source * @return void */ public void handleDeviceMessage(BusDeviceRunningEntity source){ analConfigHandler.handler(source); extraConfigHandler.handler(source); autoUndoConfigHandler.handler(source); finishMonitorConfigHandler.handler(source); } public void formatPatientCode(BusDeviceRunningEntity source){ codeHandler.handler(source); } public void refreshScript(){ BusHospitalEntity hospital = hospitalService.getById(hospitalId); Script script=Optional.ofNullable(hospital.getScript()).orElse(new Script()); scriptManager.resetScript(hospitalId,StrUtil.isNotEmpty(script.getContent())?"python":"default",script.getContent()); } /** * 描述: 刷新his数据更新配置 * @author lifang * @date 2022/6/18 15:24 * @param updateConfig * @return void */ public void refreshUpdateConfig(HisUpdateEntity updateConfig){ if(Objects.equals(updateConfig,this.updateConfig) ||updateConfig==null ||!Boolean.TRUE.equals(updateConfig.getEnable()) ||null==updateConfig.getInterval() ||updateConfig.getInterval()<0){ if(schedule!=null&&!schedule.isCancelled()){ //如果有定时任务正在运行,则关闭 schedule.cancel(true); } return; } schedule = singleThreadEventExecutor.schedule(() -> { scheduleHis(); singleThreadEventExecutor.schedule(this::scheduleHis, updateConfig.getInterval(), TimeUnit.MINUTES); }, updateConfig.getInterval(), TimeUnit.MINUTES); } /** * 描述: 定时从his拉取数据 * @author lifang * @date 2022/6/18 15:20 * @param * @return void */ private void scheduleHis(){ //拉取最新的50条输注信息,更新病人数据 Page infusionHistoryPage = new Page<>(0,50,false); infusionHistoryPage= infusionHistoryService.page(infusionHistoryPage, new QueryWrapper().lambda().eq(BusInfusionHistoryEntity::getTenantId, hospitalId) .eq(BusInfusionHistoryEntity::getFinished,false) .orderByDesc(BusInfusionHistoryEntity::getLastUploadTime)); List records = infusionHistoryPage.getRecords(); if(CollUtil.isNotEmpty(records)){ records.stream().map(BusInfusionHistoryEntity::getPatientCode).collect(Collectors.toSet()) .parallelStream() .forEach(patientCode->{ this.getScriptSession() .asyncGetPatientInfo(patientCode,10,TimeUnit.SECONDS,false); }); } } }