| | |
| | | import com.sinata.common.core.domain.entity.SysDictData; |
| | | import com.sinata.common.utils.CollUtils; |
| | | import com.sinata.common.utils.DateUtils; |
| | | import com.sinata.system.domain.MedicalWasteStaticsVO; |
| | | import com.sinata.system.domain.MwCollectRecord; |
| | | import com.sinata.system.domain.MwWarningRecord; |
| | | import com.sinata.system.domain.SysDepartment; |
| | |
| | | import com.sinata.system.service.ISysDictDataService; |
| | | import com.sinata.system.service.MwCheckoutRecordService; |
| | | import com.sinata.system.service.MwCollectRecordService; |
| | | import com.sinata.system.service.MwDisposalHandleRecordService; |
| | | import com.sinata.system.service.MwDisposalRecordService; |
| | | import com.sinata.system.service.MwWarningRecordService; |
| | | import com.sinata.system.service.SysDepartmentService; |
| | | import com.sinata.system.utils.ImageToBase64; |
| | | import lombok.RequiredArgsConstructor; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | |
| | | import java.text.SimpleDateFormat; |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | import java.util.Objects; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | |
| | | private final MwWarningRecordService mwWarningRecordService; |
| | | private final HttpServletResponse response; |
| | | private final MwDisposalRecordService mwDisposalRecordService; |
| | | private final MwDisposalHandleRecordService mwDisposalHandleRecordService; |
| | | |
| | | /** |
| | | * 机构分布-获取机构列表 |
| | | * |
| | | * @param type 1:全部 2:医院 3:处置单位 |
| | | * @return |
| | | */ |
| | | public List<SysDepartment> departmentList(Integer type) { |
| | | return sysDepartmentService.lambdaQuery().eq(type != 1, SysDepartment::getOrgType, type).list(); |
| | | } |
| | | |
| | | public MedicalWasteStaticsVO medicalWaste() { |
| | | return null; |
| | | } |
| | | |
| | | /** |
| | | * 医院报表 |
| | |
| | | */ |
| | | public DepartmentReportVO hospitalReport(HospitalReportQuery query) { |
| | | DepartmentReportVO vo = new DepartmentReportVO(); |
| | | SysDepartment department = sysDepartmentService.getById(query.getDepartmentId()); |
| | | if (Objects.nonNull(department)) { |
| | | vo.setDepartmentName(department.getDepartmentName()); |
| | | } |
| | | List<SysDictDataVO> wasteTypeList = sysDictDataService.medicalWasteTypeList(); |
| | | |
| | | if (CollUtils.isEmpty(wasteTypeList)) { |
| | |
| | | totalCount = totalCount.add(currentCount); |
| | | totalWeight = totalWeight.add(weight); |
| | | } |
| | | itemVO.getData().add(totalCount); |
| | | itemVO.getData().add(totalWeight); |
| | | //查询预警记录判断是否超时 |
| | | if (query.getDateType().equals(1)) { |
| | | itemVO.setOverTimeFlag("否"); |
| | | List<Long> collectIdList = collectRecordList.stream().filter(e -> finalSdf.format(e.getCollectTime()).equals(date)).map(MwCollectRecord::getId).collect(Collectors.toList()); |
| | | List<MwWarningRecord> warningRecordList = mwWarningRecordService.lambdaQuery().in(MwWarningRecord::getWarningTargetId, collectIdList).list(); |
| | | if (CollUtils.isNotEmpty(warningRecordList)) { |
| | | itemVO.setOverTimeFlag("是"); |
| | | if (CollUtils.isNotEmpty(collectIdList)) { |
| | | List<MwWarningRecord> warningRecordList = mwWarningRecordService.lambdaQuery().in(MwWarningRecord::getWarningTargetId, collectIdList).list(); |
| | | if (CollUtils.isNotEmpty(warningRecordList)) { |
| | | itemVO.setOverTimeFlag("是"); |
| | | } |
| | | } |
| | | } |
| | | list.add(itemVO); |
| | |
| | | public DepartmentReportVO transformList(TransformQuery query) { |
| | | DepartmentReportVO vo = new DepartmentReportVO(); |
| | | SysDepartment department = sysDepartmentService.getById(query.getDepartmentId()); |
| | | if (Objects.nonNull(department)) { |
| | | vo.setDepartmentName(department.getDepartmentName()); |
| | | } |
| | | SysDepartment region = sysDepartmentService.getDepartmentByParentId(department.getParentId()); |
| | | List<SysDepartment> hospitalList = sysDepartmentService.lambdaQuery().likeRight(SysDepartment::getTreeCode, region.getTreeCode()).eq(SysDepartment::getOrgType, DepartmentEnum.MEDICAL_INSTITUTION.getCode()).list(); |
| | | if (CollUtils.isNotEmpty(hospitalList)) { |
| | |
| | | if (CollUtils.isNotEmpty(wasteTypeList)) { |
| | | vo.setLegend(wasteTypeList.stream().map(SysDictData::getDictLabel).collect(Collectors.toList())); |
| | | vo.getLegend().add("小计"); |
| | | List<DepartmentReportItemVO> list = new ArrayList<>(); |
| | | for (TransformVO transformVO : checkoutRecordVOList) { |
| | | BigDecimal totalCount = BigDecimal.ZERO; |
| | | BigDecimal totalWeight = BigDecimal.ZERO; |
| | |
| | | departmentReportItemVO.setName(transformVO.getHospitalName()); |
| | | departmentReportItemVO.setData(new ArrayList<>()); |
| | | departmentReportItemVO.setDriverName(transformVO.getDriverName()); |
| | | departmentReportItemVO.setHospitalSignature(transformVO.getHospitalSignature()); |
| | | departmentReportItemVO.setHospitalSignature(ImageToBase64.convertImageToBase64(transformVO.getHospitalSignature())); |
| | | departmentReportItemVO.setHandoverTime(transformVO.getCheckoutTime()); |
| | | for (SysDictData sysDictData : wasteTypeList) { |
| | | BigDecimal count = BigDecimal.valueOf(transformVO.getCollectRecordList().stream().filter(item -> item.getWasteType().equals(sysDictData.getDictCode())).count()); |
| | |
| | | } |
| | | departmentReportItemVO.getData().add(totalCount); |
| | | departmentReportItemVO.getData().add(totalWeight); |
| | | list.add(departmentReportItemVO); |
| | | } |
| | | vo.setList(list); |
| | | } |
| | | } |
| | | } |
| | |
| | | */ |
| | | public DepartmentReportVO disposalReport(DisposalReportQuery query) { |
| | | DepartmentReportVO vo = new DepartmentReportVO(); |
| | | SysDepartment department = sysDepartmentService.getById(query.getDepartmentId()); |
| | | if (Objects.nonNull(department)) { |
| | | vo.setDepartmentName(department.getDepartmentName()); |
| | | } |
| | | //已接收 |
| | | List<MwDisposalRecordReportVO> receivedList = mwDisposalRecordService.disposalReportByType(query, 1); |
| | | List<MwDisposalRecordReportVO> receivedList = mwDisposalRecordService.disposalReceiveReport(query); |
| | | //已处置 |
| | | List<MwDisposalRecordReportVO> disposaledList = mwDisposalRecordService.disposalReportByType(query, 2); |
| | | List<MwDisposalRecordReportVO> disposaledList = mwDisposalHandleRecordService.disposalReport(query); |
| | | SimpleDateFormat sdf = new SimpleDateFormat(DateUtils.YYYY_MM_DD_HH_MM_SS); |
| | | switch (query.getDateType()) { |
| | | case 1: |
| | |
| | | SimpleDateFormat finalSdf = sdf; |
| | | //接收 |
| | | for (SysDictData sysDictData : wasteTypeList) { |
| | | departmentReportItemVO.getData().add(BigDecimal.ZERO); |
| | | if (CollUtils.isNotEmpty(receivedList)) { |
| | | BigDecimal totalWeight = receivedList.stream().filter(item -> item.getWasteType().equals(sysDictData.getDictCode()) && |
| | | finalSdf.format(item.getReceiveTime()).equals(date)).map(MwDisposalRecordReportVO::getWeight) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | departmentReportItemVO.getData().add(totalWeight); |
| | | } |
| | | BigDecimal totalWeight = receivedList.stream().filter(item -> item.getWasteType().equals(sysDictData.getDictCode()) && |
| | | finalSdf.format(item.getReceiveTime()).equals(date)).map(MwDisposalRecordReportVO::getWeight) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | departmentReportItemVO.getData().add(totalWeight); |
| | | } |
| | | //处置 |
| | | for (SysDictData sysDictData : wasteTypeList) { |
| | | departmentReportItemVO.getData().add(BigDecimal.ZERO); |
| | | if (CollUtils.isNotEmpty(disposaledList)) { |
| | | BigDecimal totalWeight = disposaledList.stream().filter(item -> item.getWasteType().equals(sysDictData.getDictCode()) && |
| | | finalSdf.format(item.getReceiveTime()).equals(date)).map(MwDisposalRecordReportVO::getWeight) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | departmentReportItemVO.getData().add(totalWeight); |
| | | } |
| | | BigDecimal totalWeight = disposaledList.stream().filter(item -> item.getWasteType().equals(sysDictData.getDictCode()) && |
| | | finalSdf.format(item.getDisposalTime()).equals(date)).map(MwDisposalRecordReportVO::getWeight) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | departmentReportItemVO.getData().add(totalWeight); |
| | | } |
| | | list.add(departmentReportItemVO); |
| | | } |
| | |
| | | headTitles.add(Lists.newArrayList("日期")); |
| | | wasteTypeList.forEach(item -> { |
| | | headTitles.add(Lists.newArrayList("医疗废物接收量(kg)", item.getDictLabel())); |
| | | headTitles.add(Lists.newArrayList("医疗废物接收量(kg)", item.getDictLabel())); |
| | | }); |
| | | wasteTypeList.forEach(item -> { |
| | | headTitles.add(Lists.newArrayList("医疗废物处置量(kg)", item.getDictLabel())); |
| | | headTitles.add(Lists.newArrayList("医疗废物处置量(kg)", item.getDictLabel())); |
| | | }); |
| | | return headTitles; |
| | | } |
| | | |
| | | /** |
| | | * 监管报表 |
| | | * |
| | | * @param query |
| | | * @return |
| | | */ |
| | | public DepartmentReportVO regulationReport(DisposalReportQuery query) { |
| | | DepartmentReportVO vo = new DepartmentReportVO(); |
| | | SysDepartment department = sysDepartmentService.getById(query.getDepartmentId()); |
| | | if (Objects.nonNull(department)) { |
| | | vo.setDepartmentName(department.getDepartmentName()); |
| | | } |
| | | //医废产生量 |
| | | List<MwCollectRecordVO> collectRecordList = mwCollectRecordService.getRegulationReportList(query); |
| | | //医废转移量 |
| | |
| | | if (CollUtils.isNotEmpty(wasteTypeList)) { |
| | | vo.setLegend(wasteTypeList.stream().map(SysDictData::getDictLabel).collect(Collectors.toList())); |
| | | vo.setList(new ArrayList<>()); |
| | | List<DepartmentReportItemVO> list = new ArrayList<>(); |
| | | for (String date : dateList) { |
| | | DepartmentReportItemVO departmentReportItemVO = new DepartmentReportItemVO(); |
| | | departmentReportItemVO.setName(date); |
| | | departmentReportItemVO.setData(new ArrayList<>()); |
| | | SimpleDateFormat finalSdf = sdf; |
| | | for (SysDictData sysDictData : wasteTypeList) { |
| | | collectRecordList.stream().filter(e -> e.getWasteType().equals(sysDictData.getDictCode()) && finalSdf.format(e.getCollectTime()).equals(date)).map(MwCollectRecordVO::getWeight).reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | } |
| | | } |
| | | } |
| | | BigDecimal weight = collectRecordList.stream().filter(e -> e.getWasteType().equals(sysDictData.getDictCode()) && |
| | | finalSdf.format(e.getCollectTime()).equals(date)).map(MwCollectRecordVO::getWeight).reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | departmentReportItemVO.getData().add(weight); |
| | | |
| | | return null; |
| | | } |
| | | for (SysDictData sysDictData : wasteTypeList) { |
| | | BigDecimal weight = checkoutRecordList.stream().filter(e -> e.getWasteType().equals(sysDictData.getDictCode()) && |
| | | finalSdf.format(e.getCheckoutTime()).equals(date)).map(MwCollectRecordVO::getWeight).reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | departmentReportItemVO.getData().add(weight); |
| | | } |
| | | for (SysDictData sysDictData : wasteTypeList) { |
| | | BigDecimal weight = disposalRecordList.stream().filter(e -> e.getWasteType().equals(sysDictData.getDictCode()) && |
| | | finalSdf.format(e.getCollectTime()).equals(date)).map(MwCollectRecordVO::getWeight).reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | departmentReportItemVO.getData().add(weight); |
| | | } |
| | | list.add(departmentReportItemVO); |
| | | } |
| | | vo.setList(list); |
| | | } |
| | | return vo; |
| | | } |
| | | |
| | | public void regulationReportExport(DisposalReportQuery query) throws IOException { |
| | | List<List<String>> head = regulationReportHead(query.getWasteTypeCodeList()); |
| | | System.out.println(JSONObject.toJSONString(head)); |
| | | // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman |
| | | response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); |
| | | response.setCharacterEncoding("utf-8"); |
| | | // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系 |
| | | String fileName = URLEncoder.encode("监管报表", "UTF-8").replaceAll("\\+", "%20"); |
| | | response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); |
| | | // 这里需要设置不关闭流 |
| | | FastExcel.write(response.getOutputStream()) |
| | | .head(head) |
| | | .autoCloseStream(Boolean.TRUE) |
| | | .sheet("监管报表") |
| | | .doWrite(getRegulationReportStaticsData(query)); |
| | | } |
| | | |
| | | /** |
| | | * 监管报表导出数据 |
| | | * |
| | | * @param query |
| | | * @return |
| | | */ |
| | | private List<List<Object>> getRegulationReportStaticsData(DisposalReportQuery query) { |
| | | DepartmentReportVO vo = regulationReport(query); |
| | | List<DepartmentReportItemVO> list = vo.getList(); |
| | | if (CollUtils.isNotEmpty(list)) { |
| | | List<List<Object>> result = new ArrayList<>(); |
| | | for (DepartmentReportItemVO departmentReportItemVO : list) { |
| | | List<Object> data = new ArrayList<>(); |
| | | data.add(departmentReportItemVO.getName()); |
| | | data.addAll(departmentReportItemVO.getData()); |
| | | result.add(data); |
| | | } |
| | | return result; |
| | | } |
| | | return CollUtils.emptyList(); |
| | | } |
| | | |
| | | /** |
| | | * 监管报表表头 |
| | | * |
| | | * @param wasteTypeCodeList |
| | | * @return |
| | | */ |
| | | private List<List<String>> regulationReportHead(List<Long> wasteTypeCodeList) { |
| | | //查询医废类型 |
| | | List<SysDictData> wasteTypeList = sysDictDataService.lambdaQuery().in(SysDictData::getDictCode, wasteTypeCodeList).list(); |
| | | List<List<String>> headTitles = Lists.newArrayList(); |
| | | headTitles.add(Lists.newArrayList("日期")); |
| | | wasteTypeList.forEach(item -> { |
| | | headTitles.add(Lists.newArrayList("医疗废物产生量(kg)", item.getDictLabel())); |
| | | }); |
| | | wasteTypeList.forEach(item -> { |
| | | headTitles.add(Lists.newArrayList("医疗废物转移量(kg)", item.getDictLabel())); |
| | | }); |
| | | wasteTypeList.forEach(item -> { |
| | | headTitles.add(Lists.newArrayList("医疗废物处置量(kg)", item.getDictLabel())); |
| | | }); |
| | | return headTitles; |
| | | } |
| | | } |