后端最新版本同步
This commit is contained in:
@@ -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);
|
||||
|
||||
/**
|
||||
* 医嘱取消执行
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
// 计算 executeTimesNum:executeTimes 的集合大小,转换为 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[] {"医嘱执行"}));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user