如何针对移动端多选基础资料字段自定义F7列表界面原创
金蝶云社区-wbshcy
wbshcy
4人赞赏了该文章 2876次浏览 未经作者许可,禁止转载编辑于2022年04月15日 11:19:24

关键字:多选基础资料、F7选择界面、移动端

一、需求

当单据有多选基础资料字段,基础资料类型绑定用户(以用户为例)。移动表单增加该多选基础资料,点击打开的F7选择界面只有编码和名称两个字段,无法知晓员工是哪个部门的,希望打开的F7选择界面跟用户字段打开的F7字段一样。

二、思路与方案

多选基础资料打开的F7选择界面是统一的选择界面,界面只有名称和编码,是因为多选基础资料要绑定不同类型的基础资料,而编码和名称是基础资料必有的字段,其他字段不一定有,所以无法在该界面增加其它字段。

因此需要变通处理,方案是通过showform打开跟用户一样的界面,选择数据后在closedcallback再回填给多选基础资料。

三、实现过程

前提是单据增加了【会签人员】字段(多选基础资料,基础类型绑定了用户bos_user)和【用户】字段。

1.首先在移动表单增加【会签人员】和用户人员字段,【会签人员】锁定性勾选所有,然后增加一个按钮【添加会签按钮】,如图:

 

图片1.png

 

并给按钮添加点击事件监听,代码如下


  @Override
public void registerListener(EventObject e) {
// TODO Auto-generated method stub
super.registerListener(e);
Button button=this.getControl("kded_btnaddsignperson");
button.addClickListener(this);
}


2.点击按钮时,弹出移动端用户F7选择界面,代码如下:

 

@Override
public void click(EventObject evt) {
// TODO Auto-generated method stub
super.click(evt);
Button button=(Button) evt.getSource(); 
if("kded_btnaddsignperson".equals(button.getKey())){
//弹出移动端用户F7选择界面,需要构造移动表单参数
MobileFormShowParameter showParameter = new MobileFormShowParameter();
    showParameter.setFormId("bos_mobileuserlist"); //移动端用户F7选择界面的标识 
    showParameter.getOpenStyle().setShowType(ShowType.Floating);
    //获取会签人员已选择的用户
    DynamicObjectCollection personcol = (DynamicObjectCollection) this.getModel().getValue("kded_signperson");
    List<Long> list =new ArrayList<Long>();
    for (int i=0;i<personcol.size();i++) {
     list.add(personcol.get(i).getDynamicObject("fbasedataid").getLong("id"));
        }
    HashMap<String, Object> hashMap=new HashMap<String, Object>();
    hashMap.put("isMulti", true);//支持多选
    hashMap.put("islookup", true);
    hashMap.put("entityId", "bos_user");//F7实体标识
    hashMap.put("_F7Style_", "0");
    hashMap.put("selected", list);//设置F7已选数据
    showParameter.setCustomParams(hashMap); 
    CloseCallBack closeCallBack=new CloseCallBack(this, "addperson");//设置CloseCallBack标识  
    showParameter.setCloseCallBack(closeCallBack);
    this.getView().showForm(showParameter);
}
}


难点在于showParameterFormId是什么,CustomParams都有哪些参数,这时候【用户】这个字段就派上用场了,在kd.bos.mvc.form.FormView.showForm(FormShowParameter)打上断点,点击【用户】字段时会进入该断点,就可以看到移动端用户F7选择界面的MobileFormShowParameter都有什么参数,如图,isMulti代表是否多选,改为true即可,其他保持不变。(【用户】字段没有实际的业务意义,用完可删除掉,或设置不可见)

 

图片2.png

 

3.在弹出的移动端用户F7选择界面选择多个人员后确定会触发closedback事件,在该事件需要把选择的人员回填到【会签人员】字段,实现代码如下:

@Override
public void closedCallBack(ClosedCallBackEvent closedCallBackEvent) {
// TODO Auto-generated method stub
super.closedCallBack(closedCallBackEvent);
//判断CloseCallBack标识是不是弹出移动端用户F7选择界面时设置的标识
if(("addperson").equals(closedCallBackEvent.getActionId())){
//获取返回数据
ListSelectedRowCollection listcol= (ListSelectedRowCollection) closedCallBackEvent.getReturnData();
if(listcol.size()==0) {
this.getModel().setValue("kded_signperson", null); //若返回数据为空,则【会签人员】为空 
}else 
{
//清空【会签人员】之前选择的人员
DynamicObjectCollection personcol = (DynamicObjectCollection) this.getModel().getValue("kded_signperson");
personcol.clear();
//将返回数据填充到personcol
for(int i=0;i<listcol.size();i++) { 
Object pk = listcol.get(i).getPrimaryKeyValue();
//不用QueryServiceHelper查,QueryServiceHelper查出数据是平铺的,无结构化 
DynamicObject data = BusinessDataServiceHelper.loadSingle(pk, "bos_user"); 
personcol.addNew().set("fbasedataid",data);          
}
//更新【会签人员】的值
this.getModel().setValue("kded_signperson", personcol); 
}
/** 方式2*/
    /*DynamicObjectCollection personcol = this.getModel().getDataEntity(true).getDynamicObjectCollection("kded_signperson");
personcol.clear();
//将返回数据填充到personcol
for(int i=0;i<listcol.size();i++) { 
Object pk = listcol.get(i).getPrimaryKeyValue();
//不用QueryServiceHelper查,QueryServiceHelper查出数据是平铺的,无结构化 
DynamicObject data = BusinessDataServiceHelper.loadSingle(pk, "bos_user"); 
personcol.addNew().set("fbasedataid",data);          
}
this.getView().updateView("kded_signperson");*/
}
}


四、实现效果

预览界面

图片3.png

 

打开移动端用户F7选择界面,支持多选

 

图片4.png

选择后返回数据到【会签人员】

 

图片5.png

 

五、开发环境版本

V4.0.0.14

、参考资料

弹窗实现以及父子页面传参

界面参数构造

多选基础资料赋值


赞 4