关键词:余额更新插件,余额表,余额模型
一、需求
有些项目在开发过程中,没有使用苍穹库存模块,想要校验负库存,防止余额表的记录库存的字段更新为负数。
注意:如果余额表使用了苍穹的库存业务,可以通过 关闭“允许负库存”开关 来防止出现余额为负。使用文档我放在了文章的末尾。
二、思路与方案
1.需要用余额更新插件来实现该功能(实现IBalanceUpdatePlugin接口)。
2.afterUpdate事件可以在余额计算完成之后被触发,我们可以在该事件中,获取到被计算的余额字符是否为负,如果为负,终止当前余额更新。
3.afterUpdate事件的入参是BalanceUpdateArgs对象,有一个专门获取余额是否为负的方法:getBalData4NegativeCheck()。
4.如果校验为负,可在afterUpdate事件中抛出异常,能将更新的数据进行回滚。
回滚的原理是,苍穹底层的余额引擎,在更新余额时,封装了一个事务,在执行余额更新时,如果抛出的异常被catch捕获,会进行回滚。
感兴趣的开发者可以查看kd.bos.bal.business.core.BalEngine这类,加个断点调试一下。
5.抛异常可以选择KDException,或者KDBizException,这两个异常,一个会弹出异常提示框,一个会弹出红色通知框。
三、实现过程
1.预置数据
新建1个基础资料作为出库入库的业务对象,
新建2个单据,一个出库单,一个入库单,
基础资料“石料建材”数据如下:
入库单设计如下,“入库量”是整数字段,“石料建材”是第1步的基础资料。
出库单设计如下,“出库量”是整数字段,“石料建材”是第1步创建的基础资料。
2.创建余额表
开发平台,创建页面,pc端,其他,余额表
拖入基础资料字段,设置基础资料类型为“石料建材”,设置业务类型为“普通维度”
拖入整数字段,标识设置为kdec_int_balance,命名为“库存”,设置业务类型为“发生数据”
3.创建余额更新规则
新建2个余额更新规则,一个入库,一个出库。
1.新增入库余额更新规则
【开发服务云】【余额模型】
新建余额更新规则,选择来源单据为之前创建的入库单
选择之前创建的余额表,会自动填充维度映射和更新数据。
因为是入库,所以要选择更新方向为增加,即增加库存,如下图。
设置“审核”操作时更新,“反审核”操作时回滚,如下图。
2.出库余额更新规则配置如下(创建过程略过)
4.编写余额更新插件并注册
代码如下
import kd.bos.algo.DataSet; import kd.bos.algo.Row; import kd.bos.biz.balance.model.BalanceUpdateArgs; import kd.bos.biz.balance.model.IBalanceUpdatePlugin; import kd.bos.biz.balance.model.IDataTransform; import kd.bos.biz.balance.model.UpdateRule; import kd.bos.exception.KDBizException; import java.util.Iterator; import java.util.List; public class BmBalanceUpdatePlugin implements IBalanceUpdatePlugin { @Override public void afterUpdate(BalanceUpdateArgs args) { // getBalData4NegativeCheck方法获取余额更新结果 DataSet dataSet = args.getBalData4NegativeCheck(); Iterator<Row> iterator = dataSet.iterator(); while (iterator.hasNext()) { Row row = iterator.next(); // 获取更新之后的库存字段数值 int balance = row.getInteger("kdec_int_balance"); if (balance < 0) { // 检测到小于0时,抛出异常,回滚余额更新 throw new KDBizException("检测到kdec_int_balance的库存为负,终止更新"); // throw new KDException("检测到kdec_int_balance的库存为负,终止更新"); } } } }
2.注册余额更新插件
四、效果图
入库单新增1个数据,并提交审核。
查看余额表,发现已生成库存:
出库单新增1个数据,并提交审核,出库量超过已有库存,让余额更新为负。
点击审核按钮时,出现红色提示,并且余额更新失败。
使用KDBizException,可以得到用户体验更好的红色通知提示。效果如下:
回到余额表,发现余额没有更新为负,依旧是更新前的数值:
五、开发环境版本
不限
六、注意事项
如果余额表使用了苍穹的库存业务(供应链云的库存管理),可以通过 关闭“允许负库存”开关 来防止出现余额为负。
如何简单使用库存业务和余额表,可以参考这篇文章:
https://vip.kingdee.com/link/s/lK3P6
或者参考供应链的公开课视频:
https://vip.kingdee.com/link/s/l0YcX
七、参考资料
bal_negative_check.zip(18.55KB)
推荐阅读