如何实现单据统一附件模板功能原创
1人赞赏了该文章
1,083次浏览
编辑于2022年11月11日 11:00:26
关键词:附件、附件模板
一、需求
由用户a用维护的附件模板,要求只能上传一个.docx类型的附件,上传到单据上。后面新增的单据都可以直接下载该附件模板。除a用户之外的用户只能下载附件模板,不能上传附件模板。
二、思路与方案
给上传、下载附件模板的按钮操作设置权限控制,点击上传附件时,弹出动态表单,动态表单上添加一个附件面板,设置扩展名为docx,最大附件数为1,上传的附件持久化到文件服务器的固定地址path,下一个单据点击下载附件模板时,直接根据固定地址path去下载附件。
三、实现过程
1、设置按钮操作的权限
(1)新增权限项
点击”【表单】-【权限控制】-【操作权限控制】-【新增】-【新增】“新增一个”附件模板上传“和”附件模板下载“的权限项,【保存】,权限列表选中这两个权限项点击【返回数据】。
(2)为单据上的上传下载按钮新增donothing操作类型的操作,并绑定对应权限项
(3)根据实际业务给用户分配相关的权限
2、附件上传和附件下载
//单据插件 public class DemoIBillPlugin extends AbstractBillPlugIn { // 附件上传操作代码 private static final String ATTTEMPLATEUPLOAD = "atttemplateupload"; // 附件下载操作代码 private static final String ATTTEMPLATEUPDOWN = "atttemplatedown"; //指定唯一的附件模板路径 private static final String HOSTPATH = "\\att\\template.docx"; @Override public void afterDoOperation(AfterDoOperationEventArgs e) { // TODO Auto-generated method stub String operateKey = e.getOperateKey(); if (operateKey.equals(ATTTEMPLATEUPLOAD)) { //弹出动态表单 FormShowParameter fsp = new FormShowParameter(); fsp.getOpenStyle().setShowType(ShowType.Modal); fsp.setFormId("kded_uploadatt"); fsp.setCloseCallBack(new CloseCallBack(this, "kded_addatt")); this.getView().showForm(fsp); } else if (operateKey.equals(ATTTEMPLATEUPDOWN)) { //轻量级开发模式要加上安装地址 String localaddress="\\F:\\my97cosmic\\bos-dev-tool\\debug-service\\node-debug-service\\filestorage"; String downURL = UrlService.getDomainContextUrl() + "/attachment/download.do?path=" +localaddress+ HOSTPATH; // 非轻量级开机模式的环境直接用:String downURL = UrlService.getDomainContextUrl() + "/attachment/download.do?path=" + HOSTPATH; this.getView().download(downURL); } super.afterDoOperation(e); } // 弹窗返回事件,未落库附件持久化到文件服务器 @Override public void closedCallBack(ClosedCallBackEvent ccb) { if (ccb.getActionId().equals("kded_addatt")) { List<Map<String, Object>> returnData = (List<Map<String, Object>>) ccb.getReturnData(); if (returnData==null) { return; } for (Map<String, Object> map : returnData) { String url = (String) map.get("url"); if (url.contains("configKey=redis.serversForCache&id=tempfile")) { // 持久化附件到服务器 String uploadTempfile = uploadTempfile(url, "template.docx"); if (uploadTempfile!=null) { this.getView().showSuccessNotification("附件模板上传成功!"); } } } } } /** * 上传临时文件到服务器中 * * @param url * @param name * @return */ private String uploadTempfile(String url, String name) { TempFileCache cache = CacheFactory.getCommonCacheFactory().getTempFileCache(); InputStream in = cache.getInputStream(url); FileService fs = FileServiceFactory.getAttachmentFileService(); // RequestContext requestContext = RequestContext.get(); // String uuid = UUID.randomUUID().toString().replace("-", ""); // 生成文件路径-上传附件时远程服务器需要存储文件的位置 // String pathParam = FileNameUtils.getAttachmentFileName(requestContext.getTenantId(), // requestContext.getAccountId(), uuid, name); FileItem fileItem = new FileItem(name, HOSTPATH, in); // 上传附件到文件服务器 UrlService.getDomainContextUrl()+ "/attachment/download.do?path=/" // + String downUrl = fs.upload(fileItem); return downUrl; } }
//动态表单插件 public class FormSelectPlugin extends AbstractFormPlugin { @Override public void registerListener(EventObject e) { Button btt = this.getView().getControl("btnok"); btt.addClickListener(this); super.registerListener(e); } @Override public void itemClick(ItemClickEvent evt) { // TODO Auto-generated method stub super.itemClick(evt); } @Override public void click(EventObject evt) { if (evt.getSource() instanceof Button) { Button source = (Button) evt.getSource(); if (source.getKey().equals("btnok")) { //附件面板 AttachmentPanel att = this.getView().getControl("kded_attachmentpanelap"); List<Map<String, Object>> attachmentData = att.getAttachmentData(); //设置返回父页面的附件数据 this.getView().returnDataToParent(attachmentData); this.getView().close(); } } super.click(evt); } }
四、效果图
-附件上传
-附件下载
-无附件模板上传权限用户
五、开发环境版本
V5.0.002
六、参考资料
kded_mycloud-kded_exampleapp-2 …(28.52KB)
DemoiPlugin.zip(2.75KB)
赞 1
1人点赞
还没有人点赞,快来当第一个点赞的人吧!
打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!
推荐阅读