血型复核

This commit is contained in:
jiangs 2026-07-31 18:08:14 +08:00
parent 101ba77adb
commit 1977834940
12 changed files with 353 additions and 3 deletions

View File

@ -3,6 +3,9 @@ package com.czblood.bus.constants;
import java.util.Arrays;
import java.util.List;
/**
* 输血申请单闭环状态
*/
public class BloodApplyStatusConstants {
public static final String BILL_STATUS_OPEN = "开单";
public static final String BILL_STATUS_CHECK_DOCTOR = "上级医生审核";

View File

@ -45,4 +45,8 @@ public class BloodInterfaceTypeConstants {
* 调用his电子病历接口
*/
public static final String INVOKE_HIS_EMR = "INVOKE_HIS_EMR";
/**
* 血型复核
*/
public static final String CHECK_BLOOD_TYPE = "CHECK_BLOOD_TYPE";
}

View File

@ -0,0 +1,21 @@
package com.czblood.bus.pojo.inter;
import cn.hutool.json.JSONUtil;
import com.czblood.bus.constants.BloodInterfaceTypeConstants;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@AllArgsConstructor
@NoArgsConstructor
@Data
public class CheckBloodTypeRequest implements BloodInterfaceType {
private final String method = BloodInterfaceTypeConstants.CHECK_BLOOD_TYPE;
private String billNo;
@Override
public String serializationJson() {
return JSONUtil.toJsonStr(this);
}
}

View File

@ -86,10 +86,10 @@
<if test="senddate != null ">senddate = #{senddate},</if>
<if test="sendperson != null ">sendperson = #{sendperson},</if>
<if test="createtime != null ">createtime = #{createtime},</if>
Sample_No = #{sample_no}
where Sample_No = #{sample_no}
Sample_No = #{sample_No}
where Sample_No = #{sample_No}
</update>
<select id="queryOne" resultType="com.czblood.bus.pojo.XkSampleInfo">
select * from xk_sample_info where Sample_No = #{Sample_No}
select * from xk_sample_info where Sample_No = #{sampleNo}
</select>
</mapper>

View File

@ -0,0 +1,42 @@
package com.czblood.busBloodbank.controller;
import com.czblood.bus.pojo.XkCheckBloodtype;
import com.czblood.busBloodbank.service.CheckBloodTypeService;
import com.czblood.common.core.domain.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@Api(tags = "血型复核")
@RestController
@RequestMapping("/bus/bloodbank/checkBloodType")
public class CheckBloodTypeController {
@Resource
private CheckBloodTypeService checkBloodTypeService;
@ApiOperation("获取待血型复核的单据")
@GetMapping("/queryCheckBloodTypeInfo")
public Result queryWaitInfo(){
return checkBloodTypeService.queryWaitInfo();
}
@ApiOperation("查询单据详情")
@GetMapping("/queryOne")
public Result queryOne(String billNo){
return checkBloodTypeService.queryOne(billNo);
}
@ApiOperation("保存数据")
@PostMapping("/saveData")
public Result saveData(@RequestBody XkCheckBloodtype xkCheckBloodtype){
return checkBloodTypeService.saveData(xkCheckBloodtype);
}
}

View File

@ -0,0 +1,10 @@
package com.czblood.busBloodbank.mapper;
import java.util.List;
import java.util.Map;
public interface CheckBloodTypeMapper {
List<Map<String,Object>> queryWaitInfo(String bbjszhxxfh);
int checkMatchedBloodNotOut(String billNo);
List<Map<String,Object>> queryOne(String billNo);
}

View File

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

View File

@ -0,0 +1,10 @@
package com.czblood.busBloodbank.service;
import com.czblood.bus.pojo.XkCheckBloodtype;
import com.czblood.common.core.domain.Result;
public interface CheckBloodTypeService {
Result queryWaitInfo();
Result queryOne(String billNo);
Result saveData(XkCheckBloodtype xkCheckBloodtype);
}

View File

@ -0,0 +1,101 @@
package com.czblood.busBloodbank.service.impl;
import com.czblood.bus.mapper.XkCheckBloodtypeMapper;
import com.czblood.bus.mapper.XkTransfuseApplyBloodbreedMapper;
import com.czblood.bus.mapper.XkTransfuseApplyMapper;
import com.czblood.bus.pojo.XkCheckBloodtype;
import com.czblood.bus.pojo.XkTransfuseApply;
import com.czblood.bus.pojo.XkTransfuseApplyBloodbreed;
import com.czblood.bus.pojo.inter.CheckBloodTypeRequest;
import com.czblood.bus.utils.BloodBankUtil;
import com.czblood.bus.utils.BloodInterfaceUtil;
import com.czblood.busBloodbank.mapper.CheckBloodTypeMapper;
import com.czblood.busBloodbank.pojo.DTO.CheckBloodTypeDTO;
import com.czblood.busBloodbank.service.CheckBloodTypeService;
import com.czblood.busBloodbank.utils.CheckBloodTypeUtil;
import com.czblood.common.core.domain.Result;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
@Service
public class CheckBloodTypeServiceImpl implements CheckBloodTypeService {
@Resource
CheckBloodTypeMapper checkBloodTypeMapper;
@Resource
BloodBankUtil bloodBankUtil;
@Resource
CheckBloodTypeUtil checkBloodTypeUtil;
@Resource
XkTransfuseApplyBloodbreedMapper xkTransfuseApplyBloodbreedMapper;
@Resource
XkTransfuseApplyMapper xkTransfuseApplyMapper;
@Resource
XkCheckBloodtypeMapper xkCheckBloodtypeMapper;
@Override
public Result queryWaitInfo() {
//只复核标本接收之后的申请单
String bbjszhxxfh = bloodBankUtil.getParameterValue("BBJSZHXXFH");
List<Map<String, Object>> mapList = checkBloodTypeMapper.queryWaitInfo(bbjszhxxfh);
return new Result("0","获取数据成功!",mapList);
}
@Override
public Result queryOne(String billNo) {
//校验单据是否有效
Result result = checkBloodTypeUtil.checkBillNoIsValid(billNo);
if(!result.getCode().equals("0")) return result;
List<Map<String, Object>> mapList = checkBloodTypeMapper.queryOne(billNo);
List<XkTransfuseApplyBloodbreed> xkTransfuseApplyBloodbreedList = xkTransfuseApplyBloodbreedMapper.queryOne(billNo);
CheckBloodTypeDTO checkBloodTypeDTO = new CheckBloodTypeDTO();
checkBloodTypeDTO.setPatientInfoList(mapList);
checkBloodTypeDTO.setXkTransfuseApplyBloodbreedList(xkTransfuseApplyBloodbreedList);
return new Result("0","查询数据成功!",checkBloodTypeDTO);
}
/**
* 保存数据
* @param xkCheckBloodtype
* @return
*/
@Override
public Result saveData(XkCheckBloodtype xkCheckBloodtype) {
String applyNo = xkCheckBloodtype.getApply_no();
XkTransfuseApply xkTransfuseApply = xkTransfuseApplyMapper.queryOne(applyNo);
if(xkTransfuseApply == null) return new Result("-1","若不是紧急情况,请先选择输血申请单!");
XkCheckBloodtype xkCheckBloodtypeQuery = new XkCheckBloodtype();
xkCheckBloodtypeQuery.setApply_no(applyNo);
List<XkCheckBloodtype> xkCheckBloodtypeList = xkCheckBloodtypeMapper.queryList(xkCheckBloodtypeQuery);
if(!xkCheckBloodtypeList.isEmpty()){
String billStatus = xkCheckBloodtypeList.get(0).getBill_status();
if(billStatus.equals("B")) return new Result("0","该申请单的血型复核单已配血,不可修改!");
if(billStatus.equals("C")) return new Result("0","该申请单的血型复核单已发血,不可修改!");
}
String billSort = xkTransfuseApply.getBill_sort();
if(billSort.equals("B")){
xkCheckBloodtype.setBill_status("Y");
}else{
xkCheckBloodtype.setBill_status("N");
}
String newBillNo = bloodBankUtil.produceBillNo("XXFH");
xkCheckBloodtype.setBill_no(newBillNo);
XkTransfuseApply xkTransfuseApplyTemp = new XkTransfuseApply();
xkTransfuseApplyTemp.setBill_no(applyNo);
xkTransfuseApplyTemp.setBill_stasus("F");
xkTransfuseApplyTemp.setNotify_sign("Y");
//当血型复核的结果和申请单之前的接口不一致的时候,需要更新申请单的血型,以及病人基本信息的血型 TODO
checkBloodTypeUtil.saveData(xkCheckBloodtype,xkTransfuseApplyTemp);
//调用外部接口
CheckBloodTypeRequest checkBloodTypeRequest = new CheckBloodTypeRequest();
Result result = BloodInterfaceUtil.invokeBloodInterface(checkBloodTypeRequest);
if(!result.getCode().equals("0")) return result;
return new Result("0","保存数据成功!",newBillNo);
}
}

View File

@ -0,0 +1,65 @@
package com.czblood.busBloodbank.utils;
import com.czblood.bus.mapper.XkCheckBloodtypeMapper;
import com.czblood.bus.mapper.XkTransfuseApplyMapper;
import com.czblood.bus.pojo.XkCheckBloodtype;
import com.czblood.bus.pojo.XkTransfuseApply;
import com.czblood.busBloodbank.mapper.CheckBloodTypeMapper;
import com.czblood.common.core.domain.Result;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
@Component
public class CheckBloodTypeUtil {
@Resource
XkTransfuseApplyMapper xkTransfuseApplyMapper;
@Resource
CheckBloodTypeMapper checkBloodTypeMapper;
@Resource
XkCheckBloodtypeMapper xkCheckBloodtypeMapper;
/**
* 校验申请单是否有效
* @param billNo
* @return
*/
public Result checkBillNoIsValid(String billNo){
XkTransfuseApply xkTransfuseApply = xkTransfuseApplyMapper.queryOne(billNo);
if(xkTransfuseApply == null) return new Result("0","申请单不存在!");
String billSort = xkTransfuseApply.getBill_sort();
String billStasus = xkTransfuseApply.getBill_stasus();
if(billSort.equals("C")) return new Result("-1","该申请单无需复核血型!");
switch (billStasus){
case "C":
return new Result("-1","该申请单已经配血!");
case "Z":
return new Result("-1","该申请单已经作废!");
case "A":
return new Result("-1","该申请单未审核,不能进行下一步操作!");
case "N":
return new Result("-1","该申请单审核不通过,不能进行下一步操作!");
case "S":
return new Result("-1","该申请单已经追加配血,可直接在临床发血中发血!");
case "F":
return new Result("-1","该申请单已经复核血型!");
case "SF":
return new Result("-1","该申请单已追加配血!");
case "W":
return new Result("-1","该申请单为补单!");
case "D":
int count = checkBloodTypeMapper.checkMatchedBloodNotOut(billNo);
if(count > 0) return new Result("-1","检测到该申请单尚有配好的血液未出库,请先出库该部分血液再追加配血!");
}
return new Result("0","校验通过!");
}
@Transactional(rollbackFor = Exception.class)
public void saveData(XkCheckBloodtype xkCheckBloodtype,XkTransfuseApply xkTransfuseApply){
xkCheckBloodtypeMapper.insert(xkCheckBloodtype);
xkTransfuseApplyMapper.update(xkTransfuseApply);
}
}

View File

@ -0,0 +1,65 @@
<?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.CheckBloodTypeMapper">
<select id="queryWaitInfo" resultType="java.util.Map">
SELECT xk_transfuse_apply.bill_no,
xk_patient_info.patient_name,
xk_transfuse_apply.dept_id ,apply_date,xk_transfuse_apply_bloodbreed.blood_breed
FROM xk_transfuse_apply with (nolock) LEFT OUTER JOIN xk_patient_info with (nolock) ON xk_transfuse_apply.beinhos_id = xk_patient_info.beinhos_id ,
xk_dmzd,xk_transfuse_apply_bloodbreed with (nolock)
WHERE (xk_transfuse_apply.bill_no = xk_transfuse_apply_bloodbreed.bill_no) and
(xk_transfuse_apply.check_sign = 'Y' or xk_transfuse_apply.check_sign = 'y' )and
(xk_transfuse_apply.bill_stasus = 'b'or xk_transfuse_apply.bill_stasus = 'B')AND
(xk_transfuse_apply.bill_sort = 'A' OR xk_transfuse_apply.bill_sort = 'B' )AND
( xk_transfuse_apply.bill_no NOT IN ( SELECT apply_no FROM xk_match_apply))AND
(xk_transfuse_apply.operation_type ='C' or isnull(xk_transfuse_apply.operation_type,'') = '') AND
(((xk_transfuse_apply.check_explain = xk_dmzd.wordbook_code) AND (xk_dmzd.wordbook_sign ='sqdshyj') and (xk_dmzd.exp1 = 'Y')) OR (isnull(xk_transfuse_apply.check_explain,'') = ''))
-- 两天前 00:00:00 当天23:59:59
AND xk_transfuse_apply.apply_date between DATEADD(DD, DATEDIFF(DD,0,GETDATE())-2, 0) and DATEADD(SS, -1, DATEADD(DD, DATEDIFF(DD,0,GETDATE())+1, 0))
<if test="bbjszhxxfh == 'Y'"><![CDATA[and xk_transfuse_apply.bill_no in (select Relate_ApplyNo from xk_sample_info where TakeOver_Man is not null or TakeOver_Man <> '')]]></if>
</select>
<select id="checkMatchedBloodNotOut" resultType="java.lang.Integer">
SELECT Count ( xk_match_detail.blood_no )
FROM xk_blood_info , xk_match_detail , xk_match_main , xk_transfuse_apply , xk_dmzd
WHERE ( xk_blood_info.blood_no =xk_match_detail.blood_no ) AND
( xk_match_detail.bill_no =xk_match_main.bill_no ) AND
( xk_match_main.apply_no =xk_transfuse_apply.bill_no ) AND
( xk_transfuse_apply.bill_stasus ='D' ) AND
( xk_blood_info.blood_status ='1' ) AND
( xk_transfuse_apply.bill_no = #{billNo} ) and
( xk_match_detail.result =xk_dmzd.wordbook_code and
xk_dmzd.wordbook_sign ='pxjg' and
xk_dmzd.remark ='Y' );
</select>
<select id="queryOne" resultType="java.util.Map">
SELECT
xk_patient_info.patient_name ,
xk_patient_info.age ,
xk_patient_info.patient_sex ,
xk_transfuse_apply.bill_no ,
xk_patient_info.transfuse_history ,
xk_patient_info.gestation_history ,
xk_patient_info.parturition_history ,
xk_patient_info.reaction_history ,
xk_patient_info.match_history ,
xk_transfuse_apply.apply_date ,
xk_transfuse_apply.abo_type ,
xk_transfuse_apply.rh_type ,
xk_transfuse_apply.diagnoses ,
xk_transfuse_apply.intent ,
xk_transfuse_apply.apply_type ,
xk_transfuse_apply.use3_date ,
xk_transfuse_apply.use2_date ,
xk_transfuse_apply.use1_date ,
xk_transfuse_apply.beinhos_id ,
xk_transfuse_apply.dept_id ,
xk_transfuse_apply.patient_bed ,
xk_transfuse_apply.zone_id,
xk_transfuse_apply.bill_sort,
xk_transfuse_apply.bill_stasus
FROM xk_patient_info RIGHT OUTER JOIN xk_transfuse_apply ON xk_patient_info.beinhos_id = xk_transfuse_apply.beinhos_id
WHERE xk_transfuse_apply.bill_no = #{billNo}
</select>
</mapper>

View File

@ -521,3 +521,15 @@ if not exists(SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'xk_s
alter table xk_search_transfuse_bill add hos_id varchar(10)
END
GO
IF NOT EXISTS (SELECT 1 FROM sys.key_constraints WHERE name = 'PK_xk_sample_info' AND type = 'PK' )
BEGIN
ALTER TABLE xk_sample_info ADD CONSTRAINT PK_xk_sample_info PRIMARY KEY CLUSTERED (Sample_No);
END
GO
IF NOT EXISTS (SELECT 1 FROM sys.key_constraints WHERE name = 'PK_xk_check_bloodtype' AND type = 'PK' )
BEGIN
ALTER TABLE xk_check_bloodtype ADD CONSTRAINT PK_xk_check_bloodtype PRIMARY KEY CLUSTERED (bill_no);
END
GO