消息系统,临床发血退血

This commit is contained in:
jiangs 2026-08-28 16:37:01 +08:00
parent aab8ed58b0
commit a16d8342f0
33 changed files with 703 additions and 25 deletions

View File

@ -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>

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View 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;
}

View File

@ -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);
}
}

View File

@ -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;

View File

@ -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;
}
}

View File

@ -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:
//
// }
// }
}

View File

@ -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);
// }
}

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.XkBackinDetailMapper">
<select id="queryListByBillNo" resultType="com.czblood.bus.pojo.XkBackinDetail">
select * from xk_backin_detail where bill_no = #{bill_no}
</select>
</mapper>

View 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>

View 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>

View 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>

View File

@ -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);
}
}

View File

@ -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);
}

View File

@ -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","操作成功");
}
}

View File

@ -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;
}
}

View File

@ -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);
}
}

View File

@ -36,7 +36,10 @@ public class MimeTypeUtils
// 视频格式
"mp4", "avi", "rmvb",
// pdf
"pdf" };
"pdf" ,
//打印模版文件
"jrxml"
};
public static String getExtension(String prefix)
{

View File

@ -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>-->

View File

@ -127,5 +127,5 @@ public interface SysUserMapper {
public SysUser checkEmailUnique(String email);
public SysUser queryUserList(SysUser sysUser);
public List<SysUser> queryUserList(SysUser sysUser);
}

View File

@ -208,5 +208,5 @@ public interface ISysUserService {
Result syncUser(String loginYLJG);
public SysUser queryUserList(SysUser sysUser);
public List<SysUser> queryUserList(SysUser sysUser);
}

View File

@ -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);
}
}

View File

@ -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);

View File

@ -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);
}

View File

@ -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">

View File

@ -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

View File

@ -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