自定义卡片实现首页单据数量的统计,类似标品【单据统计卡片】原创
2人赞赏了该文章
526次浏览
编辑于2024年04月16日 16:57:42
最近有个工作台的需求,要统计单据列表总数,如图
一、实现方案
本来想直接用平台的单据统计卡片,就是这个
但【单据界面】只能选择应用菜单里、可见的菜单,关联的表单单据,也就是说单据得配过菜单且要可见,才能用这个卡片。
但我们的菜单配置的是一个动态表单,类似于总览,需要统计的那些单据是作为不同的tab嵌入进去的(如下图),没有直接关联的菜单,所以用不了...
然后想着根据列表的过滤条件,组装QFilter去查,但是维护比较困难,后续列表调整过滤条件,就得改此处的代码;而且列表有被标品控权,得自己去组装权限相关的QFilter,很麻烦,后续改控权逻辑本来改配置就行,这里还得跟着调整代码。
最终方案是采用加一个flex容器用来打开单据列表,等列表数据加载完后把总数传递回去的方式,这样就不会有上述烦恼,速度也还能够接受。
二、代码实现(苍穹5.0)
自定义卡片元数据加一个隐藏的flex容器,表单插件:
@Override public void afterCreateNewData(EventObject e) { super.afterCreateNewData(e); queryBillListCountData("用来显示总数的控件标识","要统计的单据标识"); } private void queryBillListCountData(String fieldId, String billFormId){ ListShowParameter listShowParameter = new ListShowParameter(); listShowParameter.setBillFormId(billFormId); listShowParameter.setFormId("bos_list"); listShowParameter.getOpenStyle().setShowType(ShowType.InContainer); listShowParameter.getOpenStyle().setTargetKey("隐藏的flex容器标识"); listShowParameter.setStatus(OperationStatus.VIEW); //标记打开列表是为了统计总数,后面列表插件要用 listShowParameter.setCustomParam("HOMEPAGE_QUERYTOTAL_FLAG", true); //传控件标识方便回传时显示统计数量 listShowParameter.setCustomParam("HOMEPAGE_QUERYTOTAL_FIELDID", fieldId); listShowParameter.setCloseCallBack(new CloseCallBack(this,"homepage")); //有的用户可能没有此单据权限,如果不设置为true,打开列表就会报没有权限,closedCallBack方法就不会被触发,设置为true,列表可正常打开,数量为0,合理 listShowParameter.setHasRight(true); this.getView().showForm(listShowParameter); } @Override public void closedCallBack(ClosedCallBackEvent closedCallBackEvent) { super.closedCallBack(closedCallBackEvent); //拿到列表回传的总数进行显示, k->控件标识 v->单据总数 Map<String, String> dataMap = (Map<String, String>) closedCallBackEvent.getReturnData(); for (Map.Entry<String, String> entry : dataMap.entrySet()) { //数量不为空 if (StringUtils.isNotEmpty(entry.getValue())){ //这里用的是标签控件来显示总数 Label ctl = this.getView().getControl(entry.getKey()); ctl.setText(entry.getValue()); } } }
还需要给被统计的单据列表上添加一个专门的插件,如下
(或者在上面代码加上listShowParameter.addCustPlugin("xxx.xxx.HomepageCountListPlugin"),这样不用改元数据,更方便)
public class HomepageCountListPlugin extends AbstractListPlugin { /** * kd.bos.list.BillList.getData方法触发后才能拿到当前列表的全部数量,否则在此之前拿的是数据库表数量,所以最早也得在afterBindData里获取 * @param e */ @Override public void afterBindData(EventObject e) { super.afterBindData(e); FormShowParameter showParameter = this.getView().getFormShowParameter(); Object flag = showParameter.getCustomParam("HOMEPAGE_QUERYTOTAL_FLAG"); //不要影响其他正常情况 if (Objects.nonNull(flag) && flag instanceof Boolean && (Boolean)flag){ BillList billList = this.getView().getControl(BILLLISTID); IListModel model = billList.getListModel(); int count = model.getDataCount(); Map<String, String> map = new HashMap<>(); map.put(showParameter.getCustomParam("HOMEPAGE_QUERYTOTAL_FIELDID"),String.valueOf(count)); this.getView().returnDataToParent(map); this.getView().close(); } } }
如果想实现卡片里展示多个单据的统计数量,可以在表单插件里静态维护一个map(key为显示控件标识,value为单据标识),closedCallBack方法里找到下一个entry,再次调用queryBillListCountData方法(实际使用方案)。或者干脆添加N个隐藏的flex容器,用于打开不同的单据。
赞 2
2人点赞
还没有人点赞,快来当第一个点赞的人吧!
打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!
推荐阅读