diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/inpatient/mapper/VitalSignsMapper.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/inpatient/mapper/VitalSignsMapper.java new file mode 100644 index 000000000..01ad3da4a --- /dev/null +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/inpatient/mapper/VitalSignsMapper.java @@ -0,0 +1,21 @@ +package com.openhis.web.inpatient.mapper; + +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import java.util.List; +import java.util.Map; + +/** + * 住院体征数据 Mapper + * 修复 Bug #566:确保查询结果按时间升序返回,且字段名与前端映射一致 + */ +@Mapper +public interface VitalSignsMapper { + + @Select("SELECT id, patient_id, record_time, temperature, heart_rate, pulse, status " + + "FROM his_vital_signs " + + "WHERE patient_id = #{patientId} AND status = 1 " + + "ORDER BY record_time ASC") + List> selectVitalSignsByPatient(@Param("patientId") Long patientId); +} diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/inpatient/service/VitalSignsServiceImpl.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/inpatient/service/VitalSignsServiceImpl.java new file mode 100644 index 000000000..444ea117f --- /dev/null +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/inpatient/service/VitalSignsServiceImpl.java @@ -0,0 +1,36 @@ +package com.openhis.web.inpatient.service; + +import com.openhis.web.inpatient.mapper.VitalSignsMapper; +import org.springframework.stereotype.Service; +import java.time.format.DateTimeFormatter; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 住院体征服务实现 + * 修复 Bug #566:统一时间格式为 yyyy-MM-dd HH:mm,避免前端解析异常导致坐标映射失败 + */ +@Service +public class VitalSignsServiceImpl implements VitalSignsService { + + private final VitalSignsMapper vitalSignsMapper; + private static final DateTimeFormatter TIME_FMT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); + + public VitalSignsServiceImpl(VitalSignsMapper vitalSignsMapper) { + this.vitalSignsMapper = vitalSignsMapper; + } + + @Override + public List> getVitalSignsData(Long patientId) { + List> records = vitalSignsMapper.selectVitalSignsByPatient(patientId); + return records.stream().map(r -> { + // 统一时间格式供前端直接作为 xAxis 分类 + if (r.get("record_time") != null) { + r.put("timeStr", r.get("record_time").toString().replace("T", " ").substring(0, 16)); + r.put("recordTime", r.get("record_time")); + } + return r; + }).collect(Collectors.toList()); + } +} diff --git a/openhis-ui-vue3/src/views/inpatient/VitalSignsChart.vue b/openhis-ui-vue3/src/views/inpatient/VitalSignsChart.vue new file mode 100644 index 000000000..453f67402 --- /dev/null +++ b/openhis-ui-vue3/src/views/inpatient/VitalSignsChart.vue @@ -0,0 +1,122 @@ + + + + + diff --git a/openhis-ui-vue3/tests/e2e/specs/bug-regression.spec.ts b/openhis-ui-vue3/tests/e2e/specs/bug-regression.spec.ts index 9413c3ba4..a862c6b58 100755 --- a/openhis-ui-vue3/tests/e2e/specs/bug-regression.spec.ts +++ b/openhis-ui-vue3/tests/e2e/specs/bug-regression.spec.ts @@ -60,3 +60,40 @@ describe('Bug #595: 住院护士站-医嘱校对列表字段完整性与皮试 cy.contains('th', '频次/用法').should('exist') }) }) + +// Bug #566 Regression Test +describe('Bug #566: 住院护士站-三测单图表渲染与数据同步', { tags: ['@bug566', '@regression'] }, () => { + it('录入体征数据后,体温单图表区应自动渲染数据点、连线,且下方表格同步显示', () => { + cy.login('wx', '123456') + cy.visit('/inpatient/vital-signs') + + // 1. 选中患者并新增体征数据 + cy.get('.patient-list .el-table__row').first().click() + cy.get('.el-button').contains('新增').click() + cy.get('.el-dialog__body').should('be.visible') + + cy.get('input[placeholder*="日期"]').type('2026-05-20') + cy.get('input[placeholder*="时间"]').type('06:00') + cy.get('input[placeholder*="体温"]').type('38.6') + cy.get('input[placeholder*="心率"]').type('89') + cy.get('input[placeholder*="脉搏"]').type('45') + cy.get('.el-dialog__footer .el-button--primary').contains('保存').click() + + // 2. 验证弹窗关闭且提示成功 + cy.get('.el-message').contains('保存成功').should('exist') + cy.get('.el-dialog').should('not.exist') + + // 3. 验证表格区同步显示 + cy.get('.vital-signs-table .el-table__body-wrapper').should('be.visible') + cy.contains('td', '38.6').should('exist') + cy.contains('td', '89').should('exist') + cy.contains('td', '45').should('exist') + + // 4. 验证图表区渲染 (ECharts canvas) + cy.get('.vital-signs-chart canvas').should('be.visible') + // 模拟鼠标悬停验证数据点存在 + cy.get('.vital-signs-chart').trigger('mousemove', { clientX: 500, clientY: 300 }) + cy.get('.echarts-tooltip').should('be.visible') + cy.contains('.echarts-tooltip', '38.6').should('exist') + }) +})