using Logic.ProductionToProductMapper.Cordonel; using Service.Core; using System; using System.Data; using System.Net; using System.Net.Http; using System.Text; using System.Threading.Tasks; using System.Web.Http; using Xylem.Common.Logic.ProductionOrderCore.OrderData; namespace Xylem.Common.Service.MeterProcessState.Controllers { [RoutePrefix("api/Marriage")] public class MarriageController : ApiController { public static class GlobalConfig { public static Lazy connectionString = new Lazy(() => System.Configuration.ConfigurationManager.ConnectionStrings["default"].ConnectionString ); } /// /// Get PcbID from SerialNumber /// /// can be Customer or internal serial number /// [Route("GetPcbId"), HttpGet] public async Task GetPcbID(string SerialNumber) { try { return await Task.Run(() => { int internalSerialNumber = 0; int.TryParse(SerialNumber, out internalSerialNumber); int? fromOrderData = null; if (internalSerialNumber == 0) { fromOrderData = getSerialNumberFromOrderData(SerialNumber); if (fromOrderData.HasValue) { internalSerialNumber = fromOrderData.Value; } } using (var dataacces = new SqlDataAccess(GlobalConfig.connectionString.Value)) { var sb = new StringBuilder(); sb.AppendLine($" SELECT distinct [MapPcbIdToSerialNumber_PcbId]"); sb.AppendLine($" FROM [Auftrag].[dbo].[MapPcbIdToSerialNumber]"); sb.AppendLine($" where [MapPcbIdToSerialNumber_SerialNumber] = {internalSerialNumber}"); var MapData = dataacces.ExecuteQuery(sb.ToString()); if (MapData.Rows.Count != 1) { return Request.CreateResponse(HttpStatusCode.InternalServerError, "Can not find unique PcbId for your request"); } return Request.CreateResponse(HttpStatusCode.OK, MapData.Rows[0]["MapPcbIdToSerialNumber_PcbId"].ToString()); } }); } catch (Exception ex) { return Request.CreateResponse(HttpStatusCode.InternalServerError, ex); } } /// /// Get SerialNumber from PcbID /// /// PcbID from Meter /// [Route("GetSerialNumber"), HttpGet] public async Task GetSerialNumber(string PcbID) { try { return await Task.Run(() => { using (var dataacces = new SqlDataAccess(GlobalConfig.connectionString.Value)) { var sb = new StringBuilder(); sb.AppendLine($" SELECT distinct [MapPcbIdToSerialNumber_SerialNumber] "); sb.AppendLine($" FROM [Auftrag].[dbo].[MapPcbIdToSerialNumber]"); sb.AppendLine($" where [MapPcbIdToSerialNumber_PcbId] = '{PcbID}'"); var MapData = dataacces.ExecuteQuery(sb.ToString()); if (MapData.Rows.Count != 1) { return Request.CreateResponse(HttpStatusCode.InternalServerError, "Can not find unique serial number for your request"); } return Request.CreateResponse(HttpStatusCode.OK, MapData.Rows[0]["MapPcbIdToSerialNumber_SerialNumber"].ToString()); } }); } catch (Exception ex) { return Request.CreateResponse(HttpStatusCode.InternalServerError, ex); } } /// /// Get SerialNumber from PcbID /// /// PcbID from Meter /// [Route("GetSerialNumberAndOrderNumber"), HttpGet] public async Task GetSerialNumberAndOrderNumber(string PcbID, bool withRadioAdress = false) { try { return await Task.Run(() => { using (var dataacces = new SqlDataAccess(GlobalConfig.connectionString.Value)) { StringBuilder sb = new StringBuilder(); sb.AppendLine($" SELECT distinct [MapPcbIdToSerialNumber_SerialNumber], mapOrder.CordonelAssignedPicking_FertigungsAuftragsNr ,KundeneigeneSerienNr as CustomerSerialNr "); if (withRadioAdress) { sb.AppendLine($" , meter.[Adresse] "); } sb.AppendLine($" FROM Auftrag.dbo.Cordonel_AssignedPicking mapOrder "); sb.AppendLine($" left outer join [Auftrag].[dbo].[MapPcbIdToSerialNumber] map on mapOrder.CordonelAssignedPicking_PcbId = map.MapPcbIdToSerialNumber_PcbId and MapPcbIdToSerialNumber_Deleted = 0 "); sb.AppendLine($" left outer join Auftrag.dbo.AuftragPositionSerienNr mapSrn on map.[MapPcbIdToSerialNumber_SerialNumber] = mapSrn.SerienNr and mapSrn.Pruefgangnr = 0 "); sb.AppendLine($" left outer join Auftrag.dbo.AuftragPosition_gesamt auftraginfo on auftraginfo.AuftragNr = mapSrn.AuftragNr and auftraginfo.PositionNr = mapSrn.PositionNr "); if (withRadioAdress) { sb.AppendLine($" left outer join [Auftrag].[dbo].[Genesis_Meter] meter on meter.Seriennummer = MapPcbIdToSerialNumber_SerialNumber "); } sb.AppendLine($" where mapOrder.CordonelAssignedPicking_IsDeleted = 0 and mapOrder.CordonelAssignedPicking_PcbId = '{PcbID}'"); var MapData = dataacces.ExecuteQuery(sb.ToString()); if (MapData.Rows.Count != 1) { return Request.CreateResponse(HttpStatusCode.OK, new String[] { string.Empty, string.Empty, string.Empty }); //return Request.CreateResponse(HttpStatusCode.InternalServerError, "Can not find unique serial number for your request"); } var ret = new String[] { MapData.Rows[0]["MapPcbIdToSerialNumber_SerialNumber"].ToString(), MapData.Rows[0]["CordonelAssignedPicking_FertigungsAuftragsNr"].ToString() }; if (withRadioAdress) { ret = new String[] { MapData.Rows[0]["MapPcbIdToSerialNumber_SerialNumber"].ToString(), MapData.Rows[0]["CordonelAssignedPicking_FertigungsAuftragsNr"].ToString(), MapData.Rows[0]["Adresse"].ToString(), MapData.Rows[0]["CustomerSerialNr"].ToString(), }; } return Request.CreateResponse(HttpStatusCode.OK, ret); } }); } catch (Exception ex) { return Request.CreateResponse(HttpStatusCode.InternalServerError, ex); } } private int? getSerialNumberFromOrderData(string CustomerSerialNumber = null, int? SerialNumber = null, int? OrderNumber = null) { using (var dataacces = new SqlDataAccess(GlobalConfig.connectionString.Value)) { var sb = new StringBuilder(); sb.AppendLine($" Declare @CustomerSerialNumber Nvarchar(50) "); sb.AppendLine($" Declare @SerialNumber int "); sb.AppendLine($" Declare @OrderNumber int "); if (SerialNumber.HasValue) { sb.AppendLine($" set @SerialNumber = {SerialNumber} "); } if (OrderNumber.HasValue) { sb.AppendLine($" set @OrderNumber = {OrderNumber} "); } sb.AppendLine($" set @CustomerSerialNumber = '{CustomerSerialNumber}' "); sb.AppendLine($"SELECT DISTINCT "); sb.AppendLine($" [SerienNr] "); sb.AppendLine($" ,[AuftragNr] "); sb.AppendLine($" ,[PositionNr] "); sb.AppendLine($" ,[KundeneigeneSerienNr] "); sb.AppendLine($"FROM [Auftrag].[dbo].[AuftragPositionSerienNr] "); sb.AppendLine($"WHERE (@SerialNumber IS NULL OR[SerienNr] = @SerialNumber) "); sb.AppendLine($"AND (@CustomerSerialNumber IS NULL OR REPLACE(KundeneigeneSerienNr, ' ', '') like '%{CustomerSerialNumber}%' ) "); sb.AppendLine($"AND (@OrderNumber IS NULL OR[AuftragNr] = @OrderNumber) "); var OrderData = dataacces.ExecuteQuery(sb.ToString()); if (OrderData.Rows.Count != 1) { return null; } var tmpInt = 0; int.TryParse(OrderData.Rows[0]["SerienNr"].ToString(), out tmpInt); return tmpInt; } } [Route("GetPreMarriageState"), HttpGet] public async Task GetPreMarriageState(string PcbId, string SerialNumber) { try { return await Task.Run(() => { try { var internalSerialNr = -1; var cust = ""; if (!ScanToSerialNr.ConvertScanToSerialNr(SerialNumber, out internalSerialNr, out cust)) { } using (var dataacces = new SqlDataAccess(GlobalConfig.connectionString.Value)) { var sb = new StringBuilder(); sb = new StringBuilder(); sb.AppendLine($" Declare @SerialNumber int "); sb.AppendLine($" Declare @PcbId Nvarchar(50) "); sb.AppendLine($" Declare @PcbIsPartOfOrder int "); sb.AppendLine($" set @SerialNumber = {internalSerialNr} "); sb.AppendLine($" set @PcbId = '{PcbId}' "); sb.AppendLine($" select @PcbIsPartOfOrder = picking.CordonelAssignedPicking_FertigungsAuftragsNr, @SerialNumber = srn.SerienNr from "); sb.AppendLine($" Cordonel_AssignedPicking picking "); sb.AppendLine($" inner join AuftragPosition apos on apos.FertigungsauftragNr=picking.CordonelAssignedPicking_FertigungsAuftragsNr "); sb.AppendLine($" inner join AuftragPositionSerienNr srn on apos.AuftragNr=srn.AuftragNr and apos.PositionNr=srn.PositionNr and "); if (internalSerialNr != -1) { sb.AppendLine($" srn.SerienNr=@SerialNumber "); } else { sb.AppendLine($" REPLACE(srn.KundeneigeneSerienNr, ' ', '') like '%{cust}%' "); } sb.AppendLine($" where picking.CordonelAssignedPicking_IsDeleted=0 and picking.CordonelAssignedPicking_PcbId=@PcbId "); sb.AppendLine($" select @PcbId as PcbId, @SerialNumber as SerialNumber,0 as AlreadyMarried ,0 as SerialNumberBlocked ,0 as PcbBlocked ,@PcbIsPartOfOrder as PcbIsPartOfOrder "); sb.AppendLine($" union "); sb.AppendLine($" SELECT distinct "); sb.AppendLine($" [MapPcbIdToSerialNumber_PcbId] as PcbId "); sb.AppendLine($" ,[MapPcbIdToSerialNumber_SerialNumber] as SerialNumber "); sb.AppendLine($" ,CASE WHEN [MapPcbIdToSerialNumber_PcbId] = @PcbId and [MapPcbIdToSerialNumber_SerialNumber] = @SerialNumber "); sb.AppendLine($" THEN 1 else 0 END as AlreadyMarried "); sb.AppendLine($" ,CASE WHEN [MapPcbIdToSerialNumber_PcbId] <> @PcbId and [MapPcbIdToSerialNumber_SerialNumber] = @SerialNumber "); sb.AppendLine($" THEN 1 else 0 END as SerialNumberBlocked "); sb.AppendLine($" ,CASE WHEN [MapPcbIdToSerialNumber_PcbId] = @PcbId and [MapPcbIdToSerialNumber_SerialNumber] <> @SerialNumber "); sb.AppendLine($" THEN 1 else 0 END as PcbBlocked , "); sb.AppendLine($" @PcbIsPartOfOrder as PcbIsPartOfOrder "); sb.AppendLine($" FROM [Auftrag].[dbo].[MapPcbIdToSerialNumber] "); sb.AppendLine($" where MapPcbIdToSerialNumber_Deleted = 0 "); sb.AppendLine($" and ([MapPcbIdToSerialNumber_PcbId] = @PcbId or [MapPcbIdToSerialNumber_SerialNumber] = @SerialNumber) "); var dtRet = dataacces.ExecuteQuery(sb.ToString()); var ret = MarriagePossibleEnum.None; if (dtRet.Rows.Count == 0) { ret = ret | MarriagePossibleEnum.Error; } foreach (var item in dtRet.Rows) { if (item is DataRow dr) { if (string.IsNullOrEmpty(dr["PcbIsPartOfOrder"].ToString())) { ret = ret | MarriagePossibleEnum.PcbNotMatchingOrder; } if (dr["AlreadyMarried"].ToString() == "1") { ret = ret | MarriagePossibleEnum.NotPossibleDueAlredayMatch; } if (dr["SerialNumberBlocked"].ToString() == "1") { ret = ret | MarriagePossibleEnum.NotPossibleDueSerialNumberBlocked; } if (dr["PcbBlocked"].ToString() == "1") { ret = ret | MarriagePossibleEnum.NotPossibleDuePcblocked; } } } if (ret == MarriagePossibleEnum.None) { ret = MarriagePossibleEnum.Possible; } return Request.CreateResponse(HttpStatusCode.OK, ret); } } catch (Exception ex) { return Request.CreateResponse(HttpStatusCode.OK, MarriagePossibleEnum.Error); } }); } catch (Exception ex) { return Request.CreateResponse(HttpStatusCode.InternalServerError, ex); } } /// /// Set mapping to production database for PcbId and (sensus) Serial number /// Serial number can be internal or Customer serial number /// Checking if Serial number exists and if OrderNumer is not null, if the serial number is part of the Order /// /// PcbId to map, currently it is a string /// SerialNumber to map /// if not null checks if the serial number is part of the order /// [Route("SetPcbToSerial"), HttpGet] public async Task SetPcbToSerial(string PcbId, string Scan = null, string CustomerSerialNumber = null, int? SerialNumber = null, int? OrderNumber = null, bool returnMetroData = false) { try { return await Task.Run(() => { try { if (!string.IsNullOrEmpty(Scan)) { var internalSerialNr = -1; string cust = null; if (!ScanToSerialNr.ConvertScanToSerialNr(Scan, out internalSerialNr, out cust)) { if (internalSerialNr != -1) { SerialNumber = internalSerialNr; } else { CustomerSerialNumber = cust; } } else { if (!string.IsNullOrEmpty(cust)) { CustomerSerialNumber = cust; } } } if (CustomerSerialNumber == null && SerialNumber == null) { return Request.CreateResponse(HttpStatusCode.InternalServerError, "Could not store mapping, because not SerialNumber and not CustomerSerialNumber is present. Please check your request"); } using (var dataacces = new SqlDataAccess(GlobalConfig.connectionString.Value)) { var sb = new StringBuilder(); var SerialNumberFromOrder = getSerialNumberFromOrderData(CustomerSerialNumber, SerialNumber, OrderNumber); if (!SerialNumberFromOrder.HasValue && !SerialNumber.HasValue) { return Request.CreateResponse(HttpStatusCode.InternalServerError, "Can not find unique serial number for your request"); } //If SerialNumber is empty get it from order data (mapped by CustomerSerialNumber) if (!SerialNumber.HasValue) { SerialNumber = SerialNumberFromOrder.Value; } else { } sb = new StringBuilder(); sb.AppendLine($" Declare @SerialNumber int "); sb.AppendLine($" Declare @PcbId Nvarchar(50) "); sb.AppendLine($" "); sb.AppendLine($" set @SerialNumber = {SerialNumber} "); sb.AppendLine($" set @PcbId = '{PcbId}' "); sb.AppendLine($" "); sb.AppendLine($" SELECT distinct[MapPcbIdToSerialNumber_Id] "); sb.AppendLine($" ,[MapPcbIdToSerialNumber_PcbId] "); sb.AppendLine($" ,[MapPcbIdToSerialNumber_SerialNumber] "); sb.AppendLine($" ,[MapPcbIdToSerialNumber_DateUtc] "); sb.AppendLine($" ,[MapPcbIdToSerialNumber_Deleted] "); sb.AppendLine($" FROM[Auftrag].[dbo].[MapPcbIdToSerialNumber] "); sb.AppendLine($" where MapPcbIdToSerialNumber_Deleted = 0 "); sb.AppendLine($" and ([MapPcbIdToSerialNumber_PcbId] = @PcbId "); sb.AppendLine($" or [MapPcbIdToSerialNumber_SerialNumber] = @SerialNumber) "); if (dataacces.ExecuteQuery(sb.ToString()).Rows.Count != 0) { return Request.CreateResponse(HttpStatusCode.InternalServerError, "Mapping already exist. check your marriage request"); } else { try { sb = new StringBuilder(); sb.AppendLine($" insert into [Auftrag].[dbo].[MapPcbIdToSerialNumber] "); sb.AppendLine($" select "); sb.AppendLine($" '{PcbId}'"); sb.AppendLine($" ,{SerialNumber.Value}"); sb.AppendLine($" ,GETUTCDATE()"); sb.AppendLine($" ,0"); dataacces.ExecuteQuery(sb.ToString()); if (returnMetroData) { return Request.CreateResponse(HttpStatusCode.OK, OrderProgrammingParameters.GetProgrammingParameters(PcbId, GlobalConfig.connectionString.Value)); } else { return Request.CreateResponse(HttpStatusCode.OK, "store"); } } catch (Exception ex) { return Request.CreateResponse(HttpStatusCode.InternalServerError, $"Can not store mapping into Db {ex.Message}"); } } } } catch (Exception ex) { return Request.CreateResponse(HttpStatusCode.InternalServerError, ex.Message); } }); } catch (Exception ex) { return Request.CreateResponse(HttpStatusCode.InternalServerError, ex); } } } }