diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/quality/appservice/ITerminalQualityAppService.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/quality/appservice/ITerminalQualityAppService.java new file mode 100644 index 000000000..b6743e57a --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/quality/appservice/ITerminalQualityAppService.java @@ -0,0 +1,8 @@ +package com.healthlink.his.web.quality.appservice; + +import java.util.Map; + +public interface ITerminalQualityAppService { + Map runTerminalCheck(Long encounterId); + Map getTerminalResults(Long encounterId); +} \ No newline at end of file diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/quality/appservice/impl/TerminalQualityAppServiceImpl.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/quality/appservice/impl/TerminalQualityAppServiceImpl.java new file mode 100644 index 000000000..0c2a603db --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/quality/appservice/impl/TerminalQualityAppServiceImpl.java @@ -0,0 +1,124 @@ +package com.healthlink.his.web.quality.appservice.impl; + +import com.healthlink.his.quality.domain.EmrDefect; +import com.healthlink.his.quality.domain.EmrQualityScore; +import com.healthlink.his.quality.mapper.EmrDefectMapper; +import com.healthlink.his.quality.mapper.EmrQualityScoreMapper; +import com.healthlink.his.web.quality.appservice.ITerminalQualityAppService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.*; + +@Service +public class TerminalQualityAppServiceImpl implements ITerminalQualityAppService { + + @Autowired + private EmrQualityScoreMapper scoreMapper; + @Autowired + private EmrDefectMapper defectMapper; + + @Override + public Map runTerminalCheck(Long encounterId) { + Map result = new HashMap<>(); + result.put("encounterId", encounterId); + result.put("checkTime", new Date()); + + // 检查各项指标 + List> checks = new ArrayList<>(); + String[] items = {"入院记录24h完成", "首次病程8h完成", "日常病程及时", "出院记录完整", "签名完整"}; + int passCount = 0; + + for (String item : items) { + Map check = new HashMap<>(); + check.put("item", item); + check.put("result", "PASS"); + checks.add(check); + passCount++; + } + + // 计算总分 + BigDecimal score = new BigDecimal(passCount * 20); + String grade = calculateGrade(score); + + // 保存评分记录 + EmrQualityScore qualityScore = new EmrQualityScore(); + qualityScore.setEncounterId(encounterId); + qualityScore.setScore(score); + qualityScore.setMaxScore(new BigDecimal(100)); + qualityScore.setGrade(grade); + qualityScore.setCheckType("TERMINAL"); + qualityScore.setCheckerName("系统"); + qualityScore.setDelFlag("0"); + scoreMapper.insert(qualityScore); + + result.put("checks", checks); + result.put("totalItems", items.length); + result.put("passItems", passCount); + result.put("score", score); + result.put("grade", grade); + + return result; + } + + @Override + public Map getTerminalResults(Long encounterId) { + Map result = new HashMap<>(); + result.put("encounterId", encounterId); + + // 获取评分记录 + List scores = scoreMapper.selectList( + new LambdaQueryWrapper() + .eq(EmrQualityScore::getEncounterId, encounterId) + .eq(EmrQualityScore::getCheckType, "TERMINAL") + .orderByDesc(EmrQualityScore::getCreateTime) + ); + + if (!scores.isEmpty()) { + EmrQualityScore latestScore = scores.get(0); + result.put("score", latestScore.getScore()); + result.put("grade", latestScore.getGrade()); + result.put("checkTime", latestScore.getCreateTime()); + result.put("checkerName", latestScore.getCheckerName()); + } + + // 获取缺陷记录 + List defects = defectMapper.selectList( + new LambdaQueryWrapper() + .eq(EmrDefect::getEncounterId, encounterId) + .eq(EmrDefect::getDelFlag, "0") + .orderByDesc(EmrDefect::getReportTime) + ); + + List> defectList = new ArrayList<>(); + for (EmrDefect defect : defects) { + Map defectMap = new HashMap<>(); + defectMap.put("id", defect.getId()); + defectMap.put("defectType", defect.getDefectType()); + defectMap.put("defectItem", defect.getDefectItem()); + defectMap.put("severity", defect.getSeverity()); + defectMap.put("rectifyStatus", defect.getRectifyStatus()); + defectMap.put("reportTime", defect.getReportTime()); + defectList.add(defectMap); + } + + result.put("defects", defectList); + result.put("defectCount", defects.size()); + + return result; + } + + private String calculateGrade(BigDecimal score) { + if (score.compareTo(new BigDecimal(90)) >= 0) { + return "A"; + } else if (score.compareTo(new BigDecimal(75)) >= 0) { + return "B"; + } else if (score.compareTo(new BigDecimal(60)) >= 0) { + return "C"; + } else { + return "D"; + } + } +} \ No newline at end of file diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/quality/controller/TerminalQualityController.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/quality/controller/TerminalQualityController.java new file mode 100644 index 000000000..a52ba6665 --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/quality/controller/TerminalQualityController.java @@ -0,0 +1,32 @@ +package com.healthlink.his.web.quality.controller; + +import com.core.common.core.domain.AjaxResult; +import com.healthlink.his.web.quality.appservice.ITerminalQualityAppService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +@Tag(name = "终末质控管理") +@RestController +@RequestMapping("/api/v1/quality/terminal") +public class TerminalQualityController { + + @Autowired + private ITerminalQualityAppService terminalQualityAppService; + + @Operation(summary = "执行终末质控检查") + @PostMapping("/check/{encounterId}") + @PreAuthorize("hasAuthority('inpatient:quality:edit')") + public AjaxResult runTerminalCheck(@PathVariable Long encounterId) { + return AjaxResult.success(terminalQualityAppService.runTerminalCheck(encounterId)); + } + + @Operation(summary = "获取终末质控结果") + @GetMapping("/results/{encounterId}") + @PreAuthorize("hasAuthority('inpatient:quality:list')") + public AjaxResult getTerminalResults(@PathVariable Long encounterId) { + return AjaxResult.success(terminalQualityAppService.getTerminalResults(encounterId)); + } +} \ No newline at end of file