如何实现单据统一附件模板功能原创
金蝶云社区-陈来珍
陈来珍
1人赞赏了该文章 1,084次浏览 未经作者许可,禁止转载编辑于2022年11月11日 11:00:26

关键词:附件、附件模板

一、需求

由用户a用维护的附件模板,要求只能上传一个.docx类型的附件,上传到单据上。后面新增的单据都可以直接下载该附件模板。除a用户之外的用户只能下载附件模板,不能上传附件模板。

image.png

二、思路与方案

     给上传、下载附件模板的按钮操作设置权限控制,点击上传附件时,弹出动态表单,动态表单上添加一个附件面板,设置扩展名为docx,最大附件数为1,上传的附件持久化到文件服务器的固定地址path,下一个单据点击下载附件模板时,直接根据固定地址path去下载附件。

三、实现过程

1、设置按钮操作的权限

(1)新增权限项

点击”【表单】-【权限控制】-【操作权限控制】-【新增】-【新增】“新增一个”附件模板上传“和”附件模板下载“的权限项,【保存】,权限列表选中这两个权限项点击【返回数据】。

image.png

(2)为单据上的上传下载按钮新增donothing操作类型的操作,并绑定对应权限项

image.png

(3)根据实际业务给用户分配相关的权限

image.png

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

四、效果图

-附件上传

image.png

-附件下载

image.png

-无附件模板上传权限用户

image.png

五、开发环境版本

V5.0.002

六、参考资料

开发平台

学习成长中心

SDK接口

开发必备100个小知识

开发案例库


图标赞 1
1人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!