package com.cl.privilege.biz.impl;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.cl.privilege.biz.IResourceService;
import com.cl.privilege.mapper.ModuleMapper;
import com.cl.privilege.mapper.ResourceMapper;
import com.cl.privilege.model.Module;
import com.cl.privilege.model.Resource;
import com.cl.privilege.model.User;
import com.cl.privilege.utils.StringUtil;
@Service
public class ResourceServiceImpl implements IResourceService {
@Autowired
private ModuleMapper moduleMapper;
@Autowired
private ResourceMapper resourceMapper;
private void setResourceInsert(Resource resource,User operator)
{
Date d = new Date();
resource.setCreatePerson(operator.getUsername());
resource.setUpdatePerson(operator.getUsername());
resource.setCreateDate(d);
resource.setUpdateDate(d);
}
private void setResourceUpdate(Resource resource,User operator)
{
Date d = new Date();
resource.setUpdatePerson(operator.getUsername());
resource.setUpdateDate(d);
}
@Override
public List<Resource> getResourceList()
{
return resourceMapper.getResourceList();
}
@Override
public List<Resource> getResourceListByModuleFlag(List<String> moduleFlags,Integer userId) {
return resourceMapper.getResourceListByModuleFlag(moduleFlags,userId);
}
@Override
public Resource getResourceById(Integer id)
{
return resourceMapper.selectByPrimaryKey(id);
}
@Override
public Integer createResource(Resource resource,User user)
{
//生成structure
String structure = "1";
Resource parentResource = resourceMapper.selectByPrimaryKey(resource.getParentId());
List<Resource> resources = resourceMapper.getResourceListByParentId(resource.getParentId());
if(resources==null || resources.size()==0)
{
structure = parentResource.getStructure()+"-1";
} else {
Integer parentLevel = parentResource.getStructure().split("-").length;
for(Resource r:resources)
{
String[] structures = r.getStructure().split("-");
if(structures.length == parentLevel + 1)
{
if(StringUtil.isNumber(structures[structures.length-1])&&StringUtil.compareTo(structures[structures.length-1], structure)>0)
{
structure = structures[structures.length-1];
}
}
}
structure = String.valueOf(Integer.parseInt(structure) + 1);
structure = parentResource.getStructure()+"-" + structure;
}
resource.setStructure(structure);
setResourceInsert(resource,user);
return resourceMapper.insertSelective(resource);
}
@Override
public Integer updateResourceById(Resource resource,User user)
{
setResourceUpdate(resource,user);
return resourceMapper.updateByPrimaryKeySelective(resource);
}
@Override
public Integer deleteResourceById(Integer id)
{
return resourceMapper.deleteByPrimaryKey(id);
}
@Override
public Boolean isUsedByRole(Integer resourceId) {
return resourceMapper.isUsedByRole(resourceId);
}
@Override
public List<Resource> getResourceListByRoleId(Integer roleId)
{
return resourceMapper.getResourceListByRoleId(roleId);
}
@Override
public String getResourceTree(Integer roleId)
{
Set<Integer> setResource = new HashSet<Integer>();
if(roleId != null)
{
List<Resource> tempResourceList = resourceMapper.getResourceListByRoleId(roleId);
if(tempResourceList!=null && tempResourceList.size()>0)
{
for(Resource r:tempResourceList)
{
setResource.add(r.getId());
}
}
}
List<Module> moduleList = moduleMapper.getModuleList();
List<Resource> resourceList = resourceMapper.getResourceList();
Collections.sort(moduleList,new ComparatorModule());
Collections.sort(resourceList,new ComparatorResource());
Set<Integer> setParent = new HashSet<Integer>();
for(Resource r:resourceList)
{
setParent.add(r.getParentId());
}
StringBuilder sb = new StringBuilder();
Map<String,Integer> mapModule = new HashMap<String,Integer>();
sb.append("[");
int i = 0;
for(Module m:moduleList)
{
mapModule.put(m.getFlag(), m.getId());
if(i!=0)
{
sb.append(",");
}
i++;
sb.append("{")
.append("\"id\":\"").append("m_").append(m.getId()).append("\"")
.append(",\"parent\":\"").append("#\"")
.append(",\"text\":\"").append(m.getName()).append("\"")
.append(",\"li_attr\":{\"flag\":\"").append(m.getFlag()).append("\"}");
//前两个级别默认打开
sb.append(",\"state\":{");
sb.append("\"opened\":true");
sb.append("}");
sb.append("}");
}
i = 0;
for(Resource r:resourceList)
{
int level = r.getStructure().split("-").length;
sb.append(",");
i++;
sb.append("{")
.append("\"id\":\"").append(r.getId()).append("\"")
.append(",\"parent\":\"").append(r.getParentId()==0?("m_"+mapModule.get(r.getModuleFlag())):r.getParentId()).append("\"")
.append(",\"text\":\"").append(r.getName()).append("\"")
.append(",\"li_attr\":{\"flag\":\"").append(r.getModuleFlag())
.append("\",\"sortNo\":").append(r.getSortNo()).append("}");
//前两个级别默认打开
if(level <=2)
{
sb.append(",\"state\":{\"opened\":true");
if(setResource.contains(r.getId()))
{
sb.append(",\"selected\":true");
}
sb.append("}");
} else {
if(setResource.contains(r.getId()))
{
sb.append(",\"state\":{\"opened\":true}");
}
}
//最后一个级别换个绿色图标
if(!setParent.contains(r.getId()))
{
sb.append(", \"icon\": \"fa fa-briefcase icon-success\"");
}
sb.append("}");
}
sb.append("]");
return sb.toString();
}
/**
* Module排序器,保证jsTree可以按照SortNo字段显示
*/
class ComparatorModule implements Comparator<Module> {
public int compare(Module r1, Module r2) {
return r1.getSortNo().compareTo(r2.getSortNo());
}
}
/**
* Resource排序器,保证jsTree可以按照SortNo字段显示
*/
class ComparatorResource implements Comparator<Resource> {
public int compare(Resource r1, Resource r2) {
int l1 = r1.getStructure().length();
int l2 = r2.getStructure().length();
if(l1 == l2 )
{
return r1.getSortNo().compareTo(r2.getSortNo());
}
return l1>l2?1:-1;
}
}
}