Index: ssts-web/src/main/webapp/WEB-INF/spring/applicationContext-disinfectsystem-service.xml =================================================================== diff -u -r37454 -r37968 --- ssts-web/src/main/webapp/WEB-INF/spring/applicationContext-disinfectsystem-service.xml (.../applicationContext-disinfectsystem-service.xml) (revision 37454) +++ ssts-web/src/main/webapp/WEB-INF/spring/applicationContext-disinfectsystem-service.xml (.../applicationContext-disinfectsystem-service.xml) (revision 37968) @@ -3009,4 +3009,13 @@ + + + + + + + + \ No newline at end of file Index: build.gradle =================================================================== diff -u -r37726 -r37968 --- build.gradle (.../build.gradle) (revision 37726) +++ build.gradle (.../build.gradle) (revision 37968) @@ -601,6 +601,10 @@ //webSocket另一种组件 compile group: 'org.java-websocket', name: 'Java-WebSocket', version: '1.5.3' + + //HL7消息解析 + compile group: 'ca.uhn.hapi', name: 'hapi-base', version: '2.3' + compile group: 'ca.uhn.hapi', name: 'hapi-structures-v24', version: '2.3' } // 文件夹的名字必须用斜线结果,否则创建该文件夹不成功 Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/surgeryschedule/service/SurgeryScheduleManagerImpl.java =================================================================== diff -u --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/surgeryschedule/service/SurgeryScheduleManagerImpl.java (revision 0) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/surgeryschedule/service/SurgeryScheduleManagerImpl.java (revision 37968) @@ -0,0 +1,133 @@ +package com.forgon.disinfectsystem.surgeryschedule.service; + +import java.util.Date; +import java.util.List; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang.StringUtils; + +import ca.uhn.hl7v2.AcknowledgmentCode; +import ca.uhn.hl7v2.DefaultHapiContext; +import ca.uhn.hl7v2.HapiContext; +import ca.uhn.hl7v2.model.GenericMessage; +import ca.uhn.hl7v2.model.Message; +import ca.uhn.hl7v2.parser.GenericModelClassFactory; +import ca.uhn.hl7v2.parser.GenericParser; +import ca.uhn.hl7v2.util.Terser; + +import com.forgon.disinfectsystem.entity.operationreservation.SurgerySchedule; +import com.forgon.exception.SystemException; +import com.forgon.tools.date.DateTools; +import com.forgon.tools.hibernate.BasePoManagerImpl; + +/** + * 手术排班信息的managerGZSZYY-51 + */ +public class SurgeryScheduleManagerImpl extends BasePoManagerImpl implements SurgeryScheduleManager { + + @Override + public String recieveSurgerySchedule(String hl7Str) { + + String resopnce = ""; + HapiContext context = null; + GenericMessage message = null; + AcknowledgmentCode theAcknowledgementCode = AcknowledgmentCode.AA; + SurgerySchedule surgerySchedule = null; + try { + //1、解析hl7 + context = new DefaultHapiContext(); + context.setModelClassFactory(new GenericModelClassFactory()); + + GenericParser parse = context.getGenericParser(); + message = (GenericMessage) parse.parse(hl7Str); + + Terser terser = new Terser(message); + //手术申请单号(his) + String surgeryScheduleId = terser.get("/SCH-1"); + if(StringUtils.isBlank(surgeryScheduleId)){ + throw new SystemException("手术申请单号不能为空!"); + } + List list = this.getByProperty("surgeryScheduleId", surgeryScheduleId); + if(CollectionUtils.isNotEmpty(list)){ + surgerySchedule = list.get(0); + } + if(surgerySchedule == null){ + surgerySchedule = new SurgerySchedule(); + } + surgerySchedule.setSurgeryScheduleId(surgeryScheduleId); + //台次 + String surgeryScheduleTimes = terser.get("/SCH-3"); + surgerySchedule.setSurgeryScheduleTimes(surgeryScheduleTimes); + //手术预约时间 + String scheduleTimeStr = terser.get("/SCH-11(1)-4"); + if(StringUtils.isBlank(scheduleTimeStr)){ + throw new SystemException("手术预约时间不能为空!"); + } + Date scheduleTime = DateTools.coverStrToDate(scheduleTimeStr, "yyyyMMddHHmmss"); + if(scheduleTime == null){ + throw new SystemException("手术预约时间格式异常!"); + } + surgerySchedule.setScheduleTime(scheduleTime); + //住院号 + String hospitalNumber = terser.get("/PV1-19"); + if(StringUtils.isBlank(hospitalNumber)){ + throw new SystemException("住院号不能为空!"); + } + surgerySchedule.setHospitalNumber(hospitalNumber); + //手术名称 + String surgeryName = terser.get("/AIS-3-2"); + if(StringUtils.isBlank(surgeryName)){ + throw new SystemException("手术名称不能为空!"); + } + surgerySchedule.setSurgeryName(surgeryName); + //手术记录状态 + String surgeryStatus = terser.get("AIS-10"); + if(StringUtils.isBlank(surgeryScheduleId)){ + throw new SystemException("手术记录状态不能为空!"); + } + surgerySchedule.setSurgeryStatus(surgeryStatus); + + //保存手术排班 + this.save(surgerySchedule); + + } catch (Exception e) { + e.printStackTrace(); + resopnce = "消息接收失败:" + e.getMessage(); + theAcknowledgementCode = AcknowledgmentCode.AE; + } finally { + try { + if(context != null){ + context.close(); + } + } catch (Exception e2) {} + } + return buildAckMessage(message, theAcknowledgementCode, resopnce); + } + + /** + * 构建HL7返回的消息 + * @param message + * @param theAcknowledgementCode + * @param resopnce + * @return + */ + private String buildAckMessage(GenericMessage message, AcknowledgmentCode theAcknowledgementCode, String resopnce) { + if(message == null){ + //推送过来的消息不存在时,只返回异常信息,不返回HL7消息 + return resopnce; + } + //返回ACK的hl7消息 + try { + Message ackMessage = message.generateACK(theAcknowledgementCode, null); + Terser ackTerser = new Terser(ackMessage); + ackTerser.set("/MSH-7", DateTools.getCurrentDayByFormat("yyyyMMddHHmmss")); + ackTerser.set("/MSH-17", "CHN"); + ackTerser.set("/MSA-3", resopnce); + return ackMessage.encode(); + } catch (Exception e) { + e.printStackTrace(); + } + return resopnce; + } + +} Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/surgeryschedule/service/SurgeryScheduleManager.java =================================================================== diff -u --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/surgeryschedule/service/SurgeryScheduleManager.java (revision 0) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/surgeryschedule/service/SurgeryScheduleManager.java (revision 37968) @@ -0,0 +1,17 @@ +package com.forgon.disinfectsystem.surgeryschedule.service; + +import com.forgon.disinfectsystem.entity.operationreservation.SurgerySchedule; +import com.forgon.tools.hibernate.BasePoManager; + +/** + * 手术排班信息的managerGZSZYY-51 + */ +public interface SurgeryScheduleManager extends BasePoManager { + + /** + * 接收并解析保存手术排班信息 + * @param request + */ + public String recieveSurgerySchedule(String request); + +} Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/surgeryschedule/controller/SurgeryScheduleController.java =================================================================== diff -u --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/surgeryschedule/controller/SurgeryScheduleController.java (revision 0) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/surgeryschedule/controller/SurgeryScheduleController.java (revision 37968) @@ -0,0 +1,64 @@ +package com.forgon.disinfectsystem.surgeryschedule.controller; + +import java.io.BufferedReader; +import java.io.InputStreamReader; + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import com.forgon.directory.acegi.tools.AcegiHelper; +import com.forgon.disinfectsystem.surgeryschedule.service.SurgeryScheduleManager; +import com.forgon.log.model.Log; +import com.forgon.log.service.LogManager; + +/** + * 接收推送手术排班信息的接口地址GZSZYY-51 + */ +@RestController +@RequestMapping(value="/buttjoint/buttjointSurgeryScheduleController", produces = "application/json;charset=UTF-8") +public class SurgeryScheduleController { + + @Autowired + private SurgeryScheduleManager surgeryScheduleManager; + + @Autowired + private LogManager appLogManager; + + @RequestMapping(value = "/recieveSurgerySchedule",method = RequestMethod.POST) + public String recieveSurgerySchedule(HttpServletRequest request){ + String result = "消息接收成功"; + BufferedReader streamReader = null; + InputStreamReader inputStreamReader = null; + try { + inputStreamReader = new InputStreamReader(request.getInputStream(), "UTF-8"); + streamReader = new BufferedReader(inputStreamReader); + StringBuilder requestStrBuilder = new StringBuilder(); + String inputStr = null; + while ((inputStr = streamReader.readLine()) != null){ + requestStrBuilder.append(inputStr+"\r"); + } + appLogManager.saveLog(AcegiHelper.getLoginUser(), "调用接口" , Log.TYPE_WRITE, "调用手术排班接收接口,请求参数:" + requestStrBuilder.toString()); + result = surgeryScheduleManager.recieveSurgerySchedule(requestStrBuilder.toString()); + } catch (Exception e) { + result = "消息接收失败:" + e.getMessage(); + } finally { + if(streamReader != null){ + try { + streamReader.close(); + } catch (Exception e) {} + } + if(inputStreamReader != null){ + try { + inputStreamReader.close(); + } catch (Exception e) {} + } + } + appLogManager.saveLog(AcegiHelper.getLoginUser(), "调用接口" , Log.TYPE_WRITE, "调用手术排班接收接口,返回参数:" + result); + return result; + } + +} Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/operationreservation/SurgerySchedule.java =================================================================== diff -u --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/operationreservation/SurgerySchedule.java (revision 0) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/operationreservation/SurgerySchedule.java (revision 37968) @@ -0,0 +1,151 @@ +package com.forgon.disinfectsystem.entity.operationreservation; + +import java.util.Date; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +import org.hibernate.annotations.Cache; +import org.hibernate.annotations.CacheConcurrencyStrategy; +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; + +/** + * 手术排班 + * 获取到的手术排班信息当前只用于实时数据库大屏显示,暂无其他用途GZSZYY-51 + */ +@Entity +@DynamicInsert(false) +@DynamicUpdate(true) +@Table(name = "SurgerySchedule") +@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) +public class SurgerySchedule { + + private Long id; + + /** + * 手术申请单号 + */ + private String surgeryScheduleId; + + /** + * 台次 + */ + private String surgeryScheduleTimes; + + /** + * 手术预约时间 + */ + private Date scheduleTime; + + /** + * 住院号 + */ + private String hospitalNumber; + + /** + * 手术名称 + */ + private String surgeryName; + + /** + * 手术状态 + */ + private String surgeryStatus; + + /** + * 未安排 + */ + public final static String SURGERY_STATUS_WAITLIST = "Waitlist"; + + /** + * 已安排 + */ + public final static String SURGERY_STATUS_BOOKED = "Booked"; + + /** + * 已完成 + */ + public final static String SURGERY_STATUS_COMPLETE = "Complete"; + + /** + * 病区取消 + */ + public final static String SURGERY_STATUS_CANCELLED = "Cancelled"; + + /** + * 手术室取消 + */ + public final static String SURGERY_STATUS_DELETED = "Deleted"; + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getHospitalNumber() { + return hospitalNumber; + } + + public void setHospitalNumber(String hospitalNumber) { + this.hospitalNumber = hospitalNumber; + } + + public String getSurgeryScheduleId() { + return surgeryScheduleId; + } + + public void setSurgeryScheduleId(String surgeryScheduleId) { + this.surgeryScheduleId = surgeryScheduleId; + } + + public String getSurgeryScheduleTimes() { + return surgeryScheduleTimes; + } + + public void setSurgeryScheduleTimes(String surgeryScheduleTimes) { + this.surgeryScheduleTimes = surgeryScheduleTimes; + } + + public Date getScheduleTime() { + return scheduleTime; + } + + public void setScheduleTime(Date scheduleTime) { + this.scheduleTime = scheduleTime; + } + + public String getSurgeryName() { + return surgeryName; + } + + public void setSurgeryName(String surgeryName) { + this.surgeryName = surgeryName; + } + + public String getSurgeryStatus() { + return surgeryStatus; + } + + public void setSurgeryStatus(String surgeryStatus) { + this.surgeryStatus = surgeryStatus; + } + + @Override + public String toString() { + return "SurgerySchedule [id=" + id + ", surgeryScheduleId=" + + surgeryScheduleId + ", surgeryScheduleTimes=" + + surgeryScheduleTimes + ", scheduleTime=" + scheduleTime + + ", hospitalNumber=" + hospitalNumber + ", surgeryName=" + + surgeryName + ", surgeryStatus=" + surgeryStatus + "]"; + } + +}