Browse Source

1. 工單加入檔案上傳功能

PTD
ray 3 years ago
parent
commit
e5942452ad
  1. 37
      AMESCoreStudio.Web/Controllers/PCSController.cs
  2. 11
      AMESCoreStudio.Web/HttpApis/AMES/IPCS.cs
  3. 8
      AMESCoreStudio.Web/ViewModels/PCS/WipViewModel.cs
  4. 2
      AMESCoreStudio.Web/Views/PCS/PCS001.cshtml
  5. 216
      AMESCoreStudio.Web/Views/PCS/PCS001R.cshtml
  6. 61
      AMESCoreStudio.Web/Views/PCS/PCS003.cshtml
  7. 3
      AMESCoreStudio.WebApi/Controllers/AMES/WipBoardController.cs
  8. 123
      AMESCoreStudio.WebApi/Controllers/AMES/WipInfoBlobController.cs
  9. 9
      AMESCoreStudio.WebApi/Controllers/AMES/WipSystemController.cs
  10. 82
      AMESCoreStudio.WebApi/Models/AMES/WipInfoBlob.cs
  11. 6
      AMESCoreStudio.WebApi/Models/AMESContext.cs

37
AMESCoreStudio.Web/Controllers/PCSController.cs

@ -1502,6 +1502,8 @@ namespace AMESCoreStudio.Web.Controllers
model.WipOutfits = await _pcsApi.GetWipOutfitByWipNo(model.wipInfo.WipNO);
model.WipSops = await _pcsApi.GetWipSopByWipNo(model.wipInfo.WipNO);
model.wipInfoBlobs = await _pcsApi.GetWipInfoBlob(model.wipInfo.WipID);
}
await GetItemsList();
await GetProductType();
@ -1587,6 +1589,8 @@ namespace AMESCoreStudio.Web.Controllers
model.WipOutfits = await _pcsApi.GetWipOutfitByWipNo(model.wipInfo.WipNO);
model.WipSops = await _pcsApi.GetWipSopByWipNo(model.wipInfo.WipNO);
model.wipInfoBlobs = await _pcsApi.GetWipInfoBlob(model.wipInfo.WipID);
}
await GetItemsList();
await GetProductType();
@ -1616,7 +1620,7 @@ namespace AMESCoreStudio.Web.Controllers
return View(model);
}
[HttpPost]
public async Task<IActionResult> PCS003Async(WipDataViewModel model, string action)
public async Task<IActionResult> PCS003Async(WipDataViewModel model, string action, IFormFile formFile)
{
#region 選單
@ -1855,6 +1859,37 @@ namespace AMESCoreStudio.Web.Controllers
else
await _pcsApi.PutWipSop(JsonConvert.SerializeObject(item));
}
// 檔案上傳
string FileName = string.Empty;
string NewName = string.Empty;
string FilePath = string.Empty;
//var fileProvider = _fileServerProvider.GetProvider("/aa");
//var fileInfo = fileProvider.GetFileInfo("/");
if (formFile != null)
{
if (formFile.Length > 0)
{
//取得使用者上傳檔案的原始檔名
FileName = Path.GetFileName(formFile.FileName);
//取原始檔名中的副檔名
var fileExt = Path.GetExtension(FileName);
//為避免使用者上傳的檔案名稱發生重複,重新給一個亂數名稱
NewName = Path.GetRandomFileName() + fileExt;
//指定要寫入的路徑、檔名和副檔名
FilePath = $"\\PDF\\";//本機目錄
using (var stream = new FileStream(_env.WebRootPath + FilePath + FileName, FileMode.Create))
{
await formFile.CopyToAsync(stream);
}
model.wipInfoBlob.WipID = model.wipInfo.WipID;
model.wipInfoBlob.ImageName = FileName;
model.wipInfoBlob.Filepath = FilePath;
result = await _pcsApi.PostWipInfoBlob(JsonConvert.SerializeObject(model.wipInfoBlob));
}
}
}

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

@ -989,5 +989,16 @@ namespace AMESCoreStudio.Web
ITask<ResultModel<WipCheck>> PutWipCheckByPMC([FromBody, RawJsonContent] string model);
#endregion
#region WipInfoBlob 工單上傳圖檔資料表
[WebApiClient.Attributes.HttpPut("api/WipInfoBlob")]
ITask<ResultModel<WipInfoBlob>> PutWipInfoBlob([FromBody, RawJsonContent] string model);
[WebApiClient.Attributes.HttpPost("api/WipInfoBlob")]
ITask<ResultModel<WipInfoBlob>> PostWipInfoBlob([FromBody, RawJsonContent] string model);
[WebApiClient.Attributes.HttpGet("api/WipInfoBlob/{id}")]
ITask<List<WipInfoBlob>> GetWipInfoBlob(int id);
#endregion
}
}

8
AMESCoreStudio.Web/ViewModels/PCS/WipViewModel.cs

@ -19,6 +19,7 @@ namespace AMESCoreStudio.Web.ViewModels.PCS
Outfits = new List<MaterialOutfit>();
WipSops = new List<WipSopDto>();
WipOutfits = new List<WipOutfitDto>();
wipInfoBlobs = new List<WipInfoBlob>();
wipMAC = new WipMAC();
wipBarcodeOther = new WipBarcodeOther();
@ -58,6 +59,8 @@ namespace AMESCoreStudio.Web.ViewModels.PCS
public IEnumerable<MaterialOutfit> Outfits { get; set; }
public IEnumerable<WipInfoBlob> wipInfoBlobs { get; set; }
/// <summary>
///
/// </summary>
@ -77,6 +80,11 @@ namespace AMESCoreStudio.Web.ViewModels.PCS
/// 條碼區間設定
/// </summary>
public WipBarcodeOther wipBarcodeOther { get; set; }
/// <summary>
/// 工單圖檔資料
/// </summary>
public WipInfoBlob wipInfoBlob { get; set; }
}
public class WipDataViewModel : WipNoDetailViewModel

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

@ -340,13 +340,11 @@
</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>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">SMD點防焊膠備註</label>

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

@ -148,14 +148,15 @@
<div class="layui-tab layui-tab-brief">
<ul class="layui-tab-title">
<li class="layui-this">工單屬性</li>
<li>生產流程</li>
<li>序號編碼</li>
<li>Keypart組合</li>
<li>治具組合</li>
<li>生產流程</li>
<li id="board">板卡-工程資訊</li>
<li id="system">系統-工程資訊</li>
<li>標籤選項</li>
<li>治具組合</li>
<li>SOP文件</li>
<li>標籤選項</li>
<li>上傳檔案</li>
</ul>
<div class="layui-tab-content">
@* 工單屬性sheet *@
@ -223,65 +224,6 @@
</div>
@* 生產流程sheet *@
<div class="layui-tab-item">
<div class="layui-form-item">
<div class="layui-inline">
<label asp-for="wipInfo.FlowRuleID" class="layui-form-label"></label>
<div class="layui-input-inline">
<select disabled 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 asp-for="wipInfo.SFISFlowCk" type="checkbox" title="途程確認" />
</div>
<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>
</div>
@* 序號編碼sheet *@
<div class="layui-tab-item">
<label class="layui-form-label">生產序號</label>
@ -406,43 +348,65 @@
</table>
</div>
@* 治具組合sheet *@
@* 生產流程sheet *@
<div class="layui-tab-item">
<table id="MydataTable" class="layui-table">
@{ int j = 0;}
<div class="layui-form-item">
<div class="layui-inline">
<label asp-for="wipInfo.FlowRuleID" class="layui-form-label"></label>
<div class="layui-input-inline">
<select disabled 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="途程確認" @(Model.wipInfo.SFISFlowCk == "Y" ? "checked" : "") />
</div>
<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.WipOutfits)
@foreach (var index in Model.ruleStations)
{
<tr>
<td>
@index.OutfitNo
@index.UnitNoName
</td>
<td>
@index.PartNo
@index.FlowRuleName
</td>
<td>
@index.UnitNoName
@index.StationDesc
</td>
<td>
@index.Sequence
</td>
<td>
@index.StationType
</td>
</tr>
j++;
}
</tbody>
</table>
</div>
</div>
@* 板卡-工程資訊sheet *@
<div class="layui-tab-item">
@ -541,7 +505,8 @@
<div class="layui-form-item">
<div class="layui-inline">
<input @if (Model.wipBoard != null) { @(Model.wipBoard.ISPartsBake == "Y" ? "checked" : "") } type="checkbox" title="零件是否需要烘烤" name="wipBoard.ISPartsBake" />
</div>
<div class="layui-inline">
<label class="layui-form-label">零件烘烤溫度</label>
<div class="layui-input-inline">
<select disabled asp-items="@ViewBag.GetPartsBakeTypeList" asp-for="wipBoard.PartsBake" class=""></select>
@ -844,6 +809,81 @@
</div>
</div>
@* 治具組合sheet *@
<div class="layui-tab-item">
<table id="MydataTable" class="layui-table">
@{ int j = 0;}
<thead>
<tr>
<th>
設備編碼
</th>
<th>
設備名稱
</th>
<th>
生產單位
</th>
</tr>
</thead>
<tbody>
@foreach (var index in Model.WipOutfits)
{
<tr>
<td>
@index.OutfitNo
</td>
<td>
@index.PartNo
</td>
<td>
@index.UnitNoName
</td>
</tr>
j++;
}
</tbody>
</table>
</div>
@* SOP文件 sheet *@
<div class="layui-tab-item" lay-filter="test2">
<table class="layui-hide" id="query" lay-filter="query"></table>
<table lay-filter="demo" class="layui-table">
@{ int l = 0;}
<thead>
<tr>
<th lay-data="{field:'username', width:100}">SOP文件敘述</th>
<th lay-data="{field:'experience', width:80, sort:true}">檔案路徑</th>
<th lay-data="{field:'sign'}">SOP類型</th>
<th lay-data="{field:'sign'}">生產單位</th>
</tr>
</thead>
<tbody>
@foreach (var index in Model.WipSops)
{
<tr>
<td>
@index.SOPName
</td>
<td>
@index.SOPPath
</td>
<td>
@index.SOPTypeName
</td>
<td>
@index.UnitNoName
</td>
</tr>
l++;
}
</tbody>
</table>
</div>
@* 標籤選項sheet *@
<div class="layui-tab-item">
<div class="layui-form-item">
@ -887,43 +927,33 @@
</div>
</div>
@* SOP文件 sheet *@
<div class="layui-tab-item" lay-filter="test2">
<table class="layui-hide" id="query" lay-filter="query"></table>
@* 上傳資料sheet *@
<div class="layui-tab-item">
<div class="layui-form-item">
<table lay-filter="demo" class="layui-table">
@{ int l = 0;}
<thead>
<tr>
<th lay-data="{field:'username', width:100}">SOP文件敘述</th>
<th lay-data="{field:'username', width:100}">檔案名稱</th>
<th lay-data="{field:'experience', width:80, sort:true}">檔案路徑</th>
<th lay-data="{field:'sign'}">SOP類型</th>
<th lay-data="{field:'sign'}">生產單位</th>
</tr>
</thead>
<tbody>
@foreach (var index in Model.WipSops)
@foreach (var index in Model.wipInfoBlobs)
{
<tr>
<td>
@index.SOPName
@index.ImageName
</td>
<td>
@index.SOPPath
</td>
<td>
@index.SOPTypeName
</td>
<td>
@index.UnitNoName
@index.Filepath
</td>
</tr>
l++;
}
</tbody>
</table>
</div>
</div>
</div>
</div>
</form>

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

@ -162,6 +162,7 @@
<li>治具組合</li>
<li>SOP文件</li>
<li>標籤選項</li>
<li>上傳檔案</li>
</ul>
<div class="layui-tab-content">
@* 工單屬性sheet *@
@ -231,7 +232,7 @@
@* 序號編碼sheet *@
<div class="layui-tab-item">
<label class="layui-form-label">生產序號</label>
@*<label class="layui-form-label">生產序號</label>
<table id="MydataTable" class="layui-table">
<thead>
<tr>
@ -257,7 +258,22 @@
</tr>
}
</tbody>
</table>
</table>*@
<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" />
</div>
<div class="layui-form-mid">-</div>
<div class="layui-input-inline">
<input asp-for="wipBarcode.EndNO" 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="產生條碼" />
</div>
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline">
@ -520,6 +536,8 @@
<div class="layui-form-item">
<div class="layui-inline">
<input @if (Model.wipBoard != null) { @(Model.wipBoard.ISPartsBake == "Y" ? "checked" : "") } type="checkbox" title="零件是否需要烘烤" name="wipBoard.ISPartsBake" />
</div>
<div class="layui-inline">
<label class="layui-form-label">零件烘烤溫度</label>
<div class="layui-input-inline">
<select asp-items="@ViewBag.GetPartsBakeTypeList" asp-for="wipBoard.PartsBake" class=""></select>
@ -1010,6 +1028,45 @@
<input type="submit" value="製造確認" name="action" class="layui-btn" />
</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">
@*<i class="layui-icon">&#xe67c;</i>上傳文件*@
</label>
<input type="hidden" asp-for="wipInfoBlob.ImageName">
</div>
</div>
</div>
</div>
</div>

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

@ -83,9 +83,10 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES
public async Task<ResultModel<WipBoard>> PutWipBoard([FromBody] WipBoard wipBoard)
{
ResultModel<WipBoard> result = new ResultModel<WipBoard>();
var wipNo = wipBoard.WipNo;
try
{
if (GetWipBoard(wipBoard.WipNo).Result.Value != null)
if (_context.WipBoards.Any(e => e.WipNo == wipNo))
{
_context.Entry(wipBoard).State = EntityState.Modified;
_context.Entry<WipBoard>(wipBoard).Property("CreateDate").IsModified = false;

123
AMESCoreStudio.WebApi/Controllers/AMES/WipInfoBlobController.cs

@ -0,0 +1,123 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using AMESCoreStudio.WebApi;
using AMESCoreStudio.WebApi.Models.AMES;
using AMESCoreStudio.WebApi.DTO.AMES;
using AMESCoreStudio.CommonTools.Result;
namespace AMESCoreStudio.WebApi.Controllers.AMES
{
/// <summary>
/// 工單上傳圖檔資料表
/// </summary>
[Route("api/[controller]")]
[ApiController]
public class WipInfoBlobController : ControllerBase
{
private readonly AMESContext _context;
public WipInfoBlobController(AMESContext context)
{
_context = context;
}
// GET: api/WipInfoBlob
[HttpGet]
public async Task<ActionResult<IEnumerable<WipInfoBlob>>> GetWipInfoBlobs()
{
return await _context.WipInfoBlobs.ToListAsync();
}
// GET: api/WipInfoBlob/5
[HttpGet("{id}")]
public async Task<ActionResult<IEnumerable<WipInfoBlob>>> GetWipInfoBlob(int id)
{
var wipInfoBlob = await _context.WipInfoBlobs.Where(w => w.WipID == id).ToListAsync();
return wipInfoBlob;
}
/// <summary>
/// 更新工單上傳圖檔資料表
/// </summary>
/// <param name="wipInfoBlob"></param>
/// <returns></returns>
[HttpPut("{id}")]
public async Task<ResultModel<WipInfoBlob>> PutWipInfoBlob(WipInfoBlob wipInfoBlob)
{
ResultModel<WipInfoBlob> result = new ResultModel<WipInfoBlob>();
_context.Entry(wipInfoBlob).State = EntityState.Modified;
//設置容器空間某一個模型的某一個欄位 不提交到資料庫
//DbContent.Entry是要更新到資料庫的整個對象
_context.Entry<WipInfoBlob>(wipInfoBlob).Property("CreateDate").IsModified = false;
_context.Entry<WipInfoBlob>(wipInfoBlob).Property("CreateUserID").IsModified = false;
wipInfoBlob.UpdateDate = DateTime.Now;
wipInfoBlob.UpdateUserID = 0;
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="wipInfoBlob"></param>
/// <returns></returns>
[HttpPost]
public async Task<ResultModel<WipInfoBlob>> PostWipInfoBlob(WipInfoBlob wipInfoBlob)
{
ResultModel<WipInfoBlob> result = new ResultModel<WipInfoBlob>();
_context.WipInfoBlobs.Add(wipInfoBlob);
try
{
await _context.SaveChangesAsync();
result.Success = true;
result.Msg = "OK";
}
catch (Exception ex)
{
result.Success = false;
result.Msg = ex.InnerException.Message;
}
return result;
}
// DELETE: api/WipInfoBlob/5
[HttpDelete("{id}")]
public async Task<ActionResult<WipInfoBlob>> DeleteWipInfoBlob(int id)
{
var wipInfoBlob = await _context.WipInfoBlobs.FindAsync(id);
if (wipInfoBlob == null)
{
return NotFound();
}
_context.WipInfoBlobs.Remove(wipInfoBlob);
await _context.SaveChangesAsync();
return wipInfoBlob;
}
private bool WipInfoBlobExists(int id)
{
return _context.WipInfoBlobs.Any(e => e.WipID == id);
}
}
}

9
AMESCoreStudio.WebApi/Controllers/AMES/WipSystemController.cs

@ -79,9 +79,10 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES
public async Task<ResultModel<WipSystem>> PutWipSystem([FromBody] WipSystem wipSystem)
{
ResultModel<WipSystem> result = new ResultModel<WipSystem>();
var getwipSystem = GetWipSystem(wipSystem.WipNo).Result.Value;
if (getwipSystem != null)
var wipNo = wipSystem.WipNo;
try
{
if (_context.WipSystems.Any(e => e.WipNo == wipNo))
{
_context.Entry(wipSystem).State = EntityState.Modified;
_context.Entry<WipSystem>(wipSystem).Property("CreateDate").IsModified = false;
@ -94,8 +95,6 @@ namespace AMESCoreStudio.WebApi.Controllers.AMES
_context.WipSystems.Add(wipSystem);
}
try
{
await _context.SaveChangesAsync();
result.Success = true;
result.Msg = "OK";

82
AMESCoreStudio.WebApi/Models/AMES/WipInfoBlob.cs

@ -0,0 +1,82 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
using System.Runtime.Serialization;
#nullable disable
namespace AMESCoreStudio.WebApi.Models.AMES
{
/// <summary>
/// 工單上傳圖檔資料表
/// </summary>
[Keyless]
[Table("WIP_INFO_BLOB", Schema = "JHAMES")]
public partial class WipInfoBlob
{
/// <summary>
/// 工單ID
/// </summary>
[Key]
[Column("WIP_ID")]
[DataMember]
public int WipID { get; set; }
/// <summary>
/// 圖檔名稱
/// </summary>
[Key]
[Required]
[Column("IMAGE_NAME")]
[StringLength(50)]
[DataMember]
public string ImageName { get; set; }
/// <summary>
/// 圖檔
/// </summary>
[Column("IMAGE_BLOB", TypeName = "BLOB")]
[DataMember]
public byte[] ImageBlob { get; set; }
/// <summary>
/// 上傳路徑
/// </summary>
[Required]
[Column("FILEPATH")]
[StringLength(100)]
[DataMember]
public string Filepath { get; set; }
/// <summary>
/// 建立UserID
/// </summary>
[Column("CREATE_USERID")]
[Required]
[DataMember]
public int CreateUserID { get; set; } = 0;
/// <summary>
/// 建立日期
/// </summary>
[Required]
[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;
}
}

6
AMESCoreStudio.WebApi/Models/AMESContext.cs

@ -46,6 +46,7 @@ namespace AMESCoreStudio.WebApi
modelBuilder.Entity<WipRule>().HasKey(c => new { c.WipNO, c.RuleStationID, c.KeyNo });
modelBuilder.Entity<WipMAC>().HasKey(c => new { c.WipNO, c.StartNO, c.EndNO });
modelBuilder.Entity<WipInfoBlob>().HasKey(c => new { c.WipID, c.ImageName});
modelBuilder.Entity<BarcodeItem>().HasOne(r => r.B).WithMany().HasForeignKey(r => r.BarcodeID).IsRequired();
modelBuilder.Entity<BarcodeItem>().HasOne(r => r.I).WithMany().HasForeignKey(r => r.ItemNo).IsRequired();
modelBuilder.Entity<BarcodeItem>().HasOne(r => r.S).WithMany().HasForeignKey(r => r.RuleStationID).IsRequired();
@ -748,6 +749,11 @@ namespace AMESCoreStudio.WebApi
/// 工單治具資料檔
/// </summary>
public virtual DbSet<WipOutfit> WipOutfits { get; set; }
/// <summary>
/// 工單上傳圖檔資料表
/// </summary>
public virtual DbSet<WipInfoBlob> WipInfoBlobs { get; set; }
}
}

Loading…
Cancel
Save