From cf26554f60529f22901311c186c8631dda423a99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=8E=E4=BD=97?= Date: Sat, 6 Jun 2026 20:40:35 +0800 Subject: [PATCH] =?UTF-8?q?feat(P1):=20=E6=8A=A4=E7=90=86=E4=B8=93?= =?UTF-8?q?=E9=A1=B9=E8=AF=84=E4=BC=B0=E5=8D=87=E7=BA=A7=20=E2=80=94=20?= =?UTF-8?q?=E5=8E=8B=E7=96=AE/=E8=B7=8C=E5=80=92/=E8=90=A5=E5=85=BB/?= =?UTF-8?q?=E7=96=BC=E7=97=9B/=E5=AF=BC=E7=AE=A1=E5=AE=8C=E6=95=B4?= =?UTF-8?q?=E4=B8=9A=E5=8A=A1=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - NursingAssessmentEnhancedController: 5种评估量表(Braden/Morse/NRS2002/NRS/TUBE) - 风险等级自动判定+干预措施自动生成 - NursingAssessmentIntervention: 干预措施管理(待执行/已执行) - V26 Flyway: 干预措施表+评估统计视图 - 前端assessment.vue: Tab式5种评估+实时评分+统计卡片 - 后端编译通过,前端构建通过 --- .../NursingAssessmentEnhancedController.java | 512 ++++++++++++++++++ .../V26__nursing_assessment_enhancement.sql | 35 ++ .../domain/NursingAssessmentIntervention.java | 28 + .../NursingAssessmentInterventionMapper.java | 9 + ...INursingAssessmentInterventionService.java | 7 + ...singAssessmentInterventionServiceImpl.java | 13 + .../src/views/nursingenhanced/assessment.vue | 298 ++++++++++ .../views/nursingenhanced/assessmentApi.js | 11 + 8 files changed, 913 insertions(+) create mode 100644 healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/nursing/controller/NursingAssessmentEnhancedController.java create mode 100644 healthlink-his-server/healthlink-his-application/src/main/resources/db/migration/V26__nursing_assessment_enhancement.sql create mode 100644 healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/nursing/domain/NursingAssessmentIntervention.java create mode 100644 healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/nursing/mapper/NursingAssessmentInterventionMapper.java create mode 100644 healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/nursing/service/INursingAssessmentInterventionService.java create mode 100644 healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/nursing/service/impl/NursingAssessmentInterventionServiceImpl.java create mode 100644 healthlink-his-ui/src/views/nursingenhanced/assessment.vue create mode 100644 healthlink-his-ui/src/views/nursingenhanced/assessmentApi.js diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/nursing/controller/NursingAssessmentEnhancedController.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/nursing/controller/NursingAssessmentEnhancedController.java new file mode 100644 index 000000000..20ed8b0aa --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/nursing/controller/NursingAssessmentEnhancedController.java @@ -0,0 +1,512 @@ +package com.healthlink.his.web.nursing.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.core.common.core.domain.R; +import com.healthlink.his.nursing.domain.NursingAssessment; +import com.healthlink.his.nursing.domain.NursingAssessmentIntervention; +import com.healthlink.his.nursing.service.INursingAssessmentInterventionService; +import com.healthlink.his.nursing.service.INursingAssessmentService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.*; + +import java.util.*; + +/** + * 护理评估增强 Controller — 压疮/跌倒/管道/营养/疼痛专项评估 + * 使用已有 nursing_assessment 表,通过 assessment_tool 区分量表类型 + */ +@RestController +@RequestMapping("/nursing-assessment-enhanced") +@Slf4j +@AllArgsConstructor +public class NursingAssessmentEnhancedController { + + private final INursingAssessmentService assessmentService; + private final INursingAssessmentInterventionService interventionService; + + // ==================== 通用查询 ==================== + + @GetMapping("/page") + public R getPage( + @RequestParam(value = "assessmentTool", required = false) String assessmentTool, + @RequestParam(value = "riskLevel", required = false) String riskLevel, + @RequestParam(value = "encounterId", required = false) Long encounterId, + @RequestParam(value = "patientName", required = false) String patientName, + @RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo, + @RequestParam(value = "pageSize", defaultValue = "20") Integer pageSize) { + LambdaQueryWrapper w = new LambdaQueryWrapper<>(); + w.eq(StringUtils.hasText(assessmentTool), NursingAssessment::getAssessmentTool, assessmentTool) + .eq(StringUtils.hasText(riskLevel), NursingAssessment::getRiskLevel, riskLevel) + .eq(encounterId != null, NursingAssessment::getEncounterId, encounterId) + .like(StringUtils.hasText(patientName), NursingAssessment::getPatientName, patientName) + .eq(NursingAssessment::getDelFlag, "0") + .orderByDesc(NursingAssessment::getAssessmentTime); + return R.ok(assessmentService.page(new Page<>(pageNo, pageSize), w)); + } + + @GetMapping("/list") + public R getList( + @RequestParam("encounterId") Long encounterId, + @RequestParam(value = "assessmentTool", required = false) String assessmentTool) { + LambdaQueryWrapper w = new LambdaQueryWrapper<>(); + w.eq(NursingAssessment::getEncounterId, encounterId) + .eq(StringUtils.hasText(assessmentTool), NursingAssessment::getAssessmentTool, assessmentTool) + .eq(NursingAssessment::getDelFlag, "0") + .orderByDesc(NursingAssessment::getAssessmentTime); + return R.ok(assessmentService.list(w)); + } + + // ==================== 压疮评估(Braden) ==================== + + @PostMapping("/braden/assess") + @Transactional(rollbackFor = Exception.class) + public R bradenAssess(@RequestBody NursingAssessment assessment) { + Map scores = parseItemScores(assessment.getItemScores()); + // Braden量表6项: 感觉(1-4) 潮湿(1-4) 活动(1-4) 移动(1-4) 营养(1-4) 摩擦力(1-3) + int total = scores.values().stream().mapToInt(Integer::intValue).sum(); + String riskLevel = bradenRiskLevel(total); + + assessment.setAssessmentTool("BRADEN"); + assessment.setTotalScore(total); + assessment.setRiskLevel(riskLevel); + assessment.setDelFlag("0"); + assessment.setAssessmentTime(new Date()); + assessmentService.save(assessment); + + // 自动生成干预措施 + List interventions = bradenInterventions(riskLevel); + for (String content : interventions) { + NursingAssessmentIntervention iv = new NursingAssessmentIntervention(); + iv.setAssessmentId(assessment.getId()); + iv.setEncounterId(assessment.getEncounterId()); + iv.setPatientId(assessment.getPatientId()); + iv.setRiskLevel(riskLevel); + iv.setInterventionType("PRESSURE_ULCER"); + iv.setInterventionContent(content); + iv.setNurseName(assessment.getAssessorName()); + iv.setStatus("PENDING"); + iv.setCreateTime(new Date()); + interventionService.save(iv); + } + + Map result = new HashMap<>(); + result.put("assessment", assessment); + result.put("interventions", interventions); + result.put("riskDescription", bradenRiskDescription(riskLevel)); + return R.ok(result); + } + + // ==================== 跌倒评估(Morse) ==================== + + @PostMapping("/morse/assess") + @Transactional(rollbackFor = Exception.class) + public R morseAssess(@RequestBody NursingAssessment assessment) { + Map scores = parseItemScores(assessment.getItemScores()); + // Morse量表5项: 跌倒史(0-25) 医学诊断(0-15) 步行辅助(0-15) 静脉输液(0-20) 步态(0-20) + int total = scores.values().stream().mapToInt(Integer::intValue).sum(); + String riskLevel = morseRiskLevel(total); + + assessment.setAssessmentTool("MORSE"); + assessment.setTotalScore(total); + assessment.setRiskLevel(riskLevel); + assessment.setDelFlag("0"); + assessment.setAssessmentTime(new Date()); + assessmentService.save(assessment); + + List interventions = morseInterventions(riskLevel); + for (String content : interventions) { + NursingAssessmentIntervention iv = new NursingAssessmentIntervention(); + iv.setAssessmentId(assessment.getId()); + iv.setEncounterId(assessment.getEncounterId()); + iv.setPatientId(assessment.getPatientId()); + iv.setRiskLevel(riskLevel); + iv.setInterventionType("FALL_RISK"); + iv.setInterventionContent(content); + iv.setNurseName(assessment.getAssessorName()); + iv.setStatus("PENDING"); + iv.setCreateTime(new Date()); + interventionService.save(iv); + } + + Map result = new HashMap<>(); + result.put("assessment", assessment); + result.put("interventions", interventions); + result.put("riskDescription", morseRiskDescription(riskLevel)); + return R.ok(result); + } + + // ==================== 营养筛查(NRS 2002) ==================== + + @PostMapping("/nrs2002/assess") + @Transactional(rollbackFor = Exception.class) + public R nrs2002Assess(@RequestBody NursingAssessment assessment) { + Map scores = parseItemScores(assessment.getItemScores()); + // NRS2002: 疾病严重(0-3) 营养状况(0-3) 年龄(0-1) 总分0-7 + int total = scores.values().stream().mapToInt(Integer::intValue).sum(); + String riskLevel = nrs2002RiskLevel(total); + + assessment.setAssessmentTool("NRS2002"); + assessment.setTotalScore(total); + assessment.setRiskLevel(riskLevel); + assessment.setDelFlag("0"); + assessment.setAssessmentTime(new Date()); + assessmentService.save(assessment); + + List interventions = nrs2002Interventions(riskLevel); + for (String content : interventions) { + NursingAssessmentIntervention iv = new NursingAssessmentIntervention(); + iv.setAssessmentId(assessment.getId()); + iv.setEncounterId(assessment.getEncounterId()); + iv.setPatientId(assessment.getPatientId()); + iv.setRiskLevel(riskLevel); + iv.setInterventionType("NUTRITION"); + iv.setInterventionContent(content); + iv.setNurseName(assessment.getAssessorName()); + iv.setStatus("PENDING"); + iv.setCreateTime(new Date()); + interventionService.save(iv); + } + + Map result = new HashMap<>(); + result.put("assessment", assessment); + result.put("interventions", interventions); + result.put("riskDescription", nrs2002RiskDescription(riskLevel)); + return R.ok(result); + } + + // ==================== 疼痛评估(NRS) ==================== + + @PostMapping("/pain/assess") + @Transactional(rollbackFor = Exception.class) + public R painAssess(@RequestBody NursingAssessment assessment) { + Map scores = parseItemScores(assessment.getItemScores()); + // NRS疼痛评分: 0-10 + int total = scores.getOrDefault("pain_score", 0); + String riskLevel = painRiskLevel(total); + + assessment.setAssessmentTool("NRS_PAIN"); + assessment.setTotalScore(total); + assessment.setRiskLevel(riskLevel); + assessment.setDelFlag("0"); + assessment.setAssessmentTime(new Date()); + assessmentService.save(assessment); + + List interventions = painInterventions(riskLevel, total); + for (String content : interventions) { + NursingAssessmentIntervention iv = new NursingAssessmentIntervention(); + iv.setAssessmentId(assessment.getId()); + iv.setEncounterId(assessment.getEncounterId()); + iv.setPatientId(assessment.getPatientId()); + iv.setRiskLevel(riskLevel); + iv.setInterventionType("PAIN"); + iv.setInterventionContent(content); + iv.setNurseName(assessment.getAssessorName()); + iv.setStatus("PENDING"); + iv.setCreateTime(new Date()); + interventionService.save(iv); + } + + Map result = new HashMap<>(); + result.put("assessment", assessment); + result.put("interventions", interventions); + result.put("riskDescription", painRiskDescription(riskLevel, total)); + return R.ok(result); + } + + // ==================== 导管评估 ==================== + + @PostMapping("/tube/assess") + @Transactional(rollbackFor = Exception.class) + public R tubeAssess(@RequestBody NursingAssessment assessment) { + Map scores = parseItemScores(assessment.getItemScores()); + // 导管评估: 导管类型(1-5) 固定情况(1-3) 通畅情况(1-3) 周围皮肤(1-3) 感染风险(1-3) + int total = scores.values().stream().mapToInt(Integer::intValue).sum(); + String riskLevel = tubeRiskLevel(total); + + assessment.setAssessmentTool("TUBE"); + assessment.setTotalScore(total); + assessment.setRiskLevel(riskLevel); + assessment.setDelFlag("0"); + assessment.setAssessmentTime(new Date()); + assessmentService.save(assessment); + + List interventions = tubeInterventions(riskLevel); + for (String content : interventions) { + NursingAssessmentIntervention iv = new NursingAssessmentIntervention(); + iv.setAssessmentId(assessment.getId()); + iv.setEncounterId(assessment.getEncounterId()); + iv.setPatientId(assessment.getPatientId()); + iv.setRiskLevel(riskLevel); + iv.setInterventionType("TUBE"); + iv.setInterventionContent(content); + iv.setNurseName(assessment.getAssessorName()); + iv.setStatus("PENDING"); + iv.setCreateTime(new Date()); + interventionService.save(iv); + } + + Map result = new HashMap<>(); + result.put("assessment", assessment); + result.put("interventions", interventions); + result.put("riskDescription", tubeRiskDescription(riskLevel)); + return R.ok(result); + } + + // ==================== 干预措施管理 ==================== + + @GetMapping("/intervention/page") + public R getInterventionPage( + @RequestParam(value = "interventionType", required = false) String interventionType, + @RequestParam(value = "status", required = false) String status, + @RequestParam(value = "encounterId", required = false) Long encounterId, + @RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo, + @RequestParam(value = "pageSize", defaultValue = "20") Integer pageSize) { + LambdaQueryWrapper w = new LambdaQueryWrapper<>(); + w.eq(StringUtils.hasText(interventionType), NursingAssessmentIntervention::getInterventionType, interventionType) + .eq(StringUtils.hasText(status), NursingAssessmentIntervention::getStatus, status) + .eq(encounterId != null, NursingAssessmentIntervention::getEncounterId, encounterId) + .orderByDesc(NursingAssessmentIntervention::getCreateTime); + return R.ok(interventionService.page(new Page<>(pageNo, pageSize), w)); + } + + @PutMapping("/intervention/execute/{id}") + @Transactional(rollbackFor = Exception.class) + public R executeIntervention(@PathVariable Long id) { + NursingAssessmentIntervention iv = interventionService.getById(id); + if (iv == null) return R.fail("干预记录不存在"); + iv.setStatus("EXECUTED"); + iv.setExecuteTime(new Date()); + interventionService.updateById(iv); + return R.ok(); + } + + // ==================== 统计 ==================== + + @GetMapping("/stats") + public R getStats( + @RequestParam(value = "startDate", required = false) String startDate, + @RequestParam(value = "endDate", required = false) String endDate) { + Map stats = new HashMap<>(); + String[] tools = {"BRADEN", "MORSE", "NRS2002", "NRS_PAIN", "TUBE"}; + for (String tool : tools) { + LambdaQueryWrapper w = new LambdaQueryWrapper<>(); + w.eq(NursingAssessment::getAssessmentTool, tool) + .eq(NursingAssessment::getDelFlag, "0"); + long total = assessmentService.count(w); + + LambdaQueryWrapper hw = new LambdaQueryWrapper<>(); + hw.eq(NursingAssessment::getAssessmentTool, tool) + .eq(NursingAssessment::getRiskLevel, "HIGH") + .eq(NursingAssessment::getDelFlag, "0"); + long highRisk = assessmentService.count(hw); + + stats.put(tool + "_total", total); + stats.put(tool + "_high_risk", highRisk); + } + + LambdaQueryWrapper iw = new LambdaQueryWrapper<>(); + iw.eq(NursingAssessmentIntervention::getStatus, "PENDING"); + stats.put("pending_interventions", interventionService.count(iw)); + + return R.ok(stats); + } + + // ==================== 业务逻辑: 风险等级判定 ==================== + + private String bradenRiskLevel(int score) { + if (score <= 12) return "HIGH"; + if (score <= 14) return "MEDIUM"; + if (score <= 18) return "LOW"; + return "NORMAL"; + } + + private String morseRiskLevel(int score) { + if (score >= 45) return "HIGH"; + if (score >= 25) return "MEDIUM"; + return "LOW"; + } + + private String nrs2002RiskLevel(int score) { + if (score >= 3) return "HIGH"; + if (score >= 2) return "MEDIUM"; + return "NORMAL"; + } + + private String painRiskLevel(int score) { + if (score >= 7) return "HIGH"; + if (score >= 4) return "MEDIUM"; + if (score >= 1) return "LOW"; + return "NORMAL"; + } + + private String tubeRiskLevel(int score) { + if (score >= 12) return "HIGH"; + if (score >= 8) return "MEDIUM"; + return "LOW"; + } + + // ==================== 业务逻辑: 干预措施 ==================== + + private List bradenInterventions(String riskLevel) { + List list = new ArrayList<>(); + if ("HIGH".equals(riskLevel)) { + list.add("每2小时翻身一次,使用气垫床"); + list.add("保持皮肤清洁干燥,使用皮肤保护膜"); + list.add("加强营养支持,高蛋白饮食"); + list.add("使用减压敷料保护骨隆突处"); + list.add("填写压疮风险评估单,上报护士长"); + } else if ("MEDIUM".equals(riskLevel)) { + list.add("每3小时翻身一次"); + list.add("保持皮肤清洁,使用润肤露"); + list.add("加强营养,增加蛋白质摄入"); + list.add("使用减压床垫"); + } else if ("LOW".equals(riskLevel)) { + list.add("定时翻身,避免局部长期受压"); + list.add("保持皮肤清洁"); + } + return list; + } + + private List morseInterventions(String riskLevel) { + List list = new ArrayList<>(); + if ("HIGH".equals(riskLevel)) { + list.add("悬挂高危跌倒标识"); + list.add("床栏上抬,必要时使用约束带"); + list.add("协助如厕,防滑鞋"); + list.add("床头铃置于易取处,呼叫器放在枕边"); + list.add("每1小时巡视,评估意识状态"); + list.add("填写跌倒风险评估单,上报护士长"); + } else if ("MEDIUM".equals(riskLevel)) { + list.add("悬挂中危跌倒标识"); + list.add("床栏上抬,走廊扶手"); + list.add("协助下床活动"); + list.add("每2小时巡视"); + } else { + list.add("做好防跌倒宣教"); + list.add("保持地面干燥"); + } + return list; + } + + private List nrs2002Interventions(String riskLevel) { + List list = new ArrayList<>(); + if ("HIGH".equals(riskLevel)) { + list.add("请营养科会诊,制定营养支持方案"); + list.add("给予肠内/肠外营养支持"); + list.add("每日监测体重、白蛋白、前白蛋白"); + list.add("记录24小时出入量"); + } else if ("MEDIUM".equals(riskLevel)) { + list.add("增加蛋白质摄入,口服营养补充剂"); + list.add("每周监测体重"); + list.add("营养宣教"); + } + return list; + } + + private List painInterventions(String riskLevel, int score) { + List list = new ArrayList<>(); + if ("HIGH".equals(riskLevel)) { + list.add("立即通知医生,遵医嘱给予镇痛药"); + list.add("评估疼痛性质、部位、持续时间"); + list.add("每4小时评估疼痛评分"); + list.add("非药物镇痛:体位调整、冷敷/热敷"); + } else if ("MEDIUM".equals(riskLevel)) { + list.add("遵医嘱给予口服镇痛药"); + list.add("每8小时评估疼痛评分"); + list.add("指导患者使用疼痛日记"); + } else if ("LOW".equals(riskLevel)) { + list.add("继续观察,每日评估"); + list.add("非药物缓解:音乐疗法、放松训练"); + } + return list; + } + + private List tubeInterventions(String riskLevel) { + List list = new ArrayList<>(); + if ("HIGH".equals(riskLevel)) { + list.add("每日评估导管必要性,尽早拔管"); + list.add("加强导管固定,使用专业固定装置"); + list.add("每日消毒导管周围皮肤"); + list.add("监测感染指标,必要时做培养"); + list.add("每班评估导管通畅性"); + } else if ("MEDIUM".equals(riskLevel)) { + list.add("加强导管固定,防止脱出"); + list.add("每日评估导管功能"); + list.add("保持导管周围皮肤清洁"); + } else { + list.add("常规导管护理"); + list.add("每班评估导管状态"); + } + return list; + } + + // ==================== 业务逻辑: 风险描述 ==================== + + private String bradenRiskDescription(String level) { + switch (level) { + case "HIGH": return "压疮高危(≤12分): 需立即采取综合预防措施"; + case "MEDIUM": return "压疮中危(13-14分): 需加强预防"; + case "LOW": return "压疮低危(15-18分): 常规预防"; + default: return "压疮无风险(>18分)"; + } + } + + private String morseRiskDescription(String level) { + switch (level) { + case "HIGH": return "跌倒高危(≥45分): 需专人看护+环境改造"; + case "MEDIUM": return "跌倒中危(25-44分): 需加强防护"; + default: return "跌倒低危(<25分): 常规宣教"; + } + } + + private String nrs2002RiskDescription(String level) { + switch (level) { + case "HIGH": return "营养高危(≥3分): 需营养科会诊+营养支持"; + case "MEDIUM": return "营养中危(2分): 需营养干预"; + default: return "营养正常(<2分): 常规饮食"; + } + } + + private String painRiskDescription(String level, int score) { + if (score >= 7) return "重度疼痛(" + score + "分): 立即镇痛"; + if (score >= 4) return "中度疼痛(" + score + "分): 遵医嘱镇痛"; + if (score >= 1) return "轻度疼痛(" + score + "分): 观察+非药物缓解"; + return "无疼痛(0分)"; + } + + private String tubeRiskDescription(String level) { + switch (level) { + case "HIGH": return "导管高危: 需专人管理+感染防控"; + case "MEDIUM": return "导管中危: 加强固定+定期评估"; + default: return "导管低危: 常规护理"; + } + } + + // ==================== 工具方法 ==================== + + private Map parseItemScores(String itemScoresJson) { + Map map = new HashMap<>(); + if (!StringUtils.hasText(itemScoresJson)) return map; + try { + String json = itemScoresJson.trim(); + if (json.startsWith("{")) { + json = json.substring(1, json.length() - 1); + for (String pair : json.split(",")) { + String[] kv = pair.split(":"); + if (kv.length == 2) { + String key = kv[0].trim().replace("\"", ""); + String val = kv[1].trim().replace("\"", ""); + map.put(key, Integer.parseInt(val)); + } + } + } + } catch (Exception e) { + log.warn("解析评估分数失败: {}", itemScoresJson, e); + } + return map; + } +} diff --git a/healthlink-his-server/healthlink-his-application/src/main/resources/db/migration/V26__nursing_assessment_enhancement.sql b/healthlink-his-server/healthlink-his-application/src/main/resources/db/migration/V26__nursing_assessment_enhancement.sql new file mode 100644 index 000000000..47f6549e7 --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/resources/db/migration/V26__nursing_assessment_enhancement.sql @@ -0,0 +1,35 @@ +-- V26: 护理评估增强 — 干预措施+趋势统计 + +-- 评估干预措施表 +CREATE TABLE IF NOT EXISTS nursing_assessment_intervention ( + id BIGSERIAL PRIMARY KEY, + assessment_id BIGINT NOT NULL, + encounter_id BIGINT NOT NULL, + patient_id BIGINT NOT NULL, + risk_level VARCHAR(16) NOT NULL, + intervention_type VARCHAR(32) NOT NULL, + intervention_content TEXT NOT NULL, + nurse_name VARCHAR(64), + execute_time TIMESTAMP, + status VARCHAR(20) DEFAULT 'PENDING', + tenant_id BIGINT DEFAULT 0, + is_deleted INT NOT NULL DEFAULT 0, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); +COMMENT ON TABLE nursing_assessment_intervention IS '评估干预措施'; +COMMENT ON COLUMN nursing_assessment_intervention.intervention_type IS '干预类型(PRESSURE_ULCER/FALL_RISK/NUTRITION/PAIN/TUBE)'; +COMMENT ON COLUMN nursing_assessment_intervention.status IS '状态(PENDING/EXECUTED/CANCELLED)'; +CREATE INDEX idx_nai_encounter ON nursing_assessment_intervention(encounter_id); +CREATE INDEX idx_nai_status ON nursing_assessment_intervention(status); + +-- 评估统计视图 +CREATE OR REPLACE VIEW v_assessment_stats AS +SELECT + assessment_tool, + risk_level, + COUNT(*) as count, + DATE(assessment_time) as assess_date +FROM nursing_assessment +WHERE del_flag = '0' +GROUP BY assessment_tool, risk_level, DATE(assessment_time); +COMMENT ON VIEW v_assessment_stats IS '评估统计视图'; diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/nursing/domain/NursingAssessmentIntervention.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/nursing/domain/NursingAssessmentIntervention.java new file mode 100644 index 000000000..eba22eaac --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/nursing/domain/NursingAssessmentIntervention.java @@ -0,0 +1,28 @@ +package com.healthlink.his.nursing.domain; + +import com.baomidou.mybatisplus.annotation.*; +import com.core.common.core.domain.HisBaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +/** + * 评估干预措施 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("nursing_assessment_intervention") +public class NursingAssessmentIntervention extends HisBaseEntity { + @TableId(value = "id", type = IdType.ASSIGN_ID) + private Long id; + private Long assessmentId; + private Long encounterId; + private Long patientId; + private String riskLevel; + private String interventionType; + private String interventionContent; + private String nurseName; + private Date executeTime; + private String status; +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/nursing/mapper/NursingAssessmentInterventionMapper.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/nursing/mapper/NursingAssessmentInterventionMapper.java new file mode 100644 index 000000000..d5d8f263b --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/nursing/mapper/NursingAssessmentInterventionMapper.java @@ -0,0 +1,9 @@ +package com.healthlink.his.nursing.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.healthlink.his.nursing.domain.NursingAssessmentIntervention; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface NursingAssessmentInterventionMapper extends BaseMapper { +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/nursing/service/INursingAssessmentInterventionService.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/nursing/service/INursingAssessmentInterventionService.java new file mode 100644 index 000000000..5edd8640d --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/nursing/service/INursingAssessmentInterventionService.java @@ -0,0 +1,7 @@ +package com.healthlink.his.nursing.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.healthlink.his.nursing.domain.NursingAssessmentIntervention; + +public interface INursingAssessmentInterventionService extends IService { +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/nursing/service/impl/NursingAssessmentInterventionServiceImpl.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/nursing/service/impl/NursingAssessmentInterventionServiceImpl.java new file mode 100644 index 000000000..8174b102b --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/nursing/service/impl/NursingAssessmentInterventionServiceImpl.java @@ -0,0 +1,13 @@ +package com.healthlink.his.nursing.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.healthlink.his.nursing.domain.NursingAssessmentIntervention; +import com.healthlink.his.nursing.mapper.NursingAssessmentInterventionMapper; +import com.healthlink.his.nursing.service.INursingAssessmentInterventionService; +import org.springframework.stereotype.Service; + +@Service +public class NursingAssessmentInterventionServiceImpl + extends ServiceImpl + implements INursingAssessmentInterventionService { +} diff --git a/healthlink-his-ui/src/views/nursingenhanced/assessment.vue b/healthlink-his-ui/src/views/nursingenhanced/assessment.vue new file mode 100644 index 000000000..72899cedc --- /dev/null +++ b/healthlink-his-ui/src/views/nursingenhanced/assessment.vue @@ -0,0 +1,298 @@ + + diff --git a/healthlink-his-ui/src/views/nursingenhanced/assessmentApi.js b/healthlink-his-ui/src/views/nursingenhanced/assessmentApi.js new file mode 100644 index 000000000..4721cf90d --- /dev/null +++ b/healthlink-his-ui/src/views/nursingenhanced/assessmentApi.js @@ -0,0 +1,11 @@ +import request from '@/utils/request' +export function getAssessmentPage(p){return request({url:'/nursing-assessment-enhanced/page',method:'get',params:p})} +export function getAssessmentList(p){return request({url:'/nursing-assessment-enhanced/list',method:'get',params:p})} +export function bradenAssess(d){return request({url:'/nursing-assessment-enhanced/braden/assess',method:'post',data:d})} +export function morseAssess(d){return request({url:'/nursing-assessment-enhanced/morse/assess',method:'post',data:d})} +export function nrs2002Assess(d){return request({url:'/nursing-assessment-enhanced/nrs2002/assess',method:'post',data:d})} +export function painAssess(d){return request({url:'/nursing-assessment-enhanced/pain/assess',method:'post',data:d})} +export function tubeAssess(d){return request({url:'/nursing-assessment-enhanced/tube/assess',method:'post',data:d})} +export function getInterventionPage(p){return request({url:'/nursing-assessment-enhanced/intervention/page',method:'get',params:p})} +export function executeIntervention(id){return request({url:'/nursing-assessment-enhanced/intervention/execute/'+id,method:'put'})} +export function getStats(p){return request({url:'/nursing-assessment-enhanced/stats',method:'get',params:p})}