梅州三院

master
宇宙皮皮娃 10 months ago
parent 39ecb05c69
commit a604039aa9

@ -1,7 +1,7 @@
[
{
"method": "WS_RECORD_SUBMIT",
"urls": ["http://127.0.0.1:9314/hospital/gznk/wsRecordSubmit/do"],
"urls": ["http://127.0.0.1:9314/hospital/mzsy/wsRecordSubmit/do"],
"errorResult": "<Response><RetInfo><RetCode>0</RetCode><RetCon>成功</RetCon></RetInfo></Response>",
"messageDataType": 1
},

@ -0,0 +1,18 @@
package com.docus.server.message.busservice;
import com.docus.server.message.controller.vo.PushInfoVo;
import com.docus.server.message.dto.Message;
import com.docus.server.message.dto.MessageResponse;
public interface MzsyBusinessService {
/**
*
*
* @param message
* @return
*/
MessageResponse recordSubmitHandle(Message message);
}

@ -0,0 +1,131 @@
package com.docus.server.message.busservice.impl;
import com.docus.core.util.DateUtil;
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.FsBusinessService;
import com.docus.server.message.busservice.MzsyBusinessService;
import com.docus.server.message.config.CollectTaskConfig;
import com.docus.server.message.controller.vo.PushInfoVo;
import com.docus.server.message.converters.FsWsRecordSubmitMessageConvert;
import com.docus.server.message.converters.MzsyWsRecordSubmitMessageConvert;
import com.docus.server.message.converters.NkWsRecordSubmitMessageConvert;
import com.docus.server.message.converters.WsRecordSubmitMessageConvert;
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.TBasicMapper;
import com.docus.server.message.validate.NkRecordSubmitValidate;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* @BelongsProject: docus-unified-message
* @BelongsPackage: com.docus.server.message.busservice.impl
* @Author: chierhao
* @CreateTime: 2024-03-20 08:57
* @Description: TODO
* @Version: 1.0
*/
@Slf4j
@Service
public class MzsyBusinessServiceImpl implements MzsyBusinessService {
@Resource
private TBasicMapper tBasicMapper;
@Autowired
private HospitalSubmitNodeServiceApi hospitalSubmitNodeServiceApi;
@Resource
private CollectTaskService collectTaskService;
@Override
public MessageResponse recordSubmitHandle(Message message){
try {
CollectTaskConfig.TaskConfig taskConfig = CollectTaskConfig.getTaskConfig("WS_RECORD_SUBMIT");
if (taskConfig == null || Func.isEmpty(taskConfig.getCollectorIds())) {
throw new RuntimeException("任务配置未配置采集器id,WS_RECORD_SUBMIT");
}
NkRecordSubmitDTO dto = NkWsRecordSubmitMessageConvert.convert(message.getMessage());
NkRecordSubmitValidate.verifyRecordSubmitDTO(dto);
TbasicQrPreciseCondition condition = MzsyWsRecordSubmitMessageConvert.convert(dto);
List<String> patientIds = tBasicMapper.getMzsyPatientIdByPreciseConditions(condition);
verifyPatientIds(patientIds);
String submitDate = dto.getSubmitDate();
tBasicMapper.insertOrUpdateDoctorSubmitTime(patientIds.get(0), Func.parseDate(submitDate, DateUtil.PATTERN_DATETIME));
compensateTask("电子病历提交",patientIds, taskConfig.getCollectorIds());
tBasicMapper.updateEmrSubmitState(patientIds.get(0), 1);
String submitName = dto.getSubmitName();
String submitNo = dto.getSubmitNo();
// 添加提交记录
HospitalSubmitNodeLogAddDTO nodeLogAddDTO = new HospitalSubmitNodeLogAddDTO();
nodeLogAddDTO.setPatientId(patientIds.get(0));
nodeLogAddDTO.setContent(new String[]{submitDate});
nodeLogAddDTO.setSubmitNodeEnum(HospitalSubmitNodeEnum.EMR);
nodeLogAddDTO.setCreater(submitName+"("+submitNo+")");
nodeLogAddDTO.setCreaterName(submitName+"("+submitNo+")");
hospitalSubmitNodeServiceApi.addLog(nodeLogAddDTO);
return new MessageResponse(ResultCode.SUCCESS.getCode(), success());
} catch (BaseException baseException) {
log.error(baseException.getMessage(), baseException);
// 业务异常,不希望重试,直接消息返回错误
MessageResponse response = new MessageResponse(ResultCode.FAILED.getCode(), fail(baseException.getMessage()));
response.setRetry(0);
return response;
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
// 不可知的错误,希望重试
MessageResponse response = new MessageResponse(ResultCode.FAILED.getCode(), fail("系统错误"));
response.setRetry(1);
return response;
}
}
private void verifyPatientIds(List<String> patientIds) {
if (Func.isEmpty(patientIds)) {
throw new BaseException("系统无此患者!");
}
if (patientIds.size() > 1) {
throw new BaseException("系统中患者有多个,无法确认!");
}
}
private void compensateTask(String source,List<String> patientIds, List<String> collectorIds) {
log.info("{},补偿任务 patientIds:{} collectId:{}",source, patientIds, collectorIds);
CompensateTasRequest dto = new CompensateTasRequest();
dto.setPatientIds(patientIds);
dto.setCollectorIds(collectorIds);
dto.setPriority(3);
CommonResult<String> result = collectTaskService.compensateTask(dto);
log.info("{},补偿任务结果:{}", source,Func.toJson(result));
}
private String success() {
return "<Response>" +
"<RetInfo>" +
"<RetCode>0</RetCode>" +
"<RetCon>成功</RetCon>" +
"</RetInfo>" +
"</Response>";
}
private String fail(String message) {
return "<Response>" +
"<RetInfo>" +
"<RetCode>1</RetCode>" +
"<RetCon>" + message + "</RetCon>" +
"</RetInfo>" +
"</Response>";
}
}

@ -0,0 +1,36 @@
package com.docus.server.message.controller;
import com.docus.server.message.busservice.MzsyBusinessService;
import com.docus.server.message.busservice.NkBusinessService;
import com.docus.server.message.dto.Message;
import com.docus.server.message.dto.MessageResponse;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author WYBDEV
*/
@Api("广州脑科医院")
@RestController
@Slf4j
@RequestMapping("/hospital/mzsy")
public class MzsyHospitalController {
@Autowired
private MzsyBusinessService mzsyBusinessService;
@PostMapping("/wsRecordSubmit/do")
@ApiOperation("梅州三院电子病例提交消息接收")
public MessageResponse wsRecordSubmit(@RequestBody Message message) {
log.info("梅州三院电子病例提交消息接收:{}", message);
return mzsyBusinessService.recordSubmitHandle(message);
}
}

@ -0,0 +1,139 @@
package com.docus.server.message.converters;
import com.docus.core.util.DateUtil;
import com.docus.core.util.Func;
import com.docus.infrastructure.core.exception.BaseException;
import com.docus.server.message.dto.NkRecordSubmitDTO;
import com.docus.server.message.dto.TbasicQrPreciseCondition;
import com.docus.server.message.feign.vo.ArchiveAndRecallPushVo;
import com.docus.server.message.util.XmlUtil;
import org.w3c.dom.Node;
import java.util.Date;
import java.util.UUID;
public class MzsyWsRecordSubmitMessageConvert {
public static NkRecordSubmitDTO convert(String str) {
String jzh = null;
String inpatientNo = null;
String name = null;
Integer admissTimes = null;
String submitNo=null;
String submitName=null;
String submitDate = null;
XmlUtil xmlUtil = XmlUtil.of(str);
try {
// 住院流水号
Node inHospNoNode = xmlUtil.getNode("/Request/Msg/INHOSP_NO");
jzh = inHospNoNode.getTextContent();
} catch (Exception ex) {
throw new BaseException("解析 住院流水号 出错!");
}
try {
// 住院号
Node inHospIndexNoNode = xmlUtil.getNode("/Request/Msg/INHOSP_INDEX_NO");
inpatientNo = inHospIndexNoNode.getTextContent();
} catch (Exception ex) {
throw new BaseException("解析 住院号 出错!");
}
try {
// 住院次数
Node visitNoNode = xmlUtil.getNode("/Request/Msg/VISIT_NO");
String admissTimesStr = visitNoNode.getTextContent();
if (Func.isNotBlank(admissTimesStr)) {
admissTimes = Integer.parseInt(admissTimesStr.trim());
}
} catch (Exception ex) {
throw new BaseException("解析 住院次数 出错!");
}
try {
// 患者姓名
Node nameNode = xmlUtil.getNode("/Request/Msg/NAME");
name = nameNode.getTextContent();
} catch (Exception ex) {
throw new BaseException("解析 姓名 出错!");
}
try {
// 提交人工号
Node submitNoNode = xmlUtil.getNode("/Request/Msg/SUBMIT_NO");
submitNo = submitNoNode.getTextContent();
} catch (Exception ex) {
throw new BaseException("解析 提交人工号 出错!");
}
try {
// 提交人姓名
Node submitNameNode = xmlUtil.getNode("/Request/Msg/SUBMIT_NAME");
submitName = submitNameNode.getTextContent();
} catch (Exception ex) {
throw new BaseException("解析 提交人姓名 出错!");
}
try {
// 提交时间
Node submitTimeNode = xmlUtil.getNode("/Request/Msg/SUBMIT_TIME");
String submitTime = submitTimeNode.getTextContent();
Date submitDateTime = Func.parseDate(submitTime.trim(), DateUtil.PATTERN_DATETIME);
submitDate = Func.formatDateTime(submitDateTime);
} catch (Exception ex) {
throw new BaseException("解析 提交时间 出错!");
}
NkRecordSubmitDTO recordSubmitDTO = new NkRecordSubmitDTO();
recordSubmitDTO.setJzh(jzh);
recordSubmitDTO.setInpatientNo(inpatientNo);
recordSubmitDTO.setAdmissTimes(admissTimes);
recordSubmitDTO.setName(name);
recordSubmitDTO.setSubmitNo(submitNo);
recordSubmitDTO.setSubmitName(submitName);
recordSubmitDTO.setSubmitDate(submitDate);
return recordSubmitDTO;
}
public static TbasicQrPreciseCondition convert(NkRecordSubmitDTO dto) {
if (dto == null) {
return null;
}
TbasicQrPreciseCondition condition = new TbasicQrPreciseCondition();
condition.setInpatientNo(dto.getInpatientNo());
condition.setAdmissTimes(dto.getAdmissTimes());
condition.setName(dto.getName());
condition.setJzh(dto.getJzh());
return condition;
}
public static String getPushXml(ArchiveAndRecallPushVo vo) {
String result = "<Msg>\n" +
"\t<!--归档/解档ID-->\n" +
"\t<Id>"+ UUID.randomUUID()+"</Id>\n" +
"\t<!--住院号-->\n" +
"\t<inHospIndexNo>"+vo.getInpatientNo()+"</inHospIndexNo>\n" +
"\t<!--住院次数-->\n" +
"\t<visitNo>"+vo.getAdmissTimes()+"</visitNo>\n" +
"\t<!--患者姓名-->\n" +
"\t<patientName>"+vo.getName()+"</patientName>\n" +
"\t<!--住院就诊流水号-->\n" +
"\t<inHospNo>"+vo.getExternalId()+"</inHospNo>\n" +
"\t<!--入院时间yyyy-MM-dd HH:mm:ss-->\n" +
"\t<admitTime>"+ DateUtil.format(vo.getAdmissDate(),DateUtil.PATTERN_DATETIME)+"</admitTime>\n" +
"\t<!--出院时间yyyy-MM-dd HH:mm:ss-->\n" +
"\t<disTime>"+DateUtil.format(vo.getDisDate(),DateUtil.PATTERN_DATETIME)+"</disTime>\n" +
"\t<!--归档时间yyyy-MM-dd HH:mm:ss-->\n" +
"\t<archiveTime>"+vo.getArchiveTime()+"</archiveTime>\n" +
"\t<!--解档时间yyyy-MM-dd HH:mm:ss-->\n" +
"\t<unarchiveTime></unarchiveTime>\n" +
"\t<!--出院科室代码-->\n" +
"\t<dischargeDeptCode>"+vo.getDisDept()+"</dischargeDeptCode>\n" +
"\t<!--出院科室-->\n" +
"\t<dischargeDeptName>"+vo.getDisDeptName()+"</dischargeDeptName>\n" +
"\t<!--操作人工号-->\n" +
"\t<controlUserName>"+vo.getControlUserName()+"</controlUserName>\n" +
"\t<!--操作人姓名-->\n" +
"\t<controlName>"+vo.getControlName()+"</controlName>\n" +
"\t<!--解档/归档状态 0:解档 1:归档-->\n" +
"\t<archiveState>"+vo.getIsArchive()+"</archiveState>\n" +
"</Msg>";
return result;
}
}

@ -21,6 +21,12 @@ public interface TBasicMapper {
*/
List<String> getGznkPatientIdByPreciseConditions(@Param("condition")TbasicQrPreciseCondition condition);
/*
*
*/
List<String> getMzsyPatientIdByPreciseConditions(@Param("condition")TbasicQrPreciseCondition condition);
/**
*
*

@ -93,6 +93,21 @@
</if>
</select>
<select id="getMzsyPatientIdByPreciseConditions" resultType="java.lang.String">
SELECT patient_id
FROM `docus_medicalrecord`.t_basic tb
WHERE 1=1
<if test="condition.inpatientNo != null and condition.inpatientNo != ''">
and tb.inpatient_no=#{condition.inpatientNo}
</if>
<if test="condition.admissTimes != null">
and tb.admiss_times=#{condition.admissTimes}
</if>
<if test="condition.jzh != null and condition.jzh != ''">
and tb.jzh=#{condition.jzh}
</if>
</select>
<select id="getDischargeCount" resultType="java.lang.Integer">
SELECT count(1)
FROM `docus_medicalrecord`.t_basic tb

Loading…
Cancel
Save