using BLL;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;

namespace FineUIPro.Web.Controls
{
    public partial class FlowOperateControl : System.Web.UI.UserControl
    {
        #region 定义项
        /// <summary>
        /// 单据ID
        /// </summary>
        public string DataId
        {
            get;
            set;
        }
        /// <summary>
        /// 菜单ID
        /// </summary>
        public string MenuId
        {
            get;
            set;
        }
        /// <summary>
        /// 项目ID
        /// </summary>
        public string ProjectId
        {
            get;
            set;
        }

        /// <summary>
        /// 单位iID
        /// </summary>
        public string UnitId
        {
            get;
            set;
        }
        /// <summary>
        /// 下一步骤
        /// </summary>
        public string NextStep
        {
            get
            {
                if (!string.IsNullOrEmpty(this.rblFlowOperate.SelectedValue))
                {
                    return this.rblFlowOperate.SelectedValue;
                }
                else
                {
                    return null;
                }
            }
        }

        /// <summary>
        /// 下一步办理人
        /// </summary>
        public string NextPerson
        {
            get
            {
                return this.drpPerson.SelectedValue;
            }
        }
        #endregion

        #region 定义页面项
        /// <summary>
        /// 单据ID
        /// </summary>
        public string getDataId
        {
            get
            {
                return (string)ViewState["getDataId"];
            }
            set
            {
                ViewState["getDataId"] = value;
            }
        }
        public string geProjectId
        {
            get
            {
                return (string)ViewState["geProjectId"];
            }
            set
            {
                ViewState["geProjectId"] = value;
            }
        }

        /// <summary>
        /// 菜单ID
        /// </summary>
        public string getMenuId
        {
            get
            {
                return (string)ViewState["getMenuId"];
            }
            set
            {
                ViewState["getMenuId"] = value;
            }
        }
        #endregion


        public List<Model.Sys_User> drpPersonUser;

        #region 加载页面
        /// <summary>
        /// 加载页面
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {       
                this.getDataId = this.DataId;
                this.getMenuId = this.MenuId;
                this.geProjectId = this.ProjectId;
                if (drpPersonUser != null)
                {
                    this.drpPerson.DataValueField = "UserId";
                    this.drpPerson.DataTextField = "UserName";
                    this.drpPerson.DataSource = drpPersonUser;
                    this.drpPerson.DataBind();
                    Funs.FineUIPleaseSelect(this.drpPerson);
                }
                else
                {
                    BLL.UserService.InitFlowOperateControlUserDropDownList(this.drpPerson, this.ProjectId, this.UnitId, true);
                }
                this.GroupPanel1.TitleToolTip += BLL.MenuFlowOperateService.GetFlowOperateName(this.getMenuId);
                this.txtAuditFlowName.Text = "审核/审批";
                var flowOperate = Funs.DB.Sys_FlowOperate.FirstOrDefault(x => x.DataId == this.getDataId && x.State == BLL.Const.State_2 && x.IsClosed == true);
                if (flowOperate != null)
                {
                    this.GroupPanel1.Hidden = true;
                    this.GroupPanel2.Collapsed = false;
                }
                else
                {
                    var sysSet4 = BLL.ConstValue.drpConstItemList(BLL.ConstValue.Group_MenuFlowOperate).FirstOrDefault();
                    if (sysSet4 != null && sysSet4.ConstValue == "1")
                    {
                        ///取当前单据审核步骤
                        int nextSortIndex = 1;
                        var maxFlowOperate = Funs.DB.Sys_FlowOperate.Where(x => x.DataId == this.getDataId && x.IsClosed == false).Max(x => x.SortIndex);
                        if (maxFlowOperate != null)
                        {
                            nextSortIndex = maxFlowOperate.Value;
                        }
                        else
                        {
                            this.txtAuditFlowName.Text = "编制单据";
                        }

                        var nextMenuFlowOperate = Funs.DB.Sys_MenuFlowOperate.FirstOrDefault(x => x.MenuId == this.getMenuId && x.FlowStep == nextSortIndex);
                        if (nextMenuFlowOperate != null)
                        {
                            this.rblFlowOperate.Enabled = false;
                            this.txtAuditFlowName.Text = nextMenuFlowOperate.AuditFlowName;
                            this.drpPerson.Items.Clear();
                            if (drpPersonUser != null)
                            {
                                this.drpPerson.DataValueField = "UserId";
                                this.drpPerson.DataTextField = "UserName";
                                this.drpPerson.DataSource = drpPersonUser;
                                this.drpPerson.DataBind();
                                Funs.FineUIPleaseSelect(this.drpPerson);
                            }
                            else
                            {
                                UserService.InitUserProjectIdRoleIdDropDownList(this.drpPerson, this.ProjectId, nextMenuFlowOperate.RoleId, true);
                            }
                              
                            if (nextMenuFlowOperate.IsFlowEnd == true)
                            {
                                this.rblFlowOperate.SelectedValue = Const.State_2;
                                this.SetFlowOperateEnd();
                            }
                        }
                    }
                }
                
                //if (string.IsNullOrEmpty(this.ProjectId))
                //{
                //    this.IsFileCabinetA.Hidden = true;
                //}

                this.BindGrid();
            }
        }
        #endregion

        #region 流程列表绑定数据
        /// <summary>
        /// 流程列表绑定数据
        /// </summary>
        private void BindGrid()
        {
            DataTable getDataTable = new DataTable();
            if (!string.IsNullOrEmpty(this.getDataId))
            {
                string strSql = @"SELECT FlowOperateId,MenuId,DataId,SortIndex,AuditFlowName,OperaterId,Users.UserName AS OperaterName,OperaterTime,Opinion,IsClosed "
                    + @" FROM dbo.Sys_FlowOperate LEFT JOIN Sys_User AS Users ON OperaterId = Users.UserId"
                    + @" WHERE IsClosed = 1 AND DataId=@DataId ORDER BY SortIndex DESC";
                List<SqlParameter> listStr = new List<SqlParameter>();
                listStr.Add(new SqlParameter("@DataId", this.getDataId));
                SqlParameter[] parameter = listStr.ToArray();
                getDataTable = SQLHelper.GetDataTableRunText(strSql, parameter);
            }

            Grid1.DataSource = getDataTable;
            Grid1.DataBind();
        }
        #endregion

        #region 下拉联动事件
        /// <summary>
        ///  处理方式下拉事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void rblFlowOperate_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.SetFlowOperateEnd();
        }

        /// <summary>
        /// 设置审核完成状态事件
        /// </summary>
        private void SetFlowOperateEnd()
        {
            if (this.rblFlowOperate.SelectedValue == BLL.Const.State_2)
            {
                this.txtAuditFlowName.Text = "审核完成";
                this.drpPerson.SelectedValue = Const._Null;
                this.drpPerson.Hidden = true;
               // this.IsFileCabinetA.Hidden = false;
                //var codeTemplateRule = Funs.DB.Sys_CodeTemplateRule.FirstOrDefault(x => x.MenuId == this.getMenuId && x.IsFileCabinetA == true);
                //if (codeTemplateRule != null)
                //{
                //    this.IsFileCabinetA.Checked = true;
                //}
            }
            else
            {
                ///取当前单据审核步骤
                int nextSortIndex = 1;
                var maxFlowOperate = Funs.DB.Sys_FlowOperate.Where(x => x.DataId == this.getDataId).Max(x => x.SortIndex);
                if (maxFlowOperate != null)
                {
                    nextSortIndex = maxFlowOperate.Value + 1;
                }
                else
                {
                    this.txtAuditFlowName.Text = "编制单据";
                }

                var nextMenuFlowOperate = Funs.DB.Sys_MenuFlowOperate.FirstOrDefault(x => x.MenuId == this.getMenuId && x.FlowStep == nextSortIndex);
                if (nextMenuFlowOperate != null && nextMenuFlowOperate.IsFlowEnd != true)
                {
                    this.txtAuditFlowName.Text = nextMenuFlowOperate.AuditFlowName;
                    this.drpPerson.Items.Clear();
                    BLL.UserService.InitUserProjectIdRoleIdDropDownList(this.drpPerson, this.geProjectId, nextMenuFlowOperate.RoleId, true);     
                    this.drpPerson.Hidden = false;

                }
                else
                {
                    this.drpPerson.Hidden = true;
                }

                //this.IsFileCabinetA.Hidden = true;
                //this.IsFileCabinetA.Checked = false;
            }
        }

        /// <summary>
        /// 得到角色名称字符串
        /// </summary>
        /// <param name="bigType"></param>
        /// <returns></returns>
        protected string ConvertRole(string roleIds)
        {
            return BLL.RoleService.getRoleNamesRoleIds(roleIds);
        }
        #endregion

        #region 组面板 折叠展开事件
        /// <summary>
        /// 组面板 折叠展开事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void GroupPanel_Collapse(object sender, EventArgs e)
        {
            if (this.GroupPanel1.Collapsed)
            {
                this.GroupPanel2.Collapsed = false;
            }
        }

        /// <summary>
        /// 组面板 折叠展开事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void GroupPanel2_Collapse(object sender, EventArgs e)
        {
            if (this.GroupPanel2.Collapsed)
            {
                this.GroupPanel1.Collapsed = false;
            }
        }

        /// <summary>
        /// 组面板 折叠展开事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void GroupPanel_Expand(object sender, EventArgs e)
        {
            if (this.GroupPanel1.Expanded)
            {
                this.GroupPanel2.Expanded = false;
            }
        }

        /// <summary>
        /// 组面板 折叠展开事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void GroupPanel2_Expand(object sender, EventArgs e)
        {
            if (this.GroupPanel2.Expanded)
            {
                this.GroupPanel1.Expanded = false;
            }
        }
        #endregion

        #region 保存数据
        /// <summary>
        /// 保存数据
        /// </summary>
        /// <param name="menuId">菜单id</param>
        /// <param name="dataId">主键id</param>
        /// <param name="isClosed">是否关闭这步流程</param>
        /// <param name="content">单据内容</param>
        /// <param name="url">路径</param>
        public void btnSaveData(string projectId, string menuId, string dataId, bool isClosed, string content, string url)
        {
            Model.Sys_FlowOperate newFlowOperate = new Model.Sys_FlowOperate
            {
                MenuId = this.getMenuId,
                DataId = dataId,
                OperaterId = ((Model.Sys_User)Session["CurrUser"]).UserId,
                State = this.rblFlowOperate.SelectedValue,
                IsClosed = isClosed,
                Opinion = this.txtOpinions.Text.Trim(),
                ProjectId = string.IsNullOrEmpty(projectId) ? null : projectId,
                Url = url
            };
            var user = BLL.UserService.GetUserByUserId(newFlowOperate.OperaterId);
            if (user != null)
            {
                var roles = BLL.RoleService.GetRoleByRoleId(user.RoleId);
                if (roles != null && !string.IsNullOrEmpty(roles.RoleName))
                {
                    newFlowOperate.AuditFlowName = "[" + roles.RoleName + "]";
                }
                else
                {
                    newFlowOperate.AuditFlowName = "[" + user.UserName + "]" ;
                }

                newFlowOperate.AuditFlowName += this.txtAuditFlowName.Text;
            }

            var updateFlowOperate = from x in Funs.DB.Sys_FlowOperate
                                    where x.DataId == newFlowOperate.DataId && (x.IsClosed == false || !x.IsClosed.HasValue)
                                    select x;
            if (updateFlowOperate.Count() > 0)
            {
                foreach (var item in updateFlowOperate)
                {
                    item.OperaterId = newFlowOperate.OperaterId;
                    item.OperaterTime = System.DateTime.Now;
                    item.State = newFlowOperate.State;
                    item.Opinion = newFlowOperate.Opinion;
                    item.AuditFlowName = this.txtAuditFlowName.Text;
                    item.IsClosed = newFlowOperate.IsClosed;
                    Funs.DB.SubmitChanges();
                }
            }
            else
            {
                int maxSortIndex = 1;
                var flowSet = Funs.DB.Sys_FlowOperate.Where(x => x.DataId == newFlowOperate.DataId);
                var sortIndex = flowSet.Select(x => x.SortIndex).Max();
                if (sortIndex.HasValue)
                {
                    maxSortIndex = sortIndex.Value + 1;
                }
                newFlowOperate.FlowOperateId = SQLHelper.GetNewID(typeof(Model.Sys_FlowOperate));
                newFlowOperate.SortIndex = maxSortIndex;
                newFlowOperate.OperaterTime = System.DateTime.Now;
                newFlowOperate.AuditFlowName = this.txtAuditFlowName.Text;                
                Funs.DB.Sys_FlowOperate.InsertOnSubmit(newFlowOperate);
                Funs.DB.SubmitChanges();
            }

            if (newFlowOperate.IsClosed == true)
            {
                var updateNoClosedFlowOperate = from x in Funs.DB.Sys_FlowOperate
                                        where x.DataId == newFlowOperate.DataId && (x.IsClosed == false || !x.IsClosed.HasValue)
                                        select x;
                if (updateNoClosedFlowOperate.Count() > 0)
                {
                    foreach (var itemClosed in updateNoClosedFlowOperate)
                    {
                        itemClosed.IsClosed = true;
                        Funs.DB.SubmitChanges();
                    }
                }

                if (newFlowOperate.State != BLL.Const.State_2) ///未审核完成的时 增加下一步办理
                {
                    int maxSortIndex = 1;
                    var flowSet = Funs.DB.Sys_FlowOperate.Where(x => x.DataId == newFlowOperate.DataId);
                    var sortIndex = flowSet.Select(x => x.SortIndex).Max();
                    if (sortIndex.HasValue)
                    {
                        maxSortIndex = sortIndex.Value + 1;
                    }

                    Model.Sys_FlowOperate newNextFlowOperate = new Model.Sys_FlowOperate
                    {
                        FlowOperateId = SQLHelper.GetNewID(typeof(Model.Sys_FlowOperate)),
                        MenuId = newFlowOperate.MenuId,
                        DataId = newFlowOperate.DataId,
                        ProjectId = newFlowOperate.ProjectId,
                        Url = newFlowOperate.Url,
                        SortIndex = maxSortIndex,
                        OperaterTime = System.DateTime.Now
                    };
                    if (this.drpPerson.SelectedValue != BLL.Const._Null)
                    {
                        newNextFlowOperate.OperaterId = this.drpPerson.SelectedValue;
                    }
                    else
                    {
                        newNextFlowOperate.OperaterId = newFlowOperate.OperaterId;
                    }
                    var operaterUsers = BLL.UserService.GetUserByUserId(newNextFlowOperate.OperaterId);
                    if (operaterUsers != null)
                    {
                        var operaterRoles = BLL.RoleService.GetRoleByRoleId(operaterUsers.RoleId);
                        if (operaterRoles != null && !string.IsNullOrEmpty(operaterRoles.RoleName))
                        {
                            newNextFlowOperate.AuditFlowName = "[" + operaterRoles.RoleName + "]" ;
                        }
                        else
                        {
                            newNextFlowOperate.AuditFlowName = "[" + operaterUsers.UserName + "]" ;
                        }

                        newNextFlowOperate.AuditFlowName += this.txtAuditFlowName.Text;
                    }
                    newNextFlowOperate.IsClosed = false;
                    newNextFlowOperate.State = BLL.Const.State_1;
                    Funs.DB.Sys_FlowOperate.InsertOnSubmit(newNextFlowOperate);
                    Funs.DB.SubmitChanges();
                }                
            }
        }
        #endregion

 

    }
}