HospitalManager.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. package com.coffee.bus.hospital;
  2. import cn.hutool.core.collection.CollUtil;
  3. import cn.hutool.core.util.ObjectUtil;
  4. import cn.hutool.core.util.StrUtil;
  5. import cn.hutool.extra.spring.SpringUtil;
  6. import cn.hutool.json.JSONUtil;
  7. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  8. import com.baomidou.mybatisplus.core.metadata.IPage;
  9. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  10. import com.coffee.bus.bean.Script;
  11. import com.coffee.bus.entity.*;
  12. import com.coffee.bus.hospital.config.*;
  13. import com.coffee.bus.hospital.config.bean.*;
  14. import com.coffee.bus.hospital.his.HisScriptSession;
  15. import com.coffee.bus.hospital.his.strategy.HisStrategyEnum;
  16. import com.coffee.bus.registry.device.DeviceRegistry;
  17. import com.coffee.bus.registry.patient.PatientRegistry;
  18. import com.coffee.bus.hospital.script.ScriptManager;
  19. import com.coffee.bus.hospital.script.ScriptParse;
  20. import com.coffee.bus.service.*;
  21. import com.coffee.bus.service.constant.LocalBusConMixService;
  22. import com.coffee.bus.utils.WsPublishUtils;
  23. import com.coffee.bus.websocket.HisConnectionHandler;
  24. import com.coffee.common.cache.ConfigStorage;
  25. import com.coffee.common.cache.manager.ConfigStorageManager;
  26. import com.coffee.common.util.RedissonUtil;
  27. import com.fasterxml.jackson.databind.ObjectMapper;
  28. import io.netty.util.concurrent.DefaultEventExecutor;
  29. import io.netty.util.concurrent.SingleThreadEventExecutor;
  30. import lombok.Data;
  31. import lombok.extern.slf4j.Slf4j;
  32. import org.springframework.data.domain.PageRequest;
  33. import java.util.*;
  34. import java.util.concurrent.Executors;
  35. import java.util.concurrent.ScheduledExecutorService;
  36. import java.util.concurrent.ScheduledFuture;
  37. import java.util.concurrent.TimeUnit;
  38. import java.util.stream.Collectors;
  39. /**
  40. * @author lifang
  41. * @version 1.0.0
  42. * @ClassName HospitalManage.java
  43. * @Description 医院管理器
  44. * @createTime 2022年05月20日 08:33:00
  45. */
  46. @Data
  47. @Slf4j
  48. public class HospitalManager {
  49. private String hospitalId;
  50. private HisScriptSession scriptSession;
  51. private HospitalAutoUndoConfigHandler autoUndoConfigHandler;
  52. private HospitalFinishMonitorConfigHandler finishMonitorConfigHandler;
  53. private HospitalFunctionAnalConfigHandler analConfigHandler;
  54. private HospitalFunctionExtraConfigHandler extraConfigHandler;
  55. private HospitalPatientCodeHandler codeHandler;
  56. private LocalBusHospitalConfigService hospitalConfigService;
  57. private ScriptManager scriptManager;
  58. private ConfigStorage storage;
  59. private HisUpdateEntity updateConfig;
  60. private ScheduledExecutorService singleThreadEventExecutor= Executors.newSingleThreadScheduledExecutor();
  61. private ScheduledFuture<?> schedule=null;
  62. private LocalBusHospitalService hospitalService;
  63. private LocalBusPatientService patientService;
  64. private LocalBusInfusionHistoryService infusionHistoryService;
  65. public HospitalManager(String hospitalId,
  66. DeviceRegistry deviceRegistry,
  67. WsPublishUtils wsPublishUtils,
  68. ScriptManager scriptManager,
  69. ConfigStorageManager configStorageManager,
  70. RedissonUtil redissonUtil) {
  71. this.hospitalId = hospitalId;
  72. this.hospitalService= SpringUtil.getBean(LocalBusHospitalService.class);
  73. this.hospitalConfigService = SpringUtil.getBean(LocalBusHospitalConfigService.class);
  74. this.scriptManager = scriptManager;
  75. this.storage=configStorageManager.getStorage(hospitalId);
  76. this.autoUndoConfigHandler=new HospitalAutoUndoConfigHandler(storage,hospitalId,redissonUtil,SpringUtil.getBean(LocalBusInfusionHistoryService.class),deviceRegistry,wsPublishUtils,SpringUtil.getBean(LocalBusPatientService.class));
  77. this.finishMonitorConfigHandler=new HospitalFinishMonitorConfigHandler(storage,hospitalId,redissonUtil,SpringUtil.getBean(LocalBusInfusionHistoryService.class),deviceRegistry,wsPublishUtils,SpringUtil.getBean(LocalBusPatientService.class));
  78. this.analConfigHandler=new HospitalFunctionAnalConfigHandler(storage,hospitalId,redissonUtil,SpringUtil.getBean(LocalBusInfusionHistoryService.class),deviceRegistry,wsPublishUtils,SpringUtil.getBean(LocalBusDeviceAlarmService.class));
  79. this.extraConfigHandler=new HospitalFunctionExtraConfigHandler(storage,hospitalId,redissonUtil,SpringUtil.getBean(LocalBusInfusionHistoryService.class),deviceRegistry,wsPublishUtils,finishMonitorConfigHandler,autoUndoConfigHandler,SpringUtil.getBean(LocalBusDeviceAlarmService.class),SpringUtil.getBean(LocalBusPatientService.class));
  80. this.codeHandler=new HospitalPatientCodeHandler(storage,hospitalId,redissonUtil,SpringUtil.getBean(LocalBusInfusionHistoryService.class),deviceRegistry,wsPublishUtils);
  81. this.infusionHistoryService=SpringUtil.getBean(LocalBusInfusionHistoryService.class);
  82. init(configStorageManager);
  83. }
  84. private void init(ConfigStorageManager configStorageManager){
  85. this.scriptSession=new HisScriptSession(hospitalId,scriptManager,configStorageManager);
  86. refreshInfo();
  87. refreshConfig();
  88. refreshScript();
  89. }
  90. /**
  91. * 描述: 刷新医院信息
  92. * @author lifang
  93. * @date 2022/5/20 8:47
  94. * @param
  95. * @return void
  96. */
  97. public void refreshInfo(){
  98. BusHospitalEntity hospital = hospitalService.getById(hospitalId);
  99. log.info("医院【{}】,刷新信息,info【{}】,strategy【{}】",hospitalId,hospital,hospital.getStrategy());
  100. storage.setConfig("info",hospital);
  101. storage.setConfig("strategy",hospital.getStrategy());
  102. }
  103. public HisStrategyEnum getStrategy(){
  104. return storage.getConfig("strategy").as(HisStrategyEnum.class);
  105. }
  106. public BusHospitalEntity getInfo(){
  107. return storage.getConfig("info").as(BusHospitalEntity.class);
  108. }
  109. /**
  110. * 描述: 刷新配置
  111. * @author lifang
  112. * @date 2022/5/20 8:47
  113. * @param
  114. * @return void
  115. */
  116. public void refreshConfig(){
  117. List<BusHospitalConfigEntity> hospitalConfig = hospitalConfigService.list(new QueryWrapper<BusHospitalConfigEntity>().lambda().eq(BusHospitalConfigEntity::getTenantId, hospitalId));
  118. //设置默认参数
  119. for (BusHospitalConfigEntity config : hospitalConfig) {
  120. Map<String, Object> param = config.getConfig();
  121. switch (config.getType()) {
  122. case undo:
  123. FunctionUndoConfig functionUndoConfig = JSONUtil.toBean(JSONUtil.toJsonStr(param), FunctionUndoConfig.class);
  124. //自动撤泵
  125. FunctionAutoUndoConfig autoUndo = functionUndoConfig.getAuto();
  126. autoUndoConfigHandler.setConfig(autoUndo);
  127. //自动结束临床管理
  128. FunctionFinishMonitorConfig finishMonitor = functionUndoConfig.getFinishMonitor();
  129. finishMonitorConfigHandler.setConfig(finishMonitor);
  130. break;
  131. case other:
  132. FunctionOtherConfig otherConfig = JSONUtil.toBean(JSONUtil.toJsonStr(param), FunctionOtherConfig.class);
  133. //镇痛不足
  134. FunctionAnalConfig anal = otherConfig.getAnal();
  135. analConfigHandler.setConfig(anal);
  136. //其他
  137. FunctionExtraConfig extraConfig = otherConfig.getOther();
  138. extraConfigHandler.setConfig(extraConfig);
  139. break;
  140. case patientCode:
  141. FunctionPatientCodeConfig codeConfig = JSONUtil.toBean(JSONUtil.toJsonStr(param), FunctionPatientCodeConfig.class);
  142. codeHandler.setConfig(codeConfig);
  143. break;
  144. default:break;
  145. }
  146. }
  147. }
  148. /**
  149. * 描述: 对设备发来消息进行处理
  150. * @author lifang
  151. * @date 2022/5/20 8:50
  152. * @param source
  153. * @return void
  154. */
  155. public void handleDeviceMessage(BusDeviceRunningEntity source){
  156. analConfigHandler.handler(source);
  157. extraConfigHandler.handler(source);
  158. autoUndoConfigHandler.handler(source);
  159. finishMonitorConfigHandler.handler(source);
  160. }
  161. public void formatPatientCode(BusDeviceRunningEntity source){
  162. codeHandler.handler(source);
  163. }
  164. public void refreshScript(){
  165. BusHospitalEntity hospital = hospitalService.getById(hospitalId);
  166. Script script=Optional.ofNullable(hospital.getScript()).orElse(new Script());
  167. scriptManager.resetScript(hospitalId,StrUtil.isNotEmpty(script.getContent())?"python":"default",script.getContent());
  168. }
  169. /**
  170. * 描述: 刷新his数据更新配置
  171. * @author lifang
  172. * @date 2022/6/18 15:24
  173. * @param updateConfig
  174. * @return void
  175. */
  176. public void refreshUpdateConfig(HisUpdateEntity updateConfig){
  177. if(Objects.equals(updateConfig,this.updateConfig)
  178. ||updateConfig==null
  179. ||!Boolean.TRUE.equals(updateConfig.getEnable())
  180. ||null==updateConfig.getInterval()
  181. ||updateConfig.getInterval()<0){
  182. if(schedule!=null&&!schedule.isCancelled()){
  183. //如果有定时任务正在运行,则关闭
  184. schedule.cancel(true);
  185. }
  186. return;
  187. }
  188. schedule = singleThreadEventExecutor.schedule(() -> {
  189. scheduleHis();
  190. singleThreadEventExecutor.schedule(this::scheduleHis, updateConfig.getInterval(), TimeUnit.MINUTES);
  191. }, updateConfig.getInterval(), TimeUnit.MINUTES);
  192. }
  193. /**
  194. * 描述: 定时从his拉取数据
  195. * @author lifang
  196. * @date 2022/6/18 15:20
  197. * @param
  198. * @return void
  199. */
  200. private void scheduleHis(){
  201. //拉取最新的50条输注信息,更新病人数据
  202. Page<BusInfusionHistoryEntity> infusionHistoryPage = new Page<>(0,50,false);
  203. infusionHistoryPage= infusionHistoryService.page(infusionHistoryPage, new QueryWrapper<BusInfusionHistoryEntity>().lambda().eq(BusInfusionHistoryEntity::getTenantId, hospitalId)
  204. .eq(BusInfusionHistoryEntity::getFinished,false)
  205. .orderByDesc(BusInfusionHistoryEntity::getLastUploadTime));
  206. List<BusInfusionHistoryEntity> records = infusionHistoryPage.getRecords();
  207. if(CollUtil.isNotEmpty(records)){
  208. records.stream().map(BusInfusionHistoryEntity::getPatientCode).collect(Collectors.toSet())
  209. .parallelStream()
  210. .forEach(patientCode->{
  211. this.getScriptSession()
  212. .asyncGetPatientInfo(patientCode,10,TimeUnit.SECONDS,false);
  213. });
  214. }
  215. }
  216. }