Browse Source

1. 工單維護及條碼歷程加入中英文對照

2. 過站加入二次判斷KP重複
master
Sai 2 months ago
parent
commit
a8139117ae
  1. 157
      AMESCoreStudio.Web/Controllers/PCSController.cs
  2. 30
      AMESCoreStudio.Web/Resources/Localization/CustomStringLocalizerFactory.cs
  3. 816
      AMESCoreStudio.Web/Resources/Views/PCS/Shared.en-US.resx
  4. 816
      AMESCoreStudio.Web/Resources/Views/PCS/Shared.zh-TW.resx
  5. 13
      AMESCoreStudio.Web/Startup.cs
  6. 155
      AMESCoreStudio.Web/Views/PCS/PCS001N.cshtml
  7. 368
      AMESCoreStudio.Web/Views/PCS/PCS001R.cshtml
  8. 65
      AMESCoreStudio.Web/Views/PCS/PCS002.cshtml
  9. 498
      AMESCoreStudio.Web/Views/PCS/PCS003.cshtml
  10. 83
      AMESCoreStudio.Web/Views/PCS/PCS005.cshtml
  11. 25
      AMESCoreStudio.Web/Views/PCS/PCS009.cshtml
  12. 113
      AMESCoreStudio.Web/Views/PCS/PCS009R.cshtml
  13. 52
      AMESCoreStudio.WebApi/Controllers/BLL/BarCodeCheckNewController.cs

157
AMESCoreStudio.Web/Controllers/PCSController.cs

@ -16,7 +16,6 @@ using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Newtonsoft.Json.Bson;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
@ -50,7 +49,7 @@ namespace AMESCoreStudio.Web.Controllers
//public static int NoLength = 4;
public PCSController(ILogger<PCSController> logger, ILogger<LoginController> log, ISYS sysApi, IPCS pcsApi, IBAS basApi, IPPS ppsApi, IFQC fqcApi
, IFileServerProvider fileServerProvider, IWebHostEnvironment env, IKCS kcsApi, IStringLocalizer<SharedResource> sharedLocalizer
, IFileServerProvider fileServerProvider, IWebHostEnvironment env, IKCS kcsApi, IStringLocalizerFactory factory
, IConfiguration configuration, IBLL bllApi)
{
_logger = logger;
@ -63,7 +62,7 @@ namespace AMESCoreStudio.Web.Controllers
_kcsApi = kcsApi;
_fileServerProvider = fileServerProvider;
_env = env;
_sharedLocalizer = sharedLocalizer;
_sharedLocalizer = factory.Create("Controllers.PCS", "AMESCoreStudio.Web");
_configuration = configuration;
_bllApi = bllApi;
}
@ -82,23 +81,22 @@ namespace AMESCoreStudio.Web.Controllers
string Msg = string.Empty;
if (string.IsNullOrWhiteSpace(model.wipInfo.LineID.ToString()))
Msg += model.wipInfo.GetAttributeFrom<DisplayAttribute>(nameof(model.wipInfo.LineID)).Name + ",";
Msg += $"{_sharedLocalizer["Lineid"]},";
if (string.IsNullOrWhiteSpace(model.wipInfo.UnitNO))
Msg += model.wipInfo.GetAttributeFrom<DisplayAttribute>(nameof(model.wipInfo.UnitNO)).Name + ",";
Msg += $"{_sharedLocalizer["UnitNo"]},";
if (model.wipInfo.WipDueDate == DateTime.MinValue)
Msg += model.wipInfo.GetAttributeFrom<DisplayAttribute>(nameof(model.wipInfo.WipDueDate)).Name + ",";
Msg += $"{_sharedLocalizer["WipDueDate"]},";
if (model.wipInfo.WipScheduleDate == DateTime.MinValue)
Msg += model.wipInfo.GetAttributeFrom<DisplayAttribute>(nameof(model.wipInfo.WipScheduleDate)).Name + ",";
Msg += $"{_sharedLocalizer["WipScheduleDate"]},";
if (model.wipInfo.UnitNO == "全部" || string.IsNullOrWhiteSpace(model.wipInfo.UnitNO))
Msg += model.wipInfo.GetAttributeFrom<DisplayAttribute>(nameof(model.wipInfo.UnitNO)).Name + ",";
Msg += $"{_sharedLocalizer["UnitNo"]},";
if (model.wipInfo.PlanQTY == 0)
Msg += model.wipInfo.GetAttributeFrom<DisplayAttribute>(nameof(model.wipInfo.PlanQTY)).Name + ",";
Msg += $"{_sharedLocalizer["PlanQty"]},";
// 序號編碼sheet
// 工單新增不用判斷
@ -133,14 +131,8 @@ namespace AMESCoreStudio.Web.Controllers
}
}
//// 出貨序號
//if (string.IsNullOrWhiteSpace(model.wipBarcodeOther.StartNO) != string.IsNullOrWhiteSpace(model.wipBarcodeOther.EndNO))
//{
// Msg += ",客戶序號未填完整";
//}
if (!string.IsNullOrWhiteSpace(Msg))
Msg = "必填欄位未填寫:(" + Msg.Substring(0, (Msg.Length - 1)) + " )";
Msg = _sharedLocalizer["Error_RequiredFieldsNotFilled", Msg.TrimEnd(',')];
return Msg;
}
@ -183,20 +175,20 @@ namespace AMESCoreStudio.Web.Controllers
string.IsNullOrWhiteSpace(model.Fw))
{
if (string.IsNullOrWhiteSpace(model.Engineer))
Msg += model.GetAttributeFrom<DisplayAttribute>(nameof(model.Engineer)).Name + ",";
Msg += $"{_sharedLocalizer["Engineer"]},";
// 1 N/A , 4 備註說明
if (string.IsNullOrWhiteSpace(model.Bios) && model.BiosType != 1 && model.BiosType != 4)
Msg += model.GetAttributeFrom<DisplayAttribute>(nameof(model.Bios)).Name + ",";
Msg += $"{_sharedLocalizer["Bios"]},";
if (string.IsNullOrWhiteSpace(model.Ec) && model.ECType != 1 && model.ECType != 4)
Msg += model.GetAttributeFrom<DisplayAttribute>(nameof(model.Ec)).Name + ",";
Msg += $"EC,";
if (string.IsNullOrWhiteSpace(model.Fw) && model.FWType != 1 && model.FWType != 4)
Msg += model.GetAttributeFrom<DisplayAttribute>(nameof(model.Fw)).Name + ",";
Msg += $"FW,";
if (string.IsNullOrWhiteSpace(model.BiRatio.ToString()))
Msg += model.GetAttributeFrom<DisplayAttribute>(nameof(model.BiRatio)).Name + ",";
Msg += $"{_sharedLocalizer["BIRatio"]},";
}
}
return Msg;
@ -236,29 +228,28 @@ namespace AMESCoreStudio.Web.Controllers
model.PartsBake == 999)
{
if (string.IsNullOrWhiteSpace(model.BiRatio.ToString()))
Msg += model.GetAttributeFrom<DisplayAttribute>(nameof(model.BiRatio)).Name + ",";
Msg += $"{_sharedLocalizer["BIRatio"]},";
if (string.IsNullOrWhiteSpace(model.PartsBakeTime.ToString()))
Msg += model.GetAttributeFrom<DisplayAttribute>(nameof(model.PartsBakeTime)).Name + ",";
Msg += $"{_sharedLocalizer["PartsBakeTime"]},";
if (model.PartsBake == 999 && model.PartsBakeOther == 0)
Msg += "零件烘烤-其他溫度" + ",";
Msg += $"{_sharedLocalizer["PartsBakeTemperature"]}-{_sharedLocalizer["PartsBakeOther"]},";
if (string.IsNullOrWhiteSpace(model.BiosVer))
Msg += model.GetAttributeFrom<DisplayAttribute>(nameof(model.BiosVer)).Name + ",";
Msg += $"{_sharedLocalizer["BiosVer"]},";
if (string.IsNullOrWhiteSpace(model.BiTemperature))
Msg += model.GetAttributeFrom<DisplayAttribute>(nameof(model.BiTemperature)).Name + ",";
Msg += $"{_sharedLocalizer["BITemperature"]},";
if (string.IsNullOrWhiteSpace(model.BiTime))
Msg += model.GetAttributeFrom<DisplayAttribute>(nameof(model.BiTime)).Name + ",";
Msg += $"{_sharedLocalizer["BITime"]},";
if (string.IsNullOrWhiteSpace(model.Checksum))
Msg += model.GetAttributeFrom<DisplayAttribute>(nameof(model.Checksum)).Name + ",";
Msg += $"{_sharedLocalizer["CheckSum"]},";
if (string.IsNullOrWhiteSpace(model.BurnLocation))
Msg += model.GetAttributeFrom<DisplayAttribute>(nameof(model.BurnLocation)).Name + ",";
Msg += $"{_sharedLocalizer["BurnLocation"]},";
}
}
return Msg;
@ -1678,7 +1669,7 @@ namespace AMESCoreStudio.Web.Controllers
if (wipInfoCopyItem == null)
{
await WipDataSelectAll();
ModelState.AddModelError("error", $"工單號碼【{model.wipInfo.WipNO}】找不到該生產單位已建立資料,請在確認");
ModelState.AddModelError("error", _sharedLocalizer["Error_WorkOrder_UnitNotFound", model.wipInfo.WipNO]);
return View("PCS001N", model);
}
@ -1686,7 +1677,7 @@ namespace AMESCoreStudio.Web.Controllers
if (model.wipInfo.UnitNO == "P" || model.wipInfo.UnitNO == "O")
{
await WipDataSelectAll();
ModelState.AddModelError("error", $"生產單位【為包裝單位】無法複製工單資料");
ModelState.AddModelError("error", _sharedLocalizer["Error_Unit_CopyNotAllowed", "包裝單位"]);
return View("PCS001N", model);
}
@ -1713,7 +1704,7 @@ namespace AMESCoreStudio.Web.Controllers
// 判斷是否有開重複 工單+生產單位+線別
if (wipInfoQuery.Where(w => w.UnitNO == model.wipInfo.UnitNO && w.LineID == model.wipInfo.LineID).Any())
{
ModelState.AddModelError("error", $"工單號碼【{model.wipInfo.WipNO}】已有相同生產單位、線別重複建立,請在確認");
ModelState.AddModelError("error", _sharedLocalizer["Error_WorkOrder_Duplicate", model.wipInfo.WipNO]);
model.wipInfo.ECNCheck = model.wipInfo.ECNCheck == "Y" ? "true" : "false";
model.wipInfo.ModelCheck = model.wipInfo.ModelCheck == "Y" ? "true" : "false";
model.wipInfo.InputFlag = model.wipInfo.InputFlag == "Y" ? "true" : "false";
@ -1726,6 +1717,7 @@ namespace AMESCoreStudio.Web.Controllers
// 有包裝生產單位不能再新增一筆了
if (wipInfoQuery.Where(w => w.UnitNO == "P" || w.UnitNO == "O").Any())
{
if (model.wipInfo.UnitNO == "P" || model.wipInfo.UnitNO == "O")
{
model.wipInfo.ECNCheck = model.wipInfo.ECNCheck == "Y" ? "true" : "false";
@ -1735,7 +1727,7 @@ namespace AMESCoreStudio.Web.Controllers
model.wipInfo.CustomerMedical = model.wipInfo.CustomerMedical == "Y" ? "true" : "false";
model.wipInfo.CustomerVIP = model.wipInfo.CustomerVIP == "Y" ? "true" : "false";
model.wipInfo.SFISFlowCk = model.wipInfo.SFISFlowCk == "Y" ? "true" : "false";
ModelState.AddModelError("error", $"該筆工單號碼已經有產生【包裝單位】,不能再建立了");
ModelState.AddModelError("error", _sharedLocalizer["Error_WorkOrder_UnitAlreadyExists", "包裝單位"]);
return View("PCS001N", model);
}
}
@ -1760,7 +1752,7 @@ namespace AMESCoreStudio.Web.Controllers
{
if (model.WipKps.Where(w => w.WipKpID != -1).GroupBy(g => g.KpSeq).Where(w => w.Count() > 1).Any())
{
Msg += ",KeyParts 順序有重複 ";
Msg += $",{_sharedLocalizer["Error_KeyParts_DuplicateOrder"]} ";
}
// KP料號正確
var kpNameArray = model.WipKps.Where(w => w.WipKpID != -1).Select(s => s.KpName).Distinct().ToList();
@ -1768,7 +1760,7 @@ namespace AMESCoreStudio.Web.Controllers
{
if (_pcsApi.GetPlmMeterialInfo(item.Trim().ToUpper()).InvokeAsync().Result.Count == 0)
{
Msg += $",KP料號名稱【{item}】在PLM料號檔找不到 ";
Msg += $",{_sharedLocalizer["Error_KeyParts_NotFoundInPLM", item]} ";
}
}
}
@ -1781,19 +1773,6 @@ namespace AMESCoreStudio.Web.Controllers
{
// 判斷MAC是否正確
Msg += CheckMACData(CreateMac, model.wipInfo.UnitNO);
// 取消數量判斷
//var q = await _pcsApi.GetMACInfo(model.wipAtt.ItemNO);
//var MacQty = q == null ? 2 : q.Qty;
//var result_wipMac = await _pcsApi.GetWipMAC(model.wipInfo.WipNO);
//if (result_wipMac.Sum(s => s.Qty) >= model.wipInfo.PlanQTY * MacQty)
//{
// Msg += ",該筆工單已取滿MAC數量,請在確認";
//}
//else
//{
// // 判斷MAC是否正確
// Msg += CheckMACData(CreateMac, model.wipInfo.UnitNO);
//}
}
// 判斷出貨序號是否錯誤
@ -2064,7 +2043,7 @@ namespace AMESCoreStudio.Web.Controllers
if (result.Success)
{
ModelState.Clear();
ModelState.AddModelError("error", "新增成功!");
ModelState.AddModelError("error", _sharedLocalizer["Success_Created"]);
var viewModel = new WipDataViewModel();
return View(viewModel);
}
@ -2226,28 +2205,28 @@ namespace AMESCoreStudio.Web.Controllers
// 判斷工單號碼是否已經投入
if (await _pcsApi.GetWipInfoCheckStart(q.FirstOrDefault().WipNO, q.FirstOrDefault().UnitNO, q.FirstOrDefault().LineID) == "Y")
{
var _msg = "工單號碼【" + q.FirstOrDefault().WipNO + "】,已開始投入,不可修改!";
var _msg = _sharedLocalizer["Error_WorkOrder_InProgress", q.FirstOrDefault().WipNO];
return RedirectToAction("Refresh", "Home", new { msg = _msg });
}
// 判斷工單號碼是否已經開線
if (await _pcsApi.GetWipInfoCheckStartLine(q.FirstOrDefault().WipNO, q.FirstOrDefault().UnitNO, q.FirstOrDefault().LineID) == "Y")
{
var _msg = "工單號碼【" + q.FirstOrDefault().WipNO + "】,已開線,不可修改!";
var _msg = _sharedLocalizer["Error_WorkOrder_LineStarted", q.FirstOrDefault().WipNO];
return RedirectToAction("Refresh", "Home", new { msg = _msg });
}
// 判斷是否完工
if (q.Where(w => w.StatusNO == "E").Any())
{
var _msg = "工單號碼【" + q.FirstOrDefault().WipNO + "】,已經投入完工,不可修改";
var _msg = _sharedLocalizer["Error_WorkOrder_Completed", q.FirstOrDefault().WipNO];
return RedirectToAction("Refresh", "Home", new { msg = _msg });
}
// 判斷是否刪除
if (q.Where(w => w.StatusNO == "C").Any())
{
var _msg = "工單號碼【" + q.FirstOrDefault().WipNO + "】,已刪除,不可修改";
var _msg = _sharedLocalizer["Error_WorkOrder_Deleted", q.FirstOrDefault().WipNO];
return RedirectToAction("Refresh", "Home", new { msg = _msg });
}
@ -2433,7 +2412,7 @@ namespace AMESCoreStudio.Web.Controllers
{
// 判斷是否有開重複 工單+生產單位+線別
if (wipInfoQuery.Where(w => w.WipID != model.wipInfo.WipID && w.LineID == model.wipInfo.LineID).Any())
Msg += ",該線別已有建立相同工單號碼了,請在確認";
Msg += $",{_sharedLocalizer["Error_WorkOrder_DuplicateForLine"]} ";
}
// 判斷出貨序號是否錯誤
@ -2447,7 +2426,7 @@ namespace AMESCoreStudio.Web.Controllers
{
if (model.WipKps.Where(w => w.WipKpID != -1).GroupBy(g => g.KpSeq).Where(w => w.Count() > 1).Any())
{
Msg += ",KeyParts 順序有重複 ";
Msg += $",{_sharedLocalizer["Error_KeyParts_DuplicateOrder"]} ";
}
// KP料號正確
var kpNameArray = model.WipKps.Where(w => w.WipKpID != -1).Select(s => s.KpName).Distinct().ToList();
@ -2455,7 +2434,7 @@ namespace AMESCoreStudio.Web.Controllers
{
if (_pcsApi.GetPlmMeterialInfo(item.Trim().ToUpper()).InvokeAsync().Result.Count == 0)
{
Msg += $",KP料號名稱【{item}】在PLM料號檔找不到 ";
Msg += $",{_sharedLocalizer["Error_KeyParts_NotFoundInPLM", item]} ";
}
}
}
@ -2463,13 +2442,13 @@ namespace AMESCoreStudio.Web.Controllers
// 判斷SOP是否沒填文件名稱
if (model.WipSops.Where(w => string.IsNullOrWhiteSpace(w.SOPName) && w.WipSOPID != -1).Any())
{
Msg += ",SOP文件 請填寫SOP文件敘述 ";
Msg += $",{_sharedLocalizer["Error_SOP_DescriptionRequired"]} ";
}
// 判斷標籤 工單性質選擇 WipAttr非標96工單時,則旁邊欄位必填
if (model.wipLabel.WipAttr == "B" && string.IsNullOrWhiteSpace(model.wipLabel.NonstandardWoMemo))
{
Msg += ",標籤:工單性質選擇非標96工單時,需填入資料";
Msg += $",{_sharedLocalizer["Error_WorkOrder_NonStandard96Required"]} ";
}
// 判斷治具中生產單位與作業站吻合
@ -2482,7 +2461,7 @@ namespace AMESCoreStudio.Web.Controllers
if (!RuleStation.Where(w => Outfits.StationID == w.StationID).Any())
{
Msg += ",治具組合中生產單位與作業站不匹配";
Msg += $",{_sharedLocalizer["Error_Fixture_MismatchUnitAndStation"]} ";
}
}
}
@ -2495,19 +2474,6 @@ namespace AMESCoreStudio.Web.Controllers
{
// 判斷MAC是否正確
Msg += CheckMACData(CreateMac, model.wipInfo.UnitNO);
// 取消數量判斷
//var q = await _pcsApi.GetMACInfo(model.wipAtt.ItemNO);
//var MacQty = q == null ? 2 : q.Qty;
//var result_wipMac = await _pcsApi.GetWipMAC(model.wipInfo.WipNO);
//if (result_wipMac.Sum(s => s.Qty) >= model.wipInfo.PlanQTY * MacQty)
//{
// Msg += ",該筆工單已取滿MAC數量,請在確認";
//}
//else
//{
// // 判斷MAC是否正確
// Msg += CheckMACData(CreateMac, model.wipInfo.UnitNO);
//}
}
if (!string.IsNullOrWhiteSpace(Msg))
@ -2525,7 +2491,7 @@ namespace AMESCoreStudio.Web.Controllers
if (!string.IsNullOrWhiteSpace(WipExecuteMsg))
{
ModelState.AddModelError("error", $"修改失敗,錯誤訊息:{WipExecuteMsg}");
ModelState.AddModelError("error", _sharedLocalizer["Error_Modification_Failed", WipExecuteMsg]);
return View("PCS003", model);
}
@ -2556,13 +2522,12 @@ namespace AMESCoreStudio.Web.Controllers
model.wipMACs = await _pcsApi.GetWipMAC(model.wipInfo.WipNO);
model.wipInfoBlobs = await _pcsApi.GetWipInfoBlob(model.wipInfo.WipNO);
var _msg = "修改成功!";
ModelState.AddModelError("error", _msg);
ModelState.AddModelError("error", _sharedLocalizer["Success_Modification_Successful"]);
return View("PCS003", model);
}
catch (Exception ex)
{
ModelState.AddModelError("error", "系統錯誤,錯誤訊息:" + ex.Message);
ModelState.AddModelError("error", _sharedLocalizer["Error_System_Generic", ex.Message]);
return View("PCS003", model);
}
}
@ -3005,7 +2970,6 @@ namespace AMESCoreStudio.Web.Controllers
GetWipBI_OSSelect();
// SOP Type
GetSOPTypeSelect();
}
/// <summary>
@ -3017,21 +2981,20 @@ namespace AMESCoreStudio.Web.Controllers
public string CheckMACData(List<WipMAC> wipMacs, string unit)
{
var Msg = string.Empty;
var pp = string.Empty;
var Unit = string.Empty;
var PcbUnitNo = new List<string> { "D", "I", "P", "S" };
var SystemUnitNo = new List<string> { "B", "O", "T" };
if (PcbUnitNo.Contains(unit))
{
pp = "PCB";
Unit = "PCB";
}
else if (SystemUnitNo.Contains(unit))
{
pp = "SYSTEM";
Unit = "SYSTEM";
}
foreach (var item in wipMacs)
{
// 當前值 16 進位
@ -3039,7 +3002,7 @@ namespace AMESCoreStudio.Web.Controllers
try
{
if (item.StartNO.Length != 12 || item.EndNO.Length != 12)
Msg += $",【{item.StartNO.ToUpper()}】與【{item.EndNO.ToUpper()}】MAC區間長度不足12碼,請在確認";
Msg += $",{_sharedLocalizer["Error_MAC_RangeLengthInvalid", item.StartNO.ToUpper(), item.EndNO.ToUpper()]}";
else
{
var Title = item.StartNO.Substring(0, 6).ToUpper().Trim();
@ -3049,29 +3012,28 @@ namespace AMESCoreStudio.Web.Controllers
int Max = (int.Parse(Entire.DecHex(End, "HexToDec")));
if (Max < Min)
Msg += $",【{item.StartNO.ToUpper()}】與【{item.EndNO.ToUpper()}】區間設定有誤";
Msg += $",{_sharedLocalizer["Error_MAC_RangeInvalid", item.StartNO.ToUpper(), item.EndNO.ToUpper()]}";
else if (item.StartNO.ToUpper().Substring(0, 6) != item.EndNO.ToUpper().Substring(0, 6))
Msg += $",【{item.StartNO.ToUpper()}】與【{item.EndNO.ToUpper()}】前綴不一樣";
Msg += $",{_sharedLocalizer["Error_MAC_PrefixMismatch", item.StartNO.ToUpper(), item.EndNO.ToUpper()]}";
else
{
var MacInfos = _pcsApi.GetMACInfoByTitle(Title).InvokeAsync().Result;
if (MacInfos.Where(w => (string.Compare(w.Min, Start) <= 0 && string.Compare(Start, w.Max) <= 0) ||
(string.Compare(w.Min, End) <= 0 && string.Compare(End, w.Max) <= 0)).Any())
Msg += $",【{item.StartNO.ToUpper()}】與【{item.EndNO.ToUpper()}】已有設定自動MAC區間內,請確認";
Msg += $",{_sharedLocalizer["Error_MAC_RangeAlreadyAssigned", item.StartNO.ToUpper(), item.EndNO.ToUpper()]}";
// 判斷MAC區間是否有重複使用
// 場亨新增 因為前後段MAC會重複,所以切開板卡與板卡 系統與系統判斷
var result = _pcsApi.GetCheckMAC(item.StartNO.ToUpper(), item.EndNO.ToUpper(), pp).InvokeAsync().Result;
var result = _pcsApi.GetCheckMAC(item.StartNO.ToUpper(), item.EndNO.ToUpper(), Unit).InvokeAsync().Result;
if (!result.Success)
Msg += $",【{item.StartNO.ToUpper()}】與【{item.EndNO.ToUpper()}】區間已有重複,請確認";
Msg += $",{_sharedLocalizer["Error_MAC_RangeDuplicate", item.StartNO.ToUpper(), item.EndNO.ToUpper()]}";
}
}
}
catch (Exception ex)
{
return $",MAC區間轉換錯誤:{ex.Message},請確認數值填寫是否正確";
return $",{_sharedLocalizer["Error_MAC_ConversionFailed", ex.Message]}";
}
}
return Msg;
}
@ -3212,7 +3174,7 @@ namespace AMESCoreStudio.Web.Controllers
}
else
{
Msg += $"找不到【{data.Cell(i, j).Value.ToString()}】相關KeyParts代號</br>";
Msg += _sharedLocalizer["Error_KeyParts_CodeNotFound", data.Cell(i, j).Value.ToString()];
}
break;
case 3: // 前置碼
@ -3223,7 +3185,7 @@ namespace AMESCoreStudio.Web.Controllers
{
if (!int.TryParse(data.Cell(i, j).Value.ToString(), out _))
{
Msg += $"【{data.Cell(i, j).Value.ToString()}】長度格式錯誤</br>";
Msg += _sharedLocalizer["Error_KeyParts_LengthFormatInvalid", data.Cell(i, j).Value.ToString()];
}
wipKpDto.Length = int.Parse(data.Cell(i, j).Value.ToString());
}
@ -3237,7 +3199,7 @@ namespace AMESCoreStudio.Web.Controllers
}
else
{
Msg += $"找不到【{data.Cell(i, j).Value}】相關生產單位名稱</br>";
Msg += _sharedLocalizer["Error_KeyParts_ProductionUnitNameNotFound", data.Cell(i, j).Value.ToString()];
}
break;
case 6: // kp數量
@ -3245,7 +3207,7 @@ namespace AMESCoreStudio.Web.Controllers
{
if (!int.TryParse(data.Cell(i, j).Value.ToString(), out _))
{
Msg += $"【{data.Cell(i, j).Value.ToString()}】KP數量格式錯誤</br>";
Msg += _sharedLocalizer["Error_KeyParts_KPQuantityFormatInvalid", data.Cell(i, j).Value.ToString()];
}
for (int x = 1; x <= int.Parse(data.Cell(i, j).Value.ToString()); x++)
@ -3266,7 +3228,7 @@ namespace AMESCoreStudio.Web.Controllers
}
else
{
Msg += $"請輸入KP數量</br>";
Msg += _sharedLocalizer["Error_KeyParts_EnterKPQuantity"];
}
break;
}
@ -3992,7 +3954,6 @@ namespace AMESCoreStudio.Web.Controllers
[HttpPost]
public async Task<IActionResult> PCS006AAsync(WipInfo wipInfo)
{
await GetLineInfo(wipInfo.UnitNO);
// 判斷是否有開重複工單+生產單位
@ -4005,7 +3966,6 @@ namespace AMESCoreStudio.Web.Controllers
ModelState.AddModelError("error", "該線別已有在相同工單建立了");
return View(wipInfo);
}
}
IResultModel result;
@ -7048,7 +7008,6 @@ namespace AMESCoreStudio.Web.Controllers
#endregion
//修改页面
[HttpGet]
public async Task<IActionResult> BAS001UAsync(int id)

30
AMESCoreStudio.Web/Resources/Localization/CustomStringLocalizerFactory.cs

@ -0,0 +1,30 @@
using Microsoft.Extensions.Localization;
using System;
namespace AMESCoreStudio.Web.Resources.Localization
{
public class CustomStringLocalizerFactory : IStringLocalizerFactory
{
private readonly IStringLocalizerFactory _baseFactory;
public CustomStringLocalizerFactory(IStringLocalizerFactory baseFactory)
{
_baseFactory = baseFactory;
}
public IStringLocalizer Create(Type resourceSource)
{
return _baseFactory.Create(resourceSource);
}
public IStringLocalizer Create(string baseName, string location)
{
// 自訂邏輯:如果是 Views.PCS,或是 Controllers.PCS,使用 Shared 資源
if (baseName.Contains("Views.PCS") || baseName.Contains("Controllers.PCS"))
{
baseName = "Views.PCS.Shared";
}
return _baseFactory.Create(baseName, location);
}
}
}

816
AMESCoreStudio.Web/Resources/Views/PCS/Shared.en-US.resx

@ -0,0 +1,816 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="WipNo" xml:space="preserve">
<value>Work Order Number</value>
</data>
<data name="PlanQty" xml:space="preserve">
<value>Planned Quantity</value>
</data>
<data name="CompleteQty" xml:space="preserve">
<value>First Station Completed Quantity</value>
</data>
<data name="WipSeq" xml:space="preserve">
<value>Work Order Number</value>
</data>
<data name="ItemNo" xml:space="preserve">
<value>Engineering Number</value>
</data>
<data name="WipType" xml:space="preserve">
<value>Work Order Type</value>
</data>
<data name="ProductTypeid" xml:space="preserve">
<value>Product Category</value>
</data>
<data name="Werks" xml:space="preserve">
<value>Factory/Outsourcing Factory</value>
</data>
<data name="WerksNo" xml:space="preserve">
<value>Outsourcing Factory Number</value>
</data>
<data name="CustomerType" xml:space="preserve">
<value>Customer Category</value>
</data>
<data name="Medical" xml:space="preserve">
<value>Medical</value>
</data>
<data name="VIP" xml:space="preserve">
<value>VIP</value>
</data>
<data name="CustomerNo" xml:space="preserve">
<value>Customer Name</value>
</data>
<data name="CustomerItemNo" xml:space="preserve">
<value>Finished Product Part Number</value>
</data>
<data name="CustomerWipNo" xml:space="preserve">
<value>Customer Work Order</value>
</data>
<data name="UnitNo" xml:space="preserve">
<value>Production Unit</value>
</data>
<data name="Lineid" xml:space="preserve">
<value>Line Number</value>
</data>
<data name="RelatedWoNo" xml:space="preserve">
<value>Related Work Order</value>
</data>
<data name="OrderNo" xml:space="preserve">
<value>Customer Order</value>
</data>
<data name="WipRemarks" xml:space="preserve">
<value>Work Order Remarks</value>
</data>
<data name="WipDescription" xml:space="preserve">
<value>Model Description</value>
</data>
<data name="WipModelCheckName" xml:space="preserve">
<value>Mixed_Line_Input_Machine</value>
</data>
<data name="WipEcnCheckName" xml:space="preserve">
<value>Mixed_Line_Input_ECN_Check</value>
</data>
<data name="WipPriorityName" xml:space="preserve">
<value>Online_Forced_Work_Order</value>
</data>
<data name="WipInputFlag" xml:space="preserve">
<value>Determine if Pre-process has Started</value>
</data>
<data name="ModelName" xml:space="preserve">
<value>Model Name</value>
</data>
<data name="WipProcess" xml:space="preserve">
<value>Work Order Nature</value>
</data>
<data name="WipSide" xml:space="preserve">
<value>SMD Production Priority</value>
</data>
<data name="WipBoards" xml:space="preserve">
<value>Number of Panelized Boards</value>
</data>
<data name="WipBoxCnt" xml:space="preserve">
<value>Quantity per Box</value>
</data>
<data name="BomDate" xml:space="preserve">
<value>BOM Date</value>
</data>
<data name="ECN" xml:space="preserve">
<value>ECN</value>
</data>
<data name="EAN" xml:space="preserve">
<value>EAN</value>
</data>
<data name="WipScheduleDate" xml:space="preserve">
<value>Estimated Start Date</value>
</data>
<data name="WipDueDate" xml:space="preserve">
<value>Estimated Completion Date</value>
</data>
<data name="SerialNumber" xml:space="preserve">
<value>SerialNumber</value>
</data>
<data name="StartingSerialNumber" xml:space="preserve">
<value>Starting Serial Number</value>
</data>
<data name="EndingSerialNumber" xml:space="preserve">
<value>Ending Serial Number</value>
</data>
<data name="ShipmentSerialNumber" xml:space="preserve">
<value>Shipment Serial Number</value>
</data>
<data name="AddShipmentSerialNumber" xml:space="preserve">
<value>Add Shipment Serial Number</value>
</data>
<data name="StartingShipmentSerialNumber" xml:space="preserve">
<value>Starting Shipment Serial Number</value>
</data>
<data name="EndingShipmentSerialNumber" xml:space="preserve">
<value>Ending Shipment Serial Number</value>
</data>
<data name="Increment" xml:space="preserve">
<value>Increment</value>
</data>
<data name="SequentialNumber" xml:space="preserve">
<value>Sequential Number</value>
</data>
<data name="RemoveTailDigits" xml:space="preserve">
<value>Remove Tail Digits</value>
</data>
<data name="DuplicateCheck" xml:space="preserve">
<value>Duplicate Check</value>
</data>
<data name="Delete" xml:space="preserve">
<value>Delete</value>
</data>
<data name="Yes" xml:space="preserve">
<value>Yes</value>
</data>
<data name="No" xml:space="preserve">
<value>No</value>
</data>
<data name="MAC" xml:space="preserve">
<value>MAC</value>
</data>
<data name="AddMACAddress" xml:space="preserve">
<value>Add MAC Address</value>
</data>
<data name="AutoGenerateMAC" xml:space="preserve">
<value>Auto Generate MAC</value>
</data>
<data name="StartingMACAddress" xml:space="preserve">
<value>Starting MAC Address</value>
</data>
<data name="EndingMACAddress" xml:space="preserve">
<value>Ending MAC Address</value>
</data>
<data name="Add" xml:space="preserve">
<value>Add</value>
</data>
<data name="KeypartsGrouping" xml:space="preserve">
<value>Keyparts Grouping</value>
</data>
<data name="FileUpload" xml:space="preserve">
<value>FileUpload</value>
</data>
<data name="KeypartsPartName" xml:space="preserve">
<value>KeypartsPartName</value>
</data>
<data name="KeypartsPartNumber" xml:space="preserve">
<value>KeypartsPartNumber</value>
</data>
<data name="Sequence" xml:space="preserve">
<value>Sequence</value>
</data>
<data name="PrefixCode" xml:space="preserve">
<value>Prefix Code</value>
</data>
<data name="StringLength" xml:space="preserve">
<value>String Length</value>
</data>
<data name="IsRepeatable" xml:space="preserve">
<value>Is Repeatable</value>
</data>
<data name="NotInProduction" xml:space="preserve">
<value>Not in Production</value>
</data>
<data name="ProcessConfirmation" xml:space="preserve">
<value>Process Confirmation</value>
</data>
<data name="WorkProcessNotes" xml:space="preserve">
<value>Work Process Notes</value>
</data>
<data name="Engineer" xml:space="preserve">
<value>Project Engineer</value>
</data>
<data name="Name" xml:space="preserve">
<value>Name</value>
</data>
<data name="WithStandardMaintenanceHours" xml:space="preserve">
<value>With Standard Maintenance Hours</value>
</data>
<data name="WithoutStandardMaintenanceHours" xml:space="preserve">
<value>**Without Standard Maintenance Hours**</value>
</data>
<data name="SMD" xml:space="preserve">
<value>SMD Red Glue Application</value>
</data>
<data name="SMDRemarks" xml:space="preserve">
<value>SMD Red Glue Remarks</value>
</data>
<data name="SMDSolderMa" xml:space="preserve">
<value>SMD Solder Resist Application</value>
</data>
<data name="SMDSMRemarks" xml:space="preserve">
<value>SMD Solder Mask Remarks</value>
</data>
<data name="DIP" xml:space="preserve">
<value>DIP</value>
</data>
<data name="DIPCarrier" xml:space="preserve">
<value>CARRIER</value>
</data>
<data name="DIPRemarks" xml:space="preserve">
<value>DIPRemarks</value>
</data>
<data name="DIPTape" xml:space="preserve">
<value>Apply Adhesive Tape</value>
</data>
<data name="DIPSolderMask" xml:space="preserve">
<value>Solder Mask Dot</value>
</data>
<data name="Burn" xml:space="preserve">
<value>Burn</value>
</data>
<data name="BurnLocation" xml:space="preserve">
<value>BurnLocation</value>
</data>
<data name="BurnedIn" xml:space="preserve">
<value>BurnedIn</value>
</data>
<data name="BurnRemarks" xml:space="preserve">
<value>BurnRemarks</value>
</data>
<data name="PartsBake" xml:space="preserve">
<value>PartsBake</value>
</data>
<data name="ISPartsBake" xml:space="preserve">
<value>ISPartsBake</value>
</data>
<data name="PartsBakeTemperature" xml:space="preserve">
<value>PartsBakeTemperature</value>
</data>
<data name="PartsBakeOther" xml:space="preserve">
<value>PartsBakeTemperatureOther</value>
</data>
<data name="PartsBakeTime" xml:space="preserve">
<value>PartsBakeTime</value>
</data>
<data name="Hours" xml:space="preserve">
<value>Hours</value>
</data>
<data name="PartsBakeOvertime" xml:space="preserve">
<value>PartsBake_Over_48_Hours</value>
</data>
<data name="PartsBakeRemarks" xml:space="preserve">
<value>PartsBakeRemarks</value>
</data>
<data name="PCBItemNo" xml:space="preserve">
<value>PCB Part Number</value>
</data>
<data name="ISPCBBake" xml:space="preserve">
<value>ISPCB Bake</value>
</data>
<data name="PCBBake" xml:space="preserve">
<value>PCB Baking</value>
</data>
<data name="PCBBakeRemarks" xml:space="preserve">
<value>PCB Baking Remarks</value>
</data>
<data name="SolderPaste" xml:space="preserve">
<value>Solder Paste</value>
</data>
<data name="SolderPasteRemarks" xml:space="preserve">
<value>Solder Paste Remarks</value>
</data>
<data name="PCBProcessing" xml:space="preserve">
<value>PCB Processing</value>
</data>
<data name="PCBProcessingRemarks" xml:space="preserve">
<value>PCB Processing Remarks</value>
</data>
<data name="BIRatio" xml:space="preserve">
<value>Burn-In Ratio</value>
</data>
<data name="BITemperature" xml:space="preserve">
<value>Burn-In Temperature</value>
</data>
<data name="BITime" xml:space="preserve">
<value>Burn-In Time</value>
</data>
<data name="BIRemarks" xml:space="preserve">
<value>Burn-In Remarks</value>
</data>
<data name="BiosVer" xml:space="preserve">
<value>BIOS Version</value>
</data>
<data name="BiosRemarks" xml:space="preserve">
<value>BIOS Remarks</value>
</data>
<data name="CheckSum" xml:space="preserve">
<value>Check Sum</value>
</data>
<data name="CheckSumRemarks" xml:space="preserve">
<value>Check Sum Remarks</value>
</data>
<data name="PowerMode" xml:space="preserve">
<value>Power Mode</value>
</data>
<data name="PLMMemo" xml:space="preserve">
<value>PLM Production Remarks</value>
</data>
<data name="BISoftware" xml:space="preserve">
<value>Burn-in Software</value>
</data>
<data name="UpdateBI" xml:space="preserve">
<value>Update Burn-in Information</value>
</data>
<data name="Bios" xml:space="preserve">
<value>BIOS</value>
</data>
<data name="OsVer" xml:space="preserve">
<value>OS Version</value>
</data>
<data name="CPU" xml:space="preserve">
<value>CPU</value>
</data>
<data name="RAM" xml:space="preserve">
<value>RAM</value>
</data>
<data name="FinePackage" xml:space="preserve">
<value>ISPremium package</value>
</data>
<data name="DMIBI" xml:space="preserve">
<value>DMI Burn-in</value>
</data>
<data name="DMIBIRemarks" xml:space="preserve">
<value>DMI Burn-in Instructions</value>
</data>
<data name="Jumper" xml:space="preserve">
<value>JUMPER</value>
</data>
<data name="BabMemo" xml:space="preserve">
<value>Bab Remarks</value>
</data>
<data name="TestMemo" xml:space="preserve">
<value>Test Remarks</value>
</data>
<data name="PackingMemo" xml:space="preserve">
<value>Packaging Remarks</value>
</data>
<data name="ProcessStation" xml:space="preserve">
<value>Process Station</value>
</data>
<data name="FixtureType" xml:space="preserve">
<value>Fixture Type</value>
</data>
<data name="SOPType" xml:space="preserve">
<value>SOP Type</value>
</data>
<data name="SOPVer" xml:space="preserve">
<value>SOP Version</value>
</data>
<data name="SOPName" xml:space="preserve">
<value>SOP Description</value>
</data>
<data name="PrintMode" xml:space="preserve">
<value>Printing Method</value>
</data>
<data name="PrintPage" xml:space="preserve">
<value>Print Quantity</value>
</data>
<data name="Sheet" xml:space="preserve">
<value>Sheet</value>
</data>
<data name="ApproveLogo" xml:space="preserve">
<value>Certification Logo</value>
</data>
<data name="CompanyLogo" xml:space="preserve">
<value>Company Logo</value>
</data>
<data name="WipAtt" xml:space="preserve">
<value>Work Order Attributes</value>
</data>
<data name="Remarks" xml:space="preserve">
<value>Remarks</value>
</data>
<data name="Preview" xml:space="preserve">
<value>Preview</value>
</data>
<data name="FileName" xml:space="preserve">
<value>File Name</value>
</data>
<data name="FilePath" xml:space="preserve">
<value>File Path</value>
</data>
<data name="File" xml:space="preserve">
<value>File</value>
</data>
<data name="FileRemarks" xml:space="preserve">
<value>File Remarks</value>
</data>
<data name="DownLoad" xml:space="preserve">
<value>DownLoad</value>
</data>
<data name="Confirmed" xml:space="preserve">
<value>Confirmed</value>
</data>
<data name="EngineeringConfirmation" xml:space="preserve">
<value>Engineering Confirmation</value>
</data>
<data name="Save" xml:space="preserve">
<value>Save</value>
</data>
<data name="PreviewUpLoadItem" xml:space="preserve">
<value>Preview can only display image files, PDFs, and text files</value>
</data>
<data name="KeypartItemName" xml:space="preserve">
<value>Keypart Combination</value>
</data>
<data name="SerialNumberItemName" xml:space="preserve">
<value>Serial Number Code</value>
</data>
<data name="ProductionItemName" xml:space="preserve">
<value>Production Process</value>
</data>
<data name="BoardItemName" xml:space="preserve">
<value>Board - Engineering Information</value>
</data>
<data name="SystemItemName" xml:space="preserve">
<value>Engineering Information</value>
</data>
<data name="FixtureItemName" xml:space="preserve">
<value>Fixture Combination</value>
</data>
<data name="SopItemName" xml:space="preserve">
<value>SOP Document</value>
</data>
<data name="LabelItemName" xml:space="preserve">
<value>Label Options</value>
</data>
<data name="UploadFileItemName" xml:space="preserve">
<value>Upload File</value>
</data>
<data name="PCS002" xml:space="preserve">
<value>Work Order Data Modification</value>
</data>
<data name="Edit" xml:space="preserve">
<value>Edit</value>
</data>
<data name="View" xml:space="preserve">
<value>View</value>
</data>
<data name="Action" xml:space="preserve">
<value>Action</value>
</data>
<data name="FQCDate" xml:space="preserve">
<value>Inspection Completion Date</value>
</data>
<data name="StartDate" xml:space="preserve">
<value>Start Date</value>
</data>
<data name="SendNotification" xml:space="preserve">
<value>Send Notification</value>
</data>
<data name="PCS001R" xml:space="preserve">
<value>View Work Order Data</value>
</data>
<data name="DeleteOk" xml:space="preserve">
<value>Delete Successful!</value>
</data>
<data name="Process" xml:space="preserve">
<value>Process</value>
</data>
<data name="PCS005" xml:space="preserve">
<value>Work Order Data Query</value>
</data>
<data name="WipStatus" xml:space="preserve">
<value>Work Order Status</value>
</data>
<data name="BoxNo" xml:space="preserve">
<value>BoxNumber</value>
</data>
<data name="InhouseNo" xml:space="preserve">
<value>Inbound Order Number</value>
</data>
<data name="StatusDescription" xml:space="preserve">
<value>Status Description</value>
</data>
<data name="Wight" xml:space="preserve">
<value>Wight(g)</value>
</data>
<data name="PCS009" xml:space="preserve">
<value>Barcode Production History Query</value>
</data>
<data name="KeypartsBarcode" xml:space="preserve">
<value>Keyparts Barcode</value>
</data>
<data name="PCS009R" xml:space="preserve">
<value>Barcode Production History</value>
</data>
<data name="BarcodeData" xml:space="preserve">
<value>Barcode Data</value>
</data>
<data name="WorkOrderHistory" xml:space="preserve">
<value>Work Order History</value>
</data>
<data name="ProductionHistory" xml:space="preserve">
<value>Production History</value>
</data>
<data name="KeypartsList" xml:space="preserve">
<value>Keyparts List</value>
</data>
<data name="RepairRecord" xml:space="preserve">
<value>Repair Record</value>
</data>
<data name="FixtureList" xml:space="preserve">
<value>Fixture List</value>
</data>
<data name="BarcodeChange" xml:space="preserve">
<value>Barcode Change</value>
</data>
<data name="KeypartsChange" xml:space="preserve">
<value>Keyparts Change</value>
</data>
<data name="MaterialPreparation" xml:space="preserve">
<value>Material Preparation</value>
</data>
<data name="CreateDate" xml:space="preserve">
<value>Creation Date</value>
</data>
<data name="User" xml:space="preserve">
<value>User</value>
</data>
<data name="ReplyUser" xml:space="preserve">
<value>Reply User</value>
</data>
<data name="ReplyDate" xml:space="preserve">
<value>Reply Date</value>
</data>
<data name="StationName" xml:space="preserve">
<value>Station Name</value>
</data>
<data name="StationDate" xml:space="preserve">
<value>Station Date</value>
</data>
<data name="SystemType" xml:space="preserve">
<value>System Type</value>
</data>
<data name="DefectCode" xml:space="preserve">
<value>Defect Code</value>
</data>
<data name="PartLocation" xml:space="preserve">
<value>Part Location</value>
</data>
<data name="RepairCode" xml:space="preserve">
<value>Repair Code</value>
</data>
<data name="RepairStatus" xml:space="preserve">
<value>Repair Status</value>
</data>
<data name="EquipmentNumber" xml:space="preserve">
<value>Equipment Number</value>
</data>
<data name="BarcodeSerialNumber" xml:space="preserve">
<value>Barcode Serial Number</value>
</data>
<data name="BarcodeSerialNumberOld" xml:space="preserve">
<value>(Old) Barcode Serial Number</value>
</data>
<data name="BarcodeSerialNumberNew" xml:space="preserve">
<value>(New) Barcode Serial Number</value>
</data>
<data name="ChangeType" xml:space="preserve">
<value>Change Type</value>
</data>
<data name="ChangeDate" xml:space="preserve">
<value>Change Date</value>
</data>
<data name="ReplaceUser" xml:space="preserve">
<value>Replace User</value>
</data>
<data name="ReplaceDate" xml:space="preserve">
<value>Replace Date</value>
</data>
<data name="KeypartsBarcodeOld" xml:space="preserve">
<value>(Old)Keyparts Barcode</value>
</data>
<data name="ChangeUser" xml:space="preserve">
<value>Change User</value>
</data>
<data name="Error_WorkOrder_UnitNotFound" xml:space="preserve">
<value>Work order number [{0}] does not have data for the specified production unit.</value>
</data>
<data name="Error_Unit_CopyNotAllowed" xml:space="preserve">
<value>Production unit [{0}] cannot copy work order data.</value>
</data>
<data name="Error_WorkOrder_Duplicate" xml:space="preserve">
<value>Work order number [{0}] already exists for the same production unit and line.</value>
</data>
<data name="Error_WorkOrder_UnitAlreadyExists" xml:space="preserve">
<value>The work order number has already been created for [{0}].</value>
</data>
<data name="Error_KeyParts_DuplicateOrder" xml:space="preserve">
<value>KeyParts order has duplicates</value>
</data>
<data name="Error_KeyParts_NotFoundInPLM" xml:space="preserve">
<value>KP Part Name [{0}] not found in PLM file</value>
</data>
<data name="Success_Created" xml:space="preserve">
<value>Created successfully!</value>
</data>
<data name="Error_WorkOrder_InProgress" xml:space="preserve">
<value>Work order number [{0}] is already in progress and cannot be modified!</value>
</data>
<data name="Error_WorkOrder_LineStarted" xml:space="preserve">
<value>Work order number [{0}] has already started on the line and cannot be modified!</value>
</data>
<data name="Error_WorkOrder_Completed" xml:space="preserve">
<value>Work order number [{0}] is already completed and cannot be modified!</value>
</data>
<data name="Error_WorkOrder_Deleted" xml:space="preserve">
<value>Work order number [{0}] has been deleted and cannot be modified!</value>
</data>
<data name="Error_WorkOrder_DuplicateForLine" xml:space="preserve">
<value>The same work order number has already been created for this line. Please verify!</value>
</data>
<data name="Error_WorkOrder_NonStandard96Required" xml:space="preserve">
<value>When selecting a non-standard 96 work order type, data must be entered.</value>
</data>
<data name="Error_Fixture_MismatchUnitAndStation" xml:space="preserve">
<value>Mismatch between production unit and station in fixture combination.</value>
</data>
<data name="Error_Modification_Failed" xml:space="preserve">
<value>Modification failed. Error message: {0}</value>
</data>
<data name="Error_System_Generic" xml:space="preserve">
<value>System error. Error message: {0}</value>
</data>
<data name="Success_Modification_Successful" xml:space="preserve">
<value>Modification successful!</value>
</data>
<data name="Error_SOP_DescriptionRequired" xml:space="preserve">
<value>Please fill in the SOP document description.</value>
</data>
<data name="Error_MAC_RangeLengthInvalid" xml:space="preserve">
<value>The MAC range between [{0}] and [{1}] is less than 12 characters. Please check again.</value>
</data>
<data name="Error_MAC_RangeInvalid" xml:space="preserve">
<value>The range between [{0}] and [{1}] is invalid.</value>
</data>
<data name="Error_MAC_PrefixMismatch" xml:space="preserve">
<value>The prefixes of [{0}] and [{1}] do not match.</value>
</data>
<data name="Error_MAC_RangeAlreadyAssigned" xml:space="preserve">
<value>The range between [{0}] and [{1}] is already assigned in the automatic MAC range. Please check.</value>
</data>
<data name="Error_MAC_RangeDuplicate" xml:space="preserve">
<value>The range between [{0}] and [{1}] is already duplicated. Please check.</value>
</data>
<data name="Error_MAC_ConversionFailed" xml:space="preserve">
<value>MAC range conversion error: {0}. Please ensure the values are entered correctly.</value>
</data>
<data name="Error_KeyParts_CodeNotFound" xml:space="preserve">
<value>Cannot find the related KeyParts code for [{0}]</value>
</data>
<data name="Error_KeyParts_LengthFormatInvalid" xml:space="preserve">
<value>The length format of [{0}] is incorrect</value>
</data>
<data name="Error_KeyParts_ProductionUnitNameNotFound" xml:space="preserve">
<value>Cannot find the related production unit name for [{0}]</value>
</data>
<data name="Error_KeyParts_KPQuantityFormatInvalid" xml:space="preserve">
<value>The KP quantity format for 【{0}】 is incorrect</value>
</data>
<data name="Error_KeyParts_EnterKPQuantity" xml:space="preserve">
<value>Please enter the KP quantity</value>
</data>
<data name="Error_RequiredFieldsNotFilled" xml:space="preserve">
<value>Required fields not filled: ({0})</value>
</data>
</root>

816
AMESCoreStudio.Web/Resources/Views/PCS/Shared.zh-TW.resx

@ -0,0 +1,816 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="WipNo" xml:space="preserve">
<value>工單號碼</value>
</data>
<data name="PlanQty" xml:space="preserve">
<value>計劃數量</value>
</data>
<data name="CompleteQty" xml:space="preserve">
<value>第一站完成數量</value>
</data>
<data name="Lineid" xml:space="preserve">
<value>線別</value>
</data>
<data name="UnitNo" xml:space="preserve">
<value>生產單位</value>
</data>
<data name="ProductTypeid" xml:space="preserve">
<value>產品別</value>
</data>
<data name="WipModelCheckName" xml:space="preserve">
<value>混線投入機</value>
</data>
<data name="WipSeq" xml:space="preserve">
<value>制令序號</value>
</data>
<data name="WipEcnCheckName" xml:space="preserve">
<value>混線投入ECN相同檢查</value>
</data>
<data name="WipRemarks" xml:space="preserve">
<value>工單備註</value>
</data>
<data name="WipDescription" xml:space="preserve">
<value>機種描述</value>
</data>
<data name="WipPriorityName" xml:space="preserve">
<value>線上強制工單</value>
</data>
<data name="OrderNo" xml:space="preserve">
<value>客戶訂單</value>
</data>
<data name="Werks" xml:space="preserve">
<value>廠別/委外廠</value>
</data>
<data name="WipType" xml:space="preserve">
<value>工單類型</value>
</data>
<data name="CustomerType" xml:space="preserve">
<value>客戶類別</value>
</data>
<data name="Medical" xml:space="preserve">
<value>醫療</value>
</data>
<data name="VIP" xml:space="preserve">
<value>VIP</value>
</data>
<data name="RelatedWoNo" xml:space="preserve">
<value>關聯工單</value>
</data>
<data name="WerksNo" xml:space="preserve">
<value>委外廠編號</value>
</data>
<data name="CustomerNo" xml:space="preserve">
<value>客戶名稱</value>
</data>
<data name="CustomerItemNo" xml:space="preserve">
<value>成品料號</value>
</data>
<data name="CustomerWipNo" xml:space="preserve">
<value>客戶工單</value>
</data>
<data name="ItemNo" xml:space="preserve">
<value>工程編號</value>
</data>
<data name="WipInputFlag" xml:space="preserve">
<value>判斷前製程是否已經投入</value>
</data>
<data name="ModelName" xml:space="preserve">
<value>機種名稱</value>
</data>
<data name="WipProcess" xml:space="preserve">
<value>工單性質</value>
</data>
<data name="WipSide" xml:space="preserve">
<value>SMD投產優先面</value>
</data>
<data name="WipBoards" xml:space="preserve">
<value>聯板數</value>
</data>
<data name="WipBoxCnt" xml:space="preserve">
<value>單箱數量</value>
</data>
<data name="BomDate" xml:space="preserve">
<value>BOM日期</value>
</data>
<data name="ECN" xml:space="preserve">
<value>ECN</value>
</data>
<data name="EAN" xml:space="preserve">
<value>EAN</value>
</data>
<data name="WipScheduleDate" xml:space="preserve">
<value>預計開工日期</value>
</data>
<data name="WipDueDate" xml:space="preserve">
<value>預計完工日期</value>
</data>
<data name="SerialNumber" xml:space="preserve">
<value>生產序號</value>
</data>
<data name="StartingSerialNumber" xml:space="preserve">
<value>起始生產序號</value>
</data>
<data name="EndingSerialNumber" xml:space="preserve">
<value>結束生產序號</value>
</data>
<data name="ShipmentSerialNumber" xml:space="preserve">
<value>出貨序號</value>
</data>
<data name="AddShipmentSerialNumber" xml:space="preserve">
<value>新增出貨序號</value>
</data>
<data name="StartingShipmentSerialNumber" xml:space="preserve">
<value>出貨序號起</value>
</data>
<data name="EndingShipmentSerialNumber" xml:space="preserve">
<value>出貨序號迄</value>
</data>
<data name="Increment" xml:space="preserve">
<value>進位</value>
</data>
<data name="SequentialNumber" xml:space="preserve">
<value>流水碼</value>
</data>
<data name="RemoveTailDigits" xml:space="preserve">
<value>去尾碼數</value>
</data>
<data name="DuplicateCheck" xml:space="preserve">
<value>判斷重複</value>
</data>
<data name="Delete" xml:space="preserve">
<value>刪除</value>
</data>
<data name="Yes" xml:space="preserve">
<value>是</value>
</data>
<data name="No" xml:space="preserve">
<value>否</value>
</data>
<data name="MAC" xml:space="preserve">
<value>MAC</value>
</data>
<data name="AddMACAddress" xml:space="preserve">
<value>新增MAC</value>
</data>
<data name="AutoGenerateMAC" xml:space="preserve">
<value>自動產生MAC</value>
</data>
<data name="StartingMACAddress" xml:space="preserve">
<value>MAC區間起</value>
</data>
<data name="EndingMACAddress" xml:space="preserve">
<value>MAC區間迄</value>
</data>
<data name="Add" xml:space="preserve">
<value>新增</value>
</data>
<data name="KeypartsGrouping" xml:space="preserve">
<value>Keyparts組合</value>
</data>
<data name="FileUpload" xml:space="preserve">
<value>文件上傳</value>
</data>
<data name="KeypartsPartName" xml:space="preserve">
<value>組件名稱</value>
</data>
<data name="KeypartsPartNumber" xml:space="preserve">
<value>組件料號NO</value>
</data>
<data name="Sequence" xml:space="preserve">
<value>順序</value>
</data>
<data name="PrefixCode" xml:space="preserve">
<value>前置碼</value>
</data>
<data name="StringLength" xml:space="preserve">
<value>字串長度</value>
</data>
<data name="IsRepeatable" xml:space="preserve">
<value>是否可重複</value>
</data>
<data name="NotInProduction" xml:space="preserve">
<value>不生產</value>
</data>
<data name="ProcessConfirmation" xml:space="preserve">
<value>途程確認</value>
</data>
<data name="WorkProcessNotes" xml:space="preserve">
<value>作業流程註解</value>
</data>
<data name="Engineer" xml:space="preserve">
<value>工程負責人員</value>
</data>
<data name="Name" xml:space="preserve">
<value>姓名</value>
</data>
<data name="WithStandardMaintenanceHours" xml:space="preserve">
<value>有維護標準工時</value>
</data>
<data name="WithoutStandardMaintenanceHours" xml:space="preserve">
<value>**無維護標準工時**</value>
</data>
<data name="SMD" xml:space="preserve">
<value>SMD點紅膠</value>
</data>
<data name="SMDRemarks" xml:space="preserve">
<value>SMD點紅膠備註</value>
</data>
<data name="SMDSolderMa" xml:space="preserve">
<value>SMD點防焊膠</value>
</data>
<data name="SMDSMRemarks" xml:space="preserve">
<value>SMD點防焊膠備註</value>
</data>
<data name="DIP" xml:space="preserve">
<value>DIP</value>
</data>
<data name="DIPCarrier" xml:space="preserve">
<value>CARRIER</value>
</data>
<data name="DIPRemarks" xml:space="preserve">
<value>DIP備註</value>
</data>
<data name="DIPTape" xml:space="preserve">
<value>貼付膠帶</value>
</data>
<data name="DIPSolderMask" xml:space="preserve">
<value>點防焊膠</value>
</data>
<data name="Burn" xml:space="preserve">
<value>燒錄</value>
</data>
<data name="BurnLocation" xml:space="preserve">
<value>燒機位置</value>
</data>
<data name="BurnedIn" xml:space="preserve">
<value>是否燒入</value>
</data>
<data name="BurnRemarks" xml:space="preserve">
<value>燒錄備註</value>
</data>
<data name="PartsBake" xml:space="preserve">
<value>零件烘烤</value>
</data>
<data name="ISPartsBake" xml:space="preserve">
<value>零件是否需要烘烤</value>
</data>
<data name="PartsBakeTemperature" xml:space="preserve">
<value>零件烘烤溫度</value>
</data>
<data name="PartsBakeOther" xml:space="preserve">
<value>其他溫度</value>
</data>
<data name="PartsBakeTime" xml:space="preserve">
<value>零件烘烤時間</value>
</data>
<data name="Hours" xml:space="preserve">
<value>小時</value>
</data>
<data name="PartsBakeOvertime" xml:space="preserve">
<value>零件烘烤超過48hrs</value>
</data>
<data name="PartsBakeRemarks" xml:space="preserve">
<value>零件烘烤備註</value>
</data>
<data name="PCBItemNo" xml:space="preserve">
<value>PCB板號</value>
</data>
<data name="ISPCBBake" xml:space="preserve">
<value>PCB是否需要烘烤</value>
</data>
<data name="PCBBake" xml:space="preserve">
<value>PCB烘烤</value>
</data>
<data name="PCBBakeRemarks" xml:space="preserve">
<value>PCB烘烤備註</value>
</data>
<data name="SolderPaste" xml:space="preserve">
<value>錫膏</value>
</data>
<data name="SolderPasteRemarks" xml:space="preserve">
<value>錫膏備註</value>
</data>
<data name="PCBProcessing" xml:space="preserve">
<value>PCB加工</value>
</data>
<data name="PCBProcessingRemarks" xml:space="preserve">
<value>PCB加工備註</value>
</data>
<data name="BIRatio" xml:space="preserve">
<value>燒機比率</value>
</data>
<data name="BITemperature" xml:space="preserve">
<value>燒機溫度</value>
</data>
<data name="BITime" xml:space="preserve">
<value>燒機時間</value>
</data>
<data name="BIRemarks" xml:space="preserve">
<value>燒機備註</value>
</data>
<data name="BiosVer" xml:space="preserve">
<value>BIOS版本</value>
</data>
<data name="BiosRemarks" xml:space="preserve">
<value>BIOS備註</value>
</data>
<data name="CheckSum" xml:space="preserve">
<value>Check Sum</value>
</data>
<data name="CheckSumRemarks" xml:space="preserve">
<value>Check Sum備註</value>
</data>
<data name="PowerMode" xml:space="preserve">
<value>Power Mode</value>
</data>
<data name="PLMMemo" xml:space="preserve">
<value>PLM生產備註</value>
</data>
<data name="BISoftware" xml:space="preserve">
<value>燒機軟體</value>
</data>
<data name="UpdateBI" xml:space="preserve">
<value>更新燒機資訊</value>
</data>
<data name="Bios" xml:space="preserve">
<value>BIOS</value>
</data>
<data name="OsVer" xml:space="preserve">
<value>OS版本</value>
</data>
<data name="CPU" xml:space="preserve">
<value>CPU頻率</value>
</data>
<data name="RAM" xml:space="preserve">
<value>RAM</value>
</data>
<data name="FinePackage" xml:space="preserve">
<value>是否為精裝</value>
</data>
<data name="DMIBI" xml:space="preserve">
<value>DMI燒入</value>
</data>
<data name="DMIBIRemarks" xml:space="preserve">
<value>DMI燒入說明</value>
</data>
<data name="Jumper" xml:space="preserve">
<value>JUMPER</value>
</data>
<data name="BabMemo" xml:space="preserve">
<value>組裝備註</value>
</data>
<data name="TestMemo" xml:space="preserve">
<value>測試備註</value>
</data>
<data name="PackingMemo" xml:space="preserve">
<value>包裝備註</value>
</data>
<data name="ProcessStation" xml:space="preserve">
<value>流程站別</value>
</data>
<data name="FixtureType" xml:space="preserve">
<value>治具種類</value>
</data>
<data name="SOPType" xml:space="preserve">
<value>SOP類型</value>
</data>
<data name="SOPVer" xml:space="preserve">
<value>SOP版本</value>
</data>
<data name="SOPName" xml:space="preserve">
<value>SOP文件敘述</value>
</data>
<data name="PrintMode" xml:space="preserve">
<value>列印方式</value>
</data>
<data name="PrintPage" xml:space="preserve">
<value>列印張數</value>
</data>
<data name="Sheet" xml:space="preserve">
<value>張</value>
</data>
<data name="ApproveLogo" xml:space="preserve">
<value>認證LOGO</value>
</data>
<data name="CompanyLogo" xml:space="preserve">
<value>公司LOGO</value>
</data>
<data name="WipAtt" xml:space="preserve">
<value>工單屬性</value>
</data>
<data name="Remarks" xml:space="preserve">
<value>備註</value>
</data>
<data name="Preview" xml:space="preserve">
<value>預覽</value>
</data>
<data name="FileName" xml:space="preserve">
<value>檔案名稱</value>
</data>
<data name="FilePath" xml:space="preserve">
<value>檔案路徑</value>
</data>
<data name="File" xml:space="preserve">
<value>檔案</value>
</data>
<data name="FileRemarks" xml:space="preserve">
<value>檔案備註</value>
</data>
<data name="DownLoad" xml:space="preserve">
<value>下載</value>
</data>
<data name="Confirmed" xml:space="preserve">
<value>確認</value>
</data>
<data name="EngineeringConfirmation" xml:space="preserve">
<value>工程確認</value>
</data>
<data name="Save" xml:space="preserve">
<value>儲存</value>
</data>
<data name="PreviewUpLoadItem" xml:space="preserve">
<value>預覽只能顯示圖檔、PDF、文字檔</value>
</data>
<data name="KeypartItemName" xml:space="preserve">
<value>Keypart組合</value>
</data>
<data name="SerialNumberItemName" xml:space="preserve">
<value>序號編碼</value>
</data>
<data name="ProductionItemName" xml:space="preserve">
<value>生產流程</value>
</data>
<data name="BoardItemName" xml:space="preserve">
<value>板卡-工程資訊</value>
</data>
<data name="SystemItemName" xml:space="preserve">
<value>工程資訊</value>
</data>
<data name="FixtureItemName" xml:space="preserve">
<value>治具組合</value>
</data>
<data name="SopItemName" xml:space="preserve">
<value>SOP文件</value>
</data>
<data name="LabelItemName" xml:space="preserve">
<value>標籤選項</value>
</data>
<data name="UploadFileItemName" xml:space="preserve">
<value>上傳檔案</value>
</data>
<data name="PCS002" xml:space="preserve">
<value>工單修改資料</value>
</data>
<data name="Edit" xml:space="preserve">
<value>修改</value>
</data>
<data name="View" xml:space="preserve">
<value>檢視</value>
</data>
<data name="Action" xml:space="preserve">
<value>操作</value>
</data>
<data name="FQCDate" xml:space="preserve">
<value>檢驗完成日</value>
</data>
<data name="StartDate" xml:space="preserve">
<value>開工日</value>
</data>
<data name="SendNotification" xml:space="preserve">
<value>發送通知</value>
</data>
<data name="PCS001R" xml:space="preserve">
<value>檢視工單資料</value>
</data>
<data name="DeleteOk" xml:space="preserve">
<value>刪除成功!</value>
</data>
<data name="Process" xml:space="preserve">
<value>流程</value>
</data>
<data name="PCS005" xml:space="preserve">
<value>工單資料查詢</value>
</data>
<data name="WipStatus" xml:space="preserve">
<value>工單狀態</value>
</data>
<data name="BoxNo" xml:space="preserve">
<value>包裝箱號</value>
</data>
<data name="InhouseNo" xml:space="preserve">
<value>入庫單號</value>
</data>
<data name="StatusDescription" xml:space="preserve">
<value>狀態描述</value>
</data>
<data name="Wight" xml:space="preserve">
<value>重量(g)</value>
</data>
<data name="PCS009" xml:space="preserve">
<value>條碼生產歷程查詢</value>
</data>
<data name="KeypartsBarcode" xml:space="preserve">
<value>組件條碼</value>
</data>
<data name="PCS009R" xml:space="preserve">
<value>條碼生產歷程</value>
</data>
<data name="BarcodeData" xml:space="preserve">
<value>條碼資料</value>
</data>
<data name="WorkOrderHistory" xml:space="preserve">
<value>工單歷程</value>
</data>
<data name="ProductionHistory" xml:space="preserve">
<value>生產歷程</value>
</data>
<data name="KeypartsList" xml:space="preserve">
<value>組件清單</value>
</data>
<data name="RepairRecord" xml:space="preserve">
<value>送修紀錄</value>
</data>
<data name="FixtureList" xml:space="preserve">
<value>治具清單</value>
</data>
<data name="BarcodeChange" xml:space="preserve">
<value>條碼變更</value>
</data>
<data name="KeypartsChange" xml:space="preserve">
<value>組件變更</value>
</data>
<data name="MaterialPreparation" xml:space="preserve">
<value>備料</value>
</data>
<data name="CreateDate" xml:space="preserve">
<value>建立日期</value>
</data>
<data name="User" xml:space="preserve">
<value>使用者</value>
</data>
<data name="ReplyUser" xml:space="preserve">
<value>回覆人員</value>
</data>
<data name="ReplyDate" xml:space="preserve">
<value>回覆日期</value>
</data>
<data name="StationName" xml:space="preserve">
<value>站別名稱</value>
</data>
<data name="StationDate" xml:space="preserve">
<value>過站時間</value>
</data>
<data name="SystemType" xml:space="preserve">
<value>系統類型</value>
</data>
<data name="DefectCode" xml:space="preserve">
<value>不良代碼</value>
</data>
<data name="PartLocation" xml:space="preserve">
<value>零件位置</value>
</data>
<data name="RepairCode" xml:space="preserve">
<value>維修代碼</value>
</data>
<data name="EquipmentNumber" xml:space="preserve">
<value>設備編號</value>
</data>
<data name="BarcodeSerialNumber" xml:space="preserve">
<value>條碼序號</value>
</data>
<data name="BarcodeSerialNumberOld" xml:space="preserve">
<value>(舊)條碼序號</value>
</data>
<data name="BarcodeSerialNumberNew" xml:space="preserve">
<value>(新)條碼序號</value>
</data>
<data name="ChangeType" xml:space="preserve">
<value>變更類型</value>
</data>
<data name="ChangeDate" xml:space="preserve">
<value>變更日期</value>
</data>
<data name="ReplaceUser" xml:space="preserve">
<value>替換人員</value>
</data>
<data name="RepairStatus" xml:space="preserve">
<value>維修狀態</value>
</data>
<data name="ReplaceDate" xml:space="preserve">
<value>替換日期</value>
</data>
<data name="KeypartsBarcodeOld" xml:space="preserve">
<value>(舊)組件條碼</value>
</data>
<data name="ChangeUser" xml:space="preserve">
<value>變更人員</value>
</data>
<data name="Error_WorkOrder_UnitNotFound" xml:space="preserve">
<value>工單號碼【{0}】找不到該生產單位已建立資料,請再確認。</value>
</data>
<data name="Error_Unit_CopyNotAllowed" xml:space="preserve">
<value>生產單位【{0}】無法複製工單資料。</value>
</data>
<data name="Error_WorkOrder_Duplicate" xml:space="preserve">
<value>工單號碼【{0}】已有相同生產單位、線別重複建立,請再確認。</value>
</data>
<data name="Error_WorkOrder_UnitAlreadyExists" xml:space="preserve">
<value>該筆工單號碼已經有產生【{0}】,不能再建立了。</value>
</data>
<data name="Error_KeyParts_DuplicateOrder" xml:space="preserve">
<value>KeyParts 順序有重複</value>
</data>
<data name="Error_KeyParts_NotFoundInPLM" xml:space="preserve">
<value>KP料號名稱【{0}】在PLM料號檔找不到</value>
</data>
<data name="Success_Created" xml:space="preserve">
<value>新增成功!</value>
</data>
<data name="Error_WorkOrder_InProgress" xml:space="preserve">
<value>工單號碼【{0}】,已開始投入,不可修改!</value>
</data>
<data name="Error_WorkOrder_LineStarted" xml:space="preserve">
<value>工單號碼【{0}】,已開線,不可修改!</value>
</data>
<data name="Error_WorkOrder_Completed" xml:space="preserve">
<value>工單號碼【{0}】,已經投入完工,不可修改!</value>
</data>
<data name="Error_WorkOrder_Deleted" xml:space="preserve">
<value>工單號碼【{0}】,已刪除,不可修改!</value>
</data>
<data name="Error_WorkOrder_DuplicateForLine" xml:space="preserve">
<value>該線別已有建立相同工單號碼了,請再確認!</value>
</data>
<data name="Error_WorkOrder_NonStandard96Required" xml:space="preserve">
<value>工單性質選擇非標96工單時,需填入資料。</value>
</data>
<data name="Error_Fixture_MismatchUnitAndStation" xml:space="preserve">
<value>治具組合中生產單位與作業站不匹配。</value>
</data>
<data name="Error_Modification_Failed" xml:space="preserve">
<value>修改失敗,錯誤訊息:{0}</value>
</data>
<data name="Error_System_Generic" xml:space="preserve">
<value>系統錯誤,錯誤訊息:{0}</value>
</data>
<data name="Success_Modification_Successful" xml:space="preserve">
<value>修改成功!</value>
</data>
<data name="Error_SOP_DescriptionRequired" xml:space="preserve">
<value>SOP文件請填寫SOP文件敘述。</value>
</data>
<data name="Error_MAC_RangeLengthInvalid" xml:space="preserve">
<value>【{0}】與【{1}】MAC區間長度不足12碼,請在確認。</value>
</data>
<data name="Error_MAC_RangeInvalid" xml:space="preserve">
<value>【{0}】與【{1}】區間設定有誤。</value>
</data>
<data name="Error_MAC_PrefixMismatch" xml:space="preserve">
<value>【{0}】與【{1}】前綴不一樣。</value>
</data>
<data name="Error_MAC_RangeAlreadyAssigned" xml:space="preserve">
<value>【{0}】與【{1}】已有設定自動MAC區間內,請確認。</value>
</data>
<data name="Error_MAC_RangeDuplicate" xml:space="preserve">
<value>【{0}】與【{1}】區間已有重複,請確認。</value>
</data>
<data name="Error_MAC_ConversionFailed" xml:space="preserve">
<value>MAC區間轉換錯誤:{0},請確認數值填寫是否正確。</value>
</data>
<data name="Error_KeyParts_CodeNotFound" xml:space="preserve">
<value>找不到【{0}】相關KeyParts代號</value>
</data>
<data name="Error_KeyParts_LengthFormatInvalid" xml:space="preserve">
<value>【{0}】長度格式錯誤</value>
</data>
<data name="Error_KeyParts_ProductionUnitNameNotFound" xml:space="preserve">
<value>找不到【{0}】相關生產單位名稱</value>
</data>
<data name="Error_KeyParts_KPQuantityFormatInvalid" xml:space="preserve">
<value>【{0}】KP數量格式錯誤</value>
</data>
<data name="Error_KeyParts_EnterKPQuantity" xml:space="preserve">
<value>請輸入KP數量</value>
</data>
<data name="Error_RequiredFieldsNotFilled" xml:space="preserve">
<value>必填欄位未填寫:({0})</value>
</data>
</root>

13
AMESCoreStudio.Web/Startup.cs

@ -17,6 +17,8 @@ using Microsoft.AspNetCore.Mvc.Razor;
using Microsoft.AspNetCore.Localization;
using AMESCoreStudio.Web.Code;
using Microsoft.AspNetCore.Http.Features;
using AMESCoreStudio.Web.Resources.Localization;
using Microsoft.Extensions.Localization;
namespace AMESCoreStudio.Web
{
@ -101,19 +103,22 @@ namespace AMESCoreStudio.Web
o.ResourcesPath = "Resources";
});
// Add framework services.
//services.AddMvc();
//services.AddMvc().AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix);
services.AddMvc()
.AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
.AddDataAnnotationsLocalization(options =>
{
options.DataAnnotationLocalizerProvider = (type, factory) => factory.Create(typeof(SharedResource));
});
//services.AddControllersWithViews();
services.AddControllersWithViews().AddRazorRuntimeCompilation();
// µù¥U¦Û­qªº Localizer Factory
services.AddSingleton<IStringLocalizerFactory, CustomStringLocalizerFactory>(sp =>
{
var baseFactory = ActivatorUtilities.CreateInstance<ResourceManagerStringLocalizerFactory>(sp);
return new CustomStringLocalizerFactory(baseFactory);
});
//ʹÓÃSession
services.AddSession();

155
AMESCoreStudio.Web/Views/PCS/PCS001N.cshtml

@ -1,5 +1,6 @@
@model AMESCoreStudio.Web.ViewModels.PCS.WipDataViewModel
@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer
@{ ViewData["Title"] = "PCS001";
Layout = "~/Views/Shared/_AMESLayout.cshtml"; }
@ -23,27 +24,27 @@
<form id="formPCS001N" enctype="multipart/form-data" method="post" asp-action="PCS001N" class="layui-form">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="layui-form-item " style="padding-left:30px">
<input asp-for="wipInfo.InputFlag" type="checkbox" title="判斷前製程是否已經投入" />
<input asp-for="wipInfo.InputFlag" type="checkbox" title=@Localizer["WipInputFlag"] />
</div>
<div>@ViewData["message"]</div>
<div class="layui-form-item">
<div class="layui-inline">
<label asp-for="wipInfo.WipNO" class="layui-form-label"></label>
<label class="layui-form-label">@Localizer["WipNo"]</label>
<div class="layui-input-inline">
<input asp-for="wipInfo.WipNO" style="width: 150px; display: initial" class="layui-input" oninput="let p=this.selectionStart;this.value=this.value.toUpperCase();this.setSelectionRange(p, p);" autocomplete="off" />
<button id="Copy" class="layui-btn layui-btn-sm layui-btn-normal" style="padding: 0 5px;" name="action" value="Copy" lay-submit lay-filter="querysubmit" title="複製">
<i class="layui-icon layui-icon-sm">&#xe669;</i>
</button>
</div>
<label asp-for="wipInfo.WipSEQ" class="layui-form-label"></label>
<label class="layui-form-label">@Localizer["WipSeq"]</label>
<div class="layui-input-inline">
<input asp-for="wipInfo.WipSEQ" class="layui-input" autocomplete="off" readonly="true" />
</div>
<label asp-for="wipAtt.ItemNO" class="layui-form-label"></label>
<label class="layui-form-label">@Localizer["ItemNo"]</label>
<div class="layui-input-inline">
<input asp-for="wipAtt.ItemNO" oninput="let p=this.selectionStart;this.value=this.value.toUpperCase();this.setSelectionRange(p, p);" class="layui-input" autocomplete="off" maxlength="20" />
</div>
<label asp-for="wipInfo.PlanQTY" class="layui-form-label"></label>
<label class="layui-form-label">@Localizer["PlanQty"]</label>
<div class="layui-input-inline">
<input asp-for="wipInfo.PlanQTY" class="layui-input" autocomplete="off" />
</div>
@ -52,42 +53,41 @@
<div class="layui-form-item">
<div class="layui-inline">
<label asp-for="wipInfo.WipType" class="layui-form-label"></label>
<label class="layui-form-label">@Localizer["WipType"]</label>
<div class="layui-input-inline">
<select asp-for="wipInfo.WipType" asp-items="@ViewBag.GetWipTypeList" class=""></select>
</div>
<label asp-for="wipInfo.ProductTypeID" class="layui-form-label"></label>
<label class="layui-form-label">@Localizer["ProductTypeid"]</label>
<div class="layui-input-inline">
<select asp-for="wipInfo.ProductTypeID" asp-items="@ViewBag.ProductTypesList"></select>
</div>
<label asp-for="wipInfo.Werks" class="layui-form-label"></label>
<label class="layui-form-label">@Localizer["Werks"]</label>
<div class="layui-input-inline">
<select asp-for="wipInfo.Werks" asp-items="@ViewBag.FactoryInfoList" style="color: #dc3545 !important;"></select>
</div>
<label asp-for="wipInfo.WerksNO" class="layui-form-label"></label>
<label class="layui-form-label">@Localizer["WerksNo"]</label>
<div class="layui-input-inline">
<input asp-for="wipInfo.WerksNO" class="layui-input" autocomplete="off" />
</div>
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">客戶類別</label>
<label class="layui-form-label">@Localizer["CustomerType"]</label>
<div class="layui-input-inline">
<input asp-for="wipInfo.CustomerMedical" type="checkbox" title="醫療" />
<input asp-for="wipInfo.CustomerVIP" type="checkbox" title="VIP" />
<input asp-for="wipInfo.CustomerMedical" type="checkbox" title=@Localizer["Medical"] />
<input asp-for="wipInfo.CustomerVIP" type="checkbox" title=@Localizer["VIP"] />
</div>
<label asp-for="wipInfo.CustomerNO" class="layui-form-label"></label>
<label class="layui-form-label">@Localizer["CustomerNo"]</label>
<div class="layui-input-inline">
<input asp-for="wipInfo.CustomerNO" class="layui-input" autocomplete="off" />
</div>
<label asp-for="wipInfo.CustomerItemNO" class="layui-form-label"></label>
<label class="layui-form-label">@Localizer["CustomerItemNo"]</label>
<div class="layui-input-inline">
<input asp-for="wipInfo.CustomerItemNO" oninput="let p=this.selectionStart;this.value=this.value.toUpperCase();this.setSelectionRange(p, p);" class="layui-input" autocomplete="off" />
</div>
<label asp-for="wipInfo.CustomerWipNo" class="layui-form-label"></label>
<label class="layui-form-label">@Localizer["CustomerWipNo"]</label>
<div class="layui-input-inline">
<input asp-for="wipInfo.CustomerWipNo" oninput="let p=this.selectionStart;this.value=this.value.toUpperCase();this.setSelectionRange(p, p);" class="layui-input" autocomplete="off" />
</div>
@ -96,14 +96,14 @@
<div class="layui-form-item">
<div class="layui-inline">
<label asp-for="wipInfo.UnitNO" class="layui-form-label"></label>
<label class="layui-form-label">@Localizer["UnitNo"]</label>
<div class="layui-input-inline">
<select id="unit" lay-filter="unit" asp-for="wipInfo.UnitNO" asp-items="@ViewBag.FactoryUnitList" class="">
<option value="0">--請選擇--</option>
</select>
</div>
<input id="unitNo" type="hidden" asp-for="wipInfo.UnitNO" />
<label asp-for="wipInfo.LineID" class="layui-form-label"></label>
<label class="layui-form-label">@Localizer["Lineid"]</label>
<div class="layui-input-inline">
<select lay-filter="lind" asp-for="wipInfo.LineID" asp-items="@ViewBag.LineInfoList" class="">
</select>
@ -111,12 +111,12 @@
<input id="lindID" type="hidden" name="lindID" value="" />
<label asp-for="wipInfo.RelatedWONO" class="layui-form-label"></label>
<label class="layui-form-label">@Localizer["RelatedWoNo"]</label>
<div class="layui-input-inline">
<input asp-for="wipInfo.RelatedWONO" class="layui-input" />
</div>
<label asp-for="wipInfo.OrderNO" class="layui-form-label"></label>
<label class="layui-form-label">@Localizer["OrderNo"]</label>
<div class="layui-input-inline">
<input asp-for="wipInfo.OrderNO" class="layui-input" />
</div>
@ -124,46 +124,46 @@
</div>
<div class="layui-form-item">
<label asp-for="wipInfo.Remarks" class="layui-form-label"></label>
<label class="layui-form-label">@Localizer["WipRemarks"]</label>
<div class="layui-input-block">
<textarea asp-for="wipInfo.Remarks" class="layui-textarea"></textarea>
</div>
</div>
<div class="layui-form-item">
<label asp-for="wipInfo.Description" class="layui-form-label"></label>
<label class="layui-form-label">@Localizer["WipDescription"]</label>
<div class="layui-input-block">
<input asp-for="wipInfo.Description" class="layui-input" />
</div>
</div>
<div class="layui-form-item" style="padding-left:30px">
<input type="checkbox" title="混線投入機種檢查" asp-for="wipInfo.ModelCheck" />
<input type="checkbox" title="混線投入ECN相同檢查" asp-for="wipInfo.ECNCheck" />
<input type="checkbox" title="線上強制工單" asp-for="wipInfo.Priority" />
<input type="checkbox" title=@Localizer["WipModelCheckName"] asp-for="wipInfo.ModelCheck" />
<input type="checkbox" title=@Localizer["WipEcnCheckName"] asp-for="wipInfo.ECNCheck" />
<input type="checkbox" title=@Localizer["WipPriorityName"] asp-for="wipInfo.Priority" />
</div>
<div class="layui-tab layui-tab-brief">
<ul class="layui-tab-title">
<li class="layui-this">工單屬性</li>
<li>序號編碼</li>
<li>Keypart組合</li>
<li>生產流程</li>
<li class="layui-this">@Localizer["WipAtt"]</li>
<li>@Localizer["SerialNumberItemName"]</li>
<li>@Localizer["KeypartItemName"]</li>
<li>@Localizer["ProductionItemName"]</li>
</ul>
<div class="layui-tab-content">
@* 工單屬性sheet *@
<div class="layui-tab-item layui-show">
<div class="layui-form-item">
<div class="layui-inline">
<label asp-for="wipAtt.ModelNO" class="layui-form-label"></label>
<label class="layui-form-label">@Localizer["ModelName"]</label>
<div class="layui-input-inline">
<input asp-for="wipAtt.ModelNO" class="layui-input" maxlength="30" />
</div>
<label asp-for="wipAtt.WipProcess" class="layui-form-label"></label>
<label class="layui-form-label">@Localizer["WipProcess"]</label>
<div class="layui-input-inline">
<select asp-for="wipAtt.WipProcess" asp-items="@ViewBag.ProcessTypeList" class=""></select>
</div>
<label asp-for="wipAtt.Side" class="layui-form-label" style="width:100px"></label>
<label class="layui-form-label" style="width:100px">@Localizer["WipSide"]</label>
<div class="layui-input-inline">
<select asp-for="wipAtt.Side" asp-items="@ViewBag.MFGTypeList" class=""></select>
</div>
@ -172,15 +172,15 @@
<div class="layui-form-item">
<div class="layui-inline">
<label asp-for="wipAtt.Boards" class="layui-form-label"></label>
<label class="layui-form-label">@Localizer["WipBoards"]</label>
<div class="layui-input-inline">
<input asp-for="wipAtt.Boards" value="1" class="layui-input" />
</div>
<label asp-for="wipInfo.BoxCNT" class="layui-form-label"></label>
<label class="layui-form-label">@Localizer["WipBoxCnt"]</label>
<div class="layui-input-inline">
<input asp-for="wipInfo.BoxCNT" value="1" class="layui-input" />
</div>
<label asp-for="wipAtt.BomDate" class="layui-form-label" style="width:100px"></label>
<label class="layui-form-label" style="width:100px">@Localizer["BomDate"]</label>
<div class="layui-input-inline">
<input asp-for="wipAtt.BomDate" class="layui-input" readonly="" />
</div>
@ -189,11 +189,11 @@
<div class="layui-form-item">
<div class="layui-inline">
<label asp-for="wipAtt.ECN" class="layui-form-label"></label>
<label class="layui-form-label">@Localizer["ECN"]</label>
<div class="layui-input-inline">
<input asp-for="wipAtt.ECN" class="layui-input" maxlength="20" />
</div>
<label asp-for="wipAtt.EAN" class="layui-form-label"></label>
<label class="layui-form-label">@Localizer["EAN"]</label>
<div class="layui-input-inline">
<input asp-for="wipAtt.EAN" class="layui-input" maxlength="20" />
</div>
@ -202,11 +202,11 @@
<div class="layui-form-item">
<div class="layui-inline">
<label asp-for="wipInfo.WipScheduleDate" class="layui-form-label"></label>
<label class="layui-form-label">@Localizer["WipScheduleDate"]</label>
<div class="layui-input-inline">
<input asp-for="wipInfo.WipScheduleDate" class="layui-input" readonly="" />
</div>
<label asp-for="wipInfo.WipDueDate" class="layui-form-label"></label>
<label class="layui-form-label">@Localizer["WipDueDate"]</label>
<div class="layui-input-inline">
<input asp-for="wipInfo.WipDueDate" class="layui-input" readonly="" />
</div>
@ -219,16 +219,15 @@
<div class="layui-tab-item">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label" style="font-weight: bold;">生產序號</label>
<label class="layui-form-label" style="font-weight: bold;">@Localizer["SerialNumber"]</label>
<table id="MydataTable" class="layui-table">
<thead>
<tr>
<th>
起始生產序號
@Localizer["StartingSerialNumber"]
</th>
<th>
結束生產序號
@Localizer["EndingSerialNumber"]
</th>
</tr>
</thead>
@ -250,9 +249,9 @@
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label" style="font-weight: bold;">出貨序號</label>
<label class="layui-form-label" style="font-weight: bold;">@Localizer["ShipmentSerialNumber"]</label>
<div class="layui-input-inline">
<a id="wipBarcodeOtherTableAdd" class="layui-btn layui-btn-primary layui-border-blue layui-btn-sm">新增出貨序號</a>
<a id="wipBarcodeOtherTableAdd" class="layui-btn layui-btn-primary layui-border-blue layui-btn-sm">@Localizer["AddShipmentSerialNumber"]</a>
</div>
<input type="hidden" value=@Model.wipBarcodeOthers.Count() id="wipBarcodeOtherCount" />
<table id="wipBarcodeOtherTable" class="layui-table">
@ -262,22 +261,22 @@
<thead>
<tr>
<th>
出貨序號起
@Localizer["StartingShipmentSerialNumber"]
</th>
<th>
出貨序號迄
@Localizer["EndingShipmentSerialNumber"]
</th>
<th>
進位
@Localizer["Increment"]
</th>
<th>
流水碼
@Localizer["SequentialNumber"]
</th>
<th>
去尾碼數
@Localizer["RemoveTailDigits"]
</th>
<th>
判斷重複
@Localizer["DuplicateCheck"]
</th>
<th>
</th>
@ -305,11 +304,11 @@
<input type="number" min="0" max="9" onkeypress="if( event.keyCode == 13 ) { return false; }" class="layui-input" value="@index.Truncate" name="wipBarcodeOthers[@m].Truncate" />
</td>
<td>
<input type="radio" name="wipBarcodeOthers[@m].CheckRepeat" value="Y" title="是" @(index.CheckRepeat == "Y" || index.CheckRepeat == null ? "checked" : "")>
<input type="radio" name="wipBarcodeOthers[@m].CheckRepeat" value="N" title="否" @(index.CheckRepeat == "N" ? "checked" : "")>
<input type="radio" name="wipBarcodeOthers[@m].CheckRepeat" value="Y" title=@Localizer["Yes"] @(index.CheckRepeat == "Y" || index.CheckRepeat == null ? "checked" : "")>
<input type="radio" name="wipBarcodeOthers[@m].CheckRepeat" value="N" title=@Localizer["No"] @(index.CheckRepeat == "N" ? "checked" : "")>
</td>
<td>
<a class="layui-btn layui-btn-danger layui-btn-xs layui-icon layui-icon-delete" onclick="Remove(this);">刪除</a>
<a class="layui-btn layui-btn-danger layui-btn-xs layui-icon layui-icon-delete" onclick="Remove(this);">@Localizer["Delete"]</a>
</td>
</tr>
m++;
@ -320,10 +319,10 @@
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label" style="font-weight: bold;">MAC</label>
<label class="layui-form-label" style="font-weight: bold;">@Localizer["MAC"]</label>
<div class="layui-input-inline">
<a id="MACTableAdd" class="layui-btn layui-btn-primary layui-border-blue layui-btn-sm">新增MAC</a>
<a class="layui-btn layui-btn-primary layui-border-blue layui-btn-sm" onclick="GetMAC();">自動產生MAC</a>
<a id="MACTableAdd" class="layui-btn layui-btn-primary layui-border-blue layui-btn-sm">@Localizer["AddMACAddress"]</a>
<a class="layui-btn layui-btn-primary layui-border-blue layui-btn-sm" onclick="GetMAC();">@Localizer["AutoGenerateMAC"]</a>
</div>
<input type="hidden" value=@Model.wipMACs.Count() id="WipMacCount" />
<table id="MACTable" class="layui-table">
@ -333,10 +332,10 @@
<thead>
<tr style="width:150px;">
<th style="width:60px">
MAC區間起
@Localizer["StartingMACAddress"]
</th>
<th style="width:60px">
MAC區間迄
@Localizer["AutoGenerateMAC"]
</th>
<th style="width:60px">
@ -359,7 +358,7 @@
<td>
@if (index.ClassGroup == "New")
{
<a class="layui-btn layui-btn-danger layui-btn-xs layui-icon layui-icon-delete" onclick="Remove(this);">刪除</a>
<a class="layui-btn layui-btn-danger layui-btn-xs layui-icon layui-icon-delete" onclick="Remove(this);">@Localizer["Delete"]</a>
}
</td>
</tr>
@ -372,7 +371,7 @@
</div>
<div class="layui-form-item">
<label class="layui-form-label">備註</label>
<label class="layui-form-label">@Localizer["Remarks"]</label>
<div class="layui-input-block">
<textarea asp-for="wipBarcode.Remarks" class="layui-textarea" type="text"></textarea>
</div>
@ -381,32 +380,32 @@
@* Keypart組合sheet *@
<div class="layui-tab-item">
<a id="KPTableAdd" class="layui-btn layui-btn-xs layui-icon layui-icon-add-circle">新增</a>
<a id="KPTableAdd" class="layui-btn layui-btn-xs layui-icon layui-icon-add-circle">@Localizer["Add"]</a>
<input type="hidden" value=@Model.WipKps.Count() id="WipKpCount" />
<table id="KPTable" class="layui-table">
@{int k = 0;}
<thead>
<tr>
<th>
KP料號名稱
@Localizer["KeypartsPartName"]
</th>
<th>
KP料號NO
@Localizer["KeypartsPartNumber"]
</th>
<th style="width:70px;">
順序
@Localizer["Sequence"]
</th>
<th style="width:70px;">
前置碼
@Localizer["PrefixCode"]
</th>
<th style="width:70px;">
長度
@Localizer["StringLength"]
</th>
<th>
生產單位代號
@Localizer["UnitNo"]
</th>
<th style="width:70px;">
是否可重複
@Localizer["IsRepeatable"]
</th>
<th>
@ -438,12 +437,12 @@
</td>
<td>
<select asp-for="@index.IsRepeat" name="WipKps[@k].IsRepeat" class="">
<option value="N"></option>
<option value="Y"></option>
<option value="N">@Localizer["No"]</option>
<option value="Y">@Localizer["Yes"]</option>
</select>
</td>
<td>
<a class="layui-btn layui-btn-danger layui-btn-xs layui-icon layui-icon-delete" onclick="Remove(this);">刪除</a>
<a class="layui-btn layui-btn-danger layui-btn-xs layui-icon layui-icon-delete" onclick="Remove(this);">@Localizer["Delete"]</a>
</td>
</tr>
k++;
@ -456,19 +455,19 @@
<div class="layui-tab-item">
<div class="layui-form-item">
<div class="layui-inline">
<label asp-for="wipInfo.FlowRuleID" as class="layui-form-label"></label>
<label class="layui-form-label">@Localizer["Process"]</label>
<div class="layui-input-inline">
<select lay-filter="flow" id="flow" asp-for="wipInfo.FlowRuleID" asp-items="@ViewBag.MaterialFlowRule" class=""></select>
</div>
<input id="flowId" type="hidden" name="flowId" value="" />
</div>
<div class="layui-inline">
<input asp-for="wipInfo.SFISFlowCk" type="checkbox" title="途程確認" />
<input asp-for="wipInfo.SFISFlowCk" type="checkbox" title=@Localizer["ProcessConfirmation"] />
</div>
<div class="layui-form-item">
<label class="layui-form-label">作業流程註解</label>
<label class="layui-form-label">@Localizer["WorkProcessNotes"]</label>
<div class="layui-input-block">
<textarea placeholder="請輸入作業流程註解" asp-for="wipInfo.FlowRemark" class="layui-textarea"></textarea>
<textarea asp-for="wipInfo.FlowRemark" class="layui-textarea"></textarea>
</div>
</div>
<table class="layui-hide" id="ruleStation" lay-filter="ruleStation"></table>
@ -480,7 +479,7 @@
<span style="color: firebrick;word-break: break-all;" class="text-danger offset-sm-3">@Html.ValidationMessage("error")</span>
<div class="layui-form-item">
<div style="text-align:center">
<input type="submit" value="儲存" id="add" name="action" class="layui-btn" />
<input type="submit" value=@Localizer["Save"] id="add" name="action" class="layui-btn" />
</div>
</div>
</form>

368
AMESCoreStudio.Web/Views/PCS/PCS001R.cshtml

File diff suppressed because it is too large

65
AMESCoreStudio.Web/Views/PCS/PCS002.cshtml

@ -1,17 +1,11 @@
@{
ViewData["Title"] = "工單資料修改";
@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer
@{
ViewData["Title"] = @Localizer["PCS002"];
Layout = "~/Views/Shared/_AMESLayout.cshtml";
}
@using Microsoft.AspNetCore.Mvc.Localization
@inject IHtmlLocalizer<AMESCoreStudio.Web.SharedResource> sharedLocalizer
<style>
/* .layui-table-col-special .layui-table-cell {
height:auto;
overflow:visible;
text-overflow:inherit;
white-space: normal;
}*/
</style>
<div class="layui-card">
<div class="layui-card-header">
<div class="layui-form">
@ -26,23 +20,23 @@
<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">@Localizer["WipNo"]:</label>
<div class="layui-input-inline" style="width:150px">
<input id="wipNo" name="wipNo" oninput="let p=this.selectionStart;this.value=this.value.toUpperCase();this.setSelectionRange(p, p);" autocomplete="off" class="layui-input" placeholder="請輸入工單號碼">
<input id="wipNo" name="wipNo" oninput="let p=this.selectionStart;this.value=this.value.toUpperCase();this.setSelectionRange(p, p);" autocomplete="off" class="layui-input">
</div>
</div>
</div>
<div class="layui-col-sm4">
<div class="layui-inline">
<label class="layui-form-label">工程編號:</label>
<label class="layui-form-label">@Localizer["ItemNo"]:</label>
<div class="layui-input-inline" style="width:150px">
<input id="itemNo" name="itemNo" oninput="let p=this.selectionStart;this.value=this.value.toUpperCase();this.setSelectionRange(p, p);" autocomplete="off" class="layui-input" placeholder="請輸入工程編號">
<input id="itemNo" name="itemNo" oninput="let p=this.selectionStart;this.value=this.value.toUpperCase();this.setSelectionRange(p, p);" autocomplete="off" class="layui-input">
</div>
</div>
</div>
<div class="layui-col-sm4">
<div class="layui-inline">
<label class="layui-form-label">生產單位:</label>
<label class="layui-form-label">@Localizer["UnitNo"]:</label>
<div class="layui-input-inline" style="width:150px">
<select id="unit" lay-filter="unit" name="unit" lay-submit asp-items="@ViewBag.FactoryUnitList">
</select>
@ -86,76 +80,75 @@
{
field: 'wipNo',
width: 100,
title: '工單號碼',
title: '@Localizer["WipNo"]',
sort: true
},
{
field: 'itemNo',
title: '工程編號',
title: '@Localizer["ItemNo"]',
width: 150,
sort: true,
expandedMode: 'tips'
},
{
field: 'description',
title: '機種描述',
title: '@Localizer["WipDescription"]',
width: 100,
expandedMode: 'tips'
},
{
field: 'planQTY',
title: '數量'
title: '@Localizer["PlanQty"]'
},
{
field: 'lineDesc',
title: '線別',
title: '@Localizer["Lineid"]',
sort: true
},
{
field: 'unitName',
title: '生產單位',
title: '@Localizer["UnitNo"]',
width: 100,
sort: true
},
{
field: 'factoryNameCh',
title: '委外廠名稱',
title: '@Localizer["Werks"]',
sort: true
},
{
field: 'wipScheduleDate',
title: '預計開工日',
title: '@Localizer["WipScheduleDate"]',
sort: true,
templet: '<div>{{ layui.util.toDateString(d.wipScheduleDate, "yyyy/MM/dd") }}</div>'
},
{
field: 'workDate',
title: '開工日',
title: '@Localizer["StartDate"]',
sort: true
},
{
field: 'wipDueDate',
title: '預計完成日',
title: '@Localizer["WipDueDate"]',
sort: true,
templet: '<div>{{ layui.util.toDateString(d.wipDueDate, "yyyy/MM/dd") }}</div>'
},
{
field: 'wipCheck',
title: '發送通知'
title: '@Localizer["SendNotification"]'
},
{
field: 'fqcDate',
title: '檢驗完成日'
title: '@Localizer["FQCDate"]'
},
{
field: 'right',
width: 150,
title: '操作',
title: '@Localizer["Action"]',
fixed: 'right',
templet: function (d) {
return '<a class="layui-btn layui-btn-xs layui-icon layui-icon-edit" lay-event="edit">修改</a>\
<a class="layui-btn layui-btn-warm layui-icon layui-icon-list layui-btn-xs" lay-event="detail">檢視</a>'
//// <a class="layui-btn layui-btn-danger layui-btn-xs layui-icon layui-icon-delete" lay-event="del">刪除</a>
return '<a class="layui-btn layui-btn-xs layui-icon layui-icon-edit" lay-event="edit">@Localizer["Edit"]</a>\
<a class="layui-btn layui-btn-warm layui-icon layui-icon-list layui-btn-xs" lay-event="detail">@Localizer["View"]</a>'
}
}
]
@ -164,7 +157,7 @@
//通过行tool編輯,lay-event="edit"
function edit(obj) {
if (obj.data.wipID) {
hg.open('修改工單資料', '/PCS/PCS003/' + obj.data.wipID, '', '', true);
hg.open('@Localizer["PCS002"]', '/PCS/PCS003/' + obj.data.wipID, '', '', true);
}
}
@ -176,7 +169,7 @@
type: 'POST',
success: function (data) {
if (data.success) {
hg.msghide("刪除成功!");
hg.msghide('@Localizer["DeleteOk"]');
var qs = $('button[lay-filter="querysubmit"]');
qs.click();
}
@ -194,7 +187,7 @@
//通过行tool檢視,lay-event="detail"
function detail(obj) {
if (obj.data.wipID) {
hg.open('檢視工單資料', '/PCS/PCS001R/' + obj.data.wipID, '', '', true);
hg.open('@Localizer["PCS001R"]', '/PCS/PCS001R/' + obj.data.wipID, '', '', true);
}
}

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

File diff suppressed because it is too large

83
AMESCoreStudio.Web/Views/PCS/PCS005.cshtml

@ -1,9 +1,11 @@
@{
ViewData["Title"] = "工單資料查詢";
@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer
@{
ViewData["Title"] = @Localizer["PCS005"];
Layout = "~/Views/Shared/_AMESLayout.cshtml";
}
@using Microsoft.AspNetCore.Mvc.Localization
@inject IHtmlLocalizer<AMESCoreStudio.Web.SharedResource> sharedLocalizer
<style>
/* .layui-table-col-special .layui-table-cell {
height:auto;
@ -26,23 +28,23 @@
<div class="layui-form-item">
<div class="layui-col-md3">
<div class="layui-inline">
<label class="layui-form-label" style="width:50px">工單</label>
<label class="layui-form-label" style="width:50px">@Localizer["WipNo"]</label>
<div class="layui-input-inline" style="width:170px">
<input id="wipNo" name="wipNo" autocomplete="off" oninput="let p=this.selectionStart;this.value=this.value.toUpperCase();this.setSelectionRange(p, p);" class="layui-input" placeholder="請輸入工單號碼">
<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-md3">
<div class="layui-inline">
<label class="layui-form-label" style="width:50px">工程編號</label>
<label class="layui-form-label" style="width:50px">@Localizer["ItemNo"]</label>
<div class="layui-input-inline" style="width:170px">
<input id="itemNo" name="itemNo" autocomplete="off" oninput="let p=this.selectionStart;this.value=this.value.toUpperCase();this.setSelectionRange(p, p);" class="layui-input" placeholder="請輸入工程編號">
<input id="itemNo" name="itemNo" 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-md3">
<div class="layui-inline">
<label class="layui-form-label" style="width:50px">生產單位</label>
<label class="layui-form-label" style="width:50px">@Localizer["UnitNo"]</label>
<div class="layui-input-inline" style="width:170px">
<select id="unit" lay-filter="unit" name="unit" lay-submit asp-items="@ViewBag.FactoryUnitList">
</select>
@ -53,7 +55,7 @@
</div>
<div class="layui-col-md3">
<div class="layui-inline">
<label class="layui-form-label" style="width:50px">工單狀態</label>
<label class="layui-form-label" style="width:50px">@Localizer["WipStatus"]</label>
<div class="layui-input-inline" style="width:100px">
<select id="statusNo" name="statusNo" lay-filter="statusNo" lay-submit>
<option value="">全部</option>
@ -74,9 +76,9 @@
<div class="layui-form-item">
<div class="layui-col-md3">
<div class="layui-inline">
<label class="layui-form-label" style="width:50px">客戶工單</label>
<label class="layui-form-label" style="width:50px">@Localizer["CustomerWipNo"]</label>
<div class="layui-input-inline" style="width:170px">
<input id="customerWipNo" name="customerWipNo" autocomplete="off" oninput="let p=this.selectionStart;this.value=this.value.toUpperCase();this.setSelectionRange(p, p);" class="layui-input" placeholder="請輸入客戶工單">
<input id="customerWipNo" name="customerWipNo" autocomplete="off" oninput="let p=this.selectionStart;this.value=this.value.toUpperCase();this.setSelectionRange(p, p);" class="layui-input">
</div>
</div>
</div>
@ -112,18 +114,12 @@
//roleName = data.elem[data.elem.selectedIndex].text;
var qs = $('button[lay-filter="querysubmit"]');
qs.click();
//hg.msghide("刷新資料!");
//table && table.reload();
});
form.on('select(statusNo)', function (data) {
//roleName = data.elem[data.elem.selectedIndex].text;
var qs = $('button[lay-filter="querysubmit"]');
qs.click();
//hg.msghide("刷新資料!");
//table && table.reload();
});
var table = layui.table;
@ -131,7 +127,7 @@
table.on('tool(query)', function (obj) {
if (obj.event == 'detail') {
if (obj.data.wipID) {
hg.open('檢視工單資料', '/PCS/PCS001R/' + obj.data.wipID, '', '', true);
hg.open('@Localizer["PCS001R"]', '/PCS/PCS001R/' + obj.data.wipID, '', '', true);
}
}
});
@ -148,79 +144,79 @@
{
field: 'wipNo',
width: 100,
title: '工單號碼',
title: '@Localizer["WipNo"]',
sort: true
},
{
field: 'itemNo',
title: '工程編號',
title: '@Localizer["ItemNo"]',
width: 150,
sort: true,
expandedMode: 'tips'
},
{
field: 'description',
title: '機種描述',
title: '@Localizer["WipDescription"]',
width: 100,
expandedMode: 'tips'
},
{
field: 'planQTY',
title: '數量'
title: '@Localizer["PlanQty"]'
},
{
field: 'lineDesc',
title: '線別',
title: '@Localizer["Lineid"]',
sort: true
},
{
field: 'unitName',
title: '生產單位',
title: '@Localizer["UnitNo"]',
width: 100,
sort: true
},
{
field: 'factoryNameCh',
title: '委外廠名稱',
title: '@Localizer["Werks"]',
sort: true
},
{
field: 'wipScheduleDate',
title: '預計開工日',
title: '@Localizer["WipScheduleDate"]',
sort: true,
templet: '<div>{{ layui.util.toDateString(d.wipScheduleDate, "yyyy/MM/dd") }}</div>'
},
{
field: 'workDate',
title: '開工日',
title: '@Localizer["StartDate"]',
sort: true
},
{
field: 'wipDueDate',
title: '預計完成日',
title: '@Localizer["WipDueDate"]',
sort: true,
templet: '<div>{{ layui.util.toDateString(d.wipDueDate, "yyyy/MM/dd") }}</div>'
},
{
field: 'statusNo',
title: '工單狀態',
title: '@Localizer["WipStatus"]',
templet: '#statusNoName'
},
{
field: 'wipCheck',
title: '發送通知'
title: '@Localizer["SendNotification"]'
},
{
field: 'fqcDate',
title: '檢驗完成日'
title: '@Localizer["FQCDate"]'
},
{
field: 'right',
width: 80,
title: '操作',
title: '@Localizer["Action"]',
fixed: 'right',
templet: function (d) {
return '<a class="layui-btn layui-btn-warm layui-icon layui-icon-list layui-btn-xs" lay-event="detail">檢視</a>'
return '<a class="layui-btn layui-btn-warm layui-icon layui-icon-list layui-btn-xs" lay-event="detail">@Localizer["View"]</a>'
}
}
]
@ -230,14 +226,14 @@
//通过行tool檢視,lay-event="detail"
function detail(obj) {
if (obj.data.wipID) {
hg.open('檢視工單資料', '/PCS/PCS001R/' + obj.data.wipID, '', '', true);
hg.open('@Localizer["PCS001R"]', '/PCS/PCS001R/' + obj.data.wipID, '', '', true);
}
}
//通过行tool編輯,lay-event="edit"
function edit(obj) {
if (obj.data.wipID) {
hg.open('修改工單資料', '/PCS/PCS003/' + obj.data.wipID, '', '', true);
hg.open('@Localizer["PCS002"]', '/PCS/PCS003/' + obj.data.wipID, '', '', true);
}
}
@ -264,22 +260,7 @@
});
}
//var toolbar = [{
// text: '新增',
// layuiicon: '&#xe608;',
// class: 'layui-btn-normal',
// handler: function () {
// hg.open('新增工單資料', '/PCS/PCS001', '', '', true);
// }
//}
//];
//基本資料表格
//alert(factoryNo.value);
//alert(unitNo.value);
//alert(wipNo.value);
//alert(itemNo.value);
var param = unitNo.value + '_' + wipNo.value + '_' + itemNo.value + '_' + factoryNo.value;
//alert(param);
var table = hg.table.datatable('query', '工單資料查詢', '/PCS/PCS005Query/' + param, {}, tableCols, "", true, 'full-100', ['filter', 'print', 'exports']);
</script>

25
AMESCoreStudio.Web/Views/PCS/PCS009.cshtml

@ -1,7 +1,8 @@
@model AMESCoreStudio.Web.ViewModels.PCS.PCS009ViewModel
@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer
@{
ViewData["Title"] = "條碼生產歷程查詢";
ViewData["Title"] = @Localizer["PCS009"];
Layout = "~/Views/Shared/_AMESLayout.cshtml";
}
@ -42,25 +43,25 @@
<div class="layui-card-body">
<div class="layui-row" style="text-align:center">
<div class="layui-col-md3" style="text-align:center">
<label class="layui-form-label">生產序號:</label>
<label class="layui-form-label">@Localizer["SerialNumber"]:</label>
<div class="layui-input-inline">
<input asp-for="BarCodeNo" class="layui-input">
</div>
</div>
<div class="layui-col-md3" style="text-align:center">
<label class="layui-form-label">組件條碼:</label>
<label class="layui-form-label">@Localizer["KeypartsBarcode"]:</label>
<div class="layui-input-inline">
<input asp-for="PartNo" class="layui-input">
</div>
</div>
<div class="layui-col-md3" style="text-align:center">
<label class="layui-form-label">出貨序號:</label>
<label class="layui-form-label">@Localizer["ShipmentSerialNumber"]:</label>
<div class="layui-input-inline">
<input asp-for="ExtraBarCodeNo" class="layui-input">
</div>
</div>
<div class="layui-col-md3" style="text-align:center">
<label class="layui-form-label">包裝箱號:</label>
<label class="layui-form-label">@Localizer["BoxNo"]:</label>
<div class="layui-input-inline">
<input asp-for="BoxNo" class="layui-input">
</div>
@ -96,7 +97,7 @@
function detail(obj) {
if (obj.data.barcodeNo) {
hg.open('條碼生產歷程', '/PCS/PCS009R?BarCodeNo=' + obj.data.barcodeNo, '', '', true);
hg.open('@Localizer["PCS009R"]', '/PCS/PCS009R?BarCodeNo=' + obj.data.barcodeNo, '', '', true);
}
}
@ -110,21 +111,21 @@
var tableCols = [[
{
field: 'barcodeNo',
title: '生產序號',
title: '@Localizer["SerialNumber"]',
sort: true
},
{
field: 'extraBarcodeNo',
title: '出貨序號',
title: '@Localizer["ShipmentSerialNumber"]',
sort: true
},
{
field: 'right',
width: 100,
title: '操作',
title: '@Localizer["Action"]',
fixed: 'right',
templet: function (d) {
return '<a class="layui-btn layui-btn-warm layui-icon layui-icon-list layui-btn-xs" lay-event="detail">檢視</a>'
return '<a class="layui-btn layui-btn-warm layui-icon layui-icon-list layui-btn-xs" lay-event="detail">@Localizer["View"]</a>'
/* < a class="layui-btn layui-btn-normal layui-btn-xs layui-icon layui-icon-edit" lay - event="edit" > 修改</a > '*/
}
}]
@ -136,7 +137,7 @@
}
else {
var query = "?BarCodeNo=" + BarCodeNo + "&PartNo=" + PartNo + "&ExtraBarCodeNo=" + ExtraBarCodeNo;
hg.open('條碼生產歷程', '/PCS/PCS009R' + query, '', '', true);
hg.open('@Localizer["PCS009R"]', '/PCS/PCS009R' + query, '', '', true);
}

113
AMESCoreStudio.Web/Views/PCS/PCS009R.cshtml

@ -1,4 +1,6 @@
@model AMESCoreStudio.Web.ViewModels.PCS.PCS009RViewModel
@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer
@{
ViewData["Title"] = "條碼追蹤查詢";
Layout = "~/Views/Shared/_AMESLayout.cshtml";
@ -16,11 +18,11 @@
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="layui-card-body">
<fieldset class="layui-elem-field layui-field-title">
<legend style="color: #e18917">條碼資料</legend>
<legend style="color: #e18917">@Localizer["BarcodeData"]</legend>
</fieldset>
<div class="layui-row">
<div class="layui-col-xs2">
<label class="layui-form-label-col" style="text-align:right;">生產序號:</label>
<label class="layui-form-label-col" style="text-align:right;">@Localizer["SerialNumber"]:</label>
</div>
<div class="layui-col-xs2">
<div class="layui-form-item">
@ -30,7 +32,7 @@
</div>
</div>
<div class="layui-col-xs2">
<label class="layui-form-label-col" style="text-align:right;">出貨序號:</label>
<label class="layui-form-label-col" style="text-align:right;">@Localizer["ShipmentSerialNumber"]:</label>
</div>
<div class="layui-col-xs2">
<div class="layui-form-item">
@ -40,7 +42,7 @@
</div>
</div>
<div class="layui-col-xs2">
<label class="layui-form-label-col" style="text-align:right;">包裝箱號:</label>
<label class="layui-form-label-col" style="text-align:right;">@Localizer["BoxNo"]:</label>
</div>
<div class="layui-col-xs2">
<div class="layui-form-item">
@ -52,7 +54,7 @@
</div>
<div class="layui-row">
<div class="layui-col-xs2">
<label class="layui-form-label-col" style="text-align:right;">狀態描述:</label>
<label class="layui-form-label-col" style="text-align:right;">@Localizer["StatusDescription"]:</label>
</div>
<div class="layui-col-xs2">
<div class="layui-form-item">
@ -62,7 +64,7 @@
</div>
</div>
<div class="layui-col-xs2">
<label class="layui-form-label-col" style="text-align:right;">入庫單號:</label>
<label class="layui-form-label-col" style="text-align:right;">@Localizer["InhouseNo"]:</label>
</div>
<div class="layui-col-xs2">
<div class="layui-form-item">
@ -72,7 +74,7 @@
</div>
</div>
<div class="layui-col-xs2">
<label class="layui-form-label-col" style="text-align:right;">重量(g):</label>
<label class="layui-form-label-col" style="text-align:right;">@Localizer["Wight"]:</label>
</div>
<div class="layui-col-xs2">
<div class="layui-form-item">
@ -84,7 +86,7 @@
</div>
<div class="layui-row">
<fieldset class="layui-elem-field layui-field-title">
<legend style="color: #e18917">工單歷程</legend>
<legend style="color: #e18917">@Localizer["WorkOrderHistory"]</legend>
</fieldset>
<table id="rulestionOld" class="layui-table" lay-skin="nob">
<tbody>
@ -92,23 +94,23 @@
{
<tr>
<td style="width:70px;">
工單號碼
@Localizer["WipNo"]
</td>
<td>
@index.WipNo
</td>
<td>
工程編號
@Localizer["ItemNo"]
</td>
<td>
@index.ItemNo
</td>
<td>
BOM版本
BOM:
</td>
<td></td>
<td>
客戶工單
@Localizer["CustomerWipNo"]
</td>
<td>
@index.CustomerWipNo
@ -116,13 +118,13 @@
</tr>
<tr>
<td>
生產單位
@Localizer["UnitNo"]
</td>
<td>
@index.UnitNo
</td>
<td>
線別
@Localizer["Lineid"]
</td>
<td>
@index.Line
@ -142,7 +144,7 @@
</tr>
<tr>
<td>
建置日期
@Localizer["CreateDate"]
</td>
<td>
@DateTime.Parse(index.CreateDate).ToString("yyyy/MM/dd HH:mm:ss")
@ -154,7 +156,7 @@
@index.DateCode
</td>
<td>
成品料號
@Localizer["CustomerItemNo"]
</td>
<td>
@index.CustomerItemNo
@ -174,25 +176,25 @@
</div>
<div class="layui-row">
<fieldset class="layui-elem-field layui-field-title">
<legend style="color: #e18917">生產歷程</legend>
<legend style="color: #e18917">@Localizer["ProductionHistory"]</legend>
</fieldset>
<table class="layui-table" lay-even lay-size="sm">
<thead>
<tr>
<th>
站別名稱
@Localizer["StationName"]
</th>
<th>
規格描述
@Localizer["StatusDescription"]
</th>
<th>
系統類型
@Localizer["SystemType"]
</th>
<th>
使用者
@Localizer["User"]
</th>
<th>
過站時間
@Localizer["StationDate"]
</th>
</tr>
</thead>
@ -213,7 +215,6 @@
@index.RuleStation
</td>
}
<td>
@index.SysType
</td>
@ -230,28 +231,28 @@
</div>
<div class="layui-row">
<fieldset class="layui-elem-field layui-field-title">
<legend style="color: #e18917">組件清單</legend>
<legend style="color: #e18917">@Localizer["KeypartsList"]</legend>
</fieldset>
<table class="layui-table" lay-even lay-size="sm">
<thead>
<tr>
<th>
站別名稱
@Localizer["StationName"]
</th>
<th>
組件名稱
@Localizer["KeypartsPartName"]
</th>
<th>
組件條碼
@Localizer["KeypartsBarcode"]
</th>
<th>
組件料號
@Localizer["KeypartsPartNumber"]
</th>
<th>
綁入人員
@Localizer["User"]
</th>
<th>
綁入時間
@Localizer["CreateDate"]
</th>
</tr>
</thead>
@ -284,31 +285,31 @@
</div>
<div class="layui-row">
<fieldset class="layui-elem-field layui-field-title">
<legend style="color: #e18917">送修紀錄</legend>
<legend style="color: #e18917">@Localizer["RepairRecord"]</legend>
</fieldset>
<table class="layui-table" lay-even lay-size="sm">
<thead>
<tr>
<th>
站別名稱
@Localizer["StationName"]
</th>
<th>
不良代碼
@Localizer["DefectCode"]
</th>
<th>
零件位置
@Localizer["PartLocation"]
</th>
<th>
維修代碼
@Localizer["RepairCode"]
</th>
<th>
維修狀態
@Localizer["RepairStatus"]
</th>
<th>
回覆人員
@Localizer["ReplyUser"]
</th>
<th>
回覆日期
@Localizer["ReplyDate"]
</th>
</tr>
</thead>
@ -348,19 +349,19 @@
</div>
<div class="layui-row">
<fieldset class="layui-elem-field layui-field-title">
<legend style="color: #e18917">治具清單</legend>
<legend style="color: #e18917">@Localizer["FixtureList"]</legend>
</fieldset>
<table class="layui-table" lay-even lay-size="sm">
<thead>
<tr>
<th>
站別名稱
@Localizer["StationName"]
</th>
<th>
設備編號
@Localizer["EquipmentNumber"]
</th>
<th>
過站時間
@Localizer["StationDate"]
</th>
</tr>
</thead>
@ -384,28 +385,28 @@
</div>
<div class="layui-row">
<fieldset class="layui-elem-field layui-field-title">
<legend style="color: #e18917">條碼變更</legend>
<legend style="color: #e18917">@Localizer["BarcodeChange"]</legend>
</fieldset>
<table class="layui-table" lay-even lay-size="sm">
<thead>
<tr>
<th>
(舊)條碼序號
@Localizer["BarcodeSerialNumberOld"]
</th>
<th>
(新)條碼序號
@Localizer["BarcodeSerialNumberNew"]
</th>
<th>
變更類型
@Localizer["ChangeType"]
</th>
<th>
備註
@Localizer["Remarks"]
</th>
<th>
變更人員
@Localizer["ChangeUser"]
</th>
<th>
變更時間
@Localizer["ChangeDate"]
</th>
</tr>
</thead>
@ -438,25 +439,25 @@
</div>
<div class="layui-row">
<fieldset class="layui-elem-field layui-field-title">
<legend style="color: #e18917">組件變更</legend>
<legend style="color: #e18917">@Localizer["KeypartsChange"]</legend>
</fieldset>
<table class="layui-table" lay-even lay-size="sm">
<thead>
<tr>
<th>
站別名稱
@Localizer["StationName"]
</th>
<th>
組件名稱
@Localizer["KeypartsPartName"]
</th>
<th>
(舊)組件條碼
@Localizer["KeypartsBarcodeOld"]
</th>
<th>
替換人員
@Localizer["ReplaceUser"]
</th>
<th>
替換時間
@Localizer["ReplaceDate"]
</th>
</tr>
</thead>
@ -486,7 +487,7 @@
</div>
<div class="layui-row">
<fieldset class="layui-elem-field layui-field-title">
<legend style="color: #e18917">備料</legend>
<legend style="color: #e18917">@Localizer["MaterialPreparation"]</legend>
</fieldset>
</div>
</div>

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

@ -942,14 +942,23 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES
// 新增 BarCodeStation
for (int i = 0; i < KeyPartsItem.Count; i++)
{
var partNo = KeyPartsItem[i].inputData.Trim();
var kpNo = KeyPartsItem[i].inputType.Trim();
// MAC時,在確認是否重複
if (kpNo.ToUpper().Contains("MAC"))
{
if (SecondDuplicateCheckKP(data.wipNo, kpNo, data.unitNo, partNo))
return $"KP條碼有重複:{partNo}";
}
barcodeItem.Add(new BarcodeItem
{
BarcodeItemID = id[i],
BarcodeID = data.barcodeID,
WipID = data.wipID,
StationID = data.stationID,
ItemNo = KeyPartsItem[i].inputType,
PartNo = KeyPartsItem[i].inputData,
ItemNo = kpNo,
PartNo = partNo,
SysType = "S",
CreateUserID = data.userID,
CreateDate = DateTime.Now,
@ -3344,7 +3353,7 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES
// 判斷KP是否重複=N
if (wipKp.IsRepeat == "N")
{
if (await _context.BarcodeItems.Where(w => w.PartNo == inputItem.inputData.ToUpper().Trim()).AnyAsync())
if (await _context.BarcodeItems.AsNoTracking().Where(w => w.PartNo == inputItem.inputData.ToUpper().Trim()).AnyAsync())
{
CheckMsg += "組件名稱【" + wipKp.KpName + "】已有相同組件序號【" + inputItem.inputData + "】紀錄 </br>";
}
@ -3639,6 +3648,43 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES
}
/// <summary>
/// 確認KP是否重複
/// </summary>
/// <param name="wipNo">工單號碼</param>
/// <param name="kpNo">KP料號</param>
/// <param name="unitNo">生產單位</param>
/// <param name="partNo">刷入KP條碼</param>
/// <returns>true:KP條碼重複,false:表示不重複</returns>
private bool SecondDuplicateCheckKP(string wipNo, string kpNo, string unitNo, string partNo)
{
var query = @" SELECT 1 AS RESULT FROM DUAL
WHERE EXISTS ( -- KP設定不能重複
SELECT 1 FROM JHAMES.WIP_KP
WHERE WIP_NO = :WipNo
AND KP_NO = :KpNo
AND UNIT_NO = :UnitNo
AND IS_REPEAT = 'N'
)
AND EXISTS (
SELECT 1
FROM JHAMES.BARCODE_ITEM
WHERE PART_NO = :PartNo
)";
DynamicParameters p = new DynamicParameters();
p.Add("WipNo", wipNo);
p.Add("KpNo", kpNo);
p.Add("UnitNo", unitNo);
p.Add("WipNo", wipNo);
p.Add("PartNo", partNo);
var result = _context.Database.DapperQuery<dynamic>(query, p);
if (result.Any())
return true;
else
return false;
}
}
}

Loading…
Cancel
Save