解档推送

广东省中医_gdszy
宇宙皮皮娃 2 years ago
parent 89a45ea24e
commit 552b705e76

@ -129,6 +129,18 @@
<artifactId>docus-shiro-starter</artifactId>
</dependency>
<dependency>
<groupId>org.apache.axis</groupId>
<artifactId>axis</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>org.apache.axis</groupId>
<artifactId>axis-jaxrpc</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>com.docus</groupId>
<artifactId>docus-base-starter</artifactId>

@ -0,0 +1,63 @@
package com.docus.server.collection.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @BelongsProject: docus_medicalrecord_starter
* @BelongsPackage: com.docus.services.clinicqualitycontrol.dto
* @Author: jiashi1
* @CreateTime: 2023-02-14 14:56
* @Description: TODO
* @Version: 1.0
*/
@Data
@ApiModel("质控和退回推送dto")
public class BacklPushDto {
@ApiModelProperty(value = "病案主键")
private String patientId;
@ApiModelProperty(value = "住院号(病案号)")
private String inpatientNo;
@ApiModelProperty(value = "住院次数")
private Integer admissTimes;
@ApiModelProperty(value = "住院就诊流水号(记账号)")
private String jzh;
@ApiModelProperty(value = "姓名")
private String name;
@ApiModelProperty(value = "出院科室代码")
private String disDept;
@ApiModelProperty(value = "出院科室")
private String disDeptName;
@ApiModelProperty(value = "申请人工号")
private String applyUserName;
@ApiModelProperty(value = "申请人")
private String applyName;
@ApiModelProperty(value = "操作人工号")
private String controlUserName;
@ApiModelProperty(value = "操作人")
private String controlName;
@ApiModelProperty(value = "解档时间(召回审批时间开始)")
private String auditTime;
@ApiModelProperty(value = "解档天数(召回天数默认7天)")
private String day;
@ApiModelProperty(value = "解档\\归档状态( 未归档状态\\归档状态) ")
private Integer isArchive;
@ApiModelProperty(value = "解档\\归档文书类型( 召回修改分类对应的采集器id逗号隔开的字符串)")
private String collectIds;
}

@ -0,0 +1,67 @@
package com.docus.server.collection.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.util.Date;
/**
* <p>
*
* </p>
*
* @author jiashi
* @since 2023-02-14
*/
@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="CqcPushConfig对象", description="推送配置表")
public class CqcPushConfig implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "ID")
@TableId(value = "id", type = IdType.ID_WORKER_STR)
private Long id;
@ApiModelProperty(value = "业务类型1退回医生2退回护理3退回手麻4退回重症5召回推送6归档推送7病案室纸质签收推送8电子病例解档9护理解档10电子病历归档11护理归档")
private String businessType;
@ApiModelProperty(value = "协议类型1webservice,2http")
private String protocolType;
@ApiModelProperty(value = "命名空间")
private String namespace;
@ApiModelProperty(value = "接口地址")
private String url;
@ApiModelProperty(value = "方法名")
private String method;
@ApiModelProperty(value = "是否启用0否1是")
private Integer effective;
@ApiModelProperty(value = "标题")
private String title;
@ApiModelProperty(value = "创建人")
private String createUser;
@ApiModelProperty(value = "创建时间")
private Date createTime;
@ApiModelProperty(value = "修改人")
private String updateUser;
@ApiModelProperty(value = "修改时间")
private Date updateTime;
@ApiModelProperty(value = "参数json")
private String parameterList;
}

@ -0,0 +1,17 @@
package com.docus.server.collection.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.docus.server.collection.entity.CqcPushConfig;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface CqcPushConfigMapper extends BaseMapper<CqcPushConfig> {
/**
* @description
*/
List<CqcPushConfig> getCqcPushConfigByBusinessTypes(@Param("ids") List<Long> ids);
}

@ -10,9 +10,12 @@ import com.docus.server.collection.entity.TBasic;
import com.docus.server.collection.entity.TBasicExtend;
import com.docus.server.collection.mapper.TBasicMapper;
import com.docus.server.collection.service.ITBasicService;
import com.docus.server.collection.util.BackPushEventEntity;
import com.docus.server.report.entity.MaternalInfantRelationship;
import com.docus.server.rpc.SdRyHospitalRpc;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -46,6 +49,9 @@ public class TBasicServiceImpl implements ITBasicService {
@Resource
private ThreadPoolExecutor threadPoolExecutor;
@Autowired
private ApplicationEventPublisher applicationEventPublisher;
@Override
@Transactional
public void setTBasic(TBasicDto tBasicDto) throws Exception {
@ -220,6 +226,7 @@ public class TBasicServiceImpl implements ITBasicService {
}
//是否取消住院
if ("2".equals(tBasicDto.getStatu())) {
applicationEventPublisher.publishEvent(new BackPushEventEntity(this, tBasic));
tBasic.setDisDate(null);
}
String sdryIndex = tBasicDto.getSdryIndex();

@ -0,0 +1,28 @@
package com.docus.server.collection.util;
import com.docus.server.collection.entity.TBasic;
import org.springframework.context.ApplicationEvent;
/**
* @description 退event
* @author chierhao
* @date 2023-02-14 15:12
*/
public class BackPushEventEntity extends ApplicationEvent{
private static final long serialVersionUID = 1L;
private TBasic tBasic ;
public BackPushEventEntity(Object source, TBasic tBasic ) {
super(source);
this.tBasic = tBasic;
}
public TBasic getTBasic() {
return tBasic;
}
public void setTBasic( TBasic tBasic ) {
this.tBasic = tBasic;
}
}

@ -0,0 +1,99 @@
package com.docus.server.collection.util;
import com.docus.core.util.DateUtil;
import com.docus.server.collection.dto.BacklPushDto;
import java.util.Date;
import java.util.UUID;
/**
* @BelongsProject: docus_medicalrecord_starter
* @BelongsPackage: com.docus.services.statistical.util
* @Author: jiashi
* @CreateTime: 2022-12-27 15:33
* @Description: TODO
* @Version: 1.0
*/
public class BackPushUtil {
/**
* @description xml
* @author jiashi
* @date 2023-07-12 14:14
* @param dto
* @return: java.lang.String
*/
public static String getXml(BacklPushDto dto) {
String result=
"<PRPA_HIP1265 xmlns=\"urn:hl7-org:v3\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" ITSVersion=\"XML_1.0\" xsi:schemaLocation=\"urn:hl7-org:v3\">\n" +
"\t<!--id-消息流水号 UUID -->\n" +
"\t<id extension=\""+ UUID.randomUUID()+"\"/>\n" +
"\t<!--creationTime-消息创建时间 -->\n" +
"\t<creationTime value=\""+ DateUtil.format(new Date(),DateUtil.PATTERN_DATETIME_MINI)+"\"/>\n" +
"\t<!--interactionId-消息的服务标识 -->\n" +
"\t<interactionId root=\"2.16.840.1.113883.1.6\" extension=\"PRPA_HIP1265\"/>\n" +
"\t<!--processingCode-处理代码。标识此消息是否是产品、训练、调试系统的一部分。D调试P产品T训练 -->\n" +
"\t<processingCode code=\"P\"/>\n" +
"\t<!-- processingModeCode-处理模型代码。定义此消息是一个文档处理还是一个初始装载的一部分。A 存档I初始装载R从存档中恢复T当前处理间隔传递。 -->\n" +
"\t<processingModeCode/>\n" +
"\t<!-- acceptAckCode-接收确认类型 AL总是确认NE从不确认ER仅在错误/或拒绝时确认SU 仅在成功完成时确认。 -->\n" +
"\t<acceptAckCode code=\"AL\"/>\n" +
"\t<receiver typeCode=\"RCV\">\n" +
"\t\t<device classCode=\"DEV\" determinerCode=\"INSTANCE\">\n" +
"\t\t\t<id>\n" +
"\t\t\t\t<!-- 接收方编号请向集成平台提供商获取 -->\n" +
"\t\t\t\t<item extension=\"Orion-001\"/>\n" +
"\t\t\t</id>\n" +
"\t\t</device>\n" +
"\t</receiver>\n" +
"\t<sender typeCode=\"SND\">\n" +
"\t\t<device classCode=\"DEV\" determinerCode=\"INSTANCE\">\n" +
"\t\t\t<id>\n" +
"\t\t\t\t<!-- 发送方编号请向集成平台提供商获取 -->\n" +
"\t\t\t\t<item extension=\"PaperlessManagementMRIS-001\"/>\n" +
"\t\t\t</id>\n" +
"\t\t</device>\n" +
"\t</sender>\n" +
"\t<controlActProcess classCode=\"STC\" moodCode=\"EVN\">\n" +
"\t\t<code code=\"InpatientEncounterStarted\">\n" +
"\t\t\t<displayName value=\"归档解档服务\"/>\n" +
"\t\t</code>\n" +
"\t\t<!--\t归档/解档ID\t-->\n" +
"\t\t<archiveId value=\""+UUID.randomUUID()+"\"/>\n" +
"\t\t<!--\t住院号\t-->\n" +
"\t\t<inHospIndexNo value=\""+dto.getInpatientNo()+"\"/>\n" +
"\t\t<!--\t住院次数\t-->\n" +
"\t\t<visitNo value=\""+dto.getAdmissTimes()+"\"/>\n" +
"\t\t<!--\t住院就诊流水号\t-->\n" +
"\t\t<inHospNo value=\""+dto.getJzh()+"\"/>\n" +
"\t\t<!--\t姓名\t-->\n" +
"\t\t<patientName value=\""+dto.getName()+"\"/>\n" +
"\t\t<!--\t出院科室代码\t-->\n" +
"\t\t<dischargeDeptCode value=\""+dto.getDisDept()+"\"/>\n" +
"\t\t<!--\t出院科室\t-->\n" +
"\t\t<dischargeDeptName value=\""+dto.getDisDeptName()+"\"/>\n" +
"\t\t<!--\t申请人工号\t-->\n" +
"\t\t<applicantCode value=\""+dto.getApplyUserName()+"\"/>\n" +
"\t\t<!--\t申请人\t-->\n" +
"\t\t<applicantName value=\""+dto.getApplyName()+"\"/>\n" +
"\t\t<!--\t操作人工号\t-->\n" +
"\t\t<operatorCode value=\""+dto.getControlUserName()+"\"/>\n" +
"\t\t<!--\t操作人\t-->\n" +
"\t\t<operatorName value=\""+dto.getControlName()+"\"/>\n" +
"\t\t<!--\t解档时间根据天数从当前时间后推\t-->\n" +
"\t\t<unarchiveTime value=\""+dto.getAuditTime()+"\"/>\n" +
"\t\t<!--\t解档天数\t-->\n" +
"\t\t<unarchiveDays value=\""+dto.getDay()+"\"/>\n" +
"\t\t<!--\t解档\\归档状态 0:解档 1:归档\t-->\n" +
"\t\t<archiveState value=\""+dto.getIsArchive()+"\"/>\n" +
"\t\t<!--\t解档\\归档文书类型 0:电子病历1:护理\t-->\n" +
"\t\t<archiveType value=\""+dto.getCollectIds()+"\"/>\n" +
"\t\t<!--\t医院信息 code是医院代码 value是医院名称\t-->\n" +
"\t\t<hospInfo code=\"4560886379\" value=\"南方医科大学顺德医院\"/>\n" +
"\t</controlActProcess>\n" +
"</PRPA_HIP1265>";
return result;
}
}

@ -0,0 +1,216 @@
package com.docus.server.collection.util;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.docus.core.util.DateUtil;
import com.docus.core.util.Func;
import com.docus.infrastructure.core.exception.BaseException;
import com.docus.server.collection.dto.BacklPushDto;
import com.docus.server.collection.entity.CqcPushConfig;
import com.docus.server.collection.entity.TBasic;
import com.docus.server.collection.mapper.CqcPushConfigMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.axis.encoding.XMLType;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
import org.apache.shiro.util.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;
import java.util.*;
import java.util.stream.Collectors;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
/**
* @author chierhao
* @description 退
* @date 2023-02-14 14:38
*/
@Component
@Slf4j
@Async
public class CqcPushListenerUtil {
@Autowired
private CqcPushConfigMapper cqcPushConfigMapper;
@Value("${docus.basic.pushconfig:}")
private String pushConfigId;
@Value("${docus.basic.pushusername:}")
private String userName;
@Value("${docus.basic.pushname:}")
private String name;
@Value("${docus.basic.day:}")
private String day;
/*
* @description 退
* @author jiashi
* @date 2023-07-13 15:20
* @param event
*/
@Async
@EventListener
public void backPushListener(BackPushEventEntity event) {
TBasic tBasic= event.getTBasic();
String[] split = pushConfigId.split(",");
List<Long> ids=new ArrayList<>();
for(String str:split){
long l = Long.parseLong(str);
ids.add(l);
}
if(Func.isEmpty(ids)){
log.info("推送配置id为空");
return;
}
List<CqcPushConfig> configs = cqcPushConfigMapper.getCqcPushConfigByBusinessTypes(ids);
if(Func.isEmpty(configs)){
log.info("推送配置查询为空");
return;
}
for(CqcPushConfig config:configs){
//顺德人医解档推送
liberationMethod(tBasic,config);
}
}
/**
* @description webservice
* @author jiashi
* @date 2023-07-12 10:51
* @param cqcPushConfig
*/
public void liberationMethod(TBasic tBasic, CqcPushConfig cqcPushConfig) {
//解档推送消息
if (Func.isNotEmpty(tBasic)) {
String archiveType = "";
if (cqcPushConfig.getBusinessType().equals("8")) {
archiveType = "0";
}
if (cqcPushConfig.getBusinessType().equals("9")) {
archiveType = "1";
}
if (cqcPushConfig.getBusinessType().equals("12")) {
archiveType = "2";
}
//组装参数
BacklPushDto dto = new BacklPushDto();
dto.setPatientId(tBasic.getPatientId());
dto.setInpatientNo(tBasic.getInpatientNo());
dto.setAdmissTimes(tBasic.getAdmissTimes());
dto.setJzh(tBasic.getInpatientNo() + "_" + tBasic.getAdmissTimes());
dto.setName(tBasic.getName());
dto.setDisDept(tBasic.getDisDept());
dto.setDisDeptName(tBasic.getDisDeptName());
dto.setApplyUserName(userName);
dto.setApplyName(name);
dto.setControlUserName(userName);
dto.setControlName(name);
dto.setAuditTime(DateUtil.format(new Date(), DateUtil.PATTERN_DATETIME));
dto.setDay(day);
dto.setIsArchive(0);
dto.setCollectIds(archiveType);
String wsParam = BackPushUtil.getXml(dto);
//发送消息
//请求地址
String wsUrl = cqcPushConfig.getUrl();
//命名空间
String namespance = cqcPushConfig.getNamespace();
// 推送方法名
String wsMethod = cqcPushConfig.getMethod();
//参数
String parameterListStr = cqcPushConfig.getParameterList();
parameterListStr = String.format(parameterListStr, JSON.toJSONString(wsParam));
List<Map<String, Object>> parameterList = new ArrayList<>();
parameterList = JSON.parseObject(parameterListStr, new TypeReference<List<Map<String, Object>>>() {
});
List<Object> parameters = parameterList.stream().map(e -> e.get("parameter")).collect(Collectors.toList());
log.info("推送入参: parameterList:{}", JSON.toJSONString(parameterList));
//回调值
String result = "";
for (int i = 0; i < 3; i++) {
try {
Thread.sleep(i * 5 * 100);
} catch (InterruptedException e) {
log.error(e.getMessage(), e);
}
if (wsUrl.contains("?wsdl")) {
result = requestFunctionWebServiceCXF(wsUrl, namespance, wsMethod, parameters);
} else {
result = requestFunctionWebService(wsUrl, namespance, wsMethod, parameterList);
}
log.info("得到的结果:" + result);
if (result.contains("成功") || result.contains("success")) {
break;
}
}
} else {
throw new BaseException("病案基础信息为空,推送消息失败");
}
}
/**
* @param url wsdl
* @param namespace
* @param method
*/
public String requestFunctionWebService(String url, String namespace, String method, List<Map<String,Object>> parameterList) {
String result = null;
try {
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(url);
call.setOperationName(new QName(namespace, method));
for (Map<String,Object> paramMap:parameterList){
call.addParameter((String) paramMap.get("parameterName"), XMLType.XSD_STRING, ParameterMode.IN);
}
List<Object> parameter = parameterList.stream().map(e -> e.get("parameter")).collect(Collectors.toList());
Object[] opAddEntryArgs = parameter.toArray();
call.setReturnType(XMLType.XSD_STRING);//设置返回类型
result = (String) call.invoke(opAddEntryArgs);
} catch (Exception e) {
log.error(e.getMessage(),e);
result = e.getMessage();
}
return result;
}
public String requestFunctionWebServiceCXF(String url, String namespace, String method, List<Object> params) {
String result;
try {
//创建动态客户端工厂 创建客户端
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
Client client = dcf.createClient(url);
//命名空间和方法
QName name = new QName(namespace, method);
//调用,省中医ChasMessageServer方法特殊处理
Object[] opAddEntryArgs;
opAddEntryArgs = params.toArray();
Object[] objects = client.invoke(name, opAddEntryArgs);
result = objects[0].toString();
} catch (Exception e) {
log.error(e.getMessage(),e);
result = e.getMessage();
}
return result;
}
}

@ -112,6 +112,13 @@ docus:
nisApproveUrl: http://192.168.16.85:9102/qc/tBasicCqc/cqcAudit?hp=token1
# 确认重症状态并更新
confirmAndUpdIcuRecordStateUrl: http://127.0.0.1:9314/hospital/sdRy/confirmAndupdIcuRecordState
# 电子病例护理重症护理解档配置id
pushconfig: 8,9,12
#推送操作人工号,姓名
pushusername: 05908
pushname: 可信病案归档
#解档天数
day: 90
mybatis-plus:
configuration:
map-underscore-to-camel-case: true

@ -0,0 +1,30 @@
<?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.collection.mapper.CqcPushConfigMapper">
<select id="getCqcPushConfigByBusinessTypes" resultType="com.docus.server.collection.entity.CqcPushConfig">
SELECT
id,
business_type,
protocol_type,
namespace,
url,
method,
effective,
title,
create_user,
create_time,
update_user,
update_time,
parameter_list
FROM
cqc_push_config
WHERE id in
<foreach collection="ids" open="(" close=")" item="id" separator=",">
#{id}
</foreach>
AND effective=1
</select>
</mapper>
Loading…
Cancel
Save