using MESClassLibrary;
using MESClassLibrary.BLL.Log;
using MESClassLibrary.BLL.Show;
using MESClassLibrary.EFModel;
using MESClassLibrary.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Web;
using System.Web.Services;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace MESWebSite.Manage
{
    public partial class AnalysisApi : System.Web.UI.Page
    {
        public static string GoodsListHtml;

        protected void Page_Load(object sender, EventArgs e)
        {
            if (Request.Cookies["LoginUserInfo"] == null)
            {
                Response.Write("<script language=javascript>alert('您的登录信息已过期,请重新登录!');top.location.href='../Login.aspx';</script>");
            }
        }

        [WebMethod]
        public static string GetBarDate(string side, string ProductName)
        {
            try
            {

                AnalysisBLL bll = new AnalysisBLL();
                List<tb_InspectResult> list = bll.SearchInfo(ProductName);

                List<AnalysisBarModel> listModel = new List<AnalysisBarModel>();

                BuildBar(side, "S前保", ProductName, list, ref listModel);
                BuildBar(side, "S后保", ProductName, list, ref listModel);
                BuildBar(side, "AMG前保", ProductName, list, ref listModel);
                BuildBar(side, "AMG后保", ProductName, list, ref listModel);

                return JSONTools.ScriptSerialize(listModel);
            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                return "";
            }
        }

        [WebMethod]
        public static string GetLineTable(string side, string ProductName)
        {
            try
            {
                try
                {
                    AnalysisBLL bll = new AnalysisBLL();
                    List<string> r_list = new List<string>();

                    List<tb_InspectResult> list = bll.SearchInfo(ProductName);
                    list = list.Where(p => p.InspectTimes.Equals("1") && p.side.Equals(side)).ToList();

                    BuildLineTable("S前保", list, ref r_list);
                    BuildLineTable("S后保", list, ref r_list);
                    BuildLineTable("AMG前保", list, ref r_list);
                    BuildLineTable("AMG后保", list, ref r_list);
                    BuildLineTable("S左门槛", list, ref r_list);
                    BuildLineTable("S右门槛", list, ref r_list);
                    BuildLineTable("AMG左门槛", list, ref r_list);
                    BuildLineTable("AMG右门槛", list, ref r_list);

                    return JSONTools.ScriptSerialize(r_list);
                }
                catch (Exception ex)
                {
                    LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                    return "";
                }
            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                return "";
            }
        }

        [WebMethod]
        public static string GetLineData(string side, string ProductName)
        {
            try
            {
                List<string> categories = new List<string>();
                List<string> data = new List<string>();
                AnalysisBLL bll = new AnalysisBLL();
                List<tb_InspectResult> list = bll.SearchInfo(ProductName);
                list = list.Where(p => p.InspectTimes.Equals("1") && p.side.Equals(side)).ToList();
                DateTime date = DateTime.Now;
                //DateTime date = Convert.ToDateTime("2019-06-20 7:00:00");
                string nowTime = date.ToString("yyyy-MM-dd");
                DateTime startTime = Convert.ToDateTime(nowTime + " 08:00:00");//班次开始时间
                DateTime endTime = Convert.ToDateTime(nowTime + " 19:59:59");//班次结束时间

                if (DateTime.Compare(date, startTime) < 0)
                {
                    //昨天夜班
                    for (int i = 1; i <= 12; i++)
                    {
                        categories.Add(endTime.AddDays(-1).AddHours(i).Hour.ToString() + "点");

                        var t = list.Where(p => p.createTime >= endTime.AddDays(-1).AddHours(i - 1) && p.createTime <= endTime.AddDays(-1).AddHours(i)).ToList();

                        if (t != null && t.Count > 0)
                        {
                            double r = (double)t.Where(p => p.inspectResult.Equals("[合格]")).Count() / (double)t.Count;
                            data.Add(Math.Round(r * 100, 2).ToString());
                        }
                        else
                        {
                            data.Add("0.00%");
                        }
                    }
                }

                if (DateTime.Compare(date, endTime) > 0)
                {
                    //今天夜班
                    for (int i = 1; i <= 12; i++)
                    {
                        categories.Add(endTime.AddHours(i).Hour.ToString() + "点");

                        var t = list.Where(p => p.createTime > endTime.AddHours(i - 1) && p.createTime <= endTime.AddHours(i)).ToList();

                        if (t != null && t.Count > 0)
                        {
                            double r = (double)t.Where(p => p.inspectResult.Equals("[合格]")).Count() / (double)t.Count;
                            data.Add(Math.Round(r * 100, 2).ToString());
                        }
                        else
                        {
                            data.Add("0.00%");
                        }
                    }
                }

                if (DateTime.Compare(date, startTime) >= 0 && DateTime.Compare(date, endTime) <= 0)
                {
                    //今天白班

                    for (int i = 1; i <= 12; i++)
                    {
                        categories.Add(startTime.AddHours(i).Hour.ToString() + "点");

                        var t = list.Where(p => p.createTime >= startTime.AddHours(i - 1) && p.createTime <= startTime.AddHours(i)).ToList();

                        if (t != null && t.Count > 0)
                        {
                            double r = (double)t.Where(p => p.inspectResult.Equals("[合格]")).Count() / (double)t.Count;
                            data.Add(Math.Round(r * 100, 2).ToString());
                        }
                        else
                        {
                            data.Add("0.00");
                        }
                    }

                }

                AnalysisBarModel analysisBarModel = new AnalysisBarModel();
                analysisBarModel.text = "";
                analysisBarModel.subtext = "一次合格率(%)";
                analysisBarModel.categories = categories;
                analysisBarModel.data = data;

                return JSONTools.ScriptSerialize(analysisBarModel);
            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                return "";
            }
        }


        [WebMethod]
        public static string GetPieData(string reason, string ProductName)
        {
            try
            {
                AnalysisBLL bll = new AnalysisBLL();
                List<tb_InspectResult> list = bll.SearchInfo(ProductName);
                List<tb_InspectResult> info = new List<tb_InspectResult>();

                if ("其他".Equals(reason))
                {
                    info = list.Where(p =>
                    p.reason != null
                    && !p.reason.Contains("颗粒;")
                    //&& !p.reason.Contains("浮泡;")
                    && !p.reason.Contains("流挂;")
                    && !p.reason.Contains("遮盖不良;")
                    //&& !p.reason.Contains("异色;")
                    //&& !p.reason.Contains("水迹;")
                    ).ToList();
                }
                else
                {
                    info = list.Where(p => p.reason != null && p.reason.Contains(reason + ";")).ToList();
                }
                List<AnalysisPieModel> listModel = new List<AnalysisPieModel>();

                BuildPieData("A侧", ProductName, "上支架", reason, info, ref listModel);
                BuildPieData("A侧", ProductName, "中支架", reason, info, ref listModel);
                BuildPieData("A侧", ProductName, "下支架", reason, info, ref listModel);
                BuildPieData("B侧", ProductName, "上支架", reason, info, ref listModel);
                BuildPieData("B侧", ProductName, "中支架", reason, info, ref listModel);
                BuildPieData("B侧", ProductName, "下支架", reason, info, ref listModel);

                return JSONTools.ScriptSerialize(listModel);
            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                return "";
            }
        }





        private static void BuildBar(string side, string partName, string ProductName, List<tb_InspectResult> list, ref List<AnalysisBarModel> listModel)
        {

            try
            {
                var A_list = list.Where(p => side.Equals(p.side) && p.productInfo.Contains(partName)).OrderByDescending(p => p.createTime).ToList();
                List<string> barcodeList = new List<string>();
                List<tb_InspectResult> newlist = new List<tb_InspectResult>();
                foreach (var item in A_list)
                {
                    if (barcodeList.Contains(item.barcode))
                    {
                        continue;
                    }
                    barcodeList.Add(item.barcode);
                    newlist.Add(item);
                }


                Dictionary<string, int> colorList = new Dictionary<string, int>();
                foreach (var item in newlist)
                {
                    string pinfo = item.productInfo;
                    pinfo = pinfo.Substring(0, pinfo.IndexOf(","));
                    if (!colorList.ContainsKey(pinfo))
                    {
                        colorList.Add(pinfo, 0);
                    }

                    if ("[合格]".Equals(item.inspectResult))
                    {
                        colorList[pinfo] = colorList[pinfo] + 1;
                    }



                }

                List<string> categories = new List<string>();
                List<string> data = new List<string>();

                foreach (KeyValuePair<string, int> kvp in colorList)
                {
                    categories.Add(kvp.Key);
                    double r = (double)kvp.Value / (double)newlist.Count;
                    data.Add(Math.Round(r * 100, 2).ToString());
                }


                AnalysisBarModel analysisBarModel = new AnalysisBarModel();
                analysisBarModel.text = side + " " + ProductName + " " + partName;
                analysisBarModel.subtext = "颜色合格率分析";
                analysisBarModel.categories = categories;
                analysisBarModel.data = data;

                listModel.Add(analysisBarModel);
            }
            catch (Exception)
            {

            }

        }

        private static void BuildLineTable(string partName, List<tb_InspectResult> list, ref List<string> listModel)
        {

            double cnum = 0;
            double num = 0;
            double r = 0;

            var info = list.Where(p => p.productInfo.Contains(partName));

            if (info.Count() > 0)
            {
                cnum = info.Count();
                num = info.Where(p => p.inspectResult.Equals("[合格]")).Count();
                r = num / cnum;
                listModel.Add(Math.Round(r * 100, 2).ToString() + "%");
            }
            else
            {
                listModel.Add("0.00%");
            }

        }

        private static void BuildPieData(string side, string ProductName, string position, string reason, List<tb_InspectResult> list, ref List<AnalysisPieModel> listModel)
        {

            List<tb_InspectResult> info = list.Where(p => p.side.Equals(side) && p.position.Contains(position)).ToList();
            List<string> damnPositionList = new List<string>();

            foreach (var item in info)
            {
                if (String.IsNullOrWhiteSpace(item.damnPosition))
                {
                    continue;
                }

                string[] sArray = item.damnPosition.Split(new char[1] { ';' }, StringSplitOptions.RemoveEmptyEntries);
                if (sArray.Length > 0)
                {
                    foreach (var damn in sArray)
                    {
                        if (!damnPositionList.Contains(damn))
                        {
                            damnPositionList.Add(damn);
                        }
                    }
                }
            }
            List<PieDataModel> data = new List<PieDataModel>();
            foreach (var item in damnPositionList)
            {
                PieDataModel pieDataModel = new PieDataModel();
                pieDataModel.value = info.Where(p => p.damnPosition.Contains(item)).Count();
                pieDataModel.name = item + "区";
                data.Add(pieDataModel);
               
            }

            AnalysisPieModel analysisPieModel = new AnalysisPieModel();
            analysisPieModel.text = side + " " + ProductName + " " + position + " " + reason;
            analysisPieModel.data = data;

            listModel.Add(analysisPieModel);

        }


    }
}