手把手教你“分享附件”
自“想要显示“附件下载次数”,看这里”发布后,很多小伙伴强烈要求小编出一个续集,讲讲如何实现附件分享功能的开发。因此,小编又带着沉甸甸的干货走来了。
1 需求背景
在A单据的附件面板上,对于已上传的附件,可以实现分享附件到其他单据面板上。例如,采购申请单在生成采购订单之后,可以选择是否把附件分享给对应单号的采购申请单。
2 实现方案
针对上述需求,实现方案的整体思路为:通过给附件面板添加自定义按钮,点击自定义按钮,弹出一个动态表单,动态表单上显示主实体对象,以及主实体对象对应的业务单据,可以选择需要分享的目标单据,选择完之后点击确认分享按钮实现附件分享的功能,具体的实现步骤如下:
1、为附件面板添加自定义按钮(如上传、下载)。
实现代码如下:
1public class ShareAttementPlugin extends AbstractBillPlugIn implements AttachmentOperaClickListener { 2private static final String KEY_ATTACHMENTPENAL = "attachmentpanel"; 3@Override 4public void afterBindData(EventObject e) { 5 AttachmentPanel panel = this.getControl(KEY_ATTACHMENTPENAL); 6 List<AttachBtnOption> btns = new ArrayList<AttachBtnOption>(); 7 btns.add(new AttachBtnOption("attoption_share", new LocaleString("附件分享"))); 8 panel.addAttachOperaBtn(btns); 9 super.afterBindData(e); 10}
效果图如下所示:
按钮添加示例
2、创建动态表单,作为选择分享的目标单页面,包括主实体对象列表和业务点单据列表。
在动态表单中添加两个flex面板。往上面的flex面板中插入单据列表控件并绑定主实体对象,下面的flex面板是用代码显示对应主实体对象业务单据列表的位置,如下图:
flex面板设置示例
3、监听附件分享按钮,并实现页面跳转到分享附件→选择实体(即上面创建的动态表单),实现代码如下:
1@Override 2 public void registerListener(EventObject e) { 3 //监听附件面板的自定义按钮 4 AttachmentPanel att = this.getView().getControl(KEY_ATTACHMENTPENAL); 5 att.addOperaClickListener(this); 6 super.registerListener(e); 7 }
1@Override 2 public void attachmentOperaClick(AttachmentOperaClickEvent e) { 3 AttachmentPanel att = (AttachmentPanel) e.getSource(); 4 Map<String, String> attinfo = (Map<String, String>) e.getAttachmentInfo(); 5 List<Map<String, Object>> atts = att.getAttachmentData(); 6 if (e.getOperaKey().equals("attoption_share")) { 7 for (Map<String, Object> map : atts) { 8 String uid = (String) map.get("uid"); 9 if (uid.equals(attinfo.get("uid"))) { 10 FormShowParameter fsp = new FormShowParameter(); 11 // 设置弹出页面的编码 12 fsp.setFormId("kded_shareattchment"); 13 fsp.setCustomParams(map); 14 // 设置弹出页面标题 15 fsp.setCaption("附件分享-选择实体对象"); 16 // 设置弹出页面打开方式,支持模态,新标签等 17 fsp.getOpenStyle().setShowType(ShowType.MainNewTabPage); 18 // 弹出页面对象赋值给父页面 19 this.getView().showForm(fsp); 20 break; 21 } 22 } 23 } 24 AttachmentOperaClickListener.super.attachmentOperaClick(e); 25 }
4、根据选择的实体对象,选择指定单号的单据进行附件分享,具体分为以下三步:
第一步,添加监听事件,实现代码如下:
1public void registerListener(EventObject e) { 2 // 添加实体对象列表控件选择行操作的监听 3 BillList billList = this.getView().getControl("kded_billlistap"); 4 billList.addListRowClickListener(this); 5 // 添加“确认分享”按钮的监听事件 6 Button btnok = this.getView().getControl("btnok"); 7 btnok.addClickListener(this); 8 super.registerListener(e); 9 }
第二步,选择主实体对象(例如采购申请单、采购订单),并根据主实体对象,在本页面显示对应实体的业务单据列表,实现代码如下:
1@Override 2 public void listRowClick(ListRowClickEvent evt) { 3 //获取选择行 4 ListSelectedRowCollection listSelectedRowCollection = evt.getListSelectedRowCollection(); 5 int size = listSelectedRowCollection.size(); 6 if (size > 1) { 7 this.getView().showMessage("只能选择一个实体对象"); 8 evt.setCancel(true); 9 return; 10 } else if (size == 0) { 11 return; 12 } 13 ListSelectedRow currentListSelectedRow = evt.getCurrentListSelectedRow(); 14 String entityNumber = currentListSelectedRow.getNumber(); 15 ListShowParameter listShowParameter = new ListShowParameter(); 16 // 保存子页面id到缓存,方便后面获取子页面 17 this.getPageCache().put("childPageId", listShowParameter.getPageId()); 18 listShowParameter.setFormId("bos_list"); 19 listShowParameter.setBillFormId(entityNumber); 20 listShowParameter.getOpenStyle().setShowType(ShowType.InContainer); 21 // 指定单据列表控件所在位置 22 listShowParameter.getOpenStyle().setTargetKey("kded_flexpanelap2"); 23 // 自定义参数 24 StyleCss css = new StyleCss(); 25 css.setHeight("500px"); 26 listShowParameter.getOpenStyle().setInlineStyleCss(css); 27 this.getView().showForm(listShowParameter); 28 ListRowClickListener.super.listRowClick(evt); 29 }
第三步,点击“确认分享”按钮时,附件绑定到指定业务单据,实现代码如下:
1@Override 2 public void click(EventObject evt) { 3 if (evt.getSource() instanceof Button) { 4 Button op = (Button) evt.getSource(); 5 if (op.getOperationKey().equals("toshare")) { 6 FormShowParameter fsp = this.getView().getFormShowParameter(); 7 // 附件信息 8 Map<String, Object> attParams = fsp.getCustomParams(); 9 ArrayList<Map<String, Object>> targetattachment = new ArrayList<>(); 10 targetattachment.add(attParams); 11 // 获取子页面 12 IFormView childView = this.getView().getView(this.getPageCache().get("childPageId")); 13 // 获取内嵌页面列表控件 14 BillList cbilllist = childView.getControl("billlistap"); 15 ListSelectedRowCollection currentSelectedRowInfo = cbilllist.getSelectedRows(); 16 for (ListSelectedRow listSelectedRow : currentSelectedRowInfo) { 17 /**表单标识,表单主键,表单上的附件面板(通过继承单据模板的附件面板标识是attachmentpanel, 18 * 如果是空白页面或者是基础资料等没有attachmentpanel这个附件面板的需要另外处理),分享的附件信息 19 */ 20 AttachmentServiceHelper.upload(cbilllist.getBillFormId(), listSelectedRow.getPrimaryKeyValue(), 21 "attachmentpanel", targetattachment); 22 } 23 } 24 } 25 super.click(evt); 26 }
3 实现效果
1、在附件面板上点击“附件分享”按钮,效果如下所示:
分享按钮
2、在弹出的动态表单页面,选择主实体对象,并选择业务单据进行附件分享,如下所示:
表单页面
3、点击超链接进入采购申请单,可以看到,附件已成功分享,且绑定到了采购申请单的附件面板上,如下所示:
实现分享
4 划重点
为附件面板添加自定义按钮(如上传、下载);
创建动态表单,作为选择分享的目标单页面,包括(主实体对象列表和业务点单据列表);
监听附件分享按钮,并实现页面跳转到分享附件→选择实体(即上面创建的动态表单);
根据选择的实体对象,选择指定单号的单据进行附件分享。
#往期推荐#
更多精彩内容,“码”上了解!↓
手把手教你“分享附件”
本文2024-09-23 00:20:50发表“云苍穹知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-cangqiong-138882.html