using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using AMESCoreStudio.CommonTools.Result; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Microsoft.AspNetCore.Mvc.Rendering; using AMESCoreStudio.Web.Models; using AMESCoreStudio.WebApi.Models; using AMESCoreStudio.WebApi.Models.AMES; using DocumentFormat.OpenXml.Drawing.Charts; namespace AMESCoreStudio.Web.Controllers { public class PTDController : Controller { public readonly IPCS _pcsApi; public readonly IKCS _kcsApi; public readonly IBAS _basApi; public readonly ISYS _sysApi; public readonly IPTD _ptdApi; public PTDController(IPCS pcsApi, IKCS kcsApi, IBAS basApi, ISYS sysApi, IPTD ptdApi) { _pcsApi = pcsApi; _kcsApi = kcsApi; _basApi = basApi; _sysApi = sysApi; _ptdApi = ptdApi; } #region "PTD001 DN單查詢" public async Task PTD001() { return View(); } public async Task PTD001AAsync(string dnNo, string lineNo) { ViewData["Title"] = "查詢條件 - 出貨DN單: " + dnNo + " Line No:" + lineNo; if (dnNo == null || lineNo == null) return View(); string kpDataList = "
"; string dataList = ""; try { //組表頭 IResultModel DNDetail = await _ptdApi.GetZDNDetail4PTD001(dnNo, lineNo); if (DNDetail.DataTotal > 0) { dataList = ""; dataList += ""; dataList += "kpDataList"; dataList += "
"; foreach (var item in DNDetail.Data) { JObject jo = JObject.Parse(item.ToString()); JProperty[] jp = jo.Properties().ToArray(); for (int i = 0; i < jp.Length; i++) { switch (i) { case 0: dataList += ""; dataList += ""; break; case 1: dataList += ""; dataList += ""; break; case 2: dataList += ""; dataList += ""; break; case 3: dataList += ""; dataList += ""; break; case 4: dataList += ""; dataList += ""; break; case 5: dataList += ""; dataList += ""; break; case 6: dataList += ""; dataList += ""; break; case 7: dataList += ""; dataList += ""; break; default: break; } } } dataList += "
 DN NO " + jp[i].Value + " Line No " + jp[i].Value + " Product ID " + jp[i].Value + " Ship Qty " + jp[i].Value + "
 Ship To " + jp[i].Value + " Sold To " + jp[i].Value + " Expect Ship Date " + jp[i].Value + " Current Ship Date " + jp[i].Value + "
"; } //組Detail IResultModel result = await _ptdApi.GetDNInfo4PTD001(dnNo, lineNo); if (result.DataTotal > 0) { kpDataList = kpDataList + ""; bool titleFlag = true; foreach (var item in result.Data) { string strStartDate = ""; JObject jo = JObject.Parse(item.ToString()); JProperty[] jp = jo.Properties().ToArray(); if (titleFlag) { kpDataList = kpDataList + ""; for (int i = 0; i < jp.Length; i++) { switch (i) { case 0: kpDataList = kpDataList + ""; break; case 1: kpDataList = kpDataList + ""; break; case 2: kpDataList = kpDataList + ""; break; case 3: kpDataList = kpDataList + ""; break; case 4: kpDataList = kpDataList + ""; break; case 5: strStartDate = ""; break; default: string kp_name = jp[i].Name.Replace("kP_", ""); int kp_idx = kp_name.IndexOf("#"); if (kp_idx > 0) { if (kp_name.StartsWith("MB") && kp_name.IndexOf("MAC") > 0) { string kp_no = kp_name.Replace("#", "_"); var kp_item = await _kcsApi.GetItems(kp_no); if (kp_item.Count > 0) { kpDataList = kpDataList + ""; } else { kpDataList = kpDataList + ""; } } else { string kp_no = kp_name.Substring(0, kp_idx); var kp_item = await _kcsApi.GetItems(kp_no); if (kp_item.Count > 0) { kpDataList = kpDataList + ""; } else { kpDataList = kpDataList + ""; } } } else { var kp_item = await _kcsApi.GetItems(kp_name); if (kp_item.Count > 0) { kpDataList = kpDataList + ""; } else { kpDataList = kpDataList + ""; } } break; } } kpDataList = kpDataList + strStartDate; kpDataList = kpDataList + ""; titleFlag = false; } kpDataList = kpDataList + ""; for (int i = 0; i < jp.Length; i++) { switch (i) { case 0: kpDataList = kpDataList + ""; break; case 1: kpDataList = kpDataList + ""; break; case 2: kpDataList = kpDataList + ""; break; case 3: kpDataList = kpDataList + ""; break; case 4: kpDataList = kpDataList + ""; break; case 5: strStartDate = ""; break; default: kpDataList = kpDataList + ""; break; } } kpDataList = kpDataList + strStartDate; kpDataList = kpDataList + ""; } kpDataList = kpDataList + "
 DNNo MOID Material(料號) 出貨序號 生產序號 StartDate " + kp_item[0].ItemName + " " + kp_no + " " + kp_item[0].ItemName + " " + kp_no + " " + kp_item[0].ItemName + " " + kp_name + "
 " + jp[i].Value + " " + jp[i].Value + " " + jp[i].Value + " " + jp[i].Value + " " + jp[i].Value + " " + jp[i].Value + " " + jp[i].Value + "
"; } else { kpDataList = kpDataList + "查無資料"; } } catch (Exception e1) { kpDataList = kpDataList + "查詢過程超時:" + e1.Message; } kpDataList = kpDataList + "
"; dataList = dataList.Replace("kpDataList", kpDataList); ViewData["list"] = dataList; return View(); } #endregion #region "PTD002 一段式入出庫作業" public async Task PTD002() { var RBU = string.Empty; if (Request.Cookies["_AMESCookie"] != null) { var userID = ""; HttpContext.Request.Cookies.TryGetValue("UserID", out userID); if (userID != null) { var user_info = await _sysApi.GetUserInfo(int.Parse(userID)); var factory_info = await _basApi.GetFactoryInfo(user_info[0].FactoryID); ViewData["RBU"] = factory_info[0].Address; RBU = factory_info[0].Address; } } List RecordTypes = await _ptdApi.GetRecordTypeInfo(); var allRecordType = new[] { "653", "632", "261", "262", "101R", "201", "202", "291", "292", "601", "601DB", "657", "952", "634" }; var filtered = from o in RecordTypes where allRecordType.Contains(o.ID) && o.RBU == RBU select o; RecordTypes = filtered.OrderBy(o => o.ID).ToList(); var SelectListItem = new List(); foreach (WebApi.Models.AMES.RecordTypeInfo RecordType in RecordTypes) { if (!SelectListItem.Any(a => RecordType.ID == a.Value)) SelectListItem.Add(new SelectListItem(RecordType.ID.ToString() + "-" + RecordType.TypeName, RecordType.ID.ToString())); } ViewBag.RecordTypeInfo = RecordTypes; ViewBag.RecordType = SelectListItem; ViewBag.Location = "9000"; ViewBag.WorkCenter = "TWM0"; ViewBag.RecordDate = System.DateTime.Now.ToString("yyyy/MM/dd"); ViewBag.loginNo = await GetLoginNo(); return View(); } [HttpPost] public async Task GetZDNDetailJson(string recordNumber, string lineNo) { var result = await _ptdApi.GetZDNDetail4PTD001(recordNumber, lineNo); //将数据Json化并传到前台视图 return Json(new { data = result }); } [HttpPost] public async Task PTD002_Commit(string data) { var ptd002 = JsonConvert.DeserializeObject(data); var result = await _ptdApi.PostPTD002Commit(data); var item = ptd002.TableData.FirstOrDefault(); var zDNDetail = await _ptdApi.GetGetZDNDetail(item.DnNo, item.LineNo); var zProductTrans = await _ptdApi.GetZProductTrans(recordNumber: item.DnNo, lineNo: item.LineNo); if (zDNDetail.Any() && zProductTrans.Any()) { // DN數量 == 已扣帳數量 if (zDNDetail.FirstOrDefault().shipQty == zProductTrans.Count()) await _ptdApi.PutZDNDetailByIsRecord(item.DnNo, item.LineNo, 1); } //将数据Json化并传到前台视图 return Json(new { data = result }); } [HttpPost] public async Task PTD002_CheckInputData(WebApi.Models.AMES.PTDCheckInputData model) { var inputCheck = await CheckInputData(model); var msg = string.Empty; if (!string.IsNullOrWhiteSpace(inputCheck)) return Json(new Result() { success = false, msg = inputCheck }); // 取RecordType var recordType = await _ptdApi.GetRecordTypeInfo(); var recordTypeFirst = recordType.Where(w => w.ID == model.RecordType).FirstOrDefault(); // 資料收集 var sn = new List(); var addInput = new List(); var msgInput = new List(); var msgInputAlert = new List(); // 序號區間 if (!string.IsNullOrWhiteSpace(model.FrontSN)) { // PCS if (model.StockUnit == "0") { // Begin=End if (model.PcsUnit == "Y") { model.EndSN = model.FrontSN; sn.Add(model.FrontSN); } else { var sequential = model.Sequential; var frontLength = model.FrontSN.Length; // 前綴 var title = model.FrontSN.Substring(0, frontLength - sequential); // EndSn 空白 計算備貨量 if (string.IsNullOrWhiteSpace(model.EndSN)) { // 開始流水號 var frontSequential = int.Parse(model.FrontSN.Substring(frontLength - sequential, sequential)); model.EndSN = $"{title}{(frontSequential + model.StockQty - 1).ToString().PadLeft(sequential, '0')}"; } int startNumber = int.Parse(model.FrontSN.Substring(frontLength - sequential, sequential)); int endNumber = int.Parse(model.EndSN.Substring(frontLength - sequential, sequential)); // 用起訖區間推序號 for (int i = startNumber; i <= endNumber; i++) { string serialNumber = title + i.ToString().PadLeft(sequential, '0'); sn.Add(serialNumber); } } } // BOX else if (model.StockUnit == "1") { // EndSn 空白 計算備貨量 if (string.IsNullOrWhiteSpace(model.EndSN)) { var sequential = model.Sequential; var frontLength = model.FrontSN.Length; // 前綴 var title = model.FrontSN.Substring(0, frontLength - sequential); // 開始流水號 var frontSequential = int.Parse(model.FrontSN.Substring(frontLength - sequential, sequential)); model.EndSN = $"{title}{(frontSequential + model.StockQty - 1).ToString().PadLeft(sequential, '0')}"; } var boxSn = await _ptdApi.GetBarcodeInfoByBoxInterval(model.FrontSN, model.EndSN); foreach (var item in boxSn.Where(w => w.StatusID == -1)) { sn.Add(item.BarcodeNo); } } } // ExcelInput if (!string.IsNullOrWhiteSpace(model.SNData)) { sn.AddRange(model.SNData.Split("\n").ToList()); sn = sn.Where(w => !string.IsNullOrWhiteSpace(w)).ToList(); } // Type是WO的 上一個狀態需要是WI if (recordTypeFirst != null) { // 確認序號狀態 foreach (var item in sn) { // zsnInfo 資料 var zSnInfo = await _ptdApi.GetZSNInfoByNumber(item); if (recordTypeFirst.Status == "WO") { // Record 狀態是WI 的ID var recodeIdBystaus = recordType.Where(w => w.Status == "WI").Select(s => s.ID).ToList(); // 特殊 if (model.RecordType == "633") recodeIdBystaus.Add("631"); // ZsnInfo 符合狀態的序號且料號要一致 if (zSnInfo.Any()) { if (zSnInfo.Any(w => recodeIdBystaus.Contains((string)w.recordTypeID) && w.originalProductID == model.ProductId)) addInput.Add(item); else { msgInputAlert.Add($"{item}(型態或料號不對)"); msgInput.Add(item); } } else { msgInputAlert.Add($"{item}(序號不存在)"); msgInput.Add(item); } } else if (recordTypeFirst.Status == "WI") { // 292 不會有Info資料 if (model.RecordType == "292") { if (zSnInfo.Any()) { msgInput.Add(item); msgInputAlert.Add($"{item}(序號重複)"); } else addInput.Add(item); } // 其他要走特定上一個作業 else { var flowRule = await _ptdApi.GetPtdFlowRules(model.RecordType); if (flowRule.Any()) { var toIDs = flowRule.Select(s => (string)s.toID).ToList(); // ZsnInfo 符合狀態的序號且料號要一致 if (zSnInfo.Any()) { // 653需要確認料號是否一樣 if (recordTypeFirst.ID == "653") { if (zSnInfo.Any(w => toIDs.Contains((string)w.recordTypeID) && w.originalProductID == model.ProductId)) addInput.Add(item); else { msgInputAlert.Add($"{item}(型態或料號不對)"); msgInput.Add(item); } } else { if (zSnInfo.Any(w => toIDs.Contains((string)w.recordTypeID))) addInput.Add(item); else { msgInputAlert.Add($"{item}(型態不對)"); msgInput.Add(item); } } } else { msgInputAlert.Add($"{item}(序號不存在)"); msgInput.Add(item); } } } } } } addInput = addInput.Except(msgInput.Distinct()).ToList(); var datas = new List(); // add foreach (var item in addInput) { var newRowData = new { dnNo = model.RecordNumber, lineNo = model.LineNo, material = model.ProductId, sn = item }; datas.Add(newRowData); } if (msgInputAlert.Any()) msg = "新增失敗:" + string.Join("、", msgInputAlert.Distinct()); return Json(new Result() { success = true, msg = msg, data = datas }); } /// /// 確認輸入資料是否正確 /// /// /// public async Task CheckInputData(WebApi.Models.AMES.PTDCheckInputData model) { // RecordNumber if (string.IsNullOrWhiteSpace(model.RecordNumber)) return "請輸入 RecordNumber"; // LineNo if (string.IsNullOrWhiteSpace(model.LineNo)) return "請輸入 LineNo"; else if (model.LineNo.Trim().Length != 6) return "LineNo不足6碼"; // 判斷是否已備貨完成 var isRecord = await CheckRecordNoIsRecord(model.RecordNumber, model.LineNo); if (!(isRecord.Value as Result).success) { return $"RecordNumber【{model.RecordNumber}】 LineNo【{model.LineNo}】 已備貨完成"; } // Location if (string.IsNullOrWhiteSpace(model.Location)) { return "請輸入 Location"; } var recordType = await _ptdApi.GetRecordTypeInfo(); recordType = recordType.Where(w => w.ID == model.RecordType && w.RBU == model.Rbu).ToList(); if (recordType.Any()) { var recordInfoItem = recordType.Where(s => model.RecordNumber.StartsWith(s.PrefixCode)) .FirstOrDefault(); if (recordInfoItem == null) return "RecordNumber單據號碼開頭與設定開頭不符,請在確認"; if (model.RecordNumber.Length != recordInfoItem.Length) return "RecordNumber長度與設定的長度不符,請在確認"; } else { return "請維護RecordNumber單頭說明表"; } // ProductId if (string.IsNullOrWhiteSpace(model.ProductId)) { return "請輸入 料號"; } // 判斷RecordNumber 是601DB or 657 需要填 RMANo if (model.RecordType == "601DB" || model.RecordType == "657") { if (string.IsNullOrWhiteSpace(model.RmaNo)) return "請輸入 RMANo"; } // 判斷是簍有輸入序號 if (string.IsNullOrWhiteSpace(model.FrontSN) && string.IsNullOrWhiteSpace(model.SNData)) { return "請輸入 Scanner"; } // 輸入序號或Excel匯入只能選一種 if (!string.IsNullOrWhiteSpace(model.FrontSN) && !string.IsNullOrWhiteSpace(model.SNData)) return "條碼區間設定或Excel匯入只能選一種執行"; // 判斷序號區間格式正確 if (!string.IsNullOrWhiteSpace(model.FrontSN)) { // 沒有指定單一序號就判斷 備貨量及流水碼 if (model.PcsUnit == "N") { var sequential = model.Sequential; var frontLength = model.FrontSN.Length; var endLength = model.EndSN?.Length ?? 0; var frontSequential = 0; // 流水碼長度不符 if (sequential >= frontLength + 1) return "請確認 流水碼長度是否正確"; // 流水碼格式不符 if (!int.TryParse(model.FrontSN.Substring(frontLength - sequential, sequential), out _)) { return "請確認 序號區間流水碼格式是否正確"; } frontSequential = int.Parse(model.FrontSN.Substring(frontLength - sequential, sequential)); // 當沒有輸入結束序號區間,就判斷備貨量 if (string.IsNullOrWhiteSpace(model.EndSN)) { if (model.StockQty <= 0) { return "請輸入 備貨量"; } // 判斷備貨量 加總 大於 流水碼數 if ((frontSequential + model.StockQty - 1).ToString().Length > sequential) { return "備貨量加總超過設定流水碼長度,請在確認"; } } else { // 確認開始序號與結束序號是否長度一致 if (frontLength != endLength) { return "請確認 起始序號與結束序號區間長度不一致"; } // 判斷前綴碼是否一致 if (model.FrontSN.Substring(0, frontLength - sequential) != model.EndSN.Substring(0, frontLength - sequential)) { return "請確認 起始序號與結束序號區間前綴碼不一致"; } } } } return ""; } //public async Task CheckShipQty(string recordNumber, string lineNo, int addQty) //{ // var result = await _pcsApi.CheckShipQty(recordNumber, lineNo, addQty); // 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, msg = result.Msg }); //} //public async Task CheckFlowRules(string recordType, string serialNumber) //{ // var result = await _pcsApi.CheckFlowRules(recordType, serialNumber); // 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, msg = result.Msg }); //} #endregion #region "PTD003 作業查詢" public async Task PTD003() { if (Request.Cookies["_AMESCookie"] != null) { var userID = ""; HttpContext.Request.Cookies.TryGetValue("UserID", out userID); if (userID != "") { var user_info = await _sysApi.GetUserInfo(int.Parse(userID)); List factory_info = await _basApi.GetFactoryInfo(user_info[0].FactoryID); ViewData["RBU"] = factory_info[0].Address; } } List RecordTypes = await _ptdApi.GetRecordTypes(); var SelectListItem = new List(); SelectListItem.Add(new SelectListItem("全部", "全部")); foreach (WebApi.Models.AMES.RecordTypeInfo RecordType in RecordTypes) { if (!SelectListItem.Any(a => RecordType.ID == a.Value)) SelectListItem.Add(new SelectListItem(RecordType.ID.ToString() + "-" + RecordType.TypeName, RecordType.ID.ToString())); } ViewBag.RecordType = SelectListItem; //ViewBag.StartDate = System.DateTime.Now.AddDays(-7).ToString("yyyy/MM/dd"); //ViewBag.EndDate = System.DateTime.Now.ToString("yyyy/MM/dd"); ViewBag.WorkCenter = "TWM0"; ViewBag.rowCount = "總筆數: 0"; return View(); } public async Task PTD003QueryAsync(string recordType, string recordNumber, string lineNo, string materialNo, string shippingSN, string dateStart, string dateEnd, int autoLoad = 0, string RBU = null, string soNumber = null, string soLineNo = null, string customer = null) { if (autoLoad == 0) { return Json(new Table() { count = 0, data = null }); } var result = await _ptdApi.GetData4PTD003(recordType, recordNumber, lineNo, materialNo, shippingSN, dateStart, dateEnd, RBU, soNumber, soLineNo, customer); 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, msg = result.Msg }); } [HttpPost] public async Task GetCustomerJson(string recordNumber) { string strCustomer = await _ptdApi.GetCustomer(recordNumber); var item = new List(); item.Add(new SelectListItem(strCustomer, strCustomer)); //将数据Json化并传到前台视图 return Json(new { data = item }); } #endregion #region "PTD004 單頭說明維護" public IActionResult PTD004() { return View(); } //新增頁面 public IActionResult PTD004C() { return View(); } //修改页面 [HttpGet] public async Task PTD004UAsync(string seq) { var result = await _ptdApi.GetRecordTypeInfo(seq); if (result.Count == 0) { return View(); } return View(result[0]); } public async Task PTD004DAsync(string id) { var result = await _ptdApi.DeleteRecordTypeInfo(id); return Json(new Result() { success = true, msg = "" }); } //頁面提交,Mode=0 添加,Mode=1 修改 [HttpPost] public async Task PTD004SaveAsync(WebApi.Models.AMES.RecordTypeInfo model) { if (ModelState.IsValid) { IResultModel result; if (model.Mode == 0) { result = await _ptdApi.PostRecordTypeInfo(JsonConvert.SerializeObject(model)); } else { result = await _ptdApi.PutRecordTypeInfo(model.ID, JsonConvert.SerializeObject(model)); } if (result.Success) { var _msg = model.Mode == 0 ? "添加成功!" : "修改成功!"; return RedirectToAction("Refresh", "Home", new { msg = _msg }); } else { if (result.Errors.Count > 0) { ModelState.AddModelError(result.Errors[0].Id, result.Errors[0].Msg); } else { ModelState.AddModelError("error", result.Msg); } } } if (model.Mode == 0) { return View("PTD004C", model); } return View("PTD004U", model); } [ResponseCache(Duration = 0)] [HttpGet] public async Task GetRecordTypeInfoAsync() { var result = await _ptdApi.GetRecordTypeInfo(); if (result.Count > 0) { return Json(new Table() { code = 0, msg = "", data = result, count = result.Count }); } return Json(new Table() { count = 0, data = null }); } #endregion #region "PTD005 設定 ERP 客戶代號和客戶收件人名單" public async Task PTD005() { return View(); } public IActionResult PTD005C() { return View(); } //修改页面 [HttpGet] public async Task PTD005UAsync(string id) { var result = await _ptdApi.GetCustomerItemMailGroup(id); if (result.Count == 0) { return View(); } return View(result[0]); } public async Task PTD005DAsync(string id) { var result = await _ptdApi.DeleteCustomerItemMailGroup(id); return Json(new Result() { success = true, msg = "" }); } [HttpPost] public async Task PTD005SaveAsync(WebApi.Models.AMES.CustomerItemMailGroupModel model) { if (ModelState.IsValid) { IResultModel result; if (model.Mode == 0) { var checkData = await _ptdApi.GetCustomerItemMailGroup(model.CustomerCode); if (!checkData.Any()) result = await _ptdApi.PostCustomerItemMailGroup(JsonConvert.SerializeObject(model)); else { ModelState.AddModelError("error", "客戶代號已有重複"); return View("PTD005C", model); } } else { result = await _ptdApi.PutCustomerItemMailGroup(model.CustomerCode, JsonConvert.SerializeObject(model)); } if (result.Success) { var _msg = model.Mode == 0 ? "添加成功!" : "修改成功!"; return RedirectToAction("Refresh", "Home", new { msg = _msg }); } else { if (result.Errors.Count > 0) { ModelState.AddModelError(result.Errors[0].Id, result.Errors[0].Msg); } else { ModelState.AddModelError("error", result.Msg); } } } if (model.Mode == 0) { return View("PTD005C", model); } return View("PTD005U", model); } [ResponseCache(Duration = 0)] [HttpGet] public async Task GetCustomerItemMailGroupAsync() { var result = await _ptdApi.GetCustomerItemMailGroup(); if (result.Count > 0) { return Json(new Table() { code = 0, msg = "", data = result, count = result.Count }); } return Json(new Table() { count = 0, data = null }); } #endregion #region "PTD006 備貨作業" public async Task PTD006() { var RBU = string.Empty; if (Request.Cookies["_AMESCookie"] != null) { var userID = ""; HttpContext.Request.Cookies.TryGetValue("UserID", out userID); if (userID != null) { var user_info = await _sysApi.GetUserInfo(int.Parse(userID)); var factory_info = await _basApi.GetFactoryInfo(user_info[0].FactoryID); ViewData["RBU"] = factory_info[0].Address; RBU = factory_info[0].Address; } } List RecordTypes = await _ptdApi.GetRecordTypeInfo(); var allRecordType = new[] { "101", "601", "631", "633", "951" }; var filtered = from o in RecordTypes where allRecordType.Contains(o.ID) && o.RBU == RBU select o; RecordTypes = filtered.OrderBy(o => o.ID).ToList(); var SelectListItem = new List(); foreach (WebApi.Models.AMES.RecordTypeInfo RecordType in RecordTypes) { if (!SelectListItem.Any(a => RecordType.ID == a.Value)) SelectListItem.Add(new SelectListItem(RecordType.ID.ToString() + "-" + RecordType.TypeName, RecordType.ID.ToString())); } ViewBag.RecordTypeInfo = RecordTypes; ViewBag.RecordType = SelectListItem.Distinct().ToList(); ViewBag.Location = "9000"; ViewBag.WorkCenter = "TWM0"; ViewBag.RecordDate = System.DateTime.Now.ToString("yyyy/MM/dd"); return View(); } public async Task PTD006QueryAsync(string recordNumber, string lineNo = null, string sn = null) { if (recordNumber == null || recordNumber == "") return Json(new Table() { count = 0, data = null }); var result = await _ptdApi.GetZWHPickListDetail(recordNumber, lineNo); if (result.DataTotal > 0) { if (!string.IsNullOrWhiteSpace(sn)) { result.Data = result.Data.Where(w => w.sn == sn).ToList(); } return Json(new Table() { code = 0, msg = "", data = result.Data, count = result.DataTotal }); } return Json(new Table() { count = 0, data = null, msg = result.Msg }); } [HttpPost] public async Task PTD006AAsync(string data) { var result = await _ptdApi.PostPTD006Commit(data); if (result.Success) { return Json(new Result() { success = true, msg = "" }); } else { return Json(new Result() { success = false, msg = result.Msg }); } } public async Task PTD006DAsync(string sn) { var result = await _ptdApi.DeleteZWHPickListDetail(sn); if (result.Success) { return Json(new Result() { success = true, msg = "" }); } else { return Json(new Result() { success = false, msg = result.Msg }); } } public async Task PTD006DAllAsync(string recordNumber, string lineNo) { var result = await _ptdApi.DeleteZWHPickListDetailAll(recordNumber, lineNo); if (result.Success) { return Json(new Result() { success = true, msg = "" }); } else { return Json(new Result() { success = false, msg = result.Msg }); } } public async Task PTD006_CheckInputData(WebApi.Models.AMES.PTDCheckInputData model) { // 基本資料判定 var inputCheck = await CheckInputData(model); var msg = string.Empty; // 資料收集 var sn = new List(); var addInput = new List(); var msgInput = new List(); var msgInputAlert = new List(); var checkFQC = false; var factoryNo = await GetLoginFactoryNo(); if (!string.IsNullOrWhiteSpace(inputCheck)) return Json(new Result() { success = false, msg = inputCheck }); // 單頭說明維護 var recordType = await _ptdApi.GetRecordTypeInfo(); var recodeIdBystaus = new List(); var recordTypeFirst = recordType.Where(w => w.ID == model.RecordType).FirstOrDefault(); // Type是WO的 上一個狀態需要是WI if (recordTypeFirst != null) { if (recordTypeFirst.Status == "WO") { // Record 狀態是WI 的ID recodeIdBystaus.AddRange(recordType.Where(w => w.Status == "WI").Select(s => s.ID).ToList()); // 特殊 if (model.RecordType == "633") recodeIdBystaus.Add("631"); } // 101 else if (recordTypeFirst.ID == "101") { } } else return Json(new Result() { success = false, msg = "請新增單頭說明維護", data = null }); // 序號區間 if (!string.IsNullOrWhiteSpace(model.FrontSN)) { // 取得資料 PCS if (model.StockUnit == "0") { // Begin=End if (model.PcsUnit == "Y") { model.EndSN = model.FrontSN; sn.Add(model.FrontSN); } else { var sequential = model.Sequential; var frontLength = model.FrontSN.Length; // 前綴 var title = model.FrontSN.Substring(0, frontLength - sequential); // EndSn 空白 計算備貨量 if (string.IsNullOrWhiteSpace(model.EndSN)) { // 開始流水號 var frontSequential = int.Parse(model.FrontSN.Substring(frontLength - sequential, sequential)); model.EndSN = $"{title}{(frontSequential + model.StockQty - 1).ToString().PadLeft(sequential, '0')}"; } int startNumber = int.Parse(model.FrontSN.Substring(frontLength - sequential, sequential)); int endNumber = int.Parse(model.EndSN.Substring(frontLength - sequential, sequential)); // 用起訖區間推序號 for (int i = startNumber; i <= endNumber; i++) { string serialNumber = title + i.ToString().PadLeft(sequential, '0'); sn.Add(serialNumber); } } } // BOX if (model.StockUnit == "1") { // EndSn 空白 計算備貨量 if (string.IsNullOrWhiteSpace(model.EndSN)) { var sequential = model.Sequential; var frontLength = model.FrontSN.Length; // 前綴 var title = model.FrontSN.Substring(0, frontLength - sequential); // 開始流水號 var frontSequential = int.Parse(model.FrontSN.Substring(frontLength - sequential, sequential)); model.EndSN = $"{title}{(frontSequential + model.StockQty - 1).ToString().PadLeft(sequential, '0')}"; } var boxSn = await _ptdApi.GetBarcodeInfoByBoxInterval(model.FrontSN, model.EndSN); foreach (var item in boxSn.Where(w => w.StatusID == -1)) { // sn sn.Add(item.BarcodeNo); } } } // ExcelInput if (!string.IsNullOrWhiteSpace(model.SNData)) { sn.AddRange(model.SNData.Split("\n").ToList()); sn = sn.Where(w => !string.IsNullOrWhiteSpace(w)).ToList(); } // FQC判斷 先判斷是否昶亨帳號 if (factoryNo == "YS08") { var resultZDNDetail = await _ptdApi.GetGetZDNDetail(model.RecordNumber, model.LineNo); if (resultZDNDetail.Any()) { if (resultZDNDetail.FirstOrDefault().shipSLoc == "0S08") checkFQC = true; } } // 確認序號狀態 foreach (var item in sn) { // zsnInfo 資料 var zSnInfo = await _ptdApi.GetZSNInfoByNumber(item); // pickListDetail 資料 var pickDetail = await _ptdApi.GetZWHPickListDetailByInputSN(item); if (recordTypeFirst.Status == "WO") { // ZsnInfo 符合狀態的序號且料號要一致 if (zSnInfo.Any()) { if (zSnInfo.Any(w => recodeIdBystaus.Contains((string)w.recordTypeID) && w.originalProductID == model.ProductId)) addInput.Add(item); else { if (zSnInfo.Any(w => !recodeIdBystaus.Contains((string)w.recordTypeID))) { msgInput.Add(item); msgInputAlert.Add($"{item}(型態不對)"); } else if (zSnInfo.Any(w => w.originalProductID != model.ProductId)) { msgInput.Add(item); msgInputAlert.Add($"{item}(品號不符)"); } } } else { msgInput.Add(item); msgInputAlert.Add($"{item}(序號不存在)"); } // 排除PickDetail有重複相同recordNumber & lineNo 的序號 //if (pickDetail.Any(w => w.recordNumber == model.RecordNumber && w.rcLineNO == model.LineNo)) if (pickDetail.Any(w => w.recordTypeID == model.RecordType)) { msgInput.Add(item); msgInputAlert.Add($"{item}(序號重複)"); } else addInput.Add(item); // FQC檢驗 if (checkFQC) { try { var resultCheckFqc = await _ptdApi.CheckFQCTestOk(extraBarcodeNo: item); if (!resultCheckFqc.Any()) { msgInput.Add(item); msgInputAlert.Add($"{item}(尚未通過FQC檢驗)"); } } catch { msgInput.Add(item); msgInputAlert.Add($"{item}(尚未通過FQC檢驗)"); } } } else { // 101 不會有Info資料 if (zSnInfo.Any()) { msgInput.Add(item); msgInputAlert.Add($"{item}(序號重複)"); } else addInput.Add(item); // 排除PickDetail有重複相同recordNumber & lineNo 的序號 //if (pickDetail.Any(w => w.recordNumber == model.RecordNumber && w.rcLineNO == model.LineNo)) if (pickDetail.Any(w => w.recordTypeID == model.RecordType)) { msgInput.Add(item); msgInputAlert.Add($"{item}(序號重複)"); } else addInput.Add(item); } } addInput = addInput.Except(msgInput.Distinct()).ToList(); // Add foreach (var item in addInput.Distinct()) { var addPtd006 = new PTD006CommitDataModel { RecordTypeID = model.RecordType, RecordNumber = model.RecordNumber, RCLineNO = model.LineNo, InputSN = item, ShipmentSN = item, ProductID = model.ProductId, EmplID = model.Customer, ExtNotes = model.Notes, OwnerPlantID = model.WorkCenter, OwnerCompanyID = model.Rbu, CreatorID = GetLoginNo().Result, ModifierID = GetLoginNo().Result, }; var result = await _ptdApi.PostPTD006Commit(JsonConvert.SerializeObject(addPtd006)); if (!result.Success) return Json(new Result() { success = true, msg = result.Msg, data = new List() }); } if (msgInputAlert.Any()) msg = "新增失敗:" + string.Join("、", msgInputAlert.Distinct()); return Json(new Result() { success = true, msg = msg, data = new List() }); } /// /// 取得 RecordNo & LineNo 訂單數量 /// /// RecordNo /// LineNo /// public async Task GetRecordNumberQty(string dnNo, string dnlineNo) { var zDNDetail = await _ptdApi.GetGetZDNDetail(dnNo, dnlineNo); if (zDNDetail.Any()) { var qty = zDNDetail.FirstOrDefault().shipQty; return Json(new Result() { success = true, data = qty }); } else { return Json(new Result() { success = true, data = 0 }); } } /// /// 確認 RecordNo & LineNo 是否可備貨 /// /// RecordNo /// LineNo /// ture可 false不可 public async Task CheckRecordNoIsRecord(string dnNo, string dnlineNo) { var zDNDetail = await _ptdApi.GetGetZDNDetail(dnNo, dnlineNo); if (zDNDetail.Any()) { var isRecord = zDNDetail.FirstOrDefault().isRecord; if ((int)isRecord == 1) return Json(new Result() { success = false }); } return Json(new Result() { success = true }); } #endregion #region "PTD007 扣帳作業" public async Task PTD007() { var RBU = string.Empty; if (Request.Cookies["_AMESCookie"] != null) { var userID = ""; HttpContext.Request.Cookies.TryGetValue("UserID", out userID); if (userID != "") { var user_info = await _sysApi.GetUserInfo(int.Parse(userID)); var factory_info = await _basApi.GetFactoryInfo(user_info[0].FactoryID); ViewData["RBU"] = factory_info[0].Address; RBU = factory_info[0].Address; } } List RecordTypes = await _ptdApi.GetRecordTypeInfo(); var allRecordType = new[] { "101", "601", "631", "633", "951", "101P" }; var filtered = from o in RecordTypes where allRecordType.Contains(o.ID) && o.RBU == RBU select o; RecordTypes = filtered.OrderBy(o => o.ID).ToList(); var SelectListItem = new List(); foreach (WebApi.Models.AMES.RecordTypeInfo RecordType in RecordTypes) { if (!SelectListItem.Any(a => RecordType.ID == a.Value)) SelectListItem.Add(new SelectListItem(RecordType.ID.ToString() + "-" + RecordType.TypeName, RecordType.ID.ToString())); } ViewBag.RecordType = SelectListItem; ViewBag.WorkCenter = "TWM0"; ViewBag.RecordDate = System.DateTime.Now.ToString("yyyy/MM/dd"); ViewBag.loginNo = await GetLoginNo(); return View(); } public async Task PTD007QueryAsync(string recordType, string recordNumber, string RBU) { if (recordNumber == null || recordNumber == "") return Json(new Table() { count = 0, data = null }); var result = new ResultModel(); if (recordType == "101P") { result = await _ptdApi.GetPTD007QueryByRBU(recordNumber, RBU); } else result = await _ptdApi.GetZDNDetailJoinZWHPickListDetail(recordType, recordNumber); 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, msg = result.Msg }); } [HttpPost] public async Task PTD007_Commit(string data) { var ptd007 = JsonConvert.DeserializeObject(data); var result = new ResultModel(); // 101 不需要判定 if (ptd007.RecordType != "101") { // 先確認需求數量是否=備貨數量 foreach (var item in ptd007.TableData) { if (item.shipQty != item.qty) { result.Success = false; result.Msg = $"DN單號【{item.dnno}】 LineNo【{item.dnLineNO}】 數量不符合,請檢查備貨資料"; return Json(new { data = result }); } } } // 執行扣帳 if (ptd007.RecordType == "101P") result = await _ptdApi.PostPTD007CommitByRBU(data); else result = await _ptdApi.PostPTD007Commit(data); foreach (var item in ptd007.TableData) { var zDNDetail = await _ptdApi.GetGetZDNDetail(item.dnno, item.dnLineNO); var zProductTrans = await _ptdApi.GetZProductTrans(recordNumber: item.dnno, lineNo: item.dnLineNO); if (zDNDetail.Any() && zProductTrans.Any()) { // DN數量 == 已扣帳數量 if (zDNDetail.FirstOrDefault().shipQty == zProductTrans.Count()) await _ptdApi.PutZDNDetailByIsRecord(item.dnno, item.dnLineNO, 1); } } //将数据Json化并传到前台视图 return Json(new { data = result }); } #endregion #region "PTD008 還原作業" public async Task PTD008() { return View(); } public async Task PTD008QueryAsync(string recordNumber, string lineNo, string materialNo, string shippingSN) { if (string.IsNullOrEmpty(recordNumber) || string.IsNullOrEmpty(lineNo) || string.IsNullOrEmpty(materialNo)) return Json(new Table() { count = 0, data = null }); var result = await _ptdApi.GetData4PTD008(recordNumber, lineNo, materialNo, shippingSN); 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, msg = result.Msg }); } [HttpPost] public async Task PTD008_Commit(string recordNumber, string lineNo, string materialNo, string shippingSN) { var data = await _ptdApi.GetData4PTD008(recordNumber, lineNo, materialNo, shippingSN); if (data.Data.Any(w => w.recordTypeID == "101" || w.recordTypeID == "292")) return Json(new Result() { success = false, msg = "ReCordType狀態是【101】或【292】 ,不可做還原動作" }); int okQty = 0, ngQty = 0; foreach (var item in data.Data) { var sn = (string)item.sn; var recordTypeID = (string)item.recordTypeID; var zProductTrans = await _ptdApi.GetZProductTrans(serialNumber: sn); var delcheck = true; if (!zProductTrans.Any()) { ngQty += 1; continue; } // 取序號最新一次狀態 else if (zProductTrans.Any()) { var newRecordId = zProductTrans.OrderByDescending(o => o.createDate).FirstOrDefault().recordTypeID; // 確認目前還原是否是最新的 if (newRecordId != item.recordTypeID) { ngQty += 1; continue; } if (zProductTrans.Any(a => a.recordTypeID == "101P")) { ngQty += 1; continue; } } // 可進行還原 delcheck = await _ptdApi.Put_PTD008(sn, recordNumber, lineNo, materialNo, recordTypeID); if (delcheck) okQty += 1; else ngQty += 1; } // 成功刪除筆數大於1 if (okQty >= 1) { await _ptdApi.PutZDNDetailByIsRecord(recordNumber, lineNo, 0); } return Json(new Result() { success = true, msg = $"還原成功筆數【{okQty}】,失敗筆數【{ngQty}】" }); } /// /// 刪除動作 /// /// /// [HttpPost] public async Task PTD008_Del(string recordNumber, string lineNo, string materialNo, string shippingSN) { var data = await _ptdApi.GetData4PTD008(recordNumber, lineNo, materialNo, shippingSN); if (data.Data.Any(w => w.recordTypeID != "101" && w.recordTypeID != "292")) return Json(new Result() { success = false, msg = "ReCordType狀態不是【101】或【292】 ,不可做刪除動作" }); int okQty = 0, ngQty = 0; foreach (var item in data.Data) { var zProductTrans = await _ptdApi.GetZProductTrans(serialNumber: (string)item.sn); var delcheck = true; // 大於一筆 代表尚有其他作業需還原 if (zProductTrans.Count > 1) { ngQty += 1; } // 可進行刪除 else { delcheck = await _ptdApi.Del_PTD008((string)item.sn, recordNumber, lineNo, materialNo); if (delcheck) okQty += 1; else ngQty += 1; } } // 成功刪除筆數大於1,將ZDetail if (okQty >= 1) { await _ptdApi.PutZDNDetailByIsRecord(recordNumber, lineNo, 0); } return Json(new Result() { success = true, msg = $"刪除成功筆數【{okQty}】,失敗筆數【{ngQty}】" }); } #endregion /// /// 登入UserID /// /// public int GetLogInUserID() { int user_id = -1; HttpContext.Request.Cookies.TryGetValue("UserID", out string userID); if (userID != null) { if (int.Parse(userID.ToString()) >= 0) { user_id = int.Parse(userID.ToString()); } } return user_id; } /// /// 取得登入帳號 /// /// public async Task GetLoginNo() { int user_id = -1; HttpContext.Request.Cookies.TryGetValue("UserID", out string userID); if (userID != null) { if (int.Parse(userID.ToString()) >= 0) { user_id = int.Parse(userID.ToString()); } } var result = await _sysApi.GetUserInfo(user_id); if (result.Any()) return result.FirstOrDefault().LoginNo; return ""; } /// /// 取得登入帳號 廠別代碼 /// /// public async Task GetLoginFactoryNo() { int user_id = -1; HttpContext.Request.Cookies.TryGetValue("UserID", out string userID); if (userID != null) { if (int.Parse(userID.ToString()) >= 0) { user_id = int.Parse(userID.ToString()); var userData = await _sysApi.GetUserData(user_id); if (userData.Data.Any()) return (string)userData.Data.FirstOrDefault().factoryNo; } } return ""; } } }