本文介绍了在苍穹平台上实现采购订单单据附件分享到其他单据附件面板的功能。由于苍穹平台本身没有内置附件分享功能,因此通过添加自定义按钮、创建动态表单以及编写相关代码来实现。具体步骤包括:为采购订单的附件面板添加自定义分享按钮,点击按钮后弹出动态表单供用户选择分享的目标单据,并在动态表单中根据选择的实体对象显示对应的业务单据列表,最后通过点击“确认分享”按钮实现附件的分享。整个实现过程涉及到了自定义插件的编写、动态表单的创建与配置以及事件监听等关键技术点。
关键词:附件面板、自定义按钮,附件分享,内嵌页面获取列表控件,动态表单
一、需求
在采购订单单据上的附件面板上,对于已上传的附件,可以实现分享附件到其他单据的附件面板上,例如采购申请单生成采购订单之后,可以选择是否把附件分享给对应单号的采购申请单
二、思路与方案
苍穹平台本身没有内置附件分享的功能,可以通过给附件面板添加自定义按钮,点击自定义按钮,弹出一个动态表单,动态表单可以选择需要分享的目标单据,选择完之后点击确认分享按钮实现附件分享的功能。
三、实现过程
1、添加自定义按钮
为采购订单的附件面板添加自定义按钮(效果如预览、下载)
public class ShareAttementPlugin extends AbstractBillPlugIn implements AttachmentOperaClickListener { private static final String KEY_ATTACHMENTPENAL = "attachmentpanel"; @Override public void afterBindData(EventObject e) { AttachmentPanel panel = this.getControl(KEY_ATTACHMENTPENAL); List<AttachBtnOption> btns = new ArrayList<AttachBtnOption>(); btns.add(new AttachBtnOption("attoption_share", new LocaleString("附件分享"))); panel.addAttachOperaBtn(btns); super.afterBindData(e); } }
2、创建动态表单
作为选择分享的目标单页面,包括(主实体对象列表和业务点单据列表)。动态表单中添加两个flex面板,上面的flex面板中插入单据列表控件并绑定主实体对象,下面的flex面板是用代码显示对应主实体对象业务单据列表的位置(如下第四点)
3、弹出附件分享的动态表单
@Override public void registerListener(EventObject e) { //监听附件面板的自定义按钮 AttachmentPanel att = this.getView().getControl(KEY_ATTACHMENTPENAL); att.addOperaClickListener(this); super.registerListener(e); } @Override public void attachmentOperaClick(AttachmentOperaClickEvent e) { AttachmentPanel att = (AttachmentPanel) e.getSource(); Map<String, String> attinfo = (Map<String, String>) e.getAttachmentInfo(); List<Map<String, Object>> atts = att.getAttachmentData(); if (e.getOperaKey().equals("attoption_share")) { for (Map<String, Object> map : atts) { String uid = (String) map.get("uid"); if (uid.equals(attinfo.get("uid"))) { FormShowParameter fsp = new FormShowParameter(); // 设置弹出页面的表单标识 fsp.setFormId("kded_shareattchment"); fsp.setCustomParams(map); // 设置弹出页面标题 fsp.setCaption("附件分享-选择实体对象"); // 设置弹出页面打开方式,支持模态,新标签等 fsp.getOpenStyle().setShowType(ShowType.MainNewTabPage); // 弹出页面对象赋值给父页面 this.getView().showForm(fsp); break; } } } AttachmentOperaClickListener.super.attachmentOperaClick(e); }
4、根据选择的实体对象下,选择指定单号的单据进行附件分享
(1)动态表单插件中,添加监听事件
public void registerListener(EventObject e) { // 添加实体对象列表控件选择行操作的监听 BillList billList = this.getView().getControl("kded_billlistap"); billList.addListRowClickListener(this); // 添加“确认分享”按钮的监听事件 Button btnok = this.getView().getControl("btnok"); btnok.addClickListener(this); super.registerListener(e); }
(2)选择主实体对象(例如采购申请单、采购订单),并根据主实体对象,在本页面显示对应实体的业务单据列表
@Override public void listRowClick(ListRowClickEvent evt) { //获取选泽行 ListSelectedRowCollection listSelectedRowCollection = evt.getListSelectedRowCollection(); int size = listSelectedRowCollection.size(); if (size > 1) { this.getView().showMessage("只能选择一个实体对象"); evt.setCancel(true); return; } else if (size == 0) { return; } ListSelectedRow currentListSelectedRow = evt.getCurrentListSelectedRow(); String entityNumber = currentListSelectedRow.getNumber(); ListShowParameter listShowParameter = new ListShowParameter(); // 保存子页面id到缓存,方便后面获取子页面 this.getPageCache().put("childPageId", listShowParameter.getPageId()); listShowParameter.setFormId("bos_list"); listShowParameter.setBillFormId(entityNumber); listShowParameter.getOpenStyle().setShowType(ShowType.InContainer); // 指定单据列表控件所在位置 listShowParameter.getOpenStyle().setTargetKey("kded_flexpanelap2"); // 自定义参数 StyleCss css = new StyleCss(); css.setHeight("500px"); listShowParameter.getOpenStyle().setInlineStyleCss(css); this.getView().showForm(listShowParameter); ListRowClickListener.super.listRowClick(evt); }
(3)点击“确认分享”按钮时,附件分享绑定到指定业务单据
@Override public void click(EventObject evt) { if (evt.getSource() instanceof Button) { Button op = (Button) evt.getSource(); if (op.getOperationKey().equals("toshare")) { FormShowParameter fsp = this.getView().getFormShowParameter(); // 附件信息 Map<String, Object> attParams = fsp.getCustomParams(); ArrayList<Map<String, Object>> targetattachment = new ArrayList<>(); // 当前时间戳 long time =new Date().getTime(); attParams.put("createdate",time); // lastModified:时间戳 attParams.put("lastModified",time); targetattachment.add(attParams); // 获取子页面 IFormView childView = this.getView().getView(this.getPageCache().get("childPageId")); // 获取内嵌页面列表控件 BillList cbilllist = childView.getControl("billlistap"); ListSelectedRowCollection currentSelectedRowInfo = cbilllist.getSelectedRows(); for (ListSelectedRow listSelectedRow : currentSelectedRowInfo) { /**表单标识,表单主键,表单上的附件面板(通过继承单据模板的附件面板标识是attachmentpanel, * 如果是空白页面或者是基础资料等没有attachmentpanel这个附件面板的需要另外处理),分享的附件信息 */ AttachmentServiceHelper.upload(cbilllist.getBillFormId(), listSelectedRow.getPrimaryKeyValue(),"attachmentpanel", targetattachment); //实际上,在这后面可以加一些判断看看是否分享成功,并提示 } } } super.click(evt); }
四、效果图
1、 附件面板上点击附件分享按钮
2、 在弹出的动态表单页面,选择主实体对象,并选择业务单据进行附件分享
3、 点击超链接进入采购申请单,可以看到,附件成功分享,附件成功绑定到了采购申请单的附件面板上
五、开发环境版本
COSMICV4.0.014.0
六、参考资料
附件分享开发案例.zip(19.10KB)
推荐阅读