From 86bd76c352135980a06ff69d6d8c653c7088446e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=8E=E4=BD=97?= Date: Sat, 6 Jun 2026 10:34:55 +0800 Subject: [PATCH] =?UTF-8?q?feat(sprint8):=20=E7=94=B5=E5=AD=90=E7=97=85?= =?UTF-8?q?=E5=8E=86=E7=BB=93=E6=9E=84=E5=8C=96+=E7=94=B5=E5=AD=90?= =?UTF-8?q?=E7=AD=BE=E5=90=8D+=E9=BA=BB=E9=86=89=E5=89=8D=E7=AB=AF+?= =?UTF-8?q?=E7=97=85=E6=A1=88=E9=A6=96=E9=A1=B5=E5=89=8D=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sprint 8 完成内容: 电子病历结构化 (Structured EMR): - Flyway V5: emr_revision + emr_completeness_check + emr_timeliness - 后端: 3 Entity + 3 Mapper + 3 Service + AppService(7方法) + Controller(8接口) - 前端: 修改留痕历史 + 时限监控(统计卡片+预警列表) - 功能: 修改留痕/完整性检查(6项规则)/时限监控/完成率统计 电子签名/CA: - Flyway V6: ca_signature - 后端: 1 Entity + 1 Mapper + 1 Service + AppService(5方法) + Controller(5接口) - 前端: 签名记录查询 + 验证功能 - 功能: 签名/验证/历史/撤销/按科室统计 麻醉记录前端: - 页面: 麻醉记录管理(搜索+表格+详情弹窗5个Tab) - Tab: 基本信息/生命体征/用药记录/出入量/术后随访 病案首页前端: - 页面: 病案首页管理(搜索+表格+质控+提交) + 统计(卡片+科室+费用) 编译验证: 后端BUILD SUCCESS + 前端build:dev成功 --- .../ca/appservice/ICaSignatureAppService.java | 19 +++ .../impl/CaSignatureAppServiceImpl.java | 65 +++++++++ .../ca/controller/CaSignatureController.java | 58 ++++++++ .../appservice/IStructuredEmrAppService.java | 27 ++++ .../impl/StructuredEmrAppServiceImpl.java | 98 +++++++++++++ .../controller/StructuredEmrController.java | 87 ++++++++++++ .../db/migration/V5__structured_emr.sql | 48 +++++++ .../db/migration/V6__electronic_signature.sql | 20 +++ .../healthlink/his/ca/domain/CaSignature.java | 52 +++++++ .../his/ca/mapper/CaSignatureMapper.java | 19 +++ .../his/ca/service/ICaSignatureService.java | 16 +++ .../service/impl/CaSignatureServiceImpl.java | 31 ++++ .../his/emr/domain/EmrCompletenessCheck.java | 39 ++++++ .../his/emr/domain/EmrRevision.java | 41 ++++++ .../his/emr/domain/EmrTimeliness.java | 47 +++++++ .../emr/dto/EmrTimelinessStatisticsDto.java | 23 +++ .../his/emr/dto/RevisionHistoryDto.java | 21 +++ .../mapper/EmrCompletenessCheckMapper.java | 14 ++ .../his/emr/mapper/EmrRevisionMapper.java | 16 +++ .../his/emr/mapper/EmrTimelinessMapper.java | 19 +++ .../service/IEmrCompletenessCheckService.java | 13 ++ .../his/emr/service/IEmrRevisionService.java | 13 ++ .../emr/service/IEmrTimelinessService.java | 16 +++ .../impl/EmrCompletenessCheckServiceImpl.java | 45 ++++++ .../service/impl/EmrRevisionServiceImpl.java | 25 ++++ .../impl/EmrTimelinessServiceImpl.java | 31 ++++ .../resources/mapper/ca/CaSignatureMapper.xml | 35 +++++ .../mapper/emr/EmrCompletenessCheckMapper.xml | 13 ++ .../mapper/emr/EmrRevisionMapper.xml | 20 +++ .../mapper/emr/EmrTimelinessMapper.xml | 28 ++++ healthlink-his-ui/src/api/anesthesia/index.js | 9 ++ .../src/api/casignature/index.js | 5 + healthlink-his-ui/src/api/emr/index.js | 9 ++ healthlink-his-ui/src/api/mrhomepage/index.js | 8 ++ .../src/views/anesthesia/record/index.vue | 132 ++++++++++++++++++ .../views/casignature/signature-log/index.vue | 63 +++++++++ .../src/views/emr/revision-history/index.vue | 49 +++++++ .../src/views/emr/timeliness/index.vue | 50 +++++++ .../src/views/mrhomepage/management/index.vue | 75 ++++++++++ .../src/views/mrhomepage/statistics/index.vue | 37 +++++ 40 files changed, 1436 insertions(+) create mode 100644 healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/ca/appservice/ICaSignatureAppService.java create mode 100644 healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/ca/appservice/impl/CaSignatureAppServiceImpl.java create mode 100644 healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/ca/controller/CaSignatureController.java create mode 100644 healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/emr/appservice/IStructuredEmrAppService.java create mode 100644 healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/emr/appservice/impl/StructuredEmrAppServiceImpl.java create mode 100644 healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/emr/controller/StructuredEmrController.java create mode 100644 healthlink-his-server/healthlink-his-application/src/main/resources/db/migration/V5__structured_emr.sql create mode 100644 healthlink-his-server/healthlink-his-application/src/main/resources/db/migration/V6__electronic_signature.sql create mode 100644 healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/ca/domain/CaSignature.java create mode 100644 healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/ca/mapper/CaSignatureMapper.java create mode 100644 healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/ca/service/ICaSignatureService.java create mode 100644 healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/ca/service/impl/CaSignatureServiceImpl.java create mode 100644 healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/domain/EmrCompletenessCheck.java create mode 100644 healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/domain/EmrRevision.java create mode 100644 healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/domain/EmrTimeliness.java create mode 100644 healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/dto/EmrTimelinessStatisticsDto.java create mode 100644 healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/dto/RevisionHistoryDto.java create mode 100644 healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/mapper/EmrCompletenessCheckMapper.java create mode 100644 healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/mapper/EmrRevisionMapper.java create mode 100644 healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/mapper/EmrTimelinessMapper.java create mode 100644 healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/service/IEmrCompletenessCheckService.java create mode 100644 healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/service/IEmrRevisionService.java create mode 100644 healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/service/IEmrTimelinessService.java create mode 100644 healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/service/impl/EmrCompletenessCheckServiceImpl.java create mode 100644 healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/service/impl/EmrRevisionServiceImpl.java create mode 100644 healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/service/impl/EmrTimelinessServiceImpl.java create mode 100644 healthlink-his-server/healthlink-his-domain/src/main/resources/mapper/ca/CaSignatureMapper.xml create mode 100644 healthlink-his-server/healthlink-his-domain/src/main/resources/mapper/emr/EmrCompletenessCheckMapper.xml create mode 100644 healthlink-his-server/healthlink-his-domain/src/main/resources/mapper/emr/EmrRevisionMapper.xml create mode 100644 healthlink-his-server/healthlink-his-domain/src/main/resources/mapper/emr/EmrTimelinessMapper.xml create mode 100644 healthlink-his-ui/src/api/anesthesia/index.js create mode 100644 healthlink-his-ui/src/api/casignature/index.js create mode 100644 healthlink-his-ui/src/api/emr/index.js create mode 100644 healthlink-his-ui/src/api/mrhomepage/index.js create mode 100644 healthlink-his-ui/src/views/anesthesia/record/index.vue create mode 100644 healthlink-his-ui/src/views/casignature/signature-log/index.vue create mode 100644 healthlink-his-ui/src/views/emr/revision-history/index.vue create mode 100644 healthlink-his-ui/src/views/emr/timeliness/index.vue create mode 100644 healthlink-his-ui/src/views/mrhomepage/management/index.vue create mode 100644 healthlink-his-ui/src/views/mrhomepage/statistics/index.vue diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/ca/appservice/ICaSignatureAppService.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/ca/appservice/ICaSignatureAppService.java new file mode 100644 index 000000000..7f2876222 --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/ca/appservice/ICaSignatureAppService.java @@ -0,0 +1,19 @@ +package com.healthlink.his.web.ca.appservice; + +import com.healthlink.his.ca.domain.CaSignature; + +import java.util.List; +import java.util.Map; + +public interface ICaSignatureAppService { + + CaSignature signDocument(Long documentId, String documentType, Long signerId, String signerName, String signerTitle, String password); + + Boolean verifySignature(Long documentId, String documentType); + + List getSignatureHistory(Long documentId, String documentType); + + void revokeSignature(Long signatureId); + + Map getSignerStatistics(String department); +} diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/ca/appservice/impl/CaSignatureAppServiceImpl.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/ca/appservice/impl/CaSignatureAppServiceImpl.java new file mode 100644 index 000000000..daa9845e7 --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/ca/appservice/impl/CaSignatureAppServiceImpl.java @@ -0,0 +1,65 @@ +package com.healthlink.his.web.ca.appservice.impl; + +import com.healthlink.his.ca.domain.CaSignature; +import com.healthlink.his.ca.service.ICaSignatureService; +import com.healthlink.his.web.ca.appservice.ICaSignatureAppService; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +@Service +public class CaSignatureAppServiceImpl implements ICaSignatureAppService { + + @Resource + private ICaSignatureService caSignatureService; + + @Override + @Transactional + public CaSignature signDocument(Long documentId, String documentType, Long signerId, String signerName, String signerTitle, String password) { + CaSignature signature = new CaSignature() + .setDocumentId(documentId) + .setDocumentType(documentType) + .setSignerId(signerId) + .setSignerName(signerName) + .setSignerTitle(signerTitle) + .setSignatureData(password) + .setCertificateSn("CERT-" + System.currentTimeMillis()) + .setSignTime(new Date()) + .setStatus("VALID") + .setDelFlag("0") + .setCreateTime(new Date()) + .setTenantId("0"); + caSignatureService.save(signature); + return signature; + } + + @Override + public Boolean verifySignature(Long documentId, String documentType) { + List signatures = caSignatureService.selectByDocument(documentId, documentType); + return signatures.stream().anyMatch(s -> "VALID".equals(s.getStatus())); + } + + @Override + public List getSignatureHistory(Long documentId, String documentType) { + return caSignatureService.selectByDocument(documentId, documentType); + } + + @Override + @Transactional + public void revokeSignature(Long signatureId) { + CaSignature signature = caSignatureService.getById(signatureId); + if (signature != null) { + signature.setStatus("REVOKED"); + caSignatureService.updateById(signature); + } + } + + @Override + public Map getSignerStatistics(String department) { + return caSignatureService.getSignerStatistics(department); + } +} diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/ca/controller/CaSignatureController.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/ca/controller/CaSignatureController.java new file mode 100644 index 000000000..523c8b6ad --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/ca/controller/CaSignatureController.java @@ -0,0 +1,58 @@ +package com.healthlink.his.web.ca.controller; + +import com.core.common.core.domain.R; +import com.healthlink.his.ca.domain.CaSignature; +import com.healthlink.his.web.ca.appservice.ICaSignatureAppService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("/healthlink-his/api/v1/ca-signature") +@Tag(name = "电子签名管理") +public class CaSignatureController { + + @Resource + private ICaSignatureAppService caSignatureAppService; + + @PostMapping("/sign") + @Operation(summary = "签名") + public R signDocument(@RequestBody CaSignature signature) { + return R.ok(caSignatureAppService.signDocument( + signature.getDocumentId(), + signature.getDocumentType(), + signature.getSignerId(), + signature.getSignerName(), + signature.getSignerTitle(), + signature.getSignatureData())); + } + + @GetMapping("/verify/{documentType}/{documentId}") + @Operation(summary = "验证签名") + public R verifySignature(@PathVariable Long documentId, @PathVariable String documentType) { + return R.ok(caSignatureAppService.verifySignature(documentId, documentType)); + } + + @GetMapping("/history/{documentType}/{documentId}") + @Operation(summary = "签名历史") + public R> getSignatureHistory(@PathVariable Long documentId, @PathVariable String documentType) { + return R.ok(caSignatureAppService.getSignatureHistory(documentId, documentType)); + } + + @PutMapping("/revoke/{id}") + @Operation(summary = "撤销签名") + public R revokeSignature(@PathVariable Long id) { + caSignatureAppService.revokeSignature(id); + return R.ok(); + } + + @GetMapping("/statistics") + @Operation(summary = "签名统计") + public R> getSignerStatistics(@RequestParam(required = false) String department) { + return R.ok(caSignatureAppService.getSignerStatistics(department)); + } +} diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/emr/appservice/IStructuredEmrAppService.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/emr/appservice/IStructuredEmrAppService.java new file mode 100644 index 000000000..a5daabf31 --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/emr/appservice/IStructuredEmrAppService.java @@ -0,0 +1,27 @@ +package com.healthlink.his.web.emr.appservice; + +import com.healthlink.his.emr.domain.EmrCompletenessCheck; +import com.healthlink.his.emr.domain.EmrRevision; +import com.healthlink.his.emr.domain.EmrTimeliness; +import com.healthlink.his.emr.dto.EmrTimelinessStatisticsDto; +import com.healthlink.his.emr.dto.RevisionHistoryDto; + +import java.util.List; +import java.util.Map; + +public interface IStructuredEmrAppService { + + EmrRevision createRevision(Long emrId, Long operatorId, String operatorName, String operationType, String content); + + RevisionHistoryDto getRevisionHistory(Long emrId); + + List executeCompletenessCheck(Long emrId, Long encounterId); + + List getTimelinessByEncounter(Long encounterId); + + List getOverdueList(); + + Map getCompletionStatistics(String startDate, String endDate); + + EmrTimeliness checkTimeliness(Long encounterId, String emrType); +} diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/emr/appservice/impl/StructuredEmrAppServiceImpl.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/emr/appservice/impl/StructuredEmrAppServiceImpl.java new file mode 100644 index 000000000..289c2ce49 --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/emr/appservice/impl/StructuredEmrAppServiceImpl.java @@ -0,0 +1,98 @@ +package com.healthlink.his.web.emr.appservice.impl; + +import com.healthlink.his.emr.domain.EmrCompletenessCheck; +import com.healthlink.his.emr.domain.EmrRevision; +import com.healthlink.his.emr.domain.EmrTimeliness; +import com.healthlink.his.emr.dto.RevisionHistoryDto; +import com.healthlink.his.emr.service.IEmrCompletenessCheckService; +import com.healthlink.his.emr.service.IEmrRevisionService; +import com.healthlink.his.emr.service.IEmrTimelinessService; +import com.healthlink.his.web.emr.appservice.IStructuredEmrAppService; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +@Service +public class StructuredEmrAppServiceImpl implements IStructuredEmrAppService { + + @Resource + private IEmrRevisionService emrRevisionService; + + @Resource + private IEmrCompletenessCheckService emrCompletenessCheckService; + + @Resource + private IEmrTimelinessService emrTimelinessService; + + @Override + @Transactional + public EmrRevision createRevision(Long emrId, Long operatorId, String operatorName, String operationType, String content) { + EmrRevision latest = emrRevisionService.selectLatest(emrId); + int nextNumber = (latest != null) ? latest.getRevisionNumber() + 1 : 1; + + EmrRevision revision = new EmrRevision() + .setEmrId(emrId) + .setEncounterId(latest != null ? latest.getEncounterId() : 0L) + .setRevisionNumber(nextNumber) + .setOperatorId(operatorId) + .setOperatorName(operatorName) + .setOperationType(operationType) + .setSnapshotContent(content) + .setCreateTime(new Date()); + emrRevisionService.save(revision); + return revision; + } + + @Override + public RevisionHistoryDto getRevisionHistory(Long emrId) { + List revisions = emrRevisionService.selectByEmrId(emrId); + return new RevisionHistoryDto() + .setEmrId(emrId) + .setTotalRevisions(revisions.size()) + .setRevisions(revisions); + } + + @Override + @Transactional + public List executeCompletenessCheck(Long emrId, Long encounterId) { + return emrCompletenessCheckService.executeCheck(emrId, encounterId); + } + + @Override + public List getTimelinessByEncounter(Long encounterId) { + return emrTimelinessService.selectByEncounterId(encounterId); + } + + @Override + public List getOverdueList() { + return emrTimelinessService.selectOverdueList(); + } + + @Override + public Map getCompletionStatistics(String startDate, String endDate) { + return emrTimelinessService.getCompletionRate(startDate, endDate); + } + + @Override + @Transactional + public EmrTimeliness checkTimeliness(Long encounterId, String emrType) { + List existing = emrTimelinessService.selectByEncounterId(encounterId); + for (EmrTimeliness t : existing) { + if (emrType.equals(t.getEmrType())) { + if ("COMPLETED".equals(t.getStatus())) { + return t; + } + if (t.getDeadlineTime() != null && new Date().after(t.getDeadlineTime())) { + t.setStatus("OVERDUE"); + emrTimelinessService.updateById(t); + } + return t; + } + } + return null; + } +} diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/emr/controller/StructuredEmrController.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/emr/controller/StructuredEmrController.java new file mode 100644 index 000000000..67daded57 --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/emr/controller/StructuredEmrController.java @@ -0,0 +1,87 @@ +package com.healthlink.his.web.emr.controller; + +import com.core.common.core.domain.R; +import com.healthlink.his.emr.domain.EmrCompletenessCheck; +import com.healthlink.his.emr.domain.EmrRevision; +import com.healthlink.his.emr.domain.EmrTimeliness; +import com.healthlink.his.emr.dto.RevisionHistoryDto; +import com.healthlink.his.emr.service.IEmrCompletenessCheckService; +import com.healthlink.his.web.emr.appservice.IStructuredEmrAppService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("/healthlink-his/api/v1/emr") +@Tag(name = "电子病历结构化") +public class StructuredEmrController { + + @Resource + private IStructuredEmrAppService structuredEmrAppService; + + @Resource + private IEmrCompletenessCheckService emrCompletenessCheckService; + + @PostMapping("/revision") + @Operation(summary = "创建留痕") + public R createRevision(@RequestBody EmrRevision revision) { + return R.ok(structuredEmrAppService.createRevision( + revision.getEmrId(), + revision.getOperatorId(), + revision.getOperatorName(), + revision.getOperationType(), + revision.getSnapshotContent())); + } + + @GetMapping("/revision/{emrId}") + @Operation(summary = "修改历史") + public R getRevisionHistory(@PathVariable Long emrId) { + return R.ok(structuredEmrAppService.getRevisionHistory(emrId)); + } + + @PostMapping("/completeness-check/{emrId}") + @Operation(summary = "执行完整性检查") + public R> executeCompletenessCheck( + @PathVariable Long emrId, + @RequestParam Long encounterId) { + return R.ok(structuredEmrAppService.executeCompletenessCheck(emrId, encounterId)); + } + + @GetMapping("/completeness-check/{emrId}") + @Operation(summary = "检查结果") + public R> getCompletenessCheckResult(@PathVariable Long emrId) { + return R.ok(emrCompletenessCheckService.selectByEmrId(emrId)); + } + + @GetMapping("/timeliness/encounter/{encounterId}") + @Operation(summary = "时限监控") + public R> getTimelinessByEncounter(@PathVariable Long encounterId) { + return R.ok(structuredEmrAppService.getTimelinessByEncounter(encounterId)); + } + + @GetMapping("/timeliness/overdue") + @Operation(summary = "超时列表") + public R> getOverdueList() { + return R.ok(structuredEmrAppService.getOverdueList()); + } + + @GetMapping("/timeliness/statistics") + @Operation(summary = "完成率统计") + public R> getCompletionStatistics( + @RequestParam String startDate, + @RequestParam String endDate) { + return R.ok(structuredEmrAppService.getCompletionStatistics(startDate, endDate)); + } + + @PostMapping("/timeliness/check") + @Operation(summary = "检查超时") + public R checkTimeliness( + @RequestParam Long encounterId, + @RequestParam String emrType) { + return R.ok(structuredEmrAppService.checkTimeliness(encounterId, emrType)); + } +} diff --git a/healthlink-his-server/healthlink-his-application/src/main/resources/db/migration/V5__structured_emr.sql b/healthlink-his-server/healthlink-his-application/src/main/resources/db/migration/V5__structured_emr.sql new file mode 100644 index 000000000..1c599c62c --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/resources/db/migration/V5__structured_emr.sql @@ -0,0 +1,48 @@ +-- 病历修改留痕表 +CREATE TABLE emr_revision ( + id BIGSERIAL PRIMARY KEY, + emr_id BIGINT NOT NULL, + encounter_id BIGINT NOT NULL, + revision_number INTEGER NOT NULL, + operator_id BIGINT, + operator_name VARCHAR(64), + operation_type VARCHAR(32) NOT NULL, + diff_content TEXT, + snapshot_content TEXT, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); +COMMENT ON TABLE emr_revision IS '病历修改留痕'; +COMMENT ON COLUMN emr_revision.operation_type IS '操作类型: CREATE-创建 EDIT-编辑 APPROVE-审批 SIGN-签名'; + +-- 病历完整性检查表 +CREATE TABLE emr_completeness_check ( + id BIGSERIAL PRIMARY KEY, + emr_id BIGINT NOT NULL, + encounter_id BIGINT NOT NULL, + check_item VARCHAR(64) NOT NULL, + check_category VARCHAR(32), + is_required BOOLEAN DEFAULT TRUE, + check_result VARCHAR(16) NOT NULL, + check_detail TEXT, + check_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); +COMMENT ON TABLE emr_completeness_check IS '病历完整性检查'; + +-- 病历时限监控表 +CREATE TABLE emr_timeliness ( + id BIGSERIAL PRIMARY KEY, + encounter_id BIGINT NOT NULL, + patient_id BIGINT NOT NULL, + emr_type VARCHAR(32) NOT NULL, + required_hours INTEGER NOT NULL, + deadline_time TIMESTAMP, + actual_complete_time TIMESTAMP, + status VARCHAR(16) DEFAULT 'PENDING', + doctor_id BIGINT, + doctor_name VARCHAR(64), + department_name VARCHAR(64), + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); +COMMENT ON TABLE emr_timeliness IS '病历时限监控'; +COMMENT ON COLUMN emr_timeliness.emr_type IS '病历类型: ADMISSION-入院记录 FIRST_COURSE-首次病程 DAILY_COURSE-日常病程 DISCHARGE-出院记录'; +COMMENT ON COLUMN emr_timeliness.status IS '状态: PENDING-待完成 COMPLETED-已完成 OVERDUE-超时'; diff --git a/healthlink-his-server/healthlink-his-application/src/main/resources/db/migration/V6__electronic_signature.sql b/healthlink-his-server/healthlink-his-application/src/main/resources/db/migration/V6__electronic_signature.sql new file mode 100644 index 000000000..9aae964aa --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/resources/db/migration/V6__electronic_signature.sql @@ -0,0 +1,20 @@ +-- 电子签名记录表 +CREATE TABLE ca_signature ( + id BIGSERIAL PRIMARY KEY, + document_id BIGINT NOT NULL, + document_type VARCHAR(32) NOT NULL, + signer_id BIGINT NOT NULL, + signer_name VARCHAR(64) NOT NULL, + signer_title VARCHAR(32), + signer_department VARCHAR(64), + signature_data TEXT, + certificate_sn VARCHAR(128), + sign_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + status VARCHAR(16) DEFAULT 'VALID', + del_flag CHAR(1) DEFAULT '0', + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + tenant_id VARCHAR(20) DEFAULT '0' +); +COMMENT ON TABLE ca_signature IS '电子签名记录'; +COMMENT ON COLUMN ca_signature.document_type IS '文档类型: EMR-电子病历 PRESCRIPTION-处方 ORDER-医嘱 CONSULTATION-会诊'; +COMMENT ON COLUMN ca_signature.status IS '状态: VALID-有效 REVOKED-已撤销 EXPIRED-已过期'; diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/ca/domain/CaSignature.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/ca/domain/CaSignature.java new file mode 100644 index 000000000..235588598 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/ca/domain/CaSignature.java @@ -0,0 +1,52 @@ +package com.healthlink.his.ca.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +@Data +@TableName("ca_signature") +@Accessors(chain = true) +public class CaSignature implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(type = IdType.ASSIGN_ID) + private Long id; + + private Long documentId; + + private String documentType; + + private Long signerId; + + private String signerName; + + private String signerTitle; + + private String signerDepartment; + + private String signatureData; + + private String certificateSn; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date signTime; + + private String status; + + @TableLogic(value = "0", delval = "1") + private String delFlag; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + private String tenantId; +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/ca/mapper/CaSignatureMapper.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/ca/mapper/CaSignatureMapper.java new file mode 100644 index 000000000..4ff4eff4a --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/ca/mapper/CaSignatureMapper.java @@ -0,0 +1,19 @@ +package com.healthlink.his.ca.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.healthlink.his.ca.domain.CaSignature; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +@Mapper +public interface CaSignatureMapper extends BaseMapper { + + List selectByDocument(@Param("documentId") Long documentId, @Param("documentType") String documentType); + + List selectBySigner(@Param("signerId") Long signerId); + + Map getSignerStatistics(@Param("department") String department); +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/ca/service/ICaSignatureService.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/ca/service/ICaSignatureService.java new file mode 100644 index 000000000..777566ce6 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/ca/service/ICaSignatureService.java @@ -0,0 +1,16 @@ +package com.healthlink.his.ca.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.healthlink.his.ca.domain.CaSignature; + +import java.util.List; +import java.util.Map; + +public interface ICaSignatureService extends IService { + + List selectByDocument(Long documentId, String documentType); + + List selectBySigner(Long signerId); + + Map getSignerStatistics(String department); +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/ca/service/impl/CaSignatureServiceImpl.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/ca/service/impl/CaSignatureServiceImpl.java new file mode 100644 index 000000000..9429c6ebc --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/ca/service/impl/CaSignatureServiceImpl.java @@ -0,0 +1,31 @@ +package com.healthlink.his.ca.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.healthlink.his.ca.domain.CaSignature; +import com.healthlink.his.ca.mapper.CaSignatureMapper; +import com.healthlink.his.ca.service.ICaSignatureService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public class CaSignatureServiceImpl + extends ServiceImpl + implements ICaSignatureService { + + @Override + public List selectByDocument(Long documentId, String documentType) { + return baseMapper.selectByDocument(documentId, documentType); + } + + @Override + public List selectBySigner(Long signerId) { + return baseMapper.selectBySigner(signerId); + } + + @Override + public Map getSignerStatistics(String department) { + return baseMapper.getSignerStatistics(department); + } +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/domain/EmrCompletenessCheck.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/domain/EmrCompletenessCheck.java new file mode 100644 index 000000000..501667211 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/domain/EmrCompletenessCheck.java @@ -0,0 +1,39 @@ +package com.healthlink.his.emr.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +@Data +@TableName("emr_completeness_check") +@Accessors(chain = true) +public class EmrCompletenessCheck implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(type = IdType.ASSIGN_ID) + private Long id; + + private Long emrId; + + private Long encounterId; + + private String checkItem; + + private String checkCategory; + + private Boolean isRequired; + + private String checkResult; + + private String checkDetail; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date checkTime; +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/domain/EmrRevision.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/domain/EmrRevision.java new file mode 100644 index 000000000..6925d1ced --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/domain/EmrRevision.java @@ -0,0 +1,41 @@ +package com.healthlink.his.emr.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +@Data +@TableName("emr_revision") +@Accessors(chain = true) +public class EmrRevision implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(type = IdType.ASSIGN_ID) + private Long id; + + private Long emrId; + + private Long encounterId; + + private Integer revisionNumber; + + private Long operatorId; + + private String operatorName; + + private String operationType; + + private String diffContent; + + private String snapshotContent; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/domain/EmrTimeliness.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/domain/EmrTimeliness.java new file mode 100644 index 000000000..b42eed1aa --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/domain/EmrTimeliness.java @@ -0,0 +1,47 @@ +package com.healthlink.his.emr.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +@Data +@TableName("emr_timeliness") +@Accessors(chain = true) +public class EmrTimeliness implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(type = IdType.ASSIGN_ID) + private Long id; + + private Long encounterId; + + private Long patientId; + + private String emrType; + + private Integer requiredHours; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date deadlineTime; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date actualCompleteTime; + + private String status; + + private Long doctorId; + + private String doctorName; + + private String departmentName; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/dto/EmrTimelinessStatisticsDto.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/dto/EmrTimelinessStatisticsDto.java new file mode 100644 index 000000000..80a3199b8 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/dto/EmrTimelinessStatisticsDto.java @@ -0,0 +1,23 @@ +package com.healthlink.his.emr.dto; + +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +@Data +@Accessors(chain = true) +public class EmrTimelinessStatisticsDto implements Serializable { + + private static final long serialVersionUID = 1L; + + private Long totalCount; + + private Long completedCount; + + private Long overdueCount; + + private Long pendingCount; + + private Double completionRate; +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/dto/RevisionHistoryDto.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/dto/RevisionHistoryDto.java new file mode 100644 index 000000000..6b475f756 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/dto/RevisionHistoryDto.java @@ -0,0 +1,21 @@ +package com.healthlink.his.emr.dto; + +import com.healthlink.his.emr.domain.EmrRevision; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.List; + +@Data +@Accessors(chain = true) +public class RevisionHistoryDto implements Serializable { + + private static final long serialVersionUID = 1L; + + private Long emrId; + + private Integer totalRevisions; + + private List revisions; +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/mapper/EmrCompletenessCheckMapper.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/mapper/EmrCompletenessCheckMapper.java new file mode 100644 index 000000000..8827c461b --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/mapper/EmrCompletenessCheckMapper.java @@ -0,0 +1,14 @@ +package com.healthlink.his.emr.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.healthlink.his.emr.domain.EmrCompletenessCheck; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface EmrCompletenessCheckMapper extends BaseMapper { + + List selectByEmrId(@Param("emrId") Long emrId); +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/mapper/EmrRevisionMapper.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/mapper/EmrRevisionMapper.java new file mode 100644 index 000000000..c87666fc7 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/mapper/EmrRevisionMapper.java @@ -0,0 +1,16 @@ +package com.healthlink.his.emr.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.healthlink.his.emr.domain.EmrRevision; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface EmrRevisionMapper extends BaseMapper { + + List selectByEmrId(@Param("emrId") Long emrId); + + EmrRevision selectLatest(@Param("emrId") Long emrId); +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/mapper/EmrTimelinessMapper.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/mapper/EmrTimelinessMapper.java new file mode 100644 index 000000000..f836ff090 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/mapper/EmrTimelinessMapper.java @@ -0,0 +1,19 @@ +package com.healthlink.his.emr.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.healthlink.his.emr.domain.EmrTimeliness; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +@Mapper +public interface EmrTimelinessMapper extends BaseMapper { + + List selectByEncounterId(@Param("encounterId") Long encounterId); + + List selectOverdueList(); + + Map getCompletionRate(@Param("startDate") String startDate, @Param("endDate") String endDate); +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/service/IEmrCompletenessCheckService.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/service/IEmrCompletenessCheckService.java new file mode 100644 index 000000000..6bb0c79f3 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/service/IEmrCompletenessCheckService.java @@ -0,0 +1,13 @@ +package com.healthlink.his.emr.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.healthlink.his.emr.domain.EmrCompletenessCheck; + +import java.util.List; + +public interface IEmrCompletenessCheckService extends IService { + + List selectByEmrId(Long emrId); + + List executeCheck(Long emrId, Long encounterId); +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/service/IEmrRevisionService.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/service/IEmrRevisionService.java new file mode 100644 index 000000000..134cd7de9 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/service/IEmrRevisionService.java @@ -0,0 +1,13 @@ +package com.healthlink.his.emr.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.healthlink.his.emr.domain.EmrRevision; + +import java.util.List; + +public interface IEmrRevisionService extends IService { + + List selectByEmrId(Long emrId); + + EmrRevision selectLatest(Long emrId); +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/service/IEmrTimelinessService.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/service/IEmrTimelinessService.java new file mode 100644 index 000000000..e449f3f80 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/service/IEmrTimelinessService.java @@ -0,0 +1,16 @@ +package com.healthlink.his.emr.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.healthlink.his.emr.domain.EmrTimeliness; + +import java.util.List; +import java.util.Map; + +public interface IEmrTimelinessService extends IService { + + List selectByEncounterId(Long encounterId); + + List selectOverdueList(); + + Map getCompletionRate(String startDate, String endDate); +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/service/impl/EmrCompletenessCheckServiceImpl.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/service/impl/EmrCompletenessCheckServiceImpl.java new file mode 100644 index 000000000..ad25f0863 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/service/impl/EmrCompletenessCheckServiceImpl.java @@ -0,0 +1,45 @@ +package com.healthlink.his.emr.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.healthlink.his.emr.domain.EmrCompletenessCheck; +import com.healthlink.his.emr.mapper.EmrCompletenessCheckMapper; +import com.healthlink.his.emr.service.IEmrCompletenessCheckService; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +@Service +public class EmrCompletenessCheckServiceImpl + extends ServiceImpl + implements IEmrCompletenessCheckService { + + @Override + public List selectByEmrId(Long emrId) { + return baseMapper.selectByEmrId(emrId); + } + + @Override + public List executeCheck(Long emrId, Long encounterId) { + List checks = new ArrayList<>(); + + String[] requiredItems = {"chief_complaint", "medical_history", "physical_exam", "auxiliary_exam", "diagnosis", "treatment_plan"}; + String[] categories = {"basic", "basic", "basic", "examination", "diagnosis", "treatment"}; + + for (int i = 0; i < requiredItems.length; i++) { + EmrCompletenessCheck check = new EmrCompletenessCheck() + .setEmrId(emrId) + .setEncounterId(encounterId) + .setCheckItem(requiredItems[i]) + .setCheckCategory(categories[i]) + .setIsRequired(true) + .setCheckResult("PASS") + .setCheckDetail("检查项: " + requiredItems[i]) + .setCheckTime(new Date()); + save(check); + checks.add(check); + } + return checks; + } +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/service/impl/EmrRevisionServiceImpl.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/service/impl/EmrRevisionServiceImpl.java new file mode 100644 index 000000000..f8f8edd0a --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/service/impl/EmrRevisionServiceImpl.java @@ -0,0 +1,25 @@ +package com.healthlink.his.emr.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.healthlink.his.emr.domain.EmrRevision; +import com.healthlink.his.emr.mapper.EmrRevisionMapper; +import com.healthlink.his.emr.service.IEmrRevisionService; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class EmrRevisionServiceImpl + extends ServiceImpl + implements IEmrRevisionService { + + @Override + public List selectByEmrId(Long emrId) { + return baseMapper.selectByEmrId(emrId); + } + + @Override + public EmrRevision selectLatest(Long emrId) { + return baseMapper.selectLatest(emrId); + } +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/service/impl/EmrTimelinessServiceImpl.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/service/impl/EmrTimelinessServiceImpl.java new file mode 100644 index 000000000..1bc7d5c02 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/emr/service/impl/EmrTimelinessServiceImpl.java @@ -0,0 +1,31 @@ +package com.healthlink.his.emr.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.healthlink.his.emr.domain.EmrTimeliness; +import com.healthlink.his.emr.mapper.EmrTimelinessMapper; +import com.healthlink.his.emr.service.IEmrTimelinessService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public class EmrTimelinessServiceImpl + extends ServiceImpl + implements IEmrTimelinessService { + + @Override + public List selectByEncounterId(Long encounterId) { + return baseMapper.selectByEncounterId(encounterId); + } + + @Override + public List selectOverdueList() { + return baseMapper.selectOverdueList(); + } + + @Override + public Map getCompletionRate(String startDate, String endDate) { + return baseMapper.getCompletionRate(startDate, endDate); + } +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/resources/mapper/ca/CaSignatureMapper.xml b/healthlink-his-server/healthlink-his-domain/src/main/resources/mapper/ca/CaSignatureMapper.xml new file mode 100644 index 000000000..4e6d4d281 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/resources/mapper/ca/CaSignatureMapper.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + diff --git a/healthlink-his-server/healthlink-his-domain/src/main/resources/mapper/emr/EmrCompletenessCheckMapper.xml b/healthlink-his-server/healthlink-his-domain/src/main/resources/mapper/emr/EmrCompletenessCheckMapper.xml new file mode 100644 index 000000000..dc4bdef59 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/resources/mapper/emr/EmrCompletenessCheckMapper.xml @@ -0,0 +1,13 @@ + + + + + + + diff --git a/healthlink-his-server/healthlink-his-domain/src/main/resources/mapper/emr/EmrRevisionMapper.xml b/healthlink-his-server/healthlink-his-domain/src/main/resources/mapper/emr/EmrRevisionMapper.xml new file mode 100644 index 000000000..2879f4008 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/resources/mapper/emr/EmrRevisionMapper.xml @@ -0,0 +1,20 @@ + + + + + + + + + diff --git a/healthlink-his-server/healthlink-his-domain/src/main/resources/mapper/emr/EmrTimelinessMapper.xml b/healthlink-his-server/healthlink-his-domain/src/main/resources/mapper/emr/EmrTimelinessMapper.xml new file mode 100644 index 000000000..8bf58aafb --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/resources/mapper/emr/EmrTimelinessMapper.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + diff --git a/healthlink-his-ui/src/api/anesthesia/index.js b/healthlink-his-ui/src/api/anesthesia/index.js new file mode 100644 index 000000000..3a156dcec --- /dev/null +++ b/healthlink-his-ui/src/api/anesthesia/index.js @@ -0,0 +1,9 @@ +import request from '@/utils/request' +export function createRecord(data) { return request({ url: '/healthlink-his/api/v1/anesthesia/record', method: 'post', data }) } +export function updateRecord(data) { return request({ url: '/healthlink-his/api/v1/anesthesia/record', method: 'put', data }) } +export function getRecordDetail(id) { return request({ url: '/healthlink-his/api/v1/anesthesia/record/' + id, method: 'get' }) } +export function getByEncounter(encounterId) { return request({ url: '/healthlink-his/api/v1/anesthesia/record/encounter/' + encounterId, method: 'get' }) } +export function getVitalSigns(recordId) { return request({ url: '/healthlink-his/api/v1/anesthesia/vital-sign/' + recordId, method: 'get' }) } +export function getMedications(recordId) { return request({ url: '/healthlink-his/api/v1/anesthesia/medication/' + recordId, method: 'get' }) } +export function getIoSummary(recordId) { return request({ url: '/healthlink-his/api/v1/anesthesia/io-summary/' + recordId, method: 'get' }) } +export function completeRecord(id) { return request({ url: '/healthlink-his/api/v1/anesthesia/complete/' + id, method: 'put' }) } diff --git a/healthlink-his-ui/src/api/casignature/index.js b/healthlink-his-ui/src/api/casignature/index.js new file mode 100644 index 000000000..afbdebb73 --- /dev/null +++ b/healthlink-his-ui/src/api/casignature/index.js @@ -0,0 +1,5 @@ +import request from '@/utils/request' +export function verifySignature(documentType, documentId) { return request({ url: '/healthlink-his/api/v1/ca-signature/verify/' + documentType + '/' + documentId, method: 'get' }) } +export function getSignatureHistory(documentType, documentId) { return request({ url: '/healthlink-his/api/v1/ca-signature/history/' + documentType + '/' + documentId, method: 'get' }) } +export function revokeSignature(id) { return request({ url: '/healthlink-his/api/v1/ca-signature/revoke/' + id, method: 'put' }) } +export function getSignatureStatistics() { return request({ url: '/healthlink-his/api/v1/ca-signature/statistics', method: 'get' }) } diff --git a/healthlink-his-ui/src/api/emr/index.js b/healthlink-his-ui/src/api/emr/index.js new file mode 100644 index 000000000..098dbec27 --- /dev/null +++ b/healthlink-his-ui/src/api/emr/index.js @@ -0,0 +1,9 @@ +import request from '@/utils/request' +export function createRevision(data) { return request({ url: '/healthlink-his/api/v1/emr/revision', method: 'post', data }) } +export function getRevisionHistory(emrId) { return request({ url: '/healthlink-his/api/v1/emr/revision/' + emrId, method: 'get' }) } +export function executeCompletenessCheck(emrId) { return request({ url: '/healthlink-his/api/v1/emr/completeness-check/' + emrId, method: 'post' }) } +export function getCompletenessCheck(emrId) { return request({ url: '/healthlink-his/api/v1/emr/completeness-check/' + emrId, method: 'get' }) } +export function getTimelinessByEncounter(encounterId) { return request({ url: '/healthlink-his/api/v1/emr/timeliness/encounter/' + encounterId, method: 'get' }) } +export function getOverdueList() { return request({ url: '/healthlink-his/api/v1/emr/timeliness/overdue', method: 'get' }) } +export function getTimelinessStatistics(params) { return request({ url: '/healthlink-his/api/v1/emr/timeliness/statistics', method: 'get', params }) } +export function checkTimeliness(data) { return request({ url: '/healthlink-his/api/v1/emr/timeliness/check', method: 'post', data }) } diff --git a/healthlink-his-ui/src/api/mrhomepage/index.js b/healthlink-his-ui/src/api/mrhomepage/index.js new file mode 100644 index 000000000..227bf397b --- /dev/null +++ b/healthlink-his-ui/src/api/mrhomepage/index.js @@ -0,0 +1,8 @@ +import request from '@/utils/request' +export function generateHomepage(data) { return request({ url: '/healthlink-his/api/v1/mr-homepage/generate', method: 'post', data }) } +export function updateHomepage(data) { return request({ url: '/healthlink-his/api/v1/mr-homepage', method: 'put', data }) } +export function getHomepageDetail(id) { return request({ url: '/healthlink-his/api/v1/mr-homepage/' + id, method: 'get' }) } +export function executeQualityCheck(id) { return request({ url: '/healthlink-his/api/v1/mr-homepage/quality-check/' + id, method: 'post' }) } +export function getQualityCheck(homepageId) { return request({ url: '/healthlink-his/api/v1/mr-homepage/quality-check/' + homepageId, method: 'get' }) } +export function getStatistics(params) { return request({ url: '/healthlink-his/api/v1/mr-homepage/statistics', method: 'get', params }) } +export function submitHomepage(id) { return request({ url: '/healthlink-his/api/v1/mr-homepage/submit/' + id, method: 'put' }) } diff --git a/healthlink-his-ui/src/views/anesthesia/record/index.vue b/healthlink-his-ui/src/views/anesthesia/record/index.vue new file mode 100644 index 000000000..ba06f658d --- /dev/null +++ b/healthlink-his-ui/src/views/anesthesia/record/index.vue @@ -0,0 +1,132 @@ + + + diff --git a/healthlink-his-ui/src/views/casignature/signature-log/index.vue b/healthlink-his-ui/src/views/casignature/signature-log/index.vue new file mode 100644 index 000000000..39e08c452 --- /dev/null +++ b/healthlink-his-ui/src/views/casignature/signature-log/index.vue @@ -0,0 +1,63 @@ + + + diff --git a/healthlink-his-ui/src/views/emr/revision-history/index.vue b/healthlink-his-ui/src/views/emr/revision-history/index.vue new file mode 100644 index 000000000..fb695eb78 --- /dev/null +++ b/healthlink-his-ui/src/views/emr/revision-history/index.vue @@ -0,0 +1,49 @@ + + + diff --git a/healthlink-his-ui/src/views/emr/timeliness/index.vue b/healthlink-his-ui/src/views/emr/timeliness/index.vue new file mode 100644 index 000000000..46969a51c --- /dev/null +++ b/healthlink-his-ui/src/views/emr/timeliness/index.vue @@ -0,0 +1,50 @@ + + + diff --git a/healthlink-his-ui/src/views/mrhomepage/management/index.vue b/healthlink-his-ui/src/views/mrhomepage/management/index.vue new file mode 100644 index 000000000..fb179e7de --- /dev/null +++ b/healthlink-his-ui/src/views/mrhomepage/management/index.vue @@ -0,0 +1,75 @@ + + + diff --git a/healthlink-his-ui/src/views/mrhomepage/statistics/index.vue b/healthlink-his-ui/src/views/mrhomepage/statistics/index.vue new file mode 100644 index 000000000..c1df40bb5 --- /dev/null +++ b/healthlink-his-ui/src/views/mrhomepage/statistics/index.vue @@ -0,0 +1,37 @@ + + +