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<SysDictItem> wasteTypeList = getWasteTypeList();
|
if (CollectionUtils.isEmpty(wasteTypeList)) {
|
return new WasteTypeStatisticsVO();
|
}
|
QueryWrapper<MwCollectRecord> queryWrapper = buildQueryWrapper(dto);
|
SysDepartment sysDepartment = sysDepartmentService.getById(dto.getDepartmentId());
|
if (sysDepartment == null) {
|
throw new BusinessException(ErrorCode.ERR_500, "区域不存在");
|
}
|
List<SysDepartment> sysDepartmentList = sysDepartmentService.list(new QueryWrapper<SysDepartment>().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<MwCollectRecord> mwCollectRecordList = mwCollectRecordService.list(queryWrapper);
|
//
|
WasteTypeStatisticsVO vo = new WasteTypeStatisticsVO();
|
List<String> legend = new ArrayList<>();
|
List<WasteTypeStatisticsVO.InnerData> 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<SysDictItem> 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<SysDepartment> sysDepartmentList = sysDepartmentService.list(new QueryWrapper<SysDepartment>().lambda().eq(SysDepartment::getParentId, sysDepartment.getId()).eq(SysDepartment::getOrgType, DepartmentEnum.OrgTypeEnum.AREA.getType()).orderByAsc(SysDepartment::getTreeCode));
|
if (CollectionUtils.isEmpty(sysDepartmentList)) {
|
return new RegionStatisticsVO();
|
}
|
//统计区域下的医废列表
|
Map<Integer, List<MwCollectRecord>> departmentCollectListMap = new LinkedHashMap<>();
|
for (SysDepartment department : sysDepartmentList) {
|
List<SysDepartment> hospitalList = sysDepartmentService.list(new QueryWrapper<SysDepartment>().lambda().likeRight(SysDepartment::getTreeCode, department.getTreeCode()).eq(SysDepartment::getOrgType, DepartmentEnum.OrgTypeEnum.HOSPITAL.getType()));
|
if (CollectionUtils.isNotEmpty(hospitalList)) {
|
QueryWrapper<MwCollectRecord> 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<RegionStatisticsVO.InnerData> dataList = new ArrayList<>();
|
for (SysDictItem wasteType : wasteTypeList) {
|
List<BigDecimal> data = new ArrayList<>();
|
for (SysDepartment department : sysDepartmentList) {
|
List<MwCollectRecord> 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<SysDictItem> 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<SysDepartment> sysDepartmentList = sysDepartmentService.list(new QueryWrapper<SysDepartment>().lambda().likeRight(SysDepartment::getTreeCode, sysDepartment.getTreeCode()).eq(SysDepartment::getOrgType, DepartmentEnum.OrgTypeEnum.HOSPITAL.getType()).orderByAsc(SysDepartment::getTreeCode));
|
if (CollectionUtils.isEmpty(sysDepartmentList)) {
|
return new RegionStatisticsVO();
|
}
|
//
|
QueryWrapper<MwCollectRecord> 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<MwCollectRecord> 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<MwCollectRecord> 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<MwCollectRecord> 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<MwCollectRecord> checkoutRecordList = mwCollectRecordService.list(queryWrapper);
|
//
|
RegionStatisticsVO vo = new RegionStatisticsVO();
|
vo.setLegend(Arrays.asList("收集", "入库", "装箱", "出库"));
|
vo.setXAxis(new ArrayList<>());
|
List<RegionStatisticsVO.InnerData> 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<String, List<MwCollectRecord>> dateMwCollectRecordMap = new LinkedHashMap<>();
|
// List<String> 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<MwCollectRecord> 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<RankStatisticsVO> getTodayRankStatistics(StatisticsDTO dto) {
|
|
dto.setStartTime(DateUtil.beginDate(new Date()));
|
dto.setEndTime(DateUtil.endDate(new Date()));
|
return getInnerRankStatisticsList(dto);
|
}
|
|
/**
|
* 昨日产废排行榜
|
*
|
* @param dto
|
* @return
|
*/
|
public IPage<RankStatisticsVO> 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<RankStatisticsVO> getRankStatisticsList(StatisticsDTO dto) {
|
|
dto.setStartTime(null);
|
dto.setEndTime(null);
|
return getInnerRankStatisticsList(dto);
|
}
|
|
private IPage<RankStatisticsVO> 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<SysDepartment> sysDepartmentList = sysDepartmentService.list(new QueryWrapper<SysDepartment>().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<RankStatisticsVO> 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<RankStatisticsVO> getRegionTodayRankStatistics(StatisticsDTO dto) {
|
|
dto.setStartTime(DateUtil.beginDate(new Date()));
|
dto.setEndTime(DateUtil.endDate(new Date()));
|
return getRegionInnerRankStatisticsList(dto);
|
}
|
|
/**
|
* 区域-昨日产废排行榜
|
*
|
* @param dto
|
* @return
|
*/
|
public IPage<RankStatisticsVO> 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<RankStatisticsVO> getRegionRankStatisticsList(StatisticsDTO dto) {
|
|
dto.setStartTime(null);
|
dto.setEndTime(null);
|
return getRegionInnerRankStatisticsList(dto);
|
}
|
|
private IPage<RankStatisticsVO> 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<SysDepartment> sysDepartmentList = sysDepartmentService.list(new QueryWrapper<SysDepartment>().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<RankStatisticsVO> 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<SysDictItem> getWasteTypeList() {
|
|
SysDict sysDict = sysDictService.getOne(new QueryWrapper<SysDict>().lambda().eq(SysDict::getDictCode, "MEDICAL_WASTE_TYPE"));
|
if (sysDict == null) {
|
return null;
|
}
|
//获取字典所有医废类型
|
return sysDictItemService.list(new QueryWrapper<SysDictItem>().lambda().eq(SysDictItem::getDictId, sysDict.getId()));
|
}
|
|
/**
|
* 构建通用参数
|
*
|
* @param dto
|
* @return
|
*/
|
private QueryWrapper<MwCollectRecord> buildQueryWrapper(StatisticsDTO dto) {
|
|
QueryWrapper<MwCollectRecord> 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;
|
}
|
|
}
|