消息系统,临床发血退血
This commit is contained in:
parent
aab8ed58b0
commit
a16d8342f0
@ -51,5 +51,11 @@
|
||||
<groupId>org.apache.pdfbox</groupId>
|
||||
<artifactId>pdfbox</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- websocket -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-websocket</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
|
||||
@ -0,0 +1,9 @@
|
||||
package com.czblood.bus.mapper;
|
||||
|
||||
import com.czblood.bus.pojo.XkBackinDetail;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface XkBackinDetailMapper {
|
||||
List<XkBackinDetail> queryListByBillNo(String billNo);
|
||||
}
|
||||
@ -0,0 +1,10 @@
|
||||
package com.czblood.bus.mapper;
|
||||
|
||||
import com.czblood.bus.pojo.XkBackinMain;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface XkBackinMainMapper {
|
||||
List<XkBackinMain> queryList(XkBackinMain xkBackinMain);
|
||||
XkBackinMain queryOne(String billNo);
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
45
blood_bus/src/main/java/com/czblood/bus/pojo/XkMsgMain.java
Normal file
45
blood_bus/src/main/java/com/czblood/bus/pojo/XkMsgMain.java
Normal file
@ -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;
|
||||
}
|
||||
@ -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<Session> sessionSet;
|
||||
private final String userId;
|
||||
private LoginUser loginUser;
|
||||
|
||||
// 方便快速构建对象
|
||||
public static WebSocketParam create(String userId, LoginUser loginUser){
|
||||
// ConcurrentHashMap.newKeySet()线程安全set
|
||||
Set<Session> set = ConcurrentHashMap.newKeySet();
|
||||
return new WebSocketParam(set, userId, loginUser);
|
||||
}
|
||||
}
|
||||
|
||||
@ -182,6 +182,10 @@ public class BloodBankUtil {
|
||||
return sysUserMapper.selectUserByUserName(userId);
|
||||
}
|
||||
|
||||
public List<SysUser> queryUserList(SysUser sysUser){
|
||||
return sysUserMapper.queryUserList(sysUser);
|
||||
}
|
||||
|
||||
public BigDecimal getApplyTransNum(String bloodBreed,BigDecimal applyNum){
|
||||
BigDecimal applyTransNum = bloodBankMapper.getApplyTransNum(bloodBreed);
|
||||
if(applyTransNum == null) return applyNum;
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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<String, WebSocketParam> 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:
|
||||
//
|
||||
// }
|
||||
// }
|
||||
}
|
||||
@ -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);
|
||||
// }
|
||||
}
|
||||
@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
|
||||
<mapper namespace="com.czblood.bus.mapper.XkBackinDetailMapper">
|
||||
|
||||
<select id="queryListByBillNo" resultType="com.czblood.bus.pojo.XkBackinDetail">
|
||||
select * from xk_backin_detail where bill_no = #{bill_no}
|
||||
</select>
|
||||
</mapper>
|
||||
17
blood_bus/src/main/resources/mapper/XkBackinMainMapper.xml
Normal file
17
blood_bus/src/main/resources/mapper/XkBackinMainMapper.xml
Normal file
@ -0,0 +1,17 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
|
||||
<mapper namespace="com.czblood.bus.mapper.XkBackinMainMapper">
|
||||
<select id="queryList" resultType="com.czblood.bus.pojo.XkBackinMain">
|
||||
select * from xk_backin_main
|
||||
<where>
|
||||
<if test="bill_no != null">and bill_no = #{bill_no}</if>
|
||||
<if test="handle_person != null">and handle_person = #{handle_person}</if>
|
||||
<if test="audit_person != null">and audit_person = #{audit_person}</if>
|
||||
<if test="remark != null">and remark = #{remark}</if>
|
||||
</where>
|
||||
</select>
|
||||
<select id="queryOne" resultType="com.czblood.bus.pojo.XkBackinMain">
|
||||
select * from xk_backin_main where bill_no = #{billNo}
|
||||
</select>
|
||||
</mapper>
|
||||
20
blood_bus/src/main/resources/mapper/XkMsgDetailMapper.xml
Normal file
20
blood_bus/src/main/resources/mapper/XkMsgDetailMapper.xml
Normal file
@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
|
||||
<mapper namespace="com.czblood.bus.mapper.XkMsgDetailMapper">
|
||||
<insert id="insert">
|
||||
insert into xk_msg_detail (
|
||||
<if test="accept_Dept != null">accept_Dept,</if>
|
||||
<if test="send_Dept != null">send_Dept,</if>
|
||||
msgid,msg_Body
|
||||
)values(
|
||||
<if test="accept_Dept != null">#{accept_Dept},</if>
|
||||
<if test="send_Dept != null">#{send_Dept},</if>
|
||||
#{msgid},#{msg_Body}
|
||||
)
|
||||
</insert>
|
||||
|
||||
<select id="queryOne" resultType="com.czblood.bus.pojo.XkMsgDetail">
|
||||
select * from xk_msg_detail where msgid = #{msgId}
|
||||
</select>
|
||||
</mapper>
|
||||
35
blood_bus/src/main/resources/mapper/XkMsgMainMapper.xml
Normal file
35
blood_bus/src/main/resources/mapper/XkMsgMainMapper.xml
Normal file
@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
|
||||
<mapper namespace="com.czblood.bus.mapper.XkMsgMainMapper">
|
||||
<insert id="insert" useGeneratedKeys="true" keyProperty="msgid" keyColumn="msgid">
|
||||
insert into xk_msg_main (
|
||||
<if test="accept_Dept != null"> accept_Dept,</if>
|
||||
<if test="send_Dept != null"> send_Dept,</if>
|
||||
<if test="accept_Person != null"> accept_Person,</if>
|
||||
<if test="accept_Date != null"> accept_Date,</if>
|
||||
<if test="read_Flag != null"> read_Flag,</if>
|
||||
<if test="send_Flag != null"> send_Flag,</if>
|
||||
<if test="accept_Flag != null"> accept_Flag,</if>
|
||||
<if test="msg_Type != null"> msg_Type,</if>
|
||||
<if test="msg_Kind != null"> msg_Kind,</if>
|
||||
<if test="msg_Title != null"> msg_Title,</if>
|
||||
write_Date
|
||||
)values (
|
||||
<if test="accept_Dept != null"> #{accept_Dept},</if>
|
||||
<if test="send_Dept != null"> #{send_Dept},</if>
|
||||
<if test="accept_Person != null"> #{accept_Person},</if>
|
||||
<if test="accept_Date != null"> #{accept_Date},</if>
|
||||
<if test="read_Flag != null"> #{read_Flag},</if>
|
||||
<if test="send_Flag != null"> #{send_Flag},</if>
|
||||
<if test="accept_Flag != null"> #{accept_Flag},</if>
|
||||
<if test="msg_Type != null"> #{msg_Type},</if>
|
||||
<if test="msg_Kind != null"> #{msg_Kind},</if>
|
||||
<if test="msg_Title != null"> #{msg_Title},</if>
|
||||
#{write_Date})
|
||||
</insert>
|
||||
|
||||
<select id="queryOne" resultType="com.czblood.bus.pojo.XkMsgMain">
|
||||
select * from xk_msg_main where msgid = #{msgId}
|
||||
</select>
|
||||
</mapper>
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
@ -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<SysUser> sysUserList = bloodBankUtil.queryUserList(sysUserQuery);
|
||||
for (SysUser sysUser : sysUserList) {
|
||||
String userName = sysUser.getUserName();
|
||||
WebSocketServer.sendMsg(userName,msgBody);
|
||||
}
|
||||
return new Result("0","操作成功");
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -36,7 +36,10 @@ public class MimeTypeUtils
|
||||
// 视频格式
|
||||
"mp4", "avi", "rmvb",
|
||||
// pdf
|
||||
"pdf" };
|
||||
"pdf" ,
|
||||
//打印模版文件
|
||||
"jrxml"
|
||||
};
|
||||
|
||||
public static String getExtension(String prefix)
|
||||
{
|
||||
|
||||
@ -32,17 +32,6 @@
|
||||
</dependency>
|
||||
|
||||
|
||||
<!-- 通用工具-->
|
||||
<!-- <dependency>-->
|
||||
<!-- <groupId>com.czblood</groupId>-->
|
||||
<!-- <artifactId>pf_interfaceCommon</artifactId>-->
|
||||
<!-- </dependency>-->
|
||||
|
||||
<!-- <dependency>-->
|
||||
<!-- <groupId>com.czblood</groupId>-->
|
||||
<!-- <artifactId>pf_transitPF</artifactId>-->
|
||||
<!-- </dependency>-->
|
||||
|
||||
<!--定时任务-->
|
||||
<!-- <dependency>-->
|
||||
<!-- <groupId>com.czblood</groupId>-->
|
||||
|
||||
@ -127,5 +127,5 @@ public interface SysUserMapper {
|
||||
public SysUser checkEmailUnique(String email);
|
||||
|
||||
|
||||
public SysUser queryUserList(SysUser sysUser);
|
||||
public List<SysUser> queryUserList(SysUser sysUser);
|
||||
}
|
||||
|
||||
@ -208,5 +208,5 @@ public interface ISysUserService {
|
||||
|
||||
Result syncUser(String loginYLJG);
|
||||
|
||||
public SysUser queryUserList(SysUser sysUser);
|
||||
public List<SysUser> queryUserList(SysUser sysUser);
|
||||
}
|
||||
|
||||
@ -546,7 +546,7 @@ public class SysUserServiceImpl implements ISysUserService {
|
||||
}
|
||||
|
||||
@Override
|
||||
public SysUser queryUserList(SysUser sysUser) {
|
||||
public List<SysUser> queryUserList(SysUser sysUser) {
|
||||
return userMapper.queryUserList(sysUser);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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<SysUser> 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);
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -146,6 +146,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
select * from sys_user where del_flag = '0'
|
||||
<if test="userName != null and userName != ''">and user_name = #{userName}</if>
|
||||
<if test="hos_id != null and hos_id != ''">and hos_id = #{hos_id}</if>
|
||||
<if test="deptId != null and deptId != ''">and dept_id = #{deptId}</if>
|
||||
</select>
|
||||
|
||||
<select id="checkUserNameUnique" parameterType="String" resultMap="SysUserResult">
|
||||
|
||||
@ -492,4 +492,14 @@ if not exists(SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'xk_r
|
||||
update_time datetime
|
||||
)
|
||||
ALTER TABLE xk_report_template ADD CONSTRAINT UQ_xk_report_template_reportNo UNIQUE(report_no);
|
||||
end
|
||||
end
|
||||
|
||||
ALTER TABLE xk_msg_main ADD msgid bigint primary key IDENTITY(1,1);
|
||||
go
|
||||
ALTER TABLE xk_msg_main ALTER COLUMN sid int null ;
|
||||
go
|
||||
|
||||
ALTER TABLE xk_msg_detail ADD msgid bigint primary key;
|
||||
go
|
||||
ALTER TABLE xk_msg_detail ALTER COLUMN sid int null ;
|
||||
go
|
||||
@ -91,6 +91,7 @@ IF NOT EXISTS (SELECT 1 FROM sys.key_constraints WHERE name = 'PK_xk_blood_info'
|
||||
GO
|
||||
|
||||
ALTER TABLE xk_match_detail ALTER COLUMN product_no VARCHAR(18) NOT NULL;
|
||||
go
|
||||
IF NOT EXISTS (SELECT 1 FROM sys.key_constraints WHERE name = 'PK_xk_match_detail' AND type = 'PK' )
|
||||
BEGIN
|
||||
|
||||
@ -124,6 +125,7 @@ IF NOT EXISTS (SELECT 1 FROM sys.key_constraints WHERE name = 'PK_xk_instorage_m
|
||||
GO
|
||||
|
||||
ALTER TABLE xk_instorage_detail ALTER COLUMN product_no VARCHAR(18) NOT NULL;
|
||||
go
|
||||
IF NOT EXISTS (SELECT 1 FROM sys.key_constraints WHERE name = 'PK_xk_instorage_detail' AND type = 'PK' )
|
||||
BEGIN
|
||||
|
||||
@ -132,6 +134,7 @@ IF NOT EXISTS (SELECT 1 FROM sys.key_constraints WHERE name = 'PK_xk_instorage_d
|
||||
GO
|
||||
|
||||
ALTER TABLE xk_backout_detail ALTER COLUMN product_no VARCHAR(18) NOT NULL;
|
||||
go
|
||||
IF NOT EXISTS (SELECT 1 FROM sys.key_constraints WHERE name = 'PK_xk_backout_detail' AND type = 'PK' )
|
||||
BEGIN
|
||||
|
||||
@ -149,6 +152,7 @@ GO
|
||||
|
||||
|
||||
ALTER TABLE xk_discard_detail ALTER COLUMN product_no VARCHAR(18) NOT NULL;
|
||||
go
|
||||
IF NOT EXISTS (SELECT 1 FROM sys.key_constraints WHERE name = 'PK_xk_discard_main' AND type = 'PK' )
|
||||
BEGIN
|
||||
|
||||
@ -164,7 +168,9 @@ IF NOT EXISTS (SELECT 1 FROM sys.key_constraints WHERE name = 'PK_xk_discard_det
|
||||
GO
|
||||
|
||||
ALTER TABLE xk_out_detail ALTER COLUMN blood_no VARCHAR(32) NOT NULL;
|
||||
go
|
||||
ALTER TABLE xk_out_detail ALTER COLUMN product_no VARCHAR(18) NOT NULL;
|
||||
go
|
||||
IF NOT EXISTS (SELECT 1 FROM sys.key_constraints WHERE name = 'PK_xk_out_detail' AND type = 'PK' )
|
||||
BEGIN
|
||||
|
||||
@ -180,3 +186,18 @@ IF NOT EXISTS (SELECT 1 FROM sys.key_constraints WHERE name = 'PK_xk_out_main' A
|
||||
END
|
||||
GO
|
||||
|
||||
IF NOT EXISTS (SELECT 1 FROM sys.key_constraints WHERE name = 'PK_xk_backin_main' AND type = 'PK' )
|
||||
BEGIN
|
||||
|
||||
ALTER TABLE xk_backin_main ADD CONSTRAINT PK_xk_backin_main PRIMARY KEY CLUSTERED (bill_no);
|
||||
END
|
||||
GO
|
||||
|
||||
ALTER TABLE xk_backin_detail ALTER COLUMN product_no VARCHAR(18) NOT NULL;
|
||||
go
|
||||
IF NOT EXISTS (SELECT 1 FROM sys.key_constraints WHERE name = 'PK_xk_backin_detail' AND type = 'PK' )
|
||||
BEGIN
|
||||
|
||||
ALTER TABLE xk_backin_detail ADD CONSTRAINT PK_xk_backin_detail PRIMARY KEY CLUSTERED (bill_no,blood_no,product_no);
|
||||
END
|
||||
GO
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user