二开实现单据调用打印模板生成文件工具类原创
金蝶云社区-宜城小子
宜城小子
2人赞赏了该文章 149次浏览 未经作者许可,禁止转载编辑于2024年08月24日 11:26:41
summary-icon摘要由AI智能服务提供

文本主要介绍了业务场景为实现单据文件归档而转换为影像文件的过程,并提出了具体的实现思路,即通过调用后台打印服务并使用默认或指定的打印模板将单据生成为PDF文件。为实现该功能,提供了一个名为`CosmicPrinter`的Java工具类,该类支持指定单据ID的打印及通过设定过滤规则进行批量打印。`CosmicPrinter`类中包含了对单据实体名、打印模板编码、语言、文件类型等属性的定义及操作方法,并实现了添加打印对象主键值、创建打印任务与作业以及执行打印操作的功能。

业务场景:将单据输出为影像文件,用于文件归档;

实现思路:调用后台打印服务,根据默认或指定的打印模板将单据生成PDF文件;

组件功能:支持指定单据ID打印及通过按设置过滤规则批量打印


主要代码:

1、单据打印输出文件工具类:CosmicPrinter.java

public class CosmicPrinter {
    /**
     * 日志输出对象
     */
    private final Log logger = LogFactory.getLog(CosmicPrinter.class);
    /**
     * 打印对象元数据标识
     */
    private final String entityName;
    /**
     * 打印元数据类型。默认为 单据
     */
    private CosmicPrintEntityType entityType = CosmicPrintEntityType.Bill;
    /**
     * 打印模板编码
     * 如果未指定打印模板编码,则优先使用默认打印模板,未设置默认打印模板则使用最近创建的模板
     */
    private String templateNumber;
    /**
     * 语言。默认为简体中文
     */
    private String language = "zh_CN";
    /**
     * 输入文件类型。默认为 pdf
     */
    private String fileType = "pdf";

    /**
     * 打印对象主键值集合
     */
    private final Set<Long> pkValues;
    /**
     * 打印对象过滤条件
     */
    private QFilter filter;

    public CosmicPrinter(String entityName) {
        this.pkValues = new HashSet<>();
        this.entityName = entityName;
    }

    public CosmicPrinter(String entityName, String templateNumber) {
        this.pkValues = new HashSet<>();
        this.entityName = entityName;
        this.templateNumber = templateNumber;
    }

    public void setTemplateNumber(String templateNumber) {
        this.templateNumber = templateNumber;
    }

    public void setLanguage(String language) {
        this.language = language;
    }

    public void setFileType(String fileType) {
        this.fileType = fileType;
    }

    public void setEntityType(CosmicPrintEntityType entityType) {
        this.entityType = entityType;
    }

    public void setFilter(QFilter filter) {
        this.filter = filter;
    }

    /**
     * 新增打印对象主键值
     *
     * @param pkValue 打印对象主键值
     */
    public void addPkValue(long pkValue) {
        this.pkValues.add(pkValue);
    }

    /**
     * 批量新增打印对象主键值
     *
     * @param pkValues 打印对象主键值集合
     */
    public void addPkValue(Set<Long> pkValues) {
        this.pkValues.addAll(pkValues);
    }

    /**
     * 将打印元数据类型枚举转换为对应标识字符串
     *
     * @return
     */
    private String getPrintType() {
        switch (this.entityType) {
            case Report:
                return "report";
            case Dynamic:
                return "dynamic";
            default:
                return "billForm";
        }
    }

    /**
     * 获取全部打印对象主键值集合
     *
     * @return 全部打印对象主键值集合
     */
    private void initAllPrintObjectId() {
        if (this.filter != null) {
            DynamicObjectCollection sources = QueryServiceHelper.query(this.entityName, "id", this.filter.toArray());
            if (sources != null && sources.size() > 0) {
                sources.forEach(p -> {
                    this.pkValues.add(p.getLong("id"));
                });
            }
        }
    }

    /**
     * 创建打印任务
     *
     * @param printTemplateId 打印模板ID
     * @param pkValue         打印对象主键值
     * @return 打印任务
     */
    private PrintTask createPrintTask(String printTemplateId, Object pkValue) {
        ArrayList<Object> printPkValues = new ArrayList<>();
        printPkValues.add(pkValue);

        PrintTask printTask = new PrintTask();
        printTask.setTplId(printTemplateId);
        printTask.setPkIds(printPkValues);
        printTask.setPrintType(this.getPrintType());
        printTask.setFormId(this.entityName);
        return printTask;
    }

    /**
     * 创建打印作业
     *
     * @param printTemplateId 打印模板ID
     * @param pkValue         打印对象主键值
     * @return 打印作业
     */
    private PrintWork createPrintWork(String printTemplateId, Object pkValue) {
        PrintTask printTask = this.createPrintTask(printTemplateId, pkValue);

        ArrayList<PrintTask> taskList = new ArrayList<>();
        taskList.add(printTask);

        PrintWork printWork = new PrintWork();
        printWork.setPrintLang(this.language);
        printWork.setExpType(this.fileType);
        printWork.setTaskList(taskList);
        return printWork;
    }

    /**
     * 执行单据打印输出
     *
     * @return 打印结果
     */
    public CosmicPrintResult execute() {
        CosmicPrintResult result = new CosmicPrintResult();
        logger.info("打印作业开始。 " + CosmicPublicUtil.dateFormat(new Date(), "yyyy-MM-dd HH:mm:ss"));
        try {
            // 获取打印模板ID
            String printTemplateId = CosmicPublicUtil.getPrintTemplateId(this.entityName, this.templateNumber);
            if (StringUtils.isEmpty(printTemplateId)) {
                throw new KDBizException("单据【" + entityName + "】未查询到可用的打印模板。");
            }
            // 初始化打印对象的ID集合
            this.initAllPrintObjectId();
            if (this.pkValues.size() == 0) {
                throw new KDBizException("打印对象主键未指定或未查询到符合条件的数据。");
            }
            // 执行打印
            for (long pkValue : this.pkValues) {
                PrintWork printWork = this.createPrintWork(printTemplateId, pkValue);
                PrtAttach doPrint = BosPrintServiceHelper.doPrint(printWork);
                List<PrtAttach.AttachDetail> printDetails = doPrint.getAttachDetail();
                if (printDetails != null && printDetails.size() > 0) {
                    PrtAttach.AttachDetail printDetail = printDetails.get(0);
                    CosmicPrintResult.PrintItem item = new CosmicPrintResult.PrintItem();
                    item.setBillType(this.entityType);
                    item.setEntityName(this.entityName);
                    item.setPkValue(pkValue);
                    item.setFileName(printDetail.getFileName());
                    item.setFilePath(printDetail.getFilePath());
                    item.setFileType(printDetail.getFileType());
                    result.getItems().add(item);
                }
            }
            int printCount = result.getItems().size();
            result.setSuccess(printCount > 0);
            result.setMessage("打印作业完成,共输出" + printCount + "个文件。");
            logger.info("打印作业完成,共输出" + printCount + "个文件。" + CosmicPublicUtil.dateFormat(new Date(), "yyyy-MM-dd HH:mm:ss"));
        } catch (Exception ex) {
            logger.error("打印作业执行失败。" + CosmicPublicUtil.dateFormat(new Date(), "yyyy-MM-dd HH:mm:ss"), ex);
            result.setSuccess(false);
            result.setMessage("打印作业执行失败:" + ex.getMessage());
        }
        return result;
    }
}

2、获取打印模板ID方法

/**
 * 获取打印模板ID
 * 如果未指定打印模板编码,则优先使用默认打印模板,未设置默认打印模板则使用最近创建的模板
 *
 * @param billEntityName 单据实体标识
 * @param templateNumber 打印模板标识
 * @return 打印模板ID
 */
public static String getPrintTemplateId(String billEntityName, String templateNumber) {
    String printTemplateId = "";
    try {
        String defaultTemplateId = "";
        if (StringUtils.isEmpty(templateNumber)) {
            QFilter defFilter = new QFilter("billformid", QCP.equals, billEntityName)
                    .and("enable", QCP.equals, 1)
                    .and("isdefault", QCP.equals, true);
            DynamicObjectCollection defaultTemplate = QueryServiceHelper.query("bos_manageprinttpl", "printtplid", defFilter.toArray(), null, 1);
            if (defaultTemplate != null && defaultTemplate.size() > 0) {
                defaultTemplateId = defaultTemplate.get(0).getString("printtplid");
            }
        }
        QFilter filter = new QFilter("formid", QCP.equals, billEntityName)
                .and("enable", QCP.equals, 1)
                .and("status", QCP.equals, "C");
        if (!StringUtils.isEmpty(defaultTemplateId)) {
            filter = filter.and("id", QCP.not_equals, defaultTemplateId);
        } else if (!StringUtils.isEmpty(templateNumber)) {
            filter = filter.and("number", QCP.equals, templateNumber);
        }
        DynamicObjectCollection templateData = QueryServiceHelper.query("bos_print_meta", "id", filter.toArray(), "createtime desc", 1);
        if (templateData != null && templateData.size() > 0) {
            printTemplateId = templateData.get(0).getString("id");
        }
    } catch (Exception ex) {
        logger.error(ex.getMessage(), ex);
        throw new KDBizException("查询对象["+ billEntityName +"]打印模板ID失败:" + ex.getMessage());
    }
    return printTemplateId;
}


3、打印元数据类型枚举:CosmicPrintEntityType.java

4、返回结果对象:CosmicPrintResult.java

5、调用示例

QFilter filter = new QFilter("billno", "=", "WHCGHT202408200001")
        .or("billno", "=", "WHCGHT202408150001");
CosmicPrinter printer = new CosmicPrinter("conm_purcontract", "conm_purcontract_prtpl_def");
printer.addPkValue(2017566495969648640L);
printer.setFilter(filter);
CosmicPrintResult result = printer.execute();
System.out.println(result.getMessage());


赞 2