临床发血,审核逻辑,打印

This commit is contained in:
jiangs 2026-08-17 18:00:40 +08:00
parent 20aca19131
commit 06478b0bad
11 changed files with 187 additions and 16 deletions

View File

@ -24,4 +24,8 @@ public class BloodPrintTypeConstants {
* 输血申请单
*/
public static final String BLOOD_APPLY = "BLOOD_APPLY";
/**
* 临床发血单
*/
public static final String BLOOD_OUT = "BLOOD_OUT";
}

View File

@ -15,5 +15,5 @@ public class BloodSysLogConstants {
public static final String LOG_TYPE_SEND_SAMPLE_INFO = "标本送检";
public static final String LOG_TYPE_CHECK_BLOOD_TYPE = "血型复核";
public static final String LOG_TYPE_MATCH_BLOOD = "交叉配血";
public static final String LOG_TYPE_BLOOD_OUT = "临床发血审核";
public static final String LOG_TYPE_BLOOD_OUT = "临床发血";
}

View File

@ -8,4 +8,5 @@ import java.util.List;
public interface XkBloodInfoMapper {
XkBloodInfo queryOne(@Param("bloodNo") String bloodNo, @Param("productNo") String productNo);
List<XkBloodInfo> queryListByBloodNo(String bloodNo);
void update(XkBloodInfo xkBloodInfo);
}

View File

@ -2,6 +2,35 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.czblood.bus.mapper.XkBloodInfoMapper">
<update id="update">
update xk_blood_info set
<if test="blood_batch != null">blood_batch = #{blood_batch},</if>
<if test="donor_no != null">donor_no = #{donor_no},</if>
<if test="donblood_no != null">donblood_no = #{donblood_no},</if>
<if test="blood_breed != null">blood_breed = #{blood_breed},</if>
<if test="blood_type != null">blood_type = #{blood_type},</if>
<if test="rh_blood_type != null">rh_blood_type = #{rh_blood_type},</if>
<if test="capacity != null">capacity = #{capacity},</if>
<if test="unit != null">unit = #{unit},</if>
<if test="pick_date != null">pick_date = #{pick_date},</if>
<if test="produce_date != null">produce_date = #{produce_date},</if>
<if test="valid_date != null">valid_date = #{valid_date},</if>
<if test="blood_bag_kind != null">blood_bag_kind = #{blood_bag_kind},</if>
<if test="blood_bag_spec != null">blood_bag_spec = #{blood_bag_spec},</if>
<if test="blood_bag_no != null">blood_bag_no = #{blood_bag_no},</if>
<if test="blood_bag_batch != null">blood_bag_batch = #{blood_bag_batch},</if>
<if test="blood_status != null">blood_status = #{blood_status},</if>
<if test="special_deal != null">special_deal = #{special_deal},</if>
<if test="blood_source != null">blood_source = #{blood_source},</if>
<if test="auto_no != null">auto_no = #{auto_no},</if>
<if test="blood_sort != null">blood_sort = #{blood_sort},</if>
<if test="last_modified != null">last_modified = #{last_modified},</if>
<if test="abnor_sign != null">abnor_sign = #{abnor_sign},</if>
<if test="recycle_sign != null">recycle_sign = #{recycle_sign},</if>
<if test="Remark != null">Remark = #{Remark},</if>
hos_id = #{hos_id}
where blood_no = #{blood_no} and product_no = #{blood_no}
</update>
<select id="queryOne" resultType="com.czblood.bus.pojo.XkBloodInfo">
select * from xk_blood_info where blood_no = #{bloodNo} and product_no = #{productNo}

View File

@ -11,6 +11,7 @@ import com.czblood.common.core.domain.Result;
import com.czblood.common.enums.BusinessType;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@ -50,6 +51,7 @@ public class BloodOutController extends BaseController {
return bloodOutService.saveData(bloodOutInfoVO);
}
@Log(title = BloodSysLogConstants.LOG_TYPE_BLOOD_OUT, businessType = BusinessType.CHECK)
@ApiOperation("临床发血审核")
@PostMapping("/bloodOutAudit")
public Result bloodOutAudit(@RequestBody BloodOutAuditVO bloodOutAuditVO){
@ -57,4 +59,18 @@ public class BloodOutController extends BaseController {
return bloodOutService.bloodOutAudit(bloodOutAuditVO);
}
@ApiOperation("通知护士取血")
@GetMapping("/notifyMessage")
public Result notifyMessage(String billNo){
return bloodOutService.notifyMessage(billNo);
}
@ApiOperation("打印单据")
@GetMapping("/printReport")
public Result printReport(@ApiParam(value = "单据编号", required = true) String billNo,
@ApiParam(value = "模板名称:BLOOD_OUT(临床发血单)", required = true)
String templateName){
return bloodOutService.printReport(billNo, templateName);
}
}

View File

@ -1,9 +1,6 @@
package com.czblood.busBloodbank.mapper;
import com.czblood.bus.pojo.XkBackoutDetail;
import com.czblood.bus.pojo.XkDiscardMain;
import com.czblood.bus.pojo.XkMatchMain;
import com.czblood.bus.pojo.XkSampleInfo;
import com.czblood.bus.pojo.*;
import org.apache.ibatis.annotations.Param;
import java.util.Date;
@ -21,5 +18,6 @@ public interface BloodOutMapper {
XkMatchMain queryXkMatchMain(String applyNo);
String queryMaxCheckNo(String applyNo);
Date querySampleMaxPickDate(String applyNo);
List<XkCheckBloodtype> queryCheckBloodtype(String applyNo);
}

View File

@ -1,5 +1,6 @@
package com.czblood.busBloodbank.pojo.VO;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@ -8,7 +9,11 @@ import lombok.NoArgsConstructor;
@AllArgsConstructor
@NoArgsConstructor
public class BloodOutAuditVO {
@ApiModelProperty("发血单号")
private String billNo;
@ApiModelProperty("申请单号")
private String applyNo;
private String userId;
@ApiModelProperty("取血者")
private String takePerson;
}

View File

@ -10,4 +10,6 @@ public interface BloodOutService {
Result getBloodInfoOut(String bloodNo, String productNo,String applyNo);
Result saveData(BloodOutInfoVO bloodOutInfoVO);
Result bloodOutAudit(BloodOutAuditVO bloodOutAuditVO);
Result notifyMessage(String billNo);
Result printReport(String billNo, String templateName);
}

View File

@ -3,8 +3,10 @@ package com.czblood.busBloodbank.service.impl;
import cn.hutool.core.date.DateUtil;
import com.czblood.bus.mapper.*;
import com.czblood.bus.pojo.*;
import com.czblood.bus.pojo.inter.BloodOutAuditRequest;
import com.czblood.bus.pojo.xtwh.XkBloodBreed;
import com.czblood.bus.utils.BloodBankUtil;
import com.czblood.bus.utils.BloodInterfaceUtil;
import com.czblood.busBloodbank.mapper.BloodOutMapper;
import com.czblood.busBloodbank.pojo.DTO.BloodOutDTO;
import com.czblood.busBloodbank.pojo.DTO.BloodOutInfoDTO;
@ -17,6 +19,7 @@ import com.czblood.common.core.domain.Result;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
@ -44,6 +47,8 @@ public class BloodOutServiceImpl implements BloodOutService {
XkInstorageDetailMapper xkInstorageDetailMapper;
@Resource
BloodOutUtil bloodOutUtil;
@Resource
XkOutDetailMapper xkOutDetailMapper;
@ -131,8 +136,9 @@ public class BloodOutServiceImpl implements BloodOutService {
if(checkNo.equals("")) checkNo = BloodBankUtil.isBank(bloodOutMapper.queryMaxCheckNo(applyNo));
xkOutMain.setMatch_no(matchNo);
xkOutMain.setCheck_no(checkNo);
xkOutMain.setExp2("Y"); //通知取血护士
xkOutMain.setNotify_time(currentTimeDate);
//这一步应该放到审核里面去合理点
// xkOutMain.setExp2("Y"); //通知取血护士
// xkOutMain.setNotify_time(currentTimeDate);
xkOutMain.setBill_sort("C"); //程序默认C 了 。。。
xkOutMain.setIs_free_account("N");
xkOutMain.setAll_recycle_sign("N");
@ -167,17 +173,97 @@ public class BloodOutServiceImpl implements BloodOutService {
public Result bloodOutAudit(BloodOutAuditVO bloodOutAuditVO) {
String billNo = bloodOutAuditVO.getBillNo();
String applyNo = bloodOutAuditVO.getApplyNo();
String userId = bloodOutAuditVO.getUserId();
Result result = bloodBankUtil.checkOperatorModify("LCFX", bloodOutAuditVO.getBillNo(), false, bloodOutAuditVO.getUserId());
if(!result.getCode().equals("0")) return result;
XkOutMain xkOutMainDB = xkOutMainMapper.queryOne(billNo);
String checkSign = xkOutMainDB.getCheck_sign();
String beinhosId = xkOutMainDB.getBeinhos_id();
if(checkSign.equals("Y")) return new Result("-1","该单据已经通过审核,不能作修改!");
Result result1 = checkSampleValid(applyNo);
if(!result1.getCode().equals("0")) return result1;
//TODO 后面还有逻辑
List<XkBloodInfo> xkBloodInfoList = new ArrayList<>();
List<XkOutDetail> xkOutDetailList = xkOutDetailMapper.queryListByBillNo(billNo);
XkBloodInfo xkBloodInfoTemp = null;
for (XkOutDetail xkOutDetail : xkOutDetailList) {
String bloodNo = xkOutDetail.getBlood_no();
String productNo = xkOutDetail.getProduct_no();
XkBloodInfo xkBloodInfo = xkBloodInfoMapper.queryOne(bloodNo, productNo);
String bloodStatus = xkBloodInfo.getBlood_status();
switch (bloodStatus){
case "2":
return new Result("-1","血液:" + bloodNo + "已经报废,不能够出库");
case "4":
return new Result("-1","血液:" + bloodNo + "已经发出血库,不能够出库");
}
//修改血液状态
xkBloodInfoTemp = new XkBloodInfo();
xkBloodInfoTemp.setBlood_status("4");
xkBloodInfoTemp.setBlood_no(bloodNo);
xkBloodInfoTemp.setProduct_no(productNo);
xkBloodInfoTemp.setAbnor_sign("N");
xkBloodInfoList.add(xkBloodInfoTemp);
}
XkOutMain xkOutMainTemp = new XkOutMain();
xkOutMainTemp.setBill_no(billNo);
xkOutMainTemp.setCheck_sign("Y");
xkOutMainTemp.setCheck_person(userId);
xkOutMainTemp.setCheck_date(bloodBankUtil.getCurrentTimeDate());
xkOutMainTemp.setTake_person(bloodOutAuditVO.getTakePerson());
xkOutMainTemp.setExp2("N");
XkTransfuseApply xkTransfuseApplyTemp = new XkTransfuseApply();
xkTransfuseApplyTemp.setBill_no(applyNo);
xkTransfuseApplyTemp.setBill_stasus("D");
//交叉配血
XkMatchMain xkMatchMain = bloodOutMapper.queryXkMatchMain(applyNo);
XkMatchMain xkMatchMainTemp = null;
if(xkMatchMain != null){
xkMatchMainTemp = new XkMatchMain();
xkMatchMainTemp.setBill_no(xkMatchMain.getBill_no());
xkMatchMainTemp.setBill_status("B");
}
//血型复核
List<XkCheckBloodtype> xkCheckBloodtypeList = bloodOutMapper.queryCheckBloodtype(applyNo);
XkCheckBloodtype xkCheckBloodtypeTemp = null;
if(!xkCheckBloodtypeList.isEmpty()){
xkCheckBloodtypeTemp = new XkCheckBloodtype();
xkCheckBloodtypeTemp.setBill_status("C");
xkCheckBloodtypeTemp.setBill_no(xkCheckBloodtypeList.get(0).getBill_no());
}
//病人信息
XkPatientInfo xkPatientInfoTemp = new XkPatientInfo();
xkPatientInfoTemp.setTransfuse_history("Y");
xkPatientInfoTemp.setBeinhos_id(beinhosId);
bloodOutUtil.auditBloodOutInfo(xkBloodInfoTemp,xkTransfuseApplyTemp,xkOutMainTemp,xkCheckBloodtypeTemp,xkPatientInfoTemp,xkMatchMainTemp);
//通知护士取血
notifyBloodOut(billNo);
//调用外部接口
BloodOutAuditRequest bloodOutAuditRequest = new BloodOutAuditRequest();
bloodOutAuditRequest.setBillNo(billNo);
Result result2 = BloodInterfaceUtil.invokeBloodInterface(bloodOutAuditRequest);
if(!result2.getCode().equals("0")) return result2;
return new Result("0","审核成功");
}
@Override
public Result notifyMessage(String billNo) {
notifyBloodOut(billNo);
return new Result("0","通知成功");
}
@Override
public Result printReport(String billNo, String templateName) {
return null;
}
public Result checkBloodValid(XkTransfuseApply xkTransfuseApply){
String billSort = xkTransfuseApply.getBill_sort();
@ -305,4 +391,17 @@ public class BloodOutServiceImpl implements BloodOutService {
}
return new Result("0","操作成功");
}
/**
* 通知护士取血
* @param billNo
*/
public void notifyBloodOut(String billNo){
//TODO 这里应该还有通过websocket发消息给护士站的逻辑
XkOutMain xkOutMainTemp = new XkOutMain();
xkOutMainTemp.setExp2("Y");
xkOutMainTemp.setNotify_time(bloodBankUtil.getCurrentTimeDate());
xkOutMainTemp.setBill_no(billNo);
xkOutMainMapper.insert(xkOutMainTemp);
}
}

View File

@ -1,13 +1,7 @@
package com.czblood.busBloodbank.utils;
import com.czblood.bus.mapper.XkOutDetailMapper;
import com.czblood.bus.mapper.XkOutMainMapper;
import com.czblood.bus.mapper.XkPatientInfoMapper;
import com.czblood.bus.mapper.XkTransfuseApplyMapper;
import com.czblood.bus.pojo.XkOutDetail;
import com.czblood.bus.pojo.XkOutMain;
import com.czblood.bus.pojo.XkPatientInfo;
import com.czblood.bus.pojo.XkTransfuseApply;
import com.czblood.bus.mapper.*;
import com.czblood.bus.pojo.*;
import com.czblood.busBloodbank.pojo.VO.BloodOutInfoVO;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
@ -26,6 +20,12 @@ public class BloodOutUtil {
private XkTransfuseApplyMapper xkTransfuseApplyMapper;
@Resource
XkPatientInfoMapper xkPatientInfoMapper;
@Resource
XkCheckBloodtypeMapper xkCheckBloodtypeMapper;
@Resource
XkBloodInfoMapper xkBloodInfoMapper;
@Resource
XkMatchMainMapper xkMatchMainMapper;
@Transactional(rollbackFor = Exception.class)
public void saveBloodOutInfo(BloodOutInfoVO bloodOutInfoVO) {
@ -60,4 +60,17 @@ public class BloodOutUtil {
}
@Transactional(rollbackFor = Exception.class)
public void auditBloodOutInfo(XkBloodInfo xkBloodInfo,XkTransfuseApply xkTransfuseApply,XkOutMain xkOutMain,
XkCheckBloodtype xkCheckBloodtype,
XkPatientInfo xkPatientInfo,
XkMatchMain xkMatchMain){
xkOutMainMapper.update(xkOutMain);
xkTransfuseApplyMapper.update(xkTransfuseApply);
if(xkCheckBloodtype != null) xkCheckBloodtypeMapper.update(xkCheckBloodtype);
xkPatientInfoMapper.updateXkPatientInfo(xkPatientInfo);
xkBloodInfoMapper.update(xkBloodInfo);
if(xkMatchMain != null) xkMatchMainMapper.update(xkMatchMain);
}
}

View File

@ -164,4 +164,8 @@
<select id="querySampleMaxPickDate" resultType="java.util.Date">
SELECT Max(Pick_Date) FROM xk_sample_info Where Relate_Applyno = #{applyNo}
</select>
<select id="queryCheckBloodtype" resultType="com.czblood.bus.pojo.XkCheckBloodtype">
SELECT * FROM xk_check_bloodtype
Where apply_no = #{applyNo} And ( bill_status ='A' OR bill_status ='B' )
</select>
</mapper>