电脑桌面
添加蚂蚁七词文库到电脑桌面
安装后可以在桌面快捷访问

如何在单据列表中添加“资金组织视图”过滤控件

来源:金蝶云社区作者:金蝶2024-09-2210

如何在单据列表中添加“资金组织视图”过滤控件

# 【背景】 部分客户的资金组织很多,业务单据查询时,经常需要选择并表单位的一些组织,或非并表单位的一些组织,很难选择。因此希望业务单据查询时,增加按资金组织视图过滤的条件。 # 【思考】 现有单据列表的过滤控件中,只允许添加本单据的字段,而“资金组织视图”字段不在本单据中,通过常规方法无法添加到过滤控件中。 # 【实现步骤】 ## 1. 创建一个含有“资金组织视图”字段的单据 ![image.webp](/download/01000e3e89953ce94dd69384066047cb0941.webp) ![image.webp](/download/010059af6029fe624b328cc3fa0ed4f0317f.webp) ## 2. 创建单据列表插件 继承AbstractListPlugin,并重写父类方法filterContainerInit(过滤面板初始化)、filterContainerSearchClick(改变过滤条件事件)、setFilter(调整条件内容,追加条件) - filterContainerInit:在过滤面板初始化时,手工构建“资金组织视图”过滤字段,并将该字段添加到过滤控件中的常用过滤控件中 ```java @Override public void filterContainerInit(FilterContainerInitArgs args) { super.filterContainerInit(args); if (this.isBillNotHasMainOrg()){ // 列表绑定的单据,没有主业务单元字段:无需增加组织视图过滤字段 return; } this.initArgs = args; this.orgFldId = this.getBillEntityType().getMainOrg() + ".id"; this.orgFldName = this.getBillEntityType().getMainOrg() + ".name"; // 增加组织视图过滤字段 List<FilterColumn> filterColumns = args.getCommonFilterColumns(); // 手工构建资金组织视图字段 CommonBaseDataFilterColumn orgViewColumn = this.buildOrgViewFilterColumn(); if(null != orgViewColumn && !filterColumns.contains(orgViewColumn)) { // 将资金组织视图字段添加到常用过滤控件中,位置可自行调整,这儿放在首位 filterColumns.add(0, orgViewColumn); initOrgCombos(filterColumns); } } ``` 构建资金组织视图过滤字段的过程: ```java /** * 构建资金组织视图过滤条件 * @return */ private CommonBaseDataFilterColumn buildOrgViewFilterColumn() { Class<CommonBaseDataFilterColumn> columnClass = CommonBaseDataFilterColumn.class; CommonBaseDataFilterColumn orgViewColumn = null; // 在FilterColumn类中,filterField字段是受保护的,无法直接设值,这儿使用反射设置filterField值 // realFilterField字段是在CommonFilterColumn类中 try { Field filterField = columnClass.getSuperclass().getSuperclass().getDeclaredField("filterField"); Field realFilterField = columnClass.getSuperclass().getDeclaredField("realFilterField"); orgViewColumn = columnClass.newInstance(); ReflectionUtils.makeAccessible(filterField); ReflectionUtils.makeAccessible(realFilterField); // 这儿的实体类型fcs_orgview_test 就是自己创建的含有资金组织视图的实体 MainEntityType orgViewType = EntityMetadataCache.getDataEntityType("fcs_orgview_test"); // 创建过滤字段 FilterField filterFieldValue = FilterField.create(orgViewType, "orgview.name"); filterField.set(orgViewColumn, filterFieldValue); realFilterField.set(orgViewColumn, filterFieldValue.convertToId()); // 设值资金组织视图过滤字段的属性 orgViewColumn.setEntityType(orgViewType); orgViewColumn.setKey(ORGVIEWID); orgViewColumn.setCaption(new LocaleString(ResManager.loadKDString("资金组织视图","TmcListAddOrgViewPlugin_01", "tmc-fbp-formplugin"))); orgViewColumn.setEntityField(false); orgViewColumn.setFieldName(ORGVIEWID); orgViewColumn.setMustInput(true); orgViewColumn.setEntryEntity("fcs_orgview_test"); orgViewColumn.setView(this.getView()); // 获取登录用户,有权限的资金组织视图 List<ComboItem> combos = this.buildOrgViewComboItems(); // 设置资金组织视图过滤字段的可选项 orgViewColumn.setComboItems(combos); orgViewColumn.setType("enum"); orgViewColumn.setDefaultValue(String.valueOf(DEFAULT_ORG_VIEW_ID)); } catch (Exception e) { logger.error("增加资金组织视图过滤字段失败:", e); } return orgViewColumn; } ``` 设置资金组织视图过滤条件的可选项,查询当前登录用户有权限的资金组织视图: ```java /** * 获取有权限的资金组织视图 * @return */ private List<ComboItem> buildOrgViewComboItems() { // 尝试取缓存的过滤字段 String cacheString = this.getPageCache().get(CACHEKEY_ORGVIEWCOMBOITEMS); if (StringUtils.isNotBlank(cacheString)){ // 已缓存:把缓存的字符串,反序列化为过滤字段 return (List<ComboItem>) SerializationUtils.fromJsonStringToList(cacheString, ComboItem.class); } List<ComboItem> combos = new ArrayList<>(); long userId = RequestContext.get().getCurrUserId(); // 获取有权限的资金组织视图集合 DataSet orgViewDataSet = TmcOrgDataHelper.getAuthorizedBankOrgViewDataSet(userId); Iterator<Row> orgViewIter = orgViewDataSet.iterator(); while(orgViewIter.hasNext()){ Row row = orgViewDataSet.next(); ComboItem item = new ComboItem(); item.setId(row.getString(ID_STR)); item.setCaption(new LocaleString(row.getString("name"))); item.setValue(row.getString(ID_STR)); combos.add(item); } cacheString = SerializationUtils.toJsonString(combos); this.getPageCache().put(CACHEKEY_ORGVIEWCOMBOITEMS, cacheString); return combos; } ``` - filterContainerSearchClick:当页面“资金组织视图”变更时,需要同步修改主业务组织字段的可选项 ```java @Override public void filterContainerSearchClick(FilterContainerSearchClickArgs args) { super.filterContainerSearchClick(args); // 列表绑定的单据,没有主业务单元字段:无需按组织过滤 if (this.isBillNotHasMainOrg()){ return; } // 获取用户在过滤面板中设置的过滤条件:从中搜索出过滤组织视图值 Map<String, List<Map<String, List<Object>>>> filterValues = args.getSearchClickEvent().getFilterValues(); List<Map<String, List<Object>>> customFiterList = filterValues.get("customfilter"); if(customFiterList == null) return ; this.orgViewId = 8; // 逐项条件匹配,找出自定义的组织视图过滤字段 for(int i = customFiterList.size()-1; i >= 0 ; i--){ Map<String, List<Object>> customFiter = customFiterList.get(i); List<Object> fieldNames = customFiter.get(FIELD_NAME_STR); if(fieldNames == null || fieldNames.isEmpty()) continue; if(StringUtils.equals(ORGVIEWID, (String)fieldNames.get(0))){ // 找到了自定义的组织视图过滤字段 List<Object> orgViewIds = customFiter.get(VALUE_STR); if(orgViewIds == null || orgViewIds.isEmpty()) continue; // 取用户在过滤面板上,选择的组织视图,放在本地变量中(后续在setFilter事件中要用到) this.orgViewId = Long.parseLong((String)orgViewIds.get(0)); break; } } // 重新调用过滤面板初始化方法,设置主业务组织字段的可选项 initOrgCombos(this.initArgs.getCommonFilterColumns()); // 设置主业务组织字段的默认值 setDefaultOrgValues(customFiterList); } ``` 根据所选资金组织视图,动态设置主业务组织字段的可选项: ```java private void initOrgCombos(List<FilterColumn> filterColumns) { // 已经有组织视图,且组织视图变更时,需同步变更主业务单元字段的过滤项 for (FilterColumn filterColumn : filterColumns) { String fieldName = filterColumn.getFieldName(); if (orgFldId.equals(fieldName) || orgFldName.equals(fieldName)) { initOrgCombos(filterColumn); } } } /** * 根据所选资金组织视图,动态展示组织可选项 * @param filterColumn */ private void initOrgCombos(FilterColumn filterColumn) { List<Long> orgIds = getPermOrgIds(this.orgViewId); QFilter filter = new QFilter("fisbankroll", QFilter.equals, "1").and("enable", QFilter.equals, "1"); if (orgIds != null) { filter = filter.and(ID_STR, QFilter.in, orgIds); } Map<Object, DynamicObject> orgMap = TmcDataServiceHelper.loadFromCache(TmcEntityConst.ENTITY_ORG, "id,name", filter.toArray()); this.orgMap = orgMap; List<ComboItem> combos = new ArrayList<>(); for (Map.Entry<Object, Dynami

如何在单据列表中添加“资金组织视图”过滤控件

# 【背景】部分客户的资金组织很多,业务单据查询时,经常需要选择并表单位的一些组织,或非并表单位的一些组织,很难选择。因此希望业务...
点击下载文档文档为doc格式

声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。

已经是第一篇
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息
QQ群
  • 答案:my7c点击这里加入QQ群
支持邮箱
微信
  • 微信