Procházet zdrojové kódy

add 24小时未评提醒

18339543638 před 3 roky
rodič
revize
f19aa6dc0f

+ 2 - 1
nb-auth/src/main/java/com/nb/auth/controller/vo/AccountInfoVO.java

@@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import javax.validation.constraints.Size;
 import java.io.Serializable;
+import java.util.Map;
 
 /**
  * 账户信息VO
@@ -62,5 +63,5 @@ public class AccountInfoVO<T> implements Serializable {
 
 
     @ApiModelProperty("扩展字段")
-    private T extendFields;
+    private Map<String,Object> extendFields;
 }

+ 6 - 1
nb-service-api/app-assistant-api/src/main/java/com/nb/app/assistant/api/entity/AssistantEvalEntity.java

@@ -37,6 +37,11 @@ public class AssistantEvalEntity extends GenericEntity<String> {
     @JsonIgnoreProperties(allowSetters = true)
     private String clinicId;
 
+    @ApiModelProperty(value = "病人id",required = true)
+    @NotNull(message = "病人id不能为空")
+    @JsonIgnoreProperties(allowSetters = true)
+    private String patientId;
+    
     @ApiModelProperty(value = "评价时间",required = true)
     @NotNull(message = "评价时间不能为空")
     private Date evaluateTime;
@@ -45,7 +50,7 @@ public class AssistantEvalEntity extends GenericEntity<String> {
     @NotNull(message = "评价人Id 不能为空")
     private String evaluator;
 
-    @ApiModelProperty(value = "评价人(使用userId)",required = true)
+    @ApiModelProperty(value = "评价人(使用nickName)",required = true)
     @NotNull(message = "评价人姓名 不能为空")
     private String evaluatorName;
 

+ 1 - 0
nb-service-api/app-assistant-api/src/main/java/com/nb/app/assistant/api/feign/result/AssistantUserResult.java

@@ -17,4 +17,5 @@ public class AssistantUserResult {
     private String avatar;
     private String phone;
     private SexEnum sex;
+    private Boolean unEvalNotify;
 }

+ 4 - 0
nb-service/app-assistant/pom.xml

@@ -49,6 +49,10 @@
             <groupId>com.tuoren</groupId>
             <artifactId>web-service-api</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.tuoren</groupId>
+            <artifactId>delay-queue-common</artifactId>
+        </dependency>
     </dependencies>
 
 

+ 53 - 11
nb-service/app-assistant/src/main/java/com/nb/app/assistant/auth/AppAssistantUserOperator.java

@@ -1,12 +1,18 @@
 package com.nb.app.assistant.auth;
 
-import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollectionUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.nb.app.assistant.api.entity.AssistantUserBindEntity;
+import com.nb.app.assistant.api.enums.BindEnum;
 import com.nb.app.assistant.api.feign.result.AssistantUserResult;
-import com.nb.app.assistant.controller.vo.AssistantUserVo;
+import com.nb.app.assistant.constant.UnEvalConstant;
+
+import com.nb.app.assistant.delay.UnEvalNotifyConfig;
 import com.nb.app.assistant.entity.AssistantUserEntity;
+import com.nb.app.assistant.service.LocalAssistantUserBindService;
 import com.nb.app.assistant.service.LocalAssistantUserService;
-import com.nb.app.doctor.api.entity.AppDoctorUserEntity;
+import com.nb.app.assistant.service.dto.AssistUserConfig;
 import com.nb.auth.bean.LoginUser;
 import com.nb.auth.controller.vo.AccountInfoVO;
 import com.nb.auth.controller.vo.RouteItemVO;
@@ -14,13 +20,18 @@ import com.nb.auth.controller.vo.UserInfoVO;
 import com.nb.auth.enums.GrantTypeEnum;
 import com.nb.auth.granter.IAccountOperator;
 import com.nb.auth.utils.SecurityUtil;
+import com.nb.common.queue.delay.manager.DelayMessageManager;
+import com.nb.common.queue.delay.message.DelayMessage;
+import com.nb.common.queue.delay.message.DelayMessageProperties;
+import com.nb.core.Value;
 import com.nb.core.exception.CustomException;
+import com.nb.web.api.feign.IPatientClient;
 import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 
-import java.util.List;
-import java.util.Optional;
-import java.util.Set;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
 
 /**
  * @author lifang
@@ -30,9 +41,13 @@ import java.util.Set;
  * @createTime 2022年08月10日 10:52:00
  */
 @Component
+@Slf4j
 @AllArgsConstructor
-public class AppAssistantUserOperator implements IAccountOperator<AssistantUserResult> {
+public class AppAssistantUserOperator implements IAccountOperator<AssistUserConfig> {
     private final LocalAssistantUserService userService;
+    private final LocalAssistantUserBindService assistantUserBindService;
+    private final DelayMessageManager delayMessageManager;
+    private final IPatientClient patientClient;
     @Override
     public boolean matchGrantType(GrantTypeEnum type) {
         return GrantTypeEnum.APP_ASSISTANT_PASSWORD.equals(type)
@@ -61,25 +76,52 @@ public class AppAssistantUserOperator implements IAccountOperator<AssistantUserR
     }
 
     @Override
-    public AccountInfoVO<AssistantUserResult> getAccountInfo() {
+    public AccountInfoVO<AssistUserConfig> getAccountInfo() {
         AssistantUserResult user = userService.getById(SecurityUtil.getStpLogic().getLoginIdAsString());
-        AccountInfoVO<AssistantUserResult> result = new AccountInfoVO();
+        AccountInfoVO<AssistUserConfig> result = new AccountInfoVO();
         result.setAvatar(user.getAvatar());
         result.setRealName(user.getNickname());
         result.setSex(user.getSex());
+        Map<String, Object> map = new HashMap<>();
+        map.put("unEvalNotify",user.getUnEvalNotify());
+        result.setExtendFields(map);
         return result;
     }
 
 
     @Override
-    public void saveAccountInfo(AccountInfoVO<AssistantUserResult> req) {
+    public void saveAccountInfo(AccountInfoVO<AssistUserConfig> req) {
         LoginUser<String> loginUser = SecurityUtil.getLoginUser();
         AssistantUserEntity source = new AssistantUserEntity();
         source.setId(loginUser.getId());
         source.setAvatar(req.getAvatar());
         source.setSex(req.getSex());
         source.setNickname(req.getRealName());
-        userService.updateById(source);
+        if(req.getExtendFields()!=null){
+            source.setUnEvalNotify(Value.simple(req.getExtendFields().get("unEvalNotify")).asBoolean());
+        }
+        boolean result = userService.updateById(source);
+        if(result&&Boolean.TRUE.equals(source.getUnEvalNotify())){
+            log.info("用户{}更新信息成功,并开启24小时未评通知服务");
+            List<AssistantUserBindEntity> assistantUserBinds = assistantUserBindService.list(new QueryWrapper<AssistantUserBindEntity>()
+                    .lambda()
+                    .eq(AssistantUserBindEntity::getAssistId, source.getId())
+                    .eq(AssistantUserBindEntity::getStatus, BindEnum.SUCCESS));
+            if (CollectionUtil.isNotEmpty(assistantUserBinds)) {
+                assistantUserBinds.parallelStream()
+                        .forEach(userBind->{
+                            DelayMessage delayMessage = new DelayMessage(
+                                    Value.simple(
+                                            UnEvalNotifyConfig.of(userBind.getAssistId(),
+                                                    patientClient.getClinicId(userBind.getPatientId()),
+                                                    userBind.getPatientId())),
+                                    UnEvalConstant.DELAY_ID,
+                                    DelayMessageProperties.of(TimeUnit.HOURS, 24));
+                            delayMessageManager.add(delayMessage);
+                        });
+            }
+
+        }
     }
 
     @Override

+ 2 - 2
nb-service/app-assistant/src/main/java/com/nb/app/assistant/constant/StpConstant.java → nb-service/app-assistant/src/main/java/com/nb/app/assistant/constant/UnEvalConstant.java

@@ -7,6 +7,6 @@ package com.nb.app.assistant.constant;
  * @Description TODO
  * @createTime 2022年08月09日 22:00:00
  */
-public class StpConstant {
-    public static final String STP_TYPE="assistant";
+public class UnEvalConstant {
+    public static final String DELAY_ID="unEval";
 }

+ 26 - 0
nb-service/app-assistant/src/main/java/com/nb/app/assistant/delay/UnEvalNotifyConfig.java

@@ -0,0 +1,26 @@
+package com.nb.app.assistant.delay;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName UnEvalNotifyConfig.java
+ * @Description TODO
+ * @createTime 2022年09月08日 14:37:00
+ */
+@Data
+@AllArgsConstructor(staticName = "of")
+public class UnEvalNotifyConfig implements Serializable {
+    @ApiModelProperty("看护人id")
+    private String assistId;
+    @ApiModelProperty("临床id")
+    private String clinicId;
+    @ApiModelProperty("病人id")
+    private String patientId;
+}

+ 102 - 0
nb-service/app-assistant/src/main/java/com/nb/app/assistant/delay/UnEvalNotifyDelayMessageHandler.java

@@ -0,0 +1,102 @@
+package com.nb.app.assistant.delay;
+
+import cn.hutool.core.date.DateUnit;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.extra.spring.SpringUtil;
+import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.nb.app.assistant.api.entity.AssistantEvalEntity;
+import com.nb.app.assistant.api.entity.AssistantUserBindEntity;
+import com.nb.app.assistant.api.enums.BindEnum;
+import com.nb.app.assistant.constant.UnEvalConstant;
+import com.nb.app.assistant.entity.AssistantUserEntity;
+import com.nb.app.assistant.service.LocalAssistantEvalService;
+import com.nb.app.assistant.service.LocalAssistantUserBindService;
+import com.nb.app.assistant.service.LocalAssistantUserService;
+import com.nb.app.msg.bean.MsgBean;
+import com.nb.app.msg.enums.MsgEnum;
+import com.nb.app.msg.event.SaveMsgEvent;
+import com.nb.common.queue.delay.handler.DelayMessageHandler;
+import com.nb.common.queue.delay.message.DelayMessage;
+import com.nb.core.Value;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.Date;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName UnEvalNotifyDelay.java
+ * @Description TODO
+ * @createTime 2022年09月08日 14:36:00
+ */
+@Configuration
+@AllArgsConstructor
+@Slf4j
+public class UnEvalNotifyDelayMessageHandler implements DelayMessageHandler {
+    private final LocalAssistantUserService assistantUserService;
+    private final LocalAssistantEvalService evalService;
+    private final LocalAssistantUserBindService userBindService;
+    @Override
+    public String getId() {
+        return UnEvalConstant.DELAY_ID;
+    }
+
+    @Override
+    public String description() {
+        return "24未评价提醒";
+    }
+
+    @Override
+    public void handle(DelayMessage message) {
+        log.info("24小时未评提醒处理,{}", JSONUtil.toJsonStr(message));
+        Value body = message.getBody();
+        UnEvalNotifyConfig unEvalNotify = body.as(UnEvalNotifyConfig.class);
+        AssistantUserEntity assistantUser = assistantUserService.getOne(new QueryWrapper<AssistantUserEntity>()
+                .lambda()
+                .eq(AssistantUserEntity::getId, unEvalNotify.getAssistId())
+                .last("limit 1"));
+        //24小时未评提醒
+        if(assistantUser.getUnEvalNotify()){
+            AssistantEvalEntity lastEval = evalService.getLastEval(unEvalNotify.getClinicId());
+            if(lastEval==null){
+                log.info("尚未评价此次临床,发送24小时未评消息");
+                //发送消息
+                sendUnEvalMsg(unEvalNotify.getAssistId(),unEvalNotify.getPatientId());
+            }else {
+                Date now = new Date();
+                if (DateUtil.between(lastEval.getEvaluateTime(),now, DateUnit.HOUR)>=24) {
+                    //发送消息
+                    log.info("据上次临床评价时间{}已超过24小时,发送24小时未评消息",lastEval.getEvaluateTime());
+                    sendUnEvalMsg(unEvalNotify.getAssistId(),unEvalNotify.getPatientId());
+                }
+            }
+        }
+    }
+
+    private void sendUnEvalMsg(String assistId,String patientId){
+        AssistantUserBindEntity userBind = userBindService.getOne(new QueryWrapper<AssistantUserBindEntity>()
+                .lambda()
+                .eq(AssistantUserBindEntity::getAssistId, assistId)
+                .eq(AssistantUserBindEntity::getPatientId, patientId)
+                .eq(AssistantUserBindEntity::getStatus, BindEnum.SUCCESS)
+                .last("limit 1"));
+        if(userBind==null){
+            log.info("看护人{}与病人未形成成功的看护绑定关系,发送24小时未评消息失败",assistId,patientId);
+            return;
+        }
+        SpringUtil.publishEvent(new SaveMsgEvent(this,
+                MsgBean.builder()
+                        .msgType(MsgEnum.ASSIST_EVAL)
+                        .patientId(userBind.getPatientId())
+                        .patientAge(userBind.getPatientAge())
+                        .patientCode(userBind.getPatientCode())
+                        .patientName(userBind.getPatientName())
+                        .patientSex(userBind.getPatientSex())
+                        .sys(true)
+                        .receiverId(assistId).build()
+        ));
+    }
+}

+ 1 - 1
nb-service/app-assistant/src/main/java/com/nb/app/assistant/entity/AssistantUserEntity.java

@@ -46,5 +46,5 @@ public class AssistantUserEntity extends GenericEntity<String> {
     private SexEnum sex;
 
     @ApiModelProperty(value = "24小时未评价通知")
-    private boolean unEvalNotify;
+    private Boolean unEvalNotify;
 }

+ 31 - 6
nb-service/app-assistant/src/main/java/com/nb/app/assistant/service/LocalAssistantEvalService.java

@@ -4,11 +4,21 @@ import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.nb.app.assistant.api.entity.AssistantEvalEntity;
 import com.nb.app.assistant.api.feign.IAssistantEvalClient;
+import com.nb.app.assistant.constant.UnEvalConstant;
+import com.nb.app.assistant.delay.UnEvalNotifyConfig;
 import com.nb.app.assistant.mapper.AssistantEvalMapper;
 import com.nb.common.crud.BaseService;
+import com.nb.common.queue.delay.manager.DelayMessageManager;
+import com.nb.common.queue.delay.message.DelayMessage;
+import com.nb.common.queue.delay.message.DelayMessageProperties;
+import com.nb.core.Value;
+import lombok.AllArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Component;
 
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 
 /**
  * @author lifang
@@ -20,7 +30,9 @@ import java.util.List;
 @Component
 public class LocalAssistantEvalService extends BaseService<AssistantEvalMapper, AssistantEvalEntity,String> implements IAssistantEvalClient {
 
-
+    @Autowired
+    @Lazy
+    private DelayMessageManager delayMessageManager;
     @Override
     public void validateBeforeSave(AssistantEvalEntity entity) {
 
@@ -36,18 +48,31 @@ public class LocalAssistantEvalService extends BaseService<AssistantEvalMapper,
 
     }
 
+    @Override
+    public void postSave(AssistantEvalEntity entity) {
+        //24h未评价通知
+        DelayMessage delayMessage = new DelayMessage(
+                Value.simple(
+                        UnEvalNotifyConfig.of(entity.getCreateBy(),
+                                entity.getClinicId(),
+                                entity.getPatientId())),
+                UnEvalConstant.DELAY_ID,
+                DelayMessageProperties.of(TimeUnit.HOURS, 24));
+        delayMessageManager.add(delayMessage);
+    }
+
     @Override
     public List<AssistantEvalEntity> allList(String clinicId) {
         return this.list(new QueryWrapper<AssistantEvalEntity>().lambda()
-        .eq(StrUtil.isNotEmpty(clinicId),AssistantEvalEntity::getClinicId,clinicId));
+                .eq(StrUtil.isNotEmpty(clinicId),AssistantEvalEntity::getClinicId,clinicId));
     }
 
     @Override
     public AssistantEvalEntity getLastEval(String clinicId) {
         return this.getOne(new QueryWrapper<AssistantEvalEntity>()
-        .lambda()
-        .eq(AssistantEvalEntity::getClinicId,clinicId)
-        .orderByDesc(AssistantEvalEntity::getEvaluateTime)
-        .last("limit 1"));
+                .lambda()
+                .eq(AssistantEvalEntity::getClinicId,clinicId)
+                .orderByDesc(AssistantEvalEntity::getEvaluateTime)
+                .last("limit 1"));
     }
 }

+ 22 - 1
nb-service/app-assistant/src/main/java/com/nb/app/assistant/service/LocalAssistantUserBindService.java

@@ -14,6 +14,8 @@ import com.nb.app.assistant.api.feign.result.AssistantUserResult;
 import com.nb.app.assistant.api.enums.ApplyEnum;
 import com.nb.app.assistant.api.enums.BindEnum;
 import com.nb.app.assistant.api.feign.result.ContactQuery;
+import com.nb.app.assistant.constant.UnEvalConstant;
+import com.nb.app.assistant.delay.UnEvalNotifyConfig;
 import com.nb.app.assistant.mapper.AssistantUserBindMapper;
 import com.nb.app.assistant.service.dto.AssistPatientResult;
 import com.nb.app.msg.bean.MsgBean;
@@ -21,14 +23,20 @@ import com.nb.app.msg.enums.MsgEnum;
 import com.nb.app.msg.event.SaveMsgEvent;
 import com.nb.auth.utils.SecurityUtil;
 import com.nb.common.crud.BaseService;
+import com.nb.common.queue.delay.manager.DelayMessageManager;
+import com.nb.common.queue.delay.message.DelayMessage;
+import com.nb.common.queue.delay.message.DelayMessageProperties;
+import com.nb.core.Value;
 import com.nb.core.exception.CustomException;
 import com.nb.web.api.feign.IPatientClient;
+import org.redisson.RedissonDelayedQueue;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 
 /**
  * @author lifang
@@ -48,6 +56,10 @@ public class LocalAssistantUserBindService extends BaseService<AssistantUserBind
     @Lazy
     private IPatientClient patientClient;
 
+    @Autowired
+    @Lazy
+    private DelayMessageManager delayMessageManager;
+
     @Override
     public void validateBeforeSave(AssistantUserBindEntity entity) {
 
@@ -211,8 +223,17 @@ public class LocalAssistantUserBindService extends BaseService<AssistantUserBind
         ));
 
         if(Boolean.TRUE.equals(source.getAgree())){
-            //24h未评价通知 todo
+            //24h未评价通知
+            DelayMessage delayMessage = new DelayMessage(
+                    Value.simple(
+                            UnEvalNotifyConfig.of(userBind.getAssistId(),
+                                    patientClient.getClinicId(userBind.getPatientId()),
+                                    userBind.getPatientId())),
+                    UnEvalConstant.DELAY_ID,
+                    DelayMessageProperties.of(TimeUnit.HOURS, 24));
+            delayMessageManager.add(delayMessage);
         }
+
         //查询是否存在默认看护
         return result;
     }

+ 15 - 0
nb-service/app-assistant/src/main/java/com/nb/app/assistant/service/dto/AssistUserConfig.java

@@ -0,0 +1,15 @@
+package com.nb.app.assistant.service.dto;
+
+import lombok.Data;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName AssistUserConfig.java
+ * @Description 账户配置
+ * @createTime 2022年09月08日 15:20:00
+ */
+@Data
+public class AssistUserConfig {
+    private Boolean unEvalNotify;
+}

+ 4 - 2
nb-service/app-doctor/src/main/java/com/nb/app/doctor/auth/AppDoctorUserAccountOperator.java

@@ -1,6 +1,7 @@
 package com.nb.app.doctor.auth;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.nb.app.doctor.controller.vo.DoctorUserVo;
 import com.nb.app.doctor.api.entity.AppDoctorUserEntity;
@@ -66,7 +67,8 @@ public class AppDoctorUserAccountOperator implements IAccountOperator<DoctorUser
         DoctorUserVo vo = BeanUtil.copyProperties(appDoctorUser, DoctorUserVo.class);
 
         AccountInfoVO<DoctorUserVo> result = new AccountInfoVO();
-        result.setExtendFields(Optional.ofNullable(vo).orElse(new DoctorUserVo()));
+        result.setExtendFields(JSONUtil.parseObj(Optional.ofNullable(vo).orElse(new DoctorUserVo()))
+        );
         result.setAvatar(appDoctorUser.getAvatar());
         result.setRealName(appDoctorUser.getRealName());
         result.setSex(appDoctorUser.getSex());
@@ -76,7 +78,7 @@ public class AppDoctorUserAccountOperator implements IAccountOperator<DoctorUser
     @Override
     public void saveAccountInfo(AccountInfoVO<DoctorUserVo> req) {
         LoginUser<String> loginUser = SecurityUtil.getLoginUser();
-        DoctorUserVo extendFields = req.getExtendFields();
+        DoctorUserVo extendFields = JSONUtil.parse(req.getExtendFields()).toBean(DoctorUserVo.class);
         AppDoctorUserEntity source = new AppDoctorUserEntity();
         source.setId(loginUser.getId());
         source.setAvatar(req.getAvatar());