From a16d8342f0aa08d71d50d7edc51c3d921026156a Mon Sep 17 00:00:00 2001
From: jiangs <373297395@qq.com>
Date: Fri, 28 Aug 2026 16:37:01 +0800
Subject: [PATCH] =?UTF-8?q?=E6=B6=88=E6=81=AF=E7=B3=BB=E7=BB=9F=EF=BC=8C?=
=?UTF-8?q?=E4=B8=B4=E5=BA=8A=E5=8F=91=E8=A1=80=E9=80=80=E8=A1=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
blood_bus/pom.xml | 6 +
.../bus/mapper/XkBackinDetailMapper.java | 9 +
.../bus/mapper/XkBackinMainMapper.java | 10 +
.../czblood/bus/mapper/XkMsgDetailMapper.java | 8 +
.../czblood/bus/mapper/XkMsgMainMapper.java | 8 +
.../com/czblood/bus/pojo/XkBackinDetail.java | 21 +++
.../com/czblood/bus/pojo/XkBackinMain.java | 37 ++++
.../com/czblood/bus/pojo/XkMsgDetail.java | 21 +++
.../java/com/czblood/bus/pojo/XkMsgMain.java | 45 +++++
.../bus/pojo/websocket/WebSocketParam.java | 25 +++
.../com/czblood/bus/utils/BloodBankUtil.java | 4 +
.../com/czblood/bus/websocket/MsgType.java | 43 +++++
.../bus/websocket/WebSocketServer.java | 171 ++++++++++++++++++
.../com/czblood/bus/websocket/WsMessage.java | 43 +++++
.../resources/mapper/XkBackinDetailMapper.xml | 9 +
.../resources/mapper/XkBackinMainMapper.xml | 17 ++
.../resources/mapper/XkMsgDetailMapper.xml | 20 ++
.../main/resources/mapper/XkMsgMainMapper.xml | 35 ++++
.../controller/XkBackinController.java | 26 +++
.../busBloodbank/service/XkBackinService.java | 7 +
.../service/impl/BloodOutServiceImpl.java | 58 +++++-
.../service/impl/XkBackinServiceImpl.java | 24 +++
.../busBloodbank/utils/BloodOutUtil.java | 12 ++
.../common/utils/file/MimeTypeUtils.java | 5 +-
blood_system/pom.xml | 11 --
.../czblood/system/mapper/SysUserMapper.java | 2 +-
.../system/service/ISysUserService.java | 2 +-
.../service/impl/SysUserServiceImpl.java | 2 +-
.../controller/common/CommonController.java | 9 +
.../system/web/service/SysLoginService.java | 4 +-
.../resources/mapper/system/SysUserMapper.xml | 1 +
sql/updatedb_blood.sql | 12 +-
sql/updatedb_blood_pk.sql | 21 +++
33 files changed, 703 insertions(+), 25 deletions(-)
create mode 100644 blood_bus/src/main/java/com/czblood/bus/mapper/XkBackinDetailMapper.java
create mode 100644 blood_bus/src/main/java/com/czblood/bus/mapper/XkBackinMainMapper.java
create mode 100644 blood_bus/src/main/java/com/czblood/bus/mapper/XkMsgDetailMapper.java
create mode 100644 blood_bus/src/main/java/com/czblood/bus/mapper/XkMsgMainMapper.java
create mode 100644 blood_bus/src/main/java/com/czblood/bus/pojo/XkBackinDetail.java
create mode 100644 blood_bus/src/main/java/com/czblood/bus/pojo/XkBackinMain.java
create mode 100644 blood_bus/src/main/java/com/czblood/bus/pojo/XkMsgDetail.java
create mode 100644 blood_bus/src/main/java/com/czblood/bus/pojo/XkMsgMain.java
create mode 100644 blood_bus/src/main/java/com/czblood/bus/pojo/websocket/WebSocketParam.java
create mode 100644 blood_bus/src/main/java/com/czblood/bus/websocket/MsgType.java
create mode 100644 blood_bus/src/main/java/com/czblood/bus/websocket/WebSocketServer.java
create mode 100644 blood_bus/src/main/java/com/czblood/bus/websocket/WsMessage.java
create mode 100644 blood_bus/src/main/resources/mapper/XkBackinDetailMapper.xml
create mode 100644 blood_bus/src/main/resources/mapper/XkBackinMainMapper.xml
create mode 100644 blood_bus/src/main/resources/mapper/XkMsgDetailMapper.xml
create mode 100644 blood_bus/src/main/resources/mapper/XkMsgMainMapper.xml
create mode 100644 blood_bus_bloodbank/src/main/java/com/czblood/busBloodbank/controller/XkBackinController.java
create mode 100644 blood_bus_bloodbank/src/main/java/com/czblood/busBloodbank/service/XkBackinService.java
create mode 100644 blood_bus_bloodbank/src/main/java/com/czblood/busBloodbank/service/impl/XkBackinServiceImpl.java
diff --git a/blood_bus/pom.xml b/blood_bus/pom.xml
index 8538a61..548be2e 100644
--- a/blood_bus/pom.xml
+++ b/blood_bus/pom.xml
@@ -51,5 +51,11 @@
org.apache.pdfbox
pdfbox
+
+
+
+ org.springframework.boot
+ spring-boot-starter-websocket
+
diff --git a/blood_bus/src/main/java/com/czblood/bus/mapper/XkBackinDetailMapper.java b/blood_bus/src/main/java/com/czblood/bus/mapper/XkBackinDetailMapper.java
new file mode 100644
index 0000000..0604504
--- /dev/null
+++ b/blood_bus/src/main/java/com/czblood/bus/mapper/XkBackinDetailMapper.java
@@ -0,0 +1,9 @@
+package com.czblood.bus.mapper;
+
+import com.czblood.bus.pojo.XkBackinDetail;
+
+import java.util.List;
+
+public interface XkBackinDetailMapper {
+ List queryListByBillNo(String billNo);
+}
diff --git a/blood_bus/src/main/java/com/czblood/bus/mapper/XkBackinMainMapper.java b/blood_bus/src/main/java/com/czblood/bus/mapper/XkBackinMainMapper.java
new file mode 100644
index 0000000..c8f5a87
--- /dev/null
+++ b/blood_bus/src/main/java/com/czblood/bus/mapper/XkBackinMainMapper.java
@@ -0,0 +1,10 @@
+package com.czblood.bus.mapper;
+
+import com.czblood.bus.pojo.XkBackinMain;
+
+import java.util.List;
+
+public interface XkBackinMainMapper {
+ List queryList(XkBackinMain xkBackinMain);
+ XkBackinMain queryOne(String billNo);
+}
diff --git a/blood_bus/src/main/java/com/czblood/bus/mapper/XkMsgDetailMapper.java b/blood_bus/src/main/java/com/czblood/bus/mapper/XkMsgDetailMapper.java
new file mode 100644
index 0000000..862c9bc
--- /dev/null
+++ b/blood_bus/src/main/java/com/czblood/bus/mapper/XkMsgDetailMapper.java
@@ -0,0 +1,8 @@
+package com.czblood.bus.mapper;
+
+import com.czblood.bus.pojo.XkMsgDetail;
+
+public interface XkMsgDetailMapper {
+ XkMsgDetail queryOne(int msgId);
+ void insert(XkMsgDetail msgDetail);
+}
diff --git a/blood_bus/src/main/java/com/czblood/bus/mapper/XkMsgMainMapper.java b/blood_bus/src/main/java/com/czblood/bus/mapper/XkMsgMainMapper.java
new file mode 100644
index 0000000..b6d6c92
--- /dev/null
+++ b/blood_bus/src/main/java/com/czblood/bus/mapper/XkMsgMainMapper.java
@@ -0,0 +1,8 @@
+package com.czblood.bus.mapper;
+
+import com.czblood.bus.pojo.XkMsgMain;
+
+public interface XkMsgMainMapper {
+ XkMsgMain queryOne(int msgId);
+ void insert(XkMsgMain msgMain);
+}
diff --git a/blood_bus/src/main/java/com/czblood/bus/pojo/XkBackinDetail.java b/blood_bus/src/main/java/com/czblood/bus/pojo/XkBackinDetail.java
new file mode 100644
index 0000000..73f814e
--- /dev/null
+++ b/blood_bus/src/main/java/com/czblood/bus/pojo/XkBackinDetail.java
@@ -0,0 +1,21 @@
+package com.czblood.bus.pojo;
+
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@ApiModel("临床退费明细表")
+public class XkBackinDetail {
+ private String bill_no;
+ private Integer sid;
+ private String blood_no;
+ private BigDecimal price;
+ private String reason;
+ private String product_no;
+}
diff --git a/blood_bus/src/main/java/com/czblood/bus/pojo/XkBackinMain.java b/blood_bus/src/main/java/com/czblood/bus/pojo/XkBackinMain.java
new file mode 100644
index 0000000..28183fc
--- /dev/null
+++ b/blood_bus/src/main/java/com/czblood/bus/pojo/XkBackinMain.java
@@ -0,0 +1,37 @@
+package com.czblood.bus.pojo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@ApiModel("临床退血主表")
+public class XkBackinMain {
+ private String bill_no;
+ @ApiModelProperty("单位类型")
+ private String org_type;
+ @ApiModelProperty("退血单位")
+ private String back_org;
+ @ApiModelProperty("经手人")
+ private String handle_person;
+ @ApiModelProperty("总金额")
+ private BigDecimal total_money;
+ @ApiModelProperty("退血日期")
+ private Date back_date;
+ @ApiModelProperty("录入人")
+ private String input_person;
+ @ApiModelProperty("录入日期")
+ private Date input_date;
+ @ApiModelProperty("审核人")
+ private String audit_person;
+ @ApiModelProperty("审核日期")
+ private Date audit_date;
+ private String remark;
+}
diff --git a/blood_bus/src/main/java/com/czblood/bus/pojo/XkMsgDetail.java b/blood_bus/src/main/java/com/czblood/bus/pojo/XkMsgDetail.java
new file mode 100644
index 0000000..fe7024c
--- /dev/null
+++ b/blood_bus/src/main/java/com/czblood/bus/pojo/XkMsgDetail.java
@@ -0,0 +1,21 @@
+package com.czblood.bus.pojo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class XkMsgDetail {
+ private Integer sid;
+ @ApiModelProperty("接收科室")
+ private String accept_Dept;
+ @ApiModelProperty("发送科室")
+ private String send_Dept;
+ @ApiModelProperty("消息内容")
+ private String msg_Body;
+ @ApiModelProperty("消息ID")
+ private Integer msgid;
+}
diff --git a/blood_bus/src/main/java/com/czblood/bus/pojo/XkMsgMain.java b/blood_bus/src/main/java/com/czblood/bus/pojo/XkMsgMain.java
new file mode 100644
index 0000000..7ad3946
--- /dev/null
+++ b/blood_bus/src/main/java/com/czblood/bus/pojo/XkMsgMain.java
@@ -0,0 +1,45 @@
+package com.czblood.bus.pojo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class XkMsgMain {
+ private Integer sid;
+ @ApiModelProperty("接收科室")
+ private String accept_Dept;
+ @ApiModelProperty("发送科室")
+ private String send_Dept;
+ @ApiModelProperty("发送人")
+ private String send_Person;
+ @ApiModelProperty("发送时间")
+ private Date send_Date;
+ @ApiModelProperty("接收人")
+ private String accept_Person;
+ @ApiModelProperty("接收时间")
+ private Date accept_Date;
+ @ApiModelProperty("是否已读")
+ private String read_Flag;
+ @ApiModelProperty("是否已发送")
+ private String send_Flag;
+ @ApiModelProperty("是否已接收")
+ private String accept_Flag;
+ @ApiModelProperty("消息类型")
+ private String msg_Type;
+ @ApiModelProperty("消息分类")
+ private String msg_Kind;
+ @ApiModelProperty("消息标题")
+ private String msg_Title;
+ private String exp1;
+ private String exp2;
+ @ApiModelProperty("创建时间")
+ private Date write_Date;
+ @ApiModelProperty("消息ID")
+ private Integer msgid;
+}
diff --git a/blood_bus/src/main/java/com/czblood/bus/pojo/websocket/WebSocketParam.java b/blood_bus/src/main/java/com/czblood/bus/pojo/websocket/WebSocketParam.java
new file mode 100644
index 0000000..f99496f
--- /dev/null
+++ b/blood_bus/src/main/java/com/czblood/bus/pojo/websocket/WebSocketParam.java
@@ -0,0 +1,25 @@
+package com.czblood.bus.pojo.websocket;
+
+import com.czblood.common.core.domain.model.LoginUser;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+import javax.websocket.Session;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+@Data
+@AllArgsConstructor
+public class WebSocketParam {
+ private Set sessionSet;
+ private final String userId;
+ private LoginUser loginUser;
+
+ // 方便快速构建对象
+ public static WebSocketParam create(String userId, LoginUser loginUser){
+ // ConcurrentHashMap.newKeySet()线程安全set
+ Set set = ConcurrentHashMap.newKeySet();
+ return new WebSocketParam(set, userId, loginUser);
+ }
+}
+
diff --git a/blood_bus/src/main/java/com/czblood/bus/utils/BloodBankUtil.java b/blood_bus/src/main/java/com/czblood/bus/utils/BloodBankUtil.java
index adcf383..b14bd92 100644
--- a/blood_bus/src/main/java/com/czblood/bus/utils/BloodBankUtil.java
+++ b/blood_bus/src/main/java/com/czblood/bus/utils/BloodBankUtil.java
@@ -182,6 +182,10 @@ public class BloodBankUtil {
return sysUserMapper.selectUserByUserName(userId);
}
+ public List queryUserList(SysUser sysUser){
+ return sysUserMapper.queryUserList(sysUser);
+ }
+
public BigDecimal getApplyTransNum(String bloodBreed,BigDecimal applyNum){
BigDecimal applyTransNum = bloodBankMapper.getApplyTransNum(bloodBreed);
if(applyTransNum == null) return applyNum;
diff --git a/blood_bus/src/main/java/com/czblood/bus/websocket/MsgType.java b/blood_bus/src/main/java/com/czblood/bus/websocket/MsgType.java
new file mode 100644
index 0000000..d844c78
--- /dev/null
+++ b/blood_bus/src/main/java/com/czblood/bus/websocket/MsgType.java
@@ -0,0 +1,43 @@
+package com.czblood.bus.websocket;
+
+import lombok.Getter;
+
+@Getter
+public enum MsgType {
+
+ //取血通知消息
+ BLOOD_OUT_NOTICE("BLOOD_OUT_NOTICE"),
+
+ //申请单消息
+ APPLY_NOTICE("APPLY_NOTICE"),
+
+ /** 单发消息 */
+ SINGLE("SINGLE"),
+
+ /** 群发消息 */
+// BROADCAST("BROADCAST"),
+
+ /** 心跳 */
+ HEARTBEAT("HEARTBEAT"),
+
+ /** 系统通知 */
+ NOTICE("NOTICE");
+
+ private final String code;
+
+ MsgType(String code) {
+ this.code = code;
+ }
+
+ public static MsgType fromCode(String code) {
+ if (code == null) {
+ return null;
+ }
+ for (MsgType t : values()) {
+ if (t.code.equalsIgnoreCase(code)) {
+ return t;
+ }
+ }
+ return null;
+ }
+}
diff --git a/blood_bus/src/main/java/com/czblood/bus/websocket/WebSocketServer.java b/blood_bus/src/main/java/com/czblood/bus/websocket/WebSocketServer.java
new file mode 100644
index 0000000..23d697d
--- /dev/null
+++ b/blood_bus/src/main/java/com/czblood/bus/websocket/WebSocketServer.java
@@ -0,0 +1,171 @@
+package com.czblood.bus.websocket;
+
+import cn.hutool.json.JSONUtil;
+import com.czblood.bus.pojo.websocket.WebSocketParam;
+import com.czblood.common.core.domain.model.LoginUser;
+import com.czblood.common.utils.SecurityUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.websocket.*;
+import javax.websocket.server.PathParam;
+import javax.websocket.server.ServerEndpoint;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * WebSocket服务
+ * 消息系统核心:根据 JSON 中的 type 字段区分单发/群发
+ */
+@ServerEndpoint("/ws/msgserver/{userId}")
+@Component
+@Slf4j
+public class WebSocketServer {
+
+ // 保存在线的用户
+ private static final Map onlineUsers = new ConcurrentHashMap<>();
+
+ /**
+ * 连接建立成功调用的方法
+ */
+ @OnOpen
+ public void onOpen(Session session, @PathParam("userId") String userId) {
+ log.info("客户端:{} 建立连接", userId);
+ session.setMaxTextMessageBufferSize(8192000);
+ LoginUser loginUser = SecurityUtils.getLoginUser();
+ WebSocketParam param = onlineUsers.computeIfAbsent(userId, k -> WebSocketParam.create(k, loginUser));
+ boolean addOk = param.getSessionSet().add(session);
+ log.info("客户端:{} 加入sessionSet:{}", userId, addOk);
+ }
+
+ /**
+ * 收到客户端消息后调用的方法
+ * 根据 JSON 中的 type 字段判断:单发 / 群发 / 心跳 / 通知
+ */
+ @OnMessage
+ public void onMessage(String message, @PathParam("userId") String userId) {
+ log.info("收到客户端[{}]消息: {}", userId, message);
+ try {
+ // 解析 JSON 为 WsMessage
+ WsMessage msg = JSONUtil.toBean(message, WsMessage.class);
+ if (msg.getType() == null) {
+ log.error("消息缺少 type 字段");
+ return;
+ }
+
+ // 根据 type 分发
+ switch (msg.getType()) {
+ case SINGLE:
+ // 单发:发给指定用户
+ sendMsg(msg.getTo(), message);
+ break;
+ case BLOOD_OUT_NOTICE:
+ case APPLY_NOTICE:
+ //给指定的一批人发消息
+ //sendToSomeOne(message,userId);
+ break;
+ case NOTICE:
+ // 群发 / 系统通知:发给所有在线用户
+ sendToAll(message);
+ break;
+ case HEARTBEAT:
+ // 心跳:仅记录日志,不转发
+ log.info("心跳 from={}", userId);
+ break;
+ default:
+ log.info("未知消息类型: {}", msg.getType());
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ log.error("消息处理异常 userId={}", userId, e);
+ }
+ }
+
+ /**
+ * 连接关闭调用的方法
+ */
+ @OnClose
+ public void onClose(Session session, @PathParam("userId") String userId) {
+ WebSocketParam param = onlineUsers.get(userId);
+ if (param == null) {
+ return;
+ }
+ param.getSessionSet().remove(session);
+ if (param.getSessionSet().isEmpty()) {
+ onlineUsers.remove(userId);
+ }
+ log.info("用户[{}]ws连接关闭", userId);
+ }
+
+ @OnError
+ public void onError(Session session, @PathParam("userId") String userId, Throwable throwable) {
+ onClose(session, userId);
+ log.error("ws错误 userId={}", userId, throwable);
+ }
+
+ /**
+ * 群发:给所有在线用户发消息
+ */
+ public static void sendToAll(String message) {
+ for (WebSocketParam param : onlineUsers.values()) {
+ for (Session session : param.getSessionSet()) {
+ if (session.isOpen()) {
+ try {
+ session.getBasicRemote().sendText(message);
+ } catch (Exception e) {
+ log.error("群发消息失败: {}", e.getMessage());
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * 单发:向指定 userId 所有在线 ws 会话推送消息
+ */
+ public static void sendMsg(String userId, String content) {
+ WebSocketParam param = onlineUsers.get(userId);
+ if (param == null || param.getSessionSet().isEmpty()) {
+ return;
+ }
+ for (Session wsSession : param.getSessionSet()) {
+ if (wsSession.isOpen()) {
+ try {
+ wsSession.getBasicRemote().sendText(content);
+ log.info("发消息成功 userId={}: {}", userId, content);
+ } catch (Exception e) {
+ log.error("单发消息失败 userId={}: {}", userId, e.getMessage());
+ }
+ }
+ }
+ }
+
+// /**
+// * 给指定的人发消息
+// * @param msg
+// */
+// public static void sendToSomeOne(WsMessage msg){
+// MsgType type = msg.getType();
+// String content = msg.getContent();
+// String userId = msg.getTo();
+// WebSocketParam param = onlineUsers.get(userId);
+// if (param == null || param.getSessionSet().isEmpty()) {
+// return;
+// }
+// for (Session wsSession : param.getSessionSet()) {
+// if (wsSession.isOpen()) {
+// try {
+// wsSession.getBasicRemote().sendText(content);
+// } catch (Exception e) {
+// log.error("单发消息失败 userId={}: {}", userId, e.getMessage());
+// }
+// }
+// }
+//
+// switch (type) {
+// //取血通知,传入的人,是取血人 ,但是我们需要通知这个取血人所对应的整个科室,比较合理
+// case BLOOD_OUT_NOTICE:
+//
+// }
+// }
+}
\ No newline at end of file
diff --git a/blood_bus/src/main/java/com/czblood/bus/websocket/WsMessage.java b/blood_bus/src/main/java/com/czblood/bus/websocket/WsMessage.java
new file mode 100644
index 0000000..93bf3c2
--- /dev/null
+++ b/blood_bus/src/main/java/com/czblood/bus/websocket/WsMessage.java
@@ -0,0 +1,43 @@
+package com.czblood.bus.websocket;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * WebSocket 统一消息协议。
+ * 所有前端发给后端、后端推给前端的消息都遵循该结构。
+ *
+ * 前端 JSON 示例:
+ * {
+ * "type": "chat", // 必选,消息类型
+ * "from": "1001", // 发送者 userId
+ * "to": "1002", // 接收者 userId;群发时可为 null 或 "ALL"
+ * "title": "你好", // 可选,消息标题
+ * "content": "在吗?", // 业务正文(字符串)
+ * "data": {...}, // 业务扩展字段(对象),不同 type 结构不同
+ * "timestamp": 1729999999999,// 时间戳
+ * "extra": {...} // 预留扩展
+ * }
+ */
+@Data
+public class WsMessage implements Serializable {
+
+
+ /** 消息类型:single / broadcast / heartbeat / notice */
+ private MsgType type;
+
+ /** 接收者 userId;群发时为 "ALL" */
+ private String to;
+
+ /** 消息内容 */
+ private String content;
+
+ /** 扩展数据,不同业务传不同结构 */
+ private Object data;
+
+ /** 判断是否群发 */
+// public boolean isBroadcast() {
+// return MsgType.BROADCAST == this.type || "ALL".equalsIgnoreCase(this.to);
+// }
+}
\ No newline at end of file
diff --git a/blood_bus/src/main/resources/mapper/XkBackinDetailMapper.xml b/blood_bus/src/main/resources/mapper/XkBackinDetailMapper.xml
new file mode 100644
index 0000000..1bb180e
--- /dev/null
+++ b/blood_bus/src/main/resources/mapper/XkBackinDetailMapper.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/blood_bus/src/main/resources/mapper/XkBackinMainMapper.xml b/blood_bus/src/main/resources/mapper/XkBackinMainMapper.xml
new file mode 100644
index 0000000..71cdd7b
--- /dev/null
+++ b/blood_bus/src/main/resources/mapper/XkBackinMainMapper.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/blood_bus/src/main/resources/mapper/XkMsgDetailMapper.xml b/blood_bus/src/main/resources/mapper/XkMsgDetailMapper.xml
new file mode 100644
index 0000000..a37f46e
--- /dev/null
+++ b/blood_bus/src/main/resources/mapper/XkMsgDetailMapper.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ insert into xk_msg_detail (
+ accept_Dept,
+ send_Dept,
+ msgid,msg_Body
+ )values(
+ #{accept_Dept},
+ #{send_Dept},
+ #{msgid},#{msg_Body}
+ )
+
+
+
+
\ No newline at end of file
diff --git a/blood_bus/src/main/resources/mapper/XkMsgMainMapper.xml b/blood_bus/src/main/resources/mapper/XkMsgMainMapper.xml
new file mode 100644
index 0000000..3289ab8
--- /dev/null
+++ b/blood_bus/src/main/resources/mapper/XkMsgMainMapper.xml
@@ -0,0 +1,35 @@
+
+
+
+
+ insert into xk_msg_main (
+ accept_Dept,
+ send_Dept,
+ accept_Person,
+ accept_Date,
+ read_Flag,
+ send_Flag,
+ accept_Flag,
+ msg_Type,
+ msg_Kind,
+ msg_Title,
+ write_Date
+ )values (
+ #{accept_Dept},
+ #{send_Dept},
+ #{accept_Person},
+ #{accept_Date},
+ #{read_Flag},
+ #{send_Flag},
+ #{accept_Flag},
+ #{msg_Type},
+ #{msg_Kind},
+ #{msg_Title},
+ #{write_Date})
+
+
+
+
\ No newline at end of file
diff --git a/blood_bus_bloodbank/src/main/java/com/czblood/busBloodbank/controller/XkBackinController.java b/blood_bus_bloodbank/src/main/java/com/czblood/busBloodbank/controller/XkBackinController.java
new file mode 100644
index 0000000..672aba4
--- /dev/null
+++ b/blood_bus_bloodbank/src/main/java/com/czblood/busBloodbank/controller/XkBackinController.java
@@ -0,0 +1,26 @@
+package com.czblood.busBloodbank.controller;
+
+import com.czblood.busBloodbank.service.XkBackinService;
+import com.czblood.common.core.domain.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+@Api(tags = "临床发血退血")
+@RestController
+@RequestMapping("/bus/bloodbank/backin")
+public class XkBackinController {
+
+ @Resource
+ private XkBackinService xkBackinService;
+
+ @ApiOperation("获取血液信息")
+ @GetMapping("/queryBloodInfo")
+ public Result queryBloodInfo(String bloodNo,String productNo){
+ return xkBackinService.queryBloodInfo(bloodNo,productNo);
+ }
+}
diff --git a/blood_bus_bloodbank/src/main/java/com/czblood/busBloodbank/service/XkBackinService.java b/blood_bus_bloodbank/src/main/java/com/czblood/busBloodbank/service/XkBackinService.java
new file mode 100644
index 0000000..141453d
--- /dev/null
+++ b/blood_bus_bloodbank/src/main/java/com/czblood/busBloodbank/service/XkBackinService.java
@@ -0,0 +1,7 @@
+package com.czblood.busBloodbank.service;
+
+import com.czblood.common.core.domain.Result;
+
+public interface XkBackinService {
+ Result queryBloodInfo(String bloodNo, String productNo);
+}
diff --git a/blood_bus_bloodbank/src/main/java/com/czblood/busBloodbank/service/impl/BloodOutServiceImpl.java b/blood_bus_bloodbank/src/main/java/com/czblood/busBloodbank/service/impl/BloodOutServiceImpl.java
index 9c2de7e..9e20242 100644
--- a/blood_bus_bloodbank/src/main/java/com/czblood/busBloodbank/service/impl/BloodOutServiceImpl.java
+++ b/blood_bus_bloodbank/src/main/java/com/czblood/busBloodbank/service/impl/BloodOutServiceImpl.java
@@ -9,6 +9,8 @@ import com.czblood.bus.pojo.xtwh.XkBloodBreed;
import com.czblood.bus.utils.BloodBankUtil;
import com.czblood.bus.utils.BloodInterfaceUtil;
import com.czblood.bus.utils.ReportUtil;
+import com.czblood.bus.websocket.MsgType;
+import com.czblood.bus.websocket.WebSocketServer;
import com.czblood.busBloodbank.mapper.BloodOutMapper;
import com.czblood.busBloodbank.pojo.DTO.BloodOutDTO;
import com.czblood.busBloodbank.pojo.DTO.BloodOutInfoDTO;
@@ -20,6 +22,7 @@ import com.czblood.busBloodbank.service.BloodOutService;
import com.czblood.busBloodbank.utils.BloodOutUtil;
import com.czblood.busBloodbank.utils.MatchBloodUtil;
import com.czblood.common.core.domain.Result;
+import com.czblood.common.core.domain.entity.SysUser;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@@ -268,9 +271,10 @@ public class BloodOutServiceImpl implements BloodOutService {
return new Result("0","审核成功");
}
- @Override
+ @Override
public Result notifyMessage(String billNo) {
- notifyBloodOut(billNo);
+ Result result = notifyBloodOut(billNo);
+ if(!result.getCode().equals("0")) return result;
return new Result("0","通知成功");
}
@@ -451,12 +455,52 @@ public class BloodOutServiceImpl implements BloodOutService {
* 通知护士取血
* @param billNo
*/
- public void notifyBloodOut(String billNo){
- //TODO 这里应该还有通过websocket发消息给护士站的逻辑
- XkOutMain xkOutMainTemp = new XkOutMain();
+ public Result notifyBloodOut(String billNo){
+ XkOutMain xkOutMain = xkOutMainMapper.queryOne(billNo);
+ if(xkOutMain == null) return new Result("-1","该出库单不存在!");
+ String checkSign = BloodBankUtil.isBank(xkOutMain.getCheck_sign());
+ if(!checkSign.equals("Y")) return new Result("-1","该单据没有审核,不能通知护士取血!");
+
+ Date currentTimeDate = bloodBankUtil.getCurrentTimeDate();
+
+ XkOutMain xkOutMainTemp = new XkOutMain();
xkOutMainTemp.setExp2("Y");
- xkOutMainTemp.setNotify_time(bloodBankUtil.getCurrentTimeDate());
+ xkOutMainTemp.setNotify_time(currentTimeDate);
xkOutMainTemp.setBill_no(billNo);
- xkOutMainMapper.update(xkOutMainTemp);
+ //xkOutMainMapper.update(xkOutMainTemp);
+
+ String msgBody = "住院号:" + BloodBankUtil.isBank(xkOutMain.getBeinhos_id()) + ",患者【" + BloodBankUtil.isBank(xkOutMain.getPatient_name()) + "】,申请单号:" + BloodBankUtil.isBank(xkOutMain.getApply_no()) + ",的血液已经准备完毕,可以来输血科取血!";
+
+ //写消息数据主表
+ XkMsgMain xkMsgMainTemp = new XkMsgMain();
+ xkMsgMainTemp.setAccept_Dept(xkOutMain.getDept_id());
+ xkMsgMainTemp.setSend_Dept("输血科");
+ xkMsgMainTemp.setSend_Person(xkOutMain.getCheck_person());
+ xkMsgMainTemp.setSend_Date(xkOutMain.getCheck_date());
+ xkMsgMainTemp.setAccept_Person(xkOutMain.getTake_person()); //接收人
+ xkMsgMainTemp.setAccept_Date(currentTimeDate); //接收时间,先默认一个,后面确认之后在更新
+ xkMsgMainTemp.setRead_Flag("N"); //是否已读
+ xkMsgMainTemp.setSend_Flag("N"); //是否已发送
+ xkMsgMainTemp.setAccept_Flag("N"); //是否已接收
+ xkMsgMainTemp.setMsg_Title("取血通知");
+ xkMsgMainTemp.setMsg_Type(MsgType.BLOOD_OUT_NOTICE.getCode()); //发血消息
+ xkMsgMainTemp.setWrite_Date(currentTimeDate);
+
+ //写消息数据明细表
+ XkMsgDetail xkMsgDetailTemp = new XkMsgDetail();
+ xkMsgDetailTemp.setMsg_Body(msgBody);
+ xkMsgDetailTemp.setAccept_Dept(xkOutMain.getDept_id());
+ xkMsgDetailTemp.setSend_Dept("输血科");
+ bloodOutUtil.updateNotifyTime(xkOutMainTemp,xkMsgMainTemp,xkMsgDetailTemp);
+ //发送消息
+ //取血通知,传入的人,是取血人 ,但是我们需要通知这个取血人所对应的整个科室,比较合理
+ SysUser sysUserQuery = new SysUser();
+ sysUserQuery.setDeptId(Long.parseLong(xkOutMain.getDept_id()));
+ List sysUserList = bloodBankUtil.queryUserList(sysUserQuery);
+ for (SysUser sysUser : sysUserList) {
+ String userName = sysUser.getUserName();
+ WebSocketServer.sendMsg(userName,msgBody);
+ }
+ return new Result("0","操作成功");
}
}
diff --git a/blood_bus_bloodbank/src/main/java/com/czblood/busBloodbank/service/impl/XkBackinServiceImpl.java b/blood_bus_bloodbank/src/main/java/com/czblood/busBloodbank/service/impl/XkBackinServiceImpl.java
new file mode 100644
index 0000000..1ecbdad
--- /dev/null
+++ b/blood_bus_bloodbank/src/main/java/com/czblood/busBloodbank/service/impl/XkBackinServiceImpl.java
@@ -0,0 +1,24 @@
+package com.czblood.busBloodbank.service.impl;
+
+import com.czblood.bus.pojo.XkBloodInfo;
+import com.czblood.bus.utils.BloodBankUtil;
+import com.czblood.busBloodbank.service.XkBackinService;
+import com.czblood.common.core.domain.Result;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+
+@Service
+public class XkBackinServiceImpl implements XkBackinService {
+
+ @Resource
+ BloodBankUtil bloodBankUtil;
+
+
+ @Override
+ public Result queryBloodInfo(String bloodNo, String productNo) {
+ XkBloodInfo xkBloodInfo = bloodBankUtil.queryBloodInfoOne(bloodNo, productNo);
+ if(xkBloodInfo == null) return new Result("-1","血液信息不存在!");
+ return null;
+ }
+}
diff --git a/blood_bus_bloodbank/src/main/java/com/czblood/busBloodbank/utils/BloodOutUtil.java b/blood_bus_bloodbank/src/main/java/com/czblood/busBloodbank/utils/BloodOutUtil.java
index ec288c7..41b2ba8 100644
--- a/blood_bus_bloodbank/src/main/java/com/czblood/busBloodbank/utils/BloodOutUtil.java
+++ b/blood_bus_bloodbank/src/main/java/com/czblood/busBloodbank/utils/BloodOutUtil.java
@@ -26,6 +26,10 @@ public class BloodOutUtil {
XkBloodInfoMapper xkBloodInfoMapper;
@Resource
XkMatchMainMapper xkMatchMainMapper;
+ @Resource
+ XkMsgMainMapper xkMsgMainMapper;
+ @Resource
+ XkMsgDetailMapper xkMsgDetailMapper;
@Transactional(rollbackFor = Exception.class)
public void saveBloodOutInfo(BloodOutInfoVO bloodOutInfoVO) {
@@ -73,4 +77,12 @@ public class BloodOutUtil {
if(xkMatchMain != null) xkMatchMainMapper.update(xkMatchMain);
}
+ @Transactional(rollbackFor = Exception.class)
+ public void updateNotifyTime(XkOutMain xkOutMain,XkMsgMain xkMsgMain,XkMsgDetail xkMsgDetail){
+ xkOutMainMapper.update(xkOutMain);
+ xkMsgMainMapper.insert(xkMsgMain);
+ xkMsgDetail.setMsgid(xkMsgMain.getMsgid());
+ xkMsgDetailMapper.insert(xkMsgDetail);
+ }
+
}
diff --git a/blood_common/src/main/java/com/czblood/common/utils/file/MimeTypeUtils.java b/blood_common/src/main/java/com/czblood/common/utils/file/MimeTypeUtils.java
index f723b53..16ce0d1 100644
--- a/blood_common/src/main/java/com/czblood/common/utils/file/MimeTypeUtils.java
+++ b/blood_common/src/main/java/com/czblood/common/utils/file/MimeTypeUtils.java
@@ -36,7 +36,10 @@ public class MimeTypeUtils
// 视频格式
"mp4", "avi", "rmvb",
// pdf
- "pdf" };
+ "pdf" ,
+ //打印模版文件
+ "jrxml"
+ };
public static String getExtension(String prefix)
{
diff --git a/blood_system/pom.xml b/blood_system/pom.xml
index 2886726..821ac60 100644
--- a/blood_system/pom.xml
+++ b/blood_system/pom.xml
@@ -32,17 +32,6 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/blood_system/src/main/java/com/czblood/system/mapper/SysUserMapper.java b/blood_system/src/main/java/com/czblood/system/mapper/SysUserMapper.java
index 81364cb..12d4202 100644
--- a/blood_system/src/main/java/com/czblood/system/mapper/SysUserMapper.java
+++ b/blood_system/src/main/java/com/czblood/system/mapper/SysUserMapper.java
@@ -127,5 +127,5 @@ public interface SysUserMapper {
public SysUser checkEmailUnique(String email);
- public SysUser queryUserList(SysUser sysUser);
+ public List queryUserList(SysUser sysUser);
}
diff --git a/blood_system/src/main/java/com/czblood/system/service/ISysUserService.java b/blood_system/src/main/java/com/czblood/system/service/ISysUserService.java
index 2b52a2a..ae50946 100644
--- a/blood_system/src/main/java/com/czblood/system/service/ISysUserService.java
+++ b/blood_system/src/main/java/com/czblood/system/service/ISysUserService.java
@@ -208,5 +208,5 @@ public interface ISysUserService {
Result syncUser(String loginYLJG);
- public SysUser queryUserList(SysUser sysUser);
+ public List queryUserList(SysUser sysUser);
}
diff --git a/blood_system/src/main/java/com/czblood/system/service/impl/SysUserServiceImpl.java b/blood_system/src/main/java/com/czblood/system/service/impl/SysUserServiceImpl.java
index c69ef9c..b55827b 100644
--- a/blood_system/src/main/java/com/czblood/system/service/impl/SysUserServiceImpl.java
+++ b/blood_system/src/main/java/com/czblood/system/service/impl/SysUserServiceImpl.java
@@ -546,7 +546,7 @@ public class SysUserServiceImpl implements ISysUserService {
}
@Override
- public SysUser queryUserList(SysUser sysUser) {
+ public List queryUserList(SysUser sysUser) {
return userMapper.queryUserList(sysUser);
}
}
diff --git a/blood_system/src/main/java/com/czblood/system/web/controller/common/CommonController.java b/blood_system/src/main/java/com/czblood/system/web/controller/common/CommonController.java
index 6bb7597..4158c4f 100644
--- a/blood_system/src/main/java/com/czblood/system/web/controller/common/CommonController.java
+++ b/blood_system/src/main/java/com/czblood/system/web/controller/common/CommonController.java
@@ -19,6 +19,9 @@ import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
@@ -51,6 +54,12 @@ public class CommonController {
}
String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1);
String filePath = RuoYiConfig.getDownloadPath() + fileName;
+ //下载模版
+ Path path = Paths.get(filePath);
+ if(!Files.exists(path)){
+ //原来的文件夹找不到,就在下载模版的位子找
+ filePath = RuoYiConfig.getProfile() + "/templates/" + fileName;
+ }
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
FileUtils.setAttachmentResponseHeader(response, realFileName);
diff --git a/blood_system/src/main/java/com/czblood/system/web/service/SysLoginService.java b/blood_system/src/main/java/com/czblood/system/web/service/SysLoginService.java
index 89dab68..9222710 100644
--- a/blood_system/src/main/java/com/czblood/system/web/service/SysLoginService.java
+++ b/blood_system/src/main/java/com/czblood/system/web/service/SysLoginService.java
@@ -232,13 +232,13 @@ public class SysLoginService {
SysUser sysUser1 = new SysUser();
sysUser1.setUserName(username);
sysUser1.setHos_id(loginParam.getLoginYLJG());
- SysUser sysUser = userService.queryUserList(sysUser1);
+ List sysUserList = userService.queryUserList(sysUser1);
//管理员不判断
// if (!username.equals("admin")){
// if (sysUser == null) throw new GlobalException("医疗机构:"+loginParam.getLoginYLJGName()+"不存在该用户!"+username);
// }
- if (sysUser == null) throw new GlobalException("医疗机构:"+loginParam.getLoginYLJGName()+"不存在该用户!"+username);
+ if (sysUserList.isEmpty()) throw new GlobalException("医疗机构:"+loginParam.getLoginYLJGName()+"不存在该用户!"+username);
}
diff --git a/blood_system/src/main/resources/mapper/system/SysUserMapper.xml b/blood_system/src/main/resources/mapper/system/SysUserMapper.xml
index 6088422..b3aa46d 100644
--- a/blood_system/src/main/resources/mapper/system/SysUserMapper.xml
+++ b/blood_system/src/main/resources/mapper/system/SysUserMapper.xml
@@ -146,6 +146,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
select * from sys_user where del_flag = '0'
and user_name = #{userName}
and hos_id = #{hos_id}
+ and dept_id = #{deptId}