You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

211 lines
9.7 KiB
Java

package com.ann.demo.service;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.ann.demo.entity.constant.AliasName;
import com.ann.demo.entity.constant.InterfaceName;
import com.ann.demo.entity.constant.WebServiceInfoMap;
import com.ann.demo.entity.constant.WebserviceId;
import com.ann.demo.entity.filing.MessageSubordinate;
import com.ann.demo.entity.filing.WebserviceInfo;
import com.ann.demo.entity.filing.dto.MessageDto;
import com.ann.demo.entity.filing.dto.PatientMainDto;
import com.ann.demo.entity.interfaceEntity.ArchiveMaster;
import com.ann.demo.entity.interfaceEntity.ExamApply;
import com.ann.demo.entity.interfaceEntity.MessageLog;
import com.ann.demo.entity.interfaceEntity.UltrasonicReport;
import com.ann.demo.entity.other.RunningItem;
import com.ann.demo.entity.other.ServerHelper;
import com.ann.demo.repository.ArchiveMasterRepository;
import com.ann.demo.utils.XMLUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Objects;
/**
* 解析逻辑
*
* @Author: LeiJiaXin
* @Date: 2019/8/20 16:29
*/
@Component
public class AnalysisService {
static final Logger logger = LoggerFactory.getLogger(AnalysisService.class);
@Autowired
MessageService messageService;
@Autowired
MessageSubordinateService messageSubordinateService;
@Autowired
ArchiveMasterRepository archiveMasterRepository;
@Autowired
ExamApplyService examApplyService;
/**
* 2019-7-8
*
* @Param xmlStr 需要解析的字符串
* @Param tClass 被解析字符串的实体类
* @Param parameter 如果是报告 携带参数
* 返回返回参数xml
*/
public String getHIPMessageServerResult(String message, Class tClass, String parameter,String webserviceId) throws Exception {
long startTime = System.currentTimeMillis();
String textContent = "成功啦~", type = "", typeCodeValue = "AE", outContent = "", patientMainStr = "",archiveMasterId = null;
Date xmlCreateTime = null;
MessageLog messageLog = null;
Integer result = 0;
long endTime = 0;
message = message.replaceAll("&", "&");
// 判断是否插入
messageLog = new MessageLog(message, InterfaceName.HIP_MESSAGE_SERVER, new Date(),webserviceId);
// 只要没有传过 才会插入新的
messageService.save(messageLog);
MessageDto messageDto = XMLUtils.xpathToBean(message, tClass, parameter);
if (messageDto != null) {
String textContentTemp = null;
if(Objects.equals(messageDto.getType(),AliasName.PETCT_REPORT)){
//如果是pet-ct报告 那么还要查出住院次数
UltrasonicReport ultrasonicReport = JSON.parseObject(messageDto.getObject().toString(), UltrasonicReport.class);
String authorReportTime = ultrasonicReport.getAuthorReportTime();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
Date date = simpleDateFormat.parse(authorReportTime, new ParsePosition(0));
String visitId = archiveMasterRepository.findVisitIdByTimeAndInpNo(date, messageDto.getInpNo());
messageDto.setVisitId(visitId);
}
archiveMasterId = messageService.getArchiveMasterId(messageDto.getInpNo(), messageDto.getVisitId(),messageDto.getPatientId());
if(archiveMasterId != null){
if (Objects.equals(messageDto.getEntity(), ExamApply.class.getName())) { // 申请单
ExamApply examApply = JSON.parseObject(messageDto.getObject().toString(), ExamApply.class);
textContentTemp = changeApply(examApply,parameter);
}
// 保存消息从属表
patientMainStr = JSON.toJSONString(new PatientMainDto(messageDto.getInpNo(), messageDto.getVisitId()), SerializerFeature.WriteMapNullValue);
if (textContentTemp != null) {
textContent = textContentTemp;
} else {
xmlCreateTime = messageDto.getXmlCreateTime();
type = messageDto.getType();
typeCodeValue = "AA";
result = 1;
}
}else{
textContent = "没有入院消息";
}
} else {
textContent = "传过来的消息无法解析";
}
outContent = XMLUtils.generateV3XmlStr(typeCodeValue, textContent);
if (!outContent.equals("")) {
endTime = System.currentTimeMillis();
messageLog.setValue(archiveMasterId,outContent, result, messageDto == null ? "" : JSON.toJSONString(messageDto), xmlCreateTime, (endTime - startTime), new Date(), type, textContent);
messageService.save(messageLog);
if (Objects.equals(typeCodeValue, "AA")) {
if (Objects.equals(type, AliasName.EKG_REPORT)
|| Objects.equals(type, AliasName.PATHOLOGY_REPORT)
|| Objects.equals(type, AliasName.RADIATION_REPORT)
|| Objects.equals(type, AliasName.ULTRASONIC_REPORT)
|| Objects.equals(type, AliasName.PETCT_REPORT )
|| Objects.equals(type, AliasName.OTHER_REPORT)) {
messageSubordinateService.save(new MessageSubordinate(messageLog.getId(), patientMainStr, JSON.toJSONString(messageLog)));
}
}
}
logger.info("-----------------------检查报告" + type + "总用时长" + (endTime - startTime) + "-------------------------");
return outContent;
}
private String changeApply(ExamApply examApply,String interfaceName) throws Exception{
String textContent = null;
ExamApply examApplyTemp = examApplyService.findExamApply(examApply.getApplyId());
//1 先判断检验申请单是否存在 存在做以下操作
if(examApplyTemp != null){
if (Objects.equals(examApply.getResult(), "delete")) {
// 1.2 判断是否是删除
if (!examApplyService.updateExamApplyIsValid(examApplyTemp.getApplyId())) {
textContent = "申请单删除失败了";
}
}else if(Objects.equals(interfaceName,InterfaceName.PARAMETER_EXAMAPPLYSTATECHANGE)){
// 1.3 如果是检查申请单状态变更设置IsOpenHIS
if (Objects.equals(examApply.getIsOpenHis(), "F")) {
examApplyTemp.setIsValid(1);
examApplyTemp.setIsOpenHis("F");
examApplyService.save(examApplyTemp);
}
}else if(Objects.equals(interfaceName,InterfaceName.PARAMETER_VERIFICATIONEXAMAPPLY)){
// 1.4 如果是检查申请单检体验收设置IsOpenLIS
if (Objects.equals(examApply.getIsOpenOther(), "F")) {
examApplyTemp.setIsValid(1);
examApplyTemp.setIsOpenOther("F");
examApplyService.save(examApplyTemp);
}
}else {
// 1.5 如果存在,又不做任何操作,返回已存在
textContent = "该申请单已存在";
}
}else{
// 2 如果不存在,那就判断是否是新增,否则该申请单不存在
if (Objects.equals(examApply.getResult(), "new") && Objects.equals(interfaceName,InterfaceName.PARAMETER_EXAMAPPLY)) {
if (examApply.getReportType() != null) {
switch (examApply.getReportType()) {
case "病理":
examApply.setReportType(AliasName.PATHOLOGY_REPORT);
break;
case "超声":
examApply.setReportType(AliasName.ULTRASONIC_REPORT);
break;
case "心电":
examApply.setReportType(AliasName.EKG_REPORT);
break;
case "放射":
examApply.setReportType(AliasName.RADIATION_REPORT);
break;
case "核医学":
examApply.setReportType(AliasName.PETCT_REPORT);
break;
default:
//除了这5个 其他报告都归在一类
examApply.setReportType(AliasName.OTHER_REPORT);
break;
// case "肌电图":
// examApply.setReportType(AliasName.ELECTROMYOGRAPHY);
// break;
// case "临床试验":
// examApply.setReportType(AliasName.CLINICAL_TRIALS);
// break;
// case "内镜":
// examApply.setReportType(AliasName.ENDOSCOPIC_REPORT);
// break;
// case "脑彩超":
// examApply.setReportType(AliasName.BRAIN_COLOR_ULTRASOUND);
// break;
// case "脑电图":
// examApply.setReportType(AliasName.BRAIN_ELECTRIC_REPORT);
// break;
}
}
examApplyService.save(examApply);
} else {
textContent = "该申请单不存在";
}
}
return textContent;
}
}