LocalBusClinicService.java 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. package com.coffee.bus.service;
  2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  3. import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
  4. import com.baomidou.mybatisplus.core.metadata.IPage;
  5. import com.coffee.bus.controller.vo.ClinicStatsVo;
  6. import com.coffee.bus.entity.BusClinicEntity;
  7. import com.coffee.bus.entity.BusDeviceRunningEntity;
  8. import com.coffee.bus.entity.BusInfusionHistoryEntity;
  9. import com.coffee.bus.entity.BusPatientEntity;
  10. import com.coffee.bus.mapper.BusClinicMapper;
  11. import com.coffee.bus.registry.patient.PatientOperator;
  12. import com.coffee.bus.registry.patient.PatientRegistry;
  13. import com.coffee.bus.registry.patient.bean.PatientCacheInfo;
  14. import com.coffee.bus.service.dto.ClinicQuery;
  15. import com.coffee.bus.service.dto.ClinicResult;
  16. import com.coffee.bus.service.dto.ClinicStatsReturnResult;
  17. import com.coffee.bus.utils.WsPublishUtils;
  18. import com.coffee.common.crud.BaseService;
  19. import lombok.extern.slf4j.Slf4j;
  20. import org.springframework.beans.factory.annotation.Autowired;
  21. import org.springframework.context.annotation.Lazy;
  22. import org.springframework.scheduling.annotation.Async;
  23. import org.springframework.stereotype.Service;
  24. import org.springframework.transaction.annotation.Transactional;
  25. import org.springframework.util.Assert;
  26. import java.util.*;
  27. /**
  28. * @author lifang
  29. * @version 1.0.0
  30. * @ClassName LocalBusHospitalService.java
  31. * @Description TODO
  32. * @createTime 2022年03月19日 09:27:00
  33. */
  34. @Service
  35. @Slf4j
  36. public class LocalBusClinicService extends BaseService<BusClinicMapper, BusClinicEntity,String> {
  37. @Autowired
  38. @Lazy
  39. private PatientRegistry patientRegistry;
  40. @Autowired
  41. @Lazy
  42. private LocalBusInfusionHistoryService infusionHistoryService;
  43. @Autowired
  44. @Lazy
  45. private LocalBusDeviceRunningService deviceRunningService;
  46. @Autowired
  47. @Lazy
  48. private LocalBusPatientService patientService;
  49. @Autowired
  50. @Lazy
  51. private WsPublishUtils wsPublishUtils;
  52. @Override
  53. public void validateBeforeSave(BusClinicEntity entity) {
  54. if(entity.getMonitorStartTime()==null){
  55. entity.setMonitorStartTime(new Date());
  56. }
  57. if(entity.getStartTime()==null){
  58. entity.setStartTime(entity.getMonitorStartTime());
  59. }
  60. }
  61. @Override
  62. public void validateBeforeUpdate(BusClinicEntity entity) {
  63. }
  64. @Override
  65. public void validateBeforeDelete(String id) {
  66. }
  67. @Override
  68. public boolean save(BusClinicEntity entity) {
  69. return super.save(entity);
  70. }
  71. /**
  72. * 结束当前医院病号的临床数据
  73. * @param clinicId 临床id
  74. */
  75. @Transactional(rollbackFor = Exception.class)
  76. public void finish(String clinicId, String tenantId) {
  77. this.finish(Collections.singletonList(clinicId),new Date(),tenantId);
  78. }
  79. /**
  80. * 结束当前医院病号的临床数据
  81. * @param clinicIds 临床id
  82. * @param finishTime 临床结束时间
  83. */
  84. @Transactional(rollbackFor = Exception.class)
  85. public void finish(List<String> clinicIds,Date finishTime, String tenantId) {
  86. this.update(new UpdateWrapper<BusClinicEntity>().lambda()
  87. .in(BusClinicEntity::getId,clinicIds)
  88. .set(BusClinicEntity::getFinished,true)
  89. .set(BusClinicEntity::getEndTime,finishTime));
  90. //更新病人缓存
  91. this.listByIds(clinicIds).stream()
  92. .map(BusClinicEntity::getPatientCode)
  93. .map(code->patientRegistry.getOperator(tenantId,code))
  94. .forEach(operator->operator.setFinished(true));
  95. wsPublishUtils.publishMonitorTotalCount(tenantId);
  96. }
  97. /**
  98. * 找到该病号最近的一场手术
  99. * @param hospitalId
  100. * @param patientCode
  101. */
  102. public BusClinicEntity recentClinicByPatientCode(String hospitalId, String patientCode) {
  103. return this.baseMapper.recentClinic(hospitalId,patientCode);
  104. }
  105. /**
  106. * 描述: 对两场手术进行比较,判断名称、时间是否发生了变化
  107. * @author lifang
  108. * @date 2022/5/12 9:10
  109. * @param source his系统拉取的数据
  110. * @param target 数据库存储的数据
  111. * @return void
  112. */
  113. @Transactional(rollbackFor = Exception.class)
  114. public void compareFromHis(BusClinicEntity source,BusClinicEntity target){
  115. Assert.hasText(target.getId(),"LocalBusClinicService.compareFromHis方法调用时,target参数id不能为空");
  116. Assert.hasText(source.getPatientCode(),"LocalBusClinicService.compareFromHis方法调用时,source参数patientCode不能为空");
  117. Assert.notNull(source.getStartTime(),"LocalBusClinicService.compareFromHis方法调用时,source参数startTime不能为空");
  118. Assert.hasText(source.getSurgeryName(),"LocalBusClinicService.compareFromHis方法调用时,source参数surgeName不能为空");
  119. source.setId(target.getId());
  120. source.setFinished(target.getFinished());
  121. this.updateById(source);
  122. //手术开始时间发生变化,重新计算输注数据
  123. if(source.getStartTime()!=null&&source.getStartTime()!=target.getStartTime()){
  124. infusionHistoryService.adjustInfusionByClinic(source.getId(),source.getPatientCode(),source.getTenantId(),source.getStartTime());
  125. }
  126. }
  127. /**
  128. * 描述: his拉取的新的手术信息,执行插入操作
  129. * @author lifang
  130. * @date 2022/5/12 10:27
  131. * @param source
  132. * @return void
  133. */
  134. @Transactional(rollbackFor = Exception.class)
  135. public void insertFromHis(BusClinicEntity source){
  136. Assert.hasText(source.getTenantId(),"LocalBusClinicService.insertFromHis方法调用时,source参数tenantId不能为空");
  137. Assert.hasText(source.getPatientCode(),"LocalBusClinicService.insertFromHis方法调用时,source参数patientCode不能为空");
  138. Assert.hasText(source.getSurgeryName(),"LocalBusClinicService.insertFromHis方法调用时,source参数surgeName不能为空");
  139. this.save(source);
  140. infusionHistoryService.adjustInfusionByClinic(source.getId(),source.getPatientCode(),source.getTenantId(),source.getStartTime());
  141. }
  142. /**
  143. * 描述: 从his拉去的数据设置为当前临床信息
  144. * @author lifang
  145. * @date 2022/5/12 10:31
  146. * @param source
  147. * @return void
  148. */
  149. @Transactional(rollbackFor = Exception.class)
  150. public void setCurrentClinicByHis(BusClinicEntity source){
  151. Assert.hasText(source.getId(),"LocalBusClinicService.setCurrentClinic方法调用时,source参数id不能为空");
  152. Assert.hasText(source.getPatientCode(),"LocalBusClinicService.setCurrentClinic方法调用时,source参数patientCode不能为空");
  153. Assert.hasText(source.getTenantId(),"LocalBusClinicService.setCurrentClinic方法调用时,source参数tenantId不能为空");
  154. Assert.notNull(source.getStartTime(),"LocalBusClinicService.setCurrentClinic方法调用时,source参数startTime不能为空");
  155. //处理当前运行的信息
  156. deviceRunningService.update(new UpdateWrapper<BusDeviceRunningEntity>().lambda()
  157. .eq(BusDeviceRunningEntity::getPatientCode,source.getPatientCode())
  158. .eq(BusDeviceRunningEntity::getTenantId,source.getTenantId())
  159. .set(BusDeviceRunningEntity::getClinicId,source.getId()));
  160. //处理当前的输注信息
  161. infusionHistoryService.update(new UpdateWrapper<BusInfusionHistoryEntity>().lambda()
  162. .eq(BusInfusionHistoryEntity::getPatientCode,source.getPatientCode())
  163. .eq(BusInfusionHistoryEntity::getTenantId,source.getTenantId())
  164. .eq(BusInfusionHistoryEntity::getFinished,false)
  165. .set(BusInfusionHistoryEntity::getClinicId,source.getId()));
  166. //更新病人信息
  167. patientService.update(new UpdateWrapper<BusPatientEntity>().lambda()
  168. .eq(BusPatientEntity::getCode,source.getPatientCode())
  169. .eq(BusPatientEntity::getTenantId,source.getTenantId())
  170. .set(BusPatientEntity::getClinicId,source.getId()));
  171. //处理
  172. List<BusClinicEntity> clinics = this.list(new QueryWrapper<BusClinicEntity>().lambda()
  173. .eq(BusClinicEntity::getPatientCode, source.getPatientCode())
  174. .eq(BusClinicEntity::getTenantId, source.getTenantId())
  175. .eq(BusClinicEntity::getFinished, false)
  176. .ne(BusClinicEntity::getId, source.getId()));
  177. //将下一场手术的开始时间作为该场手术监控的结束时间
  178. clinics.sort(Comparator.comparing(BusClinicEntity::getStartTime));
  179. for (int i = 0; i < clinics.size(); i++) {
  180. BusClinicEntity clinic = clinics.get(i);
  181. clinic.setFinished(true);
  182. if(i==clinics.size()-1){
  183. if(clinic.getEndTime()==null){
  184. clinic.setEndTime(source.getEndTime());
  185. }
  186. continue;
  187. }
  188. if(clinic.getEndTime()==null){
  189. clinic.setEndTime(clinics.get(i+1).getStartTime());
  190. }
  191. }
  192. this.updateBatchById(clinics);
  193. PatientOperator<PatientCacheInfo> operator = patientRegistry.getOperator(source.getTenantId(), source.getPatientCode());
  194. operator.setClinicId(source.getId());
  195. wsPublishUtils.publishPatientMonitor(source.getPatientCode(),source.getTenantId());
  196. }
  197. /**
  198. * 从his同步病人数据-异步
  199. * @param hospitalId
  200. * @param patientCode
  201. */
  202. @Async
  203. public void asyncFromHis(String hospitalId, String patientCode) {
  204. }
  205. public ClinicStatsReturnResult stats(ClinicStatsVo statsVo) {
  206. return ClinicStatsReturnResult.of(this.baseMapper.stats(statsVo));
  207. }
  208. public IPage<ClinicResult> pageQuery(ClinicQuery query){
  209. return this.baseMapper.pageQuery(query.getPage(),query);
  210. }
  211. }