在人力资源树当中,上级对下级员工信息查看修改操作。

人力资源

在一个树型结构当中,存在对下属员工进行操作,如修改员工的信息等.

员工表字段 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;
}


我只想到这种法子,第一种的实现我觉得好难,写不出来。

我想一定还会有再好的算法。

posted on 2006-12-22 15:42  小土泥  阅读(243)  评论(0编辑  收藏  举报

导航