diff --git a/AMESCoreStudio.WebApi/Controllers/BLL/RPTController.cs b/AMESCoreStudio.WebApi/Controllers/BLL/RPTController.cs index b45ba7cc..8f11c560 100644 --- a/AMESCoreStudio.WebApi/Controllers/BLL/RPTController.cs +++ b/AMESCoreStudio.WebApi/Controllers/BLL/RPTController.cs @@ -16,6 +16,8 @@ using System.Data; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using AMESCoreStudio.WebApi.Controllers.SYS; +using System.Data.Common; +using System.Collections.Generic; namespace AMESCoreStudio.WebApi.Controllers.BLL { @@ -27,6 +29,7 @@ namespace AMESCoreStudio.WebApi.Controllers.BLL public class RPTController : Controller { private readonly AMESContext _context; + private readonly SMSContext _SMS_context; private readonly IConfiguration _config; /// @@ -39,6 +42,42 @@ namespace AMESCoreStudio.WebApi.Controllers.BLL _context = context; } + /// + /// + /// + /// + /// + public static DataTable DataReaderToDataTable(DbDataReader reader) + { + try + { + DataTable dt = new DataTable(); + int fieldCount = reader.FieldCount; + for (int fieldIndex = 0; fieldIndex < fieldCount; ++fieldIndex) + { + dt.Columns.Add(reader.GetName(fieldIndex), reader.GetFieldType(fieldIndex)); + } + + dt.BeginLoadData(); + + object[] rowValues = new object[fieldCount]; + while (reader.Read()) + { + reader.GetValues(rowValues); + dt.LoadDataRow(rowValues, true); + } + reader.Close(); + dt.EndLoadData(); + + return dt; + + } + catch (Exception ex) + { + throw new Exception("DataReader Convert DataTable Error!", ex); + } + } + /// /// 生產即時效率 /// @@ -255,6 +294,7 @@ namespace AMESCoreStudio.WebApi.Controllers.BLL result.fqc = double.Parse(sum_fqc_rate.ToString("0.00")); } + #region /* //应出勤人数 var ea = await new UserInfoesController(_context).GetUserData4EA(); @@ -325,6 +365,7 @@ namespace AMESCoreStudio.WebApi.Controllers.BLL result.abnormalTime = double.Parse((sumExceptionTime / 60.0).ToString("0.00")); */ + #endregion var pi = await new ProductionIndexesController(_context).GetProductionIndex4RPT001(sDate, eDate); @@ -394,6 +435,379 @@ namespace AMESCoreStudio.WebApi.Controllers.BLL return result; } + private (int iIPQC_Total,int iIPQC_Fail) Get_IPQC_Rate(string sDate, string eDate) + { + var e = new InspectionResultMastersController(_context).GetIPQCHeaderData4QRS015(null, null, null, sDate, eDate); + + int sumIpqcCnt = 0, sumPassCnt = 0, sumFailCnt = 0; + foreach (var item in e.Result.Data) + { + string str = item.ToString(); + JObject jo = JObject.Parse(str.Replace("=", ":")); + + string ipqc_week = jo["IPQCWeek"].ToString(); + int ipqc_cnt = int.Parse(jo["IPQCCnt"].ToString()); + int pass_cnt = int.Parse(jo["PassCnt"].ToString()); + int fail_cnt = int.Parse(jo["FailCnt"].ToString()); + double ipqc_rate = pass_cnt * 100.0 / ipqc_cnt; + sumIpqcCnt = sumIpqcCnt + ipqc_cnt; + sumPassCnt = sumPassCnt + pass_cnt; + sumFailCnt = sumFailCnt + fail_cnt; + } + + return (sumIpqcCnt, sumFailCnt); + } + + /// + /// IOQ進料檢驗 + /// + /// 醫療產品""、Y、N + /// 年 + /// 月 + /// 電子或機構 + /// + private async Task Get_IQC_Rate(string MEDICAL, string C_YEAR,string C_MONTH, string PARTTYPE) + { + #region IQC進料批退 + SMSContext _SMS_context = new SMSContext(); + + DbConnection conn = _SMS_context.Database.GetDbConnection(); + if (conn.State != ConnectionState.Open) + { + await conn.OpenAsync(); + } + + string sMS_SQL = @" SELECT N1.THE_YEAR C_YEAR,N1.MONTH_OF_YEAR C_MONTH,M1.MEDICAL,M1.PARTTYPE,M1.NG_QTY,M1.TOTAL_QTY,M1.NG_RATE"; + sMS_SQL = sMS_SQL + " FROM (SELECT DISTINCT THE_YEAR,MONTH_OF_YEAR FROM Calendar WHERE the_year= '" + C_YEAR + "') N1 "; + sMS_SQL = sMS_SQL + " LEFT JOIN"; + sMS_SQL = sMS_SQL + " ("; + sMS_SQL = sMS_SQL + " SELECT M.C_YEAR,M.C_MONTH,'" + MEDICAL + "' MEDICAL,'" + PARTTYPE + "' PARTTYPE,SUM(M.NG_LOT) NG_QTY,SUM(M.TOTAL_LOT) TOTAL_QTY"; + sMS_SQL = sMS_SQL + " ,round((SUM(convert(float,M.NG_LOT))/SUM(convert(float,M.TOTAL_LOT))) *100,2) NG_RATE"; + sMS_SQL = sMS_SQL + " FROM ("; + sMS_SQL = sMS_SQL + " SELECT PARTTYPE,MEDICAL,C_YEAR,C_MONTH,POSTDATE"; + sMS_SQL = sMS_SQL + " ,(CASE WHEN VD_CODE='R' THEN 1 ELSE 0 END) NG_LOT"; + sMS_SQL = sMS_SQL + " ,(CASE WHEN VD_CODE<>'' THEN 1 ELSE 0 END) TOTAL_LOT"; + sMS_SQL = sMS_SQL + " FROM [dbo].[INSLOT]"; + sMS_SQL = sMS_SQL + " WHERE POSTDATE IS NOT NULL"; + sMS_SQL = sMS_SQL + " AND PARTTYPE = " + "'" + PARTTYPE + "'"; + //sMS_SQL = sMS_SQL + " AND POSTDATE BETWEEN '" + sDate + "' AND '" + eDate + "'"; + sMS_SQL = sMS_SQL + " AND C_YEAR = '" + C_YEAR + "'"; + sMS_SQL = sMS_SQL + " ) M"; + sMS_SQL = sMS_SQL + " GROUP BY M.C_YEAR,M.C_MONTH"; + sMS_SQL = sMS_SQL + " )M1"; + sMS_SQL = sMS_SQL + " ON N1.THE_YEAR = M1.C_YEAR AND N1.MONTH_OF_YEAR=M1.C_MONTH"; + + using (var SMS_cmd = conn.CreateCommand()) + { + SMS_cmd.CommandText = sMS_SQL; + SMS_cmd.CommandTimeout = 0; + + using (var SMS_reader = await SMS_cmd.ExecuteReaderAsync()) + { + if (SMS_reader.HasRows) + { + List list = new List(); + DataTable dtSMS_TB = new DataTable(); + + dtSMS_TB = DataReaderToDataTable(SMS_reader); + + if (dtSMS_TB.Rows.Count > 0) + { + var dRate = dtSMS_TB.Select("C_MONTH='" + C_MONTH + "'")[0]["NG_RATE"]; + + if (dRate.ToString().Equals("")) + { return 0.0; } + else + { return double.Parse(dRate.ToString()); } + + } + } + return 0.0; + } + } + #endregion + } + + private async Task Get_QRC_Rate(int nCarTypeID, string C_YEAR, string C_MONTH, string PRODUCT_TYPE_ID) + { + #region QRC單 + SMSContext _SMS_context = new SMSContext(); + + DbConnection conn = _SMS_context.Database.GetDbConnection(); + if (conn.State != ConnectionState.Open) + { + await conn.OpenAsync(); + } + + string sMS_SQL = @" SELECT M1.THE_YEAR,M1.THE_MONTH,M1.MONTH_OF_YEAR,ISNULL(M2.QTY, 0) FLAG_3,ISNULL(M3.QTY, 0) FLAG_4"; + sMS_SQL += " FROM"; + sMS_SQL += " ("; + sMS_SQL += " SELECT DISTINCT A.THE_YEAR, A.THE_MONTH, A.MONTH_OF_YEAR"; + sMS_SQL += " FROM CALENDAR A"; + sMS_SQL += " WHERE A.THE_YEAR = '" + C_YEAR + "'"; + sMS_SQL += " )M1 LEFT JOIN"; //開單總數:狀態為OPEN、TBC、TBC - C、TBC - R、CLOSE(NA不算),開單日為當月ISSUE_DATE,且立案否為Y) + sMS_SQL += " (SELECT B.THE_YEAR,B.MONTH_OF_YEAR,'' GROUPNAME,'開單總數' CATEGORY,3 SEQ_FLAG,COUNT(A.CAR_NUMBER) QTY"; + sMS_SQL += " FROM CORRECTIVE_ACTION_REPORT A, CALENDAR B,CAR_TYPE C"; + sMS_SQL += " WHERE CONVERT(VARCHAR(20),A.ISSUE_DATE,23)= CONVERT(VARCHAR(20), B.THE_DATE, 23)"; + sMS_SQL += " AND A.CAR_TYPE_ID = C.CAR_TYPE_ID"; + sMS_SQL += " AND C.CAR_CLASS = 'SCAR'"; + sMS_SQL += " AND A.CAR_TYPE_ID = 102"; + sMS_SQL += " AND A.ESTABLISHED = 'Y'"; + if (!PRODUCT_TYPE_ID.Equals("")) + { + sMS_SQL += " AND A.PRODUCT_TYPE_ID IN(" + PRODUCT_TYPE_ID + ")"; + } + sMS_SQL += " AND A.STATUS IN ('OPEN', 'TBC', 'TBC-C', 'TBC-R', 'CLOSE')"; + sMS_SQL += " AND DATEPART(YYYY, A.ISSUE_DATE) = '" + C_YEAR + "'"; + sMS_SQL += " GROUP BY B.THE_YEAR,B.MONTH_OF_YEAR"; + sMS_SQL += " )M2 ON M1.THE_YEAR = M2.THE_YEAR AND M1.MONTH_OF_YEAR = M2.MONTH_OF_YEAR"; + sMS_SQL += " LEFT JOIN"; //未結件數:狀態為OPEN、TBC - C、TBC - R,開單日為當月ISSUE_DATE,且立案否為Y + sMS_SQL += " (SELECT B.THE_YEAR, B.MONTH_OF_YEAR, '' GROUPNAME, '未結件數' CATEGORY, 4 SEQ_FLAG, COUNT(A.CAR_NUMBER) QTY"; + sMS_SQL += " FROM CORRECTIVE_ACTION_REPORT A, CALENDAR B, CAR_TYPE C"; + sMS_SQL += " WHERE CONVERT(VARCHAR(20), A.ISSUE_DATE, 23) = CONVERT(VARCHAR(20), B.THE_DATE, 23)"; + sMS_SQL += " AND A.CAR_TYPE_ID = C.CAR_TYPE_ID"; + sMS_SQL += " AND C.CAR_CLASS = 'SCAR'"; + sMS_SQL += " AND A.CAR_TYPE_ID = 102"; + sMS_SQL += " AND A.ESTABLISHED = 'Y'"; + sMS_SQL += " AND A.STATUS IN ('OPEN', 'TBC-C', 'TBC-R')"; + if (!PRODUCT_TYPE_ID.Equals("")) + { + sMS_SQL += " AND A.PRODUCT_TYPE_ID IN(" + PRODUCT_TYPE_ID + ")"; + } + sMS_SQL += " AND DATEPART(YYYY, A.ISSUE_DATE) = '" + C_YEAR + "'"; + sMS_SQL += " GROUP BY B.THE_YEAR,B.MONTH_OF_YEAR"; + sMS_SQL += " )M3 ON M1.THE_YEAR = M3.THE_YEAR AND M1.MONTH_OF_YEAR = M3.MONTH_OF_YEAR"; + + using (var SMS_cmd = conn.CreateCommand()) + { + SMS_cmd.CommandText = sMS_SQL; + SMS_cmd.CommandTimeout = 0; + + using (var SMS_reader = await SMS_cmd.ExecuteReaderAsync()) + { + if (SMS_reader.HasRows) + { + List list = new List(); + DataTable dtSMS_TB = new DataTable(); + + dtSMS_TB = DataReaderToDataTable(SMS_reader); + + if (dtSMS_TB.Rows.Count > 0) + { + var dRate1 = dtSMS_TB.Select("MONTH_OF_YEAR='" + C_MONTH + "'")[0]["FLAG_3"]; + var dRate2 = dtSMS_TB.Select("MONTH_OF_YEAR='" + C_MONTH + "'")[0]["FLAG_4"]; + + int iTotal = 0; + for(int i= 1; i<=12; i++) + { + iTotal = iTotal + int.Parse(dtSMS_TB.Select("MONTH_OF_YEAR='" + i.ToString() + "'")[0]["FLAG_3"].ToString()); + } + + var dRate = dRate1 + "|" + dRate2 + "|" + iTotal.ToString(); + + if (dRate.ToString().Equals("")) + { return "0|0|0"; } + else + { return dRate.ToString(); } + + } + } + return "0|0|0"; + } + } + #endregion + } + + private async Task Get_CFQR_Rate(string sCarTypeID, string C_YEAR, string C_MONTH, string PRODUCT_TYPE_ID) + { + #region CFQR單 + SMSContext _SMS_context = new SMSContext(); + + DbConnection conn = _SMS_context.Database.GetDbConnection(); + if (conn.State != ConnectionState.Open) + { + await conn.OpenAsync(); + } + + string sMS_SQL = @" SELECT N1.C_YEAR,N1.C_MONTH,N1.FLAG_DESC,N1.FLAG_SEQ,ISNULL(N2.QTY,0) QTY"; + sMS_SQL += " FROM"; + sMS_SQL += " ("; + sMS_SQL += " SELECT DISTINCT THE_YEAR C_YEAR,MONTH_OF_YEAR C_MONTH,CAST(A.THE_YEAR AS VARCHAR(4)) +' ' + C.FLAG_DESC FLAG_DESC,C.FLAG_SEQ"; + sMS_SQL += " FROM CALENDAR A,"; + sMS_SQL += " ( SELECT '立案單總數' FLAG_DESC ,3 FLAG_SEQ"; + sMS_SQL += " UNION SELECT '總開單數' FLAG_DESC ,3.1 FLAG_SEQ"; + sMS_SQL += " UNION SELECT 'ONTIMECLOSERATE %' FLAG_DESC, 4 FLAG_SEQ) C"; + sMS_SQL += " WHERE A.THE_YEAR = " + C_YEAR; + sMS_SQL += " )N1"; + sMS_SQL += " LEFT JOIN"; + sMS_SQL += " ("; + sMS_SQL += " SELECT M.C_YEAR,M.C_MONTH,'立案單總數' FLAG_DESC,3 FLAG_SEQ,COUNT(M.CAR_NUMBER) QTY"; + sMS_SQL += " FROM ("; + sMS_SQL += " SELECT DATEPART(YYYY, A.ISSUE_DATE) C_YEAR,DATEPART(MM, A.ISSUE_DATE) C_MONTH,A.CAR_NUMBER,A.STATUS"; + sMS_SQL += " from CORRECTIVE_ACTION_REPORT A"; + sMS_SQL += " where A.CAR_TYPE_ID = " + sCarTypeID; //--CFQR + sMS_SQL += " AND A.PRODUCT_TYPE_ID IN (" + PRODUCT_TYPE_ID + ")"; // --103:PCBA 104:System 101:Medical + sMS_SQL += " AND A.ESTABLISHED='Y'"; //--已经立案 + sMS_SQL += " AND DATEPART(YYYY, A.ISSUE_DATE) = " + C_YEAR; + sMS_SQL += " ) M"; + sMS_SQL += " GROUP BY M.C_YEAR,M.C_MONTH"; + sMS_SQL += " UNION "; + sMS_SQL += " SELECT M.C_YEAR,M.C_MONTH,'總開單數' FLAG_DESC,3.1 FLAG_SEQ,COUNT(M.CAR_NUMBER) QTY"; //總開單數 + sMS_SQL += " FROM ("; + sMS_SQL += " SELECT DATEPART(YYYY, A.ISSUE_DATE) C_YEAR,DATEPART(MM, A.ISSUE_DATE) C_MONTH,A.CAR_NUMBER,A.STATUS"; + sMS_SQL += " from CORRECTIVE_ACTION_REPORT A"; + sMS_SQL += " where A.CAR_TYPE_ID = " + sCarTypeID; //--CFQR + sMS_SQL += " AND A.PRODUCT_TYPE_ID IN (" + PRODUCT_TYPE_ID + ")"; // --103:PCBA 104:System 101:Medical + sMS_SQL += " AND DATEPART(YYYY, A.ISSUE_DATE) = " + C_YEAR; + sMS_SQL += " ) M"; + sMS_SQL += " GROUP BY M.C_YEAR,M.C_MONTH"; + sMS_SQL += " UNION "; + sMS_SQL += " SELECT M1.C_YEAR,M1.C_MONTH,'OnTimeCloseRate' FLAG_DESC, 4 FLAG_SEQ "; + sMS_SQL += " ,(CASE WHEN M1.Sub_Total_Qty >0 THEN cast(round(ISNULL(M2.Less_Days_Qty,0)*100.0/M1.Sub_Total_Qty,0) as int) ELSE 0 END) Rate"; //四舍五入取整 + sMS_SQL += " FROM "; + sMS_SQL += " ( SELECT M.C_YEAR,M.C_MONTH,COUNT(M.CAR_NUMBER) Sub_Total_Qty"; + sMS_SQL += " FROM ("; + sMS_SQL += " SELECT A.PRODUCT_TYPE_ID,DATEPART(YYYY, A.ISSUE_DATE) C_YEAR,DATEPART(MM, A.ISSUE_DATE) C_MONTH,A.CAR_NUMBER,A.STATUS"; + sMS_SQL += " from CORRECTIVE_ACTION_REPORT A"; + sMS_SQL += " where A.CAR_TYPE_ID = " + sCarTypeID; // --CFQR + sMS_SQL += " AND A.PRODUCT_TYPE_ID IN (" + PRODUCT_TYPE_ID + ")"; // --103:PCBA 104:System 101:Medical + sMS_SQL += " AND A.ESTABLISHED='Y'"; //--已经立案 + sMS_SQL += " AND DATEPART(YYYY, A.ISSUE_DATE) = " + C_YEAR; + sMS_SQL += " ) M"; + sMS_SQL += " GROUP BY M.C_YEAR,M.C_MONTH"; + sMS_SQL += " ) M1 LEFT JOIN "; + sMS_SQL += " ("; + sMS_SQL += " SELECT M.C_YEAR,M.C_MONTH,COUNT(CAR_NUMBER) Less_Days_Qty"; + sMS_SQL += " FROM "; + sMS_SQL += " (select A.CAR_NUMBER,DATEPART(YYYY, A.ISSUE_DATE) C_YEAR,DATEPART(MM, A.ISSUE_DATE) C_MONTH ,A.ISSUE_DATE,A.TRACK_DATETIME,"; + sMS_SQL += " (CASE WHEN A.OPEN_DATETIME IS NOT NULL THEN (CASE WHEN TRACK_DATETIME IS NOT NULL THEN datediff(day,A.OPEN_DATETIME,A.TRACK_DATETIME) ELSE datediff(day,A.OPEN_DATETIME,getdate()) END) ELSE 0 END) ISSUE_DAYS"; + sMS_SQL += " from CORRECTIVE_ACTION_REPORT A,PRODUCT_TYPE B"; + sMS_SQL += " where A.PRODUCT_TYPE_ID=B.PRODUCT_TYPE_ID"; + sMS_SQL += " AND A.CAR_TYPE_ID = " + sCarTypeID; //--CFQR + sMS_SQL += " AND A.PRODUCT_TYPE_ID IN (" + PRODUCT_TYPE_ID + ") "; //--103:PCBA 104:System 101:Medical + sMS_SQL += " AND A.OPEN_DATETIME IS NOT NULL "; // --TRACK_DATETIME表示已经定案 + sMS_SQL += " AND DATEPART(YYYY, A.ISSUE_DATE) = " + C_YEAR; + sMS_SQL += " )M"; + sMS_SQL += " WHERE M.ISSUE_DAYS <=21"; + sMS_SQL += " GROUP BY M.C_YEAR,M.C_MONTH"; + sMS_SQL += " )M2 ON M1.C_YEAR=M2.C_YEAR AND M1.C_MONTH=M2.C_MONTH "; + sMS_SQL += " )N2"; + sMS_SQL += " ON N1.C_YEAR = N2.C_YEAR AND N1.C_MONTH=N2.C_MONTH AND N1.FLAG_SEQ = N2.FLAG_SEQ"; + sMS_SQL += " WHERE N1.FLAG_DESC = '2022 總開單數'"; + + using (var SMS_cmd = conn.CreateCommand()) + { + SMS_cmd.CommandText = sMS_SQL; + SMS_cmd.CommandTimeout = 0; + + using (var SMS_reader = await SMS_cmd.ExecuteReaderAsync()) + { + if (SMS_reader.HasRows) + { + List list = new List(); + DataTable dtSMS_TB = new DataTable(); + + dtSMS_TB = DataReaderToDataTable(SMS_reader); + + if (dtSMS_TB.Rows.Count > 0) + { + var dRate1 = dtSMS_TB.Select("C_MONTH='" + C_MONTH + "'")[0]["QTY"]; + var dRate2 = await Get_CFQR_UnFinished_Rate(sCarTypeID, C_YEAR, C_MONTH, PRODUCT_TYPE_ID); + + int iTotal = 0; + for (int i = 1; i <= 12; i++) + { + iTotal = iTotal + int.Parse(dtSMS_TB.Select("C_MONTH='" + i.ToString() + "'")[0]["QTY"].ToString()); + } + + var dRate = dRate1 + "|" + dRate2 + "|" + iTotal.ToString(); + + if (dRate.ToString().Equals("")) + { return "0|0|0"; } + else + { return dRate.ToString(); } + + } + } + return "0|0|0"; + } + } + #endregion + } + + private async Task Get_CFQR_UnFinished_Rate(string sCarTypeID, string C_YEAR, string C_MONTH, string PRODUCT_TYPE_ID) + { + #region CFQR 未結單 + SMSContext _SMS_context = new SMSContext(); + + DbConnection conn = _SMS_context.Database.GetDbConnection(); + if (conn.State != ConnectionState.Open) + { + await conn.OpenAsync(); + } + + string sMS_SQL = @" with t as ("; + sMS_SQL = sMS_SQL + " select m1.the_year,m1.month_of_year,m1.Category,m1.FLAG_SEQ,sum(ISNULL(m2.qty,0)) total_qty"; + sMS_SQL = sMS_SQL + " from "; + sMS_SQL = sMS_SQL + " ("; + sMS_SQL = sMS_SQL + " select distinct a.the_year, a.month_of_year,'總未結件數' Category,4 FLAG_SEQ"; + sMS_SQL = sMS_SQL + " from Calendar a,PRODUCT_TYPE b"; + sMS_SQL = sMS_SQL + " where a.the_date BETWEEN '" + C_YEAR + "0101' AND '" + C_YEAR + "1231'"; + sMS_SQL = sMS_SQL + " and b.PRODUCT_TYPE_ID IN (" + PRODUCT_TYPE_ID + ") "; + sMS_SQL = sMS_SQL + " ) m1 left join "; + sMS_SQL = sMS_SQL + " ("; + sMS_SQL = sMS_SQL + " select b.the_year,b.month_of_year,'總未結件數' Category,count(a.CAR_NUMBER) qty, 4 FLAG_SEQ"; + sMS_SQL = sMS_SQL + " from CORRECTIVE_ACTION_REPORT a,Calendar b,PRODUCT_TYPE c"; + sMS_SQL = sMS_SQL + " WHERE convert(varchar(20),a.issue_date,23)=convert(varchar(20),b.the_date,23)"; + sMS_SQL = sMS_SQL + " AND A.PRODUCT_TYPE_ID=C.PRODUCT_TYPE_ID"; + sMS_SQL = sMS_SQL + " AND A.CAR_TYPE_ID = " + sCarTypeID; + sMS_SQL = sMS_SQL + " AND A.PRODUCT_TYPE_ID IN (" + PRODUCT_TYPE_ID + ") "; + sMS_SQL = sMS_SQL + " AND ESTABLISHED = 'Y' "; + sMS_SQL = sMS_SQL + " AND STATUS in ('OPEN','TBC','TBC-R') "; + sMS_SQL = sMS_SQL + " AND ISSUE_DATE BETWEEN '" + C_YEAR + "0101' AND '" + C_YEAR + "1231'"; + sMS_SQL = sMS_SQL + " group by b.the_year,b.month_of_year,c.PRODUCT_ST"; + sMS_SQL = sMS_SQL + " )m2 on m1.the_year= m2.the_year and m1.month_of_year=m2.month_of_year and m1.FLAG_SEQ=m2.FLAG_SEQ"; + sMS_SQL = sMS_SQL + " group by m1.the_year,m1.month_of_year,m1.Category, m1.FLAG_SEQ"; + sMS_SQL = sMS_SQL + " )"; + sMS_SQL = sMS_SQL + " select t1.the_year,t1.month_of_year,t1.Category, t1.FLAG_SEQ,sum(t2.total_qty) total_qty"; + sMS_SQL = sMS_SQL + " from t as t1, t as t2"; + sMS_SQL = sMS_SQL + " where t1.the_year = t2.the_year"; + sMS_SQL = sMS_SQL + " and t1.FLAG_SEQ = t2.FLAG_SEQ"; + sMS_SQL = sMS_SQL + " and t2.month_of_year<=t1.month_of_year"; + sMS_SQL = sMS_SQL + " and t1.THE_YEAR = '" + C_YEAR + "'"; + sMS_SQL = sMS_SQL + " GROUP BY t1.the_year,t1.Category,t1.FLAG_SEQ,t1.month_of_year"; + + using (var SMS_cmd = conn.CreateCommand()) + { + SMS_cmd.CommandText = sMS_SQL; + SMS_cmd.CommandTimeout = 0; + + using (var SMS_reader = await SMS_cmd.ExecuteReaderAsync()) + { + if (SMS_reader.HasRows) + { + List list = new List(); + DataTable dtSMS_TB = new DataTable(); + + dtSMS_TB = DataReaderToDataTable(SMS_reader); + + if (dtSMS_TB.Rows.Count > 0) + { + var dRate = dtSMS_TB.Select("month_of_year='" + C_MONTH + "'")[0]["total_qty"]; + + if (dRate.ToString().Equals("")) + { return "0"; } + else + { return dRate.ToString(); } + + } + } + return "0"; + } + } + #endregion + } + /// /// 品質看板 /// @@ -410,34 +824,56 @@ namespace AMESCoreStudio.WebApi.Controllers.BLL } var result = new RPT002ViewDto(); + + var vYear = DateTime.Parse(sDate).Year; + var vMonth = DateTime.Parse(sDate).Month; + // 進料批退率 電子 - result.IQLRR_EE = 0.84; + //result.IQLRR_EE = 0.84; + #region + result.IQLRR_EE = await Get_IQC_Rate("", vYear.ToString(), vMonth.ToString(), "E"); + #endregion // 進料批退率 機構 - result.IQLRR_ME = 0.06; + //result.IQLRR_ME = 0.06; + #region + result.IQLRR_ME = await Get_IQC_Rate("", vYear.ToString(), vMonth.ToString(), "M"); + #endregion // 線上材料品質 result.LQC = 0.00; // QRC件數 新增筆數 - result.QRCNew = 4; + //result.QRCNew = 4; + #region + string sReturn_Data = await Get_QRC_Rate(102, vYear.ToString(), vMonth.ToString(), ""); + string[] sData_Ary = sReturn_Data.Split("|"); + result.QRCNew = int.Parse(sData_Ary[0].ToString()); + #endregion // QRC件數 結案筆數 - result.QRCClose = 2; + //result.QRCClose = 2; + result.QRCClose = int.Parse(sData_Ary[1].ToString()); // QRC件數 總筆數 - result.QRCTotal = 6; + //result.QRCTotal = 6; + result.QRCTotal = int.Parse(sData_Ary[2].ToString()); //IPQC異常件數 新增筆數 - result.IPQCNew = 10; + //result.IPQCNew = 10; + var vIPQCNew = Get_IPQC_Rate(sDate, eDate); + result.IPQCNew = vIPQCNew.iIPQC_Total; // IPQC異常件數 結案筆數 - result.IPQCClose = 1; + result.IPQCClose = 0; // IPQC異常件數 總筆數 - result.IPQCTotal = 12; + //result.IPQCTotal = 12; + var vIPQCTotal = Get_IPQC_Rate(vYear.ToString() + "/01/01", vYear.ToString() + "/12/31"); + result.IPQCTotal = vIPQCTotal.iIPQC_Total; // FQC批退率 Board + #region 批退率 Board //result.FQCRRBoard = 5.08; var f_FQCRRBoard = await new FqcResultMasterController(_context).GetFQCHeaderData4QRS016ByDetail(null, null, null, sDate, eDate, "1001"); if (f_FQCRRBoard.DataTotal > 0) @@ -447,8 +883,10 @@ namespace AMESCoreStudio.WebApi.Controllers.BLL result.FQCRRBoard = item.rejectRate; } } + #endregion // FQC批退率 System + #region 批退率 System //result.FQCRRSystem = 12.12; var f_FQCRRSystem = await new FqcResultMasterController(_context).GetFQCHeaderData4QRS016ByDetail(null, null, null, sDate, eDate, "1001"); if (f_FQCRRSystem.DataTotal > 0) @@ -458,8 +896,10 @@ namespace AMESCoreStudio.WebApi.Controllers.BLL result.FQCRRSystem = item.rejectRate; } } + #endregion // FQC批退率 Medical + #region 批退率 Medical //result.FQCRRMedical = 11.11; var f_FQCRRMedical = await new FqcResultMasterController(_context).GetFQCHeaderData4QRS016ByDetail(null, null, null, sDate, eDate, "1001"); if (f_FQCRRSystem.DataTotal > 0) @@ -469,6 +909,7 @@ namespace AMESCoreStudio.WebApi.Controllers.BLL result.FQCRRMedical = item.rejectRate; } } + #endregion // DOA Board result.DOABoard = 0.04; @@ -480,8 +921,9 @@ namespace AMESCoreStudio.WebApi.Controllers.BLL result.DOAMedical = 0.00; // FPY 立德 Board + #region 立德 Board //result.FPYBoard_LEI = 99.15; - var f_FPYBoard_LEI = await new WipStationController(_context).GetWipStation4QRS014GroupB(null, sDate, eDate, null, null, null); + var f_FPYBoard_LEI = await new WipStationController(_context).GetWipStation4QRS014GroupB(null, sDate, eDate, null, "YS00", null); if (f_FPYBoard_LEI.DataTotal > 0) { double sum_rate = 100.0; @@ -581,21 +1023,532 @@ namespace AMESCoreStudio.WebApi.Controllers.BLL } result.FPYBoard_LEI = double.Parse((sum_rate / sum_idx).ToString("0.00")); } + #endregion // FPY 立德 System - result.FPYSystem_LEI = 92.12; + #region 立德 System + //result.FPYSystem_LEI = 92.12; + var f_FPYSystem_LEI = await new WipStationController(_context).GetWipStation4QRS014GroupS(null, sDate, eDate, null, "YS00", null); + if (f_FPYSystem_LEI.DataTotal > 0) + { + double sum_rate = 100.0; + int sum_idx = 1; + + DataTable dtRate = new DataTable(); + dtRate.Columns.Add("STATION_ID"); + dtRate.Columns.Add("OK_QTY"); + dtRate.Columns.Add("NG_QTY"); + dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] }; + dtRate.AcceptChanges(); + + foreach (var data in f_FPYSystem_LEI.Data) + { + string str = data.ToString(); + string[] str2 = str.Replace("{", "").Replace("}", "").Split(','); + string str3 = ""; + for (int i = 0; i < str2.Length; i++) + { + string[] str21 = str2[i].Split("="); + str3 = str3 + str21[0].Trim() + ":" + "'" + str21[1].Trim() + "',"; + } + JObject j0 = JObject.Parse("{" + str3.Substring(0, str3.Length - 1) + "}"); + int stationID = int.Parse(j0["StationID"].ToString()); + + bool existFlag = false; + int idx = 0; + + for (int i = 0; i < dtRate.Rows.Count; i++) + { + if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString()) + { + idx = i; + existFlag = true; + break; + } + } + + int okQty = 0, ngQty = 0; + + if (j0["RuleStatus"].ToString() == "P") + { + okQty = int.Parse(j0["FirstCnt"].ToString()); + } + else + { + ngQty = int.Parse(j0["FirstCnt"].ToString()); + } + + if (existFlag) + { + if (okQty > 0) + { + dtRate.Rows[idx][1] = okQty; + } + if (ngQty > 0) + { + dtRate.Rows[idx][2] = ngQty; + } + + dtRate.AcceptChanges(); + } + else + { + DataRow dr = dtRate.NewRow(); + dr[0] = stationID; + dr[1] = okQty; + dr[2] = ngQty; + + dtRate.Rows.Add(dr); + dtRate.AcceptChanges(); + } + } + + if (dtRate.Rows.Count > 0) + { + for (int j = 0; j < dtRate.Rows.Count; j++) + { + int okQty = int.Parse(dtRate.Rows[j][1].ToString()); + int ngQty = int.Parse(dtRate.Rows[j][2].ToString()); + + int inputQty = okQty + ngQty; + + double rate = 0; + if (okQty > 0) + { + rate = (okQty * 1.0 / inputQty) * 100; + } + + if (rate > 0) + { + //sum_rate = sum_rate * (rate / 100.0); + sum_idx = sum_idx + 1; + sum_rate = sum_rate + rate; + } + } + } + result.FPYSystem_LEI = double.Parse((sum_rate / sum_idx).ToString("0.00")); + } + #endregion // FPY 立德 Medical - result.FPYMedical_LEI = 90.11; + #region 立德 Medical + //result.FPYMedical_LEI = 90.11; + var f_FPYMedical_LEI = await new WipStationController(_context).GetWipStation4QRS014GroupS(null, sDate, eDate, null, "YS00", null); + if (f_FPYMedical_LEI.DataTotal > 0) + { + double sum_rate = 100.0; + int sum_idx = 1; - // FPY Board - result.FPYBoard = 100.00; + DataTable dtRate = new DataTable(); + dtRate.Columns.Add("STATION_ID"); + dtRate.Columns.Add("OK_QTY"); + dtRate.Columns.Add("NG_QTY"); + dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] }; + dtRate.AcceptChanges(); + + foreach (var data in f_FPYMedical_LEI.Data) + { + string str = data.ToString(); + string[] str2 = str.Replace("{", "").Replace("}", "").Split(','); + string str3 = ""; + for (int i = 0; i < str2.Length; i++) + { + string[] str21 = str2[i].Split("="); + str3 = str3 + str21[0].Trim() + ":" + "'" + str21[1].Trim() + "',"; + } + JObject j0 = JObject.Parse("{" + str3.Substring(0, str3.Length - 1) + "}"); + int stationID = int.Parse(j0["StationID"].ToString()); - // FPY System - result.FPYSystem = 99.12; + bool existFlag = false; + int idx = 0; - // FPY Medical - result.FPYMedical = 12.12; + for (int i = 0; i < dtRate.Rows.Count; i++) + { + if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString()) + { + idx = i; + existFlag = true; + break; + } + } + + int okQty = 0, ngQty = 0; + + if (j0["RuleStatus"].ToString() == "P") + { + okQty = int.Parse(j0["FirstCnt"].ToString()); + } + else + { + ngQty = int.Parse(j0["FirstCnt"].ToString()); + } + + if (existFlag) + { + if (okQty > 0) + { + dtRate.Rows[idx][1] = okQty; + } + if (ngQty > 0) + { + dtRate.Rows[idx][2] = ngQty; + } + + dtRate.AcceptChanges(); + } + else + { + DataRow dr = dtRate.NewRow(); + dr[0] = stationID; + dr[1] = okQty; + dr[2] = ngQty; + + dtRate.Rows.Add(dr); + dtRate.AcceptChanges(); + } + } + + if (dtRate.Rows.Count > 0) + { + for (int j = 0; j < dtRate.Rows.Count; j++) + { + int okQty = int.Parse(dtRate.Rows[j][1].ToString()); + int ngQty = int.Parse(dtRate.Rows[j][2].ToString()); + + int inputQty = okQty + ngQty; + + double rate = 0; + if (okQty > 0) + { + rate = (okQty * 1.0 / inputQty) * 100; + } + + if (rate > 0) + { + //sum_rate = sum_rate * (rate / 100.0); + sum_idx = sum_idx + 1; + sum_rate = sum_rate + rate; + } + } + } + result.FPYMedical_LEI = double.Parse((sum_rate / sum_idx).ToString("0.00")); + } + #endregion + + // FPY Board + #region 立德 委外 Board + //result.FPYBoard = 100.00; + var f_FPYBoard = await new WipStationController(_context).GetWipStation4QRS014GroupB(null, sDate, eDate, null, "YS31", null); + if (f_FPYBoard.DataTotal > 0) + { + double sum_rate = 100.0; + int sum_idx = 1; + + DataTable dtRate = new DataTable(); + dtRate.Columns.Add("STATION_ID"); + dtRate.Columns.Add("OK_QTY"); + dtRate.Columns.Add("NG_QTY"); + dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] }; + dtRate.AcceptChanges(); + + foreach (var data in f_FPYBoard.Data) + { + string str = data.ToString(); + string[] str2 = str.Replace("{", "").Replace("}", "").Split(','); + string str3 = ""; + for (int i = 0; i < str2.Length; i++) + { + string[] str21 = str2[i].Split("="); + str3 = str3 + str21[0].Trim() + ":" + "'" + str21[1].Trim() + "',"; + } + JObject j0 = JObject.Parse("{" + str3.Substring(0, str3.Length - 1) + "}"); + int stationID = int.Parse(j0["StationID"].ToString()); + + bool existFlag = false; + int idx = 0; + + for (int i = 0; i < dtRate.Rows.Count; i++) + { + if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString()) + { + idx = i; + existFlag = true; + break; + } + } + + int okQty = 0, ngQty = 0; + + if (j0["RuleStatus"].ToString() == "P") + { + okQty = int.Parse(j0["FirstCnt"].ToString()); + } + else + { + ngQty = int.Parse(j0["FirstCnt"].ToString()); + } + + if (existFlag) + { + if (okQty > 0) + { + dtRate.Rows[idx][1] = okQty; + } + if (ngQty > 0) + { + dtRate.Rows[idx][2] = ngQty; + } + + dtRate.AcceptChanges(); + } + else + { + DataRow dr = dtRate.NewRow(); + dr[0] = stationID; + dr[1] = okQty; + dr[2] = ngQty; + + dtRate.Rows.Add(dr); + dtRate.AcceptChanges(); + } + } + + if (dtRate.Rows.Count > 0) + { + for (int j = 0; j < dtRate.Rows.Count; j++) + { + int okQty = int.Parse(dtRate.Rows[j][1].ToString()); + int ngQty = int.Parse(dtRate.Rows[j][2].ToString()); + + int inputQty = okQty + ngQty; + + double rate = 0; + if (okQty > 0) + { + rate = (okQty * 1.0 / inputQty) * 100; + } + + if (rate > 0) + { + //sum_rate = sum_rate * (rate / 100.0); + sum_idx = sum_idx + 1; + sum_rate = sum_rate + rate; + } + } + } + result.FPYBoard = double.Parse((sum_rate / sum_idx).ToString("0.00")); + } + #endregion + + // FPY System + #region 立德 委外 System + //result.FPYSystem = 99.12; + var f_FPYSystem = await new WipStationController(_context).GetWipStation4QRS014GroupS(null, sDate, eDate, null, "YS31", null); + if (f_FPYSystem.DataTotal > 0) + { + double sum_rate = 100.0; + int sum_idx = 1; + + DataTable dtRate = new DataTable(); + dtRate.Columns.Add("STATION_ID"); + dtRate.Columns.Add("OK_QTY"); + dtRate.Columns.Add("NG_QTY"); + dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] }; + dtRate.AcceptChanges(); + + foreach (var data in f_FPYSystem.Data) + { + string str = data.ToString(); + string[] str2 = str.Replace("{", "").Replace("}", "").Split(','); + string str3 = ""; + for (int i = 0; i < str2.Length; i++) + { + string[] str21 = str2[i].Split("="); + str3 = str3 + str21[0].Trim() + ":" + "'" + str21[1].Trim() + "',"; + } + JObject j0 = JObject.Parse("{" + str3.Substring(0, str3.Length - 1) + "}"); + int stationID = int.Parse(j0["StationID"].ToString()); + + bool existFlag = false; + int idx = 0; + + for (int i = 0; i < dtRate.Rows.Count; i++) + { + if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString()) + { + idx = i; + existFlag = true; + break; + } + } + + int okQty = 0, ngQty = 0; + + if (j0["RuleStatus"].ToString() == "P") + { + okQty = int.Parse(j0["FirstCnt"].ToString()); + } + else + { + ngQty = int.Parse(j0["FirstCnt"].ToString()); + } + + if (existFlag) + { + if (okQty > 0) + { + dtRate.Rows[idx][1] = okQty; + } + if (ngQty > 0) + { + dtRate.Rows[idx][2] = ngQty; + } + + dtRate.AcceptChanges(); + } + else + { + DataRow dr = dtRate.NewRow(); + dr[0] = stationID; + dr[1] = okQty; + dr[2] = ngQty; + + dtRate.Rows.Add(dr); + dtRate.AcceptChanges(); + } + } + + if (dtRate.Rows.Count > 0) + { + for (int j = 0; j < dtRate.Rows.Count; j++) + { + int okQty = int.Parse(dtRate.Rows[j][1].ToString()); + int ngQty = int.Parse(dtRate.Rows[j][2].ToString()); + + int inputQty = okQty + ngQty; + + double rate = 0; + if (okQty > 0) + { + rate = (okQty * 1.0 / inputQty) * 100; + } + + if (rate > 0) + { + //sum_rate = sum_rate * (rate / 100.0); + sum_idx = sum_idx + 1; + sum_rate = sum_rate + rate; + } + } + } + result.FPYSystem = double.Parse((sum_rate / sum_idx).ToString("0.00")); + } + #endregion + + // FPY Medical + #region 立德 委外 Medical + //result.FPYMedical = 12.12; + var f_FPYMedical = await new WipStationController(_context).GetWipStation4QRS014GroupS(null, sDate, eDate, null, "YS31", null); + if (f_FPYMedical.DataTotal > 0) + { + double sum_rate = 100.0; + int sum_idx = 1; + + DataTable dtRate = new DataTable(); + dtRate.Columns.Add("STATION_ID"); + dtRate.Columns.Add("OK_QTY"); + dtRate.Columns.Add("NG_QTY"); + dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] }; + dtRate.AcceptChanges(); + + foreach (var data in f_FPYMedical.Data) + { + string str = data.ToString(); + string[] str2 = str.Replace("{", "").Replace("}", "").Split(','); + string str3 = ""; + for (int i = 0; i < str2.Length; i++) + { + string[] str21 = str2[i].Split("="); + str3 = str3 + str21[0].Trim() + ":" + "'" + str21[1].Trim() + "',"; + } + JObject j0 = JObject.Parse("{" + str3.Substring(0, str3.Length - 1) + "}"); + int stationID = int.Parse(j0["StationID"].ToString()); + + bool existFlag = false; + int idx = 0; + + for (int i = 0; i < dtRate.Rows.Count; i++) + { + if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString()) + { + idx = i; + existFlag = true; + break; + } + } + + int okQty = 0, ngQty = 0; + + if (j0["RuleStatus"].ToString() == "P") + { + okQty = int.Parse(j0["FirstCnt"].ToString()); + } + else + { + ngQty = int.Parse(j0["FirstCnt"].ToString()); + } + + if (existFlag) + { + if (okQty > 0) + { + dtRate.Rows[idx][1] = okQty; + } + if (ngQty > 0) + { + dtRate.Rows[idx][2] = ngQty; + } + + dtRate.AcceptChanges(); + } + else + { + DataRow dr = dtRate.NewRow(); + dr[0] = stationID; + dr[1] = okQty; + dr[2] = ngQty; + + dtRate.Rows.Add(dr); + dtRate.AcceptChanges(); + } + } + + if (dtRate.Rows.Count > 0) + { + for (int j = 0; j < dtRate.Rows.Count; j++) + { + int okQty = int.Parse(dtRate.Rows[j][1].ToString()); + int ngQty = int.Parse(dtRate.Rows[j][2].ToString()); + + int inputQty = okQty + ngQty; + + double rate = 0; + if (okQty > 0) + { + rate = (okQty * 1.0 / inputQty) * 100; + } + + if (rate > 0) + { + //sum_rate = sum_rate * (rate / 100.0); + sum_idx = sum_idx + 1; + sum_rate = sum_rate + rate; + } + } + } + result.FPYMedical = double.Parse((sum_rate / sum_idx).ToString("0.00")); + } + #endregion // RMA Board result.RMABoard = 0.01; @@ -607,13 +1560,20 @@ namespace AMESCoreStudio.WebApi.Controllers.BLL result.RMAMedical = 0.03; // CFQR件數 新增筆數 - result.CFQRNew = 100; + //result.CFQRNew = 100; + #region + sReturn_Data = await Get_CFQR_Rate("104", vYear.ToString(), vMonth.ToString(), "103,104,101"); + sData_Ary = sReturn_Data.Split("|"); + result.CFQRNew = int.Parse(sData_Ary[0].ToString()); + #endregion // CFQR件數 結案筆數 - result.CFQRClose = 50; + //result.CFQRClose = 50; + result.CFQRClose = int.Parse(sData_Ary[1].ToString()); // CFQR件數 總筆數 - result.CFQRTotal = 250; + //result.CFQRTotal = 250; + result.CFQRTotal = int.Parse(sData_Ary[2].ToString()); return result; } diff --git a/AMESCoreStudio.WebApi/Models/SMSContext.cs b/AMESCoreStudio.WebApi/Models/SMSContext.cs new file mode 100644 index 00000000..853aef55 --- /dev/null +++ b/AMESCoreStudio.WebApi/Models/SMSContext.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; + +namespace AMESCoreStudio.WebApi +{ + /// + /// + /// + public class SMSContext : DbContext + { + /// + /// + /// + /// + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + IConfiguration _config; + _config = new ConfigurationBuilder().SetBasePath(Environment.CurrentDirectory).AddJsonFile("appsettings.json").Build(); + + optionsBuilder.UseSqlServer(_config.GetConnectionString("SMSContext")); + + base.OnConfiguring(optionsBuilder); + } + } +}