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}