ソースを参照

add 经销商设备缓存

18339543638 3 年 前
コミット
ac8e74fc55

+ 80 - 0
coffee-system/src/main/java/com/coffee/bus/bean/DeviceBasicInfo.java

@@ -0,0 +1,80 @@
+package com.coffee.bus.bean;
+
+import com.coffee.common.enums.SexEnum;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName DeviceInfo.java
+ * @Description 注册设备基本信息
+ * @createTime 2022年04月01日 17:06:00
+ */
+@Data
+@NoArgsConstructor
+public class DeviceBasicInfo {
+    /*****经销商泵管理状态********/
+    /**
+     * 设备id
+     */
+    private String deviceId;
+    /**
+     * 设备别名
+     */
+    private String alias;
+
+    /**
+     * 是否启用
+     */
+    private Integer enable;
+
+    /**
+     * 设备所属医院
+     */
+    private String tenantId;
+    /*****经销商泵管理状态********/
+
+    /*****泵正在运行状态********/
+
+    /**
+     * 对应泵设备正在运行id
+     * @see com.coffee.bus.entity.BusPumpEntity
+     */
+    private String id;
+
+    private Date startTime;
+
+    private Date registerTime;
+
+    private String patientCode;
+
+    private String patientName;
+
+    private SexEnum gender;
+
+    private String bedNo;
+
+    private String ward;
+
+    private String remark;
+
+    /*****泵正在运行状态********/
+
+    public DeviceBasicInfo(String deviceId, String alias, Integer enable, String tenantId) {
+        this.deviceId = deviceId;
+        this.alias = alias;
+        this.enable = enable;
+        this.tenantId = tenantId;
+    }
+
+    public static DeviceBasicInfo of(String deviceId, String alias, Integer enable, String tenantId) {
+        return new DeviceBasicInfo(deviceId,alias,enable,tenantId);
+    }
+
+    public static DeviceBasicInfo of(String deviceId) {
+        return new DeviceBasicInfo(deviceId,null,null,null);
+    }
+}

+ 52 - 0
coffee-system/src/main/java/com/coffee/bus/device/ClusterDeviceRegistry.java

@@ -0,0 +1,52 @@
+package com.coffee.bus.device;
+
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONUtil;
+import com.coffee.bus.bean.DeviceBasicInfo;
+import com.coffee.common.redis.RedisUtils;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName ClusterDeviceRegistry.java
+ * @Description TODO
+ * @createTime 2022年04月01日 17:10:00
+ */
+@AllArgsConstructor
+@Service
+public class ClusterDeviceRegistry implements DeviceRegistry {
+    private final RedisUtils redisUtils;
+
+    @Override
+    public DeviceOperator getDevice(String deviceId) {
+        if(StrUtil.isEmpty(deviceId)){
+            return DeviceOperator.of(new DeviceBasicInfo(),redisUtils);
+        }
+        Map<Object, Object> result = redisUtils.hmget(deviceId);
+        if(result==null||result.size()==0){
+            return DeviceOperator.of(DeviceBasicInfo.of(deviceId),redisUtils);
+
+        }
+        return DeviceOperator.of(JSONUtil.toBean(JSONUtil.toJsonStr(result),DeviceBasicInfo.class),redisUtils);
+    }
+
+    @Override
+    public void register(DeviceBasicInfo basicInfo) {
+        if(StrUtil.isNotEmpty(basicInfo.getDeviceId())){
+            DeviceOperator.of(basicInfo, redisUtils).sysn();
+        }
+    }
+
+    @Override
+    public void unRegister(String deviceId) {
+        DeviceBasicInfo deviceBasicInfo = DeviceBasicInfo.of(deviceId);
+        deviceBasicInfo.setDeviceId(deviceId);
+        DeviceOperator.of(deviceBasicInfo, redisUtils).clear();
+    }
+
+
+}

+ 217 - 0
coffee-system/src/main/java/com/coffee/bus/device/DeviceOperator.java

@@ -0,0 +1,217 @@
+package com.coffee.bus.device;
+
+import cn.hutool.core.util.StrUtil;
+import com.coffee.bus.bean.DeviceBasicInfo;
+import com.coffee.common.enums.SexEnum;
+import com.coffee.common.redis.RedisUtils;
+import lombok.AllArgsConstructor;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName DeviceOperator.java
+ * @Description 设备注册操作
+ * @createTime 2022年04月01日 17:14:00
+ */
+@AllArgsConstructor
+public class DeviceOperator {
+    private final DeviceBasicInfo deviceBasicInfo;
+
+    private final RedisUtils redisUtils;
+
+    /**
+     * 该操作是否有效,即判断该操作是否存在设备id
+     */
+    private final boolean validate;
+
+    public static DeviceOperator of(DeviceBasicInfo deviceBasicInfo,RedisUtils redisUtils){
+        return new DeviceOperator(deviceBasicInfo,redisUtils,StrUtil.isNullOrUndefined(deviceBasicInfo.getDeviceId()));
+    }
+    /**
+     * 清除缓存
+     */
+    public DeviceOperator clear(){
+        if(!validate)return this;
+        redisUtils.del(deviceBasicInfo.getDeviceId());
+        return this;
+    }
+    /**
+     * 将自身同步至redis
+     * @param
+     */
+    public DeviceOperator sysn(){
+        if(!validate)return this;
+        redisUtils.hmset(this.getDeviceId(),getMap());
+        return this;
+    }
+
+    public DeviceOperator updateEnable(Integer enable){
+        if(!validate)return this;
+        deviceBasicInfo.setEnable(enable);
+        redisUtils.hset(deviceBasicInfo.getDeviceId(),"enable",enable);
+        return this;
+    }
+
+    public DeviceOperator updateTenantId(String tenantId){
+        if(!validate)return this;
+        deviceBasicInfo.setTenantId(tenantId);
+        redisUtils.hset(deviceBasicInfo.getDeviceId(),"tenantId",tenantId);
+        return this;
+    }
+
+
+    public DeviceOperator updateRunId(String runId){
+        if(!validate)return this;
+        deviceBasicInfo.setId(runId);
+        redisUtils.hset(deviceBasicInfo.getDeviceId(),"id",runId);
+        return this;
+    }
+
+    public DeviceOperator updateStartTime(Date startTime){
+        if(!validate)return this;
+        deviceBasicInfo.setStartTime(startTime);
+        redisUtils.hset(deviceBasicInfo.getDeviceId(),"startTime",startTime);
+        return this;
+    }
+
+
+    public DeviceOperator updateRegisterTime(Date registerTime){
+        if(!validate)return this;
+        deviceBasicInfo.setRegisterTime(registerTime);
+        redisUtils.hset(deviceBasicInfo.getDeviceId(),"registerTime",registerTime);
+        return this;
+    }
+
+
+
+    public DeviceOperator updatePatientCode(String patientCode){
+        if(!validate)return this;
+        deviceBasicInfo.setPatientCode(patientCode);
+        redisUtils.hset(deviceBasicInfo.getDeviceId(),"patientCode",patientCode);
+        return this;
+    }
+
+
+
+    public DeviceOperator updatePatientName(String patientName){
+        if(!validate)return this;
+        deviceBasicInfo.setPatientName(patientName);
+        redisUtils.hset(deviceBasicInfo.getDeviceId(),"patientName",patientName);
+        return this;
+    }
+
+
+
+    public DeviceOperator updateGender(SexEnum gender){
+        if(!validate)return this;
+        deviceBasicInfo.setGender(gender);
+        redisUtils.hset(deviceBasicInfo.getDeviceId(),"gender",gender);
+        return this;
+    }
+
+
+
+    public DeviceOperator updateBedNo(String bedNo){
+        if(!validate)return this;
+        deviceBasicInfo.setBedNo(bedNo);
+        redisUtils.hset(deviceBasicInfo.getDeviceId(),"bedNo",bedNo);
+        return this;
+    }
+
+
+    public DeviceOperator updateWard(String ward){
+        if(!validate)return this;
+        deviceBasicInfo.setWard(ward);
+        redisUtils.hset(deviceBasicInfo.getDeviceId(),"ward",ward);
+        return this;
+    }
+
+
+
+    public DeviceOperator updateRemark(String remark){
+        if(!validate)return this;
+        deviceBasicInfo.setRemark(remark);
+        redisUtils.hset(deviceBasicInfo.getDeviceId(),"remark",remark);
+        return this;
+    }
+
+
+    public String getDeviceId(){
+        return deviceBasicInfo.getDeviceId();
+    }
+
+    public String getAlias(){
+        return deviceBasicInfo.getAlias();
+    }
+
+    public String getTenantId(){
+        return deviceBasicInfo.getTenantId();
+    }
+
+    /**
+     * 获取正在运行设备绑定id
+     * @return
+     */
+    public String getRunId(){
+        return deviceBasicInfo.getId();
+    }
+
+    public Date getStartTime(){
+        return deviceBasicInfo.getStartTime();
+    }
+
+    public Date getRegisterTime(){
+        return deviceBasicInfo.getRegisterTime();
+    }
+
+    public String getPatientCode(){
+        return deviceBasicInfo.getPatientCode();
+    }
+
+    public String getPatientName(){
+        return deviceBasicInfo.getPatientName();
+    }
+
+    public SexEnum getGender(){
+        return deviceBasicInfo.getGender();
+    }
+
+    public String getBedNo(){
+        return deviceBasicInfo.getBedNo();
+    }
+
+    public String getWard(){
+        return deviceBasicInfo.getWard();
+    }
+
+    public String getRemark(){
+        return deviceBasicInfo.getRemark();
+    }
+
+
+    /**
+     * 判断设备在系统中是否存在
+     * @return
+     */
+    public boolean isExist(){
+        return deviceBasicInfo!=null&& !StrUtil.isEmpty(deviceBasicInfo.getDeviceId()) ;
+    }
+
+
+    /**
+     * 判断设备在医院中是否可以使用
+     * @return
+     */
+    public boolean canUse(){
+        return isExist()&&deviceBasicInfo.getEnable()!=null&&deviceBasicInfo.getEnable()==1 ;
+    }
+
+
+    public Map<String,Object> getMap(){
+        return new HashMap<>();
+    }
+}

+ 31 - 0
coffee-system/src/main/java/com/coffee/bus/device/DeviceRegistry.java

@@ -0,0 +1,31 @@
+package com.coffee.bus.device;
+
+import com.coffee.bus.bean.DeviceBasicInfo;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName DeviceRegister.java
+ * @Description 设备注册中心
+ * @createTime 2022年04月01日 17:05:00
+ */
+public interface DeviceRegistry {
+    /**
+     * 获取设备基础信息
+     * @param deviceId
+     * @return
+     */
+    DeviceOperator getDevice(String deviceId);
+
+    /**
+     * 注册设备信息
+     * @param basicInfo
+     */
+    void register(DeviceBasicInfo basicInfo);
+
+    /**
+     * 取消注册设备信息
+     * @param deviceId 设备id
+     */
+    void unRegister(String deviceId);
+}

+ 64 - 0
coffee-system/src/main/java/com/coffee/bus/service/LocalBusDeviceRegisteredService.java

@@ -1,10 +1,17 @@
 package com.coffee.bus.service;
 
+import cn.hutool.core.util.ObjectUtil;
+import com.coffee.bus.bean.DeviceBasicInfo;
+import com.coffee.bus.device.DeviceOperator;
+import com.coffee.bus.device.DeviceRegistry;
 import com.coffee.bus.entity.BusDeviceRegisteredEntity;
 import com.coffee.bus.mapper.BusDeviceRegisteredMapper;
 import com.coffee.common.crud.BaseService;
+import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
+import java.util.Collection;
 
 /**
  * @author lifang
@@ -15,8 +22,10 @@ import org.springframework.stereotype.Service;
  */
 @Service
 @Slf4j
+@AllArgsConstructor
 public class LocalBusDeviceRegisteredService  extends BaseService<BusDeviceRegisteredMapper, BusDeviceRegisteredEntity,String> {
 
+    private final DeviceRegistry deviceRegistry;
     @Override
     public void validateBeforeSave(BusDeviceRegisteredEntity entity) {
 
@@ -31,4 +40,59 @@ public class LocalBusDeviceRegisteredService  extends BaseService<BusDeviceRegis
     public void validateBeforeDelete(String id) {
 
     }
+
+    @Override
+    public boolean save(BusDeviceRegisteredEntity entity) {
+        if (super.save(entity)) {
+            deviceRegistry.register(DeviceBasicInfo.of(entity.getDeviceId(),entity.getAlias(),entity.getEnable(),entity.getTenantId()));
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public boolean saveBatch(Collection<BusDeviceRegisteredEntity> entityList) {
+        if(super.saveBatch(entityList)){
+            entityList
+                    .parallelStream()
+                    .forEach(this::saveOrUpdateDeviceRegistered);
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public boolean updateById(BusDeviceRegisteredEntity entity) {
+        if (super.updateById(entity)) {
+            this.saveOrUpdateDeviceRegistered(entity);
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public boolean updateBatchById(Collection<BusDeviceRegisteredEntity> entityList) {
+        if (super.updateBatchById(entityList)) {
+            entityList
+                    .parallelStream()
+                    .forEach(this::saveOrUpdateDeviceRegistered);
+            return true;
+        }
+        return false;
+    }
+
+    @Async
+    public void saveOrUpdateDeviceRegistered(BusDeviceRegisteredEntity entity){
+        DeviceOperator operator = deviceRegistry.getDevice(entity.getDeviceId());
+        if (ObjectUtil.isNotNull(entity.getAlias())) {
+            operator.updateAlias(entity.getAlias());
+        }
+        if (ObjectUtil.isNotNull(entity.getEnable())) {
+            operator.updateEnable(entity.getEnable());
+        }
+        if (ObjectUtil.isNotNull(entity.getTenantId())) {
+            operator.updateTenantId(entity.getTenantId());
+        }
+    }
+
 }

+ 20 - 6
coffee-system/src/main/java/com/coffee/bus/websocket/listener/DeviceInfoListener.java

@@ -3,6 +3,8 @@ package com.coffee.bus.websocket.listener;
 import cn.hutool.core.util.RandomUtil;
 import cn.hutool.extra.spring.SpringUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.coffee.bus.device.DeviceOperator;
+import com.coffee.bus.device.DeviceRegistry;
 import com.coffee.bus.entity.BusPumpEntity;
 import com.coffee.bus.enums.NetPumpStatusEnum;
 import com.coffee.bus.listener.event.bean.DeviceAlarmEvent;
@@ -11,6 +13,7 @@ import com.coffee.bus.service.LocalBusPumpService;
 import com.coffee.bus.service.LocalBusPatientService;
 import com.coffee.common.config.websocket.WebSocketConstant;
 import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.event.EventListener;
 import org.springframework.data.redis.core.RedisTemplate;
@@ -33,6 +36,7 @@ import java.util.List;
  */
 @Component
 @AllArgsConstructor
+@Slf4j
 public class DeviceInfoListener {
 
     private final RedisTemplate redisTemplate;
@@ -41,11 +45,14 @@ public class DeviceInfoListener {
 
     private final LocalBusPatientService patientService;
 
+    private final DeviceRegistry deviceRegistry;
     @Autowired
-    public DeviceInfoListener(RedisTemplate redisTemplate, LocalBusPumpService deviceRunInfoService, LocalBusPatientService patientService) {
+    public DeviceInfoListener(RedisTemplate redisTemplate, LocalBusPumpService deviceRunInfoService,
+                              LocalBusPatientService patientService,DeviceRegistry deviceRegistry) {
         this.redisTemplate = redisTemplate;
         this.deviceRunInfoService = deviceRunInfoService;
         this.patientService = patientService;
+        this.deviceRegistry=deviceRegistry;
     }
 
     private DeviceInfoListener deviceInfoListener;
@@ -63,17 +70,24 @@ public class DeviceInfoListener {
     @Transactional(rollbackFor = Exception.class)
     public void deviceInfoDetail(DeviceInfoEvent infoEvent){
         BusPumpEntity device = infoEvent.getContent();
-        //1、判断设备是否为首次注册
+        //1、判断该设备是否已和医院绑定并开启使用
+        String deviceId = device.getDeviceId();
+        DeviceOperator deviceOperator = deviceRegistry.getDevice(deviceId);
+        if (!deviceOperator.canUse()) {
+            log.warn("设备[{}]暂不可用,数据已丢弃");
+            return ;
+        }
         BusPumpEntity exist = deviceRunInfoService.getByDeviceId(device.getDeviceId());
         //2、设备信息发生变化
         device.setMonitorType(1);
         if(exist==null){
-            //3、将设备和医院、病人进行绑定 todo
+            //3、将设备和医院、病人进行绑定
             Date now = new Date();
             device.setRegisterTime(now);
             device.setStartTime(now);
-            //获取设备绑定医院 todo
-            device.setTenantId("");
+            device.setAlias(deviceOperator.getAlias());
+            //获取设备绑定医院
+            device.setTenantId(deviceOperator.getTenantId());
             //判断是否存在临床信息 ,拉取临床信息
             deviceRunInfoService.save(device);
         }
@@ -87,7 +101,7 @@ public class DeviceInfoListener {
             device.setPatientCode(exist.getPatientCode());
             device.setPatientName(exist.getPatientName());
             device.setPatientSex(exist.getPatientSex());
-            device.setTenantId(exist.getTenantId());
+            device.setTenantId(deviceOperator.getTenantId());
             device.setClinicId(exist.getClinicId());
             device.setWard(exist.getWard());
             device.setBedNo(exist.getBedNo());