自定义卡片实现首页单据数量的统计,类似标品【单据统计卡片】原创
金蝶云社区-丁梦洋
丁梦洋
2人赞赏了该文章 526次浏览 未经作者许可,禁止转载编辑于2024年04月16日 16:57:42

最近有个工作台的需求,要统计单据列表总数,如图

image.png

一、实现方案

本来想直接用平台的单据统计卡片,就是这个

image.png但【单据界面】只能选择应用菜单里、可见的菜单,关联的表单单据,也就是说单据得配过菜单且要可见,才能用这个卡片

但我们的菜单配置的是一个动态表单,类似于总览,需要统计的那些单据是作为不同的tab嵌入进去的(如下图),没有直接关联的菜单,所以用不了...

image.png

然后想着根据列表的过滤条件,组装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人打赏
还没有人打赏,快来当第一个打赏的人吧!