714 lines
32 KiB
Java
714 lines
32 KiB
Java
package com.engine.kq.biz;
|
||
|
||
import com.engine.kq.entity.KQGroupEntity;
|
||
import com.engine.kq.log.KQLog;
|
||
import com.google.common.collect.Lists;
|
||
import weaver.conn.RecordSet;
|
||
import weaver.general.BaseBean;
|
||
import weaver.general.IpUtils;
|
||
import weaver.general.Util;
|
||
import weaver.hrm.common.database.dialect.DbDialectFactory;
|
||
import weaver.hrm.common.database.dialect.IDbDialectSql;
|
||
|
||
import java.util.*;
|
||
|
||
public class KQGroupBiz extends BaseBean {
|
||
|
||
private static final double EARTH_RADIUS = 6378137;// 地球半径
|
||
public static final String GROUPMEMBER_VALIDATE_FROMDATE="2000-01-01";
|
||
public static final String GROUPMEMBER_VALIDATE_TODATE="2999-12-31";
|
||
|
||
public String getGroupMemberSql() {
|
||
return getGroupMemberSql("");
|
||
}
|
||
|
||
public String getGroupMemberSql(String groupId) {
|
||
Map<String,Object> params = new HashMap<>();
|
||
params.put("groupId",groupId);
|
||
return this.getGroupMemberSql(params);
|
||
}
|
||
|
||
public String getGroupMemberSql(Map<String,Object> params) {
|
||
String sql = "";
|
||
try {
|
||
String groupId = Util.null2String(params.get("groupId"));
|
||
String isNoAccount = Util.null2String(params.get("isNoAccount"));
|
||
if(Util.null2String(groupId).length()>0){
|
||
sql = " SELECT distinct resourceid, groupid FROM ( " +
|
||
" SELECT a.id AS resourceid, b.groupid, a.status FROM HrmResource a, kq_groupmember b " +
|
||
" WHERE a.id=b.typevalue and b.type =1 and (b.isdelete is null or b.isdelete <> '1') " +
|
||
" UNION ALL " +
|
||
" SELECT a.id AS resourceid, b.groupid, a.status FROM HrmResource a, kq_groupmember b " +
|
||
" WHERE a.subcompanyid1 = b.typevalue AND b.type=2 AND a.seclevel>=b.seclevel AND a.seclevel<=b.seclevelto and (b.isdelete is null or b.isdelete <> '1') " +
|
||
" UNION ALL " +
|
||
" SELECT a.id AS resourceid, b.groupid, a.status FROM HrmResource a, kq_groupmember b " +
|
||
" WHERE a.departmentid = b.typevalue AND b.type=3 AND a.seclevel>=b.seclevel AND a.seclevel<=b.seclevelto and (b.isdelete is null or b.isdelete <> '1') " +
|
||
" UNION ALL " +
|
||
" SELECT a.id AS resourceid, b.groupid, a.status FROM HrmResource a, kq_groupmember b " +
|
||
" WHERE a.jobtitle = b.typevalue AND b.type=5 " +
|
||
" AND (b.jobtitlelevel=1 OR (b.jobtitlelevel=2 AND a.subcompanyid1 IN(b.jobtitlelevelvalue)) OR (b.jobtitlelevel=3 AND a.departmentid IN(b.jobtitlelevelvalue))) " +
|
||
" and (b.isdelete is null or b.isdelete <> '1') " +
|
||
" UNION ALL " +
|
||
" SELECT a.id AS resourceid, b.groupid, a.status FROM HrmResource a, kq_groupmember b " +
|
||
" WHERE b.type=6 AND a.seclevel>=b.seclevel AND a.seclevel<=b.seclevelto and (b.isdelete is null or b.isdelete <> '1') ) t" +
|
||
" where 1=1 ";
|
||
if(!Util.null2String(isNoAccount).equals("1")){
|
||
sql += " and t.status in (0,1,2,3) ";
|
||
}
|
||
sql += " and t.groupid = "+groupId;
|
||
}else{
|
||
sql = " SELECT distinct resourceid, groupid FROM ( " +
|
||
" SELECT a.id AS resourceid, b.groupid, a.status FROM HrmResource a, kq_groupmember b,kq_group c " +
|
||
" WHERE a.id=b.typevalue and b.type =1 and (b.isdelete is null or b.isdelete <> '1') and (c.isdelete is null or c.isdelete <> '1') and c.id=b.groupid " +
|
||
" UNION ALL " +
|
||
" SELECT a.id AS resourceid, b.groupid, a.status FROM HrmResource a, kq_groupmember b,kq_group c " +
|
||
" WHERE a.subcompanyid1 = b.typevalue AND b.type=2 AND a.seclevel>=b.seclevel AND a.seclevel<=b.seclevelto and (b.isdelete is null or b.isdelete <> '1') and (c.isdelete is null or c.isdelete <> '1') and c.id=b.groupid " +
|
||
" UNION ALL " +
|
||
" SELECT a.id AS resourceid, b.groupid, a.status FROM HrmResource a, kq_groupmember b,kq_group c " +
|
||
" WHERE a.departmentid = b.typevalue AND b.type=3 AND a.seclevel>=b.seclevel AND a.seclevel<=b.seclevelto and (b.isdelete is null or b.isdelete <> '1') and (c.isdelete is null or c.isdelete <> '1') and c.id=b.groupid " +
|
||
" UNION ALL " +
|
||
" SELECT a.id AS resourceid, b.groupid, a.status FROM HrmResource a, kq_groupmember b,kq_group c " +
|
||
" WHERE a.jobtitle = b.typevalue AND b.type=5 " +
|
||
" AND (b.jobtitlelevel=1 OR (b.jobtitlelevel=2 AND a.subcompanyid1 IN(b.jobtitlelevelvalue)) OR (b.jobtitlelevel=3 AND a.departmentid IN(b.jobtitlelevelvalue))) " +
|
||
" and (b.isdelete is null or b.isdelete <> '1') and (c.isdelete is null or c.isdelete <> '1') and c.id=b.groupid " +
|
||
" UNION ALL " +
|
||
" SELECT a.id AS resourceid, b.groupid, a.status FROM HrmResource a, kq_groupmember b,kq_group c " +
|
||
" WHERE b.type=6 AND a.seclevel>=b.seclevel AND a.seclevel<=b.seclevelto and (b.isdelete is null or b.isdelete <> '1') and (c.isdelete is null or c.isdelete <> '1') and c.id=b.groupid ) t" +
|
||
" where 1=1 ";
|
||
if(!Util.null2String(isNoAccount).equals("1")){
|
||
sql += " and t.status in (0,1,2,3) ";
|
||
}
|
||
}
|
||
} catch (Exception e) {
|
||
writeLog(e);
|
||
}
|
||
|
||
return sql;
|
||
}
|
||
|
||
public List<String> getGroupMembers(String groupId) {
|
||
Map<String,Object> params = new HashMap<>();
|
||
params.put("groupId",groupId);
|
||
return this.getGroupMembers(params);
|
||
}
|
||
|
||
public List<String> getGroupMembers(Map<String,Object> params) {
|
||
RecordSet rs = new RecordSet();
|
||
List<String> members = new ArrayList<>();
|
||
try {
|
||
String sql = this.getGroupMemberSql(params);
|
||
rs.executeQuery(sql);
|
||
while (rs.next()) {
|
||
members.add(rs.getString("resourceid"));
|
||
}
|
||
} catch (Exception e) {
|
||
writeLog(e);
|
||
}
|
||
|
||
return members;
|
||
}
|
||
|
||
//根据传入的班次id,然后判断是否有考勤组引用这个班次
|
||
public boolean serialIdIsUesed(String serialid) {
|
||
boolean serialIdUesed = false;
|
||
RecordSet rs = new RecordSet();
|
||
String sql = "";
|
||
IDbDialectSql dialectSql = DbDialectFactory.get(rs.getDBType()) ;
|
||
String isDeleteField = dialectSql.isNull("isdelete",0) ;
|
||
try {
|
||
sql = " select count(1) " +
|
||
" from (select distinct serialid from kq_fixedschedulce where serialid in ( ? ) and ("+isDeleteField+" !=1 ) "+
|
||
" union " +
|
||
" select distinct serialid from kq_shiftschedule where serialid in ( ? ) and ("+isDeleteField+" !=1 ) ) t";
|
||
rs.executeQuery(sql,serialid,serialid);
|
||
if (rs.next()){
|
||
if(rs.getInt(1)>0){
|
||
serialIdUesed = true;
|
||
}
|
||
}
|
||
|
||
if(!serialIdUesed){
|
||
|
||
|
||
if(rs.getDBType().equals("oracle")||rs.getDBType().equals("postgresql")) {
|
||
sql = " select count(1) from kq_group where ((','||serialids||',') like '%," + serialid + ",%' or (','||shiftcycleserialids||',') like '%," + serialid + ",%') and (isdelete is null or isdelete <> '1')";
|
||
}else if(rs.getDBType().equals("mysql")){
|
||
String serialidsConcatContion = dialectSql.concatStr("','","serialids","','") ;
|
||
String shiftcycleSerialidsConcatConditon = dialectSql.concatStr("','","shiftcycleserialids","','") ;
|
||
String groupIsDeleteCondition = dialectSql.isNull("isdelete",0) ;
|
||
String likeValue = "%,"+serialid+",%" ;
|
||
|
||
sql = String.format(" select count(1) from kq_group where ((%s) like '%s' or (%s) like '%s') and (%s!=1)",
|
||
serialidsConcatContion,likeValue,
|
||
shiftcycleSerialidsConcatConditon,likeValue,
|
||
groupIsDeleteCondition) ;
|
||
}else{
|
||
sql = " select count(1) from kq_group where (','+serialids+',' like '%," + serialid + ",%' or ','+shiftcycleserialids+',' like '%," + serialid + ",%') and (isdelete is null or isdelete <> '1')";
|
||
}
|
||
|
||
|
||
|
||
rs.executeQuery(sql);
|
||
if (rs.next()){
|
||
if(rs.getInt(1)>0){
|
||
serialIdUesed = true;
|
||
}
|
||
}
|
||
}
|
||
} catch (Exception e) {
|
||
writeLog(e);
|
||
}
|
||
return serialIdUesed;
|
||
}
|
||
|
||
/**
|
||
* 根据传入的班次id,引用此班次的考勤组
|
||
* @param serialid
|
||
* @return
|
||
*/
|
||
public List<String> getGroupIdByUesedSerialId(String serialid) {
|
||
RecordSet rs = new RecordSet();
|
||
List<String> groupList = Lists.newArrayList();
|
||
String sql = "";
|
||
IDbDialectSql dialectSql = DbDialectFactory.get(rs.getDBType()) ;
|
||
String isDeleteField = dialectSql.isNull("isdelete",0) ;
|
||
try {
|
||
sql = " select serialid,groupid " +
|
||
" from (select distinct serialid,groupid from kq_fixedschedulce where serialid in ( ? ) and ("+isDeleteField+" !=1 ) "+
|
||
" union " +
|
||
" select distinct serialid,groupid from kq_shiftschedule where serialid in ( ? ) and ("+isDeleteField+" !=1 ) ) t";
|
||
rs.executeQuery(sql,serialid,serialid);
|
||
while (rs.next()){
|
||
String tmp_groupId = rs.getString("groupid");
|
||
if(!groupList.contains(tmp_groupId)){
|
||
groupList.add(tmp_groupId);
|
||
}
|
||
}
|
||
|
||
if(rs.getDBType().equals("oracle")||rs.getDBType().equals("postgresql")) {
|
||
sql = " select id from kq_group where ((','||serialids||',') like '%," + serialid + ",%' or (','||shiftcycleserialids||',') like '%," + serialid + ",%') and (isdelete is null or isdelete <> '1')";
|
||
}else if(rs.getDBType().equals("mysql")){
|
||
String serialidsConcatContion = dialectSql.concatStr("','","serialids","','") ;
|
||
String shiftcycleSerialidsConcatConditon = dialectSql.concatStr("','","shiftcycleserialids","','") ;
|
||
String groupIsDeleteCondition = dialectSql.isNull("isdelete",0) ;
|
||
String likeValue = "%,"+serialid+",%" ;
|
||
|
||
sql = String.format(" select id from kq_group where ((%s) like '%s' or (%s) like '%s') and (%s!=1)",
|
||
serialidsConcatContion,likeValue,
|
||
shiftcycleSerialidsConcatConditon,likeValue,
|
||
groupIsDeleteCondition) ;
|
||
}else{
|
||
sql = " select id from kq_group where (','+serialids+',' like '%," + serialid + ",%' or ','+shiftcycleserialids+',' like '%," + serialid + ",%') and (isdelete is null or isdelete <> '1')";
|
||
}
|
||
|
||
rs.executeQuery(sql);
|
||
while (rs.next()){
|
||
String tmp_groupId = rs.getString("id");
|
||
if(!groupList.contains(tmp_groupId)){
|
||
groupList.add(tmp_groupId);
|
||
}
|
||
}
|
||
} catch (Exception e) {
|
||
writeLog(e);
|
||
}
|
||
return groupList;
|
||
}
|
||
|
||
public Map<String,Object> getLocationWifiInfo(String userid,String showWifiList) {
|
||
Map<String,Object> result = new HashMap<>();
|
||
Map<String,Object> locationInfo = new HashMap<>();
|
||
Map<String,Object> wifiInfo = new HashMap<>();
|
||
KQGroupComInfo kqGroupComInfo = new KQGroupComInfo();
|
||
KQGroupMemberComInfo kqGroupMemberComInfo = new KQGroupMemberComInfo();
|
||
KQLoactionComInfo kqLoactionComInfo = new KQLoactionComInfo();
|
||
String groupid = Util.null2String(kqGroupMemberComInfo.getKQGroupId(userid));
|
||
List<Object> datas = null;
|
||
Map<String, Object> data = null;
|
||
|
||
if(groupid.length()>0){
|
||
datas = new ArrayList();
|
||
while(kqLoactionComInfo.next()){
|
||
if(!kqLoactionComInfo.getGroupid().equals(groupid))continue;
|
||
data = new HashMap<>();
|
||
data.put("id",kqLoactionComInfo.getId());
|
||
data.put("locationname",Util.null2String(kqLoactionComInfo.getLocationname()));
|
||
data.put("longitude",Util.null2String(kqLoactionComInfo.getLongitude()));
|
||
data.put("latitude",Util.null2String(kqLoactionComInfo.getLatitude()));
|
||
data.put("address",Util.null2String(kqLoactionComInfo.getAddress()));
|
||
data.put("checkscope",Util.null2String(kqLoactionComInfo.getCheckscope()));
|
||
data.put("groupid",Util.null2String(kqLoactionComInfo.getGroupid()));
|
||
datas.add(data);
|
||
}
|
||
locationInfo.put("locationcheck",Util.null2String(kqGroupComInfo.getLocationcheck(groupid)).equals("1"));
|
||
locationInfo.put("locationcheckscope",Util.null2String(kqGroupComInfo.getLocationcheckscope(groupid)));
|
||
locationInfo.put("locations",datas);
|
||
|
||
datas = new ArrayList();
|
||
if("1".equalsIgnoreCase(showWifiList)){
|
||
KQWifiComInfo kqWifiComInfo = new KQWifiComInfo();
|
||
while(kqWifiComInfo.next()){
|
||
if(!kqWifiComInfo.getGroupid().equals(groupid))continue;
|
||
data = new HashMap<>();
|
||
data.put("id",kqWifiComInfo.getId());
|
||
data.put("wifiname",Util.null2String(kqWifiComInfo.getWifiname()));
|
||
data.put("mac",Util.null2String(kqWifiComInfo.getMac()));
|
||
data.put("groupid",Util.null2String(kqWifiComInfo.getGroupid()));
|
||
datas.add(data);
|
||
}
|
||
}
|
||
wifiInfo.put("wificheck",Util.null2String(kqGroupComInfo.getWificheck(groupid)).equals("1"));
|
||
wifiInfo.put("wifis",datas);
|
||
|
||
result.put("locationInfo",locationInfo);
|
||
result.put("wifiInfo",wifiInfo);
|
||
result.put("status","1");
|
||
|
||
String show_position = "show_position";
|
||
KQSettingsComInfo kqSettingsComInfo = new KQSettingsComInfo();
|
||
String positioncheck = Util.null2String(kqSettingsComInfo.getMain_val(show_position),"0");
|
||
result.put("positioncheck",positioncheck);
|
||
}
|
||
return result;
|
||
}
|
||
/**
|
||
* 用户考勤地点 WIFI限制信息
|
||
* @param userid
|
||
* @return
|
||
*/
|
||
public Map<String,Object> getLocationWifiInfo(String userid) {
|
||
return getLocationWifiInfo(userid,"1");
|
||
}
|
||
|
||
/**
|
||
*判断办公地点范围
|
||
* @return
|
||
*/
|
||
public Map<String,Object> checkLocationScope(String userId, String longitude, String latitude){
|
||
Map<String, Object> retmap = new HashMap<>();
|
||
Map<String, Object> loactionInfo = null;
|
||
try {
|
||
boolean inScope = false;
|
||
KQGroupMemberComInfo kqGroupMemberComInfo = new KQGroupMemberComInfo();
|
||
KQGroupEntity kqGroupEntity = kqGroupMemberComInfo.getUserKQGroupInfo(userId);
|
||
KQLoactionComInfo kqLoactionComInfo = new KQLoactionComInfo();
|
||
Map<String, Object> locationTrueInfo = new HashMap<>();
|
||
double distance = EARTH_RADIUS;
|
||
if (kqGroupEntity != null && kqGroupEntity.getLocationcheck().equals("1")) {
|
||
while (kqLoactionComInfo.next()) {
|
||
if (Util.null2String(kqLoactionComInfo.getGroupid()).equals(kqGroupEntity.getId())) {
|
||
double lng1 = Util.getDoubleValue(longitude);//经度
|
||
double lat1 = Util.getDoubleValue(latitude);//纬度
|
||
double lng2 = Util.getDoubleValue(kqLoactionComInfo.getLongitude());//经度
|
||
double lat2 = Util.getDoubleValue(kqLoactionComInfo.getLatitude());//纬度
|
||
int checkscope = Util.getIntValue(kqLoactionComInfo.getCheckscope());//有效范围
|
||
double geo_distance = geo_distance(lng1, lat1, lng2, lat2);
|
||
if (distance > geo_distance) {
|
||
distance = geo_distance;
|
||
locationTrueInfo.put("lng2", lng2);
|
||
locationTrueInfo.put("lat2", lat2);
|
||
locationTrueInfo.put("checkscope", checkscope);
|
||
locationTrueInfo.put("geo_distance", geo_distance);
|
||
// locationTrueInfo = lng2 + "#" + lat2 + "#" + checkscope + "#" + geo_distance;
|
||
}
|
||
if (geo_distance < checkscope) {
|
||
inScope = true;
|
||
loactionInfo = new HashMap<>();
|
||
loactionInfo.put("locationname", kqLoactionComInfo.getLocationname());
|
||
loactionInfo.put("longitude", kqLoactionComInfo.getLongitude());
|
||
loactionInfo.put("latitude", kqLoactionComInfo.getLatitude());
|
||
loactionInfo.put("address", kqLoactionComInfo.getAddress());
|
||
loactionInfo.put("id", kqLoactionComInfo.getId());
|
||
loactionInfo.put("longitudefromoa", lng2);
|
||
loactionInfo.put("latitudefromoa", lat2);
|
||
loactionInfo.put("lengthfromoa", checkscope);
|
||
loactionInfo.put("lengthfromem", geo_distance);
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
} else {//未开启开关
|
||
inScope = true;
|
||
}
|
||
retmap.put("needCheck", kqGroupEntity != null ? Util.null2String(kqGroupEntity.getLocationcheck()) : "0");//是否开启办公地点验证
|
||
retmap.put("inScope", inScope);//是否在考勤范围内
|
||
retmap.put("locationshowaddress", kqGroupEntity != null ? Util.null2String(kqGroupEntity.getLocationshowaddress()) : "0");//有效识别半径内显示同一地址
|
||
if (!inScope && locationTrueInfo != null && !locationTrueInfo.isEmpty()) {
|
||
if(loactionInfo == null) {
|
||
loactionInfo = new HashMap<>();
|
||
}
|
||
loactionInfo.put("longitudefromoa", Util.null2String(locationTrueInfo.get("lng2")));
|
||
loactionInfo.put("latitudefromoa", Util.null2String(locationTrueInfo.get("lat2")));
|
||
loactionInfo.put("lengthfromoa", Util.null2String(locationTrueInfo.get("checkscope")));
|
||
loactionInfo.put("lengthfromem", Util.null2String(locationTrueInfo.get("geo_distance")));
|
||
}
|
||
}catch (Exception e) {
|
||
writeLog(e);
|
||
}
|
||
retmap.put("loactionInfo", loactionInfo);//考勤范围相关信息
|
||
return retmap;
|
||
}
|
||
|
||
/**
|
||
* 计算两个经度纬度(WGS-84)之间的距离
|
||
* @param lng1 坐标1经度
|
||
* @param lat1 坐标1纬度EARTH_RADIUS
|
||
* @param lng2 坐标2经度
|
||
* @param lat2 坐标2纬度
|
||
* @return 2个坐标之间距离,单位:米
|
||
*/
|
||
private double geo_distance(double lng1, double lat1, double lng2, double lat2) {
|
||
double radLat1 = Math.toRadians(lat1);
|
||
double radLat2 = Math.toRadians(lat2);
|
||
double a = Math.abs(radLat1 - radLat2);
|
||
double b = Math.abs(Math.toRadians(lng1) - Math.toRadians(lng2));
|
||
double distance = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)));
|
||
distance = distance * EARTH_RADIUS;
|
||
distance = Math.round(distance * 10000) / 10000;
|
||
return distance;
|
||
}
|
||
|
||
/**
|
||
*判断Wifi范围
|
||
* @return
|
||
*/
|
||
public Map<String,Object> checkWifiScope(String userId, String wifiName, String mac){
|
||
Map<String,Object> retmap = new HashMap<>();
|
||
Map<String,Object> wifiInfo = null;
|
||
boolean inScope = false;
|
||
KQGroupMemberComInfo kqGroupMemberComInfo = new KQGroupMemberComInfo();
|
||
KQGroupEntity kqGroupEntity = kqGroupMemberComInfo.getUserKQGroupInfo(userId);
|
||
KQWifiComInfo kqWifiComInfo = new KQWifiComInfo();
|
||
|
||
if(kqGroupEntity.getWificheck().equals("1")){
|
||
try{
|
||
List<String> lst = new ArrayList<>(Arrays.asList(mac.split(":")));
|
||
for(int i = 0; i < lst.size(); i++){
|
||
String s = lst.get(i);
|
||
if(s.length() == 1)
|
||
lst.set(i, "0" + s);
|
||
}
|
||
mac = String.join(":", lst);
|
||
}catch (Exception ex){
|
||
ex.printStackTrace();
|
||
}
|
||
while(kqWifiComInfo.next()){
|
||
if(Util.null2String(kqWifiComInfo.getGroupid()).equals(kqGroupEntity.getId())){
|
||
if(Util.null2String(kqWifiComInfo.getWifiname().toLowerCase()).equals(wifiName.toLowerCase())){
|
||
String wifi_cominfo_mac = Util.null2String(kqWifiComInfo.getMac().toLowerCase());
|
||
String param_mac = mac.toLowerCase();
|
||
int last_wifi_mac_index = wifi_cominfo_mac.lastIndexOf(":");
|
||
int param_mac_index = param_mac.lastIndexOf(":");
|
||
if(last_wifi_mac_index > 0 && param_mac_index > 0){
|
||
wifi_cominfo_mac = wifi_cominfo_mac.substring(0,last_wifi_mac_index);
|
||
param_mac = param_mac.substring(0,param_mac_index);
|
||
}
|
||
if(wifi_cominfo_mac.equals(param_mac)){
|
||
inScope = true;
|
||
wifiInfo = new HashMap<>();
|
||
wifiInfo.put("wifiname",kqWifiComInfo.getWifiname());
|
||
wifiInfo.put("mac",kqWifiComInfo.getMac());
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}else{//未开启开关
|
||
inScope = true;
|
||
}
|
||
retmap.put("needCheck",Util.null2String(kqGroupEntity.getWificheck()));//是否开启wifi验证
|
||
retmap.put("inScope",inScope);//是否在考勤范围内
|
||
retmap.put("wifiInfo",wifiInfo);//考勤范围相关信息
|
||
return retmap;
|
||
}
|
||
|
||
/**
|
||
* 校验ipv4和v6范围
|
||
* @param userId
|
||
* @param clientAddress
|
||
* @param ismobile
|
||
* @return
|
||
*/
|
||
public boolean getIsInScopeV4V6(String userId, String clientAddress,String ismobile) {
|
||
boolean isInScope = false;
|
||
clientAddress = Util.null2String(clientAddress).trim();
|
||
if (clientAddress.length() == 0) {
|
||
return isInScope;
|
||
}
|
||
|
||
RecordSet rs = new RecordSet();
|
||
KQGroupComInfo kqGroupComInfo = new KQGroupComInfo();
|
||
KQGroupMemberComInfo kqGroupMemberComInfo = new KQGroupMemberComInfo();
|
||
String groupid = Util.null2String(kqGroupMemberComInfo.getKQGroupId(userId));
|
||
String signIpScope = Util.null2String(kqGroupComInfo.getIpscope(groupid)).trim();//格式:10.*.*.*;10.16.0.12;10.16.0.13-10.16.0.18
|
||
String signIpscope_v4_em = Util.null2String(kqGroupComInfo.getIpscope_v4_em(groupid)).trim();
|
||
String signIpscope_v4_pc = Util.null2String(kqGroupComInfo.getIpscope_v4_pc(groupid)).trim();
|
||
String signIpscope_v6_em = Util.null2String(kqGroupComInfo.getIpscope_v6_em(groupid)).trim();
|
||
String signIpscope_v6_pc = Util.null2String(kqGroupComInfo.getIpscope_v6_pc(groupid)).trim();
|
||
if (signIpscope_v4_em.length() == 0 && signIpscope_v4_pc.length() == 0
|
||
&& signIpscope_v6_em.length() == 0 && signIpscope_v6_pc.length() == 0) {
|
||
return true;
|
||
}
|
||
|
||
new KQLog().info("getIsInScopeV4V6:ismobile:"+ismobile+":signIpscope_v4_em:"+signIpscope_v4_em+":signIpscope_v6_em:"+signIpscope_v6_em
|
||
+":signIpscope_v4_pc:"+signIpscope_v4_pc+":signIpscope_v6_pc:"+signIpscope_v6_pc);
|
||
if("1".equalsIgnoreCase(ismobile)){
|
||
if(signIpscope_v4_em.length() > 0){
|
||
return checkIps(signIpscope_v4_em,clientAddress,"IPv4");
|
||
}else if(signIpscope_v6_em.length() > 0){
|
||
return checkIps(signIpscope_v6_em,clientAddress,"IPv6");
|
||
}else{
|
||
return true;
|
||
}
|
||
}else{
|
||
if(signIpscope_v4_pc.length() > 0){
|
||
return checkIps(signIpscope_v4_pc,clientAddress,"IPv4");
|
||
}else if(signIpscope_v6_pc.length() > 0){
|
||
return checkIps(signIpscope_v6_pc,clientAddress,"IPv6");
|
||
}else{
|
||
return true;
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
private boolean checkIps(String signIpScope, String clientAddress,String ipType) {
|
||
boolean isInScope = false;
|
||
List signIpScopeList = Util.TokenizerString(signIpScope, ";");
|
||
String signIpScopeSingle = "";
|
||
for (int i = 0; i < signIpScopeList.size(); i++) {
|
||
signIpScopeSingle = Util.null2String((String) signIpScopeList.get(i));
|
||
signIpScopeSingle = signIpScopeSingle.trim();
|
||
if("IPv4".equalsIgnoreCase(ipType)){
|
||
isInScope = checkIpV4(signIpScopeSingle,clientAddress);
|
||
if(isInScope){
|
||
break;
|
||
}
|
||
}else if("IPv6".equalsIgnoreCase(ipType)){
|
||
isInScope = checkIpV6(signIpScopeSingle,clientAddress);
|
||
if(isInScope){
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
return isInScope;
|
||
}
|
||
|
||
private boolean checkIpV6(String signIpScopeSingle, String clientAddress) {
|
||
|
||
boolean isInScope = false;
|
||
if (signIpScopeSingle.indexOf("-") > -1) {
|
||
String signIpFrom = signIpScopeSingle.substring(0, signIpScopeSingle.indexOf("-"));
|
||
signIpFrom = Util.null2String(signIpFrom).trim();
|
||
String signIpTo = "";
|
||
if (!signIpScopeSingle.endsWith("-")) {
|
||
signIpTo = signIpScopeSingle.substring(signIpScopeSingle.indexOf("-") + 1);
|
||
}
|
||
signIpTo = Util.null2String(signIpTo).trim();
|
||
String tempClientAddress = IpUtils.parseAbbreviationToFullIPv6(clientAddress);
|
||
signIpFrom = addToThreeFigure(signIpFrom, "signIpFrom");
|
||
signIpTo = addToThreeFigure(signIpTo, "signIpTo");
|
||
|
||
signIpFrom = IpUtils.parseAbbreviationToFullIPv6(signIpFrom);
|
||
signIpTo = IpUtils.parseAbbreviationToFullIPv6(signIpTo);
|
||
|
||
if (signIpFrom.equals("") && signIpTo.equals("")) {
|
||
isInScope = true;
|
||
}
|
||
if (signIpFrom.equals("") && !signIpTo.equals("")) {
|
||
if (tempClientAddress.compareTo(signIpTo) <= 0) {
|
||
isInScope = true;
|
||
}
|
||
}
|
||
|
||
if (!signIpFrom.equals("") && signIpTo.equals("")) {
|
||
if (tempClientAddress.compareTo(signIpFrom) >= 0) {
|
||
isInScope = true;
|
||
}
|
||
}
|
||
if (!signIpFrom.equals("") && !signIpTo.equals("")) {
|
||
if (tempClientAddress.compareTo(signIpFrom) >= 0 && tempClientAddress.compareTo(signIpTo) <= 0) {
|
||
isInScope = true;
|
||
}
|
||
}
|
||
} else {
|
||
String tempClientAddress = IpUtils.parseAbbreviationToFullIPv6(clientAddress);
|
||
if (tempClientAddress.equals(signIpScopeSingle)) {
|
||
isInScope = true;
|
||
}
|
||
}
|
||
return isInScope;
|
||
}
|
||
|
||
public boolean checkIpV4(String signIpScopeSingle,String clientAddress) {
|
||
|
||
boolean isInScope = false;
|
||
if (signIpScopeSingle.indexOf("*") > -1) {//如果单个ip范围的格式为10.*.*.*
|
||
List signIpScopeSingleList = Util.TokenizerString(signIpScopeSingle, ".");
|
||
List clientAddressList = Util.TokenizerString(clientAddress, ".");
|
||
if (signIpScopeSingleList.size() == 4
|
||
&& clientAddressList.size() == 4
|
||
&& ("*".equals((String) signIpScopeSingleList.get(0))
|
||
|| Util.null2String((String) clientAddressList.get(0)).equals((String) signIpScopeSingleList.get(0)))
|
||
&& ("*".equals((String) signIpScopeSingleList.get(1))
|
||
|| Util.null2String((String) clientAddressList.get(1)).equals((String) signIpScopeSingleList.get(1)))
|
||
&& ("*".equals((String) signIpScopeSingleList.get(2))
|
||
|| Util.null2String((String) clientAddressList.get(2)).equals((String) signIpScopeSingleList.get(2)))
|
||
&& ("*".equals((String) signIpScopeSingleList.get(3))
|
||
|| Util.null2String((String) clientAddressList.get(3)).equals((String) signIpScopeSingleList.get(2)))
|
||
) {
|
||
isInScope = true;
|
||
}
|
||
} else if (signIpScopeSingle.indexOf("-") > -1) {//如果单个ip范围的格式为10.16.0.13-10.16.0.18
|
||
String signIpFrom = signIpScopeSingle.substring(0, signIpScopeSingle.indexOf("-"));
|
||
signIpFrom = Util.null2String(signIpFrom).trim();
|
||
String signIpTo = "";
|
||
if (!signIpScopeSingle.endsWith("-")) {
|
||
signIpTo = signIpScopeSingle.substring(signIpScopeSingle.indexOf("-") + 1);
|
||
}
|
||
signIpTo = Util.null2String(signIpTo).trim();
|
||
String tempClientAddress = addToThreeFigure(clientAddress, "clientAddress");
|
||
signIpFrom = addToThreeFigure(signIpFrom, "signIpFrom");
|
||
signIpTo = addToThreeFigure(signIpTo, "signIpTo");
|
||
|
||
if (signIpFrom.equals("") && signIpTo.equals("")) {
|
||
isInScope = true;
|
||
}
|
||
if (signIpFrom.equals("") && !signIpTo.equals("")) {
|
||
if (tempClientAddress.compareTo(signIpTo) <= 0) {
|
||
isInScope = true;
|
||
}
|
||
}
|
||
|
||
if (!signIpFrom.equals("") && signIpTo.equals("")) {
|
||
if (tempClientAddress.compareTo(signIpFrom) >= 0) {
|
||
isInScope = true;
|
||
}
|
||
}
|
||
if (!signIpFrom.equals("") && !signIpTo.equals("")) {
|
||
if (tempClientAddress.compareTo(signIpFrom) >= 0 && tempClientAddress.compareTo(signIpTo) <= 0) {
|
||
isInScope = true;
|
||
}
|
||
}
|
||
} else {//否则单个ip范围的格式为10.16.0.12
|
||
if (clientAddress.equals(signIpScopeSingle)) {
|
||
isInScope = true;
|
||
}
|
||
}
|
||
return isInScope;
|
||
}
|
||
|
||
|
||
/**
|
||
* 校验ip范围
|
||
* @param clientAddress
|
||
* @return
|
||
*/
|
||
public boolean getIsInScope(String userId, String clientAddress) {
|
||
boolean isInScope = false;
|
||
clientAddress = Util.null2String(clientAddress).trim();
|
||
if (clientAddress.length() == 0) {
|
||
return isInScope;
|
||
}
|
||
|
||
RecordSet rs = new RecordSet();
|
||
KQGroupComInfo kqGroupComInfo = new KQGroupComInfo();
|
||
KQGroupMemberComInfo kqGroupMemberComInfo = new KQGroupMemberComInfo();
|
||
String groupid = Util.null2String(kqGroupMemberComInfo.getKQGroupId(userId));
|
||
String signIpScope = Util.null2String(kqGroupComInfo.getIpscope(groupid)).trim();//格式:10.*.*.*;10.16.0.12;10.16.0.13-10.16.0.18
|
||
if (signIpScope.length() == 0) {
|
||
return true;
|
||
}
|
||
|
||
List signIpScopeList = Util.TokenizerString(signIpScope, ";");
|
||
String signIpScopeSingle = "";
|
||
for (int i = 0; i < signIpScopeList.size(); i++) {
|
||
signIpScopeSingle = Util.null2String((String) signIpScopeList.get(i));
|
||
signIpScopeSingle = signIpScopeSingle.trim();
|
||
if (signIpScopeSingle.indexOf("*") > -1) {//如果单个ip范围的格式为10.*.*.*
|
||
List signIpScopeSingleList = Util.TokenizerString(signIpScopeSingle, ".");
|
||
List clientAddressList = Util.TokenizerString(clientAddress, ".");
|
||
if (signIpScopeSingleList.size() == 4
|
||
&& clientAddressList.size() == 4
|
||
&& ("*".equals((String) signIpScopeSingleList.get(0))
|
||
|| Util.null2String((String) clientAddressList.get(0)).equals((String) signIpScopeSingleList.get(0)))
|
||
&& ("*".equals((String) signIpScopeSingleList.get(1))
|
||
|| Util.null2String((String) clientAddressList.get(1)).equals((String) signIpScopeSingleList.get(1)))
|
||
&& ("*".equals((String) signIpScopeSingleList.get(2))
|
||
|| Util.null2String((String) clientAddressList.get(2)).equals((String) signIpScopeSingleList.get(2)))
|
||
&& ("*".equals((String) signIpScopeSingleList.get(3))
|
||
|| Util.null2String((String) clientAddressList.get(3)).equals((String) signIpScopeSingleList.get(2)))
|
||
) {
|
||
isInScope = true;
|
||
break;
|
||
}
|
||
|
||
} else if (signIpScopeSingle.indexOf("-") > -1) {//如果单个ip范围的格式为10.16.0.13-10.16.0.18
|
||
String signIpFrom = signIpScopeSingle.substring(0, signIpScopeSingle.indexOf("-"));
|
||
signIpFrom = Util.null2String(signIpFrom).trim();
|
||
String signIpTo = "";
|
||
if (!signIpScopeSingle.endsWith("-")) {
|
||
signIpTo = signIpScopeSingle.substring(signIpScopeSingle.indexOf("-") + 1);
|
||
}
|
||
signIpTo = Util.null2String(signIpTo).trim();
|
||
String tempClientAddress = addToThreeFigure(clientAddress, "clientAddress");
|
||
signIpFrom = addToThreeFigure(signIpFrom, "signIpFrom");
|
||
signIpTo = addToThreeFigure(signIpTo, "signIpTo");
|
||
|
||
if (signIpFrom.equals("") && signIpTo.equals("")) {
|
||
isInScope = true;
|
||
break;
|
||
}
|
||
if (signIpFrom.equals("") && !signIpTo.equals("")) {
|
||
if (tempClientAddress.compareTo(signIpTo) <= 0) {
|
||
isInScope = true;
|
||
break;
|
||
}
|
||
}
|
||
|
||
if (!signIpFrom.equals("") && signIpTo.equals("")) {
|
||
if (tempClientAddress.compareTo(signIpFrom) >= 0) {
|
||
isInScope = true;
|
||
break;
|
||
}
|
||
}
|
||
if (!signIpFrom.equals("") && !signIpTo.equals("")) {
|
||
if (tempClientAddress.compareTo(signIpFrom) >= 0 && tempClientAddress.compareTo(signIpTo) <= 0) {
|
||
isInScope = true;
|
||
break;
|
||
}
|
||
}
|
||
} else {//否则单个ip范围的格式为10.16.0.12
|
||
if (clientAddress.equals(signIpScopeSingle)) {
|
||
isInScope = true;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
return isInScope;
|
||
}
|
||
/**
|
||
* 将IP地址填充为3位数
|
||
* 如 "192.168.0.25"填充为3位数后为"192.168.000.025"
|
||
* @return String 填充为3位数后的IP地址
|
||
*/
|
||
private String addToThreeFigure(String IPAddress, String IPType) {
|
||
if (IPAddress == null || IPAddress.trim().equals("") || IPType == null || IPType.trim().equals("")) {
|
||
return "";
|
||
}
|
||
String returnString = "";
|
||
List IPAddressList = Util.TokenizerString(IPAddress, ".");
|
||
String IPAddressPart = "";
|
||
for (int i = 0; i < IPAddressList.size(); i++) {
|
||
IPAddressPart = Util.null2String(IPAddressList.get(i));
|
||
if (IPType.equals("signIpTo")) {
|
||
returnString += "." + Util.add0(Util.getIntValue(IPAddressPart, 255), 3);
|
||
} else {
|
||
returnString += "." + Util.add0(Util.getIntValue(IPAddressPart, 0), 3);
|
||
}
|
||
}
|
||
if (!returnString.equals("")) {
|
||
returnString = returnString.substring(1);
|
||
}
|
||
return returnString;
|
||
}
|
||
} |