后端最新版本同步

This commit is contained in:
Zhang.WH
2025-09-25 10:43:25 +08:00
parent 1276dc4adb
commit c8014404f1
355 changed files with 10070 additions and 5578 deletions

View File

@@ -10,6 +10,7 @@ import javax.servlet.http.HttpServletRequest;
import com.core.common.core.domain.R;
import com.openhis.web.common.dto.PerformInfoDto;
import com.openhis.web.inhospitalnursestation.dto.AdmissionPageParam;
import com.openhis.web.inhospitalnursestation.dto.AdviceExecuteParam;
import com.openhis.web.inhospitalnursestation.dto.InpatientAdviceParam;
/**
@@ -62,10 +63,10 @@ public interface IAdviceProcessAppService {
/**
* 医嘱执行
*
* @param performInfoList 医嘱信息集合
* @param adviceExecuteParam 医嘱执行参数
* @return 操作结果
*/
R<?> adviceExecute(List<PerformInfoDto> performInfoList);
R<?> adviceExecute(AdviceExecuteParam adviceExecuteParam);
/**
* 医嘱取消执行

View File

@@ -105,7 +105,7 @@ public class ATDManageAppServiceImpl implements IATDManageAppService {
// 入院患者分页列表
Page<AdmissionPatientPageDto> admissionPatientPage = atdManageAppMapper.selectAdmissionPatientPage(
new Page<>(pageNo, pageSize), queryWrapper, EncounterClass.IMP.getValue(),
EncounterZyStatus.TO_BE_REGISTERED.getValue(), EncounterLocationStatus.ACTIVE.getValue(),
EncounterZyStatus.TO_BE_REGISTERED.getValue(), EncounterActivityStatus.ACTIVE.getValue(),
LocationForm.WARD.getValue(), LocationForm.HOUSE.getValue(), LocationForm.BED.getValue());
admissionPatientPage.getRecords().forEach(e -> {
// 性别枚举
@@ -138,7 +138,7 @@ public class ATDManageAppServiceImpl implements IATDManageAppService {
// 入院患者床位分页列表
Page<AdmissionBedPageDto> admissionBedPage =
atdManageAppMapper.selectAdmissionBadPage(new Page<>(pageNo, pageSize), queryWrapper,
EncounterLocationStatus.ACTIVE.getValue(), LocationForm.WARD.getValue(), LocationForm.HOUSE.getValue(),
EncounterActivityStatus.ACTIVE.getValue(), LocationForm.WARD.getValue(), LocationForm.HOUSE.getValue(),
LocationForm.BED.getValue(), AccountType.PERSONAL_CASH_ACCOUNT.getCode(),
LocationStatus.INACTIVE.getValue(), ChargeItemStatus.BILLABLE.getValue(),
ChargeItemStatus.BILLED.getValue(), ChargeItemStatus.REFUNDED.getValue());
@@ -167,7 +167,7 @@ public class ATDManageAppServiceImpl implements IATDManageAppService {
public R<?> getAdmissionPatientInfo(Long encounterId) {
// 查询住院患者详细信息
AdmissionPatientInfoDto admissionPatientInfoDto =
atdManageAppMapper.selectAdmissionPatientInfo(encounterId, EncounterLocationStatus.ACTIVE.getValue(),
atdManageAppMapper.selectAdmissionPatientInfo(encounterId, EncounterActivityStatus.ACTIVE.getValue(),
LocationForm.WARD.getValue(), LocationForm.HOUSE.getValue(), LocationForm.BED.getValue(),
ParticipantType.PRIMARY_NURSE.getCode(), ParticipantType.ATTENDING_DOCTOR.getCode(),
ParticipantType.ADMITTING_DOCTOR.getCode(), ParticipantType.CHIEF_DOCTOR.getCode());
@@ -242,7 +242,7 @@ public class ATDManageAppServiceImpl implements IATDManageAppService {
Date targetStartTime = null;
Optional<EncounterLocation> encounterLocationOptional =
locationList.stream().filter(x -> x.getFormEnum().equals(LocationForm.BED.getValue()))
.filter(x -> x.getStatusEnum().equals(EncounterLocationStatus.ACTIVE.getValue())).findFirst();
.filter(x -> x.getStatusEnum().equals(EncounterActivityStatus.ACTIVE.getValue())).findFirst();
if (encounterLocationOptional.isPresent()) {
EncounterLocation encounterLocation = encounterLocationOptional.get();
targetStartTime = encounterLocation.getStartTime();

View File

@@ -3,6 +3,7 @@
*/
package com.openhis.web.inhospitalnursestation.appservice.impl;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
@@ -11,28 +12,33 @@ import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.core.common.core.domain.R;
import com.core.common.utils.AgeCalculatorUtil;
import com.core.common.utils.MessageUtils;
import com.core.common.utils.SecurityUtils;
import com.core.common.utils.bean.BeanUtils;
import com.openhis.administration.service.IEncounterService;
import com.openhis.clinical.service.IProcedureService;
import com.openhis.common.constant.CommonConstants;
import com.openhis.common.constant.PromptMsgConstant;
import com.openhis.common.enums.*;
import com.openhis.common.utils.EnumUtils;
import com.openhis.common.utils.HisQueryUtils;
import com.openhis.medication.domain.MedicationDefinition;
import com.openhis.medication.domain.MedicationRequest;
import com.openhis.medication.service.IMedicationDefinitionService;
import com.openhis.medication.service.IMedicationDispenseService;
import com.openhis.medication.service.IMedicationRequestService;
import com.openhis.web.common.dto.PerformInfoDto;
import com.openhis.web.common.dto.PerformRecordDto;
import com.openhis.web.inhospitalnursestation.appservice.IAdviceProcessAppService;
import com.openhis.web.inhospitalnursestation.dto.AdmissionPageParam;
import com.openhis.web.inhospitalnursestation.dto.AdmissionPatientPageDto;
import com.openhis.web.inhospitalnursestation.dto.InpatientAdviceDto;
import com.openhis.web.inhospitalnursestation.dto.InpatientAdviceParam;
import com.openhis.web.inhospitalnursestation.dto.*;
import com.openhis.web.inhospitalnursestation.mapper.AdviceProcessAppMapper;
import com.openhis.web.outpatientmanage.mapper.OutpatientTreatmentAppMapper;
import com.openhis.workflow.domain.ServiceRequest;
import com.openhis.workflow.service.IServiceRequestService;
/**
@@ -62,6 +68,12 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService {
@Resource
private IMedicationDispenseService medicationDispenseService;
@Resource
private IEncounterService encounterService;
@Resource
private IMedicationDefinitionService medicationDefinitionService;
/**
* 住院患者分页列表
*
@@ -84,7 +96,7 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService {
Page<AdmissionPatientPageDto> admissionPatientPage =
adviceProcessAppMapper.selectInpatientPage(new Page<>(pageNo, pageSize), queryWrapper,
EncounterClass.IMP.getValue(), EncounterZyStatus.TO_BE_REGISTERED.getValue(),
EncounterZyStatus.REGISTERED.getValue(), EncounterLocationStatus.ACTIVE.getValue(),
EncounterZyStatus.REGISTERED.getValue(), EncounterActivityStatus.ACTIVE.getValue(),
LocationForm.WARD.getValue(), LocationForm.HOUSE.getValue(), LocationForm.BED.getValue());
admissionPatientPage.getRecords().forEach(e -> {
// 性别枚举
@@ -133,7 +145,7 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService {
Page<InpatientAdviceDto> inpatientAdvicePage =
adviceProcessAppMapper.selectInpatientAdvicePage(new Page<>(pageNo, pageSize), queryWrapper,
CommonConstants.TableName.MED_MEDICATION_REQUEST, CommonConstants.TableName.WOR_SERVICE_REQUEST,
RequestStatus.DRAFT.getValue(), EncounterLocationStatus.ACTIVE.getValue(), LocationForm.BED.getValue(),
RequestStatus.DRAFT.getValue(), EncounterActivityStatus.ACTIVE.getValue(), LocationForm.BED.getValue(),
ParticipantType.ADMITTING_DOCTOR.getCode(), AccountType.PERSONAL_CASH_ACCOUNT.getCode(),
ChargeItemStatus.BILLABLE.getValue(), ChargeItemStatus.BILLED.getValue(),
ChargeItemStatus.REFUNDED.getValue(), EncounterClass.IMP.getValue());
@@ -255,6 +267,20 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService {
// 更新服务请求状态已完成
serviceRequestService.updateCompleteRequestStatus(
serviceRequestList.stream().map(PerformInfoDto::getRequestId).toList(), practitionerId, checkDate);
List<ServiceRequest> serviceRequests = serviceRequestService
.listByIds(serviceRequestList.stream().map(PerformInfoDto::getRequestId).collect(Collectors.toList()));
for (ServiceRequest serviceRequest : serviceRequests) {
// 判断医嘱类型
if (ActivityDefCategory.TRANSFER.getValue().equals(serviceRequest.getCategoryEnum())) {
// 更新患者状态 待转科
encounterService.updateEncounterStatus(serviceRequest.getEncounterId(),
EncounterZyStatus.PENDING_TRANSFER.getValue());
} else if (ActivityDefCategory.DISCHARGE.getValue().equals(serviceRequest.getCategoryEnum())) {
// 更新患者状态 待出院
encounterService.updateEncounterStatus(serviceRequest.getEncounterId(),
EncounterZyStatus.AWAITING_DISCHARGE.getValue());
}
}
}
if (!medRequestList.isEmpty()) {
// 更新药品请求状态已完成
@@ -300,50 +326,80 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService {
/**
* 医嘱执行
*
* @param performInfoList 医嘱信息集合
* @param adviceExecuteParam 医嘱执行参数
* @return 操作结果
*/
@Override
public R<?> adviceExecute(List<PerformInfoDto> performInfoList) {
// 分别创建两个列表来存储不同类型的请求
List<PerformInfoDto> serviceRequestList = new ArrayList<>();
List<PerformInfoDto> medRequestList = new ArrayList<>();
for (PerformInfoDto item : performInfoList) {
if (CommonConstants.TableName.WOR_SERVICE_REQUEST.equals(item.getRequestTable())) {
serviceRequestList.add(item);
} else if (CommonConstants.TableName.MED_MEDICATION_REQUEST.equals(item.getRequestTable())) {
medRequestList.add(item);
}
public R<?> adviceExecute(AdviceExecuteParam adviceExecuteParam) {
// 医嘱集合
List<AdviceExecuteDetailParam> adviceExecuteDetailList = adviceExecuteParam.getAdviceExecuteDetailList();
// 药品
List<AdviceExecuteDetailParam> medicineList = adviceExecuteDetailList.stream()
.filter(e -> CommonConstants.TableName.MED_MEDICATION_REQUEST.equals(e.getAdviceTable())).toList();
// 诊疗
List<AdviceExecuteDetailParam> activityList = adviceExecuteDetailList.stream()
.filter(e -> CommonConstants.TableName.WOR_SERVICE_REQUEST.equals(e.getAdviceTable())).toList();
// -------------------------------------------整体校验药品库存
if (!medicineList.isEmpty()) {
// 药品请求id集合
List<Long> medicineRequestIdList =
medicineList.stream().map(AdviceExecuteDetailParam::getRequestId).collect(Collectors.toList());
// 药品请求集合
List<MedicationRequest> MedicationRequestList = medicationRequestService
.list(new LambdaQueryWrapper<MedicationRequest>().in(MedicationRequest::getId, medicineRequestIdList));
// 药品定义id集合
List<Long> medicationDefinitionIdList =
MedicationRequestList.stream().map(MedicationRequest::getMedicationId).collect(Collectors.toList());
// 药品定义集合
List<MedicationDefinition> medicationDefinitionList =
medicationDefinitionService.list(new LambdaQueryWrapper<MedicationDefinition>()
.in(MedicationDefinition::getId, medicationDefinitionIdList));
// 组装MedicationRequestUseExe数据结构
List<MedicationRequestUseExe> MedUseExeList = MedicationRequestList.stream().map(medicationRequest -> {
// 创建 MedicationRequestUseExe 对象,并复制 MedicationRequest 的属性
MedicationRequestUseExe useExe = new MedicationRequestUseExe();
BeanUtils.copyProperties(medicationRequest, useExe);
// 匹配 executeTimes根据 medicationRequest 的 id 在 medicineList 中查找匹配的 executeTimes
List<String> matchedExecuteTimes =
medicineList.stream().filter(medicine -> medicine.getRequestId().equals(medicationRequest.getId()))
.findFirst().map(AdviceExecuteDetailParam::getExecuteTimes).orElse(null);
useExe.setExecuteTimes(matchedExecuteTimes);
// 计算 executeTimesNumexecuteTimes 的集合大小,转换为 BigDecimal
if (matchedExecuteTimes != null) {
useExe.setExecuteTimesNum(BigDecimal.valueOf(matchedExecuteTimes.size()));
} else {
useExe.setExecuteTimesNum(BigDecimal.ZERO);
}
// 匹配 minUnitQuantity根据 medicationId 在 medicationDefinitionList 中查找匹配的药品定义
MedicationDefinition matchedDefinition = medicationDefinitionList.stream()
.filter(definition -> definition.getId().equals(medicationRequest.getMedicationId())).findFirst()
.orElse(null);
if (matchedDefinition != null) {
// 判断 minUnitCode 是否等于 unitCode
if (matchedDefinition.getMinUnitCode().equals(medicationRequest.getUnitCode())) {
useExe.setMinUnitQuantity(medicationRequest.getQuantity());
} else {
// 若不相等,则计算 quantity * partPercent
BigDecimal partPercent = matchedDefinition.getPartPercent();
if (partPercent == null) {
partPercent = BigDecimal.ONE; // 避免空指针默认设为1
}
useExe.setMinUnitQuantity(medicationRequest.getQuantity().multiply(partPercent));
}
} else {
// 若未找到匹配的药品定义,设为 null 或默认值
useExe.setMinUnitQuantity(null);
}
return useExe;
}).toList();
// -------------------------------------------处理药品执行
}
//分别处理长期/临时医嘱
// 执行项目列表(需过滤掉特殊医嘱,已经停嘱的医嘱,执行时间与出院时间/入院时间冲突的)
List<PerformInfoDto> executeList = performInfoList;
// 校验是否已经停嘱
// 校验患者是否在科,出院,死亡
// 处理药品医嘱
if (!medRequestList.isEmpty()) {
// 查询医嘱信息
List<Long> requestIdList = medRequestList.stream().map(PerformInfoDto::getRequestId).toList();
List<MedicationRequest> medicationRequestList = medicationRequestService.listByIds(requestIdList);
// 按每个药品分组校验库存
Map<Long, List<MedicationRequest>> medMap =
medicationRequestList.stream().collect(Collectors.groupingBy(MedicationRequest::getMedicationId));
for (Map.Entry<Long, List<MedicationRequest>> entry : medMap.entrySet()) {
List<MedicationRequest> medicationRequests = entry.getValue();
}
//校验库存是校验某个药在某个药房这一次执行的总数够不够,生成药品发放是按每个请求生成的
// 生成药品发放
// medicationDispenseService.handleMedicationDispense();
}
if (!serviceRequestList.isEmpty()) {
// todo:查询绑定的耗材
//生成执行记录
}
// 记录操作记录
for (PerformInfoDto execute : executeList) {
//生成账单(待结算)
}
return null;
// -------------------------------------------处理诊疗执行
return R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00004, new Object[] {"医嘱执行"}));
}
/**

View File

@@ -9,6 +9,7 @@ import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import com.openhis.web.common.dto.PerformInfoDto;
import com.openhis.web.inhospitalnursestation.dto.AdviceExecuteParam;
import org.springframework.web.bind.annotation.*;
import com.core.common.core.domain.R;
@@ -92,12 +93,12 @@ public class AdviceProcessController {
/**
* 医嘱执行
*
* @param performInfoList 医嘱信息集合
* @param adviceExecuteParam 医嘱执行参数
* @return 操作结果
*/
@PostMapping(value = "/advice-execute")
public R<?> adviceExecute(List<PerformInfoDto> performInfoList) {
return adviceProcessAppService.adviceExecute(performInfoList);
public R<?> adviceExecute(@RequestBody AdviceExecuteParam adviceExecuteParam) {
return adviceProcessAppService.adviceExecute(adviceExecuteParam);
}
/**

View File

@@ -0,0 +1,34 @@
/*
* Copyright ©2023 CJB-CNIT Team. All rights reserved
*/
package com.openhis.web.inhospitalnursestation.dto;
import java.util.List;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 医嘱执行详细参数
*
* @author zwh
* @date 2025-07-28
*/
@Data
@Accessors(chain = true)
public class AdviceExecuteDetailParam {
/** 医嘱请求id */
@JsonSerialize(using = ToStringSerializer.class)
private Long requestId;
/** 医嘱请求所在表 */
private String adviceTable;
/** 执行时间点集合 */
private List<String> executeTimes;
}

View File

@@ -0,0 +1,26 @@
/*
* Copyright ©2023 CJB-CNIT Team. All rights reserved
*/
package com.openhis.web.inhospitalnursestation.dto;
import java.util.List;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 医嘱执行参数
*
* @author zwh
* @date 2025-07-28
*/
@Data
@Accessors(chain = true)
public class AdviceExecuteParam {
/**
* 医嘱执行详细参数
*/
private List<AdviceExecuteDetailParam> adviceExecuteDetailList;
}

View File

@@ -0,0 +1,35 @@
/*
* Copyright ©2023 CJB-CNIT Team. All rights reserved
*/
package com.openhis.web.inhospitalnursestation.dto;
import java.math.BigDecimal;
import java.util.List;
import com.openhis.medication.domain.MedicationRequest;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 药品请求用于执行
*
* @author zwh
* @date 2025-07-28
*/
@Data
@Accessors(chain = true)
public class MedicationRequestUseExe extends MedicationRequest {
/** 执行时间点集合 */
private List<String> executeTimes;
/**
* 执行时间点集合数量
*/
private BigDecimal executeTimesNum;
/** 请求小单位数量 */
private BigDecimal minUnitQuantity;
}