金蝶云苍穹插件原理理解与使用

2020-09-13  本文已影响0人  涎涎

云苍穹插件使用门槛

  1. Java前端基础知识

  2. 云苍穹页面使用的知识储备

  3. 插件的类选择以及事件选择相关知识

如何开发云苍穹插件

  1. 确定应用场景,选择插件基类

  2. 确定事件源与控件

其分为有交互界面的应用场景(如表单、单据列表等)没有交互界面的应用场景(如单据操作、单据转换、关联反写、生产凭证等)两类;其中有交互界面的应用场景在界面加载、关闭时,用户与界面,以及界面上的控件交互时,会触发相应的插件事件;没有交互界面的应用场景其插件事件是由服务引擎按顺序触发的,这些应用场景,不需要关注事件源、控件;只需要根据业务需求,捕获合适的插件事件即可;

  1. 响应插件事件

没有交互界面的应用场景,插件基类已经实现了必要的插件接口,插件只需要扩展插件基类,重写事件方法即可完成事件的捕捉:

有交互界面的应用场景,插件基类实现了表单界面支持的插件接口,但没有实现各种控件的插件接口。如果只是要捕获表单界面事件,则扩展插件基类,重写表单事件方法即可。如果要捕获各种控件事件,则需要: 在插件类定义,实现控件支持的插件事件接口,例如树形控件支持的节点勾选插件事件接口TreeNodeCheckListener;实现控件的插件事件接口中的方法,完成事件的捕捉;在表单界面插件registerListener事件,向控件实例注册本插件实例,完成控件与插件实例的绑定:控件事件发生时,即触发其所绑定的插件事件;

如下例,插件需要响应树形控件的节点勾选treeNodeCheck事件:

package kd.bos.plugin.sample.dynamicform.pcform.control.template;
import java.util.EventObject;
import java.util.List;
import kd.bos.dataentity.utils.StringUtils;
import kd.bos.form.control.TreeView;
import kd.bos.form.control.events.TreeNodeCheckEvent;
import kd.bos.form.control.events.TreeNodeCheckListener;
import kd.bos.form.plugin.AbstractFormPlugin;

public class TreeViewTreeNodeCheck extends AbstractFormPlugin implements TreeNodeCheckListener {
    
    private final static String KEY_TREEVIEW1 = "treeviewap1";

    @Override
    public void registerListener(EventObject e) {
        super.registerListener(e);
        
        // 侦听树节点勾选事件
        TreeView treeView = this.getView().getControl(KEY_TREEVIEW1);
        treeView.addTreeNodeCheckListener(this);
    }

    @Override
    public void beforeBindData(EventObject e) {
        super.beforeBindData(e);
        TreeView treeView = this.getView().getControl(KEY_TREEVIEW1);
        treeView.setMulti(true);    // 支持多选
    }

    @Override
    public void treeNodeCheck(TreeNodeCheckEvent arg0) {
        TreeView treeView = (TreeView) arg0.getSource();
        if (StringUtils.equals(treeView.getKey(), KEY_TREEVIEW1)){
            List<String> selectNodeIds = treeView.getTreeState().getCheckedNodeIds();
            // TODO 在此添加业务逻辑
        }
    }
}

云苍穹插件编程原理

理解云苍穹插件原理只需要明白三个概念即可

什么是表单视图模型?

金蝶云苍穹,是B/S结构的,使用不同的客户端(PC端、移动端),通过网络连接到统一的服务端。用户看到的交互界面,是运行在客户端的,而业务逻辑和业务插件,则运行在服务端;业务插件运行在服务端,没办法直接获取到客户端界面上控件句柄,不能直接控制前端控件。但插件可以通过系统封装的视图模型接口IFormView,间接的访问、控制前端界面。所以IFormView则是表单视图模型,插件可以通过this.getView()方法,获取表单的视图模型接口实例;

什么是控件编程模型?

通过系统封装的各种控件代理对象,间接的访问、控制前端界面上的控件;这些运行在服务端的控件代理对象,称为控件编程模型, 或简称为控件、编程模型等。可以通过this.getView().getControl(String key)方法,获取到控件编程模型实例;

什么是表单数据模型?

表单的界面与数据,是分离:

表单的数据模型,提供各种方法访问界面数据,并且持有:

插件的简单试验

  1. 视图模型
package kd.bos.dynamicform.plugin;

import kd.bos.entity.datamodel.IDataModel;
import kd.bos.form.IFormView;
import kd.bos.form.IPageCache;
import kd.bos.form.control.Control;
import kd.bos.form.plugin.AbstractFormPlugin;

/**
 * <p>Title: </p>
 * <p>
 *    Description:
 *    动态表单插件基类方法试验
 *    自定义动态表单界面插件,必须派生自AbstractFormPlugin,重写事件处理方法。
 *    如下例,定义了一个动态表单界面插件(未捕获事件):
 * </p>
 * <p>Copyright: Copyright (c) 2020</p>
 * @author xx
 * @date 2020年3月7日
 * @version 1.0
 */
public class FormViewSample extends AbstractFormPlugin {

    /**
     * void</br>
     * 
     * <p>Title: getFormViewInstance</p>
     * <p>
     *    Description:
     * </p>
     * <p>Copyright: Copyright (c) 2020</p>
     * @author xx
     * @date 2020年3月7日
     * @param param the bare_field_name
     * @return the bare_field_name
     * @version 1.0
     */
    private void getFormViewInstance() {
        IFormView view = this.getView();//获取动态表单界面视图模型接口IFormView的实例
        IDataModel modal = this.getModel();//获取动态表单界面数据模型接口IDataModel的实例
        IPageCache pageCache = this.getPageCache();//获取页面缓存管理器,存取数据到缓存中
        
        Control control = this.getControl("textfield");//   获取界面上的控件
        System.out.println(control.toString());
        
        this.addClickListeners("");//注册插件,监听按钮点击事件
        this.addItemClickListeners("");//注册插件,监听子菜单项点击事件
        
        view.getPageId();//表单被加载时,会随机生成一个界面PageId;一个表单被两个用户同时打开时,生成的界面PageId不同; 可以根据返回的pageId,获取到表单视图模型实例;
        view.getView("");//指定PageId,获取对应的表单视图模型;可以据此对目标表单进行控制;
        view.getEntityId();//获取表单对应的主实体标识
        view.getModel();//获取表单数据模型实例
        view.sendFormAction(view);//把目标表单的控制指令发送给前端;插件调用了其他表单的控制方法后,必须调用本方法,把控制指令,发送给前端;
        view.getParentView();//获取父表单视图模型实例;
        view.getMainView();//获取主界面视图模型实例;
        view.updateView();//把数据模型中的数据,发送到前端界面;定义了多个重载函数,可以指定只刷新单个单据体、单个控件
        view.getControl("");//获取表单的控件实例
        view.getRootControl();//获取表单实例
        view.getService(null);//    获取服务实例
        view.invokeOperation("");//执行操作
        view.activate();//激活表单
        view.close();//关闭表单
        view.setEnable(true);//设置控件可用性
        view.setVisible(true);//设置控件可见性
        view.showForm(null);//传入表单显示参数,打开一个新的表单,作为本表单的子表单;该表单关闭时,会触发本表单插件 closedCallBack事件,请参阅表单closedCallBack事件说明及示例;
        view.getFormShowParameter();//获取表单显示参数
        view.cacheFormShowParameter();//修改表单显示参数对象属性值之后,调用本方法把参数更新到缓存
        view.returnDataToParent(null);//设置返回到父表单的返回值
        view.openUrl("");//打开一个新容器链接到指定的URL
        view.showUpload(null, "");//显示一个文件上传界面;文件上传完毕,确认返回时,会触发插件afterUpload事件;请参阅按钮afterUpload事件说明及示例;
        view.showMessage("");//单据内悬浮消息框,默认没有按钮,自动消失
        view.showErrMessage("", "");//显示错误消息
        view.showOperationResult(null);//显示操作结果
        view.showConfirm("", null);//显示确认消息;用户确认完毕,会触发confirmCallBack事件;请参阅confirmCallBack事件说明及实例
        view.showSuccessNotification("");//单据内成功悬浮消息框,默认2秒自动消失消息内容,不能超过50字,超过部分用三个点代替
        view.showErrorNotification("");//单据内失败悬浮消息框,需要手动关闭,消息内容,不能超过50字,超过部分用三个点代替
        view.showTipNotification("");//单据内提示类别悬浮消息框,提示类会显示按钮,需要手动关闭消息内容,不能超过50字,超过部分用三个点代替
        view.showRobotMessage("");//发送消息给机器人助手
        view.closeRobotMessage();//关闭消息给机器人助手
        view.showFieldTip(null);//字段上显示提示信息
        view.showFieldTips(null);//字段上显示提示信息(批量)
        
    }
}
  1. 数据模型
package kd.bos.dynamicform.plugin;

import kd.bos.entity.datamodel.IDataModel;
import kd.bos.form.plugin.AbstractFormPlugin;

/**
 * <p>Title: </p>
 * <p>
 *    Description:
 *    动态表单界面插件可以通过系统封装的表单数据模型,访问界面数据。
 * </p>
 * <p>Copyright: Copyright (c) 2020</p>
 * @author xx
 * @date 2020年3月7日
 * @return the bare_field_name
 * @version 1.0
 */
public class FormModelSample extends AbstractFormPlugin {

    /**  
     * <p>Title: getFormModelInstance</p>
     * <p>
     *    Description:
     * </p>
     * <p>Copyright: Copyright (c) 2020</p>
     * @author xx
     * @date 2020年3月7日
     * @return the bare_field_name
     * @version 1.0
     */
    private void getFormModelInstance() {
        IDataModel model = this.getModel();//获取动态表单界面数据模型接口IDataModel的实例
        
        model.getDataEntityType();//获取运行时表单实体元数据对象,又称为主实体模型;通过表单主实体模型,可以或者界面上包含了那些单据体、字段
        model.getProperty("");//获取运行时字段元数据对象,又称为实体的属性对象
        model.createNewData();//根据表单主实体模型,创建表单新的数据包,字段填写好默认值
        model.getDataEntity();//    获取表单数据包
        model.updateCache();//提交当前表单数据包到缓存
        model.getValue("");//   获取字段值
        model.setValue("", null);//设置字段值
        model.setItemValueByNumber(null, null, null);//根据基础资料的编码,设置基础资料字段值
        model.setItemValueByID(null, null, null);//根据基础资料的内码,设置基础资料字段值
        model.getContextVariable(null);//获取上下文变量
        model.putContextVariable(null, null);//添加上下文变量
        model.removeContextVariable(null);//删除上下文变量
        model.addDataModelListener(null);//订阅模型相关事件
        model.addDataModelChangeListener(null);//订阅模型改变事件
    }
}

使用案例

使用案例在后续写出来。。

以上就是我关于 金蝶云苍穹插件原理理解与使用 知识点的整理与总结的全部内容,希望对你有帮助。。。。。。


分割线


上一篇下一篇

猜你喜欢

热点阅读