From 1ed8030d9cc7ddb7e75395facc647b94abbf86ea Mon Sep 17 00:00:00 2001 From: Sai Date: Wed, 7 Jan 2026 13:10:02 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E6=96=B0=E5=A2=9EPCB020=20=E9=8C=AB?= =?UTF-8?q?=E8=86=8F=E8=A6=8F=E6=A0=BC=E7=B6=AD=E8=AD=B7=E7=9B=B8=E9=97=9C?= =?UTF-8?q?=E7=A8=8B=E5=BC=8F=202.=20=E9=8C=AB=E8=86=8F=E8=A6=8F=E6=A0=BC?= =?UTF-8?q?=E4=BE=86=E6=BA=90=E9=87=8D=E6=A7=8B=EF=BC=9A=E5=B0=87=20PCSCon?= =?UTF-8?q?troller=20=E4=B8=AD=E7=9A=84=20GetSolderPasteSelect=20=E7=94=B1?= =?UTF-8?q?=20Enum=20=E6=94=B9=E7=82=BA=E5=BE=9E=E8=B3=87=E6=96=99?= =?UTF-8?q?=E5=BA=AB=20(SOLDER=5FPASTE=5FSERIAL)=20=E8=AE=80=E5=8F=96?= =?UTF-8?q?=E3=80=82=203.=20=E5=AF=A6=E4=BD=9C=E7=8B=80=E6=85=8B=E9=81=8E?= =?UTF-8?q?=E6=BF=BE=EF=BC=9A=20=20=20=20-=20=E6=AA=A2=E8=A6=96=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=20(PCS001R)=EF=BC=9A=E9=A1=AF=E7=A4=BA=E6=89=80?= =?UTF-8?q?=E6=9C=89=E8=A6=8F=E6=A0=BC=E3=80=82=20=20=20=20-=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E6=A8=A1=E5=BC=8F=20(PCS003/PCS034)=EF=BC=9A=E5=83=85?= =?UTF-8?q?=E9=A1=AF=E7=A4=BA=E5=95=9F=E7=94=A8=E4=B8=AD=20(StatusNo=3D'A'?= =?UTF-8?q?)=20=E7=9A=84=E8=A6=8F=E6=A0=BC=E3=80=82=204.=20=E6=8F=90?= =?UTF-8?q?=E5=8D=87=E7=A8=8B=E5=BC=8F=E5=81=A5=E5=A3=AF=E6=80=A7=EF=BC=9A?= =?UTF-8?q?=20=20=20=20-=20=E5=9C=A8=20WipDataSelectAll=20=E5=91=BC?= =?UTF-8?q?=E5=8F=AB=E8=99=95=E5=8A=A0=E5=85=A5=20null-conditional=20?= =?UTF-8?q?=E9=81=8B=E7=AE=97=E5=AD=90=20(=3F.)=EF=BC=8C=E9=98=B2=E6=AD=A2?= =?UTF-8?q?=20wipBoard=20=E7=82=BA=E7=A9=BA=E6=99=82=E5=A0=B1=E9=8C=AF?= =?UTF-8?q?=E3=80=82=20=20=20=20-=20=E8=A7=A3=E6=B1=BA=E8=A6=8F=E6=A0=BC?= =?UTF-8?q?=E5=81=9C=E7=94=A8=E5=B0=8E=E8=87=B4=E5=89=8D=E7=AB=AF=E9=81=B8?= =?UTF-8?q?=E5=96=AE=E8=B7=B3=E6=8E=89=E7=9A=84=E5=95=8F=E9=A1=8C=EF=BC=88?= =?UTF-8?q?=E6=90=AD=E9=85=8D=E5=89=8D=E7=AB=AF=20jQuery=20=E8=87=AA?= =?UTF-8?q?=E5=8B=95=E5=B0=8E=E5=90=91=E8=87=B3=E3=80=8C=E5=85=B6=E4=BB=96?= =?UTF-8?q?(N)=E3=80=8D=EF=BC=89=E3=80=82=20------------------------------?= =?UTF-8?q?----------------------------------------------------=20DB=20?= =?UTF-8?q?=E9=9C=80=E7=95=B0=E5=8B=95=E6=8C=87=E4=BB=A4=20UPDATE=20JHAMES?= =?UTF-8?q?.WIP=5FBOARD=20SET=20SOLDER=5FPASTE=20=3D'KA'=20WHERE=20SOLDER?= =?UTF-8?q?=5FPASTE=20=3D=20'A';=20--=20KOKI=E7=84=A1=E9=89=9B=E9=8C=AB?= =?UTF-8?q?=E8=86=8F(S3X58-M406-3)=20UPDATE=20JHAMES.WIP=5FBOARD=20SET=20S?= =?UTF-8?q?OLDER=5FPASTE=20=3D'SA'=20WHERE=20SOLDER=5FPASTE=20=3D=20'B';?= =?UTF-8?q?=20--=20SMIC=E7=84=A1=E9=89=9B=E9=8C=AB=E8=86=8F(M705-221BM5-32?= =?UTF-8?q?-11.5K3)=20UPDATE=20JHAMES.WIP=5FBOARD=20SET=20SOLDER=5FPASTE?= =?UTF-8?q?=20=3D'S1'=20WHERE=20SOLDER=5FPASTE=20=3D=20'C';=20--=20SMIC?= =?UTF-8?q?=E7=84=A1=E9=B9=B5=E9=8C=AB=E8=86=8F(M705-S101ZH-S4)=20UPDATE?= =?UTF-8?q?=20JHAMES.WIP=5FBOARD=20SET=20SOLDER=5FPASTE=20=3D'GR'=20WHERE?= =?UTF-8?q?=20SOLDER=5FPASTE=20=3D=20'E';=20--=20SMIC=E7=84=A1=E9=89=9B?= =?UTF-8?q?=E9=8C=AB=E8=86=8F(M705-GRN360-K2-V)=20UPDATE=20JHAMES.WIP=5FBO?= =?UTF-8?q?ARD=20SET=20SOLDER=5FPASTE=20=3D'N'=20WHERE=20SOLDER=5FPASTE=20?= =?UTF-8?q?=3D=20'D';=20--=20=E5=85=B6=E4=BB=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/PCBController.cs | 246 ++++++++++++++---- .../Controllers/PCSController.cs | 53 ++-- AMESCoreStudio.Web/HttpApis/AMES/IPCB.cs | 42 +++ AMESCoreStudio.Web/Views/PCB/PCB020.cshtml | 132 ++++++++++ AMESCoreStudio.Web/Views/PCB/PCB020C.cshtml | 92 +++++++ AMESCoreStudio.Web/Views/PCB/PCB020U.cshtml | 94 +++++++ AMESCoreStudio.Web/Views/PCS/PCS003.cshtml | 31 ++- AMESCoreStudio.Web/Views/PCS/PCS034.cshtml | 13 + .../AMES/SolderPasteSerialController.cs | 78 +++++- .../Models/AMES/SolderPasteSerial.cs | 46 ++++ AMESCoreStudio.WebApi/Models/AMESContext.cs | 8 +- 11 files changed, 745 insertions(+), 90 deletions(-) create mode 100644 AMESCoreStudio.Web/Views/PCB/PCB020.cshtml create mode 100644 AMESCoreStudio.Web/Views/PCB/PCB020C.cshtml create mode 100644 AMESCoreStudio.Web/Views/PCB/PCB020U.cshtml diff --git a/AMESCoreStudio.Web/Controllers/PCBController.cs b/AMESCoreStudio.Web/Controllers/PCBController.cs index 1f9348f..d51cbd8 100644 --- a/AMESCoreStudio.Web/Controllers/PCBController.cs +++ b/AMESCoreStudio.Web/Controllers/PCBController.cs @@ -421,10 +421,25 @@ namespace AMESCoreStudio.Web.Controllers // 新增 if (model.SolderPasteID == 0) { - // 錫膏編號自動編碼 if (numbergeneration == "A") { + // 加入規格維護判斷 + var solderPasteSerials = await _pcbApi.GetSolderPasteSerial(); + var currentSpec = solderPasteSerials.FirstOrDefault(x => x.Description.Trim().ToUpper() == model.Description.Trim().ToUpper()); + + if (currentSpec == null) + { + msg = "找不到規格對應的維護資料,請先至【錫膏規格維護】頁面新增"; + return Json(new { msg = msg, success = false }); + } + + if (currentSpec.StatusNo != "A") + { + msg = $"規格【{model.Description}】目前為停用狀態,無法維護"; + return Json(new { msg = msg, success = false }); + } + // 用規格帶出流水碼 model.SolderPasteNo = await _pcbApi.GetSolderPasteSerialByAutoSerialNo(model.Description.Trim()); if (string.IsNullOrWhiteSpace(model.SolderPasteNo)) @@ -443,30 +458,35 @@ namespace AMESCoreStudio.Web.Controllers { ModelState.AddModelError("error", msg); return Json(new { msg = msg, success = false }); - //return View("PCB014C", model); } } // 人工手動給予 else if (numbergeneration == "M") { - if (string.IsNullOrWhiteSpace(model.SolderPasteNo)) + { msg = "請輸入錫膏編號"; + } + else if (model.SolderPasteNo.Length != 7) + { + msg = "錫膏編號必須為7碼"; + } else { List solderPasteSerials = await _pcbApi.GetSolderPasteSerial(); - // 目前有設定的代號 - var serialNo = solderPasteSerials.Select(s => s.SerialNo).ToList(); + var serialNos = solderPasteSerials.Select(s => s.SerialNo.ToUpper()).ToList(); + string prefix = model.SolderPasteNo.Substring(0, 2).ToUpper(); - if (serialNo.Any(code => model.SolderPasteNo.StartsWith(code))) + if (serialNos.Contains(prefix)) { - msg = "不可以輸入系統指定代碼"; + msg = $"不可以輸入系統指定代碼前綴【{prefix}】"; + } + else + { + var query = await _pcbApi.GetSolderPasteInfoQuery(solderPasteNo: model.SolderPasteNo); + if (query.DataTotal != 0) + msg = "該錫膏編號已建立過"; } - - var query = await _pcbApi.GetSolderPasteInfoQuery(solderPasteNo: model.SolderPasteNo); - // 錫膏編號重複 - if (query.DataTotal != 0) - msg = "該錫膏編號已建立過"; } // 有錯誤訊息 @@ -474,11 +494,9 @@ namespace AMESCoreStudio.Web.Controllers { ModelState.AddModelError("error", msg); return Json(new { msg = msg, success = false }); - //return View("PCB014C", model); } } - model.CreateUserID = GetLogInUserID(); model.CreateDate = DateTime.Now; model.UpdateUserID = GetLogInUserID(); @@ -523,7 +541,6 @@ namespace AMESCoreStudio.Web.Controllers if (model.SolderPasteID == 0) { return Json(new { msg = msg, success = false }); - //return View("PCB014C", model); } return View("PCB014U", model); } @@ -845,7 +862,7 @@ namespace AMESCoreStudio.Web.Controllers #endregion - #region PCB015連板綁定作業 + #region PCB015 連板綁定作業 public async Task PCB015() { @@ -871,7 +888,6 @@ namespace AMESCoreStudio.Web.Controllers return View("PCB015V", model); } - public async Task PCB015GetGroupAsync(string id, string groupID = null, int page = 0, int limit = 10) { var result = await _pcbApi.GetBarcodeGroupsByWipNO(id: id, groupID: groupID, page: page, limit: limit); @@ -920,7 +936,6 @@ namespace AMESCoreStudio.Web.Controllers return Json(new Result() { success = true, msg = "刪除成功" }); } - public async Task CheckBarcodeNOandGroupAsync(string BarcodeNo, string WipNo, int WipID, int Boards, string PlanQTY) { //生產序號不在工單區間 @@ -1027,8 +1042,6 @@ namespace AMESCoreStudio.Web.Controllers } - - /// /// PCBGroup 綁定Excel匯入 /// @@ -1037,14 +1050,14 @@ namespace AMESCoreStudio.Web.Controllers [HttpPost] public async Task PCB015ExcelUpload(IFormFile Uploader) { - + //通過上傳檔案流初始化Mapper using (var workbook = new XLWorkbook(Uploader.OpenReadStream())) { try { List barcodeGroup = new List(); - + string Msg = string.Empty; var worksheet = workbook.Worksheet(1); // 定義資料起始/結束 Cell @@ -1064,7 +1077,7 @@ namespace AMESCoreStudio.Web.Controllers if (!isNumeric) { return Json(new Result() { success = false, msg = "Group順序" + seq + "請輸入數字", data = null }); - + } barcodeGroup.Add(new BarcodeGroupDto @@ -1079,7 +1092,7 @@ namespace AMESCoreStudio.Web.Controllers var WipBarcode = await _pcbApi.GetWipBarcodesCheckInRange(data.Cell(i, 1).Value.ToString(), data.Cell(i, 3).Value.ToString()); if (WipBarcode.Count == 0) { - return Json(new Result() { success = false, msg = "生產序號" + data.Cell(i, 3).Value.ToString() + "不在工單"+ data.Cell(i, 1).Value.ToString() + "區間內", data = null }); + return Json(new Result() { success = false, msg = "生產序號" + data.Cell(i, 3).Value.ToString() + "不在工單" + data.Cell(i, 1).Value.ToString() + "區間內", data = null }); } #endregion @@ -1090,18 +1103,18 @@ namespace AMESCoreStudio.Web.Controllers if (duplicateBarcodeNos.Any()) { - return Json(new Result() { success = false, msg = "Excel檔案內的生產序號"+ string.Join(", ", duplicateBarcodeNos) + "重覆", data = null }); + return Json(new Result() { success = false, msg = "Excel檔案內的生產序號" + string.Join(", ", duplicateBarcodeNos) + "重覆", data = null }); } - #endregion - #region 判斷序號是否已綁定群組 + #endregion + #region 判斷序號是否已綁定群組 - var BarCodeinto = await _pcsApi.GetBarcodeInfoesByNo(data.Cell(i, 3).Value.ToString()); + var BarCodeinto = await _pcsApi.GetBarcodeInfoesByNo(data.Cell(i, 3).Value.ToString()); if (BarCodeinto.Count() > 0) { var BarcodeGroup = await _pcsApi.GetBarcodeGroupByBarCodeID(BarCodeinto.Select(s => s.BarcodeID).FirstOrDefault()); if (BarcodeGroup.Count() > 0) { - return Json(new Result() { success = false, msg = "生產序號" + data.Cell(i, 3).Value.ToString()+ "已綁定群組" + BarcodeGroup.Select(s => s.GroupID).FirstOrDefault() + ",不可重覆綁定", data = null }); + return Json(new Result() { success = false, msg = "生產序號" + data.Cell(i, 3).Value.ToString() + "已綁定群組" + BarcodeGroup.Select(s => s.GroupID).FirstOrDefault() + ",不可重覆綁定", data = null }); } } @@ -1118,7 +1131,7 @@ namespace AMESCoreStudio.Web.Controllers - foreach (var item in barcodeGroup.Select(s =>s.Sequence).Distinct()) + foreach (var item in barcodeGroup.Select(s => s.Sequence).Distinct()) { foreach (var item1 in barcodeGroup.Where(w => w.Sequence == item)) { @@ -1141,27 +1154,27 @@ namespace AMESCoreStudio.Web.Controllers #endregion } - #region 綁定Group + #region 綁定Group - var barcodeinfo = await _pcbApi.PostDapperByListBarcodeNO(JsonConvert.SerializeObject(barcodeGroup.Where(w => w.Sequence == item).Select(s=>s.BarcodeNo))); - int UserID = GetLogInUserID(); + var barcodeinfo = await _pcbApi.PostDapperByListBarcodeNO(JsonConvert.SerializeObject(barcodeGroup.Where(w => w.Sequence == item).Select(s => s.BarcodeNo))); + int UserID = GetLogInUserID(); - List barcodeGroups = barcodeinfo - .Select((b, index) => new BarcodeGroup - { - BarcodeID = b.BarcodeID, - GroupID = 0, - Sequence = item, - CreateUserID = UserID, - WipNo = barcodeGroup.Select(s=>s.WipNo).FirstOrDefault() - }) - .ToList(); + List barcodeGroups = barcodeinfo + .Select((b, index) => new BarcodeGroup + { + BarcodeID = b.BarcodeID, + GroupID = 0, + Sequence = item, + CreateUserID = UserID, + WipNo = barcodeGroup.Select(s => s.WipNo).FirstOrDefault() + }) + .ToList(); - var BarCodeGroup = await _pcbApi.PostBarcodeGroupList(JsonConvert.SerializeObject(barcodeGroups)); + var BarCodeGroup = await _pcbApi.PostBarcodeGroupList(JsonConvert.SerializeObject(barcodeGroups)); + + + #endregion - - #endregion - } @@ -1175,16 +1188,145 @@ namespace AMESCoreStudio.Web.Controllers } } - - //将資料Json化并传到前台视图 - return Json(new { data = "", success = true }); - - } + //将資料Json化并传到前台视图 + return Json(new { data = "", success = true }); + + } #endregion + #region PCB020 錫膏規格維護 + + public ActionResult PCB020() + { + return View(); + } + + + public async Task PCB020QueryAsync(string serialNo, string description, string vendor) + { + IResultModel result = await _pcbApi.GetSolderPasteSerialQuery(serialNo: serialNo, + description: description, vendor: vendor); + + if (result.Data.Count() != 0) + { + return Json(new Table() { code = 0, msg = "", data = result.Data, count = result.DataTotal }); + } + return Json(new Table() { count = 0, data = null }); + } + + //新增頁面 + public IActionResult PCB020C() + { + return View(); + } + + //修改頁面 + [HttpGet] + public async Task PCB020U(string id) + { + var result = await _pcbApi.GetSolderPasteSerial(id); + return View(result); + } + + /// + /// 頁面提交 + /// + /// + /// + [HttpPost] + public async Task PCB020Async(SolderPasteSerial model) + { + string actionType = Request.Form["ActionType"]; + + if (ModelState.IsValid) + { + // 1. 檢查所有必填欄位 + if (string.IsNullOrWhiteSpace(model.SerialNo) || string.IsNullOrWhiteSpace(model.Description) || + string.IsNullOrWhiteSpace(model.Alloy) || string.IsNullOrWhiteSpace(model.Vendor) || + string.IsNullOrWhiteSpace(model.Type)) + { + return Json(new { msg = "請填寫所有必填欄位", success = false }); + } + + // 2. 判斷是新增還是修改 + var exist = await _pcbApi.GetSolderPasteSerial(model.SerialNo); + + IResultModel result; + if (actionType == "Add") // 新增模式 + { + if (exist != null) + { + return Json(new { msg = $"錫膏代碼【{model.SerialNo}】已存在,不可重複新增", success = false }); + } + + var allSerials = await _pcbApi.GetSolderPasteSerial(); + if (allSerials.Any(x => x.Description.Trim().ToUpper() == model.Description.Trim().ToUpper())) + { + return Json(new { msg = $"錫膏規格【{model.Description}】已存在,不可重複新增", success = false }); + } + + if (model.SerialNo.Length != 2) + { + return Json(new { msg = "錫膏代碼必須為2碼", success = false }); + } + + model.CreateUserID = GetLogInUserID(); + model.CreateDate = DateTime.Now; + model.UpdateUserID = GetLogInUserID(); + model.UpdateDate = DateTime.Now; + result = await _pcbApi.PostSolderPasteSerial(JsonConvert.SerializeObject(model)); + } + else // 修改模式 (ActionType == "Edit") + { + if (exist == null) + { + return Json(new { msg = "找不到要修改的資料", success = false }); + } + + exist.Alloy = model.Alloy; // 只更新合金 + exist.UpdateUserID = GetLogInUserID(); + exist.UpdateDate = DateTime.Now; + + result = await _pcbApi.PutSolderPasteSerial(JsonConvert.SerializeObject(exist)); + } + + if (result.Success) + { + return Json(new { msg = "儲存成功!", success = true }); + } + else + { + return Json(new { msg = result.Msg, success = false }); + } + } + return Json(new { msg = "資料格式錯誤", success = false }); + } + + /// + /// PCB020S 錫膏規格 狀態更新 + /// + /// 代碼 + /// 狀態 + /// + [HttpPost] + public async Task PCB020S(string id, string status) + { + var model = new SolderPasteSerial { SerialNo = id, StatusNo = status }; + model.UpdateUserID = GetLogInUserID(); + model.UpdateDate = DateTime.Now; + + IResultModel result = await _pcbApi.PutSolderPasteSerialStatus(JsonConvert.SerializeObject(model)); + + if (result.Success) + return Json(new Result() { success = true, msg = "狀態更新成功" }); + else + return Json(new Result() { success = false, msg = result.Msg }); + } + + #endregion /// /// 登入UserID diff --git a/AMESCoreStudio.Web/Controllers/PCSController.cs b/AMESCoreStudio.Web/Controllers/PCSController.cs index 6437d9b..f4293a4 100644 --- a/AMESCoreStudio.Web/Controllers/PCSController.cs +++ b/AMESCoreStudio.Web/Controllers/PCSController.cs @@ -38,6 +38,7 @@ namespace AMESCoreStudio.Web.Controllers public readonly IFQC _fqcApi; public readonly IKCS _kcsApi; public readonly IBLL _bllApi; + public readonly IPCB _pcbApi; public readonly IFileServerProvider _fileServerProvider; private readonly IWebHostEnvironment _env; private readonly IStringLocalizer _sharedLocalizer; @@ -50,7 +51,7 @@ namespace AMESCoreStudio.Web.Controllers public PCSController(ILogger logger, ILogger log, ISYS sysApi, IPCS pcsApi, IBAS basApi, IPPS ppsApi, IFQC fqcApi , IFileServerProvider fileServerProvider, IWebHostEnvironment env, IKCS kcsApi, IStringLocalizerFactory factory - , IConfiguration configuration, IBLL bllApi) + , IConfiguration configuration, IBLL bllApi, IPCB pcbApi) { _logger = logger; _log = log; @@ -65,6 +66,7 @@ namespace AMESCoreStudio.Web.Controllers _sharedLocalizer = factory.Create("Controllers.PCS", "AMESCoreStudio.Web"); _configuration = configuration; _bllApi = bllApi; + _pcbApi = pcbApi; } #region Funcion BLL @@ -693,19 +695,30 @@ namespace AMESCoreStudio.Web.Controllers /// 工單資訊 板卡資訊 錫膏 /// /// - private void GetSolderPasteSelect(string SelectedValue = null) + /// + private async Task GetSolderPasteSelect(string SelectedValue = null, bool isReview = false) { - List values = new List(); - if (SelectedValue != null) + var solderPasteSerials = await _pcbApi.GetSolderPasteSerial(); + var q = solderPasteSerials.Where(x => isReview || x.StatusNo == "A") + .Select(s => new SelectListItem + { + Text = $"{s.Vendor}{s.Type}({s.Description})", + Value = s.SerialNo, + Selected = s.SerialNo == SelectedValue + }).ToList(); + + var otherItem = new SelectListItem { Text = "其他", Value = "N" }; + + if (!isReview && !string.IsNullOrEmpty(SelectedValue)) { - values = SelectedValue.Split(',').ToList(); + var isCurrentActive = solderPasteSerials.Any(x => x.SerialNo == SelectedValue && x.StatusNo == "A"); + if (!isCurrentActive) + { + otherItem.Selected = true; + } } - var q = Enum.GetValues(typeof(EnumPCS.EnumWipBoardSolderPasteType)).Cast() - .Select(s => new SelectListItem - { - Text = EnumPCS.GetDisplayName(s).ToString(), - Value = s.ToString() - }).ToList(); + + q.Add(otherItem); ViewBag.GetSolderPasteSelect = q; } @@ -2170,7 +2183,7 @@ namespace AMESCoreStudio.Web.Controllers model.itemNoCT1 = standardWorkTimes.Sum(m => m.TotalCT).ToString(); } - await WipDataSelectAll(model.wipAtt.WipNO, model.wipAtt.ItemNO, model.wipInfo.UnitNO); + await WipDataSelectAll(model.wipAtt.WipNO, model.wipAtt.ItemNO, model.wipInfo.UnitNO, model.wipBoard?.SolderPaste, true); GetCheckboxApproveLogo(model.wipLabel != null ? model.wipLabel.ApproveLogo : null); GetCheckboxCompanyLogo(model.wipLabel != null ? model.wipLabel.CompanyLogo : null); @@ -2327,7 +2340,7 @@ namespace AMESCoreStudio.Web.Controllers } - await WipDataSelectAll(model.wipAtt.WipNO, model.wipAtt.ItemNO, model.wipInfo.UnitNO); + await WipDataSelectAll(model.wipAtt.WipNO, model.wipAtt.ItemNO, model.wipInfo.UnitNO, model.wipBoard?.SolderPaste, false); GetCheckboxApproveLogo(model.wipLabel != null ? model.wipLabel.ApproveLogo : null); GetCheckboxCompanyLogo(model.wipLabel != null ? model.wipLabel.CompanyLogo : null); @@ -2505,7 +2518,7 @@ namespace AMESCoreStudio.Web.Controllers } - await WipDataSelectAll(model.wipAtt.WipNO, model.wipAtt.ItemNO, model.wipInfo.UnitNO); + await WipDataSelectAll(model.wipAtt.WipNO, model.wipAtt.ItemNO, model.wipInfo.UnitNO, model.wipBoard?.SolderPaste, false); GetCheckboxApproveLogo(model.wipLabel != null ? model.wipLabel.ApproveLogo : null); GetCheckboxCompanyLogo(model.wipLabel != null ? model.wipLabel.CompanyLogo : null); @@ -2542,7 +2555,7 @@ namespace AMESCoreStudio.Web.Controllers var UserID = GetLogInUserID(); #region 選單 - await WipDataSelectAll(model.wipInfo.WipNO, model.wipAtt.ItemNO, model.wipInfo.UnitNO); + await WipDataSelectAll(model.wipInfo.WipNO, model.wipAtt.ItemNO, model.wipInfo.UnitNO, model.wipBoard?.SolderPaste, false); GetCheckboxApproveLogo(model.wipLabel != null ? model.wipLabel.ApproveLogo : null); GetCheckboxCompanyLogo(model.wipLabel != null ? model.wipLabel.CompanyLogo : null); GetCheckboxPrintMode(model.wipLabel != null ? model.wipLabel.PrintMode : null); @@ -2864,7 +2877,7 @@ namespace AMESCoreStudio.Web.Controllers } - await WipDataSelectAll(model.wipAtt.WipNO, model.wipAtt.ItemNO, model.wipInfo.UnitNO); + await WipDataSelectAll(model.wipAtt.WipNO, model.wipAtt.ItemNO, model.wipInfo.UnitNO, model.wipBoard?.SolderPaste, false); GetCheckboxApproveLogo(model.wipLabel != null ? model.wipLabel.ApproveLogo : null); GetCheckboxCompanyLogo(model.wipLabel != null ? model.wipLabel.CompanyLogo : null); @@ -2885,7 +2898,7 @@ namespace AMESCoreStudio.Web.Controllers var UserID = GetLogInUserID(); #region 選單 - await WipDataSelectAll(model.wipInfo.WipNO, model.wipAtt.ItemNO, model.wipInfo.UnitNO); + await WipDataSelectAll(model.wipInfo.WipNO, model.wipAtt.ItemNO, model.wipInfo.UnitNO, model.wipBoard?.SolderPaste, false); GetCheckboxApproveLogo(model.wipLabel != null ? model.wipLabel.ApproveLogo : null); GetCheckboxCompanyLogo(model.wipLabel != null ? model.wipLabel.CompanyLogo : null); GetCheckboxPrintMode(model.wipLabel != null ? model.wipLabel.PrintMode : null); @@ -3090,8 +3103,10 @@ namespace AMESCoreStudio.Web.Controllers /// 工單號碼 /// 工單料號 /// 生產單位 + /// 錫膏 + /// 是否為檢視模式 /// - public async Task WipDataSelectAll(string WipNo = null, string ItemNo = "X", string UnitNo = "X") + public async Task WipDataSelectAll(string WipNo = null, string ItemNo = "X", string UnitNo = "X", string SolderPaste = null, bool isReview = false) { // KP Items await GetItemsList(); @@ -3128,7 +3143,7 @@ namespace AMESCoreStudio.Web.Controllers // 板卡資訊 PCB加工 GetPCBProcessingTypeSelect(); // 板卡資訊 錫膏 - GetSolderPasteSelect(); + await GetSolderPasteSelect(SolderPaste, isReview); // 工單狀態 標準 重工 GetWipType(); // 工程資訊 軟體料號Type diff --git a/AMESCoreStudio.Web/HttpApis/AMES/IPCB.cs b/AMESCoreStudio.Web/HttpApis/AMES/IPCB.cs index c3c94f8..17e9dc8 100644 --- a/AMESCoreStudio.Web/HttpApis/AMES/IPCB.cs +++ b/AMESCoreStudio.Web/HttpApis/AMES/IPCB.cs @@ -735,6 +735,48 @@ namespace AMESCoreStudio.Web + #endregion + + #region PCB020 錫膏規格維護 + + /// + /// 查詢錫膏規格資料 ID + /// + /// + [WebApiClient.Attributes.HttpGet("api/SolderPasteSerial/{id}")] + ITask GetSolderPasteSerial(string id); + + /// + /// 錫膏規格資料查詢 + /// + /// 錫膏編號 + /// 規格 + /// 廠商 + /// + [WebApiClient.Attributes.HttpGet("api/SolderPasteSerial/SolderPasteSerialQuery")] + ITask> GetSolderPasteSerialQuery(string serialNo = null, string description = null, string vendor = null); + + /// + /// 新增錫膏規格資料 + /// + /// + [WebApiClient.Attributes.HttpPost("api/SolderPasteSerial")] + ITask> PostSolderPasteSerial([FromBody, RawJsonContent] string model); + + /// + /// 更新錫膏規格資料 + /// + /// + [WebApiClient.Attributes.HttpPut("api/SolderPasteSerial")] + ITask> PutSolderPasteSerial([FromBody, RawJsonContent] string model); + + /// + /// 更新錫膏規格 -狀態 + /// + /// + [WebApiClient.Attributes.HttpPut("api/SolderPasteSerial/UpdateStatus")] + ITask> PutSolderPasteSerialStatus([FromBody, RawJsonContent] string model); + #endregion } } diff --git a/AMESCoreStudio.Web/Views/PCB/PCB020.cshtml b/AMESCoreStudio.Web/Views/PCB/PCB020.cshtml new file mode 100644 index 0000000..fd2b8b3 --- /dev/null +++ b/AMESCoreStudio.Web/Views/PCB/PCB020.cshtml @@ -0,0 +1,132 @@ +@{ + ViewData["Title"] = "錫膏規格維護"; + Layout = "~/Views/Shared/_AMESLayout.cshtml"; +} + +
+
+
+
+
@ViewBag.Title
+
+
+
+
+
+
+
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+
+
+ +
+
+
+
+
+
+
+
+ +@section Scripts{ + +} + diff --git a/AMESCoreStudio.Web/Views/PCB/PCB020C.cshtml b/AMESCoreStudio.Web/Views/PCB/PCB020C.cshtml new file mode 100644 index 0000000..8796840 --- /dev/null +++ b/AMESCoreStudio.Web/Views/PCB/PCB020C.cshtml @@ -0,0 +1,92 @@ +@model AMESCoreStudio.WebApi.Models.AMES.SolderPasteSerial + +@{ + Layout = "~/Views/Shared/_AMESLayout.cshtml"; +} + +
+
+
+
+
+ +
+ +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ +
+
+
+
+
+
+
+ +@section Scripts { + @{ + await Html.RenderPartialAsync("_ValidationScriptsPartial"); + } + +} + diff --git a/AMESCoreStudio.Web/Views/PCB/PCB020U.cshtml b/AMESCoreStudio.Web/Views/PCB/PCB020U.cshtml new file mode 100644 index 0000000..2977d04 --- /dev/null +++ b/AMESCoreStudio.Web/Views/PCB/PCB020U.cshtml @@ -0,0 +1,94 @@ +@model AMESCoreStudio.WebApi.Models.AMES.SolderPasteSerial + +@{ + Layout = "~/Views/Shared/_AMESLayout.cshtml"; +} + +
+
+
+
+
+ +
+ + +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ +
+
+
+
+
+
+
+@section Scripts { + @{ + await Html.RenderPartialAsync("_ValidationScriptsPartial"); + } + +} diff --git a/AMESCoreStudio.Web/Views/PCS/PCS003.cshtml b/AMESCoreStudio.Web/Views/PCS/PCS003.cshtml index f2f8ed0..d22692d 100644 --- a/AMESCoreStudio.Web/Views/PCS/PCS003.cshtml +++ b/AMESCoreStudio.Web/Views/PCS/PCS003.cshtml @@ -1322,16 +1322,16 @@ } // DIV keyPartsExcel - @if (Model.wipInfo.WipNO.StartsWith("981")) - { - $("#keyPartExcel").show(); - } - else - { - $("#keyPartExcel").hide(); - } + @if (Model.wipInfo.WipNO.StartsWith("981")) + { + $("#keyPartExcel").show(); + } + else + { + $("#keyPartExcel").hide(); + } - getLineInfoList($("#unit").val()); + getLineInfoList($("#unit").val()); // 產生條碼 $('#GetBarCode').click(function () { @@ -1354,6 +1354,19 @@ function PrefixInteger(num, length) { return (Array(length).join('0') + num).slice(-length); }; + + // 調整錫膏選單顯示 + var $solderPasteSelect = $('select[name="wipBoard.SolderPaste"]'); + var originalValue = "@Model.wipBoard?.SolderPaste"; // 取得後端傳過來的原始值 + + // 檢查下拉選單中是否存在該原始值的 option + var exists = $solderPasteSelect.find('option[value="' + originalValue + '"]').length > 0; + + // 如果原始值不在選單中,且不是檢視模式(如果是修改模式) + if (!exists && originalValue !== "") { + $solderPasteSelect.val('N'); // 強制選到「其他」 + layui.form.render('select'); // 如果有使用 layui,記得重新渲染 + } }); layui.config({ diff --git a/AMESCoreStudio.Web/Views/PCS/PCS034.cshtml b/AMESCoreStudio.Web/Views/PCS/PCS034.cshtml index 236310c..a8c8378 100644 --- a/AMESCoreStudio.Web/Views/PCS/PCS034.cshtml +++ b/AMESCoreStudio.Web/Views/PCS/PCS034.cshtml @@ -1292,6 +1292,19 @@ function PrefixInteger(num, length) { return (Array(length).join('0') + num).slice(-length); }; + + // 調整錫膏選單顯示 + var $solderPasteSelect = $('select[name="wipBoard.SolderPaste"]'); + var originalValue = "@Model.wipBoard?.SolderPaste"; // 取得後端傳過來的原始值 + + // 檢查下拉選單中是否存在該原始值的 option + var exists = $solderPasteSelect.find('option[value="' + originalValue + '"]').length > 0; + + // 如果原始值不在選單中,且不是檢視模式(如果是修改模式) + if (!exists && originalValue !== "") { + $solderPasteSelect.val('N'); // 強制選到「其他」 + layui.form.render('select'); // 如果有使用 layui,記得重新渲染 + } }); layui.config({ diff --git a/AMESCoreStudio.WebApi/Controllers/AMES/SolderPasteSerialController.cs b/AMESCoreStudio.WebApi/Controllers/AMES/SolderPasteSerialController.cs index 87e177c..67535db 100644 --- a/AMESCoreStudio.WebApi/Controllers/AMES/SolderPasteSerialController.cs +++ b/AMESCoreStudio.WebApi/Controllers/AMES/SolderPasteSerialController.cs @@ -9,6 +9,9 @@ using AMESCoreStudio.WebApi; using AMESCoreStudio.WebApi.Models.AMES; using AMESCoreStudio.WebApi.DTO.AMES; using AMESCoreStudio.CommonTools.Result; +using AMESCoreStudio.WebApi.Enum; +using Dapper; +using AMESCoreStudio.WebApi.Extensions; namespace AMESCoreStudio.WebApi.Controllers.AMES { @@ -32,7 +35,6 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES return await _context.SolderPasteSerials.ToListAsync(); } - [HttpGet("{id}")] public async Task> GetSolderPasteSerial(string id) { @@ -40,6 +42,42 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES return solderPasteSerial; } + /// + /// 錫膏規格維護資料查詢 + /// + /// 錫膏代號 + /// 規格 + /// 廠商 + /// + [HttpGet("SolderPasteSerialQuery")] + public async Task> SolderPasteSerial(string serialNo, string description, string vendor) + { + var q = await _context.SolderPasteSerials.ToListAsync(); + + if (!string.IsNullOrWhiteSpace(serialNo)) + { + q = q.Where(w => w.SerialNo.ToUpper() == serialNo.Trim().ToUpper()).ToList(); + } + + if (!string.IsNullOrWhiteSpace(description)) + { + q = q.Where(w => w.Description.Contains(description.Trim())).ToList(); + } + + if (!string.IsNullOrWhiteSpace(vendor)) + { + q = q.Where(w => w.Vendor.Contains(vendor.Trim())).ToList(); + } + + ResultModel result = new ResultModel(); + + // 紀錄筆數 + result.DataTotal = q.Count(); + result.Data = q; + + return result; + } + /// /// 自動取得編號 /// @@ -71,7 +109,7 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES } /// - /// 更新錫膏規格流水碼表 + /// 更新錫膏規格 /// /// /// @@ -96,7 +134,7 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES } /// - /// 更新錫膏規格流水碼表 + /// 更新錫膏規格 By流水碼表 /// /// 規格 /// @@ -123,6 +161,34 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES return result; } + /// + /// 更新錫膏規格-狀態 + /// + /// + [HttpPut("UpdateStatus")] + public async Task> PutSolderPasteSerialStatus(SolderPasteSerial solderPasteSerial) + { + ResultModel result = new ResultModel(); + try + { + var query = @" UPDATE JHAMES.SOLDER_PASTE_SERIAL SET + STATUS_NO = :StatusNo , + UPDATE_DATE = sysdate , + UPDATE_USERID = :UpdateUserID + WHERE SERIAL_NO = :SerialNo "; + + await _context.Database.DapperExecuteAsync(query, solderPasteSerial); + result.Success = true; + result.Msg = "OK"; + } + catch (Exception ex) + { + result.Success = false; + result.Msg = ex.InnerException?.Message ?? ex.Message; + } + return result; + } + /// /// 新增錫膏規格流水碼表 /// @@ -148,10 +214,10 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES } // DELETE: api/SolderPasteSerial/5 - [HttpDelete("{id}")] - public async Task> DeleteSolderPasteSerial(string id) + [HttpDelete("{no}")] + public async Task> DeleteSolderPasteSerial(string no) { - var solderPasteSerial = await _context.SolderPasteSerials.FindAsync(id); + var solderPasteSerial = await _context.SolderPasteSerials.FindAsync(no); if (solderPasteSerial == null) { return NotFound(); diff --git a/AMESCoreStudio.WebApi/Models/AMES/SolderPasteSerial.cs b/AMESCoreStudio.WebApi/Models/AMES/SolderPasteSerial.cs index bf5927e..28eccb5 100644 --- a/AMESCoreStudio.WebApi/Models/AMES/SolderPasteSerial.cs +++ b/AMESCoreStudio.WebApi/Models/AMES/SolderPasteSerial.cs @@ -54,5 +54,51 @@ namespace AMESCoreStudio.WebApi.Models.AMES [DataMember] public string Vendor { get; set; } + /// + /// 種類 + /// + [Required] + [Column("TYPE")] + [DataMember] + public string Type { get; set; } + + /// + /// 狀態 + /// + [Required] + [Column("STATUS_NO")] + [DataMember] + public string StatusNo { get; set; } = "A"; + + /// + /// 建立UserID + /// + [Column("CREATE_USERID")] + [Required] + [DataMember] + public int CreateUserID { get; set; } = 0; + + /// + /// 建立日期 + /// + [Required] + [Column("CREATE_DATE")] + [DataMember] + public DateTime CreateDate { get; set; } = DateTime.Now; + + /// + /// 更新UserID + /// + [Column("UPDATE_USERID")] + [DataMember] + public int UpdateUserID { get; set; } = 0; + + /// + /// 更新日期 + /// + [Column("UPDATE_DATE")] + [DataMember] + public DateTime? UpdateDate { get; set; } = DateTime.Now; + } } diff --git a/AMESCoreStudio.WebApi/Models/AMESContext.cs b/AMESCoreStudio.WebApi/Models/AMESContext.cs index f2c8809..379efd1 100644 --- a/AMESCoreStudio.WebApi/Models/AMESContext.cs +++ b/AMESCoreStudio.WebApi/Models/AMESContext.cs @@ -1001,10 +1001,10 @@ namespace AMESCoreStudio.WebApi /// public virtual DbSet AUSBarcodeInfos { get; set; } - /// - /// 錫膏固定編碼流水碼表 - /// - public virtual DbSet SolderPasteSerials { get; set; } + /// + /// 錫膏規格維護資料檔表 + /// + public virtual DbSet SolderPasteSerials { get; set; } /// ///報工生產單位別