package cn.besteam.modules.medical.service.impl; import cn.besteam.common.constant.MedicalWasteEnum; import cn.besteam.modules.medical.entity.MwCollectRecord; import cn.besteam.modules.medical.entity.MwWarningConfig; import cn.besteam.modules.medical.entity.MwWarningConfigItem; import cn.besteam.modules.medical.entity.MwWarningRecord; import cn.besteam.modules.medical.mapper.MwWarningRecordMapper; import cn.besteam.modules.medical.service.IMwCollectionPointService; import cn.besteam.modules.medical.service.IMwWarningConfigItemService; import cn.besteam.modules.medical.service.IMwWarningConfigService; import cn.besteam.modules.medical.service.IMwWarningRecordService; import cn.besteam.modules.medical.vo.NonCollectMedicalWasteVO; import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.DateUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import java.math.BigDecimal; import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; /** * @Description: 预警信息 * @author: besteam * @date: 2020-07-17 * @version: V1.0 */ @Slf4j @Service public class MwWarningRecordServiceImpl extends ServiceImpl implements IMwWarningRecordService { @Autowired private IMwWarningConfigService mwWarningConfigService; @Autowired private IMwWarningConfigItemService mwWarningConfigItemService; @Async @Override public void handleStoreWarning(MwCollectRecord collectRecord) { log.info("异步处理入库预警,当前线程:{}", Thread.currentThread().getName()); if (Objects.isNull(collectRecord)) { return; } List warningRecords = lambdaQuery().eq(MwWarningRecord::getWarningTargetId, collectRecord.getId()) .in(MwWarningRecord::getType, MedicalWasteEnum.WarningConfigTypeEnum.STORE_OVER_TIME.getType(), MedicalWasteEnum.WarningConfigTypeEnum.MISSING.getType()) .eq(MwWarningRecord::getStatus, MedicalWasteEnum.WarningRecordStatusEnum.WAIT_AUDIT.getStatus()).list(); if (CollUtil.isNotEmpty(warningRecords)) { warningRecords.forEach(item->{ item.setStatus(MedicalWasteEnum.WarningRecordStatusEnum.PASS.getStatus()); item.setRelieveTime(new Date()); }); updateBatchById(warningRecords); } //未出预警 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(MwWarningRecord::getOfficeId, collectRecord.getDepartmentId()) .eq(MwWarningRecord::getType, MedicalWasteEnum.WarningConfigTypeEnum.NON_COLLECT.getType()) .eq(MwWarningRecord::getStatus, MedicalWasteEnum.WarningRecordStatusEnum.WAIT_AUDIT.getStatus()); List nonCollect = list(queryWrapper); if (CollUtil.isNotEmpty(nonCollect)) { MwWarningConfig warningConfig = mwWarningConfigService.getOne(new QueryWrapper().lambda().eq(MwWarningConfig::getType, MedicalWasteEnum.WarningConfigTypeEnum.NON_COLLECT.getType())); if (warningConfig == null) { log.error("解除预警(未出)定时器执行错误:无对应配置"); return; } Date today = new Date(); BigDecimal defaultValue = warningConfig.getDefaultValue(); //所有通过的未出医废配置,固定时长和临时变更 List customConfigList = mwWarningConfigItemService.list(new QueryWrapper().lambda() .eq(MwWarningConfigItem::getType, MedicalWasteEnum.WarningConfigTypeEnum.NON_COLLECT.getType()) .eq(MwWarningConfigItem::getStatus, 1) .in(MwWarningConfigItem::getApplyType, "1,3")); boolean isRelieve = !isTimeTrue(collectRecord.getDepartmentId(), customConfigList, today, defaultValue); if (isRelieve){ nonCollect.forEach(item->{ item.setStatus(MedicalWasteEnum.WarningRecordStatusEnum.PASS.getStatus()); item.setRelieveTime(new Date()); }); updateBatchById(nonCollect); } } } /** * 未出医废时间判断条件 * @param officeId * @param customConfigList * @param today * @param defaultValue * @return */ public Boolean isTimeTrue(Integer officeId, List customConfigList, Date today, BigDecimal defaultValue ){ Date now = new Date(); Boolean isTimeTrue = true; Boolean isAddDataAfter = false; for (MwWarningConfigItem mwWarningConfigItem : customConfigList) { if (mwWarningConfigItem.getCustomOfficeId().equals(officeId)) { //todo 判断是否有临时规则 if (mwWarningConfigItem.getApplyType() != null && mwWarningConfigItem.getApplyType() == 3) { if (today.before(mwWarningConfigItem.getExpirationTime())) { isTimeTrue = false; } } //todo 判断是否有固定规则 if (isTimeTrue && mwWarningConfigItem.getApplyType() != null && mwWarningConfigItem.getApplyType() == 1) { defaultValue = mwWarningConfigItem.getCustomValue(); } } } if (defaultValue.compareTo(BigDecimal.ZERO) > 0) { //todo 判断是否满足默认规则 Date thresholdTimeTemp = DateUtils.addDays(today, -defaultValue.intValue()); if (isTimeTrue && now.before(thresholdTimeTemp)) { isAddDataAfter = true; } } return isAddDataAfter; } @Async @Override public void handleCheckoutStoreWarning(List mwCollectRecordList) { log.info("异步处理出库预警,当前线程:{}", Thread.currentThread().getName()); if (CollUtil.isEmpty(mwCollectRecordList)) { return; } Set collectIds = mwCollectRecordList.stream().map(MwCollectRecord::getId).collect(Collectors.toSet()); List warningRecords = lambdaQuery().in(MwWarningRecord::getWarningTargetId, collectIds) .in(MwWarningRecord::getType, MedicalWasteEnum.WarningConfigTypeEnum.CHECKOUT_OVER_TIME.getType(), MedicalWasteEnum.WarningConfigTypeEnum.MISSING_AFTER.getType()) .eq(MwWarningRecord::getStatus, MedicalWasteEnum.WarningRecordStatusEnum.WAIT_AUDIT.getStatus()).list(); if (CollUtil.isNotEmpty(warningRecords)) { warningRecords.forEach(item->{ item.setStatus(MedicalWasteEnum.WarningRecordStatusEnum.PASS.getStatus()); item.setRelieveTime(new Date()); }); updateBatchById(warningRecords); } } @Async @Override public void handleDeleteCollectRecordWarning(MwCollectRecord collectRecord) { log.info("异步处理删除医废预警,当前线程:{}", Thread.currentThread().getName()); if (Objects.isNull(collectRecord)) { return; } List warningRecords = lambdaQuery().eq(MwWarningRecord::getWarningTargetId, collectRecord.getId()) .eq(MwWarningRecord::getStatus, MedicalWasteEnum.WarningRecordStatusEnum.WAIT_AUDIT.getStatus()).list(); if (CollUtil.isNotEmpty(warningRecords)) { warningRecords.forEach(item->{ item.setStatus(MedicalWasteEnum.WarningRecordStatusEnum.PASS.getStatus()); item.setRelieveTime(new Date()); }); updateBatchById(warningRecords); } } }