diff --git a/AMESCoreStudio.Web/Controllers/PCSController.cs b/AMESCoreStudio.Web/Controllers/PCSController.cs index 2d5ab495..02fc0ca7 100644 --- a/AMESCoreStudio.Web/Controllers/PCSController.cs +++ b/AMESCoreStudio.Web/Controllers/PCSController.cs @@ -4664,7 +4664,7 @@ namespace AMESCoreStudio.Web.Controllers // 工單資料 var result_barcodestation = await _pcsApi.GetBarcodeStationByBarCodeID(result_barcodeinfo.BarcodeID); - foreach (var wipID in result_barcodestation.Select(s => s.WipID).Distinct()) + foreach (var wipID in result_barcodestation.OrderBy(o => o.CreateDate).Select(s => s.WipID).Distinct()) { var result_wipinfo = await _pcsApi.GetWipInfo(wipID); foreach (var wipinfo in result_wipinfo) @@ -9376,6 +9376,8 @@ namespace AMESCoreStudio.Web.Controllers model.LotNum = result1.Select(s => s.LotNum).FirstOrDefault(); model.SnNum = StartNO - 1; model.UpdateDate = System.DateTime.Now; + model.DNum = result1.Select(s => s.DNum).FirstOrDefault(); + model.MCode = result1.Select(s => s.MCode).FirstOrDefault(); var resultPut = await _pcsApi.PutSerialRuleDetail(result1.Select(s => s.SerialRuleDetailID).FirstOrDefault(), JsonConvert.SerializeObject(model)); @@ -9383,7 +9385,7 @@ namespace AMESCoreStudio.Web.Controllers if (result1.Where(w => w.ItemNo.StartsWith("OTHER")).Count() == 0) { var AllSerialRule = await _pcsApi.GetSerialRuleDetailbyPCS040(result1.Select(s => s.SerialRuleDetailID).FirstOrDefault()); - AllSerialRule = AllSerialRule.Where(w => w.YNum == model.YNum && w.MNum == model.MNum && w.WNum == model.WNum && w.LotNum == model.LotNum).ToList(); + AllSerialRule = AllSerialRule.Where(w => w.YNum == model.YNum && w.MNum == model.MNum && w.WNum == model.WNum && w.LotNum == model.LotNum && w.MCode == model.MCode && w.DNum == model.DNum).ToList(); foreach (var item in AllSerialRule) { model.SerialRuleDetailID = item.SerialRuleDetailID; @@ -9395,6 +9397,8 @@ namespace AMESCoreStudio.Web.Controllers model.LotNum = item.LotNum; model.SnNum = StartNO - 1; model.UpdateDate = System.DateTime.Now; + model.DNum = item.DNum; + model.MCode = item.MCode; resultPut = await _pcsApi.PutSerialRuleDetail(result1.Select(s => s.SerialRuleDetailID).FirstOrDefault(), JsonConvert.SerializeObject(model)); } } @@ -9463,6 +9467,14 @@ namespace AMESCoreStudio.Web.Controllers { NewRule = NewRule.Replace("[MM]", "**"); } + if (Rule.Contains("[M]")) + { + NewRule = NewRule.Replace("[M]", "*"); + } + if (Rule.Contains("[DD]")) + { + NewRule = NewRule.Replace("[DD]", "**"); + } if (Rule.Contains("LOT3]")) { NewRule = NewRule.Replace("[LOT3]", "***"); @@ -9664,7 +9676,9 @@ namespace AMESCoreStudio.Web.Controllers WNum = result1.Select(s => s.WNum).FirstOrDefault(), LotNum = result1.Select(s => s.LotNum).FirstOrDefault(), SnNum = InputEndNoQty, - UpdateDate = System.DateTime.Now + UpdateDate = System.DateTime.Now, + DNum = result1.Select(s => s.DNum).FirstOrDefault(), + MCode = result1.Select(s => s.MCode).FirstOrDefault() }; var resultPut = await _pcsApi.PutSerialRuleDetail(result1.Select(s => s.SerialRuleDetailID).FirstOrDefault(), JsonConvert.SerializeObject(model1)); #endregion @@ -9684,7 +9698,9 @@ namespace AMESCoreStudio.Web.Controllers WNum = item.WNum, LotNum = item.LotNum, SnNum = InputEndNoQty, - UpdateDate = System.DateTime.Now + UpdateDate = System.DateTime.Now, + DNum = item.DNum, + MCode = item.MCode }; var resultPut = await _pcsApi.PutSerialRuleDetail(item.SerialRuleDetailID, JsonConvert.SerializeObject(model1)); @@ -9910,6 +9926,14 @@ namespace AMESCoreStudio.Web.Controllers { Rule = Rule.Replace("[MM]", "**"); } + if (Rule.Contains("[M]")) + { + Rule = Rule.Replace("[M]", "*"); + } + if (Rule.Contains("DD]")) + { + Rule = Rule.Replace("[DD]", "**"); + } if (Rule.Contains("LOT3]")) { Rule = Rule.Replace("[LOT3]", "***"); diff --git a/AMESCoreStudio.Web/Controllers/RPTController.cs b/AMESCoreStudio.Web/Controllers/RPTController.cs index 91c2c91e..09576cfb 100644 --- a/AMESCoreStudio.Web/Controllers/RPTController.cs +++ b/AMESCoreStudio.Web/Controllers/RPTController.cs @@ -1,26 +1,21 @@ -using Microsoft.AspNetCore.Mvc; -using AspNetCore.Reporting; -using Microsoft.AspNetCore.Hosting; -using System.Collections.Generic; -using System.Threading.Tasks; -using System; -using System.Data; -using Oracle.EntityFrameworkCore; -using Oracle.ManagedDataAccess.Client; -using AMESCoreStudio.WebApi.Models.BAS; -using AMESCoreStudio.CommonTools.Result; +using AMESCoreStudio.CommonTools.Result; using AMESCoreStudio.Web.Models; -using AMESCoreStudio.WebApi.DTO.AMES; -using DocumentFormat.OpenXml.Math; using AMESCoreStudio.Web.ViewModels.PCS; -using Microsoft.AspNetCore.Http; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; using AMESCoreStudio.Web.ViewModels.RPT; -using AMESCoreStudio.WebApi.Models.AMES; +using AMESCoreStudio.WebApi.DTO.AMES; using AMESCoreStudio.WebApi.Enum; +using AMESCoreStudio.WebApi.Models.AMES; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Rendering; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.Data; using System.Linq; +using System.Threading.Tasks; // For more information on enabling MVC for empty projects, visit http://go.microsoft.com/fwlink/?LinkID=397860 @@ -32,14 +27,16 @@ namespace AMESCoreStudio.Web.Controllers public readonly IRPT _rptApi; public readonly IPCS _pcsApi; public readonly IESUN _esunApi; + public readonly IBAS _basApi; - public RPTController(IWebHostEnvironment environment, IRPT rptApi, IPCS pcsApi, IESUN esunApi) + public RPTController(IWebHostEnvironment environment, IRPT rptApi, IPCS pcsApi, IESUN esunApi, IBAS basApi) { this.environment = environment; System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance); _rptApi = rptApi; _pcsApi = pcsApi; _esunApi = esunApi; + _basApi = basApi; } public async Task RPT001() @@ -49,6 +46,7 @@ namespace AMESCoreStudio.Web.Controllers ViewBag.QueryDate = DateTime.Now.ToString("yyyy/MM"); ViewBag.QueryDate2 = DateTime.Now.ToString("yyyyMM"); + ViewBag.QueryDate3 = DateTime.Now.Year.ToString(); var model = await _rptApi.GetRPT001View(sdate, edate); @@ -62,11 +60,14 @@ namespace AMESCoreStudio.Web.Controllers ViewBag.QueryDate = new DateTime(Data.Year, Data.Month, 1).ToString("yyyy/MM"); ViewBag.QueryDate2 = new DateTime(Data.Year, Data.Month, 1).ToString("yyyyMM"); + ViewBag.QueryDate3 = Data.Year.ToString(); var sDate = new DateTime(Data.Year, Data.Month, 1).ToString("yyyy/MM/dd"); var eDate = new DateTime(Data.Year, Data.Month, DateTime.DaysInMonth(Data.Year, Data.Month)).ToString("yyyy/MM/dd"); var model = await _rptApi.GetRPT001View(sDate, eDate); + ViewBag.Title01 = SerachData.Substring(0, 4) + "生產力"; ; + return View(model); } @@ -1750,6 +1751,47 @@ namespace AMESCoreStudio.Web.Controllers } #endregion + #region RPT004 線頭看板 + + /// + /// 生產單位 + /// + /// true:Add全部選項 + /// + private async Task GetFactoryUnit(bool SelectAll = true) + { + var result = await _basApi.GetFactoryUnits(); + + var FactoryUnit = new List(); + + if (SelectAll) + FactoryUnit.Add(new SelectListItem("全部", "")); + + for (int i = 0; i < result.Count; i++) + { + FactoryUnit.Add(new SelectListItem(result[i].UnitName, result[i].UnitNo.ToString())); + } + + ViewBag.FactoryUnitList = FactoryUnit; + } + + public async Task RPT004() + { + var model = new RPT004ViewDto(); + await GetFactoryUnit(false); + return View(model); + } + + [HttpPost] + public async Task RPT004(RPT004ViewDto model) + { + await GetFactoryUnit(false); + model = await _rptApi.GetRPT004View(model.unitNo, model.lineId); + return View(model); + } + + #endregion + #region RPT005 昶亨工單查詢 public async Task RPT005(string id) @@ -1806,7 +1848,7 @@ namespace AMESCoreStudio.Web.Controllers model.wipBoard = await _esunApi.GetWipBoard(model.wipInfo.WipNO); if (model.wipBoard != null) { - + } model.wipSystem = await _esunApi.GetWipSystem(model.wipInfo.WipNO); diff --git a/AMESCoreStudio.Web/HttpApis/AMES/IRPT.cs b/AMESCoreStudio.Web/HttpApis/AMES/IRPT.cs index dbd3617c..372855f7 100644 --- a/AMESCoreStudio.Web/HttpApis/AMES/IRPT.cs +++ b/AMESCoreStudio.Web/HttpApis/AMES/IRPT.cs @@ -85,5 +85,18 @@ namespace AMESCoreStudio.Web ITask> GetQcRatesQuery(string year = null, string month = null, string qcRateType = null, string productType = null, int page = 0, int limit = 10); #endregion + + #region RPT004 看板資料 + + /// + /// 線頭看板 + /// + /// 生產製程 + /// 線別ID + /// + [WebApiClient.Attributes.HttpGet("api/RPT/GetRPT004View")] + ITask GetRPT004View(string unitNo, int lineId); + + #endregion } } diff --git a/AMESCoreStudio.Web/Views/RPT/RPT001.cshtml b/AMESCoreStudio.Web/Views/RPT/RPT001.cshtml index 20e2d0bb..5877c41f 100644 --- a/AMESCoreStudio.Web/Views/RPT/RPT001.cshtml +++ b/AMESCoreStudio.Web/Views/RPT/RPT001.cshtml @@ -64,6 +64,10 @@ } + + + +
@@ -76,6 +80,8 @@
+ +
@@ -217,7 +223,16 @@
- +
+
+
+
+
+
+
+
+ + @section Scripts { } \ No newline at end of file diff --git a/AMESCoreStudio.Web/Views/RPT/RPT004.cshtml b/AMESCoreStudio.Web/Views/RPT/RPT004.cshtml new file mode 100644 index 00000000..d611b71c --- /dev/null +++ b/AMESCoreStudio.Web/Views/RPT/RPT004.cshtml @@ -0,0 +1,231 @@ +@model AMESCoreStudio.WebApi.DTO.AMES.RPT004ViewDto + +@{ + ViewData["Title"] = "線頭看板"; + Layout = "~/Views/Shared/_AMESLayout.cshtml"; +} + + + +
+ +
+
+
+
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+
+ + +
+
+ + +
+
+
+
+
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+
+
+
+

應投入數量

+ +
+
+
+
+ @Model.requiredQty +

pcs

+
+
+
+
+
+
+
+
+

實際投入數量

+ +
+
+
+
+ @Model.actualQty +

pcs

+
+
+
+
+
+
+
+
+

生產效率

+ +
+
+
+
+ @Model.efficiency +

%

+
+
+
+
+
+
+ +
+@section Scripts { + +} \ No newline at end of file diff --git a/AMESCoreStudio.WebApi/Controllers/AMES/SerialRulesController.cs b/AMESCoreStudio.WebApi/Controllers/AMES/SerialRulesController.cs index 3490f683..9937dc0c 100644 --- a/AMESCoreStudio.WebApi/Controllers/AMES/SerialRulesController.cs +++ b/AMESCoreStudio.WebApi/Controllers/AMES/SerialRulesController.cs @@ -702,7 +702,9 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES q_Detail = _context.SerialRuleDetails; - var q_detail_tmp = q_Detail.Where(w => w.ItemNo == itemNo && w.Rule == serialRuleDetail_NEW.Rule && w.YNum == serialRuleDetail_NEW.YNum && w.MNum == serialRuleDetail_NEW.MNum && w.WNum == serialRuleDetail_NEW.WNum && w.LotNum == serialRuleDetail_NEW.LotNum && w.MCode == serialRuleDetail_NEW.MCode).ToList(); + var q_detail_tmp = q_Detail.Where(w => w.ItemNo == itemNo && w.Rule == serialRuleDetail_NEW.Rule + && w.YNum == serialRuleDetail_NEW.YNum && w.MNum == serialRuleDetail_NEW.MNum && w.WNum == serialRuleDetail_NEW.WNum + && w.LotNum == serialRuleDetail_NEW.LotNum && w.MCode == serialRuleDetail_NEW.MCode && w.DNum == serialRuleDetail_NEW.DNum).ToList(); if (q_detail_tmp.Count == 0) { SerialRuleDetailsController serialRuleDetailsController = new SerialRuleDetailsController(_context); @@ -713,12 +715,16 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES q_Detail = _context.SerialRuleDetails; - var SerialRuleDetail = q_Detail.Where(w => w.ItemNo == itemNo && w.Rule == serialRuleDetail_NEW.Rule && w.YNum == serialRuleDetail_NEW.YNum && w.MNum == serialRuleDetail_NEW.MNum && w.WNum == serialRuleDetail_NEW.WNum && w.LotNum == serialRuleDetail_NEW.LotNum && w.MCode == serialRuleDetail_NEW.MCode).FirstOrDefault(); + var SerialRuleDetail = q_Detail.Where(w => w.ItemNo == itemNo && w.Rule == serialRuleDetail_NEW.Rule + && w.YNum == serialRuleDetail_NEW.YNum && w.MNum == serialRuleDetail_NEW.MNum && w.WNum == serialRuleDetail_NEW.WNum + && w.LotNum == serialRuleDetail_NEW.LotNum && w.MCode == serialRuleDetail_NEW.MCode && w.DNum == serialRuleDetail_NEW.DNum).FirstOrDefault(); SerialRuleDetail.UpdateDate = System.DateTime.Now; //取相同Rule 年、月、周 的所有料號 - var SerialRuleDetail_All = q_Detail.Where(w => w.Rule == serialRuleDetail_NEW.Rule && w.YNum == serialRuleDetail_NEW.YNum && w.MNum == serialRuleDetail_NEW.MNum && w.WNum == serialRuleDetail_NEW.WNum && w.LotNum == serialRuleDetail_NEW.LotNum && w.MCode == serialRuleDetail_NEW.MCode); + var SerialRuleDetail_All = q_Detail.Where(w => w.Rule == serialRuleDetail_NEW.Rule && w.YNum == serialRuleDetail_NEW.YNum && + w.MNum == serialRuleDetail_NEW.MNum && w.WNum == serialRuleDetail_NEW.WNum && w.LotNum == serialRuleDetail_NEW.LotNum && w.MCode == serialRuleDetail_NEW.MCode && w.DNum == serialRuleDetail_NEW.DNum); + if (! itemNo.StartsWith("OTHER")) { diff --git a/AMESCoreStudio.WebApi/Controllers/AMES/SerialRulesDetailController.cs b/AMESCoreStudio.WebApi/Controllers/AMES/SerialRulesDetailController.cs index 25b8d01c..ca647915 100644 --- a/AMESCoreStudio.WebApi/Controllers/AMES/SerialRulesDetailController.cs +++ b/AMESCoreStudio.WebApi/Controllers/AMES/SerialRulesDetailController.cs @@ -78,7 +78,8 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES IQueryable q = _context.SerialRuleDetails; var SerialRuleDetail = await q.Where(p => p.SerialRuleDetailID == id).FirstOrDefaultAsync(); - var SerialRuleDetail_ALL = await q.Where(w => w.Rule == SerialRuleDetail.Rule && w.YNum == SerialRuleDetail.YNum && w.MNum == SerialRuleDetail.MNum && w.WNum == SerialRuleDetail.WNum && w.LotNum == SerialRuleDetail.LotNum).ToListAsync(); + var SerialRuleDetail_ALL = await q.Where(w => w.Rule == SerialRuleDetail.Rule && w.YNum == SerialRuleDetail.YNum && w.MNum == SerialRuleDetail.MNum + && w.WNum == SerialRuleDetail.WNum && w.LotNum == SerialRuleDetail.LotNum && w.DNum == SerialRuleDetail.DNum && w.MCode == SerialRuleDetail.MCode).ToListAsync(); return SerialRuleDetail_ALL; } diff --git a/AMESCoreStudio.WebApi/Controllers/BLL/RPTController.cs b/AMESCoreStudio.WebApi/Controllers/BLL/RPTController.cs index e1ab93bc..a89073f3 100644 --- a/AMESCoreStudio.WebApi/Controllers/BLL/RPTController.cs +++ b/AMESCoreStudio.WebApi/Controllers/BLL/RPTController.cs @@ -12,6 +12,7 @@ using System.Linq; using System.Threading.Tasks; using Dapper; using AMESCoreStudio.WebApi.Extensions; +using AMESCoreStudio.WebApi.Controllers.QASRV; namespace AMESCoreStudio.WebApi.Controllers.BLL { @@ -686,7 +687,7 @@ namespace AMESCoreStudio.WebApi.Controllers.BLL } return 0.0; } - } + } #endregion } @@ -1908,5 +1909,123 @@ namespace AMESCoreStudio.WebApi.Controllers.BLL return result; } + + #region RPT004 線頭看板 + + /// + /// 線頭看板 + /// + /// 生產製程 + /// 線別ID + /// + [HttpGet("GetRPT004View")] + public async Task GetRPT004View(string unitNo, int lineId = 0) + { + var result = new RPT004ViewDto(); + result.lineId = lineId; + result.unitNo = unitNo; + var query = @$" SELECT * + FROM ( SELECT + W.WIP_NO , W.WIP_ID , W.UNIT_NO , W.PLAN_QTY , W.COMPLETE_QTY , + A.ITEM_NO , L.LINE_ID , L.LINE_DESC , S.STATION_NAME , B.STATION_ID , B.INPUT_DATE, + ROW_NUMBER() OVER( PARTITION BY + W.WIP_NO , W.WIP_ID , W.UNIT_NO , W.PLAN_QTY , W.COMPLETE_QTY , + A.ITEM_NO , L.LINE_ID , L.LINE_DESC ORDER BY B.INPUT_DATE ASC) AS RN + FROM JHAMES.LINE_INFO L + INNER JOIN JHAMES.WIP_INFO W ON L.WIP_ID = W.WIP_ID + INNER JOIN JHAMES.WIP_ATT A ON W.WIP_NO = A.WIP_NO + INNER JOIN JHAMES.BARCODE_STATION B ON B.WIP_ID = L.WIP_ID + INNER JOIN JHAMES.STATIONS S ON S.STATION_ID = B.STATION_ID) + WHERE RN = 1 + AND UNIT_NO = :unitNo + AND LINE_ID = :lineId "; + + DynamicParameters p = new DynamicParameters(); + p.Add("unitNo", unitNo); + p.Add("lineId", lineId, DbType.Int32); + + try + { + var q = await _context.Database.DapperQueryAsync(query, p); + if (q.Any()) + { + result.wipNo = q.FirstOrDefault().WIP_NO; + result.product = q.FirstOrDefault().ITEM_NO; + result.wipNoQty = (int)q.FirstOrDefault().PLAN_QTY; + result.cumulativeQty = (int)q.FirstOrDefault().COMPLETE_QTY; + result.lineName = q.FirstOrDefault().LINE_DESC; + result.stationName = q.FirstOrDefault().STATION_NAME; + + var wipId = (int)q.FirstOrDefault().WIP_ID; + var stationId = (int)q.FirstOrDefault().STATION_ID; + + // 取今日投入數量及開工時間 + query = @$" SELECT MIN(INPUT_DATE) INPUT_DATE , COUNT(*) QTY FROM + JHAMES.BARCODE_STATION + WHERE WIP_ID=:wipId + AND STATION_ID=:stationId + AND TRUNC(INPUT_DATE) >= TRUNC(SYSDATE) + --AND TRUNC(INPUT_DATE) >= TRUNC(TO_DATE('2023-08-01', 'YYYY-MM-DD'))"; + + p = new DynamicParameters(); + p.Add("wipId", wipId); + p.Add("stationId", stationId, DbType.Int32); + var q1 = await _context.Database.DapperQueryAsync(query, p); + if (q1.Any(w => w.INPUT_DATE != null)) + { + result.actualQty = (int)q1.FirstOrDefault().QTY; + result.wipNoStrDate = ((DateTime)q1.FirstOrDefault().INPUT_DATE).ToString("yyyy/MM/dd HH:mm:ss"); + + // 實際投入數量 > 累計投入數量 + if (result.actualQty > result.cumulativeQty) + result.actualQty = result.cumulativeQty; + + // 計算作業時間 + DateTime str = Convert.ToDateTime(result.wipNoStrDate); + DateTime end = DateTime.Now; + TimeSpan ts = end.Subtract(str); + var WorkTime = (double)Math.Abs(Math.Round(ts.TotalMinutes, 2)); + + // 中午休息時間 + if (str < Convert.ToDateTime("12:20:00") && Convert.ToDateTime("12:40:00") < end) + WorkTime -= 60; + + // 早上休息時間 + if (str < Convert.ToDateTime("09:52:00") && Convert.ToDateTime("09:53:00") < end) + WorkTime -= 10; + + // 下午休息時間 + if (str < Convert.ToDateTime("14:52:00") && Convert.ToDateTime("14:53:00") < end) + WorkTime -= 10; + + // 計算效率 + var standardWorkTimes = await _context.StandardWorkTimes.Where(w => w.UnitNo == result.unitNo && + w.ItemNo == result.product).FirstOrDefaultAsync(); + if (standardWorkTimes != null) + { + result.workTime = (double)standardWorkTimes.TotalCT; + } + + + // 標準總工時 = 標準工時 * 實際投入數量 + var allWorkTime = result.workTime * result.actualQty; + result.efficiency = Math.Round((allWorkTime / WorkTime * 100), 2); + + result.requiredQty = (int)Math.Round((WorkTime / result.workTime), 0); + + // 標準工時等於0 應投入數改0 + if (result.workTime <= 0) + result.requiredQty = 0; + } + } + } + catch + { + return result; + } + return result; + } + + #endregion } } diff --git a/AMESCoreStudio.WebApi/DTO/AMES/RPT004VIiewDto.cs b/AMESCoreStudio.WebApi/DTO/AMES/RPT004VIiewDto.cs new file mode 100644 index 00000000..2b323b6b --- /dev/null +++ b/AMESCoreStudio.WebApi/DTO/AMES/RPT004VIiewDto.cs @@ -0,0 +1,83 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +#nullable disable + +namespace AMESCoreStudio.WebApi.DTO.AMES +{ + public partial class RPT004ViewDto + { + public RPT004ViewDto() + { + + } + + /// + /// 生產製程 + /// + public string unitNo { get; set; } + + /// + /// 生產線別 + /// + public int lineId { get; set; } = 0; + + /// + /// 生產線別名稱 + /// + public string lineName { get; set; } + + /// + /// 目前站別名稱 + /// + public string stationName { get; set; } + + /// + /// 當前工單 + /// + public string wipNo { get; set; } + + /// + /// 工程編號 + /// + public string product { get; set; } + + /// + /// 計畫產量 + /// + public int wipNoQty { get; set; } = 0; + + /// + /// 開工時間 + /// + public string wipNoStrDate { get; set; } = DateTime.Now.ToString("yyyy/MM/dd HH:mm"); + + /// + /// 標準工時 + /// + public double workTime { get; set; } = 0.0; + + /// + /// 應投入數量 + /// + public int requiredQty { get; set; } = 0; + + /// + /// 實際投入數量(當天) + /// + public int actualQty { get; set; } = 0; + + /// + /// 累計投入數量 + /// + public int cumulativeQty { get; set; } = 0; + + /// + /// 生產效率 + /// + public double efficiency { get; set; } = 0; + + } +}