Browse Source

1. 修正燒機判斷

2. 工單基本新增復原
PTD
Ray 3 years ago
parent
commit
2c656316a3
  1. 515
      AMESCoreStudio.Web/Controllers/PCSController.cs
  2. 7
      AMESCoreStudio.Web/HttpApis/AMES/IPCS.cs
  3. 412
      AMESCoreStudio.Web/Views/PCS/PCS001.cshtml
  4. 19
      AMESCoreStudio.WebApi/Controllers/AMES/MaterialKpController.cs
  5. 215
      AMESCoreStudio.WebApi/Controllers/BLL/BarCodeCheckController.cs
  6. 2
      AMESCoreStudio.WebApi/DTO/BLL/BarCodeCheckDto.cs

515
AMESCoreStudio.Web/Controllers/PCSController.cs

@ -1298,7 +1298,7 @@ namespace AMESCoreStudio.Web.Controllers
//頁面提交,id=0 添加,id>0 修改
[HttpPost]
public async Task<IActionResult> PCS001Async(WipDataViewModel model, string action, IFormFile formFile)
public async Task<IActionResult> PCS001Async(WipDataViewModel model, IFormFile formFile)
{
#region 選單
await GetProductType();
@ -1328,63 +1328,7 @@ namespace AMESCoreStudio.Web.Controllers
#endregion
IResultModel result;
int UserID = GetLogInUserID();
if (action == "Copy")
{
model.wipAtt = await _pcsApi.GetWipAtt(model.wipInfo.WipNO);
if (model.wipAtt == null)
{
}
model.wipBarcodes = await _pcsApi.GetWipBarcode(model.wipInfo.WipNO);
model.wipBarcode = model.wipBarcodes.FirstOrDefault();
model.ruleStations = await _pcsApi.GetRuleStationByWipNo(model.wipInfo.WipNO);
model.wipBoard = await _pcsApi.GetWipBoard(model.wipInfo.WipNO);
if (model.wipBoard != null)
{
if (!string.IsNullOrWhiteSpace(model.wipBoard.Engineer))
{
var UserInof = _sysApi.GetUserInfoByUserNo(model.wipBoard.Engineer).InvokeAsync().Result;
if (UserInof != null)
model.wipBoard.Engineer_Name = UserInof.UserName;
}
}
model.wipSystem = await _pcsApi.GetWipSystem(model.wipInfo.WipNO);
if (model.wipSystem != null)
{
if (!string.IsNullOrWhiteSpace(model.wipSystem.Engineer))
{
var UserInof = _sysApi.GetUserInfoByUserNo(model.wipSystem.Engineer).InvokeAsync().Result;
if (UserInof != null)
model.wipSystem.Engineer_Name = UserInof.UserName;
}
}
model.wipMAC = await _pcsApi.GetWipMAC(model.wipInfo.WipNO);
if (model.wipMAC != null)
{
model.wipMAC.StartNO = model.wipMAC.Title + model.wipMAC.StartNO;
model.wipMAC.EndNO = model.wipMAC.Title + model.wipMAC.EndNO;
}
model.wipLabel = await _pcsApi.GetWipLabel(model.wipInfo.WipNO);
model.wipBarcodeOther = await _pcsApi.GetWipBarcodeOther(model.wipInfo.WipNO);
model.WipKps = await _pcsApi.GetWipKpByWipNo(model.wipInfo.WipNO);
model.WipOutfits = await _pcsApi.GetWipOutfitByWipNo(model.wipInfo.WipNO);
model.WipSops = await _pcsApi.GetWipSopByWipNo(model.wipInfo.WipNO);
model.wipInfoBlobs = await _pcsApi.GetWipInfoBlob(model.wipInfo.WipNO);
}
#region Checkbox轉換
// Checkbox轉換
model.wipInfo.ECNCheck = model.wipInfo.ECNCheck == "true" ? "Y" : "N";
model.wipInfo.ModelCheck = model.wipInfo.ModelCheck == "true" ? "Y" : "N";
model.wipInfo.InputFlag = model.wipInfo.InputFlag == "true" ? "Y" : "N";
@ -1393,262 +1337,301 @@ namespace AMESCoreStudio.Web.Controllers
model.wipInfo.CustomerVIP = model.wipInfo.CustomerVIP == "true" ? "Y" : "N";
model.wipInfo.SFISFlowCk = model.wipInfo.SFISFlowCk == "true" ? "Y" : "N";
//板卡
if (model.wipBoard != null)
{
model.wipBoard.DipCarrier = model.wipBoard.DipCarrier == "true" ? "Y" : "N";
model.wipBoard.DipTape = model.wipBoard.DipTape == "true" ? "Y" : "N";
model.wipBoard.DipSolderMask = model.wipBoard.DipSolderMask == "true" ? "Y" : "N";
model.wipBoard.Burn = model.wipBoard.Burn == "true" ? "Y" : "N";
model.wipBoard.ISPartsBake = model.wipBoard.ISPartsBake == "true" ? "Y" : "N";
}
model.wipBoard.DipCarrier = model.wipBoard.DipCarrier == "true" ? "Y" : "N";
model.wipBoard.DipTape = model.wipBoard.DipTape == "true" ? "Y" : "N";
model.wipBoard.DipSolderMask = model.wipBoard.DipSolderMask == "true" ? "Y" : "N";
model.wipBoard.Burn = model.wipBoard.Burn == "true" ? "Y" : "N";
model.wipBoard.ISPartsBake = model.wipBoard.ISPartsBake == "true" ? "Y" : "N";
//系統
if (model.wipSystem != null)
model.wipSystem.FinePackage = model.wipSystem.FinePackage == "true" ? "Y" : "N";
// 判斷資料填寫
var Msg = CheckWipInfoInsert(model);
// 判斷是否有開重複工單+生產單位
var wipInfoQuery = await _pcsApi.GetWipInfoByWipNO(model.wipInfo.WipNO);
if (wipInfoQuery.Any())
{
model.wipSystem.FinePackage = model.wipSystem.FinePackage == "true" ? "Y" : "N";
if (wipInfoQuery.Where(w => w.UnitNO == model.wipInfo.UnitNO).Count() != 0)
{
Msg += " 同樣生產單位已建立相同工單了 ";
}
}
if (!string.IsNullOrWhiteSpace(Msg))
{
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";
model.wipInfo.Priority = model.wipInfo.Priority == "Y" ? "true" : "false";
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";
//板卡
model.wipBoard.DipCarrier = model.wipBoard.DipCarrier == "Y" ? "true" : "false";
model.wipBoard.DipTape = model.wipBoard.DipTape == "Y" ? "true" : "false";
model.wipBoard.DipSolderMask = model.wipBoard.DipSolderMask == "Y" ? "true" : "false";
model.wipBoard.ISPartsBake = model.wipBoard.ISPartsBake == "Y" ? "true" : "false";
model.wipBoard.Burn = model.wipBoard.Burn == "Y" ? "true" : "false";
//系統
model.wipSystem.FinePackage = model.wipSystem.FinePackage == "Y" ? "true" : "false";
ModelState.AddModelError("error", Msg);
#endregion
return View("PCS001", model);
}
#region 保存動作
if (action == "保存")
result = await _pcsApi.PostWipInfo(JsonConvert.SerializeObject(model.wipInfo));
if (result.Success)
{
// 判斷資料填寫
var Msg = CheckWipInfoInsert(model);
int wipID = int.Parse(result.Msg);
// 判斷是否有開重複工單+生產單位
var wipInfoQuery = await _pcsApi.GetWipInfoByWipNO(model.wipInfo.WipNO);
if (wipInfoQuery.Any())
// 料號判斷,沒有就Insert
var checkMaterialItem = await _pcsApi.GetMaterialItemByItemNO(model.wipAtt.ItemNO);
if (checkMaterialItem == null)
{
if (wipInfoQuery.Where(w => w.UnitNO == model.wipInfo.UnitNO).Count() != 0)
{
Msg += " 同樣生產單位已建立相同工單了 ";
}
await _pcsApi.PostMaterialItem(JsonConvert.SerializeObject(
new MaterialItem
{
ItemNo = model.wipAtt.ItemNO,
CreateUserID = UserID
}));
}
if (!string.IsNullOrWhiteSpace(Msg))
{
ModelState.AddModelError("error", Msg);
// 工單屬性
model.wipAtt.WipNO = model.wipInfo.WipNO;
model.wipAtt.CreateUserID = UserID;
await _pcsApi.PostWipAtt(JsonConvert.SerializeObject(model.wipAtt));
return View("PCS001", model);
}
// 標籤
model.wipLabel.ApproveLogo = model.wipLabel.ApproveLogos == null ? null : string.Join(',', model.wipLabel.ApproveLogos);
model.wipLabel.WipNO = model.wipInfo.WipNO;
model.wipLabel.CreateUserID = UserID;
model.wipLabel.UpdateUserID = UserID;
await _pcsApi.PostWipLabel(JsonConvert.SerializeObject(model.wipLabel));
// 新增工單Log
WipLog wiplog = new WipLog();
wiplog.WipID = wipID;
wiplog.StatusNO = "N";
wiplog.WipDesc = ".";
wiplog.CreateUserID = UserID;
await _pcsApi.PostWipLog(JsonConvert.SerializeObject(wiplog));
result = await _pcsApi.PostWipInfo(JsonConvert.SerializeObject(model.wipInfo));
if (result.Success)
// 系統
if (model.wipInfo.UnitNO == "B" || model.wipInfo.UnitNO == "P" || model.wipInfo.UnitNO == "T")
{
int wipID = int.Parse(result.Msg);
// 料號判斷,沒有就Insert
var checkMaterialItem = await _pcsApi.GetMaterialItemByItemNO(model.wipAtt.ItemNO);
if (checkMaterialItem == null)
{
await _pcsApi.PostMaterialItem(JsonConvert.SerializeObject(
new MaterialItem
{
ItemNo = model.wipAtt.ItemNO,
CreateUserID = UserID
}));
}
// 工單屬性
model.wipAtt.WipNO = model.wipInfo.WipNO;
model.wipAtt.CreateUserID = UserID;
await _pcsApi.PostWipAtt(JsonConvert.SerializeObject(model.wipAtt));
// 標籤
model.wipLabel.ApproveLogo = model.wipLabel.ApproveLogos == null ? null : string.Join(',', model.wipLabel.ApproveLogos);
model.wipLabel.WipNO = model.wipInfo.WipNO;
model.wipLabel.CreateUserID = UserID;
model.wipLabel.UpdateUserID = UserID;
await _pcsApi.PostWipLabel(JsonConvert.SerializeObject(model.wipLabel));
// 新增工單Log
WipLog wiplog = new WipLog();
wiplog.WipID = wipID;
wiplog.StatusNO = "N";
wiplog.WipDesc = ".";
wiplog.CreateUserID = UserID;
await _pcsApi.PostWipLog(JsonConvert.SerializeObject(wiplog));
// 系統
if (model.wipInfo.UnitNO == "B" || model.wipInfo.UnitNO == "P" || model.wipInfo.UnitNO == "T")
if (string.IsNullOrWhiteSpace(CheckWipInfoInsert_WipSystem(model.wipSystem)))
{
if (string.IsNullOrWhiteSpace(CheckWipInfoInsert_WipSystem(model.wipSystem)))
if (!string.IsNullOrWhiteSpace(model.wipSystem.BiTemperature))
{
if (!string.IsNullOrWhiteSpace(model.wipSystem.BiTemperature))
{
model.wipSystem.ItemNo = model.wipAtt.ItemNO;
model.wipSystem.WipNo = model.wipInfo.WipNO;
model.wipSystem.CreateUserID = UserID;
model.wipSystem.UpdateUserID = UserID;
await _pcsApi.PostWipSystem(JsonConvert.SerializeObject(model.wipSystem));
}
model.wipSystem.ItemNo = model.wipAtt.ItemNO;
model.wipSystem.WipNo = model.wipInfo.WipNO;
model.wipSystem.CreateUserID = UserID;
model.wipSystem.UpdateUserID = UserID;
await _pcsApi.PostWipSystem(JsonConvert.SerializeObject(model.wipSystem));
}
}
else
// 板卡
}
else
// 板卡
{
if (string.IsNullOrWhiteSpace(CheckWipInfoInsert_WipBoard(model.wipBoard)))
{
if (string.IsNullOrWhiteSpace(CheckWipInfoInsert_WipBoard(model.wipBoard)))
if (!string.IsNullOrWhiteSpace(model.wipBoard.BiTemperature))
{
if (!string.IsNullOrWhiteSpace(model.wipBoard.BiTemperature))
{
model.wipBoard.Smd = model.wipBoard.SMDs == null ? null : string.Join(',', model.wipBoard.SMDs);
model.wipBoard.DipSide = model.wipBoard.DipSides == null ? null : string.Join(',', model.wipBoard.DipSides);
model.wipBoard.SmdSolderMask = model.wipBoard.SmdSolderMasks == null ? null : string.Join(',', model.wipBoard.SmdSolderMasks);
model.wipBoard.ItemNo = model.wipAtt.ItemNO;
model.wipBoard.WipNo = model.wipInfo.WipNO;
model.wipBoard.CreateUserID = UserID;
model.wipBoard.UpdateUserID = UserID;
await _pcsApi.PostWipBoard(JsonConvert.SerializeObject(model.wipBoard));
}
model.wipBoard.Smd = model.wipBoard.SMDs == null ? null : string.Join(',', model.wipBoard.SMDs);
model.wipBoard.DipSide = model.wipBoard.DipSides == null ? null : string.Join(',', model.wipBoard.DipSides);
model.wipBoard.SmdSolderMask = model.wipBoard.SmdSolderMasks == null ? null : string.Join(',', model.wipBoard.SmdSolderMasks);
model.wipBoard.ItemNo = model.wipAtt.ItemNO;
model.wipBoard.WipNo = model.wipInfo.WipNO;
model.wipBoard.CreateUserID = UserID;
model.wipBoard.UpdateUserID = UserID;
await _pcsApi.PostWipBoard(JsonConvert.SerializeObject(model.wipBoard));
}
}
}
// 內部條碼
if (!string.IsNullOrWhiteSpace(model.wipBarcode.StartNO) && !string.IsNullOrWhiteSpace(model.wipBarcode.EndNO))
{
model.wipBarcode.WipID = wipID;
model.wipBarcode.WipNO = model.wipInfo.WipNO;
model.wipBarcode.UnitNO = model.wipInfo.UnitNO;
model.wipBarcode.CreateUserID = UserID;
result = await _pcsApi.PostWipBarcode(JsonConvert.SerializeObject(model.wipBarcode));
// 工單條碼規則設定文件檔
WipRule wipRule = new WipRule();
wipRule.WipNO = model.wipInfo.WipNO;
wipRule.KeyNo = "00";
wipRule.BarcodeLen = 14;
wipRule.BarcodeFormat = model.wipInfo.UnitNO;
result = await _pcsApi.PostWipRule(JsonConvert.SerializeObject(wipRule));
}
// 內部條碼
if (!string.IsNullOrWhiteSpace(model.wipBarcode.StartNO) && !string.IsNullOrWhiteSpace(model.wipBarcode.EndNO))
// 出貨序號
if (!string.IsNullOrWhiteSpace(model.wipBarcodeOther.StartNO) && !string.IsNullOrWhiteSpace(model.wipBarcodeOther.EndNO))
{
var type_no = await _pcsApi.GetBarcodeTypeByTypeName("客戶條碼區間");
if (type_no != null)
{
model.wipBarcode.WipID = wipID;
model.wipBarcode.WipNO = model.wipInfo.WipNO;
model.wipBarcode.UnitNO = model.wipInfo.UnitNO;
model.wipBarcode.CreateUserID = UserID;
result = await _pcsApi.PostWipBarcode(JsonConvert.SerializeObject(model.wipBarcode));
// 工單條碼規則設定文件檔
WipRule wipRule = new WipRule();
wipRule.WipNO = model.wipInfo.WipNO;
wipRule.KeyNo = "00";
wipRule.BarcodeLen = 14;
wipRule.BarcodeFormat = model.wipInfo.UnitNO;
result = await _pcsApi.PostWipRule(JsonConvert.SerializeObject(wipRule));
model.wipBarcodeOther.WipNO = model.wipInfo.WipNO;
model.wipBarcodeOther.TypeNO = type_no.TypeNo;
model.wipBarcodeOther.CreateUserID = UserID;
model.wipBarcodeOther.UpdateUserID = UserID;
result = await _pcsApi.PostWipBarcodeOther(JsonConvert.SerializeObject(model.wipBarcodeOther));
}
}
// 出貨序號
if (!string.IsNullOrWhiteSpace(model.wipBarcodeOther.StartNO) && !string.IsNullOrWhiteSpace(model.wipBarcodeOther.EndNO))
// MAC
if (!string.IsNullOrWhiteSpace(model.wipMAC.StartNO) && !string.IsNullOrWhiteSpace(model.wipMAC.EndNO))
{
var mACInfo = await _pcsApi.GetMACInfo(model.wipAtt.ItemNO);
if (mACInfo != null)
{
var type_no = await _pcsApi.GetBarcodeTypeByTypeName("客戶條碼區間");
if (type_no != null)
{
model.wipBarcodeOther.WipNO = model.wipInfo.WipNO;
model.wipBarcodeOther.TypeNO = type_no.TypeNo;
model.wipBarcodeOther.CreateUserID = UserID;
model.wipBarcodeOther.UpdateUserID = UserID;
result = await _pcsApi.PostWipBarcodeOther(JsonConvert.SerializeObject(model.wipBarcodeOther));
}
model.wipMAC.WipNO = model.wipInfo.WipNO;
model.wipMAC.Title = mACInfo.Title;
model.wipMAC.ClassGroup = mACInfo.ClassGroup;
model.wipMAC.CreateUserID = UserID;
result = await _pcsApi.PostWipMAC(JsonConvert.SerializeObject(model.wipMAC));
result = await _pcsApi.PutMACInfoByClassGroup(mACInfo.ClassGroup, model.wipMAC.EndNO);
}
}
// MAC
if (!string.IsNullOrWhiteSpace(model.wipMAC.StartNO) && !string.IsNullOrWhiteSpace(model.wipMAC.EndNO))
// 料號相關
var materialItem = await _pcsApi.GetMaterialItemByItemNO(model.wipAtt.ItemNO);
if (materialItem != null)
{
// KeyParts 組合
var materialKp = await _pcsApi.GetMaterialKpByItemID(materialItem.ItemID);
foreach (var item in materialKp.Where(w => w.StationType == model.wipInfo.UnitNO))
{
var mACInfo = await _pcsApi.GetMACInfo(model.wipAtt.ItemNO);
if (mACInfo != null)
var wipKp = new WipKp
{
model.wipMAC.WipNO = model.wipInfo.WipNO;
model.wipMAC.Title = mACInfo.Title;
model.wipMAC.ClassGroup = mACInfo.ClassGroup;
model.wipMAC.CreateUserID = UserID;
result = await _pcsApi.PostWipMAC(JsonConvert.SerializeObject(model.wipMAC));
result = await _pcsApi.PutMACInfoByClassGroup(mACInfo.ClassGroup, model.wipMAC.EndNO);
}
WipNo = model.wipInfo.WipNO,
ItemNo = model.wipAtt.ItemNO,
UnitNo = model.wipInfo.UnitNO,
KpName = item.KpName,
KpNo = item.KpNo,
KpSeq = item.KpSeq,
Length = item.Length,
Title = item.Title,
CreateUserID = UserID,
UpdateUserID = UserID
};
await _pcsApi.PostWipKp(JsonConvert.SerializeObject(wipKp));
}
// 料號相關
var materialItem = await _pcsApi.GetMaterialItemByItemNO(model.wipAtt.ItemNO);
if (materialItem != null)
// 治具
var materialOutfit = await _pcsApi.GetMaterialOutfitByItemNo(model.wipAtt.ItemNO);
foreach (var item in materialOutfit.Where(w => w.UnitNo == model.wipInfo.UnitNO))
{
// KeyParts 組合
var materialKp = await _pcsApi.GetMaterialKpByItemID(materialItem.ItemID);
foreach (var item in materialKp.Where(w => w.StationType == model.wipInfo.UnitNO))
var wipOutfit = new WipOutfit
{
var wipKp = new WipKp
{
WipNo = model.wipInfo.WipNO,
ItemNo = model.wipAtt.ItemNO,
UnitNo = model.wipInfo.UnitNO,
KpName = item.KpName,
KpNo = item.KpNo,
KpSeq = item.KpSeq,
Length = item.Length,
Title = item.Title,
CreateUserID = UserID,
UpdateUserID = UserID
};
await _pcsApi.PostWipKp(JsonConvert.SerializeObject(wipKp));
}
// 治具
var materialOutfit = await _pcsApi.GetMaterialOutfitByItemNo(model.wipAtt.ItemNO);
foreach (var item in materialOutfit.Where(w => w.UnitNo == model.wipInfo.UnitNO))
{
var wipOutfit = new WipOutfit
{
WipNo = model.wipInfo.WipNO,
ItemNo = model.wipAtt.ItemNO,
UnitNo = model.wipInfo.UnitNO,
OutfitNo = item.OutfitNo,
PartNo = item.StationType,
CreateUserID = UserID,
UpdateUserID = UserID
};
await _pcsApi.PostWipOutfit(JsonConvert.SerializeObject(wipOutfit));
}
WipNo = model.wipInfo.WipNO,
ItemNo = model.wipAtt.ItemNO,
UnitNo = model.wipInfo.UnitNO,
OutfitNo = item.OutfitNo,
PartNo = item.StationType,
CreateUserID = UserID,
UpdateUserID = UserID
};
await _pcsApi.PostWipOutfit(JsonConvert.SerializeObject(wipOutfit));
}
// 工單對應SOP
var materialSop = await _pcsApi.GetMaterialSopByItemNo(model.wipAtt.ItemNO);
foreach (var item in materialSop.Where(w => w.UnitNo == model.wipInfo.UnitNO))
// 工單對應SOP
var materialSop = await _pcsApi.GetMaterialSopByItemNo(model.wipAtt.ItemNO);
foreach (var item in materialSop.Where(w => w.UnitNo == model.wipInfo.UnitNO))
{
var wipSop = new WipSop
{
var wipSop = new WipSop
{
WipNo = model.wipInfo.WipNO,
ItemNo = model.wipAtt.ItemNO,
UnitNo = model.wipInfo.UnitNO,
SOPName = item.SopName,
SOPPath = item.SopPath,
SOPType = item.SopType,
CreateUserID = UserID,
UpdateUserID = UserID
};
await _pcsApi.PostWipSop(JsonConvert.SerializeObject(wipSop));
}
WipNo = model.wipInfo.WipNO,
ItemNo = model.wipAtt.ItemNO,
UnitNo = model.wipInfo.UnitNO,
SOPName = item.SopName,
SOPPath = item.SopPath,
SOPType = item.SopType,
CreateUserID = UserID,
UpdateUserID = UserID
};
await _pcsApi.PostWipSop(JsonConvert.SerializeObject(wipSop));
}
}
}
if (result.Success)
if (result.Success)
{
var _msg = "新增成功!";
return RedirectToAction("Refresh", "Home", new { msg = _msg });
}
else
{
if (result.Errors != null)
{
var _msg = "新增成功!";
return RedirectToAction("Refresh", "Home", new { msg = _msg });
ModelState.AddModelError(result.Errors[0].Id, result.Errors[0].Msg);
}
else
{
if (result.Errors != null)
{
ModelState.AddModelError(result.Errors[0].Id, result.Errors[0].Msg);
}
else
{
ModelState.AddModelError("error", result.Msg);
}
ModelState.AddModelError("error", result.Msg);
}
}
#endregion
return View();
}
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";
model.wipInfo.Priority = model.wipInfo.Priority == "Y" ? "true" : "false";
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";
//板卡
model.wipBoard.DipCarrier = model.wipBoard.DipCarrier == "Y" ? "true" : "false";
model.wipBoard.DipTape = model.wipBoard.DipTape == "Y" ? "true" : "false";
model.wipBoard.DipSolderMask = model.wipBoard.DipSolderMask == "Y" ? "true" : "false";
model.wipBoard.ISPartsBake = model.wipBoard.ISPartsBake == "Y" ? "true" : "false";
model.wipBoard.Burn = model.wipBoard.Burn == "Y" ? "true" : "false";
[HttpPost]
public async Task<IActionResult> PCS001CreateWipNo(WipDataViewModel model)
{
//await GetUnitList();
await GetProductType();
await GetFactoryInfo();
await GetFactoryUnit();
await GetLineInfo();
await GetMFGType();
await GetProcessTypes();
await GetFlowRuleList();
GetWipSEQType();
GetBurnType();
GetPartsBakeType();
GetPCBBakeTypeSelect();
GetPCBProcessingTypeSelect();
GetSolderPasteSelect();
GetWipType();
GetSOPTypeSelect();
GetWipSystemTypeSelect();
GetWipSystemPMTypeSelect();
GetCheckboxApproveLogo();
GetCheckboxCompanyLogo();
GetCheckboxPrintMode();
GetCheckboxWipAttr();
GetCheckboxDIP();
GetCheckboxSMD();
//系統
model.wipSystem.FinePackage = model.wipSystem.FinePackage == "Y" ? "true" : "false";
return View(model);
model.wipAtt = await _pcsApi.GetWipAtt(model.wipInfo.WipNO);
model.wipBarcodes = await _pcsApi.GetWipBarcode(model.wipInfo.WipNO);
model.ruleStations = await _pcsApi.GetRuleStationByWipNo(model.wipInfo.WipNO);
var q1 = await _pcsApi.GetMaterialSopQuery(itemNo: model.wipAtt.ItemNO);
model.materialSops = q1.Data;
model.WipKps = await _pcsApi.GetWipKpByWipNo(model.wipInfo.WipNO);
model.wipBoard = await _pcsApi.GetWipBoard(model.wipInfo.WipNO);
model.wipSystem = await _pcsApi.GetWipSystem(model.wipInfo.WipNO);
model.wipMAC = await _pcsApi.GetWipMAC(model.wipInfo.WipNO);
model.wipLabel = await _pcsApi.GetWipLabel(model.wipInfo.WipNO);
model.wipBarcodeOther = await _pcsApi.GetWipBarcodeOther(model.wipInfo.WipNO);
model.Outfits = await _pcsApi.GetMaterialOutfitByItemNo(model.wipAtt.ItemNO);
return View("PCS001", model);
}
public async Task<IActionResult> PCS001R(int id)
@ -1960,7 +1943,7 @@ namespace AMESCoreStudio.Web.Controllers
}
}
result = await _pcsApi.PutWipInfo(JsonConvert.SerializeObject(model.wipInfo));
if (result.Success)
{

7
AMESCoreStudio.Web/HttpApis/AMES/IPCS.cs

@ -572,6 +572,13 @@ namespace AMESCoreStudio.Web
[WebApiClient.Attributes.HttpGet("api/MaterialKp/ByItemID/{id}")]
ITask<List<MaterialKp>> GetMaterialKpByItemID(int id);
/// <summary>
/// 料號KP資訊資料檔 ByItemNo
/// </summary>
/// <param name="id">料號No</param>
[WebApiClient.Attributes.HttpGet("api/MaterialKp/ByItemNo/{id}")]
ITask<List<MaterialKp>> GetMaterialKpByItemNo(string id);
/// <summary>
/// Keypart查詢
/// </summary>

412
AMESCoreStudio.Web/Views/PCS/PCS001.cshtml

@ -1,7 +1,7 @@
@model AMESCoreStudio.Web.ViewModels.PCS.WipDataViewModel
@{ ViewData["Title"] = "PCS001";
@{ ViewData["Title"] = "PCS001C";
Layout = "~/Views/Shared/_AMESLayout.cshtml";
}
@ -17,12 +17,11 @@
<div class="layui-card">
<div class="col-sm-12">
<form enctype="multipart/form-data" method="post" asp-action="PCS001" class="layui-form">
<form enctype="multipart/form-data" method="post" id="PCS001" asp-action="PCS001" class="layui-form">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<input asp-for="wipAtt.ItemNO" type="hidden" value="@if(Model.wipAtt != null) {@Model.wipAtt.ItemNO}" />
<input asp-for="wipBarcodeOther.OtherID" type="hidden" value="@if(Model.wipBarcodeOther != null){ @Model.wipBarcodeOther.OtherID }" />
<input asp-for="wipMAC.WipNO" type="hidden" value="@if(Model.wipMAC != null){ @Model.wipMAC.WipNO }" />
<div class="layui-form-item " style="padding-left:30px">
<div class="layui-form-item" style="padding-left:30px">
@*<input @if (Model.wipInfo != null) { @(Model.wipInfo.InputFlag == "Y" ? "checked" : "") } type="checkbox" title="判斷前製程是否已經投入" name="wipInfo.InputFlag" />*@
<input asp-for="wipInfo.InputFlag" type="checkbox" title="判斷前製程是否已經投入" />
</div>
@ -30,12 +29,10 @@
<div class="layui-inline">
<label asp-for="wipInfo.WipNO" class="layui-form-label"></label>
<div class="layui-input-inline">
<input asp-for="wipInfo.WipNO" style="width: 140px; display:initial" class="layui-input" autocomplete="off" />
<button class="layui-btn layui-btn-sm layui-btn-normal" name="action" value="Copy" lay-submit lay-filter="querysubmit">
<i class="layui-icon layui-icon-sm">&#xe615;</i>
</button>
<span asp-validation-for="wipInfo.WipNO" class="layui-bg-red"></span>
<input asp-for="wipInfo.WipNO" class="layui-input" autocomplete="off" oninput="let p=this.selectionStart;this.value=this.value.toUpperCase();this.setSelectionRange(p, p);" placeholder="請輸入工單號碼" />
<span asp-validation-for="wipInfo.WipNO" class="layui-bg-red"></span>
<input id="btnCreateWipNo" hidden type="submit" value="submit" asp-controller="PCS" asp-action="PCS001CreateWipNo" />
</div>
<label asp-for="wipInfo.WipSEQ" class="layui-form-label"></label>
<div class="layui-input-inline">
@ -43,15 +40,12 @@
</div>
<label asp-for="wipAtt.ItemNO" class="layui-form-label"></label>
<div class="layui-input-inline">
<input asp-for="wipAtt.ItemNO" style="width: 140px; display:initial" class="layui-input" autocomplete="off" />
<button class="layui-btn layui-btn-sm layui-btn-normal" name="action" value="Item" lay-submit lay-filter="querysubmit">
<i class="layui-icon layui-icon-sm">&#xe615;</i>
</button>
<input asp-for="wipAtt.ItemNO" class="layui-input" autocomplete="off" oninput="let p=this.selectionStart;this.value=this.value.toUpperCase();this.setSelectionRange(p, p);" placeholder="請輸入料號" />
<span asp-validation-for="wipAtt.ItemNO" class="layui-bg-red"></span>
</div>
<label asp-for="wipInfo.PlanQTY" class="layui-form-label"></label>
<div class="layui-input-inline">
<input asp-for="wipInfo.PlanQTY" class="layui-input" autocomplete="off" />
<input asp-for="wipInfo.PlanQTY" class="layui-input" autocomplete="off" placeholder="請輸入計劃數量" />
<span asp-validation-for="wipInfo.PlanQTY" class="layui-bg-red"></span>
</div>
</div>
@ -73,7 +67,7 @@
</div>
<label asp-for="wipInfo.WerksNO" class="layui-form-label"></label>
<div class="layui-input-inline">
<input asp-for="wipInfo.WerksNO" class="layui-input" autocomplete="off" />
<input asp-for="wipInfo.WerksNO" class="layui-input" autocomplete="off" placeholder="請輸入委外廠編號" />
<span asp-validation-for="wipInfo.WerksNO" class="layui-bg-red"></span>
</div>
@ -84,21 +78,23 @@
<div class="layui-inline">
<label class="layui-form-label">客戶類別</label>
<div class="layui-input-inline">
@*<input @if (Model.wipInfo != null) { @(Model.wipInfo.CustomerMedical == "Y" ? "checked" : "") } type="checkbox" title="醫療" name="wipInfo.CustomerMedical" />
<input @if (Model.wipInfo != null) { @(Model.wipInfo.CustomerVIP == "Y" ? "checked" : "") } type="checkbox" title="VIP" name="wipInfo.CustomerVIP" />*@
<input asp-for="wipInfo.CustomerMedical" type="checkbox" title="醫療" />
<input asp-for="wipInfo.CustomerVIP" type="checkbox" title="VIP" />
</div>
<label asp-for="wipInfo.CustomerNO" class="layui-form-label"></label>
<div class="layui-input-inline">
<input asp-for="wipInfo.CustomerNO" class="layui-input" autocomplete="off" />
<input asp-for="wipInfo.CustomerNO" class="layui-input" autocomplete="off" placeholder="請輸入客戶名稱" />
<span asp-validation-for="wipInfo.CustomerNO" class="layui-bg-red"></span>
</div>
<label asp-for="wipInfo.CustomerItemNO" class="layui-form-label"></label>
<div class="layui-input-inline">
<input asp-for="wipInfo.CustomerItemNO" class="layui-input" autocomplete="off" />
<input asp-for="wipInfo.CustomerItemNO" class="layui-input" autocomplete="off" placeholder="請輸入客戶料號" />
</div>
<label asp-for="wipInfo.Sales" class="layui-form-label"></label>
<div class="layui-input-inline">
<input asp-for="wipInfo.Sales" class="layui-input" autocomplete="off" />
<input asp-for="wipInfo.Sales" class="layui-input" autocomplete="off" placeholder="請輸入業務" />
</div>
</div>
</div>
@ -107,9 +103,9 @@
<div class="layui-inline">
<label asp-for="wipInfo.UnitNO" class="layui-form-label"></label>
<div class="layui-input-inline">
<select id="unit" lay-filter="unit" asp-for="wipInfo.UnitNO" asp-items="@ViewBag.FactoryUnitByWipNo" class=""></select>
<select id="unit" lay-filter="unit" asp-for="wipInfo.UnitNO" asp-items="@ViewBag.FactoryUnitList" class=""></select>
</div>
<input id="unitNo" type="hidden" asp-for="wipInfo.UnitNO" />
<input id="unitNo" type="hidden" name="unitNo" value="0" />
<label asp-for="wipInfo.LineID" class="layui-form-label"></label>
<div class="layui-input-inline">
<select lay-filter="lind" asp-for="wipInfo.LineID" asp-items="@ViewBag.LineInfoList" class="">
@ -121,13 +117,13 @@
<label asp-for="wipInfo.RelatedWONO" class="layui-form-label"></label>
<div class="layui-input-inline">
<input asp-for="wipInfo.RelatedWONO" class="layui-input" />
<input asp-for="wipInfo.RelatedWONO" class="layui-input" placeholder="請輸入關聯工單/客戶工單" />
<span asp-validation-for="wipInfo.RelatedWONO" class="layui-bg-red"></span>
</div>
<label asp-for="wipInfo.OrderNO" class="layui-form-label"></label>
<div class="layui-input-inline">
<input asp-for="wipInfo.OrderNO" class="layui-input" />
<input asp-for="wipInfo.OrderNO" class="layui-input" placeholder="請輸入訂單號碼" />
</div>
</div>
</div>
@ -147,9 +143,12 @@
</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 @if (Model.wipInfo != null) { @(Model.wipInfo.ModelCheck == "Y" ? "checked" : "") } type="checkbox" title="混線投入機種檢查" name="wipInfo.ModelCheck" />
<input @if (Model.wipInfo != null) { @(Model.wipInfo.ECNCheck == "Y" ? "checked" : "") } type="checkbox" title="混線投入ECN相同檢查" name="wipInfo.ECNCheck" />
<input @if (Model.wipInfo != null) { @(Model.wipInfo.Priority == "Y" ? "checked" : "") } type="checkbox" title="線上強制工單" name="wipInfo.Priority" />*@
<input asp-for="wipInfo.ModelCheck" type="checkbox" title="混線投入機種檢查" />
<input asp-for="wipInfo.ECNCheck" type="checkbox" title="混線投入ECN相同檢查" />
<input asp-for="wipInfo.Priority" type="checkbox" title="線上強制工單" />
</div>
<div class="layui-tab layui-tab-brief">
@ -163,7 +162,6 @@
<li>治具組合</li>
<li>SOP文件</li>
<li>標籤選項</li>
<li>上傳檔案</li>
</ul>
<div class="layui-tab-content">
@* 工單屬性sheet *@
@ -172,7 +170,7 @@
<div class="layui-inline">
<label asp-for="wipAtt.ModelNO" class="layui-form-label"></label>
<div class="layui-input-inline">
<input asp-for="wipAtt.ModelNO" class="layui-input" />
<input asp-for="wipAtt.ModelNO" class="layui-input" placeholder="請輸入機種" />
</div>
<label asp-for="wipAtt.WipProcess" class="layui-form-label"></label>
<div class="layui-input-inline">
@ -190,12 +188,12 @@
<div class="layui-inline">
<label asp-for="wipAtt.Boards" class="layui-form-label"></label>
<div class="layui-input-inline">
<input asp-for="wipAtt.Boards" class="layui-input" />
<input asp-for="wipAtt.Boards" class="layui-input" placeholder="請輸入聯板數" />
<span asp-validation-for="wipAtt.Boards" class="layui-bg-red"></span>
</div>
<label asp-for="wipInfo.BoxCNT" class="layui-form-label"></label>
<div class="layui-input-inline">
<input asp-for="wipInfo.BoxCNT" class="layui-input" />
<input asp-for="wipInfo.BoxCNT" class="layui-input" placeholder="請輸入包裝單箱數量" />
<span asp-validation-for="wipInfo.BoxCNT" class="layui-bg-red"></span>
</div>
</div>
@ -205,11 +203,11 @@
<div class="layui-inline">
<label asp-for="wipAtt.ECN" class="layui-form-label"></label>
<div class="layui-input-inline">
<input asp-for="wipAtt.ECN" class="layui-input" />
<input asp-for="wipAtt.ECN" class="layui-input" placeholder="請輸入ECN版本" />
</div>
<label asp-for="wipAtt.EAN" class="layui-form-label"></label>
<div class="layui-input-inline">
<input asp-for="wipAtt.EAN" class="layui-input" />
<input asp-for="wipAtt.EAN" class="layui-input" placeholder="請輸入EAN" />
</div>
</div>
</div>
@ -218,12 +216,12 @@
<div class="layui-inline">
<label asp-for="wipInfo.WipScheduleDate" class="layui-form-label"></label>
<div class="layui-input-inline">
<input asp-for="wipInfo.WipScheduleDate" class="layui-input" readonly="" />
<input asp-for="wipInfo.WipScheduleDate" class="layui-input" readonly="" placeholder="yyyy/MM/dd" />
<span asp-validation-for="wipInfo.WipScheduleDate" class="layui-bg-red"></span>
</div>
<label asp-for="wipInfo.WipDueDate" class="layui-form-label"></label>
<div class="layui-input-inline">
<input asp-for="wipInfo.WipDueDate" class="layui-input" readonly="" />
<input asp-for="wipInfo.WipDueDate" class="layui-input" readonly="" placeholder="yyyy/MM/dd" />
<span asp-validation-for="wipInfo.WipDueDate" class="layui-bg-red"></span>
</div>
</div>
@ -233,16 +231,15 @@
@* 序號編碼sheet *@
<div class="layui-tab-item">
<label class="layui-form-label">生產序號</label>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">生產序號</label>
<div class="layui-input-inline">
<input asp-for="wipBarcode.StartNO" class="layui-input" />
<input asp-for="wipBarcode.StartNO" readonly class="layui-input" />
</div>
<div class="layui-form-mid">-</div>
<div class="layui-input-inline">
<input asp-for="wipBarcode.EndNO" class="layui-input" />
<input asp-for="wipBarcode.EndNO" readonly class="layui-input" />
</div>
<div class="layui-input-inline">
<input id="GetBarCode" class="layui-btn layui-btn-primary layui-border-blue layui-btn-sm" type="button" value="產生條碼" />
@ -267,11 +264,11 @@
<div class="layui-inline">
<label class="layui-form-label">MAC</label>
<div class="layui-input-inline">
<input asp-for="wipMAC.StartNO" class="layui-input" />
<input asp-for="wipMAC.StartNO" readonly class="layui-input" />
</div>
<div class="layui-form-mid">-</div>
<div class="layui-input-inline">
<input asp-for="wipMAC.EndNO" class="layui-input" />
<input asp-for="wipMAC.EndNO" readonly class="layui-input" />
</div>
<div class="layui-input-inline">
<input id="GetMAC" class="layui-btn layui-btn-primary layui-border-blue layui-btn-sm" type="button" value="產生MAC" />
@ -288,133 +285,26 @@
</div>
@* Keypart組合sheet *@
<div class="layui-tab-item">
<a id="KPTableAdd" class="layui-btn layui-btn-xs layui-icon layui-icon-add-circle">新增</a>
<input type="hidden" value=@Model.WipKps.Count() id="WipKpCount" />
<table id="KPTable" class="layui-table">
@{int k = 0;}
<thead>
<tr>
<th>
KP料號名稱
</th>
<th>
KP料號NO
</th>
<th>
順序
</th>
<th>
前置碼
</th>
<th>
長度
</th>
<th>
生產單位代號
</th>
<th>
</th>
</tr>
</thead>
<tbody>
@foreach (var index in Model.WipKps)
{
<tr>
<td>
<input name="WipKps[@k].WipKpID" type="hidden" value="@index.WipKpID" />
<input onkeypress="if( event.keyCode == 13 ) { return false; }" class="layui-input" asp-for="@index.KpName" name="WipKps[@k].KpName" />
</td>
<td>
<select asp-for="@index.KpNo" name="WipKps[@k].KpNo" asp-items="@ViewBag.ItemsList" class=""></select>
</td>
<td>
<input onkeypress="if( event.keyCode == 13 ) { return false; }" class="layui-input" asp-for="@index.KpSeq" name="WipKps[@k].KpSeq" />
</td>
<td>
<input onkeypress="if( event.keyCode == 13 ) { return false; }" class="layui-input" asp-for="@index.Title" name="WipKps[@k].Title" />
</td>
<td>
<input onkeypress="if( event.keyCode == 13 ) { return false; }" class="layui-input" asp-for="@index.Length" name="WipKps[@k].Length" />
</td>
<td>
<select asp-for="@index.UnitNo" name="WipKps[@k].UnitNo" asp-items="@ViewBag.FactoryUnitByWipNo" class=""></select>
</td>
<td>
<a class="layui-btn layui-btn-danger layui-btn-xs layui-icon layui-icon-delete" onclick="Remove(this);">刪除</a>
</td>
</tr>
k++;
}
</tbody>
</table>
<div class="layui-tab-item" style="padding-left:30px">
<a class="layui-btn layui-btn-normal layui-btn-xs layui-icon layui-icon-read" lay-submit lay-filter="queryKeyParts">刷新</a>
<table class="layui-hide" id="keyparts" lay-filter="keyparts"></table>
</div>
@* 生產流程sheet *@
<div class="layui-tab-item">
<div class="layui-tab-item" style="padding-left:30px">
<div class="layui-form-item">
<div class="layui-inline">
<label asp-for="wipInfo.FlowRuleID" as class="layui-form-label"></label>
<label asp-for="wipInfo.FlowRuleID" class="layui-form-label"></label>
<div class="layui-input-inline">
<select lay-filter="flow" asp-for="wipInfo.FlowRuleID" asp-items="@ViewBag.MaterialFlowRule" class=""></select>
<select lay-filter="flow" asp-for="wipInfo.FlowRuleID" asp-items="@ViewBag.FlowRuleList" class=""></select>
</div>
<input id="flowId" type="hidden" name="flowId" value="" />
</div>
<div class="layui-inline">
<input type="checkbox" title="途程確認" asp-for="wipInfo.SFISFlowCk" />
<input asp-for="wipInfo.SFISFlowCk" type="checkbox" title="途程確認" />
</div>
<div class="layui-form-item">
<label class="layui-form-label">作業流程註解</label>
<div class="layui-input-block">
<textarea placeholder="請輸入作業流程註解" asp-for="wipInfo.FlowRemark" class="layui-textarea"></textarea>
</div>
</div>
<table class="layui-hide" id="ruleStation" lay-filter="ruleStation"></table>
<table id="rulestionOld" class="layui-table">
<thead>
<tr>
<th>
生產單位
</th>
<th>
流程名稱
</th>
<th>
站別描述
</th>
<th>
站別順序
</th>
<th>
站別類型
</th>
</tr>
</thead>
<tbody>
@foreach (var index in Model.ruleStations)
{
<tr>
<td>
@index.UnitNoName
</td>
<td>
@index.FlowRuleName
</td>
<td>
@index.StationDesc
</td>
<td>
@index.Sequence
</td>
<td>
@index.StationType
</td>
</tr>
}
</tbody>
</table>
</div>
<table class="layui-hide" id="ruleStation" lay-filter="ruleStation"></table>
</div>
@* 板卡-工程資訊sheet *@
@ -443,18 +333,16 @@
</div>
<div class="layui-form-item">
<label class="layui-form-label">SMD點紅膠備註</label>
<label class="layui-form-label">SMD點紅膠</label>
<div class="layui-input-block">
<input asp-for="wipBoard.SmdRemarks" class="layui-input" type="text" />
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">SMD點防焊膠</label>
<div class="layui-input-block">
<cl-checkbox asp-items="@ViewBag.GetCheckboxSMDSolderMa" asp-for="wipBoard.SmdSolderMasks" asp-skin="defult"></cl-checkbox>
</div>
<label class="layui-form-label">SMD點防焊膠</label>
<div class="layui-input-block">
<cl-checkbox asp-items="@ViewBag.GetCheckboxSMDSolderMa" asp-for="wipBoard.SmdSolderMasks" asp-skin="defult"></cl-checkbox>
</div>
</div>
@ -470,9 +358,12 @@
<label class="layui-form-label">DIP</label>
<div class="layui-input-block">
<cl-checkbox asp-items="@ViewBag.GetCheckboxDIP" asp-for="wipBoard.DipSides" asp-skin="defult"></cl-checkbox>
@*<input @if (Model.wipBoard != null) { @(Model.wipBoard.DipCarrier == "Y" ? "checked" : "") } type="checkbox" title="CARRIER" name="wipBoard.DipCarrier" />
<input @if (Model.wipBoard != null) { @(Model.wipBoard.DipTape == "Y" ? "checked" : "") } type="checkbox" title="貼付膠帶" name="wipBoard.DipTape" />
<input @if (Model.wipBoard != null) { @(Model.wipBoard. == "Y" ? "checked" : "") } type="checkbox" title="點防焊膠" name="wipBoard.SmdSolderMask" />*@
<input asp-for="wipBoard.DipCarrier" type="checkbox" title="CARRIER" />
<input asp-for="wipBoard.DipTape" type="checkbox" title="貼付膠帶" />
<input asp-for="wipBoard.SmdSolderMask" type="checkbox" title="點防焊膠" />
<input asp-for="wipBoard.DipSolderMask" type="checkbox" title="點防焊膠" />
</div>
</div>
</div>
@ -488,7 +379,7 @@
<div class="layui-inline">
<label class="layui-form-label">燒錄</label>
<div class="layui-input-inline">
<input type="checkbox" title="是否燒入" asp-for="wipBoard.Burn" />
<input asp-for="wipBoard.Burn" type="checkbox" title="是否燒入" />
</div>
<div class="layui-input-inline">
<label asp-for="wipBoard.BurnLocation" class="layui-form-label"></label>
@ -509,9 +400,9 @@
<div class="layui-form-item">
<div class="layui-inline">
<input type="checkbox" title="零件是否需要烘烤" asp-for="wipBoard.Burn" />
</div>
<div class="layui-inline">
<div class="layui-input-inline">
<input asp-for="wipBoard.ISPartsBake" type="checkbox" title="零件是否需要烘烤" />
</div>
<label class="layui-form-label">零件烘烤溫度</label>
<div class="layui-input-inline">
<select asp-items="@ViewBag.GetPartsBakeTypeList" asp-for="wipBoard.PartsBake" class=""></select>
@ -718,7 +609,7 @@
<select asp-for="wipSystem.BiosType" asp-items="@ViewBag.GetWipSystemTypeSelect" class=""></select>
</div>
<div class="layui-input-inline">
<input class="layui-input autocomplete" onkeypress="if( event.keyCode == 13 ) { return false; }" oninput="let p=this.selectionStart;this.value=this.value.toUpperCase();this.setSelectionRange(p, p);" asp-for="wipSystem.Bios" autocomplete="off" />
<input class="layui-input autocomplete" oninput="let p=this.selectionStart;this.value=this.value.toUpperCase();this.setSelectionRange(p, p);" asp-for="wipSystem.Bios" autocomplete="off" />
</div>
<div class="layui-input-inline">
<input class="layui-input" asp-for="wipSystem.Bios_Desc" readonly="readonly" />
@ -741,7 +632,7 @@
<select asp-for="wipSystem.ECType" asp-items="@ViewBag.GetWipSystemTypeSelect" class=""></select>
</div>
<div class="layui-input-inline">
<input class="layui-input autocomplete" onkeypress="if( event.keyCode == 13 ) { return false; }" oninput="let p=this.selectionStart;this.value=this.value.toUpperCase();this.setSelectionRange(p, p);" asp-for="wipSystem.Ec" autocomplete="off" />
<input class="layui-input autocomplete" oninput="let p=this.selectionStart;this.value=this.value.toUpperCase();this.setSelectionRange(p, p);" asp-for="wipSystem.Ec" autocomplete="off" />
</div>
<div class="layui-input-inline">
<input class="layui-input" asp-for="wipSystem.Ec_Desc" readonly="readonly" />
@ -756,7 +647,7 @@
<select asp-for="wipSystem.FWType" asp-items="@ViewBag.GetWipSystemTypeSelect" class=""></select>
</div>
<div class="layui-input-inline">
<input class="layui-input autocomplete" onkeypress="if( event.keyCode == 13 ) { return false; }" oninput="let p=this.selectionStart;this.value=this.value.toUpperCase();this.setSelectionRange(p, p);" asp-for="wipSystem.Fw" autocomplete="off" />
<input class="layui-input autocomplete" oninput="let p=this.selectionStart;this.value=this.value.toUpperCase();this.setSelectionRange(p, p);" asp-for="wipSystem.Fw" autocomplete="off" />
</div>
<div class="layui-input-inline">
<input class="layui-input" asp-for="wipSystem.Fw_Desc" readonly="readonly" />
@ -771,7 +662,7 @@
<select asp-for="wipSystem.FW1Type" asp-items="@ViewBag.GetWipSystemTypeSelect" class=""></select>
</div>
<div class="layui-input-inline">
<input class="layui-input autocomplete" onkeypress="if( event.keyCode == 13 ) { return false; }" asp-for="wipSystem.Fw1" oninput="let p=this.selectionStart;this.value=this.value.toUpperCase();this.setSelectionRange(p, p);" autocomplete="off" />
<input class="layui-input autocomplete" asp-for="wipSystem.Fw1" oninput="let p=this.selectionStart;this.value=this.value.toUpperCase();this.setSelectionRange(p, p);" autocomplete="off" />
</div>
<div class="layui-input-inline">
<input class="layui-input" asp-for="wipSystem.Fw1_Desc" readonly="readonly" />
@ -786,7 +677,7 @@
<select asp-for="wipSystem.FW2Type" asp-items="@ViewBag.GetWipSystemTypeSelect" class=""></select>
</div>
<div class="layui-input-inline">
<input class="layui-input autocomplete" onkeypress="if( event.keyCode == 13 ) { return false; }" asp-for="wipSystem.Fw2" oninput="let p=this.selectionStart;this.value=this.value.toUpperCase();this.setSelectionRange(p, p);" autocomplete="off" />
<input class="layui-input autocomplete" asp-for="wipSystem.Fw2" oninput="let p=this.selectionStart;this.value=this.value.toUpperCase();this.setSelectionRange(p, p);" autocomplete="off" />
</div>
<div class="layui-input-inline">
<input class="layui-input" asp-for="wipSystem.Fw2_Desc" readonly="readonly" />
@ -801,7 +692,7 @@
<select asp-for="wipSystem.OsType" asp-items="@ViewBag.GetWipSystemTypeSelect" class=""></select>
</div>
<div class="layui-input-inline">
<input class="layui-input autocomplete" onkeypress="if( event.keyCode == 13 ) { return false; }" asp-for="wipSystem.OsVer" oninput="let p=this.selectionStart;this.value=this.value.toUpperCase();this.setSelectionRange(p, p);" autocomplete="off" />
<input class="layui-input autocomplete" asp-for="wipSystem.OsVer" oninput="let p=this.selectionStart;this.value=this.value.toUpperCase();this.setSelectionRange(p, p);" autocomplete="off" />
</div>
<div class="layui-input-inline">
<input class="layui-input" asp-for="wipSystem.OsVer_Desc" readonly="readonly" />
@ -859,102 +750,31 @@
@* 治具組合sheet *@
<div class="layui-tab-item">
<a id="OutfitTableAdd" class="layui-btn layui-btn-xs layui-icon layui-icon-add-circle">新增</a>
<input type="hidden" value=@Model.WipOutfits.Count() id="WipOutfitCount" />
<table id="OutfitTable" class="layui-table">
@{int l = 0;}
<thead>
<tr>
<th>
治具種類
</th>
<th>
生產單位
</th>
<th>
流程站別
</th>
<th>
</th>
</tr>
</thead>
<tbody>
@foreach (var index in Model.WipOutfits)
{
@*<table id="OutfitTable" class="layui-table">
<thead>
<tr>
<td>
<input name="WipOutfits[@l].WipOutfitID" type="hidden" value="@index.WipOutfitID" />
<select asp-for="@index.PartNo" name="WipOutfits[@l].PartNo" asp-items="@ViewBag.OutfitCommodityInfo" class=""></select>
</td>
<td>
<select asp-for="@index.UnitNo" name="WipOutfits[@l].UnitNo" asp-items="@ViewBag.FactoryUnitByWipNo" class=""></select>
</td>
<td>
<select asp-for="@index.RuleStationID" name="WipOutfits[@l].RuleStationID" asp-items="@ViewBag.RuleStationByWipNoUnitNoList" class=""></select>
</td>
<td>
<a class="layui-btn layui-btn-danger layui-btn-xs layui-icon layui-icon-delete" onclick="Remove(this);">刪除</a>
</td>
<th>
治具NO
</th>
<th>
治具名稱
</th>
<th>
流程名稱ID
</th>
</tr>
l++;
}
</tbody>
</table>
</thead>
<tbody id="tblbody">
</tbody>
</table>*@
<a class="layui-btn layui-btn-normal layui-btn-xs layui-icon layui-icon-read" lay-submit lay-filter="queryOutfit">刷新</a>
<table class="layui-hide" id="Outfit" lay-filter="Outfit"></table>
</div>
@* SOP文件 sheet *@
<div class="layui-tab-item" lay-filter="test2">
<a id="SopTableAdd" class="layui-btn layui-btn-xs layui-icon layui-icon-add-circle">新增</a>
<input type="hidden" value=@Model.WipSops.Count() id="WipSopCount" />
<table id="SopTable" class="layui-table">
@{int i = 0;}
<thead>
<tr>
<th>
SOP文件敘述
</th>
<th>
檔案路徑
</th>
<th>
SOP類型
</th>
<th>
生產單位
</th>
<th>
</th>
</tr>
</thead>
<tbody>
@foreach (var index in Model.WipSops)
{
<tr>
<td>
<input name="WipSops[@i].WipSOPID" type="hidden" value="@index.WipSOPID" />
<input onkeypress="if( event.keyCode == 13 ) { return false; }" class="layui-input" asp-for="@index.SOPName" name="WipSops[@i].SOPName" />
</td>
<td>
<input onkeypress="if( event.keyCode == 13 ) { return false; }" class="layui-input" asp-for="@index.SOPPath" name="WipSops[@i].SOPPath" />
</td>
<td>
<select asp-for="@index.SOPType" name="WipSops[@i].SOPType" asp-items="@ViewBag.GetSOPTypeSelect" class=""></select>
</td>
<td>
<select asp-for="@index.UnitNo" name="WipSops[@i].UnitNo" asp-items="@ViewBag.FactoryUnitByWipNo" class=""></select>
</td>
<td>
<a class="layui-btn layui-btn-danger layui-btn-xs layui-icon layui-icon-delete" onclick="Remove(this);">刪除</a>
</td>
</tr>
i++;
}
</tbody>
</table>
<div class="layui-tab-item" style="padding-left:30px">
<a class="layui-btn layui-btn-normal layui-btn-xs layui-icon layui-icon-read" lay-submit lay-filter="querysop">刷新</a>
<table class="layui-hide" id="wipsop" lay-filter="wipsop"></table>
</div>
@* 標籤選項sheet *@
@ -982,7 +802,6 @@
<label class="layui-form-label">公司LOGO</label>
<div class="layui-input-block">
<cl-radio asp-items="@ViewBag.GetCheckboxCompanyLogo" asp-for="wipLabel.CompanyLogo"></cl-radio>
</div>
</div>
<div class="layui-form-item">
@ -991,6 +810,7 @@
<cl-radio asp-items="@ViewBag.GetCheckboxWipAttr" asp-for="wipLabel.WipAttr"></cl-radio>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">備註</label>
<div class="layui-input-block">
@ -999,57 +819,22 @@
</div>
</div>
@* 上傳資料sheet *@
<div class="layui-tab-item">
<div class="layui-form-item">
<table lay-filter="demo" class="layui-table">
<thead>
<tr>
<th lay-data="{field:'username', width:100}">檔案名稱</th>
<th lay-data="{field:'experience', width:80, sort:true}">檔案路徑</th>
</tr>
</thead>
<tbody>
@foreach (var index in Model.wipInfoBlobs)
{
<tr>
<td>
@index.ImageName
</td>
<td>
@index.Filepath
</td>
</tr>
}
</tbody>
</table>
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label" asp-for="wipInfoBlob.ImageName">檔案</label>
<label class="layui-btn">
<input type="file" name="formFile">
</label>
<input type="hidden" asp-for="wipInfoBlob.ImageName">
</div>
</div>
</div>
</div>
</div>
<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="保存" name="action" class="layui-btn" />
<input type="submit" value="保存" class="layui-btn" />
</div>
</div>
</form>
</div>
</div>
@section Scripts {
@*@{ await Html.RenderPartialAsync("_ValidationScriptsPartial");
await Html.RenderPartialAsync("_FileinputScriptsPartial"); }*@
@{ await Html.RenderPartialAsync("_ValidationScriptsPartial");
await Html.RenderPartialAsync("_FileinputScriptsPartial"); }
<script type="text/javascript">
$(document).ready(function () {
@ -1452,6 +1237,25 @@
tableruleStation;
};
function getPLMMeterial(val) {
var data = $("#PCS001").serialize();
console.info(data);
$.ajax(
{
url: "@Url.Action("PCS001CreateWipNo", "PCS")",
dataType: 'json',
data: data,
type: 'POST',
success: function (result)
{
},
error: function (result)
{
alert(result);
}
});
};
function refreshTable() {
var FactoryUnit = getFactoryUnitList();
var Select = "<select name=WipOutfits[" + No + "].UnitNo>";

19
AMESCoreStudio.WebApi/Controllers/AMES/MaterialKpController.cs

@ -104,6 +104,25 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES
return materialKpDtos;
}
/// <summary>
/// 料號Key Parts 資料檔 to ItemNo
/// </summary>
/// <param name="id">料號No</param>
/// <returns></returns>
[HttpGet("ByItemNo/{id}")]
public async Task<IEnumerable<MaterialKp>> GetMaterialKpByItemNo(string id)
{
MaterialItemController materialItemController = new MaterialItemController(_context);
var result_Item = materialItemController.GetMaterialItemByItemNO(id);
int ItemID = 0;
if (result_Item.Result != null)
ItemID = result_Item.Result.ItemID;
IQueryable<MaterialKp> q = _context.MaterialKps.Where(w => w.ItemID == ItemID);
return await q.ToListAsync();
}
/// <summary>
/// 新增料號基本資料檔
/// </summary>

215
AMESCoreStudio.WebApi/Controllers/BLL/BarCodeCheckController.cs

@ -108,6 +108,8 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES
// 存放要更新BarCodeItem
var update_BarCodeItem = new List<BarcodeItem>();
var insert_BarCodeItemChange = new List<BarcodeItemChange>();
// Burn In
bool burnIn = false;
#endregion
// 抓流程ID
@ -150,6 +152,8 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES
resultModel = (ResultModel<string>)await GetCheckBurn(barCodeCheckDto.wipNo, barCodeCheckDto.barcodeID, barCodeCheckDto.station);
if (!resultModel.Success)
return resultModel;
else if (resultModel.Data.ToString() == "BurnIn")
burnIn = true;
#endregion
#region KeyParts 判斷
@ -177,7 +181,6 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES
return (ResultModel<string>)resultOutfit;
#endregion
// 維修過站 組件需獨立判斷
if (barCodeCheckDto.barcodeType == "S")
{
@ -376,7 +379,7 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES
barCodeCheckDto.ruleStatus = "P";
var result_CUTableMsg = await CU_Tables(barCodeCheckDto);
var result_CUTableMsg = await CU_Tables(barCodeCheckDto, burnIn);
if (!string.IsNullOrWhiteSpace(result_CUTableMsg))
{
resultModel.Msg = "內部序號【" + barCodeCheckDto.barcode + "】 過站失敗,錯誤訊息:<br/>";
@ -396,7 +399,17 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES
await barcodeItemChangesController.PostBarcodeItemChanges(item_barCodeItemChange);
}
resultModel.Msg = "內部序號【" + barCodeCheckDto.barcode + "】 過站完成!";
// 燒機In 修改狀態
if (burnIn)
{
resultModel.Msg = "內部序號【" + barCodeCheckDto.barcode + "】 燒機In 完成!";
}
else
{
resultModel.Msg = "內部序號【" + barCodeCheckDto.barcode + "】 過站完成!";
}
resultModel.Success = true;
return resultModel;
#endregion
@ -412,123 +425,131 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES
#region 判斷過站完成新增or更新 Table
private async Task<string> CU_Tables(BarCodeCheckDto barCodeCheckDto)
/// <summary>
/// 判斷過站完成新增or更新 Table
/// </summary>
/// <param name="barCodeCheckDto"></param>
/// <param name="burnIn">T:燒機In</param>
/// <returns></returns>
private async Task<string> CU_Tables(BarCodeCheckDto barCodeCheckDto, bool burnIn)
{
string Msg = string.Empty;
using (var tran = _context.Database.BeginTransaction())
{
try
{
// 條碼主檔
var result_BarcodeInfo = Table_BarcodeInfo(barCodeCheckDto).Result;
if (result_BarcodeInfo.Success)
{
// 將BarCodeID補上
if (barCodeCheckDto.barcodeID == 0)
barCodeCheckDto.barcodeID = result_BarcodeInfo.Data.FirstOrDefault().BarcodeID;
}
else
{
Msg += "BarcodeInfo_Error:" + result_BarcodeInfo.Msg + "<br/>";
}
// 條碼紀錄
var result_BarcodeWip = Table_BarcodeWip(barCodeCheckDto).Result;
if (!result_BarcodeWip.Success)
if (!burnIn)
{
Msg += "BarcodeWip_Error:" + result_BarcodeWip.Msg + "<br/>";
}
// 條碼主檔
var result_BarcodeInfo = Table_BarcodeInfo(barCodeCheckDto).Result;
if (result_BarcodeInfo.Success)
{
// 將BarCodeID補上
if (barCodeCheckDto.barcodeID == 0)
barCodeCheckDto.barcodeID = result_BarcodeInfo.Data.FirstOrDefault().BarcodeID;
}
else
{
Msg += "BarcodeInfo_Error:" + result_BarcodeInfo.Msg + "<br/>";
}
// 工單各站數量資料檔
var result_WipStation = Table_WipStation(barCodeCheckDto).Result;
if (!result_WipStation.Success)
{
Msg += "WipStation_Error:" + result_WipStation.Msg + "<br/>";
}
// 條碼紀錄
var result_BarcodeWip = Table_BarcodeWip(barCodeCheckDto).Result;
if (!result_BarcodeWip.Success)
{
Msg += "BarcodeWip_Error:" + result_BarcodeWip.Msg + "<br/>";
}
// 各班別數量資料檔
var result_WipClass = Table_WipClass(barCodeCheckDto).Result;
if (!result_WipClass.Success)
{
Msg += "WipClass_Error:" + result_WipClass.Msg + "<br/>";
}
// 工單各站數量資料檔
var result_WipStation = Table_WipStation(barCodeCheckDto).Result;
if (!result_WipStation.Success)
{
Msg += "WipStation_Error:" + result_WipStation.Msg + "<br/>";
}
// 工單各站數量資料檔 – By TIME
var result_WipTime = Table_WipTime(barCodeCheckDto).Result;
if (!result_WipTime.Success)
{
Msg += "WipTime_Error:" + result_WipTime.Msg + "<br/>";
}
// 各班別數量資料檔
var result_WipClass = Table_WipClass(barCodeCheckDto).Result;
if (!result_WipClass.Success)
{
Msg += "WipClass_Error:" + result_WipClass.Msg + "<br/>";
}
// 條碼過站資料檔
var result_BarcodeStation = Table_BarcodeStation(barCodeCheckDto).Result;
if (!result_BarcodeStation.Success)
{
Msg += "BarcodeStation_Error:" + result_BarcodeStation.Msg + "<br/>";
}
// 工單各站數量資料檔 – By TIME
var result_WipTime = Table_WipTime(barCodeCheckDto).Result;
if (!result_WipTime.Success)
{
Msg += "WipTime_Error:" + result_WipTime.Msg + "<br/>";
}
// 組件资料
var result_BarcodeItem = Table_BarcodeItem(barCodeCheckDto).Result;
if (!result_BarcodeItem.Success)
{
Msg += "BarcodeItem_Error:" + result_BarcodeItem.Msg + "<br/>";
}
// 條碼過站資料檔
var result_BarcodeStation = Table_BarcodeStation(barCodeCheckDto).Result;
if (!result_BarcodeStation.Success)
{
Msg += "BarcodeStation_Error:" + result_BarcodeStation.Msg + "<br/>";
}
// 條碼治具
var result_BarcodeOutfit = Table_BarcodeOutfit(barCodeCheckDto).Result;
if (!result_BarcodeOutfit.Success)
{
Msg += "BarcodeOutfit_Error:" + result_BarcodeOutfit.Msg + "<br/>";
}
// 組件资料
var result_BarcodeItem = Table_BarcodeItem(barCodeCheckDto).Result;
if (!result_BarcodeItem.Success)
{
Msg += "BarcodeItem_Error:" + result_BarcodeItem.Msg + "<br/>";
}
// 設備資料檔 使用次數
var result_OutfitInfo = Table_OutfitInfo(barCodeCheckDto).Result;
if (!result_OutfitInfo.Success)
{
Msg += "OutfitInfo_Error:" + result_OutfitInfo.Msg + "<br/>";
}
// 條碼治具
var result_BarcodeOutfit = Table_BarcodeOutfit(barCodeCheckDto).Result;
if (!result_BarcodeOutfit.Success)
{
Msg += "BarcodeOutfit_Error:" + result_BarcodeOutfit.Msg + "<br/>";
}
// 燒入資料檔
var result_BurnInfo = Table_BurnInfo(barCodeCheckDto).Result;
if (!result_BurnInfo.Success)
{
Msg += "BurnInfo_Error:" + result_BurnInfo.Msg + "<br/>";
}
// 設備資料檔 使用次數
var result_OutfitInfo = Table_OutfitInfo(barCodeCheckDto).Result;
if (!result_OutfitInfo.Success)
{
Msg += "OutfitInfo_Error:" + result_OutfitInfo.Msg + "<br/>";
}
// 不良資料檔
var result_NgInfo = Table_NgInfo(barCodeCheckDto).Result;
if (!result_NgInfo.Success)
{
Msg += "NgInfo_Error:" + result_NgInfo.Msg + "<br/>";
// 不良資料檔
var result_NgInfo = Table_NgInfo(barCodeCheckDto).Result;
if (!result_NgInfo.Success)
{
Msg += "NgInfo_Error:" + result_NgInfo.Msg + "<br/>";
}
}
// 判斷是否為第一站
if (CheckNowFirstStation(barCodeCheckDto.wipNo, barCodeCheckDto.unitNo, barCodeCheckDto.station) == "Y")
{
WipInfosController wipInfosController = new WipInfosController(_context);
var wipinfo = _context.WipInfos.FindAsync(barCodeCheckDto.wipID).Result;
wipinfo.CompleteQTY += 1;
var result_wipInfos = await wipInfosController.PutWipinfo(wipinfo);
if (!result_wipInfos.Success)
// 判斷是否為第一站
if (CheckNowFirstStation(barCodeCheckDto.wipNo, barCodeCheckDto.unitNo, barCodeCheckDto.station) == "Y")
{
Msg += "wipInfos_Error:" + result_wipInfos.Msg + "<br/>";
WipInfosController wipInfosController = new WipInfosController(_context);
var wipinfo = _context.WipInfos.FindAsync(barCodeCheckDto.wipID).Result;
wipinfo.CompleteQTY += 1;
var result_wipInfos = await wipInfosController.PutWipinfo(wipinfo);
if (!result_wipInfos.Success)
{
Msg += "wipInfos_Error:" + result_wipInfos.Msg + "<br/>";
}
}
}
// 判斷下一站為完工站
if (CheckNextStopCloseStation(barCodeCheckDto.wipNo, barCodeCheckDto.unitNo, barCodeCheckDto.station).Result.Success)
{
var result_wipInfoAllClost = await CheckWipNoBarCodeAllClost(barCodeCheckDto.wipNo, barCodeCheckDto.unitNo, barCodeCheckDto.ruleStationID);
if (!result_wipInfoAllClost.Success)
// 判斷下一站為完工站
if (CheckNextStopCloseStation(barCodeCheckDto.wipNo, barCodeCheckDto.unitNo, barCodeCheckDto.station).Result.Success)
{
Msg += "wipInfosAllClost_Error:" + result_wipInfoAllClost.Msg + "<br/>";
var result_wipInfoAllClost = await CheckWipNoBarCodeAllClost(barCodeCheckDto.wipNo, barCodeCheckDto.unitNo, barCodeCheckDto.ruleStationID);
if (!result_wipInfoAllClost.Success)
{
Msg += "wipInfosAllClost_Error:" + result_wipInfoAllClost.Msg + "<br/>";
}
}
}
}
// 燒入資料檔
var result_BurnInfo = Table_BurnInfo(barCodeCheckDto).Result;
if (!result_BurnInfo.Success)
{
Msg += "BurnInfo_Error:" + result_BurnInfo.Msg + "<br/>";
}
// 判斷是否有DB更新錯誤
if (string.IsNullOrWhiteSpace(Msg))
@ -1531,6 +1552,14 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES
return resultModel;
}
}
else // 燒機資料都有填入實際燒機時間
{
resultModel.Msg = "BurnIn";
}
}
// 沒有BurnInfo = Burn In
{
resultModel.Msg = "BurnIn";
}
resultModel.Success = true;
return resultModel;

2
AMESCoreStudio.WebApi/DTO/BLL/BarCodeCheckDto.cs

@ -49,7 +49,7 @@ namespace AMESCoreStudio.WebApi.DTO.AMES
public string barcodeType { get; set; } = "M";
/// <summary>
/// 條碼過站狀態 P:Pass F:Fail
/// 條碼過站狀態 P:Pass F:Fail
/// </summary>
[DataMember]
public string ruleStatus { get; set; } = "P";

Loading…
Cancel
Save