本文讨论了在一个软件开发环境中(版本V4.0.0.14),针对单据中多选基础资料字段(以用户为例)在移动端表单的F7选择界面显示问题。由于多选基础资料的F7选择界面默认只显示编码和名称,无法展示如部门等其他信息,因此提出通过自定义方式实现与用户字段相同的F7选择界面。具体方案是,通过showform打开与用户字段相同的F7选择界面,并在选择数据后通过closedcallback回调将选择的数据回填到多选基础资料字段中。文中详细描述了实现过程,包括增加按钮、编写点击事件监听、构造移动表单参数、处理closedcallback回调等步骤,并提供了相关代码示例。最后,展示了实现效果和开发环境版本,以及参考资料。
关键字:多选基础资料、F7选择界面、移动端
一、需求
当单据有多选基础资料字段,基础资料类型绑定用户(以用户为例)。移动表单增加该多选基础资料,点击打开的F7选择界面只有编码和名称两个字段,无法知晓员工是哪个部门的,希望打开的F7选择界面跟用户字段打开的F7字段一样。
二、思路与方案
多选基础资料打开的F7选择界面是统一的选择界面,界面只有名称和编码,是因为多选基础资料要绑定不同类型的基础资料,而编码和名称是基础资料必有的字段,其他字段不一定有,所以无法在该界面增加其它字段。
因此需要变通处理,方案是通过showform打开跟用户一样的界面,选择数据后在closedcallback再回填给多选基础资料。
三、实现过程
前提是单据增加了【会签人员】字段(多选基础资料,基础类型绑定了用户bos_user)和【用户】字段。
1.首先在移动表单增加【会签人员】和用户人员字段,【会签人员】锁定性勾选所有,然后增加一个按钮【添加会签按钮】,如图:
并给按钮添加点击事件监听,代码如下
@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); } }
难点在于showParameter的FormId是什么,CustomParams都有哪些参数,这时候【用户】这个字段就派上用场了,在kd.bos.mvc.form.FormView.showForm(FormShowParameter)打上断点,点击【用户】字段时会进入该断点,就可以看到移动端用户F7选择界面的MobileFormShowParameter都有什么参数,如图,isMulti代表是否多选,改为true即可,其他保持不变。(【用户】字段没有实际的业务意义,用完可删除掉,或设置不可见)
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");*/ } }
四、实现效果
预览界面
打开移动端用户F7选择界面,支持多选
选择后返回数据到【会签人员】
五、开发环境版本
V4.0.0.14
六、参考资料
移动端多选基础资料自定义F7界面的附件.rar(35.61KB)
推荐阅读