解决合并冲突
This commit is contained in:
@@ -17,6 +17,13 @@ import com.openhis.web.inhospitalnursestation.dto.AdmissionPatientInfoDto;
|
||||
*/
|
||||
public interface IATDManageAppService {
|
||||
|
||||
/**
|
||||
* 入出转管理页面初始化
|
||||
*
|
||||
* @return 初始化信息
|
||||
*/
|
||||
R<?> atdManageInit();
|
||||
|
||||
/**
|
||||
* 入院患者分页列表
|
||||
*
|
||||
@@ -49,11 +56,12 @@ public interface IATDManageAppService {
|
||||
R<?> getAdmissionPatientInfo(Long encounterId);
|
||||
|
||||
/**
|
||||
* 入出转管理页面初始化
|
||||
* 住院患者待处理信息列表
|
||||
*
|
||||
* @return 初始化信息
|
||||
* @param encounterId 住院id
|
||||
* @return 待处理信息列表
|
||||
*/
|
||||
R<?> atdManageInit();
|
||||
R<?> getInPatientPendingList(Long encounterId);
|
||||
|
||||
/**
|
||||
* 入科床位分配
|
||||
@@ -62,4 +70,20 @@ public interface IATDManageAppService {
|
||||
* @return 结果
|
||||
*/
|
||||
R<?> admissionBedAssignment(AdmissionPatientInfoDto admissionPatientInfoDto);
|
||||
|
||||
/**
|
||||
* 转科
|
||||
*
|
||||
* @param encounterId 住院id
|
||||
* @return 结果
|
||||
*/
|
||||
R<?> transferDepartment(Long encounterId);
|
||||
|
||||
/**
|
||||
* 出院
|
||||
*
|
||||
* @param encounterId 住院id
|
||||
* @return 结果
|
||||
*/
|
||||
R<?> hospitalDischarge(Long encounterId);
|
||||
}
|
||||
|
||||
@@ -5,8 +5,8 @@ import java.util.List;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
import com.core.common.core.domain.R;
|
||||
import com.openhis.web.inhospitalnursestation.dto.InpatientMedicinePrescriptionInfoDto;
|
||||
import com.openhis.web.inhospitalnursestation.dto.InpatientMedicineSearchParam;
|
||||
import com.openhis.web.inhospitalnursestation.dto.DispenseFormSearchParam;
|
||||
import com.openhis.web.inhospitalnursestation.dto.MedicineSummaryParam;
|
||||
|
||||
/**
|
||||
* 住院领药 应用实现接口
|
||||
@@ -17,48 +17,45 @@ import com.openhis.web.inhospitalnursestation.dto.InpatientMedicineSearchParam;
|
||||
public interface IMedicineSummaryAppService {
|
||||
|
||||
/**
|
||||
* 分页查询在科病人列表
|
||||
* 查询发药单信息
|
||||
*
|
||||
* @param searchParam 查询条件
|
||||
* @param searchKey 模糊查询关键字
|
||||
* @param dispenseFormSearchParam 查询条件
|
||||
* @param pageNo 当前页码
|
||||
* @param pageSize 查询条数
|
||||
* @param request 请求数据
|
||||
* @return 发药病人列表
|
||||
* @param request 请求
|
||||
* @return 发药单信息
|
||||
*/
|
||||
R<?> getEncounterInfoListPage(InpatientMedicineSearchParam searchParam, String searchKey, Integer pageNo,
|
||||
Integer pageSize, HttpServletRequest request);
|
||||
R<?> getMedicineDispenseFormPage(DispenseFormSearchParam dispenseFormSearchParam, Integer pageNo, Integer pageSize,
|
||||
HttpServletRequest request);
|
||||
|
||||
/**
|
||||
* 查询医嘱列表
|
||||
* 查询药品汇总单
|
||||
*
|
||||
* @param searchParam 查询条件
|
||||
* @param searchKey 模糊查询关键字
|
||||
* @param dispenseFormSearchParam 查询条件
|
||||
* @param pageNo 当前页码
|
||||
* @param pageSize 查询条数
|
||||
* @param request 请求数据
|
||||
* @return 处方单列表
|
||||
* @param searchKey 模糊查询关键字
|
||||
* @param request 请求
|
||||
* @return 药品汇总单
|
||||
*/
|
||||
R<?> getPrescriptionInfo(InpatientMedicineSearchParam searchParam, String searchKey, Integer pageNo,
|
||||
Integer pageSize, HttpServletRequest request);
|
||||
R<?> getMedicineSummaryFormPage(DispenseFormSearchParam dispenseFormSearchParam, Integer pageNo, Integer pageSize,
|
||||
String searchKey, HttpServletRequest request);
|
||||
|
||||
/**
|
||||
* 显示汇总发药单(生成之前的确认,此刻还没生成汇总单)
|
||||
* 查询药品汇总单详情
|
||||
*
|
||||
* @param searchParam 查询条件
|
||||
* @param pageNo 当前页码
|
||||
* @param pageSize 查询条数
|
||||
* @return 处理结果
|
||||
* @param summaryNo 汇总单号
|
||||
* @return 药品汇总单详情
|
||||
*/
|
||||
R<?> showMedicineSummary(List<InpatientMedicineSearchParam> searchParam, Integer pageNo, Integer pageSize);
|
||||
R<?> getMedicineSummaryFormDetail(String summaryNo);
|
||||
|
||||
/**
|
||||
* 生成汇总发药单
|
||||
*
|
||||
* @param prescriptionInfo 汇总发药单
|
||||
* @param medicineSummaryParamList 汇总发申请参数
|
||||
* @return 处理结果
|
||||
*/
|
||||
R<?> medicineSummary(List<InpatientMedicinePrescriptionInfoDto> prescriptionInfo);
|
||||
R<?> medicineSummary(List<MedicineSummaryParam> medicineSummaryParamList);
|
||||
|
||||
/**
|
||||
* 校验库存
|
||||
@@ -68,4 +65,12 @@ public interface IMedicineSummaryAppService {
|
||||
* @return 处理结果
|
||||
*/
|
||||
R<?> checkInventoryItem(List<Long> devDispenseId, List<Long> medDispenseId);
|
||||
|
||||
/**
|
||||
* 取消汇总
|
||||
*
|
||||
* @param summaryNo 汇总单号
|
||||
* @return 处理结果
|
||||
*/
|
||||
R<?> cancelSummary(String summaryNo);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
package com.openhis.web.inhospitalnursestation.appservice;
|
||||
|
||||
import com.core.common.core.domain.R;
|
||||
import com.openhis.web.regdoctorstation.dto.RegAdviceSaveParam;
|
||||
|
||||
public interface INurseBillingAppService {
|
||||
/*
|
||||
* 住院护士 划价添加
|
||||
* @return
|
||||
*/
|
||||
public R<?> addInNurseBilling(RegAdviceSaveParam regAdviceSaveParam);
|
||||
/*
|
||||
* 住院护士 划价列表 根据护士encounterId查询
|
||||
* @return
|
||||
*/
|
||||
public R<?> getBillingListByEncounterId();
|
||||
/*
|
||||
* 住院护士撤销划价
|
||||
* @return
|
||||
*/
|
||||
public R<?> deleteInNurseBilling();
|
||||
/*
|
||||
* 医嘱计费添加 诊疗 耗材
|
||||
*/
|
||||
public R<?> addOrderBilling();
|
||||
/*
|
||||
* 医嘱计费删除 诊疗 耗材
|
||||
*/
|
||||
public R<?> deleteOrderBilling();
|
||||
/*
|
||||
* 医嘱计费修改 诊疗 耗材
|
||||
*/
|
||||
public R<?> updateOrderBilling();
|
||||
/*
|
||||
根据医嘱id查询已计费的 耗材列表
|
||||
* @return
|
||||
*/
|
||||
public R<?> getOrderBillingByRequestId();
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
package com.openhis.web.inhospitalnursestation.appservice;
|
||||
|
||||
import com.core.common.core.domain.R;
|
||||
import com.openhis.web.inhospitalnursestation.dto.OrgDeviceSummaryParam;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
/**
|
||||
* 科室耗材盘点 应用实现接口
|
||||
*
|
||||
* @author wuyan
|
||||
* @date 2025/11/05
|
||||
*/
|
||||
public interface IOrgDeviceStockTakeAppService {
|
||||
|
||||
/**
|
||||
* 查询科室耗材汇总
|
||||
*
|
||||
* @param orgDeviceSummaryParam 查询条件
|
||||
* @param startTime 开始时间
|
||||
* @param endTime 结束时间
|
||||
* @param pageNo 当前页码
|
||||
* @param pageSize 查询条数
|
||||
* @param searchKey 模糊查询关键字
|
||||
* @param request 请求
|
||||
* @return 科室耗材汇总单
|
||||
*/
|
||||
R<?> getOrgDeviceSummaryFromPage(OrgDeviceSummaryParam orgDeviceSummaryParam, String startTime, String endTime,
|
||||
@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
|
||||
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize, String searchKey,
|
||||
HttpServletRequest request);
|
||||
|
||||
/**
|
||||
* 科室耗材汇总
|
||||
*
|
||||
* @return 科室耗材汇总单
|
||||
*/
|
||||
R<?> orgDeviceSummary(OrgDeviceSummaryParam orgDeviceSummaryParam);
|
||||
}
|
||||
@@ -182,6 +182,22 @@ public class ATDManageAppServiceImpl implements IATDManageAppService {
|
||||
return R.ok(admissionPatientInfoDto);
|
||||
}
|
||||
|
||||
/**
|
||||
* 住院患者待处理信息列表
|
||||
*
|
||||
* @param encounterId 住院id
|
||||
* @return 待处理信息列表
|
||||
*/
|
||||
@Override
|
||||
public R<?> getInPatientPendingList(Long encounterId) {
|
||||
// List<InpatientAdviceDto> inPatientPendingList =
|
||||
// atdManageAppMapper.selectInPatientPendingList(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());
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 入科床位分配
|
||||
*
|
||||
@@ -329,4 +345,26 @@ public class ATDManageAppServiceImpl implements IATDManageAppService {
|
||||
}
|
||||
return R.ok("床位分配成功");
|
||||
}
|
||||
|
||||
/**
|
||||
* 转科
|
||||
*
|
||||
* @param encounterId 住院id
|
||||
* @return 结果
|
||||
*/
|
||||
@Override
|
||||
public R<?> transferDepartment(Long encounterId) {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 出院
|
||||
*
|
||||
* @param encounterId 住院id
|
||||
* @return 结果
|
||||
*/
|
||||
@Override
|
||||
public R<?> hospitalDischarge(Long encounterId) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,9 +21,8 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||
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.exception.ServiceException;
|
||||
import com.core.common.utils.*;
|
||||
import com.core.common.utils.bean.BeanUtils;
|
||||
import com.openhis.administration.domain.ChargeItem;
|
||||
import com.openhis.administration.service.IChargeItemService;
|
||||
@@ -44,17 +43,20 @@ import com.openhis.medication.service.IMedicationRequestService;
|
||||
import com.openhis.web.common.dto.PerformInfoDto;
|
||||
import com.openhis.web.common.dto.PerformRecordDto;
|
||||
import com.openhis.web.doctorstation.appservice.IDoctorStationAdviceAppService;
|
||||
import com.openhis.web.doctorstation.dto.ActivityBindDeviceDetailDto;
|
||||
import com.openhis.web.doctorstation.dto.AdviceBaseDto;
|
||||
import com.openhis.web.doctorstation.dto.AdviceInventoryDto;
|
||||
import com.openhis.web.doctorstation.dto.AdvicePriceDto;
|
||||
import com.openhis.web.doctorstation.mapper.DoctorStationAdviceAppMapper;
|
||||
import com.openhis.web.doctorstation.utils.AdviceUtils;
|
||||
import com.openhis.web.inhospitalnursestation.appservice.IAdviceProcessAppService;
|
||||
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.DeviceDispense;
|
||||
import com.openhis.workflow.domain.DeviceRequest;
|
||||
import com.openhis.workflow.domain.ServiceRequest;
|
||||
import com.openhis.workflow.service.IDeviceDispenseService;
|
||||
import com.openhis.workflow.service.IServiceRequestService;
|
||||
import com.openhis.workflow.service.*;
|
||||
|
||||
/**
|
||||
* 护士站医嘱处理实现类
|
||||
@@ -65,9 +67,15 @@ import com.openhis.workflow.service.IServiceRequestService;
|
||||
@Service
|
||||
public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService {
|
||||
|
||||
@Resource
|
||||
AssignSeqUtil assignSeqUtil;
|
||||
|
||||
@Resource
|
||||
private AdviceProcessAppMapper adviceProcessAppMapper;
|
||||
|
||||
@Resource
|
||||
private DoctorStationAdviceAppMapper doctorStationAdviceAppMapper;
|
||||
|
||||
@Resource
|
||||
private IProcedureService procedureService;
|
||||
|
||||
@@ -86,6 +94,9 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService {
|
||||
@Resource
|
||||
private IDeviceDispenseService deviceDispenseService;
|
||||
|
||||
@Resource
|
||||
private IDeviceRequestService deviceRequestService;
|
||||
|
||||
@Resource
|
||||
private IEncounterService encounterService;
|
||||
|
||||
@@ -99,7 +110,13 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService {
|
||||
private AdviceUtils adviceUtils;
|
||||
|
||||
@Resource
|
||||
private IDoctorStationAdviceAppService iDoctorStationAdviceAppService;
|
||||
private IDoctorStationAdviceAppService doctorStationAdviceAppService;
|
||||
|
||||
@Resource
|
||||
private ISupplyRequestService supplyRequestService;
|
||||
|
||||
@Resource
|
||||
private ISupplyDeliveryService supplyDeliveryService;
|
||||
|
||||
/**
|
||||
* 住院患者分页列表
|
||||
@@ -156,10 +173,8 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService {
|
||||
Integer exeStatus = inpatientAdviceParam.getExeStatus();
|
||||
inpatientAdviceParam.setExeStatus(null);
|
||||
// 构建查询条件
|
||||
QueryWrapper<InpatientAdviceParam> queryWrapper = HisQueryUtils.buildQueryWrapper(inpatientAdviceParam, null,
|
||||
new HashSet<>(Arrays.asList(CommonConstants.FieldName.PatientWbStr, CommonConstants.FieldName.PatientPyStr,
|
||||
CommonConstants.FieldName.PatientName, CommonConstants.FieldName.BusNo)),
|
||||
null);
|
||||
QueryWrapper<InpatientAdviceParam> queryWrapper =
|
||||
HisQueryUtils.buildQueryWrapper(inpatientAdviceParam, null, null, null);
|
||||
|
||||
// 手动拼接住院患者id条件
|
||||
if (encounterIds != null && !encounterIds.isEmpty()) {
|
||||
@@ -167,7 +182,7 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService {
|
||||
Arrays.stream(encounterIds.split(CommonConstants.Common.COMMA)).map(Long::parseLong).toList();
|
||||
queryWrapper.in(CommonConstants.FieldName.EncounterId, encounterIdList);
|
||||
}
|
||||
// 入院患者分页列表
|
||||
// 患者医嘱分页列表
|
||||
Page<InpatientAdviceDto> inpatientAdvicePage =
|
||||
adviceProcessAppMapper.selectInpatientAdvicePage(new Page<>(pageNo, pageSize), queryWrapper,
|
||||
CommonConstants.TableName.MED_MEDICATION_REQUEST, CommonConstants.TableName.WOR_SERVICE_REQUEST,
|
||||
@@ -408,39 +423,41 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService {
|
||||
.filter(x -> x.getTherapyEnum().equals(TherapyTimeType.TEMPORARY.getValue()))
|
||||
.map(AdviceExecuteDetailParam::getProcedureId).distinct().toList();
|
||||
|
||||
// 合并长期和临时的执行记录
|
||||
List<Long> procedureIdList = new ArrayList<>(longProcIdList);
|
||||
procedureIdList.addAll(tempProcIdList);
|
||||
// 查询执行记录
|
||||
List<Procedure> procedureList = procedureService.listByIds(procedureIdList);
|
||||
Map<Long, Long> procedureIdMap = new HashMap<>();
|
||||
if (procedureList != null && !procedureList.isEmpty()) {
|
||||
for (Procedure procedure : procedureList) {
|
||||
// 根据执行记录新增取消执行记录
|
||||
Long newProcedureId = procedureService.addProcedureRecord(procedure.getEncounterId(),
|
||||
procedure.getPatientId(), procedure.getRequestId(), procedure.getRequestTable(), EventStatus.CANCEL,
|
||||
ProcedureCategory.INPATIENT_ADVICE, null, procedure.getOccurrenceTime(), procedure.getGroupId(),
|
||||
procedure.getId());
|
||||
// 将旧的执行Id和新的执行Id存入map
|
||||
procedureIdMap.put(procedure.getId(), newProcedureId);
|
||||
}
|
||||
}
|
||||
// 分别处理长期和临时的医嘱
|
||||
// 长期已发放药品
|
||||
List<MedicationDispense> longMedDispensedList = new ArrayList<>();
|
||||
// 长期未发放药品
|
||||
List<MedicationDispense> longMedUndispenseList = new ArrayList<>();
|
||||
// 长期已发放耗材
|
||||
List<DeviceDispense> longDevDispensedList = new ArrayList<>();
|
||||
// 长期未发放耗材
|
||||
List<DeviceDispense> longDevUndispenseList = new ArrayList<>();
|
||||
// 处理长期医嘱
|
||||
if (!longProcIdList.isEmpty()) {
|
||||
// 长期药品
|
||||
List<MedicationDispense> longMedDispenseList =
|
||||
medicationDispenseService.getMedDispenseByProcedureId(longProcIdList);
|
||||
// 长期耗材
|
||||
List<DeviceDispense> longDevDispenseList =
|
||||
deviceDispenseService.getDevDispenseByProcedureId(longProcIdList);
|
||||
// 分离已发药发药单和未发药发药单
|
||||
for (MedicationDispense medicationDispense : longMedDispenseList) {
|
||||
if (DispenseStatus.COMPLETED.getValue().equals(medicationDispense.getDispenseEnum())) {
|
||||
if (DispenseStatus.COMPLETED.getValue().equals(medicationDispense.getStatusEnum())) {
|
||||
longMedDispensedList.add(medicationDispense);
|
||||
} else if (DispenseStatus.PREPARATION.getValue().equals(medicationDispense.getDispenseEnum())) {
|
||||
} else if (DispenseStatus.PREPARATION.getValue().equals(medicationDispense.getStatusEnum())) {
|
||||
longMedUndispenseList.add(medicationDispense);
|
||||
}
|
||||
}
|
||||
// 分离已发耗材单和未发耗材单
|
||||
for (DeviceDispense deviceDispense : longDevDispenseList) {
|
||||
if (DispenseStatus.COMPLETED.getValue().equals(deviceDispense.getStatusEnum())) {
|
||||
longDevDispensedList.add(deviceDispense);
|
||||
} else if (DispenseStatus.PREPARATION.getValue().equals(deviceDispense.getStatusEnum())) {
|
||||
longDevUndispenseList.add(deviceDispense);
|
||||
}
|
||||
}
|
||||
// 查询账单
|
||||
List<ChargeItem> chargeItemList = chargeItemService.getChargeItemByProcedureId(longProcIdList);
|
||||
if (chargeItemList != null && !chargeItemList.isEmpty()) {
|
||||
@@ -455,34 +472,19 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService {
|
||||
List<MedicationDispense> tempMedDispensedList = new ArrayList<>();
|
||||
// 临时未发放药品
|
||||
List<MedicationDispense> tempMedUndispenseList = new ArrayList<>();
|
||||
// 临时已发放耗材
|
||||
List<DeviceDispense> tempDevDispensedList = new ArrayList<>();
|
||||
// 临时未发放耗材
|
||||
List<DeviceDispense> tempDevUndispenseList = new ArrayList<>();
|
||||
// 处理临时医嘱
|
||||
if (!tempProcIdList.isEmpty()) {
|
||||
// 长期药品
|
||||
// 临时药品
|
||||
List<MedicationDispense> tempMedDispenseList =
|
||||
medicationDispenseService.getMedDispenseByProcedureId(tempProcIdList);
|
||||
// 长期耗材
|
||||
List<DeviceDispense> tempDevDispenseList =
|
||||
deviceDispenseService.getDevDispenseByProcedureId(tempProcIdList);
|
||||
// 分离已发药发药单和未发药发药单
|
||||
for (MedicationDispense medicationDispense : tempMedDispenseList) {
|
||||
if (DispenseStatus.COMPLETED.getValue().equals(medicationDispense.getDispenseEnum())) {
|
||||
if (DispenseStatus.COMPLETED.getValue().equals(medicationDispense.getStatusEnum())) {
|
||||
tempMedDispensedList.add(medicationDispense);
|
||||
} else if (DispenseStatus.PREPARATION.getValue().equals(medicationDispense.getDispenseEnum())) {
|
||||
} else if (DispenseStatus.PREPARATION.getValue().equals(medicationDispense.getStatusEnum())) {
|
||||
tempMedUndispenseList.add(medicationDispense);
|
||||
}
|
||||
}
|
||||
// 分离已发耗材单和未发耗材单
|
||||
for (DeviceDispense deviceDispense : tempDevDispenseList) {
|
||||
if (DispenseStatus.COMPLETED.getValue().equals(deviceDispense.getStatusEnum())) {
|
||||
tempDevDispensedList.add(deviceDispense);
|
||||
} else if (DispenseStatus.PREPARATION.getValue().equals(deviceDispense.getStatusEnum())) {
|
||||
tempDevUndispenseList.add(deviceDispense);
|
||||
}
|
||||
}
|
||||
// 查询账单
|
||||
List<ChargeItem> chargeItemList = chargeItemService.getChargeItemByProcedureId(tempProcIdList);
|
||||
if (chargeItemList != null && !chargeItemList.isEmpty()) {
|
||||
@@ -491,27 +493,152 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService {
|
||||
.updatePlannedChargeStatus(chargeItemList.stream().map(ChargeItem::getProcedureId).toList());
|
||||
}
|
||||
}
|
||||
// 统一处理已发放药品或耗材
|
||||
List<MedicationDispense> medDispensedList = new ArrayList<>(tempMedDispensedList);
|
||||
medDispensedList.addAll(longMedDispensedList);
|
||||
// 统一处理已发放药品或耗材
|
||||
List<DeviceDispense> devDispensedList = new ArrayList<>(tempDevDispensedList);
|
||||
devDispensedList.addAll(longDevDispensedList);
|
||||
// 合并长期和临时的执行记录
|
||||
List<Long> procedureIdList = new ArrayList<>(longProcIdList);
|
||||
procedureIdList.addAll(tempProcIdList);
|
||||
// 查询执行记录
|
||||
List<Procedure> procedureList = procedureService.listByIds(procedureIdList);
|
||||
if (procedureList != null && !procedureList.isEmpty()) {
|
||||
for (Procedure procedure : procedureList) {
|
||||
// 根据执行记录新增取消执行记录
|
||||
procedureService.addProcedureRecord(procedure.getEncounterId(), procedure.getPatientId(),
|
||||
procedure.getRequestId(), procedure.getRequestTable(), EventStatus.CANCEL,
|
||||
ProcedureCategory.INPATIENT_ADVICE, null, procedure.getOccurrenceTime(), procedure.getGroupId(),
|
||||
procedure.getId());
|
||||
// 处理长期已发放的药品
|
||||
if (!longMedDispensedList.isEmpty()) {
|
||||
// 生成退药单
|
||||
this.creatRefundMedicationList(tempMedDispensedList, procedureIdMap);
|
||||
}
|
||||
// 处理临时已发放药品
|
||||
if (!tempMedDispensedList.isEmpty()) {
|
||||
// 生成退药单
|
||||
this.creatRefundMedicationList(tempMedDispensedList, procedureIdMap);
|
||||
// 药品退药请求状态变更(待退药)
|
||||
medicationRequestService.updateCancelledStatusBatch(
|
||||
tempMedDispensedList.stream().map(MedicationDispense::getMedReqId).toList(), null, null);
|
||||
}
|
||||
// 未发放药品需先判断是否申请汇总
|
||||
List<MedicationDispense> medUndispenseList = new ArrayList<>(tempMedUndispenseList);
|
||||
medUndispenseList.addAll(longMedUndispenseList);
|
||||
// 重新生成汇总发药单
|
||||
if (!medUndispenseList.isEmpty()) {
|
||||
// 查询所有汇总单号
|
||||
List<String> summaryNoList =
|
||||
medUndispenseList.stream().filter(x -> x.getSummaryNo() != null && !x.getSummaryNo().isEmpty())
|
||||
.map(MedicationDispense::getSummaryNo).distinct().toList();
|
||||
if (!summaryNoList.isEmpty()) {
|
||||
// 查询所有被汇总的药品发放
|
||||
List<MedicationDispense> medSummaryList =
|
||||
medicationDispenseService.getMedDispenseBySummaryNo(summaryNoList);
|
||||
// 被汇总的发药单
|
||||
Map<String, List<MedicationDispense>> medSummaryMap =
|
||||
medSummaryList.stream().filter(x -> x.getSummaryNo() != null)
|
||||
.collect(Collectors.groupingBy(MedicationDispense::getSummaryNo));
|
||||
// 被取消汇总的发药单
|
||||
Map<String, List<MedicationDispense>> medSummaryCancelMap =
|
||||
medUndispenseList.stream().filter(x -> x.getSummaryNo() != null)
|
||||
.collect(Collectors.groupingBy(MedicationDispense::getSummaryNo));
|
||||
// 过滤掉被取消汇总的发药单,重新做成汇总单
|
||||
Map<String, List<MedicationDispense>> reSummaryMap = new HashMap<>();
|
||||
// 遍历所有被汇总的发药单
|
||||
for (Map.Entry<String, List<MedicationDispense>> entry : medSummaryMap.entrySet()) {
|
||||
String summaryNo = entry.getKey();
|
||||
List<MedicationDispense> allDispenses = entry.getValue();
|
||||
// 检查是否存在对应的取消汇总记录
|
||||
if (medSummaryCancelMap.containsKey(summaryNo)) {
|
||||
// 如果存在取消记录,需要过滤掉被取消的发药单
|
||||
List<MedicationDispense> cancelDispenses = medSummaryCancelMap.get(summaryNo);
|
||||
// 创建被取消的发药单ID集合,便于快速查找
|
||||
Set<Long> cancelIds =
|
||||
cancelDispenses.stream().map(MedicationDispense::getId).collect(Collectors.toSet());
|
||||
// 过滤出未被取消的发药单
|
||||
List<MedicationDispense> remainingDispenses = allDispenses.stream()
|
||||
.filter(dispense -> !cancelIds.contains(dispense.getId())).collect(Collectors.toList());
|
||||
// 只有当还有剩余的发药单时才加入结果
|
||||
if (!remainingDispenses.isEmpty()) {
|
||||
reSummaryMap.put(summaryNo, remainingDispenses);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!reSummaryMap.isEmpty()) {
|
||||
for (Map.Entry<String, List<MedicationDispense>> entry : reSummaryMap.entrySet()) {
|
||||
List<MedicationDispense> medicationDispenses = entry.getValue();
|
||||
// 查询药品信息
|
||||
List<MedicationDefinition> medicationDefinitions = medicationDefinitionService
|
||||
.listByIds(medicationDispenses.stream().map(MedicationDispense::getMedicationId).toList());
|
||||
// 汇总单据号
|
||||
String busNo = assignSeqUtil.getSeqByDay(AssignSeqEnum.MEDICINE_SUMMARY_NO.getPrefix(), 4);
|
||||
// 根据相同批号的同一药品进行汇总
|
||||
Map<String, List<MedicationDispense>> medicationSummaryInfoMap =
|
||||
medicationDispenses.stream().collect(Collectors
|
||||
.groupingBy(x -> x.getMedicationId() + CommonConstants.Common.DASH + x.getLotNumber()));
|
||||
for (Map.Entry<String,
|
||||
List<MedicationDispense>> medicationSummaryInfoList : medicationSummaryInfoMap.entrySet()) {
|
||||
List<MedicationDispense> medicationSummaryList = medicationSummaryInfoList.getValue();
|
||||
MedicationDispense medicationDispense = medicationSummaryList.get(0);
|
||||
Long medicationId = medicationDispense.getMedicationId();
|
||||
Long locationId = medicationDispense.getLocationId();
|
||||
String lotNumber = medicationDispense.getLotNumber();
|
||||
Long patientId = medicationDispense.getPatientId();
|
||||
// 拆零比例
|
||||
BigDecimal partPercent = BigDecimal.ONE;
|
||||
// 最小单位
|
||||
String minUnitCode = null;
|
||||
// 单位
|
||||
String unitCode = null;
|
||||
// 根据药品id获取对应的药品信息
|
||||
Optional<MedicationDefinition> medicationDefinition =
|
||||
medicationDefinitions.stream().filter(x -> x.getId().equals(medicationId)).findFirst();
|
||||
if (medicationDefinition.isPresent()) {
|
||||
partPercent = medicationDefinition.get().getPartPercent();
|
||||
minUnitCode = medicationDefinition.get().getMinUnitCode();
|
||||
unitCode = medicationDefinition.get().getUnitCode();
|
||||
}
|
||||
if (minUnitCode == null || unitCode == null || partPercent == null) {
|
||||
throw new ServiceException("药品信息有误,请联系管理员");
|
||||
}
|
||||
// 最小单位数量
|
||||
BigDecimal minQuantity = BigDecimal.ZERO;
|
||||
for (MedicationDispense medicationSummaryInfo : medicationSummaryList) {
|
||||
BigDecimal quantity = medicationSummaryInfo.getQuantity();
|
||||
if (unitCode.equals(medicationDispense.getUnitCode())) {
|
||||
// 转换为小单位进行累加
|
||||
quantity = medicationSummaryInfo.getQuantity().multiply(partPercent);
|
||||
}
|
||||
minQuantity = minQuantity.add(quantity);
|
||||
}
|
||||
Long supplyRequestId = supplyRequestService.createSummarySupplyRequest(medicationId,
|
||||
locationId, lotNumber, patientId, minQuantity, minUnitCode, null, null, busNo);
|
||||
supplyDeliveryService.createSummarySupplyDelivery(medicationId, lotNumber, patientId,
|
||||
minQuantity, minUnitCode, null, supplyRequestId);
|
||||
}
|
||||
}
|
||||
// 删除原汇总单
|
||||
List<String> delSummaryNoList = reSummaryMap.keySet().stream().toList();
|
||||
// 取消汇总申请(软删除)
|
||||
List<Long> requestIdList = supplyRequestService.cancelSummarySupplyRequest(delSummaryNoList);
|
||||
// 软删除汇总发放
|
||||
supplyDeliveryService.deleteSupplyDeliveryByReqId(requestIdList);
|
||||
// 取消药品汇总
|
||||
medicationDispenseService.cancelMedicationSummary(delSummaryNoList);
|
||||
}
|
||||
}
|
||||
}
|
||||
return R.ok("取消执行成功");
|
||||
// 处理临时未发放的药品
|
||||
if (!tempMedUndispenseList.isEmpty()) {
|
||||
// 排除已汇总的药品
|
||||
List<MedicationDispense> medicationDispenseList =
|
||||
tempMedUndispenseList.stream().filter(x -> x.getSummaryNo() == null).toList();
|
||||
// 更新状态为草稿
|
||||
medicationDispenseService.updateDispenseStatus(
|
||||
medicationDispenseList.stream().map(MedicationDispense::getId).toList(),
|
||||
DispenseStatus.DRAFT.getValue());
|
||||
}
|
||||
// 处理长期未发的药品
|
||||
if (!longMedUndispenseList.isEmpty()) {
|
||||
// 排除已汇总的药品
|
||||
List<MedicationDispense> medicationDispenseList =
|
||||
tempMedUndispenseList.stream().filter(x -> x.getSummaryNo() == null).toList();
|
||||
medicationDispenseService
|
||||
.removeByIds(medicationDispenseList.stream().map(MedicationDispense::getId).toList());
|
||||
}
|
||||
// 根据执行记录查询生成的耗材发放单
|
||||
List<DeviceDispense> deviceDispenseList = deviceDispenseService.getDevDispenseByProcedureId(procedureIdList);
|
||||
if (deviceDispenseList != null && !deviceDispenseList.isEmpty()) {
|
||||
// 软删除对应的耗材申请,耗材发放
|
||||
deviceDispenseService.removeByIds(deviceDispenseList.stream().map(DeviceDispense::getId).toList());
|
||||
deviceRequestService.removeByIds(deviceDispenseList.stream().map(DeviceDispense::getDeviceReqId).toList());
|
||||
}
|
||||
return R.ok("取消执行成功,相关汇总领药单已重新生成");
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -522,11 +649,29 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService {
|
||||
*/
|
||||
@Override
|
||||
public R<?> adviceVoid(AdviceExecuteParam adviceExecuteParam) {
|
||||
// 长期临时都可以不执行,长期不执行的是某一时间点,也可以不执行这一整个医嘱(更新serviceRequest状态为7)
|
||||
// 已执行的时间点不能不执行,需要先取消
|
||||
// 增加不执行记录
|
||||
// 不执行的医嘱还可以再执行(暂时不做限制)
|
||||
return null;
|
||||
List<AdviceExecuteDetailParam> adviceExecuteDetailList = adviceExecuteParam.getAdviceExecuteDetailList();
|
||||
|
||||
// 判断是否有空的pID
|
||||
for (AdviceExecuteDetailParam adviceExecuteDetailParam : adviceExecuteDetailList)
|
||||
if (adviceExecuteDetailParam.getProcedureId() != null)
|
||||
return R.fail("执行失败");
|
||||
|
||||
for (AdviceExecuteDetailParam adviceExecuteDetailParam : adviceExecuteDetailList) {
|
||||
for (String executeTime : adviceExecuteDetailParam.getExecuteTimes()) {
|
||||
// 生成执行记录
|
||||
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
||||
// 转换为 LocalDateTime
|
||||
LocalDateTime localDateTime = LocalDateTime.parse(executeTime, formatter);
|
||||
// 转换为 Date
|
||||
Date exeDate = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
|
||||
// 根据执行记录新增不执行记录
|
||||
procedureService.addProcedureRecord(adviceExecuteDetailParam.getEncounterId(),
|
||||
adviceExecuteDetailParam.getPatientId(), adviceExecuteDetailParam.getRequestId(),
|
||||
adviceExecuteDetailParam.getAdviceTable(), EventStatus.STOPPED, ProcedureCategory.INPATIENT_ADVICE,
|
||||
null, exeDate, adviceExecuteDetailParam.getGroupId(), null);
|
||||
}
|
||||
}
|
||||
return R.ok("不执行成功");
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -537,15 +682,15 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService {
|
||||
private void exeMedication(List<MedicationRequestUseExe> medUseExeList) {
|
||||
// 长期医嘱
|
||||
List<MedicationRequestUseExe> longMedication = medUseExeList.stream()
|
||||
.filter(e -> TherapyTimeType.LONG_TERM.getValue().equals(e.getTherapyEnum())).collect(Collectors.toList());
|
||||
.filter(e -> TherapyTimeType.LONG_TERM.getValue().equals(e.getTherapyEnum())).toList();
|
||||
// 临时医嘱
|
||||
List<MedicationRequestUseExe> tempMedication = medUseExeList.stream()
|
||||
.filter(e -> TherapyTimeType.TEMPORARY.getValue().equals(e.getTherapyEnum())).collect(Collectors.toList());
|
||||
.filter(e -> TherapyTimeType.TEMPORARY.getValue().equals(e.getTherapyEnum())).toList();
|
||||
// 药品定义id集合
|
||||
List<Long> medicationDefinitionIdList =
|
||||
medUseExeList.stream().map(MedicationRequestUseExe::getMedicationId).collect(Collectors.toList());
|
||||
// 医嘱详细信息
|
||||
List<AdviceBaseDto> medicationInfos = iDoctorStationAdviceAppService.getAdviceBaseInfo(null, null, null,
|
||||
List<AdviceBaseDto> medicationInfos = doctorStationAdviceAppService.getAdviceBaseInfo(null, null, null,
|
||||
medicationDefinitionIdList, 0L, 1, 500, Whether.NO.getValue(), List.of(1)).getRecords();
|
||||
|
||||
// 当前时间
|
||||
@@ -576,12 +721,14 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService {
|
||||
ProcedureCategory.INPATIENT_ADVICE, null, exeDate, longMedicationRequest.getGroupId(), null);
|
||||
|
||||
// 生成药品发放
|
||||
medicationDispenseService.generateMedicationDispense(longMedicationRequest, procedureId);
|
||||
Long dispenseId =
|
||||
medicationDispenseService.generateMedicationDispense(longMedicationRequest, procedureId, exeDate);
|
||||
|
||||
// 生成账单
|
||||
chargeItem = new ChargeItem();
|
||||
chargeItem.setStatusEnum(ChargeItemStatus.BILLABLE.getValue()); // 收费状态
|
||||
chargeItem.setBusNo(AssignSeqEnum.CHARGE_ITEM_NO.getPrefix().concat(longMedicationRequest.getBusNo()));
|
||||
chargeItem.setGenerateSourceEnum(GenerateSource.ORDER_EXECUTE.getValue()); // 生成来源
|
||||
chargeItem.setPrescriptionNo(longMedicationRequest.getPrescriptionNo()); // 处方号
|
||||
chargeItem.setPatientId(longMedicationRequest.getPatientId()); // 患者
|
||||
chargeItem.setContextEnum(ChargeItemContext.MEDICATION.getValue()); // 类型
|
||||
@@ -596,7 +743,10 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService {
|
||||
chargeItem.setAccountId(medicationRequestUseExe.getAccountId());// 关联账户ID
|
||||
chargeItem.setConditionId(longMedicationRequest.getConditionId()); // 诊断id
|
||||
chargeItem.setEncounterDiagnosisId(longMedicationRequest.getEncounterDiagnosisId()); // 就诊诊断id
|
||||
chargeItem.setProcedureId(procedureId);
|
||||
chargeItem.setProcedureId(procedureId); // 执行id
|
||||
chargeItem.setDispenseTable(CommonConstants.TableName.MED_MEDICATION_DISPENSE); // 发放表名
|
||||
// chargeItem.setDispenseId(dispenseId); // 发放ID
|
||||
|
||||
// ------------------------------ 匹配定价信息
|
||||
// 根据 medicationId 查找对应的医嘱信息
|
||||
MedicationRequest finalLongMedicationRequest = longMedicationRequest;
|
||||
@@ -604,7 +754,7 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService {
|
||||
.filter(
|
||||
advice -> finalLongMedicationRequest.getMedicationId().equals(advice.getAdviceDefinitionId()))
|
||||
.findFirst();
|
||||
if (!matchedAdvice.isPresent()) {
|
||||
if (matchedAdvice.isEmpty()) {
|
||||
throw new RuntimeException(
|
||||
"未找到对应的医嘱信息,medicationId: " + finalLongMedicationRequest.getMedicationId());
|
||||
}
|
||||
@@ -616,18 +766,18 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService {
|
||||
Optional<AdvicePriceDto> matchedPrice = advice.getPriceList().stream()
|
||||
.filter(price -> finalLongMedicationRequest.getLotNumber().equals(price.getConditionValue()))
|
||||
.findFirst();
|
||||
if (!matchedPrice.isPresent()) {
|
||||
if (matchedPrice.isEmpty()) {
|
||||
throw new RuntimeException("未找到匹配的定价信息,lotNumber: " + finalLongMedicationRequest.getLotNumber());
|
||||
}
|
||||
AdvicePriceDto priceDto = matchedPrice.get();
|
||||
// 计算价格
|
||||
BigDecimal price;
|
||||
if (finalLongMedicationRequest.getUnitCode().equals(priceDto.getUnitCode())) {
|
||||
// unitCode 匹配,直接取 price
|
||||
// (大单位)unitCode 匹配,直接取 price
|
||||
price = priceDto.getPrice();
|
||||
} else {
|
||||
// unitCode 不匹配,计算 price / partPercent
|
||||
price = priceDto.getPrice().divide(partPercent, RoundingMode.HALF_UP);
|
||||
// (小单位)unitCode 不匹配,计算 price / partPercent
|
||||
price = priceDto.getPrice().divide(partPercent, 6, RoundingMode.HALF_UP);
|
||||
}
|
||||
chargeItem.setDefinitionId(priceDto.getDefinitionId()); // 费用定价ID
|
||||
chargeItem.setDefDetailId(priceDto.getDefinitionDetailId()); // 定价子表主键
|
||||
@@ -635,7 +785,7 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService {
|
||||
chargeItem.setQuantityUnit(longMedicationRequest.getUnitCode()); // 单位
|
||||
chargeItem.setUnitPrice(price); // 单价
|
||||
chargeItem.setTotalPrice(
|
||||
longMedicationRequest.getQuantity().multiply(price).setScale(4, RoundingMode.HALF_UP)); // 总价
|
||||
longMedicationRequest.getQuantity().multiply(price).setScale(6, RoundingMode.HALF_UP)); // 总价
|
||||
|
||||
chargeItemService.saveOrUpdate(chargeItem);
|
||||
}
|
||||
@@ -683,15 +833,15 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService {
|
||||
private void exeActivity(List<ServiceRequestUseExe> actUseExeList) {
|
||||
// 长期医嘱
|
||||
List<ServiceRequestUseExe> longActivity = actUseExeList.stream()
|
||||
.filter(e -> TherapyTimeType.LONG_TERM.getValue().equals(e.getTherapyEnum())).collect(Collectors.toList());
|
||||
.filter(e -> TherapyTimeType.LONG_TERM.getValue().equals(e.getTherapyEnum())).toList();
|
||||
// 临时医嘱
|
||||
List<ServiceRequestUseExe> tempActivity = actUseExeList.stream()
|
||||
.filter(e -> TherapyTimeType.TEMPORARY.getValue().equals(e.getTherapyEnum())).collect(Collectors.toList());
|
||||
.filter(e -> TherapyTimeType.TEMPORARY.getValue().equals(e.getTherapyEnum())).toList();
|
||||
// 诊疗定义id集合
|
||||
List<Long> activityDefinitionIdList =
|
||||
actUseExeList.stream().map(ServiceRequestUseExe::getActivityId).collect(Collectors.toList());
|
||||
// 医嘱详细信息
|
||||
List<AdviceBaseDto> activityInfos = iDoctorStationAdviceAppService.getAdviceBaseInfo(null, null, null,
|
||||
List<AdviceBaseDto> activityInfos = doctorStationAdviceAppService.getAdviceBaseInfo(null, null, null,
|
||||
activityDefinitionIdList, 0L, 1, 500, Whether.NO.getValue(), List.of(3)).getRecords();
|
||||
|
||||
// 当前时间
|
||||
@@ -701,10 +851,15 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService {
|
||||
// 当前登录账号的科室id
|
||||
Long orgId = SecurityUtils.getLoginUser().getOrgId();
|
||||
|
||||
Date clickDate = new Date();
|
||||
|
||||
// 长期
|
||||
ServiceRequest longServiceRequest;
|
||||
ChargeItem chargeItem;
|
||||
for (ServiceRequestUseExe serviceRequestUseExe : longActivity) {
|
||||
// 查询耗材的取药科室
|
||||
Long takeDeviceLocationId = doctorStationAdviceAppMapper
|
||||
.getTakeDeviceLocationId(serviceRequestUseExe.getEncounterId(), ItemCategoryCode.DEVICE.getCode());
|
||||
for (String executeTime : serviceRequestUseExe.getExecuteTimes()) {
|
||||
longServiceRequest = new ServiceRequest();
|
||||
BeanUtils.copyProperties(serviceRequestUseExe, longServiceRequest);
|
||||
@@ -725,6 +880,7 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService {
|
||||
chargeItem = new ChargeItem();
|
||||
chargeItem.setStatusEnum(ChargeItemStatus.BILLABLE.getValue()); // 收费状态
|
||||
chargeItem.setBusNo(AssignSeqEnum.CHARGE_ITEM_NO.getPrefix().concat(longServiceRequest.getBusNo()));
|
||||
chargeItem.setGenerateSourceEnum(GenerateSource.ORDER_EXECUTE.getValue()); // 生成来源
|
||||
chargeItem.setPatientId(longServiceRequest.getPatientId()); // 患者
|
||||
chargeItem.setContextEnum(ChargeItemContext.ACTIVITY.getValue()); // 类型
|
||||
chargeItem.setEncounterId(longServiceRequest.getEncounterId()); // 就诊id
|
||||
@@ -745,7 +901,7 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService {
|
||||
Optional<AdviceBaseDto> matchedAdvice = activityInfos.stream()
|
||||
.filter(advice -> finalLongServiceRequest.getActivityId().equals(advice.getAdviceDefinitionId()))
|
||||
.findFirst();
|
||||
if (!matchedAdvice.isPresent()) {
|
||||
if (matchedAdvice.isEmpty()) {
|
||||
throw new RuntimeException("未找到对应的医嘱信息,activityId: " + finalLongServiceRequest.getActivityId());
|
||||
}
|
||||
// 医嘱信息
|
||||
@@ -760,14 +916,21 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService {
|
||||
chargeItem.setQuantityUnit(longServiceRequest.getUnitCode()); // 单位
|
||||
chargeItem.setUnitPrice(price); // 单价
|
||||
chargeItem
|
||||
.setTotalPrice(longServiceRequest.getQuantity().multiply(price).setScale(4, RoundingMode.HALF_UP)); // 总价
|
||||
.setTotalPrice(longServiceRequest.getQuantity().multiply(price).setScale(6, RoundingMode.HALF_UP)); // 总价
|
||||
chargeItemService.saveOrUpdate(chargeItem);
|
||||
|
||||
// 处理诊疗绑定耗材
|
||||
this.handleBindDevice(longServiceRequest, procedureId, takeDeviceLocationId, curDate, practitionerId,
|
||||
orgId, serviceRequestUseExe.getAccountId(), exeDate, clickDate);
|
||||
}
|
||||
}
|
||||
|
||||
// 临时
|
||||
ServiceRequest tempServiceRequest;
|
||||
for (ServiceRequestUseExe serviceRequestUseExe : tempActivity) {
|
||||
// 查询耗材的取药科室
|
||||
Long takeDeviceLocationId = doctorStationAdviceAppMapper
|
||||
.getTakeDeviceLocationId(serviceRequestUseExe.getEncounterId(), ItemCategoryCode.DEVICE.getCode());
|
||||
for (String executeTime : serviceRequestUseExe.getExecuteTimes()) {
|
||||
tempServiceRequest = new ServiceRequest();
|
||||
BeanUtils.copyProperties(serviceRequestUseExe, tempServiceRequest);
|
||||
@@ -789,11 +952,201 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService {
|
||||
new LambdaUpdateWrapper<ChargeItem>().eq(ChargeItem::getServiceId, tempServiceRequest.getId())
|
||||
.set(ChargeItem::getProcedureId, procedureId)
|
||||
.set(ChargeItem::getStatusEnum, ChargeItemStatus.BILLABLE.getValue()));
|
||||
|
||||
// 处理诊疗绑定耗材
|
||||
this.handleBindDevice(tempServiceRequest, procedureId, takeDeviceLocationId, curDate, practitionerId,
|
||||
orgId, serviceRequestUseExe.getAccountId(), exeDate, clickDate);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理诊疗绑定耗材
|
||||
*
|
||||
* @param serviceRequest 诊疗请求
|
||||
* @param procedureId 执行id
|
||||
* @param locationId 取耗材的库房id
|
||||
* @param curDate 时间
|
||||
* @param practitionerId 参与者id
|
||||
* @param orgId 当前登录账号的科室id
|
||||
* @param accountId 支付账号ID
|
||||
* @param exeDate 执行时间(页面传的)
|
||||
* @param clickDate 执行时间(实际点击时间)
|
||||
*/
|
||||
private void handleBindDevice(ServiceRequest serviceRequest, Long procedureId, Long locationId, Date curDate,
|
||||
Long practitionerId, Long orgId, Long accountId, Date exeDate, Date clickDate) {
|
||||
// 查询诊疗绑定耗材的信息
|
||||
List<ActivityBindDeviceDetailDto> activityBindDevice =
|
||||
doctorStationAdviceAppMapper.getActivityBindDevice(serviceRequest.getActivityId() + "",
|
||||
PublicationStatus.ACTIVE.getValue(), CommonConstants.TableName.ADM_DEVICE_DEFINITION);
|
||||
// 满足此条件,说明诊疗绑了耗材
|
||||
if (!activityBindDevice.isEmpty()) {
|
||||
if (locationId == null) {
|
||||
throw new RuntimeException("【" + serviceRequest.getBusNo() + "】诊疗请求,绑定的耗材未配置发放耗材房");
|
||||
}
|
||||
// 耗材定义id集合
|
||||
List<Long> deviceIds =
|
||||
activityBindDevice.stream().map(ActivityBindDeviceDetailDto::getDeviceId).collect(Collectors.toList());
|
||||
// 耗材库存集合
|
||||
List<AdviceInventoryDto> adviceInventoryList = doctorStationAdviceAppMapper.getAdviceInventory(locationId,
|
||||
deviceIds, CommonConstants.SqlCondition.ABOUT_INVENTORY_TABLE_STR, PublicationStatus.ACTIVE.getValue());
|
||||
// 待发放个数信息
|
||||
List<AdviceInventoryDto> adviceDraftInventoryList = doctorStationAdviceAppMapper.getAdviceDraftInventory(
|
||||
CommonConstants.TableName.MED_MEDICATION_DEFINITION, CommonConstants.TableName.ADM_DEVICE_DEFINITION,
|
||||
DispenseStatus.DRAFT.getValue(), DispenseStatus.PREPARATION.getValue());
|
||||
// 预减库存
|
||||
List<AdviceInventoryDto> adviceInventory =
|
||||
adviceUtils.subtractInventory(adviceInventoryList, adviceDraftInventoryList);
|
||||
|
||||
// 耗材医嘱详细信息
|
||||
List<AdviceBaseDto> deviceInfos = doctorStationAdviceAppService
|
||||
.getAdviceBaseInfo(null, null, null, deviceIds, 0L, 1, 500, Whether.NO.getValue(), List.of(2))
|
||||
.getRecords();
|
||||
|
||||
DeviceRequest deviceRequest;
|
||||
BigDecimal minUnitCodeQuantity;
|
||||
ChargeItem chargeItem;
|
||||
for (ActivityBindDeviceDetailDto activityBindDeviceDetailDto : activityBindDevice) {
|
||||
Optional<AdviceInventoryDto> matchedInventory = adviceInventory.stream()
|
||||
.filter(inventoryDto -> activityBindDeviceDetailDto.getDeviceId().equals(inventoryDto.getItemId())
|
||||
&& CommonConstants.TableName.ADM_DEVICE_DEFINITION.equals(inventoryDto.getItemTable())
|
||||
&& locationId.equals(inventoryDto.getLocationId()))
|
||||
.findFirst();
|
||||
// 匹配到库存信息,并校验
|
||||
if (matchedInventory.isPresent()) {
|
||||
AdviceInventoryDto inventoryDto = matchedInventory.get();
|
||||
if (activityBindDeviceDetailDto.getMinUnitCodeQuantity()
|
||||
.compareTo(inventoryDto.getQuantity()) > 0) {
|
||||
throw new RuntimeException("【" + serviceRequest.getBusNo() + "】诊疗请求,绑定的耗材数量不足");
|
||||
}
|
||||
} else {
|
||||
throw new RuntimeException("【" + serviceRequest.getBusNo() + "】诊疗请求,绑定的耗材未匹配到库存信息");
|
||||
}
|
||||
// 根据 deviceId 查找对应的医嘱信息
|
||||
Optional<AdviceBaseDto> deviceAdvice = deviceInfos.stream()
|
||||
.filter(advice -> activityBindDeviceDetailDto.getDeviceId().equals(advice.getAdviceDefinitionId()))
|
||||
.findFirst();
|
||||
if (deviceAdvice.isEmpty()) {
|
||||
throw new RuntimeException("未找到对应的医嘱信息,deviceId: " + activityBindDeviceDetailDto.getDeviceId());
|
||||
}
|
||||
AdviceBaseDto advice = deviceAdvice.get();
|
||||
|
||||
// 生成耗材请求
|
||||
deviceRequest = new DeviceRequest();
|
||||
deviceRequest.setBusNo(assignSeqUtil.getSeqByDay(AssignSeqEnum.DEVICE_RES_NO.getPrefix(), 4)); // 耗材请求编码
|
||||
deviceRequest.setGenerateSourceEnum(GenerateSource.ORDER_EXECUTE.getValue()); // 生成来源
|
||||
deviceRequest.setStatusEnum(RequestStatus.COMPLETED.getValue()); // 请求状态
|
||||
deviceRequest.setBasedOnId(serviceRequest.getId());
|
||||
deviceRequest.setBasedOnTable(CommonConstants.TableName.WOR_SERVICE_REQUEST);
|
||||
deviceRequest.setQuantity(activityBindDeviceDetailDto.getQuantity()); // 请求数量
|
||||
deviceRequest.setUnitCode(activityBindDeviceDetailDto.getUnitCode()); // 请求单位编码
|
||||
// deviceRequest.setLotNumber();// 产品批号
|
||||
deviceRequest.setCategoryEnum(Integer.valueOf(advice.getCategoryCode())); // 请求类型
|
||||
deviceRequest.setDeviceDefId(activityBindDeviceDetailDto.getDeviceId());// 耗材定义id
|
||||
deviceRequest.setPatientId(serviceRequest.getPatientId()); // 患者
|
||||
deviceRequest.setRequesterId(practitionerId); // 开方人
|
||||
deviceRequest.setOrgId(orgId);// 开方人科室
|
||||
deviceRequest.setReqAuthoredTime(clickDate); // 请求开始时间
|
||||
deviceRequest.setPerformLocation(locationId); // 发放耗材房
|
||||
deviceRequest.setEncounterId(serviceRequest.getEncounterId()); // 就诊id
|
||||
deviceRequest.setConditionId(serviceRequest.getConditionId()); // 诊断id
|
||||
deviceRequest.setEncounterDiagnosisId(serviceRequest.getEncounterDiagnosisId()); // 就诊诊断id
|
||||
|
||||
deviceRequestService.save(deviceRequest);
|
||||
|
||||
// 需要的耗材数量(小单位)
|
||||
minUnitCodeQuantity = activityBindDeviceDetailDto.getMinUnitCodeQuantity();
|
||||
// 单位(小单位)
|
||||
// String minUnitCode = activityBindDeviceDetailDto.getMinUnitCode();
|
||||
// 库存集合
|
||||
List<AdviceInventoryDto> inventoryList = advice.getInventoryList();
|
||||
// 价格集合
|
||||
List<AdvicePriceDto> priceList = advice.getPriceList();
|
||||
// 剩余需要分配的数量
|
||||
BigDecimal remainingQuantity = minUnitCodeQuantity;
|
||||
// 按批次循环分配数量
|
||||
for (AdviceInventoryDto inventory : inventoryList) {
|
||||
if (remainingQuantity.compareTo(BigDecimal.ZERO) <= 0) {
|
||||
break;
|
||||
}
|
||||
// 可用量
|
||||
BigDecimal availableQuantity = inventory.getQuantity();
|
||||
// 实际供应量
|
||||
BigDecimal actualQuantity;
|
||||
if (availableQuantity.compareTo(remainingQuantity) >= 0) {
|
||||
// 当前批次足够满足剩余需求
|
||||
actualQuantity = remainingQuantity;
|
||||
remainingQuantity = BigDecimal.ZERO;
|
||||
} else {
|
||||
// 当前批次全部用完
|
||||
actualQuantity = availableQuantity;
|
||||
remainingQuantity = remainingQuantity.subtract(availableQuantity);
|
||||
}
|
||||
// 批次号
|
||||
String lotNumber = inventory.getLotNumber();
|
||||
// 查找对应批次的价格
|
||||
AdvicePriceDto priceInfos = findPriceByLotNumber(inventory.getLotNumber(), priceList);
|
||||
|
||||
// 根据批次库存量,生成耗材发放
|
||||
deviceRequest.setQuantity(actualQuantity);
|
||||
deviceRequest.setLotNumber(lotNumber);
|
||||
// 发放ID
|
||||
Long dispenseId =
|
||||
deviceDispenseService.generateDeviceDispense(deviceRequest, procedureId, locationId, exeDate);
|
||||
|
||||
// 根据批次库存量,生成账单
|
||||
chargeItem = new ChargeItem();
|
||||
chargeItem.setStatusEnum(ChargeItemStatus.BILLABLE.getValue()); // 收费状态
|
||||
chargeItem.setBusNo(AssignSeqEnum.CHARGE_ITEM_NO.getPrefix().concat(deviceRequest.getBusNo()));
|
||||
chargeItem.setGenerateSourceEnum(GenerateSource.ORDER_EXECUTE.getValue()); // 生成来源
|
||||
chargeItem.setPatientId(deviceRequest.getPatientId()); // 患者
|
||||
chargeItem.setContextEnum(ChargeItemContext.DEVICE.getValue()); // 类型
|
||||
chargeItem.setEncounterId(deviceRequest.getEncounterId()); // 就诊id
|
||||
chargeItem.setDefinitionId(priceInfos.getDefinitionId()); // 费用定价ID
|
||||
chargeItem.setDefDetailId(priceInfos.getDefinitionDetailId()); // 定价子表主键
|
||||
chargeItem.setEntererId(practitionerId);// 开立人ID
|
||||
chargeItem.setRequestingOrgId(orgId); // 开立科室
|
||||
chargeItem.setEnteredDate(curDate); // 开立时间
|
||||
chargeItem.setServiceTable(CommonConstants.TableName.WOR_DEVICE_REQUEST);// 医疗服务类型
|
||||
chargeItem.setServiceId(deviceRequest.getId()); // 医疗服务ID
|
||||
chargeItem.setProductTable(CommonConstants.TableName.ADM_DEVICE_DEFINITION);// 产品所在表
|
||||
chargeItem.setProductId(activityBindDeviceDetailDto.getDeviceId());// 收费项id
|
||||
chargeItem.setAccountId(accountId);// 关联账户ID
|
||||
chargeItem.setConditionId(deviceRequest.getConditionId()); // 诊断id
|
||||
chargeItem.setEncounterDiagnosisId(deviceRequest.getEncounterDiagnosisId()); // 就诊诊断id
|
||||
chargeItem.setDispenseTable(CommonConstants.TableName.WOR_DEVICE_DISPENSE); // 发放表名
|
||||
// chargeItem.setDispenseId(dispenseId); // 发放ID
|
||||
|
||||
chargeItem.setQuantityValue(actualQuantity); // 数量
|
||||
chargeItem.setQuantityUnit(priceInfos.getUnitCode()); // 单位
|
||||
chargeItem.setUnitPrice(priceInfos.getPrice()); // 单价
|
||||
chargeItem.setTotalPrice(
|
||||
actualQuantity.multiply(priceInfos.getPrice()).setScale(6, RoundingMode.HALF_UP)); // 总价
|
||||
|
||||
chargeItemService.save(chargeItem);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据批次号查找价格
|
||||
*
|
||||
* @param lotNumber 批次号
|
||||
* @param priceList 价格列表
|
||||
* @return 价格信息,如果找不到则返回null
|
||||
*/
|
||||
private AdvicePriceDto findPriceByLotNumber(String lotNumber, List<AdvicePriceDto> priceList) {
|
||||
if (priceList == null || priceList.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
return priceList.stream().filter(price -> Objects.equals(price.getConditionValue(), lotNumber)).findFirst()
|
||||
.get();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 组装药品请求用于执行的数据结构
|
||||
*
|
||||
@@ -900,4 +1253,31 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService {
|
||||
return actUseExeList;
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成退药单
|
||||
*
|
||||
* @param longMedDispensedList 已发放的药品列表
|
||||
* @param procedureIdMap 执行idMap
|
||||
*/
|
||||
private void creatRefundMedicationList(List<MedicationDispense> longMedDispensedList,
|
||||
Map<Long, Long> procedureIdMap) {
|
||||
List<MedicationDispense> medicationRefundList = new ArrayList<>();
|
||||
// 根据发药单对应生成退药单
|
||||
for (MedicationDispense medicationDispense : longMedDispensedList) {
|
||||
// 药品发放编码
|
||||
medicationDispense.setBusNo(assignSeqUtil.getSeqByDay(AssignSeqEnum.MEDICATION_DIS_NO.getPrefix(), 4));
|
||||
// 退药状态
|
||||
medicationDispense.setStatusEnum(DispenseStatus.PREPARATION.getValue());
|
||||
// 状态变更时间
|
||||
medicationDispense.setStatusChangedTime(DateUtils.getNowDate());
|
||||
// 取消执行id
|
||||
Long newProcedureId = procedureIdMap.get(medicationDispense.getProcedureId());
|
||||
if (newProcedureId != null) {
|
||||
medicationDispense.setProcedureId(newProcedureId);
|
||||
}
|
||||
medicationDispense.setId(null);
|
||||
medicationRefundList.add(medicationDispense);
|
||||
}
|
||||
medicationDispenseService.saveBatch(medicationRefundList);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,33 +7,31 @@ import java.util.stream.Collectors;
|
||||
import javax.annotation.Resource;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.core.common.constant.HttpStatus;
|
||||
import com.core.common.core.domain.R;
|
||||
import com.core.common.exception.ServiceException;
|
||||
import com.core.common.utils.*;
|
||||
import com.openhis.common.constant.CommonConstants;
|
||||
import com.openhis.common.constant.PromptMsgConstant;
|
||||
import com.openhis.common.enums.*;
|
||||
import com.openhis.common.enums.ybenums.YbDrordType;
|
||||
import com.openhis.common.utils.EnumUtils;
|
||||
import com.openhis.common.utils.HisQueryUtils;
|
||||
import com.openhis.medication.domain.MedicationDefinition;
|
||||
import com.openhis.medication.domain.MedicationDispense;
|
||||
import com.openhis.medication.service.IMedicationDefinitionService;
|
||||
import com.openhis.medication.service.IMedicationDispenseService;
|
||||
import com.openhis.web.inhospitalnursestation.appservice.IMedicineSummaryAppService;
|
||||
import com.openhis.web.inhospitalnursestation.dto.InpatientMedicineEncounterInfoDto;
|
||||
import com.openhis.web.inhospitalnursestation.dto.InpatientMedicinePrescriptionInfoDto;
|
||||
import com.openhis.web.inhospitalnursestation.dto.InpatientMedicineSearchParam;
|
||||
import com.openhis.web.inhospitalnursestation.mapper.InpatientMedicineCollectionMapper;
|
||||
import com.openhis.web.pharmacymanage.dto.InventoryDto;
|
||||
import com.openhis.web.inhospitalnursestation.dto.DispenseFormSearchParam;
|
||||
import com.openhis.web.inhospitalnursestation.dto.MedicineDispenseFormDto;
|
||||
import com.openhis.web.inhospitalnursestation.dto.MedicineSummaryFormDto;
|
||||
import com.openhis.web.inhospitalnursestation.dto.MedicineSummaryParam;
|
||||
import com.openhis.web.inhospitalnursestation.mapper.MedicineSummaryAppMapper;
|
||||
import com.openhis.web.pharmacymanage.dto.UnDispenseInventoryDto;
|
||||
import com.openhis.web.pharmacymanage.mapper.ReturnMedicineMapper;
|
||||
import com.openhis.workflow.domain.InventoryItem;
|
||||
import com.openhis.workflow.domain.SupplyDelivery;
|
||||
import com.openhis.workflow.domain.SupplyRequest;
|
||||
import com.openhis.workflow.service.IDeviceDispenseService;
|
||||
import com.openhis.workflow.service.ISupplyDeliveryService;
|
||||
import com.openhis.workflow.service.ISupplyRequestService;
|
||||
|
||||
@@ -49,236 +47,200 @@ public class MedicineSummaryAppServiceImpl implements IMedicineSummaryAppService
|
||||
@Resource
|
||||
private AssignSeqUtil assignSeqUtil;
|
||||
|
||||
@Autowired
|
||||
@Resource
|
||||
private IMedicationDispenseService medicationDispenseService;
|
||||
|
||||
@Autowired
|
||||
private IDeviceDispenseService deviceDispenseService;
|
||||
@Resource
|
||||
private MedicineSummaryAppMapper medicineSummaryAppMapper;
|
||||
|
||||
@Autowired
|
||||
private InpatientMedicineCollectionMapper inpatientMedicineCollectionMapper;
|
||||
@Resource
|
||||
private ISupplyRequestService supplyRequestService;
|
||||
|
||||
@Resource
|
||||
private ISupplyDeliveryService supplyDeliveryService;
|
||||
@Autowired
|
||||
|
||||
@Resource
|
||||
private IMedicationDefinitionService medicationDefinitionService;
|
||||
|
||||
@Resource
|
||||
private ReturnMedicineMapper returnMedicineMapper;
|
||||
|
||||
/**
|
||||
* 分页查询在科病人列表
|
||||
* 查询发药单信息
|
||||
*
|
||||
* @param searchParam 查询条件
|
||||
* @param searchKey 模糊查询关键字
|
||||
* @param dispenseFormSearchParam 查询条件
|
||||
* @param pageNo 当前页码
|
||||
* @param pageSize 查询条数
|
||||
* @param request 请求数据
|
||||
* @return 发药病人列表
|
||||
* @param request 请求
|
||||
* @return 发药单信息
|
||||
*/
|
||||
@Override
|
||||
public R<?> getEncounterInfoListPage(InpatientMedicineSearchParam searchParam, String searchKey, Integer pageNo,
|
||||
public R<?> getMedicineDispenseFormPage(DispenseFormSearchParam dispenseFormSearchParam, Integer pageNo,
|
||||
Integer pageSize, HttpServletRequest request) {
|
||||
// 参与者科室id
|
||||
Long orgId = SecurityUtils.getLoginUser().getOrgId();
|
||||
searchParam.setOrganizationId(orgId);
|
||||
|
||||
// 初始化查询参数
|
||||
String encounterIds = dispenseFormSearchParam.getEncounterIds();
|
||||
dispenseFormSearchParam.setEncounterIds(null);
|
||||
// 构建查询条件
|
||||
QueryWrapper<InpatientMedicineSearchParam> queryWrapper =
|
||||
HisQueryUtils.buildQueryWrapper(searchParam, searchKey,
|
||||
new HashSet<>(
|
||||
Arrays.asList(CommonConstants.FieldName.PatientWbStr, CommonConstants.FieldName.PatientPyStr,
|
||||
CommonConstants.FieldName.PatientName, CommonConstants.FieldName.InpatientBed)),
|
||||
request);
|
||||
queryWrapper.orderByDesc(CommonConstants.FieldName.EncounterId);
|
||||
QueryWrapper<DispenseFormSearchParam> queryWrapper =
|
||||
HisQueryUtils.buildQueryWrapper(dispenseFormSearchParam, null, null, request);
|
||||
|
||||
// 查询就诊病人列表
|
||||
Page<InpatientMedicineEncounterInfoDto> encounterInfoPageDto = inpatientMedicineCollectionMapper
|
||||
.selectEncounterInfoListPage(new Page<>(pageNo, pageSize), queryWrapper, EncounterClass.IMP.getValue());
|
||||
|
||||
// 个别项目设定
|
||||
encounterInfoPageDto.getRecords().forEach(patientInfoDto -> {
|
||||
// 性别
|
||||
patientInfoDto.setGenderEnum_enumText(
|
||||
EnumUtils.getInfoByValue(AdministrativeGender.class, patientInfoDto.getGenderEnum()));
|
||||
// 年龄
|
||||
patientInfoDto.setAge(AgeCalculatorUtil.getAge(patientInfoDto.getBirthDate()));
|
||||
// 手动拼接住院患者id条件
|
||||
if (encounterIds != null && !encounterIds.isEmpty()) {
|
||||
List<Long> encounterIdList =
|
||||
Arrays.stream(encounterIds.split(CommonConstants.Common.COMMA)).map(Long::parseLong).toList();
|
||||
queryWrapper.in(CommonConstants.FieldName.EncounterId, encounterIdList);
|
||||
}
|
||||
// 领药信息列表
|
||||
Page<MedicineDispenseFormDto> medicineDispenseFormPage =
|
||||
medicineSummaryAppMapper.selectMedicineDispenseFormPage(new Page<>(pageNo, pageSize), queryWrapper,
|
||||
RequestStatus.COMPLETED.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(),
|
||||
DispenseStatus.SUMMARIZED.getValue());
|
||||
medicineDispenseFormPage.getRecords().forEach(e -> {
|
||||
// 是否皮试
|
||||
e.setSkinTestFlag_enumText(EnumUtils.getInfoByValue(Whether.class, e.getSkinTestFlag()));
|
||||
// 是否为注射药物
|
||||
e.setInjectFlag_enumText(EnumUtils.getInfoByValue(Whether.class, e.getInjectFlag()));
|
||||
// 医嘱类型
|
||||
e.setTherapyEnum_enumText(EnumUtils.getInfoByValue(TherapyTimeType.class, e.getTherapyEnum()));
|
||||
// 性别枚举
|
||||
e.setGenderEnum_enumText(EnumUtils.getInfoByValue(AdministrativeGender.class, e.getGenderEnum()));
|
||||
// 计算年龄
|
||||
if (e.getBirthDate() != null) {
|
||||
e.setAge(AgeCalculatorUtil.getAge(e.getBirthDate()));
|
||||
}
|
||||
});
|
||||
|
||||
return R.ok(encounterInfoPageDto);
|
||||
return R.ok(medicineDispenseFormPage);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询医嘱列表
|
||||
* 查询药品汇总单
|
||||
*
|
||||
* @param searchParam 查询条件
|
||||
* @param searchKey 模糊查询关键字
|
||||
* @param dispenseFormSearchParam 查询条件
|
||||
* @param pageNo 当前页码
|
||||
* @param pageSize 查询条数
|
||||
* @param request 请求数据
|
||||
* @return 处方单列表
|
||||
* @param searchKey 模糊查询关键字
|
||||
* @param request 请求
|
||||
* @return 药品汇总单
|
||||
*/
|
||||
@Override
|
||||
public R<?> getPrescriptionInfo(InpatientMedicineSearchParam searchParam, String searchKey, Integer pageNo,
|
||||
Integer pageSize, HttpServletRequest request) {
|
||||
|
||||
// 就诊id
|
||||
List<Long> encounterIdList = searchParam.getEncounterIdList();
|
||||
searchParam.setEncounterIdList(null);
|
||||
|
||||
public R<?> getMedicineSummaryFormPage(DispenseFormSearchParam dispenseFormSearchParam, Integer pageNo,
|
||||
Integer pageSize, String searchKey, HttpServletRequest request) {
|
||||
// 构建查询条件
|
||||
QueryWrapper<InpatientMedicineSearchParam> queryWrapper =
|
||||
HisQueryUtils.buildQueryWrapper(searchParam, searchKey, null, request);
|
||||
queryWrapper.orderByDesc(CommonConstants.FieldName.BusNo);
|
||||
queryWrapper.le(CommonConstants.FieldName.PlannedDispenseTime, searchParam.getPlannedDispenseTime());
|
||||
// queryWrapper.in(CommonConstants.FieldName.encounterId,encounterIdList);
|
||||
searchParam.setPlannedDispenseTime(null);
|
||||
QueryWrapper<DispenseFormSearchParam> queryWrapper = HisQueryUtils.buildQueryWrapper(dispenseFormSearchParam,
|
||||
searchKey, new HashSet<>(List.of(CommonConstants.FieldName.BusNo)), request);
|
||||
|
||||
// 查询医嘱列表
|
||||
Page<InpatientMedicinePrescriptionInfoDto> prescriptionInfoPageDto =
|
||||
inpatientMedicineCollectionMapper.selectPrescriptionInfoListPage(new Page<>(pageNo, pageSize), queryWrapper,
|
||||
encounterIdList, DispenseStatus.IN_PROGRESS.getValue(),
|
||||
CommonConstants.TableName.MED_MEDICATION_DEFINITION, CommonConstants.TableName.ADM_DEVICE_DEFINITION);
|
||||
// 个别项目设定
|
||||
prescriptionInfoPageDto.getRecords().forEach(prescriptionInfo -> {
|
||||
// 治疗类型
|
||||
prescriptionInfo.setTherapyEnum_enumText(
|
||||
EnumUtils.getInfoByValue(YbDrordType.class, prescriptionInfo.getTherapyEnum()));
|
||||
// 状态
|
||||
prescriptionInfo.setStatusEnum_enumText(
|
||||
EnumUtils.getInfoByValue(DispenseStatus.class, prescriptionInfo.getStatusEnum()));
|
||||
// 汇总单分页列表
|
||||
Page<MedicineSummaryFormDto> medicineSummaryFormPage = medicineSummaryAppMapper.selectMedicineSummaryFormPage(
|
||||
new Page<>(pageNo, pageSize), queryWrapper, DispenseStatus.COMPLETED.getValue(),
|
||||
DispenseStatus.IN_PROGRESS.getValue(), SupplyType.SUMMARY_DISPENSE.getValue());
|
||||
medicineSummaryFormPage.getRecords().forEach(e -> {
|
||||
// 发药状态
|
||||
e.setStatusEnum_enumText(EnumUtils.getInfoByValue(DispenseStatus.class, e.getStatusEnum()));
|
||||
});
|
||||
|
||||
return R.ok(prescriptionInfoPageDto);
|
||||
return R.ok(medicineSummaryFormPage);
|
||||
}
|
||||
|
||||
/**
|
||||
* 显示汇总发药单(生成之前的确认,此刻还没生成汇总单)
|
||||
* 查询药品汇总单详情
|
||||
*
|
||||
* @param searchParam 查询条件
|
||||
* @param pageNo 当前页码
|
||||
* @param pageSize 查询条数
|
||||
* @return 处理结果
|
||||
* @param summaryNo 汇总单号
|
||||
* @return 药品汇总单详情
|
||||
*/
|
||||
@Override
|
||||
public R<?> showMedicineSummary(List<InpatientMedicineSearchParam> searchParam, Integer pageNo, Integer pageSize) {
|
||||
// 药品发放id
|
||||
List<Long> medDispenseId = searchParam.stream()
|
||||
.filter(param -> param != null
|
||||
&& Objects.equals(param.getItemTable(), CommonConstants.TableName.MED_MEDICATION_DEFINITION))
|
||||
.map(InpatientMedicineSearchParam::getDispenseId).collect(Collectors.toList());
|
||||
// 耗材发放id
|
||||
List<Long> devDispenseId = searchParam.stream()
|
||||
.filter(param -> param != null
|
||||
&& Objects.equals(param.getItemTable(), CommonConstants.TableName.ADM_DEVICE_DEFINITION))
|
||||
.map(InpatientMedicineSearchParam::getDispenseId).collect(Collectors.toList());
|
||||
|
||||
// 构建查询条件
|
||||
QueryWrapper<InpatientMedicineSearchParam> queryWrapper = new QueryWrapper<>();
|
||||
queryWrapper.orderByAsc(CommonConstants.FieldName.itemId);
|
||||
|
||||
// 查询汇总医嘱列表
|
||||
Page<InpatientMedicinePrescriptionInfoDto> prescriptionSummaryInfoPageDto =
|
||||
inpatientMedicineCollectionMapper.selectPrescriptionSummaryInfoListPage(new Page<>(pageNo, pageSize),
|
||||
queryWrapper, medDispenseId, devDispenseId, CommonConstants.TableName.MED_MEDICATION_DEFINITION,
|
||||
CommonConstants.TableName.ADM_DEVICE_DEFINITION);
|
||||
// 个别项目设定
|
||||
prescriptionSummaryInfoPageDto.getRecords().forEach(prescriptionInfo -> {
|
||||
// 地点类型
|
||||
prescriptionInfo.setLocationEnum_enumText(
|
||||
EnumUtils.getInfoByValue(LocationForm.class, prescriptionInfo.getLocationEnum()));
|
||||
});
|
||||
|
||||
return R.ok(prescriptionSummaryInfoPageDto);
|
||||
public R<?> getMedicineSummaryFormDetail(String summaryNo) {
|
||||
// 药品汇总单详情
|
||||
return R.ok(medicineSummaryAppMapper.selectMedicineSummaryFormDetail(summaryNo));
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成汇总发药单
|
||||
*
|
||||
* @param prescriptionInfo 汇总发药单
|
||||
* @param medicineSummaryParamList 汇总发药申请参数
|
||||
* @return 处理结果
|
||||
*/
|
||||
@Override
|
||||
public R<?> medicineSummary(List<InpatientMedicinePrescriptionInfoDto> prescriptionInfo) {
|
||||
// 药品发放id
|
||||
List<Long> medDispenseId = new ArrayList<>();
|
||||
// 耗材发放id
|
||||
List<Long> devDispenseId = new ArrayList<>();
|
||||
// 供应申请
|
||||
List<SupplyRequest> supplyRequestList = new ArrayList<>();
|
||||
SupplyRequest supplyRequest;
|
||||
// 供应发放
|
||||
List<SupplyDelivery> supplyDeliveryList = new ArrayList<>();
|
||||
SupplyDelivery supplyDelivery;
|
||||
public R<?> medicineSummary(List<MedicineSummaryParam> medicineSummaryParamList) {
|
||||
// 领药人
|
||||
Long receiverId = medicineSummaryParamList.get(0).getReceiverId();
|
||||
// 申请时间
|
||||
Date now = DateUtils.getNowDate();
|
||||
|
||||
// 校验库存
|
||||
R<?> checkInventoryReturn = this.checkInventoryItem(devDispenseId, medDispenseId);
|
||||
if (checkInventoryReturn.getCode() != HttpStatus.SUCCESS) {
|
||||
return checkInventoryReturn;
|
||||
// 申请人
|
||||
Long practitionerId = SecurityUtils.getLoginUser().getPractitionerId();
|
||||
// 药品发放id
|
||||
List<Long> medDispenseIdList =
|
||||
medicineSummaryParamList.stream().map(MedicineSummaryParam::getDispenseId).toList();
|
||||
// 药品发放信息列表
|
||||
List<MedicationDispense> medicationDispenseList = medicationDispenseService.listByIds(medDispenseIdList);
|
||||
if (medicationDispenseList == null || medicationDispenseList.isEmpty()) {
|
||||
throw new ServiceException("未找到药品发放信息");
|
||||
}
|
||||
|
||||
// 单据号
|
||||
String busNo = assignSeqUtil.getSeqByDay(AssignSeqEnum.DISPENSING_ORDER.getPrefix(), 4);
|
||||
if (prescriptionInfo.stream().map(InpatientMedicinePrescriptionInfoDto::getStatusEnum)
|
||||
if (medicationDispenseList.stream().map(MedicationDispense::getStatusEnum)
|
||||
.anyMatch(x -> x.equals(DispenseStatus.SUMMARIZED.getValue()))) {
|
||||
throw new ServiceException("药品已汇总,请勿重复汇总");
|
||||
} else {
|
||||
for (InpatientMedicinePrescriptionInfoDto item : prescriptionInfo) {
|
||||
// 供应申请
|
||||
supplyRequest = new SupplyRequest().setBusNo(busNo).setTypeEnum(SupplyType.DISPENSING_ORDER.getValue())
|
||||
.setStatusEnum(SupplyStatus.SEND.getValue())
|
||||
.setCategoryEnum(SupplyCategory.INPATIENT_PATIENT_SUMMARY_DISPENSING.getValue())
|
||||
.setItemTable(item.getItemTable()).setItemId(item.getItemId()).setUnitCode(item.getUnitCode())
|
||||
.setItemQuantity(new BigDecimal(item.getQuantity())).setLotNumber(item.getLotNumber())
|
||||
.setSourceTypeEnum(item.getLocationEnum()).setSourceLocationId(item.getLocationId())
|
||||
.setPurposeTypeEnum(LocationForm.DEPARTMENT.getValue())
|
||||
.setPurposeLocationId(SecurityUtils.getLoginUser().getOrgId())
|
||||
.setApplicantId(SecurityUtils.getLoginUser().getPractitionerId()).setApplyTime(now);
|
||||
supplyRequestList.add(supplyRequest);
|
||||
}
|
||||
// 查询药品信息
|
||||
List<MedicationDefinition> medicationDefinitions = medicationDefinitionService
|
||||
.listByIds(medicationDispenseList.stream().map(MedicationDispense::getMedicationId).toList());
|
||||
// 根据发放药房分组
|
||||
Map<Long, List<MedicationDispense>> medicationLocationMap =
|
||||
medicationDispenseList.stream().collect(Collectors.groupingBy(MedicationDispense::getLocationId));
|
||||
// 循环每个药房
|
||||
for (Map.Entry<Long, List<MedicationDispense>> entry : medicationLocationMap.entrySet()) {
|
||||
// 汇总单据号
|
||||
String busNo = assignSeqUtil.getSeqByDay(AssignSeqEnum.MEDICINE_SUMMARY_NO.getPrefix(), 4);
|
||||
|
||||
// 供应发放
|
||||
supplyDelivery = new SupplyDelivery().setRequestId(supplyRequest.getId())
|
||||
.setStatusEnum(DispenseStatus.IN_PROGRESS.getValue()).setTypeEnum(supplyRequest.getTypeEnum())
|
||||
.setItemTable(supplyRequest.getItemTable()).setItemId(supplyRequest.getItemId())
|
||||
.setBasedOnIds(item.getDispenseIds()).setUnitCode(supplyRequest.getUnitCode())
|
||||
.setQuantity(supplyRequest.getItemQuantity()).setLotNumber(supplyRequest.getLotNumber())
|
||||
.setReceiverId(SecurityUtils.getLoginUser().getPractitionerId());
|
||||
if (item.getItemTable().equals(CommonConstants.TableName.MED_MEDICATION_DEFINITION)) {
|
||||
// 设置供应发放信息
|
||||
supplyDelivery.setBasedOnTable(CommonConstants.TableName.MED_MEDICATION_DISPENSE);
|
||||
// 设置药品发放id
|
||||
medDispenseId.addAll(Arrays.stream(item.getDispenseIds().split(",")).map(String::trim) // 去除每个ID前后的空格
|
||||
.filter(s -> !s.isEmpty()) // 过滤空字符串
|
||||
.map(Long::parseLong) // 转换为Long类型
|
||||
.toList());
|
||||
} else {
|
||||
// 设置供应发放信息
|
||||
supplyDelivery.setBasedOnTable(CommonConstants.TableName.WOR_DEVICE_DISPENSE);
|
||||
// 设置耗材发放id
|
||||
devDispenseId.addAll(Arrays.stream(item.getDispenseIds().split(",")).map(String::trim) // 去除每个ID前后的空格
|
||||
.filter(s -> !s.isEmpty()) // 过滤空字符串
|
||||
.map(Long::parseLong) // 转换为Long类型
|
||||
.toList());
|
||||
List<MedicationDispense> medicationDispenses = entry.getValue();
|
||||
// 根据相同批号的同一药品进行汇总
|
||||
Map<String, List<MedicationDispense>> medicationSummaryInfoMap = medicationDispenses.stream().collect(
|
||||
Collectors.groupingBy(x -> x.getMedicationId() + CommonConstants.Common.DASH + x.getLotNumber()));
|
||||
for (Map.Entry<String, List<MedicationDispense>> medicationSummaryInfoList : medicationSummaryInfoMap
|
||||
.entrySet()) {
|
||||
List<MedicationDispense> medicationSummaryList = medicationSummaryInfoList.getValue();
|
||||
MedicationDispense medicationDispense = medicationSummaryList.get(0);
|
||||
Long medicationId = medicationDispense.getMedicationId();
|
||||
Long locationId = medicationDispense.getLocationId();
|
||||
String lotNumber = medicationDispense.getLotNumber();
|
||||
Long patientId = medicationDispense.getPatientId();
|
||||
// 拆零比例
|
||||
BigDecimal partPercent = BigDecimal.ONE;
|
||||
// 最小单位
|
||||
String minUnitCode = null;
|
||||
// 单位
|
||||
String unitCode = null;
|
||||
// 根据药品id获取对应的药品信息
|
||||
Optional<MedicationDefinition> medicationDefinition =
|
||||
medicationDefinitions.stream().filter(x -> x.getId().equals(medicationId)).findFirst();
|
||||
if (medicationDefinition.isPresent()) {
|
||||
partPercent = medicationDefinition.get().getPartPercent();
|
||||
minUnitCode = medicationDefinition.get().getMinUnitCode();
|
||||
unitCode = medicationDefinition.get().getUnitCode();
|
||||
}
|
||||
supplyDeliveryList.add(supplyDelivery);
|
||||
}
|
||||
// 供应申请更新
|
||||
boolean requestFlg = supplyRequestService.saveBatch(supplyRequestList);
|
||||
if (!requestFlg) {
|
||||
return R.fail(MessageUtils.createMessage(PromptMsgConstant.Common.M00010, null));
|
||||
}
|
||||
// 供应发放更新
|
||||
boolean deliveryFlg = supplyDeliveryService.saveBatch(supplyDeliveryList);
|
||||
if (!deliveryFlg) {
|
||||
return R.fail(MessageUtils.createMessage(PromptMsgConstant.Common.M00010, null));
|
||||
if (minUnitCode == null || unitCode == null || partPercent == null) {
|
||||
throw new ServiceException("药品信息有误,请联系管理员");
|
||||
}
|
||||
// 最小单位数量
|
||||
BigDecimal minQuantity = BigDecimal.ZERO;
|
||||
for (MedicationDispense medicationSummaryInfo : medicationSummaryList) {
|
||||
BigDecimal quantity = medicationSummaryInfo.getQuantity();
|
||||
if (unitCode.equals(medicationDispense.getUnitCode())) {
|
||||
// 转换为小单位进行累加
|
||||
quantity = medicationSummaryInfo.getQuantity().multiply(partPercent);
|
||||
}
|
||||
minQuantity = minQuantity.add(quantity);
|
||||
}
|
||||
Long supplyRequestId = supplyRequestService.createSummarySupplyRequest(medicationId, locationId,
|
||||
lotNumber, patientId, minQuantity, minUnitCode, practitionerId, now, busNo);
|
||||
supplyDeliveryService.createSummarySupplyDelivery(medicationId, lotNumber, patientId, minQuantity,
|
||||
minUnitCode, receiverId, supplyRequestId);
|
||||
}
|
||||
// 药品发放状态更新
|
||||
medicationDispenseService.updateDispenseStatusSummarized(medDispenseId);
|
||||
// 耗材发放状态更新
|
||||
deviceDispenseService.updateDispenseStatusSummarized(devDispenseId);
|
||||
medicationDispenseService.updateDispenseStatusSummarized(
|
||||
medicationDispenses.stream().map(MedicationDispense::getId).toList(), busNo);
|
||||
}
|
||||
|
||||
return R.ok(MessageUtils.createMessage(PromptMsgConstant.Common.M00004, null));
|
||||
return R.ok(MessageUtils.createMessage(PromptMsgConstant.Common.M00004, new Object[] {"汇总申请"}));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -293,45 +255,45 @@ public class MedicineSummaryAppServiceImpl implements IMedicineSummaryAppService
|
||||
|
||||
List<InventoryItem> inventoryItemList = new ArrayList<>();
|
||||
// 获取库存信息
|
||||
List<InventoryDto> inventoryList = returnMedicineMapper.selectInventoryInfoList(devDispenseId, medDispenseId,
|
||||
List<UnDispenseInventoryDto> inventoryList = returnMedicineMapper.selectInventoryInfoList(devDispenseId, medDispenseId,
|
||||
CommonConstants.TableName.MED_MEDICATION_DEFINITION, CommonConstants.TableName.ADM_DEVICE_DEFINITION);
|
||||
// 按每个药品分组
|
||||
Map<Long, List<InventoryDto>> groupedByItemId =
|
||||
inventoryList.stream().collect(Collectors.groupingBy(InventoryDto::getItemId));
|
||||
Map<Long, List<UnDispenseInventoryDto>> groupedByItemId =
|
||||
inventoryList.stream().collect(Collectors.groupingBy(UnDispenseInventoryDto::getItemId));
|
||||
// 遍历每个分组校验库存状态
|
||||
for (Map.Entry<Long, List<InventoryDto>> entry : groupedByItemId.entrySet()) {
|
||||
List<InventoryDto> groupItems = entry.getValue();
|
||||
if (groupItems.stream().map(InventoryDto::getInventoryStatusEnum)
|
||||
for (Map.Entry<Long, List<UnDispenseInventoryDto>> entry : groupedByItemId.entrySet()) {
|
||||
List<UnDispenseInventoryDto> groupItems = entry.getValue();
|
||||
if (groupItems.stream().map(UnDispenseInventoryDto::getInventoryStatusEnum)
|
||||
.allMatch(x -> x.equals(PublicationStatus.RETIRED.getValue()))) {
|
||||
// 库存停供校验
|
||||
return R.fail(groupItems.get(0).getItemName() + "库存已停供");
|
||||
}
|
||||
}
|
||||
if (!inventoryList.isEmpty()) {
|
||||
for (InventoryDto inventoryDto : inventoryList) {
|
||||
if (PublicationStatus.ACTIVE.getValue().equals(inventoryDto.getInventoryStatusEnum())) {
|
||||
for (UnDispenseInventoryDto unDispenseInventoryDto : inventoryList) {
|
||||
if (PublicationStatus.ACTIVE.getValue().equals(unDispenseInventoryDto.getInventoryStatusEnum())) {
|
||||
InventoryItem inventoryItem = new InventoryItem();
|
||||
// 库存数量判定
|
||||
if (inventoryDto.getDispenseUnit().equals(inventoryDto.getInventoryUnitCode())) {
|
||||
if (unDispenseInventoryDto.getDispenseUnit().equals(unDispenseInventoryDto.getInventoryUnitCode())) {
|
||||
// 当前库存数量(拆零单位)=当前库存数量(拆零单位)-请求数量
|
||||
BigDecimal quantity = inventoryDto.getInventoryQuantity().subtract(inventoryDto.getQuantity());
|
||||
BigDecimal quantity = unDispenseInventoryDto.getInventoryQuantity().subtract(unDispenseInventoryDto.getQuantity());
|
||||
// 库存数量判定
|
||||
if (quantity.compareTo(BigDecimal.ZERO) < 0) {
|
||||
// 库存数量不足
|
||||
return R.fail(inventoryDto.getItemName() + "当前库存数量不足");
|
||||
return R.fail(unDispenseInventoryDto.getItemName() + "当前库存数量不足");
|
||||
} else {
|
||||
inventoryItem.setId(inventoryDto.getInventoryId()).setQuantity(quantity);
|
||||
inventoryItem.setId(unDispenseInventoryDto.getInventoryId()).setQuantity(quantity);
|
||||
}
|
||||
} else {
|
||||
// 当前库存数量(拆零单位)=当前库存数量(拆零单位)-拆零数量(拆零比×请求数量)
|
||||
BigDecimal quantity = inventoryDto.getInventoryQuantity()
|
||||
.subtract(inventoryDto.getPartPercent().multiply(inventoryDto.getQuantity()));
|
||||
BigDecimal quantity = unDispenseInventoryDto.getInventoryQuantity()
|
||||
.subtract(unDispenseInventoryDto.getPartPercent().multiply(unDispenseInventoryDto.getQuantity()));
|
||||
// 库存数量判定
|
||||
if (quantity.compareTo(BigDecimal.ZERO) < 0) {
|
||||
// 库存数量不足
|
||||
return R.fail(inventoryDto.getItemName() + "当前库存数量不足");
|
||||
return R.fail(unDispenseInventoryDto.getItemName() + "当前库存数量不足");
|
||||
} else {
|
||||
inventoryItem.setId(inventoryDto.getInventoryId()).setQuantity(quantity);
|
||||
inventoryItem.setId(unDispenseInventoryDto.getInventoryId()).setQuantity(quantity);
|
||||
}
|
||||
}
|
||||
inventoryItemList.add(inventoryItem);
|
||||
@@ -341,4 +303,27 @@ public class MedicineSummaryAppServiceImpl implements IMedicineSummaryAppService
|
||||
return R.ok(inventoryItemList);
|
||||
}
|
||||
|
||||
/**
|
||||
* 取消汇总
|
||||
*
|
||||
* @param summaryNo 汇总单号
|
||||
* @return 处理结果
|
||||
*/
|
||||
@Override
|
||||
public R<?> cancelSummary(String summaryNo) {
|
||||
// 取消汇总申请(软删除)
|
||||
List<Long> requestIdList = supplyRequestService.cancelSummarySupplyRequest(List.of(summaryNo));
|
||||
if (requestIdList.isEmpty()) {
|
||||
return R.fail("取消汇总申请失败");
|
||||
}
|
||||
// 软删除汇总发放
|
||||
supplyDeliveryService.deleteSupplyDeliveryByReqId(requestIdList);
|
||||
// 取消药品汇总
|
||||
boolean result = medicationDispenseService.cancelMedicationSummary(List.of(summaryNo));
|
||||
if (!result) {
|
||||
return R.fail("取消汇总申请失败");
|
||||
}
|
||||
return R.ok(MessageUtils.createMessage(PromptMsgConstant.Common.M00004, new Object[] {"取消"}));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,428 @@
|
||||
package com.openhis.web.inhospitalnursestation.appservice.impl;
|
||||
|
||||
import com.core.common.core.domain.R;
|
||||
import com.core.common.core.domain.model.LoginUser;
|
||||
import com.core.common.exception.ServiceException;
|
||||
import com.core.common.utils.AssignSeqUtil;
|
||||
import com.core.common.utils.SecurityUtils;
|
||||
import com.openhis.administration.domain.ChargeItem;
|
||||
import com.openhis.administration.service.IChargeItemService;
|
||||
import com.openhis.common.constant.CommonConstants;
|
||||
import com.openhis.common.enums.*;
|
||||
import com.openhis.web.doctorstation.dto.AdviceSaveDto;
|
||||
import com.openhis.web.doctorstation.utils.AdviceUtils;
|
||||
import com.openhis.web.inhospitalnursestation.appservice.INurseBillingAppService;
|
||||
import com.openhis.web.regdoctorstation.dto.RegAdviceSaveDto;
|
||||
import com.openhis.web.regdoctorstation.dto.RegAdviceSaveParam;
|
||||
import com.openhis.workflow.domain.DeviceRequest;
|
||||
import com.openhis.workflow.service.IDeviceDispenseService;
|
||||
import com.openhis.workflow.service.IDeviceRequestService;
|
||||
import com.openhis.workflow.service.IServiceRequestService;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 住院护士站划价服务实现类
|
||||
* 核心功能:临时耗材/诊疗活动划价签发、关联费用项管理、库存校验、医嘱删除(已收费校验)等
|
||||
*/
|
||||
@Service
|
||||
public class NurseBillingAppService implements INurseBillingAppService {
|
||||
|
||||
// 依赖注入:保留@Resource注解,按原有方式注入依赖
|
||||
@Resource
|
||||
private AdviceUtils adviceUtils;
|
||||
@Resource
|
||||
private AssignSeqUtil assignSeqUtil;
|
||||
@Resource
|
||||
private IDeviceRequestService iDeviceRequestService;
|
||||
@Resource
|
||||
private IServiceRequestService iServiceRequestService;
|
||||
@Resource
|
||||
private IChargeItemService iChargeItemService;
|
||||
@Resource
|
||||
private IDeviceDispenseService iDeviceDispenseService;
|
||||
|
||||
// 常量提取:避免魔法值,提高代码可维护性和可读性
|
||||
/** 耗材请求服务表名(关联费用项使用) */
|
||||
private static final String SERVICE_TABLE_DEVICE_REQUEST = CommonConstants.TableName.WOR_DEVICE_REQUEST;
|
||||
private static final String SERVICE_TABLE_SERVICE_REQUEST = CommonConstants.TableName.WOR_SERVICE_REQUEST;
|
||||
/** 费用项业务编号前缀 */
|
||||
private static final String CHARGE_ITEM_BUS_NO_PREFIX = AssignSeqEnum.CHARGE_ITEM_NO.getPrefix();
|
||||
/** 耗材申请单号序列号长度(按日生成) */
|
||||
private static final int DEVICE_RES_NO_SEQ_LENGTH = 4;
|
||||
/** 医嘱签发编码序列号长度 */
|
||||
private static final int ADVICE_SIGN_SEQ_LENGTH = 10;
|
||||
|
||||
/**
|
||||
* 新增住院护士站划价
|
||||
* 完整流程:参数初始化 → 入参校验 → 医嘱分类(耗材/诊疗活动)→ 生成签发编码 → 处理耗材划价 → 处理诊疗活动划价
|
||||
*
|
||||
* @param regAdviceSaveParam 划价请求参数(含患者信息、医嘱列表、科室ID等核心数据)
|
||||
* @return R<?> 划价结果响应(成功/失败信息、状态码)
|
||||
*/
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class) // 事务管理:划价相关操作原子性,任一环节失败整体回滚
|
||||
public R<?> addInNurseBilling(RegAdviceSaveParam regAdviceSaveParam) {
|
||||
// 1. 时间参数初始化:默认使用当前时间,支持入参指定
|
||||
Date curDate = new Date();
|
||||
Date startTime = regAdviceSaveParam.getStartTime() == null ? curDate : regAdviceSaveParam.getStartTime();
|
||||
Date authoredTime = regAdviceSaveParam.getAuthoredTime() == null ? curDate : regAdviceSaveParam.getAuthoredTime();
|
||||
|
||||
// 2. 入参校验:非空校验 + 库存校验,校验失败直接返回错误响应
|
||||
R<?> checkResult = checkNurseBillingParam(regAdviceSaveParam);
|
||||
if (checkResult.getCode() != R.SUCCESS) {
|
||||
return checkResult;
|
||||
}
|
||||
|
||||
// 3. 提取核心业务参数
|
||||
Long organizationId = regAdviceSaveParam.getOrganizationId(); // 患者住院科室ID
|
||||
List<RegAdviceSaveDto> allAdviceList = regAdviceSaveParam.getRegAdviceSaveList(); // 所有待处理医嘱列表
|
||||
|
||||
// 4. 按医嘱类型分类:拆分耗材类和诊疗活动类(分别处理)
|
||||
List<RegAdviceSaveDto> deviceAdviceList = filterDeviceAdvice(allAdviceList); // 耗材类医嘱
|
||||
List<RegAdviceSaveDto> activityAdviceList = filterActivityAdvice(allAdviceList); // 诊疗活动类医嘱
|
||||
|
||||
// 5. 生成全局唯一的医嘱签发编码
|
||||
String signCode = assignSeqUtil.getSeq(AssignSeqEnum.ADVICE_SIGN.getPrefix(), ADVICE_SIGN_SEQ_LENGTH);
|
||||
|
||||
// 6. 处理耗材类医嘱划价(新增/修改/删除逻辑)
|
||||
handleDeviceBilling(deviceAdviceList, null, signCode, organizationId, curDate);
|
||||
|
||||
// 7. 处理诊疗活动类医嘱划价(原代码未实现,保留扩展入口)
|
||||
handleActivityBilling(activityAdviceList, signCode, organizationId, curDate, startTime, authoredTime);
|
||||
|
||||
// 8. 划价成功返回响应
|
||||
return R.ok("住院划价签发成功");
|
||||
}
|
||||
|
||||
/**
|
||||
* 筛选耗材类医嘱
|
||||
* 按医嘱类型枚举(ItemType.DEVICE)过滤,仅保留耗材相关医嘱
|
||||
*
|
||||
* @param allAdviceList 所有待处理医嘱列表
|
||||
* @return List<RegAdviceSaveDto> 耗材类医嘱列表
|
||||
*/
|
||||
private List<RegAdviceSaveDto> filterDeviceAdvice(List<RegAdviceSaveDto> allAdviceList) {
|
||||
return allAdviceList.stream()
|
||||
.filter(advice -> ItemType.DEVICE.getValue().equals(advice.getAdviceType()))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
/**
|
||||
* 筛选诊疗活动类医嘱
|
||||
* 按医嘱类型枚举(ItemType.ACTIVITY)过滤,仅保留诊疗活动相关医嘱
|
||||
*
|
||||
* @param allAdviceList 所有待处理医嘱列表
|
||||
* @return List<RegAdviceSaveDto> 诊疗活动类医嘱列表
|
||||
*/
|
||||
private List<RegAdviceSaveDto> filterActivityAdvice(List<RegAdviceSaveDto> allAdviceList) {
|
||||
return allAdviceList.stream()
|
||||
.filter(advice -> ItemType.ACTIVITY.getValue().equals(advice.getAdviceType()))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理耗材类医嘱划价
|
||||
* 核心流程:筛选临时耗材 → 处理删除(已收费校验)→ 新增/修改耗材记录 → 同步发放+费用项
|
||||
*
|
||||
* @param deviceAdviceList 耗材类医嘱列表
|
||||
* @param deleteList 待删除的耗材医嘱列表(可为null,暂无删除场景传null)
|
||||
* @param signCode 医嘱签发编码(全局唯一)
|
||||
* @param organizationId 患者住院科室ID
|
||||
* @param curDate 当前操作时间
|
||||
*/
|
||||
private void handleDeviceBilling(List<RegAdviceSaveDto> deviceAdviceList, List<AdviceSaveDto> deleteList,
|
||||
String signCode, Long organizationId, Date curDate) {
|
||||
// 1. 筛选临时类型耗材:仅处理临时医嘱(TherapyTimeType.TEMPORARY)的新增/修改
|
||||
List<AdviceSaveDto> tempDeviceList = deviceAdviceList.stream()
|
||||
.filter(advice -> TherapyTimeType.TEMPORARY.getValue().equals(advice.getTherapyEnum()))
|
||||
.collect(Collectors.toList());
|
||||
|
||||
// 2. 处理耗材删除:校验已收费状态 + 关联数据删除
|
||||
handleDelRequest(deleteList,SERVICE_TABLE_DEVICE_REQUEST);
|
||||
|
||||
// 3. 处理耗材新增/修改:同步保存耗材请求、发放记录、费用项
|
||||
handleDeviceInsertOrUpdate(tempDeviceList, organizationId, curDate);
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理诊疗活动类医嘱划价
|
||||
* (扩展入口:原代码未实现,可参考耗材处理逻辑,关联服务请求表、费用项等)
|
||||
*
|
||||
* @param activityAdviceList 诊疗活动类医嘱列表
|
||||
* @param signCode 医嘱签发编码
|
||||
* @param organizationId 住院科室ID
|
||||
* @param curDate 当前操作时间
|
||||
* @param startTime 医嘱开始时间
|
||||
* @param authoredTime 医嘱签发时间
|
||||
*/
|
||||
private void handleActivityBilling(List<RegAdviceSaveDto> activityAdviceList, String signCode,
|
||||
Long organizationId, Date curDate, Date startTime, Date authoredTime) {
|
||||
// 注:诊疗活动划价逻辑待实现,建议流程:
|
||||
// 1. 筛选临时类型诊疗活动
|
||||
// 2. 处理删除(如需)
|
||||
// 3. 新增/修改服务请求记录(IServiceRequestService)
|
||||
// 4. 同步生成/更新费用项(IChargeItemService)
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理耗材删除逻辑
|
||||
* 关键校验:已收费的耗材项目不允许删除
|
||||
* 关联删除:耗材请求表 → 耗材发放记录 → 费用项表(级联删除关联数据)
|
||||
*
|
||||
* @param deleteList 待删除的耗材医嘱列表(可为null)
|
||||
*/
|
||||
private void handleDelRequest(List<AdviceSaveDto> deleteList,String serviceTable) {
|
||||
// 空列表直接返回,避免无效循环和查询
|
||||
if (deleteList == null || deleteList.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
// 提取待删除请求ID列表(用于查询费用状态)
|
||||
List<Long> delRequestIds = deleteList.stream()
|
||||
.map(AdviceSaveDto::getRequestId)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
// 校验:待删除项是否已收费,已收费则抛出异常阻止删除
|
||||
checkDeletedDeviceChargeStatus(delRequestIds);
|
||||
|
||||
// 执行级联删除:循环处理每个待删除项的关联数据
|
||||
for (AdviceSaveDto deleteDto : deleteList) {
|
||||
Long requestId = deleteDto.getRequestId();
|
||||
if (serviceTable.equals(SERVICE_TABLE_DEVICE_REQUEST)){
|
||||
iDeviceRequestService.removeById(requestId); // 删除耗材请求主记录
|
||||
iDeviceDispenseService.deleteDeviceDispense(requestId); // 删除关联的耗材发放记录
|
||||
}
|
||||
// 删除关联的费用项(按服务表+服务ID关联)
|
||||
iChargeItemService.deleteByServiceTableAndId(SERVICE_TABLE_DEVICE_REQUEST, requestId);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 校验待删除耗材的费用状态
|
||||
* 查询待删除项对应的费用项,若存在已收费(ChargeItemStatus.BILLED)状态则抛出业务异常
|
||||
*
|
||||
* @param delRequestIds 待删除的耗材请求ID列表
|
||||
*/
|
||||
private void checkDeletedDeviceChargeStatus(List<Long> delRequestIds) {
|
||||
if (delRequestIds.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 查询待删除耗材对应的费用项列表
|
||||
List<ChargeItem> chargeItemList = iChargeItemService.getChargeItemInfoByReqId(delRequestIds);
|
||||
if (chargeItemList == null || chargeItemList.isEmpty()) {
|
||||
return; // 无关联费用项,直接允许删除
|
||||
}
|
||||
|
||||
// 校验是否存在已收费项:使用stream.anyMatch简化循环判断
|
||||
boolean hasBilledItem = chargeItemList.stream()
|
||||
.anyMatch(ci -> ChargeItemStatus.BILLED.getValue().equals(ci.getStatusEnum()));
|
||||
if (hasBilledItem) {
|
||||
throw new ServiceException("删除失败:部分项目已完成收费,不支持直接删除,请联系收费人员处理后重试");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理耗材新增/修改
|
||||
* 流程:构建耗材请求对象 → 保存/更新 → 处理耗材发放 → 构建费用项 → 保存/更新费用项
|
||||
*
|
||||
* @param tempDeviceList 临时耗材医嘱列表(新增/修改)
|
||||
* @param organizationId 住院科室ID
|
||||
* @param curDate 当前操作时间
|
||||
*/
|
||||
private void handleDeviceInsertOrUpdate(List<AdviceSaveDto> tempDeviceList, Long organizationId, Date curDate) {
|
||||
if (tempDeviceList.isEmpty()) {
|
||||
return; // 无临时耗材需处理,直接返回
|
||||
}
|
||||
|
||||
// 循环处理每个临时耗材医嘱
|
||||
for (AdviceSaveDto adviceDto : tempDeviceList) {
|
||||
// 1. 构建耗材请求对象(DeviceRequest)并执行保存/更新
|
||||
if (adviceDto.getRequestId() == null) {
|
||||
adviceDto.setDbOpType(DbOpType.INSERT.getCode()); // 新增时设置操作类型
|
||||
}else {
|
||||
adviceDto.setDbOpType(DbOpType.UPDATE.getCode()); // 修改时设置操作类型
|
||||
}
|
||||
DeviceRequest deviceRequest = buildDeviceRequest(adviceDto, curDate);
|
||||
iDeviceRequestService.saveOrUpdate(deviceRequest);
|
||||
|
||||
// 2. 同步处理耗材发放:根据操作类型(新增/修改)执行发放逻辑
|
||||
iDeviceDispenseService.handleDeviceDispense(deviceRequest, adviceDto.getDbOpType());
|
||||
|
||||
// 3. 构建费用项对象(ChargeItem)并执行保存/更新
|
||||
ChargeItem chargeItem = buildChargeItem(adviceDto, deviceRequest, curDate);
|
||||
iChargeItemService.saveOrUpdate(chargeItem);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建耗材请求对象(DeviceRequest)
|
||||
* 功能:将医嘱DTO(AdviceSaveDto)的属性映射到耗材请求实体,设置默认状态和业务编号
|
||||
*
|
||||
* @param adviceDto 耗材医嘱DTO(含请求参数)
|
||||
* @param curDate 当前操作时间
|
||||
* @return DeviceRequest 构建完成的耗材请求实体
|
||||
*/
|
||||
private DeviceRequest buildDeviceRequest(AdviceSaveDto adviceDto, Date curDate) {
|
||||
DeviceRequest deviceRequest = new DeviceRequest();
|
||||
|
||||
// 基础配置:主键、状态、业务编号
|
||||
deviceRequest.setId(adviceDto.getRequestId()); // 主键ID(新增为null,修改为已有ID)
|
||||
deviceRequest.setStatusEnum(RequestStatus.ACTIVE.getValue()); // 划价时直接签发,状态为"激活"
|
||||
// 按日生成业务编号:前缀+4位序列号(确保每日唯一)
|
||||
deviceRequest.setBusNo(assignSeqUtil.getSeqByDay(AssignSeqEnum.DEVICE_RES_NO.getPrefix(), DEVICE_RES_NO_SEQ_LENGTH));
|
||||
deviceRequest.setGenerateSourceEnum(GenerateSource.DOCTOR_PRESCRIPTION.getValue()); // 生成来源:医生处方
|
||||
|
||||
// 业务属性映射:从DTO映射到实体
|
||||
deviceRequest.setQuantity(adviceDto.getQuantity()); // 请求数量
|
||||
deviceRequest.setUnitCode(adviceDto.getUnitCode()); // 单位编码
|
||||
deviceRequest.setLotNumber(adviceDto.getLotNumber()); // 产品批号
|
||||
deviceRequest.setCategoryEnum(adviceDto.getCategoryEnum()); // 请求类型(枚举)
|
||||
deviceRequest.setDeviceDefId(adviceDto.getAdviceDefinitionId()); // 耗材定义ID
|
||||
deviceRequest.setPatientId(adviceDto.getPatientId()); // 患者ID
|
||||
deviceRequest.setRequesterId(adviceDto.getPractitionerId()); // 开方医生ID
|
||||
deviceRequest.setOrgId(adviceDto.getFounderOrgId()); // 开方人科室ID
|
||||
deviceRequest.setReqAuthoredTime(curDate); // 请求开始时间
|
||||
deviceRequest.setPerformLocation(adviceDto.getLocationId()); // 发放耗材房ID
|
||||
deviceRequest.setEncounterId(adviceDto.getEncounterId()); // 就诊ID
|
||||
deviceRequest.setPackageId(adviceDto.getPackageId()); // 组套ID
|
||||
deviceRequest.setContentJson(adviceDto.getContentJson()); // 请求内容JSON(扩展信息)
|
||||
deviceRequest.setYbClassEnum(adviceDto.getYbClassEnum()); // 医保类别编码
|
||||
deviceRequest.setConditionId(adviceDto.getConditionId()); // 诊断ID
|
||||
deviceRequest.setEncounterDiagnosisId(adviceDto.getEncounterDiagnosisId()); // 就诊诊断ID
|
||||
|
||||
return deviceRequest;
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建费用项对象(ChargeItem)
|
||||
* 功能:关联耗材请求实体和医嘱DTO,映射费用相关属性,设置默认状态和业务编号
|
||||
*
|
||||
* @param adviceDto 耗材医嘱DTO(含费用参数)
|
||||
* @param deviceRequest 已保存的耗材请求实体(关联服务ID)
|
||||
* @param curDate 当前操作时间
|
||||
* @return ChargeItem 构建完成的费用项实体
|
||||
*/
|
||||
private ChargeItem buildChargeItem(AdviceSaveDto adviceDto, DeviceRequest deviceRequest,Date curDate) {
|
||||
ChargeItem chargeItem = new ChargeItem();
|
||||
|
||||
// 基础配置:主键、状态、业务编号
|
||||
chargeItem.setId(adviceDto.getChargeItemId()); // 费用项ID(新增为null,修改为已有ID)
|
||||
chargeItem.setStatusEnum(ChargeItemStatus.DRAFT.getValue()); // 初始状态:草稿(未收费)
|
||||
// 业务编号:费用项前缀+耗材请求编号(确保与耗材请求一一关联)
|
||||
chargeItem.setBusNo(CHARGE_ITEM_BUS_NO_PREFIX.concat(deviceRequest.getBusNo()));
|
||||
chargeItem.setGenerateSourceEnum(GenerateSource.DOCTOR_PRESCRIPTION.getValue()); // 生成来源:医生处方
|
||||
|
||||
// 业务属性映射:患者、就诊、定价相关信息
|
||||
chargeItem.setPatientId(adviceDto.getPatientId()); // 患者ID
|
||||
chargeItem.setContextEnum(adviceDto.getAdviceType()); // 费用类型(耗材)
|
||||
chargeItem.setEncounterId(adviceDto.getEncounterId()); // 就诊ID
|
||||
chargeItem.setDefinitionId(adviceDto.getDefinitionId()); // 费用定价ID
|
||||
chargeItem.setDefDetailId(adviceDto.getDefinitionDetailId()); // 定价子表主键(明细定价)
|
||||
chargeItem.setEntererId(adviceDto.getPractitionerId()); // 开立人ID(开方医生)
|
||||
chargeItem.setRequestingOrgId(SecurityUtils.getLoginUser().getOrgId()); // 开立科室ID
|
||||
chargeItem.setEnteredDate(curDate); // 开立时间
|
||||
chargeItem.setServiceTable(SERVICE_TABLE_DEVICE_REQUEST); // 医疗服务类型(关联耗材请求表)
|
||||
chargeItem.setServiceId(deviceRequest.getId()); // 医疗服务ID(关联耗材请求ID)
|
||||
chargeItem.setProductTable(SERVICE_TABLE_DEVICE_REQUEST);// 产品所在表(耗材表)
|
||||
chargeItem.setProductId(adviceDto.getAdviceDefinitionId());// 产品ID(耗材定义ID)
|
||||
chargeItem.setAccountId(adviceDto.getAccountId()); // 关联账户ID(患者账户)
|
||||
chargeItem.setConditionId(adviceDto.getConditionId()); // 诊断ID
|
||||
chargeItem.setEncounterDiagnosisId(adviceDto.getEncounterDiagnosisId()); // 就诊诊断ID
|
||||
|
||||
// 费用核心属性:数量、单位、单价、总价
|
||||
chargeItem.setQuantityValue(adviceDto.getQuantity()); // 数量(与耗材请求一致)
|
||||
chargeItem.setQuantityUnit(adviceDto.getUnitCode()); // 单位(与耗材请求一致)
|
||||
chargeItem.setUnitPrice(adviceDto.getUnitPrice()); // 单价(从DTO传入,已定价)
|
||||
chargeItem.setTotalPrice(adviceDto.getTotalPrice()); // 总价(数量×单价,DTO已计算)
|
||||
|
||||
return chargeItem;
|
||||
}
|
||||
|
||||
/**
|
||||
* 划价入参校验
|
||||
* 校验规则:1. 参数非空 2. 科室ID非空 3. 医嘱列表非空 4. 临时耗材库存校验
|
||||
*
|
||||
* @param regAdviceSaveParam 划价请求参数
|
||||
* @return R<?> 校验结果(成功返回R.ok(),失败返回R.fail())
|
||||
*/
|
||||
private R<?> checkNurseBillingParam(RegAdviceSaveParam regAdviceSaveParam) {
|
||||
// 1. 整体参数非空校验
|
||||
if (regAdviceSaveParam == null) {
|
||||
return R.fail("划价请求失败:未获取到有效请求数据,请重新提交");
|
||||
}
|
||||
|
||||
// 2. 核心字段非空校验:患者住院科室ID
|
||||
if (regAdviceSaveParam.getOrganizationId() == null) {
|
||||
return R.fail("划价请求失败:患者住院科室信息缺失,请确认患者科室后重试");
|
||||
}
|
||||
|
||||
// 3. 医嘱列表非空校验
|
||||
List<RegAdviceSaveDto> adviceList = regAdviceSaveParam.getRegAdviceSaveList();
|
||||
if (adviceList == null || adviceList.isEmpty()) {
|
||||
return R.fail("划价请求失败:未选择任何待划价项目,请添加医嘱后提交");
|
||||
}
|
||||
|
||||
// 4. 临时耗材库存校验:仅校验非删除、非诊疗活动的临时医嘱
|
||||
List<AdviceSaveDto> needCheckInventoryList = adviceList.stream()
|
||||
.filter(advice -> TherapyTimeType.TEMPORARY.getValue().equals(advice.getTherapyEnum())
|
||||
&& !DbOpType.DELETE.getCode().equals(advice.getDbOpType())
|
||||
&& !ItemType.ACTIVITY.getValue().equals(advice.getAdviceType()))
|
||||
.collect(Collectors.toList());
|
||||
|
||||
// 调用工具类校验库存,返回非null则表示库存不足
|
||||
String inventoryTip = adviceUtils.checkInventory(new ArrayList<>(needCheckInventoryList));
|
||||
if (inventoryTip != null) {
|
||||
// 库存提示已包含具体耗材名称和短缺数量,直接拼接操作建议
|
||||
return R.fail("划价失败:" + inventoryTip + ",请联系库房确认库存或调整申请数量");
|
||||
}
|
||||
|
||||
// 所有校验通过
|
||||
return R.ok();
|
||||
}
|
||||
|
||||
// ======================== 以下方法原代码未实现,保留接口方法签名 ========================
|
||||
|
||||
@Override
|
||||
public R<?> getBillingListByEncounterId() {
|
||||
// 功能:根据就诊ID查询划价列表(待实现)
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public R<?> deleteInNurseBilling() {
|
||||
// 功能:删除住院划价记录(待实现)
|
||||
// List<AdviceSaveDto> deleteList
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public R<?> addOrderBilling() {
|
||||
// 功能:新增订单划价(待实现)
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public R<?> deleteOrderBilling() {
|
||||
// 功能:删除订单划价(待实现)
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public R<?> updateOrderBilling() {
|
||||
// 功能:修改订单划价(待实现)
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public R<?> getOrderBillingByRequestId() {
|
||||
// 功能:根据请求ID查询订单划价(待实现)
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,248 @@
|
||||
package com.openhis.web.inhospitalnursestation.appservice.impl;
|
||||
|
||||
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.exception.ServiceException;
|
||||
import com.core.common.utils.AssignSeqUtil;
|
||||
import com.core.common.utils.DateUtils;
|
||||
import com.core.common.utils.SecurityUtils;
|
||||
import com.openhis.common.constant.CommonConstants;
|
||||
import com.openhis.common.enums.AssignSeqEnum;
|
||||
import com.openhis.common.enums.PublicationStatus;
|
||||
import com.openhis.common.utils.HisQueryUtils;
|
||||
import com.openhis.web.common.dto.UnitDto;
|
||||
import com.openhis.web.inhospitalnursestation.appservice.IOrgDeviceStockTakeAppService;
|
||||
import com.openhis.web.inhospitalnursestation.dto.OrgDeviceDto;
|
||||
import com.openhis.web.inhospitalnursestation.dto.OrgDeviceSummaryFromDto;
|
||||
import com.openhis.web.inhospitalnursestation.dto.OrgDeviceSummaryParam;
|
||||
import com.openhis.web.inhospitalnursestation.mapper.OrgDeviceStockTakeAppMapper;
|
||||
import com.openhis.web.pharmacymanage.mapper.ReturnMedicineMapper;
|
||||
import com.openhis.workflow.domain.InventoryItem;
|
||||
import com.openhis.workflow.mapper.InventoryItemMapper;
|
||||
import com.openhis.workflow.service.IDeviceDispenseService;
|
||||
import com.openhis.workflow.service.IInventoryItemService;
|
||||
import com.openhis.workflow.service.ISupplyDeliveryService;
|
||||
import com.openhis.workflow.service.ISupplyRequestService;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDate;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 科室耗材盘点 应用实现类
|
||||
*
|
||||
* @author wuyan
|
||||
* @date 2025/11/05
|
||||
*/
|
||||
@Service
|
||||
public class OrgDeviceStockTakeAppServiceImpl implements IOrgDeviceStockTakeAppService {
|
||||
|
||||
@Resource
|
||||
private OrgDeviceStockTakeAppMapper orgDeviceStockTakeAppMapper;
|
||||
|
||||
@Resource
|
||||
private IInventoryItemService inventoryItemService;
|
||||
|
||||
@Resource
|
||||
private ISupplyRequestService supplyRequestService;
|
||||
|
||||
@Resource
|
||||
private ISupplyDeliveryService supplyDeliveryService;
|
||||
|
||||
@Resource
|
||||
private AssignSeqUtil assignSeqUtil;
|
||||
|
||||
@Resource
|
||||
private IDeviceDispenseService deviceDispenseService;
|
||||
|
||||
@Resource
|
||||
private InventoryItemMapper inventoryItemMapper;
|
||||
|
||||
/**
|
||||
* 查询科室耗材汇总
|
||||
*
|
||||
* @param orgDeviceSummaryParam 查询条件
|
||||
* @param startTime 开始时间
|
||||
* @param endTime 结束时间
|
||||
* @param pageNo 当前页码
|
||||
* @param pageSize 查询条数
|
||||
* @param searchKey 模糊查询关键字
|
||||
* @param request 请求
|
||||
* @return 科室耗材汇总单
|
||||
*/
|
||||
@Override
|
||||
public R<?> getOrgDeviceSummaryFromPage(OrgDeviceSummaryParam orgDeviceSummaryParam, String startTime,
|
||||
String endTime, Integer pageNo, Integer pageSize, String searchKey, HttpServletRequest request) {
|
||||
pageSize = Integer.MAX_VALUE;
|
||||
|
||||
QueryWrapper<OrgDeviceDto> queryWrapper = HisQueryUtils.buildQueryWrapper(orgDeviceSummaryParam, searchKey,
|
||||
new HashSet<>(List.of(CommonConstants.FieldName.ItemName)), request);
|
||||
if (!(startTime == null || endTime == null)) {
|
||||
queryWrapper.between(CommonConstants.FieldName.ApplyTime, LocalDate.parse(startTime),
|
||||
LocalDate.parse(endTime));
|
||||
}
|
||||
|
||||
Page<OrgDeviceDto> orgDeviceDtoPage =
|
||||
orgDeviceStockTakeAppMapper.selectOrgDeviceInfo(new Page<>(pageNo, pageSize), queryWrapper);
|
||||
|
||||
List<OrgDeviceDto> orgDeviceList =
|
||||
new ArrayList<>(orgDeviceDtoPage.getRecords()).stream().filter(x -> x.getDispenseId() != null).toList();
|
||||
|
||||
// 根据项目id + 批次号 + 库房号分组
|
||||
Map<String, List<OrgDeviceDto>> orgDeviceGroupBy =
|
||||
orgDeviceList.stream().collect(Collectors.groupingBy(item -> item.getItemId() + CommonConstants.Common.DASH
|
||||
+ item.getLotNumber() + CommonConstants.Common.DASH + item.getSourceLocationId()));
|
||||
|
||||
ArrayList<OrgDeviceSummaryFromDto> orgDeviceSummaryFromDtoList = new ArrayList<>();
|
||||
|
||||
orgDeviceGroupBy.forEach((k, v) -> {
|
||||
OrgDeviceSummaryFromDto orgDeviceSummaryFromDto = new OrgDeviceSummaryFromDto();
|
||||
|
||||
String itemId = k.split(CommonConstants.Common.DASH)[0];
|
||||
String lotNumber = k.split(CommonConstants.Common.DASH)[1];
|
||||
String sourceLocationId = k.split(CommonConstants.Common.DASH)[2];
|
||||
|
||||
OrgDeviceDto orgDeviceDtoFirst = v.get(0);
|
||||
// 拆零比例
|
||||
BigDecimal partPercent = orgDeviceDtoFirst.getPartPercent();
|
||||
// 最小单位
|
||||
String minUnitCode = orgDeviceDtoFirst.getMinUnitCode();
|
||||
// 常规单位
|
||||
String unitCode = orgDeviceDtoFirst.getMaxUnitCode();
|
||||
if (minUnitCode == null || unitCode == null || partPercent == null) {
|
||||
throw new ServiceException("耗材信息有误,请联系管理员");
|
||||
}
|
||||
|
||||
List<Long> dispenseIdList = new ArrayList<>();
|
||||
|
||||
// 最小单位数量
|
||||
BigDecimal minQuantity = BigDecimal.ZERO;
|
||||
for (OrgDeviceDto orgDeviceDto : v) {
|
||||
BigDecimal quantity = orgDeviceDto.getQuantity();
|
||||
if (unitCode.equals(orgDeviceDto.getUnitCode())) {
|
||||
// 转换为小单位进行累加
|
||||
quantity = orgDeviceDto.getQuantity().multiply(partPercent);
|
||||
}
|
||||
minQuantity = minQuantity.add(quantity);
|
||||
dispenseIdList.add(orgDeviceDto.getDispenseId());
|
||||
}
|
||||
|
||||
List<UnitDto> unitList = new ArrayList<>();
|
||||
UnitDto unitDto = new UnitDto();
|
||||
// 单位列表
|
||||
unitDto.setUnitCode(orgDeviceDtoFirst.getUnitCode()).setMinUnitCode(minUnitCode);
|
||||
unitList.add(unitDto);
|
||||
|
||||
orgDeviceSummaryFromDto.setItemId(Long.valueOf(itemId)) // 器材id
|
||||
.setName(orgDeviceDtoFirst.getItemName()) // 器材名称
|
||||
.setTotalVolume(orgDeviceDtoFirst.getTotalVolume()) // 规格
|
||||
.setManufacturer(orgDeviceDtoFirst.getManufacturer()) // 厂家
|
||||
.setLotNumber(lotNumber) // 批号
|
||||
.setUnitPrice(orgDeviceDtoFirst.getUnitPrice()) // 单价
|
||||
.setDispenseQuantity(minQuantity) // 发放数量
|
||||
.setUnitCode(orgDeviceDtoFirst.getUnitCode()) // 单位
|
||||
.setMinUnitCode(minUnitCode) // 最小单位
|
||||
.setPartPercent(partPercent) // 拆零比
|
||||
.setUnitCode_dictText(orgDeviceDtoFirst.getUnitCode_dictText()) // 单位文字
|
||||
.setSourceLocationId(Long.valueOf(sourceLocationId)) // 发放地点
|
||||
.setDispenseIdList(dispenseIdList) // 发放id列表
|
||||
.setUnitList(unitList); // 单位列表
|
||||
|
||||
orgDeviceSummaryFromDtoList.add(orgDeviceSummaryFromDto);
|
||||
});
|
||||
|
||||
List<Long> itemIdList = orgDeviceSummaryFromDtoList.stream().map(OrgDeviceSummaryFromDto::getItemId).toList();
|
||||
List<InventoryItem> inventoryItemList = inventoryItemService.selectInventoryByItemIdList(itemIdList, 1);
|
||||
for (InventoryItem inventoryItem : inventoryItemList)
|
||||
for (OrgDeviceSummaryFromDto orgDeviceSummaryFromDto : orgDeviceSummaryFromDtoList)
|
||||
if (orgDeviceSummaryFromDto.getItemId().equals(inventoryItem.getItemId())
|
||||
&& orgDeviceSummaryFromDto.getLotNumber().equals(inventoryItem.getLotNumber())
|
||||
&& orgDeviceSummaryFromDto.getSourceLocationId().equals(inventoryItem.getLocationId())) {
|
||||
// 库存数量
|
||||
orgDeviceSummaryFromDto.setQuantity(inventoryItem.getQuantity());
|
||||
// 库存id
|
||||
orgDeviceSummaryFromDto.setInventoryItemId(inventoryItem.getId());
|
||||
}
|
||||
|
||||
return R.ok(orgDeviceSummaryFromDtoList);
|
||||
}
|
||||
|
||||
/**
|
||||
* 科室耗材汇总
|
||||
*
|
||||
* @return 科室耗材汇总单
|
||||
*/
|
||||
@Override
|
||||
public R<?> orgDeviceSummary(OrgDeviceSummaryParam orgDeviceSummaryParam) {
|
||||
// 申请时间
|
||||
Date now = DateUtils.getNowDate();
|
||||
// 申请人
|
||||
Long practitionerId = SecurityUtils.getLoginUser().getPractitionerId();
|
||||
// 汇总单据号
|
||||
String busNo = assignSeqUtil.getSeqByDay(AssignSeqEnum.DEVICE_SUMMARY_NO.getPrefix(), 4);
|
||||
|
||||
// 数量
|
||||
BigDecimal stockTakeQuantity = orgDeviceSummaryParam.getStockTakeQuantity();
|
||||
// 使用单位
|
||||
String useUnitCode = orgDeviceSummaryParam.getUseUnitCode();
|
||||
// 最小单位
|
||||
String minUnitCode = orgDeviceSummaryParam.getMinUnitCode();
|
||||
// 拆零比
|
||||
BigDecimal partPercent = orgDeviceSummaryParam.getPartPercent();
|
||||
// 发放id列表
|
||||
List<Long> dispenseIdList = orgDeviceSummaryParam.getDispenseIdList();
|
||||
|
||||
if (orgDeviceSummaryParam.getInventoryItemId() == null) {
|
||||
return R.ok("未匹配到库存");
|
||||
}
|
||||
List<InventoryItem> inventoryItemList = new ArrayList<>();
|
||||
// 获取库存信息
|
||||
InventoryItem inventoryItem = inventoryItemMapper.selectById(orgDeviceSummaryParam.getInventoryItemId());
|
||||
if (inventoryItem != null) {
|
||||
if (PublicationStatus.ACTIVE.getValue().equals(inventoryItem.getInventoryStatusEnum())) {
|
||||
// 库存数量判定
|
||||
if (useUnitCode.equals(inventoryItem.getUnitCode())) {
|
||||
// 当前库存数量(拆零单位)=当前库存数量(拆零单位)-请求数量
|
||||
BigDecimal quantity = inventoryItem.getQuantity().subtract(stockTakeQuantity);
|
||||
// 库存数量判定
|
||||
if (quantity.compareTo(BigDecimal.ZERO) < 0) {
|
||||
// 库存数量不足
|
||||
return R.fail("当前库存数量不足");
|
||||
} else {
|
||||
inventoryItem.setQuantity(quantity);
|
||||
}
|
||||
} else {
|
||||
// 当前库存数量(拆零单位)=当前库存数量(拆零单位)-拆零数量(拆零比×请求数量)
|
||||
BigDecimal quantity = inventoryItem.getQuantity().subtract(partPercent.multiply(stockTakeQuantity));
|
||||
// 库存数量判定
|
||||
if (quantity.compareTo(BigDecimal.ZERO) < 0) {
|
||||
// 库存数量不足
|
||||
return R.fail("当前库存数量不足");
|
||||
} else {
|
||||
inventoryItem.setQuantity(quantity);
|
||||
}
|
||||
}
|
||||
inventoryItemList.add(inventoryItem);
|
||||
}
|
||||
// 库存更新
|
||||
inventoryItemService.updateBatchById(inventoryItemList);
|
||||
// 添加汇总单
|
||||
Long supplyRequestId = supplyRequestService.createDeviceSummarySupplyRequest(
|
||||
orgDeviceSummaryParam.getItemId(), orgDeviceSummaryParam.getSourceLocationId(),
|
||||
orgDeviceSummaryParam.getLotNumber(), stockTakeQuantity, minUnitCode, practitionerId, now, busNo);
|
||||
supplyDeliveryService.createDeviceSummarySupplyDelivery(orgDeviceSummaryParam.getItemId(),
|
||||
orgDeviceSummaryParam.getLotNumber(), stockTakeQuantity, minUnitCode, supplyRequestId);
|
||||
|
||||
// 耗材发放状态更新
|
||||
deviceDispenseService.updateDispenseStatusSummarized(dispenseIdList, busNo);
|
||||
return R.ok("盘点成功");
|
||||
}
|
||||
return R.fail("未找到对应库存数据");
|
||||
}
|
||||
|
||||
}
|
||||
@@ -85,6 +85,17 @@ public class ATDManageController {
|
||||
return atdManageAppService.getAdmissionPatientInfo(encounterId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 住院患者待处理信息列表
|
||||
*
|
||||
* @param encounterId 住院id
|
||||
* @return 待处理信息列表
|
||||
*/
|
||||
@GetMapping(value = "/patient-pending")
|
||||
public R<?> getInPatientPendingList(Long encounterId) {
|
||||
return atdManageAppService.getInPatientPendingList(encounterId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 入科床位分配
|
||||
*
|
||||
@@ -95,4 +106,26 @@ public class ATDManageController {
|
||||
public R<?> admissionBedAssignment(@RequestBody AdmissionPatientInfoDto admissionPatientInfoDto) {
|
||||
return atdManageAppService.admissionBedAssignment(admissionPatientInfoDto);
|
||||
}
|
||||
|
||||
/**
|
||||
* 转科
|
||||
*
|
||||
* @param encounterId 住院id
|
||||
* @return 结果
|
||||
*/
|
||||
@PutMapping(value = "/transfer-department")
|
||||
public R<?> transferDepartment(Long encounterId) {
|
||||
return atdManageAppService.transferDepartment(encounterId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 出院
|
||||
*
|
||||
* @param encounterId 住院id
|
||||
* @return 结果
|
||||
*/
|
||||
@PutMapping(value = "/hospital-discharge")
|
||||
public R<?> hospitalDischarge(Long encounterId) {
|
||||
return atdManageAppService.hospitalDischarge(encounterId);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -107,7 +107,7 @@ public class AdviceProcessController {
|
||||
* @param adviceExecuteParam 取消执行参数
|
||||
* @return 操作结果
|
||||
*/
|
||||
@PostMapping(value = "/advice-cancel")
|
||||
@PutMapping(value = "/advice-cancel")
|
||||
public R<?> adviceCancel(@RequestBody AdviceExecuteParam adviceExecuteParam) {
|
||||
return adviceProcessAppService.adviceCancel(adviceExecuteParam);
|
||||
}
|
||||
@@ -118,8 +118,8 @@ public class AdviceProcessController {
|
||||
* @param adviceExecuteParam 不执行参数
|
||||
* @return 操作结果
|
||||
*/
|
||||
@PostMapping(value = "/advice-void")
|
||||
public R<?> adviceVoid(AdviceExecuteParam adviceExecuteParam) {
|
||||
@PutMapping(value = "/advice-void")
|
||||
public R<?> adviceVoid(@RequestBody AdviceExecuteParam adviceExecuteParam) {
|
||||
return adviceProcessAppService.adviceVoid(adviceExecuteParam);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,12 +5,12 @@ import java.util.List;
|
||||
import javax.annotation.Resource;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
import com.openhis.web.inhospitalnursestation.appservice.IMedicineSummaryAppService;
|
||||
import com.openhis.web.inhospitalnursestation.dto.InpatientMedicinePrescriptionInfoDto;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import com.core.common.core.domain.R;
|
||||
import com.openhis.web.inhospitalnursestation.dto.InpatientMedicineSearchParam;
|
||||
import com.openhis.web.inhospitalnursestation.appservice.IMedicineSummaryAppService;
|
||||
import com.openhis.web.inhospitalnursestation.dto.DispenseFormSearchParam;
|
||||
import com.openhis.web.inhospitalnursestation.dto.MedicineSummaryParam;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
@@ -28,64 +28,74 @@ import lombok.extern.slf4j.Slf4j;
|
||||
public class MedicineSummaryController {
|
||||
|
||||
@Resource
|
||||
public IMedicineSummaryAppService medicineCollectionService;
|
||||
public IMedicineSummaryAppService medicineSummaryAppService;
|
||||
|
||||
/**
|
||||
* 分页查询在科病人列表
|
||||
* 查询发药单信息
|
||||
*
|
||||
* @param searchParam 查询条件
|
||||
* @param searchKey 模糊查询关键字
|
||||
* @param dispenseFormSearchParam 查询条件
|
||||
* @param pageNo 当前页码
|
||||
* @param pageSize 查询条数
|
||||
* @param request 请求数据
|
||||
* @return 发药病人列表
|
||||
* @param request 请求
|
||||
* @return 发药单信息
|
||||
*/
|
||||
@GetMapping("/encounter-list")
|
||||
public R<?> getEncounterInfoList(InpatientMedicineSearchParam searchParam, String searchKey,
|
||||
@GetMapping(value = "/dispensing-form")
|
||||
public R<?> getMedicineDispenseFormPage(DispenseFormSearchParam dispenseFormSearchParam,
|
||||
@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
|
||||
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize, HttpServletRequest request) {
|
||||
return medicineCollectionService.getEncounterInfoListPage(searchParam, searchKey, pageNo, pageSize, request);
|
||||
return medicineSummaryAppService.getMedicineDispenseFormPage(dispenseFormSearchParam, pageNo, pageSize,
|
||||
request);
|
||||
}
|
||||
|
||||
/**
|
||||
* 医嘱查询
|
||||
* 查询药品汇总单
|
||||
*
|
||||
* @param searchParam 查询条件
|
||||
* @param searchKey 模糊查询关键字
|
||||
* @param dispenseFormSearchParam 查询条件
|
||||
* @param pageNo 当前页码
|
||||
* @param pageSize 查询条数
|
||||
* @param request 请求数据
|
||||
* @param searchKey 模糊查询关键字
|
||||
* @param request 请求
|
||||
* @return 药品汇总单
|
||||
*/
|
||||
@GetMapping("/advice-list")
|
||||
public R<?> getPatientInfoList(InpatientMedicineSearchParam searchParam, String searchKey,
|
||||
@GetMapping(value = "/summary-form")
|
||||
public R<?> getMedicineSummaryFormPage(DispenseFormSearchParam dispenseFormSearchParam,
|
||||
@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
|
||||
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize, HttpServletRequest request) {
|
||||
return medicineCollectionService.getPrescriptionInfo(searchParam, searchKey, pageNo, pageSize, request);
|
||||
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize, String searchKey,
|
||||
HttpServletRequest request) {
|
||||
return medicineSummaryAppService.getMedicineSummaryFormPage(dispenseFormSearchParam, pageNo, pageSize,
|
||||
searchKey, request);
|
||||
}
|
||||
|
||||
/**
|
||||
* 显示汇总发药单(生成之前的确认,此刻还没生成汇总单)
|
||||
* 查询药品汇总单详情
|
||||
*
|
||||
* @param searchParam 查询条件
|
||||
* @param pageNo 当前页码
|
||||
* @param pageSize 查询条数
|
||||
* @return 处理结果
|
||||
* @param summaryNo 汇总单号
|
||||
* @return 药品汇总单详情
|
||||
*/
|
||||
@GetMapping("/show-medicine-summary")
|
||||
public R<?> showMedicineSummary(@RequestBody List<InpatientMedicineSearchParam> searchParam,
|
||||
@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
|
||||
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
|
||||
return medicineCollectionService.showMedicineSummary(searchParam, pageNo, pageSize);
|
||||
@GetMapping(value = "/summary-form-detail")
|
||||
public R<?> getMedicineSummaryFormDetail(String summaryNo) {
|
||||
return medicineSummaryAppService.getMedicineSummaryFormDetail(summaryNo);
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成汇总发药单
|
||||
*
|
||||
* @param prescriptionInfo 汇总发药单
|
||||
* @param medicineSummaryParamList 汇总发药申请参数
|
||||
* @return 处理结果
|
||||
*/
|
||||
@PostMapping("/medicine-summary")
|
||||
public R<?> medicineSummary(@RequestBody List<InpatientMedicinePrescriptionInfoDto> prescriptionInfo) {
|
||||
return medicineCollectionService.medicineSummary(prescriptionInfo);
|
||||
public R<?> medicineSummary(@RequestBody List<MedicineSummaryParam> medicineSummaryParamList) {
|
||||
return medicineSummaryAppService.medicineSummary(medicineSummaryParamList);
|
||||
}
|
||||
|
||||
/**
|
||||
* 取消汇总
|
||||
*
|
||||
* @param summaryNo 汇总单号
|
||||
* @return 处理结果
|
||||
*/
|
||||
@PutMapping("/cancel-summary")
|
||||
public R<?> cancelSummary(String summaryNo) {
|
||||
return medicineSummaryAppService.cancelSummary(summaryNo);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,69 @@
|
||||
package com.openhis.web.inhospitalnursestation.controller;
|
||||
|
||||
import com.core.common.core.domain.R;
|
||||
import com.openhis.web.regdoctorstation.dto.RegAdviceSaveParam;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
/**
|
||||
* @author whm
|
||||
* @date 2025/11/10 16:00
|
||||
* @description 住院护士 患者划价、医嘱计费
|
||||
*/
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/inhospitalnursestation/innursebilling")
|
||||
@Slf4j
|
||||
@AllArgsConstructor
|
||||
public class NurseBillingController {
|
||||
// TODO: Implement InNurseBillingController
|
||||
/*
|
||||
* 新增住院护士划价
|
||||
* @return
|
||||
*/
|
||||
public R<?> addInNurseBilling(RegAdviceSaveParam regAdviceSaveParam) {
|
||||
return R.ok();
|
||||
}
|
||||
/*
|
||||
* 住院护士 划价列表 根据护士encounterId查询
|
||||
* @return
|
||||
*/
|
||||
public R<?> getBillingListByEncounterId() {
|
||||
return R.ok();
|
||||
}
|
||||
/*
|
||||
* 住院护士撤销划价
|
||||
* @return
|
||||
*/
|
||||
public R<?> deleteInNurseBilling() {
|
||||
return R.ok();
|
||||
}
|
||||
/*
|
||||
* 医嘱计费添加 诊疗 耗材
|
||||
*/
|
||||
public R<?> addOrderBilling() {
|
||||
return R.ok();
|
||||
}
|
||||
/*
|
||||
* 医嘱计费删除 诊疗 耗材
|
||||
*/
|
||||
public R<?> deleteOrderBilling() {
|
||||
return R.ok();
|
||||
}
|
||||
/*
|
||||
* 医嘱计费修改 诊疗 耗材
|
||||
*/
|
||||
public R<?> updateOrderBilling() {
|
||||
return R.ok();
|
||||
}
|
||||
/*
|
||||
根据医嘱id查询已计费的 耗材列表
|
||||
* @return
|
||||
*/
|
||||
public R<?> getOrderBillingByRequestId() {
|
||||
return R.ok();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
package com.openhis.web.inhospitalnursestation.controller;
|
||||
|
||||
import com.core.common.core.domain.R;
|
||||
import com.openhis.web.inhospitalnursestation.appservice.IOrgDeviceStockTakeAppService;
|
||||
import com.openhis.web.inhospitalnursestation.dto.OrgDeviceSummaryParam;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
/**
|
||||
* 科室耗材盘点
|
||||
*
|
||||
* @author wuyan
|
||||
* @date 2025/11/05
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/nurse-station/orgdevice-stocktake")
|
||||
@Slf4j
|
||||
@AllArgsConstructor
|
||||
public class OrgDeviceStockTakeController {
|
||||
|
||||
@Resource
|
||||
private IOrgDeviceStockTakeAppService orgDeviceStockTakeService;
|
||||
|
||||
/**
|
||||
* 查询科室耗材汇总
|
||||
*
|
||||
* @param orgDeviceSummaryParam 查询条件
|
||||
* @param startTime 开始时间
|
||||
* @param endTime 结束时间
|
||||
* @param pageNo 当前页码
|
||||
* @param pageSize 查询条数
|
||||
* @param searchKey 模糊查询关键字
|
||||
* @param request 请求
|
||||
* @return 科室耗材汇总单
|
||||
*/
|
||||
@GetMapping(value = "/summary-from")
|
||||
public R<?> getOrgDeviceSummaryFromPage(OrgDeviceSummaryParam orgDeviceSummaryParam, String startTime,
|
||||
String endTime, @RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
|
||||
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize, String searchKey,
|
||||
HttpServletRequest request) {
|
||||
return orgDeviceStockTakeService.getOrgDeviceSummaryFromPage(orgDeviceSummaryParam, startTime, endTime, pageNo,
|
||||
pageSize, searchKey, request);
|
||||
}
|
||||
|
||||
/**
|
||||
* 科室耗材汇总
|
||||
*
|
||||
* @return 科室耗材汇总单
|
||||
*/
|
||||
@PutMapping(value = "/orgdevice-summary")
|
||||
public R<?> orgDeviceSummary(OrgDeviceSummaryParam orgDeviceSummaryParam) {
|
||||
return orgDeviceStockTakeService.orgDeviceSummary(orgDeviceSummaryParam);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -25,6 +25,12 @@ public class AdviceExecuteDetailParam {
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long requestId;
|
||||
|
||||
/** 就诊Id */
|
||||
private Long encounterId;
|
||||
|
||||
/** 患者Id */
|
||||
private Long patientId;
|
||||
|
||||
/** 账号id */
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long accountId;
|
||||
@@ -39,6 +45,9 @@ public class AdviceExecuteDetailParam {
|
||||
/** 医嘱请求所在表 */
|
||||
private String adviceTable;
|
||||
|
||||
/** 组号 */
|
||||
private Long groupId;
|
||||
|
||||
/** 执行时间点集合 */
|
||||
private List<String> executeTimes;
|
||||
|
||||
|
||||
@@ -5,7 +5,6 @@ package com.openhis.web.inhospitalnursestation.dto;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
@@ -16,35 +15,34 @@ import lombok.experimental.Accessors;
|
||||
/**
|
||||
* 患者列表查询条件
|
||||
*
|
||||
* @author yuxj
|
||||
* @author zwh
|
||||
* @date 2025-06-03
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class InpatientMedicineSearchParam implements Serializable {
|
||||
public class DispenseFormSearchParam implements Serializable {
|
||||
|
||||
/** 科室 */
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long organizationId;
|
||||
/** 汇总状态 */
|
||||
private Integer SummaryStatus;
|
||||
|
||||
/** 中药标识 */
|
||||
private Integer tcmFlag;
|
||||
|
||||
/** 医嘱类型 */
|
||||
private Integer therapyEnum;
|
||||
private Integer therapyEnum;
|
||||
|
||||
/**
|
||||
* 领药至哪天
|
||||
* */
|
||||
private Date plannedDispenseTime;
|
||||
|
||||
/** 就诊id */
|
||||
/** 就诊ids */
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private List<Long> encounterIdList;
|
||||
private String encounterIds;
|
||||
|
||||
/** 发放id */
|
||||
/** 发放药房id */
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long dispenseId;
|
||||
private Long locationId;
|
||||
|
||||
/**
|
||||
* 项目表
|
||||
*/
|
||||
private String itemTable;
|
||||
/** 执行时间 */
|
||||
private Date exeTime;
|
||||
|
||||
/** 汇总人id */
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long applicantId;
|
||||
}
|
||||
@@ -3,8 +3,6 @@
|
||||
*/
|
||||
package com.openhis.web.inhospitalnursestation.dto;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
|
||||
@@ -1,58 +0,0 @@
|
||||
/*
|
||||
* Copyright ©2023 CJB-CNIT Team. All rights reserved
|
||||
*/
|
||||
package com.openhis.web.inhospitalnursestation.dto;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
/**
|
||||
* 就诊人员列表
|
||||
*
|
||||
* @author yuxj
|
||||
* @date 2025-06-03
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class InpatientMedicineEncounterInfoDto {
|
||||
|
||||
/** 科室 */
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long organizationId;
|
||||
|
||||
/** 科室 */
|
||||
private String organizationName;
|
||||
|
||||
/** 就诊id */
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long encounterId;
|
||||
/** 住院号 */
|
||||
private String busNo;
|
||||
|
||||
/** 患者姓名 */
|
||||
private String patientName;
|
||||
|
||||
/** 拼音码 */
|
||||
private String patientPyStr;
|
||||
|
||||
/** 五笔码 */
|
||||
private String patientWbStr;
|
||||
|
||||
/** 性别 */
|
||||
private Integer genderEnum;
|
||||
private String genderEnum_enumText;
|
||||
|
||||
/** 生日 */
|
||||
private Date birthDate;
|
||||
|
||||
/** 年龄 */
|
||||
private String age;
|
||||
|
||||
/** 床位 */
|
||||
private String inpatientBed;
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
/*
|
||||
* 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 com.openhis.administration.domain.Practitioner;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
/**
|
||||
*住院领药初期dto
|
||||
*
|
||||
* @author yuxj
|
||||
* @date 2025-06-03
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class InpatientMedicineInitDto {
|
||||
|
||||
/** 科室列表 */
|
||||
private List<LongOptions> departmentOptions;
|
||||
/** 领药人列表 */
|
||||
private List<Practitioner> applicantOptions;
|
||||
|
||||
/** 发药状态 */
|
||||
private List<IntegerOptions> dispenseStatusOptions;
|
||||
|
||||
@Data
|
||||
public static class LongOptions {
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long value;
|
||||
private String label;
|
||||
|
||||
public LongOptions(Long value, String label) {
|
||||
this.value = value;
|
||||
this.label = label;
|
||||
}
|
||||
}
|
||||
|
||||
@Data
|
||||
public static class IntegerOptions {
|
||||
private Integer value;
|
||||
private String label;
|
||||
|
||||
public IntegerOptions(Integer value, String label) {
|
||||
this.value = value;
|
||||
this.label = label;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,115 +0,0 @@
|
||||
/*
|
||||
* Copyright ©2023 CJB-CNIT Team. All rights reserved
|
||||
*/
|
||||
package com.openhis.web.inhospitalnursestation.dto;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
|
||||
import com.openhis.common.annotation.Dict;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
/**
|
||||
* 医嘱列表
|
||||
*
|
||||
* @author yuxj
|
||||
* @date 2025-06-03
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class InpatientMedicinePrescriptionInfoDto {
|
||||
|
||||
/**
|
||||
* 药品发放id
|
||||
*/
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long dispenseId;
|
||||
|
||||
/**
|
||||
* 药品发放id
|
||||
*/
|
||||
private String dispenseIds;
|
||||
|
||||
/**
|
||||
* 治疗类型
|
||||
*/
|
||||
private Integer therapyEnum;
|
||||
private String therapyEnum_enumText;
|
||||
|
||||
/**
|
||||
* 预定发药时间
|
||||
*/
|
||||
private Date plannedDispenseTime;
|
||||
|
||||
/**
|
||||
* 就诊id
|
||||
*/
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long encounterId;
|
||||
|
||||
/**
|
||||
* 患者姓名
|
||||
*/
|
||||
private String patientName;
|
||||
|
||||
/**
|
||||
* 发放状态
|
||||
*/
|
||||
private Integer statusEnum;
|
||||
private String statusEnum_enumText;
|
||||
|
||||
/**
|
||||
* 项目表
|
||||
*/
|
||||
private String itemTable;
|
||||
|
||||
/**
|
||||
* 项目id
|
||||
*/
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long itemId;
|
||||
|
||||
/**
|
||||
* 项目名
|
||||
*/
|
||||
private String itemName;
|
||||
|
||||
/**
|
||||
* 请求数量
|
||||
*/
|
||||
private Integer quantity;
|
||||
|
||||
/**
|
||||
* 请求单位编码
|
||||
*/
|
||||
@Dict(dictCode = "unit_code")
|
||||
private String unitCode;
|
||||
private String unitCode_dictText;
|
||||
|
||||
/**
|
||||
* 发放地点
|
||||
*/
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long locationId;
|
||||
/**
|
||||
* 发放地点
|
||||
*/
|
||||
private String locationName;
|
||||
/**
|
||||
* 地点类型
|
||||
*/
|
||||
private Integer locationEnum;
|
||||
private String locationEnum_enumText;
|
||||
|
||||
/**
|
||||
* 批号
|
||||
*/
|
||||
private String lotNumber;
|
||||
/**
|
||||
* 规格
|
||||
*/
|
||||
private String totalVolume;
|
||||
}
|
||||
@@ -0,0 +1,177 @@
|
||||
/*
|
||||
* Copyright ©2023 CJB-CNIT Team. All rights reserved
|
||||
*/
|
||||
package com.openhis.web.inhospitalnursestation.dto;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import com.openhis.common.annotation.Dict;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
/**
|
||||
* 领药单信息
|
||||
*
|
||||
* @author zwh
|
||||
* @date 2025-10-17
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class MedicineDispenseFormDto {
|
||||
|
||||
/** 住院患者id */
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long encounterId;
|
||||
|
||||
/**
|
||||
* 诊断定义名称
|
||||
*/
|
||||
private String conditionDefinitionName;
|
||||
|
||||
/**
|
||||
* 分组id
|
||||
*/
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long groupId;
|
||||
|
||||
/**
|
||||
* 医嘱id
|
||||
*/
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long adviceId;
|
||||
|
||||
/** 医嘱名称 */
|
||||
private String adviceName;
|
||||
|
||||
/**
|
||||
* 项目id
|
||||
*/
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long itemId;
|
||||
|
||||
/**
|
||||
* 规格
|
||||
*/
|
||||
private String volume;
|
||||
|
||||
/** 产品批号 */
|
||||
private String lotNumber;
|
||||
|
||||
/** 请求数量 */
|
||||
private Integer quantity;
|
||||
|
||||
/** 请求单位编码 */
|
||||
@Dict(dictCode = "unit_code")
|
||||
private String unitCode;
|
||||
private String unitCode_dictText;
|
||||
|
||||
/** 是否皮试 */
|
||||
private Integer skinTestFlag;
|
||||
private String skinTestFlag_enumText;
|
||||
|
||||
/** 是否为注射药物 */
|
||||
private Integer injectFlag;
|
||||
private String injectFlag_enumText;
|
||||
|
||||
/**
|
||||
* 用法
|
||||
*/
|
||||
@Dict(dictCode = "method_code")
|
||||
private String methodCode;
|
||||
private String methodCode_dictText;
|
||||
|
||||
/**
|
||||
* 使用频次
|
||||
*/
|
||||
@Dict(dictCode = "rate_code")
|
||||
private String rateCode;
|
||||
private String rateCode_dictText;
|
||||
|
||||
/**
|
||||
* 单次剂量
|
||||
*/
|
||||
private BigDecimal dose;
|
||||
|
||||
/** 剂量单位 */
|
||||
@Dict(dictCode = "unit_code")
|
||||
private String doseUnitCode;
|
||||
private String doseUnitCode_dictText;
|
||||
|
||||
/**
|
||||
* 物理位置id | 可能是 发药药房id,耗材房id,执行科室id
|
||||
*/
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long positionId;
|
||||
|
||||
/**
|
||||
* 物理位置| 可能是 发药药房,耗材房,执行科室
|
||||
*/
|
||||
private String positionName;
|
||||
|
||||
/**
|
||||
* 中药付数
|
||||
*/
|
||||
private Integer chineseHerbsDoseQuantity;
|
||||
|
||||
/**
|
||||
* 代煎标识 | 0:否 , 1:是
|
||||
*/
|
||||
private Integer sufferingFlag;
|
||||
|
||||
/**
|
||||
* 中药标识 | 0:否 , 1:是
|
||||
*/
|
||||
private Integer tcmFlag;
|
||||
|
||||
/**
|
||||
* 排序号
|
||||
*/
|
||||
private Integer sortNumber;
|
||||
|
||||
/** 医嘱类型 */
|
||||
private Integer therapyEnum;
|
||||
private String therapyEnum_enumText;
|
||||
|
||||
/** 住院号 */
|
||||
private String BusNo;
|
||||
|
||||
/** 患者名称 */
|
||||
private String patientName;
|
||||
|
||||
/** 床位名称 */
|
||||
private String bedName;
|
||||
|
||||
/** 性别 */
|
||||
private Integer genderEnum;
|
||||
private String genderEnum_enumText;
|
||||
|
||||
/**
|
||||
* 生日
|
||||
*/
|
||||
private Date birthDate;
|
||||
|
||||
/**
|
||||
* 年龄
|
||||
*/
|
||||
private String age;
|
||||
|
||||
/** 费别 */
|
||||
private String contractName;
|
||||
|
||||
/** 诊断 */
|
||||
private String conditionNames;
|
||||
|
||||
/** 住院医生 */
|
||||
private String admittingDoctorName;
|
||||
|
||||
/** 余额 */
|
||||
private BigDecimal balanceAmount;
|
||||
|
||||
/** 汇总参数list */
|
||||
List<MedicineSummaryParam> medicineSummaryParamList;
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
/*
|
||||
* Copyright ©2023 CJB-CNIT Team. All rights reserved
|
||||
*/
|
||||
package com.openhis.web.inhospitalnursestation.dto;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
/**
|
||||
* 汇总单dto
|
||||
*
|
||||
* @author zwh
|
||||
* @date 2025-06-03
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class MedicineSummaryFormDto {
|
||||
|
||||
/** 汇总单号 */
|
||||
private String busNo;
|
||||
|
||||
/** 汇总人id */
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long applicantId;
|
||||
|
||||
/** 汇总人 */
|
||||
private String applicantName;
|
||||
|
||||
/** 领药人id */
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long receiverId;
|
||||
|
||||
/** 领药人 */
|
||||
private String receiverName;
|
||||
|
||||
/** 汇总时间 */
|
||||
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private Date applyTime;
|
||||
|
||||
/** 发放状态 */
|
||||
private Integer statusEnum;
|
||||
private String statusEnum_enumText;
|
||||
|
||||
/** 发放药房 */
|
||||
private String locationName;
|
||||
|
||||
/** 发放时间 */
|
||||
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private String dispenseTime;
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
/*
|
||||
* Copyright ©2023 CJB-CNIT Team. All rights reserved
|
||||
*/
|
||||
package com.openhis.web.inhospitalnursestation.dto;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
import com.openhis.common.annotation.Dict;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
/**
|
||||
* 汇总药品信息dto
|
||||
*
|
||||
* @author zwh
|
||||
* @date 2025-06-03
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class MedicineSummaryInfoDto {
|
||||
|
||||
/**
|
||||
* 项目名
|
||||
*/
|
||||
private String itemName;
|
||||
|
||||
/**
|
||||
* 请求数量
|
||||
*/
|
||||
private Integer itemQuantity;
|
||||
|
||||
/**
|
||||
* 请求单位
|
||||
*/
|
||||
@Dict(dictCode = "unit_code")
|
||||
private String minUnitCode;
|
||||
private String minUnitCode_dictText;
|
||||
|
||||
/**
|
||||
* 批号
|
||||
*/
|
||||
private String lotNumber;
|
||||
|
||||
/**
|
||||
* 规格
|
||||
*/
|
||||
private String totalVolume;
|
||||
|
||||
/** 拆零比 */
|
||||
private BigDecimal partPercent;
|
||||
|
||||
/**
|
||||
* 包装单位
|
||||
*/
|
||||
@Dict(dictCode = "unit_code")
|
||||
private String unitCode;
|
||||
private String unitCode_dictText;
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
/*
|
||||
* Copyright ©2023 CJB-CNIT Team. All rights reserved
|
||||
*/
|
||||
package com.openhis.web.inhospitalnursestation.dto;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
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-10-21
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class MedicineSummaryParam {
|
||||
|
||||
/**
|
||||
* 领药时间
|
||||
*/
|
||||
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private Date dispenseTime;
|
||||
|
||||
/**
|
||||
* 发放id
|
||||
*/
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long dispenseId;
|
||||
|
||||
/**
|
||||
* 执行id
|
||||
*/
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long procedureId;
|
||||
|
||||
/**
|
||||
* 发放状态
|
||||
*/
|
||||
private Integer dispenseStatus;
|
||||
|
||||
/**
|
||||
* 领药人id
|
||||
*/
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long receiverId;
|
||||
}
|
||||
@@ -0,0 +1,95 @@
|
||||
package com.openhis.web.inhospitalnursestation.dto;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import com.openhis.common.annotation.Dict;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 科室耗材dto
|
||||
*
|
||||
* @author wuyan
|
||||
* @date 2025-11-06
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class OrgDeviceDto {
|
||||
|
||||
/** 单据号 */
|
||||
private String busNo;
|
||||
|
||||
/** 供应请求id */
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long requestId;
|
||||
|
||||
/** 供应发放id */
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long dispenseId;
|
||||
|
||||
/** 项目名 */
|
||||
private String itemName;
|
||||
|
||||
/** 项目id */
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long itemId;
|
||||
|
||||
/** 规格 */
|
||||
private String totalVolume;
|
||||
|
||||
/** 批号 */
|
||||
private String lotNumber;
|
||||
|
||||
/** 请求数 */
|
||||
private BigDecimal quantity;
|
||||
|
||||
/** 拆零比 */
|
||||
private BigDecimal partPercent;
|
||||
|
||||
/** 单位 */
|
||||
@Dict(dictCode = "unit_code")
|
||||
private String unitCode;
|
||||
private String unitCode_dictText;
|
||||
|
||||
/** 单价 */
|
||||
private BigDecimal unitPrice;
|
||||
|
||||
/** 常规单位 */
|
||||
@Dict(dictCode = "unit_code")
|
||||
private String maxUnitCode;
|
||||
private String maxUnitCode_dictText;
|
||||
|
||||
/** 最小单位 */
|
||||
@Dict(dictCode = "unit_code")
|
||||
private String minUnitCode;
|
||||
private String minUnitCode_dictText;
|
||||
|
||||
/** 发放地点 */
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long sourceLocationId;
|
||||
private String sourceLocationName;
|
||||
|
||||
/** 申请科室 */
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long orgId;
|
||||
private String orgName;
|
||||
|
||||
/** 领药人 */
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long requesterId;
|
||||
private String requesterName;
|
||||
|
||||
/** 厂家 */
|
||||
private String manufacturer;
|
||||
|
||||
/** 申请时间 */
|
||||
private Date applyTime;
|
||||
|
||||
/** 状态 */
|
||||
private Integer statusEnum;
|
||||
private String statusEnum_enumText;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
package com.openhis.web.inhospitalnursestation.dto;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import com.openhis.common.annotation.Dict;
|
||||
import com.openhis.web.common.dto.UnitDto;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 科室耗材汇总dto
|
||||
*
|
||||
* @author wuyan
|
||||
* @date 2025-11-05
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class OrgDeviceSummaryFromDto {
|
||||
|
||||
/** 项目id */
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long itemId;
|
||||
|
||||
/** 器材名称 */
|
||||
private String name;
|
||||
|
||||
/** 规格 */
|
||||
private String totalVolume;
|
||||
|
||||
/** 厂家 */
|
||||
private String manufacturer;
|
||||
|
||||
/** 批号 */
|
||||
private String lotNumber;
|
||||
|
||||
/** 单价 */
|
||||
private BigDecimal unitPrice;
|
||||
|
||||
/** 发放数量 */
|
||||
private BigDecimal dispenseQuantity;
|
||||
|
||||
/** 库存数量 */
|
||||
private BigDecimal quantity;
|
||||
|
||||
/** 单位 */
|
||||
@Dict(dictCode = "unit_code")
|
||||
private String unitCode;
|
||||
private String unitCode_dictText;
|
||||
|
||||
/** 最小单位 */
|
||||
@Dict(dictCode = "unit_code")
|
||||
private String minUnitCode;
|
||||
private String minUnitCode_dictText;
|
||||
|
||||
/** 拆零比 */
|
||||
private BigDecimal partPercent;
|
||||
|
||||
/** 发放地点 */
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long sourceLocationId;
|
||||
|
||||
/** 库存id */
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long inventoryItemId;
|
||||
|
||||
/** 发放id列表 */
|
||||
private List<Long> dispenseIdList;
|
||||
|
||||
/** 单位列表 */
|
||||
private List<UnitDto> unitList;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
package com.openhis.web.inhospitalnursestation.dto;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import com.openhis.common.annotation.Dict;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 科室耗材参数
|
||||
*
|
||||
* @author wuayn
|
||||
* @date 2025-11-07
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class OrgDeviceSummaryParam {
|
||||
|
||||
/** 项目id */
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long itemId;
|
||||
|
||||
/** 库存id */
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long inventoryItemId;
|
||||
|
||||
/** 发放数量 */
|
||||
private BigDecimal dispenseQuantity;
|
||||
|
||||
/** 盈亏数量 */
|
||||
private BigDecimal stockTakeQuantity;
|
||||
|
||||
/** 批号 */
|
||||
private String lotNumber;
|
||||
|
||||
/** 发放地点 */
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long sourceLocationId;
|
||||
|
||||
/** 使用单位 */
|
||||
@Dict(dictCode = "unit_code")
|
||||
private String useUnitCode;
|
||||
private String useUnitCode_dictText;
|
||||
|
||||
/** 最小单位 */
|
||||
@Dict(dictCode = "unit_code")
|
||||
private String minUnitCode;
|
||||
private String minUnitCode_dictText;
|
||||
|
||||
/** 拆零比 */
|
||||
private BigDecimal partPercent;
|
||||
|
||||
/** 发放id列表 */
|
||||
private List<Long> dispenseIdList;
|
||||
|
||||
}
|
||||
@@ -1,62 +0,0 @@
|
||||
/*
|
||||
* Copyright ©2023 CJB-CNIT Team. All rights reserved
|
||||
*/
|
||||
package com.openhis.web.inhospitalnursestation.mapper;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Constants;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.openhis.web.inhospitalnursestation.dto.*;
|
||||
|
||||
@Repository
|
||||
public interface InpatientMedicineCollectionMapper {
|
||||
|
||||
/**
|
||||
* 就诊病人列表分页查询
|
||||
*
|
||||
* @param page 分页
|
||||
* @param queryWrapper 查询条件
|
||||
* @param amb 住院
|
||||
* @return 就诊病人列表
|
||||
*/
|
||||
Page<InpatientMedicineEncounterInfoDto> selectEncounterInfoListPage(
|
||||
@Param("page") Page<InpatientMedicineEncounterInfoDto> page,
|
||||
@Param(Constants.WRAPPER) QueryWrapper<InpatientMedicineSearchParam> queryWrapper, @Param("amb") Integer amb);
|
||||
|
||||
/**
|
||||
* 医嘱列表查询
|
||||
*
|
||||
* @param page 分页
|
||||
* @param queryWrapper 查询条件
|
||||
* @param encounterIdList 就诊id
|
||||
* @return 医嘱信息
|
||||
*/
|
||||
Page<InpatientMedicinePrescriptionInfoDto> selectPrescriptionInfoListPage(
|
||||
@Param("page") Page<InpatientMedicinePrescriptionInfoDto> page,
|
||||
@Param(Constants.WRAPPER) QueryWrapper<InpatientMedicineSearchParam> queryWrapper,
|
||||
@Param("encounterIdList") List<Long> encounterIdList,
|
||||
@Param("statusEnum") Integer statusEnum,
|
||||
@Param("medMedicationDefinition") String medMedicationDefinition,
|
||||
@Param("admDeviceDefinition") String admDeviceDefinition);
|
||||
|
||||
/**
|
||||
* 医嘱汇总列表查询
|
||||
*
|
||||
* @param page 分页
|
||||
* @param medDispenseIdList 药品发放id
|
||||
* @param medDispenseIdList 耗材发放id
|
||||
* @return 医嘱信息
|
||||
*/
|
||||
Page<InpatientMedicinePrescriptionInfoDto> selectPrescriptionSummaryInfoListPage(
|
||||
@Param("page") Page<InpatientMedicinePrescriptionInfoDto> page,
|
||||
@Param(Constants.WRAPPER) QueryWrapper<InpatientMedicineSearchParam> queryWrapper,
|
||||
@Param("dispenseIdList") List<Long> medDispenseIdList,
|
||||
@Param("dispenseIdList") List<Long> devDispenseIdList,
|
||||
@Param("medMedicationDefinition") String medMedicationDispense,
|
||||
@Param("admDeviceDefinition") String admDeviceDispense);
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
/*
|
||||
* Copyright ©2023 CJB-CNIT Team. All rights reserved
|
||||
*/
|
||||
package com.openhis.web.inhospitalnursestation.mapper;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Constants;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.openhis.web.inhospitalnursestation.dto.DispenseFormSearchParam;
|
||||
import com.openhis.web.inhospitalnursestation.dto.MedicineDispenseFormDto;
|
||||
import com.openhis.web.inhospitalnursestation.dto.MedicineSummaryFormDto;
|
||||
import com.openhis.web.inhospitalnursestation.dto.MedicineSummaryInfoDto;
|
||||
|
||||
@Repository
|
||||
public interface MedicineSummaryAppMapper {
|
||||
|
||||
/**
|
||||
* 查询领药列表
|
||||
*
|
||||
* @param page 分页信息
|
||||
* @param queryWrapper 查询条件
|
||||
* @param completed 医嘱状态:已完成
|
||||
* @param active 住院位置状态:使用中
|
||||
* @param bed 位置类型:病床
|
||||
* @param admittingDoctor 住院医生
|
||||
* @param personalCashAccount 个人现金账户
|
||||
* @param billable 收费状态:待结算
|
||||
* @param billed 收费状态:已结算
|
||||
* @param refunded 收费状态:已退费
|
||||
* @param summarized 发药状态:已汇总
|
||||
* @return 领药列表
|
||||
*/
|
||||
Page<MedicineDispenseFormDto> selectMedicineDispenseFormPage(@Param("page") Page<MedicineDispenseFormDto> page,
|
||||
@Param(Constants.WRAPPER) QueryWrapper<DispenseFormSearchParam> queryWrapper,
|
||||
@Param("completed") Integer completed, @Param("active") Integer active, @Param("bed") Integer bed,
|
||||
@Param("admittingDoctor") String admittingDoctor, @Param("personalCashAccount") String personalCashAccount,
|
||||
@Param("billable") Integer billable, @Param("billed") Integer billed, @Param("refunded") Integer refunded,
|
||||
@Param("summarized") Integer summarized);
|
||||
|
||||
/**
|
||||
* 查询汇总单分页列表
|
||||
*
|
||||
* @param page 分页信息
|
||||
* @param queryWrapper 查询条件
|
||||
* @param completed 发药状态:已完成
|
||||
* @param inProgress 发药状态:待发药
|
||||
* @param summaryDispense 单据类型:汇总发药
|
||||
* @return 汇总单列表
|
||||
*/
|
||||
Page<MedicineSummaryFormDto> selectMedicineSummaryFormPage(@Param("page") Page<MedicineSummaryFormDto> page,
|
||||
@Param(Constants.WRAPPER) QueryWrapper<DispenseFormSearchParam> queryWrapper,
|
||||
@Param("completed") Integer completed, @Param("inProgress") Integer inProgress,
|
||||
@Param("summaryDispense") Integer summaryDispense);
|
||||
|
||||
/**
|
||||
* 获取汇总单详情
|
||||
*
|
||||
* @param summaryNo 汇总单号
|
||||
* @return 汇总单详情
|
||||
*/
|
||||
List<MedicineSummaryInfoDto> selectMedicineSummaryFormDetail(@Param("summaryNo") String summaryNo);
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
package com.openhis.web.inhospitalnursestation.mapper;
|
||||
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
@Repository
|
||||
public interface NurseBillingAppMapper {
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
package com.openhis.web.inhospitalnursestation.mapper;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Constants;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.openhis.web.inhospitalnursestation.dto.OrgDeviceDto;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
@Repository
|
||||
public interface OrgDeviceStockTakeAppMapper {
|
||||
|
||||
/**
|
||||
* 科室耗材信息列表查询
|
||||
*
|
||||
* @param page 分页
|
||||
* @param queryWrapper 查询条件
|
||||
* @return 科室耗材信息
|
||||
*/
|
||||
Page<OrgDeviceDto> selectOrgDeviceInfo(@Param("page") Page<OrgDeviceDto> page,
|
||||
@Param(Constants.WRAPPER) QueryWrapper<OrgDeviceDto> queryWrapper);
|
||||
}
|
||||
Reference in New Issue
Block a user