如何使用网络控制实现不能同时编辑或操作单据原创
8人赞赏了该文章
3,643次浏览
编辑于2022年04月15日 11:24:46
关键字:网络控制、互斥锁
一、需求
功能性需求:基础资料kded_bd1列表上有一个按钮“同步数据”,点击“同步数据”后会打开一个界面,用于选择同步期间,点击“开始同步”,会将外部接口数据导入到bd1的分录上
非功能性需求:当数据量较大的情况,同步还未完成的情况下,其他用户可能看到的数据会有缺失,或者数据完整性校验不通过造成无法提交。
注:以下案例主要实现的是非功能性需求,功能性需求部分代码根据不同场景自行实现
二、思路与方案
在应用系统中,针对某一单据开启“网络互斥”的操作组合中,同一时刻仅能有一个用户访问其中的某一操作,那么就能有效隔离用户的数据访问情况,保障数据一致性。
首先配置网络控制后,前台用户的CURD操作会受到网络控制的作用,那么对于一些复杂的后台逻辑如何让其加入到这些操作组中呢?
①:将复杂的逻辑包装在该业务对象的操作中,代码中调用操作
②:通过网络控制接口,手动控制。(本文主要实现这种方式)
三、实现过程
1.基础资料bd1列表界面添加操作openform,用于打开日期选择界面
图 1
2.基础资料bd1添加空操作syscdata,用于数据同步的网络互斥控制
图 2
3.数据同步界面注册插件kd.test.test.form.SyscDateSelectPlugin
图 3
package kd.test.test.form; import java.util.EventObject; import kd.bos.entity.datamodel.ListSelectedRow; import kd.bos.entity.datamodel.ListSelectedRowCollection; import kd.bos.form.operate.MutexHelper; import kd.bos.form.plugin.AbstractFormPlugin; import kd.bos.list.BillList; public class SyscDateSelectPlugin extends AbstractFormPlugin{ @Override public void registerListener(EventObject e) { this.addClickListeners("btnok"); } @Override public void click(EventObject evt) { BillList list = this.getView().getParentView().getControl("billlistap"); ListSelectedRowCollection selectedRows = list.getSelectedRows(); for(ListSelectedRow row:selectedRows) { /** * p1:单据标识 * p2:单据id * p3:同步操作编码 * p4:true不可重入,false可重入 允许同一用户操作可以设置为false * p5:结果信息默认为空 */ boolean isMutexLocked = MutexHelper.require("kded_bd1", row.getPrimaryKeyValue(), "syscdata",false ,new StringBuilder()); if(!isMutexLocked) { //获取互斥锁失败,意味着有人正在操作该条数据 this.getView().showErrorNotification(row.getNumber()+"这条数据正在被别人编辑或操作"); return; } try { //------------- //------------- //中间执行其他自定义逻辑 }catch (Exception e) { // TODO: handle exception } finally { if(isMutexLocked) { //释放互斥锁 MutexHelper.release("kded_bd1", "syscdata", row.getPrimaryKeyValue().toString()); } } } } }
四、效果图
1.打开一条数据进行编辑不关闭
图 4
2.切换账号,选中同一条数据执行同步
图 5
五、开发环境版本
V4.0.0.14
六、参考资料
推荐阅读