diff --git a/AMESCoreStudio.Web/Controllers/PPSController.cs b/AMESCoreStudio.Web/Controllers/PPSController.cs index be2245a4..33446923 100644 --- a/AMESCoreStudio.Web/Controllers/PPSController.cs +++ b/AMESCoreStudio.Web/Controllers/PPSController.cs @@ -7,6 +7,7 @@ using AMESCoreStudio.WebApi; using System.Collections.Generic; using Microsoft.AspNetCore.Mvc.Rendering; using AMESCoreStudio.WebApi.Models.AMES; +using AMESCoreStudio.WebApi.Models.BAS; namespace AMESCoreStudio.Web.Controllers { @@ -14,10 +15,39 @@ namespace AMESCoreStudio.Web.Controllers { private readonly ILogger _logger; public readonly IPPS _ppsApi; - public PPSController(ILogger logger, IPPS ppsApi) + public readonly IBAS _basApi; + + public PPSController(ILogger logger, IPPS ppsApi,IBAS basApi) { _logger = logger; _ppsApi = ppsApi; + _basApi = basApi; + } + + private async Task GetResponseDeptList() + { + var result = await _basApi.GetRepairResponsibleUnitses(); + + var ResponseDeptList = new List(); + + for (int i = 0; i < result.Count; i++) + { + ResponseDeptList.Add(new SelectListItem(result[i].RRDesc, result[i].RRID.ToString())); + } + ViewBag.ResponseDeptList = ResponseDeptList; + } + + private async Task GetSectionList() + { + var result = await _basApi.GetFactoryUnits(); + + var SectionList = new List(); + + for (int i = 0; i < result.Count; i++) + { + SectionList.Add(new SelectListItem(result[i].UnitName, result[i].UnitNo.ToString())); + } + ViewBag.SectionList = SectionList; } private async Task GetErrorGroupListAll() @@ -47,6 +77,48 @@ namespace AMESCoreStudio.Web.Controllers ViewBag.ErrorGroupList = ErrorGroupList; } + private async Task GetErrorClassListAll(string groupNo) + { + var result = await _ppsApi.GetErrorClassesByGroup(groupNo); + + var ErrorClassList = new List(); + ErrorClassList.Add(new SelectListItem("全部", "*")); + + for (int i = 0; i < result.Count; i++) + { + ErrorClassList.Add(new SelectListItem(result[i].ClassName, result[i].ClassNo.ToString())); + } + ViewBag.ErrorClassList = ErrorClassList; + } + + private async Task GetErrorClassList(string no) + { + var result = await _ppsApi.GetErrorClassesByGroup(no); + + var ErrorClassList = new List(); + for (int i = 0; i < result.Count; i++) + { + ErrorClassList.Add(new SelectListItem(result[i].ClassName, result[i].ClassNo.ToString())); + } + ViewBag.ErrorClassList = ErrorClassList; + } + + [HttpPost] + public async Task GetErrorClassJson(string group_no) + { + var result = await _ppsApi.GetErrorClassesByGroup(group_no); + + var item = new List(); + item.Add(new SelectListItem("全部", "*")); + + for (int i = 0; i < result.Count; i++) + { + item.Add(new SelectListItem(result[i].ClassName, result[i].ClassNo.ToString())); + } + //将数据Json化并传到前台视图 + return Json(new { data = item }); + } + #region PPS001工單狀態維護相關 public IActionResult PPS001() @@ -492,5 +564,141 @@ namespace AMESCoreStudio.Web.Controllers } #endregion + + #region PPS007異常原因維護相關 + + public async Task PPS007(string groupNo) + { + await GetErrorGroupListAll(); + await GetErrorClassListAll(groupNo); + + return View(); + } + + //新增頁面 + public async Task PPS007C(string id) + { + string[] param = id.Split(','); + + await GetErrorClassList(param[1]); + await GetResponseDeptList(); + await GetSectionList(); + + var model = new ErrorReason(); + if (id != null) + { + if (id != "") + { + model.ClassNo = id; + } + } + + return View(model); + } + + //修改页面 + [HttpGet] + public async Task PPS007UAsync(string id) + { + string[] param = id.Split(','); + await GetErrorClassList(param[1]); + + await GetResponseDeptList(); + await GetSectionList(); + + var result = await _ppsApi.GetErrorReason(param[0]); + + if (result.Count == 0) + { + return View(); + } + return View(result[0]); + } + + public async Task PPS007DAsync(string id) + { + var result = await _ppsApi.DeleteErrorReason(id); + return Json(new Result() { success = true, msg = "" }); + } + + //頁面提交,id=0 添加,id>0 修改 + [HttpPost] + public async Task PPS007CSaveAsync(ErrorReason model) + { + if (ModelState.IsValid) + { + IResultModel result; + + result = await _ppsApi.PostErrorReason(JsonConvert.SerializeObject(model)); + + + if (!result.Success) + { + var _msg = "添加成功!"; + 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); + } + } + } + return View("PPS007C", model); + } + + public async Task PPS007USaveAsync(ErrorReason model) + { + if (ModelState.IsValid) + { + IResultModel result; + + result = await _ppsApi.PutErrorReason(model.ReasonNo, JsonConvert.SerializeObject(model)); + + if (!result.Success) + { + var _msg = "修改成功!"; + 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); + } + } + } + return View("PPS007U", model); + } + + [ResponseCache(Duration = 0)] + [HttpGet] + public async Task GetErrorReasonsByClassAsync(string errorClassNo) + { + if (errorClassNo == null || errorClassNo == "0") + { + errorClassNo = "*"; + } + var result = await _ppsApi.GetErrorReasonsByClass(errorClassNo); + + 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 + } } diff --git a/AMESCoreStudio.Web/HttpApis/AMES/IPPS.cs b/AMESCoreStudio.Web/HttpApis/AMES/IPPS.cs index 90927508..9307909b 100644 --- a/AMESCoreStudio.Web/HttpApis/AMES/IPPS.cs +++ b/AMESCoreStudio.Web/HttpApis/AMES/IPPS.cs @@ -89,7 +89,6 @@ namespace AMESCoreStudio.Web #endregion - #region PPS005 異常群組維護 /// @@ -129,7 +128,6 @@ namespace AMESCoreStudio.Web #endregion - #region PPS006 異常類別維護 /// @@ -175,5 +173,51 @@ namespace AMESCoreStudio.Web ITask> GetErrorClassesByGroup(string no); #endregion + + #region PPS007 異常原因維護 + + /// + /// 新增異常原因 + /// + /// + [WebApiClient.Attributes.HttpPost("api/ErrorReasons")] + ITask> PostErrorReason([FromBody, RawJsonContent] string model); + + /// + /// 更新異常原因 + /// + /// + [WebApiClient.Attributes.HttpPut("api/ErrorReasons/{id}")] + ITask> PutErrorReason(string id, [FromBody, RawJsonContent] string model); + + /// + /// 刪除異常原因 + /// + /// + [WebApiClient.Attributes.HttpDelete("api/ErrorReasons/{id}")] + ITask> DeleteErrorReason(string id); + + /// + /// 根據ID獲取指定異常原因資料 + /// + /// + [WebApiClient.Attributes.HttpGet("api/ErrorReasons/{id}")] + ITask> GetErrorReason(string id); + + /// + /// 獲取異常原因資料 + /// + /// + [WebApiClient.Attributes.HttpGet("api/ErrorReasons")] + ITask> GetErrorReasons(); + + /// + /// 根据類別代碼獲取原因資料 + /// + /// + [WebApiClient.Attributes.HttpGet("api/ErrorReasons/Class/{no}")] + ITask> GetErrorReasonsByClass(string no); + + #endregion } } diff --git a/AMESCoreStudio.Web/Views/BAS/BAS009.cshtml b/AMESCoreStudio.Web/Views/BAS/BAS009.cshtml index afd75f7e..e7eafb23 100644 --- a/AMESCoreStudio.Web/Views/BAS/BAS009.cshtml +++ b/AMESCoreStudio.Web/Views/BAS/BAS009.cshtml @@ -34,14 +34,12 @@
-
+
-
-
+
+
+
+ +
+
+
+ + +@section Scripts{ + +} \ No newline at end of file diff --git a/AMESCoreStudio.Web/Views/PPS/PPS007C.cshtml b/AMESCoreStudio.Web/Views/PPS/PPS007C.cshtml new file mode 100644 index 00000000..0cfb7774 --- /dev/null +++ b/AMESCoreStudio.Web/Views/PPS/PPS007C.cshtml @@ -0,0 +1,88 @@ +@model AMESCoreStudio.WebApi.Models.AMES.ErrorReason + + +@{ ViewData["Title"] = "PPS007C"; + Layout = "~/Views/Shared/_FormLayout.cshtml"; } + + + + +
+
+
+
+ +
+ + + +
+
+ + + +
+
+ + + +
+
+ + + +
+
+ + + +
+
+ + + +
+
+ + + +
+
+ + + +
+
+ + + +
+ @Html.ValidationMessage("error") +
+ +
+ +
+
+
+ +@section Scripts { + @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); + await Html.RenderPartialAsync("_FileinputScriptsPartial"); } + + + + +} + diff --git a/AMESCoreStudio.Web/Views/PPS/PPS007U.cshtml b/AMESCoreStudio.Web/Views/PPS/PPS007U.cshtml new file mode 100644 index 00000000..07c96356 --- /dev/null +++ b/AMESCoreStudio.Web/Views/PPS/PPS007U.cshtml @@ -0,0 +1,88 @@ +@model AMESCoreStudio.WebApi.Models.AMES.ErrorReason + + +@{ ViewData["Title"] = "PPS007U"; + Layout = "~/Views/Shared/_FormLayout.cshtml"; } + + + + +
+
+
+
+ +
+ + + +
+
+ + + +
+
+ + + +
+
+ + + +
+
+ + + +
+
+ + + +
+
+ + + +
+
+ + + +
+
+ + + +
+ @Html.ValidationMessage("error") +
+ +
+ +
+
+
+ +@section Scripts { + @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); + await Html.RenderPartialAsync("_FileinputScriptsPartial"); } + + + + +} + diff --git a/AMESCoreStudio.WebApi/Controllers/AMES/ErrorReasonsController.cs b/AMESCoreStudio.WebApi/Controllers/AMES/ErrorReasonsController.cs new file mode 100644 index 00000000..0d4129d1 --- /dev/null +++ b/AMESCoreStudio.WebApi/Controllers/AMES/ErrorReasonsController.cs @@ -0,0 +1,196 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; +using AMESCoreStudio.WebApi; +using AMESCoreStudio.WebApi.Models.AMES; + +namespace AMESCoreStudio.WebApi.Controllers.AMES +{ + /// + /// 異常原因維護 + /// + [Route("api/[controller]")] + [ApiController] + public class ErrorReasonsController : ControllerBase + { + private readonly AMESContext _context; + + /// + /// + /// + /// + public ErrorReasonsController(AMESContext context) + { + _context = context; + } + + /// + /// + /// + /// + // GET: api/ErrorReasons + [HttpGet] + public async Task>> GetErrorReason() + { + IQueryable q = _context.ErrorReasons; + + q = q.OrderBy(p => p.ReasonNo); + + var errorReason = await q.ToListAsync(); + + return errorReason; + } + + /// + /// + /// + /// + /// + // GET: api/ErrorReasons/5 + [HttpGet("{id}")] + public async Task>> GetErrorReason(string id) + { + IQueryable q = _context.ErrorReasons; + q = q.Where(p => p.ReasonNo.Equals(id)); + + var errorReason = await q.ToListAsync(); + + if (errorReason == null) + { + return NotFound(); + } + + return errorReason; + } + + /// + /// 根据異常類別獲取該類別異常原因資料 + /// + /// + /// + // GET: api/ErrorReasons/Class/S + [HttpGet("Class/{no}")] + public async Task>> GetErrorReasonByClass(string no) + { + IQueryable q = _context.ErrorReasons; + + if (no != null) + { + if (no != "*") + { + q = q.Where(p => p.ClassNo.Equals(no)); + } + } + q = q.OrderBy(p => p.ClassNo + p.ReasonNo); + + var errorReason = await q.ToListAsync(); + + if (errorReason == null) + { + return NotFound(); + } + + return errorReason; + } + + /// + /// + /// + /// + /// + /// + // PUT: api/ErrorReasons/5 + // To protect from overposting attacks, enable the specific properties you want to bind to, for + // more details, see https://go.microsoft.com/fwlink/?linkid=2123754. + [HttpPut("{id}")] + public async Task> PutErrorReason(string id, [FromBody] ErrorReason errorReason) + { + if (id != errorReason.ReasonNo) + { + return BadRequest(); + } + + _context.Entry(errorReason).State = EntityState.Modified; + + try + { + await _context.SaveChangesAsync(); + } + catch (DbUpdateConcurrencyException) + { + if (!ErrorReasonExists(id)) + { + return NotFound(); + } + else + { + throw; + } + } + + return errorReason; + } + + /// + /// + /// + /// + /// + // POST: api/ErrorReasons + // To protect from overposting attacks, enable the specific properties you want to bind to, for + // more details, see https://go.microsoft.com/fwlink/?linkid=2123754. + [HttpPost] + public async Task> PostErrorReason(ErrorReason errorReason) + { + _context.ErrorReasons.Add(errorReason); + try + { + await _context.SaveChangesAsync(); + } + catch (DbUpdateException) + { + if (ErrorReasonExists(errorReason.ReasonNo)) + { + return Conflict(); + } + else + { + throw; + } + } + + return CreatedAtAction("GetErrorReason", new { id = errorReason.ReasonNo }, errorReason); + } + + /// + /// + /// + /// + /// + // DELETE: api/ErrorReasons/5 + [HttpDelete("{id}")] + public async Task> DeleteErrorReason(string id) + { + var errorReason = await _context.ErrorReasons.Where(p => p.ReasonNo == id).FirstOrDefaultAsync(); + + if (errorReason == null) + { + return NotFound(); + } + + _context.ErrorReasons.Remove(errorReason); + await _context.SaveChangesAsync(); + + return errorReason; + } + + private bool ErrorReasonExists(string id) + { + return _context.ErrorReasons.Any(e => e.ReasonNo == id); + } + } +} diff --git a/AMESCoreStudio.WebApi/Controllers/BAS/FlowRulesController.cs b/AMESCoreStudio.WebApi/Controllers/BAS/FlowRulesController.cs index c6f1c079..5b9a6569 100644 --- a/AMESCoreStudio.WebApi/Controllers/BAS/FlowRulesController.cs +++ b/AMESCoreStudio.WebApi/Controllers/BAS/FlowRulesController.cs @@ -36,7 +36,7 @@ namespace AMESCoreStudio.WebApi.Controllers.BAS { IQueryable q = _context.FlowRules; - q.OrderBy(p => p.UnitNo + p.FlowRuleName); + q = q.OrderBy(p => p.UnitNo + p.FlowRuleName); var flowRule = await q.ToListAsync(); @@ -67,7 +67,7 @@ namespace AMESCoreStudio.WebApi.Controllers.BAS q = q.Where(p => p.UnitNo.Equals(no)); } } - q.OrderBy(p => p.FlowRuleName); + q = q.OrderBy(p => p.FlowRuleName); var flowRule = await q.ToListAsync(); diff --git a/AMESCoreStudio.WebApi/Controllers/BAS/RuleStationsController.cs b/AMESCoreStudio.WebApi/Controllers/BAS/RuleStationsController.cs index 3bc2a4db..51a80587 100644 --- a/AMESCoreStudio.WebApi/Controllers/BAS/RuleStationsController.cs +++ b/AMESCoreStudio.WebApi/Controllers/BAS/RuleStationsController.cs @@ -38,7 +38,7 @@ namespace AMESCoreStudio.WebApi.Controllers.BAS { IQueryable q = _context.RuleStations; - q.OrderBy(p => p.FlowRuleID + p.Sequence); + q = q.OrderBy(p => p.FlowRuleID + p.Sequence); var ruleStation = await q.ToListAsync(); diff --git a/AMESCoreStudio.WebApi/Controllers/BAS/RulesController.cs b/AMESCoreStudio.WebApi/Controllers/BAS/RulesController.cs index d276a670..1b8e532d 100644 --- a/AMESCoreStudio.WebApi/Controllers/BAS/RulesController.cs +++ b/AMESCoreStudio.WebApi/Controllers/BAS/RulesController.cs @@ -37,7 +37,7 @@ namespace AMESCoreStudio.WebApi.Controllers.BAS public async Task>> GetRules() { IQueryable q = _context.Ruleses; - q.OrderBy(p => p.RuleStationID + p.RuleSeq); + q = q.OrderBy(p => p.RuleStationID + p.RuleSeq); var rules = await q.ToListAsync(); diff --git a/AMESCoreStudio.WebApi/Enums/EnumErrorType.cs b/AMESCoreStudio.WebApi/Enums/EnumErrorType.cs new file mode 100644 index 00000000..0cfe8d46 --- /dev/null +++ b/AMESCoreStudio.WebApi/Enums/EnumErrorType.cs @@ -0,0 +1,24 @@ +using System.ComponentModel; +using System.ComponentModel.DataAnnotations; + +namespace AMESCoreStudio.WebApi +{ + /// + /// + /// + public enum EnumErrorType + { + /// + /// 外部異常 + /// + [Description("外部異常")] + [Display(Name = "外部異常")] + External, + /// + /// 內部異常 + /// + [Description("內部異常")] + [Display(Name = "內部異常")] + Internal + } +} diff --git a/AMESCoreStudio.WebApi/Models/AMES/ErrorReason.cs b/AMESCoreStudio.WebApi/Models/AMES/ErrorReason.cs new file mode 100644 index 00000000..aee48cd0 --- /dev/null +++ b/AMESCoreStudio.WebApi/Models/AMES/ErrorReason.cs @@ -0,0 +1,103 @@ +using System; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Runtime.Serialization; + +namespace AMESCoreStudio.WebApi.Models.AMES +{ + /// + /// 异常代码资料表 + /// + [Table("ERROR_REASON", Schema = "JHAMES")] + [DataContract] + public class ErrorReason + { + /// + /// 異常原因代碼 + /// + [Key] + [Column("REASON_NO")] + [Required(ErrorMessage = "{0},不能空白")] + [Display(Name = "異常原因代碼")] + [StringLength(6, ErrorMessage = "{0},不能大于{1}")] + [DataMember] + public string ReasonNo { get; set; } + + /// + /// 異常類別代碼 + /// + [Column("CLASS_NO")] + [Required(ErrorMessage = "{0},不能空白")] + [Display(Name = "異常類別代碼")] + [StringLength(6, ErrorMessage = "{0},不能大于{1}")] + [DataMember] + public string ClassNo { get; set; } + + /// + /// 異常原因描述 + /// + [Column("REASON_DESC")] + [Required(ErrorMessage = "{0},不能空白")] + [Display(Name = "異常原因描述")] + [StringLength(100, ErrorMessage = "{0},不能大于{1}")] + [DataMember] + public string ReasonDesc { get; set; } + + /// + /// 異常原因英文描述 + /// + [Column("REASON_DESC_EN")] + [Required(ErrorMessage = "{0},不能空白")] + [Display(Name = "異常原因英文描述")] + [StringLength(100, ErrorMessage = "{0},不能大于{1}")] + [DataMember] + public string ReasonDescEn { get; set; } + + /// + /// 內外部損耗分類 + /// + [Column("ERROR_TYPE")] + [Display(Name = "內外部損耗分類")] + [DataMember] + public EnumErrorType ErrorType { get; set; } + + /// + /// 責任單位 + /// + [Column("RESPONSE_DEPT")] + [DataMember] + [Required] + [Display(Name = "責任單位")] + public int ResponseDept { get; set; } + + /// + /// 內部流程代碼 + /// + [Column("KPI_NO")] + [Required(ErrorMessage = "{0},不能空白")] + [Display(Name = "內部流程代碼")] + [StringLength(20, ErrorMessage = "{0},不能大于{1}")] + [DataMember] + public string KpiNo { get; set; } + + /// + /// 成本屬性代碼 + /// + [Column("COST_NO")] + [Required(ErrorMessage = "{0},不能空白")] + [Display(Name = "成本屬性代碼")] + [StringLength(6, ErrorMessage = "{0},不能大于{1}")] + [DataMember] + public string CostNo { get; set; } + + /// + /// 生產單位 + /// + [Column("SECTION_NO")] + [DataMember] + [Display(Name = "生產單位")] + [Required(ErrorMessage = "{0},不能空白")] + [StringLength(6, ErrorMessage = "{0},不能大于{1}")] + public string SectionNo { get; set; } + } +} diff --git a/AMESCoreStudio.WebApi/Models/AMESContext.cs b/AMESCoreStudio.WebApi/Models/AMESContext.cs index 871e7149..1e52b899 100644 --- a/AMESCoreStudio.WebApi/Models/AMESContext.cs +++ b/AMESCoreStudio.WebApi/Models/AMESContext.cs @@ -196,24 +196,24 @@ namespace AMESCoreStudio.WebApi public DbSet Ruleses { get; set; } /// - /// 流程規則資料 + /// 條碼狀態資料 /// public DbSet BarcodeStatus { get; set; } /// - /// 流程規則資料 + /// 異常群組資料 /// public DbSet ErrorGroups { get; set; } /// - /// 流程規則資料 + /// 異常類別資料 /// public DbSet ErrorClasses { get; set; } /// - /// 流程規則資料 + /// 工單狀態資料 /// - public DbSet WipStatus { get; set; } + public DbSet WipStatus { get; set; } /// /// 工單鎖定資料檔 @@ -225,6 +225,11 @@ namespace AMESCoreStudio.WebApi /// public DbSet WipBarcodes { get; set; } + /// + /// 異常原因資料 + /// + public DbSet ErrorReasons { get; set; } + } }