package cn.besteam.modules.medical.service.impl; import cn.besteam.common.constant.CommonConstant; import cn.besteam.common.constant.ErrorCode; import cn.besteam.common.constant.MedicalWasteEnum; import cn.besteam.common.exception.BusinessException; import cn.besteam.modules.medical.dto.ApiMedicalCheckoutBatchDTO; import cn.besteam.modules.medical.dto.ApiMedicalCheckoutDTO; import cn.besteam.modules.medical.dto.MwCheckoutRecordBatchDTO; import cn.besteam.modules.medical.entity.*; import cn.besteam.modules.medical.mapper.MwCheckoutRecordMapper; import cn.besteam.modules.medical.service.*; import cn.besteam.modules.medical.vo.ApiMedicalCheckoutDetailsVO; import cn.besteam.modules.medical.vo.ApiMedicalStatisticsVO; import cn.besteam.modules.shiro.authc.util.EnvUtils; import cn.besteam.modules.system.entity.SysDepartment; import cn.besteam.modules.system.service.ISysDepartmentService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.google.common.collect.Lists; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; /** * @Description: 出库记录 * @author: besteam * @date: 2020-04-25 * @version: V1.0 */ @Service public class MwCheckoutRecordServiceImpl extends ServiceImpl implements IMwCheckoutRecordService { @Autowired private IMwCollectRecordService mwCollectRecordService; @Autowired private IMwCheckoutRecordItemService mwCheckoutRecordItemService; @Autowired private IMwTransitConfigService mwTransitConfigService; @Autowired private ISysDepartmentService sysDepartmentService; @Autowired private IMwWarningConfigService mwWarningConfigService; @Autowired private IMwWarningRecordService mwWarningRecordService; /** * 出库 * * @param dto * @return */ @Override @Transactional(rollbackFor = Exception.class) public ApiMedicalCheckoutDetailsVO checkoutBatch(ApiMedicalCheckoutBatchDTO dto) { MwTransitConfig mwTransitConfig = mwTransitConfigService.getById(dto.getTransitConfigId()); if (mwTransitConfig == null) { throw new BusinessException(ErrorCode.ERR_500, "出库配置不存在"); } SysDepartment hospital = sysDepartmentService.getById(mwTransitConfig.getHospitalId()); if (hospital == null) { throw new BusinessException(ErrorCode.ERR_500, "医院不存在"); } List idList = dto.getIdList(); if (CollectionUtils.isEmpty(idList)) { throw new BusinessException(ErrorCode.ERR_500, "请选择需要出库的医废列表"); } //批量更新收集状态为已出库 Date checkoutTime = new Date(); List mwCollectRecordList = new ArrayList<>(); List mwCheckoutRecordItemList = new ArrayList<>(); for (Integer collectRecordId : idList) { MwCollectRecord mwCollectRecord = mwCollectRecordService.getById(collectRecordId); if (mwCollectRecord == null) { throw new BusinessException(ErrorCode.ERR_500, "医废不存在,请重新选择"); } if (!mwCollectRecord.getStatus().equals(MedicalWasteEnum.MedicalWasteStatusEnum.STORE.getStatus())) { throw new BusinessException(ErrorCode.ERR_500, "医废不处于待出库状态,请重新选择"); } if (mwCollectRecord.getDelFlag().equals(CommonConstant.DEL_FLAG_1)) { throw new BusinessException(ErrorCode.ERR_500, "医废已删除,请重新选择"); } if (!mwCollectRecord.getAuditStatus().equals(MedicalWasteEnum.MedicalWasteAuditStatusEnum.PASS.getStatus())) { throw new BusinessException(ErrorCode.ERR_500, "医废已删除,请重新选择"); } if (!mwCollectRecord.getHospitalId().equals(mwTransitConfig.getHospitalId())) { throw new BusinessException(ErrorCode.ERR_500, "医废所在医院与出库配置不对应,请重新选择"); } mwCollectRecord.setCheckoutUserId(EnvUtils.getUser().getId()); mwCollectRecord.setCheckoutUser(EnvUtils.getUser().getName()); mwCollectRecord.setCheckoutTime(checkoutTime); mwCollectRecord.setStatus(MedicalWasteEnum.MedicalWasteStatusEnum.CHECKOUT.getStatus()); mwCollectRecordList.add(mwCollectRecord); // mwCheckoutRecordItemList.add(new MwCheckoutRecordItem().setCollectRecordId(collectRecordId)); } mwCollectRecordService.updateBatchById(mwCollectRecordList); //新增出库运输信息记录 MwCheckoutRecord mwCheckoutRecord = new MwCheckoutRecord(); mwCheckoutRecord.setEngineDriver(mwTransitConfig.getEngineDriver()); mwCheckoutRecord.setLicensePlate(mwTransitConfig.getLicensePlate()); mwCheckoutRecord.setTransitCompany(mwTransitConfig.getTransitCompany()); mwCheckoutRecord.setTransitConfigId(mwTransitConfig.getId()); mwCheckoutRecord.setHospitalName(hospital.getDepartName()); mwCheckoutRecord.setHospitalId(hospital.getId()); mwCheckoutRecord.setCreateTime(checkoutTime); mwCheckoutRecord.setWeight(dto.getWeightTotal()); mwCheckoutRecord.setCode(dto.getCode()); save(mwCheckoutRecord); //批量新增出库记录-医废项 for (MwCheckoutRecordItem mwCheckoutRecordItem : mwCheckoutRecordItemList) { mwCheckoutRecordItem.setCheckoutRecordId(mwCheckoutRecord.getId()); } mwCheckoutRecordItemService.saveBatch(mwCheckoutRecordItemList); // //打印出库详情 ApiMedicalCheckoutDetailsVO checkoutDetails = new ApiMedicalCheckoutDetailsVO(); //运输人员 BeanUtils.copyProperties(mwCheckoutRecord, checkoutDetails); Set wasteTypeStrSet = mwCollectRecordList.stream().map(MwCollectRecord::getWasteTypeStr).collect(Collectors.toSet()); List statisticsList = new ArrayList<>(); //获取此次出库操作医废收集类型统计 for (String wasteTypeStr : wasteTypeStrSet) { ApiMedicalStatisticsVO statisticsVO = new ApiMedicalStatisticsVO(); statisticsVO.setWasteTypeStr(wasteTypeStr); statisticsVO.setWeightSum(BigDecimal.ZERO); statisticsVO.setCount(0); for (MwCollectRecord mwCollectRecord : mwCollectRecordList) { if (mwCollectRecord.getWasteTypeStr().equals(wasteTypeStr)) { statisticsVO.setWeightSum(statisticsVO.getWeightSum().add(mwCollectRecord.getWeight())); statisticsVO.setCount(statisticsVO.getCount() + 1); } } statisticsList.add(statisticsVO); } checkoutDetails.setStatisticsList(statisticsList); checkoutDetails.setWasteTypeTotal(statisticsList.stream().mapToInt(ApiMedicalStatisticsVO::getCount).sum()); checkoutDetails.setWeightTotal(statisticsList.stream().map(ApiMedicalStatisticsVO::getWeightSum).reduce(BigDecimal.ZERO, BigDecimal::add)); checkoutDetails.setDateTime(checkoutTime); //处理预警记录 mwWarningRecordService.handleCheckoutStoreWarning(mwCollectRecordList); return checkoutDetails; } @Override public ApiMedicalCheckoutDetailsVO checkout(ApiMedicalCheckoutDTO dto) { MwTransitConfig mwTransitConfig = mwTransitConfigService.getById(dto.getTransitConfigId()); if (mwTransitConfig == null) { throw new BusinessException(ErrorCode.ERR_500, "出库配置不存在"); } SysDepartment hospital = sysDepartmentService.getById(mwTransitConfig.getHospitalId()); if (hospital == null) { throw new BusinessException(ErrorCode.ERR_500, "医院不存在"); } //批量更新收集状态为已出库 Date checkoutTime = new Date(); List mwCheckoutRecordItemList = new ArrayList<>(); List mwCollectRecordList = new ArrayList<>(); MwCollectRecord mwCollectRecord = mwCollectRecordService.getById(dto.getId()); if (mwCollectRecord == null) { throw new BusinessException(ErrorCode.ERR_500, "医废不存在,请重新选择"); } if (!mwCollectRecord.getStatus().equals(MedicalWasteEnum.MedicalWasteStatusEnum.STORE.getStatus())) { throw new BusinessException(ErrorCode.ERR_500, "医废不处于待出库状态,请重新选择"); } if (mwCollectRecord.getDelFlag().equals(CommonConstant.DEL_FLAG_1)) { throw new BusinessException(ErrorCode.ERR_500, "医废已删除,请重新选择"); } if (!mwCollectRecord.getAuditStatus().equals(MedicalWasteEnum.MedicalWasteAuditStatusEnum.PASS.getStatus())) { throw new BusinessException(ErrorCode.ERR_500, "医废已删除,请重新选择"); } if (!mwCollectRecord.getHospitalId().equals(mwTransitConfig.getHospitalId())) { throw new BusinessException(ErrorCode.ERR_500, "医废所在医院与出库配置不对应,请重新选择"); } // mwCollectRecordList.add(mwCollectRecord); mwCheckoutRecordItemList.add(new MwCheckoutRecordItem().setCollectRecordId(mwCollectRecord.getId())); // if (dto.getWeight() != null) { mwCollectRecord.setCheckoutWeight(dto.getWeight()); BigDecimal subtract = dto.getWeight().subtract(mwCollectRecord.getBoxWeight()); if (subtract.compareTo(BigDecimal.ZERO) > 0) { MwWarningConfig storeWeightConfig = mwWarningConfigService.getOne(new QueryWrapper().lambda().eq(MwWarningConfig::getType, MedicalWasteEnum.WarningConfigTypeEnum.CHECKOUT_WEIGHT.getType())); if (subtract.compareTo(storeWeightConfig.getDefaultValue()) > 0 && storeWeightConfig.getDefaultValue().compareTo(BigDecimal.ZERO) > 0) { MwWarningRecord warningRecord = new MwWarningRecord(); warningRecord.setHospitalId(mwCollectRecord.getHospitalId()); warningRecord.setHospitalName(mwCollectRecord.getHospitalName()); warningRecord.setOfficeId(mwCollectRecord.getDepartmentId()); warningRecord.setOfficeName(mwCollectRecord.getDepartmentName()); warningRecord.setType(MedicalWasteEnum.WarningConfigTypeEnum.CHECKOUT_WEIGHT.getType()); warningRecord.setTypeName(MedicalWasteEnum.WarningConfigTypeEnum.CHECKOUT_WEIGHT.getName()); warningRecord.setWarningTime(new Date()); warningRecord.setMessage("医疗废物出库重量不符"); warningRecord.setWarningTargetId(mwCollectRecord.getId()); warningRecord.setWarningTargetName(mwCollectRecord.getCode()); warningRecord.setStatus(MedicalWasteEnum.WarningRecordStatusEnum.WAIT_AUDIT.getStatus()); warningRecord.setWasteTypeName(mwCollectRecord.getWasteTypeStr()); warningRecord.setWeight(mwCollectRecord.getCheckoutWeight()); mwWarningRecordService.save(warningRecord); } } else { subtract = subtract.abs(); MwWarningConfig leekConfig = mwWarningConfigService.getOne(new QueryWrapper().lambda().eq(MwWarningConfig::getType, MedicalWasteEnum.WarningConfigTypeEnum.LEEK.getType())); if (subtract.compareTo(leekConfig.getDefaultValue()) > 0 && StringUtils.isNotEmpty(leekConfig.getWasteTypes()) && leekConfig.getDefaultValue().compareTo(BigDecimal.ZERO) > 0) { List wasteTypeList = Arrays.asList(leekConfig.getWasteTypes().split(",")); if (wasteTypeList.contains(String.valueOf(mwCollectRecord.getWasteType()))) { MwWarningRecord warningRecord = new MwWarningRecord(); warningRecord.setHospitalId(mwCollectRecord.getHospitalId()); warningRecord.setHospitalName(mwCollectRecord.getHospitalName()); warningRecord.setOfficeId(mwCollectRecord.getDepartmentId()); warningRecord.setOfficeName(mwCollectRecord.getDepartmentName()); warningRecord.setType(MedicalWasteEnum.WarningConfigTypeEnum.LEEK.getType()); warningRecord.setTypeName(MedicalWasteEnum.WarningConfigTypeEnum.LEEK.getName()); warningRecord.setWarningTime(new Date()); warningRecord.setMessage("医疗废物可能出现泄漏"); warningRecord.setWarningTargetId(mwCollectRecord.getId()); warningRecord.setWarningTargetName(mwCollectRecord.getCode()); warningRecord.setStatus(MedicalWasteEnum.WarningRecordStatusEnum.WAIT_AUDIT.getStatus()); warningRecord.setWasteTypeName(mwCollectRecord.getWasteTypeStr()); warningRecord.setWeight(mwCollectRecord.getCheckoutWeight()); mwWarningRecordService.save(warningRecord); } } MwWarningConfig damagedConfig = mwWarningConfigService.getOne(new QueryWrapper().lambda().eq(MwWarningConfig::getType, MedicalWasteEnum.WarningConfigTypeEnum.DAMAGED.getType())); if (subtract.compareTo(damagedConfig.getDefaultValue()) > 0 && StringUtils.isNotEmpty(damagedConfig.getWasteTypes()) && damagedConfig.getDefaultValue().compareTo(BigDecimal.ZERO) > 0) { List wasteTypeList = Arrays.asList(damagedConfig.getWasteTypes().split(",")); if (wasteTypeList.contains(String.valueOf(mwCollectRecord.getWasteType()))) { MwWarningRecord warningRecord = new MwWarningRecord(); warningRecord.setHospitalId(mwCollectRecord.getHospitalId()); warningRecord.setHospitalName(mwCollectRecord.getHospitalName()); warningRecord.setOfficeId(mwCollectRecord.getDepartmentId()); warningRecord.setOfficeName(mwCollectRecord.getDepartmentName()); warningRecord.setType(MedicalWasteEnum.WarningConfigTypeEnum.DAMAGED.getType()); warningRecord.setTypeName(MedicalWasteEnum.WarningConfigTypeEnum.DAMAGED.getName()); warningRecord.setWarningTime(new Date()); warningRecord.setMessage("医疗废物可能出现破损"); warningRecord.setWarningTargetId(mwCollectRecord.getId()); warningRecord.setWarningTargetName(mwCollectRecord.getCode()); warningRecord.setStatus(MedicalWasteEnum.WarningRecordStatusEnum.WAIT_AUDIT.getStatus()); warningRecord.setWasteTypeName(mwCollectRecord.getWasteTypeStr()); warningRecord.setWeight(mwCollectRecord.getCheckoutWeight()); mwWarningRecordService.save(warningRecord); } } } } mwCollectRecord.setCheckoutUserId(EnvUtils.getUser().getId()); mwCollectRecord.setCheckoutUser(EnvUtils.getUser().getName()); mwCollectRecord.setCheckoutTime(checkoutTime); mwCollectRecord.setStatus(MedicalWasteEnum.MedicalWasteStatusEnum.CHECKOUT.getStatus()); mwCollectRecordService.updateById(mwCollectRecord); // // //新增出库运输信息记录 MwCheckoutRecord mwCheckoutRecord = new MwCheckoutRecord(); mwCheckoutRecord.setEngineDriver(mwTransitConfig.getEngineDriver()); mwCheckoutRecord.setLicensePlate(mwTransitConfig.getLicensePlate()); mwCheckoutRecord.setTransitCompany(mwTransitConfig.getTransitCompany()); mwCheckoutRecord.setTransitConfigId(mwTransitConfig.getId()); mwCheckoutRecord.setHospitalName(hospital.getDepartName()); mwCheckoutRecord.setCreateTime(checkoutTime); mwCheckoutRecord.setWeight(dto.getWeightTotal()); mwCheckoutRecord.setCode(dto.getCode()); save(mwCheckoutRecord); //批量新增出库记录-医废项 for (MwCheckoutRecordItem mwCheckoutRecordItem : mwCheckoutRecordItemList) { mwCheckoutRecordItem.setCheckoutRecordId(mwCheckoutRecord.getId()); } mwCheckoutRecordItemService.saveBatch(mwCheckoutRecordItemList); // //打印出库详情 ApiMedicalCheckoutDetailsVO checkoutDetails = new ApiMedicalCheckoutDetailsVO(); //运输人员 BeanUtils.copyProperties(mwCheckoutRecord, checkoutDetails); Set wasteTypeStrSet = mwCollectRecordList.stream().map(MwCollectRecord::getWasteTypeStr).collect(Collectors.toSet()); List statisticsList = new ArrayList<>(); //获取此次出库操作医废收集类型统计 for (String wasteTypeStr : wasteTypeStrSet) { ApiMedicalStatisticsVO statisticsVO = new ApiMedicalStatisticsVO(); statisticsVO.setWasteTypeStr(wasteTypeStr); statisticsVO.setWeightSum(BigDecimal.ZERO); statisticsVO.setCount(0); for (MwCollectRecord mwCollectRecordTemp : mwCollectRecordList) { if (mwCollectRecordTemp.getWasteTypeStr().equals(wasteTypeStr)) { statisticsVO.setWeightSum(statisticsVO.getWeightSum().add(mwCollectRecordTemp.getWeight())); statisticsVO.setCount(statisticsVO.getCount() + 1); } } statisticsList.add(statisticsVO); } checkoutDetails.setStatisticsList(statisticsList); checkoutDetails.setWasteTypeTotal(statisticsList.stream().mapToInt(ApiMedicalStatisticsVO::getCount).sum()); checkoutDetails.setWeightTotal(statisticsList.stream().map(ApiMedicalStatisticsVO::getWeightSum).reduce(BigDecimal.ZERO, BigDecimal::add)); checkoutDetails.setDateTime(checkoutTime); //处理入库超时、入库后遗失预警记录 mwWarningRecordService.handleCheckoutStoreWarning(Lists.newArrayList(mwCollectRecord)); return checkoutDetails; } /** * 后台出库 * * @param dto * @return */ @Override @Transactional(rollbackFor = Exception.class) public Boolean checkoutBatchBackground(MwCheckoutRecordBatchDTO dto) { SysDepartment hospital = sysDepartmentService.getById(dto.getHospitalId()); if (hospital == null) { throw new BusinessException(ErrorCode.ERR_500, "医院不存在"); } List idList = dto.getCollectRecordIdList(); if (CollectionUtils.isEmpty(idList)) { throw new BusinessException(ErrorCode.ERR_500, "请选择需要出库的医废列表"); } //批量更新收集状态为已出库 Date checkoutTime = dto.getCheckoutTime(); List mwCollectRecordList = new ArrayList<>(); List mwCheckoutRecordItemList = new ArrayList<>(); for (Integer collectRecordId : idList) { MwCollectRecord mwCollectRecord = mwCollectRecordService.getById(collectRecordId); if (mwCollectRecord == null) { throw new BusinessException(ErrorCode.ERR_500, "医废不存在,请重新选择"); } if (!mwCollectRecord.getStatus().equals(MedicalWasteEnum.MedicalWasteStatusEnum.STORE.getStatus())) { throw new BusinessException(ErrorCode.ERR_500, "医废不处于待出库状态,请重新选择"); } if (mwCollectRecord.getDelFlag().equals(CommonConstant.DEL_FLAG_1)) { throw new BusinessException(ErrorCode.ERR_500, "医废已删除,请重新选择"); } if (!mwCollectRecord.getAuditStatus().equals(MedicalWasteEnum.MedicalWasteAuditStatusEnum.PASS.getStatus())) { throw new BusinessException(ErrorCode.ERR_500, "医废已删除,请重新选择"); } mwCollectRecord.setCheckoutUserId(-1); mwCollectRecord.setCheckoutUser(dto.getCheckoutUser()); mwCollectRecord.setCheckoutTime(checkoutTime); mwCollectRecord.setCheckoutWeight(mwCollectRecord.getStoreWeight()); mwCollectRecord.setStatus(MedicalWasteEnum.MedicalWasteStatusEnum.CHECKOUT.getStatus()); mwCollectRecordList.add(mwCollectRecord); // mwCheckoutRecordItemList.add(new MwCheckoutRecordItem().setCollectRecordId(collectRecordId)); } mwCollectRecordService.updateBatchById(mwCollectRecordList); //新增出库运输信息记录 MwCheckoutRecord mwCheckoutRecord = new MwCheckoutRecord(); mwCheckoutRecord.setEngineDriver(dto.getEngineDriver()); mwCheckoutRecord.setLicensePlate(dto.getLicensePlate()); mwCheckoutRecord.setTransitCompany(dto.getTransitCompany()); mwCheckoutRecord.setTransitConfigId(-1); mwCheckoutRecord.setHospitalName(dto.getHospitalName()); mwCheckoutRecord.setHospitalId(dto.getHospitalId()); mwCheckoutRecord.setCreateTime(checkoutTime); mwCheckoutRecord.setCreator(dto.getCheckoutUser()); mwCheckoutRecord.setCreateBy(-1); save(mwCheckoutRecord); //批量新增出库记录-医废项 for (MwCheckoutRecordItem mwCheckoutRecordItem : mwCheckoutRecordItemList) { mwCheckoutRecordItem.setCheckoutRecordId(mwCheckoutRecord.getId()); } mwCheckoutRecordItemService.saveBatch(mwCheckoutRecordItemList); return true; } }