using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; using AMESCoreStudio.WebApi.Models.AMES; using AMESCoreStudio.WebApi.DTO.AMES; using AMESCoreStudio.CommonTools.Result; using System.Data.Common; using System.Data; using System.Dynamic; using Microsoft.Extensions.Configuration; using System.IO; using System.Collections.ObjectModel; using AMESCoreStudio.WebApi.Controllers.BLL; using System.Text; using System.Data.SqlClient; using Dapper; using OfficeOpenXml; using OfficeOpenXml.Style; namespace AMESCoreStudio.WebApi.Controllers.AMES { /// /// /// [Route("api/[controller]")] [ApiController] public class WipInfosController : Controller { private readonly AMESContext _context; private readonly ESUNContext _esun_context; private readonly IConfiguration _config; private readonly string _PTDContext; /// /// /// /// public WipInfosController(AMESContext context) { _config = new ConfigurationBuilder().SetBasePath(Environment.CurrentDirectory).AddJsonFile("appsettings.json").Build(); _context = context; _PTDContext = _config.GetConnectionString("PTDContext"); } /// /// 查詢工單資料Info /// /// // GET: api/SystemInfoes [HttpGet] public async Task>> GetWipInfo() { IQueryable q = _context.WipInfos; q = q.OrderBy(p => p.WipNO); //q = q.OrderByDescending(p => p.SystemID); var WipInfo = await q.ToListAsync(); //return await _context.SystemInfoes.ToListAsync(); return WipInfo; } /// /// 查詢工單資料QRS009 /// /// /// /// [Route("[action]")] [HttpGet] public async Task> GetWipInfo4QRS009(string unitNo, string factoryNo) { ResultModel result = new ResultModel(); var q = from q1 in _context.WipInfos join q2 in _context.WipAtts on q1.WipNO equals q2.WipNO join q3 in _context.LineInfoes on q1.WipID equals q3.WipNo join q4 in _context.FactoryUnits on q1.UnitNO equals q4.UnitNo select new { q1.WipID, q1.WipNO, q1.PlanQTY, q1.CompleteQTY, q1.UnitNO, q1.LineID, q1.FlowRuleID, q1.StatusNO, q1.CreateDate, q2.ItemNO, q3.LineDesc, q4.UnitName, q1.WerksNO }; q = q.Where(w => w.StatusNO == "A"); if (unitNo != null) { q = q.Where(w => w.UnitNO.Equals(unitNo)); } if (factoryNo != null) { q = q.Where(w => w.WerksNO.Equals(factoryNo)); } //紀錄筆數 result.DataTotal = q.Count(); result.Data = await q.ToListAsync(); if (result == null) { result.Msg = "查無資料"; result.Success = false; return result; } result.Success = true; result.Msg = "OK"; return result; } /// /// 查詢工單資料PDS003 /// /// [Route("[action]")] [HttpGet] public async Task> GetWipInfo4PDS003(string wipNO) { ResultModel result = new ResultModel(); var q = from q1 in _context.WipInfos join q2 in _context.WipAtts on q1.WipNO equals q2.WipNO into wip_att from x in wip_att.DefaultIfEmpty() join q3 in _context.LineInfoes on q1.LineID equals q3.LineID join q4 in _context.FactoryUnits on q1.UnitNO equals q4.UnitNo select new { q1.WipID, q1.WipNO, q1.PlanQTY, q1.CompleteQTY, q1.UnitNO, q1.LineID, q1.FlowRuleID, q1.StatusNO, q1.CreateDate, x.ItemNO, q3.LineDesc, q4.UnitName }; if (wipNO != null && wipNO != "") { q = q.Where(w => w.WipNO == wipNO); } //紀錄筆數 result.DataTotal = q.Count(); result.Data = await q.ToListAsync(); if (result == null) { result.Msg = "查無資料"; result.Success = false; return result; } result.Success = true; result.Msg = "OK"; return result; } /// /// 查詢工單資料QRS011 /// /// 生產製程 /// 料號 /// 工單號碼 /// 工單狀態:N(未完工) E(已完工) /// [Route("[action]")] [HttpGet] public async Task> GetWipInfo4QRS011(string unitNo, string itemNO, string wipNO, string wipStatus = "A") { ResultModel result = new ResultModel(); var q = from q1 in _context.WipInfos join q2 in _context.WipAtts on q1.WipNO equals q2.WipNO join q3 in _context.LineInfoes on q1.LineID equals q3.LineID join q4 in _context.FactoryUnits on q1.UnitNO equals q4.UnitNo select new { q1.WipID, q1.WipNO, q1.PlanQTY, q1.CompleteQTY, q1.UnitNO, q1.LineID, q1.FlowRuleID, q1.StatusNO, q1.CreateDate, q2.ItemNO, q3.LineDesc, q4.UnitName }; q = q.Where(w => w.StatusNO == wipStatus); if (unitNo != "*") { q = q.Where(w => w.UnitNO == unitNo); } if (itemNO != null && itemNO != "") { q = q.Where(w => w.ItemNO == itemNO); } if (wipNO != null && wipNO != "") { q = q.Where(w => w.WipNO == wipNO); } //紀錄筆數 result.DataTotal = q.Count(); result.Data = await q.ToListAsync(); if (result == null) { result.Msg = "查無資料"; result.Success = false; return result; } result.Success = true; result.Msg = "OK"; return result; } /// /// /// /// /// public static DataTable DataReaderToDataTable(DbDataReader reader) { try { DataTable dt = new DataTable(); int fieldCount = reader.FieldCount; for (int fieldIndex = 0; fieldIndex < fieldCount; ++fieldIndex) { dt.Columns.Add(reader.GetName(fieldIndex), reader.GetFieldType(fieldIndex)); } dt.BeginLoadData(); object[] rowValues = new object[fieldCount]; while (reader.Read()) { reader.GetValues(rowValues); dt.LoadDataRow(rowValues, true); } reader.Close(); dt.EndLoadData(); return dt; } catch (Exception ex) { throw new Exception("DataReader Convert DataTable Error!", ex); } } /// /// /// /// /// [Route("[action]")] [HttpGet] public async Task> ESUNConnectTest(string barcodeNo) { ResultModel result = new ResultModel(); result.Msg = "OK"; result.Success = true; ESUNContext _esun_context = new ESUNContext(); try { //读取MAC DbConnection esun_conn = _esun_context.Database.GetDbConnection(); if (esun_conn.State != System.Data.ConnectionState.Open) { await esun_conn.OpenAsync(); } /* string mac_sql = string.Format(@"select distinct a.工單編號 as mo_id,e.客戶工單編號 as customer_moid,a.工單序號 as product_sn, case substring(f.avalue_kp_typeid, 1, 3) when 'MAC' then isnull(z.item_prefix,'')+b.SUB_ITEM_SN else b.SUB_ITEM_SN end as part_barcode, f.avalue_kp_typeid as class,c.material_id,d.r_stn as routeid,'' as workerid,rtrim(g.sn_date) + ' ' + rtrim(g.sn_time) as create_date from or_sn_story a left join sub_item_db b on a.工單編號 = b.or_sn and a.工單序號 = b.or_sal left join jh_sub_item c on a.工單編號 = c.mo_id and b.class = c.part_typeid left join jh_sub_item_prefix z on c.mo_id = z.mo_id left join or_sub_db d on a.工單編號 = d.or_sn and b.class = d.class join or_list e on a.工單編號 = e.工單編號 and e.[客戶] = 'EV' left join jh_sub_item_mapping f on b.class = f.eversun_kp_typeid join jh_sn_list g on a.工單序號 = g.sn where g.sn_result = 'OK' AND a.工單序號 = '{0}' AND c.material_id LIKE 'MAC%'", barcodeNo); */ string mac_sql = string.Format(@"SELECT B.[ProductSN], B.[PartBarcode], B.[MFID], B.[MOID], B.[PartTypeID], B.[MaterialID], B.[IsActive] FROM [SFIS].[dbo].[ZPDKeyPart] B WHERE B.[IsActive] = 1 AND B.[ProductSN] = (SELECT A.[PartBarcode] FROM [SFIS].[dbo].[ZPDKeyPart] A WHERE A.[IsActive] = 1 AND A.[PartTypeID] = 'MAC' AND A.[PartBarcode] = '{0}')", barcodeNo); try { using (var esun_cmd = esun_conn.CreateCommand()) { esun_cmd.CommandText = mac_sql; using (var esun_reader = await esun_cmd.ExecuteReaderAsync()) { if (esun_reader.HasRows) { List esun_list = new List(); DataTable esun_table = new DataTable(); esun_table = DataReaderToDataTable(esun_reader); if (esun_table.Rows.Count > 0) { string mac_list = ""; for (int k = 0; k < esun_table.Rows.Count; k++) { mac_list = mac_list + esun_table.Rows[k]["part_barcode"].ToString().Trim() + ","; } if (mac_list != "") { string mac = mac_list.Substring(0, mac_list.Length - 1); result.Msg = "OK:" + mac; result.Success = true; } } } } } } catch (Exception e2) { result.Msg = "NG:" + e2.Message; result.Success = false; } } catch (Exception e1) { result.Msg = "NG:" + e1.Message; result.Success = false; } return result; } /// /// 查詢工單KeyParts資料QRS013 /// /// /// /// /// /// [Route("[action]")] [HttpGet] public async Task> GetWipInfo4QRS013(string wipNO, string factoryNo, int page, int limit) { ResultModel result = new ResultModel(); Helper helper = new Helper(_context); DbConnection conn = _context.Database.GetDbConnection(); if (conn.State != ConnectionState.Open) { await conn.OpenAsync(); } string kp_sql = "select kp_no, count(kp_seq) as kp_qty from jhames.wip_kp where wip_no = '" + wipNO + "' group by kp_no"; DataTable dtKp = new DataTable(); using (var cmd = conn.CreateCommand()) { cmd.CommandText = kp_sql; using (var reader = await cmd.ExecuteReaderAsync()) { if (reader.HasRows) { dtKp = DataReaderToDataTable(reader); } } } string sql = @" select c.wip_no as WipNo,b.barcode_no as BarcodeNo,b.extra_barcode_no as ExtraBarcodeNo,d.model_no as ModelNO,d.item_no as ItemNO"; sql = sql + " from jhames.barcode_info b,jhames.wip_info c,jhames.wip_att d"; sql = sql + " where b.wip_id = c.wip_id and c.wip_no = d.wip_no"; sql = sql + " and c.wip_no = '" + wipNO + "'"; using (var barcode_cmd = conn.CreateCommand()) { barcode_cmd.CommandText = sql; using (var barcode_reader = await barcode_cmd.ExecuteReaderAsync()) { if (barcode_reader.HasRows) { List list = new List(); DataTable dtBarcode = new DataTable(); dtBarcode = DataReaderToDataTable(barcode_reader); if (dtKp.Rows.Count > 0) { for (int i = 0; i < dtKp.Rows.Count; i++) { int kp_qty = int.Parse(dtKp.Rows[i]["KP_QTY"].ToString()); string kp_no = dtKp.Rows[i]["KP_NO"].ToString(); if (kp_qty > 1) { try { dtBarcode.Columns.Add("KP_" + kp_no); } catch { } for (int j = 1; j < kp_qty; j++) { try { dtBarcode.Columns.Add("KP_" + kp_no + "_" + j.ToString()); } catch { } } } else { try { dtBarcode.Columns.Add("KP_" + kp_no); } catch { } } } dtBarcode.AcceptChanges(); for (int i = 0; i < dtBarcode.Rows.Count; i++) { string barcode_no = dtBarcode.Rows[i]["BarcodeNo"].ToString(); //读取组件 for (int j = 0; j < dtKp.Rows.Count; j++) { string kp_no = dtKp.Rows[j]["KP_NO"].ToString(); string barcode_item_sql = string.Format(@"select part_no from jhames.barcode_info a,jhames.barcode_item b where a.barcode_id = b.barcode_id and b.item_no = '{0}' and a.barcode_no = '{1}'", kp_no, barcode_no); using (var item_cmd = conn.CreateCommand()) { item_cmd.CommandText = barcode_item_sql; using (var item_reader = await item_cmd.ExecuteReaderAsync()) { if (item_reader.HasRows) { DataTable dtItem = new DataTable(); dtItem = DataReaderToDataTable(item_reader); for (int k = 0; k < dtItem.Rows.Count; k++) { string part_no = dtItem.Rows[k]["PART_NO"].ToString(); try { dtBarcode.Rows[i]["KP_" + kp_no + "_" + k.ToString()] = part_no; } catch { try { dtBarcode.Rows[i]["KP_" + kp_no] = part_no; } catch { } } dtBarcode.AcceptChanges(); try { if (kp_no.StartsWith("MB") && !kp_no.StartsWith("MB_MAC")) { ESUNContext _esun_context = new ESUNContext(); //读取MAC DbConnection esun_conn = _esun_context.Database.GetDbConnection(); if (esun_conn.State != ConnectionState.Open) { await esun_conn.OpenAsync(); } bool createMacCol = true; //part_no = "91000237320038"; string mac_sql = string.Format(@"select distinct a.工單編號 as mo_id,e.客戶工單編號 as customer_moid,a.工單序號 as product_sn, case substring(f.avalue_kp_typeid, 1, 3) when 'MAC' then isnull(z.item_prefix,'')+b.SUB_ITEM_SN else b.SUB_ITEM_SN end as part_barcode, f.avalue_kp_typeid as class,c.material_id,d.r_stn as routeid,'' as workerid,rtrim(g.sn_date) + ' ' + rtrim(g.sn_time) as create_date from or_sn_story a left join sub_item_db b on a.工單編號 = b.or_sn and a.工單序號 = b.or_sal left join jh_sub_item c on a.工單編號 = c.mo_id and b.class = c.part_typeid left join jh_sub_item_prefix z on c.mo_id = z.mo_id left join or_sub_db d on a.工單編號 = d.or_sn and b.class = d.class join or_list e on a.工單編號 = e.工單編號 and e.[客戶] = 'EV' left join jh_sub_item_mapping f on b.class = f.eversun_kp_typeid join jh_sn_list g on a.工單序號 = g.sn where g.sn_result = 'OK' AND a.工單序號 = '{0}' AND c.material_id LIKE 'MAC%'", part_no); using (var esun_cmd = esun_conn.CreateCommand()) { esun_cmd.CommandText = mac_sql; esun_cmd.CommandTimeout = 0; using (var esun_reader = await esun_cmd.ExecuteReaderAsync()) { if (esun_reader.HasRows) { List esun_list = new List(); DataTable esun_table = new DataTable(); esun_table = DataReaderToDataTable(esun_reader); if (esun_table.Rows.Count > 0) { if (createMacCol) { for (int m = 0; m < esun_table.Rows.Count; m++) { if (dtItem.Rows.Count == 1) { try { dtBarcode.Columns.Add("KP_" + kp_no + "_MAC" + (m + 1).ToString()); } catch { } } else { try { dtBarcode.Columns.Add("KP_" + kp_no + "_" + (k + 1).ToString() + "_MAC" + (m + 1).ToString()); } catch { } } } dtBarcode.AcceptChanges(); createMacCol = false; } string mac = ""; for (int m = 0; m < esun_table.Rows.Count; m++) { mac = esun_table.Rows[m]["part_barcode"].ToString().Trim(); if (dtItem.Rows.Count == 1) { dtBarcode.Rows[i]["KP_" + kp_no + "_MAC" + (m + 1).ToString()] = mac; } else { dtBarcode.Rows[i]["KP_" + kp_no + "_" + (k + 1).ToString() + "_MAC" + (m + 1).ToString()] = mac; } dtBarcode.AcceptChanges(); } } } } } } } catch (Exception e1) { string err = e1.Message; } } dtBarcode.AcceptChanges(); } } } } } } foreach (DataRow row in dtBarcode.Rows) { dynamic dyn = new ExpandoObject(); list.Add(dyn); foreach (DataColumn column in dtBarcode.Columns) { var dic = (IDictionary)dyn; dic[column.ColumnName] = row[column]; } } result.DataTotal = list.Count(); result.Data = list; } } } if (result == null) { result.Msg = "查無資料"; result.Success = false; return result; } result.Success = true; result.Msg = "OK"; return result; } private void WriteTraceLog(string logDesc) { try { StreamWriter writer; string path = AppDomain.CurrentDomain.BaseDirectory + "TraceLog"; if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } string logFileName = path + @"\" + DateTime.Now.ToString("yyyyMMdd") + ".txt"; if (!System.IO.File.Exists(logFileName)) { writer = System.IO.File.CreateText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " - " + logFileName); } else { writer = System.IO.File.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " - " + logFileName); } writer.WriteLine(logDesc); writer.Close(); } catch { } } /// /// 查詢工單KeyParts資料QRS017 /// /// /// [Route("[action]")] [HttpGet] public async Task> GetWipInfo4QRS017(string wipNO) { ResultModel result = new ResultModel(); Helper helper = new Helper(_context); DbConnection conn = _context.Database.GetDbConnection(); if (conn.State != ConnectionState.Open) { await conn.OpenAsync(); } string wip_sql = "select b.barcode_id,a.wip_type from jhames.wip_info a,jhames.barcode_info b where a.wip_id = b.wip_id and a.wip_no = '" + wipNO + "'"; DataTable dtWip = new DataTable(); using (var cmd = conn.CreateCommand()) { cmd.CommandText = wip_sql; using (var reader = await cmd.ExecuteReaderAsync()) { if (reader.HasRows) { dtWip = DataReaderToDataTable(reader); } } } string wipType = ""; int barcode_id = -1; //if (dtWip.Rows.Count > 0) if (false) { wipType = dtWip.Rows[0]["WIP_TYPE"].ToString(); barcode_id = int.Parse(dtWip.Rows[0]["BARCODE_ID"].ToString()); } else { wip_sql = "select b.barcode_id,a.wip_type from jhames.wip_info a,jhames.barcode_item b where a.wip_id = b.wip_id and a.wip_no = '" + wipNO + "'"; dtWip = new DataTable(); using (var cmd = conn.CreateCommand()) { cmd.CommandText = wip_sql; using (var reader = await cmd.ExecuteReaderAsync()) { if (reader.HasRows) { dtWip = DataReaderToDataTable(reader); } } } if (dtWip.Rows.Count > 0) { wipType = dtWip.Rows[0]["WIP_TYPE"].ToString(); barcode_id = int.Parse(dtWip.Rows[0]["BARCODE_ID"].ToString()); } } string kp_sql = "select kp_no, count(kp_seq) as kp_qty, min(kp_seq) kp_seq from jhames.wip_kp where wip_no = '" + wipNO + "' group by kp_no order by kp_seq "; DataTable dtKp = new DataTable(); if (wipType == "R") { kp_sql = "select item_no as kp_no,count(item_no) kp_qty from jhames.barcode_item where barcode_id = " + barcode_id + " group by item_no"; } else { kp_sql = "select item_no as kp_no,count(item_no) kp_qty from jhames.barcode_item where barcode_id = " + barcode_id + " group by item_no"; } using (var cmd = conn.CreateCommand()) { cmd.CommandText = kp_sql; using (var reader = await cmd.ExecuteReaderAsync()) { if (reader.HasRows) { dtKp = DataReaderToDataTable(reader); } } } WriteTraceLog("query wip_kp sql:" + kp_sql); if (dtKp != null) { WriteTraceLog("query wip_kp rows qty:" + dtKp.Rows.Count); } /* string sql = @" select c.wip_no as WipNo,b.barcode_no as BarcodeNo,b.extra_barcode_no as ExtraBarcodeNo,d.model_no as ModelNO,d.item_no as ItemNO"; sql = sql + " from jhames.barcode_info b,jhames.wip_info c,jhames.wip_att d"; sql = sql + " where b.wip_id = c.wip_id and c.wip_no = d.wip_no"; sql = sql + " and c.wip_no = '" + wipNO + "'"; */ string sql = @" select c.wip_no as WipNo,b.barcode_no as BarcodeNo,b.extra_barcode_no as ExtraBarcodeNo,e.station_name as StationName,b.box_no as BoxNo,d.model_no as ModelNO,d.item_no as ItemNO"; sql = sql + " from jhames.barcode_info b,jhames.wip_barcode c,jhames.wip_att d,jhames.stations e"; sql = sql + " where b.barcode_no between c.start_no and c.end_no and c.wip_no = d.wip_no and b.station_id = e.station_id"; sql = sql + " and c.wip_no = '" + wipNO + "'"; sql = sql + " order by b.barcode_no "; using (var barcode_cmd = conn.CreateCommand()) { barcode_cmd.CommandText = sql; using (var barcode_reader = await barcode_cmd.ExecuteReaderAsync()) { if (barcode_reader.HasRows) { List list = new List(); DataTable dtBarcode = new DataTable(); WriteTraceLog("query barcode sql:" + sql); dtBarcode = DataReaderToDataTable(barcode_reader); if (dtBarcode != null) { WriteTraceLog("query barcode rows qty:" + dtBarcode.Rows.Count); } if (dtKp.Rows.Count > 0) { for (int i = 0; i < dtKp.Rows.Count; i++) { int kp_qty = int.Parse(dtKp.Rows[i]["KP_QTY"].ToString()); string kp_no = dtKp.Rows[i]["KP_NO"].ToString(); if (kp_qty > 1) { try { dtBarcode.Columns.Add("KP_" + kp_no); } catch { } for (int j = 1; j < kp_qty; j++) { try { dtBarcode.Columns.Add("KP_" + kp_no + "#" + j.ToString()); } catch { } } } else { try { dtBarcode.Columns.Add("KP_" + kp_no); } catch { } } } dtBarcode.AcceptChanges(); for (int i = 0; i < dtBarcode.Rows.Count; i++) { string barcode_no = dtBarcode.Rows[i]["BarcodeNo"].ToString(); //读取组件 for (int j = 0; j < dtKp.Rows.Count; j++) { string kp_no = dtKp.Rows[j]["KP_NO"].ToString(); string barcode_item_sql = string.Format(@"select part_no from jhames.barcode_info a,jhames.barcode_item b where a.barcode_id = b.barcode_id and b.item_no = '{0}' and a.barcode_no = '{1}'", kp_no, barcode_no); using (var item_cmd = conn.CreateCommand()) { item_cmd.CommandText = barcode_item_sql; using (var item_reader = await item_cmd.ExecuteReaderAsync()) { if (item_reader.HasRows) { DataTable dtItem = new DataTable(); dtItem = DataReaderToDataTable(item_reader); for (int k = 0; k < dtItem.Rows.Count; k++) { string part_no = dtItem.Rows[k]["PART_NO"].ToString(); try { dtBarcode.Rows[i]["KP_" + kp_no + "#" + k.ToString()] = part_no; } catch { try { dtBarcode.Rows[i]["KP_" + kp_no] = part_no; } catch { } } dtBarcode.AcceptChanges(); try { if (kp_no.StartsWith("MB") && !kp_no.StartsWith("MB_MAC")) { /* WriteTraceLog("query mac by mb trace 001"); ESUNContext _esun_context = new ESUNContext(); WriteTraceLog("query mac by mb trace 002"); //读取MAC DbConnection esun_conn = _esun_context.Database.GetDbConnection(); WriteTraceLog("query mac by mb trace 003"); if (esun_conn.State != ConnectionState.Open) { await esun_conn.OpenAsync(); } WriteTraceLog("query mac by mb trace 004"); */ bool createMacCol = true; //part_no = "91000237320038"; /* string mac_sql = string.Format(@"select distinct a.工單編號 as mo_id,e.客戶工單編號 as customer_moid,a.工單序號 as product_sn, case substring(f.avalue_kp_typeid, 1, 3) when 'MAC' then isnull(z.item_prefix,'')+b.SUB_ITEM_SN else b.SUB_ITEM_SN end as part_barcode, f.avalue_kp_typeid as class,c.material_id,d.r_stn as routeid,'' as workerid,rtrim(g.sn_date) + ' ' + rtrim(g.sn_time) as create_date from or_sn_story a left join sub_item_db b on a.工單編號 = b.or_sn and a.工單序號 = b.or_sal left join jh_sub_item c on a.工單編號 = c.mo_id and b.class = c.part_typeid left join jh_sub_item_prefix z on c.mo_id = z.mo_id left join or_sub_db d on a.工單編號 = d.or_sn and b.class = d.class join or_list e on a.工單編號 = e.工單編號 and e.[客戶] = 'EV' left join jh_sub_item_mapping f on b.class = f.eversun_kp_typeid join jh_sn_list g on a.工單序號 = g.sn where g.sn_result = 'OK' AND a.工單序號 = '{0}' AND c.material_id LIKE 'MAC%'", part_no); */ /* string mac_sql = string.Format(@"SELECT B.[ProductSN], B.[PartBarcode], B.[MFID], B.[MOID], B.[PartTypeID], B.[MaterialID], B.[IsActive] FROM [SFIS].[dbo].[ZPDKeyPart] B WHERE B.[IsActive] = 1 AND B.[ProductSN] = (SELECT A.[PartBarcode] FROM [SFIS].[dbo].[ZPDKeyPart] A WHERE A.[IsActive] = 1 AND A.[PartTypeID] = 'MAC' AND A.[PartBarcode] = '{0}')", part_no); WriteTraceLog("query mac by mb sql:" + mac_sql); */ bool findFlag = false; string mac_sql = string.Format("select partbarcode from jhames.c_sfis_keyparts where productsn = '{0}' and parttypeid='MAC'", part_no); using (var esun_cmd = conn.CreateCommand()) { esun_cmd.CommandText = mac_sql; esun_cmd.CommandTimeout = 0; using (var esun_reader = await esun_cmd.ExecuteReaderAsync()) { if (esun_reader.HasRows) { findFlag = true; List esun_list = new List(); DataTable esun_table = new DataTable(); esun_table = DataReaderToDataTable(esun_reader); if (esun_table != null) { WriteTraceLog("query mac by mb trace 005:esun_talbe rows qty:" + esun_table.Rows.Count); } if (esun_table.Rows.Count > 0) { if (createMacCol) { for (int m = 0; m < esun_table.Rows.Count; m++) { if (dtItem.Rows.Count == 1) { try { dtBarcode.Columns.Add("KP_" + kp_no + "#MAC" + (m + 1).ToString()); } catch { } } else { try { dtBarcode.Columns.Add("KP_" + kp_no + "#" + (k + 1).ToString() + "_MAC" + (m + 1).ToString()); } catch { } } } dtBarcode.AcceptChanges(); createMacCol = false; } WriteTraceLog("query mac by mb trace 006"); string mac = ""; for (int m = 0; m < esun_table.Rows.Count; m++) { //mac = esun_table.Rows[m]["part_barcode"].ToString().Trim(); mac = esun_table.Rows[m]["PARTBARCODE"].ToString().Trim(); if (dtItem.Rows.Count == 1) { dtBarcode.Rows[i]["KP_" + kp_no + "#MAC" + (m + 1).ToString()] = mac; } else { dtBarcode.Rows[i]["KP_" + kp_no + "#" + (k + 1).ToString() + "_MAC" + (m + 1).ToString()] = mac; } dtBarcode.AcceptChanges(); } WriteTraceLog("query mac by mb trace 007"); } } } } //从barcode_item读取结转数据 if (!findFlag) { string mac_sql2 = string.Format("select a.part_no from jhames.barcode_item a,jhames.barcode_info b where a.barcode_id = b.barcode_id and b.barcode_no = '{0}' and item_no like 'MAC%'", part_no); using (var esun_cmd = conn.CreateCommand()) { esun_cmd.CommandText = mac_sql2; esun_cmd.CommandTimeout = 0; using (var esun_reader = await esun_cmd.ExecuteReaderAsync()) { if (esun_reader.HasRows) { findFlag = true; List esun_list = new List(); DataTable esun_table = new DataTable(); esun_table = DataReaderToDataTable(esun_reader); if (esun_table != null) { WriteTraceLog("query mac by mb trace 005:esun_talbe rows qty:" + esun_table.Rows.Count); } if (esun_table.Rows.Count > 0) { if (createMacCol) { for (int m = 0; m < esun_table.Rows.Count; m++) { if (dtItem.Rows.Count == 1) { try { dtBarcode.Columns.Add("KP_" + kp_no + "#MAC" + (m + 1).ToString()); } catch { } } else { try { dtBarcode.Columns.Add("KP_" + kp_no + "#" + (k + 1).ToString() + "_MAC" + (m + 1).ToString()); } catch { } } } dtBarcode.AcceptChanges(); createMacCol = false; } string mac = ""; for (int m = 0; m < esun_table.Rows.Count; m++) { //mac = esun_table.Rows[m]["part_barcode"].ToString().Trim(); mac = esun_table.Rows[m]["PART_NO"].ToString().Trim(); if (dtItem.Rows.Count == 1) { dtBarcode.Rows[i]["KP_" + kp_no + "#MAC" + (m + 1).ToString()] = mac; } else { dtBarcode.Rows[i]["KP_" + kp_no + "#" + (k + 1).ToString() + "_MAC" + (m + 1).ToString()] = mac; } dtBarcode.AcceptChanges(); } } } } } } } } catch (Exception e1) { string err = e1.Message; WriteTraceLog("query mac by mb trace 999:" + e1.Message); } } WriteTraceLog("query mac by mb trace 008"); dtBarcode.AcceptChanges(); } } } } } } foreach (DataRow row in dtBarcode.Rows) { dynamic dyn = new ExpandoObject(); list.Add(dyn); foreach (DataColumn column in dtBarcode.Columns) { var dic = (IDictionary)dyn; dic[column.ColumnName] = row[column]; } } WriteTraceLog("query mac by mb trace 009"); result.DataTotal = list.Count(); result.Data = list; WriteTraceLog("query mac by mb trace 010"); } } } if (result == null) { result.Msg = "查無資料"; result.Success = false; return result; } result.Success = true; result.Msg = "OK"; return result; } /// /// 查詢工單KeyParts資料QRS013 /// /// /// /// /// /// [Route("[action]")] [HttpGet] public async Task> GetWipInfo4QRS013V4(string wipNO, string factoryNo, int page, int limit) { ResultModel result = new ResultModel(); Helper helper = new Helper(_context); var wip_kp = await _context.WipKps.FromSqlRaw("SELECT * FROM JHAMES.WIP_KP WHERE WIP_NO = '" + wipNO + "' ORDER BY KP_NO").ToListAsync(); string sql = @" select c.wip_no as WipNo,b.barcode_no as BarcodeNo,b.extra_barcode_no as ExtraBarcodeNo,d.model_no as ModelNO,d.item_no as ItemNO"; string sql1 = "", sql2 = "", sql3 = ""; if (wip_kp.Count > 0) { for (int i = 0; i < wip_kp.Count; i++) { sql1 = sql1 + ",k" + (i + 1).ToString() + ".part_no as KP_" + wip_kp[i].KpNo; sql2 = sql2 + ",(select barcode_id,part_no from jhames.barcode_item where item_no = '" + wip_kp[i].KpNo + "') k" + (i + 1).ToString(); sql3 = sql3 + " and b.barcode_id = k" + (i + 1).ToString() + ".barcode_id(+)"; } } sql = sql + sql1; sql = sql + " from jhames.barcode_info b,jhames.wip_info c,jhames.wip_att d"; sql = sql + sql2; sql = sql + " where b.wip_id = c.wip_id and c.wip_no = d.wip_no"; sql = sql + sql3; sql = sql + " and c.wip_no = '" + wipNO + "'"; DbConnection conn = _context.Database.GetDbConnection(); if (conn.State != System.Data.ConnectionState.Open) { await conn.OpenAsync(); } using (var cmd = conn.CreateCommand()) { cmd.CommandText = sql; using (var reader = await cmd.ExecuteReaderAsync()) { if (reader.HasRows) { List list = new List(); DataTable table = new DataTable(); table = DataReaderToDataTable(reader); //判断MB组件增加查询MAC try { if (wip_kp.Count > 0) { bool mbFlag = false; for (int i = 0; i < wip_kp.Count; i++) { if (wip_kp[i].KpNo.StartsWith("MB")) { mbFlag = true; break; } } if (mbFlag) { ESUNContext _esun_context = new ESUNContext(); //读取MAC DbConnection esun_conn = _esun_context.Database.GetDbConnection(); if (esun_conn.State != System.Data.ConnectionState.Open) { await esun_conn.OpenAsync(); } bool createMacCol = true; for (int j = 0; j < table.Rows.Count; j++) { string barcode_no = ""; try { barcode_no = table.Rows[j]["KP_MB"].ToString(); } catch { } string mac_sql = string.Format(@"select distinct a.工單編號 as mo_id,e.客戶工單編號 as customer_moid,a.工單序號 as product_sn, case substring(f.avalue_kp_typeid, 1, 3) when 'MAC' then isnull(z.item_prefix,'')+b.SUB_ITEM_SN else b.SUB_ITEM_SN end as part_barcode, f.avalue_kp_typeid as class,c.material_id,d.r_stn as routeid,'' as workerid,rtrim(g.sn_date) + ' ' + rtrim(g.sn_time) as create_date from or_sn_story a left join sub_item_db b on a.工單編號 = b.or_sn and a.工單序號 = b.or_sal left join jh_sub_item c on a.工單編號 = c.mo_id and b.class = c.part_typeid left join jh_sub_item_prefix z on c.mo_id = z.mo_id left join or_sub_db d on a.工單編號 = d.or_sn and b.class = d.class join or_list e on a.工單編號 = e.工單編號 and e.[客戶] = 'EV' left join jh_sub_item_mapping f on b.class = f.eversun_kp_typeid join jh_sn_list g on a.工單序號 = g.sn where g.sn_result = 'OK' AND a.工單序號 = '{0}' AND c.material_id LIKE 'MAC%'", barcode_no); using (var esun_cmd = esun_conn.CreateCommand()) { esun_cmd.CommandText = mac_sql; using (var esun_reader = await esun_cmd.ExecuteReaderAsync()) { if (esun_reader.HasRows) { List esun_list = new List(); DataTable esun_table = new DataTable(); esun_table = DataReaderToDataTable(esun_reader); if (esun_table.Rows.Count > 0) { if (createMacCol) { for (int k = 0; k < esun_table.Rows.Count; k++) { table.Columns.Add("KP_MAC" + (k + 1).ToString()); } table.AcceptChanges(); createMacCol = false; } string mac = ""; for (int k = 0; k < esun_table.Rows.Count; k++) { mac = esun_table.Rows[k]["part_barcode"].ToString().Trim(); table.Rows[j]["KP_MAC" + (k + 1).ToString()] = mac; table.AcceptChanges(); } } } } } } } } } catch { } foreach (DataRow row in table.Rows) { dynamic dyn = new ExpandoObject(); list.Add(dyn); foreach (DataColumn column in table.Columns) { var dic = (IDictionary)dyn; dic[column.ColumnName] = row[column]; } } result.DataTotal = list.Count(); result.Data = list; } } } if (result == null) { result.Msg = "查無資料"; result.Success = false; return result; } result.Success = true; result.Msg = "OK"; return result; } /// /// 查詢工單KeyParts資料QRS013 /// /// /// /// /// /// [Route("[action]")] [HttpGet] public async Task> GetWipInfo4QRS013V3(string wipNO, string factoryNo, int page, int limit) { ResultModel result = new ResultModel(); Helper helper = new Helper(_context); var wip_kp = await _context.WipKps.FromSqlRaw("SELECT * FROM JHAMES.WIP_KP WHERE WIP_NO = '" + wipNO + "' ORDER BY KP_NO").ToListAsync(); string sql = @" select c.wip_no as WipNo,b.barcode_no as BarcodeNo,b.extra_barcode_no as ExtraBarcodeNo,d.model_no as ModelNO,d.item_no as ItemNO"; string sql1 = "", sql2 = "", sql3 = ""; if (wip_kp.Count > 0) { for (int i = 0; i < wip_kp.Count; i++) { sql1 = sql1 + ",k" + (i + 1).ToString() + ".part_no as KP_" + wip_kp[i].KpNo; sql2 = sql2 + ",(select barcode_id,part_no from jhames.barcode_item where item_no = '" + wip_kp[i].KpNo + "') k" + (i + 1).ToString(); sql3 = sql3 + " and b.barcode_id = k" + (i + 1).ToString() + ".barcode_id(+)"; } } sql = sql + sql1; sql = sql + " from jhames.barcode_info b,jhames.wip_info c,jhames.wip_att d"; sql = sql + sql2; sql = sql + " where b.wip_id = c.wip_id and c.wip_no = d.wip_no"; sql = sql + sql3; sql = sql + " and c.wip_no = '" + wipNO + "'"; DbConnection conn = _context.Database.GetDbConnection(); if (conn.State != System.Data.ConnectionState.Open) { await conn.OpenAsync(); } using (var cmd = conn.CreateCommand()) { cmd.CommandText = sql; using (var reader = await cmd.ExecuteReaderAsync()) { if (reader.HasRows) { List list = new List(); DataTable table = new DataTable(); table = DataReaderToDataTable(reader); //判断MB组件增加查询MAC try { if (wip_kp.Count > 0) { /* for (int i = 0; i < wip_kp.Count; i++) { if (wip_kp[i].KpNo.StartsWith("MB")) { table.Columns.Add("MAC"); table.AcceptChanges(); break; } } */ ESUNContext _esun_context = new ESUNContext(); //读取MAC DbConnection esun_conn = _esun_context.Database.GetDbConnection(); if (esun_conn.State != System.Data.ConnectionState.Open) { await esun_conn.OpenAsync(); } bool createMacCol = true; for (int j = 0; j < table.Rows.Count; j++) { string barcode_no = table.Rows[j]["BarcodeNo"].ToString(); string mac_sql = string.Format(@"select distinct a.工單編號 as mo_id,e.客戶工單編號 as customer_moid,a.工單序號 as product_sn, case substring(f.avalue_kp_typeid, 1, 3) when 'MAC' then isnull(z.item_prefix,'')+b.SUB_ITEM_SN else b.SUB_ITEM_SN end as part_barcode, f.avalue_kp_typeid as class,c.material_id,d.r_stn as routeid,'' as workerid,rtrim(g.sn_date) + ' ' + rtrim(g.sn_time) as create_date from or_sn_story a left join sub_item_db b on a.工單編號 = b.or_sn and a.工單序號 = b.or_sal left join jh_sub_item c on a.工單編號 = c.mo_id and b.class = c.part_typeid left join jh_sub_item_prefix z on c.mo_id = z.mo_id left join or_sub_db d on a.工單編號 = d.or_sn and b.class = d.class join or_list e on a.工單編號 = e.工單編號 and e.[客戶] = 'EV' left join jh_sub_item_mapping f on b.class = f.eversun_kp_typeid join jh_sn_list g on a.工單序號 = g.sn where g.sn_result = 'OK' AND a.工單序號 = '{0}' AND c.material_id LIKE 'MAC%'", barcode_no); using (var esun_cmd = esun_conn.CreateCommand()) { esun_cmd.CommandText = mac_sql; using (var esun_reader = await esun_cmd.ExecuteReaderAsync()) { if (esun_reader.HasRows) { List esun_list = new List(); DataTable esun_table = new DataTable(); esun_table = DataReaderToDataTable(esun_reader); if (esun_table.Rows.Count > 0) { if (createMacCol) { for (int k = 0; k < esun_table.Rows.Count; k++) { table.Columns.Add("KP_MAC" + (k + 1).ToString()); } table.AcceptChanges(); createMacCol = false; } string mac = ""; for (int k = 0; k < esun_table.Rows.Count; k++) { mac = esun_table.Rows[k]["part_barcode"].ToString().Trim(); table.Rows[j]["KP_MAC" + (k + 1).ToString()] = mac; table.AcceptChanges(); } } } } } } } } catch { } foreach (DataRow row in table.Rows) { dynamic dyn = new ExpandoObject(); list.Add(dyn); foreach (DataColumn column in table.Columns) { var dic = (IDictionary)dyn; dic[column.ColumnName] = row[column]; } } result.DataTotal = list.Count(); result.Data = list; } } } if (result == null) { result.Msg = "查無資料"; result.Success = false; return result; } result.Success = true; result.Msg = "OK"; return result; } /// /// 查詢工單KeyParts資料QRS013 /// /// /// /// /// /// [Route("[action]")] [HttpGet] public async Task> GetWipInfo4QRS013V2(string wipNO, string factoryNo, int page, int limit) { ResultModel result = new ResultModel(); Helper helper = new Helper(_context); var wip_kp = await _context.WipKps.FromSqlRaw("SELECT * FROM JHAMES.WIP_KP WHERE WIP_NO = '" + wipNO + "' ORDER BY KP_NO").ToListAsync(); string sql = @" select c.wip_no as WipNo,b.barcode_no as BarcodeNo,b.extra_barcode_no as ExtraBarcodeNo,d.model_no as ModelNO,d.item_no as ItemNO"; string sql1 = "", sql2 = "", sql3 = ""; if (wip_kp.Count > 0) { for (int i = 0; i < wip_kp.Count; i++) { sql1 = sql1 + ",k" + (i + 1).ToString() + ".part_no as KP_" + wip_kp[i].KpNo; sql2 = sql2 + ",(select barcode_id,part_no from jhames.barcode_item where item_no = '" + wip_kp[i].KpNo + "') k" + (i + 1).ToString(); sql3 = sql3 + " and b.barcode_id = k" + (i + 1).ToString() + ".barcode_id(+)"; } } sql = sql + sql1; sql = sql + " from jhames.barcode_info b,jhames.wip_info c,jhames.wip_att d"; sql = sql + sql2; sql = sql + " where b.wip_id = c.wip_id and c.wip_no = d.wip_no"; sql = sql + sql3; sql = sql + " and c.wip_no = '" + wipNO + "'"; DbConnection conn = _context.Database.GetDbConnection(); if (conn.State != System.Data.ConnectionState.Open) { await conn.OpenAsync(); } using (var cmd = conn.CreateCommand()) { cmd.CommandText = sql; using (var reader = await cmd.ExecuteReaderAsync()) { if (reader.HasRows) { List list = new List(); DataTable table = new DataTable(); table = DataReaderToDataTable(reader); table.Columns.Add("KP_MAC"); table.AcceptChanges(); //判断MB组件增加查询MAC try { if (wip_kp.Count > 0) { /* for (int i = 0; i < wip_kp.Count; i++) { if (wip_kp[i].KpNo.StartsWith("MB")) { table.Columns.Add("MAC"); table.AcceptChanges(); break; } } */ ESUNContext _esun_context = new ESUNContext(); //读取MAC DbConnection esun_conn = _esun_context.Database.GetDbConnection(); if (esun_conn.State != System.Data.ConnectionState.Open) { await esun_conn.OpenAsync(); } for (int j = 0; j < table.Rows.Count; j++) { string barcode_no = table.Rows[j]["BarcodeNo"].ToString(); string mac_sql = string.Format(@"select distinct a.工單編號 as mo_id,e.客戶工單編號 as customer_moid,a.工單序號 as product_sn, case substring(f.avalue_kp_typeid, 1, 3) when 'MAC' then isnull(z.item_prefix,'')+b.SUB_ITEM_SN else b.SUB_ITEM_SN end as part_barcode, f.avalue_kp_typeid as class,c.material_id,d.r_stn as routeid,'' as workerid,rtrim(g.sn_date) + ' ' + rtrim(g.sn_time) as create_date from or_sn_story a left join sub_item_db b on a.工單編號 = b.or_sn and a.工單序號 = b.or_sal left join jh_sub_item c on a.工單編號 = c.mo_id and b.class = c.part_typeid left join jh_sub_item_prefix z on c.mo_id = z.mo_id left join or_sub_db d on a.工單編號 = d.or_sn and b.class = d.class join or_list e on a.工單編號 = e.工單編號 and e.[客戶] = 'EV' left join jh_sub_item_mapping f on b.class = f.eversun_kp_typeid join jh_sn_list g on a.工單序號 = g.sn where g.sn_result = 'OK' AND a.工單序號 = '{0}' AND c.material_id LIKE 'MAC%'", barcode_no); using (var esun_cmd = esun_conn.CreateCommand()) { esun_cmd.CommandText = mac_sql; using (var esun_reader = await esun_cmd.ExecuteReaderAsync()) { if (esun_reader.HasRows) { List esun_list = new List(); DataTable esun_table = new DataTable(); esun_table = DataReaderToDataTable(esun_reader); if (esun_table.Rows.Count > 0) { string mac_list = ""; for (int k = 0; k < esun_table.Rows.Count; k++) { mac_list = mac_list + esun_table.Rows[k]["part_barcode"].ToString().Trim() + ","; } if (mac_list != "") { string mac = mac_list.Substring(0, mac_list.Length - 1); table.Rows[j]["KP_MAC"] = mac; table.AcceptChanges(); } } } } } } } } catch { } foreach (DataRow row in table.Rows) { dynamic dyn = new ExpandoObject(); list.Add(dyn); foreach (DataColumn column in table.Columns) { var dic = (IDictionary)dyn; dic[column.ColumnName] = row[column]; } } result.DataTotal = list.Count(); result.Data = list; } } } if (result == null) { result.Msg = "查無資料"; result.Success = false; return result; } result.Success = true; result.Msg = "OK"; return result; } /// /// 查詢工單KeyParts資料QRS013 /// /// /// /// /// /// [Route("[action]")] [HttpGet] public async Task> GetWipInfo4QRS013V1(string wipNO, string factoryNo, int page, int limit) { ResultModel result = new ResultModel(); Helper helper = new Helper(_context); var q = from q1 in _context.WipInfos join q2 in _context.BarcodeInfoes on q1.WipID equals q2.WipID join q3 in _context.BarcodeItems on q2.BarcodeID equals q3.BarcodeID into item_data from x in item_data.DefaultIfEmpty() join q4 in _context.Items on x.ItemNo equals q4.ItemNo into item_base from y in item_base.DefaultIfEmpty() join q5 in _context.WipAtts on q1.WipNO equals q5.WipNO select new { q1.WipID, q1.WipNO, q1.WerksNO, q2.BarcodeNo, q2.ExtraBarcodeNo, q5.ModelNO, q5.ItemNO, KeyPartNo = x.ItemNo, KeyPartItem = x.KpItemNo, KeyPartSN = x.PartNo, KeyPartUserNo = helper.GetUserNo(x.CreateUserID).Result, KeyPartUserName = helper.GetUserName(x.CreateUserID).Result, KeyPartDate = x.CreateDate }; if (wipNO != null && wipNO != "") { q = q.Where(w => w.WipNO == wipNO); } if (factoryNo != null && factoryNo != "") { q = q.Where(w => w.WerksNO == factoryNo); } //紀錄筆數 result.DataTotal = q.Count(); // Table 頁數 if (page > 0) { q = q.Skip((page - 1) * limit).Take(limit); } result.Data = await q.ToListAsync(); if (result == null) { result.Msg = "查無資料"; result.Success = false; return result; } result.Success = true; result.Msg = "OK"; return result; } /// /// 查詢工單資料QRS014 /// /// [Route("[action]")] [HttpGet] public async Task> GetWipInfo4QRS014(string unitNo, string itemNO, string wipNO, string dateStart, string dateEnd, string modelNO, string werksNo, string dateType) { string fpyStation = _config["FPYStation"].ToString(); if (unitNo == "I") { fpyStation = _config["I_FPYStation"].ToString(); } string[] fpy_station = fpyStation.Split(','); var s = from q1 in _context.Stationses.Where(y => fpy_station.Contains(y.StationName)) select new { q1.StationID, q1.StationName }; var sdata = await s.ToListAsync(); int[] slist = new int[sdata.Count]; for (int i = 0; i < slist.Length; i++) { slist[i] = sdata[i].StationID; } ResultModel result = new ResultModel(); var q = from q1 in _context.WipInfos join q2 in _context.WipAtts on q1.WipNO equals q2.WipNO join q3 in _context.LineInfoes on q1.LineID equals q3.LineID join q4 in _context.FactoryUnits on q1.UnitNO equals q4.UnitNo join q5 in _context.WipStations.Where(y => slist.Contains(y.StationID) && y.CreateDate >= DateTime.Parse(dateStart) && y.CreateDate <= DateTime.Parse(dateEnd).AddDays(1)).GroupBy(x => new { x.WipID }).Select(x => new { WipID = x.Key.WipID, CreateDate = x.Min(o => o.CreateDate) }) on q1.WipID equals q5.WipID //join q5 in _context.WipStations.Where(y => slist.Contains(y.StationID) && y.CreateDate >= DateTime.Parse(dateStart) && y.CreateDate <= DateTime.Parse(dateEnd).AddDays(1)).GroupBy(x => new { x.WipID }).Select(x => new { WipID = x.Key.WipID, CreateDate = x.Min(o => o.CreateDate) }) on q1.WipID equals q5.WipID into wip_data //from x1 in wip_data.DefaultIfEmpty() //join q6 in _context.FqcResultMasters.GroupBy(x => new { x.WipNo }).Select(x => new { WipNo = x.Key.WipNo, FqcDate = x.Max(o => o.EndTime) }) on q2.WipNO equals q6.WipNo join q6 in _context.FqcResultMasters.GroupBy(x => new { x.WipNo }).Select(x => new { WipNo = x.Key.WipNo, FqcDate = x.Max(o => o.EndTime) }) on q2.WipNO equals q6.WipNo into fqc_data from x2 in fqc_data.DefaultIfEmpty() select new { q1.WipID, q1.WipNO, q1.WerksNO, q1.CustomerMedical, q1.PlanQTY, q1.CompleteQTY, q1.UnitNO, q1.LineID, q1.FlowRuleID, q1.StatusNO, q1.WipScheduleDate, //CreateDate = (x1.CreateDate == null ? DateTime.Now : x1.CreateDate), q5.CreateDate, q2.ItemNO, q2.ModelNO, q3.LineDesc, q4.UnitName, FqcDate = (x2.FqcDate == null ? DateTime.Now : x2.FqcDate) }; q = q.Where(w => w.CompleteQTY > 0); if (unitNo != "*") { q = q.Where(w => w.UnitNO == unitNo); } if (werksNo != "*" && werksNo != null) { q = q.Where(w => w.WerksNO == werksNo); } if (itemNO != null && itemNO != "") { q = q.Where(w => w.ItemNO == itemNO); } if (modelNO != null && modelNO != "") { q = q.Where(w => w.ModelNO == modelNO); } if (wipNO != null && wipNO != "") { q = q.Where(w => w.WipNO == wipNO); } if (dateType == "WipDate" || dateType == null) { if (dateStart != null && dateStart != "" && dateEnd != null && dateEnd != "") { q = q.Where(w => w.CreateDate >= DateTime.Parse(dateStart) && w.CreateDate <= DateTime.Parse(dateEnd).AddDays(1)); } } else { if (dateStart != null && dateStart != "" && dateEnd != null && dateEnd != "") { q = q.Where(w => w.FqcDate >= DateTime.Parse(dateStart) && w.FqcDate <= DateTime.Parse(dateEnd).AddDays(1)); } } //紀錄筆數 result.DataTotal = q.Distinct().ToList().Count(); var data1 = await q.Distinct().ToListAsync(); var data2 = data1.OrderByDescending(x => x.WipNO).ToList(); //result.Data = await q.Distinct().ToListAsync(); result.Data = data2; if (result == null) { result.Msg = "查無資料"; result.Success = false; return result; } result.Success = true; result.Msg = "OK"; return result; } /// /// 查詢工單資料QRS014 /// /// [Route("[action]")] [HttpGet] public async Task> GetWipInfo4QRS014B(string itemNO, string wipNO, string dateStart, string dateEnd, string modelNO, string werksNo) { ResultModel result = new ResultModel(); var q = from q1 in _context.WipInfos join q2 in _context.WipAtts on q1.WipNO equals q2.WipNO join q3 in _context.LineInfoes on q1.LineID equals q3.LineID join q4 in _context.FactoryUnits on q1.UnitNO equals q4.UnitNo select new { q1.WipID, q1.WipNO, q1.WerksNO, q1.CustomerMedical, q1.PlanQTY, q1.CompleteQTY, q1.UnitNO, q1.LineID, q1.FlowRuleID, q1.StatusNO, q1.CreateDate, q2.ItemNO, q2.ModelNO, q3.LineDesc, q4.UnitName }; q = q.Where(w => w.CompleteQTY > 0); q = q.Where(w => w.UnitNO == "B" && w.CustomerMedical == "N"); if (werksNo != "*") { q = q.Where(w => w.WerksNO == werksNo); } if (itemNO != null && itemNO != "") { q = q.Where(w => w.ItemNO == itemNO); } if (modelNO != null && modelNO != "") { q = q.Where(w => w.ModelNO == modelNO); } if (wipNO != null && wipNO != "") { q = q.Where(w => w.WipNO == wipNO); } if (dateStart != null && dateStart != "" && dateEnd != null && dateEnd != "") { q = q.Where(w => w.CreateDate >= DateTime.Parse(dateStart) && w.CreateDate <= DateTime.Parse(dateEnd).AddDays(1)); } //紀錄筆數 result.DataTotal = q.Count(); result.Data = await q.ToListAsync(); if (result == null) { result.Msg = "查無資料"; result.Success = false; return result; } result.Success = true; result.Msg = "OK"; return result; } /// /// 查詢工單資料QRS014 /// /// [Route("[action]")] [HttpGet] public async Task> GetWipInfo4QRS014S(string itemNO, string wipNO, string dateStart, string dateEnd, string modelNO, string werksNo) { ResultModel result = new ResultModel(); var q = from q1 in _context.WipInfos join q2 in _context.WipAtts on q1.WipNO equals q2.WipNO join q3 in _context.LineInfoes on q1.LineID equals q3.LineID join q4 in _context.FactoryUnits on q1.UnitNO equals q4.UnitNo select new { q1.WipID, q1.WipNO, q1.WerksNO, q1.CustomerMedical, q1.PlanQTY, q1.CompleteQTY, q1.UnitNO, q1.LineID, q1.FlowRuleID, q1.StatusNO, q1.CreateDate, q2.ItemNO, q2.ModelNO, q3.LineDesc, q4.UnitName }; q = q.Where(w => w.CompleteQTY > 0); q = q.Where(w => w.UnitNO == "S" && w.CustomerMedical == "N"); if (werksNo != "*") { q = q.Where(w => w.WerksNO == werksNo); } if (itemNO != null && itemNO != "") { q = q.Where(w => w.ItemNO == itemNO); } if (modelNO != null && modelNO != "") { q = q.Where(w => w.ModelNO == modelNO); } if (wipNO != null && wipNO != "") { q = q.Where(w => w.WipNO == wipNO); } if (dateStart != null && dateStart != "" && dateEnd != null && dateEnd != "") { q = q.Where(w => w.CreateDate >= DateTime.Parse(dateStart) && w.CreateDate <= DateTime.Parse(dateEnd).AddDays(1)); } //紀錄筆數 result.DataTotal = q.Count(); result.Data = await q.ToListAsync(); if (result == null) { result.Msg = "查無資料"; result.Success = false; return result; } result.Success = true; result.Msg = "OK"; return result; } /// /// 查詢工單資料QRS014 /// /// [Route("[action]")] [HttpGet] public async Task> GetWipInfo4QRS014M(string unitNo, string itemNO, string wipNO, string dateStart, string dateEnd, string modelNO, string werksNo) { ResultModel result = new ResultModel(); var q = from q1 in _context.WipInfos join q2 in _context.WipAtts on q1.WipNO equals q2.WipNO join q3 in _context.LineInfoes on q1.LineID equals q3.LineID join q4 in _context.FactoryUnits on q1.UnitNO equals q4.UnitNo select new { q1.WipID, q1.WipNO, q1.WerksNO, q1.CustomerMedical, q1.PlanQTY, q1.CompleteQTY, q1.UnitNO, q1.LineID, q1.FlowRuleID, q1.StatusNO, q1.CreateDate, q2.ItemNO, q2.ModelNO, q3.LineDesc, q4.UnitName }; q = q.Where(w => w.CompleteQTY > 0 && w.CustomerMedical == "Y"); if (unitNo != "*") { q = q.Where(w => w.UnitNO == unitNo); } if (werksNo != "*") { q = q.Where(w => w.WerksNO == werksNo); } if (itemNO != null && itemNO != "") { q = q.Where(w => w.ItemNO == itemNO); } if (modelNO != null && modelNO != "") { q = q.Where(w => w.ModelNO == modelNO); } if (wipNO != null && wipNO != "") { q = q.Where(w => w.WipNO == wipNO); } if (dateStart != null && dateStart != "" && dateEnd != null && dateEnd != "") { q = q.Where(w => w.CreateDate >= DateTime.Parse(dateStart) && w.CreateDate <= DateTime.Parse(dateEnd).AddDays(1)); } //紀錄筆數 result.DataTotal = q.Count(); result.Data = await q.ToListAsync(); if (result == null) { result.Msg = "查無資料"; result.Success = false; return result; } result.Success = true; result.Msg = "OK"; return result; } /// /// 查詢工單資料 by SelectParameter /// /// [Route("[action]")] [HttpGet] public async Task> GetWipInfoSelectParameter([FromQuery] WipInfoDto value, int page = 0, int limit = 10) { ResultModel result = new ResultModel(); var q = from q1 in _context.WipInfos join q2 in _context.WipAtts on q1.WipNO equals q2.WipNO join q3 in _context.LineInfoes on q1.LineID equals q3.LineID join q4 in _context.FactoryUnits on q1.UnitNO equals q4.UnitNo join q5 in _context.FactoryInfos on q1.Werks equals q5.FactoryID.ToString() select new WipQueryDto { wipID = q1.WipID, wipNo = q1.WipNO, planQTY = q1.PlanQTY, unitNo = q1.UnitNO, lineID = q1.LineID, statusNo = q1.StatusNO, wipScheduleDate = q1.WipScheduleDate, wipDueDate = q1.WipDueDate, factoryNameCh = q5.FactoryNameCh, description = q1.Description, CreateDate = q1.CreateDate, itemNo = q2.ItemNO, lineDesc = q3.LineDesc, unitName = q4.UnitName, wipType = q1.WipType, factoryNo = q1.WerksNO }; if (!string.IsNullOrWhiteSpace(value.unitno)) { q = q.Where(w => w.unitNo == value.unitno); } if (!string.IsNullOrWhiteSpace(value.wipno)) { q = q.Where(w => w.wipNo == value.wipno); } if (value.lineid != 0) { q = q.Where(w => w.lineID == value.lineid); } DateTime dateTime = DateTime.Now; if (DateTime.TryParse(value.date_str, out dateTime)) { q = q.Where(w => w.CreateDate >= DateTime.Parse(value.date_str)); } if (DateTime.TryParse(value.date_end, out dateTime)) { q = q.Where(w => w.CreateDate <= DateTime.Parse(value.date_end)); } if (!string.IsNullOrWhiteSpace(value.itemno)) { q = q.Where(w => w.itemNo.Contains(value.itemno.ToUpper().Trim())); } if (!string.IsNullOrWhiteSpace(value.wipType)) { q = q.Where(w => w.wipType == value.wipType); } if (!string.IsNullOrWhiteSpace(value.factoryno)) { q = q.Where(w => w.factoryNo == value.factoryno); } if (!string.IsNullOrWhiteSpace(value.statusNo)) { if (value.statusNo == "N") q = q.Where(w => w.statusNo != "E" && w.statusNo != "C"); else q = q.Where(w => w.statusNo == value.statusNo); } q.Take(1000); // 紀錄筆數 result.DataTotal = q.Count(); // Table 頁數 if (page > 0) { q = q.Skip((page - 1) * limit).Take(limit); } var qq = await q.ToListAsync(); // 塞入開工日 foreach (var item in qq) { var workDate = _context.WipStations.Where(w => w.WipID == item.wipID) .OrderBy(s => s.CreateDate) .FirstOrDefault(); item.workDate = workDate == null ? "" : workDate.CreateDate.ToString("yyyy/MM/dd"); } // 塞檢驗完成日期 foreach (var item in qq) { var fqcDate = _context.FqcResultMasters.Where(w => w.WipNo == item.wipNo && w.QaResult != "A") .OrderBy(s => s.EndTime) .FirstOrDefault(); item.fqcDate = fqcDate == null ? "" : fqcDate.EndTime.ToString("yyyy/MM/dd"); } result.Data = qq; if (result == null) { result.Msg = "查無資料"; result.Success = false; return result; } result.Success = true; result.Msg = "OK"; return result; } /// /// 查詢工單資料 未結工單查詢 /// /// [Route("[action]")] [HttpGet] public async Task> GetWipInfoPCS008([FromQuery] WipInfoDto value, string statusNo = null) { ResultModel result = new ResultModel(); var q = from q1 in _context.WipInfos where q1.CompleteQTY != 0 join q2 in _context.WipAtts on q1.WipNO equals q2.WipNO join q3 in _context.LineInfoes on q1.LineID equals q3.LineID join q4 in _context.FactoryUnits on q1.UnitNO equals q4.UnitNo select new { q1.WipID, q1.WipNO, q1.PlanQTY, q1.CompleteQTY, q1.UnitNO, q1.LineID, q1.FlowRuleID, q1.StatusNO, q1.CreateDate, q2.ItemNO, q3.LineDesc, q4.UnitName, q1.WerksNO }; if (statusNo == null) { q = q.Where(w => w.StatusNO != "E"); } if (value.wipno != null) { q = q.Where(w => w.WipNO.Equals(value.wipno)); } if (value.itemno != null) { q = q.Where(w => w.ItemNO.Equals(value.itemno)); } if (value.unitno != null) { q = q.Where(w => w.UnitNO.Equals(value.unitno)); } if (value.factoryno != null) { q = q.Where(w => w.WerksNO.Equals(value.factoryno)); } DateTime dateTime = DateTime.Now; if (DateTime.TryParse(value.date_str, out dateTime)) { q = q.Where(w => w.CreateDate >= DateTime.Parse(value.date_str)); } if (DateTime.TryParse(value.date_end, out dateTime)) { q = q.Where(w => w.CreateDate <= DateTime.Parse(value.date_end)); } //紀錄筆數 result.DataTotal = q.Count(); result.Data = await q.ToListAsync(); if (result == null) { result.Msg = "查無資料"; result.Success = false; return result; } result.Success = true; result.Msg = "OK"; return result; } /// /// 查詢工單資料Info By WipID /// /// WipID /// // GET: api/RoleModules/Role/5 [HttpGet("{id}")] public async Task>> GetWipInfo(int id) { IQueryable q = _context.WipInfos.Where(w => w.WipID == id); var WipInfo = await q.ToListAsync(); if (WipInfo == null) { return NotFound(); } return WipInfo; } /// /// 查詢工單資料Info By WipNO /// /// 工單號碼 /// // GET: api/RoleModules/Role/5 [HttpGet("WipInfoByWipNo/{wipno}")] public async Task>> GetWipInfoByWipNo(string wipno) { IQueryable q = _context.WipInfos.Where(w => w.WipNO.ToUpper().Trim() == wipno.ToUpper().Trim()); var WipInfo = await q.ToListAsync(); return WipInfo; } /// /// 查詢工單是否投入 /// /// 工單號碼 /// Y:投入N:未投入 [HttpGet("CheckStart/{wipno}")] public ActionResult GetWipInfoCheckStart(string wipno) { // 判斷是否有投產紀錄 var q = from q1 in _context.WipInfos join q2 in _context.BarcodeInfoes on q1.WipID equals q2.WipID where q1.WipNO == wipno select q2; if (q.Count() != 0) return "Y"; else return "N"; } /// /// 查詢工單是否開線 /// /// 工單號碼 /// Y:已開線N:未開線 [HttpGet("CheckStartLine/{wipno}")] public ActionResult GetWipInfoCheckStartLine(string wipno) { // 判斷是否已經開線 var q = from q1 in _context.WipInfos join q2 in _context.LineInfoes on q1.WipID equals q2.WipNo where q1.WipNO == wipno select q2; if (q.Count() != 0) return "Y"; else return "N"; } /// /// 新增工單資料 /// /// /// [HttpPost] public async Task> PostWipInfo([FromBody] WipInfo WipInfo) { ResultModel result = new ResultModel(); Helper helper = new Helper(_context); WipInfo.WipID = helper.GetIDKey("WIP_ID").Result; // 工單號碼去空白 WipInfo.WipNO = WipInfo.WipNO.Trim().ToUpper(); // 委外廠編號抓WERKS廠別代碼 var q = _context.FactoryInfos.Where(w => w.FactoryID.ToString() == WipInfo.Werks).ToList(); if (q.Count() != 0) { WipInfo.WerksNO = q.FirstOrDefault().FactoryNo; } _context.WipInfos.Add(WipInfo); try { await _context.SaveChangesAsync(); result.Success = true; result.Msg = WipInfo.WipID.ToString(); } catch (Exception ex) { result.Success = false; result.Msg = ex.InnerException.Message; } return result; //return CreatedAtAction("GetWipInfo", new { id = WipInfo.WipID }, WipInfo); } /// /// 新增 工單相關資料 /// /// /// [HttpPost("AddNewWipData")] public async Task> PostWipInfo([FromBody] WipDataViewModel wipDataView) { ResultModel result = new ResultModel(); Helper helper = new Helper(_context); using (var tran = _context.Database.BeginTransaction()) { try { int changes = 0; // 字串調整 wipDataView.wipInfo.WipNO = wipDataView.wipInfo.WipNO.Trim().ToUpper(); wipDataView.wipAtt.ItemNO = wipDataView.wipAtt.ItemNO.Trim().ToUpper(); var wipNo = wipDataView.wipInfo.WipNO; var itemNo = wipDataView.wipAtt.ItemNO; var userid = wipDataView.wipInfo.CreateUserID; #region 工單基本資料 wipDataView.wipInfo.WipID = helper.GetIDKey("WIP_ID").Result; var q = _context.FactoryInfos.Where(w => w.FactoryID.ToString() == wipDataView.wipInfo.Werks).ToList(); if (q.Any()) wipDataView.wipInfo.WerksNO = q.FirstOrDefault().FactoryNo; _context.WipInfos.Add(wipDataView.wipInfo); changes = await _context.SaveChangesAsync(); if (changes == 0) throw new Exception("Insert WipInfo failed."); #endregion #region 工單Log WipLog wiplog = new WipLog { WipID = wipDataView.wipInfo.WipID, StatusNO = "N", WipDesc = ".", CreateUserID = userid }; _context.WipLogs.Add(wiplog); changes = await _context.SaveChangesAsync(); if (changes == 0) throw new Exception("Insert WipLog failed."); #endregion #region 工單Att wipDataView.wipAtt.WipNO = wipNo; wipDataView.wipAtt.CreateUserID = userid; // 判斷工單號碼是否存在 if (_context.WipAtts.Where(w => w.WipNO == wipNo).Any()) { _context.Entry(wipDataView.wipAtt).State = EntityState.Modified; _context.Entry(wipDataView.wipAtt).Property("CreateDate").IsModified = false; _context.Entry(wipDataView.wipAtt).Property("CreateUserID").IsModified = false; } else { _context.WipAtts.Add(wipDataView.wipAtt); } changes = await _context.SaveChangesAsync(); if (changes == 0) throw new Exception("Insert||Update WipAtts failed."); #endregion #region 料號判斷 MaterialItem // 料號ID var materialid = 0; // 料號判斷,沒有就Insert if (!_context.MaterialItems.Where(w => w.ItemNo == itemNo).Any()) { materialid = helper.GetIDKey("ITEM_ID").Result; var materialItem = new MaterialItem { ItemID = materialid, ItemNo = itemNo, CreateUserID = userid }; _context.MaterialItems.Add(materialItem); changes = await _context.SaveChangesAsync(); if (changes == 0) throw new Exception("Insert MaterialItems failed."); } else { materialid = _context.MaterialItems.Where(w => w.ItemNo == itemNo).FirstOrDefault().ItemID; } #endregion #region 工單KeyParts if (wipDataView.WipKps.Any()) { var materialKps = await _context.MaterialKps.Where(m => m.ItemID == materialid).ToListAsync(); _context.MaterialKps.RemoveRange(materialKps); await _context.SaveChangesAsync(); // 先比對新舊ID 當舊ID有 新的沒有代表已刪除 var dbWipKps = _context.WipKps.Where(w => w.WipNo == wipNo).ToList(); // 找到要刪除的WipKps var delete_WipKp = dbWipKps .Where(dbKp => !wipDataView.WipKps.Any(viewKp => viewKp.WipKpID == dbKp.WipKpID)) .ToList(); if (delete_WipKp.Any()) { _context.WipKps.RemoveRange(delete_WipKp); await _context.SaveChangesAsync(); } foreach (var item in wipDataView.WipKps.Where(w => w.WipKpID != -1)) { var wipKp = new WipKp { WipNo = wipNo, ItemNo = itemNo, UnitNo = item.UnitNo, KpName = item.KpName, KpNo = item.KpNo, KpSeq = item.KpSeq, Length = item.Length, Title = item.Title, CreateUserID = userid, UpdateUserID = userid }; if (item.WipKpID == 0) { wipKp.WipKpID = helper.GetIDKey("WIP_KP_ID").Result; _context.WipKps.Add(wipKp); } else { _context.Entry(wipKp).State = EntityState.Modified; _context.Entry(wipKp).Property("CreateDate").IsModified = false; _context.Entry(wipKp).Property("CreateUserID").IsModified = false; } changes = await _context.SaveChangesAsync(); if (changes == 0) throw new Exception("Insert||Update WipKp failed."); // 新增到料號KP檔 var materialKp = new MaterialKp { MaterialKpID = helper.GetIDKey("MATERIALKP_ID").Result, ItemID = materialid, KpName = item.KpName, KpNo = item.KpNo, KpSeq = Convert.ToInt32(item.KpSeq), Length = item.Length, StationType = item.UnitNo, IsRepeat = "N", Title = item.Title, CreateUserID = userid, UpdateUserID = userid }; _context.MaterialKps.Add(materialKp); changes = await _context.SaveChangesAsync(); if (changes == 0) throw new Exception("Insert MaterialKp failed."); } } // 將料號KP新增到WIP_KP else { var wipKps = new List(); var materialKps = await _context.MaterialKps.Where(m => m.ItemID == materialid).ToListAsync(); foreach (var item in materialKps) { var wipKp = new WipKp { WipKpID = helper.GetIDKey("WIP_KP_ID").Result, WipNo = wipNo, ItemNo = itemNo, UnitNo = item.StationType, KpName = item.KpName, KpNo = item.KpNo, KpSeq = item.KpSeq, Length = item.Length, Title = item.Title, CreateUserID = userid, UpdateUserID = userid }; wipKps.Add(wipKp); } if (wipKps.Any()) { _context.WipKps.AddRange(wipKps); changes = await _context.SaveChangesAsync(); if (changes == 0) throw new Exception("Insert WipKp failed."); } } #endregion #region 工單治具 WipOutfit if (!await _context.WipOutfits.Where(w => w.WipNo == wipNo).AnyAsync()) { var materialOutfit = await _context.MaterialOutfits.Where(w => w.ItemID == materialid).ToListAsync(); foreach (var item in materialOutfit) { var wipOutfit = new WipOutfit { WipOutfitID = helper.GetIDKey("WIP_OUTFIT_ID").Result, WipNo = wipNo, ItemNo = itemNo, UnitNo = wipDataView.wipInfo.UnitNO, OutfitNo = item.OutfitNo, PartNo = item.StationType, CreateUserID = userid, UpdateUserID = userid }; _context.WipOutfits.Add(wipOutfit); changes = await _context.SaveChangesAsync(); if (changes == 0) throw new Exception("Insert WipOutfits failed."); } } #endregion #region 工單SOP WipSop if (!await _context.WipSops.Where(w => w.WipNo == wipNo).AnyAsync()) { var materialSop = await _context.MaterialSops.Where(w => w.ItemNo == itemNo).ToListAsync(); foreach (var item in materialSop) { var wipSop = new WipSop { WipSOPID = helper.GetIDKey("WIP_SOP_ID").Result, WipNo = wipNo, ItemNo = itemNo, UnitNo = item.UnitNo, SOPName = item.SopName, SOPPath = item.SopPath, SOPType = item.SopType, CreateUserID = userid, UpdateUserID = userid }; _context.WipSops.Add(wipSop); changes = await _context.SaveChangesAsync(); if (changes == 0) throw new Exception("Insert WipSops failed."); } } #endregion await tran.CommitAsync(); result.Success = true; } catch (Exception ex) { await tran.RollbackAsync(); result.Success = false; result.Msg = ex.InnerException?.Message ?? ex.Message; } } return result; } /// /// 更新工單資本資料-狀態 /// /// 工單ID /// 狀態 /// [HttpPut("{id}/{statusno}")] public async Task> PutWipinfoToStatusNO(int id = 0, string statusno = null) { ResultModel result = new ResultModel(); 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(); result.Success = true; result.Msg = "OK"; } catch (Exception ex) { result.Success = false; result.Msg = ex.Message; } return result; } /// /// 更新工單資本資料 /// /// [HttpPut] public async Task> PutWipinfo([FromBody] WipInfo wipInfo) { ResultModel result = new ResultModel(); // 工單號碼去空白 wipInfo.WipNO = wipInfo.WipNO.Trim().ToUpper(); // 委外廠編號抓WERKS廠別代碼 var q = _context.FactoryInfos.Where(w => w.FactoryID.ToString() == wipInfo.Werks).ToList(); if (q.Count() != 0) { wipInfo.WerksNO = q.FirstOrDefault().FactoryNo; } _context.Entry(wipInfo).State = EntityState.Modified; _context.Entry(wipInfo).Property("CompleteQTY").IsModified = false; _context.Entry(wipInfo).Property("StatusNO").IsModified = false; _context.Entry(wipInfo).Property("CreateDate").IsModified = false; _context.Entry(wipInfo).Property("CreateUserID").IsModified = false; try { await _context.SaveChangesAsync(); result.Success = true; result.Msg = "OK"; } catch (Exception ex) { result.Success = false; result.Msg = ex.InnerException.Message; } return result; } //------ 此部分為安勤Alex撰寫 ------ /// /// 更新工單特定欄位 /// /// 更新工單特定欄位 /// 操作結果 [HttpPut("UpdateWipinfoSpecificFields")] public async Task> UpdateWipinfoSpecificFields([FromBody] WipInfo wipInfo) { var result = new ResultModel(); // 去除空白並轉為大寫 wipInfo.WipNO = wipInfo.WipNO.Trim().ToUpper(); // 委外廠編號抓WERKS廠別代碼 var factoryInfo = await _context.FactoryInfos .Where(f => f.FactoryID.ToString() == wipInfo.Werks) .Select(f => f.FactoryNo) .FirstOrDefaultAsync(); if (factoryInfo != null) { wipInfo.WerksNO = factoryInfo; } var existingWipInfo = await _context.WipInfos.FindAsync(wipInfo.WipID); if (existingWipInfo == null) { result.Success = false; result.Msg = "WipInfo not found."; return result; } _context.Entry(existingWipInfo).CurrentValues.SetValues(wipInfo); var propertiesToExclude = new[] { "WipID", "WipNO", "CompleteQTY", "LineID", "UnitNO", "ProductTypeID", "Sales", "OrderNO", "FlowRuleID", "StatusNO", "WipTimes", "CNO", "BoxCNT", "SFISFlowCk", "InputFlag", "ModelCheck", "WipSEQ", "ECNCheck", "CreateUserID", "CreateDate", "UpdateDate", "PrintFlag", "Remarks", "Description", "Priority", "Werks", "WipType", "CustomerType", "RelatedWONO", "WerksNO", "CustomerNO", "CustomerItemNO", "FlowRemark" }; foreach (var property in propertiesToExclude) { _context.Entry(existingWipInfo).Property(property).IsModified = false; } var propertiesToUpdate = new[] { "PlanQTY", "WipScheduleDate", "WipDueDate", "CustomerMedical", "CustomerVIP" }; foreach (var property in propertiesToUpdate) { _context.Entry(existingWipInfo).Property(property).IsModified = true; } try { await _context.SaveChangesAsync(); result.Success = true; result.Msg = "Update successful"; } catch (Exception ex) { result.Success = false; result.Msg = $"An error occurred: {ex.Message}"; } return result; } //--------------------------------------- /// /// 更新工單第一站完成數量 /// /// [HttpPut("UpdateCompleteQty/ById/{id}")] public async Task> PutWipinfoByCompleteQTY(int id) { ResultModel result = new ResultModel(); result.Success = true; var wipInfo = await _context.WipInfos.FindAsync(id); if (wipInfo != null) { wipInfo.CompleteQTY += 1; 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> DeleteWipinfo(int id) { ResultModel result = new ResultModel(); var wipinfos = await _context.WipInfos.Where(w => w.WipID == id).FirstOrDefaultAsync(); var WiwipinfoByWipNo = await _context.WipInfos.Where(w => w.WipNO == wipinfos.WipNO).ToListAsync(); _context.WipInfos.RemoveRange(wipinfos); var wipBarcode = await _context.WipBarcodes.Where(w => w.WipNO == wipinfos.WipNO && w.UnitNO == wipinfos.UnitNO).ToListAsync(); _context.WipBarcodes.RemoveRange(wipBarcode); if (WiwipinfoByWipNo.Count() == 1) { var WipNo = WiwipinfoByWipNo.FirstOrDefault().WipNO; var wipAtt = await _context.WipAtts.Where(w => w.WipNO == WipNo).ToListAsync(); _context.WipAtts.RemoveRange(wipAtt); var wipKp = await _context.WipKps.Where(w => w.WipNo == WipNo).ToListAsync(); _context.WipKps.RemoveRange(wipKp); var wipSop = await _context.WipSops.Where(w => w.WipNo == WipNo).ToListAsync(); _context.WipSops.RemoveRange(wipSop); var wipOutfit = await _context.WipOutfits.Where(w => w.WipNo == WipNo).ToListAsync(); _context.WipOutfits.RemoveRange(wipOutfit); var wipLabel = await _context.WipLabels.Where(w => w.WipNO == WipNo).ToListAsync(); _context.WipLabels.RemoveRange(wipLabel); var wipBarcodeOther = await _context.WipBarcodeOthers.Where(w => w.WipNO == WipNo).ToListAsync(); _context.WipBarcodeOthers.RemoveRange(wipBarcodeOther); var wipBoard = await _context.WipBoards.Where(w => w.WipNo == WipNo).ToListAsync(); _context.WipBoards.RemoveRange(wipBoard); var wipSystem = await _context.WipSystems.Where(w => w.WipNo == WipNo).ToListAsync(); _context.WipSystems.RemoveRange(wipSystem); var wipChecks = await _context.WipChecks.Where(w => w.WipNo == WipNo).ToListAsync(); _context.WipChecks.RemoveRange(wipChecks); var wipInfoBlob = await _context.WipInfoBlobs.Where(w => w.WipNo == WipNo).ToListAsync(); _context.WipInfoBlobs.RemoveRange(wipInfoBlob); } try { await _context.SaveChangesAsync(); result.Success = true; result.Msg = "OK"; } catch (Exception ex) { result.Success = false; result.Msg = ex.InnerException.Message; } return result; } /// /// 查詢DNInfo --表頭 /// /// /// /// [Route("[action]")] [HttpGet] public async Task> GetZDNDetail4PTD001(string dnNo, string lineNo) { ResultModel result = new ResultModel(); //安勤連線 PTDContext _ptd_context = new PTDContext(); DbConnection connPTD = _ptd_context.Database.GetDbConnection(); if (connPTD.State != ConnectionState.Open) { await connPTD.OpenAsync(); } string strSQL = $@"select DNNO,DNLineNO,ProductID,ShipQty,ShipCustomerID,SoldCustomerID,ExpectShipDate , CurrentShipDate from SFIS_PTD.dbo.ZDNDetail where DNNO ='{dnNo}' "; if (!string.IsNullOrEmpty(lineNo)) { strSQL += $@"And DNLineNO ='{lineNo}'"; } DataTable dtZDNDetail = new DataTable(); using (var cmd = connPTD.CreateCommand()) { cmd.CommandText = strSQL; using (var reader = await cmd.ExecuteReaderAsync()) { if (reader.HasRows) { dtZDNDetail = DataReaderToDataTable(reader); } } } if (connPTD.State == ConnectionState.Open) { connPTD.Close(); connPTD.Dispose(); } List list = new List(); foreach (DataRow row in dtZDNDetail.Rows) { dynamic dyn = new ExpandoObject(); list.Add(dyn); foreach (DataColumn column in dtZDNDetail.Columns) { var dic = (IDictionary)dyn; dic[column.ColumnName] = row[column]; } } result.DataTotal = list.Count(); result.Data = list; if (result == null) { result.Msg = "查無資料"; result.Success = false; return result; } result.Success = true; result.Msg = "OK"; return result; } /// /// 查詢DNInfo --細項 /// /// /// /// [Route("[action]")] [HttpGet] public async Task> GetDNInfo4PTD001(string dnNo, string lineNo) { ResultModel result = new ResultModel(); //安勤連線 PTDContext _ptd_context = new PTDContext(); DbConnection connPTD = _ptd_context.Database.GetDbConnection(); if (connPTD.State != ConnectionState.Open) { await connPTD.OpenAsync(); } string strSQL = $@"select RecordNumber as DN單號,MOID as WipNo,ProductID as ItemNO,SerialNumber as ExtraBarcodeNo,'' as BarcodeNo, RecordDate as StartDate from SFIS_PTD.dbo.ZProductTrans where RecordNumber ='{dnNo}' and RCLineNO ='{lineNo}' order by SerialNumber"; DataTable dtZProductTrans = new DataTable(); using (var cmd = connPTD.CreateCommand()) { cmd.CommandText = strSQL; using (var reader = await cmd.ExecuteReaderAsync()) { if (reader.HasRows) { dtZProductTrans = DataReaderToDataTable(reader); } } } DbConnection conn = _context.Database.GetDbConnection(); if (conn.State != ConnectionState.Open) { await conn.OpenAsync(); } DataTable dtBarcode = new DataTable(); try { foreach (DataRow dr in dtZProductTrans.Rows) { string wip_sql = $@"SELECT '{dnNo}' as DN單號,WI.WIP_NO as WipNo,WA.ITEM_NO as ItemNO, BI.EXTRA_BARCODE_NO as ExtraBarcodeNo, BI.BARCODE_NO as BarcodeNo, BI.WIP_ID, BI.BARCODE_ID,TO_CHAR((select min(create_date) from jhames.wip_station where wip_id = BI.WIP_ID),'YYYY-MM-DD HH24:MI:SS') StartDate FROM jhames.BARCODE_INFO BI, jhames.WIP_INFO WI, jhames.WIP_ATT WA WHERE BI.WIP_ID = WI.WIP_ID AND WI.WIP_NO = WA.WIP_NO AND BI.EXTRA_BARCODE_NO = '{dr["ExtraBarcodeNo"]}'"; using (var cmd = conn.CreateCommand()) { cmd.CommandText = wip_sql; using (var reader = await cmd.ExecuteReaderAsync()) { if (dtBarcode.Columns.Count == 0) { for (int i = 0; i < reader.FieldCount; i++) { dtBarcode.Columns.Add(reader.GetName(i), reader.GetFieldType(i)); } } if (reader.HasRows) { dtBarcode.Merge(DataReaderToDataTable(reader)); } else { DataRow newRow = dtBarcode.NewRow(); foreach (DataColumn col in dtZProductTrans.Columns) { newRow[col.ColumnName] = dr[col.ColumnName]; } dtBarcode.Rows.Add(newRow); } } } } } catch (Exception e) { Console.WriteLine(e.Message); } //開始取KP資料 string strbarcode_id = "''"; foreach (DataRow drbarcode in dtBarcode.Rows) { if (!string.IsNullOrEmpty(drbarcode["BARCODE_ID"].ToString())) strbarcode_id += $",{drbarcode["BARCODE_ID"]}"; } DataTable dtKp = new DataTable(); string kp_sql = @"select kp_no, max(kp_qty) kp_qty from( select item_no as kp_no,count(item_no) kp_qty,barcode_id from jhames.barcode_item where barcode_id in (" + strbarcode_id + ") group by item_no,barcode_id) a group by kp_no order by kp_no"; using (var cmd = conn.CreateCommand()) { cmd.CommandText = kp_sql; using (var reader = await cmd.ExecuteReaderAsync()) { if (reader.HasRows) { dtKp = DataReaderToDataTable(reader); } } } if (dtKp.Rows.Count > 0) { for (int i = 0; i < dtKp.Rows.Count; i++) { int kp_qty = int.Parse(dtKp.Rows[i]["KP_QTY"].ToString()); string kp_no = dtKp.Rows[i]["KP_NO"].ToString(); if (kp_qty > 1) { try { dtBarcode.Columns.Add("KP_" + kp_no); } catch { } for (int j = 1; j < kp_qty; j++) { try { dtBarcode.Columns.Add("KP_" + kp_no + "#" + j.ToString()); } catch { } } } else { try { dtBarcode.Columns.Add("KP_" + kp_no); } catch { } } } dtBarcode.AcceptChanges(); for (int i = 0; i < dtBarcode.Rows.Count; i++) { string barcode_no = dtBarcode.Rows[i]["BarcodeNo"].ToString(); //读取组件 for (int j = 0; j < dtKp.Rows.Count; j++) { string kp_no = dtKp.Rows[j]["KP_NO"].ToString(); string barcode_item_sql = string.Format(@"select part_no from jhames.barcode_info a,jhames.barcode_item b where a.barcode_id = b.barcode_id and b.item_no = '{0}' and a.barcode_no = '{1}'", kp_no, barcode_no); using (var item_cmd = conn.CreateCommand()) { item_cmd.CommandText = barcode_item_sql; using (var item_reader = await item_cmd.ExecuteReaderAsync()) { if (item_reader.HasRows) { DataTable dtItem = new DataTable(); dtItem = DataReaderToDataTable(item_reader); for (int k = 0; k < dtItem.Rows.Count; k++) { string part_no = dtItem.Rows[k]["PART_NO"].ToString(); try { dtBarcode.Rows[i]["KP_" + kp_no + "#" + k.ToString()] = part_no; } catch { try { dtBarcode.Rows[i]["KP_" + kp_no] = part_no; } catch { } } dtBarcode.AcceptChanges(); try { if (kp_no.StartsWith("MB") && !kp_no.StartsWith("MB_MAC")) { bool createMacCol = true; bool findFlag = false; string mac_sql = string.Format("select partbarcode from jhames.c_sfis_keyparts where productsn = '{0}' and parttypeid='MAC'", part_no); using (var esun_cmd = conn.CreateCommand()) { esun_cmd.CommandText = mac_sql; esun_cmd.CommandTimeout = 0; using (var esun_reader = await esun_cmd.ExecuteReaderAsync()) { if (esun_reader.HasRows) { findFlag = true; List esun_list = new List(); DataTable esun_table = new DataTable(); esun_table = DataReaderToDataTable(esun_reader); if (esun_table != null) { WriteTraceLog("query mac by mb trace 005:esun_talbe rows qty:" + esun_table.Rows.Count); } if (esun_table.Rows.Count > 0) { if (createMacCol) { for (int m = 0; m < esun_table.Rows.Count; m++) { if (dtItem.Rows.Count == 1) { try { dtBarcode.Columns.Add("KP_" + kp_no + "#MAC" + (m + 1).ToString()); } catch { } } else { try { dtBarcode.Columns.Add("KP_" + kp_no + "#" + (k + 1).ToString() + "_MAC" + (m + 1).ToString()); } catch { } } } dtBarcode.AcceptChanges(); createMacCol = false; } WriteTraceLog("query mac by mb trace 006"); string mac = ""; for (int m = 0; m < esun_table.Rows.Count; m++) { //mac = esun_table.Rows[m]["part_barcode"].ToString().Trim(); mac = esun_table.Rows[m]["PARTBARCODE"].ToString().Trim(); if (dtItem.Rows.Count == 1) { dtBarcode.Rows[i]["KP_" + kp_no + "#MAC" + (m + 1).ToString()] = mac; } else { dtBarcode.Rows[i]["KP_" + kp_no + "#" + (k + 1).ToString() + "_MAC" + (m + 1).ToString()] = mac; } dtBarcode.AcceptChanges(); } WriteTraceLog("query mac by mb trace 007"); } } } } //从barcode_item读取结转数据 if (!findFlag) { string mac_sql2 = string.Format("select a.part_no from jhames.barcode_item a,jhames.barcode_info b where a.barcode_id = b.barcode_id and b.barcode_no = '{0}' and item_no like 'MAC%'", part_no); using (var esun_cmd = conn.CreateCommand()) { esun_cmd.CommandText = mac_sql2; esun_cmd.CommandTimeout = 0; using (var esun_reader = await esun_cmd.ExecuteReaderAsync()) { if (esun_reader.HasRows) { findFlag = true; List esun_list = new List(); DataTable esun_table = new DataTable(); esun_table = DataReaderToDataTable(esun_reader); if (esun_table != null) { WriteTraceLog("query mac by mb trace 005:esun_talbe rows qty:" + esun_table.Rows.Count); } if (esun_table.Rows.Count > 0) { if (createMacCol) { for (int m = 0; m < esun_table.Rows.Count; m++) { if (dtItem.Rows.Count == 1) { try { dtBarcode.Columns.Add("KP_" + kp_no + "#MAC" + (m + 1).ToString()); } catch { } } else { try { dtBarcode.Columns.Add("KP_" + kp_no + "#" + (k + 1).ToString() + "_MAC" + (m + 1).ToString()); } catch { } } } dtBarcode.AcceptChanges(); createMacCol = false; } string mac = ""; for (int m = 0; m < esun_table.Rows.Count; m++) { //mac = esun_table.Rows[m]["part_barcode"].ToString().Trim(); mac = esun_table.Rows[m]["PART_NO"].ToString().Trim(); if (dtItem.Rows.Count == 1) { dtBarcode.Rows[i]["KP_" + kp_no + "#MAC" + (m + 1).ToString()] = mac; } else { dtBarcode.Rows[i]["KP_" + kp_no + "#" + (k + 1).ToString() + "_MAC" + (m + 1).ToString()] = mac; } dtBarcode.AcceptChanges(); } } } } } } } } catch (Exception e1) { string err = e1.Message; WriteTraceLog("query mac by mb trace 999:" + e1.Message); } } dtBarcode.AcceptChanges(); } } } } } } if (connPTD.State == ConnectionState.Open) { connPTD.Close(); connPTD.Dispose(); } if (dtBarcode.Rows.Count > 0) { //整理欄位 dtBarcode.Columns.Remove("WIP_ID"); dtBarcode.Columns.Remove("BARCODE_ID"); //dtBarcode.Columns["WipNo"].ColumnName = "MOID"; //dtBarcode.Columns["ItemNO"].ColumnName = "Material(料號)"; //dtBarcode.Columns["ExtraBarcodeNo"].ColumnName = "出貨料號"; //dtBarcode.Columns["BarcodeNo"].ColumnName = "生產序號"; dtBarcode.AcceptChanges(); } List list = new List(); foreach (DataRow row in dtBarcode.Rows) { dynamic dyn = new ExpandoObject(); list.Add(dyn); foreach (DataColumn column in dtBarcode.Columns) { var dic = (IDictionary)dyn; dic[column.ColumnName] = row[column]; } } result.DataTotal = list.Count(); result.Data = list; if (result == null) { result.Msg = "查無資料"; result.Success = false; return result; } result.Success = true; result.Msg = "OK"; return result; } /// /// PTD 通知 寄信 /// /// private async Task SendMail(string recordType, dynamic data) { if (recordType == "601") { string customer = data.Customer; string strDNNo = data.TableData[0].DnNo; var pdtMail = await new PTD.PTDController().GetCustomerItemMailGroup(customer); if (pdtMail.Any(a => a.StatusNo != "S")) { byte[] fileContents = null; // 設定非商業用途的許可模式 ExcelPackage.LicenseContext = LicenseContext.NonCommercial; using (var package = new ExcelPackage()) { var worksheet = package.Workbook.Worksheets.Add("sheet1"); // 設定標題行 worksheet.Cells[1, 1].Value = "DN單號"; worksheet.Cells[1, 2].Value = "LineNo"; worksheet.Cells[1, 3].Value = "Material(料號)"; worksheet.Cells[1, 4].Value = "SN"; worksheet.Row(1).Style.Font.Bold = true; int i = 0; foreach (var SNData in data.TableData) { // 填入資料 worksheet.Cells[i + 2, 1].Value = SNData.DnNo; worksheet.Cells[i + 2, 2].Value = SNData.LineNo; worksheet.Cells[i + 2, 3].Value = SNData.Material; worksheet.Cells[i + 2, 4].Value = SNData.Sn; i++; } // 自動調整欄寬 worksheet.Cells[worksheet.Dimension.Address].AutoFitColumns(); fileContents = package.GetAsByteArray(); } var firstItem = pdtMail.FirstOrDefault(); string toMail = firstItem.MailGroup; string Subject = $"[AMES系統通知] 出貨單號:" + strDNNo; string emailBody = ""; await new MailController(_context, _config).PostMailByByteFile(Subject, emailBody, "", toMail, false, fileContents: fileContents, fileName: $"{strDNNo}.xlsx"); } } return "OK"; } #region "PTD002 PTD002 一段式入出庫作業" [Route("[action]")] [HttpPost] public async Task> PostPTD002Commit(PTD002CommitDataModel Data) { ResultModel result = new ResultModel(); List SNList = new List(); Collection colSQL = new Collection(); //安勤連線 PTDContext _ptd_context = new PTDContext(); DbConnection connPTD = _ptd_context.Database.GetDbConnection(); if (connPTD.State != ConnectionState.Open) { await connPTD.OpenAsync(); } try { // RecordDate 加入目前時間 Data.RecordDate += $" {DateTime.Now:HH:mm:ss}"; string strSQL = ""; string strRecordType = Data.RecordType; string strRmaNo = Data.RmaNo; string strRbu = Data.Rbu; string strWorkCenter = Data.WorkCenter; string strEmpId = Data.loginNo; string strRecordDate = TimeZoneInfo.ConvertTimeToUtc(DateTime.Parse(Data.RecordDate)).ToString("yyyy-MM-dd HH:mm:ss"); string strLocation = Data.Location; string eRP_CustomerID = Data.Customer; string strCreateDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); string strMaterial = ""; //確認備貨數量 string strDNNo = Data.TableData[0].DnNo; string strLineNo = Data.TableData[0].LineNo; int intAddQty = Data.TableData.Count(); CheckShipQty(strDNNo, strLineNo, intAddQty); foreach (SNDataModel SNData in Data.TableData) { // 601 631 633 狀態時要填入 去對應ZDNDetail string salesOrderNumber = ""; string sOLineNO = ""; if (strRecordType == "601" || strRecordType == "631" || strRecordType == "633") { var dnDetail = await new PTD.PTDController().GetZDNDetail(SNData.DnNo, SNData.LineNo); if (dnDetail.Any()) { salesOrderNumber = dnDetail.FirstOrDefault().OrderNo; sOLineNO = dnDetail.FirstOrDefault().OrderLineNO; eRP_CustomerID = dnDetail.FirstOrDefault().ShipCustomerID; } } //CheckFlowRules(strRecordType, SNData.Sn); strMaterial = SNData.Material; string strLatest; //確認此出貨序號是否有ZHistoryKeyDefine strSQL = $@"select Seed FROM [SFIS_PTD].[dbo].[ZHistoryKeyDefine] where serialnumber ='{SNData.Sn}'"; using (var cmd = connPTD.CreateCommand()) { cmd.CommandText = strSQL; using (var reader = await cmd.ExecuteReaderAsync()) { if (reader.Read()) { int seed = Convert.ToInt32(reader["Seed"]); int nIdx = seed + 1; strLatest = SNData.Sn + nIdx.ToString().PadLeft(4, '0');//組成HistoryID //HistoryKeyDefine strSQL = @$"UPDATE [SFIS_PTD].[dbo].[ZHistoryKeyDefine] SET [Seed] = {nIdx} where [SerialNumber]='{SNData.Sn}'"; Console.WriteLine(strSQL); colSQL.Add(strSQL); //ZSNInfo strSQL = @$"Update SFIS_PTD..ZSNInfo SET LatestHistoryID='{strLatest}',RecordTypeID='{strRecordType}', CurrentProductID='{SNData.Material}' where SerialNumber='{SNData.Sn}'"; Console.WriteLine(strSQL); colSQL.Add(strSQL); } else { strLatest = SNData.Sn + 1.ToString().PadLeft(4, '0');//組成HistoryID //ZHistoryKeyDefine strSQL = @$"INSERT INTO [SFIS_PTD].[dbo].[ZHistoryKeyDefine] ([SerialNumber],[Seed]) VALUES ('{SNData.Sn}',1)"; Console.WriteLine(strSQL); colSQL.Add(strSQL); //ZSNInfo strSQL = @$"INSERT INTO [SFIS_PTD].[dbo].[ZSNInfo] ([SerialNumber],[CurrentProductID],[OriginalProductID], [LocationID],[LatestHistoryID],[RecordTypeID], [OwnerPlantID],[OwnerCompanyID],[CreatePlantID],[CreateCompanyID], [ModifyDate]) VALUES ('{SNData.Sn}','{SNData.Material}','{SNData.Material}', '{strLocation}','{strLatest}','{strRecordType}', '{strWorkCenter}','{strRbu}','{strWorkCenter}','{strRbu}', '{strCreateDate}')"; Console.WriteLine(strSQL); colSQL.Add(strSQL); } //ZProductTrans strSQL = $@"INSERT INTO [SFIS_PTD].[dbo].[ZProductTrans] ([HistoryID],[SerialNumber],[RecordTypeID],[RecordNumber],[RCLineNO],[RecordDate], [ProductID],[IsChangeID],[LocationID],[EmplID],[IsDelete], [OwnerPlantID],[OwnerCompanyID],[CreatePlantID],[CreateCompanyID], [CreatorID],[CreateDate],[ModifierID],[ModifyDate], [chkflag],[IsBranchCoReceived],[MOID], [SalesOrderNumber],[SOLineNO],[ERP_CustomerID]) VALUES ('{strLatest}','{SNData.Sn}','{strRecordType}','{SNData.DnNo}','{SNData.LineNo}','{strRecordDate}', '{SNData.Material}',0,'{strLocation}','{strEmpId}',0, '{strWorkCenter}','{strRbu}','{strWorkCenter}','{strRbu}', 'WH00','{strCreateDate}','WH00','{strCreateDate}',0,0,'{strRmaNo}', '{salesOrderNumber}','{sOLineNO}','{eRP_CustomerID}')"; Console.WriteLine(strSQL); colSQL.Add(strSQL); SNList.Add(SNData.Sn); } } } using (var cmd = connPTD.CreateCommand()) { using (var transaction = connPTD.BeginTransaction()) { try { foreach (string query in colSQL) { cmd.CommandText = query; cmd.Transaction = transaction; cmd.ExecuteNonQuery(); } // Commit the transaction transaction.Commit(); await SendMail(strRecordType, Data); } catch (Exception ex) { // Rollback the transaction in case of an exception transaction.Rollback(); throw ex; // Rethrow the exception after rollback } } } result.Success = true; result.Msg = "OK"; result.Data = SNList; } catch (Exception ex) { result.Success = false; result.Msg = ex.Message; } finally { if (connPTD.State == ConnectionState.Open) { connPTD.Close(); connPTD.Dispose(); } } return result; } private bool CheckShipQty(string recordNumber, string lineNo, int addQty) { ResultModel result = new ResultModel(); //安勤連線 PTDContext _ptd_context = new PTDContext(); DbConnection connPTD = _ptd_context.Database.GetDbConnection(); if (connPTD.State != ConnectionState.Open) { connPTD.Open(); } try { //查剩餘數 string strSQL = $@"select ShipQty - (SELECT count(1) FROM [SFIS_PTD].[dbo].[ZWHPickListDetail] where RecordNumber =DNNO and RCLineNO =DNLineNO) as surplusQty from [SFIS_PTD].[dbo].ZDNDetail where DNNO ='{recordNumber}' and DNLineNO ='{lineNo}'"; using (var cmd = connPTD.CreateCommand()) { cmd.CommandText = strSQL; using (var reader = cmd.ExecuteReader()) { if (reader.Read()) { if (addQty > Convert.ToInt32(reader["surplusQty"])) throw new Exception("數量已超過,不允許新增!"); } } } } catch (Exception ex) { throw ex; } finally { if (connPTD.State == ConnectionState.Open) { connPTD.Close(); connPTD.Dispose(); } } return true; } private bool CheckFlowRules(string recordType, string serialNumber) { ResultModel result = new ResultModel(); //安勤連線 PTDContext _ptd_context = new PTDContext(); DbConnection connPTD = _ptd_context.Database.GetDbConnection(); if (connPTD.State != ConnectionState.Open) { connPTD.Open(); } try { //用ZProductTrans最新RecordType 檢查PTDFlowRules邏輯 bool bolChkFlow = false; string strSQL = $@"Select [FormID] FROM [SFIS_PTD].[dbo].[PTDFlowRules] where [ToID] ='{recordType}'"; DataTable dtPTDFlowRules = new DataTable(); using (var cmd = connPTD.CreateCommand()) { cmd.CommandText = strSQL; using (var reader = cmd.ExecuteReader()) { if (reader.HasRows) { dtPTDFlowRules = DataReaderToDataTable(reader); } } } strSQL = @$"Select [RecordTypeID] FROM [SFIS_PTD].[dbo].[ZProductTrans] where [SerialNumber] ='{serialNumber}' Order by [RecordDate] Desc"; using (var cmd = connPTD.CreateCommand()) { cmd.CommandText = strSQL; using (var reader = cmd.ExecuteReader()) { if (reader.Read()) { foreach (DataRow dr in dtPTDFlowRules.Rows) { if (reader["RecordTypeID"].ToString() == dr["FormID"].ToString()) { bolChkFlow = true; break; } } } else if (recordType == "101" || recordType == "292") //101、292可能沒有前身資訊 { bolChkFlow = true; } } } if (!bolChkFlow) throw new Exception("序號:" + serialNumber + " 流程狀態不允許!"); } catch (Exception ex) { throw ex; } finally { if (connPTD.State == ConnectionState.Open) { connPTD.Close(); connPTD.Dispose(); } } return true; } //[Route("[action]")] //[HttpGet] //public async Task> CheckShipQtyAsyn(string recordNumber, string lineNo, int addQty) //{ // ResultModel result = new ResultModel(); // try // { // //安勤連線 // PTDContext _ptd_context = new PTDContext(); // DbConnection connPTD = _ptd_context.Database.GetDbConnection(); // if (connPTD.State != ConnectionState.Open) // { // await connPTD.OpenAsync(); // } // //查剩餘數 // string strSQL = $@"select ShipQty - // (SELECT count(1) // FROM [SFIS_PTD].[dbo].[ZWHPickListDetail] // where RecordNumber =DNNO and RCLineNO =DNLineNO and TaskStatus ='Picked') as surplusQty // from [SFIS_PTD].[dbo].ZDNDetail where DNNO ='{recordNumber}' and DNLineNO ='{lineNo}'"; // using (var cmd = connPTD.CreateCommand()) // { // cmd.CommandText = strSQL; // using (var reader = await cmd.ExecuteReaderAsync()) // { // if (reader.Read()) // { // if (addQty > Convert.ToInt32(reader["surplusQty"])) // throw new Exception("數量已超過,不允許新增!"); // } // } // } // result.Success = true; // result.Msg = "OK"; // } // catch (Exception ex) // { // result.Success = false; // result.Msg = ex.Message; // } // return result; //} //[Route("[action]")] //[HttpGet] //public async Task> CheckFlowRulesAsyn(string recordType, string serialNumber) //{ // ResultModel result = new ResultModel(); // try // { // //安勤連線 // PTDContext _ptd_context = new PTDContext(); // DbConnection connPTD = _ptd_context.Database.GetDbConnection(); // if (connPTD.State != ConnectionState.Open) // { // await connPTD.OpenAsync(); // } // //用ZProductTrans最新RecordType 檢查PTDFlowRules邏輯 // bool bolChkFlow = false; // string strSQL = $@"Select [FormID] FROM [SFIS_PTD].[dbo].[PTDFlowRules] // where [ToID] ='{recordType}'"; // DataTable dtPTDFlowRules = new DataTable(); // using (var cmd = connPTD.CreateCommand()) // { // cmd.CommandText = strSQL; // using (var reader = await cmd.ExecuteReaderAsync()) // { // if (reader.HasRows) // { // dtPTDFlowRules = DataReaderToDataTable(reader); // } // } // } // strSQL = @$"Select [RecordTypeID] FROM [SFIS_PTD].[dbo].[ZProductTrans] // where [SerialNumber] ='{serialNumber}' // Order by [RecordDate] Desc"; // using (var cmd = connPTD.CreateCommand()) // { // cmd.CommandText = strSQL; // using (var reader = await cmd.ExecuteReaderAsync()) // { // if (reader.Read()) // { // foreach (DataRow dr in dtPTDFlowRules.Rows) // { // if (reader["RecordTypeID"].ToString() == dr["FormID"].ToString()) // { // bolChkFlow = true; // break; // } // } // } // } // } // if (!bolChkFlow) // throw new Exception("流程狀態不允許!"); // result.Success = true; // result.Msg = "OK"; // } // catch (Exception ex) // { // result.Success = false; // result.Msg = ex.Message; // } // return result; //} #endregion #region "PTD003 作業查詢" [Route("[action]")] [HttpGet] public async Task> GetRecordTypes() { //安勤連線 PTDContext _ptd_context = new PTDContext(); DbConnection connPTD = _ptd_context.Database.GetDbConnection(); if (connPTD.State != ConnectionState.Open) { await connPTD.OpenAsync(); } try { string strSQL = $@"select a.RecordTypeID,(select distinct TypeName from SFIS_PTD.dbo.RecordTypeInfo where ID = a.RecordTypeID ) as TypeName from SFIS_PTD.dbo.ZProductTrans a group by a.RecordTypeID"; DataTable dtRecordTypes = new DataTable(); using (var cmd = connPTD.CreateCommand()) { cmd.CommandText = strSQL; using (var reader = await cmd.ExecuteReaderAsync()) { if (reader.HasRows) { dtRecordTypes = DataReaderToDataTable(reader); } } } List list = new List(); foreach (DataRow row in dtRecordTypes.Rows) { list.Add(new RecordTypeInfo { ID = Convert.ToString(row["RecordTypeID"]), TypeName = Convert.ToString(row["TypeName"]) }); } return list; } catch (Exception e) { throw e; } finally { if (connPTD.State == ConnectionState.Open) { connPTD.Close(); connPTD.Dispose(); } } } [Route("[action]")] [HttpGet] public async Task> GetData4PTD003_Old(string recordType, string recordNumber, string lineNo, string materialNo, string shippingSN, string dateStart, string dateEnd) { ResultModel result = new ResultModel(); //安勤連線 PTDContext _ptd_context = new PTDContext(); DbConnection connPTD = _ptd_context.Database.GetDbConnection(); if (connPTD.State != ConnectionState.Open) { await connPTD.OpenAsync(); } try { string strSQL = $@"SELECT a.RecordTypeID ,a.RecordNumber ,a.RCLineNO 'LineNo', a.SerialNumber 'SN',a.ProductID ,a.EmplID 'Customer',a.LocationID 'Location', a.EmplID as empID , a.CreateDate , a.ExtNotes , CONVERT(datetime, SWITCHOFFSET(CONVERT(datetimeoffset, a.RecordDate), DATENAME(TzOffset, SYSDATETIMEOFFSET()))) as RecordDate FROM SFIS_PTD.dbo.ZProductTrans a where 1=1 "; if (recordType != null && recordType != "" && recordType != "全部") { strSQL += $" And a.RecordTypeID ='{recordType}'"; } if (recordNumber != null && recordNumber != "") { strSQL += $" And a.RecordNumber ='{recordNumber}'"; } if (lineNo != null && lineNo != "") { strSQL += $" And a.RCLineNO ='{lineNo}'"; } if (materialNo != null && materialNo != "") { strSQL += $" And a.ProductID like '{materialNo}%'"; } if (shippingSN != null && shippingSN != "") { strSQL += $" And a.SerialNumber like '{shippingSN}%'"; } if (dateStart != null && dateEnd != null) { if (DateTime.Parse(dateStart) > DateTime.Parse(dateEnd)) { result.Msg = "起 不可大於 迄!"; result.Success = false; return result; } strSQL += $" And a.RecordDate Between '{dateStart.Replace("/", "-") + " 00:00:00"}' And '{dateEnd.Replace("/", "-") + " 23:59:59"}'"; } //排序:ZProductTrans.CreateDate DESC strSQL += " Order by a.RecordDate DESC"; DataTable dtZProductTrans = new DataTable(); using (var cmd = connPTD.CreateCommand()) { cmd.CommandText = strSQL; using (var reader = await cmd.ExecuteReaderAsync()) { if (reader.HasRows) { dtZProductTrans = DataReaderToDataTable(reader); } } } List list = new List(); foreach (DataRow row in dtZProductTrans.Rows) { dynamic dyn = new ExpandoObject(); list.Add(dyn); foreach (DataColumn column in dtZProductTrans.Columns) { var dic = (IDictionary)dyn; dic[column.ColumnName] = row[column]; } } result.DataTotal = list.Count(); result.Data = list; if (result == null) { result.Msg = "查無資料"; result.Success = false; return result; } result.Success = true; result.Msg = "OK"; return result; } catch (Exception e) { throw e; } finally { if (connPTD.State == ConnectionState.Open) { connPTD.Close(); connPTD.Dispose(); } } } [Route("[action]")] [HttpGet] public async Task> GetData4PTD003(string recordType, string recordNumber, string lineNo, string materialNo, string shippingSN, string dateStart, string dateEnd, string RBU, string soNumber, string soLineNo, string customer) { ResultModel result = new ResultModel(); //安勤連線 PTDContext _ptd_context = new PTDContext(); DbConnection connPTD = _ptd_context.Database.GetDbConnection(); if (connPTD.State != ConnectionState.Open) { await connPTD.OpenAsync(); } try { string strSQL = $@"SELECT a.RecordTypeID ,a.RecordNumber ,a.RCLineNO 'LineNo', a.SerialNumber 'SN',a.ProductID ,a.LocationID 'Location', a.EmplID as empID , a.CreateDate , a.ExtNotes ,a.RecordDate , a.SalesOrderNumber AS soNumber , a.SOLineNO AS soLineNo ,a.ERP_CustomerID 'Customer' FROM SFIS_PTD.dbo.ZProductTrans a where 1=1 "; if (recordType != null && recordType != "" && recordType != "全部") { strSQL += $" And a.RecordTypeID ='{recordType}'"; } if (recordNumber != null && recordNumber != "") { strSQL += $" And a.RecordNumber ='{recordNumber}'"; } if (lineNo != null && lineNo != "") { strSQL += $" And a.RCLineNO ='{lineNo}'"; } if (materialNo != null && materialNo != "") { strSQL += $" And a.ProductID like '{materialNo}%'"; } if (shippingSN != null && shippingSN != "") { strSQL += $" And a.SerialNumber like '{shippingSN}%'"; } if (dateStart != null && dateEnd != null) { if (DateTime.Parse(dateStart) > DateTime.Parse(dateEnd)) { result.Msg = "起 不可大於 迄!"; result.Success = false; return result; } strSQL += $" And a.RecordDate Between '{dateStart.Replace("/", "-") + " 00:00:00"}' And '{dateEnd.Replace("/", "-") + " 23:59:59"}'"; } if (!string.IsNullOrWhiteSpace(soNumber)) { strSQL += $" And a.SalesOrderNumber like '{soNumber}%'"; } if (!string.IsNullOrWhiteSpace(soLineNo)) { strSQL += $" And a.SOLineNO like '{soLineNo}%'"; } if (!string.IsNullOrWhiteSpace(customer)) { strSQL += $" And a.ERP_CustomerID like '{customer}%'"; } //排序:ZProductTrans.CreateDate DESC strSQL += " ORDER BY a.HistoryID ,a.RecordNumber ,a.RCLineNO"; DataTable dtZProductTrans = new DataTable(); using (var cmd = connPTD.CreateCommand()) { cmd.CommandText = strSQL; using (var reader = await cmd.ExecuteReaderAsync()) { if (reader.HasRows) { dtZProductTrans = DataReaderToDataTable(reader); } } } List list = new List(); foreach (DataRow row in dtZProductTrans.Rows) { dynamic dyn = new ExpandoObject(); list.Add(dyn); foreach (DataColumn column in dtZProductTrans.Columns) { var dic = (IDictionary)dyn; dic[column.ColumnName] = row[column]; } } // EV01 RecordDate 要改成GMT時區(台灣+8小時) if (RBU == "EV01") list.ToList().ForEach(s => s.RecordDate = DateTime.Parse(s.RecordDate).AddHours(8).ToString("yyyy-MM-dd HH:mm:ss")); result.DataTotal = list.Count(); result.Data = list; if (result == null) { result.Msg = "查無資料"; result.Success = false; return result; } result.Success = true; result.Msg = "OK"; return result; } catch (Exception e) { throw e; } finally { if (connPTD.State == ConnectionState.Open) { connPTD.Close(); connPTD.Dispose(); } } } [HttpGet("GetCustomer/{recordNumber}")] public async Task GetCustomer(string recordNumber) { //安勤連線 PTDContext _ptd_context = new PTDContext(); DbConnection connPTD = _ptd_context.Database.GetDbConnection(); if (connPTD.State != ConnectionState.Open) { await connPTD.OpenAsync(); } try { string strSQL = $@"Select top 1 SoldCustomerID 'Customer' from SFIS_PTD.dbo.ZDNDetail where DNNo ='{recordNumber}'"; string strCustomer = ""; using (var cmd = connPTD.CreateCommand()) { cmd.CommandText = strSQL; using (var reader = await cmd.ExecuteReaderAsync()) { if (reader.Read()) { strCustomer = reader.GetString(0); } } } return strCustomer; } catch (Exception e) { throw e; } finally { if (connPTD.State == ConnectionState.Open) { connPTD.Close(); connPTD.Dispose(); } } } #endregion #region "PTD004 單頭說明維護" [Route("[action]")] [HttpGet] public async Task>> GetRecordTypeInfo() { //安勤連線 PTDContext _ptd_context = new PTDContext(); DbConnection connPTD = _ptd_context.Database.GetDbConnection(); if (connPTD.State != ConnectionState.Open) { await connPTD.OpenAsync(); } try { string strSQL = $@"select * from SFIS_PTD.dbo.RecordTypeInfo"; DataTable dtRecordTypeInfo = new DataTable(); using (var cmd = connPTD.CreateCommand()) { cmd.CommandText = strSQL; using (var reader = await cmd.ExecuteReaderAsync()) { if (reader.HasRows) { dtRecordTypeInfo = DataReaderToDataTable(reader); } } } List RecordTypeInfo = new List(); foreach (DataRow row in dtRecordTypeInfo.Rows) { RecordTypeInfo.Add(new RecordTypeInfo { RBU = Convert.ToString(row["RBU"]), ID = Convert.ToString(row["ID"]), TypeName = Convert.ToString(row["TypeName"]), TypeDesc = Convert.ToString(row["TypeDesc"]), Source = Convert.ToString(row["Source"]), PrefixCode = Convert.ToString(row["PrefixCode"]), Length = row["Length"] == DBNull.Value ? (int?)null : Convert.ToInt32(row["Length"]), Status = Convert.ToString(row["Status"]), SEQ = Convert.ToString(row["SEQ"]) }); } return RecordTypeInfo; } catch (Exception e) { throw e; } finally { if (connPTD.State == ConnectionState.Open) { connPTD.Close(); connPTD.Dispose(); } } } [HttpGet("GetRecordTypeInfo/{id}")] public async Task>> GetRecordTypeInfo(int id) { //安勤連線 PTDContext _ptd_context = new PTDContext(); DbConnection connPTD = _ptd_context.Database.GetDbConnection(); if (connPTD.State != ConnectionState.Open) { await connPTD.OpenAsync(); } try { string strSQL = $@"select * from SFIS_PTD.dbo.RecordTypeInfo Where RecordTypeID ='{id}'"; DataTable dtRecordTypeInfo = new DataTable(); using (var cmd = connPTD.CreateCommand()) { cmd.CommandText = strSQL; using (var reader = await cmd.ExecuteReaderAsync()) { if (reader.HasRows) { dtRecordTypeInfo = DataReaderToDataTable(reader); } } } List RecordTypeInfo = new List(); foreach (DataRow row in dtRecordTypeInfo.Rows) { RecordTypeInfo.Add(new RecordTypeInfo { RBU = Convert.ToString(row["RBU"]), ID = Convert.ToString(row["ID"]), TypeName = Convert.ToString(row["TypeName"]), TypeDesc = Convert.ToString(row["TypeDesc"]), Source = Convert.ToString(row["Source"]), PrefixCode = Convert.ToString(row["PrefixCode"]), Length = row["Length"] == DBNull.Value ? (int?)null : Convert.ToInt32(row["Length"]), Status = Convert.ToString(row["Status"]), SEQ = Convert.ToString(row["SEQ"]) }); } return RecordTypeInfo; } catch (Exception e) { throw e; } finally { if (connPTD.State == ConnectionState.Open) { connPTD.Close(); connPTD.Dispose(); } } } [Route("[action]")] [HttpPost] public async Task> PostRecordTypeInfo(RecordTypeInfo RecordTypeInfo) { ResultModel result = new ResultModel(); //安勤連線 PTDContext _ptd_context = new PTDContext(); DbConnection connPTD = _ptd_context.Database.GetDbConnection(); if (connPTD.State != ConnectionState.Open) { await connPTD.OpenAsync(); } try { string strSQL = $@"INSERT INTO SFIS_PTD.dbo.RecordTypeInfo (ID, RBU, TypeName, TypeDesc, Source, PrefixCode, Length,Status) VALUES ('{RecordTypeInfo.ID}','{RecordTypeInfo.RBU}', '{RecordTypeInfo.TypeName}', '{RecordTypeInfo.TypeDesc}', '{RecordTypeInfo.Source}', '{RecordTypeInfo.PrefixCode}', {RecordTypeInfo.Length} ,'{RecordTypeInfo.Status}' )"; using (var cmd = connPTD.CreateCommand()) { cmd.CommandText = strSQL; cmd.ExecuteNonQuery(); } result.Success = true; result.Msg = "OK"; } catch (Exception ex) { result.Success = false; result.Msg = ex.InnerException.Message; } finally { if (connPTD.State == ConnectionState.Open) { connPTD.Close(); connPTD.Dispose(); } } return result; } [HttpPut("PutRecordTypeInfo/{id}")] public async Task> PutRecordTypeInfo(string id, [FromBody] RecordTypeInfo RecordTypeInfo) { ResultModel result = new ResultModel(); if (id != RecordTypeInfo.ID) { result.Success = false; result.Msg = "ID錯誤"; return result; } //安勤連線 PTDContext _ptd_context = new PTDContext(); DbConnection connPTD = _ptd_context.Database.GetDbConnection(); if (connPTD.State != ConnectionState.Open) { await connPTD.OpenAsync(); } try { string strSQL = $@"UPDATE SFIS_PTD.dbo.RecordTypeInfo SET RBU = '{RecordTypeInfo.RBU}', ID = '{RecordTypeInfo.ID}', TypeName = '{RecordTypeInfo.TypeName}', TypeDesc = '{RecordTypeInfo.TypeDesc}', Source = '{RecordTypeInfo.Source}', PrefixCode = '{RecordTypeInfo.PrefixCode}', Length = {RecordTypeInfo.Length}, Status = '{RecordTypeInfo.Status}' WHERE SEQ = '{RecordTypeInfo.SEQ}'"; using (var cmd = connPTD.CreateCommand()) { cmd.CommandText = strSQL; cmd.ExecuteNonQuery(); } result.Success = true; result.Msg = "OK"; } catch (Exception ex) { result.Success = false; result.Msg = ex.InnerException.Message; } finally { if (connPTD.State == ConnectionState.Open) { connPTD.Close(); connPTD.Dispose(); } } return result; } [HttpDelete("DeleteRecordTypeInfo/{id}")] public async Task> DeleteRecordTypeInfo(int id) { ResultModel result = new ResultModel(); //安勤連線 PTDContext _ptd_context = new PTDContext(); DbConnection connPTD = _ptd_context.Database.GetDbConnection(); if (connPTD.State != ConnectionState.Open) { await connPTD.OpenAsync(); } try { string strSQL = $@"DELETE FROM SFIS_PTD.dbo.RecordTypeInfo WHERE SEQ = '{id}'"; using (var cmd = connPTD.CreateCommand()) { cmd.CommandText = strSQL; cmd.ExecuteNonQuery(); } result.Success = true; result.Msg = "OK"; } catch (Exception ex) { result.Success = false; result.Msg = ex.InnerException.Message; } finally { if (connPTD.State == ConnectionState.Open) { connPTD.Close(); connPTD.Dispose(); } } return result; } #endregion #region "PTD005 設定 ERP 客戶代號和客戶收件人名單" [Route("[action]")] [HttpGet] public async Task>> GetCustomerItemMailGroup() { //安勤連線 PTDContext _ptd_context = new PTDContext(); DbConnection connPTD = _ptd_context.Database.GetDbConnection(); if (connPTD.State != ConnectionState.Open) { await connPTD.OpenAsync(); } try { string strSQL = $@"select * from SFIS_PTD.dbo.CustomerItemMailGroup"; DataTable dtCustomerItemMailGroup = new DataTable(); using (var cmd = connPTD.CreateCommand()) { cmd.CommandText = strSQL; using (var reader = await cmd.ExecuteReaderAsync()) { if (reader.HasRows) { dtCustomerItemMailGroup = DataReaderToDataTable(reader); } } } List CustomerItemMailGroup = new List(); foreach (DataRow row in dtCustomerItemMailGroup.Rows) { CustomerItemMailGroup.Add(new CustomerItemMailGroupModel { ItemNumber = Convert.ToString(row["ItemNumber"]), CustomerCode = Convert.ToString(row["CustomerCode"]), MailGroup = Convert.ToString(row["MailGroup"]), StatusNo = Convert.ToString(row["StatusNo"]) }); } return CustomerItemMailGroup; } catch (Exception e) { throw e; } finally { if (connPTD.State == ConnectionState.Open) { connPTD.Close(); connPTD.Dispose(); } } } [HttpGet("GetCustomerItemMailGroup/{id}")] public async Task>> GetCustomerItemMailGroup(string id) { //安勤連線 PTDContext _ptd_context = new PTDContext(); DbConnection connPTD = _ptd_context.Database.GetDbConnection(); if (connPTD.State != ConnectionState.Open) { await connPTD.OpenAsync(); } try { string strSQL = $@"select * from SFIS_PTD.dbo.CustomerItemMailGroup Where 1=1"; if (id != null && id != "") { strSQL += $@" And CustomerCode ='{id}'"; } DataTable dtCustomerItemMailGroup = new DataTable(); using (var cmd = connPTD.CreateCommand()) { cmd.CommandText = strSQL; using (var reader = await cmd.ExecuteReaderAsync()) { if (reader.HasRows) { dtCustomerItemMailGroup = DataReaderToDataTable(reader); } } } List CustomerItemMailGroup = new List(); foreach (DataRow row in dtCustomerItemMailGroup.Rows) { CustomerItemMailGroup.Add(new CustomerItemMailGroupModel { ItemNumber = Convert.ToString(row["ItemNumber"]), CustomerCode = Convert.ToString(row["CustomerCode"]), MailGroup = Convert.ToString(row["MailGroup"]), StatusNo = Convert.ToString(row["StatusNo"]) }); } return CustomerItemMailGroup; } catch (Exception e) { throw e; } finally { if (connPTD.State == ConnectionState.Open) { connPTD.Close(); connPTD.Dispose(); } } } [Route("[action]")] [HttpPost] public async Task> PostCustomerItemMailGroup(CustomerItemMailGroupModel CustomerItemMailGroup) { ResultModel result = new ResultModel(); //安勤連線 PTDContext _ptd_context = new PTDContext(); DbConnection connPTD = _ptd_context.Database.GetDbConnection(); if (connPTD.State != ConnectionState.Open) { await connPTD.OpenAsync(); } try { string strSQL = $@"INSERT INTO SFIS_PTD.dbo.[CustomerItemMailGroup] ([ItemNumber],[CustomerCode],[MailGroup],[StatusNo]) VALUES ('{CustomerItemMailGroup.ItemNumber}','{CustomerItemMailGroup.CustomerCode}', '{CustomerItemMailGroup.MailGroup}', '{CustomerItemMailGroup.StatusNo}')"; using (var cmd = connPTD.CreateCommand()) { cmd.CommandText = strSQL; cmd.ExecuteNonQuery(); } result.Success = true; result.Msg = "OK"; } catch (Exception ex) { result.Success = false; result.Msg = ex.InnerException.Message; } finally { if (connPTD.State == ConnectionState.Open) { connPTD.Close(); connPTD.Dispose(); } } return result; } [HttpPut("PutCustomerItemMailGroup/{id}")] public async Task> PutCustomerItemMailGroup(string id, [FromBody] CustomerItemMailGroupModel CustomerItemMailGroup) { ResultModel result = new ResultModel(); if (id != CustomerItemMailGroup.CustomerCode) { result.Success = false; result.Msg = "ID錯誤"; return result; } //安勤連線 PTDContext _ptd_context = new PTDContext(); DbConnection connPTD = _ptd_context.Database.GetDbConnection(); if (connPTD.State != ConnectionState.Open) { await connPTD.OpenAsync(); } try { string strSQL = $@"UPDATE SFIS_PTD.dbo.CustomerItemMailGroup SET ItemNumber = '{CustomerItemMailGroup.ItemNumber}', MailGroup = '{CustomerItemMailGroup.MailGroup}' WHERE CustomerCode = '{id}'"; using (var cmd = connPTD.CreateCommand()) { cmd.CommandText = strSQL; cmd.ExecuteNonQuery(); } result.Success = true; result.Msg = "OK"; } catch (Exception ex) { result.Success = false; result.Msg = ex.InnerException.Message; } finally { if (connPTD.State == ConnectionState.Open) { connPTD.Close(); connPTD.Dispose(); } } return result; } [HttpDelete("DeleteCustomerItemMailGroup/{id}")] public async Task> DeleteCustomerItemMailGroup(string id) { ResultModel result = new ResultModel(); //安勤連線 PTDContext _ptd_context = new PTDContext(); DbConnection connPTD = _ptd_context.Database.GetDbConnection(); if (connPTD.State != ConnectionState.Open) { await connPTD.OpenAsync(); } try { string strSQL = $@"UPDATE SFIS_PTD.dbo.CustomerItemMailGroup SET StatusNo = CASE WHEN StatusNo = 'A' THEN 'S' WHEN StatusNo = 'S' THEN 'A' ELSE 'A' END WHERE CustomerCode = '{id}'"; using (var cmd = connPTD.CreateCommand()) { cmd.CommandText = strSQL; cmd.ExecuteNonQuery(); } result.Success = true; result.Msg = "OK"; } catch (Exception ex) { result.Success = false; result.Msg = ex.InnerException.Message; } finally { if (connPTD.State == ConnectionState.Open) { connPTD.Close(); connPTD.Dispose(); } } return result; } #endregion #region "PTD006 備貨作業" [Route("[action]")] [HttpGet] public async Task> GetZWHPickListDetail(string recordNumber, string? LineNO) { ResultModel result = new ResultModel(); //安勤連線 PTDContext _ptd_context = new PTDContext(); DbConnection connPTD = _ptd_context.Database.GetDbConnection(); if (connPTD.State != ConnectionState.Open) { await connPTD.OpenAsync(); } try { string strSQL = $@"select [RecordTypeID] as 'recordType', [RecordNumber] as 'dnNo', [RCLineNO] as 'lineNo', [ProductID] as 'material', [InputSN] as 'sn' from dbo.[ZWHPickListDetail] where TaskStatus ='Picked' And RecordNumber ='{recordNumber}'"; if (!string.IsNullOrEmpty(LineNO)) { strSQL += $@" And RCLineNO ='{LineNO}'"; } DataTable dtZDNDetail = new DataTable(); using (var cmd = connPTD.CreateCommand()) { cmd.CommandText = strSQL; using (var reader = await cmd.ExecuteReaderAsync()) { if (reader.HasRows) { dtZDNDetail = DataReaderToDataTable(reader); } } } List list = new List(); foreach (DataRow row in dtZDNDetail.Rows) { dynamic dyn = new ExpandoObject(); list.Add(dyn); foreach (DataColumn column in dtZDNDetail.Columns) { var dic = (IDictionary)dyn; dic[column.ColumnName] = row[column]; } } result.DataTotal = list.Count(); result.Data = list; } catch (Exception ex) { result.Success = false; result.Msg = ex.InnerException.Message; } finally { if (connPTD.State == ConnectionState.Open) { connPTD.Close(); connPTD.Dispose(); } } if (result == null) { result.Msg = "查無資料"; result.Success = false; return result; } result.Success = true; result.Msg = "OK"; return result; } [Route("[action]")] [HttpPost] public async Task> PostPTD006Commit(PTD006CommitDataModel Data) { ResultModel result = new ResultModel(); //安勤連線 PTDContext _ptd_context = new PTDContext(); DbConnection connPTD = _ptd_context.Database.GetDbConnection(); if (connPTD.State != ConnectionState.Open) { await connPTD.OpenAsync(); } try { string strSQL = ""; string strCreateDate = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss"); CheckShipQty(Data.RecordNumber, Data.RCLineNO, 1); //ZWHPickListDetail strSQL = @$"INSERT INTO [dbo].[ZWHPickListDetail]([RecordTypeID],[RecordNumber],[RCLineNO],[InputSN],[SNFunction] ,[ShipmentSN],[ProductID],[TaskStatus],[EmplID],[ExtNotes],[OwnerPlantID],[OwnerCompanyID] ,[CreateDeptID],[CreatorID],[CreateDate],[ModifyDeptID],[ModifierID],[ModifyDate],[chkflag]) VALUES ('{Data.RecordTypeID}','{Data.RecordNumber}','{Data.RCLineNO}','{Data.InputSN}','ShipmentSN', '{Data.InputSN}','{Data.ProductID}','Picked','{Data.EmplID}',N'{Data.ExtNotes}','{Data.OwnerPlantID}','{Data.OwnerCompanyID}', '{Data.CreateDeptID}','{Data.CreatorID}','{strCreateDate}','{Data.ModifyDeptID}','{Data.ModifierID}','{strCreateDate}','0')"; using (var cmd = connPTD.CreateCommand()) { cmd.CommandText = strSQL; cmd.ExecuteNonQuery(); } result.Success = true; result.Msg = "OK"; } catch (Exception ex) { result.Success = false; result.Msg = ex.Message; } finally { if (connPTD.State == ConnectionState.Open) { connPTD.Close(); connPTD.Dispose(); } } return result; } [Route("[action]")] [HttpPost] public async Task> PostPTD006CommitOld(PTD006CommitDataModel Data) { ResultModel result = new ResultModel(); List SNList = new List(); Collection colSQL = new Collection(); //安勤連線 PTDContext _ptd_context = new PTDContext(); DbConnection connPTD = _ptd_context.Database.GetDbConnection(); if (connPTD.State != ConnectionState.Open) { await connPTD.OpenAsync(); } try { string strSQL = ""; string strCreateDate = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss"); CheckShipQty(Data.RecordNumber, Data.RCLineNO, 1); //用ZProductTrans最新RecordType 檢查PTDFlowRules邏輯 bool bolChkFlow = false; strSQL = $@"Select [FormID] FROM [SFIS_PTD].[dbo].[PTDFlowRules] where [ToID] ='{Data.RecordTypeID}'"; DataTable dtPTDFlowRules = new DataTable(); using (var cmd = connPTD.CreateCommand()) { cmd.CommandText = strSQL; using (var reader = await cmd.ExecuteReaderAsync()) { if (reader.HasRows) { dtPTDFlowRules = DataReaderToDataTable(reader); } } } strSQL = @$"Select [RecordTypeID] FROM [SFIS_PTD].[dbo].[ZProductTrans] where [SerialNumber] ='{Data.ShipmentSN}' Order by [RecordDate] Desc"; using (var cmd = connPTD.CreateCommand()) { cmd.CommandText = strSQL; using (var reader = await cmd.ExecuteReaderAsync()) { if (reader.Read()) { foreach (DataRow dr in dtPTDFlowRules.Rows) { if (reader["RecordTypeID"].ToString() == dr["FormID"].ToString()) { bolChkFlow = true; break; } } } else if (Data.RecordTypeID == "101" || Data.RecordTypeID == "292") //101、292可能沒有前身資訊 { bolChkFlow = true; } } } if (!bolChkFlow) throw new Exception("流程狀態不允許!"); //ZWHPickListDetail strSQL = @$"INSERT INTO [dbo].[ZWHPickListDetail]([RecordTypeID],[RecordNumber],[RCLineNO],[InputSN],[SNFunction] ,[ShipmentSN],[ProductID],[TaskStatus],[EmplID],[ExtNotes],[OwnerPlantID],[OwnerCompanyID] ,[CreateDeptID],[CreatorID],[CreateDate],[ModifyDeptID],[ModifierID],[ModifyDate],[chkflag]) VALUES ('{Data.RecordTypeID}','{Data.RecordNumber}','{Data.RCLineNO}','{Data.InputSN}','ShipmentSN', '{Data.InputSN}','{Data.ProductID}','Picked','{Data.EmplID}',N'{Data.ExtNotes}','{Data.OwnerPlantID}','{Data.OwnerCompanyID}', '{Data.CreateDeptID}','{Data.CreatorID}','{strCreateDate}','{Data.ModifyDeptID}','{Data.ModifierID}','{strCreateDate}','0')"; using (var cmd = connPTD.CreateCommand()) { cmd.CommandText = strSQL; cmd.ExecuteNonQuery(); } result.Success = true; result.Msg = "OK"; } catch (Exception ex) { result.Success = false; result.Msg = ex.Message; } finally { if (connPTD.State == ConnectionState.Open) { connPTD.Close(); connPTD.Dispose(); } } return result; } [HttpDelete("DeleteZWHPickListDetail/{sn}")] public async Task> DeleteZWHPickListDetail(string sn) { ResultModel result = new ResultModel(); //安勤連線 PTDContext _ptd_context = new PTDContext(); DbConnection connPTD = _ptd_context.Database.GetDbConnection(); if (connPTD.State != ConnectionState.Open) { await connPTD.OpenAsync(); } try { string strSQL = $@"DELETE FROM SFIS_PTD.dbo.[ZWHPickListDetail] WHERE [TaskStatus] = 'Picked' And [ShipmentSN] ='{sn}'"; using (var cmd = connPTD.CreateCommand()) { cmd.CommandText = strSQL; cmd.ExecuteNonQuery(); } result.Success = true; result.Msg = "OK"; } catch (Exception ex) { result.Success = false; result.Msg = ex.InnerException.Message; } finally { if (connPTD.State == ConnectionState.Open) { connPTD.Close(); connPTD.Dispose(); } } return result; } [HttpDelete("DeleteZWHPickListDetailAll/{recordNo}/{lineNo}")] public async Task> DeleteZWHPickListDetailAll(string recordNo, string lineNo) { ResultModel result = new ResultModel(); //安勤連線 PTDContext _ptd_context = new PTDContext(); DbConnection connPTD = _ptd_context.Database.GetDbConnection(); if (connPTD.State != ConnectionState.Open) { await connPTD.OpenAsync(); } try { string strSQL = $@"DELETE FROM SFIS_PTD.dbo.[ZWHPickListDetail] WHERE [TaskStatus] = 'Picked' And [RecordNumber] ='{recordNo}' AND [RCLineNO] = '{lineNo}'"; using (var cmd = connPTD.CreateCommand()) { cmd.CommandText = strSQL; cmd.ExecuteNonQuery(); } result.Success = true; result.Msg = "OK"; } catch (Exception ex) { result.Success = false; result.Msg = ex.InnerException.Message; } finally { if (connPTD.State == ConnectionState.Open) { connPTD.Close(); connPTD.Dispose(); } } return result; } #endregion #region "PTD007 扣帳作業" [Route("[action]")] [HttpGet] public async Task> GetZDNDetailJoinZWHPickListDetail(string recordType, string recordNumber) { ResultModel result = new ResultModel(); //安勤連線 PTDContext _ptd_context = new PTDContext(); DbConnection connPTD = _ptd_context.Database.GetDbConnection(); if (connPTD.State != ConnectionState.Open) { await connPTD.OpenAsync(); } try { string strSQL = $@"SELECT b.RecordNumber as DNNO ,b.RCLineNO as DNLineNO ,b.ProductID ,b.EmplID as SoldCustomerID ,a.ExpectShipDate ,a.ShipQty ,b.Qty FROM [dbo].ZDNDetail a right join (select sum(1) as Qty,RecordNumber,RCLineNO,RecordTypeID,ProductID,EmplID from dbo.[ZWHPickListDetail] where TaskStatus ='Picked' group by RecordTypeID,RecordNumber,RCLineNO,ProductID,EmplID)b on (b.RecordNumber = a.DNNO and b.RCLineNO = a.DNLineNO) where b.RecordNumber = '{recordNumber}' and b.RecordTypeID = '{recordType}'"; DataTable dtZDNDetail = new DataTable(); using (var cmd = connPTD.CreateCommand()) { cmd.CommandText = strSQL; using (var reader = await cmd.ExecuteReaderAsync()) { if (reader.HasRows) { dtZDNDetail = DataReaderToDataTable(reader); } } } List list = new List(); foreach (DataRow row in dtZDNDetail.Rows) { dynamic dyn = new ExpandoObject(); list.Add(dyn); foreach (DataColumn column in dtZDNDetail.Columns) { var dic = (IDictionary)dyn; dic[column.ColumnName] = row[column]; } } result.DataTotal = list.Count(); result.Data = list; } catch (Exception ex) { result.Success = false; result.Msg = ex.InnerException.Message; } finally { if (connPTD.State == ConnectionState.Open) { connPTD.Close(); connPTD.Dispose(); } } if (result == null) { result.Msg = "查無資料"; result.Success = false; return result; } result.Success = true; result.Msg = "OK"; return result; } [Route("[action]")] [HttpPost] public async Task> PostPTD007Commit(PTD007CommitDataModel Data) { ResultModel result = new ResultModel(); List SNList = new List(); Collection colSQL = new Collection(); List mailData = new List(); try { // RecordDate 加入目前時間 Data.RecordDate += $" {DateTime.Now:HH:mm:ss}"; string strSQL = ""; string strRecordType = Data.RecordType; string strRbu = Data.Rbu; string strWorkCenter = Data.WorkCenter; string strEmpId = Data.loginNo; string strRecordDate = TimeZoneInfo.ConvertTimeToUtc(DateTime.Parse(Data.RecordDate)).ToString("yyyy-MM-dd HH:mm:ss"); string strCreateDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); using (IDbConnection ptdConnection = new SqlConnection(_PTDContext)) { if (ptdConnection.State != ConnectionState.Open) { ptdConnection.Open(); } foreach (PTD007TableDataModel SNData in Data.TableData) { // 601 631 633 狀態時要填入 去對應ZDNDetail string salesOrderNumber = ""; string sOLineNO = ""; string eRP_CustomerID = SNData.soldCustomerID; if (strRecordType == "601" || strRecordType == "631" || strRecordType == "633") { var dnDetail = await new PTD.PTDController().GetZDNDetail(SNData.dnno, SNData.dnLineNO); if (dnDetail.Any()) { salesOrderNumber = dnDetail.FirstOrDefault().OrderNo; sOLineNO = dnDetail.FirstOrDefault().OrderLineNO; eRP_CustomerID = dnDetail.FirstOrDefault().ShipCustomerID; } } var mailDataItem = new List(); //ZWHPickListDetail查SN資訊 strSQL = $@"Select * FROM [SFIS_PTD].[dbo].[ZWHPickListDetail] where RecordNumber='{SNData.dnno}' and RCLineNO='{SNData.dnLineNO}'"; var q = await ptdConnection.QueryAsync(strSQL); foreach (var row in q) { string strLatest; //確認此出貨序號是否有ZHistoryKeyDefine strSQL = $@"select Seed FROM [SFIS_PTD].[dbo].[ZHistoryKeyDefine] where serialnumber ='{row.ShipmentSN}'"; var q1 = await ptdConnection.QueryAsync(strSQL); if (q1.Any()) { int seed = Convert.ToInt32(q1.FirstOrDefault().Seed); int nIdx = seed + 1; strLatest = row.ShipmentSN + nIdx.ToString().PadLeft(4, '0');//組成HistoryID //HistoryKeyDefine strSQL = @$"UPDATE [SFIS_PTD].[dbo].[ZHistoryKeyDefine] SET [Seed] = {nIdx} where [SerialNumber]='{row.ShipmentSN}'"; colSQL.Add(strSQL); //ZSNInfo strSQL = @$"Update [SFIS_PTD].[dbo].[ZSNInfo] SET LatestHistoryID='{strLatest}',RecordTypeID='{strRecordType}', CurrentProductID='{row.ProductID}' where SerialNumber='{row.ShipmentSN}'"; colSQL.Add(strSQL); } else { strLatest = row.ShipmentSN + 1.ToString().PadLeft(4, '0');//組成HistoryID //ZHistoryKeyDefine strSQL = @$"INSERT INTO [SFIS_PTD].[dbo].[ZHistoryKeyDefine] ([SerialNumber],[Seed]) VALUES ('{row.ShipmentSN}',1)"; colSQL.Add(strSQL); //ZSNInfo strSQL = @$"INSERT INTO [SFIS_PTD].[dbo].[ZSNInfo] ([SerialNumber],[CurrentProductID],[OriginalProductID], [LocationID],[LatestHistoryID],[RecordTypeID], [OwnerPlantID],[OwnerCompanyID],[CreatePlantID],[CreateCompanyID], [ModifyDate]) VALUES ('{row.ShipmentSN}','{row.ProductID}','{row.ProductID}', '9000','{strLatest}','{strRecordType}', '{strWorkCenter}','{strRbu}','{strWorkCenter}','{strRbu}', '{strCreateDate}')"; colSQL.Add(strSQL); } //ZProductTrans strSQL = $@"INSERT INTO [SFIS_PTD].[dbo].[ZProductTrans] ([HistoryID],[SerialNumber],[RecordTypeID],[RecordNumber],[RCLineNO],[RecordDate], [ProductID],[IsChangeID],[LocationID],[EmplID],[IsDelete], [OwnerPlantID],[OwnerCompanyID],[CreatePlantID],[CreateCompanyID], [CreatorID],[CreateDate],[ModifierID],[ModifyDate], [chkflag],[IsBranchCoReceived],[MOID], [SalesOrderNumber],[SOLineNO],[ERP_CustomerID]) VALUES ('{strLatest}','{row.ShipmentSN}','{strRecordType}','{SNData.dnno}','{SNData.dnLineNO}','{strRecordDate}', '{SNData.productID}',0,'9000','{strEmpId}',0, '{strWorkCenter}','{strRbu}','{strWorkCenter}','{strRbu}', 'WH00','{strCreateDate}','WH00','{strCreateDate}',0,0,'', '{salesOrderNumber}','{sOLineNO}','{eRP_CustomerID}')"; colSQL.Add(strSQL); mailDataItem.Add(new SNDataModel { DnNo = SNData.dnno, LineNo = SNData.dnLineNO, Material = SNData.productID, Sn = row.ShipmentSN }); } strSQL = $@"Update [SFIS_PTD].[dbo].[ZWHPickListDetail] set TaskStatus ='Recorded' where RecordNumber='{SNData.dnno}' and RCLineNO='{SNData.dnLineNO}'"; colSQL.Add(strSQL); // 紀錄寄信 mailData.Add(new PTD002CommitDataModel { RecordType = strRecordType, Customer = SNData.soldCustomerID, TableData = mailDataItem }); } using (var transaction = ptdConnection.BeginTransaction()) { try { foreach (string query in colSQL) { await ptdConnection.ExecuteAsync(query, transaction: transaction); } // Commit the transaction transaction.Commit(); foreach (var item in mailData) { await SendMail(strRecordType, item); } } catch (Exception ex) { // Rollback the transaction in case of an exception transaction.Rollback(); throw ex; // Rethrow the exception after rollback } } } result.Success = true; result.Msg = "OK"; } catch (Exception ex) { result.Success = false; result.Msg = ex.Message; } return result; } [Route("[action]")] [HttpPost] public async Task> PostPTD007CommitOld(PTD007CommitDataModel Data) { ResultModel result = new ResultModel(); List SNList = new List(); Collection colSQL = new Collection(); //安勤連線 PTDContext _ptd_context = new PTDContext(); DbConnection connPTD = _ptd_context.Database.GetDbConnection(); if (connPTD.State != ConnectionState.Open) { await connPTD.OpenAsync(); } try { // RecordDate 加入目前時間 Data.RecordDate += $" {DateTime.Now:HH:mm:ss}"; string strSQL = ""; string strRecordType = Data.RecordType; string strRbu = Data.Rbu; string strWorkCenter = Data.WorkCenter; string strRecordDate = TimeZoneInfo.ConvertTimeToUtc(DateTime.Parse(Data.RecordDate)).ToString("yyyy-MM-dd HH:mm:ss"); string strCreateDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); foreach (PTD007TableDataModel SNData in Data.TableData) { //ZWHPickListDetail查SN資訊 strSQL = $@"Select * FROM [SFIS_PTD].[dbo].[ZWHPickListDetail] where RecordNumber='{SNData.dnno}' and RCLineNO='{SNData.dnLineNO}'"; DataTable dtSNData = new DataTable(); using (var cmd = connPTD.CreateCommand()) { cmd.CommandText = strSQL; using (var reader = await cmd.ExecuteReaderAsync()) { if (reader.HasRows) { dtSNData = DataReaderToDataTable(reader); } } } foreach (DataRow row in dtSNData.Rows) { string strLatest; //確認此出貨序號是否有ZHistoryKeyDefine strSQL = $@"select Seed FROM [SFIS_PTD].[dbo].[ZHistoryKeyDefine] where serialnumber ='{row["ShipmentSN"]}'"; using (var cmd = connPTD.CreateCommand()) { cmd.CommandText = strSQL; using (var reader = await cmd.ExecuteReaderAsync()) { if (reader.Read()) { int seed = Convert.ToInt32(reader["Seed"]); int nIdx = seed + 1; strLatest = row["ShipmentSN"].ToString() + nIdx.ToString().PadLeft(4, '0');//組成HistoryID //HistoryKeyDefine strSQL = @$"UPDATE [SFIS_PTD].[dbo].[ZHistoryKeyDefine] SET [Seed] = {nIdx} where [SerialNumber]='{row["ShipmentSN"]}'"; colSQL.Add(strSQL); //ZSNInfo strSQL = @$"Update [SFIS_PTD].[dbo].[ZSNInfo] SET LatestHistoryID='{strLatest}',RecordTypeID='{strRecordType}', CurrentProductID='{row["ProductID"]}' where SerialNumber='{row["ShipmentSN"]}'"; colSQL.Add(strSQL); } else { strLatest = row["ShipmentSN"].ToString() + 1.ToString().PadLeft(4, '0');//組成HistoryID //ZHistoryKeyDefine strSQL = @$"INSERT INTO [SFIS_PTD].[dbo].[ZHistoryKeyDefine] ([SerialNumber],[Seed]) VALUES ('{row["ShipmentSN"]}',1)"; colSQL.Add(strSQL); //ZSNInfo strSQL = @$"INSERT INTO [SFIS_PTD].[dbo].[ZSNInfo] ([SerialNumber],[CurrentProductID],[OriginalProductID], [LocationID],[LatestHistoryID],[RecordTypeID], [OwnerPlantID],[OwnerCompanyID],[CreatePlantID],[CreateCompanyID], [ModifyDate]) VALUES ('{row["ShipmentSN"]}','{row["ProductID"]}','{row["ProductID"]}', '9000','{strLatest}','{strRecordType}', '{strWorkCenter}','{strRbu}','{strWorkCenter}','{strRbu}', '{strCreateDate}')"; colSQL.Add(strSQL); } //ZProductTrans strSQL = $@"INSERT INTO [SFIS_PTD].[dbo].[ZProductTrans] ([HistoryID],[SerialNumber],[RecordTypeID],[RecordNumber],[RCLineNO],[RecordDate], [ProductID],[IsChangeID],[LocationID],[EmplID],[IsDelete], [OwnerPlantID],[OwnerCompanyID],[CreatePlantID],[CreateCompanyID], [CreatorID],[CreateDate],[ModifierID],[ModifyDate], [chkflag],[IsBranchCoReceived],[MOID]) VALUES ('{strLatest}','{row["ShipmentSN"]}','{strRecordType}','{SNData.dnno}','{SNData.dnLineNO}','{strRecordDate}', '{SNData.productID}',0,'9000','{SNData.soldCustomerID.ToString()}',0, '{strWorkCenter}','{strRbu}','{strWorkCenter}','{strRbu}', 'WH00','{strCreateDate}','WH00','{strCreateDate}',0,0,'')"; colSQL.Add(strSQL); } } } strSQL = $@"Update [SFIS_PTD].[dbo].[ZWHPickListDetail] set TaskStatus ='Recorded' where RecordNumber='{SNData.dnno}' and RCLineNO='{SNData.dnLineNO}'"; colSQL.Add(strSQL); } foreach (string query in colSQL) { Console.WriteLine(query); } using (var cmd = connPTD.CreateCommand()) { using (var transaction = connPTD.BeginTransaction()) { try { foreach (string query in colSQL) { cmd.CommandText = query; cmd.Transaction = transaction; cmd.ExecuteNonQuery(); } // Commit the transaction transaction.Commit(); await SendMail(strRecordType, Data); } catch (Exception ex) { // Rollback the transaction in case of an exception transaction.Rollback(); throw ex; // Rethrow the exception after rollback } } } result.Success = true; result.Msg = "OK"; } catch (Exception ex) { result.Success = false; result.Msg = ex.Message; } finally { if (connPTD.State == ConnectionState.Open) { connPTD.Close(); connPTD.Dispose(); } } return result; } [Route("[action]")] [HttpGet] public async Task> GetPTD007QueryByRBU(string recordNumber, string RBU) { ResultModel result = new ResultModel(); try { using (IDbConnection ptdConnection = new SqlConnection(_PTDContext)) { if (ptdConnection.State != ConnectionState.Open) { ptdConnection.Open(); } // 判斷ERP_CustomerID var erpCustomerId = new List(); if (RBU == "AUS") erpCustomerId.AddRange(new[] { "81US0023" }); else if (RBU == "ASH") erpCustomerId.AddRange(new[] { "35CH0001" }); else erpCustomerId.AddRange(new[] { "35CH0692", "30TW0001" }); var query = @$" SELECT A.* , B.ExpectShipDate , B.ShipQty FROM (SELECT RecordNumber AS DNNO , RCLineNO AS DNLineNO , ProductID , EmplID AS SoldCustomerID , count(*) as Qty , OwnerPlantID FROM SFIS_PTD.dbo.ZProductTrans WHERE ERP_CustomerID IN ({string.Join(", ", erpCustomerId.ConvertAll(id => $"N'{id}'"))}) AND RecordNumber = @RecordNumber AND IsBranchCoReceived = 0 AND RecordTypeID in (N'601',N'633',N'601DB') GROUP BY RecordNumber, RCLineNO, ProductID, OwnerPlantID ,EmplID ) A LEFT JOIN SFIS_PTD.dbo.ZDNDetail B on A.DNNO = B.DNNO AND A.DNLineNO = B.DNLineNO ORDER BY A.DNNO, A.DNLineNO "; DynamicParameters p = new DynamicParameters(); p.Add("RecordNumber", recordNumber, DbType.String); var q = await ptdConnection.QueryAsync(query, p); result.DataTotal = q.Count(); result.Data = q; } } catch (Exception ex) { result.Success = false; result.Msg = ex.InnerException.Message; } if (result == null) { result.Msg = "查無資料"; result.Success = false; return result; } result.Success = true; result.Msg = "OK"; return result; } [Route("[action]")] [HttpPost] public async Task> PostPTD007CommitByRBU(PTD007CommitDataModel Data) { ResultModel result = new ResultModel(); List SNList = new List(); Collection colSQL = new Collection(); List mailData = new List(); try { // RecordDate 加入目前時間 Data.RecordDate += $" {DateTime.Now:HH:mm:ss}"; string strSQL = ""; string strRecordType = Data.RecordType; string strRbu = Data.Rbu; string strWorkCenter = Data.WorkCenter; string strRecordDate = TimeZoneInfo.ConvertTimeToUtc(DateTime.Parse(Data.RecordDate)).ToString("yyyy-MM-dd HH:mm:ss"); string strCreateDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); // 判斷ERP_CustomerID var erpCustomerId = new List(); if (strRbu == "AUS") erpCustomerId.AddRange(new[] { "81US0023" }); else if (strRbu == "ASH") erpCustomerId.AddRange(new[] { "35CH0001" }); else erpCustomerId.AddRange(new[] { "35CH0692", "30TW0001" }); using (IDbConnection ptdConnection = new SqlConnection(_PTDContext)) { if (ptdConnection.State != ConnectionState.Open) { ptdConnection.Open(); } foreach (PTD007TableDataModel SNData in Data.TableData) { var mailDataItem = new List(); //ZProductTrans strSQL = $@" SELECT * FROM SFIS_PTD.dbo.ZProductTrans WHERE ERP_CustomerID IN ({string.Join(", ", erpCustomerId.ConvertAll(id => $"N'{id}'"))}) AND IsBranchCoReceived = 0 AND RecordTypeID in (N'601',N'633',N'601DB') AND RecordNumber = '{SNData.dnno}' AND RCLineNO = '{SNData.dnLineNO}' "; var q = await ptdConnection.QueryAsync(strSQL); foreach (var row in q) { string strLatest; //確認此出貨序號是否有ZHistoryKeyDefine strSQL = $@"select Seed FROM [SFIS_PTD].[dbo].[ZHistoryKeyDefine] where serialnumber ='{row.SerialNumber}'"; var q1 = await ptdConnection.QueryAsync(strSQL); if (q1.Any()) { int seed = Convert.ToInt32(q1.FirstOrDefault().Seed); int nIdx = seed + 1; strLatest = row.SerialNumber + nIdx.ToString().PadLeft(4, '0');//組成HistoryID //HistoryKeyDefine strSQL = @$"UPDATE [SFIS_PTD].[dbo].[ZHistoryKeyDefine] SET [Seed] = {nIdx} where [SerialNumber]='{row.SerialNumber}'"; colSQL.Add(strSQL); //ZSNInfo strSQL = @$"Update [SFIS_PTD].[dbo].[ZSNInfo] SET LatestHistoryID='{strLatest}',RecordTypeID='{strRecordType}', CurrentProductID='{row.ProductID}' where SerialNumber='{row.SerialNumber}'"; colSQL.Add(strSQL); } else { strLatest = row.SerialNumber + 1.ToString().PadLeft(4, '0');//組成HistoryID //ZHistoryKeyDefine strSQL = @$"INSERT INTO [SFIS_PTD].[dbo].[ZHistoryKeyDefine] ([SerialNumber],[Seed]) VALUES ('{row.SerialNumber}',1)"; colSQL.Add(strSQL); //ZSNInfo strSQL = @$"INSERT INTO [SFIS_PTD].[dbo].[ZSNInfo] ([SerialNumber],[CurrentProductID],[OriginalProductID], [LocationID],[LatestHistoryID],[RecordTypeID], [OwnerPlantID],[OwnerCompanyID],[CreatePlantID],[CreateCompanyID], [ModifyDate]) VALUES ('{row.SerialNumber}','{row.ProductID}','{row.ProductID}', '9000','{strLatest}','{strRecordType}', '{strWorkCenter}','{strRbu}','{strWorkCenter}','{strRbu}', '{strCreateDate}')"; colSQL.Add(strSQL); } //ZProductTrans strSQL = $@"INSERT INTO [SFIS_PTD].[dbo].[ZProductTrans] ([HistoryID],[SerialNumber],[RecordTypeID],[RecordNumber],[RCLineNO],[RecordDate], [ProductID],[IsChangeID],[LocationID],[EmplID],[IsDelete], [OwnerPlantID],[OwnerCompanyID],[CreatePlantID],[CreateCompanyID], [CreatorID],[CreateDate],[ModifierID],[ModifyDate], [chkflag],[IsBranchCoReceived],[MOID]) VALUES ('{strLatest}','{row.SerialNumber}','{strRecordType}','{SNData.dnno}','{SNData.dnLineNO}','{strRecordDate}', '{SNData.productID}',0,'9000','{SNData.soldCustomerID.ToString()}',0, '{strWorkCenter}','{strRbu}','{strWorkCenter}','{strRbu}', 'WH00','{strCreateDate}','WH00','{strCreateDate}',0,0,'')"; colSQL.Add(strSQL); mailDataItem.Add(new SNDataModel { DnNo = SNData.dnno, LineNo = SNData.dnLineNO, Material = SNData.productID, Sn = row.SerialNumber }); } strSQL = $@" Update SFIS_PTD.dbo.ZProductTrans set IsBranchCoReceived ='1' WHERE ERP_CustomerID IN ({string.Join(", ", erpCustomerId.ConvertAll(id => $"N'{id}'"))}) AND IsBranchCoReceived = 0 AND RecordTypeID in (N'601',N'633',N'601DB') AND RecordNumber='{SNData.dnno}' AND RCLineNO='{SNData.dnLineNO}' "; colSQL.Add(strSQL); } using (var transaction = ptdConnection.BeginTransaction()) { try { foreach (string query in colSQL) { await ptdConnection.ExecuteAsync(query, transaction: transaction); } // Commit the transaction transaction.Commit(); } catch (Exception ex) { // Rollback the transaction in case of an exception transaction.Rollback(); throw ex; // Rethrow the exception after rollback } } } result.Success = true; result.Msg = "OK"; } catch (Exception ex) { result.Success = false; result.Msg = ex.Message; } return result; } #endregion #region "PTD008 還原作業" [Route("[action]")] [HttpGet] public async Task> GetData4PTD008(string recordNumber, string lineNo, string materialNo, string shippingSN) { //安勤連線 PTDContext _ptd_context = new PTDContext(); DbConnection connPTD = _ptd_context.Database.GetDbConnection(); if (connPTD.State != ConnectionState.Open) { await connPTD.OpenAsync(); } try { ResultModel result = new ResultModel(); string strSQL = $@"SELECT RecordTypeID,RecordNumber,RCLineNO 'LineNo', SerialNumber 'SN',ProductID , CreateDate FROM SFIS_PTD.dbo.ZProductTrans where RecordNumber ='{recordNumber}' And RCLineNO ='{lineNo}' And ProductID = '{materialNo}'"; if (shippingSN != null && shippingSN != "") { strSQL += $" And SerialNumber = '{shippingSN}'"; } strSQL += " ORDER BY CreateDate "; DataTable dtZProductTrans = new DataTable(); using (var cmd = connPTD.CreateCommand()) { cmd.CommandText = strSQL; using (var reader = await cmd.ExecuteReaderAsync()) { if (reader.HasRows) { dtZProductTrans = DataReaderToDataTable(reader); } } } List list = new List(); foreach (DataRow row in dtZProductTrans.Rows) { dynamic dyn = new ExpandoObject(); list.Add(dyn); foreach (DataColumn column in dtZProductTrans.Columns) { var dic = (IDictionary)dyn; dic[column.ColumnName] = row[column]; } } result.DataTotal = list.Count(); result.Data = list; if (result == null) { result.Msg = "查無資料"; result.Success = false; return result; } result.Success = true; result.Msg = "OK"; return result; } catch (Exception e) { throw e; } finally { if (connPTD.State == ConnectionState.Open) { connPTD.Close(); connPTD.Dispose(); } } } [Route("[action]")] [HttpPost] public async Task> PostPTD008Commit(PTD008CommitDataModel Data) { ResultModel result = new ResultModel(); Collection colSQL = new Collection(); //安勤連線 PTDContext _ptd_context = new PTDContext(); DbConnection connPTD = _ptd_context.Database.GetDbConnection(); if (connPTD.State != ConnectionState.Open) { await connPTD.OpenAsync(); } try { string strSQL = ""; string strCreateDate = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss"); foreach (PTD008TableDataModel SNData in Data.tableData) { if (Data.type == 0) //還原 { //SQL Server 2012後才能使用 //strSQL = $"Select HistoryID,RecordTypeID,ModifyDate from [SFIS_PTD].[dbo].[ZProductTrans] " + // $"where [SerialNumber] = '{SNData.sn}' " + // $"Order by HistoryID desc offset 1 row fetch next 1 rows only "; strSQL = $@"WITH RankedResults AS ( SELECT HistoryID, RecordTypeID, ModifyDate, ROW_NUMBER() OVER (ORDER BY HistoryID DESC) AS RowNum FROM [SFIS_PTD].[dbo].[ZProductTrans] WHERE [SerialNumber] = '{SNData.sn}' ) SELECT HistoryID, RecordTypeID, ModifyDate FROM RankedResults WHERE RowNum = 2"; using (var cmd = connPTD.CreateCommand()) { cmd.CommandText = strSQL; using (var reader = await cmd.ExecuteReaderAsync()) { if (reader.Read()) { strSQL = $"Update [SFIS_PTD].[dbo].[ZSNInfo] set RecordTypeID ='{reader["RecordTypeID"]}',ModifyDate ='{reader["ModifyDate"]}',LatestHistoryID ='{reader["HistoryID"]}' " + $"where SerialNumber ='{SNData.sn}'"; colSQL.Add(strSQL); int seed = int.Parse(reader["HistoryID"].ToString().Substring(reader["HistoryID"].ToString().Length - 4)); strSQL = @$"UPDATE [SFIS_PTD].[dbo].[ZHistoryKeyDefine] SET [Seed] = {seed} where [SerialNumber]='{SNData.sn}'"; colSQL.Add(strSQL); } else { strSQL = $"Delete [SFIS_PTD].[dbo].[ZSNInfo] where SerialNumber ='{SNData.sn}'"; colSQL.Add(strSQL); strSQL = $"Delete [SFIS_PTD].[dbo].[ZHistoryKeyDefine] where SerialNumber ='{SNData.sn}'"; colSQL.Add(strSQL); } } } } else if (SNData.recordTypeID != "292" && SNData.recordTypeID != "101") //狀態為 292 樣品入庫、101 樣品入庫 才能刪除 { throw new Exception(SNData.recordTypeID + "狀態不能刪除!"); } strSQL = $"Delete [SFIS_PTD].[dbo].[ZProductTrans] " + $"where [SerialNumber] = '{SNData.sn}' " + $"and RecordNumber = '{SNData.recordNumber}' and RCLineNO ='{SNData.lineNo}' " + $"and ProductID ='{SNData.productID}'"; colSQL.Add(strSQL); strSQL = $@"Delete [SFIS_PTD].[dbo].[ZWHPickListDetail] where InputSN = '{SNData.sn}' and RecordNumber='{SNData.recordNumber}' and RCLineNO='{SNData.lineNo}'"; colSQL.Add(strSQL); } using (var cmd = connPTD.CreateCommand()) { using (var transaction = connPTD.BeginTransaction()) { try { foreach (string query in colSQL) { cmd.CommandText = query; cmd.Transaction = transaction; cmd.ExecuteNonQuery(); } // Commit the transaction transaction.Commit(); } catch (Exception ex) { // Rollback the transaction in case of an exception transaction.Rollback(); throw ex; // Rethrow the exception after rollback } } } result.Success = true; result.Msg = "OK"; } catch (Exception ex) { result.Success = false; result.Msg = ex.Message; } finally { if (connPTD.State == ConnectionState.Open) { connPTD.Close(); connPTD.Dispose(); } } return result; } #endregion } }