输血报告单视图和静态文件资源映射

master
wyb 2 years ago
parent e5aa337efe
commit e212c83102

@ -7,5 +7,14 @@
"action": "HIS_ZY_CYYZ",
"accessKey":"1094ddfc-5445-57d0-cc6f-54d812931688"
}
},
{
"key": "BLOOD",
"desc": "根据文件名查询输血报告文件流",
"url": "http://192.168.12.74:8009/FileHandler.ashx",
"otherParam": {
"hqMethod": "DOWNLOAD",
"hqToken":"409289e2-fa62-11e6-9724-00163e022dec"
}
}
]

@ -175,6 +175,12 @@
<scope>test</scope>
</dependency>
<!--sqlserver驱动-->
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>sqljdbc4</artifactId>
<version>4.0</version>
</dependency>
</dependencies>
<build>

@ -1,8 +1,11 @@
package com.docus.server.message.busservice;
import com.docus.server.message.controller.vo.SdRyBloodReportVO;
import com.docus.server.message.dto.Message;
import com.docus.server.message.dto.MessageResponse;
import java.util.List;
public interface SdBusinessService {
/**
*
@ -22,6 +25,7 @@ public interface SdBusinessService {
/**
* ,
*
* @param inpatientNo
* @param admissTimes
*/
@ -29,9 +33,18 @@ public interface SdBusinessService {
/**
* ()
*
* @param inpatientNo
* @param admissTimes
* @return true false
*/
boolean isIcuRecord(String inpatientNo, Integer admissTimes);
/**
*
* @param inpatientNo
* @param admissTimes
* @return
*/
List<SdRyBloodReportVO> getBloodView(String inpatientNo, Integer admissTimes);
}

@ -1,34 +1,40 @@
package com.docus.server.message.busservice.impl;
import com.docus.core.util.FileUtil;
import com.docus.core.util.Func;
import com.docus.infrastructure.core.exception.BaseException;
import com.docus.infrastructure.web.api.CommonResult;
import com.docus.infrastructure.web.api.ResultCode;
import com.docus.server.message.busservice.SdBusinessService;
import com.docus.server.message.config.CollectTaskConfig;
import com.docus.server.message.consts.StaticResourceMapping;
import com.docus.server.message.controller.vo.SdRyBloodReportVO;
import com.docus.server.message.converters.WsNurseSubmitMessageConvert;
import com.docus.server.message.converters.WsRecordSubmitMessageConvert;
import com.docus.server.message.dto.Message;
import com.docus.server.message.dto.MessageResponse;
import com.docus.server.message.dto.RecordSubmitDTO;
import com.docus.server.message.dto.WsNurseSubmitDTO;
import com.docus.server.message.dto.*;
import com.docus.server.message.feign.dto.CompensateTasRequest;
import com.docus.server.message.feign.dto.HospitalSubmitNodeLogAddDTO;
import com.docus.server.message.feign.enums.HospitalSubmitNodeEnum;
import com.docus.server.message.feign.service.CollectTaskService;
import com.docus.server.message.feign.service.HospitalSubmitNodeServiceApi;
import com.docus.server.message.mapper.SdRyBloodMapper;
import com.docus.server.message.mapper.SdRyIcuMapper;
import com.docus.server.message.mapper.TBasicMapper;
import com.docus.server.message.rpc.ShunDePeopleRpc;
import com.docus.server.message.rpc.dto.HisZyCyYzDTO;
import com.docus.server.message.rpc.request.HisZyCyYzRequest;
import com.docus.server.message.rpc.response.HisZyCyYzResponse;
import com.docus.server.message.util.TableJsonRead;
import com.docus.server.message.validate.RecordSubmitValidate;
import com.docus.server.message.validate.WsNurseSubmitValidate;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
@ -36,6 +42,11 @@ import java.util.Objects;
@Slf4j
@Service
public class SdBusinessServiceImpl implements SdBusinessService {
@Value("${ip}")
private String localIp;
@Value("${server.port}")
private String port;
@Autowired
private CollectTaskService collectTaskService;
@Autowired
@ -46,6 +57,8 @@ public class SdBusinessServiceImpl implements SdBusinessService {
private SdRyIcuMapper sdRyIcuMapper;
@Autowired
private HospitalSubmitNodeServiceApi hospitalSubmitNodeServiceApi;
@Autowired
private SdRyBloodMapper sdRyBloodMapper;
@Override
public MessageResponse recordSubmitHandle(Message message) {
@ -68,13 +81,13 @@ public class SdBusinessServiceImpl implements SdBusinessService {
nodeLogAddDTO.setCreaterName("电子病历提交");
hospitalSubmitNodeServiceApi.addLog(nodeLogAddDTO);
if(!isDischargeAndUpdDisDate(patientIds.get(0),recordSubmitDto.getInHospIndexNo(), recordSubmitDto.getVisitNo())){
if (!isDischargeAndUpdDisDate(patientIds.get(0), recordSubmitDto.getInHospIndexNo(), recordSubmitDto.getVisitNo())) {
throw new BaseException("此患者未出院!");
}
tBasicMapper.insertOrUpdateDoctorSubmitTime(patientIds.get(0), recordSubmitDto.getSubmitTime());
log.info("补偿电子病历任务 patientIds:{} collectId:{}", patientIds, taskConfig.getCollectorIds());
compensateTask(patientIds, taskConfig.getCollectorIds());
tBasicMapper.updateEmrSubmitState(patientIds.get(0),1);
tBasicMapper.updateEmrSubmitState(patientIds.get(0), 1);
return new MessageResponse(ResultCode.SUCCESS.getCode(), success());
} catch (BaseException baseException) {
log.error(baseException.getMessage(), baseException);
@ -109,19 +122,19 @@ public class SdBusinessServiceImpl implements SdBusinessService {
// 添加提交内容
HospitalSubmitNodeLogAddDTO nodeLogAddDTO = new HospitalSubmitNodeLogAddDTO();
nodeLogAddDTO.setPatientId(patientIds.get(0));
nodeLogAddDTO.setContent(new String[]{nurseSubmitDTO.getDutyNurse(),nurseSubmitDTO.getQcNurse(),Func.formatDateTime(nurseSubmitDTO.getSubmitTime()),nurseSubmitDTO.getFilesCount().toString()});
nodeLogAddDTO.setContent(new String[]{nurseSubmitDTO.getDutyNurse(), nurseSubmitDTO.getQcNurse(), Func.formatDateTime(nurseSubmitDTO.getSubmitTime()), nurseSubmitDTO.getFilesCount().toString()});
nodeLogAddDTO.setSubmitNodeEnum(HospitalSubmitNodeEnum.NURSE);
nodeLogAddDTO.setCreater("护理提交");
nodeLogAddDTO.setCreaterName("护理提交");
hospitalSubmitNodeServiceApi.addLog(nodeLogAddDTO);
if(!isDischargeAndUpdDisDate(patientIds.get(0), inHospIndexNo, visitNo)){
if (!isDischargeAndUpdDisDate(patientIds.get(0), inHospIndexNo, visitNo)) {
throw new BaseException("此患者未出院!");
}
// 如果是重症患者,如果没有重症报告的话,不能提交
if (isIcuRecord(inHospIndexNo, visitNo)) {
// 更新重症标识
confirmAndUpdIcuRecordState(inHospIndexNo,visitNo);
confirmAndUpdIcuRecordState(inHospIndexNo, visitNo);
if (!hasIcuFile(patientIds.get(0))) {
throw new BaseException("重症患者,未采集重症文件,不允许提交!");
}
@ -129,7 +142,7 @@ public class SdBusinessServiceImpl implements SdBusinessService {
tBasicMapper.insertOrUpdateNurseSubmitTime(patientIds.get(0), nurseSubmitDTO.getSubmitTime());
tBasicMapper.insertOrUpdateNurseFileCount(patientIds.get(0), nurseSubmitDTO.getFilesCount());
tBasicMapper.insertOrUpdateNurse(patientIds.get(0), nurseSubmitDTO.getQcNurse(),nurseSubmitDTO.getDutyNurse());
tBasicMapper.insertOrUpdateNurse(patientIds.get(0), nurseSubmitDTO.getQcNurse(), nurseSubmitDTO.getDutyNurse());
log.info("补偿护理任务 patientIds:{} collectId:{}", patientIds, taskConfig.getCollectorIds());
compensateTask(patientIds, taskConfig.getCollectorIds());
return new MessageResponse(ResultCode.SUCCESS.getCode(), success());
@ -150,6 +163,7 @@ public class SdBusinessServiceImpl implements SdBusinessService {
/**
* icu>0
*
* @param patientId
* @return icu>0
*/
@ -160,8 +174,9 @@ public class SdBusinessServiceImpl implements SdBusinessService {
/**
*
*
* @param patientId
* @param source /
* @param source /
* @return
*/
private int getFileCountByPatientAndSource(String patientId, String source) {
@ -178,7 +193,50 @@ public class SdBusinessServiceImpl implements SdBusinessService {
@Override
public boolean isIcuRecord(String inpatientNo, Integer admissTimes) {
Integer count = sdRyIcuMapper.countByInpNoAndAdmissTimes(inpatientNo, admissTimes);
return count>0;
return count > 0;
}
@Override
public List<SdRyBloodReportVO> getBloodView(String inpatientNo, Integer admissTimes) {
String disDate = tBasicMapper.getDischargeDateByInpatientNoAndTimes(inpatientNo, admissTimes);
if(Func.isBlank(disDate)){
disDate="18010203";
}
// 视图数据
List<SdRyBloodReportDTO> bloodReportDtoList = sdRyBloodMapper.getByInpatientNoAndAdmissions(inpatientNo, admissTimes);
if (Func.isEmpty(bloodReportDtoList)) {
return new ArrayList<>();
}
List<SdRyBloodReportVO> vos = new ArrayList<>();
for (SdRyBloodReportDTO dto : bloodReportDtoList) {
// 查询报告转换本地映射网络请求路径
byte[] fileBytes = shunDePeopleRpc.getBloodReport(dto.getFileName());
String filePath = TableJsonRead.currentPath(StaticResourceMapping.STATIC_RESOURCE_PREFIX + File.separator + StaticResourceMapping.BLOOD)
+ File.separator
+ disDate
+ File.separator
+ inpatientNo + "_" + admissTimes
+ File.separator
+ dto.getFileName();
File file = new File(filePath);
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
FileUtil.toFile(new ByteArrayInputStream(fileBytes), file);
// 与静态资源配置匹配
String fileUrl = localIp + ":" + port + "/" + StaticResourceMapping.BLOOD + "/" + disDate + "/" + inpatientNo + "_" + admissTimes + "/" + dto.getFileName();
// 设置返回数据
SdRyBloodReportVO vo = new SdRyBloodReportVO();
vo.setFileUrl(fileUrl);
vo.setAdmissions(dto.getAdmissions());
vo.setInpatientNo(dto.getInpatientNo());
vo.setFileDesc(dto.getFileDesc());
vo.setFileName(dto.getFileName());
vo.setFileId(dto.getFileId());
vos.add(vo);
}
return vos;
}
private void compensateTask(List<String> patientIds, List<String> collectorIds) {
@ -251,11 +309,12 @@ public class SdBusinessServiceImpl implements SdBusinessService {
/**
*
*
* @param response
* @return true
*/
private boolean isNullYzData(HisZyCyYzResponse response) {
return Objects.isNull(response) || Func.isEmpty(response.getData()) || Objects.isNull(response.getData().get(0));
return Objects.isNull(response) || Func.isEmpty(response.getData()) || Objects.isNull(response.getData().get(0));
}

@ -0,0 +1,25 @@
package com.docus.server.message.config;
import com.docus.server.message.consts.StaticResourceMapping;
import com.docus.server.message.util.TableJsonRead;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.io.File;
/**
* @author WYBDEV
*/
@Configuration
public class StaticResourceWebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// 静态资源映射 输血报告单
registry.addResourceHandler("/"+ StaticResourceMapping.BLOOD +"/**")
.addResourceLocations("file:"+ TableJsonRead.currentPath(StaticResourceMapping.STATIC_RESOURCE_PREFIX+ File.separator+StaticResourceMapping.BLOOD)+File.separator);
}
}

@ -0,0 +1,15 @@
package com.docus.server.message.consts;
/**
* @author WYBDEV
*/
public interface StaticResourceMapping {
/**
*
*/
String STATIC_RESOURCE_PREFIX ="static";
/**
*
*/
String BLOOD = "blood";
}

@ -2,6 +2,7 @@ package com.docus.server.message.controller;
import com.docus.infrastructure.web.api.CommonResult;
import com.docus.server.message.busservice.SdBusinessService;
import com.docus.server.message.controller.vo.SdRyBloodReportVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
@ -11,6 +12,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* @author WYBDEV
*/
@ -27,10 +30,17 @@ public class SdRyHospitalController {
@ApiOperation("确认患者是否重症病人,并标识重症病人状态,住院号+住院次数")
@GetMapping("/confirmAndupdIcuRecordState")
public CommonResult<String> confirmAndUpdIcuRecordState(@RequestParam("inpatientNo") String inpatientNo, @RequestParam("admissTimes") Integer admissTimes) {
log.info("顺德人医,同步患者是否重症病人,住院号:{},住院次数:{}",inpatientNo,admissTimes);
log.info("顺德人医,同步患者是否重症病人,住院号:{},住院次数:{}", inpatientNo, admissTimes);
sdBusinessService.confirmAndUpdIcuRecordState(inpatientNo, admissTimes);
return CommonResult.success("成功!");
}
@ApiOperation("根据病案号查询输血报告单视图")
@GetMapping("/getBloodView")
public CommonResult<List<SdRyBloodReportVO>> getBloodView(@RequestParam("inpatientNo") String inpatientNo, @RequestParam("admissTimes") Integer admissTimes) {
log.info("顺德人医,查询输血报告视图,住院号:{},住院次数:{}", inpatientNo, admissTimes);
List<SdRyBloodReportVO> vos = sdBusinessService.getBloodView(inpatientNo, admissTimes);
return CommonResult.success(vos);
}
}

@ -0,0 +1,26 @@
package com.docus.server.message.controller.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
*
* @author WYBDEV
*/
@Data
@ApiModel("顺德人医血液报告单查询结果")
public class SdRyBloodReportVO {
@ApiModelProperty("文件id")
private String fileId;
@ApiModelProperty("住院号")
private String inpatientNo;
@ApiModelProperty("住院次数")
private Integer admissions;
@ApiModelProperty("保存文件名")
private String fileName;
@ApiModelProperty("文件描述标题")
private String fileDesc;
@ApiModelProperty("文件下载地址")
private String fileUrl;
}

@ -0,0 +1,24 @@
package com.docus.server.message.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
*
* @author WYBDEV
*/
@Data
@ApiModel("顺德人医血液报告单视图")
public class SdRyBloodReportDTO {
@ApiModelProperty("文件id")
private String fileId;
@ApiModelProperty("住院号")
private String inpatientNo;
@ApiModelProperty("住院次数")
private Integer admissions;
@ApiModelProperty("保存文件名")
private String fileName;
@ApiModelProperty("文件描述标题")
private String fileDesc;
}

@ -0,0 +1,23 @@
package com.docus.server.message.mapper;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.docus.server.message.dto.SdRyBloodReportDTO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @author WYBDEV
*/
@DS("blood")
@Mapper
public interface SdRyBloodMapper {
/**
*
* @param inpatientNo
* @param admissions
* @return
*/
List<SdRyBloodReportDTO> getByInpatientNoAndAdmissions(@Param("inpatientNo") String inpatientNo, @Param("admissions") Integer admissions);
}

@ -94,4 +94,11 @@ public interface TBasicMapper {
*/
int updateEmrSubmitState(@Param("patientId") String patientId, @Param("emrSubmitState") int emrSubmitState);
/**
* yyyyMMdd
* @param inpatientNo
* @param admissTimes
* @return yyyyMMdd
*/
String getDischargeDateByInpatientNoAndTimes(@Param("inpatientNo") String inpatientNo,@Param("admissTimes") Integer admissTimes);
}

@ -14,4 +14,11 @@ public interface ShunDePeopleRpc {
* @return
*/
HisZyCyYzResponse hisZyCyYz(HisZyCyYzRequest request);
/**
*
* @param fileName
* @return
*/
byte[] getBloodReport(String fileName);
}

@ -50,7 +50,22 @@ public class ShunDePeopleRpcImpl implements ShunDePeopleRpc {
}
}
@Override
public byte[] getBloodReport(String fileName) {
ShunDePeopleInterfaceConfig.InterfaceConfig interfaceConfig = ShunDePeopleInterfaceConfig.getTaskConfig("BLOOD");
if(interfaceConfig==null){
log.warn("查询输血报告文件接口未配置!");
return null;
}
Map<String, String> otherParam = interfaceConfig.getOtherParam();
String url = interfaceConfig.getUrl() + "?file_folder=TmisPdfFile&file_name=" + fileName;
// String url = "http://192.168.16.63:9314/blood/1_out.pdf";
return HttpUtil.createGet(url)
.header("Content-Type", "application/octet-stream")
.header("HQ_TOKEN", otherParam.get("hqToken"))
.header("HQ_METHOD", otherParam.get("hqMethod"))
.execute().bodyBytes();
}
public static void main(String[] args) {

@ -1,5 +1,6 @@
package com.docus.server.message.util;
import com.docus.server.message.consts.StaticResourceMapping;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.util.StringUtils;
@ -95,7 +96,7 @@ public class TableJsonRead {
* jar
* @return
*/
private String CurrentPath(){
public static String CurrentPath(){
File dir = new File(".");
String currentpath ="";
try {
@ -106,6 +107,24 @@ public class TableJsonRead {
return currentpath;
}
/**
* jar
* @return
*/
public static String currentPath(String dir){
String path = CurrentPath() + File.separator + dir;
File file = new File(path);
if (!file.exists()) {
file.mkdirs();
}
return path;
}
public static void main(String[] args) {
String path = TableJsonRead.currentPath(StaticResourceMapping.STATIC_RESOURCE_PREFIX + File.separator + StaticResourceMapping.BLOOD);
System.out.println(path);
}
/**
*
* @param path

@ -1,5 +1,6 @@
server:
port: 9314
ip: http://192.168.16.63
spring:
application:
name: @artifactId@
@ -55,7 +56,28 @@ spring:
test-on-borrow: false
test-on-return: false
validation-query: select 1
blood:
url: jdbc:sqlserver://192.168.16.103\DOCUS;DatabaseName=hq_framework
username: sa
password: docus702
driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
type: com.alibaba.druid.pool.DruidDataSource
# 初始化配置
initial-size: 3
# 最小连接数
min-idle: 3
# 最大连接数
max-active: 15
# 获取连接超 时时间
max-wait: 5000
# 连接有效性检测时间
time-between-eviction-runs-millis: 90000
# 最大空闲时间
min-evictable-idle-time-millis: 1800000
test-while-idle: true
test-on-borrow: false
test-on-return: false
validation-query: select 1
redis:
host: redis.docus.cn
password: JSdocus@702

@ -26,26 +26,7 @@
<MaxHistory>30</MaxHistory>
</rollingPolicy>
</appender>
<appender name="external-interface" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<!-- 指定日志输出格式 -->
<pattern>[%d{yyyy-MM-dd' 'HH:mm:ss.sss}] [%C] [%t] [%X{traceId}] [%L] [%-5p] %m%n</pattern>
<charset>utf-8</charset>
</encoder>
<!-- 指定收集策略:滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--指定生成日志保存地址 -->
<fileNamePattern>${log.path}external%d.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>500MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<MaxHistory>30</MaxHistory>
</rollingPolicy>
</appender>
<logger name="com.docus.services.system.service.ClientGetBasicServiceImpl" level="DEBUG" additivity="false">
<appender-ref ref="external-interface" />
</logger>
<springProfile name="dev">

@ -0,0 +1,21 @@
<?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.docus.server.message.mapper.SdRyBloodMapper">
<select id="getByInpatientNoAndAdmissions" resultType="com.docus.server.message.dto.SdRyBloodReportDTO">
select
FID AS fileId,
FBIHID AS inpatientNo,
FBINCU AS admissions,
PDFNAME AS fileName,
FDESC AS fileDesc
FROM
View_CasePdfFileInfo
WHERE
FBIHID = #{inpatientNo}
AND FBINCU = ${admissions}
</select>
</mapper>

@ -53,4 +53,14 @@
SELECT count(1) FROM `docus_archivefile`.`t_scan_assort`
where patient_id=#{patientId} and source=#{source};
</select>
<select id="getDischargeDateByInpatientNoAndTimes" resultType="java.lang.String">
SELECT
DATE_FORMAT(dis_date,'%Y%m%d') disDate
FROM
`docus_medicalrecord`.t_basic tb
WHERE
tb.inpatient_no=#{inpatientNo}
and tb.admiss_times=#{admissTimes}
LIMIT 1
</select>
</mapper>

Loading…
Cancel
Save