diff --git a/AMESCoreStudio.Web/Controllers/QRSController.cs b/AMESCoreStudio.Web/Controllers/QRSController.cs index 96a52f05..a1d7f75d 100644 --- a/AMESCoreStudio.Web/Controllers/QRSController.cs +++ b/AMESCoreStudio.Web/Controllers/QRSController.cs @@ -1052,5 +1052,159 @@ namespace AMESCoreStudio.Web.Controllers ViewData["RateDataList"] = rateDataList; return View(); } + + public async Task<IActionResult> QRS015() + { + await GetUnitList(); + + ViewBag.StartDate = System.DateTime.Now.AddDays(-7).ToString("yyyy/MM/dd"); + ViewBag.EndDate = System.DateTime.Now.ToString("yyyy/MM/dd"); + + return View(); + } + + public async Task<IActionResult> QRS015AAsync(string modelNO, string itemNO, string wipNO, string dateStart, string dateEnd) + { + ViewData["ParamList"] = modelNO + "_" + itemNO + "_" + wipNO + "_" + dateStart + "_" + dateEnd; + + ViewData["Title"] = "查詢條件 - 工單號碼 : " + wipNO + "; 料號 : " + itemNO + "; 機種 : " + modelNO + "; 檢驗日期 : " + dateStart + " ~ " + dateEnd; + + string ipqcDataList = "<font size='3'>"; + + IResultModel<dynamic> result = await _pcsApi.GetIPQCHeaderData4QRS015(wipNO, itemNO, modelNO, dateStart, dateEnd); + + if (result.DataTotal > 0) + { + ipqcDataList = ipqcDataList + "<table border='1'><tr><td width='160'>周次</td><td>抽驗總筆數</td><td width='160'>通過筆數</td><td width='160'>不良筆數</td><td width='160'>通過率</td></tr>"; + foreach (var item in result.Data) + { + JObject jo = JObject.Parse(item.ToString()); + string ipqc_week = jo["ipqcWeek"].ToString(); + string ipqc_cnt = jo["ipqcCnt"].ToString(); + ipqcDataList = ipqcDataList + "<tr><td width='160'>" + ipqc_week + "</td><td>" + ipqc_cnt + "</td><td width='160'>" + ipqc_cnt + "</td><td width='160'>0</td><td width='160'>100%</td></tr>"; + + } + ipqcDataList = ipqcDataList + "</table>"; + } + + ipqcDataList = ipqcDataList + "</font>"; + ViewData["IPQCDataList"] = ipqcDataList; + return View(); + } + + public async Task<IActionResult> QRS016() + { + await GetUnitList(); + + ViewBag.StartDate = System.DateTime.Now.AddDays(-7).ToString("yyyy-MM-dd"); + ViewBag.EndDate = System.DateTime.Now.ToString("yyyy-MM-dd"); + + return View(); + } + + public IActionResult QRS016B(string id) + { + string[] param = id.Split("_"); + ViewBag.WIP_NO = param[0]; + ViewBag.ITEM_NO = param[1]; + ViewBag.MODEL_NO = param[2]; + ViewBag.START_DATE = param[3]; + ViewBag.END_DATE = param[4]; + ViewBag.WEEK = param[5]; + + return View(); + } + + [HttpPost] + public async Task<JsonResult> GetFQCData4QRS016Async(string id) + { + string[] param = id.Split('_'); + string wip_no = param[0]; + string item_no = param[1]; + string model_no = param[2]; + string start_date = param[3]; + string end_date = param[4]; + + var result = await _pcsApi.GetFQCHeaderData4QRS016(wip_no, item_no, model_no, start_date, end_date); + + var query = new QRS016ViewModel(); + + foreach (var data in result.Data) + { + JObject jo = JObject.Parse(data.ToString()); + + query.FqcDatas.Add(new FqcData + { + WeekCode = jo["fqcWeek"].ToString(), + FqcCnt = int.Parse(jo["fqcCnt"].ToString()), + PassCnt = int.Parse(jo["passCnt"].ToString()), + FailCnt = int.Parse(jo["failCnt"].ToString()), + Rate = int.Parse(jo["passCnt"].ToString()) * 1.0 / int.Parse(jo["fqcCnt"].ToString()) * 100.0 + }); + } + + return Json(query.FqcDatas); + } + + public async Task<IActionResult> QRS016AAsync(string modelNO, string itemNO, string wipNO, string dateStart, string dateEnd) + { + ViewData["ParamList"] = modelNO + "_" + itemNO + "_" + wipNO + "_" + dateStart + "_" + dateEnd; + + ViewData["Title"] = "查詢條件 - 工單號碼 : " + wipNO + "; 料號 : " + itemNO + "; 機種 : " + modelNO + "; 檢驗日期 : " + dateStart + " ~ " + dateEnd; + + string fqcDataList = "<font size='3'>"; + + IResultModel<dynamic> result = await _pcsApi.GetFQCHeaderData4QRS016(wipNO, itemNO, modelNO, dateStart, dateEnd); + + if (result.DataTotal > 0) + { + fqcDataList = fqcDataList + "<table border='1' width='100%'><tr><td width='80' style='text-align:center'>周次</td><td style='text-align:center'>抽驗總筆數</td><td width='200' style='text-align:center'>通過筆數</td><td width='200' style='text-align:center'>不良筆數</td><td width='160' style='text-align:center'>通過率</td></tr>"; + int sumFqcCnt = 0, sumPassCnt = 0, sumFailCnt = 0; + foreach (var item in result.Data) + { + JObject jo = JObject.Parse(item.ToString()); + string fqc_week = jo["fqcWeek"].ToString(); + int fqc_cnt = int.Parse(jo["fqcCnt"].ToString()); + int pass_cnt = int.Parse(jo["passCnt"].ToString()); + int fail_cnt = int.Parse(jo["failCnt"].ToString()); + double fqc_rate = pass_cnt * 100.0 / fqc_cnt; + + fqcDataList = fqcDataList + "<tr><td width='80'style='text-align:center'>" + fqc_week + "</td><td><a href =\"javascript:hg.open('FQC明細資料','/QRS/QRS016B/" + wipNO + "_" + itemNO + "_" + modelNO + "_" + dateStart + "_" + dateEnd + "_" + fqc_week + "',1000,600);\">" + " " + fqc_cnt + "</a></td><td width='200' style='color:green'>" + " " + pass_cnt + "</td><td width='200' style='color:red'>" + " " + fail_cnt + "</td><td width='160'>" + " " + fqc_rate.ToString("0.00") + "%</td></tr>"; + + sumFqcCnt = sumFqcCnt + fqc_cnt; + sumPassCnt = sumPassCnt + pass_cnt; + sumFailCnt = sumFailCnt + fail_cnt; + } + double sum_fqc_rate = sumPassCnt * 100.0 / sumFqcCnt; + fqcDataList = fqcDataList + "<tr><td width='80'style='text-align:center'>" + " " + "Total" + "</td><td>" + " " + sumFqcCnt + "</td><td width='200' style='color:green'>" + " " + sumPassCnt + "</td><td width='200' style='color:red'>" + " " + sumFailCnt + "</td><td width='160'>" + " " + sum_fqc_rate.ToString("0.00") + "%</td></tr>"; + fqcDataList = fqcDataList + "</table>"; + } + + fqcDataList = fqcDataList + "</font>"; + ViewData["FQCDataList"] = fqcDataList; + return View(); + } + + [ResponseCache(Duration = 0)] + [HttpGet] + public async Task<IActionResult> GetFQCDetailData(string id, int page = 0, int limit = 10) + { + string[] param = id.Split("_"); + string wip_no = param[0]; + string item_no = param[1]; + string model_no = param[2]; + string start_date = param[3]; + string end_date = param[4]; + string week = param[5]; + + var result = await _pcsApi.GetFQCDetailData(wip_no, item_no, model_no, start_date, end_date, week, page, limit); + + if (result.DataTotal > 0) + { + return Json(new Table() { code = 0, msg = "", data = result.Data, count = result.DataTotal }); + } + + return Json(new Table() { count = 0, data = null }); + } } } diff --git a/AMESCoreStudio.Web/HttpApis/AMES/IPCS.cs b/AMESCoreStudio.Web/HttpApis/AMES/IPCS.cs index ada26b1c..42d5602a 100644 --- a/AMESCoreStudio.Web/HttpApis/AMES/IPCS.cs +++ b/AMESCoreStudio.Web/HttpApis/AMES/IPCS.cs @@ -1068,6 +1068,35 @@ namespace AMESCoreStudio.Web #endregion + #region QRS015 IPQC查詢報表 + + /// <summary> + /// IPQC查詢報表 + /// </summary> + /// <returns></returns> + [WebApiClient.Attributes.HttpGet("api/InspectionResultMasters/GetIPQCHeaderData4QRS015")] + ITask<ResultModel<dynamic>> GetIPQCHeaderData4QRS015(string wipNO, string itemNO, string modelNO, string dateStart, string dateEnd); + + #endregion + + #region QRS016 FQC查詢報表 + + /// <summary> + /// FQC查詢報表 + /// </summary> + /// <returns></returns> + [WebApiClient.Attributes.HttpGet("api/FqcResultMaster/GetFQCHeaderData4QRS016")] + ITask<ResultModel<dynamic>> GetFQCHeaderData4QRS016(string wipNO, string itemNO, string modelNO, string dateStart, string dateEnd); + + /// <summary> + /// 查詢FQC明細資料 + /// </summary> + /// <returns></returns> + [WebApiClient.Attributes.HttpGet("api/FqcResultMaster/GetFQCDetailData")] + ITask<ResultModel<dynamic>> GetFQCDetailData(string wipNO, string itemNO, string modelNO, string dateStart, string dateEnd, string weekCode, int page, int limit); + + #endregion + #region PDS003 查詢工單基本資料 /// <summary> diff --git a/AMESCoreStudio.Web/ViewModels/QRS/QRS016ViewModel.cs b/AMESCoreStudio.Web/ViewModels/QRS/QRS016ViewModel.cs new file mode 100644 index 00000000..d7c11b53 --- /dev/null +++ b/AMESCoreStudio.Web/ViewModels/QRS/QRS016ViewModel.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace AMESCoreStudio.Web.ViewModels.QRS +{ + public class QRS016ViewModel + { + public QRS016ViewModel() + { + FqcDatas = new List<FqcData>(); + } + + public List<FqcData> FqcDatas { get; set; } + } + + public class FqcData + { + /// <summary> + /// 周次 + /// </summary> + public string WeekCode { get; set; } + + /// <summary> + /// 抽檢總筆數 + /// </summary> + public int FqcCnt { get; set; } + + /// <summary> + /// 通過筆數 + /// </summary> + public int PassCnt { get; set; } + + /// <summary> + /// 不良筆數 + /// </summary> + public int FailCnt { get; set; } + + /// <summary> + /// 通過率 + /// </summary> + public double Rate { get; set; } + } +} diff --git a/AMESCoreStudio.Web/Views/QRS/QRS015.cshtml b/AMESCoreStudio.Web/Views/QRS/QRS015.cshtml new file mode 100644 index 00000000..bf3905f5 --- /dev/null +++ b/AMESCoreStudio.Web/Views/QRS/QRS015.cshtml @@ -0,0 +1,99 @@ +@{ + ViewData["Title"] = "IPQC查詢報表"; + Layout = "~/Views/Shared/_AMESLayout.cshtml"; +} + +<div class="layui-card"> + <div class="layui-card-header"> + <div class="layui-form"> + <div class="layui-form-item "> + <div class="layui-inline"><i class="fa fa-file-text-o fa-fw"></i> @ViewBag.Title</div> + </div> + + </div> + </div> + <div class="layui-form"> + <div class="layui-row"> + <div class="layui-form-item"> + <div class="layui-col-sm3"> + <div class="layui-inline"> + <label class="layui-form-label">工單號碼:</label> + <div class="layui-input-inline" style="width:160px"> + <input id="wipNO" name="wipNo" autocomplete="off" class="layui-input" placeholder="請輸入工單號碼"> + </div> + </div> + </div> + <div class="layui-col-sm3"> + <div class="layui-inline"> + <label class="layui-form-label">料號:</label> + <div class="layui-input-inline" style="width:160px"> + <input id="itemNO" name="itemNo" autocomplete="off" class="layui-input" placeholder="請輸入料號"> + </div> + </div> + </div> + <div class="layui-col-sm3"> + <div class="layui-inline"> + <label class="layui-form-label">機種:</label> + <div class="layui-input-inline" style="width:160px"> + <input id="modelNO" name="modelNo" autocomplete="off" class="layui-input" placeholder="請輸入機種"> + </div> + </div> + </div> + <div class="layui-col-sm8"> + <div class="layui-inline"> + <label class="layui-form-label">檢驗日期:</label> + <div class="layui-input-inline" style="width:160px"> + <input id="dateStart" name="dateStart" autocomplete="off" class="layui-input" value="@ViewBag.StartDate"> + </div> + <div class="layui-form-mid">~</div> + <div class="layui-input-inline" style="width:160px"> + <input id="dateEnd" name="dateEnd" autocomplete="off" class="layui-input" value="@ViewBag.EndDate"> + </div> + </div> + </div> + <div class="layui-col-sm1"> + <div class="layui-inline layui-show-xs-block"> + <button class="layui-btn layui-btn-sm layui-btn-normal" lay-submit onclick="result()" lay-filter="querysubmit"> + <i class="layui-icon layui-icon-sm"></i> + </button> + </div> + </div> + </div> + </div> + </div> +</div> +@section Scripts{ + @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); + await Html.RenderPartialAsync("_FileinputScriptsPartial"); } + <script type="text/javascript"> + layui.use(['form', 'layer', 'laydate'], function () { + var form = layui.form; + laydate = layui.laydate; + laydate.render({ + elem: '#dateStart' + , trigger: 'click' + , format: 'yyyy/MM/dd' + , theme: 'grid' + }); + + laydate.render({ + elem: '#dateEnd' + , trigger: 'click' + , format: 'yyyy/MM/dd' + , theme: 'grid' + }); + }); + + function result() { + var modelNO = $("#modelNO").val(); + var itemNO = $("#itemNO").val(); + var wipNO = $("#wipNO").val(); + var dateStart = $("#dateStart").val(); + var dateEnd = $("#dateEnd").val(); + + var query = "?modelNO=" + modelNO + "&itemNO=" + itemNO + "&wipNO=" + wipNO + "&dateStart=" + dateStart + "&dateEnd=" + dateEnd; + hg.open('IPQC查詢報表', '/QRS/QRS015A' + query, '', '', true); + + }; + </script> +} \ No newline at end of file diff --git a/AMESCoreStudio.Web/Views/QRS/QRS015A.cshtml b/AMESCoreStudio.Web/Views/QRS/QRS015A.cshtml new file mode 100644 index 00000000..aef3e29f --- /dev/null +++ b/AMESCoreStudio.Web/Views/QRS/QRS015A.cshtml @@ -0,0 +1,36 @@ +@{ + Layout = "~/Views/Shared/_AMESLayout.cshtml"; +} + +<script src="~/Highcharts-7.1.2/highcharts.js"></script> +<script src="~/Highcharts-7.1.2/modules/exporting.js"></script> +<script src="~/Highcharts-7.1.2/modules/export-data.js"></script> + +<div class="layui-card"> + <div class="layui-card-header"> + <div class="layui-form"> + <div class="layui-form-item "> + <div class="layui-inline"><i class="fa fa-file-text-o fa-fw"></i> @ViewBag.Title</div> + </div> + + </div> + </div> + <div class="layui-card-body"> + <input type="hidden" id="param_list" value="@ViewData["ParamList"]" /> + @Html.Raw(ViewData["IPQCDataList"]) + </div> +</div> + +@section Scripts { + @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); + await Html.RenderPartialAsync("_FileinputScriptsPartial"); } + + <script type="text/javascript"> + $(document).ready(function () { + + }); + + </script> + + +} \ No newline at end of file diff --git a/AMESCoreStudio.Web/Views/QRS/QRS016.cshtml b/AMESCoreStudio.Web/Views/QRS/QRS016.cshtml new file mode 100644 index 00000000..4b323e8b --- /dev/null +++ b/AMESCoreStudio.Web/Views/QRS/QRS016.cshtml @@ -0,0 +1,99 @@ +@{ + ViewData["Title"] = "FQC查詢報表"; + Layout = "~/Views/Shared/_AMESLayout.cshtml"; +} + +<div class="layui-card"> + <div class="layui-card-header"> + <div class="layui-form"> + <div class="layui-form-item "> + <div class="layui-inline"><i class="fa fa-file-text-o fa-fw"></i> @ViewBag.Title</div> + </div> + + </div> + </div> + <div class="layui-form"> + <div class="layui-row"> + <div class="layui-form-item"> + <div class="layui-col-sm3"> + <div class="layui-inline"> + <label class="layui-form-label">工單號碼:</label> + <div class="layui-input-inline" style="width:160px"> + <input id="wipNO" name="wipNo" autocomplete="off" class="layui-input" placeholder="請輸入工單號碼"> + </div> + </div> + </div> + <div class="layui-col-sm3"> + <div class="layui-inline"> + <label class="layui-form-label">料號:</label> + <div class="layui-input-inline" style="width:160px"> + <input id="itemNO" name="itemNo" autocomplete="off" class="layui-input" placeholder="請輸入料號"> + </div> + </div> + </div> + <div class="layui-col-sm3"> + <div class="layui-inline"> + <label class="layui-form-label">機種:</label> + <div class="layui-input-inline" style="width:160px"> + <input id="modelNO" name="modelNo" autocomplete="off" class="layui-input" placeholder="請輸入機種"> + </div> + </div> + </div> + <div class="layui-col-sm8"> + <div class="layui-inline"> + <label class="layui-form-label">檢驗日期:</label> + <div class="layui-input-inline" style="width:160px"> + <input id="dateStart" name="dateStart" autocomplete="off" class="layui-input" value="@ViewBag.StartDate"> + </div> + <div class="layui-form-mid">~</div> + <div class="layui-input-inline" style="width:160px"> + <input id="dateEnd" name="dateEnd" autocomplete="off" class="layui-input" value="@ViewBag.EndDate"> + </div> + </div> + </div> + <div class="layui-col-sm1"> + <div class="layui-inline layui-show-xs-block"> + <button class="layui-btn layui-btn-sm layui-btn-normal" lay-submit onclick="result()" lay-filter="querysubmit"> + <i class="layui-icon layui-icon-sm"></i> + </button> + </div> + </div> + </div> + </div> + </div> +</div> +@section Scripts{ + @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); + await Html.RenderPartialAsync("_FileinputScriptsPartial"); } + <script type="text/javascript"> + layui.use(['form', 'layer', 'laydate'], function () { + var form = layui.form; + laydate = layui.laydate; + laydate.render({ + elem: '#dateStart' + , trigger: 'click' + , format: 'yyyy-MM-dd' + , theme: 'grid' + }); + + laydate.render({ + elem: '#dateEnd' + , trigger: 'click' + , format: 'yyyy-MM-dd' + , theme: 'grid' + }); + }); + + function result() { + var modelNO = $("#modelNO").val(); + var itemNO = $("#itemNO").val(); + var wipNO = $("#wipNO").val(); + var dateStart = $("#dateStart").val(); + var dateEnd = $("#dateEnd").val(); + + var query = "?modelNO=" + modelNO + "&itemNO=" + itemNO + "&wipNO=" + wipNO + "&dateStart=" + dateStart + "&dateEnd=" + dateEnd; + hg.open('FQC查詢報表', '/QRS/QRS016A' + query, '', '', true); + + }; + </script> +} \ No newline at end of file diff --git a/AMESCoreStudio.Web/Views/QRS/QRS016A.cshtml b/AMESCoreStudio.Web/Views/QRS/QRS016A.cshtml new file mode 100644 index 00000000..00c22249 --- /dev/null +++ b/AMESCoreStudio.Web/Views/QRS/QRS016A.cshtml @@ -0,0 +1,91 @@ +@{ + Layout = "~/Views/Shared/_AMESLayout.cshtml"; +} + +<script src="~/Highcharts-7.1.2/highcharts.js"></script> +<script src="~/Highcharts-7.1.2/modules/exporting.js"></script> +<script src="~/Highcharts-7.1.2/modules/export-data.js"></script> + +<div class="layui-card"> + <div class="layui-card-header"> + <div class="layui-form"> + <div class="layui-form-item "> + <div class="layui-inline"><i class="fa fa-file-text-o fa-fw"></i> @ViewBag.Title</div> + </div> + + </div> + </div> + <div class="layui-card-body"> + <input type="hidden" id="param_list" value="@ViewData["ParamList"]" /> + <div id="divChart" style="width: 100%; height: 400px; margin: 0 auto"></div> + @Html.Raw(ViewData["FQCDataList"]) + </div> +</div> + +@section Scripts { + @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); + await Html.RenderPartialAsync("_FileinputScriptsPartial"); } + + <script type="text/javascript"> + $(document).ready(function () { + $.ajax({ + type: "Post", + url: '/QRS/GetFQCData4QRS016?id=' + param_list.value, + contentType: "application/json; charset=utf-8", + dataType: 'json', + success: function (response) { + var idx = 0; + var xAxisData = new Array(); + var yieldData = new Array(); + $.each(response, function (i, item) { + yieldData[idx] = item["rate"]; + xAxisData[idx] = item["weekCode"]; + idx = idx + 1; + }); + + Highcharts.chart('divChart', { + title: { + text: 'FQC通過率圖表' + }, + subtitle: { + text: '' + }, + xAxis: { + categories: xAxisData + }, + yAxis: { + title: { + text: '通過率' + } + }, + plotOptions: { + line: { + dataLabels: { + enabled: true + }, + enableMouseTracking: false + } + }, + series: [{ + type: 'column', + name: '周次', + data: yieldData + }, + { + type: 'line', + name: '周次', + data: yieldData + }] + }); + }, + error: function () { + alert("查無FQC資料!"); + $("#divChart").empty(); + } + }); + }); + + </script> + + +} \ No newline at end of file diff --git a/AMESCoreStudio.Web/Views/QRS/QRS016B.cshtml b/AMESCoreStudio.Web/Views/QRS/QRS016B.cshtml new file mode 100644 index 00000000..b422ea15 --- /dev/null +++ b/AMESCoreStudio.Web/Views/QRS/QRS016B.cshtml @@ -0,0 +1,79 @@ +@{ + ViewData["Title"] = "FQC查詢報表 - FQC明細資料"; + Layout = "~/Views/Shared/_AMESLayout.cshtml"; +} + +<div class="layui-card"> + <div class="layui-card-body"> + <input id="wip_no" name="wip_no" value="@ViewBag.WIP_NO" type="hidden" /> + <input id="item_no" name="item_no" value="@ViewBag.ITEM_NO" type="hidden" /> + <input id="model_no" name="model_no" value="@ViewBag.MODEL_NO" type="hidden" /> + <input id="start_date" name="start_date" value="@ViewBag.START_DATE" type="hidden" /> + <input id="end_date" name="end_date" value="@ViewBag.END_DATE" type="hidden" /> + <input id="week" name="week" value="@ViewBag.WEEK" type="hidden" /> + <table class="layui-hide" id="test" lay-filter="test"></table> + </div> +</div> + +@section Scripts{ +<script type="text/javascript"> + //监听表单提交事件 + hg.form.onsubmit('querysubmit', function (data) { + table && table.reload(data); + }); + var tableCols = [[ + { + field: 'inhouseNo', + width: 130, + title: 'FQC單號', + sort: true + }, + { + field: 'wipNo', + width: 100, + title: '工單' + }, + { + field: 'modelNo', + width: 100, + title: '機種' + }, + { + field: 'itemNo', + width: 150, + title: '料號' + }, + { + field: 'lotQty', + width: 70, + title: '送檢數' + }, + { + field: 'qaResult', + width: 60, + title: '結果', + templet: function (d) { + if (d.qaResult == 'P') + return '允收' + if (d.qaResult == 'R') + return '批退' + if (d.qaResult == 'A') + return '初始' + } + }, + { + field: 'specialPo', + title: '特採單號' + }, + { + field: 'createDate', + title: '開單日', + width: 90, + templet: '<div>{{ layui.util.toDateString(d.inputDate, "yyyy/MM/dd") }}</div>' + }] + ]; + + //基本数据表格 + var table = hg.table.datatable('test', 'FQC明細資料', '/QRS/GetFQCDetailData/' + wip_no.value + '_' + item_no.value + '_' + model_no.value + '_' + start_date.value + '_' + end_date.value + '_' + week.value, {}, tableCols, toolbar, true, 'full-100', ['filter', 'print', 'exports']); +</script> +} \ No newline at end of file diff --git a/AMESCoreStudio.WebApi/Controllers/AMES/FqcResultMasterController.cs b/AMESCoreStudio.WebApi/Controllers/AMES/FqcResultMasterController.cs index f75fb875..28a46f12 100644 --- a/AMESCoreStudio.WebApi/Controllers/AMES/FqcResultMasterController.cs +++ b/AMESCoreStudio.WebApi/Controllers/AMES/FqcResultMasterController.cs @@ -61,6 +61,144 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES return fqcResultMaster; } + /// <summary> + /// FQC查詢報表QRS016 + /// </summary> + /// <returns></returns> + [Route("[action]")] + [HttpGet] + public async Task<ResultModel<dynamic>> GetFQCHeaderData4QRS016(string wipNO, string itemNO, string modelNO, string dateStart, string dateEnd) + { + ResultModel<dynamic> result = new ResultModel<dynamic>(); + var q = from q1 in _context.FqcResultMasters + join q2 in _context.CalendarTables on q1.CreateDate.Date equals q2.TimeID + select new + { + q1.FqcID, + q1.CreateDate, + q1.WipNo, + q1.ItemNo, + q1.ModelNo, + q1.QaQty, + q1.PassQty, + q1.FailQty, + q2.WeekOfYear + }; + + if (wipNO != null && wipNO != "") + { + q = q.Where(w => w.WipNo == wipNO); + } + if (itemNO != null && itemNO != "") + { + q = q.Where(w => w.ItemNo == itemNO); + } + if (modelNO != null && modelNO != "") + { + q = q.Where(w => w.ModelNo == modelNO); + } + if (dateStart != null && dateStart != "" && dateEnd != null && dateEnd != "") + { + q = q.Where(w => w.CreateDate >= DateTime.Parse(dateStart) && w.CreateDate <= DateTime.Parse(dateEnd)); + } + + q = q.OrderBy(w => w.CreateDate); + + //EF.Functions + var g = q.GroupBy(x => new { x.WeekOfYear }).Select(x => new + { + FQCWeek = x.Key.WeekOfYear, + //FQCCnt = x.Count(), + FQCCnt = x.Sum(i => i.QaQty), + PassCnt = x.Sum(i => i.PassQty), + FailCnt = x.Sum(i => i.FailQty) + }); + + //紀錄筆數 + result.DataTotal = g.Count(); + + result.Data = await g.ToListAsync(); + + if (result == null) + { + result.Msg = "查無資料"; + result.Success = false; + return result; + } + + result.Success = true; + result.Msg = "OK"; + return result; + } + + /// <summary> + /// 查詢FQC明細資料 + /// </summary> + /// <returns></returns> + [Route("[action]")] + [HttpGet] + public async Task<ResultModel<dynamic>> GetFQCDetailData(string wipNO, string itemNO, string modelNO, string dateStart, string dateEnd, string weekCode, int page = 0, int limit = 10) + { + ResultModel<dynamic> result = new ResultModel<dynamic>(); + var q = from q1 in _context.FqcResultMasters + join q2 in _context.CalendarTables on q1.CreateDate.Date equals q2.TimeID + select new + { + q1.InhouseNo, + q1.WipNo, + q1.ModelNo, + q1.ItemNo, + q1.LotQty, + q1.QaResult, + q1.SpecialPo, + q1.CreateDate, + q2.WeekOfYear + }; + + if (wipNO != null && wipNO != "") + { + q = q.Where(w => w.WipNo == wipNO); + } + if (itemNO != null && itemNO != "") + { + q = q.Where(w => w.ItemNo == itemNO); + } + if (modelNO != null && modelNO != "") + { + q = q.Where(w => w.ModelNo == modelNO); + } + if (dateStart != null && dateStart != "" && dateEnd != null && dateEnd != "") + { + q = q.Where(w => w.CreateDate >= DateTime.Parse(dateStart) && w.CreateDate <= DateTime.Parse(dateEnd)); + } + if (weekCode != null && weekCode != "") + { + q = q.Where(w => w.WeekOfYear == int.Parse(weekCode)); + } + + //紀錄筆數 + result.DataTotal = q.Count(); + + //Table 頁數 + if (page > 0) + { + q = q.Skip((page - 1) * limit).Take(limit); + } + + result.Data = await q.ToListAsync(); + + if (result == null) + { + result.Msg = "查無資料"; + result.Success = false; + return result; + } + + result.Success = true; + result.Msg = "OK"; + return result; + } + /// <summary> /// 更新FQC檢驗單結果 /// </summary> diff --git a/AMESCoreStudio.WebApi/Controllers/AMES/InspectionResultMastersController.cs b/AMESCoreStudio.WebApi/Controllers/AMES/InspectionResultMastersController.cs index e6ca68df..f58e9ab5 100644 --- a/AMESCoreStudio.WebApi/Controllers/AMES/InspectionResultMastersController.cs +++ b/AMESCoreStudio.WebApi/Controllers/AMES/InspectionResultMastersController.cs @@ -128,6 +128,70 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES return InspectionResultMaster; } + /// <summary> + /// IPQC查詢報表QRS015 + /// </summary> + /// <returns></returns> + [Route("[action]")] + [HttpGet] + public async Task<ResultModel<dynamic>> GetIPQCHeaderData4QRS015(string wipNO, string itemNO, string modelNO, string dateStart, string dateEnd) + { + ResultModel<dynamic> result = new ResultModel<dynamic>(); + var q = from q1 in _context.InspectionResultMasters + join q2 in _context.WipAtts on q1.WipNo equals q2.WipNO + select new + { + q1.InspectionFormID, + q1.CreateDate, + q1.WipNo, + q2.ItemNO, + q2.ModelNO, + IPQCWeek = _context.DatePart("week", q1.CreateDate) + }; + + if (wipNO != null && wipNO != "") + { + q = q.Where(w => w.WipNo == wipNO); + } + if (itemNO != null && itemNO != "") + { + q = q.Where(w => w.ItemNO == itemNO); + } + if (modelNO != "*") + { + q = q.Where(w => w.ModelNO == modelNO); + } + if (dateStart != null && dateStart != "" && dateEnd != null && dateEnd != "") + { + q = q.Where(w => w.CreateDate >= DateTime.Parse(dateStart) && w.CreateDate <= DateTime.Parse(dateEnd)); + } + + q = q.OrderBy(w => w.CreateDate); + + //EF.Functions + var g = q.GroupBy(x => new { x.IPQCWeek }).Select(x => new + { + IPQCWeek = x.Key.IPQCWeek, + IPQCCnt = x.Count() + }); + + //紀錄筆數 + result.DataTotal = g.Count(); + + result.Data = await g.ToListAsync(); + + if (result == null) + { + result.Msg = "查無資料"; + result.Success = false; + return result; + } + + result.Success = true; + result.Msg = "OK"; + return result; + } + /// <summary> /// 用FormID获取该巡檢結果资料 /// </summary> diff --git a/AMESCoreStudio.WebApi/Models/AMESContext.cs b/AMESCoreStudio.WebApi/Models/AMESContext.cs index ab3c6e3d..87479a7b 100644 --- a/AMESCoreStudio.WebApi/Models/AMESContext.cs +++ b/AMESCoreStudio.WebApi/Models/AMESContext.cs @@ -7,6 +7,9 @@ using AMESCoreStudio.WebApi; using AMESCoreStudio.WebApi.Models.SYS; using AMESCoreStudio.WebApi.Models.AMES; using AMESCoreStudio.WebApi.Models.BAS; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Query.SqlExpressions; +using System.Reflection; namespace AMESCoreStudio.WebApi { @@ -25,12 +28,40 @@ namespace AMESCoreStudio.WebApi //Configuration.ProxyCreationEnabled = false; } + /// <summary> + /// + /// </summary> + /// <param name="datePartArg"></param> + /// <param name="date"></param> + /// <returns></returns> + public int? DatePart(string datePartArg, DateTimeOffset? date) => throw new InvalidOperationException($"{nameof(DatePart)} cannot be called client side."); + + /// <summary> /// /// </summary> /// <param name="modelBuilder"></param> protected override void OnModelCreating(ModelBuilder modelBuilder) { + var methodInfo = typeof(DbFunctionExtensions).GetMethod(nameof(DatePart)); + + var datePartMethodInfo = typeof(AMESContext) + .GetRuntimeMethod(nameof(AMESContext.DatePart), new[] { typeof(string), typeof(DateTimeOffset) }); + modelBuilder.HasDbFunction(datePartMethodInfo) + .HasTranslation(args => + new SqlFunctionExpression("DatePart", + new[] + { + new SqlFragmentExpression((args.ToArray()[0] as SqlConstantExpression).Value.ToString()), + args.ToArray()[1] + }, + true, + new[] { false, false }, + typeof(int?), + null + ) + ); + /* modelBuilder.Entity<RoleModule>() .HasOne(m => m.Module);