消息系统,临床发血退血

This commit is contained in:
jiangs 2026-09-01 17:37:41 +08:00
parent 2e77bcb10c
commit 27ce2482e6
20 changed files with 212 additions and 23 deletions

View File

@ -0,0 +1,7 @@
package com.czblood.bus.mapper;
import org.apache.ibatis.annotations.Param;
public interface XkReactionMapper {
int queryCount(@Param("bloodNo") String bloodNo, @Param("productNo") String productNo);
}

View File

@ -42,4 +42,7 @@ public class XkMsgMain {
private Date write_Date;
@ApiModelProperty("消息ID")
private Integer msgid;
private Date sWriteDate;
private Date eWriteDate;
}

View File

@ -0,0 +1,32 @@
package com.czblood.bus.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class XkReaction {
private String bill_no;
private String hos_id;
private String apply_no;
private String out_id;
private String blood_no;
private Date transfuse_date;
private String transfuse_medic;
private String transfuse_reaction;
private Date occur_time;
private String treatment;
private String treatment_dept;
private String remark;
private String transfuse_mode;
private BigDecimal transfuse_num;
private String out_sign;
private Date last_modified;
private String check_sign;
private String product_no;
}

View File

@ -0,0 +1,14 @@
package com.czblood.bus.websocket;
import io.swagger.annotations.ApiModel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel("websocket返回数据集合")
public class ParamExtra {
private Integer msgId;
}

View File

@ -27,10 +27,10 @@ public class SendMessageUtil {
@Resource
XkMsgDetailMapper xkMsgDetailMapper;
public void saveMessage(String billNo,String content) {
public int saveMessage(String billNo,String content) {
XkTransfuseApply xkTransfuseApply = xkTransfuseApplyMapper.queryOne(billNo);
if (xkTransfuseApply == null) return ;
if (xkTransfuseApply == null) return -1;
Date currentTimeDate = bloodBankUtil.getCurrentTimeDate();
@ -55,14 +55,16 @@ public class SendMessageUtil {
xkMsgDetailTemp.setMsg_Body(content);
xkMsgDetailTemp.setAccept_Dept("输血科");
xkMsgDetailTemp.setSend_Dept(xkTransfuseApply.getDept_id());
SpringUtils.getBean(SendMessageUtil.class).saveData(xkMsgMainTemp,xkMsgDetailTemp);
//返回消息ID给前端
return SpringUtils.getBean(SendMessageUtil.class).saveData(xkMsgMainTemp,xkMsgDetailTemp);
}
@Transactional(rollbackFor = Exception.class)
public void saveData(XkMsgMain xkMsgMain, XkMsgDetail xkMsgDetail) {
public int saveData(XkMsgMain xkMsgMain, XkMsgDetail xkMsgDetail) {
xkMsgMainMapper.insert(xkMsgMain);
xkMsgDetail.setMsgid(xkMsgMain.getMsgid());
xkMsgDetailMapper.insert(xkMsgDetail);
return xkMsgMain.getMsgid();
}

View File

@ -2,6 +2,8 @@ package com.czblood.bus.websocket;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.czblood.bus.mapper.XkMsgMainMapper;
import com.czblood.bus.pojo.XkMsgMain;
import com.czblood.bus.pojo.websocket.WebSocketParam;
import com.czblood.bus.utils.BloodBankUtil;
import com.czblood.common.core.domain.entity.SysDept;
@ -194,13 +196,18 @@ public class WebSocketServer {
}
//保存消息数据,写一条消息记录
SpringUtils.getBean(SendMessageUtil.class).saveMessage(billNo,content);
int msgId = SpringUtils.getBean(SendMessageUtil.class).saveMessage(billNo,content);
switch (type) {
//输血申请单保存通知
case APPLY_NOTICE:
//需要通知整个输血科人员
ParamExtra paramExtra = new ParamExtra();
paramExtra.setMsgId(msgId);
msg.setExtra(paramExtra);
XkMsgMain xkMsgMain = SpringUtils.getBean(XkMsgMainMapper.class).queryOne(msgId);
SysDept sysDept = new SysDept();
msg.setTitle(xkMsgMain.getMsg_Title());
sysDept.setDeptType("002"); //输血科室
List<SysDept> sysDeptList = SpringUtils.getBean(SysDeptMapper.class).selectDeptList(sysDept);
for (SysDept dept : sysDeptList) {

View File

@ -3,6 +3,7 @@ package com.czblood.bus.websocket;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* WebSocket 统一消息协议。
@ -34,9 +35,15 @@ public class WsMessage implements Serializable {
/** 消息内容 */
private String content;
/** 消息标题 */
private String title;
/** 扩展数据,不同业务传不同结构 */
private Object data;
/** 返回数据 */
private ParamExtra extra;
/** 消息发送时间 */
private Date timestamp;
/** 判断是否群发 */
// public boolean isBroadcast() {

View File

@ -35,6 +35,7 @@
<if test="read_Flag != null"> read_Flag = #{read_Flag},</if>
<if test="send_Flag != null"> send_Flag = #{send_Flag},</if>
<if test="accept_Flag != null"> accept_Flag = #{accept_Flag},</if>
Msg_Type = #{msg_Type}
where msgid = #{msgid}
</update>
@ -53,6 +54,8 @@
<if test="msg_Type != null">and msg_Type = #{msg_Type}</if>
<if test="msg_Kind != null">and msg_Kind = #{msg_Kind}</if>
<if test="msgid != null">and msgid = #{msgid}</if>
<if test="sWriteDate != null"><![CDATA[and write_Date >= #{sWriteDate} ]]></if>
<if test="eWriteDate != null"><![CDATA[and write_Date <= #{eWriteDate} ]]></if>
</where>
</select>
<select id="queryNoReadCount" resultType="java.lang.Integer">

View File

@ -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.XkReactionMapper">
<select id="queryCount" resultType="java.lang.Integer">
select count(*) from xk_reaction where blood_no = #{bloodNo} and product_no = #{productNo}
</select>
</mapper>

View File

@ -1,18 +1,19 @@
package com.czblood.busBloodbank.controller;
import com.czblood.bus.pojo.XkMsgMain;
import com.czblood.busBloodbank.pojo.DTO.MsgDTO;
import com.czblood.busBloodbank.pojo.VO.MsgVO;
import com.czblood.busBloodbank.service.MsgService;
import com.czblood.common.core.controller.BaseController;
import com.czblood.common.core.domain.Result;
import com.czblood.common.core.page.TableDataInfo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
@Api(tags = "消息系统")
@RestController
@ -23,10 +24,10 @@ public class MsgController extends BaseController {
MsgService msgService;
@ApiOperation("查询消息列表")
@PostMapping("/queryMsgList")
public TableDataInfo queryMsgList(@RequestBody XkMsgMain xkMsgMain){
@GetMapping("/queryMsgList")
public TableDataInfo queryMsgList(XkMsgMain xkMsgMain){
startPage();
List<XkMsgMain> msgMainList = msgService.queryMsgList(xkMsgMain);
List<Map<String, Object>> msgMainList = msgService.queryMsgList(xkMsgMain);
return getDataTable(msgMainList);
}
@ -36,7 +37,7 @@ public class MsgController extends BaseController {
return msgService.queryOne(msgId);
}
@ApiModelProperty("获取未读消息数量")
@ApiOperation("获取未读消息数量")
@GetMapping("/queryNoReadCount")
public Result queryNoReadCount(){
return msgService.queryNoReadCount();

View File

@ -3,8 +3,13 @@ package com.czblood.busBloodbank.mapper;
import com.czblood.bus.pojo.XkOutDetail;
import org.apache.ibatis.annotations.Param;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Objects;
public interface BackinMapper {
List<XkOutDetail> queryXkOutDetailList(@Param("bloodNo") String bloodNo, @Param("productNo") String productNo);
Date queryOutMainDate(@Param("bloodNo") String bloodNo, @Param("productNo") String productNo);
List<Map<String, Object>> queryPatientInfo(@Param("bloodNo") String bloodNo, @Param("productNo") String productNo);
}

View File

@ -0,0 +1,10 @@
package com.czblood.busBloodbank.mapper;
import com.czblood.bus.pojo.XkMsgMain;
import java.util.List;
import java.util.Map;
public interface MsgMapper {
List<Map<String,Object>> queryMapList(XkMsgMain xkMsgMain);
}

View File

@ -0,0 +1,17 @@
package com.czblood.busBloodbank.pojo.DTO;
import com.czblood.bus.pojo.XkBloodInfo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
import java.util.Map;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BackinDTO {
private List<Map<String,Object>> patientInfoList;
private XkBloodInfo xkBloodInfo;
}

View File

@ -1,13 +1,15 @@
package com.czblood.busBloodbank.service;
import com.czblood.bus.pojo.XkMsgMain;
import com.czblood.busBloodbank.pojo.DTO.MsgDTO;
import com.czblood.busBloodbank.pojo.VO.MsgVO;
import com.czblood.common.core.domain.Result;
import java.util.List;
import java.util.Map;
public interface MsgService {
List<XkMsgMain> queryMsgList(XkMsgMain xkMsgMain);
List<Map<String, Object>> queryMsgList(XkMsgMain xkMsgMain);
Result queryOne(int msgId);
Result updateFlag(MsgVO msgVO);
Result queryNoReadCount();

View File

@ -1,16 +1,20 @@
package com.czblood.busBloodbank.service.impl;
import com.czblood.bus.mapper.XkOutDetailMapper;
import cn.hutool.core.date.DateUtil;
import com.czblood.bus.mapper.XkReactionMapper;
import com.czblood.bus.pojo.XkBloodInfo;
import com.czblood.bus.pojo.XkOutDetail;
import com.czblood.bus.utils.BloodBankUtil;
import com.czblood.busBloodbank.mapper.BackinMapper;
import com.czblood.busBloodbank.pojo.DTO.BackinDTO;
import com.czblood.busBloodbank.service.BackinService;
import com.czblood.common.core.domain.Result;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
import java.util.Map;
@Service
public class BackinServiceImpl implements BackinService {
@ -19,6 +23,8 @@ public class BackinServiceImpl implements BackinService {
BloodBankUtil bloodBankUtil;
@Resource
BackinMapper backinMapper;
@Resource
XkReactionMapper xkReactionMapper;
@Override
public Result queryBloodInfo(String bloodNo, String productNo) {
@ -38,6 +44,19 @@ public class BackinServiceImpl implements BackinService {
break;
}
return null;
String bloodSort = BloodBankUtil.isBank(xkBloodInfo.getBlood_sort());
if(bloodSort.equals("Z")) return new Result("-1","该血液为自体血。不可在这操作!");
int count = xkReactionMapper.queryCount(bloodNo, productNo);
if(count > 0) return new Result("-1","该血液已经登记了输血反应,不可在这操作!");
Date outDate = backinMapper.queryOutMainDate(bloodNo, productNo);
//控制临床发血后的可退血时间,单位分钟
String tssjsz = bloodBankUtil.getParameterValue("TSSJSZ");
Date backinDate = DateUtil.offsetMinute(outDate,Integer.parseInt(tssjsz));
if(bloodBankUtil.getCurrentTimeDate().compareTo(backinDate) > 0) return new Result("-1","该血液已经超出可退血时间范围,不可退血!");
List<Map<String, Object>> patientInfoList = backinMapper.queryPatientInfo(bloodNo, productNo);
BackinDTO backinDTO = new BackinDTO();
backinDTO.setXkBloodInfo(xkBloodInfo);
backinDTO.setPatientInfoList(patientInfoList);
return new Result("0","操作成功",backinDTO);
}
}

View File

@ -10,6 +10,7 @@ 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.ParamExtra;
import com.czblood.bus.websocket.WebSocketServer;
import com.czblood.bus.websocket.WsMessage;
import com.czblood.busBloodbank.mapper.BloodOutMapper;
@ -492,7 +493,7 @@ public class BloodOutServiceImpl implements BloodOutService {
xkMsgDetailTemp.setMsg_Body(msgBody);
xkMsgDetailTemp.setAccept_Dept(xkOutMain.getDept_id());
xkMsgDetailTemp.setSend_Dept("输血科");
bloodOutUtil.updateNotifyTime(xkOutMainTemp,xkMsgMainTemp,xkMsgDetailTemp);
int msgId = bloodOutUtil.updateNotifyTime(xkOutMainTemp,xkMsgMainTemp,xkMsgDetailTemp);
//发送消息
//取血通知,传入的人,是取血人 ,但是我们需要通知这个取血人所对应的整个科室,比较合理
SysUser sysUserQuery = new SysUser();
@ -501,6 +502,8 @@ public class BloodOutServiceImpl implements BloodOutService {
for (SysUser sysUser : sysUserList) {
String userName = sysUser.getUserName();
WsMessage msg = new WsMessage();
ParamExtra paramExtra = new ParamExtra();
paramExtra.setMsgId(msgId);
WebSocketServer.sendMsg(userName,msg);
}
return new Result("0","操作成功");

View File

@ -5,6 +5,7 @@ import com.czblood.bus.mapper.XkMsgMainMapper;
import com.czblood.bus.pojo.XkMsgDetail;
import com.czblood.bus.pojo.XkMsgMain;
import com.czblood.bus.utils.BloodBankUtil;
import com.czblood.busBloodbank.mapper.MsgMapper;
import com.czblood.busBloodbank.pojo.DTO.MsgDTO;
import com.czblood.busBloodbank.pojo.VO.MsgVO;
import com.czblood.busBloodbank.service.MsgService;
@ -13,6 +14,7 @@ import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
@Service
public class MsgServiceImpl implements MsgService {
@ -21,10 +23,12 @@ public class MsgServiceImpl implements MsgService {
XkMsgMainMapper xkMsgMainMapper;
@Resource
XkMsgDetailMapper xkMsgDetailMapper;
@Resource
MsgMapper msgMapper;
@Override
public List<XkMsgMain> queryMsgList(XkMsgMain xkMsgMain) {
return xkMsgMainMapper.queryList(xkMsgMain);
public List<Map<String, Object>> queryMsgList(XkMsgMain xkMsgMain) {
return msgMapper.queryMapList(xkMsgMain);
}
@Override

View File

@ -2,6 +2,7 @@ package com.czblood.busBloodbank.utils;
import com.czblood.bus.mapper.*;
import com.czblood.bus.pojo.*;
import com.czblood.bus.websocket.SendMessageUtil;
import com.czblood.busBloodbank.pojo.VO.BloodOutInfoVO;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
@ -27,9 +28,7 @@ public class BloodOutUtil {
@Resource
XkMatchMainMapper xkMatchMainMapper;
@Resource
XkMsgMainMapper xkMsgMainMapper;
@Resource
XkMsgDetailMapper xkMsgDetailMapper;
SendMessageUtil sendMessageUtil;
@Transactional(rollbackFor = Exception.class)
public void saveBloodOutInfo(BloodOutInfoVO bloodOutInfoVO) {
@ -78,11 +77,9 @@ public class BloodOutUtil {
}
@Transactional(rollbackFor = Exception.class)
public void updateNotifyTime(XkOutMain xkOutMain,XkMsgMain xkMsgMain,XkMsgDetail xkMsgDetail){
public int updateNotifyTime(XkOutMain xkOutMain,XkMsgMain xkMsgMain,XkMsgDetail xkMsgDetail){
xkOutMainMapper.update(xkOutMain);
xkMsgMainMapper.insert(xkMsgMain);
xkMsgDetail.setMsgid(xkMsgMain.getMsgid());
xkMsgDetailMapper.insert(xkMsgDetail);
return sendMessageUtil.saveData(xkMsgMain,xkMsgDetail);
}
}

View File

@ -5,4 +5,32 @@
<select id="queryXkOutDetailList" resultType="com.czblood.bus.pojo.XkOutDetail">
<![CDATA[select * from xk_out_detail where blood_no = #{bloodNo} and product_no = #{productNo} and isnull(exp1,'') <> 'Y']]>
</select>
<select id="queryOutMainDate" resultType="java.util.Date">
SELECT check_date
FROM xk_out_main , xk_out_detail
Where xk_out_main.bill_no =xk_out_detail.bill_no and
xk_out_detail.blood_no = #{bloodNo} and
<![CDATA[xk_out_main.check_sign <> 'ZF' and]]>
xk_out_detail.product_no = #{productNo}
</select>
<select id="queryPatientInfo" resultType="java.util.Map">
SELECT xk_patient_info.beinhos_id,
xk_patient_info.patient_name,
xk_patient_info.patient_sex,
xk_patient_info.age,
xk_patient_info.abo,
xk_transfuse_apply.dept_id,
xk_transfuse_apply.abo_type
FROM xk_out_detail,
xk_out_main,
xk_patient_info,
xk_transfuse_apply
WHERE ( xk_out_main.bill_no = xk_out_detail.bill_no)AND
( xk_out_main.apply_no = xk_transfuse_apply.bill_no)AND
( xk_transfuse_apply.beinhos_id = xk_patient_info.beinhos_id ) and
( xk_out_detail.blood_no = #{bloodNo}) and
( xk_out_detail.product_no = #{productNo})
</select>
</mapper>

View File

@ -0,0 +1,19 @@
<?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.busBloodbank.mapper.MsgMapper">
<select id="queryMapList" resultType="java.util.Map">
select a.*,b.Msg_Body from xk_msg_main a,xk_msg_detail b where a.msgid = b.msgid
<if test="accept_Dept != null">and a.accept_Dept = #{accept_Dept}</if>
<if test="send_Person != null">and a.send_Person = #{send_Person}</if>
<if test="accept_Person != null">and a.accept_Person = #{accept_Person}</if>
<if test="read_Flag != null">and a.read_Flag = #{read_Flag}</if>
<if test="send_Flag != null">and a.send_Flag = #{send_Flag}</if>
<if test="accept_Flag != null">and a.accept_Flag = #{accept_Flag}</if>
<if test="msg_Type != null">and a.msg_Type = #{msg_Type}</if>
<if test="msg_Kind != null">and a.msg_Kind = #{msg_Kind}</if>
<if test="msgid != null">and a.msgid = #{msgid}</if>
<if test="sWriteDate != null"><![CDATA[and a.write_Date >= #{sWriteDate} ]]></if>
<if test="eWriteDate != null"><![CDATA[and a.write_Date <= #{eWriteDate} ]]></if>
</select>
</mapper>