| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247 |
- 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<BusHospitalConfigEntity> hospitalConfig = hospitalConfigService.list(new QueryWrapper<BusHospitalConfigEntity>().lambda().eq(BusHospitalConfigEntity::getTenantId, hospitalId));
- //设置默认参数
- for (BusHospitalConfigEntity config : hospitalConfig) {
- Map<String, Object> 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<BusInfusionHistoryEntity> infusionHistoryPage = new Page<>(0,50,false);
- infusionHistoryPage= infusionHistoryService.page(infusionHistoryPage, new QueryWrapper<BusInfusionHistoryEntity>().lambda().eq(BusInfusionHistoryEntity::getTenantId, hospitalId)
- .eq(BusInfusionHistoryEntity::getFinished,false)
- .orderByDesc(BusInfusionHistoryEntity::getLastUploadTime));
- List<BusInfusionHistoryEntity> 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);
- });
- }
- }
- }
|