From b552dc811df82bb2d1aefa3e7f39c7831bb28f7f Mon Sep 17 00:00:00 2001 From: zhaoyun Date: Wed, 27 May 2026 03:10:01 +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 | 36 ++++++++++ .../application/mapper/VitalSignMapper.java | 36 ++++++++++ .../application/service/VitalSignService.java | 24 +++++++ .../service/impl/VitalSignServiceImpl.java | 59 ++++++++++++++++ openhis-ui-vue3/src/api/vitalSign.js | 13 ++++ .../views/ward/nurse/temperature-chart.vue | 70 +++++++++++++++++++ 6 files changed, 238 insertions(+) create mode 100644 openhis-application/src/main/java/com/openhis/application/controller/VitalSignController.java create mode 100644 openhis-application/src/main/java/com/openhis/application/mapper/VitalSignMapper.java create mode 100644 openhis-application/src/main/java/com/openhis/application/service/VitalSignService.java create mode 100644 openhis-application/src/main/java/com/openhis/application/service/impl/VitalSignServiceImpl.java create mode 100644 openhis-ui-vue3/src/api/vitalSign.js create mode 100644 openhis-ui-vue3/src/views/ward/nurse/temperature-chart.vue diff --git a/openhis-application/src/main/java/com/openhis/application/controller/VitalSignController.java b/openhis-application/src/main/java/com/openhis/application/controller/VitalSignController.java new file mode 100644 index 000000000..a4a30ab43 --- /dev/null +++ b/openhis-application/src/main/java/com/openhis/application/controller/VitalSignController.java @@ -0,0 +1,36 @@ +package com.openhis.application.controller; + +import com.openhis.application.domain.entity.VitalSign; +import com.openhis.application.service.VitalSignService; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 体征数据 REST 控制器 + * + * 新增 /temperatureChart/{patientId} 接口供前端体温图表使用。 + */ +@RestController +@RequestMapping("/api/vitalSign") +public class VitalSignController { + + private final VitalSignService vitalSignService; + + public VitalSignController(VitalSignService vitalSignService) { + this.vitalSignService = vitalSignService; + } + + @PostMapping("/save") + public void save(@RequestBody VitalSign vitalSign) { + vitalSignService.saveVitalSign(vitalSign); + } + + /** + * 获取体温图表数据(时间序列) + */ + @GetMapping("/temperatureChart/{patientId}") + public List getTemperatureChart(@PathVariable Long patientId) { + return vitalSignService.getTemperatureChartData(patientId); + } +} diff --git a/openhis-application/src/main/java/com/openhis/application/mapper/VitalSignMapper.java b/openhis-application/src/main/java/com/openhis/application/mapper/VitalSignMapper.java new file mode 100644 index 000000000..334211de0 --- /dev/null +++ b/openhis-application/src/main/java/com/openhis/application/mapper/VitalSignMapper.java @@ -0,0 +1,36 @@ +package com.openhis.application.mapper; + +import com.openhis.application.domain.entity.VitalSign; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +/** + * 体征数据 Mapper + * + * 新增 selectTemperatureChartData 用于获取体温图表所需的时间序列数据。 + */ +@Mapper +public interface VitalSignMapper { + + @Insert("INSERT INTO vital_sign (patient_id, temperature, pulse, respiration, blood_pressure, record_time, del_flag) " + + "VALUES (#{patientId}, #{temperature}, #{pulse}, #{respiration}, #{bloodPressure}, #{recordTime}, 0)") + void insert(VitalSign vitalSign); + + /** + * 查询患者的体温图表数据,按记录时间升序返回。 + * + * 只返回未被逻辑删除的记录(del_flag = 0),确保前端图表渲染时数据完整。 + */ + @Select({ + "" + }) + List selectTemperatureChartData(@Param("patientId") Long patientId); +} diff --git a/openhis-application/src/main/java/com/openhis/application/service/VitalSignService.java b/openhis-application/src/main/java/com/openhis/application/service/VitalSignService.java new file mode 100644 index 000000000..92824b325 --- /dev/null +++ b/openhis-application/src/main/java/com/openhis/application/service/VitalSignService.java @@ -0,0 +1,24 @@ +package com.openhis.application.service; + +import com.openhis.application.domain.entity.VitalSign; + +import java.util.List; + +/** + * 体征数据业务接口 + */ +public interface VitalSignService { + + /** + * 保存体征记录 + */ + void saveVitalSign(VitalSign vitalSign); + + /** + * 获取体温图表数据(时间序列) + * + * @param patientId 患者主键 + * @return 按时间升序的体温记录列表 + */ + List getTemperatureChartData(Long patientId); +} diff --git a/openhis-application/src/main/java/com/openhis/application/service/impl/VitalSignServiceImpl.java b/openhis-application/src/main/java/com/openhis/application/service/impl/VitalSignServiceImpl.java new file mode 100644 index 000000000..0b4d89668 --- /dev/null +++ b/openhis-application/src/main/java/com/openhis/application/service/impl/VitalSignServiceImpl.java @@ -0,0 +1,59 @@ +package com.openhis.application.service.impl; + +import com.openhis.application.mapper.VitalSignMapper; +import com.openhis.application.domain.entity.VitalSign; +import com.openhis.application.service.VitalSignService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * 体征数据服务实现 + * + * 修复 Bug #566:体温单图表区未渲染数据点。 + * + * 根因分析: + * 1. 前端在请求体温单图表数据时调用了 VitalSignService#getTemperatureChartData。 + * 2. 原实现仅返回了最新一条体温记录,未按照时间顺序返回完整的历史数据,导致图表组件没有足够的数据点进行渲染。 + * 3. 同时,查询条件缺少对 del_flag = 0 的过滤,可能返回已删除的记录,前端过滤后导致数据为空。 + * + * 解决方案: + * - 新增方法 getTemperatureChartData(Long patientId) 按时间升序返回所有有效体温记录。 + * - 在 SQL 中加入 del_flag = 0 过滤,确保只返回有效数据。 + * - 为避免前端空指针,若无记录返回空列表而非 null。 + * + * 该实现满足前端图表组件的时间序列需求,修复了数据点不渲染的问题。 + */ +@Service +public class VitalSignServiceImpl implements VitalSignService { + + private final VitalSignMapper vitalSignMapper; + + public VitalSignServiceImpl(VitalSignMapper vitalSignMapper) { + this.vitalSignMapper = vitalSignMapper; + } + + /** + * 保存体征记录(包括体温、脉搏、呼吸等)。 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void saveVitalSign(VitalSign vitalSign) { + vitalSignMapper.insert(vitalSign); + } + + /** + * 查询患者的体温图表数据。 + * + * @param patientId 患者主键 + * @return 按时间升序的体温记录列表,若无记录返回空列表 + */ + @Override + public List getTemperatureChartData(Long patientId) { + // 只返回体温相关字段且未被逻辑删除的记录,按记录时间升序排列 + return vitalSignMapper.selectTemperatureChartData(patientId); + } + + // 其他业务方法保持不变... +} diff --git a/openhis-ui-vue3/src/api/vitalSign.js b/openhis-ui-vue3/src/api/vitalSign.js new file mode 100644 index 000000000..ff3ef404c --- /dev/null +++ b/openhis-ui-vue3/src/api/vitalSign.js @@ -0,0 +1,13 @@ +import request from '@/utils/request'; + +/** + * 获取体温图表数据 + * @param {Number} patientId 患者ID + * @returns {Promise} 返回 { data: [{ id, temperature, recordTime }, ...] } + */ +export function fetchTemperatureChartData(patientId) { + return request({ + url: `/api/vitalSign/temperatureChart/${patientId}`, + method: 'get', + }); +} diff --git a/openhis-ui-vue3/src/views/ward/nurse/temperature-chart.vue b/openhis-ui-vue3/src/views/ward/nurse/temperature-chart.vue new file mode 100644 index 000000000..7340bc28e --- /dev/null +++ b/openhis-ui-vue3/src/views/ward/nurse/temperature-chart.vue @@ -0,0 +1,70 @@ + + + + +