package cn.besteam.modules.report.biz; import cn.besteam.common.constant.DepartmentEnum; import cn.besteam.common.constant.ErrorCode; import cn.besteam.common.constant.MedicalWasteEnum; import cn.besteam.common.exception.BusinessException; import cn.besteam.common.util.DateUtil; import cn.besteam.modules.medical.entity.MwCollectRecord; import cn.besteam.modules.medical.service.IMwCollectRecordService; import cn.besteam.modules.report.dto.StatisticsDTO; import cn.besteam.modules.report.vo.RankStatisticsVO; import cn.besteam.modules.report.vo.RegionStatisticsVO; import cn.besteam.modules.report.vo.WasteTypeStatisticsVO; import cn.besteam.modules.system.entity.SysDepartment; import cn.besteam.modules.system.entity.SysDict; import cn.besteam.modules.system.entity.SysDictItem; import cn.besteam.modules.system.service.ISysDepartmentService; import cn.besteam.modules.system.service.ISysDictItemService; import cn.besteam.modules.system.service.ISysDictService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.time.DateUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; @Service @Slf4j public class StatisticsBiz { @Autowired private IMwCollectRecordService mwCollectRecordService; @Autowired private ISysDictService sysDictService; @Autowired private ISysDictItemService sysDictItemService; @Autowired private ISysDepartmentService sysDepartmentService; /** * 医废类型分析 * * @param dto * @return */ public WasteTypeStatisticsVO getWasteTypeStatistics(StatisticsDTO dto) { List wasteTypeList = getWasteTypeList(); if (CollectionUtils.isEmpty(wasteTypeList)) { return new WasteTypeStatisticsVO(); } QueryWrapper queryWrapper = buildQueryWrapper(dto); SysDepartment sysDepartment = sysDepartmentService.getById(dto.getDepartmentId()); if (sysDepartment == null) { throw new BusinessException(ErrorCode.ERR_500, "区域不存在"); } List sysDepartmentList = sysDepartmentService.list(new QueryWrapper().lambda().likeRight(SysDepartment::getTreeCode, sysDepartment.getTreeCode()).eq(SysDepartment::getOrgType, DepartmentEnum.OrgTypeEnum.HOSPITAL.getType())); if (CollectionUtils.isEmpty(sysDepartmentList)) { return new WasteTypeStatisticsVO(); } queryWrapper.lambda().in(MwCollectRecord::getHospitalId, sysDepartmentList.stream().map(SysDepartment::getId).collect(Collectors.toList())); List mwCollectRecordList = mwCollectRecordService.list(queryWrapper); // WasteTypeStatisticsVO vo = new WasteTypeStatisticsVO(); List legend = new ArrayList<>(); List dataList = new ArrayList<>(); for (SysDictItem wasteType : wasteTypeList) { legend.add(wasteType.getItemText()); BigDecimal weight = mwCollectRecordList.stream().filter(e -> e.getWasteType().equals(wasteType.getId())).map(MwCollectRecord::getWeight).reduce(BigDecimal::add).orElse(BigDecimal.ZERO); dataList.add(WasteTypeStatisticsVO.InnerData.builder().name(wasteType.getItemText()).data(weight).build()); } vo.setLegend(legend); vo.setDataList(dataList); return vo; } /** * 区域产废分析 * * @param dto * @return */ public RegionStatisticsVO getRegionStatistics(StatisticsDTO dto) { List wasteTypeList = getWasteTypeList(); if (CollectionUtils.isEmpty(wasteTypeList)) { return new RegionStatisticsVO(); } SysDepartment sysDepartment = sysDepartmentService.getById(dto.getDepartmentId()); if (sysDepartment == null) { throw new BusinessException(ErrorCode.ERR_500, "区域不存在"); } List sysDepartmentList = sysDepartmentService.list(new QueryWrapper().lambda().eq(SysDepartment::getParentId, sysDepartment.getId()).eq(SysDepartment::getOrgType, DepartmentEnum.OrgTypeEnum.AREA.getType()).orderByAsc(SysDepartment::getTreeCode)); if (CollectionUtils.isEmpty(sysDepartmentList)) { return new RegionStatisticsVO(); } //统计区域下的医废列表 Map> departmentCollectListMap = new LinkedHashMap<>(); for (SysDepartment department : sysDepartmentList) { List hospitalList = sysDepartmentService.list(new QueryWrapper().lambda().likeRight(SysDepartment::getTreeCode, department.getTreeCode()).eq(SysDepartment::getOrgType, DepartmentEnum.OrgTypeEnum.HOSPITAL.getType())); if (CollectionUtils.isNotEmpty(hospitalList)) { QueryWrapper queryWrapper = buildQueryWrapper(dto); queryWrapper.lambda().in(MwCollectRecord::getHospitalId, hospitalList.stream().map(SysDepartment::getId).collect(Collectors.toList())); departmentCollectListMap.put(department.getId(), mwCollectRecordService.list(queryWrapper)); } else { departmentCollectListMap.put(department.getId(), new ArrayList<>()); } } RegionStatisticsVO vo = new RegionStatisticsVO(); vo.setLegend(wasteTypeList.stream().map(SysDictItem::getItemText).collect(Collectors.toList())); vo.setXAxis(sysDepartmentList.stream().map(SysDepartment::getDepartName).collect(Collectors.toList())); List dataList = new ArrayList<>(); for (SysDictItem wasteType : wasteTypeList) { List data = new ArrayList<>(); for (SysDepartment department : sysDepartmentList) { List mwCollectRecordList = departmentCollectListMap.get(department.getId()); BigDecimal weight = mwCollectRecordList.stream().filter(e -> e.getWasteType().equals(wasteType.getId())).map(MwCollectRecord::getWeight).reduce(BigDecimal::add).orElse(BigDecimal.ZERO); data.add(weight); } dataList.add(RegionStatisticsVO.InnerData.builder().name(wasteType.getItemText()).data(data).build()); } vo.setDataList(dataList); return vo; } /** * 各环节重量分析 * * @param dto * @return */ public RegionStatisticsVO getSegmentWeightStatistics(StatisticsDTO dto) { List wasteTypeList = getWasteTypeList(); if (CollectionUtils.isEmpty(wasteTypeList)) { return new RegionStatisticsVO(); } SysDepartment sysDepartment = sysDepartmentService.getById(dto.getDepartmentId()); if (sysDepartment == null) { throw new BusinessException(ErrorCode.ERR_500, "区域不存在"); } if (dto.getStartTime() == null || dto.getEndTime() == null) { throw new BusinessException(ErrorCode.ERR_500, "请选择时间区间"); } List sysDepartmentList = sysDepartmentService.list(new QueryWrapper().lambda().likeRight(SysDepartment::getTreeCode, sysDepartment.getTreeCode()).eq(SysDepartment::getOrgType, DepartmentEnum.OrgTypeEnum.HOSPITAL.getType()).orderByAsc(SysDepartment::getTreeCode)); if (CollectionUtils.isEmpty(sysDepartmentList)) { return new RegionStatisticsVO(); } // QueryWrapper queryWrapper = buildQueryWrapper(dto); queryWrapper.lambda().in(MwCollectRecord::getHospitalId, sysDepartmentList.stream().map(SysDepartment::getId).collect(Collectors.toList())); if (dto.getHospitalId() != null) { queryWrapper.lambda().eq(MwCollectRecord::getHospitalId, dto.getHospitalId()); } List collectRecordList = mwCollectRecordService.list(queryWrapper); // queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(MwCollectRecord::getDelFlag, 0).eq(MwCollectRecord::getAuditStatus, MedicalWasteEnum.MedicalWasteAuditStatusEnum.PASS.getStatus()).orderByAsc(MwCollectRecord::getStoreTime); queryWrapper.lambda().ge(dto.getStartTime() != null, MwCollectRecord::getStoreTime, DateUtil.format(dto.getStartTime(), "yyyy-MM-dd HH:mm:ss")); queryWrapper.lambda().le(dto.getEndTime() != null, MwCollectRecord::getStoreTime, DateUtil.format(dto.getEndTime(), "yyyy-MM-dd HH:mm:ss")); queryWrapper.lambda().in(MwCollectRecord::getHospitalId, sysDepartmentList.stream().map(SysDepartment::getId).collect(Collectors.toList())); if (dto.getHospitalId() != null) { queryWrapper.lambda().eq(MwCollectRecord::getHospitalId, dto.getHospitalId()); } List storeRecordList = mwCollectRecordService.list(queryWrapper); // queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(MwCollectRecord::getDelFlag, 0).eq(MwCollectRecord::getAuditStatus, MedicalWasteEnum.MedicalWasteAuditStatusEnum.PASS.getStatus()).orderByAsc(MwCollectRecord::getStoreTime); queryWrapper.lambda().ge(dto.getStartTime() != null, MwCollectRecord::getBoxTime, DateUtil.format(dto.getStartTime(), "yyyy-MM-dd HH:mm:ss")); queryWrapper.lambda().le(dto.getEndTime() != null, MwCollectRecord::getBoxTime, DateUtil.format(dto.getEndTime(), "yyyy-MM-dd HH:mm:ss")); queryWrapper.lambda().in(MwCollectRecord::getHospitalId, sysDepartmentList.stream().map(SysDepartment::getId).collect(Collectors.toList())); if (dto.getHospitalId() != null) { queryWrapper.lambda().eq(MwCollectRecord::getHospitalId, dto.getHospitalId()); } List boxingRecordList = mwCollectRecordService.list(queryWrapper); queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(MwCollectRecord::getDelFlag, 0).eq(MwCollectRecord::getAuditStatus, MedicalWasteEnum.MedicalWasteAuditStatusEnum.PASS.getStatus()).orderByAsc(MwCollectRecord::getStoreTime); queryWrapper.lambda().ge(dto.getStartTime() != null, MwCollectRecord::getCheckoutTime, DateUtil.format(dto.getStartTime(), "yyyy-MM-dd HH:mm:ss")); queryWrapper.lambda().le(dto.getEndTime() != null, MwCollectRecord::getCheckoutTime, DateUtil.format(dto.getEndTime(), "yyyy-MM-dd HH:mm:ss")); queryWrapper.lambda().in(MwCollectRecord::getHospitalId, sysDepartmentList.stream().map(SysDepartment::getId).collect(Collectors.toList())); if (dto.getHospitalId() != null) { queryWrapper.lambda().eq(MwCollectRecord::getHospitalId, dto.getHospitalId()); } List checkoutRecordList = mwCollectRecordService.list(queryWrapper); // RegionStatisticsVO vo = new RegionStatisticsVO(); vo.setLegend(Arrays.asList("收集", "入库", "装箱", "出库")); vo.setXAxis(new ArrayList<>()); List dataList = new ArrayList<>(); RegionStatisticsVO.InnerData collectData = RegionStatisticsVO.InnerData.builder().name("收集").data(new ArrayList<>()).build(); RegionStatisticsVO.InnerData storeData = RegionStatisticsVO.InnerData.builder().name("入库").data(new ArrayList<>()).build(); RegionStatisticsVO.InnerData boxingData = RegionStatisticsVO.InnerData.builder().name("装箱").data(new ArrayList<>()).build(); RegionStatisticsVO.InnerData checkoutData = RegionStatisticsVO.InnerData.builder().name("出库").data(new ArrayList<>()).build(); //统计区域下的医废列表 // Map> dateMwCollectRecordMap = new LinkedHashMap<>(); // List dateList = mwCollectRecordList.stream().map(e -> DateUtil.format(e.getCreateTime(), "yyyy-MM-dd")).collect(Collectors.toList()); // for (String date : dateList) { // dateMwCollectRecordMap.put(date, mwCollectRecordList.stream().filter(e -> DateUtil.format(e.getCreateTime(), "yyyy-MM-dd").equals(date)).collect(Collectors.toList())); // } // Date startTime = dto.getStartTime(); Date endTime = dto.getEndTime(); while (!startTime.after(endTime)) { String dateTemp = DateUtil.format(startTime, "yyyy-MM-dd"); // List listTemp = dateMwCollectRecordMap.get(dateTemp); // if (CollectionUtils.isNotEmpty(listTemp)) { // collectData.getData().add(listTemp.stream().map(MwCollectRecord::getWeight).reduce(BigDecimal::add).orElse(BigDecimal.ZERO)); // storeData.getData().add(listTemp.stream().map(MwCollectRecord::getStoreWeight).reduce(BigDecimal::add).orElse(BigDecimal.ZERO)); // boxingData.getData().add(listTemp.stream().map(MwCollectRecord::getBoxWeight).reduce(BigDecimal::add).orElse(BigDecimal.ZERO)); // checkoutData.getData().add(listTemp.stream().map(MwCollectRecord::getCheckoutWeight).reduce(BigDecimal::add).orElse(BigDecimal.ZERO)); // } else { // collectData.getData().add(BigDecimal.ZERO); // storeData.getData().add(BigDecimal.ZERO); // boxingData.getData().add(BigDecimal.ZERO); // checkoutData.getData().add(BigDecimal.ZERO); // } collectData.getData().add(collectRecordList.stream().filter(e -> DateUtil.format(e.getCreateTime(), "yyyy-MM-dd").equals(dateTemp)).map(MwCollectRecord::getWeight).reduce(BigDecimal::add).orElse(BigDecimal.ZERO)); storeData.getData().add(storeRecordList.stream().filter(e -> DateUtil.format(e.getStoreTime(), "yyyy-MM-dd").equals(dateTemp)).map(MwCollectRecord::getStoreWeight).reduce(BigDecimal::add).orElse(BigDecimal.ZERO)); boxingData.getData().add(boxingRecordList.stream().filter(e -> DateUtil.format(e.getBoxTime(), "yyyy-MM-dd").equals(dateTemp)).map(MwCollectRecord::getBoxWeight).reduce(BigDecimal::add).orElse(BigDecimal.ZERO)); checkoutData.getData().add(checkoutRecordList.stream().filter(e -> DateUtil.format(e.getCheckoutTime(), "yyyy-MM-dd").equals(dateTemp)).map(MwCollectRecord::getCheckoutWeight).reduce(BigDecimal::add).orElse(BigDecimal.ZERO)); vo.getXAxis().add(dateTemp); startTime = DateUtils.addDays(startTime, 1); } dataList.add(collectData); dataList.add(storeData); dataList.add(boxingData); dataList.add(checkoutData); vo.setDataList(dataList); return vo; } /** * 今日产废排行榜 * * @param dto * @return */ public IPage getTodayRankStatistics(StatisticsDTO dto) { dto.setStartTime(DateUtil.beginDate(new Date())); dto.setEndTime(DateUtil.endDate(new Date())); return getInnerRankStatisticsList(dto); } /** * 昨日产废排行榜 * * @param dto * @return */ public IPage getYesterdayRangeStatistics(StatisticsDTO dto) { dto.setStartTime(DateUtils.addDays(DateUtil.beginDate(new Date()), -1)); dto.setEndTime(DateUtils.addDays(DateUtil.endDate(new Date()), -1)); return getInnerRankStatisticsList(dto); } /** * 累计产废排行榜 * * @param dto * @return */ public IPage getRankStatisticsList(StatisticsDTO dto) { dto.setStartTime(null); dto.setEndTime(null); return getInnerRankStatisticsList(dto); } private IPage getInnerRankStatisticsList(StatisticsDTO dto) { if (dto.getPageNo() == null || dto.getPageSize() == null) { throw new BusinessException(ErrorCode.ERR_500, "请传入分页参数"); } SysDepartment sysDepartment = sysDepartmentService.getById(dto.getDepartmentId()); if (sysDepartment == null) { throw new BusinessException(ErrorCode.ERR_500, "区域不存在"); } List sysDepartmentList = sysDepartmentService.list(new QueryWrapper().lambda().likeRight(SysDepartment::getTreeCode, sysDepartment.getTreeCode()).eq(SysDepartment::getOrgType, DepartmentEnum.OrgTypeEnum.HOSPITAL.getType())); if (CollectionUtils.isEmpty(sysDepartmentList)) { return new Page<>(dto.getPageNo(), dto.getPageSize()); } IPage vo = mwCollectRecordService.getRankStatisticsList(dto.getPageNo(), dto.getPageSize(), sysDepartmentList.stream().map(SysDepartment::getId).collect(Collectors.toList()), dto.getStartTime(), dto.getEndTime(),dto.getTypeName()); for (int i = 0; i < vo.getRecords().size(); i++) { vo.getRecords().get(i).setKey(i); vo.getRecords().get(i).setRank((dto.getPageNo()-1)*dto.getPageSize()+(i+1)); vo.getRecords().get(i).setRanks((dto.getPageNo()-1)*dto.getPageSize()+(i+1)); } return vo; } /** * 区域-今日产废排行榜 * * @param dto * @return */ public IPage getRegionTodayRankStatistics(StatisticsDTO dto) { dto.setStartTime(DateUtil.beginDate(new Date())); dto.setEndTime(DateUtil.endDate(new Date())); return getRegionInnerRankStatisticsList(dto); } /** * 区域-昨日产废排行榜 * * @param dto * @return */ public IPage getRegionYesterdayRangeStatistics(StatisticsDTO dto) { dto.setStartTime(DateUtils.addDays(DateUtil.beginDate(new Date()), -1)); dto.setEndTime(DateUtils.addDays(DateUtil.endDate(new Date()), -1)); return getRegionInnerRankStatisticsList(dto); } /** * 区域-累计产废排行榜 * * @param dto * @return */ public IPage getRegionRankStatisticsList(StatisticsDTO dto) { dto.setStartTime(null); dto.setEndTime(null); return getRegionInnerRankStatisticsList(dto); } private IPage getRegionInnerRankStatisticsList(StatisticsDTO dto) { if (dto.getPageNo() == null || dto.getPageSize() == null) { throw new BusinessException(ErrorCode.ERR_500, "请传入分页参数"); } SysDepartment sysDepartment = sysDepartmentService.getById(dto.getDepartmentId()); if (sysDepartment == null) { throw new BusinessException(ErrorCode.ERR_500, "区域不存在"); } List sysDepartmentList = sysDepartmentService.list(new QueryWrapper().lambda().eq(SysDepartment::getParentId, sysDepartment.getId()).eq(SysDepartment::getOrgType, DepartmentEnum.OrgTypeEnum.AREA.getType())); if (CollectionUtils.isEmpty(sysDepartmentList)) { return new Page<>(dto.getPageNo(), dto.getPageSize()); } IPage vo = mwCollectRecordService.getRegionStatisticsList(dto.getPageNo(), dto.getPageSize(), sysDepartmentList.stream().map(SysDepartment::getId).collect(Collectors.toList()), dto.getStartTime(), dto.getEndTime()); for (int i = 0; i < vo.getRecords().size(); i++) { vo.getRecords().get(i).setKey(i); } return vo; } /** * 获取所有医废类型 * * @return */ private List getWasteTypeList() { SysDict sysDict = sysDictService.getOne(new QueryWrapper().lambda().eq(SysDict::getDictCode, "MEDICAL_WASTE_TYPE")); if (sysDict == null) { return null; } //获取字典所有医废类型 return sysDictItemService.list(new QueryWrapper().lambda().eq(SysDictItem::getDictId, sysDict.getId())); } /** * 构建通用参数 * * @param dto * @return */ private QueryWrapper buildQueryWrapper(StatisticsDTO dto) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(MwCollectRecord::getDelFlag, 0).eq(MwCollectRecord::getAuditStatus, MedicalWasteEnum.MedicalWasteAuditStatusEnum.PASS.getStatus()).orderByAsc(MwCollectRecord::getCreateTime); if (dto.getStartTime() != null) { queryWrapper.lambda().ge(MwCollectRecord::getCreateTime, DateUtil.format(dto.getStartTime(), "yyyy-MM-dd HH:mm:ss")); } if (dto.getEndTime() != null) { queryWrapper.lambda().le(MwCollectRecord::getCreateTime, DateUtil.format(dto.getEndTime(), "yyyy-MM-dd HH:mm:ss")); } return queryWrapper; } }