using BLL;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using static FineUIPro.Web.TestRun.Report.ScheduleSetUp;
using NPOI.SS.Formula.Functions;
using Model;
using Newtonsoft.Json.Linq;
using System.Reflection;
using static FineUIPro.Web.TestRun.Report.PreRunSchedule;
using Aspose.Words;
using static FineUIPro.Web.TestRun.Report.TestRunSchedule;
using System.Web.UI.DataVisualization.Charting;
using NPOI.POIFS.Crypt.Dsig;
namespace FineUIPro.Web
{
    public partial class mainMenu_TestRun : PageBase
    {
        public string oneArrStr { get; set; }
        public string oneDataStr { get; set; }
        public string twoDataStr { get; set; }
        public string fourDecisionStr { get; set; }
        public string feedingRunStr { get; set; }
        public string productsStr { get; set; }
        public string runProductionStr { get; set; }
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                PageInit();
            }
        }
        public void PageInit()
        {
            OneYsc();
            TwoSc();
            FourDecision();
            FeedingRuns();
            Products();
            RunProduction();
        }
        /// 
        /// 预试车
        /// 
        public void OneYsc()
        {
            List oneArr = new List();
            List oneData = new List();
            var list = Funs.DB.Run_ScheduleSetUp.Where(x => x.ProjectId == this.CurrUser.LoginProjectId && x.States == 1).ToList();
            if (list.Count > 0)
            {
                var workpages = Funs.DB.PreRun_WorkPackage.OrderBy(x => x.Sort).ToList();
                var allrate = (float)Math.Round((float)list.Sum(a => a.CompleteNum) / (float)list.Sum(a => a.AllNum) * 100, 2, MidpointRounding.AwayFromZero);
                if (allrate > 100) allrate = 100;
                oneArr.Add(allrate);
                oneData.Add("全部");
                foreach (var item in workpages)
                {
                    var model = list.FirstOrDefault(x => x.WorkPackId == item.WorkPackId);
                    if (model != null)
                    {
                        var rate = model.CompleteNum > 0 ? (float)Math.Round((float)model.CompleteNum / (float)model.AllNum * 100, 2, MidpointRounding.AwayFromZero) : 0;
                        if (rate > 100) rate = 100;
                        oneArr.Add(rate);
                        oneData.Add(item.WorkPackName);
                    }
                }
            }
            else
            {
                List SubSystemIds = new List();
                var devices = Funs.DB.PreRun_SysDevice.Where(x => x.ProjectId == this.CurrUser.LoginProjectId && x.PreRunLevel == 4).ToList();
                if (devices.Count > 0)
                {
                    SubSystemIds = devices.ConvertAll(x => x.PreRunId);
                }
                var result = new List();
                string allStr = $"select a.SubSystemId,a.SystemId,b.WorkPackId,b.WorkPackName,b.WorkPackType,(select count(1) from PreRun_SubPropertySelect as gd where gd.SubSystemId = a.SubSystemId) as GdallNum,(select count(1) from PreRun_SubTechnologySelect as sb where sb.SubSystemId = a.SubSystemId) as SballNum,(select count(1) from PreRun_SubInstrumentSelect as sy where sy.SubSystemId = a.SubSystemId) as SyallNum from PreRun_SubSysWorkPackage as a inner join PreRun_WorkPackage as b on a.WorkPackId = b.WorkPackId where a.SubSystemId in ('{string.Join("','", SubSystemIds)}') order by a.WorkPackCode asc";
                var dt = SQLHelper.GetDataTableRunText(allStr);
                string inspectStr = $"select a.WorkPackId,b.WorkPackName,b.Sort,SUM(case ISNULL(a.InspectIsClose, 0) when 1 then 1 else 0 end) as CloseNum,SUM(case ISNULL(a.InspectIsClose, 0) when 0 then 1 else 0 end) as NoCloseNum,COUNT(1) as AllNum from PreRun_SubInspectTerm as a inner join PreRun_WorkPackage as b on a.WorkPackId = b.WorkPackId where 1=1 and a.ProjectId = '{this.CurrUser.LoginProjectId}' and a.SubSystemId in ('{string.Join("','", SubSystemIds)}') group by a.WorkPackId,b.WorkPackName,b.Sort order by b.Sort asc";
                var inspectDt = SQLHelper.GetDataTableRunText(inspectStr);
                var inspectlist = DataTableToList(inspectDt);
                if (dt.Rows.Count > 0)
                {
                    //获取所有子系统数量
                    var inspects = Funs.DB.PreRun_SubInspectTerm.Where(x => x.ProjectId == this.CurrUser.LoginProjectId && SubSystemIds.Contains(x.SubSystemId));
                    var querylist = DataTableToList(dt);
                    var queryGroup = querylist.GroupBy(x => new { x.WorkPackId, x.WorkPackName, x.WorkPackType }).Select(p => new
                    {
                        p.Key.WorkPackId,
                        p.Key.WorkPackName,
                        p.Key.WorkPackType
                    });
                    int progressNum = 0;
                    int completeNum = 0;
                    float allCompleteNum = 0;
                    float allProgressNum = 0;
                    int allNum = 0;
                    int allSumNum = 0;
                    List oneDataArr = new List();
                    List oneDataData = new List();
                    foreach (var itemPack in queryGroup)
                    {
                        var itemQueryList = querylist.Where(x => x.WorkPackId == itemPack.WorkPackId).ToList();
                        var subsystemids = itemQueryList.ConvertAll(a => a.SubSystemId).Distinct();
                        allNum = itemQueryList.Count(x => x.WorkPackId == itemPack.WorkPackId);
                        foreach (var itemsubid in subsystemids)
                        {
                            if (inspects.Count(x => x.SubSystemId == itemsubid) > 0)
                            {
                                var itemQuerylist = itemQueryList.FirstOrDefault(x => x.SubSystemId == itemsubid && x.WorkPackId == itemPack.WorkPackId);
                                if (inspects.Count(x => x.SubInspectId == itemsubid && x.InspectIsClose != 1) > 0)
                                {
                                    progressNum += 1;
                                }
                                else
                                {
                                    var closeInspect = inspects.Where(x => x.SubInspectId == itemsubid && x.InspectIsClose == 1);
                                    var closeNums = closeInspect.Count() > 0 ? closeInspect.Select(x => x.PropertyTechnologyId.Split(',').Count()).Sum(x => x) : 0;
                                    if (allNum > closeNums)
                                    {
                                        progressNum += 1;
                                    }
                                    else
                                    {
                                        completeNum += 1;
                                    }
                                }
                            }
                            else
                            {
                                progressNum += 1;
                            }
                        }
                        var rate = completeNum > 0 ? (float)Math.Round((float)completeNum / (float)allNum * 100, 2, MidpointRounding.AwayFromZero) : 0;
                        if (rate > 100) rate = 100;
                        allSumNum += allNum;
                        allCompleteNum += completeNum;
                        allProgressNum += progressNum;
                        oneDataArr.Add(rate);
                        oneDataData.Add(itemPack.WorkPackName);
                    }
                    var allrate = allCompleteNum > 0 ? (float)Math.Round(allCompleteNum / allSumNum * 100, 2, MidpointRounding.AwayFromZero) : 0;
                    if (allrate > 100) allrate = 100;
                    oneArr.Add(allrate);
                    oneData.Add("全部");
                    oneArr.AddRange(oneDataArr);
                    oneData.AddRange(oneDataData);
                }
            }
            oneArrStr = JsonConvert.SerializeObject(oneArr);
            oneDataStr = JsonConvert.SerializeObject(oneData);
        }
        /// 
        /// 试车
        /// 
        public void TwoSc()
        {
            var result = new List();
            var list = Funs.DB.Run_ScheduleSetUp.Where(x => x.ProjectId == this.CurrUser.LoginProjectId && x.States == 2).ToList();
            if (list.Count > 0)
            {
                var workpages = Funs.DB.TestRun_WorkPackage.OrderBy(x => x.Sort).ToList();
                foreach (var item in workpages)
                {
                    var model = list.FirstOrDefault(x => x.WorkPackId == item.WorkPackId);
                    if (model != null)
                    {
                        var rate = model.CompleteNum > 0 ? (float)Math.Round((float)model.CompleteNum / (float)model.AllNum * 100, 2, MidpointRounding.AwayFromZero) : 0;
                        if (rate > 100) rate = 100;
                        result.Add(new TwoDto()
                        {
                            Name = item.WorkPackName,
                            Rate = rate
                        });
                    }
                }
            }
            else
            {
                List SystemIds = new List();
                var devices = Funs.DB.PreRun_SysDevice.Where(x => x.ProjectId == this.CurrUser.LoginProjectId && x.PreRunLevel == 3).ToList();
                if (devices.Count > 0)
                {
                    SystemIds = devices.ConvertAll(x => x.PreRunId);
                }
                string allStr = $"select b.WorkPackId,b.WorkPackName,COUNT(a.SystemId) as WorkPackNum from TestRun_SubSysWorkPackage as a inner join TestRun_WorkPackage as b on a.WorkPackId = b.WorkPackId where a.SystemId in ('{string.Join("','", SystemIds)}') group by b.WorkPackId,b.WorkPackName";
                var dt = SQLHelper.GetDataTableRunText(allStr);
                var data = new List();
                if (dt.Rows.Count > 0)
                {
                    string inspectStr = $"select a.WorkPackId,b.WorkPackName,b.Sort,SUM(case ISNULL(a.InspectIsClose, 0) when 1 then 1 else 0 end) as CloseNum,SUM(case ISNULL(a.InspectIsClose, 0) when 0 then 1 else 0 end) as NoCloseNum,COUNT(1) as AllNum from TestRun_SubInspectTerm as a inner join TestRun_WorkPackage as b on a.WorkPackId = b.WorkPackId where 1=1 and a.ProjectId = '{this.CurrUser.LoginProjectId}' group by a.WorkPackId,b.WorkPackName,b.Sort order by b.Sort asc";
                    var inspectDt = SQLHelper.GetDataTableRunText(inspectStr);
                    var inspectlist = DataTableToList(inspectDt);
                    int progressNum = 0;
                    int completeNum = 0;
                    int allNum = 0;
                    var testlist = DataTableToList(dt);
                    foreach (var item in testlist)
                    {
                        if (inspectlist.Count(x => x.WorkPackId == item.WorkPackId) > 0)
                        {
                            var itemInspect = inspectlist.FirstOrDefault(x => x.WorkPackId == item.WorkPackId);
                            allNum = itemInspect.AllNum;
                            progressNum = itemInspect.NoCloseNum;
                            completeNum = itemInspect.CloseNum;
                        }
                        var rate = completeNum > 0 ? (float)Math.Round((float)completeNum / (float)allNum, 2, MidpointRounding.AwayFromZero) : 0;
                        result.Add(new TwoDto()
                        {
                            Name = item.WorkPackName,
                            Rate = rate
                        });
                    }
                }
            }
            twoDataStr = JsonConvert.SerializeObject(result);
        }
        /// 
        /// 三查四定
        /// 
        public void FourDecision()
        {
            var result = new List();
            var list = Funs.DB.Run_ScheduleSetUp.Where(x => x.ProjectId == this.CurrUser.LoginProjectId && x.States == 3).OrderBy(o => o.LevelName).ToList();
            if (list.Count > 0)
            {
                foreach (var item in list)
                {
                    var rate = item.CompleteNum > 0 ? (float)Math.Round((float)item.CompleteNum / (float)item.AllNum * 100, 2, MidpointRounding.AwayFromZero) : 0;
                    if (rate > 100) rate = 100;
                    result.Add(new ThreeDto()
                    {
                        Name = item.LevelName,
                        Rate = rate
                    });
                }
            }
            else
            {
                var fourlist = new List();
                string allStr = $"select Level,COUNT(1) as AllNum,SUM(case ISNULL(a.DecisionIsClose,0) when 0 then 1 else 0 end) as NoCloseNum,SUM(case ISNULL(a.DecisionIsClose,0) when 1 then 1 else 0 end) as CloseNum from PreRun_SubThreeChecksFourDecision as a where a.ProjectId='{this.CurrUser.LoginProjectId}' group by a.Level  order by a.Level asc";
                var dt = SQLHelper.GetDataTableRunText(allStr);
                if (dt.Rows.Count > 0)
                {
                    fourlist = DataTableToList(dt);
                    foreach (var item in fourlist)
                    {
                        float rate = item.CloseNum > 0 ? (float)Math.Round((float)item.CloseNum / (float)item.AllNum * 100, 2, MidpointRounding.AwayFromZero) : 0;
                        result.Add(new ThreeDto()
                        {
                            Name = item.Level,
                            Rate = rate
                        });
                    }
                }
            }
            fourDecisionStr = JsonConvert.SerializeObject(result);
        }
        /// 
        /// 投料试车
        /// 
        public void FeedingRuns()
        {
            List result = new List();
            var data = ParamentSettings(1);
            if (data.Count > 0)
            {
                foreach (var item in data)
                {
                    result.Add(new FourFiveDto()
                    {
                        RunType = item.RunType.Value,
                        SystemName = item.SystemName,
                        InstallationName = item.InstallationName
                    });
                }
                tlscNum.InnerHtml = "投料试车进度(" + result.Count.ToString() + ")";
                feedingRunStr = JsonConvert.SerializeObject(result);
            }
        }
        /// 
        /// 生产试运行
        /// 
        public void Products()
        {
            List result = new List();
            var data = ParamentSettings(2);
            if (data.Count > 0)
            {
                foreach (var item in data)
                {
                    result.Add(new FourFiveDto()
                    {
                        RunType = item.RunType.Value,
                        SystemName = item.SystemName,
                        InstallationName = item.InstallationName
                    });
                }
                syxNum.InnerHtml = "试运行进度(" + result.Count.ToString() + ")";
                productsStr = JsonConvert.SerializeObject(result);
            }
        }
        /// 
        /// 投料试车和生产试运行数据获取
        /// 
        /// 
        private List ParamentSettings(int state)
        {
            var result = new List();
            try
            {
                if (Funs.DB.Run_ParameterSettings.Count(x => x.ProjectId == this.CurrUser.LoginProjectId && x.States == state) == 0)
                {
                    var query = from runsys in Funs.DB.PreRun_SysDevice
                                join install in Funs.DB.PreRun_SysDevice on runsys.InstallationId equals install.PreRunId
                                join proce in Funs.DB.PreRun_SysDevice on runsys.ProcessesId equals proce.PreRunId
                                join project in Funs.DB.Base_Project on runsys.ProjectId equals project.ProjectId
                                where runsys.PreRunLevel == 3 && runsys.ProjectId == this.CurrUser.LoginProjectId
                                orderby runsys.Sort ascending
                                select new ParameterSettingsDto()
                                {
                                    ProjectId = this.CurrUser.LoginProjectId,
                                    ProjectName = project.ProjectName,
                                    InstallationId = runsys.InstallationId,
                                    InstallationName = install.PreRunName,
                                    ProcessesId = runsys.ProcessesId,
                                    ProcessesName = proce.PreRunName,
                                    SystemId = runsys.PreRunId,
                                    SystemName = runsys.PreRunName,
                                    States = 1,
                                    RunType = 1
                                };
                    if (query.Count() > 0)
                    {
                        result = query.ToList();
                        result.ForEach(x => { x.SettingsId = Guid.NewGuid().ToString(); });
                    }
                }
                else
                {
                    var query = from setting in Funs.DB.Run_ParameterSettings
                                join install in Funs.DB.PreRun_SysDevice on setting.InstallationId equals install.PreRunId
                                join proce in Funs.DB.PreRun_SysDevice on setting.ProcessesId equals proce.PreRunId
                                join sys in Funs.DB.PreRun_SysDevice on setting.SystemId equals sys.PreRunId
                                join project in Funs.DB.Base_Project on setting.ProjectId equals project.ProjectId
                                where setting.ProjectId == this.CurrUser.LoginProjectId && setting.States == state
                                orderby setting.Sort ascending
                                select new ParameterSettingsDto()
                                {
                                    SettingsId = setting.SettingsId,
                                    ProjectId = setting.ProjectId,
                                    ProjectName = project.ProjectName,
                                    InstallationId = setting.InstallationId,
                                    InstallationName = install.PreRunName,
                                    ProcessesId = setting.ProcessesId,
                                    ProcessesName = proce.PreRunName,
                                    SystemId = setting.SystemId,
                                    SystemName = sys.PreRunName,
                                    States = setting.States,
                                    RunType = setting.RunType,
                                    AddUser = setting.AddUser,
                                    AddTime = setting.AddTime,
                                    Sort = setting.Sort,
                                };
                    if (query.Count() > 0)
                    {
                        result = query.ToList();
                    }
                }
            }
            catch (Exception ex)
            {
                result = new List();
            }
            return result;
        }
        /// 
        /// 生产性能考核
        /// 
        public void RunProduction()
        {
            var result = new SixDto();
            var data = Funs.DB.Run_ProductionSettings.FirstOrDefault(x => x.ProjectId == this.CurrUser.LoginProjectId);
            if (data != null)
            {
                result.States = data.States.Value;
                result.StatesName = data.States == 1 ? "考核未开始" : data.States == 2 ? "考核进行中" : data.States == 3 ? "考核已完成" : "考核未开始";
                result.StartTime = data.StartTime != null ? data.StartTime.Value.ToString("yyyy-MM-dd") : string.Empty;
                result.EndTime = data.EndTime != null ? data.EndTime.Value.ToString("yyyy-MM-dd") : string.Empty;
            }
            else
            {
                result.States = 1;
                result.StatesName = "考核未开始";
            }
            runProductionStr = JsonConvert.SerializeObject(result);
        }
        #region 实体类
        /// 
        /// 图2
        /// 
        public class TwoDto
        {
            public float Rate { get; set; }
            public string Name { get; set; }
        }
        /// 
        /// 图3
        /// 
        public class ThreeDto
        {
            public string Name { get; set; }
            public float Rate { get; set; }
        }
        /// 
        /// 图4,5
        /// 
        public class FourFiveDto
        {
            public int RunType { get; set; }
            public string SystemName { get; set; }
            public string InstallationName { get; set; }
        }
        /// 
        /// 图6
        /// 
        public class SixDto
        {
            public int States { get; set; }
            public string StatesName { get; set; }
            public string StartTime { get; set; }
            public string EndTime { get; set; }
        }
        public class WorkPackageInspectDto
        {
            /// 
            /// 工作包主键
            /// 
            public string WorkPackId { get; set; }
            /// 
            /// 工作包名称
            /// 
            public string WorkPackName { get; set; }
            /// 
            /// 检查表数量
            /// 
            public int AllNum { get; set; }
            /// 
            /// 未关闭任务单数量
            /// 
            public int NoCloseNum { get; set; }
            /// 
            /// 已关闭任务单数量
            /// 
            public int CloseNum { get; set; }
        }
        public class Run_ScheduleSetUpDto : Run_ScheduleSetUp
        {
            /// 
            /// 工作包名称
            /// 
            public string WorkPackName { get; set; }
        }
        public class TestRunScheduleDto
        {
            /// 
            /// 工作包主键
            /// 
            public string WorkPackId { get; set; }
            /// 
            /// 工作包名称
            /// 
            public string WorkPackName { get; set; }
            /// 
            /// 装置名称
            /// 
            public string InstallationName { get; set; }
            /// 
            /// 工序名称
            /// 
            public string ProcessesName { get; set; }
            /// 
            /// 系统名称
            /// 
            public string SystemName { get; set; }
            /// 
            /// 工作包数量
            /// 
            public int WorkPackNum { get; set; }
            /// 
            /// 工作包未关闭数量
            /// 
            public int WorkPackNoCloseNum { get; set; }
            /// 
            /// 工作包已关闭数量
            /// 
            public int WorkPackCloseNum { get; set; }
            /// 
            /// 检查表数量
            /// 
            public int InspectNum { get; set; }
            /// 
            /// 检查表未关闭数量
            /// 
            public int InspectNoCloseNum { get; set; }
            /// 
            /// 检查表已关闭数量
            /// 
            public int InspectCloseNum { get; set; }
        }
        public class FourDecisionScheduleBridDto
        {
            /// 
            /// 级别
            /// 
            public string Level { get; set; }
            /// 
            /// 尾项数量
            /// 
            public int AllNum { get; set; }
            /// 
            /// 未关闭尾项数量
            /// 
            public int NoCloseNum { get; set; }
            /// 
            /// 已关闭尾项数量
            /// 
            public int CloseNum { get; set; }
        }
        #endregion
        #region 转换
        /// 
        /// DataTable转换List
        /// 
        /// 
        public List DataTableToList(DataTable table)
        {
            List list = new List();
            T t = default(T);
            PropertyInfo[] propertypes = null;
            string tempName = string.Empty;
            foreach (DataRow row in table.Rows)
            {
                t = Activator.CreateInstance();
                propertypes = t.GetType().GetProperties();
                foreach (PropertyInfo pro in propertypes)
                {
                    tempName = pro.Name;
                    if (table.Columns.Contains(tempName))
                    {
                        object value = row[tempName];
                        if (!value.ToString().Equals(""))
                        {
                            pro.SetValue(t, value, null);
                        }
                    }
                }
                list.Add(t);
            }
            return list.Count == 0 ? new List() : list;
        }
        #endregion
    }
}