如何实现附件分享功能的开发原创
金蝶云社区-陈来珍
陈来珍
8人赞赏了该文章 2201次浏览 未经作者许可,禁止转载编辑于2022年04月15日 16:38:39

关键词:附件面板、自定义按钮,附件分享,内嵌页面获取列表控件,动态表单

一、需求

在采购订单单据上的附件面板上,对于已上传的附件,可以实现分享附件到其他单据的附件面板上,例如采购申请单生成采购订单之后,可以选择是否把附件分享给对应单号的采购申请单

二、思路与方案

苍穹平台本身没有内置附件分享的功能,可以通过给附件面板添加自定义按钮,点击自定义按钮,弹出一个动态表单,动态表单可以选择需要分享的目标单据,选择完之后点击确认分享按钮实现附件分享的功能。

三、实现过程

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);
}
}

image.png

2、创建动态表单

作为选择分享的目标单页面,包括(主实体对象列表和业务点单据列表)。动态表单中添加两个flex面板,上面的flex面板中插入单据列表控件并绑定主实体对象,下面的flex面板是用代码显示对应主实体对象业务单据列表的位置(如下第四点)

分享页面.png

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、  附件面板上点击附件分享按钮

分享页面.png

2、  在弹出的动态表单页面,选择主实体对象,并选择业务单据进行附件分享

主实体对象.png

3、  点击超链接进入采购申请单,可以看到,附件成功分享,附件成功绑定到了采购申请单的附件面板上

分享成功.png

五、开发环境版本

COSMICV4.0.014.0

六、参考资料

【开发平台】指导手册

学习成长中心


赞 8