如何用余额更新插件,防止余额表更新为负数原创
金蝶云社区-吴锐雄
吴锐雄
2人赞赏了该文章 726次浏览 未经作者许可,禁止转载编辑于2023年12月07日 13:52:23

关键词:余额更新插件,余额表,余额模型


一、需求

有些项目在开发过程中,没有使用苍穹库存模块,想要校验负库存,防止余额表的记录库存的字段更新为负数。

注意:如果余额表使用了苍穹的库存业务,可以通过 关闭“允许负库存”开关 来防止出现余额为负。使用文档我放在了文章的末尾。


二、思路与方案

1.需要用余额更新插件来实现该功能(实现IBalanceUpdatePlugin接口)。


2.afterUpdate事件可以在余额计算完成之后被触发,我们可以在该事件中,获取到被计算的余额字符是否为负,如果为负,终止当前余额更新。


3.afterUpdate事件的入参是BalanceUpdateArgs对象,有一个专门获取余额是否为负的方法:getBalData4NegativeCheck()。


4.如果校验为负,可在afterUpdate事件中抛出异常,能将更新的数据进行回滚

回滚的原理是,苍穹底层的余额引擎,在更新余额时,封装了一个事务,在执行余额更新时,如果抛出的异常被catch捕获,会进行回滚。

感兴趣的开发者可以查看kd.bos.bal.business.core.BalEngine这类,加个断点调试一下。

image.png


5.抛异常可以选择KDException,或者KDBizException,这两个异常,一个会弹出异常提示框,一个会弹出红色通知框。


三、实现过程


1.预置数据

  • 新建1个基础资料作为出库入库的业务对象,

  • 新建2个单据,一个出库单,一个入库单


基础资料“石料建材”数据如下:

image.png


入库单设计如下,“入库量”是整数字段,“石料建材”是第1步的基础资料。

image.png


出库单设计如下,“库量”是整数字段,“石料建材”是第1步创建的基础资料。

image.png


2.创建余额表

开发平台,创建页面,pc端,其他,余额表

image.png


拖入基础资料字段,设置基础资料类型为“石料建材”,设置业务类型为“普通维度”

image.png


拖入整数字段,标识设置为kdec_int_balance,命名为“库存”,设置业务类型为“发生数据”

image.png


3.创建余额更新规则

新建2个余额更新规则,一个入库,一个出库。


1.新增入库余额更新规则

【开发服务云】【余额模型】

image.png


新建余额更新规则,选择来源单据为之前创建的入库单

image.png

选择之前创建的余额表,会自动填充维度映射和更新数据。

image.png


因为是入库,所以要选择更新方向为增加,即增加库存,如下图。

设置“审核”操作时更新,“反审核”操作时回滚,如下图。

image.png


2.出库余额更新规则配置如下(创建过程略过)

image.png


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.注册余额更新插件

image.png


四、效果图

入库单新增1个数据,并提交审核。

image.png

查看余额表,发现已生成库存:

image.png


出库单新增1个数据,并提交审核,出库量超过已有库存,让余额更新为负。

点击审核按钮时,出现红色提示,并且余额更新失败。

使用KDBizException,可以得到用户体验更好的红色通知提示。效果如下:

image.png

回到余额表,发现余额没有更新为负,依旧是更新前的数值:

image.png



五、开发环境版本

不限



六、注意事项

如果余额表使用了苍穹的库存业务(供应链云的库存管理),可以通过 关闭“允许负库存”开关 来防止出现余额为负。

如何简单使用库存业务和余额表,可以参考这篇文章:

https://vip.kingdee.com/link/s/lK3P6

或者参考供应链的公开课视频:

https://vip.kingdee.com/link/s/l0YcX


七、参考资料

余额更新插件





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