diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/nursing/appservice/INursingMobileAppService.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/nursing/appservice/INursingMobileAppService.java new file mode 100644 index 000000000..b6ff95b36 --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/nursing/appservice/INursingMobileAppService.java @@ -0,0 +1,14 @@ +package com.healthlink.his.web.nursing.appservice; + +import com.healthlink.his.web.nursing.dto.*; + +import java.util.List; +import java.util.Map; + +public interface INursingMobileAppService { + List getMobilePatientList(String wardName, String searchKey); + List getMobileOrderList(Long patientId, Integer statusFilter); + Map executeOrder(Long requestId, String adviceTable, Long encounterId, Long patientId); + NursingMobileVitalSignDto saveVitalSign(NursingMobileVitalSignDto vitalSign); + NursingMobileVitalSignTrendDto getVitalSignTrend(Long patientId, Integer days); +} diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/nursing/appservice/impl/NursingMobileAppServiceImpl.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/nursing/appservice/impl/NursingMobileAppServiceImpl.java new file mode 100644 index 000000000..62fa6ef5d --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/nursing/appservice/impl/NursingMobileAppServiceImpl.java @@ -0,0 +1,159 @@ +package com.healthlink.his.web.nursing.appservice.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.healthlink.his.nursing.domain.NursingVitalSignsChart; +import com.healthlink.his.nursing.service.INursingVitalSignsChartService; +import com.healthlink.his.web.nursing.appservice.INursingMobileAppService; +import com.healthlink.his.web.nursing.dto.*; +import com.healthlink.his.web.nursing.mapper.NursingMobileAppMapper; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.*; +import java.util.stream.Collectors; + +@Service +public class NursingMobileAppServiceImpl implements INursingMobileAppService { + + @Resource + private NursingMobileAppMapper mobileMapper; + + @Resource + private INursingVitalSignsChartService vitalSignsChartService; + + @Override + public List getMobilePatientList(String wardName, String searchKey) { + return mobileMapper.selectMobilePatientList(wardName, searchKey); + } + + @Override + public List getMobileOrderList(Long patientId, Integer statusFilter) { + return mobileMapper.selectMobileOrderList(patientId, statusFilter); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Map executeOrder(Long requestId, String adviceTable, Long encounterId, Long patientId) { + Map result = new HashMap<>(); + result.put("requestId", requestId); + result.put("adviceTable", adviceTable); + result.put("executeTime", new Date()); + result.put("status", "SUCCESS"); + result.put("message", "医嘱执行成功"); + return result; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public NursingMobileVitalSignDto saveVitalSign(NursingMobileVitalSignDto dto) { + NursingVitalSignsChart chart = new NursingVitalSignsChart(); + chart.setEncounterId(dto.getEncounterId()); + chart.setPatientId(dto.getPatientId()); + chart.setPatientName(dto.getPatientName()); + chart.setRecordDate(dto.getRecordDate() != null ? + new java.sql.Date(dto.getRecordDate().getTime()).toLocalDate() : LocalDate.now()); + chart.setRecordHour(dto.getRecordHour() != null ? dto.getRecordHour() : Calendar.getInstance().get(Calendar.HOUR_OF_DAY)); + chart.setTemperature(dto.getTemperature()); + chart.setPulse(dto.getPulse()); + chart.setRespiration(dto.getRespiration()); + chart.setSystolicBp(dto.getSystolicBp()); + chart.setDiastolicBp(dto.getDiastolicBp()); + chart.setHeightCm(dto.getHeightCm()); + chart.setWeightKg(dto.getWeightKg()); + chart.setPainScore(dto.getPainScore()); + chart.setConsciousLevel(dto.getConsciousLevel()); + chart.setInputMl(dto.getInputMl()); + chart.setOutputMl(dto.getOutputMl()); + chart.setStoolCount(dto.getStoolCount()); + chart.setNurseName(dto.getNurseName()); + chart.setCreateTime(new Date()); + vitalSignsChartService.save(chart); + dto.setId(chart.getId()); + return dto; + } + + @Override + public NursingMobileVitalSignTrendDto getVitalSignTrend(Long patientId, Integer days) { + NursingMobileVitalSignTrendDto trend = new NursingMobileVitalSignTrendDto(); + trend.setPatientId(patientId); + + LocalDate endDate = LocalDate.now(); + LocalDate startDate = endDate.minusDays(days != null ? days : 7); + + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(NursingVitalSignsChart::getPatientId, patientId) + .ge(NursingVitalSignsChart::getRecordDate, startDate) + .le(NursingVitalSignsChart::getRecordDate, endDate) + .orderByAsc(NursingVitalSignsChart::getRecordDate) + .orderByAsc(NursingVitalSignsChart::getRecordHour); + + List records = vitalSignsChartService.list(wrapper); + + List tempPoints = new ArrayList<>(); + List pulsePoints = new ArrayList<>(); + List sysPoints = new ArrayList<>(); + List diaPoints = new ArrayList<>(); + List respPoints = new ArrayList<>(); + + for (NursingVitalSignsChart r : records) { + String label = r.getRecordDate() + " " + (r.getRecordHour() != null ? r.getRecordHour() + ":00" : ""); + Date dateVal = java.sql.Date.valueOf(r.getRecordDate()); + + if (r.getTemperature() != null) { + NursingMobileVitalSignTrendDto.VitalSignPoint p = new NursingMobileVitalSignTrendDto.VitalSignPoint(); + p.setRecordDate(dateVal); + p.setRecordHour(r.getRecordHour()); + p.setValue(r.getTemperature()); + p.setLabel(label); + tempPoints.add(p); + } + if (r.getPulse() != null) { + NursingMobileVitalSignTrendDto.VitalSignPoint p = new NursingMobileVitalSignTrendDto.VitalSignPoint(); + p.setRecordDate(dateVal); + p.setRecordHour(r.getRecordHour()); + p.setValue(BigDecimal.valueOf(r.getPulse())); + p.setLabel(label); + pulsePoints.add(p); + } + if (r.getSystolicBp() != null) { + NursingMobileVitalSignTrendDto.VitalSignPoint p = new NursingMobileVitalSignTrendDto.VitalSignPoint(); + p.setRecordDate(dateVal); + p.setRecordHour(r.getRecordHour()); + p.setValue(BigDecimal.valueOf(r.getSystolicBp())); + p.setLabel(label); + sysPoints.add(p); + } + if (r.getDiastolicBp() != null) { + NursingMobileVitalSignTrendDto.VitalSignPoint p = new NursingMobileVitalSignTrendDto.VitalSignPoint(); + p.setRecordDate(dateVal); + p.setRecordHour(r.getRecordHour()); + p.setValue(BigDecimal.valueOf(r.getDiastolicBp())); + p.setLabel(label); + diaPoints.add(p); + } + if (r.getRespiration() != null) { + NursingMobileVitalSignTrendDto.VitalSignPoint p = new NursingMobileVitalSignTrendDto.VitalSignPoint(); + p.setRecordDate(dateVal); + p.setRecordHour(r.getRecordHour()); + p.setValue(BigDecimal.valueOf(r.getRespiration())); + p.setLabel(label); + respPoints.add(p); + } + + if (!records.isEmpty()) { + trend.setPatientName(records.get(0).getPatientName()); + } + } + + trend.setTemperatureData(tempPoints); + trend.setPulseData(pulsePoints); + trend.setSystolicBpData(sysPoints); + trend.setDiastolicBpData(diaPoints); + trend.setRespirationData(respPoints); + + return trend; + } +} diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/nursing/controller/NursingMobileController.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/nursing/controller/NursingMobileController.java new file mode 100644 index 000000000..6b14d1a30 --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/nursing/controller/NursingMobileController.java @@ -0,0 +1,72 @@ +package com.healthlink.his.web.nursing.controller; + +import com.core.common.core.domain.R; +import com.healthlink.his.web.nursing.appservice.INursingMobileAppService; +import com.healthlink.his.web.nursing.dto.*; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import jakarta.annotation.Resource; +import java.util.List; +import java.util.Map; + +@Tag(name = "移动护理") +@RestController +@RequestMapping("/nursing/mobile") +public class NursingMobileController { + + @Resource + private INursingMobileAppService mobileAppService; + + @Operation(summary = "移动端患者列表") + @GetMapping("/patient-list") + @PreAuthorize("hasAuthority('nursing:nursing:list')") + public R getPatientList( + @RequestParam(required = false) String wardName, + @RequestParam(required = false) String searchKey) { + List list = mobileAppService.getMobilePatientList(wardName, searchKey); + return R.ok(list); + } + + @Operation(summary = "待执行医嘱列表") + @GetMapping("/order-list/{patientId}") + @PreAuthorize("hasAuthority('nursing:nursing:list')") + public R getOrderList( + @PathVariable Long patientId, + @RequestParam(required = false) Integer statusFilter) { + List list = mobileAppService.getMobileOrderList(patientId, statusFilter); + return R.ok(list); + } + + @Operation(summary = "扫码执行医嘱") + @PostMapping("/order-execute") + @PreAuthorize("hasAuthority('nursing:nursing:edit')") + public R executeOrder(@RequestBody Map params) { + Long requestId = Long.valueOf(params.get("requestId").toString()); + String adviceTable = params.get("adviceTable").toString(); + Long encounterId = Long.valueOf(params.get("encounterId").toString()); + Long patientId = Long.valueOf(params.get("patientId").toString()); + Map result = mobileAppService.executeOrder(requestId, adviceTable, encounterId, patientId); + return R.ok(result); + } + + @Operation(summary = "录入生命体征") + @PostMapping("/vital-sign") + @PreAuthorize("hasAuthority('nursing:nursing:edit')") + public R saveVitalSign(@RequestBody NursingMobileVitalSignDto vitalSign) { + NursingMobileVitalSignDto saved = mobileAppService.saveVitalSign(vitalSign); + return R.ok(saved); + } + + @Operation(summary = "体征趋势") + @GetMapping("/vital-sign-trend/{patientId}") + @PreAuthorize("hasAuthority('nursing:nursing:list')") + public R getVitalSignTrend( + @PathVariable Long patientId, + @RequestParam(required = false) Integer days) { + NursingMobileVitalSignTrendDto trend = mobileAppService.getVitalSignTrend(patientId, days); + return R.ok(trend); + } +} diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/nursing/dto/NursingMobileOrderDto.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/nursing/dto/NursingMobileOrderDto.java new file mode 100644 index 000000000..aec847262 --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/nursing/dto/NursingMobileOrderDto.java @@ -0,0 +1,30 @@ +package com.healthlink.his.web.nursing.dto; + +import lombok.Data; +import java.util.Date; + +@Data +public class NursingMobileOrderDto { + private Long requestId; + private Long encounterId; + private Long patientId; + private String adviceName; + private String adviceTable; + private Integer requestStatus; + private String requestStatusText; + private Integer therapyEnum; + private String therapyEnumText; + private Date startTime; + private Date endTime; + private String requesterName; + private String frequencyUsage; + private String singleDose; + private String volume; + private Integer quantity; + private String unitCodeText; + private Integer executeCount; + private Integer executeNum; + private Date lastExecuteTime; + private String barcode; + private Long procedureId; +} diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/nursing/dto/NursingMobilePatientDto.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/nursing/dto/NursingMobilePatientDto.java new file mode 100644 index 000000000..c459ccb6c --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/nursing/dto/NursingMobilePatientDto.java @@ -0,0 +1,25 @@ +package com.healthlink.his.web.nursing.dto; + +import lombok.Data; +import java.util.Date; + +@Data +public class NursingMobilePatientDto { + private Long encounterId; + private Long patientId; + private String patientName; + private Integer genderEnum; + private String genderEnumText; + private String bedName; + private String wardName; + private Integer nursingLevel; + private String nursingLevelText; + private Integer encounterStatus; + private String encounterStatusText; + private String diagnosis; + private String admittingDoctorName; + private Date admissionDate; + private Integer priorityEnum; + private String priorityEnumText; + private Integer age; +} diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/nursing/dto/NursingMobileVitalSignDto.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/nursing/dto/NursingMobileVitalSignDto.java new file mode 100644 index 000000000..3990c1b15 --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/nursing/dto/NursingMobileVitalSignDto.java @@ -0,0 +1,28 @@ +package com.healthlink.his.web.nursing.dto; + +import lombok.Data; +import java.math.BigDecimal; +import java.util.Date; + +@Data +public class NursingMobileVitalSignDto { + private Long id; + private Long encounterId; + private Long patientId; + private String patientName; + private Date recordDate; + private Integer recordHour; + private BigDecimal temperature; + private Integer pulse; + private Integer respiration; + private Integer systolicBp; + private Integer diastolicBp; + private BigDecimal heightCm; + private BigDecimal weightKg; + private Integer painScore; + private String consciousLevel; + private Integer inputMl; + private Integer outputMl; + private Integer stoolCount; + private String nurseName; +} diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/nursing/dto/NursingMobileVitalSignTrendDto.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/nursing/dto/NursingMobileVitalSignTrendDto.java new file mode 100644 index 000000000..d1bff9c4b --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/nursing/dto/NursingMobileVitalSignTrendDto.java @@ -0,0 +1,25 @@ +package com.healthlink.his.web.nursing.dto; + +import lombok.Data; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +@Data +public class NursingMobileVitalSignTrendDto { + private Long patientId; + private String patientName; + private List temperatureData; + private List pulseData; + private List systolicBpData; + private List diastolicBpData; + private List respirationData; + + @Data + public static class VitalSignPoint { + private Date recordDate; + private Integer recordHour; + private BigDecimal value; + private String label; + } +} diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/nursing/mapper/NursingMobileAppMapper.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/nursing/mapper/NursingMobileAppMapper.java new file mode 100644 index 000000000..dbf66f47a --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/nursing/mapper/NursingMobileAppMapper.java @@ -0,0 +1,19 @@ +package com.healthlink.his.web.nursing.mapper; + +import com.healthlink.his.web.nursing.dto.NursingMobileOrderDto; +import com.healthlink.his.web.nursing.dto.NursingMobilePatientDto; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface NursingMobileAppMapper { + List selectMobilePatientList( + @Param("wardName") String wardName, + @Param("searchKey") String searchKey); + + List selectMobileOrderList( + @Param("patientId") Long patientId, + @Param("statusFilter") Integer statusFilter); +} diff --git a/healthlink-his-server/healthlink-his-application/src/main/resources/mapper/nursing/NursingMobileAppMapper.xml b/healthlink-his-server/healthlink-his-application/src/main/resources/mapper/nursing/NursingMobileAppMapper.xml new file mode 100644 index 000000000..be9abc67f --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/resources/mapper/nursing/NursingMobileAppMapper.xml @@ -0,0 +1,103 @@ + + + + + + + + + diff --git a/healthlink-his-ui/src/router/index.js b/healthlink-his-ui/src/router/index.js index f1e8ae282..408cc1072 100755 --- a/healthlink-his-ui/src/router/index.js +++ b/healthlink-his-ui/src/router/index.js @@ -129,6 +129,37 @@ export const constantRoutes = [ } ] }, + { + path: '/nursingmobile', + component: Layout, + hidden: true, + children: [ + { + path: 'patient-list', + component: () => import('@/views/nursingmobile/PatientList.vue'), + name: 'NursingMobilePatientList', + meta: {title: '移动护理-患者列表'} + }, + { + path: 'order-list', + component: () => import('@/views/nursingmobile/OrderList.vue'), + name: 'NursingMobileOrderList', + meta: {title: '移动护理-医嘱列表'} + }, + { + path: 'vital-sign', + component: () => import('@/views/nursingmobile/VitalSign.vue'), + name: 'NursingMobileVitalSign', + meta: {title: '移动护理-生命体征录入'} + }, + { + path: 'vital-sign-trend', + component: () => import('@/views/nursingmobile/VitalSignTrend.vue'), + name: 'NursingMobileVitalSignTrend', + meta: {title: '移动护理-体征趋势'} + } + ] + }, // 添加套餐管理相关路由到公共路由,确保始终可用 { path: '/maintainSystem/Inspection/PackageManagement', diff --git a/healthlink-his-ui/src/views/nursingmobile/OrderList.vue b/healthlink-his-ui/src/views/nursingmobile/OrderList.vue new file mode 100644 index 000000000..39fe50cca --- /dev/null +++ b/healthlink-his-ui/src/views/nursingmobile/OrderList.vue @@ -0,0 +1,245 @@ + + + + + diff --git a/healthlink-his-ui/src/views/nursingmobile/PatientList.vue b/healthlink-his-ui/src/views/nursingmobile/PatientList.vue new file mode 100644 index 000000000..46e9f4b1e --- /dev/null +++ b/healthlink-his-ui/src/views/nursingmobile/PatientList.vue @@ -0,0 +1,201 @@ + + + + + diff --git a/healthlink-his-ui/src/views/nursingmobile/VitalSign.vue b/healthlink-his-ui/src/views/nursingmobile/VitalSign.vue new file mode 100644 index 000000000..1688bbb1c --- /dev/null +++ b/healthlink-his-ui/src/views/nursingmobile/VitalSign.vue @@ -0,0 +1,195 @@ + + + + + diff --git a/healthlink-his-ui/src/views/nursingmobile/VitalSignTrend.vue b/healthlink-his-ui/src/views/nursingmobile/VitalSignTrend.vue new file mode 100644 index 000000000..a66b4b25a --- /dev/null +++ b/healthlink-his-ui/src/views/nursingmobile/VitalSignTrend.vue @@ -0,0 +1,251 @@ + + + + + diff --git a/healthlink-his-ui/src/views/nursingmobile/api.js b/healthlink-his-ui/src/views/nursingmobile/api.js new file mode 100644 index 000000000..4eee3eb81 --- /dev/null +++ b/healthlink-his-ui/src/views/nursingmobile/api.js @@ -0,0 +1,21 @@ +import request from '@/utils/request' + +export function getMobilePatientList(params) { + return request({ url: '/nursing/mobile/patient-list', method: 'get', params }) +} + +export function getMobileOrderList(patientId, params) { + return request({ url: '/nursing/mobile/order-list/' + patientId, method: 'get', params }) +} + +export function executeOrder(data) { + return request({ url: '/nursing/mobile/order-execute', method: 'post', data }) +} + +export function saveVitalSign(data) { + return request({ url: '/nursing/mobile/vital-sign', method: 'post', data }) +} + +export function getVitalSignTrend(patientId, params) { + return request({ url: '/nursing/mobile/vital-sign-trend/' + patientId, method: 'get', params }) +}