diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/cdss/appservice/ICdssAppService.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/cdss/appservice/ICdssAppService.java index 1ff779944..ad95a98b9 100644 --- a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/cdss/appservice/ICdssAppService.java +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/cdss/appservice/ICdssAppService.java @@ -2,6 +2,9 @@ package com.healthlink.his.web.cdss.appservice; import com.core.common.core.domain.R; +import java.util.List; +import java.util.Map; + public interface ICdssAppService { R evaluateRules(Long encounterId, Long patientId, String triggerType, Long departmentId); @@ -11,4 +14,10 @@ public interface ICdssAppService { R acknowledgeAlert(Long id, String remark); R getRules(String ruleType, String severity, String keyword); + + R getRuleStats(); + + R getExecutionHistory(Long ruleId, Long encounterId, Integer page, Integer size); + + R getRulesEnhanced(String ruleType, String severity, String keyword, String category, Integer priority); } diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/cdss/appservice/impl/CdssAppServiceImpl.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/cdss/appservice/impl/CdssAppServiceImpl.java index e536f0d1a..7d509f1db 100644 --- a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/cdss/appservice/impl/CdssAppServiceImpl.java +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/cdss/appservice/impl/CdssAppServiceImpl.java @@ -1,10 +1,13 @@ package com.healthlink.his.web.cdss.appservice.impl; import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.core.common.core.domain.R; import com.healthlink.his.cdss.domain.CdssAlert; import com.healthlink.his.cdss.domain.CdssRule; +import com.healthlink.his.cdss.domain.CdssRuleExecution; import com.healthlink.his.cdss.service.ICdssAlertService; +import com.healthlink.his.cdss.service.ICdssRuleExecutionService; import com.healthlink.his.cdss.service.ICdssRuleService; import com.healthlink.his.web.cdss.appservice.ICdssAppService; import org.slf4j.Logger; @@ -23,10 +26,13 @@ public class CdssAppServiceImpl implements ICdssAppService { private final ICdssRuleService cdssRuleService; private final ICdssAlertService cdssAlertService; + private final ICdssRuleExecutionService cdssRuleExecutionService; - public CdssAppServiceImpl(ICdssRuleService cdssRuleService, ICdssAlertService cdssAlertService) { + public CdssAppServiceImpl(ICdssRuleService cdssRuleService, ICdssAlertService cdssAlertService, + ICdssRuleExecutionService cdssRuleExecutionService) { this.cdssRuleService = cdssRuleService; this.cdssAlertService = cdssAlertService; + this.cdssRuleExecutionService = cdssRuleExecutionService; } @Override @@ -38,12 +44,36 @@ public class CdssAppServiceImpl implements ICdssAppService { List triggeredAlerts = new ArrayList<>(); for (CdssRule rule : activeRules) { - if (matchRule(rule, encounterId, patientId)) { - CdssAlert alert = buildAlert(rule, encounterId, patientId); - cdssAlertService.save(alert); - triggeredAlerts.add(alert); - log.info("CDSS rule triggered: ruleCode={}, encounterId={}", rule.getRuleCode(), encounterId); + long startTime = System.currentTimeMillis(); + boolean matched = false; + String result = null; + try { + matched = matchRule(rule, encounterId, patientId); + if (matched) { + CdssAlert alert = buildAlert(rule, encounterId, patientId); + cdssAlertService.save(alert); + triggeredAlerts.add(alert); + result = "MATCHED"; + log.info("CDSS rule triggered: ruleCode={}, encounterId={}", rule.getRuleCode(), encounterId); + } else { + result = "NOT_MATCHED"; + } + } catch (Exception e) { + result = "ERROR: " + e.getMessage(); + log.warn("CDSS rule execution error: ruleCode={}, error={}", rule.getRuleCode(), e.getMessage()); } + long duration = System.currentTimeMillis() - startTime; + + CdssRuleExecution execution = new CdssRuleExecution(); + execution.setRuleId(rule.getId()); + execution.setRuleCode(rule.getRuleCode()); + execution.setEncounterId(encounterId); + execution.setPatientId(patientId); + execution.setMatched(matched); + execution.setExecutionTime(new Date()); + execution.setExecutionResult(result); + execution.setDurationMs((int) duration); + cdssRuleExecutionService.save(execution); } return R.ok(Map.of( @@ -89,13 +119,42 @@ public class CdssAppServiceImpl implements ICdssAppService { } if (keyword != null && !keyword.isEmpty()) { rules = rules.stream() - .filter(r -> r.getRuleName().contains(keyword) || + .filter(r -> r.getRuleName().contains(keyword) || (r.getRuleCode() != null && r.getRuleCode().contains(keyword))) .toList(); } return R.ok(rules); } + @Override + public R getRuleStats() { + return R.ok(cdssRuleService.getRuleStats()); + } + + @Override + public R getExecutionHistory(Long ruleId, Long encounterId, Integer page, Integer size) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if (ruleId != null) { + wrapper.eq(CdssRuleExecution::getRuleId, ruleId); + } + if (encounterId != null) { + wrapper.eq(CdssRuleExecution::getEncounterId, encounterId); + } + wrapper.orderByDesc(CdssRuleExecution::getExecutionTime); + int pageNum = (page != null && page > 0) ? page : 1; + int pageSize = (size != null && size > 0) ? size : 20; + wrapper.last("LIMIT " + pageSize + " OFFSET " + (pageNum - 1) * pageSize); + List history = cdssRuleExecutionService.list(wrapper); + return R.ok(history); + } + + @Override + public R getRulesEnhanced(String ruleType, String severity, String keyword, + String category, Integer priority) { + List rules = cdssRuleService.findByConditionWithFilter(ruleType, severity, keyword, category, priority); + return R.ok(rules); + } + private boolean matchRule(CdssRule rule, Long encounterId, Long patientId) { try { String conditionExpr = rule.getConditionExpr(); diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/cdss/controller/CdssController.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/cdss/controller/CdssController.java index bf883b57e..d603114e3 100644 --- a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/cdss/controller/CdssController.java +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/cdss/controller/CdssController.java @@ -54,4 +54,34 @@ public class CdssController { @RequestParam(value = "keyword", required = false) String keyword) { return cdssAppService.getRules(ruleType, severity, keyword); } + + @Operation(summary = "查询规则列表(增强版-支持优先级/分类)") + @PreAuthorize("@ss.hasPermi('infection:cdss:list')") + @GetMapping("/rules/enhanced") + public R getRulesEnhanced( + @RequestParam(value = "ruleType", required = false) String ruleType, + @RequestParam(value = "severity", required = false) String severity, + @RequestParam(value = "keyword", required = false) String keyword, + @RequestParam(value = "category", required = false) String category, + @RequestParam(value = "priority", required = false) Integer priority) { + return cdssAppService.getRulesEnhanced(ruleType, severity, keyword, category, priority); + } + + @Operation(summary = "获取规则统计数据") + @PreAuthorize("@ss.hasPermi('infection:cdss:list')") + @GetMapping("/rules/stats") + public R getRuleStats() { + return cdssAppService.getRuleStats(); + } + + @Operation(summary = "获取规则执行历史") + @PreAuthorize("@ss.hasPermi('infection:cdss:list')") + @GetMapping("/rules/history") + public R getExecutionHistory( + @RequestParam(value = "ruleId", required = false) Long ruleId, + @RequestParam(value = "encounterId", required = false) Long encounterId, + @RequestParam(value = "page", required = false, defaultValue = "1") Integer page, + @RequestParam(value = "size", required = false, defaultValue = "20") Integer size) { + return cdssAppService.getExecutionHistory(ruleId, encounterId, page, size); + } } diff --git a/healthlink-his-server/healthlink-his-application/src/main/resources/db/migration/V86__cdss_rule_upgrade.sql b/healthlink-his-server/healthlink-his-application/src/main/resources/db/migration/V86__cdss_rule_upgrade.sql new file mode 100644 index 000000000..025a8b96d --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/resources/db/migration/V86__cdss_rule_upgrade.sql @@ -0,0 +1,39 @@ +-- V86: CDSS规则引擎升级 - 添加优先级/分类字段 + 规则执行历史 + +ALTER TABLE cdss_rule ADD COLUMN IF NOT EXISTS priority INT NOT NULL DEFAULT 0; +ALTER TABLE cdss_rule ADD COLUMN IF NOT EXISTS category VARCHAR(64); + +COMMENT ON COLUMN cdss_rule.priority IS '规则优先级(0普通 1紧急 2最高)'; +COMMENT ON COLUMN cdss_rule.category IS '规则分类'; + +CREATE TABLE cdss_rule_execution ( + id BIGSERIAL PRIMARY KEY, + rule_id BIGINT NOT NULL, + rule_code VARCHAR(64) NOT NULL, + encounter_id BIGINT NOT NULL, + patient_id BIGINT NOT NULL, + matched BOOLEAN DEFAULT FALSE, + execution_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + execution_result TEXT, + duration_ms INT, + tenant_id BIGINT DEFAULT 0, + create_by VARCHAR(64), + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + delete_flag CHAR(1) DEFAULT '0' +); + +COMMENT ON TABLE cdss_rule_execution IS 'CDSS规则执行历史'; +COMMENT ON COLUMN cdss_rule_execution.id IS '执行记录ID'; +COMMENT ON COLUMN cdss_rule_execution.rule_id IS '规则ID'; +COMMENT ON COLUMN cdss_rule_execution.rule_code IS '规则编码'; +COMMENT ON COLUMN cdss_rule_execution.encounter_id IS '就诊ID'; +COMMENT ON COLUMN cdss_rule_execution.patient_id IS '患者ID'; +COMMENT ON COLUMN cdss_rule_execution.matched IS '是否命中'; +COMMENT ON COLUMN cdss_rule_execution.execution_time IS '执行时间'; +COMMENT ON COLUMN cdss_rule_execution.execution_result IS '执行结果'; +COMMENT ON COLUMN cdss_rule_execution.duration_ms IS '执行耗时(毫秒)'; + +CREATE INDEX idx_cdss_exec_rule ON cdss_rule_execution(rule_id); +CREATE INDEX idx_cdss_exec_encounter ON cdss_rule_execution(encounter_id); +CREATE INDEX idx_cdss_exec_patient ON cdss_rule_execution(patient_id); +CREATE INDEX idx_cdss_exec_time ON cdss_rule_execution(execution_time); diff --git a/healthlink-his-server/healthlink-his-application/src/main/resources/mapper/cdss/CdssRuleExecutionMapper.xml b/healthlink-his-server/healthlink-his-application/src/main/resources/mapper/cdss/CdssRuleExecutionMapper.xml new file mode 100644 index 000000000..4631280ce --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/resources/mapper/cdss/CdssRuleExecutionMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + id, rule_id, rule_code, encounter_id, patient_id, + matched, execution_time, execution_result, duration_ms, + tenant_id, create_by, create_time, delete_flag + + + diff --git a/healthlink-his-server/healthlink-his-application/src/main/resources/mapper/cdss/CdssRuleMapper.xml b/healthlink-his-server/healthlink-his-application/src/main/resources/mapper/cdss/CdssRuleMapper.xml index 51cdc352c..a070540f9 100644 --- a/healthlink-his-server/healthlink-his-application/src/main/resources/mapper/cdss/CdssRuleMapper.xml +++ b/healthlink-his-server/healthlink-his-application/src/main/resources/mapper/cdss/CdssRuleMapper.xml @@ -15,6 +15,8 @@ + + @@ -26,7 +28,8 @@ id, rule_code, rule_name, rule_type, severity, trigger_type, condition_expr, action_expr, description, department_id, - status, sort_order, tenant_id, create_by, create_time, + status, sort_order, priority, category, + tenant_id, create_by, create_time, update_by, update_time, delete_flag diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cdss/domain/CdssRule.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cdss/domain/CdssRule.java index f14e53d4e..23a1cf400 100644 --- a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cdss/domain/CdssRule.java +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cdss/domain/CdssRule.java @@ -42,4 +42,8 @@ public class CdssRule extends HisBaseEntity { private Integer status; private Integer sortOrder; + + private Integer priority; + + private String category; } diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cdss/domain/CdssRuleExecution.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cdss/domain/CdssRuleExecution.java new file mode 100644 index 000000000..569ab09b4 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cdss/domain/CdssRuleExecution.java @@ -0,0 +1,43 @@ +package com.healthlink.his.cdss.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.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.util.Date; + +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("cdss_rule_execution") +public class CdssRuleExecution extends HisBaseEntity { + + @TableId(type = IdType.ASSIGN_ID) + @JsonSerialize(using = ToStringSerializer.class) + private Long id; + + @JsonSerialize(using = ToStringSerializer.class) + private Long ruleId; + + private String ruleCode; + + @JsonSerialize(using = ToStringSerializer.class) + private Long encounterId; + + @JsonSerialize(using = ToStringSerializer.class) + private Long patientId; + + private Boolean matched; + + private Date executionTime; + + private String executionResult; + + private Integer durationMs; +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cdss/mapper/CdssRuleExecutionMapper.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cdss/mapper/CdssRuleExecutionMapper.java new file mode 100644 index 000000000..bcff031d1 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cdss/mapper/CdssRuleExecutionMapper.java @@ -0,0 +1,9 @@ +package com.healthlink.his.cdss.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.healthlink.his.cdss.domain.CdssRuleExecution; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface CdssRuleExecutionMapper extends BaseMapper { +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cdss/service/ICdssRuleExecutionService.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cdss/service/ICdssRuleExecutionService.java new file mode 100644 index 000000000..f4645480b --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cdss/service/ICdssRuleExecutionService.java @@ -0,0 +1,7 @@ +package com.healthlink.his.cdss.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.healthlink.his.cdss.domain.CdssRuleExecution; + +public interface ICdssRuleExecutionService extends IService { +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cdss/service/ICdssRuleService.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cdss/service/ICdssRuleService.java index 790c32f81..45ceed388 100644 --- a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cdss/service/ICdssRuleService.java +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cdss/service/ICdssRuleService.java @@ -4,10 +4,16 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.healthlink.his.cdss.domain.CdssRule; import java.util.List; +import java.util.Map; public interface ICdssRuleService extends IService { List findActiveRules(String triggerType, Long departmentId); List findByCondition(String ruleType, String severity, Integer status); + + Map getRuleStats(); + + List findByConditionWithFilter(String ruleType, String severity, String keyword, + String category, Integer priority); } diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cdss/service/impl/CdssRuleExecutionServiceImpl.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cdss/service/impl/CdssRuleExecutionServiceImpl.java new file mode 100644 index 000000000..42e130a94 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cdss/service/impl/CdssRuleExecutionServiceImpl.java @@ -0,0 +1,11 @@ +package com.healthlink.his.cdss.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.healthlink.his.cdss.domain.CdssRuleExecution; +import com.healthlink.his.cdss.mapper.CdssRuleExecutionMapper; +import com.healthlink.his.cdss.service.ICdssRuleExecutionService; +import org.springframework.stereotype.Service; + +@Service +public class CdssRuleExecutionServiceImpl extends ServiceImpl implements ICdssRuleExecutionService { +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cdss/service/impl/CdssRuleServiceImpl.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cdss/service/impl/CdssRuleServiceImpl.java index 57cb42482..a8125a7dc 100644 --- a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cdss/service/impl/CdssRuleServiceImpl.java +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cdss/service/impl/CdssRuleServiceImpl.java @@ -3,15 +3,25 @@ package com.healthlink.his.cdss.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.healthlink.his.cdss.domain.CdssRule; +import com.healthlink.his.cdss.domain.CdssRuleExecution; import com.healthlink.his.cdss.mapper.CdssRuleMapper; +import com.healthlink.his.cdss.service.ICdssRuleExecutionService; import com.healthlink.his.cdss.service.ICdssRuleService; import org.springframework.stereotype.Service; +import java.util.HashMap; import java.util.List; +import java.util.Map; @Service public class CdssRuleServiceImpl extends ServiceImpl implements ICdssRuleService { + private final ICdssRuleExecutionService executionService; + + public CdssRuleServiceImpl(ICdssRuleExecutionService executionService) { + this.executionService = executionService; + } + @Override public List findActiveRules(String triggerType, Long departmentId) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); @@ -22,12 +32,38 @@ public class CdssRuleServiceImpl extends ServiceImpl i if (departmentId != null) { wrapper.and(w -> w.isNull(CdssRule::getDepartmentId).or().eq(CdssRule::getDepartmentId, departmentId)); } - wrapper.orderByAsc(CdssRule::getSortOrder); + wrapper.orderByDesc(CdssRule::getPriority).orderByAsc(CdssRule::getSortOrder); return baseMapper.selectList(wrapper); } @Override public List findByCondition(String ruleType, String severity, Integer status) { + return findByConditionWithFilter(ruleType, severity, null, null, null); + } + + @Override + public Map getRuleStats() { + long totalCount = baseMapper.selectCount(null); + long activeCount = baseMapper.selectCount( + new LambdaQueryWrapper().eq(CdssRule::getStatus, 1)); + long totalExecutions = executionService.count(); + long matchedExecutions = executionService.count( + new LambdaQueryWrapper().eq(CdssRuleExecution::getMatched, true)); + + Map stats = new HashMap<>(); + stats.put("totalRules", totalCount); + stats.put("activeRules", activeCount); + stats.put("inactiveRules", totalCount - activeCount); + stats.put("totalExecutions", totalExecutions); + stats.put("matchedExecutions", matchedExecutions); + stats.put("hitRate", totalExecutions > 0 + ? Math.round(matchedExecutions * 10000.0 / totalExecutions) / 100.0 : 0.0); + return stats; + } + + @Override + public List findByConditionWithFilter(String ruleType, String severity, String keyword, + String category, Integer priority) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); if (ruleType != null && !ruleType.isEmpty()) { wrapper.eq(CdssRule::getRuleType, ruleType); @@ -35,10 +71,17 @@ public class CdssRuleServiceImpl extends ServiceImpl i if (severity != null && !severity.isEmpty()) { wrapper.eq(CdssRule::getSeverity, severity); } - if (status != null) { - wrapper.eq(CdssRule::getStatus, status); + if (category != null && !category.isEmpty()) { + wrapper.eq(CdssRule::getCategory, category); } - wrapper.orderByAsc(CdssRule::getSortOrder); + if (priority != null) { + wrapper.eq(CdssRule::getPriority, priority); + } + if (keyword != null && !keyword.isEmpty()) { + wrapper.and(w -> w.like(CdssRule::getRuleName, keyword) + .or().like(CdssRule::getRuleCode, keyword)); + } + wrapper.orderByDesc(CdssRule::getPriority).orderByAsc(CdssRule::getSortOrder); return baseMapper.selectList(wrapper); } } diff --git a/healthlink-his-ui/src/api/cdss/cdssRule.js b/healthlink-his-ui/src/api/cdss/cdssRule.js index a04af6619..1fea42465 100644 --- a/healthlink-his-ui/src/api/cdss/cdssRule.js +++ b/healthlink-his-ui/src/api/cdss/cdssRule.js @@ -8,6 +8,29 @@ export function getCdssRuleList(query) { }) } +export function getCdssRuleListEnhanced(query) { + return request({ + url: '/infection/cdss/rules/enhanced', + method: 'get', + params: query + }) +} + +export function getCdssRuleStats() { + return request({ + url: '/infection/cdss/rules/stats', + method: 'get' + }) +} + +export function getCdssRuleHistory(query) { + return request({ + url: '/infection/cdss/rules/history', + method: 'get', + params: query + }) +} + export function addCdssRule(data) { return request({ url: '/infection/cdss/rules', diff --git a/healthlink-his-ui/src/views/cdss/cdssRules/index.vue b/healthlink-his-ui/src/views/cdss/cdssRules/index.vue index e4eee98ed..3c97c0679 100644 --- a/healthlink-his-ui/src/views/cdss/cdssRules/index.vue +++ b/healthlink-his-ui/src/views/cdss/cdssRules/index.vue @@ -18,16 +18,71 @@ + + + + + + + + + + 搜索 重置 + {{ showStats ? '返回列表' : '统计概览' }} - +
+ + + +
{{ ruleStats.totalRules || 0 }}
+
规则总数
+
+
+ + +
{{ ruleStats.activeRules || 0 }}
+
启用规则
+
+
+ + +
{{ ruleStats.totalExecutions || 0 }}
+
执行总次数
+
+
+ + +
{{ ruleStats.hitRate || 0 }}%
+
命中率
+
+
+
+ + 执行历史 + + + + + + + + + + + +
+ + @@ -41,6 +96,12 @@ {{ row.severity }} + + + + @@ -55,16 +116,22 @@ + +