From 0184bf471382f9328df9bdd47acf451e4e2c5cb0 Mon Sep 17 00:00:00 2001 From: mitao <2763622819@qq.com> Date: 星期三, 11 六月 2025 13:57:37 +0800 Subject: [PATCH] 达梦数据库及数据库脚本 --- medicalWaste-system/src/main/java/com/sinata/system/service/biz/StaticsService.java | 528 ++++++++++++++++++++++++++++++++++++++++++++------------- 1 files changed, 404 insertions(+), 124 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 index 2fa4733..4ae2a5c 100644 --- 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 @@ -3,10 +3,11 @@ 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.common.utils.StringUtils; +import com.sinata.system.config.AutoColumnWidthStrategy; +import com.sinata.system.config.CustomCellWriteHeightConfig; import com.sinata.system.domain.MwCollectRecord; import com.sinata.system.domain.MwWarningRecord; import com.sinata.system.domain.SysDepartment; @@ -20,28 +21,34 @@ 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.MwMicroEquipmentRecordItemService; import com.sinata.system.service.MwWarningRecordService; import com.sinata.system.service.SysDepartmentService; +import com.sinata.system.utils.ImageToBase64; +import com.sinata.system.utils.ImgUtils; import lombok.RequiredArgsConstructor; +import net.coobird.thumbnailator.Thumbnails; +import org.apache.commons.io.FilenameUtils; import org.springframework.stereotype.Service; +import javax.imageio.ImageIO; import javax.servlet.http.HttpServletResponse; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; 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.Objects; import java.util.stream.Collectors; /** @@ -59,20 +66,9 @@ private final HttpServletResponse response; private final MwDisposalRecordService mwDisposalRecordService; private final MwDisposalHandleRecordService mwDisposalHandleRecordService; + private final MwMicroEquipmentRecordItemService mwMicroEquipmentRecordItemService; - /** - * 机构分布-获取机构列表 - * - * @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; - } /** * 医院报表 @@ -82,6 +78,10 @@ */ 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)) { @@ -89,8 +89,8 @@ } 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()) + 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()) @@ -121,13 +121,19 @@ 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(); + && 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(); + && 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); @@ -135,16 +141,75 @@ 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("是"); + List<Long> collectIdList = collectRecordList.stream().filter(e -> finalSdf.format(e.getCollectTime()).equals(date)) + .map(MwCollectRecord::getId).collect(Collectors.toList()); + if (CollUtils.isNotEmpty(collectIdList)) { + List<MwWarningRecord> warningRecordList = mwWarningRecordService.lambdaQuery().in(MwWarningRecord::getWarningTargetId, collectIdList).list(); + if (CollUtils.isNotEmpty(warningRecordList)) { + itemVO.setOverTimeFlag("是"); + } } } list.add(itemVO); + } + // 添加合计行 + if (!list.isEmpty()) { + DepartmentReportItemVO totalRow = new DepartmentReportItemVO(); + totalRow.setName("合计"); + totalRow.setData(new ArrayList<>()); + + // 计算各类型废物的数量和重量总计 + for (SysDictDataVO sysDictDataVO : wasteTypeList) { + BigDecimal totalTypeCount = BigDecimal.ZERO; + BigDecimal totalTypeWeight = BigDecimal.ZERO; + + for (DepartmentReportItemVO item : list) { + // 每种废物类型占用两列(数量和重量) + int index = wasteTypeList.indexOf(sysDictDataVO); + int countIndex = index * 2; + int weightIndex = countIndex + 1; + + if (countIndex < item.getData().size()) { + totalTypeCount = totalTypeCount.add(item.getData().get(countIndex)); + } + if (weightIndex < item.getData().size()) { + totalTypeWeight = totalTypeWeight.add(item.getData().get(weightIndex)); + } + } + + totalRow.getData().add(totalTypeCount); + totalRow.getData().add(totalTypeWeight); + } + + // 计算总的数量和重量 + BigDecimal finalTotalCount = BigDecimal.ZERO; + BigDecimal finalTotalWeight = BigDecimal.ZERO; + + for (DepartmentReportItemVO item : list) { + int totalCountIndex = item.getData().size() - 2; + int totalWeightIndex = item.getData().size() - 1; + + if (totalCountIndex >= 0 && totalWeightIndex >= 0) { + finalTotalCount = finalTotalCount.add(item.getData().get(totalCountIndex)); + finalTotalWeight = finalTotalWeight.add(item.getData().get(totalWeightIndex)); + } + } + + totalRow.getData().add(finalTotalCount); + totalRow.getData().add(finalTotalWeight); + + // 超时标记处理(如果有) + if (query.getDateType().equals(1)) { + totalRow.setOverTimeFlag("—"); // 合计行不显示超时标记 + } + + // 将合计行添加到列表开头 + list.add(0, totalRow); } vo.setList(list); return vo; @@ -157,7 +222,7 @@ * @return */ public void hospitalReportExport(HospitalReportQuery query) throws IOException { - List<List<String>> head = hospitalReportHead(); + List<List<String>> head = hospitalReportHead(query); System.out.println(JSONObject.toJSONString(head)); // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); @@ -169,6 +234,7 @@ FastExcel.write(response.getOutputStream()) .head(head) .autoCloseStream(Boolean.TRUE) + .registerWriteHandler(new AutoColumnWidthStrategy()) .sheet("医院报表") .doWrite(getHospitalReportStaticsData(query)); } @@ -202,16 +268,27 @@ * * @return */ - private List<List<String>> hospitalReportHead() { + private List<List<String>> hospitalReportHead(HospitalReportQuery query) { + SysDepartment department = sysDepartmentService.getById(query.getDepartmentId()); List<SysDictDataVO> wasteTypeList = sysDictDataService.medicalWasteTypeList(); List<List<String>> headTitles = Lists.newArrayList(); - headTitles.add(Lists.newArrayList("日期", "日期")); + String title = ""; + if (Objects.nonNull(department)) { + title = department.getDepartmentName() + "医废报表"; + } else { + title = "医废报表"; + } + headTitles.add(Lists.newArrayList(title, "日期", "日期")); + String finalTitle = title; wasteTypeList.forEach(item -> { - headTitles.add(Lists.newArrayList(item.getDictLabel(), "数量")); - headTitles.add(Lists.newArrayList(item.getDictLabel(), "重量(KG)")); + headTitles.add(Lists.newArrayList(finalTitle, item.getDictLabel(), "数量")); + headTitles.add(Lists.newArrayList(finalTitle, item.getDictLabel(), "重量(kg)")); }); - headTitles.add(Lists.newArrayList("小计", "数量")); - headTitles.add(Lists.newArrayList("小计", "重量(KG)")); + headTitles.add(Lists.newArrayList(title, "小计", "数量")); + headTitles.add(Lists.newArrayList(title, "小计", "重量(kg)")); + if (query.getDateType().equals(1)) { + headTitles.add(Lists.newArrayList(title, "是否超时", "是否超时")); + } return headTitles; } @@ -224,56 +301,116 @@ 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)) { - 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); + //List<SysDepartment> hospitalList = sysDepartmentService.lambdaQuery().likeRight(SysDepartment::getTreeCode, region.getTreeCode()).eq(SysDepartment::getOrgType, DepartmentEnum.MEDICAL_INSTITUTION.getCode()).list(); + List<TransformVO> checkoutRecordVOList = mwCheckoutRecordService.getCheckoutRecordList(query, region.getTreeCode()); + //查询医废类型 + List<SysDictDataVO> sysDictDataVOS = sysDictDataService.medicalWasteTypeListByDictCode(query.getWasteTypeCodeList()); + if (CollUtils.isNotEmpty(sysDictDataVOS)) { + vo.setLegend(sysDictDataVOS.stream().map(SysDictDataVO::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 departmentReportItemVO = new DepartmentReportItemVO(); + departmentReportItemVO.setName(transformVO.getHospitalName()); + departmentReportItemVO.setData(new ArrayList<>()); + departmentReportItemVO.setDriverName(transformVO.getDriverName()); + departmentReportItemVO.setHospitalSignature(ImageToBase64.convertImageToBase64(transformVO.getHospitalSignature())); + departmentReportItemVO.setHospitalSignatureUrl(transformVO.getHospitalSignature()); + departmentReportItemVO.setHandoverTime(transformVO.getCheckoutTime()); + for (SysDictDataVO sysDictData : sysDictDataVOS) { + 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); + list.add(departmentReportItemVO); + } + + // 添加合计行 + if (!list.isEmpty()) { + DepartmentReportItemVO totalRow = new DepartmentReportItemVO(); + totalRow.setName("合计"); + totalRow.setData(new ArrayList<>()); + + // 计算各类型废物的总数量和总重量 + for (SysDictDataVO sysDictData : sysDictDataVOS) { + BigDecimal totalTypeCount = BigDecimal.ZERO; + BigDecimal totalTypeWeight = BigDecimal.ZERO; + + for (DepartmentReportItemVO item : list) { + // 获取当前废物类型在数据列表中的索引位置 + int index = sysDictDataVOS.indexOf(sysDictData); + // 每个废物类型占两列(数量和重量) + int countIndex = index * 2; + int weightIndex = countIndex + 1; + + if (countIndex < item.getData().size()) { + totalTypeCount = totalTypeCount.add(item.getData().get(countIndex)); } - departmentReportItemVO.getData().add(totalCount); - departmentReportItemVO.getData().add(totalWeight); + if (weightIndex < item.getData().size()) { + totalTypeWeight = totalTypeWeight.add(item.getData().get(weightIndex)); + } + } + + totalRow.getData().add(totalTypeCount); + totalRow.getData().add(totalTypeWeight); + } + + // 计算总的数量和重量 + BigDecimal finalTotalCount = BigDecimal.ZERO; + BigDecimal finalTotalWeight = BigDecimal.ZERO; + + for (DepartmentReportItemVO item : list) { + int totalCountIndex = item.getData().size() - 2; + int totalWeightIndex = item.getData().size() - 1; + + if (totalCountIndex >= 0 && totalWeightIndex >= 0) { + finalTotalCount = finalTotalCount.add(item.getData().get(totalCountIndex)); + finalTotalWeight = finalTotalWeight.add(item.getData().get(totalWeightIndex)); } } + + totalRow.getData().add(finalTotalCount); + totalRow.getData().add(finalTotalWeight); + + // 将合计行添加到列表开头 + list.add(0, totalRow); } + + vo.setList(list); } return vo; } public void transformListExport(TransformQuery query) throws IOException { - List<List<String>> head = transformReportHead(query.getWasteTypeCodeList()); + List<List<String>> head = transformReportHead(query); 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"); + 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("转运联单") + .registerWriteHandler(new AutoColumnWidthStrategy()) + .registerWriteHandler(new CustomCellWriteHeightConfig()) + .sheet("转移联单") .doWrite(getTransformReportStaticsData(query)); } @@ -293,7 +430,19 @@ List<Object> data = new ArrayList<>(); data.add(departmentReportItemVO.getName()); data.addAll(departmentReportItemVO.getData()); - data.add(new URL(departmentReportItemVO.getHospitalSignature())); + if (StringUtils.isNotBlank(departmentReportItemVO.getHospitalSignatureUrl())) { + try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { + //获取文件后缀 + String extension = FilenameUtils.getExtension(departmentReportItemVO.getHospitalSignatureUrl()); + BufferedImage originalImage = ImageIO.read(ImgUtils.getFileByHttpURL(departmentReportItemVO.getHospitalSignatureUrl())); + Thumbnails.of(originalImage).scale(0.8).rotate(270).outputFormat(extension).toOutputStream(outputStream); + data.add(outputStream.toByteArray()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } else { + data.add(""); + } data.add(departmentReportItemVO.getDriverName()); data.add(departmentReportItemVO.getHandoverTime()); result.add(data); @@ -302,27 +451,34 @@ } return CollUtils.emptyList(); } - /** * 转运联单导出表头 * - * @param wasteTypeCodeList + * @param query * @return */ - private List<List<String>> transformReportHead(List<Long> wasteTypeCodeList) { + private List<List<String>> transformReportHead(TransformQuery query) { //查询医废类型 - List<SysDictData> wasteTypeList = sysDictDataService.lambdaQuery().in(SysDictData::getDictCode, wasteTypeCodeList).list(); + List<SysDictDataVO> sysDictDataVOS = sysDictDataService.medicalWasteTypeListByDictCode(query.getWasteTypeCodeList()); + SysDepartment department = sysDepartmentService.getById(query.getDepartmentId()); + String title = ""; + if (Objects.nonNull(department)) { + title = department.getDepartmentName() + "转移联单"; + } else { + title = "转移联单"; + } 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(title, "医院名称", "医院名称")); + String finalTitle = title; + sysDictDataVOS.forEach(item -> { + headTitles.add(Lists.newArrayList(finalTitle, item.getDictLabel(), "数量")); + headTitles.add(Lists.newArrayList(finalTitle, item.getDictLabel(), "重量(kg)")); }); - headTitles.add(Lists.newArrayList("小计", "数量")); - headTitles.add(Lists.newArrayList("小计", "重量(KG)")); - headTitles.add(Lists.newArrayList("机构人员签字", "机构人员签字")); - headTitles.add(Lists.newArrayList("运输人员签字", "运输人员签字")); - headTitles.add(Lists.newArrayList("交接时间", "交接时间")); + headTitles.add(Lists.newArrayList(title, "小计", "数量")); + headTitles.add(Lists.newArrayList(title, "小计", "重量(kg)")); + headTitles.add(Lists.newArrayList(title, "机构人员签字", "机构人员签字")); + headTitles.add(Lists.newArrayList(title, "运输人员签字", "运输人员签字")); + headTitles.add(Lists.newArrayList(title, "交接时间", "交接时间")); return headTitles; } @@ -334,6 +490,10 @@ */ 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.disposalReceiveReport(query); //已处置 @@ -352,9 +512,9 @@ } 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()); + List<SysDictDataVO> sysDictDataVOS = sysDictDataService.medicalWasteTypeListByDictCode(query.getWasteTypeCodeList()); + if (CollUtils.isNotEmpty(sysDictDataVOS)) { + List<String> legend = sysDictDataVOS.stream().map(SysDictDataVO::getDictLabel).collect(Collectors.toList()); vo.setLegend(legend); List<DepartmentReportItemVO> list = new ArrayList<>(); for (String date : dateList) { @@ -363,27 +523,62 @@ 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 (SysDictDataVO sysDictData : sysDictDataVOS) { + 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); - } + for (SysDictDataVO sysDictData : sysDictDataVOS) { + 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); } + + // 添加合计行 + if (!list.isEmpty()) { + DepartmentReportItemVO totalRow = new DepartmentReportItemVO(); + totalRow.setName("合计"); + totalRow.setData(new ArrayList<>()); + + // 计算各类型废物的接收总量 + for (SysDictDataVO sysDictData : sysDictDataVOS) { + BigDecimal totalReceiveWeight = BigDecimal.ZERO; + + for (DepartmentReportItemVO item : list) { + int index = sysDictDataVOS.indexOf(sysDictData); + if (index < item.getData().size()) { + totalReceiveWeight = totalReceiveWeight.add(item.getData().get(index)); + } + } + + totalRow.getData().add(totalReceiveWeight); + } + + // 计算各类型废物的处置总量 + for (SysDictDataVO sysDictData : sysDictDataVOS) { + BigDecimal totalDisposalWeight = BigDecimal.ZERO; + + for (DepartmentReportItemVO item : list) { + int index = sysDictDataVOS.indexOf(sysDictData); + // 处置量数据在接收量数据之后,所以索引需要加上sysDictDataVOS的大小 + int disposalIndex = sysDictDataVOS.size() + index; + if (disposalIndex < item.getData().size()) { + totalDisposalWeight = totalDisposalWeight.add(item.getData().get(disposalIndex)); + } + } + + totalRow.getData().add(totalDisposalWeight); + } + + // 将合计行添加到列表开头 + list.add(0, totalRow); + } + vo.setList(list); } return vo; @@ -396,7 +591,7 @@ * @throws IOException */ public void disposalReportExport(DisposalReportQuery query) throws IOException { - List<List<String>> head = disposalReportHead(query.getWasteTypeCodeList()); + List<List<String>> head = disposalReportHead(query); System.out.println(JSONObject.toJSONString(head)); // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); @@ -408,6 +603,7 @@ FastExcel.write(response.getOutputStream()) .head(head) .autoCloseStream(Boolean.TRUE) + .registerWriteHandler(new AutoColumnWidthStrategy()) .sheet("处置报表") .doWrite(getDisposalReportStaticsData(query)); } @@ -437,19 +633,28 @@ /** * 处置报表表头 * - * @param wasteTypeCodeList + * @param query * @return */ - private List<List<String>> disposalReportHead(List<Long> wasteTypeCodeList) { + private List<List<String>> disposalReportHead(DisposalReportQuery query) { //查询医废类型 - List<SysDictData> wasteTypeList = sysDictDataService.lambdaQuery().in(SysDictData::getDictCode, wasteTypeCodeList).list(); + List<SysDictDataVO> sysDictDataVOS = sysDictDataService.medicalWasteTypeListByDictCode(query.getWasteTypeCodeList()); + SysDepartment department = sysDepartmentService.getById(query.getDepartmentId()); + String title = ""; + if (Objects.nonNull(department)) { + title = department.getDepartmentName() + "处置报表"; + } else { + title = "处置报表"; + } List<List<String>> headTitles = Lists.newArrayList(); - headTitles.add(Lists.newArrayList("日期")); - wasteTypeList.forEach(item -> { - headTitles.add(Lists.newArrayList("医疗废物接收量(kg)", item.getDictLabel())); + headTitles.add(Lists.newArrayList(title, "日期", "日期")); + String finalTitle = title; + sysDictDataVOS.forEach(item -> { + headTitles.add(Lists.newArrayList(finalTitle, "医疗废物接收量(kg)", item.getDictLabel())); }); - wasteTypeList.forEach(item -> { - headTitles.add(Lists.newArrayList("医疗废物处置量(kg)", item.getDictLabel())); + String finalTitle1 = title; + sysDictDataVOS.forEach(item -> { + headTitles.add(Lists.newArrayList(finalTitle1, "医疗废物处置量(kg)", item.getDictLabel())); }); return headTitles; } @@ -462,12 +667,18 @@ */ 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); //医废转移量 List<MwCollectRecordVO> checkoutRecordList = mwCheckoutRecordService.getRegulationReportList(query); //医废处置量 List<MwCollectRecordVO> disposalRecordList = mwDisposalRecordService.getRegulationReportList(query); + List<MwCollectRecordVO> microEquipmentRecordList = mwMicroEquipmentRecordItemService.getRegulationReportList(query); + disposalRecordList.addAll(microEquipmentRecordList); SimpleDateFormat sdf = new SimpleDateFormat(DateUtils.YYYY_MM_DD_HH_MM_SS); switch (query.getDateType()) { case 1: @@ -482,40 +693,98 @@ } 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())); + List<SysDictDataVO> sysDictDataVOS = sysDictDataService.medicalWasteTypeListByDictCode(query.getWasteTypeCodeList()); + if (CollUtils.isNotEmpty(sysDictDataVOS)) { + vo.setLegend(sysDictDataVOS.stream().map(SysDictDataVO::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) { + for (SysDictDataVO sysDictData : sysDictDataVOS) { 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) { + for (SysDictDataVO sysDictData : sysDictDataVOS) { 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); + finalSdf.format(e.getCheckoutTime()).equals(date)).map(MwCollectRecordVO::getWeight).reduce(BigDecimal.ZERO, BigDecimal::add); departmentReportItemVO.getData().add(weight); } - for (SysDictData sysDictData : wasteTypeList) { + for (SysDictDataVO sysDictData : sysDictDataVOS) { 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); } + + // 添加合计行 + if (!list.isEmpty()) { + DepartmentReportItemVO totalRow = new DepartmentReportItemVO(); + totalRow.setName("合计"); + totalRow.setData(new ArrayList<>()); + + // 计算各类型废物的产生总量 + for (SysDictDataVO sysDictData : sysDictDataVOS) { + BigDecimal totalGeneratedWeight = BigDecimal.ZERO; + + for (DepartmentReportItemVO item : list) { + int index = sysDictDataVOS.indexOf(sysDictData); + if (index < item.getData().size()) { + totalGeneratedWeight = totalGeneratedWeight.add(item.getData().get(index)); + } + } + + totalRow.getData().add(totalGeneratedWeight); + } + + // 计算各类型废物的转移总量 + for (SysDictDataVO sysDictData : sysDictDataVOS) { + BigDecimal totalTransferWeight = BigDecimal.ZERO; + + for (DepartmentReportItemVO item : list) { + int index = sysDictDataVOS.indexOf(sysDictData); + // 转移量数据在产生量数据之后,所以索引需要加上wasteTypeList的大小 + int transferIndex = sysDictDataVOS.size() + index; + if (transferIndex < item.getData().size()) { + totalTransferWeight = totalTransferWeight.add(item.getData().get(transferIndex)); + } + } + + totalRow.getData().add(totalTransferWeight); + } + + // 计算各类型废物的处置总量 + for (SysDictDataVO sysDictData : sysDictDataVOS) { + BigDecimal totalDisposalWeight = BigDecimal.ZERO; + + for (DepartmentReportItemVO item : list) { + int index = sysDictDataVOS.indexOf(sysDictData); + // 处置量数据在产生量和转移量数据之后,所以索引需要加上wasteTypeList的大小的2倍 + int disposalIndex = sysDictDataVOS.size() * 2 + index; + if (disposalIndex < item.getData().size()) { + totalDisposalWeight = totalDisposalWeight.add(item.getData().get(disposalIndex)); + } + } + + totalRow.getData().add(totalDisposalWeight); + } + + // 将合计行添加到列表开头 + list.add(0, totalRow); + } + vo.setList(list); } return vo; } public void regulationReportExport(DisposalReportQuery query) throws IOException { - List<List<String>> head = regulationReportHead(query.getWasteTypeCodeList()); + List<List<String>> head = regulationReportHead(query); System.out.println(JSONObject.toJSONString(head)); // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); @@ -527,6 +796,7 @@ FastExcel.write(response.getOutputStream()) .head(head) .autoCloseStream(Boolean.TRUE) + .registerWriteHandler(new AutoColumnWidthStrategy()) .sheet("监管报表") .doWrite(getRegulationReportStaticsData(query)); } @@ -556,22 +826,32 @@ /** * 监管报表表头 * - * @param wasteTypeCodeList + * @param query * @return */ - private List<List<String>> regulationReportHead(List<Long> wasteTypeCodeList) { + private List<List<String>> regulationReportHead(DisposalReportQuery query) { //查询医废类型 - List<SysDictData> wasteTypeList = sysDictDataService.lambdaQuery().in(SysDictData::getDictCode, wasteTypeCodeList).list(); + List<SysDictDataVO> sysDictDataVOS = sysDictDataService.medicalWasteTypeListByDictCode(query.getWasteTypeCodeList()); + SysDepartment department = sysDepartmentService.getById(query.getDepartmentId()); + String title = ""; + if (Objects.nonNull(department)) { + title = department.getDepartmentName() + "监管报表"; + } else { + title = "监管报表"; + } List<List<String>> headTitles = Lists.newArrayList(); - headTitles.add(Lists.newArrayList("日期")); - wasteTypeList.forEach(item -> { - headTitles.add(Lists.newArrayList("医疗废物产生量(kg)", item.getDictLabel())); + headTitles.add(Lists.newArrayList(title, "日期", "日期")); + String finalTitle = title; + sysDictDataVOS.forEach(item -> { + headTitles.add(Lists.newArrayList(finalTitle, "医疗废物产生量(kg)", item.getDictLabel())); }); - wasteTypeList.forEach(item -> { - headTitles.add(Lists.newArrayList("医疗废物转移量(kg)", item.getDictLabel())); + String finalTitle1 = title; + sysDictDataVOS.forEach(item -> { + headTitles.add(Lists.newArrayList(finalTitle1, "医疗废物转移量(kg)", item.getDictLabel())); }); - wasteTypeList.forEach(item -> { - headTitles.add(Lists.newArrayList("医疗废物处置量(kg)", item.getDictLabel())); + String finalTitle2 = title; + sysDictDataVOS.forEach(item -> { + headTitles.add(Lists.newArrayList(finalTitle2, "医疗废物处置量(kg)", item.getDictLabel())); }); return headTitles; } -- Gitblit v1.7.1