Browse Source

1. 新增PCB020 錫膏規格維護相關程式

2. 錫膏規格來源重構:將 PCSController 中的 GetSolderPasteSelect 由 Enum 改為從資料庫 (SOLDER_PASTE_SERIAL) 讀取。
3. 實作狀態過濾:
   - 檢視模式 (PCS001R):顯示所有規格。
   - 修改模式 (PCS003/PCS034):僅顯示啟用中 (StatusNo='A') 的規格。
4. 提升程式健壯性:
   - 在 WipDataSelectAll 呼叫處加入 null-conditional 運算子 (?.),防止 wipBoard 為空時報錯。
   - 解決規格停用導致前端選單跳掉的問題(搭配前端 jQuery 自動導向至「其他(N)」)。
----------------------------------------------------------------------------------
DB 需異動指令
UPDATE JHAMES.WIP_BOARD SET SOLDER_PASTE ='KA' WHERE SOLDER_PASTE = 'A'; -- KOKI無鉛錫膏(S3X58-M406-3)
UPDATE JHAMES.WIP_BOARD SET SOLDER_PASTE ='SA' WHERE SOLDER_PASTE = 'B'; -- SMIC無鉛錫膏(M705-221BM5-32-11.5K3)
UPDATE JHAMES.WIP_BOARD SET SOLDER_PASTE ='S1' WHERE SOLDER_PASTE = 'C'; -- SMIC無鹵錫膏(M705-S101ZH-S4)
UPDATE JHAMES.WIP_BOARD SET SOLDER_PASTE ='GR' WHERE SOLDER_PASTE = 'E'; -- SMIC無鉛錫膏(M705-GRN360-K2-V)
UPDATE JHAMES.WIP_BOARD SET SOLDER_PASTE ='N' WHERE SOLDER_PASTE = 'D'; -- 其他
master
Sai 4 weeks ago
parent
commit
1ed8030d9c
  1. 190
      AMESCoreStudio.Web/Controllers/PCBController.cs
  2. 51
      AMESCoreStudio.Web/Controllers/PCSController.cs
  3. 42
      AMESCoreStudio.Web/HttpApis/AMES/IPCB.cs
  4. 132
      AMESCoreStudio.Web/Views/PCB/PCB020.cshtml
  5. 92
      AMESCoreStudio.Web/Views/PCB/PCB020C.cshtml
  6. 94
      AMESCoreStudio.Web/Views/PCB/PCB020U.cshtml
  7. 13
      AMESCoreStudio.Web/Views/PCS/PCS003.cshtml
  8. 13
      AMESCoreStudio.Web/Views/PCS/PCS034.cshtml
  9. 78
      AMESCoreStudio.WebApi/Controllers/AMES/SolderPasteSerialController.cs
  10. 46
      AMESCoreStudio.WebApi/Models/AMES/SolderPasteSerial.cs
  11. 2
      AMESCoreStudio.WebApi/Models/AMESContext.cs

190
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,42 +458,45 @@ 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<SolderPasteSerial> 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 = "該錫膏編號已建立過";
}
}
// 有錯誤訊息
if (!string.IsNullOrWhiteSpace(msg))
{
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<IActionResult> PCB015()
{
@ -871,7 +888,6 @@ namespace AMESCoreStudio.Web.Controllers
return View("PCB015V", model);
}
public async Task<IActionResult> 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<IActionResult> CheckBarcodeNOandGroupAsync(string BarcodeNo, string WipNo, int WipID, int Boards, string PlanQTY)
{
//生產序號不在工單區間
@ -1027,8 +1042,6 @@ namespace AMESCoreStudio.Web.Controllers
}
/// <summary>
/// PCBGroup 綁定Excel匯入
/// </summary>
@ -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,7 +1103,7 @@ 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 判斷序號是否已綁定群組
@ -1101,7 +1114,7 @@ namespace AMESCoreStudio.Web.Controllers
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))
{
@ -1143,7 +1156,7 @@ namespace AMESCoreStudio.Web.Controllers
}
#region 綁定Group
var barcodeinfo = await _pcbApi.PostDapperByListBarcodeNO(JsonConvert.SerializeObject(barcodeGroup.Where(w => w.Sequence == item).Select(s=>s.BarcodeNo)));
var barcodeinfo = await _pcbApi.PostDapperByListBarcodeNO(JsonConvert.SerializeObject(barcodeGroup.Where(w => w.Sequence == item).Select(s => s.BarcodeNo)));
int UserID = GetLogInUserID();
List<BarcodeGroup> barcodeGroups = barcodeinfo
@ -1153,7 +1166,7 @@ namespace AMESCoreStudio.Web.Controllers
GroupID = 0,
Sequence = item,
CreateUserID = UserID,
WipNo = barcodeGroup.Select(s=>s.WipNo).FirstOrDefault()
WipNo = barcodeGroup.Select(s => s.WipNo).FirstOrDefault()
})
.ToList();
@ -1182,9 +1195,138 @@ namespace AMESCoreStudio.Web.Controllers
}
#endregion
#region PCB020 錫膏規格維護
public ActionResult PCB020()
{
return View();
}
public async Task<IActionResult> PCB020QueryAsync(string serialNo, string description, string vendor)
{
IResultModel<SolderPasteSerial> 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<IActionResult> PCB020U(string id)
{
var result = await _pcbApi.GetSolderPasteSerial(id);
return View(result);
}
/// <summary>
/// 頁面提交
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
[HttpPost]
public async Task<IActionResult> 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 });
}
/// <summary>
/// PCB020S 錫膏規格 狀態更新
/// </summary>
/// <param name="id">代碼</param>
/// <param name="status">狀態</param>
/// <returns></returns>
[HttpPost]
public async Task<IActionResult> 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
/// <summary>
/// 登入UserID

51
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<PCSController> logger, ILogger<LoginController> 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,20 +695,31 @@ namespace AMESCoreStudio.Web.Controllers
/// 工單資訊 板卡資訊 錫膏
/// </summary>
/// <param name="SelectedValue"></param>
private void GetSolderPasteSelect(string SelectedValue = null)
/// <param name="isReview"></param>
private async Task GetSolderPasteSelect(string SelectedValue = null, bool isReview = false)
{
List<string> values = new List<string>();
if (SelectedValue != null)
{
values = SelectedValue.Split(',').ToList();
}
var q = Enum.GetValues(typeof(EnumPCS.EnumWipBoardSolderPasteType)).Cast<EnumPCS.EnumWipBoardSolderPasteType>()
var solderPasteSerials = await _pcbApi.GetSolderPasteSerial();
var q = solderPasteSerials.Where(x => isReview || x.StatusNo == "A")
.Select(s => new SelectListItem
{
Text = EnumPCS.GetDisplayName(s).ToString(),
Value = s.ToString()
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))
{
var isCurrentActive = solderPasteSerials.Any(x => x.SerialNo == SelectedValue && x.StatusNo == "A");
if (!isCurrentActive)
{
otherItem.Selected = true;
}
}
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
/// <param name="WipNo">工單號碼</param>
/// <param name="ItemNo">工單料號</param>
/// <param name="UnitNo">生產單位</param>
/// <param name="SolderPaste">錫膏</param>
/// <param name="isReview">是否為檢視模式</param>
/// <returns></returns>
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

42
AMESCoreStudio.Web/HttpApis/AMES/IPCB.cs

@ -735,6 +735,48 @@ namespace AMESCoreStudio.Web
#endregion
#region PCB020 錫膏規格維護
/// <summary>
/// 查詢錫膏規格資料 ID
/// </summary>
/// <returns></returns>
[WebApiClient.Attributes.HttpGet("api/SolderPasteSerial/{id}")]
ITask<SolderPasteSerial> GetSolderPasteSerial(string id);
/// <summary>
/// 錫膏規格資料查詢
/// </summary>
/// <param name="serialNo">錫膏編號</param>
/// <param name="description">規格</param>
/// <param name="vendor">廠商</param>
/// <returns></returns>
[WebApiClient.Attributes.HttpGet("api/SolderPasteSerial/SolderPasteSerialQuery")]
ITask<ResultModel<SolderPasteSerial>> GetSolderPasteSerialQuery(string serialNo = null, string description = null, string vendor = null);
/// <summary>
/// 新增錫膏規格資料
/// </summary>
/// <returns></returns>
[WebApiClient.Attributes.HttpPost("api/SolderPasteSerial")]
ITask<ResultModel<SolderPasteSerial>> PostSolderPasteSerial([FromBody, RawJsonContent] string model);
/// <summary>
/// 更新錫膏規格資料
/// </summary>
/// <returns></returns>
[WebApiClient.Attributes.HttpPut("api/SolderPasteSerial")]
ITask<ResultModel<SolderPasteSerial>> PutSolderPasteSerial([FromBody, RawJsonContent] string model);
/// <summary>
/// 更新錫膏規格 -狀態
/// </summary>
/// <returns></returns>
[WebApiClient.Attributes.HttpPut("api/SolderPasteSerial/UpdateStatus")]
ITask<ResultModel<SolderPasteSerial>> PutSolderPasteSerialStatus([FromBody, RawJsonContent] string model);
#endregion
}
}

132
AMESCoreStudio.Web/Views/PCB/PCB020.cshtml

@ -0,0 +1,132 @@
@{
ViewData["Title"] = "錫膏規格維護";
Layout = "~/Views/Shared/_AMESLayout.cshtml";
}
<div class="layui-card">
<div class="layui-card-header">
<div class="layui-form">
<div class="layui-form-item">
<div class="layui-inline"><i class="fa fa-file-text-o fa-fw"></i> @ViewBag.Title</div>
</div>
</div>
</div>
<div class="layui-card-body">
<div class="layui-form">
<div class="layui-row">
<div class="layui-form-item">
<div class="layui-col-sm4">
<div class="layui-inline">
<label class="layui-form-label" style="width:80px">錫膏代碼</label>
<div class="layui-input-inline" style="width:150px">
<input id="serialNo" name="serialNo" autocomplete="off" class="layui-input">
</div>
</div>
</div>
<div class="layui-col-sm3">
<div class="layui-inline">
<label class="layui-form-label" style="width:60px">規格</label>
<div class="layui-input-inline" style="width:150px">
<input id="description" name="description" autocomplete="off" class="layui-input">
</div>
</div>
</div>
<div class="layui-col-sm3">
<div class="layui-inline">
<label class="layui-form-label" style="width:60px">廠商</label>
<div class="layui-input-inline" style="width:150px">
<input id="vendor" name="vendor" autocomplete="off" class="layui-input">
</div>
</div>
</div>
<div class="layui-col-sm1">
<div class="layui-inline layui-show-xs-block">
<button class="layui-btn layui-btn-sm layui-btn-normal" lay-submit lay-filter="querysubmit">
<i class="layui-icon layui-icon-sm">&#xe615;</i>
</button>
</div>
</div>
</div>
</div>
</div>
<table class="layui-hide" id="query" lay-filter="query"></table>
</div>
</div>
@section Scripts{
<script type="text/javascript">
layui.use(['form', 'layer'], function () {
var form = layui.form;
});
// 監聽查詢
hg.form.onsubmit('querysubmit', function (data) {
hg.msghide("重新載入資料..");
table && table.reload(data);
});
var tableCols = [[
{ field: 'serialNo', title: '錫膏代碼', sort: true },
{ field: 'description', title: '規格' },
{ field: 'alloy', title: '合金' },
{ field: 'vendor', title: '廠商' },
{ field: 'type', title: '種類' },
{
title: '操作', align: 'center', width: 160,
templet: function (d) {
var btnEdit = `<a class='layui-btn layui-btn-xs layui-icon layui-icon-edit' lay-event='edit'>修改</a>`;
var btnStatus = "";
if (d.statusNo == 'A') {
btnStatus = `<a class='layui-btn layui-btn-danger layui-btn-xs layui-icon layui-icon-delete' lay-event='status'>停用</a>`;
} else {
btnStatus = `<a class='layui-btn layui-btn-normal layui-btn-xs layui-icon layui-icon-ok' lay-event='status'>啟用</a>`;
}
return btnEdit + btnStatus;
}
}
]];
// 編輯
function edit(obj) {
if (obj.data.serialNo) {
hg.open('修改錫膏規格', '/PCB/PCB020U?id=' + obj.data.serialNo, 500, 420);
}
}
// 停用/啟用
function status(obj) {
var targetStatus = obj.data.statusNo == 'A' ? 'S' : 'A';
var msg = targetStatus == 'S' ? '停用' : '啟用';
hg.confirm("確定要" + msg + "錫膏代碼【" + obj.data.serialNo + "】嗎?", function () {
$.ajax({
url: '/PCB/PCB020S',
data: { id: obj.data.serialNo, status: targetStatus },
type: 'POST',
success: function (data) {
if (data.success) {
hg.msghide(msg + "成功!");
var qs = $('button[lay-filter="querysubmit"]');
qs.click();
} else {
hg.msg(data.msg);
}
},
error: function () {
hg.msg("網路請求失敗!");
}
});
});
}
// 新增按鈕
var toolbar = [{
text: '新增',
layuiicon: '&#xe608;',
class: 'layui-btn',
handler: function () {
hg.open('新增錫膏規格', '/PCB/PCB020C', 500, 420);
}
}];
// 表格
var table = hg.table.datatable('query', '錫膏規格查詢', '/PCB/PCB020Query', {}, tableCols, toolbar, false, 'full-100', ['filter', 'print', 'exports']);
</script>
}

92
AMESCoreStudio.Web/Views/PCB/PCB020C.cshtml

@ -0,0 +1,92 @@
@model AMESCoreStudio.WebApi.Models.AMES.SolderPasteSerial
@{
Layout = "~/Views/Shared/_AMESLayout.cshtml";
}
<div class="layui-card">
<div class="layui-card-body">
<div class="layui-row">
<div class="layui-col-md10 layui-col-md-offset1">
<form enctype="multipart/form-data" method="post" asp-action="PCB020" class="layui-form" id="myForm">
<input type="hidden" name="ActionType" value="Add" />
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="layui-form-item">
<label class="layui-form-label" style="width:120px; white-space:nowrap;">代碼(錫膏前兩碼)</label>
<div class="layui-input-block" style="margin-left:150px">
<input asp-for="SerialNo" class="layui-input" autocomplete="off" placeholder="請輸入代碼(2碼大寫)" required maxlength="2" style="text-transform:uppercase;" oninput="this.value = this.value.toUpperCase()" />
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label" style="width:120px; white-space:nowrap;">規格</label>
<div class="layui-input-block" style="margin-left:150px">
<input asp-for="Description" class="layui-input" autocomplete="off" placeholder="請輸入規格" required />
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label" style="width:120px; white-space:nowrap;">合金</label>
<div class="layui-input-block" style="margin-left:150px">
<input asp-for="Alloy" class="layui-input" autocomplete="off" placeholder="請輸入合金" required />
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label" style="width:120px; white-space:nowrap;">廠商</label>
<div class="layui-input-block" style="margin-left:150px">
<input asp-for="Vendor" class="layui-input" autocomplete="off" placeholder="請輸入廠商" required />
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label" style="width:120px; white-space:nowrap;">種類</label>
<div class="layui-input-block" style="margin-left:150px">
<input asp-for="Type" class="layui-input" autocomplete="off" placeholder="請輸入種類" required />
</div>
</div>
<div class="layui-form-item">
<div class="layui-col-md12" style="text-align:center">
<input type="submit" value="儲存" class="layui-btn" lay-filter="submitBtn" lay-submit />
</div>
</div>
</form>
</div>
</div>
</div>
</div>
@section Scripts {
@{
await Html.RenderPartialAsync("_ValidationScriptsPartial");
}
<script type="text/javascript">
layui.use(['form'], function () {
var form = layui.form;
form.on('submit(submitBtn)', function (data) {
$('#myForm').validate().form();
if ($('#myForm').valid()) {
var submitButton = $('input[type="submit"][lay-filter="submitBtn"]');
submitButton.addClass('layui-btn-disabled');
submitButton.attr('disabled', 'disabled');
$.ajax({
type: "POST",
url: "@Url.Action("PCB020","PCB")",
data: $('#myForm').serialize(),
success: function (response) {
if (response.success) {
hg.close();
hg.msg(response.msg);
parent.table && parent.table.reload();
} else {
hg.msg(response.msg);
}
},
complete: function () {
submitButton.removeClass('layui-btn-disabled');
submitButton.removeAttr('disabled');
}
});
}
});
});
</script>
}

94
AMESCoreStudio.Web/Views/PCB/PCB020U.cshtml

@ -0,0 +1,94 @@
@model AMESCoreStudio.WebApi.Models.AMES.SolderPasteSerial
@{
Layout = "~/Views/Shared/_AMESLayout.cshtml";
}
<div class="layui-card">
<div class="layui-card-body">
<div class="layui-row">
<div class="layui-col-md10 layui-col-md-offset1">
<form enctype="multipart/form-data" method="post" asp-action="PCB020" class="layui-form" id="myForm">
<input type="hidden" name="ActionType" value="Edit" />
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<input type="hidden" asp-for="SerialNo" value="@Model.SerialNo" />
<div class="layui-form-item">
<label class="layui-form-label" style="width:120px; white-space:nowrap;">錫膏代碼</label>
<div class="layui-input-block" style="margin-left:150px">
<input asp-for="SerialNo" class="layui-input layui-bg-gray" readonly />
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label" style="width:120px; white-space:nowrap;">規格</label>
<div class="layui-input-block" style="margin-left:150px">
<input asp-for="Description" class="layui-input layui-bg-gray" readonly />
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label" style="width:120px; white-space:nowrap;">合金</label>
<div class="layui-input-block" style="margin-left:150px">
<input asp-for="Alloy" class="layui-input" autocomplete="off" placeholder="請輸入合金" required />
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label" style="width:120px; white-space:nowrap;">廠商</label>
<div class="layui-input-block" style="margin-left:150px">
<input asp-for="Vendor" class="layui-input layui-bg-gray" readonly />
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label" style="width:120px; white-space:nowrap;">種類</label>
<div class="layui-input-block" style="margin-left:150px">
<input asp-for="Type" class="layui-input layui-bg-gray" readonly />
</div>
</div>
<div class="layui-form-item">
<div class="layui-col-md12" style="text-align:center">
<input type="submit" value="儲存" class="layui-btn" lay-filter="submitBtn" lay-submit />
</div>
</div>
</form>
</div>
</div>
</div>
</div>
@section Scripts {
@{
await Html.RenderPartialAsync("_ValidationScriptsPartial");
}
<script type="text/javascript">
layui.use(['form'], function () {
var form = layui.form;
form.on('submit(submitBtn)', function (data) {
$('#myForm').validate().form();
if ($('#myForm').valid()) {
var submitButton = $('input[type="submit"][lay-filter="submitBtn"]');
submitButton.addClass('layui-btn-disabled').attr('disabled', 'disabled');
$.ajax({
type: "POST",
url: "@Url.Action("PCB020","PCB")",
data: $('#myForm').serialize(),
success: function (response) {
if (response.success) {
hg.msg(response.msg);
parent.table && parent.table.reload();
hg.close();
} else {
hg.msg(response.msg);
}
},
error: function () {
hg.msg("網路請求失敗!");
},
complete: function () {
submitButton.removeClass('layui-btn-disabled').removeAttr('disabled');
}
});
}
return false;
});
});
</script>
}

13
AMESCoreStudio.Web/Views/PCS/PCS003.cshtml

@ -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({

13
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({

78
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<ActionResult<SolderPasteSerial>> GetSolderPasteSerial(string id)
{
@ -40,6 +42,42 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES
return solderPasteSerial;
}
/// <summary>
/// 錫膏規格維護資料查詢
/// </summary>
/// <param name="serialNo">錫膏代號</param>
/// <param name="description">規格</param>
/// <param name="vendor">廠商</param>
/// <returns></returns>
[HttpGet("SolderPasteSerialQuery")]
public async Task<ResultModel<SolderPasteSerial>> 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<SolderPasteSerial> result = new ResultModel<SolderPasteSerial>();
// 紀錄筆數
result.DataTotal = q.Count();
result.Data = q;
return result;
}
/// <summary>
/// 自動取得編號
/// </summary>
@ -71,7 +109,7 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES
}
/// <summary>
/// 更新錫膏規格流水碼表
/// 更新錫膏規格
/// </summary>
/// <param name="solderPasteSerial"></param>
/// <returns></returns>
@ -96,7 +134,7 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES
}
/// <summary>
/// 更新錫膏規格流水碼表
/// 更新錫膏規格 By流水碼表
/// </summary>
/// <param name="id">規格</param>
/// <returns></returns>
@ -123,6 +161,34 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES
return result;
}
/// <summary>
/// 更新錫膏規格-狀態
/// </summary>
/// <returns></returns>
[HttpPut("UpdateStatus")]
public async Task<ResultModel<SolderPasteSerial>> PutSolderPasteSerialStatus(SolderPasteSerial solderPasteSerial)
{
ResultModel<SolderPasteSerial> result = new ResultModel<SolderPasteSerial>();
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;
}
/// <summary>
/// 新增錫膏規格流水碼表
/// </summary>
@ -148,10 +214,10 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES
}
// DELETE: api/SolderPasteSerial/5
[HttpDelete("{id}")]
public async Task<ActionResult<SolderPasteSerial>> DeleteSolderPasteSerial(string id)
[HttpDelete("{no}")]
public async Task<ActionResult<SolderPasteSerial>> DeleteSolderPasteSerial(string no)
{
var solderPasteSerial = await _context.SolderPasteSerials.FindAsync(id);
var solderPasteSerial = await _context.SolderPasteSerials.FindAsync(no);
if (solderPasteSerial == null)
{
return NotFound();

46
AMESCoreStudio.WebApi/Models/AMES/SolderPasteSerial.cs

@ -54,5 +54,51 @@ namespace AMESCoreStudio.WebApi.Models.AMES
[DataMember]
public string Vendor { get; set; }
/// <summary>
/// 種類
/// </summary>
[Required]
[Column("TYPE")]
[DataMember]
public string Type { get; set; }
/// <summary>
/// 狀態
/// </summary>
[Required]
[Column("STATUS_NO")]
[DataMember]
public string StatusNo { get; set; } = "A";
/// <summary>
/// 建立UserID
/// </summary>
[Column("CREATE_USERID")]
[Required]
[DataMember]
public int CreateUserID { get; set; } = 0;
/// <summary>
/// 建立日期
/// </summary>
[Required]
[Column("CREATE_DATE")]
[DataMember]
public DateTime CreateDate { get; set; } = DateTime.Now;
/// <summary>
/// 更新UserID
/// </summary>
[Column("UPDATE_USERID")]
[DataMember]
public int UpdateUserID { get; set; } = 0;
/// <summary>
/// 更新日期
/// </summary>
[Column("UPDATE_DATE")]
[DataMember]
public DateTime? UpdateDate { get; set; } = DateTime.Now;
}
}

2
AMESCoreStudio.WebApi/Models/AMESContext.cs

@ -1002,7 +1002,7 @@ namespace AMESCoreStudio.WebApi
public virtual DbSet<AUSBarcodeInfo> AUSBarcodeInfos { get; set; }
/// <summary>
/// 錫膏固定編碼流水碼
/// 錫膏規格維護資料檔
/// </summary>
public virtual DbSet<SolderPasteSerial> SolderPasteSerials { get; set; }

Loading…
Cancel
Save