package com.iplatform.base.cache;
import com.iplatform.base.Constants;
import com.iplatform.base.service.CodeServiceImpl;
import com.iplatform.model.po.S_dict_data;
import com.iplatform.model.po.S_dict_type;
import com.walker.cache.tree.AbstractCacheTreeProvider;
import com.walker.cache.tree.CacheTreeNode;
import com.walker.cache.tree.DefaultCacheTreeNode;
import com.walker.infrastructure.utils.StringUtils;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
/**
* 数据字典缓存定义,该缓存因为树结构复杂,并没有提供'Redis'方式实现。
* 不过一般字典数据变动很小,因此在集群环境中也是相对安全。
* 1) 注意:如果生产环境字典变动较大,而且是集群环境则必须实现'Redis'集中存储缓存对象。
* @author 时克英
* @date 2023-03-10
*/
public class DictCacheProvider extends AbstractCacheTreeProvider {
private final SortComparator sort = new SortComparator();
private final NodeComparator nodeSort = new NodeComparator();
// 2023-04-15 添加字典类型与id映射记录,因为
private final Map dictTypeIdMap = new HashMap<>();
/**
* 根据字典类型,找出对应id,因为前端若依框架中,需要传类型,但系统使用id查询。
* @param dictType
* @return
* @date 2023-04-15
*/
public String getDictTypeId(String dictType){
String id = this.dictTypeIdMap.get(dictType);
if(id == null){
throw new IllegalArgumentException("根据字典类型,未找到id:" + dictType);
}
return id;
}
/**
* 返回代码集合对象,通常在数据库中可能会存储多个代码ID,可以通过此 方法获取代码集合。
* @param codeIds 输入多个代码ID数组
* @return
*/
public List getCodeList(String[] codeIds){
List result = new ArrayList(2*2);
if(codeIds != null && codeIds.length > 0){
for(String cid : codeIds){
result.add(this.get(cid));
}
}
return result;
}
/**
* 返回给定代码表的子代码项,树结构
* @param codeTableName 代码表ID
* @return
*/
public List getCodeChildrenList(String codeTableName){
CacheTreeNode node = this.getOneRootNode(codeTableName);
if(node == null){
throw new IllegalArgumentException("not found node: " + codeTableName);
}
Collection list = node.getChildren();
if(list != null){
List result = new ArrayList();
for(CacheTreeNode n : list){
result.add(n);
}
Collections.sort(result, nodeSort);
return result;
}
return null;
}
/**
* 返回代码表的下一级子代码集合,返回的是代码对象
* @param codeTableName 代码表ID
* @return
*/
public List getRootChildrenOneLevelList(String codeTableName){
CacheTreeNode node = this.getOneRootNode(codeTableName);
// CacheTreeNode node2 =this.getOneRootNode("101");
// Object rootCacheNode = null;
// for(Iterator it = this.getCache().getIterator(); it.hasNext();){
// rootCacheNode = it.next().getValue();
// logger.debug("........ {}" + rootCacheNode);
// }
if(node == null){
throw new IllegalArgumentException("not found node: " + codeTableName);
}
Collection list = node.getChildren();
if(list != null){
List result = new ArrayList<>();
S_dict_data temp = null;
for(CacheTreeNode n : list){
temp = (S_dict_data)n.getSource();
// temp.setChildSum(n.getChildrenSize());
result.add(temp);
}
Collections.sort(result, sort);
return result;
}
return null;
}
/**
* 根据某个代码ID,返回其下一级所有子代码集合
* @param id
* @return
*/
public List getCodeChildrenOneLevelList(String id){
CacheTreeNode parent = this.get(id);
if(parent == null){
return null;
}
Collection list = parent.getChildren();
if(list != null){
List result = new ArrayList<>();
for(CacheTreeNode n : list){
result.add((S_dict_data)n.getSource());
}
return result;
}
return null;
}
/**
* 返回某个代码下面的所有代码树。
* @param id 给定的代码id
* @return
*/
public List getCodeChildrenTreeList(String id){
CacheTreeNode parent = this.get(id);
if(parent == null){
return null;
}
Collection list = parent.getChildren();
if(list != null){
List result = new ArrayList();
for(CacheTreeNode n : list){
result.add(n);
}
return result;
}
return null;
}
// /**
// * 搜索代码树,支持多关键字搜索,返回集合数据展示给ztree,注意:返回结果只有一级不再分层
// * @param codeTableId 代码表ID
// * @param keyLike 查询关键字,如:'锅炉' 或者 '锅炉 电 9号',多关键词用空格分隔
// * @return
// */
// public String searchLikeTreeNodeList(String codeTableId, String keyLike){
//// Collection deptList = this.getRootList();
// Collection deptList = this.getCodeChildrenList(codeTableId);
// JSONArray array = new JSONArray();
//
// if(deptList != null){
// // 过滤某个单位下的根数据集合,后续补充
// // ...
// String[] keys = StringUtils.stringToArray(keyLike, " ");
// boolean multiKeys = false;
// if(keys != null && keys.length > 1){
// multiKeys = true;
// }
//
// List tempList = null;
// for(CacheTreeNode node : deptList){
// // 不是给定单位的数据不要
//// if(((TypeTree)node.getSource()).getDept() != dept){
//// continue;
//// }
// if(multiKeys){
// logger.debug("------------------");
// tempList = node.searchLike(keys);
// } else {
// tempList = node.searchLike(keyLike);
// }
// if(!StringUtils.isEmptyList(tempList)){
// for(CacheTreeNode c : tempList){
// array.add(CodeUtils.createJsonTree(c.getKey(), c.getText()
// , Constants.DEFAULT_TREE_ROOT_ID, false, true, CodeUtils.DEFAULT_SEARCH_ICON, false));
// }
// }
// }
// }
// return array.toString();
// }
@Override
protected Map loadRootList() {
List rootList = this.codeService.queryRootCodeList();
if(StringUtils.isEmptyList(rootList)){
return null;
}
// 需要转成'S_dict_data'统一对象,老系统中代码表是一个表,这里是两个表。2023-03-10
List dictList = new ArrayList<>();
S_dict_data data = null;
for(S_dict_type type : rootList){
data = new S_dict_data();
data.setDict_code(type.getDict_id());
data.setDict_label(type.getDict_name());
data.setParent_id(0L); // 根节点不存在父id,默认;0
dictList.add(data);
//
this.dictTypeIdMap.put(type.getDict_type(), String.valueOf(type.getDict_id()));
}
return obtainMap(dictList);
}
@Override
protected Map loadChildList() {
List list = this.codeService.queryAllCodeItemList();
return obtainMap(list);
}
@Override
protected CacheTreeNode toCacheTreeNode(S_dict_data entity) {
return new DefaultCacheTreeNode(entity.getDict_code().toString()
, entity.getDict_label(), entity, entity.getParent_id().toString());
}
@Override
public String getProviderName() {
return Constants.CACHE_NAME_DICT;
}
@Override
public Class> getProviderType() {
return S_dict_data.class;
}
private Map obtainMap(List list){
if(list != null && list.size() > 0){
Map map = new TreeMap();
for(S_dict_data code : list){
map.put(code.getDict_code().toString(), toCacheTreeNode(code));
}
return map;
} else
return null;
}
private class SortComparator implements Comparator {
@Override
public int compare(S_dict_data o1, S_dict_data o2) {
return (int)(o1.getDict_sort() - o2.getDict_sort());
}
}
private class NodeComparator implements Comparator{
@Override
public int compare(CacheTreeNode o1, CacheTreeNode o2) {
S_dict_data n1 = (S_dict_data)o1.getSource();
S_dict_data n2 = (S_dict_data)o2.getSource();
return (int)(n1.getDict_sort() - n2.getDict_sort());
}
}
public void setCodeService(CodeServiceImpl codeService) {
this.codeService = codeService;
}
private CodeServiceImpl codeService;
}