使用poi-tl实现多级表格渲染

word模板
在这里插入图片描述
生成结果
在这里插入图片描述
在这里插入图片描述

生成word表格代码

/**
     * 导出专家评分总结果表
     *
     * @param expertEvaSummaryFile 生成文件
     * @param subpackageInfo       分包信息
     * @param tenderBidEvaHeadVO   评审头信息
     */
    private void expertEvaSummary(File expertEvaSummaryFile, TenderProjectItemSubpackage subpackageInfo, TenderBidEvaHeadVO tenderBidEvaHeadVO) {
        InputStream inputStream = null;
        OutputStream outputStream = null;
        try {
            ConfigureBuilder builder = Configure.builder();
            builder.useSpringEL(false);
            //封装数据
            Map<String, Object> map = new HashMap<>();
            //渲染文本
            map.put("tenderProject", subpackageInfo.getTenderProject());//项目名称
            map.put("openBiddingTime", DateUtil.formatDateTime(subpackageInfo.getOpenBiddingTime()));//评标时间
            //评标信息ID
            String evaInfoId = tenderBidEvaHeadVO.getEvaInfoId();
            //查询所有环节信息
            List<TenderAttachEvaMethod> evaGroupList = tenderAttachEvaMethodService.lambdaQuery()
                    .eq(TenderAttachEvaMethod::getSubpackageId, subpackageInfo.getObjectID()).orderByAsc(TenderAttachEvaMethod::getOrderBy).list();
            Map<String, List<TenderAttachEvaMethod>> evaGroupMap = evaGroupList.stream().collect(Collectors.groupingBy(TenderAttachEvaMethod::getGroupTypeId));
            evaGroupMap.forEach((key, value) -> {
                if (TenderEvaGroupTypeEnum.REVIEW.getValue().equals(key)) {
                    //评审项
                    List<Map<String, Object>> reviewDynamic = new ArrayList<>();
                    for (TenderAttachEvaMethod evaMethod : value) {
                        Map<String, Object> reviewDynamicMap = getReviewSummaryDynamicMap(evaMethod, evaInfoId);
                        reviewDynamic.add(reviewDynamicMap);
                    }
                    map.put("reviewTable", reviewDynamic);
                } else if (TenderEvaGroupTypeEnum.SCORE.getValue().equals(key)) {
                    //评分项
                    List<Map<String, Object>> scoreDynamic = new ArrayList<>();
                    for (TenderAttachEvaMethod evaMethod : value) {
                        //查询评审任务数据
                        Map<String, Object> scoreDynamicMap = getScoreSummaryDynamicMap(evaMethod, evaInfoId);
                        scoreDynamic.add(scoreDynamicMap);
                    }
                    map.put("scoreTable", scoreDynamic);
                } else if (TenderEvaGroupTypeEnum.REVIEW_SCORE.getValue().equals(key)) {
                    //评审评分项
                    List<Map<String, Object>> reviewScoreDynamic = new ArrayList<>();
                    for (TenderAttachEvaMethod evaMethod : value) {
                        //查询评审任务数据
                        Map<String, Object> reviewScoreDynamicMap = getReviewScoreSummaryDynamicMap(evaMethod, evaInfoId);
                        reviewScoreDynamic.add(reviewScoreDynamicMap);
                    }
                    map.put("reviewScoreTable", reviewScoreDynamic);
                } else if (TenderEvaGroupTypeEnum.PRICE_REVIEW.getValue().equals(key)) {
                    //价格评分项
                    List<Map<String, Object>> priceReviewDynamic = new ArrayList<>();
                    for (TenderAttachEvaMethod evaMethod : value) {
                        //查询评审任务数据
                        Map<String, Object> priceReviewDynamicMap = getPriceReviewSummaryDynamicMap(evaMethod, evaInfoId);
                        priceReviewDynamic.add(priceReviewDynamicMap);
                    }
                    map.put("priceReviewTable", priceReviewDynamic);
                } else if (TenderEvaGroupTypeEnum.PRICE_COMPARISON.getValue().equals(key)) {
                    //价格比较项
                    //价格比较项
                    List<Map<String, Object>> priceComparisonDynamic = new ArrayList<>();
                    for (TenderAttachEvaMethod evaMethod : value) {
                        //查询评审任务数据
                        Map<String, Object> priceComparisonDynamicMap = getPriceComparisonSummaryDynamicMap(evaMethod, evaInfoId);
                        priceComparisonDynamic.add(priceComparisonDynamicMap);
                    }
                    map.put("priceComparisonTable", priceComparisonDynamic);
                }
            });
            inputStream = resourceLoader.getResource("classpath:static/template/评标结果-附件2_专家打分汇总.docx").getInputStream();
            XWPFTemplate template = XWPFTemplate.compile(Objects.requireNonNull(inputStream), builder.build()).render(map);
            outputStream = new FileOutputStream(expertEvaSummaryFile);
            template.write(outputStream);
        } catch (Exception e) {
            log.error("POI文件生成异常:{}", e);
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    log.error("IO异常:{}", e);
                }
            }
            if (outputStream != null) {
                try {
                    outputStream.close();
                } catch (IOException e) {
                    log.error("IO异常:{}", e);
                }
            }
        }
    }

生成评审类表格

private Map<String, Object> getReviewSummaryDynamicMap(TenderAttachEvaMethod evaMethod, String evaInfoId) {
        Map<String, Object> reviewDynamicMap = new HashMap<>();
        reviewDynamicMap.put("groupName", evaMethod.getGroupName());
        reviewDynamicMap.put("groupDesc", "有" + evaMethod.getVetoCondition().intValue() + "个不符合时否决投标。");
        //查询环节汇总结果
        SummaryEvaGroupResultVO summaryEvaGroupResultVO = tenderBidEvaHeadService.querySummaryEvaGroupResultByGroupId(evaMethod.getObjectID(), evaInfoId);
        TenderAttachEvaMethodVO evaluationGroup = summaryEvaGroupResultVO.getEvaluationGroup();
        List<TenderBidEvaSupplierVO> supplierList = summaryEvaGroupResultVO.getSupplierList();
        List<Map<String, Object>> resultList = summaryEvaGroupResultVO.getResultList();
        Map<Object, Map<String, Object>> resultListMap = resultList.stream().collect(Collectors.toMap(item -> item.get("id"), map -> map, (o1, o2) -> o1));
        List<TenderEvaJudgesVO> evaJudgesVOList = null;
        List<String> headerColList = new ArrayList<>();
        int headerColSize = 0;
        List<RowRenderData> rowList = new ArrayList<>();
        MergeCellRule.MergeCellRuleBuilder builder = MergeCellRule.builder();
        int groupStartRow = 1;
        int groupEndRow = 1;
        //列,开始行,结束行,此处合并第一行,和最后一行
        for (TenderBidEvaSupplierVO tenderBidEvaSupplierVO : supplierList) {
            List<TenderAttachEvaMethodReg> tenderAttachEvaMethodRegList = evaluationGroup.getTenderAttachEvaMethodRegList();
            //查询供应商各评委的打分情况
            EvaGroupRegulationResultVO evaGroupRegulationResultVO = tenderBidEvaHeadService
                    .querySupplierByEvaGroupId(evaMethod.getObjectID(), evaInfoId, tenderBidEvaSupplierVO.getSupplierAccount());
            if (evaJudgesVOList == null) {
                evaJudgesVOList = evaGroupRegulationResultVO.getEvaJudgesVOList();
                //表头信息
                headerColList.add("投标单位");
                headerColList.add("条例名称");
                headerColList.addAll(evaJudgesVOList.stream().map(item -> item.getJudgesName()).collect(Collectors.toList()));
                headerColList.add("评审结论");
                headerColList.add("汇总结论");
                headerColSize = headerColList.size();
                //表格头信息
                RowRenderData headerRenderData = Rows.of(headerColList.stream().toArray(String[]::new)).center().textBold().create();
                rowList.add(headerRenderData);
            }
            List<TenderBidEvaRegulationResult> evaRegulationResultList = evaGroupRegulationResultVO.getEvaRegulationResultList();
            Map<String, TenderBidEvaRegulationResult> evaRegulationResultListMap = evaRegulationResultList.stream().
                    collect(Collectors.toMap(item -> item.getRegulationId() + "_" + item.getJudgesNameId(), item -> item, (o1, o2) -> o1));
            for (TenderAttachEvaMethodReg tenderAttachEvaMethodReg : tenderAttachEvaMethodRegList) {
                List<String> cellList = ListUtil.toList(tenderBidEvaSupplierVO.getSupplierName(), tenderAttachEvaMethodReg.getRegulationName());
                //循环各评委信息,查看各评委,对应条例打分结果
                for (TenderEvaJudgesVO tenderEvaJudgesVO : evaJudgesVOList) {
                    TenderBidEvaRegulationResult regulationResult = evaRegulationResultListMap
                            .get(tenderAttachEvaMethodReg.getObjectID() + "_" + tenderEvaJudgesVO.getJudgesNameId());
                    String expertRegResult = regulationResult != null &&
                            StrUtil.isNotBlank(regulationResult.getReviewResult()) ? regulationResult.getReviewResult() : "/";
                    cellList.add(expertRegResult);
                }
                Map<String, Object> resultMap = resultListMap.get(tenderAttachEvaMethodReg.getObjectID());
                String result = (String) resultMap.get(tenderBidEvaSupplierVO.getSupplierAccount().concat("_result"));
                cellList.add(Constants.YES.equals(result) ? "符合" : "不符合");
                cellList.add(tenderBidEvaSupplierVO.getEvaReviewResult());
                rowList.add(Rows.of(cellList.stream().toArray(String[]::new)).center().create());
                groupEndRow++;
            }
            //结束行必须大于开始行,否则会异常
            if (groupStartRow != groupEndRow - 1) {
                builder.map(MergeCellRule.Grid.of(groupStartRow, 0), MergeCellRule.Grid.of(groupEndRow - 1, 0));
                builder.map(MergeCellRule.Grid.of(groupStartRow, headerColSize - 1), MergeCellRule.Grid.of(groupEndRow - 1, headerColSize - 1));
            }
            groupStartRow = groupEndRow;
        }
        //计算列宽
        int[] colWith = new int[headerColSize];
        //总宽度100%
        int totalWith = 100;
        //第一列序号,第二列投标单位名称宽度固定
        colWith[0] = 20;
        colWith[1] = 20;
        colWith[headerColSize - 2] = 10;
        colWith[headerColSize - 1] = 10;
        totalWith = totalWith - colWith[0] - colWith[1] - colWith[headerColSize - 2] - colWith[headerColSize - 1];
        //剩余列取平均值
        int otherWith = totalWith / (headerColSize - 4);
        for (int i = 2; i < headerColSize - 2; i++) {
            //为防止不满100,最后一列需要特殊处理
            if (i == headerColSize - 2 - 1) {
                colWith[i] = totalWith;
            } else {
                colWith[i] = otherWith;
                totalWith = totalWith - otherWith;
            }
        }
        TableRenderData tableRenderData = Tables.of(rowList.stream()
                .toArray(RowRenderData[]::new)).left().percentWidth("100%", colWith).mergeRule(builder.build()).create();
        //构建表格
        reviewDynamicMap.put("reviewTableItem", tableRenderData);
        return reviewDynamicMap;
    }

生成打分类表格

private Map<String, Object> getScoreSummaryDynamicMap(TenderAttachEvaMethod evaMethod, String evaInfoId) {
        Map<String, Object> scoreDynamicMap = new HashMap<>();
        scoreDynamicMap.put("groupName", evaMethod.getGroupName());//环节名称
        scoreDynamicMap.put("groupScoreTotal", evaMethod.getScore());//环节总分
        scoreDynamicMap.put("groupWeight", evaMethod.getWeights());//权重
        SummaryEvaGroupResultVO summaryEvaGroupResultVO = tenderBidEvaHeadService.querySummaryEvaGroupResultByGroupId(evaMethod.getObjectID(), evaInfoId);
        TenderAttachEvaMethodVO evaluationGroup = summaryEvaGroupResultVO.getEvaluationGroup();
        List<TenderBidEvaSupplierVO> supplierList = summaryEvaGroupResultVO.getSupplierList();
        List<Map<String, Object>> resultList = summaryEvaGroupResultVO.getResultList();
        //评委对应打分
        Map<Object, Map<String, Object>> resultListMap = resultList.stream().collect(Collectors.toMap(item -> item.get("id"), map -> map, (o1, o2) -> o1));
        List<TenderEvaJudgesVO> evaJudgesVOList = null;
        List<String> headerColList = new ArrayList<>();
        int headerColSize = 0;
        List<RowRenderData> rowList = new ArrayList<>();
        MergeCellRule.MergeCellRuleBuilder builder = MergeCellRule.builder();
        int groupStartRow = 1;
        int groupEndRow = 1;
        //列,开始行,结束行
        for (TenderBidEvaSupplierVO tenderBidEvaSupplierVO : supplierList) {
            List<TenderAttachEvaMethodReg> tenderAttachEvaMethodRegList = evaluationGroup.getTenderAttachEvaMethodRegList();
            //查询供应商各评委的打分情况
            EvaGroupRegulationResultVO evaGroupRegulationResultVO = tenderBidEvaHeadService
                    .querySupplierByEvaGroupId(evaMethod.getObjectID(), evaInfoId, tenderBidEvaSupplierVO.getSupplierAccount());
            if (evaJudgesVOList == null) {
                evaJudgesVOList = evaGroupRegulationResultVO.getEvaJudgesVOList();
                //表头信息
                headerColList.add("投标单位");
                headerColList.add("条例名称");
                headerColList.add("分值范围");
                headerColList.addAll(evaJudgesVOList.stream().map(item -> item.getJudgesName()).collect(Collectors.toList()));
                headerColSize = headerColList.size();
                //表格头信息
                RowRenderData headerRenderData = Rows.of(headerColList.stream().toArray(String[]::new)).center().textBold().create();
                rowList.add(headerRenderData);
            }
            List<TenderBidEvaRegulationResult> evaRegulationResultList = evaGroupRegulationResultVO.getEvaRegulationResultList();
            Map<String, TenderBidEvaRegulationResult> evaRegulationResultListMap = evaRegulationResultList.stream().
                    collect(Collectors.toMap(item -> item.getRegulationId() + "_" + item.getJudgesNameId(), item -> item, (o1, o2) -> o1));
            for (TenderAttachEvaMethodReg tenderAttachEvaMethodReg : tenderAttachEvaMethodRegList) {
                List<String> cellList = ListUtil.toList(
                        tenderBidEvaSupplierVO.getSupplierName(),
                        tenderAttachEvaMethodReg.getRegulationName(),
                        tenderAttachEvaMethodReg.getScoreRange()
                );
                //循环各评委信息,查看各评委,对应条例打分结果
                for (TenderEvaJudgesVO tenderEvaJudgesVO : evaJudgesVOList) {
                    TenderBidEvaRegulationResult regulationResult = evaRegulationResultListMap
                            .get(tenderAttachEvaMethodReg.getObjectID() + "_" + tenderEvaJudgesVO.getJudgesNameId());
                    String expertRegResult = regulationResult != null && regulationResult.getScore() != null ? MathUtil.doubleNullToZero(regulationResult.getScore()).stripTrailingZeros().toPlainString() : "/";
                    cellList.add(expertRegResult);
                }
                rowList.add(Rows.of(cellList.stream().toArray(String[]::new)).center().create());
                groupEndRow++;

            }
            //合计得分
            List<String> sumRegList = ListUtil.toList("", "合计", MathUtil.doubleNullToZero(evaluationGroup.getScore()).stripTrailingZeros().toPlainString());
            for (TenderEvaJudgesVO tenderEvaJudgesVO : evaJudgesVOList) {
                String totalScore = (String) resultListMap.get(tenderEvaJudgesVO.getJudgesNameId()).get(tenderBidEvaSupplierVO.getSupplierAccount() + "_totalScope");
                sumRegList.add(totalScore);
            }
            rowList.add(Rows.of(sumRegList.stream().toArray(String[]::new)).center().create());
            groupEndRow++;
            //结论,前3列固定,后面都补null
            List<String> resultRowList = ListUtil.toList("", "结论", tenderBidEvaSupplierVO.getTotalScore().stripTrailingZeros().toPlainString());
            for (int i = resultRowList.size(); i < headerColList.size(); i++) {
                resultRowList.add("");
            }
            rowList.add(Rows.of(resultRowList.stream().toArray(String[]::new)).center().create());
            groupEndRow++;
            builder.map(MergeCellRule.Grid.of(groupEndRow - 1, 2), MergeCellRule.Grid.of(groupEndRow - 1, headerColSize - 1));
            //权重
            List<String> weightRowList = ListUtil.toList("", "权重", tenderBidEvaSupplierVO.getWeights().stripTrailingZeros().toPlainString() + "%");
            for (int i = weightRowList.size(); i < headerColList.size(); i++) {
                weightRowList.add("");
            }
            rowList.add(Rows.of(weightRowList.stream().toArray(String[]::new)).center().create());
            groupEndRow++;
            builder.map(MergeCellRule.Grid.of(groupEndRow - 1, 2), MergeCellRule.Grid.of(groupEndRow - 1, headerColSize - 1));
            //实际得分
            List<String> realScoreRowList = ListUtil.toList("", "实际得分", tenderBidEvaSupplierVO.getWeightScore().stripTrailingZeros().toPlainString());
            for (int i = realScoreRowList.size(); i < headerColList.size(); i++) {
                realScoreRowList.add("");
            }
            rowList.add(Rows.of(realScoreRowList.stream().toArray(String[]::new)).center().create());
            groupEndRow++;
            builder.map(MergeCellRule.Grid.of(groupEndRow - 1, 2), MergeCellRule.Grid.of(groupEndRow - 1, headerColSize - 1));
            //第一列合并
            if (groupEndRow - 1 > groupStartRow) {
                builder.map(MergeCellRule.Grid.of(groupStartRow, 0), MergeCellRule.Grid.of(groupEndRow - 1, 0));
            }
            groupStartRow = groupEndRow;

        }
        //计算列宽
        int[] colWith = new int[headerColSize];
        //总宽度100%
        int totalWith = 100;
        //第一列序号,第二列投标单位名称宽度固定
        colWith[0] = 20;
        colWith[1] = 20;
        colWith[2] = 10;
        totalWith = totalWith - colWith[0] - colWith[1] - colWith[2];
        //剩余列取平均值
        int otherWith = totalWith / (headerColSize - 3);
        for (int i = 3; i < headerColSize; i++) {
            //为防止不满100,最后一列需要特殊处理
            if (i == headerColSize - 1) {
                colWith[i] = totalWith;
            } else {
                colWith[i] = otherWith;
                totalWith = totalWith - otherWith;
            }
        }
        TableRenderData tableRenderData = Tables.of(rowList.stream()
                .toArray(RowRenderData[]::new)).left().percentWidth("100%", colWith).mergeRule(builder.build()).create();
        //构建表格
        scoreDynamicMap.put("scoreTableItem", tableRenderData);
        return scoreDynamicMap;
    }

生成评审评分类表格

private Map<String, Object> getReviewScoreSummaryDynamicMap(TenderAttachEvaMethod evaMethod, String evaInfoId) {
        Map<String, Object> reviewScoreDynamicMap = new HashMap<>();
        reviewScoreDynamicMap.put("groupName", evaMethod.getGroupName());
        reviewScoreDynamicMap.put("groupScoreTotal", evaMethod.getScore());
        reviewScoreDynamicMap.put("groupWeight", evaMethod.getWeights());
        reviewScoreDynamicMap.put("groupDesc", "环节内投标单位有" + evaMethod.getReviewGradingRules().intValue() + "个条例不符合时" + evaMethod.getReviewGradingType() + "。");
        //查询环节汇总结果
        SummaryEvaGroupResultVO summaryEvaGroupResultVO = tenderBidEvaHeadService.querySummaryEvaGroupResultByGroupId(evaMethod.getObjectID(), evaInfoId);
        TenderAttachEvaMethodVO evaluationGroup = summaryEvaGroupResultVO.getEvaluationGroup();
        List<TenderBidEvaSupplierVO> supplierList = summaryEvaGroupResultVO.getSupplierList();
        List<Map<String, Object>> resultList = summaryEvaGroupResultVO.getResultList();
        Map<Object, Map<String, Object>> resultListMap = resultList.stream().collect(Collectors.toMap(item -> item.get("id"), map -> map, (o1, o2) -> o1));
        List<TenderEvaJudgesVO> evaJudgesVOList = null;
        List<String> headerColList = new ArrayList<>();
        int headerColSize = 0;
        List<RowRenderData> rowList = new ArrayList<>();
        MergeCellRule.MergeCellRuleBuilder builder = MergeCellRule.builder();
        int groupStartRow = 1;
        int groupEndRow = 1;
        //列,开始行,结束行,此处合并第一行,和最后一行
        for (TenderBidEvaSupplierVO tenderBidEvaSupplierVO : supplierList) {
            List<TenderAttachEvaMethodReg> tenderAttachEvaMethodRegList = evaluationGroup.getTenderAttachEvaMethodRegList();
            //查询供应商各评委的打分情况
            EvaGroupRegulationResultVO evaGroupRegulationResultVO = tenderBidEvaHeadService
                    .querySupplierByEvaGroupId(evaMethod.getObjectID(), evaInfoId, tenderBidEvaSupplierVO.getSupplierAccount());
            if (evaJudgesVOList == null) {
                evaJudgesVOList = evaGroupRegulationResultVO.getEvaJudgesVOList();
                //表头信息
                headerColList.add("投标单位");
                headerColList.add("条例名称");
                headerColList.addAll(evaJudgesVOList.stream().map(item -> item.getJudgesName()).collect(Collectors.toList()));
                headerColList.add("评审结论");
                headerColList.add("汇总结论");
                headerColList.add("得分");
                headerColList.add("权重");
                headerColList.add("最终得分");
                headerColSize = headerColList.size();
                //表格头信息
                RowRenderData headerRenderData = Rows.of(headerColList.stream().toArray(String[]::new)).center().textBold().create();
                rowList.add(headerRenderData);
            }
            List<TenderBidEvaRegulationResult> evaRegulationResultList = evaGroupRegulationResultVO.getEvaRegulationResultList();
            Map<String, TenderBidEvaRegulationResult> evaRegulationResultListMap = evaRegulationResultList.stream().
                    collect(Collectors.toMap(item -> item.getRegulationId() + "_" + item.getJudgesNameId(), item -> item, (o1, o2) -> o1));
            for (TenderAttachEvaMethodReg tenderAttachEvaMethodReg : tenderAttachEvaMethodRegList) {
                List<String> cellList = ListUtil.toList(tenderBidEvaSupplierVO.getSupplierName(), tenderAttachEvaMethodReg.getRegulationName());
                //循环各评委信息,查看各评委,对应条例打分结果
                for (TenderEvaJudgesVO tenderEvaJudgesVO : evaJudgesVOList) {
                    TenderBidEvaRegulationResult regulationResult = evaRegulationResultListMap
                            .get(tenderAttachEvaMethodReg.getObjectID() + "_" + tenderEvaJudgesVO.getJudgesNameId());
                    String expertRegResult = regulationResult != null &&
                            StrUtil.isNotBlank(regulationResult.getReviewResult()) ? regulationResult.getReviewResult() : "/";
                    cellList.add(expertRegResult);
                }
                Map<String, Object> resultMap = resultListMap.get(tenderAttachEvaMethodReg.getObjectID());
                String result = (String) resultMap.get(tenderBidEvaSupplierVO.getSupplierAccount().concat("_result"));
                cellList.add(Constants.YES.equals(result) ? "符合" : "不符合");
                cellList.add(tenderBidEvaSupplierVO.getEvaReviewResult());
                cellList.add(tenderBidEvaSupplierVO.getTotalScore().toString());
                cellList.add(tenderBidEvaSupplierVO.getWeights().toString() + "%");
                cellList.add(tenderBidEvaSupplierVO.getWeightScore().toString());
                rowList.add(Rows.of(cellList.stream().toArray(String[]::new)).center().create());
                groupEndRow++;
            }
            //结束行必须大于开始行,否则会报异常
            if (groupStartRow != groupEndRow - 1) {
                builder.map(MergeCellRule.Grid.of(groupStartRow, 0), MergeCellRule.Grid.of(groupEndRow - 1, 0));
                builder.map(MergeCellRule.Grid.of(groupStartRow, headerColSize - 1), MergeCellRule.Grid.of(groupEndRow - 1, headerColSize - 1));
                builder.map(MergeCellRule.Grid.of(groupStartRow, headerColSize - 2), MergeCellRule.Grid.of(groupEndRow - 1, headerColSize - 2));
                builder.map(MergeCellRule.Grid.of(groupStartRow, headerColSize - 3), MergeCellRule.Grid.of(groupEndRow - 1, headerColSize - 3));
                builder.map(MergeCellRule.Grid.of(groupStartRow, headerColSize - 4), MergeCellRule.Grid.of(groupEndRow - 1, headerColSize - 4));
            }
            groupStartRow = groupEndRow;
        }
        //计算列宽
        int[] colWith = new int[headerColSize];
        //总宽度100%
        int totalWith = 100;
        //第一列序号,第二列投标单位名称宽度固定
        colWith[0] = 20;
        colWith[1] = 20;
        colWith[headerColSize - 5] = 7;
        colWith[headerColSize - 4] = 7;
        colWith[headerColSize - 3] = 7;
        colWith[headerColSize - 2] = 7;
        colWith[headerColSize - 1] = 7;
        totalWith = totalWith - colWith[0] - colWith[1] - colWith[headerColSize - 1] -
                colWith[headerColSize - 2] - colWith[headerColSize - 3] - colWith[headerColSize - 4] - colWith[headerColSize - 5];
        //剩余列取平均值
        int otherWith = totalWith / (headerColSize - 7);
        for (int i = 2; i < headerColSize - 5; i++) {
            //为防止不满100,最后一列需要特殊处理
            if (i == headerColSize - 5 - 1) {
                colWith[i] = totalWith;
            } else {
                colWith[i] = otherWith;
                totalWith = totalWith - otherWith;
            }
        }
        TableRenderData tableRenderData = Tables.of(rowList.stream()
                .toArray(RowRenderData[]::new)).left().percentWidth("100%", colWith).mergeRule(builder.build()).create();
        //构建表格
        reviewScoreDynamicMap.put("reviewScoreTableItem", tableRenderData);
        return reviewScoreDynamicMap;
    }

生成价格评分类表格

private Map<String, Object> getPriceReviewSummaryDynamicMap(TenderAttachEvaMethod evaMethod, String evaInfoId) {
        Map<String, Object> priceReviewDynamicMap = new HashMap<>();
        //环节名称
        priceReviewDynamicMap.put("groupName", evaMethod.getGroupName());
        //总分
        priceReviewDynamicMap.put("groupScoreTotal", evaMethod.getScore());
        //权重
        priceReviewDynamicMap.put("groupWeight", evaMethod.getWeights());
        SummaryEvaGroupResultVO summaryEvaGroupResultVO = tenderBidEvaHeadService.querySummaryEvaGroupResultByGroupId(evaMethod.getObjectID(), evaInfoId);
        TenderAttachEvaMethodVO evaluationGroup = summaryEvaGroupResultVO.getEvaluationGroup();
        List<TenderBidEvaSupplierVO> supplierList = summaryEvaGroupResultVO.getSupplierList();
        //计算描述
        StringBuffer buffer = new StringBuffer();
        TenderAttachEvaMethodPrice tenderAttachEvaMethodPrice = evaluationGroup.getTenderAttachEvaMethodPrice();
        if (Constants.YES.equals(tenderAttachEvaMethodPrice.getCalTypeId())) {
            //人工计算
            buffer.append("人工计算:").append(StrUtil.nullToDefault(tenderAttachEvaMethodPrice.getCalArtificialRulesDesc(), ""));
        } else {
            buffer.append("系统计算:").append(tenderAttachEvaMethodPrice.getPricePointsCalFormula()).append(",");
            switch (tenderAttachEvaMethodPrice.getPricePointsCalFormulaId()) {
                case "operationMinPriceStrategy":
                    buffer.append("基准价得满分,得分=基准价/投标价*总分。");
                    break;
                case "operationMinPricePositiveDeviationStrategy":
                    buffer.append("基准价得满分,报价每高于基准价1%扣" + tenderAttachEvaMethodPrice.getAboveScore() + "分,最低扣至" + tenderAttachEvaMethodPrice.getLowestScore() + "分。");
                    break;
                case "operationStandardPriceStrategy":
                    buffer.append("基准价得满分,报价每高于基准价1%扣" + tenderAttachEvaMethodPrice.getAboveScore() +
                            "分,每低于基准价1%扣" + tenderAttachEvaMethodPrice.getBelowScore() + "分,最低扣至" + tenderAttachEvaMethodPrice.getLowestScore() + "分。");
                    break;
                case "operationMinRatePriceStrategy":
                    buffer.append("基准价得满分,得分=(1-(报价-基准价)/基准价) * 总分。");
                    break;
                default:
            }
        }
        priceReviewDynamicMap.put("groupDesc", buffer.toString());
        List<Map<String, Object>> resultList = summaryEvaGroupResultVO.getResultList();
        Map<Object, Map<String, Object>> resultListMap = resultList.stream().collect(Collectors.toMap(item -> item.get("id"), map -> map, (o1, o2) -> o1));
        List<TenderEvaJudgesVO> evaJudgesVOList = null;
        List<String> headerColList = new ArrayList<>();
        int headerColSize = 0;
        List<RowRenderData> rowList = new ArrayList<>();
        for (TenderBidEvaSupplierVO tenderBidEvaSupplierVO : supplierList) {
            //查询供应商各评委的打分情况
            EvaGroupRegulationResultVO evaGroupRegulationResultVO = tenderBidEvaHeadService
                    .querySupplierByEvaGroupId(evaMethod.getObjectID(), evaInfoId, tenderBidEvaSupplierVO.getSupplierAccount());
            if (evaJudgesVOList == null) {
                evaJudgesVOList = evaGroupRegulationResultVO.getEvaJudgesVOList();
                //表头信息
                headerColList.add("投标单位");
                headerColList.add("投标报价(元)");
                headerColList.addAll(evaJudgesVOList.stream().map(item -> item.getJudgesName()).collect(Collectors.toList()));
                headerColList.add("权重(%)");
                headerColList.add("实际得分");
                headerColSize = headerColList.size();
                //表格头信息
                RowRenderData headerRenderData = Rows.of(headerColList.stream().toArray(String[]::new)).center().textBold().create();
                rowList.add(headerRenderData);
            }
            List<TenderBidEvaRegulationResult> evaRegulationResultList = evaGroupRegulationResultVO.getEvaRegulationResultList();
            Map<String, TenderBidEvaRegulationResult> evaRegulationResultListMap = evaRegulationResultList.stream().
                    collect(Collectors.toMap(item -> item.getJudgesNameId(), item -> item, (o1, o2) -> o1));
            List<String> dataRowCellList = ListUtil.toList(tenderBidEvaSupplierVO.getSupplierName());
            for (int i = 0; i < evaJudgesVOList.size(); i++) {
                TenderEvaJudgesVO tenderEvaJudgesVO = evaJudgesVOList.get(i);
                String judgesNameId = tenderEvaJudgesVO.getJudgesNameId();
                TenderBidEvaRegulationResult regulationResult = evaRegulationResultListMap.get(judgesNameId);
                if (i == 0) {
                    dataRowCellList.add(MathUtil.doubleNullToZero(regulationResult.getQuote()).stripTrailingZeros().toPlainString());
                }
                dataRowCellList.add(MathUtil.doubleNullToZero(regulationResult.getScore()).stripTrailingZeros().toPlainString());
            }
            dataRowCellList.add(tenderBidEvaSupplierVO.getWeights() + "%");
            dataRowCellList.add(tenderBidEvaSupplierVO.getWeightScore().toString());
            RowRenderData renderData = Rows.of(dataRowCellList.stream().toArray(String[]::new)).center().create();
            rowList.add(renderData);
        }
        //计算列宽
        int[] colWith = new int[headerColSize];
        //总宽度100%
        int totalWith = 100;
        //第一列序号,第二列投标单位名称宽度固定
        colWith[0] = 30;
        colWith[1] = 25;
        colWith[headerColSize - 2] = 10;
        colWith[headerColSize - 1] = 10;
        totalWith = totalWith - colWith[0] - colWith[1] - colWith[headerColSize - 1] - colWith[headerColSize - 2];
        //剩余列取平均值
        int otherWith = totalWith / (headerColSize - 4);
        for (int i = 2; i < headerColSize - 2; i++) {
            //为防止不满100,最后一列需要特殊处理
            if (i == headerColSize - 2 - 1) {
                colWith[i] = totalWith;
            } else {
                colWith[i] = otherWith;
                totalWith = totalWith - otherWith;
            }
        }
        TableRenderData tableRenderData = Tables.of(rowList.stream().toArray(RowRenderData[]::new)).left().percentWidth("100%", colWith).create();
        //构建表格
        priceReviewDynamicMap.put("priceReviewTableItem", tableRenderData);
        return priceReviewDynamicMap;
    }

生成价格比较类表格

private Map<String, Object> getPriceComparisonSummaryDynamicMap(TenderAttachEvaMethod evaMethod, String evaInfoId) {
        Map<String, Object> priceComparisonDynamicMap = new HashMap<>();
        SummaryEvaGroupResultVO summaryEvaGroupResultVO = tenderBidEvaHeadService.querySummaryEvaGroupResultByGroupId(evaMethod.getObjectID(), evaInfoId);
        TenderAttachEvaMethodVO evaluationGroup = summaryEvaGroupResultVO.getEvaluationGroup();
        List<TenderBidEvaSupplierVO> supplierList = summaryEvaGroupResultVO.getSupplierList();
        TenderAttachEvaMethodPrice tenderAttachEvaMethodPrice = evaluationGroup.getTenderAttachEvaMethodPrice();
        priceComparisonDynamicMap.put("groupName", evaMethod.getGroupName());
        priceComparisonDynamicMap.put("groupDesc", tenderAttachEvaMethodPrice.getRankingRules());
        List<Map<String, Object>> resultList = summaryEvaGroupResultVO.getResultList();
        Map<Object, Map<String, Object>> resultListMap = resultList.stream().collect(Collectors.toMap(item -> item.get("id"), map -> map, (o1, o2) -> o1));
        List<TenderEvaJudgesVO> evaJudgesVOList = null;
        List<String> headerColList = new ArrayList<>();
        int headerColSize = 0;
        List<RowRenderData> rowList = new ArrayList<>();
        for (TenderBidEvaSupplierVO tenderBidEvaSupplierVO : supplierList) {
            //查询供应商各评委的打分情况
            EvaGroupRegulationResultVO evaGroupRegulationResultVO = tenderBidEvaHeadService
                    .querySupplierByEvaGroupId(evaMethod.getObjectID(), evaInfoId, tenderBidEvaSupplierVO.getSupplierAccount());
            if (evaJudgesVOList == null) {
                evaJudgesVOList = evaGroupRegulationResultVO.getEvaJudgesVOList();
                //表头信息
                headerColList.add("投标单位");
                headerColList.add("投标报价(元)");
                headerColList.addAll(evaJudgesVOList.stream().map(item -> item.getJudgesName()).collect(Collectors.toList()));
                headerColSize = headerColList.size();
                //表格头信息
                RowRenderData headerRenderData = Rows.of(headerColList.stream().toArray(String[]::new)).center().textBold().create();
                rowList.add(headerRenderData);
            }
            List<TenderBidEvaRegulationResult> evaRegulationResultList = evaGroupRegulationResultVO.getEvaRegulationResultList();
            Map<String, TenderBidEvaRegulationResult> evaRegulationResultListMap = evaRegulationResultList.stream().
                    collect(Collectors.toMap(item -> item.getJudgesNameId(), item -> item, (o1, o2) -> o1));
            List<String> dataRowCellList = ListUtil.toList(tenderBidEvaSupplierVO.getSupplierName());
            for (int i = 0; i < evaJudgesVOList.size(); i++) {
                TenderEvaJudgesVO tenderEvaJudgesVO = evaJudgesVOList.get(i);
                String judgesNameId = tenderEvaJudgesVO.getJudgesNameId();
                TenderBidEvaRegulationResult regulationResult = evaRegulationResultListMap.get(judgesNameId);
                if (i == 0) {
                    dataRowCellList.add(MathUtil.doubleNullToZero(regulationResult.getQuote()).stripTrailingZeros().toPlainString());
                }
                dataRowCellList.add(String.valueOf(regulationResult.getOrderBy().intValue()));
            }
            RowRenderData renderData = Rows.of(dataRowCellList.stream().toArray(String[]::new)).center().create();
            rowList.add(renderData);
        }
        //计算列宽
        int[] colWith = new int[headerColSize];
        //总宽度100%
        int totalWith = 100;
        //第一列序号,第二列投标单位名称宽度固定
        colWith[0] = 30;
        colWith[1] = 30;
        totalWith = totalWith - colWith[0] - colWith[1];
        //剩余列取平均值
        int otherWith = totalWith / (headerColSize - 2);
        for (int i = 2; i < headerColSize; i++) {
            //为防止不满100,最后一列需要特殊处理
            if (i == headerColSize - 1) {
                colWith[i] = totalWith;
            } else {
                colWith[i] = otherWith;
                totalWith = totalWith - otherWith;
            }
        }
        TableRenderData tableRenderData = Tables.of(rowList.stream().toArray(RowRenderData[]::new)).left().percentWidth("100%", colWith).create();
        //构建表格
        priceComparisonDynamicMap.put("priceComparisonTableItem", tableRenderData);
        return priceComparisonDynamicMap;
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值