mitao
2024-12-28 ec4cb43f83fdfdab0acc7c59b84ec91fff49d3f6
medicalWaste-system/src/main/java/com/sinata/system/service/biz/StaticsService.java
@@ -25,6 +25,7 @@
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;
@@ -57,6 +58,7 @@
    private final MwWarningRecordService mwWarningRecordService;
    private final HttpServletResponse response;
    private final MwDisposalRecordService mwDisposalRecordService;
    private final MwDisposalHandleRecordService mwDisposalHandleRecordService;
    /**
     * 机构分布-获取机构列表
@@ -333,9 +335,9 @@
    public DepartmentReportVO disposalReport(DisposalReportQuery query) {
        DepartmentReportVO vo = new DepartmentReportVO();
        //已接收
        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:
@@ -445,15 +447,19 @@
        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();
        //医废产生量
@@ -480,16 +486,93 @@
        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) {
                    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.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;
    }
}