diff --git a/WebApiService/src/Win_in.Sfs.Scp.WebApi.Agent/AsnBackgroundWorker/AsnBackgroundWorker.cs b/WebApiService/src/Win_in.Sfs.Scp.WebApi.Agent/AsnBackgroundWorker/AsnBackgroundWorker.cs index 3e4dc12..9556645 100644 --- a/WebApiService/src/Win_in.Sfs.Scp.WebApi.Agent/AsnBackgroundWorker/AsnBackgroundWorker.cs +++ b/WebApiService/src/Win_in.Sfs.Scp.WebApi.Agent/AsnBackgroundWorker/AsnBackgroundWorker.cs @@ -5,6 +5,7 @@ using System.Runtime.Serialization; using System.Text.Json; using System.Threading.Tasks; using AutoMapper; +using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; @@ -32,17 +33,20 @@ namespace Win_in.Sfs.Scp.WebApi { private readonly AsnOptions _options; private readonly IObjectMapper _objectMapper; + private readonly IPostService _postService; public AsnBackgroundWorker( AbpAsyncTimer timer, IOptions options, IServiceScopeFactory serviceScopeFactory, - IObjectMapper objectMapper + IObjectMapper objectMapper, + IPostService postService ) : base(timer, serviceScopeFactory) { _options = options.Value; _objectMapper = objectMapper; Timer.Period = options.Value.PeriodSeconds * 1000; //default 5 minutes + _postService = postService; } [UnitOfWork] @@ -96,24 +100,60 @@ namespace Win_in.Sfs.Scp.WebApi await scpAsnManager.GetUnreadAsnsAsync(siteCode, lastUid, _options.BatchSize); Logger.LogInformation($"{siteCode}: {scpAsns.Count} ASNs were Found"); - + var baseUrl = _options.BaseUrl; + var username = _options.Username; + var password = _options.Password; foreach (var asn in scpAsns) { var barcodes = await scpAsnManager.GetBarcodesAsync(siteCode, asn.AsnBillNum); var noPoAsn = CreateNoPoAsn(asn, barcodes); - asnX12List.Add(noPoAsn); + asn.IsPort = 1; + var apiUrl = ""; - if (asn.AsnBillNum.StartsWith(_options.QadAsnPrefix))//ASN to QAD + var jsonString = noPoAsn.JsonString; + try { - //埃驰要求不传托盘信息 @20220905 - barcodes.ForEach(p => p.PalletCode = ""); - //埃驰要求不传托盘信息 @20220905 - - var asnX12 = CreateX12Asn(site, asn, barcodes); - asnX12List.Add(asnX12); + var a = 0; + var ss = 8 / a; + var result = await _postService.PostAsync(baseUrl, apiUrl, jsonString, username, password); + if (result == null) + { + noPoAsn.SetError("Boomi", EnumExchangeDataErrorCode.None, "Boomi没有返回值"); + } + if (result?.Status == "SUCCESS") + { + noPoAsn.SetSuccess("Boomi", "Boomi接口执行成功"); + } + else if (result?.Status == "EXCEPTION") + { + noPoAsn.SetError("Boomi", EnumExchangeDataErrorCode.Exception, "EXCEPTION" + result?.ErrorMessage); + } + else if (result?.Status == "FAIL") + { + noPoAsn.SetError("Boomi", EnumExchangeDataErrorCode.FAIL, "FAIL" + result?.ErrorMessage); + } } + catch (Exception e) + { + Logger.LogException(e); + e = e.GetBaseException(); + noPoAsn.SetError("Boomi", EnumExchangeDataErrorCode.Exception, "接口程序异常"+e.Message); + } + finally + { + asnX12List.Add(noPoAsn); + } + //if (asn.AsnBillNum.StartsWith(_options.QadAsnPrefix))//ASN to QAD + //{ + // //埃驰要求不传托盘信息 @20220905 + // barcodes.ForEach(p => p.PalletCode = ""); + // //埃驰要求不传托盘信息 @20220905 + + // var asnX12 = CreateX12Asn(site, asn, barcodes); + // asnX12List.Add(asnX12); + //} Logger.LogInformation($"{siteCode}:{asn.Id} {asn.AsnBillNum} was loaded"); } @@ -132,56 +172,57 @@ namespace Win_in.Sfs.Scp.WebApi Logger.LogInformation("Get ASN from SCP: Complete"); } - private X12Asn CreateNoPoAsn(TB_ASN asn, List barcodes) { var asnMstr = new AsnMstr() { - UID = asn.Id, - Company = asn.Site, - Site = asn.Site, - AsnNbr = asn.AsnBillNum, - RpNbr = asn.AskBillNum, - PoNbr = asn.PoBillNum, - VendorCode = asn.VendId, - Contacts = asn.ReceiveUser, - Phone = "", - TruckNbr = asn.PlateNumber, - Whse = "", - Dock = "", - ShipDate = asn.ShipTime, - DueDate = asn.ReceiveTime, - TimeWindow = asn.ReceivedPort, - Remark = asn.Remark, + traceId = asn.Site+"-"+ asn.Id .ToString()+ "-"+ Guid.NewGuid().ToString(), + uid = asn.Id, + company = asn.Site, + site = asn.Site, + asnNbr = asn.AsnBillNum, + rpNbr = asn.AskBillNum, + poNbr = asn.PoBillNum, + vendorCode = asn.VendId, + contacts = asn.ReceiveUser, + phone = "", + status = null, + truckNbr = asn.PlateNumber, + whse = "", + dock = "", + shipDate = asn.ShipTime, + dueDate = asn.ReceiveTime, + timeWindow = asn.ReceivedPort, + remark = asn.Remark, }; foreach (var barcode in barcodes) { var det = new AsnDet() { - AsnNbr = asn.AsnBillNum, - PoNbr = asn.PoBillNum, - PoLine = barcode.PoBillLine, - PartCode = barcode.PartCode, - Lot = barcode.Batch, - Qty = barcode.Qty, - ProductionDate = barcode.ProduceDate, - WareClass = "", - WareCode = "", - StdPackQty = barcode.PackQty, - PoUm = barcode.PoUnit, - LocUm = barcode.LocUnit, - UmConv = 1, - PartType = "", - Supplierlot = barcode.VendBatch, - Status = barcode.State.ToString(), - LabelCode = barcode.Extend2, - EntireBarCode = barcode.FullBarCode, - PalletLabelCode = barcode.PalletCode, - Remark = barcode.Remark, + asnNbr = asn.AsnBillNum, + poNbr = asn.PoBillNum, + poLine = barcode.PoBillLine, + partCode = barcode.PartCode, + lot = barcode.Batch, + qty = barcode.Qty, + productionDate = barcode.ProduceDate, + wareClass = "", + wareCode = "", + stdPackQty = barcode.PackQty, + poUm = barcode.PoUnit, + locUm = barcode.LocUnit, + umConv = 1, + partType = "", + supplierlot = barcode.VendBatch, + status = barcode.State.ToString(), + labelCode = barcode.Extend2, + entireBarCode = barcode.FullBarCode, + palletLabelCode = barcode.PalletCode, + remark = barcode.Remark, }; - asnMstr.Details.Add(det); + asnMstr.details.Add(det); } var jsonString = JsonSerializer.Serialize(asnMstr); var ediString = jsonString; @@ -189,7 +230,6 @@ namespace Win_in.Sfs.Scp.WebApi asn.ShipTime ?? DateTime.Today); return asnX12; } - private static X12Asn CreateX12Asn(AsnOptions.Site site, TB_ASN asn, List barcodes) { var asnFactory = new AsnFactory(); diff --git a/WebApiService/src/Win_in.Sfs.Scp.WebApi.Agent/PostService/AuthenticationOptions.cs b/WebApiService/src/Win_in.Sfs.Scp.WebApi.Agent/PostService/AuthenticationOptions.cs new file mode 100644 index 0000000..cd1e2db --- /dev/null +++ b/WebApiService/src/Win_in.Sfs.Scp.WebApi.Agent/PostService/AuthenticationOptions.cs @@ -0,0 +1,8 @@ +锘縩amespace Win_in.Sfs.Scp.WebApi.Agent +{ + public class AuthenticationOptions + { + public string Username { get; set; } + public string Password { get; set; } + } +} \ No newline at end of file diff --git a/WebApiService/src/Win_in.Sfs.Scp.WebApi.Agent/PostService/BoomiResult.cs b/WebApiService/src/Win_in.Sfs.Scp.WebApi.Agent/PostService/BoomiResult.cs new file mode 100644 index 0000000..310b6c7 --- /dev/null +++ b/WebApiService/src/Win_in.Sfs.Scp.WebApi.Agent/PostService/BoomiResult.cs @@ -0,0 +1,11 @@ +锘縩amespace Win_in.Sfs.Scp.WebApi.Agent +{ + public class BoomiResult + { + public string TraceId { get; set; } + // public int ErrorCode { get; set; } + public string ErrorMessage { get; set; } + // public string Information { get; set; } + public string Status { get; set; } + } +} \ No newline at end of file diff --git a/WebApiService/src/Win_in.Sfs.Scp.WebApi.Agent/PostService/IPostService.cs b/WebApiService/src/Win_in.Sfs.Scp.WebApi.Agent/PostService/IPostService.cs new file mode 100644 index 0000000..f95e0bf --- /dev/null +++ b/WebApiService/src/Win_in.Sfs.Scp.WebApi.Agent/PostService/IPostService.cs @@ -0,0 +1,10 @@ +锘縰sing System.Threading.Tasks; +using Volo.Abp.DependencyInjection; + +namespace Win_in.Sfs.Scp.WebApi.Agent +{ + public interface IPostService:ITransientDependency + { + Task PostAsync(string baseUrl, string apiUrl, string content, string username, string password); + } +} \ No newline at end of file diff --git a/WebApiService/src/Win_in.Sfs.Scp.WebApi.Agent/PostService/PostService.cs b/WebApiService/src/Win_in.Sfs.Scp.WebApi.Agent/PostService/PostService.cs new file mode 100644 index 0000000..4c2c31e --- /dev/null +++ b/WebApiService/src/Win_in.Sfs.Scp.WebApi.Agent/PostService/PostService.cs @@ -0,0 +1,78 @@ +锘縰sing System; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Net.Http.Json; +using System.Text; +using System.Text.Json; +using System.Threading.Tasks; +using Serilog; + +namespace Win_in.Sfs.Scp.WebApi.Agent +{ + public class PostService : IPostService + { + private readonly System.Net.Http.IHttpClientFactory _httpClientFactory; + + public PostService(System.Net.Http.IHttpClientFactory httpClientFactory) + { + _httpClientFactory = httpClientFactory; + } + + public async Task PostAsync(string baseUrl, string apiUrl, string content, string username, string password) + { + var options = new AuthenticationOptions() + { + Username = username, + Password = password + }; + var result = await PostAsync(baseUrl,apiUrl, content, options); + return result; + } + + public async Task PostAsync(string baseUrl,string apiUrl, string content, AuthenticationOptions options) + { + //var client = new HttpClient(); + var client = _httpClientFactory.CreateClient(); + client.BaseAddress = new Uri(baseUrl); + client.DefaultRequestHeaders.Accept.Clear(); + client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); + + var byteArray = Encoding.ASCII.GetBytes($"{options.Username}:{options.Password}"); + client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray)); + + var httpContent = new StringContent(content); + httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json"); + //var url = baseUrl + "/" + apiUrl; + var url = baseUrl; + Serilog.Log.Information(url); + Serilog.Log.Debug(content); + var response = await client.PostAsync(url, httpContent); + + try + { + Log.Debug("before EnsureSuccessStatusCode() response content鈫撯啌鈫"); + Log.Debug(await response.Content.ReadAsStringAsync()); + } + catch (Exception e) + { + Console.WriteLine(e); + throw; + } + + response.EnsureSuccessStatusCode(); + + HttpContent respCon = response.Content; + + string resultContent = await respCon.ReadAsStringAsync(); + resultContent = resultContent.Replace("\n", "").Replace(" ", "").Replace("\t", "").Replace("\r", ""); + + Serilog.Log.Debug("response content鈫撯啌鈫"); + Serilog.Log.Debug(resultContent); + + //var result = await respCon.ReadFromJsonAsync(); + var result = JsonSerializer.Deserialize(resultContent); + + return result; + } + } +} \ No newline at end of file diff --git a/WebApiService/src/Win_in.Sfs.Scp.WebApi.Agent/appsettings.json b/WebApiService/src/Win_in.Sfs.Scp.WebApi.Agent/appsettings.json index c242e57..3d4b8df 100644 --- a/WebApiService/src/Win_in.Sfs.Scp.WebApi.Agent/appsettings.json +++ b/WebApiService/src/Win_in.Sfs.Scp.WebApi.Agent/appsettings.json @@ -1,6 +1,6 @@ 锘縶 "ConnectionStrings": { - "Default": "Server=127.0.0.1;Database=Scp_WebApi;User ID=sa;Password=Microsoft2008;connection timeout=600;" + "Default": "Server=dev.ccwin-in.com,6207;Database=Scp_WebApi_UAT;User ID=sa;Password=ChangkeTec@2021;connection timeout=600;" }, "Serilog": { "Using": [ "Serilog.Sinks.File", "Serilog.Sinks.Async", "Serilog.Sinks.Console", "Serilog.Sinks.MSSqlServer" ], @@ -38,7 +38,7 @@ { "Name": "MSSqlServer", "Args": { - "connectionString": "Server=127.0.0.1;Database=Scp_WebApi;User ID=sa;Password=Microsoft2008;connection timeout=600;", + "connectionString": "Server=dev.ccwin-in.com,6207;Database=Scp_WebApi_UAT;User ID=sa;Password=ChangkeTec@2021;connection timeout=600;", "tableName": "AgentLogs", "autoCreateSqlTable": true } @@ -54,17 +54,20 @@ "MaxCount": 100, "QadAsnPrefix": "B", "NoPoAsnPrefix": "T", + "BaseUrl": "https://api.iacgroup.com:9100/ws/simple/createWMSSupplierASN", + "Username": "SCP-CH@iac-PJL8W6", + "Password": "f0475092-c891-4d36-b2c1-dfd39fa0e436", "Sites": [ { "Code": "T8", "Receiver": "00T8USUPPU", "MinUid": 1024 - }, - { - "Code": "T5", - "Receiver": "00T5USUPPU", - "MinUid": 100 } + //{ + // "Code": "T5", + // "Receiver": "00T5USUPPU", + // "MinUid": 100 + //} ] } diff --git a/WebApiService/src/Win_in.Sfs.Scp.WebApi.Domain.Shared/AsnOptions.cs b/WebApiService/src/Win_in.Sfs.Scp.WebApi.Domain.Shared/AsnOptions.cs index 1f9604d..9732c57 100644 --- a/WebApiService/src/Win_in.Sfs.Scp.WebApi.Domain.Shared/AsnOptions.cs +++ b/WebApiService/src/Win_in.Sfs.Scp.WebApi.Domain.Shared/AsnOptions.cs @@ -12,7 +12,9 @@ public class AsnOptions public string ValidPoPre { get; set; } = "PO"; public string QadAsnPrefix { get; set; } = "B"; public string NoPoAsnPrefix { get; set; } = "T"; - + public string BaseUrl { get; set; } = "https://api.iacgroup.com:9100/ws/simple/createWMSSupplierASN"; + public string Username { get; set; } = "SCP-CH@iac-PJL8W6"; + public string Password { get; set; } = "f0475092-c891-4d36-b2c1-dfd39fa0e436"; public List Sites { get; set; } =new() ; public class Site diff --git a/WebApiService/src/Win_in.Sfs.Scp.WebApi.Domain.Shared/EnumExchangeDataErrorCode.cs b/WebApiService/src/Win_in.Sfs.Scp.WebApi.Domain.Shared/EnumExchangeDataErrorCode.cs index e9f507d..5eb7f88 100644 --- a/WebApiService/src/Win_in.Sfs.Scp.WebApi.Domain.Shared/EnumExchangeDataErrorCode.cs +++ b/WebApiService/src/Win_in.Sfs.Scp.WebApi.Domain.Shared/EnumExchangeDataErrorCode.cs @@ -6,4 +6,5 @@ public enum EnumExchangeDataErrorCode UnknownDataType = 1, WrongDataFormat = 2, Exception = 9, + FAIL=8 } \ No newline at end of file diff --git a/WebApiService/src/Win_in.Sfs.Scp.WebApi.Domain.Shared/NoPoASN/AsnDet.cs b/WebApiService/src/Win_in.Sfs.Scp.WebApi.Domain.Shared/NoPoASN/AsnDet.cs index 723ad56..ca04bc1 100644 --- a/WebApiService/src/Win_in.Sfs.Scp.WebApi.Domain.Shared/NoPoASN/AsnDet.cs +++ b/WebApiService/src/Win_in.Sfs.Scp.WebApi.Domain.Shared/NoPoASN/AsnDet.cs @@ -16,102 +16,102 @@ namespace Win_in.Sfs.Scp.WebApi /// /// 閫佽揣鍗曞彿 /// - public virtual string AsnNbr { get; set; } + public virtual string asnNbr { get; set; } /// /// 閲囪喘璁㈠崟鍙 /// - public virtual string PoNbr { get; set; } + public virtual string poNbr { get; set; } /// /// 閲囪喘璁㈠崟琛 /// - public virtual int PoLine { get; set; } + public virtual int poLine { get; set; } /// /// 鐗╂枡鍙 /// - public virtual string PartCode { get; set; } + public virtual string partCode { get; set; } /// /// 鎵规 /// - public virtual string Lot { get; set; } + public virtual string lot { get; set; } /// /// 閫佽揣鎬婚噺 /// - public virtual decimal Qty { get; set; } + public virtual decimal qty { get; set; } /// /// 鐢熶骇鏃ユ湡 /// - public virtual DateTime? ProductionDate { get; set; } + public virtual DateTime? productionDate { get; set; } /// /// 鍣ㄥ叿鍨嬪彿 /// - public virtual string WareClass { get; set; } + public virtual string wareClass { get; set; } /// /// 鍣ㄥ叿鍙 /// - public virtual string WareCode { get; set; } + public virtual string wareCode { get; set; } /// /// 鏍囧噯鍖呰閲 /// - public virtual decimal StdPackQty { get; set; } + public virtual decimal stdPackQty { get; set; } /// /// 閲囪喘鍗曚綅 /// - public virtual string PoUm { get; set; } + public virtual string poUm { get; set; } /// /// 鍩烘湰鍗曚綅 /// - public virtual string LocUm { get; set; } + public virtual string locUm { get; set; } /// /// 杞崲鐜 /// - public virtual decimal UmConv { get; set; } + public virtual decimal umConv { get; set; } /// /// 鐗╂枡绫诲瀷 /// - public virtual string PartType { get; set; } + public virtual string partType { get; set; } /// /// 渚涘簲鍟嗘壒鍙 /// - public virtual string Supplierlot { get; set; } + public virtual string supplierlot { get; set; } /// /// 鐘舵侊紙0:Closed,1:Open) /// - public virtual string Status { get; set; } + public virtual string status { get; set; } /// /// 鏍囩浠g爜 /// - public virtual string LabelCode { get; set; } + public virtual string labelCode { get; set; } /// /// 瀹屾暣鏉$爜鏁版嵁 /// - public virtual string EntireBarCode { get; set; } + public virtual string entireBarCode { get; set; } /// /// 鎵樼洏鏍囩浠g爜 /// - public virtual string PalletLabelCode { get; set; } + public virtual string palletLabelCode { get; set; } /// /// 澶囨敞 /// - public virtual string Remark { get; set; } + public virtual string remark { get; set; } } diff --git a/WebApiService/src/Win_in.Sfs.Scp.WebApi.Domain.Shared/NoPoASN/AsnMstr.cs b/WebApiService/src/Win_in.Sfs.Scp.WebApi.Domain.Shared/NoPoASN/AsnMstr.cs index 9a6ffa6..50971f9 100644 --- a/WebApiService/src/Win_in.Sfs.Scp.WebApi.Domain.Shared/NoPoASN/AsnMstr.cs +++ b/WebApiService/src/Win_in.Sfs.Scp.WebApi.Domain.Shared/NoPoASN/AsnMstr.cs @@ -9,88 +9,95 @@ namespace Win_in.Sfs.Scp.WebApi /// public class AsnMstr { + public string traceId { get; set; } /// /// 鑷闀挎暟瀛椾富閿 /// - public virtual long UID { get; set; } + public virtual long uid { get; set; } /// /// 鍏徃 /// - public virtual string Company { get; set; } + public virtual string company { get; set; } /// /// 宸ュ巶 /// - public virtual string Site { get; set; } + public virtual string site { get; set; } /// /// 閫佽揣鍗曞彿 /// - public virtual string AsnNbr { get; set; } + public virtual string asnNbr { get; set; } /// /// 瑕佽揣璁″垝鍗曞彿 /// - public virtual string RpNbr { get; set; } + public virtual string rpNbr { get; set; } /// /// 閲囪喘璁㈠崟鍙 /// - public virtual string PoNbr { get; set; } + public virtual string poNbr { get; set; } /// /// 渚涘簲鍟 /// - public virtual string VendorCode { get; set; } + public virtual string vendorCode { get; set; } + /// + /// 鐘舵 + /// + public string status { get; set; } /// /// 鑱旂郴浜 /// - public virtual string Contacts { get; set; } + public virtual string contacts { get; set; } /// /// 鑱旂郴鐢佃瘽 /// - public virtual string Phone { get; set; } + public virtual string phone { get; set; } /// /// 杞︾墝鍙 /// - public virtual string TruckNbr { get; set; } + public virtual string truckNbr { get; set; } /// /// 浠撳簱 /// - public virtual string Whse { get; set; } + public virtual string whse { get; set; } /// /// 鏀惰揣鍙 /// - public virtual string Dock { get; set; } + public virtual string dock { get; set; } /// /// 鍙戣揣鏃ユ湡 /// - public DateTime? ShipDate { get; set; } + public DateTime? shipDate { get; set; } /// /// 鍒拌揣鏃ユ湡 /// - public DateTime? DueDate { get; set; } + public DateTime? dueDate { get; set; } /// /// 鏃堕棿绐楀彛 /// - public string TimeWindow { get; set; } + public string timeWindow { get; set; } /// /// 澶囨敞 /// - public virtual string Remark { get; set; } + public virtual string remark { get; set; } + + - public virtual List Details { get; set; } = new List(); + public virtual List details { get; set; } = new List(); } }