diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/mrhomepage/appservice/IMrHqmsReportAppService.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/mrhomepage/appservice/IMrHqmsReportAppService.java new file mode 100644 index 000000000..2b7bc83dc --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/mrhomepage/appservice/IMrHqmsReportAppService.java @@ -0,0 +1,15 @@ +package com.healthlink.his.web.mrhomepage.appservice; + +import com.healthlink.his.mrhomepage.domain.MrHqmsReport; + +import java.util.List; +import java.util.Map; + +public interface IMrHqmsReportAppService { + + MrHqmsReport submitReport(Long homepageId, String reportType); + + Map getReportStatus(Long homepageId); + + List listReports(Long homepageId); +} diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/mrhomepage/appservice/impl/MrHqmsReportAppServiceImpl.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/mrhomepage/appservice/impl/MrHqmsReportAppServiceImpl.java new file mode 100644 index 000000000..6342427f9 --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/mrhomepage/appservice/impl/MrHqmsReportAppServiceImpl.java @@ -0,0 +1,105 @@ +package com.healthlink.his.web.mrhomepage.appservice.impl; + +import com.healthlink.his.mrhomepage.domain.MrHomepage; +import com.healthlink.his.mrhomepage.domain.MrHqmsReport; +import com.healthlink.his.mrhomepage.service.IMrHomepageService; +import com.healthlink.his.mrhomepage.service.IMrHqmsReportService; +import com.healthlink.his.web.mrhomepage.appservice.IMrHqmsReportAppService; +import jakarta.annotation.Resource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service +public class MrHqmsReportAppServiceImpl implements IMrHqmsReportAppService { + + private static final Logger log = LoggerFactory.getLogger(MrHqmsReportAppServiceImpl.class); + + @Resource + private IMrHomepageService mrHomepageService; + + @Resource + private IMrHqmsReportService mrHqmsReportService; + + @Override + @Transactional + public MrHqmsReport submitReport(Long homepageId, String reportType) { + MrHomepage homepage = mrHomepageService.getById(homepageId); + if (homepage == null) { + throw new RuntimeException("病案首页不存在: " + homepageId); + } + + MrHqmsReport report = new MrHqmsReport() + .setHomepageId(homepageId) + .setEncounterId(homepage.getEncounterId()) + .setPatientId(homepage.getPatientId()) + .setReportType(reportType != null ? reportType : "HQMS") + .setReportStatus("SUBMITTED") + .setReportTime(new Date()) + .setRetryCount(0); + + String reportData = buildReportData(homepage); + report.setReportData(reportData); + + mrHqmsReportService.save(report); + + log.info("HQMS上报已提交: homepageId={}, reportId={}", homepageId, report.getId()); + return report; + } + + @Override + public Map getReportStatus(Long homepageId) { + List reports = mrHqmsReportService.selectByHomepageId(homepageId); + + Map status = new HashMap<>(); + status.put("homepageId", homepageId); + status.put("totalReports", reports.size()); + + long successCount = reports.stream() + .filter(r -> "SUCCESS".equals(r.getReportStatus())) + .count(); + long pendingCount = reports.stream() + .filter(r -> "PENDING".equals(r.getReportStatus()) || "SUBMITTED".equals(r.getReportStatus())) + .count(); + long failedCount = reports.stream() + .filter(r -> "FAILED".equals(r.getReportStatus())) + .count(); + + status.put("successCount", successCount); + status.put("pendingCount", pendingCount); + status.put("failedCount", failedCount); + status.put("reports", reports); + + return status; + } + + @Override + public List listReports(Long homepageId) { + return mrHqmsReportService.selectByHomepageId(homepageId); + } + + private String buildReportData(MrHomepage homepage) { + StringBuilder sb = new StringBuilder(); + sb.append("{"); + sb.append("\"homepageId\":").append(homepage.getId()); + sb.append(",\"encounterId\":").append(homepage.getEncounterId()); + sb.append(",\"patientId\":").append(homepage.getPatientId()); + sb.append(",\"admissionDate\":\"").append(homepage.getAdmissionDate() != null ? homepage.getAdmissionDate() : "").append("\""); + sb.append(",\"dischargeDate\":\"").append(homepage.getDischargeDate() != null ? homepage.getDischargeDate() : "").append("\""); + sb.append(",\"primaryDiagnosisCode\":\"").append(homepage.getPrimaryDiagnosisCode() != null ? homepage.getPrimaryDiagnosisCode() : "").append("\""); + sb.append(",\"primaryDiagnosisName\":\"").append(homepage.getPrimaryDiagnosisName() != null ? homepage.getPrimaryDiagnosisName() : "").append("\""); + sb.append(",\"primaryProcedureCode\":\"").append(homepage.getPrimaryProcedureCode() != null ? homepage.getPrimaryProcedureCode() : "").append("\""); + sb.append(",\"primaryProcedureName\":\"").append(homepage.getPrimaryProcedureName() != null ? homepage.getPrimaryProcedureName() : "").append("\""); + sb.append(",\"drgGroup\":\"").append(homepage.getDrgGroup() != null ? homepage.getDrgGroup() : "").append("\""); + sb.append(",\"totalCost\":").append(homepage.getTotalCost() != null ? homepage.getTotalCost() : 0); + sb.append(",\"losDays\":").append(homepage.getLosDays() != null ? homepage.getLosDays() : 0); + sb.append("}"); + return sb.toString(); + } +} diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/mrhomepage/controller/MrHqmsReportController.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/mrhomepage/controller/MrHqmsReportController.java new file mode 100644 index 000000000..5b511adbf --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/mrhomepage/controller/MrHqmsReportController.java @@ -0,0 +1,45 @@ +package com.healthlink.his.web.mrhomepage.controller; + +import com.core.common.core.domain.R; +import com.healthlink.his.mrhomepage.domain.MrHqmsReport; +import com.healthlink.his.web.mrhomepage.appservice.IMrHqmsReportAppService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("/api/v1/mr-homepage/hqms") +@Tag(name = "HQMS首页上报") +public class MrHqmsReportController { + + @Resource + private IMrHqmsReportAppService mrHqmsReportAppService; + + @PostMapping("/report") + @PreAuthorize("hasAuthority('inpatient:mrhomepage:edit')") + @Operation(summary = "提交HQMS上报") + public R submitReport( + @RequestParam Long homepageId, + @RequestParam(required = false, defaultValue = "HQMS") String reportType) { + return R.ok(mrHqmsReportAppService.submitReport(homepageId, reportType)); + } + + @GetMapping("/status/{homepageId}") + @PreAuthorize("hasAuthority('inpatient:mrhomepage:list')") + @Operation(summary = "查询上报状态") + public R> getReportStatus(@PathVariable Long homepageId) { + return R.ok(mrHqmsReportAppService.getReportStatus(homepageId)); + } + + @GetMapping("/list/{homepageId}") + @PreAuthorize("hasAuthority('inpatient:mrhomepage:list')") + @Operation(summary = "查询上报记录列表") + public R> listReports(@PathVariable Long homepageId) { + return R.ok(mrHqmsReportAppService.listReports(homepageId)); + } +} diff --git a/healthlink-his-server/healthlink-his-application/src/main/resources/db/migration/V65__mr_hqms_report.sql b/healthlink-his-server/healthlink-his-application/src/main/resources/db/migration/V65__mr_hqms_report.sql new file mode 100644 index 000000000..0561fadc4 --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/resources/db/migration/V65__mr_hqms_report.sql @@ -0,0 +1,27 @@ +-- ============================================================ +-- V65: HQMS首页上报表 +-- ============================================================ + +CREATE TABLE mr_hqms_report ( + id BIGSERIAL PRIMARY KEY, + homepage_id BIGINT NOT NULL, + encounter_id BIGINT NOT NULL, + patient_id BIGINT NOT NULL, + report_type VARCHAR(20) NOT NULL, + report_status VARCHAR(20) DEFAULT 'PENDING', + report_time TIMESTAMP, + report_data TEXT, + response_data TEXT, + error_message TEXT, + retry_count INTEGER DEFAULT 0, + tenant_id BIGINT DEFAULT 0, + delete_flag CHAR(1) DEFAULT '0', + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + create_by VARCHAR(64), + update_time TIMESTAMP, + update_by VARCHAR(64) +); +COMMENT ON TABLE mr_hqms_report IS 'HQMS首页上报记录'; +CREATE INDEX idx_mr_hqms_report_homepage ON mr_hqms_report(homepage_id); +CREATE INDEX idx_mr_hqms_report_encounter ON mr_hqms_report(encounter_id); +CREATE INDEX idx_mr_hqms_report_status ON mr_hqms_report(report_status); diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/mrhomepage/domain/MrHqmsReport.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/mrhomepage/domain/MrHqmsReport.java new file mode 100644 index 000000000..229008c38 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/mrhomepage/domain/MrHqmsReport.java @@ -0,0 +1,43 @@ +package com.healthlink.his.mrhomepage.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.core.common.core.domain.HisBaseEntity; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.util.Date; + +@Data +@TableName("mr_hqms_report") +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +public class MrHqmsReport extends HisBaseEntity { + + @TableId(type = IdType.ASSIGN_ID) + private Long id; + + private Long homepageId; + + private Long encounterId; + + private Long patientId; + + private String reportType; + + private String reportStatus; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date reportTime; + + private String reportData; + + private String responseData; + + private String errorMessage; + + private Integer retryCount; +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/mrhomepage/mapper/MrHqmsReportMapper.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/mrhomepage/mapper/MrHqmsReportMapper.java new file mode 100644 index 000000000..1825fa327 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/mrhomepage/mapper/MrHqmsReportMapper.java @@ -0,0 +1,16 @@ +package com.healthlink.his.mrhomepage.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.healthlink.his.mrhomepage.domain.MrHqmsReport; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface MrHqmsReportMapper extends BaseMapper { + + List selectByHomepageId(@Param("homepageId") Long homepageId); + + List selectByEncounterId(@Param("encounterId") Long encounterId); +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/mrhomepage/service/IMrHqmsReportService.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/mrhomepage/service/IMrHqmsReportService.java new file mode 100644 index 000000000..833faeca5 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/mrhomepage/service/IMrHqmsReportService.java @@ -0,0 +1,13 @@ +package com.healthlink.his.mrhomepage.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.healthlink.his.mrhomepage.domain.MrHqmsReport; + +import java.util.List; + +public interface IMrHqmsReportService extends IService { + + List selectByHomepageId(Long homepageId); + + List selectByEncounterId(Long encounterId); +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/mrhomepage/service/impl/MrHqmsReportServiceImpl.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/mrhomepage/service/impl/MrHqmsReportServiceImpl.java new file mode 100644 index 000000000..8147e7a40 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/mrhomepage/service/impl/MrHqmsReportServiceImpl.java @@ -0,0 +1,25 @@ +package com.healthlink.his.mrhomepage.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.healthlink.his.mrhomepage.domain.MrHqmsReport; +import com.healthlink.his.mrhomepage.mapper.MrHqmsReportMapper; +import com.healthlink.his.mrhomepage.service.IMrHqmsReportService; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class MrHqmsReportServiceImpl + extends ServiceImpl + implements IMrHqmsReportService { + + @Override + public List selectByHomepageId(Long homepageId) { + return baseMapper.selectByHomepageId(homepageId); + } + + @Override + public List selectByEncounterId(Long encounterId) { + return baseMapper.selectByEncounterId(encounterId); + } +} diff --git a/healthlink-his-ui/src/api/mrhomepage.js b/healthlink-his-ui/src/api/mrhomepage.js index 057592e52..c7e750a91 100644 --- a/healthlink-his-ui/src/api/mrhomepage.js +++ b/healthlink-his-ui/src/api/mrhomepage.js @@ -3,3 +3,6 @@ export function executeQualityCheck(id) { return request({ url: "/api/v1/mr-home export function submitHomepage(id) { return request({ url: "/api/v1/mr-homepage/submit/" + id, method: "put" }) } export function checkQuality(homepageId) { return request({ url: "/api/v1/mr-homepage/quality/check", method: "post", params: { homepageId } }) } export function getQualityResults(homepageId) { return request({ url: "/api/v1/mr-homepage/quality/results/" + homepageId, method: "get" }) } +export function submitHqmsReport(homepageId, reportType) { return request({ url: "/api/v1/mr-homepage/hqms/report", method: "post", params: { homepageId, reportType } }) } +export function getHqmsReportStatus(homepageId) { return request({ url: "/api/v1/mr-homepage/hqms/status/" + homepageId, method: "get" }) } +export function listHqmsReports(homepageId) { return request({ url: "/api/v1/mr-homepage/hqms/list/" + homepageId, method: "get" }) } diff --git a/healthlink-his-ui/src/api/mrhomepage/index.js b/healthlink-his-ui/src/api/mrhomepage/index.js index f66ceb4b0..7ed3eab61 100644 --- a/healthlink-his-ui/src/api/mrhomepage/index.js +++ b/healthlink-his-ui/src/api/mrhomepage/index.js @@ -8,3 +8,6 @@ export function getStatistics(params) { return request({ url: '/api/v1/mr-homepa export function submitHomepage(id) { return request({ url: '/api/v1/mr-homepage/submit/' + id, method: 'put' }) } export function checkQuality(homepageId) { return request({ url: '/api/v1/mr-homepage/quality/check', method: 'post', params: { homepageId } }) } export function getQualityResults(homepageId) { return request({ url: '/api/v1/mr-homepage/quality/results/' + homepageId, method: 'get' }) } +export function submitHqmsReport(homepageId, reportType) { return request({ url: '/api/v1/mr-homepage/hqms/report', method: 'post', params: { homepageId, reportType } }) } +export function getHqmsReportStatus(homepageId) { return request({ url: '/api/v1/mr-homepage/hqms/status/' + homepageId, method: 'get' }) } +export function listHqmsReports(homepageId) { return request({ url: '/api/v1/mr-homepage/hqms/list/' + homepageId, method: 'get' }) } diff --git a/healthlink-his-ui/src/views/mrhomepage/hqms/index.vue b/healthlink-his-ui/src/views/mrhomepage/hqms/index.vue new file mode 100644 index 000000000..d00cf3a10 --- /dev/null +++ b/healthlink-his-ui/src/views/mrhomepage/hqms/index.vue @@ -0,0 +1,182 @@ + + + + +