那么这时候我会确定,这个功能的流程是:用户选中数据——>点击按钮——>修改选中数据的字段值——>字段列刷新。
这样一来就可以确定,事件触发页面的页面类型(单据列表类型),触发时机(用户点击按钮之后),事件的逻辑(获取到用户选择的数据之后批量修改数据的字段值,最后刷新页面)。

image

二、新建插件类
在IDEA中新建一个项目,在项目的对应plugin路径下,新建一个插件类,新建时选择继承的插件类名与继承的插件类型,例如:
1.我的插件类为页面插件,所以选择plugin目录下的form文件夹新建插件类(右键点击form文件夹,点击新建,选择金蝶插件的继承插件)
 

image

image

2.命名插件类并选择继承的插件类类型,这里我是列表页面插件,于是我选择标准单据列表插件类型

image

新建后的插件类内容:

package ***.plugin.other;
import kd.bos.list.plugin.AbstractListPlugin;
import kd.sdk.plugin.Plugin;
/**
 * 标准单据列表插件
 */
public class teacherListPlugin extends AbstractListPlugin implements PLugin {
}

3.编写代码实现事件的逻辑
3.1,事件按钮添加
因为我的插件事件需要用户点击按钮来触发,所以我在页面上添加了两个新的按钮(状态正常按钮与数量0按钮),
并将按钮的操作代码选择为dothing(空操作),操作后刷新字段一个选择为数量(qty),一个选择为(status)
 

image

image

3.2,编写代码
因为我的事件在用户点击对应按钮后触发,所以首先注册两个按钮的点击监听事件
(添加工具栏按钮点击监听的事件为addItemClickListeners,在生命周期registerListener中添加)

private static final String FID_TOOLBAR = "toolbar";//默认的工具栏标识
    @Override
    public void registerListener(EventObject e) {
        super.registerListener(e);
        this.addItemClickListeners(FID_TOOLBAR);// 添加工具栏按钮点击的监听事件,监听的工具栏为字段标识对应的工具栏
    }

插件类全代码:

package ***.plugin.other;
import kd.bos.list.plugin.AbstractListPlugin;
import kd.sdk.plugin.Plugin;
import java.util.EventObject;

/**
 * 标准单据列表插件
 */
public class teacherListPlugin extends AbstractListPlugin implements Plugin {
    private static final String toolbar = "toolbar";//默认的工具栏标识
    @Override
    public void registerListener(EventObject e) {
        super.registerListener(e);
        this.addItemClickListeners(toolbar);// 添加工具栏按钮点击的监听事件,监听的工具栏为字段标识对应的工具栏
    }
}

然后注册两个按钮的监听事件:

private static final String statusbtn = "statusbtn";//状态正常按钮的对应字段标识
private static final String qtybtn = "qtybtn";//数量0按钮的对应字段标识
@Override
    public void itemClick(ItemClickEvent evt) {
        if (statusbtn.equals(evt.getItemKey())) {//监听状态正常按钮的点击事件
            status();//状态正常事件逻辑处理方法
        } else if (qtybtn.equals(evt.getItemKey())) {//监听数量0按钮的点击事件
            qty();//数量重置为0事件逻辑处理方法
        }
    }
private void status(){//状态正常事件逻辑

}
private void qty(){//数量0事件逻辑

}

插件类全部代码:

package ***.plugin.other;
import kd.bos.form.control.events.ItemClickEvent;
import kd.bos.list.plugin.AbstractListPlugin;
import kd.sdk.plugin.Plugin;
import java.util.EventObject;

/**
 * 标准单据列表插件
 */
public class teacherListPlugin extends AbstractListPlugin implements Plugin {
    private static final String toolbar = "toolbar";//默认的工具栏标识
    private static final String statusbtn = "statusbtn";//状态正常按钮的对应字段标识
    private static final String qtybtn = "qtybtn";//数量0按钮的对应字段标识
    @Override
    public void registerListener(EventObject e) {
        super.registerListener(e);
        this.addItemClickListeners(toolbar);// 添加工具栏按钮点击的监听事件,监听的工具栏为字段标识对应的工具栏
    }
    @Override
    public void itemClick(ItemClickEvent evt) {
        if (statusbtn.equals(evt.getItemKey())) {//监听状态正常按钮的点击事件
            status();//状态正常事件逻辑处理方法
        } else if (qtybtn.equals(evt.getItemKey())) {//监听数量0按钮的点击事件
            qty();//数量重置为0事件逻辑处理方法
        }
    }
    private void status(){//状态正常事件逻辑

    }
    private void qty(){//数量0事件逻辑

    }
}

然后开始编写事件逻辑方法,(补充:状态字段的字段标识为status,控件类型为下拉列表,状态正常的对应值为"0",数量字段的字段标识为qty,控件类型为整数)
状态正常事件:

private void status(){//状态正常事件逻辑
        ListSelectedRowCollection selectedRows = this.getSelectedRows();//获取当前列表选中行的索引
        if (selectedRows == null || selectedRows.isEmpty()) {//校验选中行数量是否为空,为空则停止事件并提示
            this.getView().showTipNotification("请先选择要操作的数据");
            return;
        }
        //根据选中行的索引获取对应数据的主键值
        List<Long> ids = new ArrayList<>();
        for(ListSelectedRow row : selectedRows){
            ids.add((Long)row.getPrimaryKeyValue());
        }
        //根据获取到的对应事件主键值批量查询获取数据
        DynamicObject[] datas = BusinessDataServiceHelper.load("teacher",//第一个参数:要查询数据的表单的标识
                "id,number,name,status",//第二个参数:要查询的数据的属性名
                new QFilter[]{new QFilter("id", QCP.in,ids)}//第三个参数:要查询的数据的过滤条件
        );
        //遍历数据数组,对数据的对应字段的值进行修改
        for (DynamicObject data : datas){
            data.set("status","0");//正常状态的对应值为"0"
        }
        SaveServiceHelper.save(datas);//保存修改后的结果
        this.getView().invokeOperation("refresh");//刷新页面
}

数量0事件:

ListSelectedRowCollection selectedRows = this.getSelectedRows();//获取当前列表选中行的索引
        if (selectedRows == null || selectedRows.isEmpty()) {//校验选中行数量是否为空,为空则停止事件并提示
            this.getView().showTipNotification("请先选择要操作的数据");
            return;
        }
        //根据选中行的索引获取对应数据的主键值
        List<Long> ids = new ArrayList<>();
        for(ListSelectedRow row : selectedRows){
            ids.add((Long)row.getPrimaryKeyValue());
        }
        //根据获取到的对应事件主键值批量查询获取数据
        DynamicObject[] datas = BusinessDataServiceHelper.load("teacher",//第一个参数:要查询数据的表单的标识
                "id,number,name,qty",//第二个参数:要查询的数据的属性名
                new QFilter[]{new QFilter("id", QCP.in,ids)}//第三个参数:要查询的数据的过滤条件
        );
Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐