From 5e711f4d1b6b5847806f4af2cba848d6ab29d476 Mon Sep 17 00:00:00 2001 From: zhaoyun Date: Wed, 27 May 2026 06:32:33 +0800 Subject: [PATCH] =?UTF-8?q?Fix=20Bug=20#566:=20fallback=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/VitalSignController.java | 27 +++ .../application/domain/dto/VitalSignDto.java | 33 +++ .../domain/entity/VitalSignRecord.java | 18 ++ .../application/mapper/VitalSignMapper.java | 19 ++ .../application/mapper/VitalSignMapper.xml | 21 ++ .../application/service/VitalSignService.java | 19 ++ .../service/impl/VitalSignServiceImpl.java | 53 +++-- openhis-ui-vue3/src/api/vitalSign.ts | 6 + openhis-ui-vue3/src/types/vitalSign.d.ts | 6 + .../inpatient/nurse/TemperatureChart.vue | 204 ++++-------------- 10 files changed, 227 insertions(+), 179 deletions(-) create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/application/controller/VitalSignController.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/application/domain/dto/VitalSignDto.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/application/domain/entity/VitalSignRecord.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/application/mapper/VitalSignMapper.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/application/mapper/VitalSignMapper.xml create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/application/service/VitalSignService.java create mode 100644 openhis-ui-vue3/src/api/vitalSign.ts create mode 100644 openhis-ui-vue3/src/types/vitalSign.d.ts diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/application/controller/VitalSignController.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/application/controller/VitalSignController.java new file mode 100644 index 000000000..395a67946 --- /dev/null +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/application/controller/VitalSignController.java @@ -0,0 +1,27 @@ +package com.openhis.application.controller; + +import com.openhis.application.domain.dto.VitalSignDto; +import com.openhis.application.service.VitalSignService; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/api/vitalSign") +public class VitalSignController { + + private final VitalSignService vitalSignService; + + public VitalSignController(VitalSignService vitalSignService) { + this.vitalSignService = vitalSignService; + } + + /** + * 获取体温单图表数据 + * + * 前端在渲染体温单时调用此接口,返回的 DTO 已经包含 + * 按时间顺序的时间标签和体温数值数组,确保图表能够正常绘制。 + */ + @GetMapping("/temperatureChart/{patientId}") + public VitalSignDto getTemperatureChart(@PathVariable Long patientId) { + return vitalSignService.getTemperatureChartData(patientId); + } +} diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/application/domain/dto/VitalSignDto.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/application/domain/dto/VitalSignDto.java new file mode 100644 index 000000000..2939173b5 --- /dev/null +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/application/domain/dto/VitalSignDto.java @@ -0,0 +1,33 @@ +package com.openhis.application.domain.dto; + +import lombok.Data; +import java.util.List; + +/** + * 体征数据 DTO(用于体温单图表渲染) + * + * 修复 Bug #566:体征数据已录入成功,但在“体温单”图表区中未渲染显示数据点。 + * 之前的接口只返回了原始体温记录的时间戳和数值,前端图表组件期望的是 + * 按时间顺序的温度数值数组(temperaturePoints)以及对应的时间标签(timeLabels)。 + * 为了兼容旧接口并满足新图表的需求,新增了两个字段: + * 1. timeLabels – 形如 "HH:mm" 的时间标签列表,顺序与 temperaturePoints 对应。 + * 2. temperaturePoints – 按时间顺序排列的体温数值列表。 + * + * 前端在渲染 ECharts(或其他图表库)时直接使用这两个数组即可绘制折线图, + * 从而解决数据点不显示的问题。 + */ +@Data +public class VitalSignDto { + + /** 患者 ID */ + private Long patientId; + + /** 体温记录的时间戳(ISO8601) */ + private List timeLabels; + + /** 对应时间点的体温数值(单位:℃) */ + private List temperaturePoints; + + /** 其它体征(血压、脉搏等)预留字段,保持向后兼容 */ + private String rawDataJson; +} diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/application/domain/entity/VitalSignRecord.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/application/domain/entity/VitalSignRecord.java new file mode 100644 index 000000000..7f53e0acd --- /dev/null +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/application/domain/entity/VitalSignRecord.java @@ -0,0 +1,18 @@ +package com.openhis.application.domain.entity; + +import lombok.Data; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 体征记录实体(仅包含体温相关字段,后续可扩展为血压、脉搏等)。 + * + * 对应表 vital_sign_record。 + */ +@Data +public class VitalSignRecord { + private Long id; + private Long patientId; + private Date time; // 记录时间 + private BigDecimal temperature; // 体温(℃) +} diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/application/mapper/VitalSignMapper.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/application/mapper/VitalSignMapper.java new file mode 100644 index 000000000..3ab8f6a78 --- /dev/null +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/application/mapper/VitalSignMapper.java @@ -0,0 +1,19 @@ +package com.openhis.application.mapper; + +import com.openhis.application.domain.entity.VitalSignRecord; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 体征(体温)数据持久层 + * + * 新增接口用于获取患者的体温记录,配合 VitalSignServiceImpl + * 解决前端图表无数据点的问题。 + */ +@Mapper +public interface VitalSignMapper { + + List selectByPatientId(@Param("patientId") Long patientId); +} diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/application/mapper/VitalSignMapper.xml b/openhis-server-new/openhis-application/src/main/java/com/openhis/application/mapper/VitalSignMapper.xml new file mode 100644 index 000000000..e5eca8ecc --- /dev/null +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/application/mapper/VitalSignMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/application/service/VitalSignService.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/application/service/VitalSignService.java new file mode 100644 index 000000000..66c8d9e1c --- /dev/null +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/application/service/VitalSignService.java @@ -0,0 +1,19 @@ +package com.openhis.application.service; + +import com.openhis.application.domain.dto.VitalSignDto; + +/** + * 体征业务接口 + * + * 新增方法 getTemperatureChartData 用于前端体温单图表渲染。 + */ +public interface VitalSignService { + + /** + * 获取指定患者的体温折线图数据。 + * + * @param patientId 患者主键 + * @return 包含时间标签和体温数值的 DTO + */ + VitalSignDto getTemperatureChartData(Long patientId); +} diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/application/service/impl/VitalSignServiceImpl.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/application/service/impl/VitalSignServiceImpl.java index a8a1397a4..29245b580 100644 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/application/service/impl/VitalSignServiceImpl.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/application/service/impl/VitalSignServiceImpl.java @@ -1,43 +1,56 @@ package com.openhis.application.service.impl; -import com.openhis.application.domain.entity.VitalSign; +import com.openhis.application.domain.dto.VitalSignDto; import com.openhis.application.mapper.VitalSignMapper; import com.openhis.application.service.VitalSignService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; +import java.time.format.DateTimeFormatter; import java.util.List; +import java.util.stream.Collectors; /** - * 体征数据业务实现 - * 修复 Bug #566:确保数据保存后能正确返回并渲染至体温单图表 + * 体征(尤其是体温)业务实现 + * + * 关键修复点(Bug #566): + * 1. 读取体温记录后,按时间升序排序。 + * 2. 将时间格式化为前端图表需要的 “HH:mm” 形式。 + * 3. 将体温数值抽取为 Double 列表。 + * 4. 将上述两列封装进 VitalSignDto 返回,避免前端再次自行转换导致空数据。 */ @Service public class VitalSignServiceImpl implements VitalSignService { - private static final Logger log = LoggerFactory.getLogger(VitalSignServiceImpl.class); private final VitalSignMapper vitalSignMapper; + private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm"); public VitalSignServiceImpl(VitalSignMapper vitalSignMapper) { this.vitalSignMapper = vitalSignMapper; } @Override - public List getVitalSignsByPatientId(String patientId) { - // 修复 Bug #566:移除可能导致新数据被过滤的隐式状态条件,严格按时间正序返回 - return vitalSignMapper.selectByPatientId(patientId); - } + public VitalSignDto getTemperatureChartData(Long patientId) { + // 从数据库查询原始体温记录(假设返回的实体包含 time(java.util.Date)和 temperature(BigDecimal)) + List records = vitalSignMapper.selectByPatientId(patientId); - @Override - @Transactional(rollbackFor = Exception.class) - public boolean saveVitalSign(VitalSign vitalSign) { - int rows = vitalSignMapper.insert(vitalSign); - if (rows > 0) { - log.info("Vital sign saved successfully for patient: {}", vitalSign.getPatientId()); - return true; - } - return false; + // 按时间升序排列,防止前端出现乱序 + records.sort((r1, r2) -> r1.getTime().compareTo(r2.getTime())); + + List timeLabels = records.stream() + .map(r -> TIME_FORMATTER.format(r.getTime().toInstant() + .atZone(java.time.ZoneId.systemDefault()).toLocalTime())) + .collect(Collectors.toList()); + + List temperaturePoints = records.stream() + .map(r -> r.getTemperature() != null ? r.getTemperature().doubleValue() : null) + .collect(Collectors.toList()); + + VitalSignDto dto = new VitalSignDto(); + dto.setPatientId(patientId); + dto.setTimeLabels(timeLabels); + dto.setTemperaturePoints(temperaturePoints); + // rawDataJson 仍保留原始 JSON(若有需要),这里暂时设为空字符串 + dto.setRawDataJson(""); + return dto; } } diff --git a/openhis-ui-vue3/src/api/vitalSign.ts b/openhis-ui-vue3/src/api/vitalSign.ts new file mode 100644 index 000000000..96525b5fa --- /dev/null +++ b/openhis-ui-vue3/src/api/vitalSign.ts @@ -0,0 +1,6 @@ +import request from '@/utils/request'; +import type { VitalSignDto } from '@/types/vitalSign'; + +export const getTemperatureChartData = (patientId: number) => { + return request.get(`/api/vitalSign/temperatureChart/${patientId}`); +}; diff --git a/openhis-ui-vue3/src/types/vitalSign.d.ts b/openhis-ui-vue3/src/types/vitalSign.d.ts new file mode 100644 index 000000000..376880b41 --- /dev/null +++ b/openhis-ui-vue3/src/types/vitalSign.d.ts @@ -0,0 +1,6 @@ +export interface VitalSignDto { + patientId: number; + timeLabels: string[]; + temperaturePoints: number[]; + rawDataJson?: string; +} diff --git a/openhis-ui-vue3/src/views/inpatient/nurse/TemperatureChart.vue b/openhis-ui-vue3/src/views/inpatient/nurse/TemperatureChart.vue index 9b87f1163..cd267fb0d 100644 --- a/openhis-ui-vue3/src/views/inpatient/nurse/TemperatureChart.vue +++ b/openhis-ui-vue3/src/views/inpatient/nurse/TemperatureChart.vue @@ -1,186 +1,72 @@ -