From 7dff38876f582644ae95daad8ac21d4f57088d56 Mon Sep 17 00:00:00 2001 From: luodangjia <luodangjia> Date: 星期六, 28 十二月 2024 16:19:58 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- medicalWaste-system/src/main/java/com/sinata/system/service/biz/StaticsService.java | 578 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 578 insertions(+), 0 deletions(-) diff --git a/medicalWaste-system/src/main/java/com/sinata/system/service/biz/StaticsService.java b/medicalWaste-system/src/main/java/com/sinata/system/service/biz/StaticsService.java new file mode 100644 index 0000000..2fa4733 --- /dev/null +++ b/medicalWaste-system/src/main/java/com/sinata/system/service/biz/StaticsService.java @@ -0,0 +1,578 @@ +package com.sinata.system.service.biz; + +import cn.idev.excel.FastExcel; +import com.alibaba.fastjson2.JSONObject; +import com.google.common.collect.Lists; +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.domain.query.DisposalReportQuery; +import com.sinata.system.domain.query.HospitalReportQuery; +import com.sinata.system.domain.query.TransformQuery; +import com.sinata.system.domain.vo.DepartmentReportItemVO; +import com.sinata.system.domain.vo.DepartmentReportVO; +import com.sinata.system.domain.vo.MwCollectRecordVO; +import com.sinata.system.domain.vo.MwDisposalRecordReportVO; +import com.sinata.system.domain.vo.MwMedicalWasteBoxVO; +import com.sinata.system.domain.vo.SysDictDataVO; +import com.sinata.system.domain.vo.TransformVO; +import com.sinata.system.enums.DepartmentEnum; +import com.sinata.system.enums.MedicalWasteStatusEnum; +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 lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLEncoder; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author mitao + * @date 2024/12/25 + */ +@Service +@RequiredArgsConstructor +public class StaticsService { + private final SysDepartmentService sysDepartmentService; + private final MwCollectRecordService mwCollectRecordService; + private final MwCheckoutRecordService mwCheckoutRecordService; + private final ISysDictDataService sysDictDataService; + 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; + } + + /** + * 医院报表 + * + * @param query + * @return + */ + public DepartmentReportVO hospitalReport(HospitalReportQuery query) { + DepartmentReportVO vo = new DepartmentReportVO(); + List<SysDictDataVO> wasteTypeList = sysDictDataService.medicalWasteTypeList(); + + if (CollUtils.isEmpty(wasteTypeList)) { + return vo; + } + vo.setLegend(wasteTypeList.stream().map(SysDictDataVO::getDictLabel).collect(Collectors.toList())); + vo.getLegend().add("小计"); + List<MwCollectRecord> collectRecordList = mwCollectRecordService.lambdaQuery().eq(query.getReportType().equals(1), MwCollectRecord::getStatus, MedicalWasteStatusEnum.TEMPORARILY_STORED.getCode()) + .ne(query.getReportType().equals(2), MwCollectRecord::getStatus, MedicalWasteStatusEnum.TEMPORARILY_STORED.getCode()) + .eq(MwCollectRecord::getDepartmentId, query.getDepartmentId()) + .between(query.getReportType().equals(1), MwCollectRecord::getCollectTime, query.getStartTime(), query.getEndTime()) + .between(query.getReportType().equals(2), MwCollectRecord::getCheckoutTime, query.getStartTime(), query.getEndTime()) + .orderByDesc(MwCollectRecord::getCollectTime).list(); + SimpleDateFormat sdf = new SimpleDateFormat(DateUtils.YYYY_MM_DD_HH_MM_SS); + switch (query.getDateType()) { + case 1: + sdf = new SimpleDateFormat(DateUtils.YYYY_MM_DD); + break; + case 2: + sdf = new SimpleDateFormat(DateUtils.YYYY_MM); + break; + case 3: + sdf = new SimpleDateFormat(DateUtils.YYYY); + break; + } + List<String> dateList = DateUtils.getDayBetween(query.getStartTime(), query.getEndTime(), query.getDateType()); + List<DepartmentReportItemVO> list = new ArrayList<>(); + for (String date : dateList) { + DepartmentReportItemVO itemVO = new DepartmentReportItemVO(); + itemVO.setName(date); + itemVO.setData(new ArrayList<>()); + BigDecimal totalCount = BigDecimal.ZERO; + BigDecimal totalWeight = BigDecimal.ZERO; + SimpleDateFormat finalSdf = sdf; + for (SysDictDataVO sysDictData : wasteTypeList) { + BigDecimal weight = BigDecimal.ZERO; + BigDecimal currentCount = BigDecimal.ZERO; + if (query.getReportType().equals(1)) { + weight = collectRecordList.stream().filter(e -> e.getWasteType().equals(sysDictData.getDictCode()) + && finalSdf.format(e.getCollectTime()).equals(date)).map(MwCollectRecord::getWeight).reduce(BigDecimal::add).orElse(BigDecimal.ZERO).setScale(2, RoundingMode.HALF_UP); + long count = collectRecordList.stream().filter(e -> e.getWasteType().equals(sysDictData.getDictCode()) && finalSdf.format(e.getCollectTime()).equals(date)).count(); + currentCount = BigDecimal.valueOf(count); + } else { + weight = collectRecordList.stream().filter(e -> e.getWasteType().equals(sysDictData.getDictCode()) + && finalSdf.format(e.getCheckoutTime()).equals(date)).map(MwCollectRecord::getWeight).reduce(BigDecimal::add).orElse(BigDecimal.ZERO).setScale(2, RoundingMode.HALF_UP); + long count = collectRecordList.stream().filter(e -> e.getWasteType().equals(sysDictData.getDictCode()) && finalSdf.format(e.getCheckoutTime()).equals(date)).count(); + currentCount = BigDecimal.valueOf(count); + } + itemVO.getData().add(currentCount); + itemVO.getData().add(weight); + totalCount = totalCount.add(currentCount); + totalWeight = totalWeight.add(weight); + } + //查询预警记录判断是否超时 + 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("是"); + } + } + list.add(itemVO); + } + vo.setList(list); + return vo; + } + + /** + * 医院报表-导出 + * + * @param query + * @return + */ + public void hospitalReportExport(HospitalReportQuery query) throws IOException { + List<List<String>> head = hospitalReportHead(); + 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(getHospitalReportStaticsData(query)); + } + + /** + * 封装Excel导出数据 + * + * @param query + * @return + */ + private List<List<Object>> getHospitalReportStaticsData(HospitalReportQuery query) { + DepartmentReportVO vo = hospitalReport(query); + if (CollUtils.isNotEmpty(vo.getList())) { + List<List<Object>> result = new ArrayList<>(); + for (DepartmentReportItemVO departmentReportItemVO : vo.getList()) { + List<Object> data = new ArrayList<>(); + data.add(departmentReportItemVO.getName()); + data.addAll(departmentReportItemVO.getData()); + if (query.getDateType().equals(1)) { + data.add(departmentReportItemVO.getOverTimeFlag()); + } + result.add(data); + } + return result; + } + return CollUtils.emptyList(); + } + + /** + * 医院报表表头 + * + * @return + */ + private List<List<String>> hospitalReportHead() { + List<SysDictDataVO> wasteTypeList = sysDictDataService.medicalWasteTypeList(); + List<List<String>> headTitles = Lists.newArrayList(); + headTitles.add(Lists.newArrayList("日期", "日期")); + wasteTypeList.forEach(item -> { + headTitles.add(Lists.newArrayList(item.getDictLabel(), "数量")); + headTitles.add(Lists.newArrayList(item.getDictLabel(), "重量(KG)")); + }); + headTitles.add(Lists.newArrayList("小计", "数量")); + headTitles.add(Lists.newArrayList("小计", "重量(KG)")); + return headTitles; + } + + /** + * 转移联单 + * + * @param query + * @return + */ + public DepartmentReportVO transformList(TransformQuery query) { + DepartmentReportVO vo = new DepartmentReportVO(); + SysDepartment department = sysDepartmentService.getById(query.getDepartmentId()); + 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)) { + List<TransformVO> checkoutRecordVOList = mwCheckoutRecordService.getCheckoutRecordList(query, region.getTreeCode()); + if (CollUtils.isNotEmpty(checkoutRecordVOList)) { + //查询医废类型 + List<SysDictData> wasteTypeList = sysDictDataService.lambdaQuery().in(SysDictData::getDictCode, query.getWasteTypeCodeList()).list(); + if (CollUtils.isNotEmpty(wasteTypeList)) { + vo.setLegend(wasteTypeList.stream().map(SysDictData::getDictLabel).collect(Collectors.toList())); + vo.getLegend().add("小计"); + for (TransformVO transformVO : checkoutRecordVOList) { + BigDecimal totalCount = BigDecimal.ZERO; + BigDecimal totalWeight = BigDecimal.ZERO; + DepartmentReportItemVO departmentReportItemVO = new DepartmentReportItemVO(); + departmentReportItemVO.setName(transformVO.getHospitalName()); + departmentReportItemVO.setData(new ArrayList<>()); + departmentReportItemVO.setDriverName(transformVO.getDriverName()); + departmentReportItemVO.setHospitalSignature(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()); + BigDecimal weight = transformVO.getCollectRecordList().stream().filter(item -> item.getWasteType().equals(sysDictData.getDictCode())).map(MwMedicalWasteBoxVO::getTotalWeight).reduce(BigDecimal.ZERO, BigDecimal::add); + departmentReportItemVO.getData().add(count); + departmentReportItemVO.getData().add(weight); + totalCount = totalCount.add(count); + totalWeight = totalWeight.add(weight); + } + departmentReportItemVO.getData().add(totalCount); + departmentReportItemVO.getData().add(totalWeight); + } + } + } + } + return vo; + } + + public void transformListExport(TransformQuery query) throws IOException { + List<List<String>> head = transformReportHead(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(getTransformReportStaticsData(query)); + } + + /** + * 转运联单导出数据 + * + * @param query + * @return + * @throws MalformedURLException + */ + private List<List<Object>> getTransformReportStaticsData(TransformQuery query) throws MalformedURLException { + DepartmentReportVO vo = transformList(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()); + data.add(new URL(departmentReportItemVO.getHospitalSignature())); + data.add(departmentReportItemVO.getDriverName()); + data.add(departmentReportItemVO.getHandoverTime()); + result.add(data); + } + return result; + } + return CollUtils.emptyList(); + } + + /** + * 转运联单导出表头 + * + * @param wasteTypeCodeList + * @return + */ + private List<List<String>> transformReportHead(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(item.getDictLabel(), "数量")); + headTitles.add(Lists.newArrayList(item.getDictLabel(), "重量(KG)")); + }); + headTitles.add(Lists.newArrayList("小计", "数量")); + headTitles.add(Lists.newArrayList("小计", "重量(KG)")); + headTitles.add(Lists.newArrayList("机构人员签字", "机构人员签字")); + headTitles.add(Lists.newArrayList("运输人员签字", "运输人员签字")); + headTitles.add(Lists.newArrayList("交接时间", "交接时间")); + return headTitles; + } + + /** + * 处置报表 + * + * @param query + * @return + */ + public DepartmentReportVO disposalReport(DisposalReportQuery query) { + DepartmentReportVO vo = new DepartmentReportVO(); + //已接收 + List<MwDisposalRecordReportVO> receivedList = mwDisposalRecordService.disposalReceiveReport(query); + //已处置 + List<MwDisposalRecordReportVO> disposaledList = mwDisposalHandleRecordService.disposalReport(query); + SimpleDateFormat sdf = new SimpleDateFormat(DateUtils.YYYY_MM_DD_HH_MM_SS); + switch (query.getDateType()) { + case 1: + sdf = new SimpleDateFormat(DateUtils.YYYY_MM_DD); + break; + case 2: + sdf = new SimpleDateFormat(DateUtils.YYYY_MM); + break; + case 3: + sdf = new SimpleDateFormat(DateUtils.YYYY); + break; + } + List<String> dateList = DateUtils.getDayBetween(query.getStartTime(), query.getEndTime(), query.getDateType()); + //查询医废类型 + List<SysDictData> wasteTypeList = sysDictDataService.lambdaQuery().in(SysDictData::getDictCode, query.getWasteTypeCodeList()).list(); + if (CollUtils.isNotEmpty(wasteTypeList)) { + List<String> legend = wasteTypeList.stream().map(SysDictData::getDictLabel).collect(Collectors.toList()); + vo.setLegend(legend); + 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) { + 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); + } + } + //处置 + 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); + } + } + list.add(departmentReportItemVO); + } + vo.setList(list); + } + return vo; + } + + /** + * 处置报表导出 + * + * @param query + * @throws IOException + */ + public void disposalReportExport(DisposalReportQuery query) throws IOException { + List<List<String>> head = disposalReportHead(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(getDisposalReportStaticsData(query)); + } + + /** + * 处置报表统计数据 + * + * @param query + * @return + */ + private List<List<Object>> getDisposalReportStaticsData(DisposalReportQuery query) { + DepartmentReportVO vo = disposalReport(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>> disposalReportHead(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())); + }); + return headTitles; + } + + /** + * 监管报表 + * + * @param query + * @return + */ + public DepartmentReportVO regulationReport(DisposalReportQuery query) { + DepartmentReportVO vo = new DepartmentReportVO(); + //医废产生量 + List<MwCollectRecordVO> collectRecordList = mwCollectRecordService.getRegulationReportList(query); + //医废转移量 + List<MwCollectRecordVO> checkoutRecordList = mwCheckoutRecordService.getRegulationReportList(query); + //医废处置量 + List<MwCollectRecordVO> disposalRecordList = mwDisposalRecordService.getRegulationReportList(query); + SimpleDateFormat sdf = new SimpleDateFormat(DateUtils.YYYY_MM_DD_HH_MM_SS); + switch (query.getDateType()) { + case 1: + sdf = new SimpleDateFormat(DateUtils.YYYY_MM_DD); + break; + case 2: + sdf = new SimpleDateFormat(DateUtils.YYYY_MM); + break; + case 3: + sdf = new SimpleDateFormat(DateUtils.YYYY); + break; + } + List<String> dateList = DateUtils.getDayBetween(query.getStartTime(), query.getEndTime(), query.getDateType()); + //查询医废类型 + List<SysDictData> wasteTypeList = sysDictDataService.lambdaQuery().in(SysDictData::getDictCode, query.getWasteTypeCodeList()).list(); + 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); + SimpleDateFormat finalSdf = sdf; + for (SysDictData sysDictData : wasteTypeList) { + 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); + + } + for (SysDictData sysDictData : wasteTypeList) { + BigDecimal weight = checkoutRecordList.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); + } + 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; + } +} -- Gitblit v1.7.1