using System;
using System.Collections;
using System.Data;
using System.Transactions;
using System.Web.UI;
using System.Web.UI.WebControls;
using DeiNiu.wms.Logical;
using DeiNiu.Utils;
public partial class RoleEmp : PageBase
{
    private LRoleAuthority _logic; 
    protected void Page_Load(object sender, EventArgs e)
    {
   
        if (!IsPostBack)
        {
            _logic = new LRoleAuthority();
            Databound();  
            bindRoles();
            bindDeptEmp();  //分配角色时初始化部门人员树
        }
        SessionSeting();
    }
    /// 
    /// bound the query list.
    /// 
    private void Databound()
    {
    //    bindAuth();
    //    bindRoles();
    //    if (!isRoleAuth) bindDeptEmp();  //分配角色时初始化部门人员树
        bindGV();
         UpdateSession();
 
        
    }
   
    
    /// 
    /// 绑定部门及用户
    /// 
    private void bindDeptEmp()
    {
        TreeDeptEmp.Nodes.Clear();
        BindTree("0", TreeDeptEmp.SelectedNode, new LEmployee().GetDepartments().DefaultView, new  LEmployee().GetActivedEmpDept().DefaultView);
         
         
    }
    /// 
    ///绑定角色
    /// 
    private void bindRoles()
    {
   
        listRoles.DataSource = _logic.GetAllRoles();
        listRoles.DataTextField = "role_name";
        listRoles.DataValueField = "ID";
        listRoles.DataBind();
    }
 
    public void BindTree(string id, TreeNode pNode, DataView deptdv,DataView empdv)
    {
        deptdv.RowFilter = "dep_mastdept = '" + id + "'";
        foreach (DataRowView row in deptdv)
        {
            TreeNode node = new TreeNode();
            node.Text = "" + row["dep_name"] + "" +" "+ row["ID"];
            node.Value = row["ID"].ToString();
             node.SelectAction = TreeNodeSelectAction.None;
            node.ShowCheckBox = false;
            node.Expanded = true;
            empdv.RowFilter = "de_dept=" + node.Value;
                foreach (DataRowView emrow in empdv)
                {
                    TreeNode tnEmp = new TreeNode("" + emrow["em_name"] + ""  ,
                        emrow["DE_EMPLOYEE"].ToString() + ";" + emrow["WAREHOUSE"].ToString()); 
                    node.ChildNodes.Add(tnEmp); 
                }
            if (pNode == null)
                //说明是根节点
            {
            
                TreeDeptEmp.Nodes.Add(node);
                 
      
            }
            else
            { 
              
                pNode.ChildNodes.Add(node); 
               
            }
            BindTree(node.Value, node, new DataView(deptdv.Table), new DataView(empdv.Table));
        }
    }
 
    private void SessionSeting()
    {
        if (IsPostBack)
        {
            _logic = (LRoleAuthority)Session[appScope.PagelevelObj];
        }
    }
    private void UpdateSession()
    {
        Session[appScope.PagelevelObj] = _logic;
    }
    
    /************************************** protected methods (event listeners) ********************************/
    protected void btnSubmit_Click(object sender, EventArgs e)
    {
        lbmsg.Text = " ";
        if (listRoles.SelectedValue == string.Empty) return;
        ArrayList al = new ArrayList();
        GetCheckedNode(TreeDeptEmp.Nodes, al);
        _logic.Initialize();
        try
        {
            using (TransactionScope trans = new TransactionScope())
            {
                int roleId = Convert.ToInt32(listRoles.SelectedValue);
                _logic.GetRoleEmp.Delete(roleId);
                foreach (string id in al)
                {
                    string[] ls= id.Split(';');
                    _logic.GetRoleEmp.re_role = roleId;
                    _logic.GetRoleEmp.re_employee =  Convert.ToInt32(ls[0]) ; 
                    if (ls.Length > 1)
                    {
                        _logic.GetRoleEmp.warehouse = Convert.ToInt32(ls[1]);
                    }
                    _logic.GetRoleEmp.Add();
                }
                trans.Complete();
            }
            lbmsg.Text = "保存成功";
        }
        catch (MyException)
        {
            throw;
        }
        catch (Exception er)
        {
            throw new Exception("出现异常,保存失败。");
        }
        Databound();
    }
   
    //reset the page
    protected void btnCancel_Click(object sender, EventArgs e)
    {
        _logic.Initialize();
        Page_Load(this, e);
       
    }
    /***************************************** internal methods ********************************************/
    /// 
    /// set data from page to shift object
    /// 
    private void SetDataBack()
    {
    }
 void GetCheckedNode(TreeNodeCollection tnc, ArrayList checkedvalues )
 {
        foreach(TreeNode node in tnc)
        {
            if(node.Checked)
    {
        checkedvalues.Add(node.Value);
                 
            }
            GetCheckedNode(node.ChildNodes, checkedvalues);
       }
}
    void SetCheckedNode(TreeNodeCollection tnc, ArrayList setcheckedvalues)
    {
        foreach (TreeNode node in tnc)
        {
            string[] ls = node.Value.Split(';');
            node.Checked = setcheckedvalues.Contains(Convert.ToInt32(ls[0])); 
             
            SetCheckedNode(node.ChildNodes, setcheckedvalues);
        }
    }
    private void chgOperTxt(bool addNew)
    {
 
        btnSubmit.Enabled = true;
        
    }
    
    protected void listRoles_SelectedIndexChanged(object sender, EventArgs e)
    {
       
      
        //--重置人员树的选择
       /*
        if (TreeDeptEmp.SelectedNode != null) TreeDeptEmp.SelectedNode.Selected = false;
         
        lbAuthRole.Text = "人员角色清单";
        GvRole.DataSource = null;
        GvRole.DataBind();
        * */
        //--选择人员树复选框 
        
            ArrayList empList = new ArrayList(); 
            DataTable  dt =_logic.GetEmListByRole(Convert.ToInt32(listRoles.SelectedValue))  ;
            foreach (DataRow dr in dt.Rows) 
            {
                empList.Add(dr["ID"]);
            }
        SetCheckedNode(TreeDeptEmp.Nodes, empList);
        bindGV();
    }
    protected void TreeDeptEmp_SelectedNodeChanged(object sender, EventArgs e)
    {
        bindGV();
       
    }
     
   
    void bindGV( )
    {
        //人员角色,权限清单
        string nodevalue = TreeDeptEmp.SelectedValue;
        nodevalue = nodevalue.Split(';')[0];
        if (nodevalue.Length >0 && nodevalue  != "0")  //selected node is an employee
        {
            lbEmRole.Text = TreeDeptEmp.SelectedNode.Text;// +" 人员角色清单";
          GvRole.DataSource = _logic.GetRoleByEm(Convert.ToInt32(nodevalue));
          lbEmAuth.Text = TreeDeptEmp.SelectedNode.Text;// +" 人员权限清单";
         GVauth.DataSource = _logic.GetAuthByEm(Convert.ToInt32(nodevalue));
        
        }
        GvRole.DataBind();
        GVauth.DataBind();
        //角色对应的人员清单
        if (listRoles.SelectedItem != null)
        {
            lbRoleEm.Text = listRoles.SelectedItem.Text;// +" 角色人员清单";
            GvEm.DataSource = _logic.GetEmListByRole(Convert.ToInt32(listRoles.SelectedValue));
        }
        GvEm.DataBind();
    }
 
}