From d05ff14258e31170183f45209e4f11914809b268 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=8E=E4=BD=97?= Date: Sat, 6 Jun 2026 17:30:28 +0800 Subject: [PATCH] =?UTF-8?q?feat(V23):=20=E7=9F=A5=E8=AF=86=E5=BA=93+?= =?UTF-8?q?=E8=AF=84=E4=BC=B0=E8=B6=8B=E5=8A=BF+=E5=AE=89=E5=85=A8?= =?UTF-8?q?=E8=AE=A4=E8=AF=81+=E7=BB=8F=E8=90=A5=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit V23 Flyway — 4张新表: - clinical_knowledge_base: 临床知识库(指南/药物/诊断/操作) - nursing_assessment_trend: 评估趋势数据(评分/风险等级) - sys_api_auth: 接口安全认证(AppKey/Secret/限流/权限) - business_analytics: 经营分析日报(收入/成本/利润/床位率) 后端Controller: - KnowledgeBaseController: 知识库CRUD+全文搜索 - AssessmentTrendController: 评估趋势查询+记录 - ApiAuthController: 接口认证管理(新增/禁用) - BusinessAnalyticsController: 经营分析+汇总统计 前端页面: - knowledgebase: 临床知识库(分类搜索) - assessmenttrend: 评估趋势图数据 - apiauth: 接口安全认证管理 - businessanalytics: 经营分析(收入/成本/利润/患者) 三甲能力清单: 108/150完成(72%), 40项基础(27%), 2项选配未实现(3D重建/消毒供应) 所有模块编译通过 (mvn clean compile -DskipTests) --- .../MODULE_CAPABILITY_REQUIREMENTS.md | 14 ++-- .../controller/KnowledgeBaseController.java | 56 +++++++++++++ .../controller/AssessmentTrendController.java | 40 +++++++++ .../BusinessAnalyticsController.java | 62 ++++++++++++++ .../system/controller/ApiAuthController.java | 56 +++++++++++++ ...23__knowledgebase_trend_auth_analytics.sql | 83 +++++++++++++++++++ .../domain/ClinicalKnowledgeBase.java | 21 +++++ .../mapper/ClinicalKnowledgeBaseMapper.java | 9 ++ .../IClinicalKnowledgeBaseService.java | 7 ++ .../ClinicalKnowledgeBaseServiceImpl.java | 11 +++ .../domain/NursingAssessmentTrend.java | 25 ++++++ .../mapper/NursingAssessmentTrendMapper.java | 9 ++ .../INursingAssessmentTrendService.java | 7 ++ .../NursingAssessmentTrendServiceImpl.java | 11 +++ .../his/quality/domain/BusinessAnalytics.java | 26 ++++++ .../mapper/BusinessAnalyticsMapper.java | 9 ++ .../service/IBusinessAnalyticsService.java | 7 ++ .../impl/BusinessAnalyticsServiceImpl.java | 11 +++ .../healthlink/his/sys/domain/SysApiAuth.java | 24 ++++++ .../his/sys/mapper/SysApiAuthMapper.java | 9 ++ .../his/sys/service/ISysApiAuthService.java | 7 ++ .../service/impl/SysApiAuthServiceImpl.java | 11 +++ healthlink-his-ui/src/views/apiauth/api.js | 4 + healthlink-his-ui/src/views/apiauth/index.vue | 28 +++++++ .../src/views/assessmenttrend/api.js | 3 + .../src/views/assessmenttrend/index.vue | 27 ++++++ .../src/views/businessanalytics/api.js | 4 + .../src/views/businessanalytics/index.vue | 29 +++++++ .../src/views/knowledgebase/api.js | 4 + .../src/views/knowledgebase/index.vue | 27 ++++++ 30 files changed, 634 insertions(+), 7 deletions(-) create mode 100644 healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/clinical/controller/KnowledgeBaseController.java create mode 100644 healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/nursing/controller/AssessmentTrendController.java create mode 100644 healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/quality/controller/BusinessAnalyticsController.java create mode 100644 healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/system/controller/ApiAuthController.java create mode 100644 healthlink-his-server/healthlink-his-application/src/main/resources/db/migration/V23__knowledgebase_trend_auth_analytics.sql create mode 100644 healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/clinical/domain/ClinicalKnowledgeBase.java create mode 100644 healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/clinical/mapper/ClinicalKnowledgeBaseMapper.java create mode 100644 healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/clinical/service/IClinicalKnowledgeBaseService.java create mode 100644 healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/clinical/service/impl/ClinicalKnowledgeBaseServiceImpl.java create mode 100644 healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/nursing/domain/NursingAssessmentTrend.java create mode 100644 healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/nursing/mapper/NursingAssessmentTrendMapper.java create mode 100644 healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/nursing/service/INursingAssessmentTrendService.java create mode 100644 healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/nursing/service/impl/NursingAssessmentTrendServiceImpl.java create mode 100644 healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/quality/domain/BusinessAnalytics.java create mode 100644 healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/quality/mapper/BusinessAnalyticsMapper.java create mode 100644 healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/quality/service/IBusinessAnalyticsService.java create mode 100644 healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/quality/service/impl/BusinessAnalyticsServiceImpl.java create mode 100644 healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/sys/domain/SysApiAuth.java create mode 100644 healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/sys/mapper/SysApiAuthMapper.java create mode 100644 healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/sys/service/ISysApiAuthService.java create mode 100644 healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/sys/service/impl/SysApiAuthServiceImpl.java create mode 100644 healthlink-his-ui/src/views/apiauth/api.js create mode 100644 healthlink-his-ui/src/views/apiauth/index.vue create mode 100644 healthlink-his-ui/src/views/assessmenttrend/api.js create mode 100644 healthlink-his-ui/src/views/assessmenttrend/index.vue create mode 100644 healthlink-his-ui/src/views/businessanalytics/api.js create mode 100644 healthlink-his-ui/src/views/businessanalytics/index.vue create mode 100644 healthlink-his-ui/src/views/knowledgebase/api.js create mode 100644 healthlink-his-ui/src/views/knowledgebase/index.vue diff --git a/MD/standards/MODULE_CAPABILITY_REQUIREMENTS.md b/MD/standards/MODULE_CAPABILITY_REQUIREMENTS.md index 497dd5e94..fd7d40399 100644 --- a/MD/standards/MODULE_CAPABILITY_REQUIREMENTS.md +++ b/MD/standards/MODULE_CAPABILITY_REQUIREMENTS.md @@ -77,11 +77,11 @@ | 3 | **体温单** | 自动生成体温单(三测单) | 护理文书规范 | ⚠️ 基础 | | 4 | **护理评估** | 入院评估/压疮评估/跌倒评估/营养评估 | 护理安全 | ✅ | | 5 | **护理记录** | 一般/危重护理记录单 | 病历书写规范 | ✅ | -| 6 | **执行扫码** | 扫码执行医嘱(腕带/药品/标本) | 患者安全目标 | ❌ 缺失 | -| 7 | **交接班** | 护理交接班记录+重点患者提示 | 护理安全 | ❌ 缺失 | +| 6 | **执行扫码** | 扫码执行医嘱(腕带/药品/标本) | 患者安全目标 | ✅ 已完成(V21) | +| 7 | **交接班** | 护理交接班记录+重点患者提示 | 护理安全 | ✅ 已完成(V21) | | 8 | **压疮预警** | Braden评分→自动预警→干预→跟踪 | 护理质量指标 | ⚠️ 基础 | | 9 | **跌倒预警** | Morse评分→风险分级→防护措施 | 患者安全目标 | ⚠️ 基础 | -| 10 | **输液管理** | 输液巡视记录+速度监控 | 护理安全 | ❌ 缺失 | +| 10 | **输液管理** | 输液巡视记录+速度监控 | 护理安全 | ✅ 已完成(V21) | --- @@ -106,7 +106,7 @@ | 8 | **抗菌药物分级** | 非限制/限制/特殊使用级管控 | 抗菌药物管理办法 | ✅ | | 9 | **DDD监测** | 抗菌药物限定日剂量使用强度监测 | 抗菌药物管理办法 | ✅ | | 10 | **处方点评工作台** | 自动筛查+人工点评+科室排名 | 处方点评规范 | ✅ | -| 11 | **药品库存联动** | 药品库存不足时提醒 | 基本功能规范 | ❌ 缺失 | +| 11 | **药品库存联动** | 药品库存不足时提醒 | 基本功能规范 | ✅ 已完成(V21) | | 12 | **处方前置拦截** | 不合理处方必须拦截才能继续 | 处方审核率100% | ⚠️ 部分 | --- @@ -156,7 +156,7 @@ | 5 | **室内质控** | 质控图+Westgard规则+失控处理 | 质量管理 | ✅ 已完成(V19) | | 6 | **室间质评** | 参加省级/国家级室间质评 | 质量管理 | ✅ 已完成(V19) | | 7 | **参考范围** | 按年龄/性别/种族设置参考范围 | 检验规范 | ⚠️ 基础 | -| 8 | **历史结果对比** | 同一患者历次结果趋势图 | 临床决策 | ❌ 缺失 | +| 8 | **历史结果对比** | 同一患者历次结果趋势图 | 临床决策 | ✅ 已完成(V22) | | 9 | **检验报告打印** | 标准格式报告单打印 | 基本功能规范 | ✅ | | 10 | **危急值统计** | 危急值检出率/处理及时率统计 | 评审指标 | ✅ | @@ -179,7 +179,7 @@ | 4 | **图文报告** | 结构化报告+图像标注 | 检查规范 | ⚠️ 基础 | | 5 | **报告审核** | 书写→审核→发布流程 | 检查规范 | ✅ | | 6 | **紧急报告** | 急诊检查优先出报告 | 患者安全 | ✅ 已完成(V19) | -| 7 | **影像对比** | 历史影像对比查看 | 临床决策 | ❌ 缺失 | +| 7 | **影像对比** | 历史影像对比查看 | 临床决策 | ✅ 已完成(V22) | | 8 | **3D重建** | 三维图像重建(选配) | 高级功能 | ❌ 缺失 | | 9 | **DICOM打印** | 胶片打印 | 基本功能规范 | ⚠️ 基础 | | 10 | **检查统计** | 检查量/阳性率/报告时效统计 | 评审指标 | ✅ 已完成(V19) | @@ -278,7 +278,7 @@ | 7 | **评估提醒** | 按评估频率自动提醒 | 护理质量 | ✅ 已完成(V18) | | 8 | **评估趋势** | 历次评估结果趋势图 | 临床决策 | ❌ 缺失 | | 9 | **护理计划** | 基于评估结果自动生成护理计划 | 护理规范 | ✅ 已完成(V18) | -| 10 | **护理质量指标** | 护理敏感指标自动采集+上报 | 护理质量 | ❌ 缺失 | +| 10 | **护理质量指标** | 护理敏感指标自动采集+上报 | 护理质量 | ✅ 已完成(V22) | --- diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/clinical/controller/KnowledgeBaseController.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/clinical/controller/KnowledgeBaseController.java new file mode 100644 index 000000000..374cbe224 --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/clinical/controller/KnowledgeBaseController.java @@ -0,0 +1,56 @@ +package com.healthlink.his.web.clinical.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.clinical.domain.ClinicalKnowledgeBase; +import com.healthlink.his.clinical.service.IClinicalKnowledgeBaseService; +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.*; + +@RestController +@RequestMapping("/knowledge-base") +@Slf4j +@AllArgsConstructor +public class KnowledgeBaseController { + + private final IClinicalKnowledgeBaseService kbService; + + @GetMapping("/page") + public R getPage( + @RequestParam(value = "category", required = false) String category, + @RequestParam(value = "keyword", required = false) String keyword, + @RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo, + @RequestParam(value = "pageSize", defaultValue = "20") Integer pageSize) { + LambdaQueryWrapper w = new LambdaQueryWrapper<>(); + w.eq(StringUtils.hasText(category), ClinicalKnowledgeBase::getCategory, category) + .and(StringUtils.hasText(keyword), q -> q.like(ClinicalKnowledgeBase::getTitle, keyword) + .or().like(ClinicalKnowledgeBase::getKeywords, keyword)) + .orderByDesc(ClinicalKnowledgeBase::getCreateTime); + return R.ok(kbService.page(new Page<>(pageNo, pageSize), w)); + } + + @GetMapping("/search") + public R search(@RequestParam String keyword) { + LambdaQueryWrapper w = new LambdaQueryWrapper<>(); + w.eq(ClinicalKnowledgeBase::getStatus, "ACTIVE") + .and(q -> q.like(ClinicalKnowledgeBase::getTitle, keyword) + .or().like(ClinicalKnowledgeBase::getKeywords, keyword) + .or().like(ClinicalKnowledgeBase::getContent, keyword)); + return R.ok(kbService.list(w)); + } + + @PostMapping("/add") + @Transactional(rollbackFor = Exception.class) + public R add(@RequestBody ClinicalKnowledgeBase kb) { + kb.setStatus("ACTIVE"); + kb.setCreateTime(new Date()); + kbService.save(kb); + return R.ok(kb); + } +} diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/nursing/controller/AssessmentTrendController.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/nursing/controller/AssessmentTrendController.java new file mode 100644 index 000000000..c8f801219 --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/nursing/controller/AssessmentTrendController.java @@ -0,0 +1,40 @@ +package com.healthlink.his.web.nursing.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.core.common.core.domain.R; +import com.healthlink.his.nursing.domain.NursingAssessmentTrend; +import com.healthlink.his.nursing.service.INursingAssessmentTrendService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; + +import java.util.*; + +@RestController +@RequestMapping("/assessment-trend") +@Slf4j +@AllArgsConstructor +public class AssessmentTrendController { + + private final INursingAssessmentTrendService trendService; + + @GetMapping("/trend") + public R getTrend( + @RequestParam Long encounterId, + @RequestParam(required = false) String assessmentType) { + LambdaQueryWrapper w = new LambdaQueryWrapper<>(); + w.eq(NursingAssessmentTrend::getEncounterId, encounterId) + .eq(assessmentType != null, NursingAssessmentTrend::getAssessmentType, assessmentType) + .orderByAsc(NursingAssessmentTrend::getAssessTime); + return R.ok(trendService.list(w)); + } + + @PostMapping("/add") + @Transactional(rollbackFor = Exception.class) + public R addTrend(@RequestBody NursingAssessmentTrend trend) { + trend.setCreateTime(new Date()); + trendService.save(trend); + return R.ok(trend); + } +} diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/quality/controller/BusinessAnalyticsController.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/quality/controller/BusinessAnalyticsController.java new file mode 100644 index 000000000..f4f0eab25 --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/quality/controller/BusinessAnalyticsController.java @@ -0,0 +1,62 @@ +package com.healthlink.his.web.quality.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.quality.domain.BusinessAnalytics; +import com.healthlink.his.quality.service.IBusinessAnalyticsService; +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.math.BigDecimal; +import java.util.*; + +@RestController +@RequestMapping("/business-analytics") +@Slf4j +@AllArgsConstructor +public class BusinessAnalyticsController { + + private final IBusinessAnalyticsService analyticsService; + + @GetMapping("/page") + public R getPage( + @RequestParam(value = "departmentName", required = false) String deptName, + @RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo, + @RequestParam(value = "pageSize", defaultValue = "20") Integer pageSize) { + LambdaQueryWrapper w = new LambdaQueryWrapper<>(); + w.like(StringUtils.hasText(deptName), BusinessAnalytics::getDepartmentName, deptName) + .orderByDesc(BusinessAnalytics::getStatDate); + return R.ok(analyticsService.page(new Page<>(pageNo, pageSize), w)); + } + + @PostMapping("/add") + @Transactional(rollbackFor = Exception.class) + public R add(@RequestBody BusinessAnalytics analytics) { + analytics.setCreateTime(new Date()); + analyticsService.save(analytics); + return R.ok(analytics); + } + + @GetMapping("/summary") + public R getSummary() { + Map summary = new HashMap<>(); + List list = analyticsService.list(); + BigDecimal totalRevenue = BigDecimal.ZERO, totalCost = BigDecimal.ZERO; + int totalPatients = 0; + for (BusinessAnalytics ba : list) { + totalRevenue = totalRevenue.add(ba.getRevenue() != null ? ba.getRevenue() : BigDecimal.ZERO); + totalCost = totalCost.add(ba.getCost() != null ? ba.getCost() : BigDecimal.ZERO); + totalPatients += ba.getPatientCount() != null ? ba.getPatientCount() : 0; + } + summary.put("totalRecords", list.size()); + summary.put("totalRevenue", totalRevenue); + summary.put("totalCost", totalCost); + summary.put("totalProfit", totalRevenue.subtract(totalCost)); + summary.put("totalPatients", totalPatients); + return R.ok(summary); + } +} diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/system/controller/ApiAuthController.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/system/controller/ApiAuthController.java new file mode 100644 index 000000000..2988e9b8a --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/system/controller/ApiAuthController.java @@ -0,0 +1,56 @@ +package com.healthlink.his.web.system.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.sys.domain.SysApiAuth; +import com.healthlink.his.sys.service.ISysApiAuthService; +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.*; + +@RestController +@RequestMapping("/api-auth") +@Slf4j +@AllArgsConstructor +public class ApiAuthController { + + private final ISysApiAuthService authService; + + @GetMapping("/page") + public R getPage( + @RequestParam(value = "appName", required = false) String appName, + @RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo, + @RequestParam(value = "pageSize", defaultValue = "20") Integer pageSize) { + LambdaQueryWrapper w = new LambdaQueryWrapper<>(); + w.like(StringUtils.hasText(appName), SysApiAuth::getAppName, appName) + .orderByDesc(SysApiAuth::getCreateTime); + return R.ok(authService.page(new Page<>(pageNo, pageSize), w)); + } + + @PostMapping("/add") + @Transactional(rollbackFor = Exception.class) + public R add(@RequestBody SysApiAuth auth) { + auth.setStatus(0); + auth.setCreateTime(new Date()); + auth.setAppKey("HL-" + UUID.randomUUID().toString().substring(0, 8).toUpperCase()); + auth.setAppSecret(UUID.randomUUID().toString().replace("-", "")); + authService.save(auth); + return R.ok(auth); + } + + @PostMapping("/disable") + @Transactional(rollbackFor = Exception.class) + public R disable(@RequestParam Long id) { + SysApiAuth auth = authService.getById(id); + if (auth == null) return R.fail("认证不存在"); + auth.setStatus(1); + auth.setUpdateTime(new Date()); + authService.updateById(auth); + return R.ok(); + } +} diff --git a/healthlink-his-server/healthlink-his-application/src/main/resources/db/migration/V23__knowledgebase_trend_auth_analytics.sql b/healthlink-his-server/healthlink-his-application/src/main/resources/db/migration/V23__knowledgebase_trend_auth_analytics.sql new file mode 100644 index 000000000..9cba36721 --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/resources/db/migration/V23__knowledgebase_trend_auth_analytics.sql @@ -0,0 +1,83 @@ +-- V23: 知识库+评估趋势+安全认证+经营分析 + +-- 1. 临床知识库 +CREATE TABLE IF NOT EXISTS clinical_knowledge_base ( + id BIGSERIAL PRIMARY KEY, + category VARCHAR(50) NOT NULL, + title VARCHAR(200) NOT NULL, + content TEXT NOT NULL, + keywords VARCHAR(500), + source VARCHAR(200), + version VARCHAR(20), + status VARCHAR(20) DEFAULT 'ACTIVE', + tenant_id BIGINT DEFAULT 0, + is_deleted INT NOT NULL DEFAULT 0, + create_by VARCHAR(64), + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_by VARCHAR(64), + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); +COMMENT ON TABLE clinical_knowledge_base IS '临床知识库'; +COMMENT ON COLUMN clinical_knowledge_base.category IS '类别(guideline指南/drug药物/diagnosis诊断/procedure操作)'; +CREATE INDEX idx_ckb_category ON clinical_knowledge_base(category); + +-- 2. 评估趋势数据 +CREATE TABLE IF NOT EXISTS nursing_assessment_trend ( + id BIGSERIAL PRIMARY KEY, + encounter_id BIGINT NOT NULL, + patient_id BIGINT NOT NULL, + assessment_type VARCHAR(50) NOT NULL, + score DECIMAL(8,2), + risk_level VARCHAR(20), + assess_time TIMESTAMP NOT NULL, + assessor_name VARCHAR(50), + detail_json TEXT, + tenant_id BIGINT DEFAULT 0, + is_deleted INT NOT NULL DEFAULT 0, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); +COMMENT ON TABLE nursing_assessment_trend IS '护理评估趋势数据'; +CREATE INDEX idx_nat_encounter ON nursing_assessment_trend(encounter_id); +CREATE INDEX idx_nat_type ON nursing_assessment_trend(assessment_type); + +-- 3. 接口安全认证 +CREATE TABLE IF NOT EXISTS sys_api_auth ( + id BIGSERIAL PRIMARY KEY, + app_name VARCHAR(100) NOT NULL, + app_key VARCHAR(100) NOT NULL, + app_secret VARCHAR(200) NOT NULL, + permissions TEXT, + rate_limit INT DEFAULT 1000, + expire_time TIMESTAMP, + status INT NOT NULL DEFAULT 0, + last_access_time TIMESTAMP, + tenant_id BIGINT DEFAULT 0, + is_deleted INT NOT NULL DEFAULT 0, + create_by VARCHAR(64), + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_by VARCHAR(64), + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); +COMMENT ON TABLE sys_api_auth IS '接口安全认证'; +COMMENT ON COLUMN sys_api_auth.status IS '状态(0启用 1禁用)'; +CREATE UNIQUE INDEX idx_saa_key ON sys_api_auth(app_key); + +-- 4. 经营分析 +CREATE TABLE IF NOT EXISTS business_analytics ( + id BIGSERIAL PRIMARY KEY, + stat_date DATE NOT NULL, + department_id BIGINT, + department_name VARCHAR(100), + revenue DECIMAL(12,2) DEFAULT 0, + cost DECIMAL(12,2) DEFAULT 0, + profit DECIMAL(12,2) DEFAULT 0, + patient_count INT DEFAULT 0, + bed_count INT DEFAULT 0, + bed_occupancy_rate DECIMAL(5,2) DEFAULT 0, + avg_stay_days DECIMAL(5,2) DEFAULT 0, + avg_cost DECIMAL(10,2) DEFAULT 0, + tenant_id BIGINT DEFAULT 0, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); +COMMENT ON TABLE business_analytics IS '经营分析日报'; +CREATE INDEX idx_ba_date ON business_analytics(stat_date); diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/clinical/domain/ClinicalKnowledgeBase.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/clinical/domain/ClinicalKnowledgeBase.java new file mode 100644 index 000000000..12e8f5ee1 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/clinical/domain/ClinicalKnowledgeBase.java @@ -0,0 +1,21 @@ +package com.healthlink.his.clinical.domain; + +import com.baomidou.mybatisplus.annotation.*; +import com.core.common.core.domain.HisBaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("clinical_knowledge_base") +public class ClinicalKnowledgeBase extends HisBaseEntity { + @TableId(value = "id", type = IdType.ASSIGN_ID) + private Long id; + @TableField("category") private String category; + @TableField("title") private String title; + @TableField("content") private String content; + @TableField("keywords") private String keywords; + @TableField("source") private String source; + @TableField("version") private String version; + @TableField("status") private String status; +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/clinical/mapper/ClinicalKnowledgeBaseMapper.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/clinical/mapper/ClinicalKnowledgeBaseMapper.java new file mode 100644 index 000000000..9292aefdb --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/clinical/mapper/ClinicalKnowledgeBaseMapper.java @@ -0,0 +1,9 @@ +package com.healthlink.his.clinical.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.healthlink.his.clinical.domain.ClinicalKnowledgeBase; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ClinicalKnowledgeBaseMapper extends BaseMapper { +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/clinical/service/IClinicalKnowledgeBaseService.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/clinical/service/IClinicalKnowledgeBaseService.java new file mode 100644 index 000000000..bdd65279f --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/clinical/service/IClinicalKnowledgeBaseService.java @@ -0,0 +1,7 @@ +package com.healthlink.his.clinical.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.healthlink.his.clinical.domain.ClinicalKnowledgeBase; + +public interface IClinicalKnowledgeBaseService extends IService { +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/clinical/service/impl/ClinicalKnowledgeBaseServiceImpl.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/clinical/service/impl/ClinicalKnowledgeBaseServiceImpl.java new file mode 100644 index 000000000..494caedb0 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/clinical/service/impl/ClinicalKnowledgeBaseServiceImpl.java @@ -0,0 +1,11 @@ +package com.healthlink.his.clinical.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.healthlink.his.clinical.domain.ClinicalKnowledgeBase; +import com.healthlink.his.clinical.mapper.ClinicalKnowledgeBaseMapper; +import com.healthlink.his.clinical.service.IClinicalKnowledgeBaseService; +import org.springframework.stereotype.Service; + +@Service +public class ClinicalKnowledgeBaseServiceImpl extends ServiceImpl implements IClinicalKnowledgeBaseService { +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/nursing/domain/NursingAssessmentTrend.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/nursing/domain/NursingAssessmentTrend.java new file mode 100644 index 000000000..64bbdc4b0 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/nursing/domain/NursingAssessmentTrend.java @@ -0,0 +1,25 @@ +package com.healthlink.his.nursing.domain; + +import com.baomidou.mybatisplus.annotation.*; +import com.core.common.core.domain.HisBaseEntity; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.math.BigDecimal; +import java.util.Date; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("nursing_assessment_trend") +public class NursingAssessmentTrend extends HisBaseEntity { + @TableId(value = "id", type = IdType.ASSIGN_ID) + private Long id; + @TableField("encounter_id") private Long encounterId; + @TableField("patient_id") private Long patientId; + @TableField("assessment_type") private String assessmentType; + @TableField("score") private BigDecimal score; + @TableField("risk_level") private String riskLevel; + @TableField("assess_time") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date assessTime; + @TableField("assessor_name") private String assessorName; + @TableField("detail_json") private String detailJson; +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/nursing/mapper/NursingAssessmentTrendMapper.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/nursing/mapper/NursingAssessmentTrendMapper.java new file mode 100644 index 000000000..8e292c042 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/nursing/mapper/NursingAssessmentTrendMapper.java @@ -0,0 +1,9 @@ +package com.healthlink.his.nursing.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.healthlink.his.nursing.domain.NursingAssessmentTrend; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface NursingAssessmentTrendMapper extends BaseMapper { +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/nursing/service/INursingAssessmentTrendService.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/nursing/service/INursingAssessmentTrendService.java new file mode 100644 index 000000000..d6d3cc7f4 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/nursing/service/INursingAssessmentTrendService.java @@ -0,0 +1,7 @@ +package com.healthlink.his.nursing.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.healthlink.his.nursing.domain.NursingAssessmentTrend; + +public interface INursingAssessmentTrendService extends IService { +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/nursing/service/impl/NursingAssessmentTrendServiceImpl.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/nursing/service/impl/NursingAssessmentTrendServiceImpl.java new file mode 100644 index 000000000..9032faa89 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/nursing/service/impl/NursingAssessmentTrendServiceImpl.java @@ -0,0 +1,11 @@ +package com.healthlink.his.nursing.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.healthlink.his.nursing.domain.NursingAssessmentTrend; +import com.healthlink.his.nursing.mapper.NursingAssessmentTrendMapper; +import com.healthlink.his.nursing.service.INursingAssessmentTrendService; +import org.springframework.stereotype.Service; + +@Service +public class NursingAssessmentTrendServiceImpl extends ServiceImpl implements INursingAssessmentTrendService { +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/quality/domain/BusinessAnalytics.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/quality/domain/BusinessAnalytics.java new file mode 100644 index 000000000..1c7093c8e --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/quality/domain/BusinessAnalytics.java @@ -0,0 +1,26 @@ +package com.healthlink.his.quality.domain; + +import com.baomidou.mybatisplus.annotation.*; +import com.core.common.core.domain.HisBaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.math.BigDecimal; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("business_analytics") +public class BusinessAnalytics extends HisBaseEntity { + @TableId(value = "id", type = IdType.ASSIGN_ID) + private Long id; + @TableField("stat_date") private String statDate; + @TableField("department_id") private Long departmentId; + @TableField("department_name") private String departmentName; + @TableField("revenue") private BigDecimal revenue; + @TableField("cost") private BigDecimal cost; + @TableField("profit") private BigDecimal profit; + @TableField("patient_count") private Integer patientCount; + @TableField("bed_count") private Integer bedCount; + @TableField("bed_occupancy_rate") private BigDecimal bedOccupancyRate; + @TableField("avg_stay_days") private BigDecimal avgStayDays; + @TableField("avg_cost") private BigDecimal avgCost; +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/quality/mapper/BusinessAnalyticsMapper.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/quality/mapper/BusinessAnalyticsMapper.java new file mode 100644 index 000000000..711c52c2c --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/quality/mapper/BusinessAnalyticsMapper.java @@ -0,0 +1,9 @@ +package com.healthlink.his.quality.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.healthlink.his.quality.domain.BusinessAnalytics; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface BusinessAnalyticsMapper extends BaseMapper { +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/quality/service/IBusinessAnalyticsService.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/quality/service/IBusinessAnalyticsService.java new file mode 100644 index 000000000..17557c6dc --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/quality/service/IBusinessAnalyticsService.java @@ -0,0 +1,7 @@ +package com.healthlink.his.quality.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.healthlink.his.quality.domain.BusinessAnalytics; + +public interface IBusinessAnalyticsService extends IService { +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/quality/service/impl/BusinessAnalyticsServiceImpl.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/quality/service/impl/BusinessAnalyticsServiceImpl.java new file mode 100644 index 000000000..8b0fe7967 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/quality/service/impl/BusinessAnalyticsServiceImpl.java @@ -0,0 +1,11 @@ +package com.healthlink.his.quality.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.healthlink.his.quality.domain.BusinessAnalytics; +import com.healthlink.his.quality.mapper.BusinessAnalyticsMapper; +import com.healthlink.his.quality.service.IBusinessAnalyticsService; +import org.springframework.stereotype.Service; + +@Service +public class BusinessAnalyticsServiceImpl extends ServiceImpl implements IBusinessAnalyticsService { +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/sys/domain/SysApiAuth.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/sys/domain/SysApiAuth.java new file mode 100644 index 000000000..0fc1f2d51 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/sys/domain/SysApiAuth.java @@ -0,0 +1,24 @@ +package com.healthlink.his.sys.domain; + +import com.baomidou.mybatisplus.annotation.*; +import com.core.common.core.domain.HisBaseEntity; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_api_auth") +public class SysApiAuth extends HisBaseEntity { + @TableId(value = "id", type = IdType.ASSIGN_ID) + private Long id; + @TableField("app_name") private String appName; + @TableField("app_key") private String appKey; + @TableField("app_secret") private String appSecret; + @TableField("permissions") private String permissions; + @TableField("rate_limit") private Integer rateLimit; + @TableField("expire_time") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date expireTime; + @TableField("status") private Integer status; + @TableField("last_access_time") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date lastAccessTime; +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/sys/mapper/SysApiAuthMapper.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/sys/mapper/SysApiAuthMapper.java new file mode 100644 index 000000000..9d5cbddd8 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/sys/mapper/SysApiAuthMapper.java @@ -0,0 +1,9 @@ +package com.healthlink.his.sys.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.healthlink.his.sys.domain.SysApiAuth; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface SysApiAuthMapper extends BaseMapper { +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/sys/service/ISysApiAuthService.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/sys/service/ISysApiAuthService.java new file mode 100644 index 000000000..2db651b26 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/sys/service/ISysApiAuthService.java @@ -0,0 +1,7 @@ +package com.healthlink.his.sys.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.healthlink.his.sys.domain.SysApiAuth; + +public interface ISysApiAuthService extends IService { +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/sys/service/impl/SysApiAuthServiceImpl.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/sys/service/impl/SysApiAuthServiceImpl.java new file mode 100644 index 000000000..bb1295e89 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/sys/service/impl/SysApiAuthServiceImpl.java @@ -0,0 +1,11 @@ +package com.healthlink.his.sys.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.healthlink.his.sys.domain.SysApiAuth; +import com.healthlink.his.sys.mapper.SysApiAuthMapper; +import com.healthlink.his.sys.service.ISysApiAuthService; +import org.springframework.stereotype.Service; + +@Service +public class SysApiAuthServiceImpl extends ServiceImpl implements ISysApiAuthService { +} diff --git a/healthlink-his-ui/src/views/apiauth/api.js b/healthlink-his-ui/src/views/apiauth/api.js new file mode 100644 index 000000000..a0a799fe4 --- /dev/null +++ b/healthlink-his-ui/src/views/apiauth/api.js @@ -0,0 +1,4 @@ +import request from '@/utils/request' +export function getAuthPage(p){return request({url:'/api-auth/page',method:'get',params:p})} +export function addAuth(d){return request({url:'/api-auth/add',method:'post',data:d})} +export function disableAuth(id){return request({url:'/api-auth/disable',method:'post',params:{id}})} diff --git a/healthlink-his-ui/src/views/apiauth/index.vue b/healthlink-his-ui/src/views/apiauth/index.vue new file mode 100644 index 000000000..e67226620 --- /dev/null +++ b/healthlink-his-ui/src/views/apiauth/index.vue @@ -0,0 +1,28 @@ + + diff --git a/healthlink-his-ui/src/views/assessmenttrend/api.js b/healthlink-his-ui/src/views/assessmenttrend/api.js new file mode 100644 index 000000000..eedb4549c --- /dev/null +++ b/healthlink-his-ui/src/views/assessmenttrend/api.js @@ -0,0 +1,3 @@ +import request from '@/utils/request' +export function getTrend(p){return request({url:'/assessment-trend/trend',method:'get',params:p})} +export function addTrend(d){return request({url:'/assessment-trend/add',method:'post',data:d})} diff --git a/healthlink-his-ui/src/views/assessmenttrend/index.vue b/healthlink-his-ui/src/views/assessmenttrend/index.vue new file mode 100644 index 000000000..4aae49c3a --- /dev/null +++ b/healthlink-his-ui/src/views/assessmenttrend/index.vue @@ -0,0 +1,27 @@ + + diff --git a/healthlink-his-ui/src/views/businessanalytics/api.js b/healthlink-his-ui/src/views/businessanalytics/api.js new file mode 100644 index 000000000..913bc40ab --- /dev/null +++ b/healthlink-his-ui/src/views/businessanalytics/api.js @@ -0,0 +1,4 @@ +import request from '@/utils/request' +export function getAnalyticsPage(p){return request({url:'/business-analytics/page',method:'get',params:p})} +export function addAnalytics(d){return request({url:'/business-analytics/add',method:'post',data:d})} +export function getAnalyticsSummary(){return request({url:'/business-analytics/summary',method:'get'})} diff --git a/healthlink-his-ui/src/views/businessanalytics/index.vue b/healthlink-his-ui/src/views/businessanalytics/index.vue new file mode 100644 index 000000000..15b08b559 --- /dev/null +++ b/healthlink-his-ui/src/views/businessanalytics/index.vue @@ -0,0 +1,29 @@ + + diff --git a/healthlink-his-ui/src/views/knowledgebase/api.js b/healthlink-his-ui/src/views/knowledgebase/api.js new file mode 100644 index 000000000..fd18decd0 --- /dev/null +++ b/healthlink-his-ui/src/views/knowledgebase/api.js @@ -0,0 +1,4 @@ +import request from '@/utils/request' +export function getKBPage(p){return request({url:'/knowledge-base/page',method:'get',params:p})} +export function searchKB(k){return request({url:'/knowledge-base/search',method:'get',params:{keyword:k}})} +export function addKB(d){return request({url:'/knowledge-base/add',method:'post',data:d})} diff --git a/healthlink-his-ui/src/views/knowledgebase/index.vue b/healthlink-his-ui/src/views/knowledgebase/index.vue new file mode 100644 index 000000000..bc431e55c --- /dev/null +++ b/healthlink-his-ui/src/views/knowledgebase/index.vue @@ -0,0 +1,27 @@ + +