本文介绍了在采购订单提交时,自动生成对应打印模板的PDF文件并绑定到附件面板的需求、思路、实现过程及效果。通过调用打印模板接口获取PDF文件路径,构建附件信息后上传至附件面板。实现步骤包括新增打印模板、编写插件代码以在事务开始前生成PDF并上传附件。最后展示了成功提交采购订单后,附件面板中生成PDF文件的效果,并提供了开发环境版本、注意事项及参考资料。
关键词:
打印模板、pdf文件、附件面板
一、需求
在采购订单(kded_oderbill)中,采购订单提交时,生成采购订单对应打印模板的pdf文件,并绑定到附件面板中。
二、思路与方案
首先,在提交操作的操作服务插件中,根据打印模板的接口https://vip.kingdee.com/article/267356926411609344获取到打印模板的pdf文件的路径。然后构建的附件面板的信息(包括附件修改事件、附件大小等),最后通过附件的上传接口,上传附件到单据的附件面板中。
三、实现过程
1、新增打印模板
在系统服务云-配置工具-打印配置-维护打印模板中新增一个采购订单打印模板。
2、代码实现过程
(1)新增插件OderOppSubmitServicePlugin,继承AbstractOperationServicePlugIn,注册到提交操作的服务插件中
(2)操作校验通过,开启了事务之后,还没有把数据提交到数据库之前的beginOperationTransaction事件中实现生成打印模板的pdf文件并绑定到附件面板的过程
public class OderOppSubmitServicePlugin extends AbstractOperationServicePlugIn { /** * 执行操作校验前,触发此事件 * 提交时,生成打印模板的pdf文件绑定到附件面板中 * @remark * */ @Override public void beginOperationTransaction(BeginOperationTransactionArgs e) { for (DynamicObject obj : e.getDataEntities()) { ArrayList<Object> pkIds = new ArrayList<>(); pkIds.add(obj.getPkValue()); // 打印任务 ArrayList<PrintTask> taskList = new ArrayList<>(); PrintTask printTask = new PrintTask(); DynamicObject queryOne = QueryServiceHelper.queryOne("bos_print_meta", "id", new QFilter[] { new QFilter("number", QCP.equals, "kded_oderbill_prtpl") }); if (queryOne == null) { return; } printTask.setTplId(queryOne.getString("id"));// 打印模板的id printTask.setPkIds(pkIds); printTask.setPrintType("billForm");// 打印对象的类型,是单据(billForm),报表(report),还是动态表单(dynamic) String formId = obj.getDataEntityType().getName(); printTask.setFormId(formId); taskList.add(printTask); // 打印作业 PrintWork printWork = new PrintWork(); printWork.setPrintLang("zh_CN");// 简体中文 printWork.setExpType("pdf"); printWork.setTaskList(taskList); //生成打印模板生成的pdf文件 PrtAttach doPrint = BosPrintServiceHelper.doPrint(printWork); List<AttachDetail> attachDetails = doPrint.getAttachDetail(); AttachDetail attachDetail = attachDetails.get(0); // 将文件保存到附件 List<Map<String, Object>> atts = new ArrayList<Map<String, Object>>(); atts.add(createAttInfo(attachDetail,obj.getString("billno"))); //上传附件到采购订单的附件面板中 AttachmentServiceHelper.upload(formId, obj.getPkValue(), "attachmentpanel", atts); } super.beginOperationTransaction(e); } //构建附件面板信息 private Map<String, Object> createAttInfo(AttachDetail attachDetail, String billno) { Map<String, Object> att = new HashMap<String, Object>(); // 当前时间戳 long time = new Date().getTime(); att.put("createdate", time); // lastModified:时间戳 att.put("lastModified", time); att.put("status", "success"); String attType = attachDetail.getFileType(); att.put("type", attType); // name:文件名(含文件格式) att.put("name", billno+attachDetail.getFileName()); FileService fs = FileServiceFactory.getAttachmentFileService(); InputStream in = fs.getInputStream(attachDetail.getFilePath()); try { // 附件大小 byte[] AttByte = InputStreamToByte(in); att.put("size", AttByte.length); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } StringBuffer uid = new StringBuffer(); uid.append("rc-upload-"); uid.append(time); uid.append("-"); uid.append("1"); att.put("uid", uid.toString()); att.put("url", attachDetail.getFilePath()); return att; } // ImputStream输入流转二进制数据 public byte[] InputStreamToByte(InputStream in) throws IOException { ByteArrayOutputStream bytestream = new ByteArrayOutputStream(); int ch; while ((ch = in.read()) != -1) { bytestream.write(ch); } byte imgdata[] = bytestream.toByteArray(); bytestream.close(); return imgdata; } }
四、效果图
点击提交,提交成功,可以看到附件已经生成并绑定采购订单的附件面板中。
五、开发环境版本
V5.0.002
六、注意事项
该打印模板是新的打印模板(苍穹4.0之后的版本)。
可以从下面的附件中导入打印模板的元数据到自己本地环境。
七、参考资料
提交时,如何实现生成打印模板的pdf文件绑定到附件面板中.z …(116.62KB)
推荐阅读
您的鼓励与嘉奖将成为创作者们前进的动力,如果觉得本文还不错,可以给予作者创作打赏哦!
请选择打赏金币数 *