联动的业务逻辑有多种:
不选L1时,L2列表不显示;选择L1时,L2列表过滤显示;这种需要新做一个动态表单,或者列表模板;
不选L1时,L2列表全部显示;选择L1时,L2列表过滤显示;选择L2时,自动填充L1;这种直接需要使用下面的封装;
如下封装类可以解决页面上,两个基础资料的联动问题;
=====================================================================
/**
* 处理两个基础资料的联动,通用插件可以处理多组联动的问题
*/
public class BasedataDoubleLinkFormPlugin extends AbstractFormPlugin implements BeforeF7SelectListener,ValueToolInterface {
@Override
public void registerListener(EventObject e){
super.registerListener(e);
// 注册L2F7监听
for(String key : getL2L1KeyMap().keySet()){
boolean bl2 = PropertyHelper.existProperty(this.getModel().getDataEntity(), key);
if(bl2){
BasedataEdit be = this.getView().getControl(key);
be.addBeforeF7SelectListener(this);
}
}
}
/**
* key = l2标识
* value=l1标识
*级联关系为l1下的l2
*/
protected Map<String,String> getL2L1KeyMap(){
Map<String,String> l1l2KeyMap = new HashMap();
l1l2KeyMap.put("l2","l1");
return l1l2KeyMap;
}
/**
* key = l1参与过滤的字段
* value=l2参与过滤的字段
*级联关系为l1下的l2
*/
protected Map<String,String> getL1L2FilterFieldMap(){
Map<String,String> l1l2FilterFieldMap = new HashMap();
l1l2FilterFieldMap.put("l1:id","l2:group");
return l1l2FilterFieldMap;
}
/**
* 如果选了二级默认填充一级
* 需要在二级属性引用里面把组字段引入
*/
@Override
public void propertyChanged(PropertyChangedArgs e) {
String name = e.getProperty().getName();
if(getL2L1KeyMap().keySet().contains(name)){
String l1Key = getL2L1KeyMap().get(name);
String l1FieldKey = contains(getL1L2FilterFieldMap(), l1Key);
String[] l1FieldKeyArr = l1FieldKey.split(":");
//
String l2FieldKey = getL1L2FilterFieldMap().get(l1FieldKey);
String[] l2FieldKeyArr = l2FieldKey.split(":");
// 获取增员类别
DynamicObject basedataL2 = (DynamicObject)this.getValueIfExist(this.getModel(), name);
if(basedataL2 != null){
this.getModel().setValue(l1FieldKeyArr[0], getLongValue(basedataL2, l2FieldKeyArr[1]));
}
}
}
/**
*
*/
protected Long getLongValue(DynamicObject basedastaL2, String key){
Object ret = basedataL2.get(key);
if(ret instanceof DynamiObject){
return ((DynamicObject)ret).getLong("id");
} else if(ret instanceof Long){
return (Long) ret ;
}
return null ;
}
@Override
public void beforeF7Select(BeforeF7SelectEvent evt){
ListShowParameter listShowParameter;
String name = evt.getProperty().getName();
if(getL2L1KeyMap().keySet().contains(name)){
String l1Key = getL2L1KeyMap().get(name);
// 获取增员类别
DynamicObject basedataL1 = (DynamicObject)this.getValueIfExist(this.getModel(), l1Key);
if(basedataL1 != null){
String l1FieldKey = contains(getL1L2FilterFieldMap(), l1Key);
if(StringUtils.isNotBlank(l1FieldKey)){
String[] l1KeyFieldArr = l1FieldKey.split(":");
QFilter qFilter = new QFilter(getL1FilterL2Field(getL1L2FilterFieldMap(), l1FieldKey), QCP.equals, basedataL1.getLong(l1KeyFieldArr[1]));
listShowParameter = (ListShowParameter)evt.getFormShowParameter();
// 设置F7列表数据过滤
listShowParameter.getListFilterParameter().getQFilters().add(qFilter);
// 设置F7列表左树的过滤
List<QFilter> qFilters = listShowParameter.getTreeFilterParameter().getQFilters();
if(qFilters != null){
QFilter treeFilter = new QFilter(l1KeyFieldArr[1], QCP.equals, basedataL1.getLong(l1KeyFieldArr[1]));
qFilter.add(treeFilter);
}
}
}
}
}
/**
*
*/
private String getL1FilterL2Field(Map<String, String> l1L2FilterFieldMap, String l1FieldKey){
String l2FilterField = l1L2FilterFieldMap.get(l1FieldKey);
String[] l2KeyFieldArr = l2FilterField.split(":");
return l2KeyFieldArr[1];
}
/**
* 通过l1的标识获取
* l1>l2对应的字段
*/
private String contains(Map<String, String> map, String likeKey){
for(String key : map.keySet()){
if(key.contains(likeKey)){
return key ;
}
}
return "" ;
}
}