2017-12-19 14:55:52 +08:00
|
|
|
|
package com.nis.web.service;
|
|
|
|
|
|
|
2018-12-10 10:23:48 +06:00
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
|
import java.util.Arrays;
|
|
|
|
|
|
import java.util.Calendar;
|
|
|
|
|
|
import java.util.Date;
|
2017-12-19 14:55:52 +08:00
|
|
|
|
import java.util.List;
|
2018-12-10 10:23:48 +06:00
|
|
|
|
import java.util.Map;
|
|
|
|
|
|
import java.util.Set;
|
2017-12-19 14:55:52 +08:00
|
|
|
|
|
|
|
|
|
|
import org.slf4j.Logger;
|
|
|
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
|
|
|
|
|
|
|
|
import com.google.common.collect.Lists;
|
|
|
|
|
|
import com.nis.domain.SysRole;
|
|
|
|
|
|
import com.nis.domain.SysUser;
|
|
|
|
|
|
import com.nis.util.StringUtils;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Service基类
|
2018-12-10 10:23:48 +06:00
|
|
|
|
*
|
2017-12-19 14:55:52 +08:00
|
|
|
|
* @author ThinkGem
|
|
|
|
|
|
* @version 2014-05-16
|
|
|
|
|
|
*/
|
|
|
|
|
|
public abstract class BaseService {
|
2018-12-10 10:23:48 +06:00
|
|
|
|
|
2017-12-19 14:55:52 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 日志对象
|
|
|
|
|
|
*/
|
|
|
|
|
|
protected Logger logger = LoggerFactory.getLogger(getClass());
|
2018-12-10 10:23:48 +06:00
|
|
|
|
|
2017-12-19 14:55:52 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 数据范围过滤
|
2018-12-10 10:23:48 +06:00
|
|
|
|
*
|
|
|
|
|
|
* @param user 当前用户对象,通过“entity.getCurrentUser()”获取
|
2017-12-19 14:55:52 +08:00
|
|
|
|
* @param officeAlias 机构表别名,多个用“,”逗号隔开。
|
2018-12-10 10:23:48 +06:00
|
|
|
|
* @param userAlias 用户表别名,多个用“,”逗号隔开,传递空,忽略此参数
|
2017-12-19 14:55:52 +08:00
|
|
|
|
* @return 标准连接条件对象
|
|
|
|
|
|
*/
|
|
|
|
|
|
public static String dataScopeFilter(SysUser user, String officeAlias, String userAlias) {
|
|
|
|
|
|
|
|
|
|
|
|
StringBuilder sqlString = new StringBuilder();
|
2018-12-10 10:23:48 +06:00
|
|
|
|
|
2017-12-19 14:55:52 +08:00
|
|
|
|
// 进行权限过滤,多个角色权限范围之间为或者关系。
|
|
|
|
|
|
List<Integer> dataScope = Lists.newArrayList();
|
2018-12-10 10:23:48 +06:00
|
|
|
|
|
|
|
|
|
|
if (StringUtils.isBlank(user.getLoginId())) {
|
2017-12-19 14:55:52 +08:00
|
|
|
|
return "";
|
|
|
|
|
|
}
|
2018-12-10 10:23:48 +06:00
|
|
|
|
|
2017-12-19 14:55:52 +08:00
|
|
|
|
// 超级管理员,跳过权限过滤
|
2018-12-10 10:23:48 +06:00
|
|
|
|
if (user.isAdmin()) {
|
2017-12-19 14:55:52 +08:00
|
|
|
|
boolean isDataScopeAll = isContainsDataScopeAll(user.getUserRoleList());
|
2018-12-10 10:23:48 +06:00
|
|
|
|
|
2017-12-19 14:55:52 +08:00
|
|
|
|
for (SysRole r : user.getUserRoleList()) {
|
2018-12-10 10:23:48 +06:00
|
|
|
|
for (String oa : StringUtils.split(officeAlias, ",")) {
|
|
|
|
|
|
if (!dataScope.contains(r.getDataScope()) && StringUtils.isNotBlank(oa)) {
|
|
|
|
|
|
|
|
|
|
|
|
sqlString.append(createScopeSql(r.getDataScope(), oa, user));
|
2017-12-19 14:55:52 +08:00
|
|
|
|
dataScope.add(r.getDataScope());
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
// 如果没有全部数据权限,并设置了用户别名,则当前权限为本人;如果未设置别名,当前无权限为已植入权限
|
2018-12-10 10:23:48 +06:00
|
|
|
|
if (!isDataScopeAll) {
|
|
|
|
|
|
if (StringUtils.isNotBlank(userAlias)) {
|
|
|
|
|
|
for (String ua : StringUtils.split(userAlias, ",")) {
|
2017-12-19 14:55:52 +08:00
|
|
|
|
sqlString.append(" OR " + ua + ".id = '" + user.getId() + "'");
|
|
|
|
|
|
}
|
2018-12-10 10:23:48 +06:00
|
|
|
|
} else {
|
|
|
|
|
|
for (String oa : StringUtils.split(officeAlias, ",")) {
|
|
|
|
|
|
// sqlString.append(" OR " + oa + ".id = " + user.getOffice().getId());
|
2017-12-19 14:55:52 +08:00
|
|
|
|
sqlString.append(" OR " + oa + ".id IS NULL");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2018-12-10 10:23:48 +06:00
|
|
|
|
} else {
|
2017-12-19 14:55:52 +08:00
|
|
|
|
// 如果包含全部权限,则去掉之前添加的所有条件,并跳出循环。
|
|
|
|
|
|
sqlString = new StringBuilder();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2018-12-10 10:23:48 +06:00
|
|
|
|
if (StringUtils.isNotBlank(sqlString.toString())) {
|
2017-12-19 14:55:52 +08:00
|
|
|
|
return " AND (" + sqlString.substring(4) + ")";
|
|
|
|
|
|
}
|
|
|
|
|
|
return "";
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 测试数据是否包含全集
|
2018-12-10 10:23:48 +06:00
|
|
|
|
*
|
2017-12-19 14:55:52 +08:00
|
|
|
|
* @return
|
|
|
|
|
|
*/
|
|
|
|
|
|
private static boolean isContainsDataScopeAll(List<SysRole> roleList) {
|
|
|
|
|
|
boolean isDataScopeAll = false;
|
2018-12-10 10:23:48 +06:00
|
|
|
|
|
|
|
|
|
|
for (SysRole role : roleList) {
|
|
|
|
|
|
if (SysRole.DATA_SCOPE_ALL.equals(role.getDataScope())) {
|
2017-12-19 14:55:52 +08:00
|
|
|
|
isDataScopeAll = true;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2018-12-10 10:23:48 +06:00
|
|
|
|
|
2017-12-19 14:55:52 +08:00
|
|
|
|
return isDataScopeAll;
|
2018-12-10 10:23:48 +06:00
|
|
|
|
|
2017-12-19 14:55:52 +08:00
|
|
|
|
}
|
2018-12-10 10:23:48 +06:00
|
|
|
|
|
2017-12-19 14:55:52 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 过滤机构信息
|
2018-12-10 10:23:48 +06:00
|
|
|
|
*
|
|
|
|
|
|
* @param dataScope 数据范围(1:所有数据;2:所在公司及以下数据;3:所在公司数据;4:所在部门及以下数据;5:所在部门数据;6:所在单位及以下数据;7:所在单位数据)
|
2017-12-19 14:55:52 +08:00
|
|
|
|
* @return
|
|
|
|
|
|
*/
|
2018-12-10 10:23:48 +06:00
|
|
|
|
private static String createScopeSql(int dataScope, String officeAlias, SysUser user) {
|
2017-12-19 14:55:52 +08:00
|
|
|
|
StringBuilder scopeSql = new StringBuilder(1024);
|
2018-12-10 10:23:48 +06:00
|
|
|
|
|
|
|
|
|
|
if (SysRole.DATA_SCOPE_COMPANY_AND_CHILD.equals(dataScope)) {
|
2017-12-19 14:55:52 +08:00
|
|
|
|
scopeSql.append(" OR " + officeAlias + ".id = " + user.getCompany().getId());
|
2018-12-10 10:23:48 +06:00
|
|
|
|
scopeSql.append(" OR " + officeAlias + ".parent_ids LIKE '" + user.getCompany().getParentIds()
|
|
|
|
|
|
+ user.getCompany().getId() + ",%'");
|
|
|
|
|
|
} else if (SysRole.DATA_SCOPE_COMPANY.equals(dataScope)) {
|
2017-12-19 14:55:52 +08:00
|
|
|
|
scopeSql.append(" OR " + officeAlias + ".id = " + user.getCompany().getId());
|
|
|
|
|
|
// 包括本公司下的部门 (type=1:公司;type=2:单位 3.部门)
|
2018-12-10 10:23:48 +06:00
|
|
|
|
scopeSql.append(" OR (" + officeAlias + ".parent_id = '" + user.getCompany().getId() + "' AND "
|
|
|
|
|
|
+ officeAlias + ".type>1)");
|
|
|
|
|
|
} else if (SysRole.DATA_SCOPE_OFFICE_AND_CHILD.equals(dataScope)) {
|
2017-12-19 14:55:52 +08:00
|
|
|
|
scopeSql.append(" OR " + officeAlias + ".id = " + user.getOffice().getId());
|
2018-12-10 10:23:48 +06:00
|
|
|
|
scopeSql.append(" OR " + officeAlias + ".parent_ids LIKE '" + user.getOffice().getParentIds()
|
|
|
|
|
|
+ user.getOffice().getId() + ",%'");
|
|
|
|
|
|
} else if (SysRole.DATA_SCOPE_OFFICE.equals(dataScope)) {
|
2017-12-19 14:55:52 +08:00
|
|
|
|
scopeSql.append(" OR " + officeAlias + ".id = " + user.getOffice().getId());
|
2018-12-10 10:23:48 +06:00
|
|
|
|
} else if (SysRole.DATA_SCOPE_ENTITY_AND_CHILD.equals(dataScope)) {
|
2017-12-19 14:55:52 +08:00
|
|
|
|
scopeSql.append(" OR " + officeAlias + ".id = " + user.getEntity().getId());
|
2018-12-10 10:23:48 +06:00
|
|
|
|
scopeSql.append(" OR " + officeAlias + ".parent_ids LIKE '" + user.getEntity().getParentIds()
|
|
|
|
|
|
+ user.getEntity().getId() + ",%'");
|
|
|
|
|
|
|
|
|
|
|
|
} else if (SysRole.DATA_SCOPE_ENTITY.equals(dataScope)) {
|
2017-12-19 14:55:52 +08:00
|
|
|
|
scopeSql.append(" OR " + officeAlias + ".id = " + user.getEntity().getId());
|
|
|
|
|
|
// 包括本公司下的部门 (type=1:公司;type=2:单位 3.部门)
|
2018-12-10 10:23:48 +06:00
|
|
|
|
scopeSql.append(" OR (" + officeAlias + ".parent_id = '" + user.getEntity().getId() + "' AND " + officeAlias
|
|
|
|
|
|
+ ".type>1)");
|
|
|
|
|
|
|
2017-12-19 14:55:52 +08:00
|
|
|
|
}
|
2018-12-10 10:23:48 +06:00
|
|
|
|
|
2017-12-19 14:55:52 +08:00
|
|
|
|
return scopeSql.toString();
|
|
|
|
|
|
}
|
2018-12-10 10:23:48 +06:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 获取前几个小时的数据
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param ihour
|
|
|
|
|
|
* @return
|
|
|
|
|
|
*/
|
|
|
|
|
|
protected Date getBeforeByHourTime(int ihour) {
|
|
|
|
|
|
Calendar calendar = Calendar.getInstance();
|
|
|
|
|
|
calendar.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY) - ihour);
|
|
|
|
|
|
return calendar.getTime();
|
|
|
|
|
|
}
|
2017-12-19 14:55:52 +08:00
|
|
|
|
|
|
|
|
|
|
|
2018-12-10 10:23:48 +06:00
|
|
|
|
/**
|
|
|
|
|
|
* 根据count降序排列获取top10的count对应的view
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param set 所有的count
|
|
|
|
|
|
* @param countAndViewMap key是count,val是viewmap
|
|
|
|
|
|
*/
|
2018-12-17 10:12:20 +08:00
|
|
|
|
protected List<Map> getTop10Data(Set<Long> set, Map<Long, List<Map>> countAndViewMap,int param) {
|
2018-12-10 10:23:48 +06:00
|
|
|
|
List<Map> topicList = new ArrayList<Map>();
|
|
|
|
|
|
Long[] countArr = new Long[set.size()];
|
|
|
|
|
|
set.toArray(countArr);
|
|
|
|
|
|
Arrays.sort(countArr);
|
|
|
|
|
|
for (int i = countArr.length - 1; i >= 0; i--) {
|
|
|
|
|
|
List<Map> list = countAndViewMap.get(countArr[i]);
|
|
|
|
|
|
boolean exit = false;
|
|
|
|
|
|
for (Map map : list) {
|
|
|
|
|
|
topicList.add(map);
|
2018-12-17 10:12:20 +08:00
|
|
|
|
if (param==1&&topicList.size() == 10) {
|
2018-12-10 10:23:48 +06:00
|
|
|
|
exit = true;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if (exit) {
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return topicList;
|
|
|
|
|
|
}
|
2017-12-19 14:55:52 +08:00
|
|
|
|
|
|
|
|
|
|
}
|