Browse Source

1. PCS002與PCS005 加入了 停用/啟用功能

2. PCS006新增判斷停用時,無法點擊開線
3. 過站判斷工單狀態是停用
4. Table WIP_STATUS 新增 狀態=>D 描述=>Disable
master
Sai 1 month ago
parent
commit
8b3f1748c7
  1. 144
      AMESCoreStudio.Web/Controllers/PCSController.cs
  2. 97
      AMESCoreStudio.Web/Views/PCS/PCS002.cshtml
  3. 86
      AMESCoreStudio.Web/Views/PCS/PCS005.cshtml
  4. 2
      AMESCoreStudio.Web/Views/PCS/PCS006.cshtml
  5. 25
      AMESCoreStudio.WebApi/Controllers/AMES/WipInfosController.cs
  6. 48
      AMESCoreStudio.WebApi/Controllers/BLL/BarCodeCheckNewController.cs

144
AMESCoreStudio.Web/Controllers/PCSController.cs

@ -3447,6 +3447,7 @@ namespace AMESCoreStudio.Web.Controllers
/// <returns></returns>
public async Task<IActionResult> PCS002QueryAsync(string unitno, string wipNo, string itemNo, int page = 0, int limit = 10)
{
// 查詢 N 狀態 已會排除 E與C狀態
IResultModel<dynamic> result = await _pcsApi.GetWipInfoSelectParameter(unitno: unitno
, wipno: wipNo
, itemno: itemNo
@ -3458,8 +3459,80 @@ namespace AMESCoreStudio.Web.Controllers
{
return Json(new Table() { code = 0, msg = "", data = result.Data, count = result.DataTotal });
}
return Json(new Table() { count = 0, data = null });
}
/// <summary>
/// PCS002 停用/啟用工單
/// </summary>
/// <param name="wipID">工單ID</param>
/// <param name="currentStatus">目前狀態</param>
/// <param name="targetStatus">目標狀態 (D=停用, N=啟用)</param>
/// <returns></returns>
[HttpPost]
public async Task<JsonResult> PCS002ToggleStatus(int wipID, string currentStatus, string targetStatus)
{
try
{
// 驗證狀態切換是否合法
if (currentStatus == "E" || currentStatus == "C")
{
return Json(new Result() { success = false, msg = "已完工或已刪除的工單無法停用/啟用" });
}
// 停用操作:只有 A、N、S 狀態可以停用
if (targetStatus == "D")
{
if (currentStatus != "A" && currentStatus != "N" && currentStatus != "S")
{
return Json(new Result() { success = false, msg = "只有 A、N、S 狀態的工單可以停用" });
}
}
// 啟用操作:只有 D 狀態可以啟用
else if (targetStatus == "N")
{
if (currentStatus != "D")
{
return Json(new Result() { success = false, msg = "只有停用狀態的工單可以啟用" });
}
}
else
{
return Json(new Result() { success = false, msg = "無效的狀態值" });
}
// 檢查工單是否存在
var wipInfo = await _pcsApi.GetWipInfo(wipID);
if (wipInfo == null || wipInfo.Count == 0)
{
return Json(new Result() { success = false, msg = "工單不存在" });
}
// 更新工單狀態
WipLog wipLog = new WipLog();
wipLog.WipID = wipID;
wipLog.WipDesc = ".";
wipLog.StatusNO = targetStatus;
wipLog.CreateUserID = GetLogInUserID();
await _pcsApi.PostWipLog(JsonConvert.SerializeObject(wipLog));
var result = await _pcsApi.PutWipinfoToStatusNO(wipID, targetStatus);
if (result.Success)
{
var action = targetStatus == "D" ? "停用" : "啟用";
return Json(new Result() { success = true, msg = action + "成功" });
}
else
{
return Json(new Result() { success = false, msg = result.Msg ?? "操作失敗" });
}
}
catch (Exception ex)
{
return Json(new Result() { success = false, msg = "系統錯誤:" + ex.Message });
}
}
#endregion
#region PCS004 工單內部條碼區間設定
@ -3914,6 +3987,77 @@ namespace AMESCoreStudio.Web.Controllers
var result = await _pcsApi.DeleteWipinfo(id);
return Json(new Result() { success = true, msg = "刪除成功" });
}
/// <summary>
/// PCS005 停用/啟用工單
/// </summary>
/// <param name="wipID">工單ID</param>
/// <param name="currentStatus">目前狀態</param>
/// <param name="targetStatus">目標狀態 (D=停用, N=啟用)</param>
/// <returns></returns>
[HttpPost]
public async Task<JsonResult> PCS005ToggleStatus(int wipID, string currentStatus, string targetStatus)
{
try
{
// 驗證狀態切換是否合法
if (currentStatus == "E" || currentStatus == "C")
{
return Json(new Result() { success = false, msg = "已完工或已刪除的工單無法停用/啟用" });
}
// 停用操作:只有 A、N、S 狀態可以停用
if (targetStatus == "D")
{
if (currentStatus != "A" && currentStatus != "N" && currentStatus != "S")
{
return Json(new Result() { success = false, msg = "只有 A、N、S 狀態的工單可以停用" });
}
}
// 啟用操作:只有 D 狀態可以啟用
else if (targetStatus == "N")
{
if (currentStatus != "D")
{
return Json(new Result() { success = false, msg = "只有停用狀態的工單可以啟用" });
}
}
else
{
return Json(new Result() { success = false, msg = "無效的狀態值" });
}
// 檢查工單是否存在
var wipInfo = await _pcsApi.GetWipInfo(wipID);
if (wipInfo == null || wipInfo.Count == 0)
{
return Json(new Result() { success = false, msg = "工單不存在" });
}
// 更新工單狀態
WipLog wipLog = new WipLog();
wipLog.WipID = wipID;
wipLog.WipDesc = ".";
wipLog.StatusNO = targetStatus;
wipLog.CreateUserID = GetLogInUserID();
await _pcsApi.PostWipLog(JsonConvert.SerializeObject(wipLog));
var result = await _pcsApi.PutWipinfoToStatusNO(wipID, targetStatus);
if (result.Success)
{
var action = targetStatus == "D" ? "停用" : "啟用";
return Json(new Result() { success = true, msg = action + "成功" });
}
else
{
return Json(new Result() { success = false, msg = result.Msg ?? "操作失敗" });
}
}
catch (Exception ex)
{
return Json(new Result() { success = false, msg = "系統錯誤:" + ex.Message });
}
}
#endregion
#region PCS006 工單開線收線作業

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

@ -6,6 +6,19 @@
Layout = "~/Views/Shared/_AMESLayout.cshtml";
}
<style>
/* 停用工單行樣式 */
.layui-table-view[lay-id="query"] .layui-table-main table tbody tr.layui-table-gray-row,
.layui-table-view[lay-id="query"] .layui-table-main table tbody tr.layui-table-gray-row td,
.layui-table-view[lay-id="query"] .layui-table-main table tbody tr.layui-table-gray-row .layui-table-cell,
.layui-table-view[lay-id="query"] .layui-table-fixed table tbody tr.layui-table-gray-row,
.layui-table-view[lay-id="query"] .layui-table-fixed table tbody tr.layui-table-gray-row td,
.layui-table-view[lay-id="query"] .layui-table-fixed table tbody tr.layui-table-gray-row .layui-table-cell {
background-color: #e4e4e4 !important;
color: #11151a !important;
}
</style>
<div class="layui-card">
<div class="layui-card-header">
<div class="layui-form">
@ -56,15 +69,13 @@
@section Scripts{
<script type="text/javascript">
layui.use('table', function () {
form = layui.form;
layui.use(['table', 'form'], function () {
var form = layui.form;
form.on('select(unit)', function (data) {
$("#unitNo").val(data.value);
//roleName = data.elem[data.elem.selectedIndex].text;
var qs = $('button[lay-filter="querysubmit"]');
qs.click();
});
var table = layui.table;
@ -74,7 +85,6 @@
//监听表单提交事件
hg.form.onsubmit('querysubmit', function (data) {
table && table.reload(data);
});
var tableCols = [[
{
@ -141,14 +151,41 @@
field: 'fqcDate',
title: '@Localizer["FQCDate"]'
},
{
field: 'statusNo',
title: '狀態',
hide: true
},
{
field: 'right',
width: 150,
width: 200,
title: '@Localizer["Action"]',
fixed: 'right',
templet: function (d) {
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>'
var editBtn = '';
var detailBtn = '<a class="layui-btn layui-btn-warm layui-icon layui-icon-list layui-btn-xs" lay-event="detail">@Localizer["View"]</a>';
var toggleBtn = '';
// 狀態為停用(D)時隱藏修改按鈕
if (d.statusNo !== 'D') {
editBtn = '<a class="layui-btn layui-btn-xs layui-icon layui-icon-edit" lay-event="edit">@Localizer["Edit"]</a> ';
} else {
// 如果是停用狀態,嘗試設置整行樣式
setTimeout(function() {
var index = d.LAY_TABLE_INDEX;
// 同時套用到主表格與固定欄位的行
$('.layui-table-view[lay-id="query"] tr[data-index="' + index + '"]').addClass('layui-table-gray-row');
}, 100);
}
if (d.statusNo === 'D') {
// 狀態為 D(停用)時顯示啟用按鈕
toggleBtn = '<a class="layui-btn layui-btn-normal layui-btn-xs layui-icon layui-icon-play" lay-event="enable">啟用</a>';
} else if (d.statusNo === 'A' || d.statusNo === 'N' || d.statusNo === 'S') {
// 狀態為 A、N 或 S 時顯示停用按鈕
toggleBtn = '<a class="layui-btn layui-btn-danger layui-btn-xs layui-icon layui-icon-pause" lay-event="disable">停用</a>';
}
return editBtn + detailBtn + ' ' + toggleBtn;
}
}
]
@ -191,6 +228,50 @@
}
}
// 停用/啟用工單
function toggleStatus(obj, targetStatus) {
var action = targetStatus === 'D' ? '停用' : '啟用';
var confirmMsg = '確定要' + action + '工單號碼【' + obj.data.wipNo + '】嗎?';
hg.confirm(confirmMsg, function () {
$.ajax({
url: '/PCS/PCS002ToggleStatus',
data: {
wipID: obj.data.wipID,
currentStatus: obj.data.statusNo,
targetStatus: targetStatus
},
type: 'POST',
success: function (data) {
if (data.success) {
hg.msghide(action + '成功!');
// 重新載入表格
layui.use('table', function () {
var table = layui.table;
table.reload('query');
});
}
else {
hg.msg(data.msg);
}
},
error: function () {
hg.msg("網路請求失敗!");
}
});
});
}
//通过行tool停用,lay-event="disable"
function disable(obj) {
toggleStatus(obj, 'D');
}
//通过行tool啟用,lay-event="enable"
function enable(obj) {
toggleStatus(obj, 'N');
}
//基本資料表格
var table = hg.table.datatable('query', '工單資料修改', '/PCS/PCS002Query/' + unitNo.value, {}, tableCols, {}, true, 'full-100', ['filter', 'print', 'exports']);
</script>

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

@ -7,12 +7,16 @@
}
<style>
/* .layui-table-col-special .layui-table-cell {
height:auto;
overflow:visible;
text-overflow:inherit;
white-space: normal;
}*/
/* 停用工單行樣式 */
.layui-table-view[lay-id="query"] .layui-table-main table tbody tr.layui-table-gray-row,
.layui-table-view[lay-id="query"] .layui-table-main table tbody tr.layui-table-gray-row td,
.layui-table-view[lay-id="query"] .layui-table-main table tbody tr.layui-table-gray-row .layui-table-cell,
.layui-table-view[lay-id="query"] .layui-table-fixed table tbody tr.layui-table-gray-row,
.layui-table-view[lay-id="query"] .layui-table-fixed table tbody tr.layui-table-gray-row td,
.layui-table-view[lay-id="query"] .layui-table-fixed table tbody tr.layui-table-gray-row .layui-table-cell {
background-color: #e4e4e4 !important;
color: #11151a !important;
}
</style>
<div class="layui-card">
<div class="layui-card-header">
@ -60,6 +64,7 @@
<select id="statusNo" name="statusNo" lay-filter="statusNo" lay-submit>
<option value="">全部</option>
<option value="N">未完工</option>
<option value="D">停用</option>
<option value="E">已完工</option>
<option value="C">已刪除</option>
</select>
@ -132,7 +137,6 @@
}
});
});
//监听表单提交事件
@ -212,11 +216,29 @@
},
{
field: 'right',
width: 80,
width: 150,
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">@Localizer["View"]</a>'
var detailBtn = '<a class="layui-btn layui-btn-warm layui-icon layui-icon-list layui-btn-xs" lay-event="detail">@Localizer["View"]</a>';
var toggleBtn = '';
// 如果是停用狀態,嘗試設置整行樣式
if (d.statusNo === 'D') {
setTimeout(function () {
var index = d.LAY_TABLE_INDEX;
$('.layui-table-view[lay-id="query"] tr[data-index="' + index + '"]').addClass('layui-table-gray-row');
}, 100);
}
if (d.statusNo === 'D') {
// 狀態為 D(停用)時顯示啟用按鈕
toggleBtn = '<a class="layui-btn layui-btn-normal layui-btn-xs layui-icon layui-icon-play" lay-event="enable">啟用</a>';
} else if (d.statusNo === 'A' || d.statusNo === 'N' || d.statusNo === 'S') {
// 狀態為 A、N 或 S 時顯示停用按鈕
toggleBtn = '<a class="layui-btn layui-btn-danger layui-btn-xs layui-icon layui-icon-pause" lay-event="disable">停用</a>';
}
return detailBtn + ' ' + toggleBtn;
}
}
]
@ -260,6 +282,50 @@
});
}
// 停用/啟用工單
function toggleStatus(obj, targetStatus) {
var action = targetStatus === 'D' ? '停用' : '啟用';
var confirmMsg = '確定要' + action + '工單號碼【' + obj.data.wipNo + '】嗎?';
hg.confirm(confirmMsg, function () {
$.ajax({
url: '/PCS/PCS005ToggleStatus',
data: {
wipID: obj.data.wipID,
currentStatus: obj.data.statusNo,
targetStatus: targetStatus
},
type: 'POST',
success: function (data) {
if (data.success) {
hg.msghide(action + '成功!');
// 重新載入表格
layui.use('table', function () {
var table = layui.table;
table.reload('query');
});
}
else {
hg.msg(data.msg);
}
},
error: function () {
hg.msg("網路請求失敗!");
}
});
});
}
//通过行tool停用,lay-event="disable"
function disable(obj) {
toggleStatus(obj, 'D');
}
//通过行tool啟用,lay-event="enable"
function enable(obj) {
toggleStatus(obj, 'N');
}
var param = unitNo.value + '_' + wipNo.value + '_' + itemNo.value + '_' + factoryNo.value;
var table = hg.table.datatable('query', '工單資料查詢', '/PCS/PCS005Query/' + param, {}, tableCols, "", true, 'full-100', ['filter', 'print', 'exports']);
@ -269,6 +335,8 @@
<span>{{ '完工' }}</span>
{{# } else if(d.statusNo === 'C'){ }}
<span>{{ '刪除' }}</span>
{{# } else if(d.statusNo === 'D'){ }}
<span>{{ '停用' }}</span>
{{# } else { }}
{{ '未完工' }}
{{# } }}

2
AMESCoreStudio.Web/Views/PCS/PCS006.cshtml

@ -71,7 +71,7 @@
<script type="text/html" id="checkboxTpl">
<!-- 这里的 checked 的状态只是演示 -->
<input type="checkbox" name="ACTIVE" value="{{d.wipID}}-{{d.lineID}}" lay-skin="switch" lay-text="Active|Stop" lay-filter="ACTIVE" {{ d.activeStop == "A" ? 'checked' : '' }}>
<input type="checkbox" name="ACTIVE" value="{{d.wipID}}-{{d.lineID}}" lay-skin="switch" lay-text="Active|Stop" lay-filter="ACTIVE" {{ d.activeStop == "A" ? 'checked' : '' }} {{ d.statusDesc == "Disable" ? 'disabled' : '' }}>
</script>
<script type="text/javascript">

25
AMESCoreStudio.WebApi/Controllers/AMES/WipInfosController.cs

@ -2599,28 +2599,21 @@ FROM [SFIS].[dbo].[ZPDKeyPart] B WHERE B.[IsActive] = 1 AND B.[ProductSN] = (S
ResultModel<WipInfo> result = new ResultModel<WipInfo>();
try
{
await _context.Database.ExecuteSqlInterpolatedAsync
($"UPDATE JHAMES.WIP_INFO SET STATUS_NO={statusno} , UPDATE_DATE={DateTime.Now} WHERE WIP_ID={id}");
//WipInfo wipinfo = new WipInfo
//{
// WipID = id,
// StatusNO = statusno,
// UpdateDate = DateTime.Now
//};
//_context.WipInfos.Attach(wipinfo);
//// 指定更新某個欄位
//_context.Entry(wipinfo).Property(p => p.StatusNO).IsModified = true;
//_context.Entry(wipinfo).Property(p => p.UpdateDate).IsModified = true;
//await _context.SaveChangesAsync();
var query = @"UPDATE JHAMES.WIP_INFO SET STATUS_NO = :StatusNO, UPDATE_DATE = :UpdateDate WHERE WIP_ID = :WipID";
var parameters = new
{
StatusNO = statusno,
UpdateDate = DateTime.Now,
WipID = id
};
await _context.Database.DapperExecuteAsync(query, parameters);
result.Success = true;
result.Msg = "OK";
}
catch (Exception ex)
{
result.Success = false;
result.Msg = ex.Message;
result.Msg = ex.InnerException?.Message ?? ex.Message;
}
return result;
}

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

@ -2401,37 +2401,36 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES
private async Task<ResultModel<string>> CheckBarCodeFlowNew(string wipNo, string unitNo, int barCodeId, string barCodeNo, int stationId)
{
ResultModel<string> resultModel = new ResultModel<string> { Success = false };
int wipId = 0;
int flowRuleId = 0;
// 取得工單號碼相關資料 排除沒有流程的工單
// 取得工單號碼相關資料 排除沒有流程的工單 且 狀態不能為停用
var WipInfos = await _context.WipInfos.Where(w => w.WipNO == wipNo.Trim().ToUpper() &&
w.FlowRuleID != 0 && w.FlowRuleID != -1)
w.FlowRuleID != 0 && w.FlowRuleID != -1 &&
w.StatusNO != "D")
.ToListAsync();
if (WipInfos.Any(w => w.UnitNO == unitNo))
{
wipId = WipInfos.Where(w => w.UnitNO == unitNo).FirstOrDefault().WipID;
flowRuleId = WipInfos.Where(w => w.UnitNO == unitNo).FirstOrDefault().FlowRuleID;
}
else
var currentWip = WipInfos.FirstOrDefault(w => w.UnitNO == unitNo);
if (currentWip == null)
{
resultModel.Msg = $"該工單號碼【{wipNo}】找不到工單資料";
return resultModel;
}
var wipId = currentWip.WipID;
var flowRuleId = currentWip.FlowRuleID;
// 重工工單不需要判斷 || 製程A的不判斷
if (!wipNo.StartsWith("6") && !wipNo.StartsWith("5") && unitNo != "A")
{
// 板卡 製程 SMT(S),DIP(D),測試(I),包裝(P)
var PcbUnitNo = new List<string> { "S", "D", "I", "P" };
var pcbUnits = new List<string> { "S", "D", "I", "P" };
// 系統 製程 組裝(B),測試(T),包裝(O)
var SystemUnitNo = new List<string> { "B", "T", "O" };
var CheckUnits = new List<string>();
if (PcbUnitNo.Contains(unitNo))
CheckUnits = PcbUnitNo;
else if (SystemUnitNo.Contains(unitNo))
CheckUnits = SystemUnitNo;
else
var systemUnits = new List<string> { "B", "T", "O" };
// 判定所屬製程線
List<string> CheckUnits = pcbUnits.Contains(unitNo) ? pcbUnits :
systemUnits.Contains(unitNo) ? systemUnits : null;
if (CheckUnits == null)
{
resultModel.Msg = $"該製程代號【{unitNo}】無法判定是板卡製程或是系統製程";
return resultModel;
@ -2542,6 +2541,12 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES
return resultModel;
}
if (item.StatusNO == "D")
{
resultModel.Msg = $"工單號碼【{item.WipNO}】,該工單已停用,請切換工單";
return resultModel;
}
// 判斷是否是投入站
var RuleStation = await _context.RuleStations.Where(w => w.FlowRuleID == flowRuleID && w.StationID == stationID)
.FirstOrDefaultAsync();
@ -3155,8 +3160,8 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES
result.line = barCodeCheckDto.line;
result.userID = barCodeCheckDto.userID;
#region 相關資料 Null給空白
// KP||NG Input
if (barCodeCheckDto.inputItems == null)
result.inputItems = new List<BarCodeCheckDto.inputItem>();
@ -3183,9 +3188,9 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES
}).ToList();
}
// 更新Kp先給空白
result.UpdateWipKpLenght = new List<WipKp>();
#endregion
// 工單資料
@ -3328,6 +3333,7 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES
private async Task<string> CheckKeyPartsCorrect(WipKp wipKp, BarCodeCheckDto.inputItem inputItem)
{
string CheckMsg = string.Empty;
#region 比對序號長度是否正確
if (wipKp.Length != null)
@ -3644,8 +3650,6 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES
wipAlarm.AlarmDesc = Subject;
wipAlarm.AlarmDateTime = DateTime.Now;
await wipAlarmsController.PostWipAlarm(wipAlarm);
}
/// <summary>

Loading…
Cancel
Save