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

namespace BLL
{
    public static class ResourcePlanService
    {
        /// <summary>
        /// 批量增加
        /// </summary>
        /// <param name="model"></param>
        //public static bool AddResourcePlan(Model.Resource_Plan model, List<Model.Resource_PlanDetail> PlanDetailList, List<Model.ManHours_Plan> ManHoursPlanList)
        //{
        //    bool result = false;
        //    try
        //    {
        //        Model.Resource_Plan newPlan = db.Resource_Plan.FirstOrDefault(e => e.EProjectId == model.EProjectId && e.IsClose==0);
        //        if (newPlan != null)
        //        {
        //            newPlan.IsClose =1;
        //            string sql = "  update ManHours_Plan set IsClose=1 where ResourcePlanId=@ResourcePlanId and EProjectId=@EProjectId";
        //            SqlParameter[] parameter = new SqlParameter[]
        //           {
        //                new SqlParameter("@ResourcePlanId",newPlan.ResourcePlanId),
        //                new SqlParameter("@EProjectId",newPlan.EProjectId)
        //           };
        //            SQLHelper.ExecutSql(sql, parameter);   
        //        }
        //        if (model != null)
        //        db.Resource_Plan.InsertOnSubmit(model);
        //        if (PlanDetailList != null && PlanDetailList.Count > 0)
        //            db.Resource_PlanDetail.InsertAllOnSubmit(PlanDetailList);
        //        if (ManHoursPlanList != null && ManHoursPlanList.Count > 0)
        //            db.ManHours_Plan.InsertAllOnSubmit(ManHoursPlanList);
        //        db.SubmitChanges();
        //        result = true;
        //    }
        //    catch
        //    {
        //        result = false;
        //    }

        //    return result;
        //}


        //public static bool EditResourcePlan(Model.Resource_Plan model, List<Model.Resource_PlanDetail> PlanDetailList, List<Model.ManHours_Plan> ManHoursPlanList)
        //{
        //    bool result = false;
        //    try
        //    {
        //        Model.Resource_Plan newPlan = db.Resource_Plan.FirstOrDefault(e => e.EProjectId == model.EProjectId && e.IsClose == 0);
        //        if (newPlan != null)
        //        {
        //            newPlan.WO = model.WO;
        //            string sql1 = "delete  FROM Resource_PlanDetail WHERE ResourcePlanId=@ResourcePlanId    delete  FROM ManHours_Plan WHERE ResourcePlanId=@ResourcePlanId";
        //            SqlParameter[] parameter = new SqlParameter[]
        //           {
        //               new SqlParameter("@ResourcePlanId",model.ResourcePlanId)
        //           };
        //            SQLHelper.ExecutSql(sql1, parameter);                    
        //        }
        //        //if (model != null)
        //        //    db.Resource_Plan.InsertOnSubmit(model);
        //        if (PlanDetailList != null && PlanDetailList.Count > 0)
        //            db.Resource_PlanDetail.InsertAllOnSubmit(PlanDetailList);
        //        if (ManHoursPlanList != null && ManHoursPlanList.Count > 0)
        //            db.ManHours_Plan.InsertAllOnSubmit(ManHoursPlanList);
        //        db.SubmitChanges();
        //        result = true;
        //    }
        //    catch
        //    {
        //        result = false;
        //    }

        //    return result;
        //}


        /// <summary>
        /// 事物提交
        /// </summary>
        /// <param name="model"></param>
        /// <param name="PlanDetailList"></param>
        /// <param name="ManHoursPlanList"></param>
        /// <returns></returns>
        public static bool AddTran(Model.Resource_Plan model, Model.Editor_EProject EEProject, List<Model.Resource_PlanDetail> PlanDetailList, List<Model.Editor_PM> PMList, List<Model.ManHours_Plan> ManHoursPlanList)
        {
            bool result = true;
            if (model == null)
                return false;
            Funs.DB.Connection.Close();
            Funs.DB.Connection.Open();
            Funs.DB.CommandTimeout = 30000;
            using (DbTransaction tran = Funs.DB.Connection.BeginTransaction())
            {
                Funs.DB.Transaction = tran;
                try
                {
                    Model.Editor_EProject EProject = Funs.DB.Editor_EProject.FirstOrDefault(e => e.EProjectId == model.EProjectId);
                    if (EProject != null)
                    {
                        EProject.ProjectControl_Account = model.WO;
                        EProject.ProjectControl_MS_Approval = EEProject.ProjectControl_MS_Approval;
                        EProject.ProjectControl_JobStatus = EEProject.ProjectControl_JobStatus;
                        //EProject.PM_General_Priority = EEProject.PM_General_Priority;
                        EProject.PM_General_CDI = EEProject.PM_General_CDI;
                        EProject.ProjectControl_LP_SchStart = EEProject.ProjectControl_LP_SchStart;
                        EProject.ProjectControl_LP_SchEnd = EEProject.ProjectControl_LP_SchEnd;
                        EProject.ProjectControl_LP_Progress = EEProject.ProjectControl_LP_Progress;
                        EProject.ProjectControl_CC_SchStart = EEProject.ProjectControl_CC_SchStart;
                        EProject.ProjectControl_CC_SchEnd = EEProject.ProjectControl_CC_SchEnd;
                        EProject.ProjectControl_CC_Progress = EEProject.ProjectControl_CC_Progress;
                        EProject.ProjectControl_CM_SchStart = EEProject.ProjectControl_CM_SchStart;
                        EProject.ProjectControl_CM_SchEnd = EEProject.ProjectControl_CM_SchEnd;
                        EProject.ProjectControl_CM_Progress = EEProject.ProjectControl_CM_Progress;
                        EProject.ProjectControl_MS_MC = EEProject.ProjectControl_MS_MC;
                        EProject.ProjectControl_MS_Close = EEProject.ProjectControl_MS_Close;
                        EProject.ProjectControl_Revised_MC_Date = EEProject.ProjectControl_Revised_MC_Date;
                        EProject.ProjectControl_ProjectManagerId = EEProject.ProjectControl_ProjectManagerId;
                        //EProject.ProjectControl_Account = EEProject.ProjectControl_Account;
                        EProject.ProjectControl_CI_Civil = EEProject.ProjectControl_CI_Civil;
                        EProject.ProjectControl_CI_Process = EEProject.ProjectControl_CI_Process;
                        EProject.ProjectControl_CI_Equipment = EEProject.ProjectControl_CI_Equipment;
                        EProject.ProjectControl_CI_Instrument = EEProject.ProjectControl_CI_Instrument;
                        EProject.ProjectControl_CI_Electrical = EEProject.ProjectControl_CI_Electrical;
                        //EProject.ProjectControl_Remarks = EEProject.ProjectControl_Remarks;
                        EProject.PM_LLEP_RevisedStart = EEProject.PM_LLEP_RevisedStart;
                        EProject.PM_LLEP_RevisedEnd = EEProject.PM_LLEP_RevisedEnd;
                        EProject.PM_LLEP_ActualProgress = EEProject.PM_LLEP_ActualProgress;
                        EProject.CM_CC_RevisedStart = EEProject.CM_CC_RevisedStart;
                        EProject.CM_CC_RevisedEnd = EEProject.CM_CC_RevisedEnd;
                        EProject.CM_CC_AcutalProgress = EEProject.CM_CC_AcutalProgress;
                        EProject.CM_CM_RevisedStart = EEProject.CM_CM_RevisedStart;
                        EProject.CM_CM_RevisedEnd = EEProject.CM_CM_RevisedEnd;
                        EProject.CM_CM_AcutalProgress = EEProject.CM_CM_AcutalProgress;
                        EProject.StudyWo = EEProject.StudyWo;
                        EProject.ProjectControl_ConstManagerId = EEProject.ProjectControl_ConstManagerId;
                        EProject.ProjectControl_ConstManager = EEProject.ProjectControl_ConstManager;

                        EProject.ModifyDate = EEProject.ModifyDate;
                        EProject.ModifyPerson = EEProject.ModifyPerson;
                    }

                    // PMList 对Editor_PM操作
                    var list = (from x in Funs.DB.Editor_PM where x.EProjectId == model.EProjectId select x).ToList();
                    List<Model.Editor_PM> NewPMList = new List<Model.Editor_PM>();
                    List<Model.Editor_PM> DelEditor_PM = new List<Model.Editor_PM>();

                    // 更新资源时,如原来选过的专业,现在不选了,并且Revised还没填写,则删除
                    foreach (var p in list)
                    {
                        var pm = PMList.Find(x => x.DisciplinesWBSCode == p.DisciplinesWBSCode && x.DisciplinesWBSName == p.DisciplinesWBSName && x.WBS == p.WBS);
                        if (pm == null && !p.RevisedStart.HasValue && !p.RevisedEnd.HasValue)
                        {
                            DelEditor_PM.Add(p);
                        }
                    }

                    // 更新资源时,增加新增的专业
                    foreach (var p in PMList)
                    {
                        var pm = list.Find(x => x.DisciplinesWBSCode == p.DisciplinesWBSCode && x.DisciplinesWBSName == p.DisciplinesWBSName && x.WBS == p.WBS);
                        if (pm == null)
                        {
                            NewPMList.Add(p);
                        }
                    }

                    //  已在资源和计划编辑器中分情况处理
                    //Model.Resource_Plan newPlan = Funs.DB.Resource_Plan.FirstOrDefault(e => e.EProjectId == model.EProjectId && e.IsClose == 0);
                    //if (newPlan != null)
                    //{
                    //    newPlan.IsClose = 1;
                    //    var query = (from x in Funs.DB.ManHours_Plan where x.EProjectId == newPlan.EProjectId && x.ResourcePlanId == newPlan.ResourcePlanId select x).ToList();
                    //    foreach (var v in query)
                    //    {
                    //        v.IsClose = 1;
                    //        v.AccountDisabled = 1;
                    //    }
                    //}

                    Funs.DB.Resource_Plan.InsertOnSubmit(model);
                    if (PlanDetailList != null && PlanDetailList.Count > 0)
                    {
                        Funs.DB.Resource_PlanDetail.InsertAllOnSubmit(PlanDetailList);
                    }
                    if (NewPMList != null && NewPMList.Count > 0)
                    {
                        Funs.DB.Editor_PM.InsertAllOnSubmit(NewPMList);
                    }
                    if (DelEditor_PM != null && DelEditor_PM.Count() > 0)
                    {
                        Funs.DB.Editor_PM.DeleteAllOnSubmit(DelEditor_PM);
                    }
                    if (ManHoursPlanList != null && ManHoursPlanList.Count > 0)
                    {
                        Funs.DB.ManHours_Plan.InsertAllOnSubmit(ManHoursPlanList);
                    }

                    Funs.DB.SubmitChanges();
                    tran.Commit();
                    result = true;
                }
                catch
                {
                    tran.Rollback();//回滚事务
                    result = false;
                }
            }
            Funs.DB.Connection.Close();
            return result;
        }

        public static bool EditTran(Model.Resource_Plan model, Model.Editor_EProject EEProject, List<Model.Resource_PlanDetail> PlanDetailList, List<Model.Editor_PM> PMList, List<Model.ManHours_Plan> ManHoursPlanList)
        {
            bool result = false;
            Funs.DB.Connection.Close();
            Funs.DB.Connection.Open();
            Funs.DB.CommandTimeout = 30000;
            using (DbTransaction tran = Funs.DB.Connection.BeginTransaction())
            {
                Funs.DB.Transaction = tran;
                try
                {
                    Model.Editor_EProject EProject = Funs.DB.Editor_EProject.FirstOrDefault(e => e.EProjectId == model.EProjectId);
                    if (EProject != null)
                    {
                        //EProject.ProjectControl_Account = model.WO;
                        EProject.ProjectControl_MS_Approval = EEProject.ProjectControl_MS_Approval;
                        EProject.ProjectControl_JobStatus = EEProject.ProjectControl_JobStatus;
                        //EProject.PM_General_Priority = EEProject.PM_General_Priority;
                        EProject.PM_General_CDI = EEProject.PM_General_CDI;
                        EProject.ProjectControl_LP_SchStart = EEProject.ProjectControl_LP_SchStart;
                        EProject.ProjectControl_LP_SchEnd = EEProject.ProjectControl_LP_SchEnd;
                        EProject.ProjectControl_LP_Progress = EEProject.ProjectControl_LP_Progress;
                        EProject.ProjectControl_CC_SchStart = EEProject.ProjectControl_CC_SchStart;
                        EProject.ProjectControl_CC_SchEnd = EEProject.ProjectControl_CC_SchEnd;
                        EProject.ProjectControl_CC_Progress = EEProject.ProjectControl_CC_Progress;
                        EProject.ProjectControl_CM_SchStart = EEProject.ProjectControl_CM_SchStart;
                        EProject.ProjectControl_CM_SchEnd = EEProject.ProjectControl_CM_SchEnd;
                        EProject.ProjectControl_CM_Progress = EEProject.ProjectControl_CM_Progress;
                        EProject.ProjectControl_MS_MC = EEProject.ProjectControl_MS_MC;
                        EProject.ProjectControl_MS_Close = EEProject.ProjectControl_MS_Close;
                        EProject.ProjectControl_Revised_MC_Date = EEProject.ProjectControl_Revised_MC_Date;
                        EProject.ProjectControl_ProjectManagerId = EEProject.ProjectControl_ProjectManagerId;
                        //EProject.ProjectControl_Account = EEProject.ProjectControl_Account;
                        EProject.ProjectControl_CI_Civil = EEProject.ProjectControl_CI_Civil;
                        EProject.ProjectControl_CI_Process = EEProject.ProjectControl_CI_Process;
                        EProject.ProjectControl_CI_Equipment = EEProject.ProjectControl_CI_Equipment;
                        EProject.ProjectControl_CI_Instrument = EEProject.ProjectControl_CI_Instrument;
                        EProject.ProjectControl_CI_Electrical = EEProject.ProjectControl_CI_Electrical;

                        EProject.PM_LLEP_RevisedStart = EEProject.PM_LLEP_RevisedStart;
                        EProject.PM_LLEP_RevisedEnd = EEProject.PM_LLEP_RevisedEnd;
                        EProject.PM_LLEP_ActualProgress = EEProject.PM_LLEP_ActualProgress;
                        EProject.CM_CC_RevisedStart = EEProject.CM_CC_RevisedStart;
                        EProject.CM_CC_RevisedEnd = EEProject.CM_CC_RevisedEnd;
                        EProject.CM_CC_AcutalProgress = EEProject.CM_CC_AcutalProgress;
                        EProject.CM_CM_RevisedStart = EEProject.CM_CM_RevisedStart;
                        EProject.CM_CM_RevisedEnd = EEProject.CM_CM_RevisedEnd;
                        EProject.CM_CM_AcutalProgress = EEProject.CM_CM_AcutalProgress;
                        EProject.ProjectControl_ConstManagerId = EEProject.ProjectControl_ConstManagerId;
                        EProject.ProjectControl_ConstManager = EEProject.ProjectControl_ConstManager;

                        EProject.ModifyDate = EEProject.ModifyDate;
                        EProject.ModifyPerson = EEProject.ModifyPerson;
                    }


                    // PMList 对Editor_PM操作
                    var list = (from x in Funs.DB.Editor_PM where x.EProjectId == model.EProjectId select x).ToList();
                    List<Model.Editor_PM> NewPMList = new List<Model.Editor_PM>();
                    List<Model.Editor_PM> DelEditor_PM = new List<Model.Editor_PM>();
                    List<Model.Editor_PM> UpdatPMList = new List<Model.Editor_PM>();

                    // 更新资源时,如原来选过的专业,现在不选了,并且Revised还没填写,则删除
                    foreach (var p in list)
                    {
                        var pm = PMList.Find(x => x.DisciplinesWBSCode == p.DisciplinesWBSCode && x.DisciplinesWBSName == p.DisciplinesWBSName && x.WBS == p.WBS);
                        if (pm == null && !p.RevisedStart.HasValue && !p.RevisedEnd.HasValue)
                        {
                            DelEditor_PM.Add(p);
                        }
                    }

                    // 更新资源时,增加新增的专业
                    foreach (var p in PMList)
                    {
                        var pm = list.Find(x => x.DisciplinesWBSCode == p.DisciplinesWBSCode && x.DisciplinesWBSName == p.DisciplinesWBSName && x.WBS == p.WBS);
                        if (pm == null)
                        {
                            NewPMList.Add(p);
                        }
                        else
                        {
                            Model.Editor_PM ep = new Model.Editor_PM();
                            ep.PMId = pm.PMId;
                            ep.EProjectId = p.EProjectId;
                            ep.DisciplinesWBSCode = p.DisciplinesWBSCode;
                            ep.DisciplinesWBSName = p.DisciplinesWBSName;
                            ep.WBS = p.WBS;
                            ep.SchStart = p.SchStart;
                            ep.SchEnd = p.SchEnd;
                            ep.RevisedStart = p.RevisedStart;
                            ep.RevisedEnd = p.RevisedEnd;
                            UpdatPMList.Add(ep);
                        }
                    }


                    Model.Resource_Plan newPlan = Funs.DB.Resource_Plan.FirstOrDefault(e => e.ResourcePlanId == model.ResourcePlanId && e.IsClose == 0);
                    if (newPlan != null)
                    {
                        newPlan.WO = model.WO;
                        var PlanDetail = (from x in Funs.DB.Resource_PlanDetail where x.EProjectId == newPlan.EProjectId && x.ResourcePlanId == newPlan.ResourcePlanId select x).ToList();
                        if (PlanDetail != null)
                        {
                            Funs.DB.Resource_PlanDetail.DeleteAllOnSubmit(PlanDetail);
                        }
                        var query = (from x in Funs.DB.ManHours_Plan where x.EProjectId == newPlan.EProjectId && x.ResourcePlanId == newPlan.ResourcePlanId select x).ToList();
                        if (query != null)
                        {
                            Funs.DB.ManHours_Plan.DeleteAllOnSubmit(query);
                        }
                    }
                    // db.Resource_Plan.InsertOnSubmit(model);
                    if (PlanDetailList != null && PlanDetailList.Count > 0)
                    {
                        Funs.DB.Resource_PlanDetail.InsertAllOnSubmit(PlanDetailList);
                    }
                    if (NewPMList != null && NewPMList.Count > 0)
                    {
                        Funs.DB.Editor_PM.InsertAllOnSubmit(NewPMList);
                    }
                    if (DelEditor_PM != null && DelEditor_PM.Count() > 0)
                    {
                        Funs.DB.Editor_PM.DeleteAllOnSubmit(DelEditor_PM);
                    }

                    if (UpdatPMList != null && UpdatPMList.Count() > 0)
                    {
                        foreach (Model.Editor_PM p in UpdatPMList)
                        {
                            Model.Editor_PM ep = Funs.DB.Editor_PM.FirstOrDefault(x => x.PMId == p.PMId);
                            ep.EProjectId = p.EProjectId;
                            ep.DisciplinesWBSCode = p.DisciplinesWBSCode;
                            ep.DisciplinesWBSName = p.DisciplinesWBSName;
                            ep.WBS = p.WBS;
                            ep.SchStart = p.SchStart;
                            ep.SchEnd = p.SchEnd;
                            ep.RevisedStart = p.RevisedStart;
                            ep.RevisedEnd = p.RevisedEnd;
                            Funs.DB.SubmitChanges();
                        }
                    }

                    if (ManHoursPlanList != null && ManHoursPlanList.Count > 0)
                    {
                        Funs.DB.ManHours_Plan.InsertAllOnSubmit(ManHoursPlanList);
                    }
                    Funs.DB.SubmitChanges();
                    tran.Commit();
                    result = true;
                }
                catch
                {
                    tran.Rollback();//回滚事务
                    result = false;
                }
            }
            Funs.DB.Connection.Close();
            return result;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public static DataTable GetDataTable(string ResourcePlanId, string EProjectId)
        {
            string strSql = "Select * From View_Resource_PlanDetai WHERE ResourcePlanId=@ResourcePlanId and EProjectId=@EProjectId";
            SqlParameter[] parameter = new SqlParameter[]
                   {
                       new SqlParameter("@ResourcePlanId",ResourcePlanId),
                        new SqlParameter("@EProjectId",EProjectId)
                   };
            DataTable dt = SQLHelper.GetDataTableRunText(strSql, parameter);
            return dt;
        }

        ///// <summary>
        ///// 根据eprojectId获取设计专业资源
        ///// </summary>
        ///// <param name="EProjectId"></param>
        ///// <returns></returns>
        //public static List<Model.Resource_Plan> GetResourcePlanList(string EProjectId)
        //{
        //    return (from x in db.Resource_Plan where x.EProjectId == EProjectId && x.Types == "1" select x).ToList();
        //}

        ///// <summary>
        ///// 获取设计专业资源
        ///// </summary>
        ///// <returns></returns>
        //public static List<Model.Resource_Plan> GetResource_PlansList()
        //{
        //    return (from x in db.Resource_Plan where x.Types == "1" select x).ToList();
        //}

        /// <summary>
        /// 增加资源计划
        /// </summary>
        /// <param name="plan"></param>
        public static void AddPlan(Model.Resource_Plan plan)
        {
            Model.Resource_Plan newPlan = new Model.Resource_Plan();
            newPlan.ResourcePlanId = plan.ResourcePlanId;
            newPlan.EProjectId = plan.EProjectId;
            newPlan.WO = plan.WO;
            newPlan.CountNum = plan.CountNum;
            newPlan.IsClose = plan.IsClose;
            Funs.DB.Resource_Plan.InsertOnSubmit(newPlan);
            Funs.DB.SubmitChanges();
        }

        /// <summary>
        /// 修改资源计划
        /// </summary>
        /// <param name="plan"></param>
        public static void UpdatePlan(Model.Resource_Plan plan)
        {
            Model.Resource_Plan newPlan = Funs.DB.Resource_Plan.FirstOrDefault(e => e.ResourcePlanId == plan.ResourcePlanId);
            if (newPlan != null)
            {
                newPlan.WO = plan.WO;
                newPlan.CountNum = plan.CountNum;
                newPlan.IsClose = plan.IsClose;
                Funs.DB.SubmitChanges();
            }
        }

        /// <summary>
        /// 修改RP工单号
        /// </summary>
        /// <param name="plan"></param>
        public static void UpdateRPWO(string resourcePlanId,string wo)
        {
            Model.Resource_Plan newPlan = Funs.DB.Resource_Plan.FirstOrDefault(e => e.ResourcePlanId == resourcePlanId);
            if (newPlan != null)
            {
                newPlan.WO = wo;
                Funs.DB.SubmitChanges();
            }
        }

        /// <summary>
        /// 删除
        /// </summary>
        /// <param name="roleId"></param>
        public static void DeleteResourcePlan(string EProjectId)
        {
            var q = (from x in Funs.DB.Resource_Plan where x.EProjectId == EProjectId select x).ToList();
            if (q != null)
            {
                Funs.DB.Resource_Plan.DeleteAllOnSubmit(q);
                Funs.DB.SubmitChanges();
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="resourcePlanId"></param>
        /// <returns></returns>
        public static Model.Resource_Plan GetModelsResourcePlan(string resourcePlanId)
        {
            try
            {
                Model.Resource_Plan newPlan = Funs.DB.Resource_Plan.FirstOrDefault(e => e.ResourcePlanId == resourcePlanId);
                return newPlan;
            }
            catch (System.Exception)
            {
                throw;
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="sId"></param>
        /// <returns></returns>
        public static Model.Resource_Plan GetModelsResourcePlans(string sId)
        {
            try
            {
                Model.Resource_Plan newPlan = Funs.DB.Resource_Plan.FirstOrDefault(e => e.ResourcePlanId == sId);
                return newPlan;
            }
            catch (System.Exception)
            {
                throw;
            }
        }

        public static List<Model.Resource_Plan> GetResourcePlanByEProjectId(string eProjectId)
        {
            return (from x in Funs.DB.Resource_Plan where x.EProjectId == eProjectId select x).ToList();
        }

        /// <summary>
        /// 根据eprojectId获取设计专业资源
        /// </summary>
        /// <param name="EProjectId"></param>
        /// <returns></returns>
        public static List<Model.Resource_PlanDetail> GetResourcePlanList(string EProjectId)
        {
            return (from x in Funs.DB.Resource_PlanDetail where x.EProjectId == EProjectId && x.Types == "1" select x).ToList();
        }
    }
}