Browse Source

1. 過站治具加入錫膏判斷

2. 新增錫膏報表 錫膏管控 錫膏基本資料維護
3. FQC查詢加入生產製程欄位及抽驗明細按鈕 檢驗項目匯出調整只匯出有勾選資料
4. 修改品質看板報表跟生產製造看板
master
Sai 2 years ago
parent
commit
fb85120a85
  1. 51
      AMESCoreStudio.Web/Controllers/FQCController.cs
  2. 285
      AMESCoreStudio.Web/Controllers/PCBController.cs
  3. 49
      AMESCoreStudio.Web/Controllers/PCSController.cs
  4. 21
      AMESCoreStudio.Web/HttpApis/AMES/IFQC.cs
  5. 72
      AMESCoreStudio.Web/HttpApis/AMES/IPCB.cs
  6. 36
      AMESCoreStudio.Web/ViewModels/PCB/PCB017ViewModel.cs
  7. 2
      AMESCoreStudio.Web/ViewModels/PCS/PCS004CViewModel.cs
  8. 45
      AMESCoreStudio.Web/Views/FQC/FQC007.cshtml
  9. 114
      AMESCoreStudio.Web/Views/FQC/FQC008.cshtml
  10. 74
      AMESCoreStudio.Web/Views/FQC/FQC008A.cshtml
  11. 34
      AMESCoreStudio.Web/Views/FQC/FQC009.cshtml
  12. 119
      AMESCoreStudio.Web/Views/PCB/PCB014.cshtml
  13. 88
      AMESCoreStudio.Web/Views/PCB/PCB014C.cshtml
  14. 148
      AMESCoreStudio.Web/Views/PCB/PCB014U.cshtml
  15. 10
      AMESCoreStudio.Web/Views/PCB/PCB016.cshtml
  16. 223
      AMESCoreStudio.Web/Views/PCB/PCB017.cshtml
  17. 82
      AMESCoreStudio.Web/Views/PCB/PCB017C.cshtml
  18. 161
      AMESCoreStudio.Web/Views/PCB/PCB018.cshtml
  19. 4
      AMESCoreStudio.Web/Views/RPT/RPT002.cshtml
  20. 212
      AMESCoreStudio.WebApi/Controllers/AMES/FqcInhouseMasterController.cs
  21. 317
      AMESCoreStudio.WebApi/Controllers/AMES/SolderPasteInfoController.cs
  22. 31
      AMESCoreStudio.WebApi/Controllers/AMES/SolderPasteRecordController.cs
  23. 171
      AMESCoreStudio.WebApi/Controllers/AMES/SolderPasteSerialController.cs
  24. 3
      AMESCoreStudio.WebApi/Controllers/AMES/SteelPlateInfoController.cs
  25. 105
      AMESCoreStudio.WebApi/Controllers/BLL/BarCodeCheckNewController.cs
  26. 51
      AMESCoreStudio.WebApi/Controllers/BLL/RPTController.cs
  27. 73
      AMESCoreStudio.WebApi/DTO/AMES/FQC008DetailDto.cs
  28. 6
      AMESCoreStudio.WebApi/DTO/AMES/FqcInhouseMasterDto.cs
  29. 0
      AMESCoreStudio.WebApi/DTO/AMES/PCB016ViewDto.cs
  30. 140
      AMESCoreStudio.WebApi/DTO/AMES/PCB017ViewDto.cs
  31. 17
      AMESCoreStudio.WebApi/DTO/AMES/SolderPasteInfoDto.cs
  32. 42
      AMESCoreStudio.WebApi/Enums/EnumPCB.cs
  33. 44
      AMESCoreStudio.WebApi/Models/AMES/SolderPasteInfo.cs
  34. 34
      AMESCoreStudio.WebApi/Models/AMES/SolderPasteRecord.cs
  35. 58
      AMESCoreStudio.WebApi/Models/AMES/SolderPasteSerial.cs

51
AMESCoreStudio.Web/Controllers/FQCController.cs

@ -307,6 +307,24 @@ namespace AMESCoreStudio.Web.Controllers
ViewBag.GetInspectionStatusSelect = q;
}
/// <summary>
/// 生產單位
/// </summary>
/// <returns></returns>
private async Task GetFactoryUnit()
{
var result = await _basApi.GetFactoryUnits();
var FactoryUnit = new List<SelectListItem>();
for (int i = 0; i < result.Count; i++)
{
FactoryUnit.Add(new SelectListItem(result[i].UnitName, result[i].UnitNo.ToString()));
}
ViewBag.FactoryUnitList = FactoryUnit;
}
/// <summary>
/// Mail群組
/// </summary>
@ -1810,17 +1828,17 @@ namespace AMESCoreStudio.Web.Controllers
{
await GetFactoryInfo();
}
await GetFactoryUnit();
return View();
}
public async Task<IActionResult> FQC008QueryAsync(string barcodeNo, string wipNo
, string boxNo, string inhouseNo, string dateStr, string dateEnd, string factoryID
, string status = "A", int page = 0, int limit = 10)
, string status = "A", int page = 0, int limit = 10, string unit = null)
{
IResultModel<FqcInhouseMasterDto> result = await _fqcApi.GetFqcInhouseMasterQuery(barcodeNo: barcodeNo, wipNo: wipNo
, boxNo: boxNo, inhouseNo: inhouseNo, date_str: dateStr, date_end: dateEnd
, status: status, page: page, limit: limit, factoryID: factoryID);
, status: status, page: page, limit: limit, factoryID: factoryID, unit: unit);
if (result.Data.Count() != 0)
{
@ -1829,9 +1847,9 @@ namespace AMESCoreStudio.Web.Controllers
return Json(new Table() { count = 0, data = null });
}
public async Task<IActionResult> FQC008Query2Async(string barcodeNo, string wipNo, string boxNo, string inhouseNo, string dateStr, string dateEnd, string factoryID, string statusNo, string factoryNo, int page = 0, int limit = 10)
public async Task<IActionResult> FQC008Query2Async(string barcodeNo, string wipNo, string boxNo, string inhouseNo, string dateStr, string dateEnd, string factoryID, string statusNo, string factoryNo, string unit, int page = 0, int limit = 10)
{
IResultModel<FqcInhouseMasterDto> result = await _fqcApi.GetFqcInhouseMasterQuery(barcodeNo, wipNo, boxNo, inhouseNo, dateStr, dateEnd, statusNo, page, limit, factoryID, factoryNo);
IResultModel<FqcInhouseMasterDto> result = await _fqcApi.GetFqcInhouseMasterQuery(barcodeNo, wipNo, boxNo, inhouseNo, dateStr, dateEnd, statusNo, page, limit, factoryID, factoryNo, unit: unit);
if (result.Data.Count() != 0)
{
@ -1839,6 +1857,25 @@ namespace AMESCoreStudio.Web.Controllers
}
return Json(new Table() { count = 0, data = null });
}
[HttpGet]
public IActionResult FQC008A(string wipNo)
{
ViewBag.wipNo = wipNo;
return View();
}
public async Task<IActionResult> GetFQC008A(string wipNo)
{
var result = await _fqcApi.GetFqcInhouseMasterQueryExamineDetail(wipNo);
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 });
}
#endregion
#region FQC009 料號對應檢驗工項
@ -1919,7 +1956,7 @@ namespace AMESCoreStudio.Web.Controllers
#endregion
#region FQC010 報表
public async Task<IActionResult> FQC010_PDF(string inhouseNo, int seqID)
public IActionResult FQC010_PDF(string inhouseNo, int seqID)
{
string mimeType = "";
int extension = 1;
@ -1929,7 +1966,7 @@ namespace AMESCoreStudio.Web.Controllers
return File(result.MainStream, "application/pdf");
}
public async Task<IActionResult> FQC010_Excel(string inhouseNo, int seqID)
public IActionResult FQC010_Excel(string inhouseNo, int seqID)
{
string mimeType = "";
int extension = 1;

285
AMESCoreStudio.Web/Controllers/PCBController.cs

@ -42,24 +42,24 @@ namespace AMESCoreStudio.Web.Controllers
//#region 下拉選單
/// <summary>
/// SOP_Type
/// 錫膏狀態
/// </summary>
/// <param name="SelectedValue"></param>
private void GetSteelPlateStatusSelect(string SelectedValue = null)
private void GetSolderPasteStatusSelect(string SelectedValue = null)
{
List<string> values = new List<string>();
if (SelectedValue != null)
{
values = SelectedValue.Split(',').ToList();
}
var q = Enum.GetValues(typeof(EnumPCB.EnumSteelPlateStatus)).Cast<EnumPCB.EnumSteelPlateStatus>()
var q = Enum.GetValues(typeof(EnumPCB.EnumSolderPasteStatus)).Cast<EnumPCB.EnumSolderPasteStatus>()
.Select(s => new SelectListItem
{
Text = EnumPCB.GetDisplayName(s).ToString(),
Value = s.ToString()
}).ToList();
ViewBag.GetSteelPlateStatusSelect = q;
ViewBag.GetSolderPasteStatusSelect = q;
}
//#endregion
@ -350,12 +350,14 @@ namespace AMESCoreStudio.Web.Controllers
#region PCB014 錫膏使用管控
public ActionResult PCB014()
{
GetSolderPasteStatusSelect();
return View();
}
public async Task<IActionResult> PCB014QueryAsync(string solderPasteNo, string status, int page = 0, int limit = 10)
public async Task<IActionResult> PCB014QueryAsync(string solderPasteNo, string description, string vendor, string status, int page = 0, int limit = 10)
{
IResultModel<SolderPasteInfoDto> result = await _pcbApi.GetSolderPasteInfoQuery(solderPasteNo: solderPasteNo, status: status, page: page, limit: limit);
IResultModel<SolderPasteInfoDto> result = await _pcbApi.GetSolderPasteInfoQuery(solderPasteNo: solderPasteNo,
description: description, vendor: vendor, status: status, page: page, limit: limit);
if (result.Data.Count() != 0)
{
@ -378,9 +380,14 @@ namespace AMESCoreStudio.Web.Controllers
return View(result);
}
//頁面提交,id=0 添加,id>0 修改
/// <summary>
/// 頁面提交,id=0 添加,id>0 修改
/// </summary>
/// <param name="model"></param>
/// <param name="numbergeneration">編碼生成</param>
/// <returns></returns>
[HttpPost]
public async Task<IActionResult> PCB014Async(SolderPasteInfo model)
public async Task<IActionResult> PCB014Async(SolderPasteInfo model, string numbergeneration)
{
// 日期判斷
if (model.EffectiveDate < model.ManufactoringDate)
@ -391,8 +398,51 @@ namespace AMESCoreStudio.Web.Controllers
{
IResultModel result;
// 新增
if (model.SolderPasteID == 0)
{
var msg = string.Empty;
// 錫膏編號自動編碼
if (numbergeneration == "A")
{
// 用規格帶出流水碼
model.SolderPasteNo = await _pcbApi.GetSolderPasteSerialByAutoSerialNo(model.Description);
if (string.IsNullOrWhiteSpace(model.SolderPasteNo))
{
msg = "找不到規格對應的代碼";
}
}
// 人工手動給予
else if (numbergeneration == "M")
{
if (string.IsNullOrWhiteSpace(model.SolderPasteNo))
msg = "請輸入錫膏編號";
else
{
List<SolderPasteSerial> solderPasteSerials = await _pcbApi.GetSolderPasteSerial();
// 目前有設定的代號
var serialNo = solderPasteSerials.Select(s => s.SerialNo).ToList();
if (serialNo.Any(code => model.SolderPasteNo.StartsWith(code)))
{
msg = "不可以輸入系統指定代碼";
}
var query = await _pcbApi.GetSolderPasteInfoQuery(solderPasteNo: model.SolderPasteNo);
// 錫膏編號重複
if (query.DataTotal != 0)
msg = "該錫膏編號已建立過";
}
}
// 有錯誤訊息
if (!string.IsNullOrWhiteSpace(msg))
{
ModelState.AddModelError("error", msg);
return View("PCB014C", model);
}
model.CreateUserID = GetLogInUserID();
model.CreateDate = DateTime.Now;
model.UpdateUserID = GetLogInUserID();
@ -417,13 +467,230 @@ namespace AMESCoreStudio.Web.Controllers
}
}
if (model.SolderPasteID == 0)
{
return View("PCB014C", model);
}
return View("PCB014U", model);
}
/// <summary>
/// PCB014 錫膏刪除
/// </summary>
/// <param name="id">錫膏ID</param>
/// <returns></returns>
[HttpPost]
public async Task<IActionResult> PCB014D(int id)
{
var result = await _pcbApi.DeleteSolderPasteInfo(id);
if (result.Success)
return Json(new Result() { success = true, msg = "刪除成功" });
else
return Json(new Result() { success = false, msg = "刪除失敗" });
}
[HttpGet]
public IActionResult PCB017()
{
return View();
}
/// <summary>
/// 錫膏管制查詢
/// </summary>
/// <param name="solderPasteNo">錫膏編號</param>
/// <param name="status">狀態</param>
/// <param name="wipNo">工單號碼</param>
/// <param name="strDate">開始_收貨時間</param>
/// <param name="endDate">結束_收貨時間</param>
/// <param name="page">頁數</param>
/// <param name="limit">筆數</param>
/// <returns></returns>
public async Task<IActionResult> PCB017QueryAsync(string solderPasteNo , string status , string wipNo ,
string strDate , string endDate , int page = 0, int limit = 10)
{
IResultModel<PCB017ViewDto> result = await _pcbApi.GetSolderPasteInfoReport(solderPasteNo: solderPasteNo, status: status,
strDate: strDate, endDate: endDate, wipNo: wipNo, page: page, limit: limit);
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 });
}
/// <summary>
/// 錫膏管制作業-新增
/// </summary>
/// <returns></returns>
public IActionResult PCB017C()
{
PCB017ViewModel model = new PCB017ViewModel();
return View(model);
}
/// <summary>
/// 錫膏管制作業-新增
/// </summary>
/// <param name="solderPasteNo">錫膏編號</param>
/// <param name="status">狀態(I=入冰箱 ; O=出冰箱 ; C=使用完 ; X=報廢)</param>
/// <param name="qty">數量</param>
/// <returns></returns>
[HttpPost]
public async Task<IActionResult> PCB017Async(PCB017ViewModel model)
{
List<SolderPasteSerial> solderPasteSerials = await _pcbApi.GetSolderPasteSerial();
// 目前有設定的代號
var serialNo = solderPasteSerials.Select(s => s.SerialNo).ToList();
if (string.IsNullOrEmpty(model.solderPasteNo))
{
ModelState.AddModelError("error", "請輸入錫膏編號");
return View("PCB017C", model);
}
if (model.qty == null && model.status == "I")
{
ModelState.AddModelError("error", "請輸入錫膏入冰箱數量");
return View("PCB017C", model);
}
// 狀態為入冰箱 => 找未使用
// 狀態為出冰箱 => 找入冰箱
// 狀態為使用完 => 找開封中
var selectStatus = model.status == "I" ? "N" :
model.status == "O" ? "I" :
model.status == "C" ? "U" : model.status;
var query = await _pcbApi.GetSolderPasteInfoByStatus(selectStatus);
List<SolderPasteRecord> solderPasteRecords = new List<SolderPasteRecord>();
switch (model.status)
{
case "I": // 入冰箱
// 判斷是否有序號且未使用
if (query.Where(w => w.SolderPasteNo == model.solderPasteNo).Any())
{
var Sn = model.solderPasteNo.Substring(0, 2);
var queryByNo = query.Where(w => w.SolderPasteNo.StartsWith(Sn)).ToList();
if (model.qty > queryByNo.Count())
{
ModelState.AddModelError("error", "目前能入冰箱錫膏數量不足,請確認");
return View("PCB017C", model);
}
foreach (var item in queryByNo.OrderBy(o => o.SolderPasteNo).Take(int.Parse(model.qty.ToString())))
{
solderPasteRecords.Add(new SolderPasteRecord
{
SolderPasteID = item.SolderPasteID,
Status = model.status,
CreateUserID = GetLogInUserID(),
CreateDate = DateTime.Now
});
}
}
else
{
ModelState.AddModelError("error", "找不到該筆錫膏編號是未使用狀態,請確認");
return View("PCB017C", model);
}
break;
case "O": // 出冰箱
// 判斷是否有序號且已入冰箱
if (query.Where(w => w.SolderPasteNo == model.solderPasteNo).Any())
{
var Sn = model.solderPasteNo.Substring(0, 2);
var queryByNo = query.Where(w => w.SolderPasteNo.StartsWith(Sn)).ToList();
var first = queryByNo.OrderBy(o => o.UpdateDate).ThenBy(o => o.SolderPasteNo).FirstOrDefault();
if (model.solderPasteNo != first.SolderPasteNo)
{
ModelState.AddModelError("error", "該筆錫膏編號順序不正確,請確認");
return View("PCB017C", model);
}
solderPasteRecords.Add(new SolderPasteRecord
{
SolderPasteID = first.SolderPasteID,
Status = model.status,
CreateUserID = GetLogInUserID(),
CreateDate = DateTime.Now
});
}
else
{
ModelState.AddModelError("error", "找不到該筆錫膏編號是入冰箱狀態,請確認");
return View("PCB017C", model);
}
break;
case "C": // 使用完
// 判斷是否有序號且已開封
if (query.Where(w => w.SolderPasteNo == model.solderPasteNo).Any())
{
var first = query.Where(w => w.SolderPasteNo == model.solderPasteNo).FirstOrDefault();
solderPasteRecords.Add(new SolderPasteRecord
{
SolderPasteID = first.SolderPasteID,
Status = model.status,
CreateUserID = GetLogInUserID(),
CreateDate = DateTime.Now
});
}
else
{
ModelState.AddModelError("error", "找不到該筆錫膏編號是開封狀態,請確認");
return View("PCB017C", model);
}
break;
case "X": // 報廢
if (query.Where(w => w.SolderPasteNo == model.solderPasteNo).Any())
{
var first = query.Where(w => w.SolderPasteNo == model.solderPasteNo).FirstOrDefault();
solderPasteRecords.Add(new SolderPasteRecord
{
SolderPasteID = first.SolderPasteID,
Status = model.status,
CreateUserID = GetLogInUserID(),
CreateDate = DateTime.Now
});
}
else
{
ModelState.AddModelError("error", "找不到該筆錫膏編號可報廢狀態,請確認");
return View("PCB017C", model);
}
break;
}
var aa = await _pcbApi.PostSolderPasteRecord(JsonConvert.SerializeObject(solderPasteRecords));
return RedirectToAction("Refresh", "Home", new { msg = "新增成功!" });
}
[HttpGet]
public IActionResult PCB018()
{
return View();
}
/// <summary>
/// 錫膏報表查詢
/// </summary>
/// <param name="solderPasteNo">錫膏編號</param>
/// <param name="wipNo">工單號碼</param>
/// <param name="page">頁數</param>
/// <param name="limit">筆數</param>
/// <returns></returns>
public async Task<IActionResult> PCB018QueryAsync(string solderPasteNo, string wipNo ,int page = 0, int limit = 10)
{
IResultModel<PCB017ViewDto> result = await _pcbApi.GetSolderPasteInfoReport(solderPasteNo: solderPasteNo,
wipNo: wipNo, page: page, limit: limit);
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 });
}
#endregion
#region PCB015連板綁定作業

49
AMESCoreStudio.Web/Controllers/PCSController.cs

@ -3556,10 +3556,8 @@ namespace AMESCoreStudio.Web.Controllers
model.WipInfo = q.FirstOrDefault();
model.WipAtt = await _pcsApi.GetWipAtt(model.WipInfo.WipNO);
model.WipBarcodes = await _pcsApi.GetWipBarcode(model.WipInfo.WipNO);
model.RuleStation = await _basApi.GetRuleStationsByFlow(model.WipInfo.FlowRuleID);
model.WipInfo.WipType = model.WipInfo.WipType == "S" ? "標準工單" :
model.WipInfo.WipType == "R" ? "重工工單" : "無序號工單";
//model.RuleStation = model.RuleStation.OrderBy(o => o.Sequence);
}
return View(model);
}
@ -3575,10 +3573,8 @@ namespace AMESCoreStudio.Web.Controllers
model.WipInfo = q.FirstOrDefault();
model.WipAtt = await _pcsApi.GetWipAtt(model.WipInfo.WipNO);
model.WipBarcodes = await _pcsApi.GetWipBarcode(model.WipInfo.WipNO);
model.RuleStation = await _basApi.GetRuleStationsByFlow(model.WipInfo.FlowRuleID);
model.WipInfo.WipType = model.WipInfo.WipType == "S" ? "標準工單" :
model.WipInfo.WipType == "R" ? "重工工單" : "無序號工單";
//model.RuleStation = model.RuleStation.OrderBy(o => o.Sequence);
}
return View(model);
}
@ -4300,25 +4296,28 @@ namespace AMESCoreStudio.Web.Controllers
if (result_barcodeinfo == null)
{
// 判斷是否在BarcodeChange 有被置換過
var result_BarcodeChangeData = await _pcsApi.GetBarcodeChangeByBarcodeNo(model.BarCodeNo ?? model.ExtraBarCodeNo ?? "A");
var _msg = "查無相關資料!";
return RedirectToAction("Refresh", "Home", new { msg = _msg });
// 判斷查詢是內部還是出貨條碼
if (!string.IsNullOrWhiteSpace(model.BarCodeNo))
result_BarcodeChangeData = result_BarcodeChangeData.Where(w => w.ChangeType == "P").ToList();
else
result_BarcodeChangeData = result_BarcodeChangeData.Where(w => w.ChangeType == "E").ToList();
//// 判斷是否在BarcodeChange 有被置換過
//var result_BarcodeChangeData = await _pcsApi.GetBarcodeChangeByBarcodeNo(model.BarCodeNo ?? model.ExtraBarCodeNo ?? "A");
if (result_BarcodeChangeData.Count() != 0)
{
var barcodeIDChange = result_BarcodeChangeData.FirstOrDefault().BarcodeID;
result_barcodeinfo = _pcsApi.GetBarcodeInfoes(barcodeIDChange).InvokeAsync().Result.FirstOrDefault();
}
else
{
var _msg = "查無相關資料!";
return RedirectToAction("Refresh", "Home", new { msg = _msg });
}
//// 判斷查詢是內部還是出貨條碼
//if (!string.IsNullOrWhiteSpace(model.BarCodeNo))
// result_BarcodeChangeData = result_BarcodeChangeData.Where(w => w.ChangeType == "P").ToList();
//else
// result_BarcodeChangeData = result_BarcodeChangeData.Where(w => w.ChangeType == "E").ToList();
//if (result_BarcodeChangeData.Count() != 0)
//{
// var barcodeIDChange = result_BarcodeChangeData.FirstOrDefault().BarcodeID;
// result_barcodeinfo = _pcsApi.GetBarcodeInfoes(barcodeIDChange).InvokeAsync().Result.FirstOrDefault();
//}
//else
//{
// var _msg = "查無相關資料!";
// return RedirectToAction("Refresh", "Home", new { msg = _msg });
//}
}
var result = new PCS009RViewModel();
@ -5190,10 +5189,8 @@ namespace AMESCoreStudio.Web.Controllers
model.WipInfo = q.FirstOrDefault();
model.WipAtt = await _pcsApi.GetWipAtt(model.WipInfo.WipNO);
model.WipBarcodeOther = await _pcsApi.GetWipBarcodeOther(model.WipInfo.WipNO);
model.RuleStation = await _basApi.GetRuleStationsByFlow(model.WipInfo.FlowRuleID);
model.WipInfo.WipType = model.WipInfo.WipType == "S" ? "標準工單" :
model.WipInfo.WipType == "R" ? "重工工單" : "無序號工單";
//model.RuleStation = model.RuleStation.OrderBy(o => o.Sequence);
}
return View(model);
}
@ -5209,10 +5206,8 @@ namespace AMESCoreStudio.Web.Controllers
model.WipInfo = q.FirstOrDefault();
model.WipAtt = await _pcsApi.GetWipAtt(model.WipInfo.WipNO);
model.WipBarcodes = await _pcsApi.GetWipBarcode(model.WipInfo.WipNO);
model.RuleStation = await _basApi.GetRuleStationsByFlow(model.WipInfo.FlowRuleID);
model.WipInfo.WipType = model.WipInfo.WipType == "S" ? "標準工單" :
model.WipInfo.WipType == "R" ? "重工工單" : "無序號工單";
//model.RuleStation = model.RuleStation.OrderBy(o => o.Sequence);
}
return View(model);
}
@ -5437,10 +5432,8 @@ namespace AMESCoreStudio.Web.Controllers
model.WipInfo = q.FirstOrDefault();
model.WipAtt = await _pcsApi.GetWipAtt(model.WipInfo.WipNO);
model.WipBarcodes = await _pcsApi.GetWipBarcode(model.WipInfo.WipNO);
model.RuleStation = await _basApi.GetRuleStationsByFlow(model.WipInfo.FlowRuleID);
model.WipInfo.WipType = model.WipInfo.WipType == "S" ? "標準工單" :
model.WipInfo.WipType == "R" ? "重工工單" : "無序號工單";
//model.RuleStation = model.RuleStation.OrderBy(o => o.Sequence);
}
return View(model);
}
@ -5456,10 +5449,8 @@ namespace AMESCoreStudio.Web.Controllers
model.WipInfo = q.FirstOrDefault();
model.WipAtt = await _pcsApi.GetWipAtt(model.WipInfo.WipNO);
model.WipBarcodes = await _pcsApi.GetWipBarcode(model.WipInfo.WipNO);
model.RuleStation = await _basApi.GetRuleStationsByFlow(model.WipInfo.FlowRuleID);
model.WipInfo.WipType = model.WipInfo.WipType == "S" ? "標準工單" :
model.WipInfo.WipType == "R" ? "重工工單" : "無序號工單";
//model.RuleStation = model.RuleStation.OrderBy(o => o.Sequence);
}
return View(model);
}

21
AMESCoreStudio.Web/HttpApis/AMES/IFQC.cs

@ -541,19 +541,28 @@ namespace AMESCoreStudio.Web
/// <param name="page">頁數</param>
/// <param name="limit">筆數</param>
/// <param name="factoryID">委外廠商</param>
/// <param name="unit">製程</param>
/// <returns></returns>
[WebApiClient.Attributes.HttpGet("api/FqcInhouseMaster/FqcInhouseMasterQuery")]
ITask<ResultModel<FqcInhouseMasterDto>> GetFqcInhouseMasterQuery(string barcodeNo = null, string wipNo = null
, string boxNo = null, string inhouseNo = null, string date_str = null, string date_end = null
, string status = null, int page = 0, int limit = 10, string factoryID = null, string factoryNo = null);
#endregion
, string status = null, int page = 0, int limit = 10, string factoryID = null, string factoryNo = null , string unit = null);
#region FQC009 料號檢驗工項維護
/// <summary>
/// MaterialItem 料號基本資料檔
/// FQC查詢 - 抽驗明細
/// </summary>
/// <param name="id">料號</param>
[WebApiClient.Attributes.HttpGet("api/MaterialItem/ByItemNO/{id}")]
/// <param name="id">工單號碼</param>
/// <returns></returns>
[WebApiClient.Attributes.HttpGet("api/FqcInhouseMaster/FqcInhouseMasterQuery/ExamineDetail/{id}")]
ITask<ResultModel<FQC008DetailDto>> GetFqcInhouseMasterQueryExamineDetail(string id);
#endregion
#region FQC009 料號檢驗工項維護
/// <summary>
/// MaterialItem 料號基本資料檔
/// </summary>
/// <param name="id">料號</param>
[WebApiClient.Attributes.HttpGet("api/MaterialItem/ByItemNO/{id}")]
ITask<MaterialItem> GetMaterialItemByItemNO(string id);
/// <summary>

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

@ -475,9 +475,9 @@ namespace AMESCoreStudio.Web
/// <param name="limit">筆數</param>
/// <returns></returns>
[WebApiClient.Attributes.HttpGet("api/SteelPlateInfo/SteelPlateInfoQuery")]
ITask<ResultModel<SteelPlateInfoDto>> GetSteelPlateInfoQuery(string steelPlateNo = null, string storageLocation = null ,
string item = null, string date_str = null , string date_end = null
, string side = null, string status = null,string checkOff = null , int page = 0, int limit = 10);
ITask<ResultModel<SteelPlateInfoDto>> GetSteelPlateInfoQuery(string steelPlateNo = null, string storageLocation = null,
string item = null, string date_str = null, string date_end = null
, string side = null, string status = null, string checkOff = null, int page = 0, int limit = 10);
/// <summary>
/// 新增鋼板資料
@ -578,12 +578,21 @@ namespace AMESCoreStudio.Web
/// </summary>
/// <param name="solderPasteNo">錫膏編號</param>
/// <param name="status">狀態</param>
/// <param name="description">規格</param>
/// <param name="vendor">廠商</param>
/// <param name="page">頁數</param>
/// <param name="limit">筆數</param>
/// <returns></returns>
[WebApiClient.Attributes.HttpGet("api/SolderPasteInfo/SolderPasteInfoQuery")]
ITask<ResultModel<SolderPasteInfoDto>> GetSolderPasteInfoQuery(string solderPasteNo = null, string pcbPartNo = null
, string side = null, string status = null, int page = 0, int limit = 10);
ITask<ResultModel<SolderPasteInfoDto>> GetSolderPasteInfoQuery(string solderPasteNo = null, string status = null, string description = null, string vendor = null, int page = 0, int limit = 10);
/// <summary>
/// 錫膏資料 By狀態 查詢
/// </summary>
/// <param name="id">狀態</param>
/// <returns></returns>
[WebApiClient.Attributes.HttpGet("api/SolderPasteInfo/SolderPasteInfoByStatus/{id}")]
ITask<List<SolderPasteInfo>> GetSolderPasteInfoByStatus(string id);
/// <summary>
/// 新增錫膏資料
@ -599,6 +608,35 @@ namespace AMESCoreStudio.Web
[WebApiClient.Attributes.HttpPut("api/SolderPasteInfo")]
ITask<ResultModel<SolderPasteInfo>> PutSolderPasteInfo([FromBody, RawJsonContent] string model);
/// <summary>
/// 刪除錫膏資料
/// </summary>
/// <returns></returns>
[WebApiClient.Attributes.HttpDelete("api/SolderPasteInfo/{id}")]
ITask<ResultModel<SolderPasteInfo>> DeleteSolderPasteInfo(int id);
/// <summary>
/// 錫膏編號規則查詢
/// </summary>
/// <returns></returns>
[WebApiClient.Attributes.HttpGet("api/SolderPasteSerial")]
ITask<List<SolderPasteSerial>> GetSolderPasteSerial();
/// <summary>
/// 自動取得錫膏編號
/// </summary>
/// <param name="id">規格</param>
/// <returns></returns>
[WebApiClient.Attributes.HttpGet("api/SolderPasteSerial/AutoSerialNo/{id}")]
ITask<string> GetSolderPasteSerialByAutoSerialNo(string id);
/// <summary>
/// 更新錫膏編號流水碼
/// </summary>
/// <returns></returns>
[WebApiClient.Attributes.HttpPut("api/SolderPasteSerial/AutoMatically/{id}")]
ITask<ResultModel<SolderPasteSerial>> PutSolderPasteSerialAutoMatically(string id);
/// <summary>
/// 查詢錫膏資料 ID
/// </summary>
@ -612,6 +650,28 @@ namespace AMESCoreStudio.Web
/// <returns></returns>
[WebApiClient.Attributes.HttpGet("api/SolderPasteInfo/ByNo/{id}")]
ITask<List<SolderPasteInfo>> GetSolderPasteInfoByNo(string id);
/// <summary>
/// 新增 錫膏管控紀錄
/// </summary>
/// <returns></returns>
[WebApiClient.Attributes.HttpPost("api/SolderPasteRecord")]
ITask<ResultModel<SolderPasteRecord>> PostSolderPasteRecord([FromBody, RawJsonContent] string model);
/// <summary>
/// 錫膏Report
/// </summary>
/// <param name="solderPasteNo">錫膏編號</param>
/// <param name="status">狀態</param>
/// <param name="wipNo">工單號碼</param>
/// <param name="strDate">開始_收貨時間</param>
/// <param name="endDate">結束_收貨時間</param>
/// <param name="page">頁數</param>
/// <param name="limit">筆數</param>
/// <returns></returns>
[WebApiClient.Attributes.HttpGet("api/SolderPasteInfo/Report")]
ITask<ResultModel<PCB017ViewDto>> GetSolderPasteInfoReport(string solderPasteNo = null, string status = null, string wipNo = null,
string strDate = null, string endDate = null, int page = 0, int limit = 10);
#endregion
#region PCB015 連板綁定作業
@ -627,7 +687,7 @@ namespace AMESCoreStudio.Web
/// </summary>
/// <returns></returns>
[WebApiClient.Attributes.HttpGet("api/WipBarcode/CheckInRange/")]
ITask<List<WipBarcode>> GetWipBarcodesCheckInRange(string WipNo,string BarcodeNO);
ITask<List<WipBarcode>> GetWipBarcodesCheckInRange(string WipNo, string BarcodeNO);
/// <summary>
/// 綁定Group

36
AMESCoreStudio.Web/ViewModels/PCB/PCB017ViewModel.cs

@ -0,0 +1,36 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
using System.Runtime.Serialization;
#nullable disable
namespace AMESCoreStudio.Web.ViewModels.PCB
{
/// <summary>
/// 錫膏新增 ViewModel
/// </summary>
public partial class PCB017ViewModel
{
/// <summary>
/// 錫膏編號
/// </summary>
[DataMember]
public string solderPasteNo { get; set; }
/// <summary>
/// 管制狀態
/// </summary>
[DataMember]
public string status { get; set; }
/// <summary>
/// 入冰箱數量
/// </summary>
[DataMember]
public int? qty { get; set; } = 1;
}
}

2
AMESCoreStudio.Web/ViewModels/PCS/PCS004CViewModel.cs

@ -19,8 +19,6 @@ namespace AMESCoreStudio.Web.ViewModels.PCS
public IEnumerable<WipBarcode> WipBarcodes { get; set; }
public IEnumerable<RuleStation> RuleStation { get; set; }
public IEnumerable<WipBarcodeOther> WipBarcodeOthers { get; set; }
// 序號綁定 Type SN:內部序號 SSN:出貨序號

45
AMESCoreStudio.Web/Views/FQC/FQC007.cshtml

@ -552,38 +552,21 @@
});
//通过行tool檢視,lay-event="detail"
function detail(obj) {
var data = $("#FQC007Form").serialize();
$.ajax({
url: "@Url.Action("FQC007AjaxJson", "FQC")",
type: "POST",
data: data,
success: function (result) {
let InhouseNo = $("#hInhouseNo").val().trim();
let SeqID = $("#hSeqID").val().trim();
layui.use('layer', function () {
var layer = layui.layer;
layer.open({
title: 'FQC細項資料',
type: 2,
area: ['1000px', '500px'],
fixed: false, //不固定
maxmin: false,
scrollbar: true,
moveOut: true,
content: '/FQC/FQC007V?inhouseNo=' + InhouseNo + '&seqID=' + SeqID + '&boxNo=' + obj,
end: function () {
window.location.reload();
}
});
});
},
error: function (result) {
alert(`呼叫API失敗`);
}
let InhouseNo = $("#hInhouseNo").val().trim();
let SeqID = $("#hSeqID").val().trim();
layui.use('layer', function () {
var layer = layui.layer;
layer.open({
title: 'FQC細項資料',
type: 2,
area: ['1000px', '500px'],
fixed: false, //不固定
maxmin: false,
scrollbar: true,
moveOut: true,
content: '/FQC/FQC007V?inhouseNo=' + InhouseNo + '&seqID=' + SeqID + '&boxNo=' + obj,
});
});
//hg.open('FQC細項資料', '/FQC/FQC007V?inhouseNo=' + InhouseNo + '&seqID=' + SeqID + '&boxNo=' + obj, '1000', '500');
}
//UserName

114
AMESCoreStudio.Web/Views/FQC/FQC008.cshtml

@ -7,27 +7,27 @@
/*.layui-table-main .layui-table-cell {*/
/*height: auto !important;*/
/*white-space: normal;
}
}
.layui-table img {
max-width: 60px;
max-height: 28px;
}
.layui-table img {
max-width: 60px;
max-height: 28px;
}
.layui-tree-main {
cursor: pointer;
padding-right: 10px;
float: left;
border-width: 1px;
border-style: solid;
border-color: #e6e6e6;
margin: 10px 0;
}
.layui-tree-main {
cursor: pointer;
padding-right: 10px;
float: left;
border-width: 1px;
border-style: solid;
border-color: #e6e6e6;
margin: 10px 0;
}
.layui-table-cell {
height: auto;
white-space: normal;
}*/
.layui-table-cell {
height: auto;
white-space: normal;
}*/
</style>
@ -45,7 +45,7 @@
<div class="layui-form-item">
<div class="layui-col-sm3">
<div class="layui-inline">
<label class="layui-form-label">委外廠商:</label>
<label class="layui-form-label">委外廠商</label>
<div class="layui-input-inline" style="width:140px">
<select id="factoryID" lay-filter="factory" name="factoryID" asp-items="@ViewBag.FactoryInfoList" class="">
@if (ViewBag.UserFactory == null)
@ -60,23 +60,23 @@
</div>
<div class="layui-col-sm3">
<div class="layui-inline">
<label class="layui-form-label">內部序號:</label>
<label class="layui-form-label">工單號碼</label>
<div class="layui-input-inline" style="width:140px">
<input id="barcodeNo" name="barcodeNo" autocomplete="off" class="layui-input">
<input id="wipNo" name="wipNo" autocomplete="off" class="layui-input">
</div>
</div>
</div>
<div class="layui-col-sm3">
<div class="layui-inline">
<label class="layui-form-label">工單號碼:</label>
<label class="layui-form-label">內部序號</label>
<div class="layui-input-inline" style="width:140px">
<input id="wipNo" name="wipNo" autocomplete="off" class="layui-input">
<input id="barcodeNo" name="barcodeNo" autocomplete="off" class="layui-input">
</div>
</div>
</div>
<div class="layui-col-sm3">
<div class="layui-inline">
<label class="layui-form-label">包裝箱號:</label>
<label class="layui-form-label">包裝箱號</label>
<div class="layui-input-inline" style="width:140px">
<input id="boxNo" name="boxNo" autocomplete="off" class="layui-input">
</div>
@ -88,7 +88,7 @@
<div class="layui-form-item">
<div class="layui-col-sm3">
<div class="layui-inline">
<label class="layui-form-label">入庫單號:</label>
<label class="layui-form-label">入庫單號</label>
<div class="layui-input-inline" style="width:140px">
<input id="inhouseNo" name="inhouseNo" autocomplete="off" class="layui-input">
</div>
@ -96,7 +96,7 @@
</div>
<div class="layui-col-sm4">
<div class="layui-inline">
<label class="layui-form-label">入庫日期:</label>
<label class="layui-form-label">入庫日期</label>
<div class="layui-input-inline" style="width:90px">
<input id="dateStr" name="dateStr" autocomplete="off" class="layui-input" readonly="">
</div>
@ -106,10 +106,21 @@
</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 class="layui-row">
<div class="layui-form-item">
<div class="layui-col-sm3">
<div class="layui-inline">
<label class="layui-form-label">檢驗狀態</label>
<div class="layui-input-inline" style="width:100px">
<div class="layui-input-inline" style="width:120px;">
<select id="status" name="status" lay-filter="status" lay-submit>
<option value="">全部</option>
<option value="A">未檢驗</option>
@ -121,11 +132,16 @@
<input id="statusNo" type="hidden" name="statusNo" />
</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 class="layui-col-sm3">
<div class="layui-inline">
<label class="layui-form-label">製程</label>
<div class="layui-input-inline" style="width:120px;">
<select id="unit" name="unit" lay-filter="unit" lay-submit asp-items="@ViewBag.FactoryUnitList">
<option value="">全部</option>
</select>
<input id="unitNo" type="hidden" name="unitNo" />
</div>
</div>
</div>
</div>
@ -171,6 +187,12 @@
var qs = $('button[lay-filter="querysubmit"]');
qs.click();
});
form.on('select(unit)', function (data) {
$("#unitNo").val(data.value);
var qs = $('button[lay-filter="querysubmit"]');
qs.click();
});
});
//监听表单提交事件
@ -213,6 +235,11 @@
title: '工程編號',
sort: true
},
{
field: 'unitName',
title: '製程單位',
sort: true
},
{
field: 'inhouseQty',
width: 60,
@ -242,6 +269,7 @@
{
title: '操作',
align: 'center',
fixed: 'right',
width: 200,
templet: function (d) {
var aa;
@ -250,8 +278,10 @@
}
else {
aa = '<a class="layui-btn layui-btn-warm layui-icon layui-icon-list layui-btn-xs" lay-event="edit">檢視</a>\
<a class="layui-btn layui-btn-xs" lay-event="PDF">PDF</a> <a class="layui-btn layui-btn-xs" lay-event="Excel">Excel</a>'
<a class="layui-btn layui-btn-xs" lay-event="PDF">PDF</a>\
<a class="layui-btn layui-btn-xs" lay-event="Excel">Excel</a>'
}
aa += '<a class="layui-btn layui-btn-xs layui-icon layui-btn-normal" lay-event="detail">抽驗明細</a>';
return aa;
}
}
@ -265,7 +295,7 @@
//alert(param);
//基本資料表格
//var table = hg.table.datatable('query', 'FQC查詢', '/FQC/FQC008Query2/' + param, {}, tableCols, '', true, 'full-100', ['filter', 'print', 'exports']);
var table = hg.table.datatable('query', 'FQC查詢', '/FQC/FQC008Query2', { factoryID: $("#factoryID").val() }, tableCols, toolbar, true, 'full-100', ['filter', 'print', 'exports']);
var table = hg.table.datatable('query', 'FQC查詢', '/FQC/FQC008Query2', { factoryID: $("#factoryID").val(), unit: $("#unit").val() }, tableCols, toolbar, true, 'full-100', ['filter', 'print', 'exports']);
//通过行tool編輯,lay-event="edit"
function edit(obj) {
@ -293,6 +323,22 @@
}
}
function detail(obj) {
layui.use('layer', function () {
var layer = layui.layer;
layer.open({
title: '抽驗明細',
type: 2,
area: ['1100px', '500px'],
fixed: false, //不固定
maxmin: false,
scrollbar: true,
moveOut: true,
content: '/FQC/FQC008A?wipNo=' + obj.data.wipNo
});
});
}
</script>
<script type="text/html" id="statusName">

74
AMESCoreStudio.Web/Views/FQC/FQC008A.cshtml

@ -0,0 +1,74 @@
@{
Layout = "~/Views/Shared/_AMESLayout.cshtml";
}
<div class="layui-card-body">
<button style="display:none" class="layui-btn layui-btn-sm layui-btn-normal" lay-submit lay-filter="querysubmit">
<i class="layui-icon layui-icon-sm">&#xe615;</i>
</button>
<input id="wipNo" name="wipNo" value="@ViewBag.wipNo" type="hidden" />
<table class="layui-hide" id="test" lay-filter="test"></table>
</div>
@section Scripts{
<script type="text/javascript">
//监听表单提交事件
hg.form.onsubmit('querysubmit', function (data) {
table && table.reload(data);
});
var tableCols = [[
{
field: 'wipNo',
title: '工單號碼',
width: 120,
},
{
field: 'unitName',
title: '生產製程',
width: 90,
},
{
field: 'inhouseNo',
title: '入庫單號',
width: 150,
sort: true
},
{
field: 'seqID',
title: '順序',
width: 60,
},
{
field: 'barcodeNo',
width: 100,
title: '內部條碼',
sort: true
},
{
field: 'boxNo',
title: '箱號',
width: 150,
sort: true
},
{
field: 'extraBarcodeNo',
width: 100,
title: '外部條碼'
},
{
field: 'statusNo',
title: '抽驗狀態',
width: 90,
},
{
field: 'createDate',
title: '抽驗時間',
sort: true,
templet: '<div>{{ layui.util.toDateString(d.createDate, "yyyy/MM/dd HH:mm:ss") }}</div>'
}
]
];
var table = hg.table.datatable('test', '抽驗明細', '/FQC/GetFQC008A?wipNo=@ViewBag.wipNo', {}, tableCols, {}, false, 'full-100', ['filter', 'print', 'exports']);
</script>
}

34
AMESCoreStudio.Web/Views/FQC/FQC009.cshtml

@ -1,6 +1,7 @@

@{ ViewData["Title"] = "工程編號檢驗工項維護";
Layout = "~/Views/Shared/_AMESLayout.cshtml"; }
@{
ViewData["Title"] = "工程編號檢驗工項維護";
Layout = "~/Views/Shared/_AMESLayout.cshtml";
}
<style>
.control-label {
@ -43,8 +44,10 @@
@section Scripts {
@{ await Html.RenderPartialAsync("_ValidationScriptsPartial");
await Html.RenderPartialAsync("_FileinputScriptsPartial"); }
@{
await Html.RenderPartialAsync("_ValidationScriptsPartial");
await Html.RenderPartialAsync("_FileinputScriptsPartial");
}
<script type="text/javascript">
//搜索
@ -76,7 +79,7 @@
defaultToolbar: ['filter', 'print', 'exports'],
cols: tableCols,
response: { msgName: 'msg' },
where: {itemNo:itemNo},
where: { itemNo: itemNo },
done: function (res, curr, count) {
//
if (res.msg != '') {
@ -120,7 +123,7 @@
hg.confirm("確定要綁定有勾選的檢驗工項嗎?", function () {
$.ajax({
url: '/FQC/FQC009',
data: { 'itemID': itemID, 'groupID': groupID ,'itemNo': $('#itemNo').val().toUpperCase() },
data: { 'itemID': itemID, 'groupID': groupID, 'itemNo': $('#itemNo').val().toUpperCase() },
type: 'POST',
success: function (data) {
if (data.success) {
@ -143,6 +146,13 @@
hg.msg('請勾選要綁定的檢驗工項,再執行!');
}
}
if (obj.event === 'LAYTABLE_EXPORT') {
var checkStatus = table.checkStatus(obj.config.id);
// 获取被勾选的数据行
var selectedRows = checkStatus.data;
// 导出 Excel
table.exportFile(obj.config.id, selectedRows, 'xls');
}
});
/**
@ -213,7 +223,7 @@
// table && table.reload(data);
//});
var tableCols = [[
{ type: 'checkbox', title:'全選' },
{ type: 'checkbox', title: '全選' },
{
field: 'groupNameCN',
title: '類別中文',
@ -236,7 +246,7 @@
field: 'itemTypeName',
title: '類型',
},
]
]
];
var Toolbar = [{
@ -250,7 +260,7 @@
hg.confirm("確定要綁定有勾選的檢驗工項嗎?", function () {
$.ajax({
url: '/FQC/FQC009C',
data: { 'ids': obj.checkstatus.data.map(function (x) { return x.itemID }).join(','), 'itemNo':'aaa' },
data: { 'ids': obj.checkstatus.data.map(function (x) { return x.itemID }).join(','), 'itemNo': 'aaa' },
type: 'POST',
success: function (data) {
if (data.success) {
@ -275,8 +285,8 @@
}
}
];
//基本資料表格
//var tableQuery = hg.table.datatable('tableQuery', '檢驗工項', '/FQC/FQC009ItemQuery', {}, tableCols, Toolbar, false, 'full-100', ['filter', 'print', 'exports']);
//基本資料表格
//var tableQuery = hg.table.datatable('tableQuery', '檢驗工項', '/FQC/FQC009ItemQuery', {}, tableCols, Toolbar, false, 'full-100', ['filter', 'print', 'exports']);
</script>

119
AMESCoreStudio.Web/Views/PCB/PCB014.cshtml

@ -7,27 +7,27 @@
/*.layui-table-main .layui-table-cell {*/
/*height: auto !important;*/
/*white-space: normal;
}
.layui-table img {
max-width: 60px;
max-height: 28px;
}
.layui-tree-main {
cursor: pointer;
padding-right: 10px;
float: left;
border-width: 1px;
border-style: solid;
border-color: #e6e6e6;
margin: 10px 0;
}
.layui-table-cell {
height: auto;
white-space: normal;
}*/
}
.layui-table img {
max-width: 60px;
max-height: 28px;
}
.layui-tree-main {
cursor: pointer;
padding-right: 10px;
float: left;
border-width: 1px;
border-style: solid;
border-color: #e6e6e6;
margin: 10px 0;
}
.layui-table-cell {
height: auto;
white-space: normal;
}*/
</style>
@ -45,20 +45,34 @@
<div class="layui-form-item">
<div class="layui-col-sm3">
<div class="layui-inline">
<label class="layui-form-label" style="width:60px">錫膏編號:</label>
<label class="layui-form-label" style="width:60px">錫膏編號</label>
<div class="layui-input-inline" style="width:150px">
<input id="solderPasteNo" name="solderPasteNo" autocomplete="off" oninput="let p=this.selectionStart;this.value=this.value.toUpperCase();this.setSelectionRange(p, p);" class="layui-input">
</div>
</div>
</div>
<div class="layui-col-sm3">
<div class="layui-inline">
<label class="layui-form-label" style="width:40px">規格</label>
<div class="layui-input-inline" style="width:150px">
<input id="description" name="description" autocomplete="off" oninput="let p=this.selectionStart;this.value=this.value.toUpperCase();this.setSelectionRange(p, p);" class="layui-input">
</div>
</div>
</div>
<div class="layui-col-sm3">
<div class="layui-inline">
<label class="layui-form-label" style="width:40px">廠商</label>
<div class="layui-input-inline" style="width:150px">
<input id="vendor" name="vendor" autocomplete="off" oninput="let p=this.selectionStart;this.value=this.value.toUpperCase();this.setSelectionRange(p, p);" class="layui-input">
</div>
</div>
</div>
<div class="layui-col-sm2">
<div class="layui-inline">
<label class="layui-form-label" style="width:50px">狀態:</label>
<div class="layui-input-inline" style="width:80px">
<select id="status" lay-filter="status" name="status" class="">
<label class="layui-form-label" style="width:30px">狀態</label>
<div class="layui-input-inline" style="width:100px">
<select id="status" lay-filter="status" name="status" class="" asp-items="@ViewBag.GetSolderPasteStatusSelect">
<option value="">全部</option>
<option value="0">失效</option>
<option value="1">有效</option>
</select>
</div>
</div>
@ -123,7 +137,19 @@
},
{
field: 'description',
title: '規格描述',
title: '規格',
},
{
field: 'alloy',
title: '合金',
},
{
field: 'vendor',
title: '廠商',
},
{
field: 'lot',
title: 'LOT',
},
{
field: 'receiptDate',
@ -151,32 +177,59 @@
{
title: '操作',
align: 'center',
width: 80,
width: 130,
templet: function (d) {
return '<a class="layui-btn layui-btn-warm layui-btn-xs layui-icon layui-icon-edit" lay-event="edit">修改</a>'
var event = `<a class="layui-btn layui-btn-xs layui-icon layui-icon-edit" lay-event="edit">修改</a>`;
if (d.statusName == '未使用') {
event += `<a class="layui-btn layui-btn-danger layui-btn-xs layui-icon layui-icon-delete" lay-event="del">刪除</a>`;
}
return event;
}
}
]];
//通过行tool編輯,lay-event="edit"
function edit(obj) {
if (obj.data.solderPasteID) {
hg.open('修改錫膏基本資料', '/PCB/PCB014U?id=' + obj.data.solderPasteID, 700, 500);
hg.open('修改錫膏基本資料', '/PCB/PCB014U?id=' + obj.data.solderPasteID, 800, 500);
}
}
function del(obj) {
hg.confirm("確定要刪除錫膏編號【" + obj.data.solderPasteNo + "】嗎?", function () {
$.ajax({
url: '/PCB/PCB014D',
data: { id: obj.data.solderPasteID },
type: 'POST',
success: function (data) {
if (data.success) {
hg.msghide("刪除成功!");
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/PCB014C', 700, 500);
hg.open('新增錫膏基本資料', '/PCB/PCB014C', 800, 500);
}
}];
//基本資料表格
var table = hg.table.datatable('query', '錫膏基本查詢', '/PCB/PCB014Query', {}, tableCols, toolbar, true, 'full-100', ['filter', 'print', 'exports']);
// var table = hg.table.datatable('test', '條碼狀態維護', '/PCS/GetWipInfo', {}, tableCols, toolbar, true, 'full-100', ['filter', 'print', 'exports']);
// var table = hg.table.datatable('test', '條碼狀態維護', '/PCS/GetWipInfo', {}, tableCols, toolbar, true, 'full-100', ['filter', 'print', 'exports']);
</script>
}

88
AMESCoreStudio.Web/Views/PCB/PCB014C.cshtml

@ -19,45 +19,70 @@
<div class="layui-form-item">
<label class="layui-form-label">錫膏編號</label>
<div class="layui-input-inline">
<input asp-for="SolderPasteNo" class="layui-input" autocomplete="off" placeholder="請輸入錫膏編號" />
<span asp-validation-for="SolderPasteNo" class="layui-bg-red"></span>
<input asp-for="SolderPasteNo" class="layui-input" oninput="let p=this.selectionStart;this.value=this.value.toUpperCase();this.setSelectionRange(p, p);" autocomplete="off" placeholder="請輸入錫膏編號" />
</div>
<label class="layui-form-label">QR Code刷入</label>
<div class="layui-input-inline">
<input id="qrCodeInput" class="layui-input" onkeydown="qrCodeinput(event);" oninput="let p=this.selectionStart;this.value=this.value.toUpperCase();this.setSelectionRange(p, p);" autocomplete="off"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">規格描述</label>
<div class="layui-input-inline">
<input asp-for="Description" class="layui-input" autocomplete="off" placeholder="請輸入規格描述" />
<span asp-validation-for="Description" class="layui-bg-red"></span>
<div class="layui-inline">
<label class="layui-form-label">規格</label>
<div class="layui-input-inline">
<input asp-for="Description" class="layui-input" autocomplete="off" placeholder="請輸入規格" />
<span asp-validation-for="Description" class="layui-bg-red"></span>
</div>
<label class="layui-form-label">廠商</label>
<div class="layui-input-inline">
<input asp-for="Vendor" class="layui-input" autocomplete="off" placeholder="請輸入廠商" />
<span asp-validation-for="Vendor" class="layui-bg-red"></span>
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">收貨日期</label>
<div class="layui-input-inline">
<input asp-for="ReceiptDate" class="layui-input" readonly="" />
<div class="layui-inline">
<label class="layui-form-label">合金</label>
<div class="layui-input-inline">
<input asp-for="Alloy" class="layui-input" value="Sn96.5/Ag3.0/Cu05" autocomplete="off" placeholder="請輸入合金" />
<span asp-validation-for="Alloy" class="layui-bg-red"></span>
</div>
<label class="layui-form-label">LOT</label>
<div class="layui-input-inline">
<input asp-for="Lot" class="layui-input" autocomplete="off" placeholder="請輸入LOT" />
<span asp-validation-for="Lot" class="layui-bg-red"></span>
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">有效日期</label>
<div class="layui-input-inline">
<input asp-for="EffectiveDate" class="layui-input" readonly="" />
</div>
<label class="layui-form-label">編號產生</label>
<input type="radio" name="numbergeneration" value="A" title="系統自動生成" checked>
<input type="radio" name="numbergeneration" value="M" title="人工維護">
</div>
<div class="layui-form-item">
<label class="layui-form-label">製造日期</label>
<label class="layui-form-label">收貨日期</label>
<div class="layui-input-inline">
<input asp-for="ManufactoringDate" class="layui-input" readonly="" />
<input asp-for="ReceiptDate" class="layui-input" readonly="" />
<span asp-validation-for="ReceiptDate" class="layui-bg-red"></span>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">狀態</label>
<div class="layui-input-inline">
<input type="radio" asp-for="Status" value="1" title="有效" checked>
<input type="radio" asp-for="Status" value="0" title="失效">
<div class="layui-inline">
<label class="layui-form-label">製造日期</label>
<div class="layui-input-inline">
<input asp-for="ManufactoringDate" class="layui-input" readonly="" />
<span asp-validation-for="ManufactoringDate" class="layui-bg-red"></span>
</div>
<label class="layui-form-label">有效日期</label>
<div class="layui-input-inline">
<input asp-for="EffectiveDate" class="layui-input" readonly="" />
<span asp-validation-for="EffectiveDate" class="layui-bg-red"></span>
</div>
</div>
</div>
@ -116,6 +141,31 @@
}
});
function qrCodeinput(e) {
if (e.keyCode == 13) {
var qrCodeValue = $("#qrCodeInput").val();
var parts = qrCodeValue.split('/');
if (parts.length != 5) {
parent.hg.msg(`${qrCodeValue} <br/>QR Code格式錯誤,請確認!`);
return;
}
// 廠商
$("#Vendor").val(parts[0]);
// 規格
$("#Description").val(parts[1]);
// Lot
$("#Lot").val(parts[2]);
// 製造日期
$("#ManufactoringDate").val(parts[3].replace(/\./g, "/"));
// 有效日期
$("#EffectiveDate").val(parts[4].replace(/\./g, "/"));
$("#qrCodeInput").val('');
event.preventDefault();
return false;
}
};
</script>

148
AMESCoreStudio.Web/Views/PCB/PCB014U.cshtml

@ -1,7 +1,9 @@
@model AMESCoreStudio.WebApi.Models.AMES.SolderPasteInfo
@{ Layout = "~/Views/Shared/_AMESLayout.cshtml"; }
@{
Layout = "~/Views/Shared/_AMESLayout.cshtml";
}
<style>
.control-label {
@ -10,93 +12,103 @@
</style>
<div class="layui-card">
<div class="row">
<div class="col-sm-12">
<form enctype="multipart/form-data" method="post" asp-action="PCB014" class="layui-form">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<input type="hidden" asp-for="SolderPasteID" value="@Model.SolderPasteID" />
<div class="layui-form-item">
<label class="layui-form-label">錫膏編號</label>
<div class="layui-input-inline">
<input asp-for="SolderPasteNo" class="layui-input" autocomplete="off" placeholder="請輸入錫膏編號" readonly="" />
<span asp-validation-for="SolderPasteNo" class="layui-bg-red"></span>
</div>
<div class="col-sm-12">
<form enctype="multipart/form-data" method="post" asp-action="PCB014" class="layui-form">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<input type="hidden" asp-for="SolderPasteID" value="@Model.SolderPasteID" />
<input type="hidden" asp-for="SolderPasteNo" value="@Model.SolderPasteNo" />
<input type="hidden" asp-for="Description" value="@Model.Description" />
<div class="layui-form-item">
<label class="layui-form-label">錫膏編號</label>
<div class="layui-input-inline">
<input asp-for="SolderPasteNo" class="layui-input" autocomplete="off" readonly="" />
</div>
<label class="layui-form-label">QR Code刷入</label>
<div class="layui-input-inline">
<input id="qrCodeInput" class="layui-input" onkeydown="qrCodeinput(event);" oninput="let p=this.selectionStart;this.value=this.value.toUpperCase();this.setSelectionRange(p, p);" autocomplete="off" />
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">規格描述</label>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">規格</label>
<div class="layui-input-inline">
<input asp-for="Description" class="layui-input" autocomplete="off" placeholder="請輸入規格描述" />
<span asp-validation-for="Description" class="layui-bg-red"></span>
<input asp-for="Description" class="layui-input" autocomplete="off" placeholder="請輸入規格" readonly="" />
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">收貨日期</label>
<label class="layui-form-label">廠商</label>
<div class="layui-input-inline">
<input asp-for="ReceiptDate" class="layui-input" />
<span asp-validation-for="ReceiptDate" class="layui-bg-red"></span>
<input asp-for="Vendor" class="layui-input" autocomplete="off" placeholder="請輸入廠商" />
<span asp-validation-for="Vendor" class="layui-bg-red"></span>
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">有效日期</label>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">合金</label>
<div class="layui-input-inline">
<input asp-for="EffectiveDate" class="layui-input" />
<span asp-validation-for="EffectiveDate" class="layui-bg-red"></span>
<input asp-for="Alloy" class="layui-input" value="Sn96.5/Ag3.0/Cu05" autocomplete="off" placeholder="請輸入合金" />
<span asp-validation-for="Alloy" class="layui-bg-red"></span>
</div>
<label class="layui-form-label">LOT</label>
<div class="layui-input-inline">
<input asp-for="Lot" class="layui-input" autocomplete="off" placeholder="請輸入LOT" />
<span asp-validation-for="Lot" class="layui-bg-red"></span>
</div>
</div>
</div>
<div class="layui-form-item">
<div class="layui-form-item">
<label class="layui-form-label">收貨日期</label>
<div class="layui-input-inline">
<input asp-for="ReceiptDate" class="layui-input" readonly="" />
<span asp-validation-for="ReceiptDate" class="layui-bg-red"></span>
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">製造日期</label>
<div class="layui-input-inline">
<input asp-for="ManufactoringDate" class="layui-input" />
<input asp-for="ManufactoringDate" class="layui-input" readonly="" />
<span asp-validation-for="ManufactoringDate" class="layui-bg-red"></span>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">狀態</label>
<label class="layui-form-label">有效日期</label>
<div class="layui-input-inline">
<input type="radio" asp-for="Status" value="1" title="有效" checked>
<input type="radio" asp-for="Status" value="0" title="失效">
<input asp-for="EffectiveDate" class="layui-input" readonly="" />
<span asp-validation-for="EffectiveDate" class="layui-bg-red"></span>
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">備註</label>
<div class="layui-input-block">
<input asp-for="Remark" class="layui-input" />
</div>
<div class="layui-form-item">
<label class="layui-form-label">備註</label>
<div class="layui-input-block">
<input asp-for="Remark" class="layui-input" />
</div>
</div>
<span style="color: firebrick;word-break: break-all;" class="text-danger offset-sm-3">@Html.ValidationMessage("error")</span>
<div class="layui-row" style="text-align:center">
<div class="layui-col-md12">
<input type="submit" value="儲存" class="layui-btn" />
</div>
<span style="color: firebrick;word-break: break-all;" class="text-danger offset-sm-3">@Html.ValidationMessage("error")</span>
<div class="layui-row" style="text-align:center">
<div class="layui-col-md12">
<input type="submit" value="儲存" class="layui-btn" />
</div>
</form>
</div>
</div>
</form>
</div>
</div>
@section Scripts {
@{ await Html.RenderPartialAsync("_ValidationScriptsPartial");
await Html.RenderPartialAsync("_FileinputScriptsPartial"); }
@{
await Html.RenderPartialAsync("_ValidationScriptsPartial");
await Html.RenderPartialAsync("_FileinputScriptsPartial");
}
<script type="text/javascript">
layui.use(['form', 'laydate'], function () {
var form = layui.form,
laydate = layui.laydate
laydate.render({
elem: '#ReceiptDate'
, trigger: 'click'
, format: 'yyyy/MM/dd'
, theme: 'grid'
});
laydate.render({
elem: '#EffectiveDate'
, trigger: 'click'
@ -118,6 +130,30 @@
}
});
function qrCodeinput(e) {
if (e.keyCode == 13) {
var qrCodeValue = $("#qrCodeInput").val();
var parts = qrCodeValue.split('/');
if (parts.length != 5) {
parent.hg.msg(`${qrCodeValue} <br/>QR Code格式錯誤,請確認!`);
return;
}
// 廠商
$("#Vendor").val(parts[0]);
// 規格
$("#Description").val(parts[1]);
// Lot
$("#Lot").val(parts[2]);
// 製造日期
$("#ManufactoringDate").val(parts[3].replace(/\./g, "/"));
// 有效日期
$("#EffectiveDate").val(parts[4].replace(/\./g, "/"));
$("#qrCodeInput").val('');
event.preventDefault();
return false;
}
};
</script>

10
AMESCoreStudio.Web/Views/PCB/PCB016.cshtml

@ -16,7 +16,7 @@
<div class="layui-form-item">
<div class="layui-col-sm4">
<div class="layui-inline">
<label class="layui-form-label">鋼板編號:</label>
<label class="layui-form-label">鋼板編號</label>
<div class="layui-input-inline" style="width:150px">
<input id="steelPlateNo" name="steelPlateNo" autocomplete="off" oninput="let p=this.selectionStart;this.value=this.value.toUpperCase();this.setSelectionRange(p, p);" class="layui-input">
</div>
@ -24,7 +24,7 @@
</div>
<div class="layui-col-sm3">
<div class="layui-inline">
<label class="layui-form-label">工程編號:</label>
<label class="layui-form-label" style="width: 70px;">工程編號</label>
<div class="layui-input-inline" style="width:150px">
<input id="item" name="item" autocomplete="off" oninput="let p=this.selectionStart;this.value=this.value.toUpperCase();this.setSelectionRange(p, p);" class="layui-input">
</div>
@ -32,7 +32,7 @@
</div>
<div class="layui-col-sm3">
<div class="layui-inline">
<label class="layui-form-label" style="width:60px">儲存位置:</label>
<label class="layui-form-label" style="width:60px">儲存位置</label>
<div class="layui-input-inline" style="width:150px">
<input id="storageLocation" name="storageLocation" autocomplete="off" oninput="let p=this.selectionStart;this.value=this.value.toUpperCase();this.setSelectionRange(p, p);" class="layui-input">
</div>
@ -52,7 +52,7 @@
<div class="layui-form-item">
<div class="layui-col-sm4">
<div class="layui-inline">
<label class="layui-form-label">到廠日期:</label>
<label class="layui-form-label">到廠日期</label>
<div class="layui-input-inline" style="width:80px">
<input id="date_str" name="date_str" autocomplete="off" class="layui-input" readonly="">
</div>
@ -64,7 +64,7 @@
</div>
<div class="layui-col-sm3">
<div class="layui-inline">
<label class="layui-form-label">工單號碼:</label>
<label class="layui-form-label" style="width: 70px;">工單號碼</label>
<div class="layui-input-inline" style="width:150px">
<input id="wipNo" name="wipNo" autocomplete="off" oninput="let p=this.selectionStart;this.value=this.value.toUpperCase();this.setSelectionRange(p, p);" class="layui-input">
</div>

223
AMESCoreStudio.Web/Views/PCB/PCB017.cshtml

@ -0,0 +1,223 @@
@{
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>錫膏管制作業</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-sm3">
<div class="layui-inline">
<label class="layui-form-label">錫膏編號</label>
<div class="layui-input-inline" style="width:150px">
<input id="solderPasteNo" name="solderPasteNo" autocomplete="off" oninput="let p=this.selectionStart;this.value=this.value.toUpperCase();this.setSelectionRange(p, p);" class="layui-input">
</div>
</div>
</div>
<div class="layui-col-sm4">
<div class="layui-inline">
<label class="layui-form-label">收貨日期</label>
<div class="layui-input-inline" style="width:80px">
<input id="strDate" name="strDate" autocomplete="off" class="layui-input" readonly="">
</div>
<div class="layui-form-mid">~</div>
<div class="layui-input-inline" style="width:80px">
<input id="endDate" name="endDate" autocomplete="off" class="layui-input" readonly="">
</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:120px;">
<select id="status" name="status" lay-filter="status" lay-submit>
<option value="">全部</option>
<option value="N">未使用</option>
<option value="I">入冰箱</option>
<option value="O">出冰箱</option>
<option value="U">開封</option>
<option value="C">使用完</option>
<option value="X">報廢</option>
</select>
</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', 'laydate'], function () {
form = layui.form;
laydate = layui.laydate;
laydate.render({
elem: '#strDate'
, trigger: 'click'
, format: 'yyyy/MM/dd'
, theme: 'grid'
});
laydate.render({
elem: '#endDate'
, trigger: 'click'
, format: 'yyyy/MM/dd'
, theme: 'grid'
});
});
//监听表单提交事件
hg.form.onsubmit('querysubmit', function (data) {
hg.msghide("重新載入資料..");
table && table.reload(data);
});
var tableCols = [[
{
field: 'solderPasteNo',
title: '錫膏編號',
sort: true,
width: 100,
fixed: 'left',
},
{
field: 'statusName',
title: '狀態',
},
{
field: 'vendor',
title: '廠商',
width: 150,
},
{
field: 'description',
title: '規格',
width: 150,
},
{
field: 'alloy',
title: '合金',
width: 150,
},
{
field: 'lot',
title: 'LOT',
},
{
field: 'manufactoringDate',
title: '製造日期',
width: 95,
sort: true,
templet: '<div>{{ layui.util.toDateString(d.manufactoringDate, "yyyy/MM/dd") }}</div>'
},
{
field: 'effectiveDate',
title: '有效日期',
width: 95,
sort: true,
templet: '<div>{{ layui.util.toDateString(d.effectiveDate, "yyyy/MM/dd") }}</div>'
},
{
field: 'receiptDate',
title: '收貨日期',
width: 95,
sort: true,
templet: '<div>{{ layui.util.toDateString(d.receiptDate, "yyyy/MM/dd") }}</div>'
},
{
field: 'inTime',
title: '入冰箱時間',
width: 145,
sort: true,
templet: '<div>{{ layui.util.toDateString(d.inTime, "yyyy/MM/dd HH:mm:ss") }}</div>'
},
{
field: 'inUserName',
title: '人員',
width: 100,
},
{
field: 'outTime',
title: '出冰箱時間',
width: 145,
sort: true,
templet: '<div>{{ layui.util.toDateString(d.outTime, "yyyy/MM/dd HH:mm:ss") }}</div>'
},
{
field: 'outUserName',
title: '人員',
width: 100,
},
{
field: 'useTime',
title: '開封時間',
width: 145,
sort: true,
templet: '<div>{{ layui.util.toDateString(d.useTime, "yyyy/MM/dd HH:mm:ss") }}</div>'
},
{
field: 'useUserName',
title: '人員',
width: 100,
},
{
field: 'completedTime',
title: '用完時間',
width: 145,
sort: true,
templet: '<div>{{ layui.util.toDateString(d.completedTime, "yyyy/MM/dd HH:mm:ss") }}</div>'
},
{
field: 'completedUserName',
title: '人員',
width: 100,
},
{
field: 'scrapTime',
title: '報廢時間',
width: 145,
sort: true,
templet: '<div>{{ layui.util.toDateString(d.scrapTime, "yyyy/MM/dd HH:mm:ss") }}</div>'
},
{
field: 'scrapUserName',
title: '人員',
width: 100,
}]
];
//新增按鈕
var toolbar = [{
text: '新增管制作業',
layuiicon: '&#xe608;',
class: 'layui-btn',
handler: function () {
hg.open('新增錫膏管制作業', '/PCB/PCB017C', 400, 400);
}
}];
//基本資料表格
var table = hg.table.datatable('query', '錫膏紀錄', '/PCB/PCB017Query', {}, tableCols, toolbar, true, 'full-100', ['filter', 'print', 'exports']);
</script>
}

82
AMESCoreStudio.Web/Views/PCB/PCB017C.cshtml

@ -0,0 +1,82 @@
@model AMESCoreStudio.Web.ViewModels.PCB.PCB017ViewModel
@{
Layout = "~/Views/Shared/_AMESLayout.cshtml";
}
<style>
.control-label {
justify-content: flex-end !important;
}
</style>
<div class="layui-card">
<div class="col-sm-12">
<form enctype="multipart/form-data" method="post" asp-action="PCB017" class="layui-form">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="layui-form-item">
<label class="layui-form-label">管制點</label>
<div class="layui-input-inline">
<select lay-filter="status" lay-submit asp-for="@Model.status">
<option value="I">入冰箱</option>
<option value="O">出冰箱</option>
<option value="C">使用完</option>
<option value="X">報廢</option>
</select>
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label style="color:red;width:260px;" class="layui-form-label">*管制點選擇入冰箱時,請輸入第一罐錫膏編號</label>
</div>
<div class="layui-inline">
<label class="layui-form-label">錫膏編號</label>
<div class="layui-input-inline">
<input asp-for="@Model.solderPasteNo" min="2" class="layui-input" autocomplete="off" oninput="let p=this.selectionStart;this.value=this.value.toUpperCase();this.setSelectionRange(p, p);" placeholder="請輸入錫膏編號" />
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">入冰箱數量</label>
<div class="layui-input-inline">
<input asp-for="@Model.qty" class="layui-input" type="number" autocomplete="off" />
</div>
</div>
<span style="color: firebrick;word-break: break-all;" class="text-danger offset-sm-3">@Html.ValidationMessage("error")</span>
<div class="layui-row" style="text-align:center">
<div class="layui-col-md12">
<input type="submit" value="儲存" class="layui-btn" />
</div>
</div>
</form>
</div>
</div>
@section Scripts {
@{
await Html.RenderPartialAsync("_ValidationScriptsPartial");
await Html.RenderPartialAsync("_FileinputScriptsPartial");
}
<script type="text/javascript">
layui.use(['form', 'laydate'], function () {
var form = layui.form,
laydate = layui.laydate
});
$(document).ready(function () {
var error = '@Html.ValidationMessage("error")';
if ($(error).text() != '') {
parent.hg.msg(error);
}
});
</script>
}

161
AMESCoreStudio.Web/Views/PCB/PCB018.cshtml

@ -0,0 +1,161 @@
@{
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>錫膏報表</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-sm3">
<div class="layui-inline">
<label class="layui-form-label">錫膏編號</label>
<div class="layui-input-inline" style="width:150px">
<input id="solderPasteNo" name="solderPasteNo" autocomplete="off" oninput="let p=this.selectionStart;this.value=this.value.toUpperCase();this.setSelectionRange(p, p);" class="layui-input">
</div>
</div>
</div>
<div class="layui-col-sm3">
<div class="layui-inline">
<label class="layui-form-label">工單號碼</label>
<div class="layui-input-inline" style="width:150px">
<input id="wipNo" name="wipNo" autocomplete="off" oninput="let p=this.selectionStart;this.value=this.value.toUpperCase();this.setSelectionRange(p, p);" 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', 'laydate'], function () {
form = layui.form;
});
//监听表单提交事件
hg.form.onsubmit('querysubmit', function (data) {
hg.msghide("重新載入資料..");
table && table.reload(data);
});
var tableCols = [[
{
field: 'solderPasteNo',
title: '錫膏編號',
sort: true,
width: 100,
fixed: 'left',
},
{
field: 'wipNo',
title: '工單號碼',
width: 200,
},
{
field: 'description',
title: '錫膏規格',
width: 150,
},
{
field: 'createUserName',
title: '建立人員',
width: 100,
},
{
field: 'createTime',
title: '建立時間',
width: 145,
sort: true,
templet: '<div>{{ layui.util.toDateString(d.createTime, "yyyy/MM/dd HH:mm:ss") }}</div>'
},
{
field: 'inUserName',
title: '入冰箱人員',
width: 100,
},
{
field: 'inTime',
title: '入冰箱時間',
width: 145,
sort: true,
templet: '<div>{{ layui.util.toDateString(d.inTime, "yyyy/MM/dd HH:mm:ss") }}</div>'
},
{
field: 'outUserName',
title: '出冰箱人員',
width: 100,
},
{
field: 'outTime',
title: '出冰箱時間',
width: 145,
sort: true,
templet: '<div>{{ layui.util.toDateString(d.outTime, "yyyy/MM/dd HH:mm:ss") }}</div>'
},
{
field: 'useUserName',
title: '使用人員',
width: 100,
},
{
field: 'useTime',
title: '使用時間',
width: 145,
sort: true,
templet: '<div>{{ layui.util.toDateString(d.useTime, "yyyy/MM/dd HH:mm:ss") }}</div>'
},
{
field: 'statusName',
title: '狀態',
},
{
field: 'scrapUserName',
title: '報廢人員',
width: 100,
},
{
field: 'scrapTime',
title: '報廢時間',
width: 145,
sort: true,
templet: '<div>{{ layui.util.toDateString(d.scrapTime, "yyyy/MM/dd HH:mm:ss") }}</div>'
},
{
field: 'mixingTime',
title: '錫膏攪拌時間',
width: 145,
sort: true,
templet: '<div>{{ layui.util.toDateString(d.mixingTime, "yyyy/MM/dd HH:mm:ss") }}</div>'
},
{
field: 'remark',
title: '備註',
}
]
];
//基本資料表格
var table = hg.table.datatable('query', '錫膏報表', '/PCB/PCB018Query', {}, tableCols, {}, false, 'full-100', ['filter', 'print', 'exports']);
</script>
}

4
AMESCoreStudio.Web/Views/RPT/RPT002.cshtml

@ -229,7 +229,7 @@
</div>
</div>
<div class="layui-col-md4 Link-right" style="height:35vh;">
<div class="layui-col-md12 ColTitle">FPY Rate(昶亨)</div>
<div class="layui-col-md12 ColTitle">FPY Rate(立德)</div>
<div class="layui-row">
<div class="layui-col-md4 ColDetailTitle vertical">Board</div>
<div class="layui-col-md8">
@ -253,7 +253,7 @@
</div>
</div>
<div class="layui-col-md4" style="height:35vh;">
<div class="layui-col-md12 ColTitle">FPY Rate(外包)</div>
<div class="layui-col-md12 ColTitle">FPY Rate(30秒切換外包)</div>
<div class="layui-row">
<div class="layui-col-md4 ColDetailTitle vertical">Board</div>
<div class="layui-col-md8">

212
AMESCoreStudio.WebApi/Controllers/AMES/FqcInhouseMasterController.cs

@ -10,6 +10,9 @@ using AMESCoreStudio.WebApi.Models.AMES;
using AMESCoreStudio.WebApi.DTO.AMES;
using AMESCoreStudio.CommonTools.Result;
using AMESCoreStudio.WebApi.Enum;
using Dapper;
using System.Data;
using AMESCoreStudio.WebApi.Extensions;
namespace AMESCoreStudio.WebApi.Controllers.AMES
{
@ -106,11 +109,13 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES
/// <param name="page">頁數</param>
/// <param name="limit">筆數</param>
/// <param name="factoryID">委外廠商ID</param>
/// <param name="factoryNo">委外廠商ID</param>
/// <param name="factoryNo">委外廠商No</param>
/// <param name="unit">生產單位</param>
/// <returns></returns>
[HttpGet("FqcInhouseMasterQuery")]
public async Task<ResultModel<FqcInhouseMasterDto>> GetFqcInhouseMasterQuery(string barcodeNo, string wipNo, string boxNo
, string inhouseNo, string date_str, string date_end, string status, string factoryID, string factoryNo, int page = 0, int limit = 10)
[Obsolete]
[HttpGet("FqcInhouseMasterQueryOld")]
public async Task<ResultModel<FqcInhouseMasterDto>> GetFqcInhouseMasterQueryOld(string barcodeNo, string wipNo, string boxNo
, string inhouseNo, string date_str, string date_end, string status, string factoryID, string factoryNo, int page = 0, int limit = 10, string unit = null)
{
var q = from q1 in _context.FqcInhouseMasters
join q2 in _context.FqcInhouseDetails on new { q1.InhouseNo, q1.SeqID } equals new { q2.InhouseNo, q2.SeqID } into j0
@ -137,7 +142,7 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES
CreateDate = q1.CreateDate,
EndTime = q3.EndTime,
SpecialNo = q3.SpecialPo,
QaMemo = q3.QaMeno
QaMemo = q3.QaMeno,
};
//q1.Status == "P" ? "允收" : q1.Status == "R" ? "批退" : "未驗收完成",
//IQueryable <FqcInhouseDetail> q1 = _context.FqcInhouseDetails;
@ -232,6 +237,203 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES
return result;
}
/// <summary>
/// FQC查詢 by Table
/// </summary>
/// <param name="barcodeNo">內部序號</param>
/// <param name="wipNo">工單號碼</param>
/// <param name="boxNo">外箱號碼</param>
/// <param name="inhouseNo">入庫單號碼</param>
/// <param name="date_str">入庫時間起</param>
/// <param name="date_end">入庫時間迄</param>
/// <param name="status">抽驗結果</param>
/// <param name="page">頁數</param>
/// <param name="limit">筆數</param>
/// <param name="factoryID">委外廠商ID</param>
/// <param name="factoryNo">委外廠商No</param>
/// <param name="unit">生產單位</param>
/// <returns></returns>
[HttpGet("FqcInhouseMasterQuery")]
public ResultModel<FqcInhouseMasterDto> GetFqcInhouseMasterQuery(string barcodeNo, string wipNo, string boxNo
, string inhouseNo, string date_str, string date_end, string status, string factoryID, string factoryNo, int page = 0, int limit = 10, string unit = null)
{
ResultModel<FqcInhouseMasterDto> result = new ResultModel<FqcInhouseMasterDto>();
var sql = @"SELECT DISTINCT FM.INHOUSE_NO AS InhouseNo ,
FM.SEQ_ID AS SeqID ,
FM.WIP_NO AS WipNo ,
FM.ITEM_NO AS ItemNo ,
FM.INHOUSE_QTY AS InhouseQty ,
FM.MODEL_NO AS ModelNo ,
FM.STATUS AS StatusName ,
FM.CREATE_DATE AS CreateDate ,
FM.PRO_TYPE AS ProType ,
FD.SERIAL_NO AS SerialNo ,
RM.END_TIME AS EndTime ,
RM.SPECIAL_PO AS SpecialPo ,
RM.QA_MENO AS QaMeno ,
W.WERKS AS Werks ,
FA.FACTORY_NO AS FactoryNo ,
FU.UNIT_NAME AS UnitName
FROM JHAMES.FQC_INHOUSE_MASTER FM
LEFT JOIN JHAMES.FQC_INHOUSE_DETAIL FD ON FM.INHOUSE_NO = FD.INHOUSE_NO AND FM.SEQ_ID = FD.SEQ_ID -- Deail
LEFT JOIN JHAMES.FQC_RESULT_MASTER RM ON FM.INHOUSE_NO = RM.INHOUSE_NO AND FM.SEQ_ID = RM.SEQ_ID -- FQC檢驗表
LEFT JOIN JHAMES.WIP_INFO W ON FM.WIP_NO = W.WIP_NO AND FM.UNIT_NO = W.UNIT_NO --
LEFT JOIN JHAMES.FACTORY_INFO FA ON W.WERKS = FA.FACTORY_ID --
LEFT JOIN JHAMES.FACTORY_UNIT FU ON FM.UNIT_NO = FU.UNIT_NO --
LEFT JOIN JHAMES.BARCODE_INFO B ON B.BOX_NO = FD.SERIAL_NO --
WHERE 1 = 1";
DynamicParameters p = new DynamicParameters();
if (!string.IsNullOrWhiteSpace(inhouseNo))
{
sql += " AND FM.INHOUSE_NO = :inhouseNo ";
p.Add("inhouseNo", inhouseNo, DbType.AnsiString);
}
if (!string.IsNullOrWhiteSpace(wipNo))
{
sql += " AND FM.WIP_NO = :wipNo ";
p.Add("wipNo", wipNo, DbType.AnsiString);
}
if (!string.IsNullOrWhiteSpace(status))
{
// P1 特採允收
if (status != "P1")
{
sql += " AND FM.STATUS = :status ";
p.Add("status", status, DbType.AnsiString);
}
else
{
sql += " AND FM.STATUS = :status AND RM.SPECIAL_PO IS NOT NULL";
p.Add("status", status, DbType.AnsiString);
}
}
if (!string.IsNullOrWhiteSpace(factoryID))
{
sql += " AND W.WERKS = :factoryID ";
p.Add("factoryID", factoryID);
}
if (!string.IsNullOrWhiteSpace(factoryNo))
{
sql += " AND FA.FACTORY_NO = :factoryNo ";
p.Add("factoryNo", factoryNo, DbType.AnsiString);
}
if (!string.IsNullOrWhiteSpace(barcodeNo))
{
sql += " AND B.BARCODE_NO = :barcodeNo ";
p.Add("barcodeNo", barcodeNo, DbType.AnsiString);
}
if (!string.IsNullOrWhiteSpace(boxNo))
{
sql += " AND FD.SERIAL_NO = :boxNo ";
p.Add("boxNo", boxNo, DbType.AnsiString);
}
if (!string.IsNullOrWhiteSpace(unit))
{
sql += " AND FM.UNIT_NO = :unit ";
p.Add("unit", unit, DbType.AnsiString);
}
if (DateTime.TryParse(date_str, out _))
{
sql += " AND FM.CREATE_DATE <= TO_DATE(:date_str, 'YYYY-MM-DD HH24:MI:SS')";
p.Add("date_str", $"{date_str} 00:00:00");
}
if (DateTime.TryParse(date_end, out _))
{
sql += " AND FM.CREATE_DATE >= TO_DATE(:date_end, 'YYYY-MM-DD HH24:MI:SS') ";
p.Add("date_end", $"{date_end} 23:59:59");
}
try
{
var q = _context.Database.DapperQuery<FqcInhouseMasterDto>(sql, p);
// 紀錄筆數
result.DataTotal = q.Count();
// Table 頁數
if (page > 0)
{
q = q.Skip((page - 1) * limit).Take(limit).ToList();
}
result.Data = q;
// 判斷結束時間
result.Data = result.Data.Select(s => { s.EndTime = s.StatusName == "A" ? null : s.EndTime; return s; })
.ToList();
// 修改狀態名稱
result.Data = result.Data.Select(s => { s.StatusName = s.StatusName == "P" ? string.IsNullOrWhiteSpace(s.SpecialNo) ? "允收" : "特採允收" : s.StatusName == "R" ? "批退" : "未驗收完成"; return s; })
.ToList();
}
catch (Exception ex)
{
result.Success = false;
result.Msg = ex.Message;
}
return result;
}
/// <summary>
/// FQC查詢 抽驗明細Dto
/// </summary>
/// <param name="id">工單號碼</param>
/// <returns></returns>
[HttpGet("FqcInhouseMasterQuery/ExamineDetail/{id}")]
public ResultModel<FQC008DetailDto> GetFqcInhouseMasterQueryExamineDetail(string id)
{
ResultModel<FQC008DetailDto> result = new ResultModel<FQC008DetailDto>();
var sql = @" SELECT M.WIP_NO AS WipNo ,
M.INHOUSE_NO AS InhouseNo ,
M.SEQ_ID AS SeqID ,
FU.UNIT_NAME AS UnitName ,
D.BARCODE_NO AS BarcodeNo ,
CASE
WHEN D.STATUS_NO = 'P' THEN 'PASS'
WHEN D.STATUS_NO = 'F' THEN 'NG'
END AS StatusNo ,
D.BOX_NO AS BoxNo ,
D.EXTRA_BARCODE_NO AS ExtraBarcodeNo ,
D.CREATE_DATE AS CreateDate
FROM JHAMES.FQC_RESULT_MASTER M
INNER JOIN JHAMES.FQC_RESULT_DETAIL D ON M.FQC_ID = D.FQC_ID
INNER JOIN JHAMES.FQC_INHOUSE_MASTER FM ON FM.INHOUSE_NO = M.INHOUSE_NO AND FM.SEQ_ID = M.SEQ_ID
INNER JOIN JHAMES.FACTORY_UNIT FU ON FM.UNIT_NO = FU.UNIT_NO
WHERE M.WIP_NO = :id";
DynamicParameters p = new DynamicParameters();
p.Add("id", id, DbType.AnsiString);
try
{
var q = _context.Database.DapperQuery<FQC008DetailDto>(sql, p);
// 紀錄筆數
result.DataTotal = q.Count();
result.Data = q;
}
catch (Exception ex)
{
result.Success = false;
result.Msg = ex.Message;
}
return result;
}
/// <summary>
/// FQC抽驗資料
/// </summary>

317
AMESCoreStudio.WebApi/Controllers/AMES/SolderPasteInfoController.cs

@ -1,14 +1,19 @@
using System;
using AMESCoreStudio.CommonTools.Result;
using AMESCoreStudio.WebApi.DTO.AMES;
using AMESCoreStudio.WebApi.Enum;
using AMESCoreStudio.WebApi.Models.AMES;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.IO;
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;
using AMESCoreStudio.WebApi.DTO.AMES;
using AMESCoreStudio.CommonTools.Result;
using Dapper;
using System.Data;
using AMESCoreStudio.WebApi.Extensions;
using Microsoft.Extensions.Configuration;
using AMESCoreStudio.WebApi.Controllers;
namespace AMESCoreStudio.WebApi.Controllers.AMES
{
@ -20,9 +25,11 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES
public class SolderPasteInfoController : ControllerBase
{
private readonly AMESContext _context;
private readonly IConfiguration _config;
public SolderPasteInfoController(AMESContext context)
public SolderPasteInfoController(AMESContext context, IConfiguration config)
{
_config = config;
_context = context;
}
@ -51,12 +58,14 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES
/// 錫膏資料查詢
/// </summary>
/// <param name="solderPasteNo">錫膏編號</param>
/// <param name="description">規格</param>
/// <param name="vendor">廠商</param>
/// <param name="status">狀態</param>
/// <param name="page">頁數</param>
/// <param name="limit">筆數</param>
/// <returns></returns>
[HttpGet("SolderPasteInfoQuery")]
public async Task<ResultModel<SolderPasteInfoDto>> GetSolderPasteInfo(string solderPasteNo , string status, int page = 0, int limit = 10)
public async Task<ResultModel<SolderPasteInfoDto>> GetSolderPasteInfo(string solderPasteNo, string description, string vendor, string status, int page = 0, int limit = 10)
{
var q = await _context.SolderPasteInfos.ToListAsync();
@ -65,46 +74,277 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES
q = q.Where(w => w.SolderPasteNo.Contains(solderPasteNo)).ToList();
}
//if (!string.IsNullOrWhiteSpace(pcbPartNo))
//{
// q = q.Where(w => w.PcbPartNo.Contains(pcbPartNo)).ToList();
//}
if (!string.IsNullOrWhiteSpace(description))
{
q = q.Where(w => w.Description.Contains(description)).ToList();
}
//if (!string.IsNullOrWhiteSpace(side))
//{
// q = q.Where(w => w.Side.ToString() == side).ToList();
//}
if (!string.IsNullOrWhiteSpace(vendor))
{
q = q.Where(w => w.Vendor.Contains(vendor)).ToList();
}
if (!string.IsNullOrWhiteSpace(status))
{
q = q.Where(w => w.Status == status).ToList();
}
ResultModel<SolderPasteInfoDto> result = new ResultModel<SolderPasteInfoDto>();
// 紀錄筆數
result.DataTotal = q.Count();
// Table 頁數
if (page > 0)
{
q = q.Skip((page - 1) * limit).Take(limit).ToList();
}
// 紀錄筆數
result.DataTotal = q.Count();
result.Data = q.Select(s => new SolderPasteInfoDto
{
SolderPasteID = s.SolderPasteID,
SolderPasteNo = s.SolderPasteNo,
Description = s.Description,
Alloy = s.Alloy,
Vendor = s.Vendor,
Lot = s.Lot,
EffectiveDate = s.EffectiveDate,
ManufactoringDate = s.ManufactoringDate,
ReceiptDate = s.ReceiptDate,
StatusName = s.Status == "0" ? "失效" : "有效",
StatusName = EnumPCB.GetDisplayName((EnumPCB.EnumSolderPasteStatus)System.Enum.Parse(typeof(EnumPCB.EnumSolderPasteStatus), s.Status)),
Remark = s.Remark
}).ToList();
return result;
}
/// <summary>
/// 錫膏資料 By狀態 查詢
/// </summary>
/// <param name="id">狀態</param>
/// <returns></returns>
[HttpGet("SolderPasteInfoByStatus/{id}")]
public async Task<List<SolderPasteInfo>> GetSolderPasteInfoByStatus(string id)
{
if (id != "X")
{
var result = await _context.SolderPasteInfos.Where(w => w.Status == id).OrderBy(o => o.SolderPasteNo).ToListAsync();
return result;
}
else
{
// 要報廢 不找已經報廢或已經使用完的錫膏
var result = await _context.SolderPasteInfos.Where(w => w.Status != "X" && w.Status != "C").OrderBy(o => o.SolderPasteNo).ToListAsync();
return result;
}
}
/// <summary>
/// 錫膏Report
/// </summary>
/// <param name="solderPasteNo">錫膏編號</param>
/// <param name="status">狀態</param>
/// <param name="wipNo">工單號碼</param>
/// <param name="strDate">開始_收貨時間</param>
/// <param name="endDate">結束_收貨時間</param>
/// <param name="page">頁數</param>
/// <param name="limit">筆數</param>
/// <returns></returns>
[HttpGet("Report")]
public ResultModel<PCB017ViewDto> GetSolderPasteInfoReport(string solderPasteNo, string status, string wipNo,
string strDate, string endDate, int page = 0, int limit = 10)
{
ResultModel<PCB017ViewDto> result = new ResultModel<PCB017ViewDto>();
var sql = @"SELECT
I.SOLDER_PASTE_ID AS SolderPasteID ,
I.SOLDER_PASTE_NO AS SolderPasteNo ,
I.DESCRIPTION AS Description ,
I.VENDOR AS Vendor ,
I.ALLOY AS Alloy ,
I.LOT AS Lot ,
I.WIP_NO AS WipNo ,
I.STATUS AS StatusName ,
I.RECEIPT_DATE AS ReceiptDate,
I.MANUFACTORING_DATE AS ManufactoringDate,
I.EFFECTIVE_DATE AS EffectiveDate,
I.REMARK AS Remark ,
U.USER_NAME AS CreateUserName ,
I.CREATE_DATE AS CreateTime ,
--
U1.USER_NAME AS InUserName ,
R1.CREATE_DATE AS InTime ,
--
U2.USER_NAME AS OutUserName ,
R2.CREATE_DATE AS OutTime ,
--
U3.USER_NAME AS UseUserName ,
R3.CREATE_DATE AS UseTime ,
--
U5.USER_NAME AS CompletedUserName ,
R5.CREATE_DATE AS CompletedTime ,
--
U4.USER_NAME AS ScrapUserName ,
R4.CREATE_DATE AS ScrapTime ,
--
CASE
WHEN R3.CREATE_DATE IS NOT NULL THEN R3.CREATE_DATE - INTERVAL '2' MINUTE
ELSE NULL
END AS MixingTime
FROM JHAMES.SOLDER_PASTE_INFO I
INNER JOIN JHSYS.USER_INFO U ON I.CREATE_USERID = U.USER_ID
LEFT JOIN JHAMES.SOLDER_PASTE_RECORD R1 ON I.SOLDER_PASTE_ID = R1.SOLDER_PASTE_ID AND R1.STATUS = 'I' --
LEFT JOIN JHSYS.USER_INFO U1 ON R1.CREATE_USERID = U1.USER_ID
LEFT JOIN JHAMES.SOLDER_PASTE_RECORD R2 ON I.SOLDER_PASTE_ID = R2.SOLDER_PASTE_ID AND R2.STATUS = 'O' --
LEFT JOIN JHSYS.USER_INFO U2 ON R2.CREATE_USERID = U2.USER_ID
LEFT JOIN JHAMES.SOLDER_PASTE_RECORD R3 ON I.SOLDER_PASTE_ID = R3.SOLDER_PASTE_ID AND R3.STATUS = 'U' --
LEFT JOIN JHSYS.USER_INFO U3 ON R3.CREATE_USERID = U3.USER_ID
LEFT JOIN JHAMES.SOLDER_PASTE_RECORD R4 ON I.SOLDER_PASTE_ID = R4.SOLDER_PASTE_ID AND R4.STATUS = 'X' --
LEFT JOIN JHSYS.USER_INFO U4 ON R4.CREATE_USERID = U4.USER_ID
LEFT JOIN JHAMES.SOLDER_PASTE_RECORD R5 ON I.SOLDER_PASTE_ID = R5.SOLDER_PASTE_ID AND R5.STATUS = 'C' --
LEFT JOIN JHSYS.USER_INFO U5 ON R5.CREATE_USERID = U5.USER_ID
WHERE 1 = 1";
DynamicParameters p = new DynamicParameters();
if (!string.IsNullOrWhiteSpace(solderPasteNo))
{
sql += " AND I.SOLDER_PASTE_NO LIKE :solderPasteNo ";
p.Add("solderPasteNo", $"%{solderPasteNo}%", DbType.AnsiString);
}
if (!string.IsNullOrWhiteSpace(wipNo))
{
sql += " AND I.WIP_NO LIKE :wipNo ";
p.Add("wipNo", $"%{wipNo}%", DbType.AnsiString);
}
if (!string.IsNullOrWhiteSpace(status))
{
sql += " AND I.STATUS = :status ";
p.Add("status", status, DbType.AnsiString);
}
if (DateTime.TryParse(strDate, out _))
{
sql += " AND I.RECEIPT_DATE >= TO_DATE(:strDate, 'YYYY-MM-DD HH24:MI:SS')";
p.Add("strDate", $"{strDate} 00:00:00");
}
if (DateTime.TryParse(endDate, out _))
{
sql += " AND I.RECEIPT_DATE <= TO_DATE(:endDate, 'YYYY-MM-DD HH24:MI:SS') ";
p.Add("endDate", $"{endDate} 23:59:59");
}
try
{
var q = _context.Database.DapperQuery<PCB017ViewDto>(sql, p);
// 紀錄筆數
result.DataTotal = q.Count();
// Table 頁數
if (page > 0)
{
q = q.Skip((page - 1) * limit).Take(limit).ToList();
}
result.Data = q;
// 狀態
result.Data = result.Data.Select(s =>
{
s.StatusName = s.StatusName == "N" ? "未使用" :
s.StatusName == "I" ? "入冰箱" :
s.StatusName == "O" ? "出冰箱" :
s.StatusName == "U" ? "開封" :
s.StatusName == "C" ? "使用完" :
s.StatusName == "X" ? "報廢" : s.StatusName
; return s;
}).ToList();
}
catch (Exception ex)
{
result.Success = false;
result.Msg = ex.Message;
}
return result;
}
/// <summary>
/// 錫膏排程 報廢
/// </summary>
/// <returns></returns>
[HttpGet("Scheduling")]
public async Task<ResultModel<SolderPasteInfo>> GetSolderPasteInfoScheduling(int userId = 0)
{
ResultModel<SolderPasteInfo> result = new ResultModel<SolderPasteInfo>();
var sql = @"SELECT I.SOLDER_PASTE_ID AS SolderPasteID ,
I.SOLDER_PASTE_NO AS SolderPasteNo ,
I.STATUS AS Status ,
R.CREATE_DATE AS CreateDate
FROM JHAMES.SOLDER_PASTE_INFO I
INNER JOIN JHAMES.SOLDER_PASTE_RECORD R ON I.SOLDER_PASTE_ID = R.SOLDER_PASTE_ID
WHERE (I.STATUS = 'O' AND R.STATUS='O' AND R.CREATE_DATE + 7 < SYSDATE) -- 7
OR ((R.STATUS = 'U' AND I.STATUS ='U' AND R.CREATE_DATE + 1 < SYSDATE)) -- 1";
try
{
DynamicParameters p = new DynamicParameters();
var q = _context.Database.DapperQuery<SolderPasteInfo>(sql, p);
if (q.Any())
{
List<SolderPasteRecord> solderPasteRecords = q.Select(s => new SolderPasteRecord
{
SolderPasteID = s.SolderPasteID,
Status = "X",
CreateUserID = userId
}).ToList();
_context.SolderPasteRecords.AddRange(solderPasteRecords);
await _context.SaveChangesAsync();
// 更新基本檔的狀態
List<SolderPasteInfo> solderPasteInfos = solderPasteRecords.Select(s => new SolderPasteInfo
{
SolderPasteID = s.SolderPasteID,
Status = s.Status,
UpdateUserID = s.CreateUserID
}).ToList();
var query = @" UPDATE JHAMES.SOLDER_PASTE_INFO SET STATUS = :Status ,
UPDATE_USERID = :UpdateUserID ,
UPDATE_DATE = sysdate
WHERE SOLDER_PASTE_ID = :SolderPasteID ";
_context.Database.DapperExecute(query, solderPasteInfos);
result.Success = true;
result.Msg = "OK";
#region 發送Mail
if (q.Where(w => w.Status == "O").Any())
{
string MailGroup = "WIP_ALARM";
string Subject = $"[AMES系統通知] 錫膏需報廢通知";
string Body = "";
foreach (var item in q.Where(w => w.Status == "O"))
{
Body += $@"{item.SolderPasteNo}已出冰箱7天沒開封需報廢 + 越南文<br/>";
}
await new BLL.MailController(_context, _config).PostMail(Subject, Body, MailGroup, "", false);
}
#endregion
}
}
catch (Exception ex)
{
result.Success = false;
result.Msg = ex.Message;
}
return result;
}
/// <summary>
/// 更新錫膏基本資料檔
/// </summary>
@ -115,6 +355,10 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES
{
ResultModel<SolderPasteInfo> result = new ResultModel<SolderPasteInfo>();
_context.Entry(solderPasteInfo).State = EntityState.Modified;
_context.Entry<SolderPasteInfo>(solderPasteInfo).Property("CreateDate").IsModified = false;
_context.Entry<SolderPasteInfo>(solderPasteInfo).Property("CreateUserID").IsModified = false;
_context.Entry<SolderPasteInfo>(solderPasteInfo).Property("Status").IsModified = false;
_context.Entry<SolderPasteInfo>(solderPasteInfo).Property("WipNo").IsModified = false;
try
{
@ -156,20 +400,27 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES
return result;
}
// DELETE: api/SolderPasteInfo/5
[HttpDelete("{id}")]
public async Task<ActionResult<SolderPasteInfo>> DeleteSolderPasteInfo(int id)
public async Task<ResultModel<SolderPasteInfo>> DeleteSolderPasteInfo(int id)
{
ResultModel<SolderPasteInfo> result = new ResultModel<SolderPasteInfo>();
var solderPasteInfo = await _context.SolderPasteInfos.FindAsync(id);
if (solderPasteInfo == null)
if (solderPasteInfo != null)
{
return NotFound();
try
{
_context.SolderPasteInfos.Remove(solderPasteInfo);
await _context.SaveChangesAsync();
result.Success = true;
result.Msg = "OK";
}
catch (Exception ex)
{
result.Success = false;
result.Msg = ex.InnerException.Message;
}
}
_context.SolderPasteInfos.Remove(solderPasteInfo);
await _context.SaveChangesAsync();
return solderPasteInfo;
return result;
}
private bool SolderPasteInfoExists(int id)

31
AMESCoreStudio.WebApi/Controllers/AMES/SolderPasteRecordController.cs

@ -8,6 +8,9 @@ using Microsoft.EntityFrameworkCore;
using AMESCoreStudio.WebApi;
using AMESCoreStudio.WebApi.Models.AMES;
using AMESCoreStudio.CommonTools.Result;
using Dapper;
using System.Data;
using AMESCoreStudio.WebApi.Extensions;
namespace AMESCoreStudio.WebApi.Controllers.AMES
{
@ -56,8 +59,6 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES
{
ResultModel<SolderPasteRecord> result = new ResultModel<SolderPasteRecord>();
_context.Entry(solderPasteRecord).State = EntityState.Modified;
solderPasteRecord.UpdateDate = DateTime.Now;
solderPasteRecord.UpdateUserID = 0;
try
{
@ -76,18 +77,29 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES
/// <summary>
/// 新增錫膏使用紀錄資料檔
/// </summary>
/// <param name="solderPasteRecord"></param>
/// <param name="solderPasteRecords">models</param>
/// <returns></returns>
[HttpPost]
public async Task<ResultModel<SolderPasteRecord>> PostSolderPasteRecord(SolderPasteRecord solderPasteRecord)
public async Task<ResultModel<SolderPasteRecord>> PostSolderPasteRecord(List<SolderPasteRecord> solderPasteRecords)
{
ResultModel<SolderPasteRecord> result = new ResultModel<SolderPasteRecord>();
Helper helper = new Helper(_context);
solderPasteRecord.SpRecordID = helper.GetIDKey("SP_RECORD_ID").Result;
_context.SolderPasteRecords.Add(solderPasteRecord);
try
{
_context.SolderPasteRecords.AddRange(solderPasteRecords);
await _context.SaveChangesAsync();
// 更新基本檔的狀態
List<SolderPasteInfo> solderPasteInfos = solderPasteRecords.Select(s => new SolderPasteInfo
{
SolderPasteID = s.SolderPasteID,
Status = s.Status,
UpdateUserID =s.CreateUserID
}).ToList();
var query = @" UPDATE JHAMES.SOLDER_PASTE_INFO SET STATUS = :Status ,
UPDATE_USERID = :UpdateUserID ,
UPDATE_DATE = sysdate
WHERE SOLDER_PASTE_ID = :SolderPasteID ";
_context.Database.DapperExecute(query, solderPasteInfos);
result.Success = true;
result.Msg = "OK";
}
@ -114,10 +126,5 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES
return solderPasteRecord;
}
private bool SolderPasteRecordExists(int id)
{
return _context.SolderPasteRecords.Any(e => e.SpRecordID == id);
}
}
}

171
AMESCoreStudio.WebApi/Controllers/AMES/SolderPasteSerialController.cs

@ -0,0 +1,171 @@
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;
using AMESCoreStudio.WebApi.DTO.AMES;
using AMESCoreStudio.CommonTools.Result;
namespace AMESCoreStudio.WebApi.Controllers.AMES
{
/// <summary>
/// 錫膏規格流水碼表
/// </summary>
[Route("api/[controller]")]
[ApiController]
public class SolderPasteSerialController : ControllerBase
{
private readonly AMESContext _context;
public SolderPasteSerialController(AMESContext context)
{
_context = context;
}
[HttpGet]
public async Task<ActionResult<IEnumerable<SolderPasteSerial>>> GetSolderPasteSerials()
{
return await _context.SolderPasteSerials.ToListAsync();
}
[HttpGet("{id}")]
public async Task<ActionResult<SolderPasteSerial>> GetSolderPasteSerial(string id)
{
var solderPasteSerial = await _context.SolderPasteSerials.FindAsync(id);
return solderPasteSerial;
}
/// <summary>
/// 自動取得編號
/// </summary>
/// <param name="id">規格</param>
/// <returns></returns>
[HttpGet("AutoSerialNo/{id}")]
public async Task<ActionResult<string>> GetSolderPasteSerialByAutoSerialNo(string id)
{
var item = await _context.SolderPasteSerials
.Where(w => w.Description.ToUpper() == id.Trim().ToUpper()).FirstOrDefaultAsync();
if (item == null)
return "";
else
{
var SerialNo = string.Empty;
var Infos = _context.SolderPasteInfos.Where(w => w.SolderPasteNo.StartsWith(item.SerialNo)).Select(s => s.SolderPasteNo).Max();
if (!string.IsNullOrWhiteSpace(Infos))
{
SerialNo = $"{item.SerialNo}{(int.Parse(Infos.Substring(2, 5)) + 1).ToString().PadLeft(5, '0')}";
}
else
{
// 根據規格對應的代碼(2碼)+流水碼(5碼)
SerialNo = $"{item.SerialNo}{(item.SerialNumber + 1).ToString().PadLeft(5, '0')}";
}
return SerialNo;
}
}
/// <summary>
/// 更新錫膏規格流水碼表
/// </summary>
/// <param name="solderPasteSerial"></param>
/// <returns></returns>
[HttpPut]
public async Task<ResultModel<SolderPasteSerial>> PutSolderPasteSerial(SolderPasteSerial solderPasteSerial)
{
ResultModel<SolderPasteSerial> result = new ResultModel<SolderPasteSerial>();
_context.Entry(solderPasteSerial).State = EntityState.Modified;
try
{
await _context.SaveChangesAsync();
result.Success = true;
result.Msg = "OK";
}
catch (Exception ex)
{
result.Success = false;
result.Msg = ex.InnerException.Message;
}
return result;
}
/// <summary>
/// 更新錫膏規格流水碼表
/// </summary>
/// <param name="id">規格</param>
/// <returns></returns>
[HttpPut("AutoMatically/{id}")]
public async Task<ResultModel<SolderPasteSerial>> PutSolderPasteSerialAutoMatically(string id)
{
ResultModel<SolderPasteSerial> result = new ResultModel<SolderPasteSerial>();
// 流水碼加1
string updateSql = @" UPDATE JHAMES.SOLDER_PASTE_SERIAL SET SERIAL_NUMBER = SERIAL_NUMBER + 1 ,
WHERE DESCRIPTION = :Description";
try
{
// 執行原生 SQL
_context.Database.ExecuteSqlRaw(updateSql);
result.Success = true;
result.Msg = "OK";
}
catch (Exception ex)
{
result.Success = false;
result.Msg = ex.InnerException.Message;
}
return result;
}
/// <summary>
/// 新增錫膏規格流水碼表
/// </summary>
/// <param name="solderPasteSerial"></param>
/// <returns></returns>
[HttpPost]
public async Task<ResultModel<SolderPasteSerial>> PostSolderPasteSerial(SolderPasteSerial solderPasteSerial)
{
ResultModel<SolderPasteSerial> result = new ResultModel<SolderPasteSerial>();
_context.SolderPasteSerials.Add(solderPasteSerial);
try
{
await _context.SaveChangesAsync();
result.Success = true;
result.Msg = "OK";
}
catch (Exception ex)
{
result.Success = false;
result.Msg = ex.InnerException.Message;
}
return result;
}
// DELETE: api/SolderPasteSerial/5
[HttpDelete("{id}")]
public async Task<ActionResult<SolderPasteSerial>> DeleteSolderPasteSerial(string id)
{
var solderPasteSerial = await _context.SolderPasteSerials.FindAsync(id);
if (solderPasteSerial == null)
{
return NotFound();
}
_context.SolderPasteSerials.Remove(solderPasteSerial);
await _context.SaveChangesAsync();
return solderPasteSerial;
}
private bool SolderPasteSerialExists(string id)
{
return _context.SolderPasteSerials.Any(e => e.SerialNo == id);
}
}
}

3
AMESCoreStudio.WebApi/Controllers/AMES/SteelPlateInfoController.cs

@ -284,7 +284,8 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES
{
ResultModel<SteelPlateInfo> result = new ResultModel<SteelPlateInfo>();
_context.Entry(steelPlateInfo).State = EntityState.Modified;
_context.Entry<SteelPlateInfo>(steelPlateInfo).Property("CreateDate").IsModified = false;
_context.Entry<SteelPlateInfo>(steelPlateInfo).Property("CreateUserID").IsModified = false;
try
{
await _context.SaveChangesAsync();

105
AMESCoreStudio.WebApi/Controllers/BLL/BarCodeCheckNewController.cs

@ -889,12 +889,11 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES
}
}
#endregion
#region 鋼板
#region 鋼板或錫膏
else
{
// 查詢有效鋼板編號
var steelPlate = _context.SteelPlateInfos.Where(w => w.SteelPlateNo.ToUpper() == item.inputData.ToUpper()
&& w.Status == "1").FirstOrDefault();
var steelPlate = _context.SteelPlateInfos.Where(w => w.SteelPlateNo.ToUpper() == item.inputData.ToUpper() && w.Status == "1").FirstOrDefault();
if (steelPlate != null)
{
// 查詢鋼板紀錄沒有下線紀錄
@ -907,7 +906,10 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES
if (!(Measure.WipNo ?? "").Contains(data.wipNo))
{
// 更新工單號碼到鋼板量測紀錄
Measure.WipNo += data.wipNo + ",";
if (string.IsNullOrWhiteSpace(Measure.WipNo))
Measure.WipNo += data.wipNo;
else
Measure.WipNo += "," + data.wipNo;
try
{
_context.Entry(Measure).State = EntityState.Modified;
@ -936,6 +938,69 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES
}
}
}
// 錫膏
else
{
// 查詢錫膏且出冰箱
var solderPaste = _context.SolderPasteInfos.Where(w => w.SolderPasteNo.ToUpper() == item.inputData.ToUpper()
&& (w.Status == "O" || w.Status == "U")).FirstOrDefault();
if (solderPaste != null)
{
// 出冰箱
if (solderPaste.Status == "O")
{
// 更新 錫膏狀態
string updateSql = $@" UPDATE JHAMES.SOLDER_PASTE_INFO SET STATUS ='U',
WIP_NO = '{data.wipNo}' ,
UPDATE_DATE = SYSDATE ,
UPDATE_USERID ='{data.userID}'
WHERE SOLDER_PASTE_ID ={solderPaste.SolderPasteID}";
// 新增 錫膏紀錄
SolderPasteRecord solderPasteRecord = new SolderPasteRecord
{
SolderPasteID = solderPaste.SolderPasteID,
Status = "U",
CreateUserID = data.userID,
CreateDate = DateTime.Now
};
try
{
// 執行原生 SQL
_context.Database.ExecuteSqlRaw(updateSql);
_context.SolderPasteRecords.Add(solderPasteRecord);
_context.SaveChanges();
}
catch (Exception ex)
{
return ex.InnerException.Message;
}
}
// 已開封
else if (solderPaste.Status == "U")
{
// 確認第一次紀錄該筆工單號碼
if (!(solderPaste.WipNo ?? "").Contains(data.wipNo))
{
// 更新 錫膏工單
string updateSql = $@" UPDATE JHAMES.SOLDER_PASTE_INFO SET WIP_NO = WIP_NO || ',' || '{data.wipNo}',
UPDATE_DATE = SYSDATE ,
UPDATE_USERID ='{data.userID}'
WHERE SOLDER_PASTE_ID ={solderPaste.SolderPasteID}";
try
{
// 執行原生 SQL
_context.Database.ExecuteSqlRaw(updateSql);
_context.SaveChanges();
}
catch (Exception ex)
{
return ex.InnerException.Message;
}
}
}
}
}
}
#endregion
//// 確認治具編號使用次數已經超過預計次數
@ -2030,11 +2095,16 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES
var q1 = _context.SteelPlateInfos.Where(w => w.SteelPlateNo.ToUpper() == outfitNo.inputData.ToUpper().Trim()
&& w.Status == "1").FirstOrDefault();
// 錫膏取出冰箱
var q2 = _context.SolderPasteInfos.Where(w => w.SolderPasteNo.ToUpper() == outfitNo.inputData.ToUpper().Trim()
&& (w.Status == "O" || w.Status == "U")).FirstOrDefault();
// 鋼板
if (q1 != null)
{
// 查詢鋼板紀錄沒有上線紀錄
var Measure = _context.SteelPlateMeasures.Where(w => w.SteelPlateID == q1.SteelPlateID
&& w.OffUserID == null )
&& w.OffUserID == null)
.FirstOrDefault();
if (Measure == null)
{
@ -2043,13 +2113,34 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES
}
}
if (q == null && q1 == null)
// 錫膏
if (q2 != null)
{
// 查詢錫膏紀錄出冰箱紀錄
var Record = _context.SolderPasteRecords.Where(w => w.SolderPasteID == q2.SolderPasteID
&& w.Status == "O")
.FirstOrDefault();
if (Record == null)
{
resultModel.Msg = $"錫膏編號【{outfitNo.inputData}】 沒有出冰箱紀錄";
return resultModel;
}
// 錫膏編號必須為出冰箱2hrs後才可投入生產
else if (Record.CreateDate > DateTime.Now.AddHours(-2))
{
resultModel.Msg = $"錫膏編號【{outfitNo.inputData}】出冰箱尚未超過2Hrs";
return resultModel;
}
}
if (q == null && q1 == null && q2 == null)
outfitNoMsg += $"{outfitNo.inputData}、";
}
if (!string.IsNullOrWhiteSpace(outfitNoMsg))
{
resultModel.Msg = $"中央治具找不到該治具編號或鋼板編號【{outfitNoMsg.Substring(0, outfitNoMsg.Length - 1)}】";
resultModel.Msg = $"中央治具找不到該治具編號、鋼板編號、錫膏編號【{outfitNoMsg.Substring(0, outfitNoMsg.Length - 1)}】";
return resultModel;
}

51
AMESCoreStudio.WebApi/Controllers/BLL/RPTController.cs

@ -18,6 +18,7 @@ using Newtonsoft.Json.Linq;
using AMESCoreStudio.WebApi.Controllers.SYS;
using System.Data.Common;
using System.Collections.Generic;
using System.Reflection;
namespace AMESCoreStudio.WebApi.Controllers.BLL
{
@ -131,10 +132,9 @@ namespace AMESCoreStudio.WebApi.Controllers.BLL
result.abnormalTime = double.Parse(errTime.ToString("0.00"));
//直通率:GetWipStation4QRS014GroupALL
//2023-08-31 BB.Wang Modify 昶亨Werks_No = YS08
//2023-07-11 BB.Wang Modify 安勤 Jason反映只要查安勤產線即可 Werks_No = YS00
//2023-07-11 BB.Wang Modify 安勤 Jason反映只要查安勤產線即可
//var d = await new WipStationController(_context).GetWipStation4QRS014GroupALL(null, sDate, eDate, null, null, null);
var d = await new WipStationController(_context).GetWipStation4QRS014GroupALL(null, sDate, eDate, null, "YS08", null);
var d = await new WipStationController(_context).GetWipStation4QRS014GroupALL(null, sDate, eDate, null, "YS00", null);
if (d.DataTotal > 0)
{
double sum_rate = 100.0;
@ -267,10 +267,9 @@ namespace AMESCoreStudio.WebApi.Controllers.BLL
//FQC
//2023-08-31 BB.Wang Modify 昶亨Factory_ID = 12
//2023-07-11 BB.Wang Modify 安勤 Jason反映只要查安勤產線即可 Factory_ID = 1001
//2023-07-11 BB.Wang Modify 安勤 Jason反映只要查安勤產線即可
//var f = await new FqcResultMasterController(_context).GetFQCHeaderData4QRS016(null, null, null, sDate, eDate, null);
var f = await new FqcResultMasterController(_context).GetFQCHeaderData4QRS016(null, null, null, sDate, eDate, "12");
var f = await new FqcResultMasterController(_context).GetFQCHeaderData4QRS016(null, null, null, sDate, eDate, "1001");
if (f.DataTotal > 0)
{
int sumFqcCnt = 0, sumFqcPassCnt = 0, sumFqcFailCnt = 0;
@ -922,9 +921,8 @@ namespace AMESCoreStudio.WebApi.Controllers.BLL
// FQC批退率 Board
#region 批退率 Board
//2023-08-31 BB.Wang Modify 昶亨Factory_ID = 12 (原1001)
//result.FQCRRBoard = 5.08;
var f_FQCRRBoard = await new FqcResultMasterController(_context).GetFQCHeaderData4QRS016ByDetail(null, null, null, sDate, eDate, "12");
var f_FQCRRBoard = await new FqcResultMasterController(_context).GetFQCHeaderData4QRS016ByDetail(null, null, null, sDate, eDate, "1001");
if (f_FQCRRBoard.DataTotal > 0)
{
foreach (var item in f_FQCRRBoard.Data.Where(W => W.type == "單板"))
@ -935,10 +933,9 @@ namespace AMESCoreStudio.WebApi.Controllers.BLL
#endregion
// FQC批退率 System
//2023-08-31 BB.Wang Modify 昶亨Factory_ID = 12 (原1001)
#region 批退率 System
//result.FQCRRSystem = 12.12;
var f_FQCRRSystem = await new FqcResultMasterController(_context).GetFQCHeaderData4QRS016ByDetail(null, null, null, sDate, eDate, "12");
var f_FQCRRSystem = await new FqcResultMasterController(_context).GetFQCHeaderData4QRS016ByDetail(null, null, null, sDate, eDate, "1001");
if (f_FQCRRSystem.DataTotal > 0)
{
foreach (var item in f_FQCRRSystem.Data.Where(W => W.type == "系統組裝"))
@ -949,10 +946,9 @@ namespace AMESCoreStudio.WebApi.Controllers.BLL
#endregion
// FQC批退率 Medical
//2023-08-31 BB.Wang Modify 昶亨Factory_ID = 12 (原1001)
#region 批退率 Medical
//result.FQCRRMedical = 11.11;
var f_FQCRRMedical = await new FqcResultMasterController(_context).GetFQCHeaderData4QRS016ByDetail(null, null, null, sDate, eDate, "12");
var f_FQCRRMedical = await new FqcResultMasterController(_context).GetFQCHeaderData4QRS016ByDetail(null, null, null, sDate, eDate, "1001");
if (f_FQCRRSystem.DataTotal > 0)
{
foreach (var item in f_FQCRRMedical.Data.Where(W => W.type == "醫療"))
@ -978,9 +974,8 @@ namespace AMESCoreStudio.WebApi.Controllers.BLL
// FPY 立德 Board
#region 立德 Board
//2023-08-31 BB.Wang Modify 昶亨Werks_No = YS08 (原YS00)
//result.FPYBoard_LEI = 99.15;
var f_FPYBoard_LEI = await new WipStationController(_context).GetWipStation4QRS014GroupB(null, sDate, eDate, null, "YS08", null);
var f_FPYBoard_LEI = await new WipStationController(_context).GetWipStation4QRS014GroupB(null, sDate, eDate, null, "YS00", null);
if (f_FPYBoard_LEI.DataTotal > 0)
{
double sum_rate = 100.0;
@ -1084,9 +1079,8 @@ namespace AMESCoreStudio.WebApi.Controllers.BLL
// FPY 立德 System
#region 立德 System
//2023-08-31 BB.Wang Modify 昶亨Werks_No = YS08 (原YS00)
//result.FPYSystem_LEI = 92.12;
var f_FPYSystem_LEI = await new WipStationController(_context).GetWipStation4QRS014GroupS(null, sDate, eDate, null, "YS08", null);
var f_FPYSystem_LEI = await new WipStationController(_context).GetWipStation4QRS014GroupS(null, sDate, eDate, null, "YS00", null);
if (f_FPYSystem_LEI.DataTotal > 0)
{
double sum_rate = 100.0;
@ -1190,9 +1184,8 @@ namespace AMESCoreStudio.WebApi.Controllers.BLL
// FPY 立德 Medical
#region 立德 Medical
//2023-08-31 BB.Wang Modify 昶亨Werks_No = YS08 (原YS00)
//result.FPYMedical_LEI = 90.11;
var f_FPYMedical_LEI = await new WipStationController(_context).GetWipStation4QRS014GroupS(null, sDate, eDate, null, "YS08", null);
var f_FPYMedical_LEI = await new WipStationController(_context).GetWipStation4QRS014GroupS(null, sDate, eDate, null, "YS00", null);
if (f_FPYMedical_LEI.DataTotal > 0)
{
double sum_rate = 100.0;
@ -1639,6 +1632,28 @@ namespace AMESCoreStudio.WebApi.Controllers.BLL
//result.CFQRTotal = 250;
result.CFQRTotal = int.Parse(sData_Ary[2].ToString());
result.IQLRR_EE = Math.Round(result.IQLRR_EE, 2);
result.IQLRR_ME = Math.Round(result.IQLRR_ME, 2);
result.LQC = Math.Round(result.LQC, 2);
result.FQCRRBoard = Math.Round(result.FQCRRBoard, 2);
result.FQCRRMedical = Math.Round(result.FQCRRMedical, 2);
result.FQCRRSystem = Math.Round(result.FQCRRSystem, 2);
result.DOABoard = Math.Round(result.DOABoard, 2);
result.DOAMedical = Math.Round(result.DOAMedical, 2);
result.DOASystem = Math.Round(result.DOASystem, 2);
result.FPYBoard_LEI = Math.Round(result.FPYBoard_LEI, 2);
result.FPYMedical_LEI = Math.Round(result.FPYMedical_LEI, 2);
result.FPYSystem_LEI = Math.Round(result.FPYSystem_LEI, 2);
result.FPYBoard = Math.Round(result.FPYBoard, 2);
result.FPYMedical = Math.Round(result.FPYMedical, 2);
result.FPYSystem = Math.Round(result.FPYSystem, 2);
result.RMABoard = Math.Round(result.RMABoard, 2);
result.RMAMedical = Math.Round(result.RMAMedical, 2);
result.RMASystem = Math.Round(result.RMASystem, 2);
return result;
}
}

73
AMESCoreStudio.WebApi/DTO/AMES/FQC008DetailDto.cs

@ -0,0 +1,73 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
using System.Runtime.Serialization;
#nullable disable
namespace AMESCoreStudio.WebApi.DTO.AMES
{
/// <summary>
/// FQC查詢 抽驗明細Dto
/// </summary>
public partial class FQC008DetailDto
{
/// <summary>
/// 入庫單號碼
/// </summary>
[DataMember]
public string InhouseNo { get; set; }
/// <summary>
/// 順序ID
/// </summary>
[Key]
[DataMember]
public int SeqID { get; set; } = 1;
/// <summary>
/// 工單號碼
/// </summary>
[DataMember]
public string WipNo { get; set; }
/// <summary>
/// 內部序號
/// </summary>
[DataMember]
public string BarcodeNo { get; set; }
/// <summary>
/// 箱號/條碼
/// </summary>
[DataMember]
public string BoxNo { get; set; }
/// <summary>
/// 出貨序號
/// </summary>
[DataMember]
public string ExtraBarcodeNo { get; set; }
/// <summary>
/// 抽驗狀態 P-PASS;F-NG;
/// </summary>
[DataMember]
public string StatusNo { get; set; }
/// <summary>
/// 生產製程
/// </summary>
[DataMember]
public string UnitName { get; set; }
/// <summary>
/// 抽驗時間
/// </summary>
[DataMember]
public string CreateDate { get; set; }
}
}

6
AMESCoreStudio.WebApi/DTO/AMES/FqcInhouseMasterDto.cs

@ -111,6 +111,12 @@ namespace AMESCoreStudio.WebApi.DTO.AMES
[Display(Name = "結束抽驗時間")]
public DateTime? EndTime { get; set; }
/// <summary>
/// 生產製程
/// </summary>
[DataMember]
public string UnitName { get; set; }
/// <summary>
/// 建立UserID
/// </summary>

0
AMESCoreStudio.WebApi/DTO/AMES/PCB013RViewDto.cs → AMESCoreStudio.WebApi/DTO/AMES/PCB016ViewDto.cs

140
AMESCoreStudio.WebApi/DTO/AMES/PCB017ViewDto.cs

@ -0,0 +1,140 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace AMESCoreStudio.WebApi.DTO.AMES
{
/// <summary>
/// 錫膏Report Dto
/// </summary>
public partial class PCB017ViewDto
{
/// <summary>
/// 錫膏ID
/// </summary>
public int SolderPasteID { get; set; }
/// <summary>
/// 錫膏編號
/// </summary>
public string SolderPasteNo { get; set; }
/// <summary>
/// 規格
/// </summary>
public string Description { get; set; }
/// <summary>
/// 合金
/// </summary>
public string Alloy { get; set; }
/// <summary>
/// 廠商
/// </summary>
public string Vendor { get; set; }
/// <summary>
/// LOT
/// </summary>
public string Lot { get; set; }
/// <summary>
/// 工單號碼
/// </summary>
public string WipNo { get; set; }
/// <summary>
/// 狀態 0=失效 ; 1=有效
/// </summary>
public string StatusName { get; set; }
/// <summary>
/// 收貨日期
/// </summary>
public DateTime ReceiptDate { get; set; }
/// <summary>
/// 製造日期
/// </summary>
public DateTime ManufactoringDate { get; set; }
/// <summary>
/// 有效日期
/// </summary>
public DateTime EffectiveDate { get; set; }
/// <summary>
/// 備註
/// </summary>
public string Remark { get; set; }
/// <summary>
/// 建立人員
/// </summary>
public string CreateUserName { get; set; }
/// <summary>
/// 建立時間
/// </summary>
public DateTime CreateTime { get; set; }
/// <summary>
/// 入冰箱人員
/// </summary>
public string InUserName { get; set; }
/// <summary>
/// 入冰箱時間
/// </summary>
public DateTime? InTime { get; set; }
/// <summary>
/// 出冰箱人員
/// </summary>
public string OutUserName { get; set; }
/// <summary>
/// 出冰箱時間
/// </summary>
public DateTime? OutTime { get; set; }
/// <summary>
/// 使用人員
/// </summary>
public string UseUserName { get; set; }
/// <summary>
/// 使用時間
/// </summary>
public DateTime? UseTime { get; set; }
/// <summary>
/// 用完人員
/// </summary>
public string CompletedUserName { get; set; }
/// <summary>
/// 用完時間
/// </summary>
public DateTime? CompletedTime { get; set; }
/// <summary>
/// 報廢人員
/// </summary>
public string ScrapUserName { get; set; }
/// <summary>
/// 報廢時間
/// </summary>
public DateTime? ScrapTime { get; set; }
/// <summary>
/// 錫膏攪拌時間
/// </summary>
public DateTime? MixingTime { get; set; }
}
}

17
AMESCoreStudio.WebApi/DTO/AMES/SolderPasteInfoDto.cs

@ -21,10 +21,25 @@ namespace AMESCoreStudio.WebApi.DTO.AMES
public string SolderPasteNo { get; set; }
/// <summary>
/// 規格描述
/// 規格
/// </summary>
public string Description { get; set; }
/// <summary>
/// 合金
/// </summary>
public string Alloy { get; set; }
/// <summary>
/// 廠商
/// </summary>
public string Vendor { get; set; }
/// <summary>
/// LOT
/// </summary>
public string Lot { get; set; }
/// <summary>
/// 收貨日期
/// </summary>

42
AMESCoreStudio.WebApi/Enums/EnumPCB.cs

@ -32,6 +32,48 @@ namespace AMESCoreStudio.WebApi.Enum
}
/// <summary>
/// 錫膏狀態
/// </summary>
public enum EnumSolderPasteStatus
{
/// <summary>
/// 未使用
/// </summary>
[Display(Name = "未使用")]
N,
/// <summary>
/// 入冰箱
/// </summary>
[Display(Name = "入冰箱")]
I,
/// <summary>
/// 出冰箱
/// </summary>
[Display(Name = "出冰箱")]
O,
/// <summary>
/// 開封
/// </summary>
[Display(Name = "開封")]
U,
/// <summary>
/// 使用完
/// </summary>
[Display(Name = "使用完")]
C,
/// <summary>
/// 報廢
/// </summary>
[Display(Name = "報廢")]
X,
}
/// <summary>
/// Get Enum Display
/// </summary>

44
AMESCoreStudio.WebApi/Models/AMES/SolderPasteInfo.cs

@ -27,7 +27,6 @@ namespace AMESCoreStudio.WebApi.Models.AMES
/// <summary>
/// 錫膏編號
/// </summary>
[Required]
[Column("SOLDER_PASTE_NO")]
[StringLength(40)]
[DataMember]
@ -37,13 +36,40 @@ namespace AMESCoreStudio.WebApi.Models.AMES
/// <summary>
/// 規格描述
/// </summary>
[Required]
[Required(ErrorMessage = "{0},不能空白")]
[Column("DESCRIPTION")]
[StringLength(60)]
[DataMember]
[Display(Name = "規格描述")]
[Display(Name = "規格")]
public string Description { get; set; }
/// <summary>
/// 合金
/// </summary>
[Required(ErrorMessage = "{0},不能空白")]
[Column("ALLOY")]
[DataMember]
[Display(Name = "合金")]
public string Alloy { get; set; } = "Sn96.5/Ag3.0/Cu05";
/// <summary>
/// 廠商
/// </summary>
[Required(ErrorMessage = "{0},不能空白")]
[Column("VENDOR")]
[DataMember]
[Display(Name = "廠商")]
public string Vendor { get; set; }
/// <summary>
/// LOT
/// </summary>
[Required(ErrorMessage = "{0},不能空白")]
[Column("LOT")]
[DataMember]
[Display(Name = "LOT")]
public string Lot { get; set; }
/// <summary>
/// 收貨日期
/// </summary>
@ -76,14 +102,14 @@ namespace AMESCoreStudio.WebApi.Models.AMES
public DateTime EffectiveDate { get; set; }
/// <summary>
/// 狀態 0=失效 ; 1=有效
/// 狀態( N=未使用 ; I=入冰箱 ; O=出冰箱 ; U=開封 ; C=使用完 ; X=報廢)
/// </summary>
[Required]
[Column("STATUS")]
[StringLength(2)]
[DataMember]
[Display(Name = "狀態")]
public string Status { get; set; } = "1";
public string Status { get; set; } = "N";
/// <summary>
/// 備註
@ -94,6 +120,14 @@ namespace AMESCoreStudio.WebApi.Models.AMES
[Display(Name = "備註")]
public string Remark { get; set; }
/// <summary>
/// 工單號碼
/// </summary>
[Column("WIP_NO")]
[DataMember]
[Display(Name = "工單號碼")]
public string WipNo { get; set; }
/// <summary>
/// 建立UserID
/// </summary>

34
AMESCoreStudio.WebApi/Models/AMES/SolderPasteRecord.cs

@ -15,16 +15,10 @@ namespace AMESCoreStudio.WebApi.Models.AMES
[Table("SOLDER_PASTE_RECORD", Schema = "JHAMES")]
public partial class SolderPasteRecord
{
/// <summary>
/// 產品類別ID
/// </summary>
[Key]
[Column("SP_RECORD_ID")]
public int SpRecordID { get; set; }
/// <summary>
/// 錫膏ID
/// </summary>
[Key]
[DataMember]
[Display(Name = "錫膏ID")]
[Column("SOLDER_PASTE_ID")]
@ -33,21 +27,13 @@ namespace AMESCoreStudio.WebApi.Models.AMES
/// <summary>
/// 狀態
/// </summary>
[Key]
[DataMember]
[Display(Name = "狀態")]
[Required]
[Column("STATUS")]
[StringLength(8)]
[StringLength(2)]
public string Status { get; set; }
/// <summary>
/// 錫膏作業時間
/// </summary>
[DataMember]
[Display(Name = "錫膏作業時間")]
[Column("WORKING_TIME")]
public double WorkingTime { get; set; }
/// <summary>
/// 建立UserID
/// </summary>
@ -63,19 +49,5 @@ namespace AMESCoreStudio.WebApi.Models.AMES
[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;
}
}

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

@ -0,0 +1,58 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
using System.Runtime.Serialization;
#nullable disable
namespace AMESCoreStudio.WebApi.Models.AMES
{
/// <summary>
/// 錫膏規格流水碼表
/// </summary>
[Table("SOLDER_PASTE_SERIAL", Schema = "JHAMES")]
public partial class SolderPasteSerial
{
/// <summary>
/// 代號
/// </summary>
[Key]
[Column("SERIAL_NO")]
[DataMember]
public string SerialNo { get; set; }
/// <summary>
/// 目前流水碼
/// </summary>
[Column("SERIAL_NUMBER")]
[DataMember]
public int SerialNumber { get; set; }
/// <summary>
/// 規格
/// </summary>
[Required]
[Column("DESCRIPTION")]
[DataMember]
public string Description { get; set; }
/// <summary>
/// 合金
/// </summary>
[Required]
[Column("ALLOY")]
[DataMember]
public string Alloy { get; set; }
/// <summary>
/// 廠商
/// </summary>
[Required]
[Column("VENDOR")]
[DataMember]
public string Vendor { get; set; }
}
}
Loading…
Cancel
Save