Browse Source

完成系统升级以及服务器通知的功能了

xiaochan 2 years ago
parent
commit
afd4d0cf1d

+ 0 - 28
src/main/java/thyyxxk/webserver/config/StartAutoRequestService.java

@@ -1,28 +0,0 @@
-package thyyxxk.webserver.config;
-
-
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.boot.CommandLineRunner;
-import org.springframework.stereotype.Component;
-import thyyxxk.webserver.service.externalhttp.StartServer;
-
-@Component
-@Slf4j
-public class StartAutoRequestService implements CommandLineRunner {
-
-    private final StartServer server;
-
-    public StartAutoRequestService(StartServer server) {
-        this.server = server;
-    }
-
-    @Override
-    public void run(String... args) throws Exception {
-        try {
-            server.startServer();
-        } catch (Exception ignored) {
-        } finally {
-            log.info("软件启动");
-        }
-    }
-}

+ 4 - 0
src/main/java/thyyxxk/webserver/config/auth/AuthenticationInterceptor.java

@@ -13,6 +13,7 @@ import org.springframework.web.servlet.HandlerInterceptor;
 import thyyxxk.webserver.config.exception.BizException;
 import thyyxxk.webserver.config.exception.ExceptionEnum;
 import thyyxxk.webserver.constants.Message;
+import thyyxxk.webserver.controller.ShutDownController;
 import thyyxxk.webserver.entity.login.UserInfo;
 import thyyxxk.webserver.service.LoginService;
 import thyyxxk.webserver.service.TokenService;
@@ -40,6 +41,9 @@ public class AuthenticationInterceptor implements HandlerInterceptor {
 
     @Override
     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object object) {
+        if (ShutDownController.getServerIsUpdating()) {
+            throw new BizException(ExceptionEnum.SERVER_IS_UPDATE, "服务器正在升级。");
+        }
         HandlerMethod handlerMethod;
         try {
             handlerMethod = (HandlerMethod) object;

+ 9 - 2
src/main/java/thyyxxk/webserver/config/exception/ExceptionEnum.java

@@ -5,8 +5,13 @@ package thyyxxk.webserver.config.exception;
  */
 
 public enum ExceptionEnum {
+    /**
+     * 成功
+     */
     SUCCESS(200, "成功。"),
-    // 提示成功
+    /**
+     * 提示成功
+     */
     SUCCESS_AND_NOTIFICATION(201, "操作成功"),
 
     // 以下是需要消息提示的错误
@@ -30,7 +35,9 @@ public enum ExceptionEnum {
     INVALID_PASSWORD(3003, "密码错误,请重新登录!"),
     BAD_REQUEST(3004, "无法转换请求,请用正确的方式访问!"),
     // 以下是不需要提示的错误
-    SLIGHTLY_ERROR(4001, "无需提示的返回。");
+    SLIGHTLY_ERROR(4001, "无需提示的返回。"),
+
+    SERVER_IS_UPDATE(5001, "服务器正在升级,请稍后在试一下。");
 
     private final int code;
     private String message;

+ 56 - 0
src/main/java/thyyxxk/webserver/config/springboot/ServerStartupAndShutdown.java

@@ -0,0 +1,56 @@
+package thyyxxk.webserver.config.springboot;
+
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+import thyyxxk.webserver.service.PublicServer;
+import thyyxxk.webserver.service.externalhttp.ServerSrvc;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+
+@Slf4j
+@Component
+public class ServerStartupAndShutdown {
+
+    private final ServerSrvc server;
+
+    private final PublicServer publicServer;
+
+    public ServerStartupAndShutdown(ServerSrvc server, PublicServer publicServer) {
+        this.server = server;
+        this.publicServer = publicServer;
+    }
+
+
+    /**
+     * 每 30 分钟执行一次,发送消息
+     */
+    @Scheduled(cron = "0 0/30 * * * ?")
+    public void sendAMessage() {
+        publicServer.sendSystemAnnouncement();
+    }
+
+    @PostConstruct
+    public void run() {
+        try {
+            server.startServer();
+        } catch (Exception ignored) {
+        } finally {
+            log.info("软件启动");
+        }
+    }
+
+    @PreDestroy
+    public void showdown() {
+        try {
+            server.endServer();
+        } catch (Exception ignored) {
+        } finally {
+            log.info("软件关闭");
+        }
+    }
+
+
+}

+ 7 - 1
src/main/java/thyyxxk/webserver/constants/Message.java

@@ -18,7 +18,13 @@ public enum Message {
     /**
      * 系统消息
      */
-    SYSTEM_NOTIFICATION("systemNotification");
+    SYSTEM_NOTIFICATION("systemNotification"),
+
+    SERVER_UPDATE_MESSAGE("serverUpdateMessage"),
+
+    SYSTEM_ANNOUNCEMENT("systemAnnouncement"),
+
+    SCROLLING_MESSAGES("scrollingMessages");
 
     private final String name;
 

+ 74 - 8
src/main/java/thyyxxk/webserver/controller/ShutDownController.java

@@ -6,38 +6,104 @@ import org.springframework.beans.BeansException;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.ApplicationContextAware;
 import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RestController;
 import thyyxxk.webserver.config.auth.PassToken;
 import thyyxxk.webserver.config.exception.ExceptionEnum;
 import thyyxxk.webserver.entity.ResultVo;
+import thyyxxk.webserver.entity.settings.notification.SendMessageParam;
+import thyyxxk.webserver.service.PublicServer;
+import thyyxxk.webserver.service.redislike.RedisLikeService;
 import thyyxxk.webserver.utils.ResultVoUtil;
 
 import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
 
 @Slf4j
 @RestController
 public class ShutDownController implements ApplicationContextAware {
 
+    private final PublicServer publicServer;
+
+    private final RedisLikeService redisLikeService;
+
+    private static Boolean serverIsUpdating = false;
+
+    private final String LOCALHOST = "0:0:0:0:0:0:0:1";
+
+    public ShutDownController(PublicServer publicServer, RedisLikeService redisLikeService) {
+        this.publicServer = publicServer;
+        this.redisLikeService = redisLikeService;
+    }
+
+    class Showdown extends Thread {
+        @Override
+        public void run() {
+            try {
+                Showdown.sleep(1000 * 10);
+            } catch (InterruptedException e) {
+                throw new RuntimeException(e);
+            }
+            ConfigurableApplicationContext ctx = (ConfigurableApplicationContext) context;
+            ctx.close();
+        }
+    }
+
     private ApplicationContext context;
 
     @PostMapping("/shutDownContext")
     @PassToken
     public ResultVo<String> shutDownContext(HttpServletRequest request) {
-        log.info("请求来源:{}", request.getRemoteAddr());
-        String localhost = "0:0:0:0:0:0:0:1";
-        if (localhost.equals(request.getRemoteAddr())) {
-            log.info("执行关机");
-            ConfigurableApplicationContext ctx = (ConfigurableApplicationContext) context;
-            ctx.close();
+        if (LOCALHOST.equals(request.getRemoteAddr())) {
+            serverIsUpdating = true;
+            new Showdown().start();
+            return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_NOTIFICATION);
         } else {
-            return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "你没有权限访问");
+            return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "无法调用");
         }
-        return ResultVoUtil.success(ExceptionEnum.SUCCESS, "关闭");
     }
 
+    public static Boolean getServerIsUpdating() {
+        return serverIsUpdating;
+    }
+
+
     @Override
     public void setApplicationContext(@NotNull ApplicationContext applicationContext) throws BeansException {
         context = applicationContext;
     }
+
+    @GetMapping("sendSystemUpdatesMessage")
+    public ResultVo<String> sendSystemUpdatesMessage(String message) {
+        redisLikeService.setMessage(RedisLikeService.SYSTEM_UPDATES_MESSAGE, message);
+        publicServer.sendSystemAnnouncement();
+        return ResultVoUtil.success();
+    }
+
+    @GetMapping("sendScrollingMessages")
+    public ResultVo<String> sendScrollingMessages(String message) {
+        redisLikeService.setMessage(RedisLikeService.SCROLLING_MESSAGES, message);
+        publicServer.sendSystemAnnouncement();
+        return ResultVoUtil.success();
+    }
+
+    @GetMapping("/getSystemAnnouncement")
+    public ResultVo<Map<String, String>> getSystemAnnouncement() {
+        return ResultVoUtil.success(redisLikeService.getMessage());
+    }
+
+
+    @PostMapping("/updateCompleteMessage")
+    @PassToken
+    public ResultVo<String> updateCompleteMessage(HttpServletRequest request, @RequestBody SendMessageParam param) {
+        if (!LOCALHOST.equals(request.getRemoteAddr())) {
+            return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "无法访问");
+        }
+        publicServer.sendMessage(param);
+        return ResultVoUtil.success();
+    }
+
+
 }

+ 5 - 16
src/main/java/thyyxxk/webserver/controller/settings/Notification.java

@@ -1,18 +1,14 @@
 package thyyxxk.webserver.controller.settings;
 
-import com.alibaba.fastjson.JSONObject;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
-import thyyxxk.webserver.constants.Message;
 import thyyxxk.webserver.dao.his.settings.SettingsDao;
 import thyyxxk.webserver.entity.ResultVo;
 import thyyxxk.webserver.entity.settings.notification.SendMessageParam;
+import thyyxxk.webserver.service.PublicServer;
 import thyyxxk.webserver.utils.ResultVoUtil;
-import thyyxxk.webserver.utils.SnowFlakeId;
-import thyyxxk.webserver.utils.SocketMsg;
-import thyyxxk.webserver.utils.TokenUtil;
 import thyyxxk.webserver.websocket.WebSocketServer;
 
 @Slf4j
@@ -20,10 +16,12 @@ import thyyxxk.webserver.websocket.WebSocketServer;
 @RequestMapping("/notification")
 public class Notification {
     private final SettingsDao dao;
+    private final PublicServer publicServer;
 
     @Autowired
-    public Notification(SettingsDao dao) {
+    public Notification(SettingsDao dao, PublicServer publicServer) {
         this.dao = dao;
+        this.publicServer = publicServer;
     }
 
     @GetMapping("/getOnlineCount")
@@ -33,16 +31,7 @@ public class Notification {
 
     @PostMapping("/sendMessageToAll")
     public ResultVo<String> sendMessage(@RequestBody @Validated SendMessageParam param) {
-        dao.insertNewMessage(SnowFlakeId.instance().nextId(), param.getMessage());
-        JSONObject obj = new JSONObject();
-        obj.put("message", param.getMessage());
-        if (null != param.getRefreshDelay()) {
-            int delay = param.getRefreshDelay() * 1000;
-            obj.put("refreshDelay", delay);
-        }
-        WebSocketServer.sendMessageToAll(SocketMsg.socketVo(Message.SYSTEM_NOTIFICATION, obj));
-        log.info("发送全体消息 => 操作员:{},消息体:{}", TokenUtil.getTokenUserId(), obj);
-        return ResultVoUtil.success();
+        return publicServer.sendMessage(param);
     }
 
 }

+ 27 - 4
src/main/java/thyyxxk/webserver/service/PublicServer.java

@@ -5,7 +5,6 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.dynamic.datasource.annotation.DS;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.catalina.User;
 import org.apache.commons.collections4.ListUtils;
 import org.jetbrains.annotations.NotNull;
 import org.springframework.scheduling.annotation.Async;
@@ -19,6 +18,7 @@ import thyyxxk.webserver.constants.RestrictedDrugLevels;
 import thyyxxk.webserver.constants.Ysjb;
 import thyyxxk.webserver.dao.his.PublicDao;
 import thyyxxk.webserver.dao.his.inpatient.TransferInOfExpensesDao;
+import thyyxxk.webserver.dao.his.settings.SettingsDao;
 import thyyxxk.webserver.entity.ResultVo;
 import thyyxxk.webserver.entity.casefrontsheet.YshHzRecord;
 import thyyxxk.webserver.entity.datamodify.GetDropdownBox;
@@ -26,6 +26,7 @@ import thyyxxk.webserver.entity.datamodify.ZyDetailCharge;
 import thyyxxk.webserver.entity.dictionary.PureCodeName;
 import thyyxxk.webserver.entity.login.UserInfo;
 import thyyxxk.webserver.entity.publicapi.ZkList;
+import thyyxxk.webserver.entity.settings.notification.SendMessageParam;
 import thyyxxk.webserver.entity.socketmessage.SocketMessage;
 import thyyxxk.webserver.entity.inpatient.ZyActpatient;
 import thyyxxk.webserver.entity.zhuyuanyisheng.PatientAllergenInfo;
@@ -56,16 +57,17 @@ import java.util.stream.Stream;
 @Slf4j
 public class PublicServer {
     private final PublicDao dao;
-
     private final TransferInOfExpensesDao transferInOfExpensesDao;
-
     private final RedisLikeService redisLikeService;
 
+    private final SettingsDao settingsDao;
+
 
-    public PublicServer(PublicDao dao, TransferInOfExpensesDao transferInOfExpensesDao, RedisLikeService redisLikeService) {
+    public PublicServer(PublicDao dao, TransferInOfExpensesDao transferInOfExpensesDao, RedisLikeService redisLikeService, SettingsDao settingsDao) {
         this.dao = dao;
         this.transferInOfExpensesDao = transferInOfExpensesDao;
         this.redisLikeService = redisLikeService;
+        this.settingsDao = settingsDao;
     }
 
     /**
@@ -706,6 +708,27 @@ public class PublicServer {
         return code;
     }
 
+    public ResultVo<String> sendMessage(SendMessageParam param) {
+        settingsDao.insertNewMessage(SnowFlakeId.instance().nextId(), param.getMessage());
+        JSONObject obj = new JSONObject();
+        obj.put("message", param.getMessage());
+        if (null != param.getRefreshDelay()) {
+            int delay = param.getRefreshDelay() * 1000;
+            obj.put("refreshDelay", delay);
+        }
+        WebSocketServer.sendMessageToAll(SocketMsg.socketVo(Message.SYSTEM_NOTIFICATION, obj));
+        log.info("发送全体消息 => 操作员:{},消息体:{}", TokenUtil.getTokenUserId(), obj);
+        return ResultVoUtil.success();
+    }
+
+
+    public void sendSystemAnnouncement() {
+        Map<String, String> map = redisLikeService.getMessage();
+        JSONObject obj = new JSONObject();
+        obj.put("data", map);
+        WebSocketServer.sendMessageToAll(SocketMsg.socketVo(Message.SYSTEM_ANNOUNCEMENT, obj));
+    }
+
 
 }
 

+ 5 - 1
src/main/java/thyyxxk/webserver/service/externalhttp/StartServer.java → src/main/java/thyyxxk/webserver/service/externalhttp/ServerSrvc.java

@@ -2,8 +2,12 @@ package thyyxxk.webserver.service.externalhttp;
 
 import com.dtflys.forest.annotation.Get;
 
-public interface StartServer {
+public interface ServerSrvc {
 
     @Get("http://localhost:9281/startServer?name=web-server")
     void startServer();
+
+
+    @Get("http://localhost:9281/endServer?name=web-server")
+    void endServer();
 }

+ 11 - 8
src/main/java/thyyxxk/webserver/service/medicalinsurance/SetlListUpldService.java

@@ -17,10 +17,10 @@ import thyyxxk.webserver.config.exception.ExceptionEnum;
 import thyyxxk.webserver.constants.GetDateFormat;
 import thyyxxk.webserver.constants.Message;
 import thyyxxk.webserver.constants.sidicts.*;
+import thyyxxk.webserver.dao.his.inpatient.DismissDao;
 import thyyxxk.webserver.dao.his.medicalinsurance.SiLogDao;
 import thyyxxk.webserver.dao.his.medicalinsurance.SiQueryDao;
 import thyyxxk.webserver.dao.his.medicalinsurance.UpIdCollectionDao;
-import thyyxxk.webserver.dao.his.inpatient.DismissDao;
 import thyyxxk.webserver.entity.ResultVo;
 import thyyxxk.webserver.entity.datamodify.GetDropdownBox;
 import thyyxxk.webserver.entity.datamodify.TYbSetModifyTime;
@@ -831,7 +831,6 @@ public class SetlListUpldService {
         int currentPage = (int) Math.ceil(param.getTotal() / (double) 100);
         List<SiSetlinfoTemp> list = new ArrayList<>();
         JSONObject obj = new JSONObject();
-        obj.put("name", "jdtMessage");
         obj.put("jdtType", "download");
         obj.put("jdtTitle", "导出Excel");
         obj.put("total", param.getTotal());
@@ -839,9 +838,12 @@ public class SetlListUpldService {
             param.setCurrentPage(i + 1);
             list.addAll(huoQuJieSuanRenYuan(param).getData().getRecords());
             obj.put("index", list.size());
-            WebSocketServer.sendMessageByUserCode(TokenUtil.getTokenUserId(), obj.toString());
+            WebSocketServer.sendMessageByUserCode(TokenUtil.getTokenUserId(), SocketMsg.socketVo(Message.JDT_MESSAGE, obj));
         }
-        String[] title = {"姓名", "审核状态", "申报类型", "出院科室", "住院号/门诊号", "性别", "住院天数", "诊断编码", "诊断名称", "治疗方式", "总费用", "报销金额", "险种类型", "人员类别", "结算时间", "医疗类别", "清算机构", "管床医生", "转科室", "转科次数", "申请备注"};
+        String[] title = {"姓名", "审核状态", "申报类型", "出院科室", "住院号/门诊号", "性别",
+                "住院天数", "诊断编码", "诊断名称", "治疗方式", "总费用", "报销金额",
+                "险种类型", "人员类别", "结算时间", "医疗类别", "清算机构", "参保地",
+                "管床医生", "转科室", "转科次数", "申请备注"};
         String[][] content = new String[list.size()][];
         for (int i = 0; i < list.size(); i++) {
             content[i] = new String[title.length];
@@ -863,10 +865,11 @@ public class SetlListUpldService {
             content[i][14] = DateUtil.formatDatetime(pojo.getSetlTime(), GetDateFormat.DATE_TIME);
             content[i][15] = pojo.getMedTypeName();
             content[i][16] = pojo.getClrOptinsName();
-            content[i][17] = pojo.getReferPhysicianName();
-            content[i][18] = pojo.getZhuanKeName() == null ? "" : pojo.getZhuanKeName().toString();
-            content[i][19] = pojo.getZhuanKeAmount() == null ? "" : pojo.getZhuanKeAmount().toString();
-            content[i][20] = pojo.getReqRemark();
+            content[i][17] = pojo.getInsuplcAdmdvsName();
+            content[i][18] = pojo.getReferPhysicianName();
+            content[i][19] = pojo.getZhuanKeName() == null ? "" : pojo.getZhuanKeName().toString();
+            content[i][20] = pojo.getZhuanKeAmount() == null ? "" : pojo.getZhuanKeAmount().toString();
+            content[i][21] = pojo.getReqRemark();
         }
         //传三个参数 一个是 固定的 response ,excel的头部信息,excel的内容
         ExcelUtil.exportExcel(response, title, content);

+ 20 - 0
src/main/java/thyyxxk/webserver/service/redislike/RedisLikeService.java

@@ -12,6 +12,10 @@ import java.util.Map;
 
 @Service
 public class RedisLikeService {
+
+    public final static String SCROLLING_MESSAGES = "scrollingMessages";
+    public final static String SYSTEM_UPDATES_MESSAGE = "systemUpdatesMessage";
+
     private final static Map<String, String> EMPLOYEE_NAME_MAP = new HashMap<>();
     private final static Map<String, String> DEPT_NAME_MAP = new HashMap<>();
     private final static Map<String, String> DEPT_AND_EMPLOYEE_NAME = new HashMap<>();
@@ -23,6 +27,22 @@ public class RedisLikeService {
     private final static Map<String, UserInfo> USER_MAP = new HashMap<>();
     private final RedisLikeDao dao;
 
+    private final static Map<String, String> MESSAGE = new HashMap<>(2);
+
+    public void setMessage(String key, String value) {
+        MESSAGE.put(key, value);
+    }
+
+    public Map<String, String> getMessage() {
+        return MESSAGE;
+    }
+
+
+//    public String getMessage(String key) {
+//        return MESSAGE.get(key);
+//    }
+
+
     public RedisLikeService(RedisLikeDao dao) {
         this.dao = dao;
     }