diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/esbmanage/appservice/ICdaDocumentAppService.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/esbmanage/appservice/ICdaDocumentAppService.java new file mode 100644 index 000000000..40b5aecd1 --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/esbmanage/appservice/ICdaDocumentAppService.java @@ -0,0 +1,10 @@ +package com.healthlink.his.web.esbmanage.appservice; + +import com.healthlink.his.esb.domain.CdaDocument; + +import java.util.List; + +public interface ICdaDocumentAppService { + CdaDocument generateCda(Long encounterId, Long patientId, String documentType, String documentTitle, String clinicalData); + List getCdaDocuments(Long encounterId); +} diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/esbmanage/appservice/impl/CdaDocumentAppServiceImpl.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/esbmanage/appservice/impl/CdaDocumentAppServiceImpl.java new file mode 100644 index 000000000..9c78418e2 --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/esbmanage/appservice/impl/CdaDocumentAppServiceImpl.java @@ -0,0 +1,90 @@ +package com.healthlink.his.web.esbmanage.appservice.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.healthlink.his.esb.domain.CdaDocument; +import com.healthlink.his.esb.service.ICdaDocumentService; +import com.healthlink.his.web.esbmanage.appservice.ICdaDocumentAppService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.UUID; + +@Service +@Slf4j +@RequiredArgsConstructor +public class CdaDocumentAppServiceImpl implements ICdaDocumentAppService { + + private final ICdaDocumentService cdaDocumentService; + + @Override + public CdaDocument generateCda(Long encounterId, Long patientId, String documentType, String documentTitle, String clinicalData) { + String docId = UUID.randomUUID().toString(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + + String cdaXml = "\n" + + "\n" + + " \n" + + " \n" + + " \n" + + " " + escapeXml(documentTitle) + "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
\n" + + " \n" + + " " + escapeXml(clinicalData) + "\n" + + "
\n" + + "
\n" + + "
\n" + + "
\n" + + "
"; + + CdaDocument doc = new CdaDocument(); + doc.setDocumentType(documentType); + doc.setDocumentTitle(documentTitle); + doc.setEncounterId(encounterId); + doc.setPatientId(patientId); + doc.setCdaXml(cdaXml); + doc.setStatus("DRAFT"); + doc.setVersionId(1); + doc.setCreateTime(new Date()); + cdaDocumentService.save(doc); + + log.info("CDA文档已生成: type={}, title={}, id={}", documentType, documentTitle, doc.getId()); + return doc; + } + + @Override + public List getCdaDocuments(Long encounterId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(CdaDocument::getEncounterId, encounterId) + .orderByDesc(CdaDocument::getCreateTime); + return cdaDocumentService.list(wrapper); + } + + private String getDocumentTypeCode(String documentType) { + switch (documentType) { + case "admission": return "34133-9"; + case "discharge": return "18842-5"; + case "lab_report": return "11502-2"; + case "referral": return "57133-2"; + default: return "34133-9"; + } + } + + private String escapeXml(String text) { + if (text == null) return ""; + return text.replace("&", "&").replace("<", "<").replace(">", ">") + .replace("\"", """).replace("'", "'"); + } +} diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/esbmanage/controller/CdaDocumentController.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/esbmanage/controller/CdaDocumentController.java new file mode 100644 index 000000000..476e94859 --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/esbmanage/controller/CdaDocumentController.java @@ -0,0 +1,47 @@ +package com.healthlink.his.web.esbmanage.controller; + +import com.core.common.core.domain.R; +import com.healthlink.his.esb.domain.CdaDocument; +import com.healthlink.his.web.esbmanage.appservice.ICdaDocumentAppService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +/** + * CDA临床文档 Controller — 生成/查询CDA文档 + */ +@RestController +@RequestMapping("/esb/cda") +@Slf4j +@RequiredArgsConstructor +public class CdaDocumentController { + + private final ICdaDocumentAppService cdaDocumentAppService; + + @PostMapping("/generate") + @PreAuthorize("hasAuthority('infection:esb:edit')") + public R generateCda(@RequestBody Map params) { + Long encounterId = params.get("encounterId") != null ? Long.valueOf(String.valueOf(params.get("encounterId"))) : null; + Long patientId = params.get("patientId") != null ? Long.valueOf(String.valueOf(params.get("patientId"))) : null; + String documentType = (String) params.get("documentType"); + String documentTitle = (String) params.get("documentTitle"); + String clinicalData = (String) params.get("clinicalData"); + + if (encounterId == null || documentType == null) { + return R.fail("encounterId和documentType不能为空"); + } + CdaDocument doc = cdaDocumentAppService.generateCda(encounterId, patientId, documentType, documentTitle, clinicalData); + return R.ok(doc); + } + + @GetMapping("/list/{encounterId}") + @PreAuthorize("hasAuthority('infection:esb:list')") + public R getCdaDocuments(@PathVariable Long encounterId) { + List docs = cdaDocumentAppService.getCdaDocuments(encounterId); + return R.ok(docs); + } +} diff --git a/healthlink-his-ui/src/views/esbmanage/cdadocument/api.js b/healthlink-his-ui/src/views/esbmanage/cdadocument/api.js new file mode 100644 index 000000000..ca34c75bd --- /dev/null +++ b/healthlink-his-ui/src/views/esbmanage/cdadocument/api.js @@ -0,0 +1,6 @@ +import request from '@/utils/request' +export function generateCda(data) { return request({ url: '/esb/cda/generate', method: 'post', data }) } +export function getCdaDocuments(encounterId) { return request({ url: '/esb/cda/list/' + encounterId, method: 'get' }) } +export function getCdaPage(params) { return request({ url: '/fhir-cda/cda/page', method: 'get', params }) } +export function createCdaDocument(data) { return request({ url: '/fhir-cda/cda/create', method: 'post', data }) } +export function publishCdaDocument(id) { return request({ url: '/fhir-cda/cda/publish', method: 'post', params: { id } }) } diff --git a/healthlink-his-ui/src/views/esbmanage/cdadocument/index.vue b/healthlink-his-ui/src/views/esbmanage/cdadocument/index.vue new file mode 100644 index 000000000..e4dfa3716 --- /dev/null +++ b/healthlink-his-ui/src/views/esbmanage/cdadocument/index.vue @@ -0,0 +1,121 @@ + +