金蝶BOS开发指南_BOTP
3.9.1 反写概述
反写主要是某些场景下可能需要根据单据转换目标单的状态来反写源单据; 反写逻辑主要分为:
规则反写: 指配置在单据转换规则上的反写定义, 又分为一般反写和核销反写;
业务反写: 指业务通过代码实现的反写逻辑, 通常用于规则反写不满足要求时, 采用每张单据调用一次业务
反写方法的方式;
批量反写: 也是规则反写不满足要求时, 业务通过代码实现的反写逻辑, 主要是为了提高反写效率, 允许业
务代码一次反写多张源单, 多张单据也只会调用一次, 与业务反写不能同时执行;
删除反反写: 指单据删除时, 需要回退已经进行的反写源单操作, 使源单回到反写前状态; 3.9.2
规则反写
反写规则是配置BOTP转换的源单和目标单之间的联动反写关系;可以直接选对象上的属性值或预设值,也可以通过公式平台来定义计算公式,其定义方法与其它公式定义相同,格式例如: 公式结果= XXX ;
反写将在单据保存/提交时触发,引擎将根据反写规则,修改源单对应的属性值;
3.9.2.1 一般反写
通常指直接把目标单据的某些属性值反写到源单据中,例如目标单据的单据编号,业务发生日期、状态等。点击反写属性行对应的
,弹出界面如图:
21 / 59
金蝶BOS开发指南_BOTP
3.9.2.2 核销反写
核销反写通常用来勾稽数量,来标记源单据中有多少数量已经生成了目标单据,还有多少未生成。核销反写通常是需要设置计算公式的。点击反写属性行对应的
,弹出界面如图:
3.9.3
业务反写
系统应用框架中基类CoreBillBase提供了reverseSave()方法, 业务需要根据需要覆写此方法,在方法内部实现业务单据特有的反写逻辑;
业务反写方法reverseSave()与反写规则并不冲突, 系统会先执行业务反写方法, 再根据规则上定义的反写规则进行反写;
reverseSave()方法主要是针对单张单据进行反写, 如果源单是单据集合的话, 系统会逐个单据调用此方法;
protected void _reverseSave(Context ctx, IObjectPK srcBillPK, IObjectValue
srcBillVO,
BOTBillOperStateEnum bOTBillOperStateEnum, IObjectValue bOTRelationInfo)
throws BOSException, EASBizException
3.9.4
批量反写
批量反写的作用主要是提高反写的执行效率, 业务可根据需要实现批量反写逻辑; 如果一般反写的速度较慢且反写逻辑允许的话, 最好是通过批量反写来完成, 此时需要在单据对应的ControllerBean中提供batchReverseSave()方法;
BOTReverseManager类的bizReverWrite方法会调用单据的批量反写接口,系统判断目标对象类是否实现batchReverseSave()方法, 如果有实现则调用批量反写,否则循环处理调用业务反写reverseSave方法反写源单; 注意:
批量反写方法中需要根据单据PK列表进行批量反写, 该方法只会被调用一次;
如果实现了批量反写方法, 则不会再调用reverseSave()方法进行单个业务反写;
批量反写方法batchReverseSave()与反写规则并不冲突, 系统会先执行批量反写方法, 再根据规则上定义的反写规则进行反写;
public void batchReverseSave(IObjectPK[] srcBillPKs, CoreBillBaseCollection
srcBillVOs, BOTBillOperStateEnum bOTBillOperStateEnum,
BOTRelationCollection bOTRelationInfos) throws BOSException, EASBizException
22 / 59
金蝶BOS开发指南_BOTP
3.9.5
?
删除反反写
目标单据被删除时会发生反反写操作,即不但要删除关系,还要恢复BOTP目标单据提交时对源单做的反写操作;
? 此行为主要是由编辑界面/列表界面上的actionRemove方法发起,系统应用框架提供的基类CoreBillEditUI
和CoreBillListUI中提供了默认实现,在删除目标单据的同时会调用后台BOTP引擎IBTPManager提供的接口完成删除BOTP关系并执行反反写:
public void removeAllRelation(CoreBillBaseInfo bill) throws BOSException,
BTPException;
public void removeAllRelation(CoreBillBaseCollection bills) throws BOSException, BTPException; public void removeAllSRCRelation(CoreBillBaseInfo bill) throws BOSException, BTPException;
注意: 如果删除单据不是通过系统应用框架基类CoreBillBase提供的方法删除, 例如覆写了基类方法且不调用super, 或者直接通过ORMAPPING接口删除单据对象, 则不会触发删除反反写操作; 3.9.6
? ? ? ?
反写机制
反写主要发生在目标单据被保存和提交时, 根据预先设置的反写逻辑, 修改源单上的属性值; 单据转换后如果未暂存目标单据的话, 将不会发生反写操作;
如果是一般反写, BOTP引擎逐条处理每张目标单分录, 根据反写规则, 计算结果值写回源单; 如果是批量反写, BOTP引擎直接调用目标单的批量反写方法, 不再做其它处理;
3.10 源单属性设置
源单实体对象的属性不是全部都需要在单据转换过程中使用到的,而如果每次都把所有源单属性都加载的话会影响系统转换的速度,因此需要针对特定的单据转换规则指定需要用到的属性; 通过“源单属性设置”可以指定源单对象参与单据转换的属性列表;
23 / 59
金蝶BOS开发指南_BOTP
点击“重算源单属性”按钮,系统会根据单据转换规则内容,自动分析出需要用到哪些源单属性; “删除选中行“可以删除指定的源单属性;
24 / 59
金蝶BOS开发指南_BOTP
3.11 规则过滤设置
规则过滤条件的作用是用户选择了一批数据,系统根据这些数据选择符合条件的规则。
比如在发票生成收款单的规则中,定义销售发票的类型等于普遍发票,则如果选中的是普通发票,则可以用此规则进行单据转换,如果选择的是增值税发票则不符合该规则,不能用此规则转换。规则过滤界面如下图;
规则过滤主要影响的是BOTP转换规则的选择, 通常当用户在界面上选择了待转换的源单据后, 系统会弹出一个选择转换规则的界面, 界面上会列出各种来源/目标单据类型, 以及对应该单据类型的可用规则, 这时所显示出来的就是已经符合规则过滤条件的规则;
3.12 数据过滤设置
数据过滤条件的作用是用户选择了一批数据和一个转换规则,系统根据这些数据和规则根据数据过滤条件,将其中符合条件的数据进行转换。
比如在发票生成收款单时,将未核销的销售发票进行单据转换,已核销的单据或分录不能生成收款单。定义了如图数据过滤规则,系统在转换时会自动将符合条件的单据过滤掉,只有未核销的销售发票才带到目标单。
25 / 59