凭证单据归档二次开发详细文档
# 单据归档扩展
## 1.获取主单单据
>默认实现:
凭证或者固定资产卡片作为主单
>适用二开场景:
需要归档除了凭证、固定资产卡片以外的单据为主单的数据
#### 1.1.接口定义
```java
/**
@param ctx 上下文
@param bosType 单据BOSTYPE
@param com.kingdee.eas.basedata.assistant.PeriodInfo period 期间信息
@param com.kingdee.eas.basedata.org.CompanyOrgUnitInfo org 组织信息
@return key:单据id,value:单据对象info
@throws Exception
*/
public Map<String,IObjectValue> getMainBills(Context ctx, String bosType,PeriodInfo period,CompanyOrgUnitInfo org) throws Exception;
```
#### 1.2.具体步骤
1. 继承类:com.kingdee.eas.el.rec.tool.DefaultBillHandler,重写getMainBills方法
2. 查询分析器执行:select * from t\_sys\_checkers where FInterface = 'com.kingdee.eas.el.rec.tool.IBillHandler' and FBosType = '主单单据的bostype'
3. 如果第2步没有结果,执行第5步,如果有结果,执行第4步
4. 执行:update t\_sys\_checkers set FChecker = 二开类的全路径 where FInterface = 'com.kingdee.eas.el.rec.tool.IBillHandler' and FBosType = '主单单据的bostype'
5. 将二开类插入表t\_sys\_checkers中
例:insert into t\_sys\_checkers (FBosType, FInterface, FChecker)
values (主单单据的bostype,'com.kingdee.eas.el.rec.tool.IBillHandler',二开类的全路径)
6. 归档内容中把附属单据选项勾选去掉
#### 1.3.代码示例
参考 凭证主单类:com.kingdee.eas.el.rec.tool.VoucherBillHandler#getMainBills方法
#### 1.4.注意事项
主单的number编码字段必须要有数据,否则会导致归档失败
------
## 2.获取主单对应的附属单据
>默认实现:
根据BOTP关系获取主单所有上游的附属单据(包括间接附属单据)
>适用二开场景:
> 主单和附属单据的关系不在BOTP中维护的
#### 2.1.接口定义:
```java
/**
@param ctx 上下文
@param destObjId 主单单据id
@param contents 归档内容集合--key:单据BOSTYPE,value:归档内容
@return 附属单据id List
@throws Exception
*/
public ArrayList<String> getAllRelationBill(Context ctx, String destObjId, Map<String, RecordBaseInfo> contents) throws Exception;
```
#### 2.2.具体步骤:
1. 继承类:com.kingdee.eas.el.rec.tool.DefaultBillHandler,重写getAllRelationBill方法
2. 查询分析器执行:select * from t\_sys\_checkers where FInterface = 'com.kingdee.eas.el.rec.tool.IBillHandler' and FBosType = '主单单据的bostype'
3. 如果第2步没有结果,执行第5步,如果有结果,执行第4步
4. 执行:update t\_sys\_checkers set FChecker = 二开类的全路径 where FInterface = 'com.kingdee.eas.el.rec.tool.IBillHandler' and FBosType = '主单单据的bostype'
5. 将二开类插入表t\_sys\_checkers中
例:insert into t\_sys\_checkers (FBosType, FInterface, FChecker)
values (主单单据的bostype,'com.kingdee.eas.el.rec.tool.IBillHandler',二开类的全路径)
#### 2.3.代码示例:
参考 凭证主单类:com.kingdee.eas.el.rec.tool.VoucherBillHandler#getAllRelationBill方法
#### 2.4.注意事项:
1. 如果没有附属单据,返回空List对象,不允许返回null
2. 返回的附属单据id必须是参数contents包含的单据
例:contents里包含了费用报销单、付款单两个归档内容。返回的附属单据里只能包含这两种单据的id,不要包含其他单据的id
----------
## 3.获取主单对应的附属单据(在附属单据归档内容上扩展)
>和接口2区别:
1.此接口是针对某个附属单据去关联主单;接口2是根据主单信息主动去获取对应的附属单据,针对多个附属单据
>默认实现:
无
>适用二开场景:
>
> - B单与主单没有直接BOTP关系,归档主单的时候需要归档B单,这时需要B单主动关联主单。例:A单生成主单、A单生成B单
#### 3.1.接口定义:
```java
/**
* @param ctx 上下文
* @param destObjId 主单单据id(默认是凭证id)
* @return 附属单据id List
*/
public ArrayList<String> getRefBillInfo(Context ctx, String destObjId);
```
#### 3.2.具体步骤:
1. 实现接口:com.kingdee.eas.el.rec.tool.IRefBillHandler,重写getRefBillInfo方法
2. 将二开类全路径填写到对应单据的归档内容 -> 单据设置 -> 关联方式:自定义 -> 自定义关联实现类
#### 3.3.代码示例:
```java
public class RefBillHandlerXX implements IRefBillHandler {
@Override
public ArrayList<String> getRefBillInfo(Context ctx, String destObjId) {
ArrayList<String> list = new ArrayList<String>();
try {
// 根据destObjId找到对应的附属单据id,放入list中
return list;
} catch (Exception e) {
return new ArrayList<String>();
}
}
}
```
#### 3.4.注意事项:
1. 二开类中只能返回归档内容对应的附属单据id,不可以返回其他单据的id
例:假设二开类配置在付款单的归档内容上,那二开类只能返回付款单的id,不能是其他单据的id
----------
## 4.获取单据信息
>默认实现:
根据传过来的EntityViewInfo参数查询
>适用二开场景:
需要添加查询字段,或者添加过滤条件
#### 4.1.接口定义:
```java
/**
* @param ctx 上下文
* @param bosType 单据BOSTYPE
* @param viewInfo 默认的查询对象
* @return 查询出来的对象
* @throws Exception
*/
public IObjectCollection getObjectCollection(Context ctx, BOSObjectType bosType, EntityViewInfo viewInfo) throws Exception;
```
#### 4.2.具体步骤:
1. 继承类:com.kingdee.eas.el.rec.tool.DefaultBillHandler,重写getObjectCollection方法
2. 查询分析器执行:select * from t\_sys\_checkers where FInterface = 'com.kingdee.eas.el.rec.tool.IBillHandler' and FBosType = '主单单据的bostype'
3. 如果第2步没有结果,执行第5步,如果有结果,执行第4步
4. 执行:update t\_sys\_checkers set FChecker = 二开类的全路径 where FInterface = 'com.kingdee.eas.el.rec.tool.IBillHandler' and FBosType = '主单单据的bostype'
5. 将二开类插入表t\_sys\_checkers中
例:insert into t\_sys\_checkers (FBosType, FInterface, FChecker)
values (主单单据的bostype,'com.kingdee.eas.el.rec.tool.IBillHandler',二开类的全路径)
#### 4.3.代码示例:
参考 凭证主单类:com.kingdee.eas.el.rec.tool.VoucherBillHandler#getObjectCollection方法
#### 4.4.注意事项:
- 不要返回null
- 增量增加查询条件和查询字段,默认Selector对象和Filter条件不要删除或替换(如果已经存在Selector和Filter属性)
----------
## 5.判断主单是否存在
>默认实现:
根据传过来的单据id参数查询id是否在表里存在
>适用二开场景:
需要添加其他判断是否存在的条件
#### 5.1.接口定义:
```java
/**
* @param ctx 上下文
* @param billId 单据id
* @return 布尔值
* @throws BOSException
*/
public boolean existsBill(Context ctx, String billId) throws BOSException;
```
#### 5.2.具体步骤:
1. 继承类:com.kingdee.eas.el.rec.tool.DefaultBillHandler,重写existsBill方法
2. 查询分析器执行:select * from t\_sys\_checkers where FInterface = 'com.kingdee.eas.el.rec.tool.IBillHandler' and FBosType = '主单单据的bostype'
3. 如果第2步没有结果,执行第5步,如果有结果,执行第4步
4. 执行:update t\_sys\_checkers set FChecker = 二开类的全路径 where FInterface = 'com.kingdee.eas.el.rec.tool.IBillHandler' and FBosType = '主单单据的bostype'
5. 将二开类插入表t\_sys\_checkers中
例:insert into t\_sys\_checkers (FBosType, FInterface, FChecker)
values (主单单据的bostype,'com.kingdee.eas.el.rec.tool.IBillHandler',二开类的全路径)
#### 5.3.代码示例:
参考 凭证主单类:com.kingdee.eas.el.rec.tool.VoucherBillHandler#existsBill方法
#### 5.4.注意事项:
无
----------
## 6.设置xml里的附件和影像信息
>默认实现:
获取单据对应的EAS附件信息、影像信息、发票信息,设置到xml元数据中,供档案系统解析
>适用二开场景:
需要添加其他信息到xml元数据
#### 6.1.接口定义:
```java
/**
* @param ctx 上下文
* @param com.kingdee.eas.el.rec.model.XmlBase xmlBase 单据信息
* @param com.kingdee.eas.el.rec.RecordBaseInfo content 归档内容
* @param index 序号
* @return
* @throws Exception
*/
public void setXmlBaseProperties(Context ctx, XmlBase xmlBase, RecordBaseInfo content, int index) throws Exception;
```
#### 6.2.具体步骤:
1. 继承类:com.kingdee.eas.el.rec.tool.DefaultBillHandler,重写setXmlBaseProperties方法
2. 查询分析器执行:select * from t\_sys\_checkers where FInterface = 'com.kingdee.eas.el.rec.tool.IBillHandler' and FBosType = '主单单据的bostype'
3. 如果第2步没有结果,执行第5步,如果有结果,执行第4步
4. 执行:update t\_sys\_checkers set FChecker = 二开类的全路径 where FInterface = 'com.kingdee.eas.el.rec.tool.IBillHandler' and FBosType = '主单单据的bostype'
5. 将二开类插入表t\_sys\_checkers中
例:insert into t\_sys\_checkers (FBosType, FInterface, FChecker)
values (主单单据的bostype,'com.kingdee.eas.el.rec.tool.IBillHandler',二开类的全路径)
#### 6.3.代码示例:(过滤不需要归档的附件)
```java
public class DefaultBillHandlerEx extends DefaultBillHandler{
@Override
public void setXmlBaseProperties(final Context ctx, final XmlBase xmlBase, final RecordBaseInfo content, final int index) throws Exception {
super.setXmlBaseProperties(ctx, xmlBase, content, index);
ArchInfo info = (ArchInfo) xmlBase;
BillTypeInfo billType = content.getBillType(); // 业务单据类型
Set<FileInfo> fileInfos = info.getFileInfos(); // 附件信息
CompanyOrgUnitInfo org = content.getOrg(); // 归档组织信息
Iterator<FileInfo> iterator = fileInfos.iterator();
while (iterator.hasNext()){
String id = iterator.next().getId();// 附件的id
// todo 判断,remove不需要的附件
}
}
}
```
#### 6.4.注意事项:
- 如果重写了接口7或者接口8,必须要重写这个接口,在xml上设置对应的信息。
例:如果单据还有附件在其他系统(不是通过EAS上传),需要归档到档案系统。这时候需要重写此接口和接口8,接口8负责获取附件文件流,此接口负责设置xml元数据信息,以便档案系统解析。接口7作用类似
----------
## 7.获取单据的套打文件流
>默认实现:
根据归档内容上的套打模板、套打数据源,调用套打接口生成的单据PDF文件流
>适用二开场景:
需要自己实现单据本身文件流的生成
#### 7.1.接口定义:
```java
/**
* @param ctx 上下文
* @param com.kingdee.eas.el.rec.RecordBaseInfo content 归档内容
* @param com.kingdee.eas.el.rec.model.ArchInfo info 单据信息
* @param com.kingdee.eas.el.rec.model.FileInfo fileInfo 单据附件信息
* @return 文件流
* @throws Exception
*/
public InputStream getBillPdfIs(Context ctx, RecordBaseInfo content, ArchInfo info, FileInfo fileInfo) throws Exception;
```
#### 7.2.具体步骤:
1. 继承类:com.kingdee.eas.el.rec.tool.DefaultBillHandler,重写getBillPdfIs方法
2. 查询分析器执行:select * from t\_sys\_checkers where FInterface = 'com.kingdee.eas.el.rec.tool.IBillHandler' and FBosType = '主单单据的bostype'
3. 如果第2步没有结果,执行第5步,如果有结果,执行第4步
4. 执行:update t\_sys\_checkers set FChecker = 二开类的全路径 where FInterface = 'com.kingdee.eas.el.rec.tool.IBillHandler' and FBosType = '主单单据的bostype'
5. 将二开类插入表t\_sys\_checkers中
例:insert into t\_sys\_checkers (FBosType, FInterface, FChecker)
values (主单单据的bostype,'com.kingdee.eas.el.rec.tool.IBillHandler',二开类的全路径)
#### 7.3.代码示例:
```java
public class DefaultBillHandlerEx extends DefaultBillHandler{
@Override
public InputStream getBillPdfIs(final Context ctx, final RecordBaseInfo content, final ArchInfo info, final FileInfo fileInfo) throws Exception {
String billId = info.getBillId(); // 单据id
// todo 根据单据id获取单据文件流
}
}
```
#### 7.4.注意事项:
- 返回null,表示没有套打文件
----------
## 8.获取单据附件文件流
>默认实现
在当前EAS中获取单据的附件
>适用二开场景:
需要添加其他附件(非EAS标准附件功能上传的附件)
#### 8.1.接口定义:
```java
/**
* @param ctx 上下文
* @param com.kingdee.eas.el.rec.model.ArchInfo archInfo 单据信息
* @param com.kingdee.eas.el.rec.model.FileInfo fileInfo 附件信息
* @return 文件流
* @throws Exception
*/
public InputStream getBillAttachmentIs(Context ctx, ArchInfo archInfo, FileInfo fileInfo) throws Exception;
```
#### 8.2.具体步骤:
1. 继承类:com.kingdee.eas.el.rec.tool.DefaultBillHandler,重写getBillAttachmentIs方法
2. 查询分析器执行:select * from t\_sys\_checkers where FInterface = 'com.kingdee.eas.el.rec.tool.IBillHandler' and FBosType = '主单单据的bostype'
3. 如果第2步没有结果,执行第5步,如果有结果,执行第4步
4. 执行:update t\_sys\_checkers set FChecker = 二开类的全路径 where FInterface = 'com.kingdee.eas.el.rec.tool.IBillHandler' and FBosType = '主单单据的bostype'
5. 将二开类插入表t\_sys\_checkers中
例:insert into t\_sys\_checkers (FBosType, FInterface, FChecker)
values (主单单据的bostype,'com.kingdee.eas.el.rec.tool.IBillHandler',二开类的全路径)
#### 8.3.代码示例:
```java
public class DefaultBillHandlerEx extends DefaultBillHandler{
@Override
public InputStream getBillAttachmentIs(final Context ctx, final ArchInfo archInfo, final FileInfo fileInfo) throws Exception {
String attachmentId = fileInfo.getId();// 文件id
// todo 根据文件id获取单据文件流
}
}
```
#### 8.4.注意事项:
- 必须与接口6配合二开使用,FileInfo 参数是在接口6中设置
- 可以返回null,表示没有附件
----------
## 9.判断是否可以归档
>默认实现
无
>适用二开场景:
需要添加判断某个期间+组织是否可以归档的条件
#### 9.1.接口定义:
```java
/**
* @param ctx 上下文
* @param bosType 单据BOSTYPE
* @param com.kingdee.eas.basedata.assistant.PeriodInfo period 期间信息
* @param com.kingdee.eas.basedata.org.CompanyOrgUnitInfo org 组织信息
* @return 布尔值
* @throws BOSException
*/
public Boolean canArch(Context ctx, String bosType,PeriodInfo period,CompanyOrgUnitInfo org)throws BOSException;
```
#### 9.2.具体步骤:
1. 继承类:com.kingdee.eas.el.rec.tool.DefaultBillHandler,重写canArch方法
2. 查询分析器执行:select * from t\_sys\_checkers where FInterface = 'com.kingdee.eas.el.rec.tool.IBillHandler' and FBosType = '主单单据的bostype'
3. 如果第2步没有结果,执行第5步,如果有结果,执行第4步
4. 执行:update t\_sys\_checkers set FChecker = 二开类的全路径 where FInterface = 'com.kingdee.eas.el.rec.tool.IBillHandler' and FBosType = '主单单据的bostype'
5. 将二开类插入表t\_sys\_checkers中
例:insert into t\_sys\_checkers (FBosType, FInterface, FChecker)
values (主单单据的bostype,'com.kingdee.eas.el.rec.tool.IBillHandler',二开类的全路径)
#### 9.3.代码示例:
无
#### 9.4.注意事项:
无
----------
## 10.反归档后续操作
>默认实现
无
>适用二开场景:
需要添加触发标准反归档操作后的动作,例:通知归档人,发送邮件消息等
#### 10.1.接口定义:
```java
/**
* @param ctx 上下文
* @param info 归档记录
* @return
* @throws Exception
*/
public void revokeArch(Context ctx, ArcRecordInfo info) throws Exception;
```
#### 10.2.具体步骤:
1. 继承类:com.kingdee.eas.el.rec.tool.DefaultBillHandler,重写revokeArch方法
2. 查询分析器执行:select * from t\_sys\_checkers where FInterface = 'com.kingdee.eas.el.rec.tool.IBillHandler' and FBosType = '主单单据的bostype'
3. 如果第2步没有结果,执行第5步,如果有结果,执行第4步
4. 执行:update t\_sys\_checkers set FChecker = 二开类的全路径 where FInterface = 'com.kingdee.eas.el.rec.tool.IBillHandler' and FBosType = '主单单据的bostype'
5. 将二开类插入表t\_sys\_checkers中
例:insert into t\_sys\_checkers (FBosType, FInterface, FChecker)
values (主单单据的bostype,'com.kingdee.eas.el.rec.tool.IBillHandler',二开类的全路径)
#### 10.3.代码示例:
无
#### 10.4.注意事项:
无
凭证单据归档二次开发详细文档
# 单据归档扩展## 1.获取主单单据>默认实现:   凭证或者固定资产卡片作为主单 >适用二开场景:   需要归档除了凭...
点击下载文档
本文2024-09-22 19:18:56发表“eas cloud知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-eas-106417.html
您需要登录后才可以发表评论, 登录登录 或者 注册
最新文档
热门文章