Newer
Older
EMS-WEB-3.0 / src / main / java / com / casic / accessControl / feature / manager / FeatureManager.java
wxn on 9 Aug 2016 11 KB first commit
package com.casic.accessControl.feature.manager;

import com.casic.accessControl.common.CommonEnum;
import com.casic.accessControl.core.hibernate.HibernateEntityDao;
import com.casic.accessControl.core.mapper.JsonMapper;
import com.casic.accessControl.core.page.Page;
import com.casic.accessControl.core.util.StringUtils;
import com.casic.accessControl.feature.domain.Feature;
import com.casic.accessControl.feature.dto.FeatureDto;
import com.casic.accessControl.feature.dto.OrgDto;
import com.casic.accessControl.marker.domain.Marker;
import com.casic.accessControl.marker.manager.MarkerManager;
import com.casic.accessControl.user.domain.Company;
import com.casic.accessControl.user.domain.User;
import com.casic.accessControl.util.DataTable;
import com.casic.accessControl.util.DataTableParameter;
import com.casic.accessControl.util.DataTableUtils;
import org.apache.commons.collections.CollectionUtils;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.criterion.Restrictions;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.jdbc.object.SqlQuery;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * Created by lenovo on 2016/5/16.
 */
@Service
public class FeatureManager extends HibernateEntityDao<Feature> {

    private Logger logger = LoggerFactory.getLogger(this.getClass());
    @Resource
    private MarkerManager markerManager;


    public Feature getFeatureById(Long id) {
        Feature feature = null;
        try {
            Criteria criteria = this.getSession().createCriteria(Feature.class);
            criteria.add(Restrictions.eq("id", id)).add(Restrictions.eq("isValid", 1));
            feature = (Feature) criteria.list().get(0);
        } catch (Exception e) {
            return null;
        }
        return feature;
    }

    public FeatureDto getFeatureDtoById(Long id) {
        return FeatureDto.convert2FeatureDto(getFeatureById(id));
    }

    /**
     * 根据id,软删除某个点或线或片
     * 删除的时候判断是否有标识器或者子节点挂载在本feature上,如果有,则不能删除
     *
     * @param ids 多个id
     */
    @CacheEvict(value = "getOrgList", allEntries = true)
    public String invalidFeature(String ids) {
        if (StringUtils.isBlank(ids) || ids.indexOf(")") != -1) {//未传入值,直接返回,防止无效查询,过滤非法请求,防止sql注入
            return "";
        }
        String[] idsArr = ids.split(",");
        StringBuilder canDeleteIds = new StringBuilder("");
        StringBuilder cantDeleleIds = new StringBuilder("");
        //找出能删除的和不能删除的id组合
        for (String id : idsArr) {
            Long longId = Long.valueOf(id);
            if (this.isCanDelete(longId)) {
                if (canDeleteIds.length() > 0) {
                    canDeleteIds.append(",");
                }
                canDeleteIds.append(id);

            } else {
                if (cantDeleleIds.length() > 0) {
                    cantDeleleIds.append(",");
                }
                cantDeleleIds.append(id);
            }
        }

        String temp1Ids = canDeleteIds.toString();
        String temp2Ids = cantDeleleIds.toString();
        if (StringUtils.isNotBlank(temp2Ids)) {//有不能删除的,都不删除
            return "";
        }
        Query query = this.getSession().createQuery("update Feature f set f.isValid = 0 where id in (" + temp1Ids + ")");
        query.executeUpdate();

        return "success";
    }

    /**
     * 判断feature是否可以删除
     * 删除的时候判断是否有标识器或者子节点挂载在本feature上,如果有,则不能删除
     *
     * @param id
     * @return
     */
    private boolean isCanDelete(Long id) {
        Feature feature = this.getFeatureById(id);
        if (feature.getParent() == null) {//所有用户共用的根节点不能删除
            return false;
        }
        if (CollectionUtils.isNotEmpty(feature.getChildren())) {
            for (Feature child : feature.getChildren()) {
                if (child.isValid() == 1) {
                    return false;
                }
            }

        }
        List<Marker> markers = markerManager.getMarkerByFeature(feature);
        if (CollectionUtils.isNotEmpty(markers)) {
            return false;
        }
        return true;
    }

    /**
     * 将数据库中的feature信息按照参数更新
     *
     * @param feature
     */
    @CacheEvict(value = "getOrgList", allEntries = true)
    public void saveOrupdateFeature(Feature feature, User user) {
        this.getSession().saveOrUpdate(feature);
    }


    /**
     * 获取某组织机构下的特定类型Feature列表
     *
     * @param user 特定的Feature类型
     * @return
     */
//    @Cacheable(value = "getFeaturesByUser")
    public List<FeatureDto> getFeaturesByUser(Integer type, User user) {
        if (user == null) {
            return Collections.emptyList();
        }
        Company company = user.getCompany();
        Criteria criteria = this.getSession().createCriteria(Feature.class);
//        if (user.getRole().getType() != CommonEnum.ROLE_TYPE.ADMIN.getType()) {//是管理员,获取该租户下所有类型
//            criteria.add(Restrictions.eq("owner", user));
//        }
        criteria.add(Restrictions.eq("company", company)).add(Restrictions.eq("type", type));
        criteria.add(Restrictions.eq("isValid", 1));
        List<Feature> features = criteria.list();
        return FeatureDto.convert2FeatureDtos(features);
    }

    /**
     * 分页使用,datatable获取相应type的feature某页数据
     *
     * @param params
     * @param user
     * @return
     */
    public DataTable<FeatureDto> getPageFeatureListByTye(String params, Feature parent, User user) {
        DataTable<FeatureDto> result = new DataTable<FeatureDto>();
        DataTableParameter parameter = DataTableUtils.getDataTableParameterByJsonParam(params);
        int start = parameter.getiDisplayStart();
        int pageSize = parameter.getiDisplayLength();
        int pageNo = (start / pageSize) + 1;
        Criteria criteria = this.createCriteria(Feature.class);
//        if (user.getRole().getType() != CommonEnum.ROLE_TYPE.ADMIN.getType()) {//是管理员,获取该租户下所有类型
//            criteria.add(Restrictions.eq("owner", user));
//        }
        Company company = user.getCompany();
        criteria.add(Restrictions.eq("company", company)).add(Restrictions.eq("isValid", 1)).add(Restrictions.eq("parent", parent));
        Page page = pagedQuery(criteria, pageNo, pageSize);
        List<FeatureDto> featureDtos = FeatureDto.convert2FeatureDtos((List<Feature>) page.getResult());
        result.setAaData(featureDtos);
        result.setiTotalDisplayRecords((int) page.getTotalCount());
        result.setiTotalRecords((int) page.getTotalCount());
        result.setsEcho(parameter.getsEcho());
        return result;


    }

    /**
     * 获取层次结构列表,增加缓存
     *
     * @param type
     * @param company
     * @return
     */
    @Cacheable(value = "getOrgList")
    public String getOrgList(Integer type, Company company) {
        List<OrgDto> orgDtos = new ArrayList<OrgDto>();
        List<Feature> features = this.getRootFeatures(type);
        for (Feature feature : features) {
            orgDtos.add(this.getChildrenByParentId(feature.getId(), company));
        }
        String jsonStr = null;
        try {
            jsonStr = new JsonMapper().toJson(orgDtos);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return jsonStr;
    }

    //    @Cacheable(value = "getChildrenByParentId", key = "#id")
    public OrgDto getChildrenByParentId(Long id, Company company) {
        if (id == null) {
            return null;
        }
        Feature feature = getFeatureById(id);
        if (feature == null) {
            return null;
        }
        //创建OrgDto节点
        OrgDto orgDto = new OrgDto();
        orgDto.setId(id); //保存ID信息
        orgDto.setName(feature.getFeatureName());
        if (feature.getParent() != null) {
            orgDto.setParentId(feature.getParent().getId());
        }
        List<Feature> departments = this.getActiveChildrenOrgs(feature, company);
        for (Feature fea : departments) {
            orgDto.getChildren().add(this.getChildrenByParentId(fea.getId(), company));
        }
        return orgDto;
    }

    //    @Cacheable(value = "getActiveChildrenOrgs", key = "#department.getId()")
    private List<Feature> getActiveChildrenOrgs(Feature department, Company company) {
        List<Feature> features = new ArrayList<Feature>();
        for (Feature feature : department.getChildren()) {
            if (feature.isValid() == 1 && feature.getCompany().getId().equals(company.getId())) {
                features.add(feature);
            }
        }
        return features;
    }


    public List<Feature> getRootFeatures(Integer type) {
        List<Feature> features = null;
        try {
            Criteria criteria = this.getSession().createCriteria(Feature.class);
            criteria.add(Restrictions.eq("type", type)).add(Restrictions.isNull("parent"));
            features = criteria.list();
        } catch (Exception e) {
            return Collections.emptyList();
        }
        return features;

    }


    /**
     * 获取某组织机构下的特定类型Feature列表
     *
     * @param company 特定的Feature类型
     * @return
     */
//    @Cacheable(value = "getFeaturesByCompany", key = "#company.getId()")
    public List<Feature> getFeaturesByCompany(Company company) {
        Criteria criteria = this.getSession().createCriteria(Feature.class);
        criteria.add(Restrictions.eq("company", company));
        criteria.add(Restrictions.eq("isValid", 1));
        List<Feature> features = criteria.list();

        for (Feature f : features) {
            f.getChildren().toString();
            f.getOwner().toString();
            if (f.getParent() != null)
                f.getParent().toString();
        }
        return features;
    }

    /**
     * 根据组织结构的id获取叶子节点
     ***重要:**已更改为包含本节点****
     * @param type
     * @param feature
     * @return
     */
    public List<Feature> getLeafByParentId(Integer type, Feature feature) {
        if (feature == null || feature.isValid() == 0) return Collections.emptyList();
        List<Feature> features = new ArrayList<Feature>();
        if (CollectionUtils.isEmpty(feature.getChildren())) {
            features.add(feature);
            return features;
        }
        List<Feature> children = feature.getChildren();
        boolean flag = false;
        for (Feature child : children) {
            if (child.isValid() == 1) {
                flag = true;
                features.addAll(getLeafByParentId(type, child));
            }
        }
//        if (!flag) {//没有有效的子节点
            features.add(feature);
//        }
        return features;
    }

}