如何使用网络控制实现不能同时编辑或操作单据原创
金蝶云社区-sharkv
sharkv
7人赞赏了该文章 3245次浏览 未经作者许可,禁止转载编辑于2022年04月15日 11:24:46

关键字:网络控制、互斥锁

一、需求

功能性需求:基础资料kded_bd1列表上有一个按钮“同步数据”,点击“同步数据”后会打开一个界面,用于选择同步期间,点击“开始同步”,会将外部接口数据导入到bd1的分录上

非功能性需求:当数据量较大的情况,同步还未完成的情况下,其他用户可能看到的数据会有缺失,或者数据完整性校验不通过造成无法提交。

注:以下案例主要实现的是非功能性需求,功能性需求部分代码根据不同场景自行实现

二、思路与方案

在应用系统中,针对某一单据开启“网络互斥”的操作组合中,同一时刻仅能有一个用户访问其中的某一操作,那么就能有效隔离用户的数据访问情况,保障数据一致性。

首先配置网络控制后,前台用户的CURD操作会受到网络控制的作用,那么对于一些复杂的后台逻辑如何让其加入到这些操作组中呢?

①:将复杂的逻辑包装在该业务对象的操作中,代码中调用操作

②:通过网络控制接口,手动控制。(本文主要实现这种方式)

三、实现过程

1.基础资料bd1列表界面添加操作openform,用于打开日期选择界面

1.png

图 1

2.基础资料bd1添加空操作syscdata,用于数据同步的网络互斥控制

2.png


图 2

 

3.数据同步界面注册插件kd.test.test.form.SyscDateSelectPlugin

3.png


图 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.png


图 4

2.切换账号,选中同一条数据执行同步

5.png


图 5

 

五、开发环境版本

V4.0.0.14

六、参考资料

【开发平台】指导手册

学习成长中心 


赞 7