using MESClassLibrary.BLL.Log;
using MESClassLibrary.DAL.Injection;
using MESClassLibrary.EFModel;
using MESClassLibrary.Model;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace MESClassLibrary.BLL.Injection
{
    public class InjectionRecordBLL
    {
        BBMPTEntities ef = new BBMPTEntities();
        BasicBLL<tb_Injection_Record> db = new BasicBLL<tb_Injection_Record>();
        BasicBLL<tb_Product_Injection_w> db_w = new BasicBLL<tb_Product_Injection_w>();
        InjectionRecordDAL dal = new InjectionRecordDAL();

        /// <summary>
        /// 新增信息
        /// </summary>
        /// <param name="md"></param>
        /// <returns></returns>
        public bool AddInfo(tb_Injection_Record md)
        {
            try
            {
                var list = db.SearchInfoByKey("RecordDate", md.RecordDate);//判断是否有重复数据
                if (list != null && list.Count > 0)
                {
                    if (list.Where(p => p.StationID.Equals(md.StationID) && p.workClass.Equals(md.workClass)).Count() > 0)
                    {
                        return false;
                    }
                }

                return db.AddInfo(md);
            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                return false;
            }

        }
        /// <summary>
        /// 修改信息
        /// </summary>
        /// <param name="md"></param>
        /// <returns></returns>
        public bool UpdateInfo(tb_Injection_Record md)
        {
            try
            {

                //初始化要更新的字段
                string[] proNames = new string[7];
                proNames[0] = "workClass";
                proNames[1] = "StationID";
                proNames[2] = "JK_Weight";
                proNames[3] = "Waste_Weight";
                proNames[4] = "RecordDate";
                proNames[5] = "StockNo";
                proNames[6] = "PartNo";

                //必填字段初始化,如果不需要更新必填字段则设置为空即可,时间类型无需初始化
                //如果没有初始化必填字段,更新会报错

                return db.UpdateInfo(md, proNames);
            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                return false;
            }

        }

        /// <summary>
        /// 删除信息
        /// </summary>
        /// <param name="md"></param>
        /// <param name="flag"></param>
        /// <returns></returns>
        public bool DeleteInfo(tb_Injection_Record md)
        {
            try
            {
                return db.DelInfo(md);
            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                return false;
            }

        }

        /// <summary>
        /// 查询全部信息分页
        /// </summary>
        /// <returns></returns>
        public string SearchInfoAll(string page, string pagesize, string StartTime, string EndTime, string StationID)
        {
            try
            {

                string jsonStr = "[]";
                int total = 0;//总行数

                DateTime stime = Convert.ToDateTime(StartTime);
                DateTime etime = Convert.ToDateTime(EndTime);

                List<tb_Injection_Record> list = ef.tb_Injection_Record.Where(p => p.RecordDate >= stime && p.RecordDate <= etime).ToList();

                if (!String.IsNullOrEmpty(StationID))
                {
                    list = list.Where(p => p.StationID.Equals(StationID)).ToList();
                }

                List<Injection_RecordModel> modelList = new List<Injection_RecordModel>();
                if (list.Count > 0)
                {
                    #region 联查
                    BasicBLL<tb_Station> machine_db = new BasicBLL<tb_Station>();
                    var machine_list = machine_db.SearchAllInfo();

                    foreach (var item in list)
                    {
                        Injection_RecordModel dm = Tool.Mapper<Injection_RecordModel, tb_Injection_Record>(item);

                        var machine_info = machine_list.FirstOrDefault(p => p.StationID == item.StationID);
                        if (machine_info != null)
                        {
                            dm.StationNo = machine_info.StationNo;
                        }

                        modelList.Add(dm);
                    }
                    #endregion

                    total = modelList.Count;

                    int Skipcount = (Convert.ToInt32(page) - 1) * Convert.ToInt32(pagesize);
                    modelList = modelList.Skip(Skipcount).Take(Convert.ToInt32(pagesize)).ToList();


                    JsonDataModel<Injection_RecordModel> md = new JsonDataModel<Injection_RecordModel>();
                    md.total = total.ToString();
                    md.rows = modelList;
                    jsonStr = JSONTools.ScriptSerialize<JsonDataModel<Injection_RecordModel>>(md);
                }
                return jsonStr;
            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                return null;
            }

        }

        #region 废料信息录入
        public string SearchInfo(string page, string pagesize, string StartTime, string EndTime, string StationID)
        {
            try
            {

                string jsonStr = "[]";
                int total = 0;//总行数

                DateTime stime = Convert.ToDateTime(StartTime);
                DateTime etime = Convert.ToDateTime(EndTime);

                DataTable dt = dal.SearchRecordByPage(Convert.ToInt32(page), Convert.ToInt32(pagesize), StartTime, EndTime, StationID);


                IList<ProductInjectionModel> list = Tool.ConvertTo<ProductInjectionModel>(dt);

                if (list.Count > 0)
                {
                    total = list.Count;

                    JsonDataModel<ProductInjectionModel> md = new JsonDataModel<ProductInjectionModel>();
                    md.total = total.ToString();
                    md.rows = list.ToList();
                    jsonStr = JSONTools.ScriptSerialize(md);
                }
                return jsonStr;
            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                return null;
            }

        }


        public bool UpdateWasteInfo(tb_Product_Injection_w md)
        {
            try
            {
                var info = ef.tb_Product_Injection_w.Where(p => p.ID.Equals(md.ID)).FirstOrDefault();//判断是否有重复数据
                if (info != null)
                {
                    //初始化要更新的字段
                    string[] proNames = new string[3];
                    proNames[0] = "RealCycle";
                    proNames[1] = "JK_Weight";
                    proNames[2] = "Waste_Weight";

                    //必填字段初始化,如果不需要更新必填字段则设置为空即可,时间类型无需初始化
                    //如果没有初始化必填字段,更新会报错

                    db_w.UpdateInfo(md, proNames);
                }
                else
                {
                    db_w.AddInfo(md);
                }

                return true;
            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                return false;
            }

        }
        #endregion



        /// <summary>
        /// 查询全部信息
        /// </summary>
        /// <returns></returns>
        public List<tb_Injection_Record> SearchAll()
        {
            try
            {
                var s_list = db.SearchAllInfo().ToList();
                return s_list;
            }
            catch (Exception)
            {
                return null;
            }
        }

        /// <summary>
        /// 根据ID查询信息
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public tb_Injection_Record SearchInfoByID(string id)
        {
            try
            {
                return db.SearchInfoByID(id);
            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                return null;
            }

        }


        #region 日合格趋势
        //表格
        public string SearchQualifiedDay(string StartTime)
        {
            try
            {

                DateTime sTime = Convert.ToDateTime(StartTime);

                int days = System.Threading.Thread.CurrentThread.CurrentUICulture.Calendar.GetDaysInMonth(sTime.Year, sTime.Month);
                StringBuilder sb = new StringBuilder(100);

                DataTable dt = dal.SearchByTime(Convert.ToDateTime(sTime.Year + "-" + sTime.Month + "-01").ToString("yyyy-MM-dd"), Convert.ToDateTime(sTime.Year + "-" + sTime.Month + "-" + days.ToString()).ToString("yyyy-MM-dd"));

                if (dt != null && dt.Rows.Count > 0)
                {

                    List<string> titleList = new List<string>();
                    List<double> totalList = new List<double>();
                    List<double> No_totalList = new List<double>();
                    List<double> OK_L_List = new List<double>();
                    for (int i = 0; i < days; i++)
                    {
                        titleList.Add((i + 1) + "日");

                        string nowTime = Convert.ToDateTime(sTime.Year + "-" + sTime.Month + "-" + (i + 1)).ToString("yyyy-MM-dd");

                        var DayList = from myRow in dt.AsEnumerable()
                                      where myRow.Field<string>(3) == nowTime
                                      select myRow;

                        double total_OK = DayList.Sum(p => (int)p.ItemArray[7]);
                        double total_NO = DayList.Sum(p => (int)p.ItemArray[8]);
                        double total_all = total_OK + total_NO;
                        totalList.Add(total_OK);
                        No_totalList.Add(total_NO);
                        if (total_all > 0)
                        {
                            OK_L_List.Add(Math.Round((total_OK / total_all) * 100, 2));
                        }
                        else
                        {
                            OK_L_List.Add(0);
                        }

                    }

                    sb.Append("<table border='1'>");
                    sb.Append("<tr>");
                    sb.Append("<td width='50'></td>");
                    foreach (var item in titleList)
                    {
                        sb.Append("<td width='50'>" + item + "</td>");
                    }

                    sb.Append("</tr>");
                    sb.Append("<tr>");
                    sb.Append("<td width='100'>总合格数量</td>");
                    foreach (var item in totalList)
                    {
                        sb.Append("<td width='50'>" + item + "</td>");
                    }
                    sb.Append("</tr>");
                    sb.Append("<tr>");
                    sb.Append("<td width='100'>不良数量</td>");
                    foreach (var item in No_totalList)
                    {
                        sb.Append("<td width='50'>" + item + "</td>");
                    }
                    sb.Append("</tr>");
                    sb.Append("<tr>");
                    sb.Append("<td width='100'>合格率</td>");
                    foreach (var item in OK_L_List)
                    {
                        sb.Append("<td width='50'>" + item + "%</td>");
                    }
                    sb.Append("</tr>");
                    sb.Append("<tr>");
                    sb.Append("<td width='100'>目标值</td>");
                    foreach (var item in OK_L_List)
                    {
                        sb.Append("<td width='50'>99.6%</td>");
                    }
                    sb.Append("</tr>");
                    sb.Append("</table>");
                }
                return sb.ToString();

            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                return null;
            }
        }
        //柱状图
        public EcharBarModel SearchQualifiedDayBar(string StartTime)
        {
            try
            {

                EcharBarModel md = new EcharBarModel();

                DateTime sTime = Convert.ToDateTime(StartTime);

                int days = System.Threading.Thread.CurrentThread.CurrentUICulture.Calendar.GetDaysInMonth(sTime.Year, sTime.Month);
                StringBuilder sb = new StringBuilder(100);

                DataTable dt = dal.SearchByTime(Convert.ToDateTime(sTime.Year + "-" + sTime.Month + "-01").ToString("yyyy-MM-dd"), Convert.ToDateTime(sTime.Year + "-" + sTime.Month + "-" + days.ToString()).ToString("yyyy-MM-dd"));

                if (dt != null && dt.Rows.Count > 0)
                {

                    List<string> titleList = new List<string>();
                    List<double> totalList = new List<double>();
                    List<double> No_totalList = new List<double>();
                    List<double> OK_L_List = new List<double>();
                    List<double> T_L_List = new List<double>();
                    for (int i = 0; i < days; i++)
                    {
                        titleList.Add((i + 1) + "日");

                        string nowTime = Convert.ToDateTime(sTime.Year + "-" + sTime.Month + "-" + (i + 1)).ToString("yyyy-MM-dd");

                        var DayList = from myRow in dt.AsEnumerable()
                                      where myRow.Field<string>(3) == nowTime
                                      select myRow;

                        double total_OK = DayList.Sum(p => (int)p.ItemArray[7]);
                        double total_NO = DayList.Sum(p => (int)p.ItemArray[8]);
                        double total_all = total_OK + total_NO;
                        totalList.Add(total_OK);
                        No_totalList.Add(total_NO);
                        if (total_all > 0)
                        {
                            OK_L_List.Add(Math.Round((total_OK / total_all) * 100, 2));
                        }
                        else
                        {
                            OK_L_List.Add(0);
                        }

                    }

                    foreach (var item in OK_L_List)
                    {
                        T_L_List.Add(99.6);
                    }
                    md.categories = titleList;
                    md.QualifiedData = OK_L_List;
                    md.TargetData = T_L_List;

                }

                return md;

            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                return null;
            }
        }

        public List<List<string>> SearchQualifiedDayForExcel(string StartTime)
        {
            try
            {
                List<List<string>> list = new List<List<string>>();

                DateTime sTime = Convert.ToDateTime(StartTime);

                int days = System.Threading.Thread.CurrentThread.CurrentUICulture.Calendar.GetDaysInMonth(sTime.Year, sTime.Month);
                StringBuilder sb = new StringBuilder(100);

                DataTable dt = dal.SearchByTime(Convert.ToDateTime(sTime.Year + "-" + sTime.Month + "-01").ToString("yyyy-MM-dd"), Convert.ToDateTime(sTime.Year + "-" + sTime.Month + "-" + days.ToString()).ToString("yyyy-MM-dd"));
                if (dt != null && dt.Rows.Count > 0)
                {

                    List<string> titleList = new List<string>();
                    List<double> totalList = new List<double>();
                    List<double> No_totalList = new List<double>();
                    List<double> OK_L_List = new List<double>();
                    for (int i = 0; i < days; i++)
                    {
                        titleList.Add((i + 1) + "日");

                        string nowTime = Convert.ToDateTime(sTime.Year + "-" + sTime.Month + "-" + (i + 1)).ToString("yyyy-MM-dd");

                        var DayList = from myRow in dt.AsEnumerable()
                                      where myRow.Field<string>(3) == nowTime
                                      select myRow;

                        double total_OK = DayList.Sum(p => (int)p.ItemArray[7]);
                        double total_NO = DayList.Sum(p => (int)p.ItemArray[8]);
                        double total_all = total_OK + total_NO;
                        totalList.Add(total_OK);
                        No_totalList.Add(total_NO);
                        if (total_all > 0)
                        {
                            OK_L_List.Add(Math.Round((total_OK / total_all) * 100, 2));
                        }
                        else
                        {
                            OK_L_List.Add(0);
                        }

                    }

                    List<string> title_ = new List<string>();

                    title_.Add("");
                    title_.AddRange(titleList);
                    list.Add(title_);

                    List<string> total_ = new List<string>();
                    total_.Add("总合格数量");
                    foreach (var item in totalList)
                    {
                        total_.Add(item.ToString());
                    }
                    list.Add(total_);



                    List<string> No_total_ = new List<string>();
                    No_total_.Add("不良数量");
                    foreach (var item in No_totalList)
                    {
                        No_total_.Add(item.ToString());
                    }
                    list.Add(No_total_);

                    List<string> OK_L_ = new List<string>();
                    OK_L_.Add("合格率");
                    foreach (var item in OK_L_List)
                    {
                        OK_L_.Add(item.ToString() + "%");
                    }
                    list.Add(OK_L_);

                    List<string> tag_L_ = new List<string>();
                    tag_L_.Add("目标值");
                    foreach (var item in OK_L_List)
                    {
                        tag_L_.Add("99.6%");
                    }
                    list.Add(tag_L_);

                }



                return list;

            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                return null;
            }


        }
        #endregion

        #region 月合格趋势
        //表格
        public string SearchQualifiedMonth(string StartTime)
        {
            try
            {

                DateTime sTime = Convert.ToDateTime(StartTime);
                StringBuilder sb = new StringBuilder(100);

                DataTable dt = dal.SearchByTime(sTime.Year + "-01-01", sTime.Year + "-12-31");

                if (dt != null && dt.Rows.Count > 0)
                {

                    DateTime startT = Convert.ToDateTime(sTime.Year + "-01-01");

                    List<string> titleList = new List<string>();
                    List<double> totalList = new List<double>();
                    List<double> No_totalList = new List<double>();
                    List<double> OK_L_List = new List<double>();
                    for (int i = 0; i < 12; i++)
                    {
                        titleList.Add((i + 1) + "月");

                        int days = System.Threading.Thread.CurrentThread.CurrentUICulture.Calendar.GetDaysInMonth(startT.Year, (i + 1));


                        string starTime = Convert.ToDateTime(sTime.Year + "-" + (i + 1) + "-01").ToString("yyyy-MM-dd");
                        string entTime = Convert.ToDateTime(sTime.Year + "-" + (i + 1) + "-" + days).ToString("yyyy-MM-dd");

                        var DayList = from myRow in dt.AsEnumerable()
                                      where myRow.Field<string>(3).CompareTo(Convert.ToDateTime(sTime.Year + "-" + (i + 1) + "-01").ToString("yyyy-MM-dd")) >= 0 &&
                                      myRow.Field<string>(3).CompareTo(Convert.ToDateTime(sTime.Year + "-" + (i + 1) + "-" + days).ToString("yyyy-MM-dd")) <= 0
                                      select myRow;

                        double total_OK = DayList.Sum(p => (int)p.ItemArray[7]);
                        double total_NO = DayList.Sum(p => (int)p.ItemArray[8]);
                        double total_all = total_OK + total_NO;
                        totalList.Add(total_OK);
                        No_totalList.Add(total_NO);
                        if (total_all > 0)
                        {
                            OK_L_List.Add(Math.Round((total_OK / total_all) * 100, 2));
                        }
                        else
                        {
                            OK_L_List.Add(0);
                        }
                    }

                    sb.Append("<table border='1' width='1000'>");
                    sb.Append("<tr>");
                    sb.Append("<td width='50'></td>");
                    foreach (var item in titleList)
                    {
                        sb.Append("<td width='50'>" + item + "</td>");
                    }

                    sb.Append("</tr>");
                    sb.Append("<tr>");
                    sb.Append("<td width='50'>总合格数量</td>");
                    foreach (var item in totalList)
                    {
                        sb.Append("<td width='50'>" + item + "</td>");
                    }
                    sb.Append("</tr>");
                    sb.Append("<tr>");
                    sb.Append("<td width='50'>不良数量</td>");
                    foreach (var item in No_totalList)
                    {
                        sb.Append("<td width='50'>" + item + "</td>");
                    }
                    sb.Append("</tr>");
                    sb.Append("<tr>");
                    sb.Append("<td width='50'>合格率</td>");
                    foreach (var item in OK_L_List)
                    {
                        sb.Append("<td width='50'>" + item + "%</td>");
                    }
                    sb.Append("</tr>");
                    sb.Append("<tr>");
                    sb.Append("<td width='50'>目标值</td>");
                    foreach (var item in OK_L_List)
                    {
                        sb.Append("<td width='50'>99.6%</td>");
                    }
                    sb.Append("</tr>");
                    sb.Append("</table>");
                }
                return sb.ToString();

            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                return null;
            }
        }
        //柱状图
        public EcharBarModel SearchQualifiedMonthBar(string StartTime)
        {
            try
            {

                EcharBarModel md = new EcharBarModel();

                DateTime sTime = Convert.ToDateTime(StartTime);

                DataTable dt = dal.SearchByTime(sTime.Year + "-01-01", sTime.Year + "-12-31");

                if (dt != null && dt.Rows.Count > 0)
                {

                    DateTime startT = Convert.ToDateTime(sTime.Year + "-01-01");

                    List<string> titleList = new List<string>();
                    List<double> totalList = new List<double>();
                    List<double> No_totalList = new List<double>();
                    List<double> OK_L_List = new List<double>();
                    List<double> T_L_List = new List<double>();
                    for (int i = 0; i < 12; i++)
                    {
                        titleList.Add((i + 1) + "月");

                        int days = System.Threading.Thread.CurrentThread.CurrentUICulture.Calendar.GetDaysInMonth(startT.Year, (i + 1));


                        string starTime = Convert.ToDateTime(sTime.Year + "-" + (i + 1) + "-01").ToString("yyyy-MM-dd");
                        string entTime = Convert.ToDateTime(sTime.Year + "-" + (i + 1) + "-" + days).ToString("yyyy-MM-dd");

                        var DayList = from myRow in dt.AsEnumerable()
                                      where myRow.Field<string>(3).CompareTo(Convert.ToDateTime(sTime.Year + "-" + (i + 1) + "-01").ToString("yyyy-MM-dd")) >= 0 &&
                                      myRow.Field<string>(3).CompareTo(Convert.ToDateTime(sTime.Year + "-" + (i + 1) + "-" + days).ToString("yyyy-MM-dd")) <= 0
                                      select myRow;

                        double total_OK = DayList.Sum(p => (int)p.ItemArray[7]);
                        double total_NO = DayList.Sum(p => (int)p.ItemArray[8]);
                        double total_all = total_OK + total_NO;
                        totalList.Add(total_OK);
                        No_totalList.Add(total_NO);
                        if (total_all > 0)
                        {
                            OK_L_List.Add(Math.Round((total_OK / total_all) * 100, 2));
                        }
                        else
                        {
                            OK_L_List.Add(0);
                        }
                    }



                    foreach (var item in OK_L_List)
                    {
                        T_L_List.Add(99.6);
                    }
                    md.categories = titleList;
                    md.QualifiedData = OK_L_List;
                    md.TargetData = T_L_List;

                }

                return md;

            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                return null;
            }
        }

        public List<List<string>> SearchQualifiedMonthForExcel(string StartTime)
        {
            try
            {
                List<List<string>> list = new List<List<string>>();

                DateTime sTime = Convert.ToDateTime(StartTime);
                StringBuilder sb = new StringBuilder(100);

                DataTable dt = dal.SearchByTime(sTime.Year + "-01-01", sTime.Year + "-12-31");

                if (dt != null && dt.Rows.Count > 0)
                {

                    DateTime startT = Convert.ToDateTime(sTime.Year + "-01-01");

                    List<string> titleList = new List<string>();
                    List<double> totalList = new List<double>();
                    List<double> No_totalList = new List<double>();
                    List<double> OK_L_List = new List<double>();
                    for (int i = 0; i < 12; i++)
                    {
                        titleList.Add((i + 1) + "月");

                        int days = System.Threading.Thread.CurrentThread.CurrentUICulture.Calendar.GetDaysInMonth(startT.Year, (i + 1));


                        string starTime = Convert.ToDateTime(sTime.Year + "-" + (i + 1) + "-01").ToString("yyyy-MM-dd");
                        string entTime = Convert.ToDateTime(sTime.Year + "-" + (i + 1) + "-" + days).ToString("yyyy-MM-dd");

                        var DayList = from myRow in dt.AsEnumerable()
                                      where myRow.Field<string>(3).CompareTo(Convert.ToDateTime(sTime.Year + "-" + (i + 1) + "-01").ToString("yyyy-MM-dd")) >= 0 &&
                                      myRow.Field<string>(3).CompareTo(Convert.ToDateTime(sTime.Year + "-" + (i + 1) + "-" + days).ToString("yyyy-MM-dd")) <= 0
                                      select myRow;

                        double total_OK = DayList.Sum(p => (int)p.ItemArray[7]);
                        double total_NO = DayList.Sum(p => (int)p.ItemArray[8]);
                        double total_all = total_OK + total_NO;
                        totalList.Add(total_OK);
                        No_totalList.Add(total_NO);
                        if (total_all > 0)
                        {
                            OK_L_List.Add(Math.Round((total_OK / total_all) * 100, 2));
                        }
                        else
                        {
                            OK_L_List.Add(0);
                        }
                    }

                    List<string> title_ = new List<string>();

                    title_.Add("");
                    title_.AddRange(titleList);
                    list.Add(title_);

                    List<string> total_ = new List<string>();
                    total_.Add("总合格数量");
                    foreach (var item in totalList)
                    {
                        total_.Add(item.ToString());
                    }
                    list.Add(total_);



                    List<string> No_total_ = new List<string>();
                    No_total_.Add("不良数量");
                    foreach (var item in No_totalList)
                    {
                        No_total_.Add(item.ToString());
                    }
                    list.Add(No_total_);

                    List<string> OK_L_ = new List<string>();
                    OK_L_.Add("合格率");
                    foreach (var item in OK_L_List)
                    {
                        OK_L_.Add(item.ToString() + "%");
                    }
                    list.Add(OK_L_);

                    List<string> tag_L_ = new List<string>();
                    tag_L_.Add("目标值");
                    foreach (var item in OK_L_List)
                    {
                        tag_L_.Add("99.6%");
                    }
                    list.Add(tag_L_);
                }
                return list;

            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                return null;
            }


        }

        #endregion

        #region 日原料利用率
        public string SearchMaterialAvailabilityDay(string StartTime)
        {
            try
            {

                var p_info = ef.tb_Plastic.Where(p => p.Weight != null);


                DateTime sTime = Convert.ToDateTime(StartTime);

                int days = System.Threading.Thread.CurrentThread.CurrentUICulture.Calendar.GetDaysInMonth(sTime.Year, sTime.Month);
                StringBuilder sb = new StringBuilder(100);

                DataTable dt = dal.SearchByTime(Convert.ToDateTime(sTime.Year + "-" + sTime.Month + "-01").ToString("yyyy-MM-dd"), Convert.ToDateTime(sTime.Year + "-" + sTime.Month + "-" + days.ToString()).ToString("yyyy-MM-dd"));

                if (dt != null && dt.Rows.Count > 0)
                {

                    List<string> titleList = new List<string>();
                    List<double> totalList = new List<double>();
                    List<double> No_totalList = new List<double>();
                    List<double> All_totalList = new List<double>();
                    List<double> OK_L_List = new List<double>();
                    for (int i = 0; i < days; i++)
                    {
                        titleList.Add((i + 1) + "日");

                        string nowTime = Convert.ToDateTime(sTime.Year + "-" + sTime.Month + "-" + (i + 1)).ToString("yyyy-MM-dd");

                        var listAddress = (from myRow in dt.AsEnumerable()
                                           where myRow.Field<string>(3) == nowTime
                                           group myRow by new { StockNo = myRow.ItemArray[5] } into g
                                           //orderby new ComparerItem() { OrderIndex = b.Key., Id = b.Key.Id } descending
                                           select new
                                           {
                                               StockNo = (string)g.Key.StockNo,
                                               total_ok = g.Sum(c => (int)c.ItemArray[7]),
                                               total_no = g.Sum(c => (int)c.ItemArray[8])
                                           });

                        double total_OK = 0;
                        double total_NO = 0;
                        foreach (var item in listAddress)
                        {
                            string stockNo = item.StockNo;

                            var w_info = p_info.FirstOrDefault(p => p.StockNo.Equals(stockNo));
                            if (w_info != null)
                            {
                                total_OK += (double)(w_info.Weight * item.total_ok);
                                total_NO += (double)(w_info.Weight * item.total_no);
                            }
                        }
                        totalList.Add(Math.Round(total_OK / 1000, 2));
                        No_totalList.Add(Math.Round(total_NO / 1000, 2));

                        DateTime nsTime = Convert.ToDateTime(nowTime + " 00:00:00");
                        DateTime neTime = Convert.ToDateTime(nowTime + " 23:59:59");
                        var Waste_Num = ef.tb_Injection_Record.Where(p => p.RecordDate >= nsTime && p.RecordDate <= neTime).Sum(p => p.Waste_Weight);
                        double total_Waste = 0;
                        if (Waste_Num == null)
                        {
                            total_Waste = 0;
                        }
                        else
                        {
                            total_Waste = (double)Waste_Num;
                        }

                        double total_all = total_OK + total_NO + total_Waste;
                        All_totalList.Add(Math.Round(total_all / 1000, 2));
                        if (total_all > 0)
                        {
                            OK_L_List.Add(Math.Round((total_OK / total_all) * 100, 2));
                        }
                        else
                        {
                            OK_L_List.Add(0);
                        }

                    }

                    sb.Append("<table border='1'>");

                    sb.Append("<tr>");
                    sb.Append("<td width='50'></td>");
                    foreach (var item in titleList)
                    {
                        sb.Append("<td width='50'>" + item + "</td>");
                    }
                    sb.Append("</tr>");

                    sb.Append("<tr>");
                    sb.Append("<td width='50'>目标值</td>");
                    foreach (var item in OK_L_List)
                    {
                        sb.Append("<td width='50'>98%</td>");
                    }
                    sb.Append("</tr>");

                    sb.Append("<tr>");
                    sb.Append("<td width='50'>合格件耗用原料</td>");
                    foreach (var item in totalList)
                    {
                        sb.Append("<td width='50'>" + item + "</td>");
                    }
                    sb.Append("</tr>");
                    sb.Append("<tr>");
                    sb.Append("<td width='50'>总耗用原料</td>");
                    foreach (var item in All_totalList)
                    {
                        sb.Append("<td width='50'>" + item + "</td>");
                    }
                    sb.Append("</tr>");
                    sb.Append("<tr>");
                    sb.Append("<td width='50'>原料利用率</td>");
                    foreach (var item in OK_L_List)
                    {
                        sb.Append("<td width='50'>" + item + "%</td>");
                    }
                    sb.Append("</tr>");

                    sb.Append("</table>");
                }
                return sb.ToString();

            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                return null;
            }
        }
        //柱状图
        public EcharBarModel SearchMaterialAvailabilityDayBar(string StartTime)
        {
            try
            {
                EcharBarModel md = new EcharBarModel();

                var p_info = ef.tb_Plastic.Where(p => p.Weight != null);


                DateTime sTime = Convert.ToDateTime(StartTime);

                int days = System.Threading.Thread.CurrentThread.CurrentUICulture.Calendar.GetDaysInMonth(sTime.Year, sTime.Month);
                StringBuilder sb = new StringBuilder(100);

                DataTable dt = dal.SearchByTime(Convert.ToDateTime(sTime.Year + "-" + sTime.Month + "-01").ToString("yyyy-MM-dd"), Convert.ToDateTime(sTime.Year + "-" + sTime.Month + "-" + days.ToString()).ToString("yyyy-MM-dd"));

                if (dt != null && dt.Rows.Count > 0)
                {

                    List<string> titleList = new List<string>();
                    List<double> totalList = new List<double>();
                    List<double> No_totalList = new List<double>();
                    List<double> OK_L_List = new List<double>();
                    List<double> T_L_List = new List<double>();
                    for (int i = 0; i < days; i++)
                    {
                        titleList.Add((i + 1) + "日");

                        string nowTime = Convert.ToDateTime(sTime.Year + "-" + sTime.Month + "-" + (i + 1)).ToString("yyyy-MM-dd");

                        var listAddress = (from myRow in dt.AsEnumerable()
                                           where myRow.Field<string>(3) == nowTime
                                           group myRow by new { StockNo = myRow.ItemArray[5] } into g
                                           //orderby new ComparerItem() { OrderIndex = b.Key., Id = b.Key.Id } descending
                                           select new
                                           {
                                               StockNo = (string)g.Key.StockNo,
                                               total_ok = g.Sum(c => (int)c.ItemArray[7]),
                                               total_no = g.Sum(c => (int)c.ItemArray[8])
                                           });

                        double total_OK = 0;
                        double total_NO = 0;
                        foreach (var item in listAddress)
                        {
                            string stockNo = item.StockNo;

                            var w_info = p_info.FirstOrDefault(p => p.StockNo.Equals(stockNo));
                            if (w_info != null)
                            {
                                total_OK += (double)(w_info.Weight * item.total_ok);
                                total_NO += (double)(w_info.Weight * item.total_no);
                            }
                        }
                        totalList.Add(Math.Round(total_OK / 1000, 2));
                        No_totalList.Add(Math.Round(total_NO / 1000, 2));

                        DateTime nsTime = Convert.ToDateTime(nowTime + " 00:00:00");
                        DateTime neTime = Convert.ToDateTime(nowTime + " 23:59:59");
                        var Waste_Num = ef.tb_Injection_Record.Where(p => p.RecordDate >= nsTime && p.RecordDate <= neTime).Sum(p => p.Waste_Weight);
                        double total_Waste = 0;
                        if (Waste_Num == null)
                        {
                            total_Waste = 0;
                        }
                        else
                        {
                            total_Waste = (double)Waste_Num;
                        }
                        double total_all = total_OK + total_NO + total_Waste;

                        if (total_all > 0)
                        {
                            OK_L_List.Add(Math.Round((total_OK / total_all) * 100, 2));
                        }
                        else
                        {
                            OK_L_List.Add(0);
                        }

                    }

                    foreach (var item in OK_L_List)
                    {
                        T_L_List.Add(98);
                    }
                    md.categories = titleList;
                    md.QualifiedData = OK_L_List;
                    md.TargetData = T_L_List;
                }
                return md;

            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                return null;
            }
        }

        public List<List<string>> SearchMaterialAvailabilityDayForExcel(string StartTime)
        {
            try
            {
                List<List<string>> list = new List<List<string>>();


                var p_info = ef.tb_Plastic.Where(p => p.Weight != null);
                DateTime sTime = Convert.ToDateTime(StartTime);

                int days = System.Threading.Thread.CurrentThread.CurrentUICulture.Calendar.GetDaysInMonth(sTime.Year, sTime.Month);
                StringBuilder sb = new StringBuilder(100);

                DataTable dt = dal.SearchByTime(Convert.ToDateTime(sTime.Year + "-" + sTime.Month + "-01").ToString("yyyy-MM-dd"), Convert.ToDateTime(sTime.Year + "-" + sTime.Month + "-" + days.ToString()).ToString("yyyy-MM-dd"));

                if (dt != null && dt.Rows.Count > 0)
                {

                    List<string> titleList = new List<string>();
                    List<double> totalList = new List<double>();
                    List<double> No_totalList = new List<double>();
                    List<double> All_totalList = new List<double>();
                    List<double> OK_L_List = new List<double>();
                    for (int i = 0; i < days; i++)
                    {
                        titleList.Add((i + 1) + "日");

                        string nowTime = Convert.ToDateTime(sTime.Year + "-" + sTime.Month + "-" + (i + 1)).ToString("yyyy-MM-dd");

                        var listAddress = (from myRow in dt.AsEnumerable()
                                           where myRow.Field<string>(3) == nowTime
                                           group myRow by new { StockNo = myRow.ItemArray[5] } into g
                                           //orderby new ComparerItem() { OrderIndex = b.Key., Id = b.Key.Id } descending
                                           select new
                                           {
                                               StockNo = (string)g.Key.StockNo,
                                               total_ok = g.Sum(c => (int)c.ItemArray[7]),
                                               total_no = g.Sum(c => (int)c.ItemArray[8])
                                           });

                        double total_OK = 0;
                        double total_NO = 0;
                        foreach (var item in listAddress)
                        {
                            string stockNo = item.StockNo;

                            var w_info = p_info.FirstOrDefault(p => p.StockNo.Equals(stockNo));
                            if (w_info != null)
                            {
                                total_OK += (double)(w_info.Weight * item.total_ok);
                                total_NO += (double)(w_info.Weight * item.total_no);
                            }
                        }
                        totalList.Add(Math.Round(total_OK / 1000, 2));
                        No_totalList.Add(Math.Round(total_NO / 1000, 2));

                        DateTime nsTime = Convert.ToDateTime(nowTime + " 00:00:00");
                        DateTime neTime = Convert.ToDateTime(nowTime + " 23:59:59");
                        var Waste_Num = ef.tb_Injection_Record.Where(p => p.RecordDate >= nsTime && p.RecordDate <= neTime).Sum(p => p.Waste_Weight);
                        double total_Waste = 0;
                        if (Waste_Num == null)
                        {
                            total_Waste = 0;
                        }
                        else
                        {
                            total_Waste = (double)Waste_Num;
                        }

                        double total_all = total_OK + total_NO + total_Waste;
                        All_totalList.Add(Math.Round(total_all / 1000, 2));
                        if (total_all > 0)
                        {
                            OK_L_List.Add(Math.Round((total_OK / total_all) * 100, 2));
                        }
                        else
                        {
                            OK_L_List.Add(0);
                        }

                    }

                    List<string> title_ = new List<string>();

                    title_.Add("");
                    title_.AddRange(titleList);
                    list.Add(title_);

                    List<string> tag_L_ = new List<string>();
                    tag_L_.Add("目标值");
                    foreach (var item in OK_L_List)
                    {
                        tag_L_.Add("98%");
                    }
                    list.Add(tag_L_);


                    List<string> total_ = new List<string>();
                    total_.Add("合格件耗用原料");
                    foreach (var item in totalList)
                    {
                        total_.Add(item.ToString());
                    }
                    list.Add(total_);



                    List<string> No_total_ = new List<string>();
                    No_total_.Add("总耗用原料");
                    foreach (var item in All_totalList)
                    {
                        No_total_.Add(item.ToString());
                    }
                    list.Add(No_total_);

                    List<string> OK_L_ = new List<string>();
                    OK_L_.Add("原料利用率");
                    foreach (var item in OK_L_List)
                    {
                        OK_L_.Add(item.ToString() + "%");
                    }
                    list.Add(OK_L_);

                }
                return list;

            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                return null;
            }


        }
        #endregion

        #region 月原料利用率
        public string SearchMaterialAvailabilityMonth(string StartTime)
        {
            try
            {
                StringBuilder sb = new StringBuilder(100);
                var p_info = ef.tb_Plastic.Where(p => p.Weight != null);

                DateTime sTime = Convert.ToDateTime(StartTime);
                DataTable dt = dal.SearchByTime(sTime.Year + "-01-01", sTime.Year + "-12-31");

                if (dt != null && dt.Rows.Count > 0)
                {

                    List<string> titleList = new List<string>();
                    List<double> totalList = new List<double>();
                    List<double> No_totalList = new List<double>();
                    List<double> All_totalList = new List<double>();
                    List<double> OK_L_List = new List<double>();
                    for (int i = 0; i < 12; i++)
                    {

                        DateTime startT = Convert.ToDateTime(sTime.Year + "-01-01");

                        titleList.Add((i + 1) + "月");


                        int days = System.Threading.Thread.CurrentThread.CurrentUICulture.Calendar.GetDaysInMonth(startT.Year, (i + 1));


                        string starTime = Convert.ToDateTime(sTime.Year + "-" + (i + 1) + "-01").ToString("yyyy-MM-dd");
                        string entTime = Convert.ToDateTime(sTime.Year + "-" + (i + 1) + "-" + days).ToString("yyyy-MM-dd");

                        var listAddress = (from myRow in dt.AsEnumerable()
                                           where myRow.Field<string>(3).CompareTo(Convert.ToDateTime(sTime.Year + "-" + (i + 1) + "-01").ToString("yyyy-MM-dd")) >= 0 &&
                                           myRow.Field<string>(3).CompareTo(Convert.ToDateTime(sTime.Year + "-" + (i + 1) + "-" + days).ToString("yyyy-MM-dd")) <= 0
                                           group myRow by new { StockNo = myRow.ItemArray[5] } into g
                                           select new
                                           {
                                               StockNo = (string)g.Key.StockNo,
                                               total_ok = g.Sum(c => (int)c.ItemArray[7]),
                                               total_no = g.Sum(c => (int)c.ItemArray[8])
                                           });

                        double total_OK = 0;
                        double total_NO = 0;
                        foreach (var item in listAddress)
                        {
                            string stockNo = item.StockNo;

                            var w_info = p_info.FirstOrDefault(p => p.StockNo.Equals(stockNo));
                            if (w_info != null)
                            {
                                total_OK += (double)(w_info.Weight * item.total_ok);
                                total_NO += (double)(w_info.Weight * item.total_no);
                            }
                        }
                        totalList.Add(Math.Round(total_OK / 1000, 2));
                        No_totalList.Add(Math.Round(total_NO / 1000, 2));

                        DateTime nsTime = Convert.ToDateTime(starTime + " 00:00:00");
                        DateTime neTime = Convert.ToDateTime(entTime + " 23:59:59");
                        var Waste_Num = ef.tb_Injection_Record.Where(p => p.RecordDate >= nsTime && p.RecordDate <= neTime).Sum(p => p.Waste_Weight);
                        double total_Waste = 0;
                        if (Waste_Num == null)
                        {
                            total_Waste = 0;
                        }
                        else
                        {
                            total_Waste = (double)Waste_Num;
                        }
                        double total_all = total_OK + total_NO + total_Waste;
                        All_totalList.Add(Math.Round(total_all / 1000, 2));

                        if (total_all > 0)
                        {
                            OK_L_List.Add(Math.Round((total_OK / total_all) * 100, 2));
                        }
                        else
                        {
                            OK_L_List.Add(0);
                        }

                    }

                    sb.Append("<table border='1' width='1000'>");
                    sb.Append("<tr>");
                    sb.Append("<td width='50'></td>");
                    foreach (var item in titleList)
                    {
                        sb.Append("<td width='50'>" + item + "</td>");
                    }
                    sb.Append("</tr>");

                    sb.Append("<tr>");
                    sb.Append("<td width='50'>目标值</td>");
                    foreach (var item in OK_L_List)
                    {
                        sb.Append("<td width='50'>98%</td>");
                    }
                    sb.Append("</tr>");

                    sb.Append("<tr>");
                    sb.Append("<td width='50'>合格件耗用原料</td>");
                    foreach (var item in totalList)
                    {
                        sb.Append("<td width='50'>" + item + "</td>");
                    }
                    sb.Append("</tr>");

                    sb.Append("<tr>");
                    sb.Append("<td width='50'>总耗用原料</td>");
                    foreach (var item in All_totalList)
                    {
                        sb.Append("<td width='50'>" + item + "</td>");
                    }
                    sb.Append("</tr>");

                    sb.Append("<tr>");
                    sb.Append("<td width='50'>原料利用率</td>");
                    foreach (var item in OK_L_List)
                    {
                        sb.Append("<td width='50'>" + item + "%</td>");
                    }
                    sb.Append("</tr>");

                    sb.Append("</table>");
                }
                return sb.ToString();

            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                return null;
            }
        }

        public EcharBarModel SearchMaterialAvailabilityMonthBar(string StartTime)
        {
            try
            {
                EcharBarModel md = new EcharBarModel();


                var p_info = ef.tb_Plastic.Where(p => p.Weight != null);

                DateTime sTime = Convert.ToDateTime(StartTime);
                DataTable dt = dal.SearchByTime(sTime.Year + "-01-01", sTime.Year + "-12-31");

                if (dt != null && dt.Rows.Count > 0)
                {

                    List<string> titleList = new List<string>();
                    List<double> totalList = new List<double>();
                    List<double> No_totalList = new List<double>();
                    List<double> OK_L_List = new List<double>();
                    List<double> T_L_List = new List<double>();
                    for (int i = 0; i < 12; i++)
                    {

                        DateTime startT = Convert.ToDateTime(sTime.Year + "-01-01");

                        titleList.Add((i + 1) + "月");


                        int days = System.Threading.Thread.CurrentThread.CurrentUICulture.Calendar.GetDaysInMonth(startT.Year, (i + 1));


                        string starTime = Convert.ToDateTime(sTime.Year + "-" + (i + 1) + "-01").ToString("yyyy-MM-dd");
                        string entTime = Convert.ToDateTime(sTime.Year + "-" + (i + 1) + "-" + days).ToString("yyyy-MM-dd");

                        var listAddress = (from myRow in dt.AsEnumerable()
                                           where myRow.Field<string>(3).CompareTo(Convert.ToDateTime(sTime.Year + "-" + (i + 1) + "-01").ToString("yyyy-MM-dd")) >= 0 &&
                                           myRow.Field<string>(3).CompareTo(Convert.ToDateTime(sTime.Year + "-" + (i + 1) + "-" + days).ToString("yyyy-MM-dd")) <= 0
                                           group myRow by new { StockNo = myRow.ItemArray[5] } into g
                                           select new
                                           {
                                               StockNo = (string)g.Key.StockNo,
                                               total_ok = g.Sum(c => (int)c.ItemArray[7]),
                                               total_no = g.Sum(c => (int)c.ItemArray[8])
                                           });

                        double total_OK = 0;
                        double total_NO = 0;
                        foreach (var item in listAddress)
                        {
                            string stockNo = item.StockNo;

                            var w_info = p_info.FirstOrDefault(p => p.StockNo.Equals(stockNo));
                            if (w_info != null)
                            {
                                total_OK += (double)(w_info.Weight * item.total_ok);
                                total_NO += (double)(w_info.Weight * item.total_no);
                            }
                        }
                        totalList.Add(Math.Round(total_OK / 1000, 2));
                        No_totalList.Add(Math.Round(total_NO / 1000, 2));

                        DateTime nsTime = Convert.ToDateTime(starTime + " 00:00:00");
                        DateTime neTime = Convert.ToDateTime(entTime + " 23:59:59");
                        var Waste_Num = ef.tb_Injection_Record.Where(p => p.RecordDate >= nsTime && p.RecordDate <= neTime).Sum(p => p.Waste_Weight);
                        double total_Waste = 0;
                        if (Waste_Num == null)
                        {
                            total_Waste = 0;
                        }
                        else
                        {
                            total_Waste = (double)Waste_Num;
                        }
                        double total_all = total_OK + total_NO + total_Waste;

                        if (total_all > 0)
                        {
                            OK_L_List.Add(Math.Round((total_OK / total_all) * 100, 2));
                        }
                        else
                        {
                            OK_L_List.Add(0);
                        }

                    }

                    foreach (var item in OK_L_List)
                    {
                        T_L_List.Add(98);
                    }
                    md.categories = titleList;
                    md.QualifiedData = OK_L_List;
                    md.TargetData = T_L_List;

                }
                return md;

            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                return null;
            }
        }

        public List<List<string>> SearchMaterialAvailabilityMonthForExcel(string StartTime)
        {
            try
            {
                List<List<string>> list = new List<List<string>>();

                var p_info = ef.tb_Plastic.Where(p => p.Weight != null);

                DateTime sTime = Convert.ToDateTime(StartTime);
                DataTable dt = dal.SearchByTime(sTime.Year + "-01-01", sTime.Year + "-12-31");

                if (dt != null && dt.Rows.Count > 0)
                {

                    List<string> titleList = new List<string>();
                    List<double> totalList = new List<double>();
                    List<double> No_totalList = new List<double>();
                    List<double> All_totalList = new List<double>();
                    List<double> OK_L_List = new List<double>();
                    for (int i = 0; i < 12; i++)
                    {

                        DateTime startT = Convert.ToDateTime(sTime.Year + "-01-01");

                        titleList.Add((i + 1) + "月");


                        int days = System.Threading.Thread.CurrentThread.CurrentUICulture.Calendar.GetDaysInMonth(startT.Year, (i + 1));


                        string starTime = Convert.ToDateTime(sTime.Year + "-" + (i + 1) + "-01").ToString("yyyy-MM-dd");
                        string entTime = Convert.ToDateTime(sTime.Year + "-" + (i + 1) + "-" + days).ToString("yyyy-MM-dd");

                        var listAddress = (from myRow in dt.AsEnumerable()
                                           where myRow.Field<string>(3).CompareTo(Convert.ToDateTime(sTime.Year + "-" + (i + 1) + "-01").ToString("yyyy-MM-dd")) >= 0 &&
                                           myRow.Field<string>(3).CompareTo(Convert.ToDateTime(sTime.Year + "-" + (i + 1) + "-" + days).ToString("yyyy-MM-dd")) <= 0
                                           group myRow by new { StockNo = myRow.ItemArray[5] } into g
                                           select new
                                           {
                                               StockNo = (string)g.Key.StockNo,
                                               total_ok = g.Sum(c => (int)c.ItemArray[7]),
                                               total_no = g.Sum(c => (int)c.ItemArray[8])
                                           });

                        double total_OK = 0;
                        double total_NO = 0;
                        foreach (var item in listAddress)
                        {
                            string stockNo = item.StockNo;

                            var w_info = p_info.FirstOrDefault(p => p.StockNo.Equals(stockNo));
                            if (w_info != null)
                            {
                                total_OK += (double)(w_info.Weight * item.total_ok);
                                total_NO += (double)(w_info.Weight * item.total_no);
                            }
                        }
                        totalList.Add(Math.Round(total_OK / 1000, 2));
                        No_totalList.Add(Math.Round(total_NO / 1000, 2));

                        DateTime nsTime = Convert.ToDateTime(starTime + " 00:00:00");
                        DateTime neTime = Convert.ToDateTime(entTime + " 23:59:59");
                        var Waste_Num = ef.tb_Injection_Record.Where(p => p.RecordDate >= nsTime && p.RecordDate <= neTime).Sum(p => p.Waste_Weight);
                        double total_Waste = 0;
                        if (Waste_Num == null)
                        {
                            total_Waste = 0;
                        }
                        else
                        {
                            total_Waste = (double)Waste_Num;
                        }
                        double total_all = total_OK + total_NO + total_Waste;
                        All_totalList.Add(Math.Round(total_all / 1000, 2));

                        if (total_all > 0)
                        {
                            OK_L_List.Add(Math.Round((total_OK / total_all) * 100, 2));
                        }
                        else
                        {
                            OK_L_List.Add(0);
                        }

                    }

                    List<string> title_ = new List<string>();

                    title_.Add("");
                    title_.AddRange(titleList);
                    list.Add(title_);

                    List<string> tag_L_ = new List<string>();
                    tag_L_.Add("目标值");
                    foreach (var item in OK_L_List)
                    {
                        tag_L_.Add("98%");
                    }
                    list.Add(tag_L_);


                    List<string> total_ = new List<string>();
                    total_.Add("合格件耗用原料");
                    foreach (var item in totalList)
                    {
                        total_.Add(item.ToString());
                    }
                    list.Add(total_);



                    List<string> No_total_ = new List<string>();
                    No_total_.Add("总耗用原料");
                    foreach (var item in All_totalList)
                    {
                        No_total_.Add(item.ToString());
                    }
                    list.Add(No_total_);

                    List<string> OK_L_ = new List<string>();
                    OK_L_.Add("原料利用率");
                    foreach (var item in OK_L_List)
                    {
                        OK_L_.Add(item.ToString() + "%");
                    }
                    list.Add(OK_L_);
                }
                return list;

            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                return null;
            }


        }
        #endregion

        #region 注塑生产记录表
        public string SearchProductInjectionRecord(string StartTime, string EndTime)
        {
            var defectList = ef.tb_Defect.ToList();
            var defectInfo = defectList.Where(p => p.LineID.Equals(defectList.FirstOrDefault().LineID)).OrderBy(p => p.DefectName).Select(p => p.DefectName).ToList();

            var DownReasonList = ef.tb_Inhection_DownReason.OrderBy(p => p.Reason).Select(p => p.Reason).ToList();

            DataTable dt = dal.SearchProductInjectionRecord(Convert.ToDateTime(StartTime).ToString("yyyy-MM-dd"), Convert.ToDateTime(EndTime).ToString("yyyy-MM-dd"));
            DataTable dt2 = dal.SearchProductInjectionRecordBadReason(Convert.ToDateTime(StartTime).ToString("yyyy-MM-dd"), Convert.ToDateTime(EndTime).ToString("yyyy-MM-dd"));

            List<InjectionBadReasonModel> list = Tool.ConvertTo<InjectionBadReasonModel>(dt2).ToList();


            DataTable dt3 = dal.SearchProductInjectionRecordDownReason(Convert.ToDateTime(StartTime).ToString("yyyy-MM-dd"), Convert.ToDateTime(EndTime).ToString("yyyy-MM-dd"));

            List<InjectionRecordDownReasonModel> list3 = Tool.ConvertTo<InjectionRecordDownReasonModel>(dt3).ToList();



            StringBuilder sb = new StringBuilder(100);
            sb.Append("<table border='1' style='text-align:center;vertical-align:middle;'>");
            sb.Append("<tr>");
            sb.Append("<td width='50' rowspan='2'>日期</td>");
            sb.Append("<td width='50' rowspan='2'>班次</td>");
            sb.Append("<td width='50' rowspan='2'>注塑机台</td>");
            sb.Append("<td width='50' rowspan='2'>开机时间</td>");
            sb.Append("<td width='50' rowspan='2'>关机时间</td>");
            sb.Append("<td width='50' rowspan='2'>产品性质</td>");
            sb.Append("<td width='50' rowspan='2'>产品名称</td>");
            sb.Append("<td width='50' rowspan='2'>原料名称</td>");
            //sb.Append("<td width='50' rowspan='2'>原料牌号</td>");
            sb.Append("<td width='50' rowspan='2'>原料批次号</td>");
            sb.Append("<td width='50' rowspan='2'>标准开机时间</td>");
            sb.Append("<td width='50' rowspan='2'>标准周期</td>");
            sb.Append("<td width='50' rowspan='2'>实际周期</td>");
            sb.Append("<td width='50' rowspan='2'>计划数量</td>");
            sb.Append("<td width='50' rowspan='2'>合格数量</td>");
            sb.Append("<td width='50' rowspan='2'>总合格数量</td>");
            sb.Append("<td width='50' rowspan='2'>不良数量</td>");
            sb.Append("<td width='50' colspan='" + defectInfo.Count + "'>不良原因</td>");
            sb.Append("<td width='50' rowspan='2'>产品毛重</td>");
            sb.Append("<td width='50' rowspan='2'>废料块</td>");
            sb.Append("<td width='50' rowspan='2'>浇口重量</td>");
            sb.Append("<td width='50' rowspan='2'>产品耗用原料</td>");
            sb.Append("<td width='50' rowspan='2'>合格率</td>");
            sb.Append("<td width='50' rowspan='2'>完成率</td>");
            sb.Append("<td width='50' rowspan='2'>计划工时</td>");
            sb.Append("<td width='50' rowspan='2'>产出工时</td>");
            sb.Append("<td width='50' colspan='2'>停机时间</td>");
            sb.Append("<td width='50' colspan='3'>换膜</td>");
            sb.Append("<td width='50' rowspan='2'>计划停机</td>");
            sb.Append("<td width='50' colspan='" + DownReasonList.Count + "'>停机原因</td>");
            sb.Append("</tr>");
            sb.Append("<tr>");
            foreach (var item in defectInfo)
            {
                sb.Append("<td width='50'>" + item + "</td>");
            }
            sb.Append("<td width='50'>计划停机+换模时间</td>");
            sb.Append("<td width='50'>非计划停机</td>");
            sb.Append("<td width='50'>换膜</td>");
            sb.Append("<td width='50'>交班</td>");
            sb.Append("<td width='50'>接班</td>");
            foreach (var item in DownReasonList)
            {
                sb.Append("<td width='50'>" + item + "</td>");
            }
            sb.Append("</tr>");
            try
            {
                if (dt != null && dt.Rows.Count > 0)
                {
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        sb.Append("<tr>");
                        sb.Append("<td width='50'>" + dt.Rows[i]["ProductDate"] + "</td>");
                        sb.Append("<td width='50'>" + dt.Rows[i]["ClassName"].ToString() + "</td>");
                        sb.Append("<td width='50'>" + dt.Rows[i]["StationNo"] + "</td>");//注塑机台
                        sb.Append("<td width='50'>" + dt.Rows[i]["BeginTime"] + "</td>");//开机时间
                        sb.Append("<td width='50'>" + dt.Rows[i]["EndTime"] + "</td>");//关机时间
                        sb.Append("<td width='50'>正常</td>");//产品性质
                        sb.Append("<td width='50'>" + dt.Rows[i]["ProductName"] + "</td>");//产品名称
                        sb.Append("<td width='50'>" + dt.Rows[i]["MaterialName"] + "</td>");//原料名称
                                                                                            //sb.Append("<td width='50'></td>");//原料牌号
                        sb.Append("<td width='50'>" + dt.Rows[i]["BatchNo"] + "</td>");//原料批次号
                        sb.Append("<td width='50'>" + dt.Rows[i]["OpenDebugTime"] + "</td>");//标准开机时间

                        decimal cycle_Time = dt.Rows[i]["CycleTime"] == DBNull.Value ? 0 : Convert.ToDecimal(dt.Rows[i]["CycleTime"]);

                        sb.Append("<td width='50'>" + cycle_Time + "</td>");//标准周期

                        decimal real_Cycle = dt.Rows[i]["RealCycle"] == DBNull.Value ? 0 : Convert.ToDecimal(dt.Rows[i]["RealCycle"]);
                        decimal product_count = dt.Rows[i]["ProductCount"] == DBNull.Value ? 0 : Convert.ToDecimal(dt.Rows[i]["ProductCount"]);
                        decimal bad_count = dt.Rows[i]["BadCount"] == DBNull.Value ? 0 : Convert.ToDecimal(dt.Rows[i]["BadCount"]);
                        decimal weight = dt.Rows[i]["Weight"] == DBNull.Value ? 0 : Convert.ToDecimal(dt.Rows[i]["Weight"]);
                        decimal plan_count = dt.Rows[i]["PlanCount"] == DBNull.Value ? 0 : Convert.ToDecimal(dt.Rows[i]["PlanCount"]);


                        sb.Append("<td width='50'>" + real_Cycle + "</td>");//实际周期

                        sb.Append("<td width='50'>" + dt.Rows[i]["PlanCount"] + "</td>");//计划数量
                        sb.Append("<td width='50'>" + product_count + "</td>");//合格数量
                        sb.Append("<td width='50'>" + (product_count + bad_count + list.Where(p => "开机报废;".Equals(p.BadReason)).Count()) + "</td>");//总合格数量
                        sb.Append("<td width='50'>" + dt.Rows[i]["BadCount"] + "</td>");//不良数量
                        for (int k = 0; k < defectInfo.Count; k++)
                        {
                            sb.Append("<td width='50'>" + list.Where(p => p.BadReason.Equals(defectInfo[k] + ";")).Count() + "</td>");
                        }


                        sb.Append("<td width='50'>" + dt.Rows[i]["Weight"] + "</td>");//产品毛重(总合格数量+不良数量)*产品毛重
                        sb.Append("<td width='50'>" + dt.Rows[i]["Waste_Weight"] + "</td>");//废料块
                        sb.Append("<td width='50'>" + dt.Rows[i]["JK_Weight"] + "</td>");//浇口重量





                        sb.Append("<td width='50'>" + (product_count + bad_count) * weight + "</td>");//产品耗用原料
                        if ((product_count + bad_count) == 0)
                        {
                            sb.Append("<td width='50'>0%</td>");//合格率(总合格数/(总合格数+不良数))
                        }
                        else
                        {
                            sb.Append("<td width='50'>" + Math.Round((product_count / (product_count + bad_count)) * 100, 2) + "%</td>");//合格率(总合格数/(总合格数+不良数))
                        }
                        if (plan_count == 0)
                        {
                            sb.Append("<td width='50'>0%</td>");//完成率
                        }
                        else
                        {

                            sb.Append("<td width='50'>" + Math.Round((product_count / plan_count) * 100, 2) + "%</td>");//完成率(总合格数/计划数)
                        }

                        sb.Append("<td width='50'>" + Math.Round((plan_count * cycle_Time) / 60, 2) + "</td>");//计划工时(计划数量*标准周期/60)
                        sb.Append("<td width='50'>" + Math.Round((plan_count * real_Cycle) / 60, 2) + "</td>");//产出工时(计划数量*实际周期/60)

                        var listR = list3.Where(p => p.DownTypeName != null && p.PlanID.Equals(dt.Rows[i]["PlanID"])).ToList();

                        long x = listR.Where(p => p.DownTypeName.Contains("计划停机")).Sum(p => p.DownTime);
                        long x1 = listR.Where(p => p.DownTypeName.Contains("换模时间")).Sum(p => p.DownTime);

                        sb.Append("<td width='50'>" + (x + x1) + "</td>");//计划停机+换模时间
                        sb.Append("<td width='50'>" + listR.Where(p => p.DownTypeName.Contains("非计划停机")).Sum(p => p.DownTime) + "</td>");
                        sb.Append("<td width='50'>" + listR.Where(p => p.DownTypeName.Contains("换模")).Sum(p => p.DownTime) + "</td>");
                        sb.Append("<td width='50'>" + listR.Where(p => p.DownTypeName.Contains("交班")).Sum(p => p.DownTime) + "</td>");
                        sb.Append("<td width='50'>" + listR.Where(p => p.DownTypeName.Contains("接班")).Sum(p => p.DownTime) + "</td>");
                        sb.Append("<td width='50'>" + listR.Where(p => p.DownTypeName.Contains("计划停机")).Sum(p => p.DownTime) + "</td>");

                        for (int k = 0; k < DownReasonList.Count; k++)
                        {
                            sb.Append("<td width='50'>" + list3.Where(p => p.Reason != null && p.PlanID.Equals(dt.Rows[i]["PlanID"]) && p.Reason.Contains(DownReasonList[k])).Sum(p => p.DownTime) + "</td>");
                        }
                        sb.Append("</tr>");
                    }
                }
            }
            catch (Exception ex)
            {
                throw;
            }

            sb.Append("</table>");

            return sb.ToString();
        }

        private string CheckWorkClass(string StartTime)
        {

            try
            {
                if (true)
                {
                    string time = StartTime.Substring(0, StartTime.IndexOf(" "));
                    if (DateTime.Compare(Convert.ToDateTime(StartTime), Convert.ToDateTime(time + " 08:00:00")) > 0 && DateTime.Compare(Convert.ToDateTime(time + " 19:59:59"), Convert.ToDateTime(StartTime)) > 0)
                    {
                        return "A";
                    }
                    return "B";

                }

            }
            catch (Exception ex)
            {

            }

            return "";
        }

        public List<List<string>> SearchProductInjectionRecordForExcel(string StartTime, string EndTime)
        {
            List<List<string>> listExcel = new List<List<string>>();

            var defectList = ef.tb_Defect.ToList();
            var defectInfo = defectList.Where(p => p.LineID.Equals(defectList.FirstOrDefault().LineID)).OrderBy(p => p.DefectName).Select(p => p.DefectName).ToList();

            var DownReasonList = ef.tb_Inhection_DownReason.OrderBy(p => p.Reason).Select(p => p.Reason).ToList();

            DataTable dt = dal.SearchProductInjectionRecord(Convert.ToDateTime(StartTime).ToString("yyyy-MM-dd"), Convert.ToDateTime(EndTime).ToString("yyyy-MM-dd"));
            DataTable dt2 = dal.SearchProductInjectionRecordBadReason(Convert.ToDateTime(StartTime).ToString("yyyy-MM-dd"), Convert.ToDateTime(EndTime).ToString("yyyy-MM-dd"));

            List<InjectionBadReasonModel> list = Tool.ConvertTo<InjectionBadReasonModel>(dt2).ToList();


            DataTable dt3 = dal.SearchProductInjectionRecordDownReason(Convert.ToDateTime(StartTime).ToString("yyyy-MM-dd"), Convert.ToDateTime(EndTime).ToString("yyyy-MM-dd"));

            List<InjectionRecordDownReasonModel> list3 = Tool.ConvertTo<InjectionRecordDownReasonModel>(dt3).ToList();


            List<string> titleList = new List<string>();
            titleList.Add("");
            titleList.Add("");
            titleList.Add("");
            titleList.Add("");
            titleList.Add("");
            titleList.Add("");
            titleList.Add("");
            titleList.Add("");
            titleList.Add("");
            titleList.Add("");
            titleList.Add("");
            titleList.Add("");
            titleList.Add("");
            titleList.Add("");
            titleList.Add("");
            titleList.Add("");

            foreach (var item in defectInfo)
            {
                titleList.Add("不良原因");
            }
            titleList.Add("");
            titleList.Add("");
            titleList.Add("");
            titleList.Add("");
            titleList.Add("");
            titleList.Add("");
            titleList.Add("");
            titleList.Add("");

            titleList.Add("停机时间");
            titleList.Add("停机时间");

            titleList.Add("换膜");
            titleList.Add("换膜");
            titleList.Add("换膜");

            titleList.Add("");
            foreach (var item in DownReasonList)
            {
                titleList.Add("停机原因");
            }


            listExcel.Add(titleList);

            List<string> titleList2 = new List<string>();
            titleList2.Add("日期");
            titleList2.Add("班次");
            titleList2.Add("注塑机台");
            titleList2.Add("开机时间");
            titleList2.Add("关机时间");
            titleList2.Add("产品性质");
            titleList2.Add("产品名称");
            titleList2.Add("原料名称");
            titleList2.Add("原料批次号");
            titleList2.Add("标准开机时间");
            titleList2.Add("标准周期");
            titleList2.Add("实际周期");
            titleList2.Add("计划数量");
            titleList2.Add("合格数量");
            titleList2.Add("总合格数量");
            titleList2.Add("不良数量");
            foreach (var item in defectInfo)
            {
                titleList2.Add(item);
            }
            titleList2.Add("产品毛重");
            titleList2.Add("废料块");
            titleList2.Add("浇口重量");
            titleList2.Add("产品耗用原料");
            titleList2.Add("合格率");
            titleList2.Add("完成率");
            titleList2.Add("计划工时");
            titleList2.Add("产出工时");

            titleList2.Add("计划停机+换模时间");
            titleList2.Add("非计划停机");
            titleList2.Add("换膜");
            titleList2.Add("交班");
            titleList2.Add("接班");
            titleList2.Add("计划停机");
            foreach (var item in DownReasonList)
            {
                titleList2.Add(item);
            }
            listExcel.Add(titleList2);


            if (dt != null && dt.Rows.Count > 0)
            {

                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    List<string> conList = new List<string>();
                    conList.Add(dt.Rows[i]["ProductDate"].ToString());
                    conList.Add(dt.Rows[i]["ClassName"].ToString());
                    conList.Add(dt.Rows[i]["StationNo"].ToString());
                    conList.Add(dt.Rows[i]["BeginTime"].ToString());
                    conList.Add(dt.Rows[i]["EndTime"].ToString());
                    conList.Add("正常");
                    conList.Add(dt.Rows[i]["ProductName"].ToString());
                    conList.Add(dt.Rows[i]["MaterialName"].ToString());
                    conList.Add(dt.Rows[i]["BatchNo"].ToString());
                    conList.Add(dt.Rows[i]["OpenDebugTime"].ToString());

                    decimal cycle_Time = dt.Rows[i]["CycleTime"] == DBNull.Value ? 0 : Convert.ToDecimal(dt.Rows[i]["CycleTime"]);

                    conList.Add(cycle_Time.ToString());

                    decimal real_Cycle = dt.Rows[i]["RealCycle"] == DBNull.Value ? 0 : Convert.ToDecimal(dt.Rows[i]["RealCycle"]);

                    decimal product_count = dt.Rows[i]["ProductCount"] == DBNull.Value ? 0 : Convert.ToDecimal(dt.Rows[i]["ProductCount"]);
                    decimal bad_count = dt.Rows[i]["BadCount"] == DBNull.Value ? 0 : Convert.ToDecimal(dt.Rows[i]["BadCount"]);
                    decimal weight = dt.Rows[i]["Weight"] == DBNull.Value ? 0 : Convert.ToDecimal(dt.Rows[i]["Weight"]);
                    decimal plan_count = dt.Rows[i]["PlanCount"] == DBNull.Value ? 0 : Convert.ToDecimal(dt.Rows[i]["PlanCount"]);
                    decimal openFailCount = 0;
                    conList.Add(real_Cycle.ToString());
                    conList.Add(dt.Rows[i]["PlanCount"].ToString());
                    conList.Add(product_count.ToString());
                    conList.Add((product_count + bad_count + defectInfo.Where(p => "开机报废".Equals(p)).Count()).ToString());
                    conList.Add(dt.Rows[i]["BadCount"].ToString());

                    for (int k = 0; k < defectInfo.Count; k++)
                    {
                        conList.Add(list.Where(p => p.BadReason.Equals(defectInfo[k] + ";")).Count().ToString());
                    }
                    conList.Add(dt.Rows[i]["Weight"].ToString());
                    conList.Add(dt.Rows[i]["Waste_Weight"].ToString());
                    conList.Add(dt.Rows[i]["JK_Weight"].ToString());





                    conList.Add(((product_count + bad_count) * weight).ToString());

                    if ((product_count + bad_count) == 0)
                    {

                        conList.Add("0%");
                    }
                    else
                    {
                        conList.Add((Math.Round((product_count / (product_count + bad_count)) * 100, 2)).ToString());

                    }
                    if (plan_count == 0)
                    {
                        conList.Add("0%");
                    }
                    else
                    {
                        conList.Add((Math.Round((product_count / plan_count) * 100, 2)).ToString());
                    }
                    conList.Add((Math.Round((plan_count * cycle_Time) / 60, 2)).ToString());
                    conList.Add((Math.Round((plan_count * real_Cycle) / 60, 2)).ToString());


                    var listR = list3.Where(p => p.DownTypeName != null && p.PlanID.Equals(dt.Rows[i]["PlanID"])).ToList();

                    long x = listR.Where(p => p.DownTypeName.Contains("计划停机")).Sum(p => p.DownTime);
                    long x1 = listR.Where(p => p.DownTypeName.Contains("换模时间")).Sum(p => p.DownTime);

                    conList.Add((x + x1).ToString());
                    conList.Add((listR.Where(p => p.DownTypeName.Contains("非计划停机")).Sum(p => p.DownTime)).ToString());
                    conList.Add((listR.Where(p => p.DownTypeName.Contains("换模")).Sum(p => p.DownTime)).ToString());
                    conList.Add((listR.Where(p => p.DownTypeName.Contains("交班")).Sum(p => p.DownTime)).ToString());
                    conList.Add((listR.Where(p => p.DownTypeName.Contains("接班")).Sum(p => p.DownTime)).ToString());
                    conList.Add((listR.Where(p => p.DownTypeName.Contains("计划停机")).Sum(p => p.DownTime)).ToString());

                    for (int k = 0; k < DownReasonList.Count; k++)
                    {
                        conList.Add((list3.Where(p => p.Reason != null && p.PlanID.Equals(dt.Rows[i]["PlanID"]) && p.Reason.Contains(DownReasonList[k])).Sum(p => p.DownTime)).ToString());
                    }
                    listExcel.Add(conList);
                }

            }



            return listExcel;
        }
        #endregion

        public DataTable SearchInfoByPlanID(string planID)
        {
            try
            {
                return dal.SearchInfoByPlanID(planID);
            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(),MethodBase.GetCurrentMethod());
                return null;
            }
        }

    }
}