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<MwCheckoutRecordMapper, MwCheckoutRecord> 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<Integer> idList = dto.getIdList();
|
if (CollectionUtils.isEmpty(idList)) {
|
throw new BusinessException(ErrorCode.ERR_500, "请选择需要出库的医废列表");
|
}
|
//批量更新收集状态为已出库
|
Date checkoutTime = new Date();
|
List<MwCollectRecord> mwCollectRecordList = new ArrayList<>();
|
List<MwCheckoutRecordItem> 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<String> wasteTypeStrSet = mwCollectRecordList.stream().map(MwCollectRecord::getWasteTypeStr).collect(Collectors.toSet());
|
List<ApiMedicalStatisticsVO> 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<MwCheckoutRecordItem> mwCheckoutRecordItemList = new ArrayList<>();
|
List<MwCollectRecord> 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<MwWarningConfig>().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<MwWarningConfig>().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<String> 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<MwWarningConfig>().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<String> 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<String> wasteTypeStrSet = mwCollectRecordList.stream().map(MwCollectRecord::getWasteTypeStr).collect(Collectors.toSet());
|
List<ApiMedicalStatisticsVO> 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<Integer> idList = dto.getCollectRecordIdList();
|
if (CollectionUtils.isEmpty(idList)) {
|
throw new BusinessException(ErrorCode.ERR_500, "请选择需要出库的医废列表");
|
}
|
//批量更新收集状态为已出库
|
Date checkoutTime = dto.getCheckoutTime();
|
List<MwCollectRecord> mwCollectRecordList = new ArrayList<>();
|
List<MwCheckoutRecordItem> 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;
|
}
|
|
}
|