package com.sinata.task;
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.sinata.common.utils.CollUtils;
|
import com.sinata.common.utils.DateUtils;
|
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.enums.MedicalWasteStatusEnum;
|
import com.sinata.system.enums.WarningConfigTypeEnum;
|
import com.sinata.system.enums.WarningStatusEnum;
|
import com.sinata.system.service.MwCollectRecordService;
|
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.springframework.scheduling.annotation.Scheduled;
|
import org.springframework.stereotype.Service;
|
|
import java.util.Date;
|
import java.util.List;
|
import java.util.Objects;
|
import java.util.stream.Collectors;
|
|
/**
|
* @author mitao
|
* @date 2024/12/30
|
*/
|
@Service
|
@Slf4j
|
@RequiredArgsConstructor
|
public class TaskService {
|
private final MwWarningConfigService mwWarningConfigService;
|
private final MwWarningConfigItemService mwWarningConfigItemService;
|
private final MwCollectRecordService mwCollectRecordService;
|
private final MwWarningRecordService mwWarningRecordService;
|
|
/**
|
* 出库超时预警
|
*/
|
@Scheduled(cron = "${medical.crons.checkout-over-time}")
|
public void checkoutOverTime() {
|
log.info("开始执行【出库超时预警】定时任务");
|
|
// 获取配置
|
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 timeDistance = DateUtils.timeDistanceHour(new Date(), item.getCollectTime());
|
MwWarningRecord warningRecord = new MwWarningRecord();
|
warningRecord.setType(WarningConfigTypeEnum.MEDICAL_WASTE.getCode());
|
warningRecord.setWarningTargetId(item.getId());
|
warningRecord.setWarningTargetName(item.getMedicalWasteNumber());
|
warningRecord.setDepartmentName(item.getHospitalName());
|
warningRecord.setMessage(String.format("%s医废超过%d小时未出库", item.getWasteTypeStr(), configItem.getValue()));
|
warningRecord.setDepartmentId(item.getDepartmentId());
|
warningRecord.setCurrentValue(String.valueOf(timeDistance));
|
warningRecord.setNormalRange(configItem.getValue().toString());
|
warningRecord.setStatus(WarningStatusEnum.UNRESOLVED.getCode());
|
warningRecord.setWarnTime(new Date());
|
return warningRecord;
|
}).collect(Collectors.toList());
|
|
// 批量保存预警记录
|
if (!warningRecordList.isEmpty()) {
|
mwWarningRecordService.saveBatch(warningRecordList);
|
}
|
}
|
|
log.info("定时任务【出库超时预警】执行完毕");
|
}
|
}
|