
# 1业务场景
在源单已保存状态下,切换到目标单,并复制源单附件面板上的所有附件到目标单。
# 2实现方案
(1)编写源单的表单插件代码,实现点击切换按钮(自定义按钮),通过FormShowParameter携带当前单据pkId,表单标识,切换到目标单。
(2)编写目标单的表单插件代码,通过源单插件传递的单据pkId,formId,调用接口查询出源单中的附件面板上的附件信息集合。
(3)获取到附件信息集合后,获取到附件URL,通过URL获取到文件流,重新上传成临时附件,获取新的临时附件URL,重新构造新的临时附件信息集合,使用AttachmentPanel的upload()方法模拟附件上传到目标单据。
# 3示例代码
## 3.1源单据插件示例代码
```
public class SourceAttachPlugin extends AbstractFormPlugin {
//按钮名
private static final String BUTTON = "button";
private static final String ATTACHMENT_PANEL_NAME = "attachmentpanel";
private static final String SHOW_FORM_ID = "targetformid";
@Override
public void registerListener(EventObject e) {
addItemClickListeners("tbmain");
}
@Override
public void itemClick(ItemClickEvent evt) {
String itemKey = evt.getItemKey();
if (!StringUtils.equals(itemKey, BUTTON)) {
return;
}
//点击按钮打开目标单页面
showForm();
}
private void showForm() {
FormShowParameter parameter = new BillShowParameter();
parameter.setFormId(SHOW_FORM_ID);
parameter.getOpenStyle().setShowType(ShowType.Modal);
//源单pkId
parameter.setCustomParam("pkId", getModel().getDataEntity().getPkValue());
//源单formId
parameter.setCustomParam("preFormId", getModel().getDataEntity().getDataEntityType().getName());
getView().showForm(parameter);
}
}
```
## 3.2目标单据插件示例代码
```
public class TargetAttachPlugin extends AbstractFormPlugin {
//源单的附件面板标识
private static final String SOURCE_ATTACHMENT_PANEL_NAME = "attachmentpanel";
private static final String ATTACHMENT_PANEL_NAME = "attachmentpanel";
private static final String FORM_ID = "targetformid";
private static final FileService fileService = FileServiceFactory.getAttachmentFileService();
private static final TempFileCache tempFileCache = CacheFactory.getCommonCacheFactory().getTempFileCache();
@Override
public void afterCreateNewData(EventObject e) {
FormShowParameter parameter = getView().getFormShowParameter();
//获取源单pkId
Object pkId = parameter.getCustomParam("pkId");
//获取源单formId
Object preFormId = parameter.getCustomParam("preFormId");
if (pkId == null || "0".equals(pkId) || StringUtils.isBlank(preFormId)) {
return;
}
//获取目标单附件面板控件
AttachmentPanel panel = getControl(ATTACHMENT_PANEL_NAME);
//通过源单formId,pkId,源单的附件面板标识,获取源单上该附件面板的附件信息集合
List<Map<String, Object>> attachments = AttachmentServiceHelper.getAttachments((String) preFormId, pkId, SOURCE_ATTACHMENT_PANEL_NAME);
List<Map<String, Object>> newAttachm