From 12211e99a46be687978563591fd6725adc3e6e48 Mon Sep 17 00:00:00 2001 From: yiru Date: Thu, 26 Jun 2025 11:11:56 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=A8=99=E5=B7=A5=E8=B3=87?= =?UTF-8?q?=E6=96=99=E7=B6=AD=E8=AD=B7=E7=95=AB=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/WHSController.cs | 322 ++++++++++------- AMESCoreStudio.Web/HttpApis/AMES/IWHS.cs | 83 ++++- .../ViewModels/WHS/WHS025ViewModel.cs | 35 +- AMESCoreStudio.Web/Views/WHS/WHS025.cshtml | 38 +-- AMESCoreStudio.Web/Views/WHS/WHS025C.cshtml | 37 +- AMESCoreStudio.Web/Views/WHS/WHS025L.cshtml | 65 ++++ AMESCoreStudio.Web/Views/WHS/WHS025U.cshtml | 56 ++- .../AMES/WorkingLinesController.cs | 25 +- .../AMES/WorkingStandardWorkTimeController.cs | 323 ++++++++++++++++-- .../WorkingStandardWorkTimeLogController.cs | 96 ++++-- .../AMES/WorkingStationsController.cs | 22 ++ .../AMES/WorkingUnitsController.cs | 45 +++ .../Controllers/BAS/FactoryUnitsController.cs | 22 ++ 13 files changed, 931 insertions(+), 238 deletions(-) create mode 100644 AMESCoreStudio.Web/Views/WHS/WHS025L.cshtml diff --git a/AMESCoreStudio.Web/Controllers/WHSController.cs b/AMESCoreStudio.Web/Controllers/WHSController.cs index e70a852..05da5f7 100644 --- a/AMESCoreStudio.Web/Controllers/WHSController.cs +++ b/AMESCoreStudio.Web/Controllers/WHSController.cs @@ -3486,19 +3486,22 @@ namespace AMESCoreStudio.Web.Controllers public async Task WHS025UAsync(int id) { await GetWorkingUnit(""); //報工生產單位 - await GetFactoryUnitsListbyWH005(""); //途程生產單位 + GetSideList(); + var result = await _whsApi.GetWorkingStandardWorkTime(id); if (result.Count == 0) { return View(); } + return View(result[0]); } public async Task WHS025DAsync(int id) { - var result = await _whsApi.DeleteWorkingStandardWorkTime(id); + var deleteUserID = int.Parse(Request.Cookies["UserID"]); + var result = await _whsApi.DeleteWorkingStandardWorkTime(id, deleteUserID); return Json(new Result() { success = true, msg = "" }); } [HttpPost] @@ -3520,7 +3523,6 @@ namespace AMESCoreStudio.Web.Controllers ItemNo = model.ItemNo, WorkingUnitNo = model.WorkingUnitNo, UnitNo = model.UnitNo, - WorkingStationID = model.WorkingStationID, Side = model.Side, OpCnt = model.OpCnt, @@ -3540,13 +3542,13 @@ namespace AMESCoreStudio.Web.Controllers var json = JsonConvert.SerializeObject(item); var result = await _whsApi.PostWorkingStandardWorkTime(json); - if (!result.Success) { // 其中一筆失敗就回傳錯誤 ModelState.AddModelError("error", $"線別ID {lineId} 錯誤:{result.Msg}"); return View("WHS025C", model); } + } return RedirectToAction("Refresh", "Home", new { msg = "添加成功!" }); @@ -3600,6 +3602,43 @@ namespace AMESCoreStudio.Web.Controllers } return View("WHS025U", model); } + [HttpGet] + public async Task WHS025LAsync(int id) + { + return View(id); + } + + [ResponseCache(Duration = 0)] + [HttpGet] + public async Task GetWorkingUnitNobyUnitAsync(string id) + { + var result = await _whsApi.GetWorkingUnitbyNo(id); + var data = new List(); + + if (result != null && result.Count > 0) + { + var unitNo = result[0].UnitNo; + var resultUnit = await _basApi.GetFactoryUnits(); + + for (int i = 0; i < resultUnit.Count; i++) + { + if (resultUnit[i].UnitNo == unitNo ) + + data.Add(new FactoryUnit + { + UnitNo = resultUnit[i].UnitNo, + UnitName = resultUnit[i].UnitName + }); + + } + return Json(new Table { code = 0, msg = "", data = data, count = 1 }); + + + } + + return Json(new Table { code = 0, msg = "No data found", data = null, count = 0 }); + } + [ResponseCache(Duration = 0)] @@ -3617,6 +3656,9 @@ namespace AMESCoreStudio.Web.Controllers } + + + [ResponseCache(Duration = 0)] [HttpGet] public async Task GetWorkingStationsbyUnitAsync(string id) @@ -3633,19 +3675,19 @@ namespace AMESCoreStudio.Web.Controllers - [ResponseCache(Duration = 0)] - [HttpGet] - public async Task GetWorkingStandardWorkTimesAsync() - { - var result = await _whsApi.GetWorkingStandardWorkTimes(); + //[ResponseCache(Duration = 0)] + //[HttpGet] + //public async Task GetWorkingStandardWorkTimesAsync() + //{ + // var result = await _whsApi.GetWorkingStandardWorkTimes(); - if (result.DataTotal > 0) - { - return Json(new Table() { code = 0, msg = "", data = result.Data, count = result.DataTotal }); - } + // 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 }); - } + // return Json(new Table() { count = 0, data = null }); + //} [ResponseCache(Duration = 0)] [HttpGet] @@ -3667,7 +3709,7 @@ namespace AMESCoreStudio.Web.Controllers } - var result = await _whsApi.GetWorkingStandardWorkTimesbyQuery(u, l, i, page, limit); + var result = await _whsApi.GetWorkingStandardWorkTimesbyMultiQuery(u, l, i, page, limit); if (result.DataTotal > 0) { return Json(new Table() { code = 0, msg = "", data = result.Data, count = result.DataTotal }); @@ -3692,23 +3734,36 @@ namespace AMESCoreStudio.Web.Controllers ViewBag.FactoryUnit = UnitItems; } + [ResponseCache(Duration = 0)] + [HttpGet] + public async Task GetWorkingStandardWorkTimesLogAsync(int id, int page = 0, int limit = 10) + { + + var result = await _whsApi.GetWorkingStandardWorkTimeLogMulti(id,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 }); + } /// - ///標準工時批次Excel匯入 + /// 標準工時批次Excel匯入 /// /// /// [HttpPost] public async Task WHS025ExcelUpload(IFormFile Uploader) { - + var user_id = Request.Cookies["UserID"]; //通過上傳檔案流初始化Mapper using (var workbook = new XLWorkbook(Uploader.OpenReadStream())) { try { - List barcodeGroup = new List(); + List workingST = new List(); string Msg = string.Empty; var worksheet = workbook.Worksheet(1); @@ -3720,119 +3775,134 @@ namespace AMESCoreStudio.Web.Controllers var data = worksheet.Range(firstCell.Address, lastCell.Address); var rowCount = data.RowCount(); var columnCount = data.ColumnCount(); + var ErrorMsg = ""; + var recordKeys = new HashSet(); // 用於檢查組合是否重複 for (int i = 2; i <= rowCount; i++) { - string seq = data.Cell(i, 2).Value.ToString(); - int sequence; - bool isNumeric = int.TryParse(seq, out sequence); - - if (!isNumeric) + var rowMsg = $"[第{i}列] "; + try { - return Json(new Result() { success = false, msg = "Group順序" + seq + "請輸入數字", data = null }); - + var ItemNo = data.Cell(i, 1).GetString().Trim(); + var WorkingUnitName = data.Cell(i, 2).GetString().Trim(); + var WorkingLineName = data.Cell(i, 3).GetString().Trim(); + var WorkingStationName = data.Cell(i, 4).GetString().Trim(); + // var UnitName = data.Cell(i, 5).GetString().Trim(); + var Side = data.Cell(i, 5).GetString().Trim(); + var OpCntStr = data.Cell(i, 6).GetString().Trim(); + var CtStr = data.Cell(i, 7).GetString().Trim(); + var StationID = data.Cell(i, 8).GetString().Trim(); + var MachineCntStr = data.Cell(i, 9).GetString().Trim(); + var Remark = data.Cell(i, 10).GetString().Trim(); + + // 組合唯一鍵 + var rowKey = $"{ItemNo}|{WorkingUnitName}|{WorkingLineName}|{WorkingStationName}|{Side}"; + if (recordKeys.Contains(rowKey)) + { + ErrorMsg += $"{rowMsg}資料重複:相同的料號與單位線別站別已存在。\n"; + continue; + } + recordKeys.Add(rowKey); + + if (string.IsNullOrWhiteSpace(ItemNo)) { ErrorMsg += $"{rowMsg}料號不得為空\n"; continue; } + + if (string.IsNullOrWhiteSpace(WorkingUnitName)) { ErrorMsg += $"{rowMsg}報工生產單位不得為空\n"; continue; } + if (string.IsNullOrWhiteSpace(WorkingLineName)) { ErrorMsg += $"{rowMsg}報工線別不得為空\n"; continue; } + if (string.IsNullOrWhiteSpace(WorkingStationName)) { ErrorMsg += $"{rowMsg}報工站別不得為空\n"; continue; } + // if (string.IsNullOrWhiteSpace(UnitName)) { ErrorMsg += $"{rowMsg}途程單位不得為空\n"; continue; } + List validSides = new List { "正面", "背面" }; + if (string.IsNullOrWhiteSpace(Side)) { ErrorMsg += $"{rowMsg}面別不得為空\n"; continue; } + else if (!validSides.Contains(Side)) + { + ErrorMsg += $"{rowMsg}面別資料錯誤,請使用 N/A、正面、背面\n"; + continue; + } + + if (!int.TryParse(OpCntStr, out int OpCnt)) + { + ErrorMsg += $"{rowMsg}人數格式錯誤\n"; continue; + } + if (OpCnt <= 0) + { + ErrorMsg += $"{rowMsg}人數必須大於 0\n"; continue; + } + + if (!int.TryParse(CtStr, out int Ct)) + { + ErrorMsg += $"{rowMsg}CT格式錯誤\n"; continue; + } + if (Ct <= 0) + { + ErrorMsg += $"{rowMsg}CT 必須大於 0\n"; continue; + } + + if (string.IsNullOrWhiteSpace(StationID)) + { + ErrorMsg += $"{rowMsg}工站ID不得為空\n"; continue; + } + + if (!int.TryParse(MachineCntStr, out int MachineCnt)) + { + ErrorMsg += $"{rowMsg}機台數格式錯誤\n"; continue; + } + if (MachineCnt < 0) + { + ErrorMsg += $"{rowMsg}機台數不得為負值\n"; continue; + } + + if (!string.IsNullOrWhiteSpace(Remark) && Remark.Length > 500) + { + ErrorMsg += $"{rowMsg}備註過長,限制500字以內\n"; continue; + } + // 資料對應檢查 + var WU = await _whsApi.GetWorkingUnitbyName(WorkingUnitName); + var WL = await _whsApi.GetWorkingLinebyName(WorkingLineName); + var WS = await _whsApi.GetWorkingStationbyName(WorkingStationName); + // var UN = await _whsApi.GetFactoryUnitbyName(UnitName); + + if (WU.Count == 0) { ErrorMsg += $"{rowMsg}查無 報工生產單位「{WorkingUnitName}」\n"; continue; } + if (WL.Count == 0) { ErrorMsg += $"{rowMsg}查無 報工線別「{WorkingLineName}」\n"; continue; } + if (WS.Count == 0) { ErrorMsg += $"{rowMsg}查無 報工站別「{WorkingStationName}」\n"; continue; } + // if (UN.Count == 0) { ErrorMsg += $"{rowMsg}查無 途程生產單位「{UnitName}」\n"; continue; } + + // 加入清單 + workingST.Add(new WorkingStandardWorkTime + { + WorkingUnitNo = WU[0].WorkingUnitNo, + WorkingLineID = WL[0].WorkingLineID, + WorkingStationID = WS[0].WorkingStationID, + // UnitNo = UN[0].UnitNo, + UnitNo = WU[0].UnitNo, + ItemNo = ItemNo, + Side = Side, + OpCnt = OpCnt, + Ct = Ct, + StationID = StationID, + MachineCnt = MachineCnt, + Remark = Remark, + CreateDate = System.DateTime.Now, + CreateUserID = int.Parse(user_id), + UpdateDate = System.DateTime.Now, + UpdateUserID = int.Parse(user_id) + }); } - - barcodeGroup.Add(new BarcodeGroupDto + catch (Exception ex) { - WipNo = data.Cell(i, 1).Value.ToString(), - Sequence = int.Parse(data.Cell(i, 2).Value.ToString()), - BarcodeNo = data.Cell(i, 3).Value.ToString(), - }); - - - //#region 判斷序號是否在工單區間內 - //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 }); - //} - //#endregion - - //#region 判斷序號在Excel中是否重覆 - //var duplicateBarcodeNos = barcodeGroup.GroupBy(x => x.BarcodeNo) - // .Where(group => group.Count() > 1) - // .Select(group => group.Key); - //if (duplicateBarcodeNos.Any()) - //{ - - // return Json(new Result() { success = false, msg = "Excel檔案內的生產序號" + string.Join(", ", duplicateBarcodeNos) + "重覆", data = null }); - //} - //#endregion - //#region 判斷序號是否已綁定群組 - - //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 }); - // } - //} - - - //#endregion - } - //#region 檢查工單是否全部一致 - //if (barcodeGroup.Select(s => s.WipNo).Distinct().Count() != 1) - //{ - // return Json(new Result() { success = false, msg = "Excel檔案內的工單不一致不可匯入", data = null }); - - //} - //#endregion - - - - //foreach (var item in barcodeGroup.Select(s => s.Sequence).Distinct()) - //{ - // foreach (var item1 in barcodeGroup.Where(w => w.Sequence == item)) - // { - - // #region 產生BarcodeInfo - // var barcodeInfo = new BarcodeInfo - // { - // BarcodeNo = item1.BarcodeNo, - // StationID = -1, - // LocationID = -1, - // WipID = -1, - // RuleStatus = "P", - // StatusID = -1, - // SysType = "S", - // StatusNo = "-1", - // CreateUserID = GetLogInUserID() - // }; - - // var PostResult = await _pcsApi.PostBarcodeInfoes(JsonConvert.SerializeObject(barcodeInfo)); - - // #endregion - // } - // #region 綁定Group - - // 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(); - - // var BarCodeGroup = await _pcbApi.PostBarcodeGroupList(JsonConvert.SerializeObject(barcodeGroups)); - - - // #endregion - - - //} - - return Json(new Result() { success = true, msg = "綁定成功", data = null }); - + ErrorMsg += $"{rowMsg}資料處理異常: {ex.Message}\n"; + continue; + } + } + if (!string.IsNullOrEmpty(ErrorMsg)) + { + return Json(new Result() { success = false, msg = $"匯入失敗:\n{ErrorMsg}", data = null }); + } + else + { + var postData = await _whsApi.PostWorkingStandardWorkTimeList(JsonConvert.SerializeObject(workingST)); + + return Json(new Result() { success = true, msg = "匯入成功", data = null }); + } + } catch (Exception ex) { diff --git a/AMESCoreStudio.Web/HttpApis/AMES/IWHS.cs b/AMESCoreStudio.Web/HttpApis/AMES/IWHS.cs index f7834a9..e2ac6f4 100644 --- a/AMESCoreStudio.Web/HttpApis/AMES/IWHS.cs +++ b/AMESCoreStudio.Web/HttpApis/AMES/IWHS.cs @@ -843,6 +843,44 @@ namespace AMESCoreStudio.Web #endregion #region WHS025 標準工時資料 + + + /// + /// 根據Name獲取指定報工線別基本資料查詢資料 + /// + /// + [WebApiClient.Attributes.HttpGet("api/WorkingLines/Name/{id}")] + ITask> GetWorkingLinebyName(string id); + + /// + /// 根據Name獲取指定報工站別基本資料查詢資料 + /// + /// + [WebApiClient.Attributes.HttpGet("api/WorkingStations/Name/{id}")] + ITask> GetWorkingStationbyName(string id); + + /// + /// 根據Name獲取指定報工生產單位基本資料查詢資料 + /// + /// + [WebApiClient.Attributes.HttpGet("api/WorkingUnits/Name/{id}")] + ITask> GetWorkingUnitbyName(string id); + + + /// + /// 根據ID獲取指定報工生產單位別查詢資料 + /// + /// + [WebApiClient.Attributes.HttpGet("api/WorkingUnits/No/{no}")] + ITask> GetWorkingUnitbyNo(string no); + + /// + /// 根據Name獲取该單位资料 + /// + /// + [WebApiClient.Attributes.HttpGet("api/FactoryUnits/Name/{id}")] + ITask> GetFactoryUnitbyName(string id); + /// /// 新增報工標準工時資料檔 /// @@ -861,8 +899,8 @@ namespace AMESCoreStudio.Web /// 刪除報工標準工時資料檔 /// /// - [WebApiClient.Attributes.HttpDelete("api/WorkingStandardWorkTimes/{id}")] - ITask> DeleteWorkingStandardWorkTime(int id); + [WebApiClient.Attributes.HttpDelete("api/WorkingStandardWorkTimes/{id}/{deleteUserID}")] + ITask> DeleteWorkingStandardWorkTime(int id,int deleteUserID); /// /// 根據ID獲取指定報工標準工時資料檔查詢資料 @@ -885,6 +923,47 @@ namespace AMESCoreStudio.Web [WebApiClient.Attributes.HttpGet("api/WorkingStandardWorkTimes/WHS025/{u}/{l}/{i}")] ITask> GetWorkingStandardWorkTimesbyQuery(string u, int l, string i,int page = 0, int limit = 10); + + + /// + /// 獲取報工標準工時資料檔查詢資料 + /// + /// + [WebApiClient.Attributes.HttpGet("api/WorkingStandardWorkTimes/WHS025Multi/{u}/{l}/{i}")] + ITask> GetWorkingStandardWorkTimesbyMultiQuery(string u, int l, string i, int page = 0, int limit = 10); + + + /// + /// 新增報工標準工時資料檔LOG + /// + /// + [WebApiClient.Attributes.HttpPost("api/WorkingStandardWorkTimeLog")] + ITask> PostWorkingStandardWorkTimeLog([FromBody, RawJsonContent] string model); + + + /// + /// 根據ID獲取指定報工標準工時資料檔異動記錄 + /// + /// + [WebApiClient.Attributes.HttpGet("api/WorkingStandardWorkTimeLogs/{id}")] + ITask> GetWorkingStandardWorkTimeLog(int id); + + + /// + /// 根據ID獲取指定報工標準工時資料檔異動記錄 + /// + /// + [WebApiClient.Attributes.HttpGet("api/WorkingStandardWorkTimeLogs/WHS025LMulti/{id}")] + ITask> GetWorkingStandardWorkTimeLogMulti(int id,int page = 0, int limit = 10); + + + /// + /// 新增報工標準工時資料檔List + /// + /// + [WebApiClient.Attributes.HttpPost("api/WorkingStandardWorkTimes/byList")] + ITask> PostWorkingStandardWorkTimeList([FromBody, RawJsonContent] string model); + #endregion } } diff --git a/AMESCoreStudio.Web/ViewModels/WHS/WHS025ViewModel.cs b/AMESCoreStudio.Web/ViewModels/WHS/WHS025ViewModel.cs index 68f2e36..bba9c97 100644 --- a/AMESCoreStudio.Web/ViewModels/WHS/WHS025ViewModel.cs +++ b/AMESCoreStudio.Web/ViewModels/WHS/WHS025ViewModel.cs @@ -14,27 +14,47 @@ namespace AMESCoreStudio.Web.ViewModels.WHS { public int WorkingStandardID { get; set; } + [Required(ErrorMessage = "{0},不能空白")] + [Display(Name = "報工生產單位")] public string WorkingUnitNo { get; set; } - public List WorkingLineIDs { get; set; } - public int WorkingLineID { get; set; } + public List WorkingLineIDs { get; set; } + [Display(Name = "報工生產線別")] + public int WorkingLineID { get; set; } + [Display(Name = "報工生產站別")] public int WorkingStationID { get; set; } + [Required(ErrorMessage = "{0},不能空白")] + [Display(Name = "途程生產單位")] public string UnitNo { get; set; } + [Required(ErrorMessage = "{0},不能空白")] + [Display(Name = "工程編號")] public string ItemNo { get; set; } + [Required(ErrorMessage = "{0},不能空白")] + [Display(Name = "正背面")] public string Side { get; set; } - + + [Required(ErrorMessage = "{0},不能空白")] + [Display(Name = "標準人力")] public int OpCnt { get; set; } - + + [Required(ErrorMessage = "{0},不能空白")] + [Display(Name = "標準工時(分)")] public int Ct { get; set; } + [Required(ErrorMessage = "{0},不能空白")] + [Display(Name = "對應途程站別ID")] public string StationID { get; set; } + [Required(ErrorMessage = "{0},不能空白")] + [Display(Name = "作業機台數")] public int MachineCnt { get; set; } + [Required(ErrorMessage = "{0},不能空白")] + [Display(Name = "備註")] public string Remark { get; set; } public int CreateUserID { get; set; } @@ -45,13 +65,18 @@ namespace AMESCoreStudio.Web.ViewModels.WHS public DateTime UpdateDate { get; set; } + + [Display(Name = "報工生產單位")] // 顯示用欄位 public string WorkingUnitName { get; set; } + [Display(Name = "報工生產線別")] public string WorkingLineName { get; set; } - + + [Display(Name = "報工生產站別")] public string WorkingStationName { get; set; } + [Display(Name = "途程生產單位")] public string UnitName { get; set; } } diff --git a/AMESCoreStudio.Web/Views/WHS/WHS025.cshtml b/AMESCoreStudio.Web/Views/WHS/WHS025.cshtml index 2d29728..de5df56 100644 --- a/AMESCoreStudio.Web/Views/WHS/WHS025.cshtml +++ b/AMESCoreStudio.Web/Views/WHS/WHS025.cshtml @@ -66,37 +66,17 @@ title: '工程編號', }, { - field: 'workingUnitNo', + field: 'workingUnitName', title: '報工生產單位', }, { - field: 'workingLineID', + field: 'workingLineName', title: '報工線別', - templet: function (d) { - var line; - if (d.lineInfo) - line = d.lineInfo["lineDesc"]; - else - line = "N/A"; - - return line; - } }, { - field: 'workingStationID', + field: 'workingStationName', title: '報工站別', - templet: function (d) { - var station; - if (d.stations) - station = d.stations["stationWHName"]; - else - station = "N/A"; - - return station; - - } }, - { field: 'side', title: '面別', @@ -122,7 +102,7 @@ title: '修改日', }, { - field: 'updateUserID', + field: 'updateUserName', title: '修改人', }, { @@ -136,7 +116,8 @@ templet: function (item) { var btn = '修改'; btn += ' 刪除'; - btn += ' 歷程'; + btn += ' 瀏覽'; + return btn } } @@ -178,6 +159,13 @@ } } + function log(obj) { + if (obj.data.workingStandardID) { + hg.open('標準工時修改歷程', '/WHS/WHS025L/' + obj.data.workingStandardID, '', '', true); + + } + } + ////搜索 $('#btnSearch').click(function () { diff --git a/AMESCoreStudio.Web/Views/WHS/WHS025C.cshtml b/AMESCoreStudio.Web/Views/WHS/WHS025C.cshtml index eb5bddf..9159957 100644 --- a/AMESCoreStudio.Web/Views/WHS/WHS025C.cshtml +++ b/AMESCoreStudio.Web/Views/WHS/WHS025C.cshtml @@ -31,14 +31,12 @@ - +
- - - + + +
@@ -113,6 +111,7 @@ getLineInfoes_checkBox(data); getWorkingStations(data); + getUnitNo(data); }); @@ -163,7 +162,7 @@ function getLineInfoes(data) { $.ajax({ - url: "/WHS/GetWorkingLinesbyUnit", + url: "/WHS/GetWorkingUnitNobyUnit", dataType: 'json', data: { id: data }, contentType: "application/json", @@ -222,6 +221,30 @@ }); }; + function getUnitNo(data) { + $.ajax({ + url: "/WHS/GetWorkingUnitNobyUnit", + dataType: 'json', + data: { id: data }, + contentType: "application/json", + type: 'get', + success: function (result) { + if (result.data) { + let count = 0; + $.each(result.data, function (index, item) { + // 只顯示第一筆資料,或依你邏輯調整 + if (count == 0) { + $('#UnitNoLabel').text(item.unitName); // 顯示文字 + $('#UnitNo').val(item.unitNo); // 設定 hidden input 值 + + count++; + } + }); + } + } + }); + } + diff --git a/AMESCoreStudio.Web/Views/WHS/WHS025L.cshtml b/AMESCoreStudio.Web/Views/WHS/WHS025L.cshtml new file mode 100644 index 0000000..33b94cb --- /dev/null +++ b/AMESCoreStudio.Web/Views/WHS/WHS025L.cshtml @@ -0,0 +1,65 @@ +@model int +@{ + ViewData["Title"] = "標準工時修改歷程"; + Layout = "~/Views/Shared/_AMESLayout.cshtml"; +} +
+
+
@ViewBag.Title
+
+
+ +
+
+
+ +@section Scripts { + +} \ No newline at end of file diff --git a/AMESCoreStudio.Web/Views/WHS/WHS025U.cshtml b/AMESCoreStudio.Web/Views/WHS/WHS025U.cshtml index a9a7910..464ca11 100644 --- a/AMESCoreStudio.Web/Views/WHS/WHS025U.cshtml +++ b/AMESCoreStudio.Web/Views/WHS/WHS025U.cshtml @@ -14,7 +14,7 @@
- + @@ -22,30 +22,29 @@
- +
- +
- - - + + +
-
- @@ -96,19 +95,25 @@ @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); await Html.RenderPartialAsync("_FileinputScriptsPartial"); } - + count++; + } + }); + } + } + }); + } + + } diff --git a/AMESCoreStudio.WebApi/Controllers/AMES/WorkingLinesController.cs b/AMESCoreStudio.WebApi/Controllers/AMES/WorkingLinesController.cs index dba8c43..c7419d0 100644 --- a/AMESCoreStudio.WebApi/Controllers/AMES/WorkingLinesController.cs +++ b/AMESCoreStudio.WebApi/Controllers/AMES/WorkingLinesController.cs @@ -74,13 +74,36 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES } + + /// + /// 用Name获取该報工線別基本資料 + /// + /// + /// + [HttpGet("Name/{name}")] + public async Task>> GetWorkingLinebyName(string name) + { + + IQueryable q = _context.WorkingLines; + q = q.Where(p => p.WorkingLineName.Equals(name)); + var WorkingLine = await q.ToListAsync(); + + if (WorkingLine == null) + { + return NotFound(); + } + + return WorkingLine; + } + + /// /// 用生產單位获取该報工線別基本資料 /// /// 報工生產單位 /// [HttpGet("Unit/{id}")] - public async Task>> GetWorkingLines(string id) + public async Task>> GetWorkingLinesbyUnit(string id) { IQueryable q = _context.WorkingLines; diff --git a/AMESCoreStudio.WebApi/Controllers/AMES/WorkingStandardWorkTimeController.cs b/AMESCoreStudio.WebApi/Controllers/AMES/WorkingStandardWorkTimeController.cs index 85dd17a..b672249 100644 --- a/AMESCoreStudio.WebApi/Controllers/AMES/WorkingStandardWorkTimeController.cs +++ b/AMESCoreStudio.WebApi/Controllers/AMES/WorkingStandardWorkTimeController.cs @@ -132,6 +132,83 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES } + /// + /// WHS025 + /// + /// + /// + /// + /// + // GET: api/StandardWorkTimes/5 + [HttpGet("WHS025Multi/{u}/{l}/{i}")] + public async Task> GetWorkingStandardWorkTimebyMultiQuery(string u, int l, string i, int page = 0, int limit = 10) + { + + ResultModel result = new ResultModel(); + + + var q = from q1 in _context.WorkingStandardWorkTimes + join q2 in _context.WorkingUnits on q1.WorkingUnitNo equals q2.WorkingUnitNo + join q3 in _context.WorkingLines on q1.WorkingLineID equals q3.WorkingLineID + join q4 in _context.WorkingStations on q1.WorkingStationID equals q4.WorkingStationID + join q5 in _context.UserInfoes on q1.UpdateUserID equals q5.UserID + select new + { + q1.WorkingStandardID, + q1.ItemNo, + q1.WorkingUnitNo, + q1.UnitNo, + q1.WorkingLineID, + q1.WorkingStationID, + q1.Side, + q1.OpCnt, + q1.Ct, + q1.StationID, + q1.MachineCnt, + q1.Remark, + q1.CreateUserID, + q1.CreateDate, + q1.UpdateDate, + WorkingUnitName = q2.WorkingUnitName, + WorkingLineName = q3.WorkingLineName, + WorkingStationName = q4.WorkingStationName, + WorkingStationDesc = q4.WorkingStationDesc, + UpdateUserName = q5.UserName + + }; + + + if (u != "all") + { + q = q.Where(p => p.WorkingUnitNo.Equals(l)); + } + if (l > 0) + { + q = q.Where(p => p.WorkingLineID.Equals(l)); + } + if (i != "Null") + { + q = q.Where(p => p.ItemNo.Equals(i.ToUpper())); + } + + + + // 紀錄筆數 + result.DataTotal = q.Count(); + + // Table 頁數 + if (page > 0) + { + q = q.Skip((page - 1) * limit).Take(limit); + } + result.Data = await q.ToListAsync(); + + return result; + + + } + + /// /// 更新條報工標準工時資料 @@ -140,91 +217,273 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES /// /// [HttpPut("{id}")] - public async Task> PutWorkingStandardWorkTimes(int id, [FromBody] WorkingStandardWorkTime WorkingStandardWorkTime) + public async Task> PutWorkingStandardWorkTimes(int id, [FromBody] WorkingStandardWorkTime model) { ResultModel result = new ResultModel(); - if (id != WorkingStandardWorkTime.WorkingStandardID) + + if (id != model.WorkingStandardID) { result.Success = false; result.Msg = "ID錯誤"; return result; } - WorkingStandardWorkTime.UpdateDate = DateTime.Now; - _context.Entry(WorkingStandardWorkTime).State = EntityState.Modified; - try + var oldData = await _context.WorkingStandardWorkTimes.FindAsync(id); + if (oldData == null) { + result.Success = false; + result.Msg = "資料不存在"; + return result; + } + // 建立修改紀錄 log + var helper = new Helper(_context); + var WorkingSTLog_ID = await helper.GetIDKey("WorkingSTLog_ID"); + var newLog = new WorkingStandardWorkTimeLog + { + WorkingStandardLogID = WorkingSTLog_ID, + WorkingStandardID = oldData.WorkingStandardID, + ItemNo = oldData.ItemNo, + WorkingUnitNo = oldData.WorkingUnitNo, + WorkingLineID = oldData.WorkingLineID, + UnitNo = oldData.UnitNo, + WorkingStationID = oldData.WorkingStationID, + Side = oldData.Side, + OpCnt = oldData.OpCnt, + Ct = oldData.Ct, + StationID = oldData.StationID, + MachineCnt = oldData.MachineCnt, + Remark = oldData.Remark, + CreateUserID = model.UpdateUserID, + CreateDate = DateTime.Now, + Action = "U" + }; + _context.WorkingStandardWorkTimeLogs.Add(newLog); + + // 更新 oldData 的欄位 + oldData.ItemNo = model.ItemNo; + oldData.WorkingUnitNo = model.WorkingUnitNo; + oldData.WorkingLineID = model.WorkingLineID; + oldData.UnitNo = model.UnitNo; + oldData.WorkingStationID = model.WorkingStationID; + oldData.Side = model.Side; + oldData.OpCnt = model.OpCnt; + oldData.Ct = model.Ct; + oldData.StationID = model.StationID; + oldData.MachineCnt = model.MachineCnt; + oldData.Remark = model.Remark; + oldData.UpdateUserID = model.UpdateUserID; + oldData.UpdateDate = DateTime.Now; + + try + { await _context.SaveChangesAsync(); result.Success = true; result.Msg = "OK"; - return result; - } catch (Exception ex) { result.Success = false; - result.Msg = ex.InnerException.Message; - return result; - //throw; - + result.Msg = ex.InnerException?.Message ?? ex.Message; } - } + return result; + } /// /// 新增報工標準工時資料 /// - /// + /// /// [HttpPost] - public async Task> PostWorkingStandardWorkTimes(WorkingStandardWorkTime WorkingStandardWorkTime) + public async Task> PostWorkingStandardWorkTimes(WorkingStandardWorkTime model) { - ResultModel result = new ResultModel(); - Helper helper = new Helper(_context); - WorkingStandardWorkTime.WorkingStandardID = helper.GetIDKey("WorkingST_ID").Result; - WorkingStandardWorkTime.CreateDate = DateTime.Now; - WorkingStandardWorkTime.UpdateDate = DateTime.Now; - _context.WorkingStandardWorkTimes.Add(WorkingStandardWorkTime); + var result = new ResultModel(); try { + var helper = new Helper(_context); + + // 先取得主 ID + model.WorkingStandardID = await helper.GetIDKey("WorkingST_ID"); + model.CreateDate = DateTime.Now; + model.UpdateDate = DateTime.Now; + + // 建立 Log 資料 + var log = new WorkingStandardWorkTimeLog + { + WorkingStandardLogID = await helper.GetIDKey("WorkingSTLog_ID"), + WorkingStandardID = model.WorkingStandardID, + ItemNo = model.ItemNo, + WorkingUnitNo = model.WorkingUnitNo, + WorkingLineID = model.WorkingLineID, + UnitNo = model.UnitNo, + WorkingStationID = model.WorkingStationID, + Side = model.Side, + OpCnt = model.OpCnt, + Ct = model.Ct, + StationID = model.StationID, + MachineCnt = model.MachineCnt, + Remark = model.Remark, + CreateUserID = model.CreateUserID, + CreateDate = model.CreateDate, + Action = "A" + }; + + // 加入資料 + _context.WorkingStandardWorkTimes.Add(model); + _context.WorkingStandardWorkTimeLogs.Add(log); + await _context.SaveChangesAsync(); + result.Success = true; result.Msg = "OK"; + } catch (DbUpdateException ex) { + result.Success = false; + result.Msg = ex.InnerException?.Message ?? ex.Message; + } + + return result; + } + + /// + /// 批次匯入標準工時資料 + /// + /// + /// + [HttpPost("byList")] + public async Task> PostWorkingStandardWorkTimespList([FromBody] List model) + { + ResultModel result = new ResultModel(); + + if (model == null || model.Count == 0) + { result.Success = false; - result.Msg = ex.InnerException.Message; + result.Msg = "Invalid input data."; + return result; + } + + try + { + Helper helper = new Helper(_context); + + // 每筆資料都個別取得一組ID + foreach (var item in model) + { + item.WorkingStandardID = await helper.GetIDKey("WorkingST_ID"); + // 建立 Log 資料 + var log = new WorkingStandardWorkTimeLog + { + WorkingStandardLogID = await helper.GetIDKey("WorkingSTLog_ID"), + WorkingStandardID = item.WorkingStandardID, + ItemNo = item.ItemNo, + WorkingUnitNo = item.WorkingUnitNo, + WorkingLineID = item.WorkingLineID, + UnitNo = item.UnitNo, + WorkingStationID = item.WorkingStationID, + Side = item.Side, + OpCnt = item.OpCnt, + Ct = item.Ct, + StationID = item.StationID, + MachineCnt = item.MachineCnt, + Remark = item.Remark, + CreateUserID = item.CreateUserID, + CreateDate = item.CreateDate, + Action = "A" + }; + // 加入資料 + _context.WorkingStandardWorkTimeLogs.Add(log); + } + + _context.WorkingStandardWorkTimes.AddRange(model); + await _context.SaveChangesAsync(); + + + result.Success = true; + result.Msg = "OK"; + result.Data = model; // 返回新增的 BarcodeGroup 列表 + } + catch (Exception ex) + { + result.Success = false; + result.Msg = ex.InnerException?.Message ?? ex.Message; } return result; } + + + + + + /// - /// 停用/啟用報工標準工時資料 + /// 刪除報工標準工時資料 /// /// + /// /// - [HttpDelete("{id}")] - public async Task> DeleteWorkingStandardWorkTimes(int id) + [HttpDelete("{id}/{deleteUserID}")] + public async Task> DeleteWorkingStandardWorkTimes(int id, int deleteUserID) { - ResultModel result = new ResultModel(); + var result = new ResultModel(); - var workingStandardWorkTime = await _context.WorkingStandardWorkTimes.FindAsync(id); - if (workingStandardWorkTime == null) + var entity = await _context.WorkingStandardWorkTimes.FindAsync(id); + if (entity == null) { result.Success = false; result.Msg = "ID不存在"; return result; } - _context.WorkingStandardWorkTimes.Remove(workingStandardWorkTime); - await _context.SaveChangesAsync(); + try + { + // 取得新流水號 + var helper = new Helper(_context); + var logID = await helper.GetIDKey("WorkingSTLog_ID"); + + // 建立刪除記錄 + var log = new WorkingStandardWorkTimeLog + { + WorkingStandardLogID = logID, + WorkingLineID =entity.WorkingLineID, + WorkingStandardID = entity.WorkingStandardID, + ItemNo = entity.ItemNo, + WorkingUnitNo = entity.WorkingUnitNo, + UnitNo = entity.UnitNo, + WorkingStationID = entity.WorkingStationID, + Side = entity.Side, + OpCnt = entity.OpCnt, + Ct = entity.Ct, + StationID = entity.StationID, + MachineCnt = entity.MachineCnt, + Remark = entity.Remark, + CreateUserID = deleteUserID, + CreateDate = DateTime.Now, + Action = "D" + }; + + // 加入紀錄 + _context.WorkingStandardWorkTimeLogs.Add(log); + + // 刪除資料 + _context.WorkingStandardWorkTimes.Remove(entity); + + // 儲存 + await _context.SaveChangesAsync(); + + result.Success = true; + result.Msg = "OK"; + } + catch (Exception ex) + { + result.Success = false; + result.Msg = ex.InnerException?.Message ?? ex.Message; + } - result.Success = true; - result.Msg = "OK"; return result; } - } } diff --git a/AMESCoreStudio.WebApi/Controllers/AMES/WorkingStandardWorkTimeLogController.cs b/AMESCoreStudio.WebApi/Controllers/AMES/WorkingStandardWorkTimeLogController.cs index f2ef141..153fe05 100644 --- a/AMESCoreStudio.WebApi/Controllers/AMES/WorkingStandardWorkTimeLogController.cs +++ b/AMESCoreStudio.WebApi/Controllers/AMES/WorkingStandardWorkTimeLogController.cs @@ -85,6 +85,73 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES return WorkingStandardWorkTimeLog; } + /// + /// 用ID获取该報工標準工時資料log + /// + /// + /// + /// + /// + [HttpGet("WHS025LMulti/{id}")] + public async Task> GetWorkingStandardWorkTimeLogbyMultiQuery(int id, int page = 0, int limit = 10) + { + + ResultModel result = new ResultModel(); + + + var q = from q1 in _context.WorkingStandardWorkTimeLogs.Where(w => w.WorkingStandardID == id) + join q2 in _context.WorkingUnits on q1.WorkingUnitNo equals q2.WorkingUnitNo into wuJoin + from q2 in wuJoin.DefaultIfEmpty() + + join q3 in _context.WorkingLines on q1.WorkingLineID equals q3.WorkingLineID into wlJoin + from q3 in wlJoin.DefaultIfEmpty() + + join q4 in _context.WorkingStations on q1.WorkingStationID equals q4.WorkingStationID into wsJoin + from q4 in wsJoin.DefaultIfEmpty() + + join q5 in _context.UserInfoes on q1.CreateUserID equals q5.UserID into uJoin + from q5 in uJoin.DefaultIfEmpty() + select new + { + q1.WorkingStandardLogID, + q1.WorkingStandardID, + q1.ItemNo, + q1.WorkingUnitNo, + q1.UnitNo, + q1.WorkingLineID, + q1.WorkingStationID, + q1.Side, + q1.OpCnt, + q1.Ct, + q1.StationID, + q1.MachineCnt, + q1.Remark, + CreateUserName = q5 != null ? q5.UserName : "", // 防止 null 例外 + q1.CreateDate, + WorkingUnitName = q2 != null ? q2.WorkingUnitName : "", + WorkingLineName = q3 != null ? q3.WorkingLineName : "", + WorkingStationName = q4 != null ? q4.WorkingStationName : "", + WorkingStationDesc = q4 != null ? q4.WorkingStationDesc : "", + Action = q1.Action == "A" ? "新增" : + q1.Action == "D" ? "刪除" : + q1.Action == "U" ? "修改" : "未知" + }; + + // 紀錄筆數 + result.DataTotal = q.Count(); + + // Table 頁數 + if (page > 0) + { + q = q.Skip((page - 1) * limit).Take(limit); + } + result.Data = await q.OrderBy(s => s.CreateDate).ToListAsync(); + + return result; + + + } + /// /// WHS025 @@ -145,7 +212,7 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES { ResultModel result = new ResultModel(); Helper helper = new Helper(_context); - WorkingStandardWorkTimeLog.WorkingStandardID = helper.GetIDKey("WorkingStandardWorkTimeLog_ID").Result; + WorkingStandardWorkTimeLog.WorkingStandardID = helper.GetIDKey("WorkingSTLog_ID").Result; WorkingStandardWorkTimeLog.CreateDate = DateTime.Now; _context.WorkingStandardWorkTimeLogs.Add(WorkingStandardWorkTimeLog); try @@ -163,32 +230,7 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES return result; } - /// - /// 停用/啟用報工標準工時資料log - /// - /// - /// - [HttpDelete("{id}")] - public async Task> DeleteWorkingStandardWorkTimeLogs(int id) - { - ResultModel result = new ResultModel(); - - var standardWorkTime = await _context.StandardWorkTimes.FindAsync(id); - if (standardWorkTime == null) - { - result.Success = false; - result.Msg = "序號不存在"; - return result; - } - - _context.StandardWorkTimes.Remove(standardWorkTime); - await _context.SaveChangesAsync(); - - result.Success = true; - result.Msg = "OK"; - return result; - - } + } } diff --git a/AMESCoreStudio.WebApi/Controllers/AMES/WorkingStationsController.cs b/AMESCoreStudio.WebApi/Controllers/AMES/WorkingStationsController.cs index b66abdd..c219d0f 100644 --- a/AMESCoreStudio.WebApi/Controllers/AMES/WorkingStationsController.cs +++ b/AMESCoreStudio.WebApi/Controllers/AMES/WorkingStationsController.cs @@ -85,6 +85,28 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES return WorkingStation; } + /// + /// 用Name获取该報工生產單位別 + /// + /// + /// + [HttpGet("Name/{id}")] + public async Task>> GetWorkingStationbyName(string id) + { + + IQueryable q = _context.WorkingStations; + q = q.Where(p => p.WorkingStationName.Equals(id)); + var WorkingStation = await q.ToListAsync(); + + if (WorkingStation == null) + { + return NotFound(); + } + + return WorkingStation; + } + + /// /// 用生產單位获取该報工線別基本資料 diff --git a/AMESCoreStudio.WebApi/Controllers/AMES/WorkingUnitsController.cs b/AMESCoreStudio.WebApi/Controllers/AMES/WorkingUnitsController.cs index cca0f25..2ea0035 100644 --- a/AMESCoreStudio.WebApi/Controllers/AMES/WorkingUnitsController.cs +++ b/AMESCoreStudio.WebApi/Controllers/AMES/WorkingUnitsController.cs @@ -86,6 +86,51 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES } + /// + /// 用no获取该報工生產單位別 + /// + /// + /// + [HttpGet("No/{no}")] + public async Task>> GetWorkingUnitbyNo(string no) + { + + IQueryable q = _context.WorkingUnits; + q = q.Where(p => p.WorkingUnitNo.Equals(no)); + var WorkingUnit = await q.ToListAsync(); + + if (WorkingUnit == null) + { + return NotFound(); + } + + return WorkingUnit; + } + + + + /// + /// 用Name获取该報工生產單位別 + /// + /// + /// + [HttpGet("Name/{id}")] + public async Task>> GetWorkingUnitbyName(string id) + { + + IQueryable q = _context.WorkingUnits; + q = q.Where(p => p.WorkingUnitName.Equals(id)); + var WorkingUnit = await q.ToListAsync(); + + if (WorkingUnit == null) + { + return NotFound(); + } + + return WorkingUnit; + } + + /// /// 更新條報工生產單位別 /// diff --git a/AMESCoreStudio.WebApi/Controllers/BAS/FactoryUnitsController.cs b/AMESCoreStudio.WebApi/Controllers/BAS/FactoryUnitsController.cs index 57f104f..4e7acef 100644 --- a/AMESCoreStudio.WebApi/Controllers/BAS/FactoryUnitsController.cs +++ b/AMESCoreStudio.WebApi/Controllers/BAS/FactoryUnitsController.cs @@ -64,6 +64,28 @@ namespace AMESCoreStudio.WebApi.Controllers.BAS return factoryUnit ; } + + /// + /// 用Name获取该單位资料 + /// + /// + // GET: api/FactoryUnits/5 + [HttpGet("Name/{id}")] + public async Task>> GetFactoryUnitbyName(string id) + { + IQueryable q = _context.FactoryUnits; + q = q.Where(p => p.UnitName.Equals(id)); + var factoryUnit = await q.ToListAsync(); + + if (factoryUnit == null) + { + return NotFound(); + } + + return factoryUnit; + } + + /// /// 更改單位资料 ///