人力资源
在一个树型结构当中,存在对下属员工进行操作,如修改员工的信息等.
员工表字段 EmployeeId PerantId LoginName Name ...
例如
A ——————————————————————1
A_1 ————————————————————2
A_2
A_3
A_3_1 —————————————————3
A_3_2
A_3_3
A_3_4
A_4(B)
A_4_1(C)
A_4_1_1( D) ———————————4
A_4_1_1_1(E) ———————5
A_4_2
A_4_3
A_4_4
。。。。
现在 A 有权力下面所有人进行修查看操作。
而 A_4 的权限只能查看,他下面员工的信息,不能查看A_3、A_2、A_1 的信息及他们各自的下属的信息。
现在 B 员工要对 E 员工进行修改,可是数据库里又没对 B 员工修改下面员工 E 的权限。
如果对 B 进行权限设置,他就得对它下面所有每个员工进行权限分配,这样的话权限表就会非常大了。
最底一层(N)就可以有N-1个人有对他修改的权限,这样不好。
如果要 E 的内容可以由 D、C、B、A 这些人才可以修改,其他人就不行了
要实现 B 有没有对 E 员工进行修改的权限,由两种法子(我认为)
第一就是通过算法,把 B 下属员工全部取出来,然后看 E 在没有在里头。
第二就是通过算法,我把有修改 E 用户信息的员工取一个,跟 B 进行比较是不是到了
如果没有再从 E 的上级的上级取出来跟 B 进行比较,依此类推如果没有 B 的话,它最多取 N-1 次结束。
我个人认为第二种要比第一种好得好。
下面我就把实现第二种的代码如下
private static string connectionString = ConfigurationManager.ConnectionStrings["WaterOfficeConnectionString"].ToString();
private static SqlConnection getSqlConnection()
{
SqlConnection cn = new SqlConnection();
cn.ConnectionString = connectionString;
cn.Open();
return cn;
}
private static SqlCommand getSqlCommand()
{
SqlConnection cn = getSqlConnection();
SqlCommand cmd = new SqlCommand();
cmd.Connection = cn;
return cmd;
}
private static object ExecuteScalar(string executeString)
{
object obj = null;
SqlCommand cmd = getSqlCommand();
try
{
cmd.CommandText = executeString;
obj = cmd.ExecuteScalar();
}
finally
{
cmd.Connection.Close();
}
return obj;
}
private int employeeID(string userName)
{
string sqlString = "select EmployeeId from employee where LoginName = '" + userName + "'";
int userNameId = int.Parse(ExecuteScalar(sqlString).ToString());
return userNameId;
}
private static int _pId;
/// <summary>
/// 员工上一级的ID号
/// </summary>
private static int pId
{
get { return _pId; }
}
/// <summary>
/// 员工上一级的ID号
/// </summary>
/// <param name="pid"></param>
/// <returns></returns>
private static int ParentID(int pid)
{
int parentId;
string sqlString = "select ParentId,isDel from employee where EmployeeID = " + pid;
SqlCommand cmd = getSqlCommand();
cmd.CommandText = sqlString ;
SqlDataReader sdr = cmd.ExecuteReader();
if (!sdr.Read())
{
return -404;
}
parentId = sdr.GetInt32(0);
_isDel = sdr.GetBoolean(1);
if (parentId == 0 || _isDel == false)
{
_pId = parentId;
}
sdr.Close();
cmd.Connection.Close();
return parentId;
}
/// <summary>
/// 判断是不是相同,如果员工的上级ID与此管理员ID相同就为 true
/// </summary>
/// <param name="number1">管理员ID</param>
/// <param name="number2">上一级的ID</param>
/// <returns></returns>
private bool isExist(int number1, int number2)
{
if (number1 == number2)
{
return true;
}
else
{
return false;
}
}
/// <summary>
/// 看看是不是这个员工的上级员工ID号
/// </summary>
/// <returns></returns>
private bool isEmployeeParentId()
{
int userId1 = employeeID("userName1") ;
int userId2 = employeeID("userName2");
int parId = ParentID(userId1);
bool temp = true;
while (!isExist(userId2, parId))
{
if (pId == 0 || parId == -404)
{
temp = false;
break;
}
parId = ParentID(parId);
}
return temp;
}
我只想到这种法子,第一种的实现我觉得好难,写不出来。
我想一定还会有再好的算法。