瀏覽代碼

add 从his拉取数据时自动添加常量信息

A17404李放 3 年之前
父節點
當前提交
c424cc8060
共有 20 個文件被更改,包括 239 次插入80 次删除
  1. 4 3
      coffee-common/src/main/java/com/coffee/common/config/CachingContentFilter.java
  2. 4 2
      coffee-common/src/main/java/com/coffee/common/config/CorsConfig.java
  3. 0 3
      coffee-common/src/main/java/com/coffee/common/crud/controller/BaseDeleteController.java
  4. 3 1
      coffee-framework/src/main/java/com/coffee/framework/web/service/impl/UserServiceImpl.java
  5. 50 36
      coffee-system/src/main/java/com/coffee/bus/controller/BusClinicController.java
  6. 7 1
      coffee-system/src/main/java/com/coffee/bus/controller/BusHospitalController.java
  7. 14 1
      coffee-system/src/main/java/com/coffee/bus/controller/BusPatientController.java
  8. 4 1
      coffee-system/src/main/java/com/coffee/bus/entity/BusHospitalEntity.java
  9. 33 0
      coffee-system/src/main/java/com/coffee/bus/entity/HisUpdateEntity.java
  10. 73 7
      coffee-system/src/main/java/com/coffee/bus/hospital/HospitalManager.java
  11. 1 1
      coffee-system/src/main/java/com/coffee/bus/mapper/BusClinicMapper.java
  12. 14 2
      coffee-system/src/main/java/com/coffee/bus/service/LocalBusDocService.java
  13. 9 0
      coffee-system/src/main/java/com/coffee/bus/service/LocalBusHospitalService.java
  14. 6 3
      coffee-system/src/main/java/com/coffee/bus/service/LocalBusPatientService.java
  15. 3 0
      coffee-system/src/main/java/com/coffee/bus/service/dto/PatientMonitorQuery.java
  16. 3 0
      coffee-system/src/main/java/com/coffee/system/common/dto/SysMenuAddDTO.java
  17. 2 15
      coffee-system/src/main/java/com/coffee/system/entity/SysLog.java
  18. 4 0
      coffee-system/src/main/java/com/coffee/system/entity/SysMenu.java
  19. 1 3
      coffee-system/src/main/resources/mapper/bus/BusClinicMapper.xml
  20. 4 1
      coffee-system/src/main/resources/mapper/bus/BusPatientMapper.xml

+ 4 - 3
coffee-common/src/main/java/com/coffee/common/config/CachingContentFilter.java

@@ -5,6 +5,7 @@ import lombok.extern.slf4j.Slf4j;
 import javax.servlet.*;
 import javax.servlet.annotation.WebFilter;
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 
 /**
@@ -23,11 +24,11 @@ public class CachingContentFilter implements Filter {
     }
 
     @Override
-    public void doFilter(ServletRequest request, ServletResponse response,
+    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
                          FilterChain chain) throws IOException, ServletException {
 
-        HttpServletRequest requestWrapper = new CacheHttpServletRequestWrapper((HttpServletRequest) request);
-        chain.doFilter(requestWrapper, response);
+        HttpServletRequest requestWrapper = new CacheHttpServletRequestWrapper((HttpServletRequest) servletRequest);
+        chain.doFilter(requestWrapper, servletResponse);
 
     }
 

+ 4 - 2
coffee-common/src/main/java/com/coffee/common/config/CorsConfig.java

@@ -1,6 +1,7 @@
 package com.coffee.common.config;
 
 import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
 import org.springframework.web.servlet.config.annotation.CorsRegistry;
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
@@ -12,6 +13,7 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
  * @createTime 2022年03月23日 14:49:00
  */
 @Configuration
+@Profile("dev")
 public class CorsConfig implements WebMvcConfigurer {
     @Override
     public void addCorsMappings(CorsRegistry registry) {
@@ -23,8 +25,8 @@ public class CorsConfig implements WebMvcConfigurer {
                 .allowedOriginPatterns("*")
                 .allowedOrigins("*")
                 //放行哪些请求方式
-                .allowedMethods(new String[]{"GET", "POST", "PUT"})
-//                .allowedMethods("*") //或者放行全部
+//                .allowedMethods(new String[]{"GET", "POST", "PUT"})
+                .allowedMethods("*") //或者放行全部
                 //放行哪些原始请求头部信息
                 .allowedHeaders("*")
                 //暴露哪些原始请求头部信息

+ 0 - 3
coffee-common/src/main/java/com/coffee/common/crud/controller/BaseDeleteController.java

@@ -48,9 +48,6 @@ public interface BaseDeleteController<E, K extends Serializable> extends BaseCur
      **/
 
     @PostMapping("/delete/_batch")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "deviceIds",value = "主键id集合",required = true)
-    })
     @ApiOperation(value = "根据ID删除")
     default R delete(@RequestBody List<String> ids) {
         deleteAuth();

+ 3 - 1
coffee-framework/src/main/java/com/coffee/framework/web/service/impl/UserServiceImpl.java

@@ -206,11 +206,13 @@ public class UserServiceImpl implements IUserService {
     @Override
     public List<RouteItemVO> getMenuList() {
         List<SysMenu> sysMenuList;
-        SysUserBO sysUserBO = SecurityUtil.getLoginUser().getSysUser();
+        LoginUser loginUser = SecurityUtil.getLoginUser();
+        SysUserBO sysUserBO = loginUser.getSysUser();
         if (SecurityUtil.isSuperAdmin()) {
             LambdaQueryWrapper<SysMenu> queryWrapper = Wrappers.lambdaQuery();
             queryWrapper.eq(SysMenu::getStatus, StatusEnum.YES.getCode());
             queryWrapper.in(SysMenu::getMenuType, MenuTypeEnum.DIR.getCode(), MenuTypeEnum.MENU.getCode());
+            queryWrapper.eq(!Boolean.TRUE.equals(loginUser.getIsSys()),SysMenu::getTenantMenu,true);
             sysMenuList = sysMenuService.list(queryWrapper);
         } else {
             sysMenuList = sysMenuService.listGrantMenuByUserId(sysUserBO.getId());

+ 50 - 36
coffee-system/src/main/java/com/coffee/bus/controller/BusClinicController.java

@@ -1,6 +1,7 @@
 package com.coffee.bus.controller;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -20,6 +21,7 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 /**
@@ -40,10 +42,10 @@ public class BusClinicController {
     private final LocalBusInfusionHistoryService infusionHistoryService;
     private final LocalBusInfusionModifyService infusionModifyService;
     private final LocalBusDeviceHistoryService deviceHistoryService;
-    private final DeviceRegistry deviceRegistry;
     private final LocalBusDeviceManualService deviceManualService;
     private final LocalBusPatientService patientService;
     private final LocalBusHospitalService hospitalService;
+    private final LocalBusDeviceService deviceService;
     @PostMapping("/stats")
     @ApiOperation(value = "临床过程中的数据记录",notes = "权限【无】")
     public R<ClinicStatsReturnResult> stats(@RequestBody@Validated ClinicStatsVo statsVo) {
@@ -83,7 +85,6 @@ public class BusClinicController {
         record.setTenantName(hospitalService.getName(tenantId));
         //填充临床信息
         result.setClinic(record);
-
         if(Boolean.TRUE.equals(after)){
             //填充评价记录
             result.setEvaluations(evaluationService.list(new QueryWrapper<BusEvaluationEntity>().lambda().eq(BusEvaluationEntity::getClinicId,clinicId).orderByAsc(BusEvaluationEntity::getEvaluateTime)));
@@ -93,40 +94,53 @@ public class BusClinicController {
                 List<BusInfusionHistoryEntity> infusionHistories = infusionHistoryService.list(new QueryWrapper<BusInfusionHistoryEntity>().lambda()
                         .eq(BusInfusionHistoryEntity::getClinicId, clinicId)
                         .orderByAsc(BusInfusionHistoryEntity::getStartTime));
-
-                result.fillUndoInfo(infusionHistories);
-
-                //添加设备别名
-                Map<String, List<BusInfusionHistoryEntity>> infusionByDeviceId = infusionHistories.stream().collect(Collectors.groupingBy(BusInfusionHistoryEntity::getDeviceId));
-                infusionByDeviceId.forEach((deviceId,infusions)->{
-                    String alias = deviceRegistry.getOperator(deviceId).getAlias();
-                    infusions.forEach(infusion->infusion.setAlias(alias));
-                });
-
-                List<String> infusionIds = infusionHistories.stream().map(BusInfusionHistoryEntity::getId).collect(Collectors.toList());
-                List<BusInfusionModifyEntity> infusionModifies = infusionModifyService.list(new QueryWrapper<BusInfusionModifyEntity>().lambda()
-                        .in(BusInfusionModifyEntity::getInfusionId, infusionIds));
-
-                result.fillInfusionRecords(infusionHistories,infusionModifies);
-
-                List<BusDeviceHistoryEntity> deviceHistories = deviceHistoryService.list(new QueryWrapper<BusDeviceHistoryEntity>()
-                        .lambda()
-                        .select(BusDeviceHistoryEntity::getInfusionId,BusDeviceHistoryEntity::getPcaValidCount,BusDeviceHistoryEntity::getInfusionModifyId,
-                                BusDeviceHistoryEntity::getPcaInvalidCount,BusDeviceHistoryEntity::getInputDose,BusDeviceHistoryEntity::getUploadTime)
-                        .in(BusDeviceHistoryEntity::getInfusionId, infusionIds)
-                        .eq(BusDeviceHistoryEntity::getMaster, true));
-                //标记输注
-                result.markInfusion(deviceHistories);
-                List<ClinicStatsQueryResult> statsQueryResults = deviceHistories.stream().map(history -> {
-                    ClinicStatsQueryResult statsQueryResult = new ClinicStatsQueryResult();
-                    statsQueryResult.setInputDose(history.getInputDose());
-                    statsQueryResult.setInValidCount(history.getPcaInvalidCount());
-                    statsQueryResult.setValidCount(history.getPcaValidCount());
-                    statsQueryResult.setUploadTime(history.getUploadTime());
-                    return statsQueryResult;
-                }).collect(Collectors.toList());
-                //填充统计信息
-                result.setStats(ClinicStatsReturnResult.of(statsQueryResults));
+                log.info("《《《《《《《《《《《《《《《《《填充输注记录结束》》》》》》》》》》》》》》》》");
+                if(CollUtil.isNotEmpty(infusionHistories)){
+                    result.fillUndoInfo(infusionHistories);
+                    //添加设备别名
+                    Map<String, List<BusInfusionHistoryEntity>> infusionByDeviceId = infusionHistories.stream().collect(Collectors.groupingBy(BusInfusionHistoryEntity::getDeviceId));
+                    if(CollUtil.isNotEmpty(infusionByDeviceId)){
+                        Set<String> deviceIds = infusionByDeviceId.keySet();
+                        List<BusDeviceEntity> devices
+                                = deviceService.list(new QueryWrapper<BusDeviceEntity>().lambda().select(BusDeviceEntity::getId, BusDeviceEntity::getDeviceId, BusDeviceEntity::getAlias).in(BusDeviceEntity::getId, deviceIds));
+                        Map<String, List<BusDeviceEntity>> aliasByDeviceId = devices.stream().collect(Collectors.groupingBy(BusDeviceEntity::getDeviceId));
+                        if(CollUtil.isNotEmpty(aliasByDeviceId)){
+                            infusionByDeviceId.forEach((deviceId,infusions)->{
+                                aliasByDeviceId.computeIfPresent(deviceId,(k,alias)->{
+                                    infusions.forEach(infusion->infusion.setAlias(alias.get(0).getAlias()));
+                                    return alias;
+                                });
+                            });
+                        }
+                    }
+                    log.info("《《《《《《《《《《《《《《《《《添加设备别名结束》》》》》》》》》》》》》》》》");
+                    List<String> infusionIds = infusionHistories.stream().map(BusInfusionHistoryEntity::getId).collect(Collectors.toList());
+                    List<BusInfusionModifyEntity> infusionModifies = infusionModifyService.list(new QueryWrapper<BusInfusionModifyEntity>().lambda()
+                            .in(BusInfusionModifyEntity::getInfusionId, infusionIds));
+                    result.fillInfusionRecords(infusionHistories,infusionModifies);
+
+                    List<BusDeviceHistoryEntity> deviceHistories = deviceHistoryService.list(new QueryWrapper<BusDeviceHistoryEntity>()
+                            .lambda()
+                            .select(BusDeviceHistoryEntity::getInfusionId,BusDeviceHistoryEntity::getPcaValidCount,BusDeviceHistoryEntity::getInfusionModifyId,
+                                    BusDeviceHistoryEntity::getPcaInvalidCount,BusDeviceHistoryEntity::getInputDose,BusDeviceHistoryEntity::getUploadTime)
+                            .in(BusDeviceHistoryEntity::getInfusionId, infusionIds)
+                            .eq(BusDeviceHistoryEntity::getMaster, true));
+                    log.info("《《《《《《《《《《《《《《《《《查询设备历史结束》》》》》》》》》》》》》》》》");
+                    //标记输注
+                    result.markInfusion(deviceHistories);
+                    List<ClinicStatsQueryResult> statsQueryResults = deviceHistories.stream().map(history -> {
+                        ClinicStatsQueryResult statsQueryResult = new ClinicStatsQueryResult();
+                        statsQueryResult.setInputDose(history.getInputDose());
+                        statsQueryResult.setInValidCount(history.getPcaInvalidCount());
+                        statsQueryResult.setValidCount(history.getPcaValidCount());
+                        statsQueryResult.setUploadTime(history.getUploadTime());
+                        return statsQueryResult;
+                    }).collect(Collectors.toList());
+                    //填充统计信息
+                    result.setStats(ClinicStatsReturnResult.of(statsQueryResults));
+                    log.info("《《《《《《《《《《《《《《《《《填充统计信息结束》》》》》》》》》》》》》》》》");
+
+                }
             }
         }
 

+ 7 - 1
coffee-system/src/main/java/com/coffee/bus/controller/BusHospitalController.java

@@ -12,6 +12,7 @@ import com.baomidou.mybatisplus.core.mapper.Mapper;
 import com.coffee.bus.bean.Script;
 import com.coffee.bus.controller.vo.ExecScript;
 import com.coffee.bus.entity.BusHospitalEntity;
+import com.coffee.bus.entity.HisUpdateEntity;
 import com.coffee.bus.hospital.HospitalManagerRegister;
 import com.coffee.bus.hospital.his.strategy.HisStrategyEnum;
 import com.coffee.bus.hospital.script.ScriptManager;
@@ -19,6 +20,7 @@ import com.coffee.bus.service.LocalBusHospitalService;
 import com.coffee.common.crud.BaseService;
 import com.coffee.common.crud.controller.BaseCrudController;
 import com.coffee.common.exception.CustomException;
+import com.coffee.common.exception.ExecuteResult;
 import com.coffee.common.result.R;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -104,7 +106,7 @@ public class BusHospitalController extends BaseCrudController<BusHospitalEntity,
     @PostMapping("/strategy/{type}")
     @SaCheckPermission("bus:hospital:strategy")
     @ApiOperation(value = "His对接策略编辑",notes = "His对接策略编辑,权限【bus:hospital:strategy】")
-    public R editStrategy(@PathVariable("type")@ApiParam("接收his数据的策略, 0、无his 1(默认)、获取病人全部信息 2、获取病人部分信息 3、获取病人最新信息") Integer type,@RequestAttribute("tenantId")@ApiParam(hidden = true) String tenantId){
+    public R editStrategy(@PathVariable("type")@ApiParam("接收his数据的策略, 0、无his 1(默认)、获取病人全部信息 2、获取病人部分信息 3、获取病人最新信息") Integer type, @RequestAttribute("tenantId")@ApiParam(hidden = true) String tenantId, @RequestBody HisUpdateEntity updateConfig){
         HisStrategyEnum strategy = HisStrategyEnum.valueOf(type);
         if(strategy==null){
             throw new CustomException("所选策略不存在");
@@ -113,6 +115,10 @@ public class BusHospitalController extends BaseCrudController<BusHospitalEntity,
                 .lambda()
                 .eq(BusHospitalEntity::getId,tenantId)
                 .set(BusHospitalEntity::getStrategy,strategy.getValue()));
+        if(updateConfig!=null){
+            hospitalManagerRegister.get(tenantId)
+                    .refreshUpdateConfig(updateConfig);
+        }
         return R.success(true);
     }
 

+ 14 - 1
coffee-system/src/main/java/com/coffee/bus/controller/BusPatientController.java

@@ -5,7 +5,7 @@ import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.dev33.satoken.stp.StpLogic;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.text.CharSequenceUtil;
-import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.mapper.Mapper;
@@ -26,6 +26,7 @@ import com.coffee.common.exception.CustomException;
 import com.coffee.common.result.R;
 import io.swagger.annotations.*;
 import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.context.request.async.DeferredResult;
@@ -41,6 +42,7 @@ import java.util.*;
 @RestController
 @AllArgsConstructor
 @RequestMapping("/bus/patient")
+@Slf4j
 @Api(tags = "医院病人管理",description = "关于病人的相关操作,查询操作权限【bus:patient:query】")
 public class BusPatientController  implements BaseQueryController<BusPatientEntity,String> {
     private final LocalBusPatientService patientService;
@@ -58,18 +60,21 @@ public class BusPatientController  implements BaseQueryController<BusPatientEnti
     @SaCheckPermission("bus:patient:query")
     @ApiOperation(value = "输注监控列表",notes = "病人监控管理列表,权限【bus:patient:query】")
     public R<List<PatientMonitorResult>> selectPage(@RequestBody PatientMonitorQuery query){
+        log.info("输注监控列表,【{}】",JSONUtil.toJsonStr(query));
         return R.success(patientService.selectAll(query));
     }
 
     @GetMapping("/repeat/device")
     @ApiOperation(value = "设备重复提示列表",notes = "当出现病患同一时间绑定了多个泵时,调用该接口查询出所有设备重复报警数据,权限【无】")
     public R<List<PatientDeviceRepeatResult>> repeatDevice(){
+        log.info("设备重复提示列表");
         return R.success(patientService.repeatDevice());
     }
 
     @GetMapping("/none/device")
     @ApiOperation(value = "临床无泵列表",notes = "当出现病患同一时间没有泵时,调用该接口查询出所有没有泵信息的病患临床数据,权限【无】")
     public R<List<PatientDeviceNoneResult>> noneDevice(){
+        log.info("设备重复提示列表");
         return R.success(patientService.noneDevice());
     }
 
@@ -79,6 +84,7 @@ public class BusPatientController  implements BaseQueryController<BusPatientEnti
             @ApiResponse(code = 200,message = "0 病人中未出现重复,非0 病人中出现重复"),
     })
     public R<Long> judgeRepeat(@RequestBody List<String> patientCode){
+        log.info("判断所给病号中是否出现了绑定设备重复,【{}】",patientCode);
         return R.success(patientService.count(new QueryWrapper<BusPatientEntity>().lambda().in(BusPatientEntity::getCode,patientCode).eq(BusPatientEntity::getAlarm,PatientAlarmEnum.DEVICE_REPEAT)));
     }
 
@@ -89,6 +95,7 @@ public class BusPatientController  implements BaseQueryController<BusPatientEnti
             @ApiResponse(code =200 ,message = "若存在不可以结束的临床信息,返回1",response = BusDeviceRunningEntity.class)
     })
     public R<Boolean> judgeFinished(@RequestBody List<String> patientCodes){
+        log.info("判断给定病号中是否可以结束临床管理,【{}】",patientCodes);
         if(CollUtil.isEmpty(patientCodes)){
             throw new CustomException("请选择一个病患");
         }
@@ -107,6 +114,7 @@ public class BusPatientController  implements BaseQueryController<BusPatientEnti
     public R<Boolean> finished(@PathVariable("monitorType")@ApiParam(value = "是否为无泵管理 false、无泵 true、有泵",defaultValue = "false" ) boolean haveDevice,
                       @RequestBody MonitorFinishedVo monitorFinishedVo,
                       @RequestAttribute("tenantId")@ApiParam(hidden = true) String tenantId){
+        log.info("结束管理,【{}】",JSONUtil.toJsonStr(monitorFinishedVo));
         if(haveDevice){
             R<Boolean> result = monitorFinished(monitorFinishedVo, tenantId);
             wsPublishUtils.publishMonitorTotalCount(tenantId);
@@ -172,6 +180,7 @@ public class BusPatientController  implements BaseQueryController<BusPatientEnti
     @SaCheckPermission("device:patient:edit")
     @ApiOperation(value = "病人当前监控时间重启",notes = "当结束临床后有新的输注信息产生,那么病人监控会重新显示,此时监控时间不会重新计算,需先调用该接口,权限标识为【device:patient:edit】")
     public R<Boolean> reset(@ApiParam("临床id")@PathVariable("clinicId")String clinicId){
+        log.info("病人当前监控时间重启,【{}】",clinicId);
         R<Boolean> result = R.success(clinicService.update(new UpdateWrapper<BusClinicEntity>().lambda().eq(BusClinicEntity::getId, clinicId)
                 .set(BusClinicEntity::getEndTime, null)));
         BusClinicEntity clinic = clinicService.getById(clinicId);
@@ -187,6 +196,7 @@ public class BusPatientController  implements BaseQueryController<BusPatientEnti
         if(alarmEnum==null){
             return R.success(0L);
         }
+        log.info("病人报警数量统计,【{}】",alarmEnum);
         return R.success(patientService.patientAlarmCount(alarmEnum));
     }
 
@@ -194,6 +204,7 @@ public class BusPatientController  implements BaseQueryController<BusPatientEnti
     @SaCheckPermission("device:patient:shift")
     @ApiOperation(value = "主泵切换的操作,只切换,不结束",notes = "当出现泵重复状态时,若用户想要进行主泵的切换,调用该接口进行操作,主泵切换完成后,会将副泵自动撤泵,权限标识为【device:patient:shift】")
     public R shift(@RequestBody@Validated DeviceShiftConfig shiftConfig){
+        log.info("主泵切换的操作,【{}】",JSONUtil.toJsonStr(shiftConfig));
         patientService.shift(shiftConfig);
         wsPublishUtils.publishPatientMonitor(shiftConfig.getPatientCode(),shiftConfig.getTenantId());
         return R.success();
@@ -203,6 +214,7 @@ public class BusPatientController  implements BaseQueryController<BusPatientEnti
     @SaCheckPermission("device:patient:undo")
     @ApiOperation(value = "批量撤泵,只撤泵,不切换",notes = "当出现泵重复状态时,若用户想要取消对其他副泵的监控,则调用此接口进行撤泵操作,权限标识为【device:patient:undo】")
     public R shift(@RequestBody@Validated ManualUndoConfig undoConfig, @RequestAttribute("tenantId")@ApiParam(hidden = true) String tenantId){
+        log.info("批量撤泵,【{}】",JSONUtil.toJsonStr(undoConfig));
         undoConfig.setTenantId(tenantId);
         //泵切换完成后,对病号报警解除
         infusionService.undo(undoConfig,false);
@@ -229,6 +241,7 @@ public class BusPatientController  implements BaseQueryController<BusPatientEnti
     @SaCheckPermission("device:patient:query")
     @ApiOperation(value = "查看病人当前监控详情",notes = "查看病人当前监控详情,权限标识为【device:patient:query】")
     public R<PatientMonitorDetailResult> monitor(@RequestBody@Validated MonitorDetailVo vo){
+        log.info("查看病人监控详情,【{}】", JSONUtil.toJsonStr(vo));
         PatientMonitorDetailResult result = new PatientMonitorDetailResult();
         BusClinicEntity clinic =null;
         Boolean monitorType = vo.getMonitorType();

+ 4 - 1
coffee-system/src/main/java/com/coffee/bus/entity/BusHospitalEntity.java

@@ -97,6 +97,10 @@ public class BusHospitalEntity implements RecordModifierEntity, RecordCreationEn
     @ApiModelProperty("接收his数据的策略, 1(默认)、获取病人全部信息 2、获取病人部分信息 3、获取病人最新信息")
     private HisStrategyEnum strategy;
 
+    @ApiModelProperty("his数据更新配置")
+    @TableField(typeHandler = FastjsonTypeHandler.class,updateStrategy = FieldStrategy.NEVER)
+    private HisUpdateEntity updateConfig;
+
     @TableField(fill = FieldFill.INSERT_UPDATE)
     private String updateBy;
 
@@ -110,5 +114,4 @@ public class BusHospitalEntity implements RecordModifierEntity, RecordCreationEn
     @TableLogic(value = "0",delval = "1")
     private Integer isDelete;
 
-
 }

+ 33 - 0
coffee-system/src/main/java/com/coffee/bus/entity/HisUpdateEntity.java

@@ -0,0 +1,33 @@
+package com.coffee.bus.entity;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName HisUpdateEntity.java
+ * @Description his数据更新设置
+ * @createTime 2022年06月18日 14:16:00
+ */
+@Data
+public class HisUpdateEntity implements Serializable {
+    private Boolean enable;
+    private Integer interval;
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        HisUpdateEntity that = (HisUpdateEntity) o;
+        return Objects.equals(getEnable(), that.getEnable()) &&
+                Objects.equals(getInterval(), that.getInterval());
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(getEnable(), getInterval());
+    }
+}

+ 73 - 7
coffee-system/src/main/java/com/coffee/bus/hospital/HospitalManager.java

@@ -1,14 +1,15 @@
 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.BusDeviceRunningEntity;
-import com.coffee.bus.entity.BusHospitalConfigEntity;
-import com.coffee.bus.entity.BusHospitalEntity;
-import com.coffee.bus.entity.BusPatientEntity;
+import com.coffee.bus.entity.*;
 import com.coffee.bus.hospital.config.HospitalAutoUndoConfigHandler;
 import com.coffee.bus.hospital.config.HospitalFinishMonitorConfigHandler;
 import com.coffee.bus.hospital.config.HospitalFunctionAnalConfigHandler;
@@ -23,15 +24,22 @@ 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 org.springframework.data.domain.PageRequest;
 
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
+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
@@ -60,7 +68,15 @@ public class HospitalManager {
 
     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,
@@ -76,6 +92,7 @@ public class HospitalManager {
         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.infusionHistoryService=SpringUtil.getBean(LocalBusInfusionHistoryService.class);
         init(configStorageManager);
     }
 
@@ -166,4 +183,53 @@ public class HospitalManager {
         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)
+                .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);
+                    });
+        }
+    }
 }

+ 1 - 1
coffee-system/src/main/java/com/coffee/bus/mapper/BusClinicMapper.java

@@ -45,5 +45,5 @@ public interface BusClinicMapper extends BaseMapper<BusClinicEntity> {
      */
     IPage<ClinicResult> pageQuery(Page<ClinicResult> page,@Param("query") ClinicQuery query);
 
-    IPage<ClinicResult> latestQueryPage(Page<ClinicResult> page, ClinicQuery query);
+    IPage<ClinicResult> latestQueryPage(Page<ClinicResult> page, @Param("query") ClinicQuery query);
 }

+ 14 - 2
coffee-system/src/main/java/com/coffee/bus/service/LocalBusDocService.java

@@ -1,7 +1,11 @@
 package com.coffee.bus.service;
 
+import cn.dev33.satoken.exception.NotPermissionException;
+import cn.dev33.satoken.stp.StpUtil;
 import com.coffee.bus.entity.BusDocEntity;
 import com.coffee.bus.mapper.BusDocMapper;
+import com.coffee.common.Constants;
+import com.coffee.common.bo.LoginUser;
 import com.coffee.common.crud.BaseService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -19,16 +23,24 @@ public class LocalBusDocService extends BaseService<BusDocMapper, BusDocEntity,S
 
     @Override
     public void validateBeforeSave(BusDocEntity entity) {
-
+        validate();
     }
 
     @Override
     public void validateBeforeUpdate(BusDocEntity entity) {
-
+        validate();
     }
 
     @Override
     public void validateBeforeDelete(String id) {
+        validate();
+    }
+
 
+    private void validate(){
+        LoginUser loginUser = (LoginUser) StpUtil.getTokenSession().get(Constants.LOGIN_USER_KEY);
+        if(!Boolean.TRUE.equals(loginUser.getIsSys())){
+            throw new NotPermissionException("不允许修改文档信息");
+        }
     }
 }

+ 9 - 0
coffee-system/src/main/java/com/coffee/bus/service/LocalBusHospitalService.java

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.coffee.bus.bean.GeoPoint;
 import com.coffee.bus.entity.BusHospitalConfigEntity;
 import com.coffee.bus.entity.BusHospitalEntity;
+import com.coffee.bus.entity.HisUpdateEntity;
 import com.coffee.bus.hospital.HospitalManagerRegister;
 import com.coffee.bus.hospital.his.strategy.HisStrategyEnum;
 import com.coffee.bus.mapper.BusHospitalMapper;
@@ -115,6 +116,10 @@ public class LocalBusHospitalService extends BaseService<BusHospitalMapper, BusH
                         log.error("新增医院默认配置失败,",e);
                     }
                 });
+        HisUpdateEntity updateConfig = entity.getUpdateConfig();
+        if(updateConfig!=null){
+            hospitalManagerRegister.get(entity.getId()).refreshUpdateConfig(updateConfig);
+        }
         //设置默认管理员角色
         SysRole sysRole = new SysRole();
         sysRole.setTenantId(entity.getId());
@@ -132,6 +137,10 @@ public class LocalBusHospitalService extends BaseService<BusHospitalMapper, BusH
         if(StrUtil.isNotEmpty(entity.getName())){
             nameCache.setConfig(entity.getId(),entity.getName());
         }
+        HisUpdateEntity updateConfig = entity.getUpdateConfig();
+        if(updateConfig!=null){
+            hospitalManagerRegister.get(entity.getId()).refreshUpdateConfig(updateConfig);
+        }
     }
 
     @Override

+ 6 - 3
coffee-system/src/main/java/com/coffee/bus/service/LocalBusPatientService.java

@@ -289,7 +289,8 @@ public class LocalBusPatientService extends BaseService<BusPatientMapper, BusPat
         if(CollectionUtil.isNotEmpty(patientMonitorResults)){
             patientMonitorResults.forEach(monitor->{
                 //运行数量
-                if(DeviceStatusEnum.Running.equals(monitor.getDeviceRunState())){
+                if(!Boolean.TRUE.equals(monitor.getInfusionFinished())&&
+                        DeviceStatusEnum.Running.equals(monitor.getDeviceRunState())){
                     result.setRunningCount(result.getRunningCount()+1);
                 }
                 if((Boolean.TRUE.equals(monitor.getInfusionFinished()))||
@@ -297,11 +298,13 @@ public class LocalBusPatientService extends BaseService<BusPatientMapper, BusPat
                     result.setWaitingFinish(result.getWaitingFinish()+1);
                 }
                 //报警数量
-                if(monitor.getDeviceAlarm()!=null&&!monitor.getDeviceAlarm().equals(DeviceAlarmEnum.None)){
+                if(!Boolean.TRUE.equals(monitor.getInfusionFinished())&&
+                        monitor.getDeviceAlarm()!=null&&!monitor.getDeviceAlarm().equals(DeviceAlarmEnum.None)){
                     result.setAlarmCount(result.getAlarmCount()+1);
                 }
                 //提醒数量
-                if(Boolean.TRUE.equals(monitor.getWarnAnalgesicPoor())
+                if(!Boolean.TRUE.equals(monitor.getInfusionFinished())&&
+                        Boolean.TRUE.equals(monitor.getWarnAnalgesicPoor())
                         ||Boolean.TRUE.equals(monitor.getWarnLowBattery())
                         ||Boolean.TRUE.equals(monitor.getWarnWillFinished())
                         ||monitor.getWarnFlow()!=null){

+ 3 - 0
coffee-system/src/main/java/com/coffee/bus/service/dto/PatientMonitorQuery.java

@@ -97,6 +97,9 @@ public class PatientMonitorQuery  implements Serializable {
     @ApiModelProperty("输注是否结束")
     private Boolean infusionFinished;
 
+    @ApiModelProperty("输注结束拼接方式 0、or 1、and")
+    private boolean andFinished;
+
     @ApiModelProperty(value = "医院id",hidden = true)
     @JsonIgnore
     private String tenantId;

+ 3 - 0
coffee-system/src/main/java/com/coffee/system/common/dto/SysMenuAddDTO.java

@@ -1,5 +1,6 @@
 package com.coffee.system.common.dto;
 
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import javax.validation.constraints.NotBlank;
@@ -68,6 +69,8 @@ public class SysMenuAddDTO implements Serializable {
     @Size(max = 100, message = "图标长度不能超过100个字符")
     private String icon;
 
+    @ApiModelProperty("是否为租户菜单, 0、否(租户不可见) 1、是(租户可见)")
+    private Boolean tenantMenu;
     /**
      * 是否缓存 0缓存;1不缓存
      */

+ 2 - 15
coffee-system/src/main/java/com/coffee/system/entity/SysLog.java

@@ -2,6 +2,7 @@ package com.coffee.system.entity;
 
 import com.baomidou.mybatisplus.annotation.FieldFill;
 import com.baomidou.mybatisplus.annotation.TableField;
+import com.coffee.common.entity.TenantGenericEntity;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
@@ -20,7 +21,7 @@ import java.util.Date;
  * @since 2021-07-12
  */
 @Data
-public class SysLog implements Serializable {
+public class SysLog extends TenantGenericEntity<Long,String> implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
@@ -112,18 +113,4 @@ public class SysLog implements Serializable {
      */
     private String remarks;
 
-    /**
-     * 创建时间
-     */
-    @TableField(fill = FieldFill.INSERT)
-    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
-    private Date createTime;
-
-    /**
-     * 更新时间
-     */
-    @TableField(fill = FieldFill.INSERT_UPDATE)
-    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
-    private Date updateTime;
-
 }

+ 4 - 0
coffee-system/src/main/java/com/coffee/system/entity/SysMenu.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -86,6 +87,9 @@ public class SysMenu implements Serializable {
      */
     private String visible;
 
+    @ApiModelProperty("是否为租户菜单, 0、否(租户不可见) 1、是(租户可见)")
+    private Boolean tenantMenu;
+
     /**
      * 是否内嵌 0内嵌;1不内嵌
      */

+ 1 - 3
coffee-system/src/main/resources/mapper/bus/BusClinicMapper.xml

@@ -150,14 +150,13 @@
     <select id="latestQueryPage" resultMap="queryResult" parameterType="com.coffee.bus.service.dto.ClinicQuery">
         select
         c.id as clinic_id,
-        c.patient_code as patient_code,
+        p.code as patient_code,
         c.patient_name as patient_name,
         c.ward as ward,
         c.bed_no as bed_no,
         c.`surgery_name` as surgery_name,
         c.surgery_doctor as surgery_doctor,
         c.ana_doctor as ana_doctor,
-        c.monitor_type as monitor_type,
         c.finished as finished,
         c.start_time as clinic_start_time,
         c.monitor_start_time as monitor_start_time,
@@ -199,7 +198,6 @@
                 and monitor_start_time &gt; #{query.timeRange[0]} and  monitor_start_time &lt; #{query.timeRange[1]}
             </if>
         </where>
-
         ) as c on p.clinic_id=c.id
         left join  (select clinic_id,count(1) as infusion_count from bus_infusion_history GROUP BY clinic_id) as i on i.clinic_id=c.id
         left join (select clinic_id,count(1) as eval_count from bus_evaluation  GROUP BY clinic_id) as eval on eval.clinic_id=c.id

+ 4 - 1
coffee-system/src/main/resources/mapper/bus/BusPatientMapper.xml

@@ -216,6 +216,9 @@
         (select * from bus_infusion_history
         <where>
             is_undo='0'
+            <if test="query.infusionFinished == true and query.andFinished == true ">
+                and  finished=#{query.infusionFinished}
+            </if>
             <if test="query.types != null and query.types.size > 0">
                 and type in
                 <foreach item="type" index="index" collection="query.types" open="(" separator="," close=")">
@@ -240,7 +243,7 @@
                             #{alarm, jdbcType=VARCHAR}
                         </foreach>
                     </if>
-                    <if test="query.infusionFinished == true">
+                    <if test="query.infusionFinished == true and query.andFinished == false ">
                         or finished=#{query.infusionFinished}
                     </if>
                     )