using System;
using System.Collections.Generic;
using System.Linq;
using System.Data;
using System.Data.SqlClient;
using System.Text;
using System.Threading.Tasks;
using Model;

namespace BLL
{
      public static class APIReportQueryService
      {
            #region 根据人员二维码获取焊工业绩
            /// <summary>
            /// 根据人员二维码获取焊工业绩
            /// </summary>
            /// <param name="personId"></param>
            /// <returns></returns>
            public static Model.WelderPerformanceItem GetWelderPerformanceByQRC(string personId)
            {
                  using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString))
                  {
                        //  todo 二维码分解待做
                        var getDataLists = from x in db.View_WelderPerformance
                                           where x.PersonId == personId
                                           select new Model.WelderPerformanceItem
                                           {
                                                 WelderCode = x.WelderCode,
                                                 PersonName = x.PersonName,
                                                 UnitName = x.UnitName,
                                                 CertificateLimitTime = x.CertificateLimitTime.ToString(),
                                                 WelderLevel = x.WelderLevel,
                                                 OnePassRate = x.PassRate,
                                                 TotalJotDin = x.Nowtotal_jot.ToString() + "/" + x.Nowtotal_din.ToString(),
                                                 WeldAvgNum = GetWeldAvgNum(personId, x.Nowtotal_din.HasValue ? x.Nowtotal_din.Value : 0),
                                                 OneCheckJotNum = x.OneCheckJotNum.ToString(),
                                                 OneCheckPassJotNum = x.OneCheckPassJotNum,
                                                 RepairJotNum = x.OneCheckRepairJotNum.ToString(),
                                                 ExpandJotNum = x.ExpandJotNum.ToString()
                                           };

                        return getDataLists.FirstOrDefault();
                  }
            }
            #endregion

            private static string GetWeldAvgNum(string personId, decimal totalDin)
            {
                  using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString))
                  {
                        string vagDin = string.Empty;
                        var date = from x in db.HJGL_WeldJoint
                                   join y in db.HJGL_WeldingDaily on x.WeldingDailyId equals y.WeldingDailyId
                                   where x.BackingWelderId == personId || x.CoverWelderId == personId
                                   select y.WeldingDate;
                        if (date.Count() > 0)
                        {
                              DateTime startDate = Convert.ToDateTime(date.Min());
                              DateTime endDate = Convert.ToDateTime(date.Max());
                              TimeSpan t = endDate - startDate;
                              int dayNum = t.Days;
                              vagDin = (totalDin / dayNum).ToString("0.##");

                        }
                        return vagDin;
                  }
            }

            #region 根据焊工号获取焊工业绩
            /// <summary>
            /// 根据焊工号获取焊工业绩
            /// </summary>
            /// <param name="projectId"></param>
            /// <param name="welderCode"></param>
            /// <returns></returns>
            public static Model.WelderPerformanceItem GetWelderPerformanceByWelderCode(string projectId, string welderCode)
            {
                  using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString))
                  {
                        //  todo 二维码分解待做
                        var getDataLists = from x in db.View_WelderPerformance
                                           where x.ProjectId == projectId && x.WelderCode == welderCode
                                           select new Model.WelderPerformanceItem
                                           {
                                                 WelderCode = x.WelderCode,
                                                 PersonName = x.PersonName,
                                                 UnitName = x.UnitName,
                                                 CertificateLimitTime = x.CertificateLimitTime.ToString(),
                                                 WelderLevel = x.WelderLevel,
                                                 OnePassRate = x.PassRate,
                                                 TotalJotDin = x.Nowtotal_jot.ToString() + "/" + x.Nowtotal_din.ToString(),
                                                 WeldAvgNum = GetWeldAvgNum(x.PersonId, x.Nowtotal_din.HasValue ? x.Nowtotal_din.Value : 0),
                                                 OneCheckJotNum = x.OneCheckJotNum.ToString(),
                                                 OneCheckPassJotNum = x.OneCheckPassJotNum,
                                                 RepairJotNum = x.OneCheckRepairJotNum.ToString(),
                                                 ExpandJotNum = x.ExpandJotNum.ToString()
                                           };

                        return getDataLists.FirstOrDefault();
                  }
            }
            #endregion

            #region 根据人员ID获取焊工合格项目
            /// <summary>
            ///  根据人员ID获取焊工合格项目
            /// </summary>
            /// <param name="personId"></param>
            /// <returns></returns>
            public static List<Model.BaseInfoItem> getWelderQualify(string personId)
            {
                  using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString))
                  {
                        var getDataLists = (from x in db.Welder_WelderQualify
                                            where x.WelderId == personId
                                            orderby x.LimitDate
                                            select new Model.BaseInfoItem
                                            {
                                                  BaseInfoId = x.QualificationItem,  // 合格项目
                                                  BaseInfoCode = x.CheckDate.HasValue ? x.CheckDate.Value.ToString() : "",  // 批准日期
                                                  BaseInfoName = x.LimitDate.HasValue ? x.LimitDate.Value.ToString() : ""   // 有效日期
                                            }
                                        ).ToList();
                        return getDataLists;
                  }
            }
            #endregion

            #region  焊工资质预警
            /// <summary>
            /// 焊工资质预警
            /// </summary>
            /// <param name="projectId"></param>
            /// <returns></returns>
            public static List<Model.BaseInfoItem> GetWelderQualifyWarning(string projectId)
            {
                  using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString))
                  {
                        var welder = from x in db.SitePerson_Person
                                     where x.ProjectId == projectId && x.WorkPostId == Const.WorkPost_Welder
                                     && x.WelderCode != null
                                     select x;
                        List<Model.BaseInfoItem> warnWelder = new List<Model.BaseInfoItem>();

                        foreach (var q in welder)
                        {

                              DateTime? validity = q.CertificateLimitTime;
                              DateTime nowDate = DateTime.Now;
                              if (validity != null)
                              {
                                    if (validity.Value.AddMonths(-1) < nowDate && validity >= nowDate)
                                    {
                                          Model.BaseInfoItem item = new Model.BaseInfoItem();
                                          item.BaseInfoId = q.PersonId;
                                          item.BaseInfoCode = q.WelderCode;
                                          item.BaseInfoName = q.CertificateLimitTime.HasValue ? q.CertificateLimitTime.Value.ToString() : "" + "即将过期";
                                          warnWelder.Add(item);
                                    }
                                    else if (validity < nowDate)
                                    {
                                          Model.BaseInfoItem item = new Model.BaseInfoItem();
                                          item.BaseInfoId = q.PersonId;
                                          item.BaseInfoCode = q.WelderCode;
                                          item.BaseInfoName = q.CertificateLimitTime.HasValue ? q.CertificateLimitTime.Value.ToString() : "" + "已过期";
                                          warnWelder.Add(item);
                                    }
                              }
                        }

                        return warnWelder;
                  }
            }
            #endregion


            #region  焊工一次合格率低于96%预警
            /// <summary>
            /// 焊工一次合格率低于96%预警
            /// </summary>
            /// <param name="projectId"></param>
            /// <returns></returns>
            public static List<Model.BaseInfoItem> GetWelderOnePassRateWarning(string projectId)
            {

                  string strSql = @"SELECT welder.ProjectId, welder.WelderCode, welder.PersonName,
	                                 CONVERT(NVARCHAR(10),(CAST((CASE ISNULL(oneCheck.OneCheckJotNum,0) WHEN 0 THEN 0 
		                             ELSE 100.0 * (ISNULL(oneCheck.OneCheckJotNum,0)-ISNULL(oneCheckRepair.oneCheckRepairJotNum,0))/(1.0 * oneCheck.OneCheckJotNum) END) AS DECIMAL(8,1))))+'%' AS passRate
                              FROM SitePerson_Person AS welder 
                              LEFT JOIN (SELECT jot.CoverWelderId,COUNT(ndeItem.NDEItemID) AS OneCheckJotNum
			                             FROM dbo.HJGL_Batch_NDEItem ndeItem
				                         LEFT JOIN dbo.HJGL_Batch_BatchTrustItem trustItem ON trustItem.TrustBatchItemId = ndeItem.TrustBatchItemId
				                         LEFT JOIN dbo.HJGL_WeldJoint jot ON jot.WeldJointId = trustItem.WeldJointId
					                     LEFT JOIN dbo.HJGL_WeldingDaily daily ON  daily.WeldingDailyId = jot.WeldingDailyId 	
					                     LEFT JOIN dbo.HJGL_Batch_PointBatchItem pointItem ON pointItem.PointBatchItemId = trustItem.PointBatchItemId
				                         LEFT JOIN dbo.HJGL_Batch_PointBatch point ON point.PointBatchId = pointItem.PointBatchId
			                             WHERE pointItem.PointDate IS NOT NULL AND pointItem.PointState=1 AND trustItem.RepairRecordId IS NULL		
			                            GROUP BY jot.CoverWelderId) AS oneCheck ON oneCheck.CoverWelderId = welder.PersonId

                              LEFT JOIN (SELECT jot.CoverWelderId,COUNT(ndeItem.NDEItemID) AS OneCheckRepairJotNum --一次检测返修焊口数
		                                 FROM dbo.HJGL_Batch_NDEItem ndeItem
				                         LEFT JOIN dbo.HJGL_Batch_BatchTrustItem trustItem ON trustItem.TrustBatchItemId = ndeItem.TrustBatchItemId
				                         LEFT JOIN dbo.HJGL_WeldJoint jot ON jot.WeldJointId = trustItem.WeldJointId
					                     LEFT JOIN dbo.HJGL_WeldingDaily daily ON  daily.WeldingDailyId = jot.WeldingDailyId 	
					                     LEFT JOIN dbo.HJGL_Batch_PointBatchItem pointItem ON pointItem.PointBatchItemId = trustItem.PointBatchItemId
				                         LEFT JOIN dbo.HJGL_Batch_PointBatch point ON point.PointBatchId = pointItem.PointBatchId  
			                             WHERE pointItem.PointDate IS NOT NULL AND pointItem.PointState=1
				                              AND trustItem.RepairRecordId IS NULL AND ndeItem.CheckResult='2' 			
			                             GROUP BY jot.CoverWelderId) AS oneCheckRepair ON oneCheckRepair.CoverWelderId = welder.PersonId

                             WHERE (welder.WelderCode IS NOT NULL AND welder.WelderCode!='') 
                                    AND (welder.WorkPostId='19B8F2A9-28D3-4F20-867A-1B2237C2E228')
	                                AND ISNULL(oneCheck.OneCheckJotNum,0)>0
	                                AND (CAST((CASE ISNULL(oneCheck.OneCheckJotNum,0) WHEN 0 THEN 0 
		                            ELSE 100.0 * (ISNULL(oneCheck.OneCheckJotNum,0)-ISNULL(oneCheckRepair.oneCheckRepairJotNum,0))/(1.0 * oneCheck.OneCheckJotNum) END) AS DECIMAL(8,1)))<=96";

                  List<SqlParameter> listStr = new List<SqlParameter>();


                  strSql += " AND welder.ProjectId=@ProjectId";
                  listStr.Add(new SqlParameter("@ProjectId", projectId));

                  SqlParameter[] parameter = listStr.ToArray();
                  DataTable dt = SQLHelper.GetDataTableRunText(strSql, parameter);

                  List<Model.BaseInfoItem> warnWelder = new List<Model.BaseInfoItem>();

                  foreach (DataRow row in dt.Rows)
                  {
                        Model.BaseInfoItem item = new Model.BaseInfoItem();
                        item.BaseInfoCode = row["WelderCode"].ToString();
                        item.BaseInfoName = "一次合格率:" + row["passRate"].ToString();
                        warnWelder.Add(item);
                  }

                  return warnWelder;

            }
            #endregion


            #region 根据焊口ID获取焊口信息和焊接信息
            /// <summary>
            ///  根据焊口ID获取焊口信息和焊接信息
            /// </summary>
            /// <param name="weldJointId"></param>
            /// <returns></returns>
            public static Model.JointCompreInfoItem GetJointCompreInfo(string weldJointId)
            {
                  using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString))
                  {
                        var getDateInfo = from x in db.View_HJGL_WeldJoint
                                          where x.WeldJointId == weldJointId

                                          select new Model.JointCompreInfoItem
                                          {
                                                WeldJointCode = x.WeldJointCode,
                                                PipelineCode = x.PipelineCode,
                                                PipingClass = x.PipingClassCode,
                                                Medium = x.MediumCode,
                                                DetectionType = x.DetectionTypeCode,
                                                WeldType = x.WeldTypeCode,
                                                Material = x.MaterialCode,
                                                JointArea = x.JointArea,
                                                JointAttribute = x.JointAttribute,
                                                WeldingMode = x.WeldingMode,
                                                Size = x.Size,
                                                Dia = x.Dia,
                                                Thickness = x.Thickness,
                                                Specification = x.Specification,
                                                WeldingMethodCode = x.WeldingMethodCode,
                                                GrooveType = x.GrooveTypeCode,
                                                WeldingLocation = x.WeldingLocationCode,
                                                WeldingWire = x.WeldingWireCode,
                                                WeldingRod = x.WeldingRodCode,
                                                IsHotProess = x.IsHotProessStr,
                                                WelderCode = x.WelderCode,
                                                WeldingDate = x.WeldingDate,
                                                WeldingDailyCode = x.WeldingDailyCode,
                                                PointBatchCode = x.PointBatchCode,
                                                IsPoint = x.IsPoint

                                          };
                        return getDateInfo.FirstOrDefault();
                  }
            }
            #endregion

            #region 多维度查询报表
            /// <summary>
            /// 多维度查询报表
            /// </summary>
            /// <param name="projectId"></param>
            /// <param name="unitId"></param>
            /// <param name="unitWorkId"></param>
            /// <param name="pipeLineId"></param>
            /// <param name="material"></param>
            /// <param name="startTime"></param>
            /// <param name="endTime"></param>
            /// <returns></returns>
            public static List<Model.ReportQueryItem> GetReportQueryByRequir(string projectId, string unitId, string unitWorkId, string pipeLineId, string material, string startTime, string endTime)
            {
                  List<SqlParameter> listStr = new List<SqlParameter>();
                  listStr.Add(new SqlParameter("@projectId", projectId));

                  if (!string.IsNullOrEmpty(pipeLineId))
                  {
                        listStr.Add(new SqlParameter("@pipeLineId", pipeLineId));
                  }
                  else if (!string.IsNullOrEmpty(unitWorkId) && string.IsNullOrEmpty(pipeLineId))
                  {
                        listStr.Add(new SqlParameter("@unitWorkId", unitWorkId));
                  }

                  else if (!string.IsNullOrEmpty(unitId) && string.IsNullOrEmpty(unitWorkId) && string.IsNullOrEmpty(pipeLineId))
                  {
                        listStr.Add(new SqlParameter("@unitId", unitId));
                  }

                  if (!string.IsNullOrEmpty(material))
                  {
                        listStr.Add(new SqlParameter("@material", material));
                  }
                  else
                  {
                        listStr.Add(new SqlParameter("@material", null));
                  }

                  if (!string.IsNullOrEmpty(startTime))
                  {
                        listStr.Add(new SqlParameter("@startTime", Convert.ToDateTime(startTime)));
                  }
                  else
                  {
                        listStr.Add(new SqlParameter("@startTime", null));
                  }

                  if (!string.IsNullOrEmpty(endTime))
                  {
                        listStr.Add(new SqlParameter("@endTime", Convert.ToDateTime(endTime)));
                  }
                  else
                  {
                        listStr.Add(new SqlParameter("@endTime", null));
                  }
                  SqlParameter[] parameter = listStr.ToArray();

                  DataTable dt = null;
                  if (string.IsNullOrEmpty(unitId) && string.IsNullOrEmpty(unitWorkId) && string.IsNullOrEmpty(pipeLineId))
                  {
                        dt = SQLHelper.GetDataTableRunProc("sp_ReportQueryByProject", parameter);
                  }
                  if (!string.IsNullOrEmpty(unitId) && string.IsNullOrEmpty(unitWorkId) && string.IsNullOrEmpty(pipeLineId))
                  {
                        dt = SQLHelper.GetDataTableRunProc("sp_ReportQueryByUnit", parameter);
                  }
                  if (!string.IsNullOrEmpty(unitWorkId) && string.IsNullOrEmpty(pipeLineId))
                  {
                        dt = SQLHelper.GetDataTableRunProc("sp_ReportQueryByUnitWork", parameter);
                  }
                  if (!string.IsNullOrEmpty(pipeLineId))
                  {
                        dt = SQLHelper.GetDataTableRunProc("sp_ReportQueryByPipeLine", parameter);
                  }

                  List<Model.ReportQueryItem> reportList = new List<Model.ReportQueryItem>();
                  foreach (DataRow row in dt.Rows)
                  {
                        string totalJot = row["TotalJot"].ToString();
                        string totalDin = row["TotalDin"].ToString();
                        string weldedJot = row["weldedJot"].ToString();
                        string weldedDin = row["weldedDin"].ToString();
                        string oneCheckJotNum = row["OneCheckJotNum"].ToString();
                        string oneCheckRepairJotNum = row["OneCheckRepairJotNum"].ToString();
                        string expandJotNum = row["OneExpandJotNum"].ToString();

                        Model.ReportQueryItem report = new Model.ReportQueryItem();

                        string code = string.Empty;
                        int mustCheckJotNum = 0;
                        if (string.IsNullOrEmpty(unitId) && string.IsNullOrEmpty(unitWorkId) && string.IsNullOrEmpty(pipeLineId))
                        {
                              mustCheckJotNum = GetMustCheckJotNum("1", row["ProjectId"].ToString());
                              code = row["ProjectCode"].ToString();
                              report.ProjectCode = row["ProjectCode"].ToString();
                        }
                        if (!string.IsNullOrEmpty(unitId) && string.IsNullOrEmpty(unitWorkId) && string.IsNullOrEmpty(pipeLineId))
                        {
                              mustCheckJotNum = GetMustCheckJotNum("2", row["UnitId"].ToString());
                              report.CUnit = row["UnitCode"].ToString();

                        }
                        if (!string.IsNullOrEmpty(unitWorkId) && string.IsNullOrEmpty(pipeLineId))
                        {
                              mustCheckJotNum = GetMustCheckJotNum("3", row["UnitWorkId"].ToString());
                              report.UnitWork = row["UnitWorkCode"].ToString();
                        }
                        if (!string.IsNullOrEmpty(pipeLineId))
                        {
                              mustCheckJotNum = GetMustCheckJotNum("4", row["PipelineId"].ToString());
                              report.PipeLine = row["PipelineCode"].ToString();
                        }


                        string weldingRate = "0.0%";
                        if (totalJot != "0")
                        {
                              weldingRate = (Convert.ToInt32(weldedJot) * 100.0 / Convert.ToInt32(totalJot)).ToString() + "%";
                        }

                        string weldingOnePassRate = "0.0%";
                        if (oneCheckJotNum != "0")
                        {
                              weldingOnePassRate = ((Convert.ToInt32(oneCheckJotNum) - Convert.ToInt32(oneCheckRepairJotNum)) * 100.0 / Convert.ToInt32(oneCheckJotNum)).ToString() + "%";
                        }

                        string checkCompRate = "0.0%";
                        if (mustCheckJotNum != 0)
                        {
                              checkCompRate = (Convert.ToInt32(oneCheckJotNum) * 100.0 / mustCheckJotNum).ToString() + "%";
                        }

                        report.TotalJotDin = totalJot + "/" + totalDin;
                        report.WeldedJotDin = weldedJot + "/" + weldedDin;
                        report.WeldingRate = weldingRate;
                        report.WeldingOnePassRate = weldingOnePassRate;

                        report.MustCheckJotNum = mustCheckJotNum.ToString();
                        report.CheckedJotNum = oneCheckJotNum;
                        report.CheckCompRate = checkCompRate;
                        report.RepairJotNum = oneCheckRepairJotNum;
                        report.ExpandJotNum = expandJotNum;

                        reportList.Add(report);
                  }

                  return reportList;
            }
            #endregion

            /// <summary>
            /// 获取应检测焊口数
            /// </summary>
            /// <param name="flag">1-施工单位,2-单位工程,3-管线</param>
            /// <param name="id"></param>
            /// <returns></returns>
            private static int GetMustCheckJotNum(string flag, string id)
            {
                  using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString))
                  {
                        int num = 0;
                        List<Model.HJGL_Pipeline> pipeList = null;
                        if (flag == "1")
                        {
                              pipeList = (from x in db.HJGL_Pipeline where x.ProjectId == id select x).ToList();
                        }
                        if (flag == "2")
                        {
                              pipeList = (from x in db.HJGL_Pipeline where x.UnitId == id select x).ToList();
                        }
                        if (flag == "3")
                        {
                              pipeList = (from x in db.HJGL_Pipeline where x.UnitWorkId == id select x).ToList();
                        }
                        if (flag == "4")
                        {
                              pipeList = (from x in db.HJGL_Pipeline where x.PipelineId == id select x).ToList();
                        }

                        foreach (var pipe in pipeList)
                        {
                              var rate = db.Base_DetectionRate.FirstOrDefault(e => e.DetectionRateId == pipe.DetectionRateId);
                              int jointNum = (from x in db.HJGL_WeldJoint where x.PipelineId == pipe.PipelineId select x).Count();
                              int DetectionRateValue = int.Parse(rate.DetectionRateValue);
                              decimal n = Convert.ToDecimal(1.0 * jointNum * DetectionRateValue / 100);
                              num = num + Convert.ToInt32(Math.Ceiling(n));
                        }
                        return num;
                  }
            }
      }
}