手把手教你“分享附件”

栏目:云苍穹知识作者:金蝶来源:金蝶云社区发布:2024-09-23浏览:1

手把手教你“分享附件”


想要显示“附件下载次数”,看这里发布后,很多小伙伴强烈要求小编出一个续集,讲讲如何实现附件分享功能的开发。因此,小编又带着沉甸甸的干货走来了。




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 划重点


实现附件分享功能开发有以下四个步骤:


  • 为附件面板添加自定义按钮(如上传、下载);

  • 创建动态表单,作为选择分享的目标单页面,包括(主实体对象列表和业务点单据列表);

  • 监听附件分享按钮,并实现页面跳转到分享附件→选择实体(即上面创建的动态表单);

  • 根据选择的实体对象,选择指定单号的单据进行附件分享。




#往期推荐#


 MQ入门:跑通第一个单机案例

#  MQ进阶:如何用MQ解决并发问题

#  MQ高阶:基于MQ的分布式事务解决方案

#  想要玩转MQ?那就必须懂MQ服务调用模型!

 必须要掌握的四种业务校验方案

#  一篇文章告诉你MQ的前世今生

 想要显示“附件下载次数”,看这里

#  手把手带你实现“BOTP控制下推次数”



更多精彩内容,“码”上了解!↓




手把手教你“分享附件”

自“想要显示“附件下载次数”,看这里”发布后,很多小伙伴强烈要求小编出一个续集,讲讲如何实现附件分享功能的开发。因此,小编又带着沉...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息