diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/bloodtransfusion/appservice/IBloodTransfusionAppService.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/bloodtransfusion/appservice/IBloodTransfusionAppService.java new file mode 100644 index 000000000..7595d664d --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/bloodtransfusion/appservice/IBloodTransfusionAppService.java @@ -0,0 +1,12 @@ +package com.healthlink.his.web.bloodtransfusion.appservice; +import com.healthlink.his.bloodtransfusion.domain.BloodTransfusionRecord; +import com.healthlink.his.bloodtransfusion.domain.BloodTransfusionObservation; +import com.baomidou.mybatisplus.core.metadata.IPage; +import java.util.Map; +public interface IBloodTransfusionAppService { + void apply(BloodTransfusionRecord record); + IPage page(String patientName, String approvalStatus, String bloodComponent, Integer pageNum, Integer pageSize); + void approve(Long id, String approvalStatus, String approverName, String remark); + void observe(BloodTransfusionObservation observation); + Map getRecordDetail(Long id); +} diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/bloodtransfusion/appservice/impl/BloodTransfusionAppServiceImpl.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/bloodtransfusion/appservice/impl/BloodTransfusionAppServiceImpl.java new file mode 100644 index 000000000..108667ef9 --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/bloodtransfusion/appservice/impl/BloodTransfusionAppServiceImpl.java @@ -0,0 +1,78 @@ +package com.healthlink.his.web.bloodtransfusion.appservice.impl; +import com.healthlink.his.bloodtransfusion.domain.BloodTransfusionRecord; +import com.healthlink.his.bloodtransfusion.domain.BloodTransfusionObservation; +import com.healthlink.his.bloodtransfusion.service.IBloodTransfusionRecordService; +import com.healthlink.his.bloodtransfusion.service.IBloodTransfusionObservationService; +import com.healthlink.his.web.bloodtransfusion.appservice.IBloodTransfusionAppService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import java.util.*; +@Service +public class BloodTransfusionAppServiceImpl implements IBloodTransfusionAppService { + @Autowired + private IBloodTransfusionRecordService recordService; + @Autowired + private IBloodTransfusionObservationService observationService; + @Override + public void apply(BloodTransfusionRecord record) { + record.setStatus("SUBMITTED"); + record.setApprovalStatus("PENDING"); + record.setCreateTime(new Date()); + recordService.save(record); + } + @Override + public IPage page(String patientName, String approvalStatus, String bloodComponent, Integer pageNum, Integer pageSize) { + LambdaQueryWrapper w = new LambdaQueryWrapper<>(); + if (patientName != null && !patientName.isEmpty()) { + w.like(BloodTransfusionRecord::getDoctorName, patientName); + } + if (approvalStatus != null && !approvalStatus.isEmpty()) { + w.eq(BloodTransfusionRecord::getApprovalStatus, approvalStatus); + } + if (bloodComponent != null && !bloodComponent.isEmpty()) { + w.eq(BloodTransfusionRecord::getBloodComponent, bloodComponent); + } + w.orderByDesc(BloodTransfusionRecord::getCreateTime); + return recordService.page(new com.baomidou.mybatisplus.extension.plugins.pagination.Page<>(pageNum, pageSize), w); + } + @Override + public void approve(Long id, String approvalStatus, String approverName, String remark) { + BloodTransfusionRecord record = recordService.getById(id); + if (record == null) { + throw new RuntimeException("输血记录不存在"); + } + record.setApprovalStatus(approvalStatus); + record.setApproverName(approverName); + record.setApproveTime(new Date()); + if ("APPROVED".equals(approvalStatus)) { + record.setStatus("APPROVED"); + } else if ("REJECTED".equals(approvalStatus)) { + record.setStatus("REJECTED"); + } + recordService.updateById(record); + } + @Override + public void observe(BloodTransfusionObservation observation) { + observation.setCreateTime(new Date()); + observationService.save(observation); + } + @Override + public Map getRecordDetail(Long id) { + Map result = new LinkedHashMap<>(); + BloodTransfusionRecord record = recordService.getById(id); + if (record == null) { + result.put("error", "记录不存在"); + return result; + } + result.put("record", record); + List observations = observationService.list( + new LambdaQueryWrapper() + .eq(BloodTransfusionObservation::getRecordId, id) + .orderByAsc(BloodTransfusionObservation::getObservationTime) + ); + result.put("observations", observations); + return result; + } +} diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/bloodtransfusion/controller/BloodTransfusionController.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/bloodtransfusion/controller/BloodTransfusionController.java new file mode 100644 index 000000000..4a9352b42 --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/bloodtransfusion/controller/BloodTransfusionController.java @@ -0,0 +1,55 @@ +package com.healthlink.his.web.bloodtransfusion.controller; +import com.core.common.core.domain.AjaxResult; +import com.healthlink.his.bloodtransfusion.domain.BloodTransfusionRecord; +import com.healthlink.his.bloodtransfusion.domain.BloodTransfusionObservation; +import com.healthlink.his.web.bloodtransfusion.appservice.IBloodTransfusionAppService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; +@Tag(name = "输血管理") @RestController @RequestMapping("/api/v1/blood-transfusion") +public class BloodTransfusionController { + @Autowired + private IBloodTransfusionAppService appService; + @Operation(summary = "申请输血") + @PreAuthorize("@ss.hasPermi('inpatient:bloodtransfusion:edit')") + @PostMapping("/apply") + public AjaxResult apply(@RequestBody BloodTransfusionRecord record) { + appService.apply(record); + return AjaxResult.success(); + } + @Operation(summary = "输血申请分页") + @PreAuthorize("@ss.hasPermi('inpatient:bloodtransfusion:list')") + @GetMapping("/page") + public AjaxResult page(@RequestParam(required = false) String patientName, + @RequestParam(required = false) String approvalStatus, + @RequestParam(required = false) String bloodComponent, + @RequestParam(defaultValue = "1") Integer pageNum, + @RequestParam(defaultValue = "10") Integer pageSize) { + return AjaxResult.success(appService.page(patientName, approvalStatus, bloodComponent, pageNum, pageSize)); + } + @Operation(summary = "审批输血") + @PreAuthorize("@ss.hasPermi('inpatient:bloodtransfusion:edit')") + @PutMapping("/approve/{id}") + public AjaxResult approve(@PathVariable Long id, + @RequestParam String approvalStatus, + @RequestParam(required = false) String approverName, + @RequestParam(required = false) String remark) { + appService.approve(id, approvalStatus, approverName, remark); + return AjaxResult.success(); + } + @Operation(summary = "输血观察记录") + @PreAuthorize("@ss.hasPermi('inpatient:bloodtransfusion:edit')") + @PostMapping("/observe") + public AjaxResult observe(@RequestBody BloodTransfusionObservation observation) { + appService.observe(observation); + return AjaxResult.success(); + } + @Operation(summary = "输血记录详情") + @PreAuthorize("@ss.hasPermi('inpatient:bloodtransfusion:list')") + @GetMapping("/record/{id}") + public AjaxResult recordDetail(@PathVariable Long id) { + return AjaxResult.success(appService.getRecordDetail(id)); + } +} diff --git a/healthlink-his-server/healthlink-his-application/src/main/resources/db/migration/V2026_0618__blood_transfusion.sql b/healthlink-his-server/healthlink-his-application/src/main/resources/db/migration/V2026_0618__blood_transfusion.sql new file mode 100644 index 000000000..9fbf67378 --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/resources/db/migration/V2026_0618__blood_transfusion.sql @@ -0,0 +1,51 @@ +CREATE TABLE blood_transfusion_record ( + id BIGSERIAL PRIMARY KEY, + encounter_id BIGINT NOT NULL, + patient_id BIGINT NOT NULL, + advice_id BIGINT, + blood_type VARCHAR(10), + blood_component VARCHAR(50) NOT NULL, + blood_volume DECIMAL(10,2), + blood_unit VARCHAR(50), + cross_match_result VARCHAR(20), + indication TEXT, + doctor_id BIGINT NOT NULL, + doctor_name VARCHAR(50), + approval_status VARCHAR(20) DEFAULT 'PENDING', + approver_id BIGINT, + approver_name VARCHAR(50), + approve_time TIMESTAMP, + transfusion_start_time TIMESTAMP, + transfusion_end_time TIMESTAMP, + transfusion_nurse_id BIGINT, + transfusion_nurse_name VARCHAR(50), + pre_vital_signs TEXT, + during_vital_signs TEXT, + post_vital_signs TEXT, + adverse_reaction TEXT, + adverse_reaction_type VARCHAR(50), + status VARCHAR(20) DEFAULT 'DRAFT', + del_flag CHAR(1) DEFAULT '0', + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + create_by VARCHAR(64), + update_time TIMESTAMP, + update_by VARCHAR(64) +); + +CREATE TABLE blood_transfusion_observation ( + id BIGSERIAL PRIMARY KEY, + record_id BIGINT NOT NULL, + observation_time TIMESTAMP NOT NULL, + observation_phase VARCHAR(20), + temperature DECIMAL(4,1), + pulse INTEGER, + respiration INTEGER, + blood_pressure_high INTEGER, + blood_pressure_low INTEGER, + symptoms TEXT, + nurse_id BIGINT, + nurse_name VARCHAR(50), + del_flag CHAR(1) DEFAULT '0', + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + create_by VARCHAR(64) +); diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/bloodtransfusion/domain/BloodTransfusionObservation.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/bloodtransfusion/domain/BloodTransfusionObservation.java new file mode 100644 index 000000000..456b72d9a --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/bloodtransfusion/domain/BloodTransfusionObservation.java @@ -0,0 +1,30 @@ +package com.healthlink.his.bloodtransfusion.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 tools.jackson.databind.annotation.JsonSerialize; +import tools.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.math.BigDecimal; +import java.util.Date; +@Data +@TableName("blood_transfusion_observation") +@EqualsAndHashCode(callSuper = true) +public class BloodTransfusionObservation extends HisBaseEntity { + @TableId(type = IdType.ASSIGN_ID) + @JsonSerialize(using = ToStringSerializer.class) + private Long id; + private Long recordId; + private Date observationTime; + private String observationPhase; + private BigDecimal temperature; + private Integer pulse; + private Integer respiration; + private Integer bloodPressureHigh; + private Integer bloodPressureLow; + private String symptoms; + private Long nurseId; + private String nurseName; +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/bloodtransfusion/domain/BloodTransfusionRecord.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/bloodtransfusion/domain/BloodTransfusionRecord.java new file mode 100644 index 000000000..633699a84 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/bloodtransfusion/domain/BloodTransfusionRecord.java @@ -0,0 +1,44 @@ +package com.healthlink.his.bloodtransfusion.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 tools.jackson.databind.annotation.JsonSerialize; +import tools.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.math.BigDecimal; +import java.util.Date; +@Data +@TableName("blood_transfusion_record") +@EqualsAndHashCode(callSuper = true) +public class BloodTransfusionRecord extends HisBaseEntity { + @TableId(type = IdType.ASSIGN_ID) + @JsonSerialize(using = ToStringSerializer.class) + private Long id; + private Long encounterId; + private Long patientId; + private Long adviceId; + private String bloodType; + private String bloodComponent; + private BigDecimal bloodVolume; + private String bloodUnit; + private String crossMatchResult; + private String indication; + private Long doctorId; + private String doctorName; + private String approvalStatus; + private Long approverId; + private String approverName; + private Date approveTime; + private Date transfusionStartTime; + private Date transfusionEndTime; + private Long transfusionNurseId; + private String transfusionNurseName; + private String preVitalSigns; + private String duringVitalSigns; + private String postVitalSigns; + private String adverseReaction; + private String adverseReactionType; + private String status; +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/bloodtransfusion/mapper/BloodTransfusionObservationMapper.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/bloodtransfusion/mapper/BloodTransfusionObservationMapper.java new file mode 100644 index 000000000..0c9e70838 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/bloodtransfusion/mapper/BloodTransfusionObservationMapper.java @@ -0,0 +1,7 @@ +package com.healthlink.his.bloodtransfusion.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.healthlink.his.bloodtransfusion.domain.BloodTransfusionObservation; +import org.apache.ibatis.annotations.Mapper; +@Mapper +public interface BloodTransfusionObservationMapper extends BaseMapper { +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/bloodtransfusion/mapper/BloodTransfusionRecordMapper.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/bloodtransfusion/mapper/BloodTransfusionRecordMapper.java new file mode 100644 index 000000000..b042d4ce9 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/bloodtransfusion/mapper/BloodTransfusionRecordMapper.java @@ -0,0 +1,7 @@ +package com.healthlink.his.bloodtransfusion.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.healthlink.his.bloodtransfusion.domain.BloodTransfusionRecord; +import org.apache.ibatis.annotations.Mapper; +@Mapper +public interface BloodTransfusionRecordMapper extends BaseMapper { +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/bloodtransfusion/service/IBloodTransfusionObservationService.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/bloodtransfusion/service/IBloodTransfusionObservationService.java new file mode 100644 index 000000000..2d9a1b8c8 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/bloodtransfusion/service/IBloodTransfusionObservationService.java @@ -0,0 +1,5 @@ +package com.healthlink.his.bloodtransfusion.service; +import com.baomidou.mybatisplus.extension.service.IService; +import com.healthlink.his.bloodtransfusion.domain.BloodTransfusionObservation; +public interface IBloodTransfusionObservationService extends IService { +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/bloodtransfusion/service/IBloodTransfusionRecordService.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/bloodtransfusion/service/IBloodTransfusionRecordService.java new file mode 100644 index 000000000..fc23ee19b --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/bloodtransfusion/service/IBloodTransfusionRecordService.java @@ -0,0 +1,5 @@ +package com.healthlink.his.bloodtransfusion.service; +import com.baomidou.mybatisplus.extension.service.IService; +import com.healthlink.his.bloodtransfusion.domain.BloodTransfusionRecord; +public interface IBloodTransfusionRecordService extends IService { +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/bloodtransfusion/service/impl/BloodTransfusionObservationServiceImpl.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/bloodtransfusion/service/impl/BloodTransfusionObservationServiceImpl.java new file mode 100644 index 000000000..65b89c731 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/bloodtransfusion/service/impl/BloodTransfusionObservationServiceImpl.java @@ -0,0 +1,9 @@ +package com.healthlink.his.bloodtransfusion.service.impl; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.healthlink.his.bloodtransfusion.domain.BloodTransfusionObservation; +import com.healthlink.his.bloodtransfusion.mapper.BloodTransfusionObservationMapper; +import com.healthlink.his.bloodtransfusion.service.IBloodTransfusionObservationService; +import org.springframework.stereotype.Service; +@Service +public class BloodTransfusionObservationServiceImpl extends ServiceImpl implements IBloodTransfusionObservationService { +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/bloodtransfusion/service/impl/BloodTransfusionRecordServiceImpl.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/bloodtransfusion/service/impl/BloodTransfusionRecordServiceImpl.java new file mode 100644 index 000000000..ac9395acd --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/bloodtransfusion/service/impl/BloodTransfusionRecordServiceImpl.java @@ -0,0 +1,9 @@ +package com.healthlink.his.bloodtransfusion.service.impl; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.healthlink.his.bloodtransfusion.domain.BloodTransfusionRecord; +import com.healthlink.his.bloodtransfusion.mapper.BloodTransfusionRecordMapper; +import com.healthlink.his.bloodtransfusion.service.IBloodTransfusionRecordService; +import org.springframework.stereotype.Service; +@Service +public class BloodTransfusionRecordServiceImpl extends ServiceImpl implements IBloodTransfusionRecordService { +} diff --git a/healthlink-his-ui/src/api/bloodtransfusion/index.js b/healthlink-his-ui/src/api/bloodtransfusion/index.js new file mode 100644 index 000000000..21e8c493f --- /dev/null +++ b/healthlink-his-ui/src/api/bloodtransfusion/index.js @@ -0,0 +1,40 @@ +import request from '@/utils/request' + +export function applyBloodTransfusion(data) { + return request({ + url: '/api/v1/blood-transfusion/apply', + method: 'post', + data: data + }) +} + +export function getBloodTransfusionPage(params) { + return request({ + url: '/api/v1/blood-transfusion/page', + method: 'get', + params: params + }) +} + +export function approveBloodTransfusion(id, params) { + return request({ + url: '/api/v1/blood-transfusion/approve/' + id, + method: 'put', + params: params + }) +} + +export function addObservation(data) { + return request({ + url: '/api/v1/blood-transfusion/observe', + method: 'post', + data: data + }) +} + +export function getRecordDetail(id) { + return request({ + url: '/api/v1/blood-transfusion/record/' + id, + method: 'get' + }) +} diff --git a/healthlink-his-ui/src/views/inpatientDoctor/BloodTransfusion.vue b/healthlink-his-ui/src/views/inpatientDoctor/BloodTransfusion.vue new file mode 100644 index 000000000..daa6f52f7 --- /dev/null +++ b/healthlink-his-ui/src/views/inpatientDoctor/BloodTransfusion.vue @@ -0,0 +1,464 @@ + + + + +