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);\">" + "&nbsp;&nbsp;" + fqc_cnt + "</a></td><td width='200' style='color:green'>" + "&nbsp;&nbsp;" + pass_cnt + "</td><td width='200' style='color:red'>" + "&nbsp;&nbsp;" + fail_cnt + "</td><td width='160'>" + "&nbsp;&nbsp;" + 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>" + "&nbsp;&nbsp;" + sumFqcCnt + "</td><td width='200' style='color:green'>" + "&nbsp;&nbsp;" + sumPassCnt + "</td><td width='200' style='color:red'>" + "&nbsp;&nbsp;" + sumFailCnt + "</td><td width='160'>" + "&nbsp;&nbsp;" + 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">&#xe615;</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">&#xe615;</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);