Browse Source

1. 新增 => 單站報工維護(WHS024)

2. 新增 Table => WORK_STATION_LOG(單站報工資料)
master
Sai 2 months ago
parent
commit
2d98bf8e7e
  1. 223
      AMESCoreStudio.Web/Controllers/WHSController.cs
  2. 45
      AMESCoreStudio.Web/HttpApis/AMES/IWHS.cs
  3. 170
      AMESCoreStudio.Web/Views/WHS/WHS024.cshtml
  4. 171
      AMESCoreStudio.Web/Views/WHS/WHS024C.cshtml
  5. 130
      AMESCoreStudio.Web/Views/WHS/WHS024U.cshtml
  6. 201
      AMESCoreStudio.WebApi/Controllers/AMES/WorkStationLogController.cs
  7. 109
      AMESCoreStudio.WebApi/DTO/AMES/WorkStationLogDto.cs
  8. 118
      AMESCoreStudio.WebApi/Models/AMES/WorkStationLog.cs
  9. 5
      AMESCoreStudio.WebApi/Models/AMESContext.cs

223
AMESCoreStudio.Web/Controllers/WHSController.cs

@ -1,16 +1,15 @@
using Microsoft.AspNetCore.Mvc; using AMESCoreStudio.CommonTools.Result;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using AMESCoreStudio.Web.Models; using AMESCoreStudio.Web.Models;
using AMESCoreStudio.Web.ViewModels.WHS;
using AMESCoreStudio.WebApi.Models.AMES;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json; using Newtonsoft.Json;
using AMESCoreStudio.WebApi; using System;
using System.Collections.Generic; using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc.Rendering;
using AMESCoreStudio.WebApi.Models.AMES;
using AMESCoreStudio.WebApi.Models.BAS;
using AMESCoreStudio.CommonTools.Result;
using System.Linq; using System.Linq;
using AMESCoreStudio.Web.ViewModels.WHS; using System.Threading.Tasks;
namespace AMESCoreStudio.Web.Controllers namespace AMESCoreStudio.Web.Controllers
{ {
@ -2766,6 +2765,193 @@ namespace AMESCoreStudio.Web.Controllers
return Json(new Table() { count = 0, data = null }); return Json(new Table() { count = 0, data = null });
} }
#endregion #endregion
#region WHS024 單站報工
public async Task<IActionResult> WHS024()
{
return View();
}
[HttpGet]
public async Task<IActionResult> WHS024Query(string wipNo = null, string status = null, string dateStr = null, string dateEnd = null, int page = 0, int limit = 10)
{
var result = await _whsApi.GetWorkStationLogByQuery(wipNo, status, dateStr, dateEnd, page, limit);
if (result.Data.Count() != 0)
{
return Json(new Table() { code = 0, msg = "", data = result.Data, count = result.DataTotal });
}
return Json(new Table() { count = 0, data = null });
}
//新增頁面
public async Task<IActionResult> WHS024C()
{
return View(new WorkStationLog());
}
[HttpPost]
public async Task<IActionResult> WHS024CQuery(string wipNo)
{
var result = new ResultModel<SelectListItem>();
var result_Wip = await _pcsApi.GetWipInfoByWipNO(wipNo.Trim().ToUpper());
var itemNo = string.Empty;
var wipQty = 0;
if (!result_Wip.Any())
{
result.Success = false;
result.Msg = "找不到工單號碼【" + wipNo + "】建立資料";
}
else
{
itemNo = result_Wip.FirstOrDefault().GetWipAtt.ItemNO;
wipQty = result_Wip.FirstOrDefault().PlanQTY;
var flowRuleid = result_Wip.FirstOrDefault().FlowRuleID;
var result_RuleStation = await _basApi.GetRuleStationsByFlow(flowRuleid, 0);
result_RuleStation = result_RuleStation.Where(w => w.StationType == "M" && w.StationID != 1000).OrderBy(o => o.Sequence).ToList();
var rleStations = new List<SelectListItem>();
for (int i = 0; i < result_RuleStation.Count; i++)
{
rleStations.Add(new SelectListItem(result_RuleStation[i].Sequence + "-" + result_RuleStation[i].StationDesc, result_RuleStation[i].StationID.ToString()));
}
result.Data = rleStations;
result.Success = true;
}
return Json(new { item = result, itemNo, wipQty });
}
//修改页面
[HttpGet]
public async Task<IActionResult> WHS024U(int id)
{
var result = await _whsApi.GetWorkStationLog(id);
var result_Wip = await _pcsApi.GetWipInfoByWipNO(result.wipNo);
var flowRuleid = result_Wip.FirstOrDefault().FlowRuleID;
var result_RuleStation = await _basApi.GetRuleStationsByFlow(flowRuleid, 0);
var stationList = new List<SelectListItem>();
foreach (var item in result_RuleStation.Where(w => w.StationID == result.StationID))
{
stationList.Add(new SelectListItem(item.Sequence + "-" + item.StationDesc, item.StationID.ToString()));
}
ViewBag.GetStationsList = stationList;
ViewBag.wipQty = result_Wip.FirstOrDefault().PlanQTY;
return View(result);
}
//頁面提交,id=0 添加,id>0 修改
[HttpPost]
public async Task<IActionResult> WHS024Async(WorkStationLog model, int wipQty = 0)
{
IResultModel result;
var _msg = string.Empty;
// 工單沒有輸入
try
{
if (string.IsNullOrWhiteSpace(model.wipNo))
{
_msg += " 請輸入工單";
}
// 工單沒有輸入
if (model.StationID == 0)
{
_msg += " 請選擇作業站";
}
if (model.startTime != null && model.endTime != null)
{
// 確認日期是否同一天
if (model.startTime.Value.Date != model.endTime.Value.Date)
{
_msg += "開始與結束不同一天,請在確認";
}
// 確認日期格式正確
if (model.startTime.Value.Date > model.endTime.Value.Date)
{
_msg += "結束時間早於開始時間,請在確認";
}
// 類型是生產工時
if (model.type == "A")
{
var workStationByWipNo = await _whsApi.GetWorkStationLogByQuery(wipNo: model.wipNo);
var workQty = workStationByWipNo.Data.Where(w => w.StationID == model.StationID).Sum(s => s.productionQty);
if (workQty + (model.productionQty ?? 0) > wipQty)
{
_msg += $"本次生產數量【{model.productionQty ?? 0}】+ 累積生產數量【{workQty}】已超過工單數,請在確認";
}
}
// 無效工時、異常工時
else
{
if (string.IsNullOrWhiteSpace(model.remarks) || string.IsNullOrWhiteSpace(model.exceptionCode))
_msg += "請填寫異常代碼跟備註";
}
}
if (!string.IsNullOrWhiteSpace(_msg))
{
ModelState.AddModelError("error", _msg);
}
else
{
model.CreateUserID = GetLogInUserID();
model.UpdateUserID = GetLogInUserID();
if (model.workStationid == 0)
{
result = await _whsApi.PostWorkStationLog(JsonConvert.SerializeObject(model));
}
else
{
result = await _whsApi.PutWorkStationLog(JsonConvert.SerializeObject(model));
}
if (result.Success)
{
_msg = model.workStationid == 0 ? "新增成功!" : "修改成功!";
return RedirectToAction("Refresh", "Home", new { msg = _msg });
}
else
{
ModelState.AddModelError("error", result.Msg);
}
}
var result_Wip = await _pcsApi.GetWipInfoByWipNO(model.wipNo);
var flowRuleid = result_Wip.FirstOrDefault()?.FlowRuleID ?? 999;
var result_RuleStation = await _basApi.GetRuleStationsByFlow(flowRuleid, 0);
var stationList = new List<SelectListItem>();
foreach (var item in result_RuleStation)
{
stationList.Add(new SelectListItem(item.Sequence + "-" + item.StationDesc, item.StationID.ToString()));
}
ViewBag.GetStationsList = stationList;
ViewBag.wipQty = result_Wip.FirstOrDefault()?.PlanQTY ?? 0;
if (model.workStationid == 0)
return View("WHS024C", model);
else
return View("WHS024U", model);
}
catch (Exception ex)
{
ModelState.AddModelError("error", $"系統錯誤:{ex.Message}");
if (model.workStationid == 0)
return View("WHS024C", model);
else
return View("WHS024U", model);
}
}
#endregion
public void GetUserID() public void GetUserID()
{ {
var userID = ""; var userID = "";
@ -2780,5 +2966,24 @@ namespace AMESCoreStudio.Web.Controllers
} }
ViewBag.UserID = user_id; ViewBag.UserID = user_id;
} }
/// <summary>
/// 取登入者ID
/// </summary>
/// <returns></returns>
public int GetLogInUserID()
{
int user_id = 0;
HttpContext.Request.Cookies.TryGetValue("UserID", out string userID);
if (userID != null)
{
if (int.Parse(userID.ToString()) >= 0)
{
user_id = int.Parse(userID.ToString());
}
}
return user_id;
}
} }
} }

45
AMESCoreStudio.Web/HttpApis/AMES/IWHS.cs

@ -625,5 +625,50 @@ namespace AMESCoreStudio.Web
[WebApiClient.Attributes.HttpGet("api/OutsourceWorktime/WHS023OWByQuery/{sUnitNo}/{sItemNo}/{sUserId}")] [WebApiClient.Attributes.HttpGet("api/OutsourceWorktime/WHS023OWByQuery/{sUnitNo}/{sItemNo}/{sUserId}")]
ITask<List<dynamic>> GetOutsourceWorktimeWHS023(string sUnitNo, string sItemNo, string sUserId); ITask<List<dynamic>> GetOutsourceWorktimeWHS023(string sUnitNo, string sItemNo, string sUserId);
#endregion #endregion
#region WHS024 單站報工
/// <summary>
/// 新增 單站報工資料
/// </summary>
/// <returns></returns>
[WebApiClient.Attributes.HttpPost("api/WorkStationLog")]
ITask<ResultModel<WorkStationLog>> PostWorkStationLog([FromBody, RawJsonContent] string model);
/// <summary>
/// 更新 單站報工資料
/// </summary>
/// <returns></returns>
[WebApiClient.Attributes.HttpPut("api/WorkStationLog")]
ITask<ResultModel<WorkStationLog>> PutWorkStationLog([FromBody, RawJsonContent] string model);
///// <summary>
///// 刪除重工標準工時
///// </summary>
///// <returns></returns>
//[WebApiClient.Attributes.HttpDelete("api/ExceptionReasons/{id}")]
//ITask<ResultModel<WorkStationLog>> DeleteExceptionReason(string id);
/// <summary>
/// 單站報工資料 By Id
/// </summary>
/// <returns></returns>
[WebApiClient.Attributes.HttpGet("api/WorkStationLog/{id}")]
ITask<WorkStationLog> GetWorkStationLog(int id);
/// <summary>
/// 查詢 單站報工資料 ByQuery
/// </summary>
/// <param name="wipNo">工單號碼</param>
/// <param name="type">狀態</param>
/// <param name="dateStr">開始日期</param>
/// <param name="dateEnd">結束日期</param>
/// <param name="page">頁數</param>
/// <param name="limit"></param>
/// <returns></returns>
[WebApiClient.Attributes.HttpGet("api/WorkStationLog/Query")]
ITask<ResultModel<WorkStationLogDto>> GetWorkStationLogByQuery(string wipNo = null, string type = null, string dateStr = null, string dateEnd = null, int page = 0, int limit = 10);
#endregion
} }
} }

170
AMESCoreStudio.Web/Views/WHS/WHS024.cshtml

@ -0,0 +1,170 @@
@{
ViewData["Title"] = "單站報工查詢";
Layout = "~/Views/Shared/_AMESLayout.cshtml";
}
<div class="layui-card">
<div class="layui-card-header">
<div class="layui-form">
<div class="layui-form-item">
<div class="layui-inline"><i class="fa fa-file-text-o fa-fw"></i> @ViewBag.Title</div>
</div>
</div>
</div>
<div class="layui-card-body">
<div class="layui-form">
<div class="layui-row">
<div class="layui-form-item">
<div class="layui-col-sm3">
<div class="layui-inline">
<label class="layui-form-label">工單號碼:</label>
<div class="layui-input-inline" style="width:140px">
<input id="wipNo" name="wipNo" autocomplete="off" class="layui-input">
</div>
</div>
</div>
<div class="layui-col-sm4">
<div class="layui-inline">
<label class="layui-form-label">開始日期:</label>
<div class="layui-input-inline" style="width:90px">
<input id="dateStr" name="dateStr" autocomplete="off" class="layui-input" readonly="">
</div>
<div class="layui-form-mid">~</div>
<div class="layui-input-inline" style="width:90px">
<input id="dateEnd" name="dateEnd" autocomplete="off" class="layui-input" readonly="">
</div>
</div>
</div>
<div class="layui-col-sm3">
<div class="layui-inline">
<label class="layui-form-label">狀態</label>
<div class="layui-input-inline" style="width:100px">
<select id="status" name="status" lay-filter="status" lay-submit>
<option value="">全部</option>
<option value="A">生產工時</option>
<option value="B">無效工時</option>
<option value="C">異常工時</option>
</select>
</div>
<input id="statusNo" type="hidden" name="statusNo" />
</div>
</div>
<div class="layui-col-sm1">
<div class="layui-inline layui-show-xs-block">
<button class="layui-btn layui-btn-sm layui-btn-normal" lay-submit lay-filter="querysubmit">
<i class="layui-icon layui-icon-sm">&#xe615;</i>
</button>
</div>
</div>
</div>
</div>
</div>
<table class="layui-hide" id="query" lay-filter="query"></table>
</div>
</div>
@section Scripts {
<script type="text/javascript">
layui.use(['form', 'layer', 'laydate', 'table'], function () {
form = layui.form;
laydate = layui.laydate;
laydate.render({
elem: '#dateStr'
, trigger: 'click'
, format: 'yyyy/MM/dd'
, theme: 'grid'
});
laydate.render({
elem: '#dateEnd'
, trigger: 'click'
, format: 'yyyy/MM/dd'
, theme: 'grid'
});
});
//监听表单提交事件
hg.form.onsubmit('querysubmit', function (data) {
hg.msghide("重新載入資料..");
table && table.reload(data);
});
var tableCols = [[
{
field: 'wipNo',
title: '工單號碼',
sort: true
},
{
field: 'itemNo',
title: '料號',
sort: true
},
{
field: 'stationName',
title: '作業站'
},
{
field: 'productionQty',
title: '生產數量'
},
{
field: 'type',
title: '狀態',
sort: true,
},
{
field: 'startTime',
title: '開始時間',
templet: '<div>{{ layui.util.toDateString(d.startTime, "yyyy/MM/dd HH:mm:ss") }}</div>',
sort: true,
},
{
field: 'endTime',
title: '結束時間',
templet: '<div>{{ layui.util.toDateString(d.endTime, "yyyy/MM/dd HH:mm:ss") }}</div>',
sort: true,
},
{
field: 'exceptionCode',
title: '無效/異常代碼'
},
{
field: 'remarks',
title: '備註'
},
{
title: '操作',
align: 'center',
width: 80,
templet: function (d) {
if (d.endTime == null || d.startTime == null) {
return '<a class="layui-btn layui-btn-warm layui-icon layui-icon-list layui-btn-xs" lay-event="edit">修改</a>';
}
else
{
return '<a></a>';
}
}
}
]];
var toolbar = [{
text: '新增',
layuiicon: '&#xe608;',
class: 'layui-btn-normal',
handler: function () {
hg.open('新增單站報工', '/WHS/WHS024C', 1100, 500);
}
}];
var table = hg.table.datatable('query', '單站報工查詢', '/WHS/WHS024Query', {}, tableCols, toolbar, true, 'full-100', ['filter', 'print', 'exports']);
function edit(obj) {
if (obj.data.workStationid) {
hg.open('修改單站報工', '/WHS/WHS024U/' + obj.data.workStationid, 1100, 500);
}
}
</script>
}

171
AMESCoreStudio.Web/Views/WHS/WHS024C.cshtml

@ -0,0 +1,171 @@
@model AMESCoreStudio.WebApi.Models.AMES.WorkStationLog
@{
ViewData["Title"] = "WHS024C";
Layout = "~/Views/Shared/_AMESLayout.cshtml";
}
<style>
.control-label {
justify-content: flex-end !important;
}
</style>
<div class="layui-card">
<div class="row">
<div class="col-sm-12">
<form enctype="multipart/form-data" method="post" asp-action="WHS024" class="layui-form">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">工單號碼</label>
<div class="layui-input-inline">
<input asp-for="wipNo" onkeydown="inputWipNo(event);" autocomplete="off" class="layui-input" placeholder="輸入工單號碼後按Enter" />
<span class="layui-bg-red">輸入工單號碼後按Enter</span>
</div>
<label class="layui-form-label">料號</label>
<div class="layui-input-inline">
<input asp-for="itemNo" autocomplete="off" class="layui-input" readonly="" />
</div>
<label class="layui-form-label">工單數量</label>
<div class="layui-input-inline">
<input id="wipQty" name="wipQty" autocomplete="off" class="layui-input" readonly="" value="@ViewBag.wipQty" />
<input type="hidden" id="wipQty" name="wipQty" value="@ViewBag.wipQty" />
</div>
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">作業站</label>
<div class="layui-input-inline ">
<select asp-for="StationID" asp-items="@ViewBag.GetStationsList" class=""></select>
<input asp-for="StationID" type="hidden" value="@Model.StationID" />
</div>
<label class="layui-form-label">型態</label>
<input type="radio" asp-for="type" value="A" title="生產工時" checked="">
<input type="radio" asp-for="type" value="B" title="無效工時">
<input type="radio" asp-for="type" value="C" title="異常工時">
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">開始時間</label>
<div class="layui-input-inline">
<input asp-for="startTime" class="layui-input" readonly="" />
</div>
<label class="layui-form-label">結束時間</label>
<div class="layui-input-inline">
<input asp-for="endTime" class="layui-input" readonly="" />
</div>
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">生產數量</label>
<div class="layui-input-inline">
<input asp-for="productionQty" class="layui-input" />
</div>
<label class="layui-form-label">無效/異常代號</label>
<div class="layui-input-inline">
<input asp-for="exceptionCode" class="layui-input" />
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">備註說明</label>
<div class="layui-input-block">
<textarea asp-for="remarks" class="layui-textarea"></textarea>
</div>
</div>
<span style="color: firebrick;word-break: break-all;" class="text-danger offset-sm-3">@Html.ValidationMessage("error")</span>
<div class="layui-row" style="text-align:center">
<div class="layui-col-md12">
<input type="submit" value="儲存" class="layui-btn" />
</div>
</div>
</form>
</div>
</div>
</div>
@section Scripts {
@{
await Html.RenderPartialAsync("_ValidationScriptsPartial");
await Html.RenderPartialAsync("_FileinputScriptsPartial");
}
@{
var now = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
}
<script type="text/javascript">
layui.use(['form', 'laydate', 'element'], function () {
var form = layui.form, laydate = layui.laydate;
laydate.render({
elem: '#startTime',
type: 'datetime',
theme: '#393D49',
value: new Date('@now') // Razor 語法將 C# 時間嵌入前端
});
laydate.render({
elem: '#endTime',
type: 'datetime',
theme: '#393D49'
});
});
$(document).ready(function () {
var error = '@Html.ValidationMessage("error")';
if ($(error).text() != '') {
parent.hg.msg(error);
}
});
function inputWipNo(e) {
if (e.keyCode == 13) {
getWipNoByStation();
event.preventDefault();
return false;
}
}
function getWipNoByStation() {
var wipNo = $("#wipNo").val();
if (wipNo.length != 0) {
$.ajax(
{
url: "@Url.Action("WHS024CQuery", "WHS")",
dataType: 'json',
data: { "wipNo": wipNo},
type: 'post',
success: function (result) {
console.log(result);
if (result.item.success) {
$("#StationID").empty();//清空下拉框的值
$.each(result.item.data, function (index, item) {
$("#StationID").append($("<option>").text(item.text).val(item.value))
});
$("#itemNo").val(result.itemNo);
$("#wipQty").val(result.wipQty);
}
else {
$("#StationID").empty();//清空下拉框的值
parent.hg.msg(result.item.msg);
}
layui.form.render("select");//重新渲染
},
error: function (result) {
parent.hg.msg('API失敗');
}
});
}
};
</script>
}

130
AMESCoreStudio.Web/Views/WHS/WHS024U.cshtml

@ -0,0 +1,130 @@
@model AMESCoreStudio.WebApi.Models.AMES.WorkStationLog
@{
ViewData["Title"] = "WHS024U";
Layout = "~/Views/Shared/_AMESLayout.cshtml";
}
<style>
.control-label {
justify-content: flex-end !important;
}
</style>
<div class="layui-card">
<div class="row">
<div class="col-sm-12">
<form enctype="multipart/form-data" method="post" asp-action="WHS024" class="layui-form">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<input asp-for="workStationid" type="hidden" value="@Model.workStationid" />
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">工單號碼</label>
<div class="layui-input-inline">
<input asp-for="wipNo" autocomplete="off" class="layui-input" readonly="" />
</div>
<label class="layui-form-label">料號</label>
<div class="layui-input-inline">
<input asp-for="itemNo" autocomplete="off" class="layui-input" readonly="" />
</div>
<label class="layui-form-label">工單數量</label>
<div class="layui-input-inline">
<input value="@ViewBag.wipQty" autocomplete="off" class="layui-input" readonly="" />
<input type="hidden" id="wipQty" name="wipQty" value="@ViewBag.wipQty" />
</div>
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">作業站</label>
<div class="layui-input-inline ">
<select asp-for="StationID" asp-items="@ViewBag.GetStationsList" class="" disabled></select>
<input asp-for="StationID" type="hidden" value="@Model.StationID" />
</div>
<label class="layui-form-label">型態</label>
<input asp-for="type" type="hidden" value="@Model.type" />
<input type="radio" asp-for="type" value="A" title="生產工時" disabled>
<input type="radio" asp-for="type" value="B" title="無效工時" disabled>
<input type="radio" asp-for="type" value="C" title="異常工時" disabled>
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">開始時間</label>
<div class="layui-input-inline">
<input asp-for="startTime" class="layui-input" readonly="" />
</div>
<label class="layui-form-label">結束時間</label>
<div class="layui-input-inline">
<input asp-for="endTime" class="layui-input" readonly="" />
</div>
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">生產數量</label>
<div class="layui-input-inline">
<input asp-for="productionQty" class="layui-input" />
</div>
<label class="layui-form-label">無效/異常代號</label>
<div class="layui-input-inline">
<input asp-for="exceptionCode" class="layui-input" />
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">備註說明</label>
<div class="layui-input-block">
<textarea asp-for="remarks" class="layui-textarea"></textarea>
</div>
</div>
<span style="color: firebrick;word-break: break-all;" class="text-danger offset-sm-3">@Html.ValidationMessage("error")</span>
<div class="layui-row" style="text-align:center">
<div class="layui-col-md12">
<input type="submit" value="儲存" class="layui-btn" />
</div>
</div>
</form>
</div>
</div>
</div>
@section Scripts {
@{
await Html.RenderPartialAsync("_ValidationScriptsPartial");
await Html.RenderPartialAsync("_FileinputScriptsPartial");
}
@{
var now = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
}
<script type="text/javascript">
layui.use(['form', 'laydate', 'element'], function () {
var form = layui.form, laydate = layui.laydate;
laydate.render({
elem: '#startTime',
type: 'datetime',
theme: '#393D49',
});
laydate.render({
elem: '#endTime',
type: 'datetime',
theme: '#393D49',
value: new Date('@now')
});
});
$(document).ready(function () {
var error = '@Html.ValidationMessage("error")';
if ($(error).text() != '') {
parent.hg.msg(error);
}
});
</script>
}

201
AMESCoreStudio.WebApi/Controllers/AMES/WorkStationLogController.cs

@ -0,0 +1,201 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using AMESCoreStudio.WebApi;
using AMESCoreStudio.WebApi.Models.AMES;
using AMESCoreStudio.CommonTools.Result;
using AMESCoreStudio.WebApi.DTO.AMES;
using AMESCoreStudio.WebApi.Enum;
namespace AMESCoreStudio.WebApi.Controllers.AMES
{
/// <summary>
/// 單站報工資料
/// </summary>
[Route("api/[controller]")]
[ApiController]
public class WorkStationLogController : ControllerBase
{
private readonly AMESContext _context;
public WorkStationLogController(AMESContext context)
{
_context = context;
}
[HttpGet]
public async Task<ActionResult<IEnumerable<WorkStationLog>>> GetWorkStationLogs()
{
return await _context.WorkStationLogs.ToListAsync();
}
[HttpGet("{id}")]
public async Task<ActionResult<WorkStationLog>> GetWorkStationLog(int id)
{
var workStationLog = await _context.WorkStationLogs.FindAsync(id);
return workStationLog;
}
/// <summary>
/// 查詢 單站報工資料 ByQuery
/// </summary>
/// <param name="wipNo">工單號碼</param>
/// <param name="type">狀態</param>
/// <param name="dateStr">開始日期</param>
/// <param name="dateEnd">結束日期</param>
/// <param name="page">頁數</param>
/// <param name="limit"></param>
/// <returns></returns>
[HttpGet("Query")]
public async Task<ResultModel<WorkStationLogDto>> GetWorkStationLogQuery(string wipNo = null, string dateStr = null, string dateEnd = null, string type = null, int page = 0, int limit = 10)
{
ResultModel<WorkStationLogDto> result = new ResultModel<WorkStationLogDto>();
IQueryable<WorkStationLogDto> q = from q1 in _context.WorkStationLogs
join q2 in _context.WipInfos on q1.wipNo equals q2.WipNO
join q3 in _context.Stationses on q1.StationID equals q3.StationID
join q4 in _context.UserInfoes on q1.CreateUserID equals q4.UserID
select new WorkStationLogDto
{
workStationid = q1.workStationid,
wipNo = q1.wipNo,
wipQty = q2.PlanQTY,
itemNo = q1.itemNo,
StationID = q1.StationID,
StationName = q3.StationName,
productionQty = q1.productionQty,
exceptionCode = q1.exceptionCode,
remarks = q1.remarks,
type = q1.type,
startTime = q1.startTime,
endTime = q1.endTime,
CreateUserName = q4.UserName
};
if (!string.IsNullOrWhiteSpace(wipNo))
q = q.Where(w => w.wipNo == wipNo);
if (!string.IsNullOrWhiteSpace(type))
q = q.Where(w => w.type == type);
if (DateTime.TryParse(dateStr, out _))
{
q = q.Where(w => w.startTime >= DateTime.Parse(dateStr + " 00:00:00"));
}
if (DateTime.TryParse(dateEnd, out _))
{
q = q.Where(w => w.startTime <= DateTime.Parse(dateEnd + " 23:59:59"));
}
// 紀錄筆數
result.DataTotal = q.Count();
// Table 頁數
if (page > 0)
{
q = q.Skip((page - 1) * limit).Take(limit);
}
result.Data = await q.ToListAsync();
foreach (var item in result.Data)
{
item.type = item.type == "A" ? "生產工時" :
item.type == "B" ? "無效工時" :
item.type == "C" ? "異常工時" :
item.type;
}
return result;
}
/// <summary>
/// 更新單站報工資料
/// </summary>
/// <param name="workStationLog"></param>
/// <returns></returns>
[HttpPut]
public async Task<ResultModel<WorkStationLog>> PutWorkStationLog(WorkStationLog workStationLog)
{
ResultModel<WorkStationLog> result = new ResultModel<WorkStationLog>();
_context.Entry(workStationLog).State = EntityState.Modified;
_context.Entry<WorkStationLog>(workStationLog).Property("CreateDate").IsModified = false;
_context.Entry<WorkStationLog>(workStationLog).Property("CreateUserID").IsModified = false;
workStationLog.UpdateDate = DateTime.Now;
try
{
await _context.SaveChangesAsync();
result.Success = true;
result.Msg = "OK";
}
catch (Exception ex)
{
result.Success = false;
result.Msg = ex.InnerException.Message;
}
return result;
}
/// <summary>
/// 新增單站報工資料
/// </summary>
/// <param name="workStationLog"></param>
/// <returns></returns>
[HttpPost]
public async Task<ResultModel<WorkStationLog>> PostWorkStationLog(WorkStationLog workStationLog)
{
ResultModel<WorkStationLog> result = new ResultModel<WorkStationLog>();
Helper helper = new Helper(_context);
workStationLog.workStationid = helper.GetIDKey("WORK_STATION_ID").Result;
_context.WorkStationLogs.Add(workStationLog);
try
{
await _context.SaveChangesAsync();
result.Success = true;
result.Msg = "OK";
}
catch (Exception ex)
{
result.Success = false;
result.Msg = ex.InnerException.Message;
}
return result;
}
[HttpDelete("{id}")]
public async Task<ResultModel<string>> DeleteWorkStationLog(int id)
{
ResultModel<string> result = new ResultModel<string>();
var workStationLog = await _context.WorkStationLogs.FindAsync(id);
try
{
if (workStationLog == null)
{
result.Success = false;
result.Msg = "找不到要刪除資料";
}
else
{
_context.WorkStationLogs.Remove(workStationLog);
await _context.SaveChangesAsync();
result.Success = true;
result.Msg = "OK";
}
}
catch (Exception ex)
{
result.Success = false;
result.Msg = ex.InnerException.Message;
}
return result;
}
}
}

109
AMESCoreStudio.WebApi/DTO/AMES/WorkStationLogDto.cs

@ -0,0 +1,109 @@
using System;
#nullable disable
namespace AMESCoreStudio.WebApi.DTO.AMES
{
/// <summary>
/// 單站報工資料Dto
/// </summary>
public partial class WorkStationLogDto
{
/// <summary>
/// 流水號
/// </summary>
public int workStationid { get; set; } = 0;
/// <summary>
/// 工單號碼
/// </summary>
public string wipNo { get; set; }
/// <summary>
/// 工單料號
/// </summary>
public string itemNo { get; set; }
/// <summary>
/// 工單數量
/// </summary>
public int wipQty { get; set; }
/// <summary>
/// 作業站
/// </summary>
public int StationID { get; set; }
/// <summary>
/// 作業站
/// </summary>
public string StationName { get; set; }
/// <summary>
/// 型態
/// </summary>
public string type { get; set; }
/// <summary>
/// 生產數量
/// </summary>
public int? productionQty { get; set; } = 0;
/// <summary>
/// 開始時間
/// </summary>
public DateTime? startTime { get; set; }
/// <summary>
/// 結束時間
/// </summary>
public DateTime? endTime { get; set; }
/// <summary>
/// 無效/異常代碼
/// </summary>
public string exceptionCode { get; set; }
/// <summary>
/// 備註
/// </summary>
public string remarks { get; set; }
/// <summary>
/// 建立UserID
/// </summary>
public int CreateUserID { get; set; } = 0;
/// <summary>
/// 建立UserName
/// </summary>
public string CreateUserName { get; set; }
/// <summary>
/// 建立日期
/// </summary>
public DateTime CreateDate { get; set; } = DateTime.Now;
/// <summary>
/// 更新UserID
/// </summary>
public int? UpdateUserID { get; set; } = 0;
/// <summary>
/// 建立UserName
/// </summary>
public string UpdateUserName { get; set; }
/// <summary>
/// 更新日期
/// </summary>
public DateTime? UpdateDate { get; set; } = DateTime.Now;
}
}

118
AMESCoreStudio.WebApi/Models/AMES/WorkStationLog.cs

@ -0,0 +1,118 @@
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Runtime.Serialization;
#nullable disable
namespace AMESCoreStudio.WebApi.Models.AMES
{
/// <summary>
/// 單站報工資料
/// </summary>
[Table("WORK_STATION_LOG", Schema = "JHAMES")]
public partial class WorkStationLog
{
/// <summary>
/// 流水號
/// </summary>
[Key]
[Required]
[DataMember]
[Column("WORK_STATION_ID")]
public int workStationid { get; set; } = 0;
/// <summary>
/// 工單號碼
/// </summary>
[DataMember]
[Column("WIP_NO")]
public string wipNo { get; set; }
/// <summary>
/// 工單料號
/// </summary>
[DataMember]
[Column("ITEM_NO")]
public string itemNo { get; set; }
/// <summary>
/// 作業站
/// </summary>
[DataMember]
[Column("STATION_ID")]
public int StationID { get; set; } = 0;
/// <summary>
/// 型態
/// </summary>
[DataMember]
[Column("TYPE")]
public string type { get; set; }
/// <summary>
/// 生產數量
/// </summary>
[DataMember]
[Column("PRODUCTION_QTY")]
public int? productionQty { get; set; } = 0;
/// <summary>
/// 開始時間
/// </summary>
[Column("START_TIME")]
[DataMember]
[DataType(DataType.Text), DisplayFormat(DataFormatString = "{0:yyyy-MM-dd HH:mm:ss}", ApplyFormatInEditMode = true)]
public DateTime? startTime { get; set; }
/// <summary>
/// 結束時間
/// </summary>
[Column("END_TIME")]
[DataMember]
[DataType(DataType.Text), DisplayFormat(DataFormatString = "{0:yyyy-MM-dd HH:mm:ss}", ApplyFormatInEditMode = true)]
public DateTime? endTime { get; set; }
/// <summary>
/// 無效/異常代碼
/// </summary>
[DataMember]
[Column("EXCEPTION_CODE")]
public string exceptionCode { get; set; }
/// <summary>
/// 備註
/// </summary>
[DataMember]
[Column("REMARKS")]
public string remarks { get; set; }
/// <summary>
/// 建立UserID
/// </summary>
[Column("CREATE_USERID")]
[DataMember]
public int CreateUserID { get; set; } = 0;
/// <summary>
/// 建立日期
/// </summary>
[Column("CREATE_DATE")]
[DataMember]
public DateTime CreateDate { get; set; } = DateTime.Now;
/// <summary>
/// 更新UserID
/// </summary>
[Column("UPDATE_USERID")]
[DataMember]
public int? UpdateUserID { get; set; } = 0;
/// <summary>
/// 更新日期
/// </summary>
[Column("UPDATE_DATE")]
[DataMember]
public DateTime? UpdateDate { get; set; } = DateTime.Now;
}
}

5
AMESCoreStudio.WebApi/Models/AMESContext.cs

@ -1083,6 +1083,11 @@ namespace AMESCoreStudio.WebApi
/// 異常警報檔案 /// 異常警報檔案
/// </summary> /// </summary>
public virtual DbSet<NgInfoAlertBlob> NgInfoAlertBlobs { get; set; } public virtual DbSet<NgInfoAlertBlob> NgInfoAlertBlobs { get; set; }
/// <summary>
/// 單站報工資料
/// </summary>
public virtual DbSet<WorkStationLog> WorkStationLogs { get; set; }
} }
} }

Loading…
Cancel
Save