package com.sinata.system.service.biz;
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.sinata.common.utils.CollUtils;
|
import com.sinata.common.utils.DateUtils;
|
import com.sinata.common.utils.StringUtils;
|
import com.sinata.system.domain.MwCollectRecord;
|
import com.sinata.system.domain.MwWarningConfig;
|
import com.sinata.system.domain.MwWarningConfigItem;
|
import com.sinata.system.domain.MwWarningRecord;
|
import com.sinata.system.domain.vo.MwCollectRecordWarningVO;
|
import com.sinata.system.domain.vo.MwContractVO;
|
import com.sinata.system.domain.vo.MwDisposalRecordWarningVO;
|
import com.sinata.system.domain.vo.MwProtectionEquipmentRecordVO;
|
import com.sinata.system.domain.vo.MwProtectionEquipmentVO;
|
import com.sinata.system.domain.vo.MwStaffVO;
|
import com.sinata.system.domain.vo.MwStagingRoomVO;
|
import com.sinata.system.domain.vo.MwTransitCarWarningVO;
|
import com.sinata.system.enums.MedicalWasteStatusEnum;
|
import com.sinata.system.enums.WarningConfigTypeEnum;
|
import com.sinata.system.enums.WarningStatusEnum;
|
import com.sinata.system.enums.WarningTypeEnum;
|
import com.sinata.system.service.MwCheckoutRecordService;
|
import com.sinata.system.service.MwCollectRecordService;
|
import com.sinata.system.service.MwContractService;
|
import com.sinata.system.service.MwDisposalRecordService;
|
import com.sinata.system.service.MwProtectionEquipmentRecordService;
|
import com.sinata.system.service.MwProtectionEquipmentService;
|
import com.sinata.system.service.MwStaffService;
|
import com.sinata.system.service.MwStagingRoomService;
|
import com.sinata.system.service.MwWarningConfigItemService;
|
import com.sinata.system.service.MwWarningConfigService;
|
import com.sinata.system.service.MwWarningRecordService;
|
import lombok.RequiredArgsConstructor;
|
import lombok.extern.slf4j.Slf4j;
|
import org.jetbrains.annotations.NotNull;
|
import org.springframework.stereotype.Service;
|
|
import java.math.BigDecimal;
|
import java.util.ArrayList;
|
import java.util.Date;
|
import java.util.List;
|
import java.util.Objects;
|
import java.util.stream.Collectors;
|
|
/**
|
* @author mitao
|
* @date 2024/12/31
|
*/
|
@Slf4j
|
@Service
|
@RequiredArgsConstructor
|
public class TaskService {
|
private final MwWarningConfigService mwWarningConfigService;
|
private final MwWarningConfigItemService mwWarningConfigItemService;
|
private final MwCollectRecordService mwCollectRecordService;
|
private final MwWarningRecordService mwWarningRecordService;
|
private final MwStagingRoomService mwStagingRoomService;
|
private final MwContractService mwContractService;
|
private final MwStaffService mwStaffService;
|
private final MwProtectionEquipmentService mwProtectionEquipmentService;
|
private final MwProtectionEquipmentRecordService mwProtectionEquipmentRecordService;
|
private final MwCheckoutRecordService mwCheckoutRecordService;
|
private final MwDisposalRecordService mwDisposalRecordService;
|
|
/**
|
* 出库超时预警
|
*/
|
public void checkoutOverTime() {
|
// 获取配置
|
MwWarningConfig config = mwWarningConfigService.getOne(
|
Wrappers.lambdaQuery(MwWarningConfig.class)
|
.eq(MwWarningConfig::getType, WarningConfigTypeEnum.MEDICAL_WASTE.getCode())
|
.last("LIMIT 1")
|
);
|
|
if (Objects.isNull(config)) {
|
log.info("【出库超时预警】:未找到【医疗废弃物】的预警配置,跳过定时任务执行");
|
return;
|
}
|
// 获取配置项
|
List<MwWarningConfigItem> configItems = mwWarningConfigItemService.lambdaQuery()
|
.eq(MwWarningConfigItem::getConfigId, config.getId())
|
.list();
|
|
if (CollUtils.isEmpty(configItems)) {
|
log.info("【出库超时预警】:未找到相关配置项,跳过定时任务执行");
|
return;
|
}
|
|
// 查询暂存间医废记录
|
List<MwCollectRecord> collectRecordList = mwCollectRecordService.lambdaQuery()
|
.eq(MwCollectRecord::getStatus, MedicalWasteStatusEnum.TEMPORARILY_STORED.getCode())
|
.list();
|
|
if (CollUtils.isEmpty(collectRecordList)) {
|
log.info("【出库超时预警】:没有暂存的医废记录,跳过定时任务执行");
|
return;
|
}
|
|
// 遍历配置项并处理预警
|
for (MwWarningConfigItem configItem : configItems) {
|
// 过滤出需要预警的记录
|
List<MwCollectRecord> recordList = collectRecordList.stream()
|
.filter(item -> item.getWasteType().equals(configItem.getWasteType()) &&
|
DateUtils.timeDistanceHour(new Date(), item.getCollectTime()) > configItem.getValue())
|
.collect(Collectors.toList());
|
|
if (CollUtils.isEmpty(recordList)) {
|
continue; // 如果没有需要预警的记录,则跳过
|
}
|
|
// 创建预警记录并保存
|
List<MwWarningRecord> warningRecordList = recordList.stream().map(item -> {
|
Long id = item.getId();
|
String medicalWasteNumber = item.getMedicalWasteNumber();
|
String hospitalName = item.getHospitalName();
|
String msg = String.format("%s医废超过%d小时未出库", item.getWasteTypeStr(), configItem.getValue());
|
String currentValue = String.valueOf(DateUtils.timeDistanceHour(new Date(), item.getCollectTime()));
|
Long departmentId = item.getDepartmentId();
|
String configValue = configItem.getValue().toString();
|
return getMwWarningRecord(WarningTypeEnum.CHECKOUT_TIMEOUT_WARNING.getCode(), id, medicalWasteNumber, hospitalName, msg, departmentId, currentValue, configValue);
|
}).collect(Collectors.toList());
|
|
// 批量保存预警记录
|
if (!warningRecordList.isEmpty()) {
|
mwWarningRecordService.saveBatch(warningRecordList);
|
}
|
}
|
}
|
|
/**
|
* 封装预警记录
|
*
|
* @param id
|
* @param warningTargetName
|
* @param departmentName
|
* @param message
|
* @param departmentId
|
* @param currentValue
|
* @param normalRange
|
* @return
|
*/
|
@NotNull
|
private static MwWarningRecord getMwWarningRecord(Integer type, Long id, String warningTargetName, String departmentName, String message, Long departmentId, String currentValue, String normalRange) {
|
MwWarningRecord warningRecord = new MwWarningRecord();
|
warningRecord.setType(type);
|
warningRecord.setWarningTargetId(id);
|
warningRecord.setWarningTargetName(warningTargetName);
|
warningRecord.setDepartmentName(departmentName);
|
warningRecord.setMessage(message);
|
warningRecord.setDepartmentId(departmentId);
|
warningRecord.setCurrentValue(currentValue);
|
warningRecord.setNormalRange(normalRange);
|
warningRecord.setStatus(WarningStatusEnum.UNRESOLVED.getCode());
|
warningRecord.setWarnTime(new Date());
|
return warningRecord;
|
}
|
|
/**
|
* 暂存间使用率预警
|
*/
|
public void stagingRoomStorage() {
|
//查询预警配置
|
MwWarningConfig config = mwWarningConfigService.getOne(
|
Wrappers.lambdaQuery(MwWarningConfig.class)
|
.eq(MwWarningConfig::getType, WarningConfigTypeEnum.STAGING_ROOM_CAPACITY.getCode())
|
.last("LIMIT 1")
|
);
|
if (Objects.isNull(config)) {
|
log.info("【暂存间使用率预警】:未找到【暂存间使用率预警】的预警配置,跳过定时任务执行");
|
return;
|
}
|
// 获取配置项
|
List<MwWarningConfigItem> configItems = mwWarningConfigItemService.lambdaQuery()
|
.eq(MwWarningConfigItem::getConfigId, config.getId()).orderByDesc(MwWarningConfigItem::getValue)
|
.list();
|
if (CollUtils.isEmpty(configItems)) {
|
log.info("【暂存间使用率预警】:未找到相关配置项,跳过定时任务执行");
|
return;
|
}
|
List<MwStagingRoomVO> stagingRoomList = mwStagingRoomService.queryStagingRoomList();
|
if (CollUtils.isEmpty(stagingRoomList)) {
|
log.info("【暂存间使用率预警】:暂存间列表为空,跳过定时任务执行");
|
return;
|
}
|
List<MwWarningRecord> warningRecordList = new ArrayList<>();
|
for (MwWarningConfigItem configItem : configItems) {
|
Integer configValue = configItem.getValue();
|
warningRecordList.addAll(stagingRoomList.stream().filter(room -> room.getUseRate().compareTo(BigDecimal.valueOf(configValue)) >= 0).map(room -> {
|
Long id = room.getId();
|
String roomName = room.getRoomName();
|
String hospitalName = room.getHospitalName();
|
String promptContent = configItem.getPromptContent();
|
String msg = String.format("%s%s%s", room.getRoomName(), promptContent, configValue + "%");
|
Long departmentId = room.getDepartmentId();
|
String useRate = room.getUseRate().toString();
|
return getMwWarningRecord(WarningTypeEnum.STAGING_ROOM_USE_RATE_WARNING.getCode(), id, roomName, hospitalName, msg, departmentId, useRate, configValue.toString());
|
}).collect(Collectors.toList()));
|
}
|
//保存预警记录
|
mwWarningRecordService.saveBatch(warningRecordList);
|
}
|
|
/**
|
* 合同到期预警
|
*/
|
public void contractExpire() {
|
//查询合同预警配置
|
MwWarningConfig config = mwWarningConfigService.getOne(
|
Wrappers.lambdaQuery(MwWarningConfig.class)
|
.eq(MwWarningConfig::getType, WarningConfigTypeEnum.CONTRACT_EXPIRE.getCode())
|
.last("LIMIT 1")
|
);
|
if (Objects.isNull(config)) {
|
log.info("【合同到期预警】:未找到【合同到期预警】的预警配置,跳过定时任务执行");
|
return;
|
}
|
int advanceDays = Integer.parseInt(config.getValue());
|
List<MwContractVO> list = mwContractService.queryListTerminationDateBeforeNow(new Date());
|
List<MwWarningRecord> warningRecordList = list.stream().filter(contract -> {
|
long distanceDay = DateUtils.timeDistanceDay(contract.getTerminationDate(), new Date());
|
return distanceDay <= advanceDays;
|
}).map(contract -> {
|
String msg = String.format("合同【%s】即将到期", contract.getContractName());
|
return getMwWarningRecord(WarningTypeEnum.CONTRACT_EXPIRY_WARNING.getCode(), contract.getId(), contract.getContractName(),
|
contract.getDepartmentName(), msg, contract.getDepartmentId(),
|
String.valueOf(DateUtils.timeDistanceDay(contract.getTerminationDate(), new Date())), config.getValue());
|
}).collect(Collectors.toList());
|
//保存预警记录
|
mwWarningRecordService.saveBatch(warningRecordList);
|
}
|
|
/**
|
* 健康记录预警、人员记录预警
|
*/
|
public void healthRecord() {
|
//查询人员预警配置
|
MwWarningConfig config = mwWarningConfigService.getOne(
|
Wrappers.lambdaQuery(MwWarningConfig.class)
|
.eq(MwWarningConfig::getType, WarningConfigTypeEnum.STAFF.getCode())
|
.last("LIMIT 1"));
|
if (Objects.isNull(config)) {
|
log.info("【健康记录预警】【人员记录预警】:未找到人员预警配置,跳过定时任务执行");
|
return;
|
}
|
List<MwStaffVO> list = mwStaffService.queryList();
|
List<MwWarningRecord> warningRecordList = new ArrayList<>();
|
if (config.getHealthFlag().equals(1)) {
|
warningRecordList.addAll(list.stream().filter(staff -> StringUtils.isBlank(staff.getHealthCertificate())).map(staff -> {
|
String msg = String.format("职工【%s】健康记录未上传", staff.getStaffName());
|
return getMwWarningRecord(WarningTypeEnum.HEALTH_RECORD_WARNING.getCode(), staff.getId(), staff.getStaffName(), staff.getDepartmentName(), msg, staff.getDepartmentId(), "否", "是");
|
}).collect(Collectors.toList()));
|
}
|
if (config.getVaccineFlag().equals(1)) {
|
warningRecordList.addAll(list.stream().filter(staff -> StringUtils.isBlank(staff.getVaccineCertificate())).map(staff -> {
|
String msg = String.format("职工【%s】疫苗记录未上传", staff.getStaffName());
|
return getMwWarningRecord(WarningTypeEnum.VACCINE_RECORD_WARNING.getCode(), staff.getId(), staff.getStaffName(), staff.getDepartmentName(), msg, staff.getDepartmentId(), "否", "是");
|
}).collect(Collectors.toList()));
|
}
|
//保存记录
|
mwWarningRecordService.saveBatch(warningRecordList);
|
}
|
|
/**
|
* 防护用品使用预警 防护用品库存预警
|
*/
|
public void protectionEquipmentUse() {
|
//查询职业防护预警配置
|
MwWarningConfig config = mwWarningConfigService.getOne(
|
Wrappers.lambdaQuery(MwWarningConfig.class)
|
.eq(MwWarningConfig::getType, WarningConfigTypeEnum.PROTECTION_PERSONNEL.getCode())
|
.last("LIMIT 1"));
|
if (Objects.isNull(config)) {
|
log.info("【防护用品使用预警】【防护用品库存预警】:未找到职业防护预警配置,跳过定时任务执行");
|
return;
|
}
|
List<MwWarningRecord> warningRecordList = new ArrayList<>();
|
//查询防护设备列表
|
List<MwProtectionEquipmentVO> protectionEquipmentVOList = mwProtectionEquipmentService.queryList();
|
//防护器具使用预警
|
if (config.getProtectionFlag().equals(1)) {
|
warningRecordList.addAll(protectionEquipmentVOList.stream().map(item -> {
|
List<MwProtectionEquipmentRecordVO> recordVOList = mwProtectionEquipmentRecordService.findByEquipmentIdAndUsageTimeAfter(item.getId());
|
if (CollUtils.isEmpty(recordVOList)) {
|
String msg = String.format("【%s】30天没有产生使用记录", item.getEquipmentName());
|
return getMwWarningRecord(WarningTypeEnum.PROTECTION_EQUIPMENT_USE_WARNING.getCode(), item.getId(),
|
item.getEquipmentName(), item.getDepartmentName(), msg, item.getDepartmentId(), "一个月内无使用记录", "一个月内有使用记录");
|
}
|
return null;
|
}).filter(Objects::nonNull).collect(Collectors.toList()));
|
}
|
//防护器具库存预警
|
warningRecordList.addAll(protectionEquipmentVOList.stream().filter(item -> item.getStock() <= Integer.parseInt(config.getValue())).map(item -> {
|
String msg = String.format("%s库存量低于%s", item.getEquipmentName(), config.getValue());
|
return getMwWarningRecord(WarningTypeEnum.PROTECTION_EQUIPMENT_STOCK_WARNING.getCode(), item.getId(),
|
item.getEquipmentName(), item.getDepartmentName(), msg, item.getDepartmentId(), String.valueOf(item.getStock()), config.getValue());
|
}).collect(Collectors.toList()));
|
//保存记录
|
mwWarningRecordService.saveBatch(warningRecordList);
|
}
|
|
/**
|
* 医疗机构产废日预警
|
*/
|
public void medicalInstitutionWasteDay() {
|
//查询医废收集记录
|
List<MwCollectRecordWarningVO> collectRecordVOList = mwCollectRecordService.queryListByDay();
|
if (CollUtils.isNotEmpty(collectRecordVOList)) {
|
List<MwWarningRecord> warningRecordList = collectRecordVOList.stream().filter(item -> item.getTotalWeight().compareTo(item.getDailyMaxWasteQuantity()) > 0).map(item -> {
|
String msg = String.format("日产废量超过%f", item.getDailyMaxWasteQuantity());
|
return getMwWarningRecord(WarningTypeEnum.MEDICAL_INSTITUTION_WASTE_DAY_WARNING.getCode(), item.getDepartmentId(),
|
item.getHospitalName(), item.getHospitalName(), msg, item.getDepartmentId(), item.getTotalWeight().toString(), item.getDailyMinWasteQuantity() + "-" + item.getDailyMaxWasteQuantity());
|
}).collect(Collectors.toList());
|
//保存预警记录
|
mwWarningRecordService.saveBatch(warningRecordList);
|
}
|
}
|
|
/**
|
* 医疗机构产废月预警
|
*/
|
public void medicalInstitutionWasteMonth() {
|
List<MwCollectRecordWarningVO> collectRecordVOList = mwCollectRecordService.queryListByMonth();
|
if (CollUtils.isNotEmpty(collectRecordVOList)) {
|
List<MwWarningRecord> warningRecordList = collectRecordVOList.stream().filter(item -> item.getTotalWeight().compareTo(item.getDailyMaxWasteQuantity()) > 0).map(item -> {
|
String msg = String.format("日产废量超过%f", item.getDailyMaxWasteQuantity());
|
return getMwWarningRecord(WarningTypeEnum.MEDICAL_INSTITUTION_WASTE_MONTH_WARNING.getCode(), item.getDepartmentId(),
|
item.getHospitalName(), item.getHospitalName(), msg, item.getDepartmentId(), item.getTotalWeight().toString(), item.getMonthlyMinWasteQuantity() + "-" + item.getMonthlyMaxWasteQuantity());
|
}).collect(Collectors.toList());
|
//保存预警记录
|
mwWarningRecordService.saveBatch(warningRecordList);
|
}
|
}
|
|
/**
|
* 医疗机构存储量预警
|
*/
|
public void medicalInstitutionStorage() {
|
List<MwCollectRecordWarningVO> collectRecordVOList = mwCollectRecordService.queryListGroupByDepartment();
|
if (CollUtils.isNotEmpty(collectRecordVOList)) {
|
List<MwWarningRecord> warningRecordList = collectRecordVOList.stream().map(item -> {
|
if (item.getTotalWeight().compareTo(item.getMaximumStorageCapacity()) > 0) {
|
String msg = "医疗废物存储量超过最大值";
|
return getMwWarningRecord(WarningTypeEnum.MEDICAL_INSTITUTION_STORAGE_WARNING.getCode(), item.getDepartmentId(),
|
item.getHospitalName(), item.getHospitalName(), msg, item.getDepartmentId(), item.getTotalWeight().toString(), item.getMaximumStorageCapacity().toString());
|
}
|
return null;
|
}).filter(Objects::nonNull).collect(Collectors.toList());
|
//保存预警记录
|
mwWarningRecordService.saveBatch(warningRecordList);
|
}
|
}
|
|
/**
|
* 车辆转运异常预警
|
*/
|
public void transitCar() {
|
List<MwTransitCarWarningVO> transitCarWarningVOList = mwCheckoutRecordService.queryWarningList();
|
if (CollUtils.isNotEmpty(transitCarWarningVOList)) {
|
List<MwWarningRecord> warningRecordList = transitCarWarningVOList.stream()
|
.filter(item -> item.getCurrentLoad().compareTo(item.getMaximumLoad()) > 0).map(item -> {
|
String msg = String.format("%s转运的医废超过最大载重", item.getLicensePlateNumber());
|
return getMwWarningRecord(WarningTypeEnum.TRANSIT_CAR_WARNING.getCode(), item.getId(), item.getLicensePlateNumber(),
|
item.getDepartmentName(), msg, item.getDepartmentId(), item.getCurrentLoad().toString(), item.getMaximumLoad().toString());
|
}).collect(Collectors.toList());
|
//保存预警记录
|
mwWarningRecordService.saveBatch(warningRecordList);
|
}
|
}
|
|
/**
|
* 处置单位存储量预警
|
*/
|
public void disposalUnitStorage() {
|
List<MwDisposalRecordWarningVO> disposalRecordWarningVOList = mwDisposalRecordService.queryDisposalListByDepartment();
|
if (CollUtils.isNotEmpty(disposalRecordWarningVOList)) {
|
List<MwWarningRecord> warningRecordList = disposalRecordWarningVOList.stream().filter(item -> item.getCurrentStorage().compareTo(item.getMaximumStorageCapacity()) > 0).map(item -> {
|
String msg = "医疗废物存储量超过最大值";
|
return getMwWarningRecord(WarningTypeEnum.DISPOSAL_UNIT_STORAGE_WARNING.getCode(), item.getDepartmentId(), item.getDisposalUnitName(),
|
item.getDisposalUnitName(), msg, item.getDepartmentId(), item.getCurrentStorage().toString(), item.getMaximumStorageCapacity().toString());
|
}).collect(Collectors.toList());
|
//保存预警记录
|
mwWarningRecordService.saveBatch(warningRecordList);
|
}
|
}
|
}
|