¶Ô±ÈÐÂÎļþ |
| | |
| | | // OaApiService.cs |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Dynamic; |
| | | using System.IO; |
| | | using System.Net.Http; |
| | | using System.Security.Cryptography; |
| | | using System.Text; |
| | | using System.Threading.Tasks; |
| | | using Newtonsoft.Json; |
| | | using Newtonsoft.Json.Linq; |
| | | using Org.BouncyCastle.Crypto.Parameters; |
| | | using Org.BouncyCastle.Security; |
| | | |
| | | public class OaApiService : IDisposable |
| | | { |
| | | private readonly HttpClient _httpClient; |
| | | private const string AppId = "303233EF-AC39-40C1-8364-AC989C6258A5"; |
| | | private const string BaseUrl = "http://192.168.1.149:8099/api/ec/dev/auth/"; |
| | | private const string WorkflowUrl = "http://192.168.1.149:8099/api/workflow/paService/doCreateRequest"; |
| | | |
| | | public OaApiService() |
| | | { |
| | | _httpClient = new HttpClient(); |
| | | _httpClient.Timeout = TimeSpan.FromSeconds(30); |
| | | } |
| | | |
| | | public async Task<dynamic> SubmitIQCToOA(dynamic queryObj) |
| | | { |
| | | try |
| | | { |
| | | // è§£æè¯·æ±åæ° |
| | | var query = queryObj; |
| | | //var query = JObject.FromObject(queryObj); |
| | | |
| | | // 1. 注åè·ååè¯ |
| | | var registResult = await GetRegistAsync(); |
| | | var secret = registResult["secrit"].ToString(); |
| | | var spk = registResult["spk"].ToString(); |
| | | |
| | | // 2. è·å访é®ä»¤ç |
| | | var tokenResult = await ApplyTokenAsync(secret, spk); |
| | | var token = tokenResult["token"].ToString(); |
| | | |
| | | // 3. åå¤è¯·æ±å¤´ï¼ç§»é¤Content-Typeè®¾ç½®ï¼ |
| | | _httpClient.DefaultRequestHeaders.Clear(); |
| | | _httpClient.DefaultRequestHeaders.Add("token", token); |
| | | _httpClient.DefaultRequestHeaders.Add("appid", AppId); |
| | | _httpClient.DefaultRequestHeaders.Add("userid", RSAEncrypt("1268", spk)); |
| | | |
| | | // 4. æå»ºè¯·æ±ä½ |
| | | var requestData = BuildRequestData(); |
| | | |
| | | // 5. åéè¯·æ± |
| | | var response = await PostFormAsync(WorkflowUrl, requestData); |
| | | return JObject.Parse(response); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | dynamic error = new ExpandoObject(); |
| | | error.Error = true; |
| | | error.Message = ex.Message; |
| | | return error; |
| | | } |
| | | } |
| | | |
| | | private Dictionary<string, object> BuildRequestData() |
| | | { |
| | | // ä»queryåæ°ä¸è·åå®é
ä¸å¡æ°æ® |
| | | return new Dictionary<string, object> |
| | | { |
| | | {"mainData", BuildMainData()}, |
| | | {"requestName", $"IQCæµç¨-{DateTime.Now:yyyyMMddHHmmss}"}, |
| | | {"workflowId", "379"}, |
| | | //{"otherParams", BuildOtherParams()}, |
| | | //{"detailData", BuildDetailData(query)} |
| | | }; |
| | | } |
| | | |
| | | private JArray BuildMainData() |
| | | { |
| | | // 示ä¾åæ®µï¼æ ¹æ®å®é
ä¸å¡éæ±è°æ´ |
| | | return new JArray |
| | | { |
| | | new JObject |
| | | { |
| | | ["fieldName"] = "wlbm", |
| | | ["fieldValue"] = "1.01.01.001" |
| | | }, |
| | | new JObject |
| | | { |
| | | ["fieldName"] = "khgys", |
| | | ["fieldValue"] = "ééªå¹´" |
| | | }, |
| | | new JObject |
| | | { |
| | | ["fieldName"] = "bhgpqxms", |
| | | ["fieldValue"] = "å¤è§ä¸åæ ¼ï¼å°ºå¯¸ä¸åæ ¼ï¼é¢è²ä¸ç¬¦å" |
| | | }, |
| | | new JObject |
| | | { |
| | | ["fieldName"] = "dhdhmes", |
| | | ["fieldValue"] = "MES001" |
| | | } |
| | | }; |
| | | } |
| | | |
| | | private JArray BuildAttachments(JToken attachments) |
| | | { |
| | | var array = new JArray(); |
| | | |
| | | if (attachments != null) |
| | | { |
| | | foreach (var att in attachments) |
| | | { |
| | | array.Add(new JObject |
| | | { |
| | | ["filePath"] = att["url"]?.ToString(), |
| | | ["fileName"] = att["fileName"]?.ToString() |
| | | }); |
| | | } |
| | | } |
| | | return array; |
| | | } |
| | | |
| | | private JArray BuildDetailData(JObject query) |
| | | { |
| | | // ç¤ºä¾æç»æ°æ®ï¼æ ¹æ®å®é
ä¸å¡è°æ´ |
| | | return new JArray |
| | | { |
| | | new JObject |
| | | { |
| | | ["tableDBName"] = "formtable_main_24_dt1", |
| | | ["workflowRequestTableRecords"] = new JArray |
| | | { |
| | | new JObject |
| | | { |
| | | ["recordOrder"] = "0", |
| | | ["workflowRequestTableFields"] = new JArray |
| | | { |
| | | new JObject { ["fieldName"] = "xm", ["fieldValue"] = query["inspector"] ?? "é»è®¤æ£éªå" }, |
| | | new JObject { ["fieldName"] = "bh", ["fieldValue"] = query["batchNo"] ?? "é»è®¤æ¹æ¬¡å·" }, |
| | | new JObject { ["fieldName"] = "dz", ["fieldValue"] = query["location"] ?? "é»è®¤å°ç¹" } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | }; |
| | | } |
| | | |
| | | private JObject BuildOtherParams() |
| | | { |
| | | return new JObject |
| | | { |
| | | ["isnextflow"] = "1", |
| | | ["delReqFlowFaild"] = "1" |
| | | }; |
| | | } |
| | | |
| | | private async Task<JObject> GetRegistAsync() |
| | | { |
| | | using var rsa = new RSACryptoServiceProvider(2048); |
| | | var cpk = Convert.ToBase64String(rsa.ExportRSAPublicKey()); |
| | | |
| | | _httpClient.DefaultRequestHeaders.Clear(); |
| | | _httpClient.DefaultRequestHeaders.Add("appid", AppId); |
| | | _httpClient.DefaultRequestHeaders.Add("cpk", cpk); |
| | | |
| | | var response = await _httpClient.PostAsync(BaseUrl + "regist", null); |
| | | return JObject.Parse(await response.Content.ReadAsStringAsync()); |
| | | } |
| | | |
| | | private async Task<JObject> ApplyTokenAsync(string secret, string spk) |
| | | { |
| | | _httpClient.DefaultRequestHeaders.Clear(); |
| | | _httpClient.DefaultRequestHeaders.Add("appid", AppId); |
| | | _httpClient.DefaultRequestHeaders.Add("secret", RSAEncrypt(secret, spk)); |
| | | |
| | | var response = await _httpClient.PostAsync(BaseUrl + "applytoken", null); |
| | | return JObject.Parse(await response.Content.ReadAsStringAsync()); |
| | | } |
| | | |
| | | private string RSAEncrypt(string data, string publicKey) |
| | | { |
| | | //using var rsa = new RSACryptoServiceProvider(); |
| | | //rsa.ImportRSAPublicKey(Convert.FromBase64String(publicKey), out _); |
| | | |
| | | //var dataBytes = Encoding.UTF8.GetBytes(data); |
| | | //var encrypted = rsa.Encrypt(dataBytes, RSAEncryptionPadding.Pkcs1); |
| | | //return Convert.ToBase64String(encrypted); |
| | | RsaKeyParameters publicKeyParam = (RsaKeyParameters)PublicKeyFactory.CreateKey(Convert.FromBase64String(publicKey)); |
| | | string XML = string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent></RSAKeyValue>", |
| | | Convert.ToBase64String(publicKeyParam.Modulus.ToByteArrayUnsigned()), |
| | | Convert.ToBase64String(publicKeyParam.Exponent.ToByteArrayUnsigned())); |
| | | string encryptedContent = string.Empty; |
| | | using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider()) |
| | | { |
| | | rsa.FromXmlString(XML); |
| | | byte[] encryptedData = rsa.Encrypt(Encoding.Default.GetBytes(data), false); |
| | | encryptedContent = Convert.ToBase64String(encryptedData); |
| | | } |
| | | return encryptedContent; |
| | | } |
| | | |
| | | private async Task<string> PostFormAsync(string url, Dictionary<string, object> data) |
| | | { |
| | | // æ¹ç¨FormUrlEncodedContentå¹¶æ£ç¡®è®¾ç½®Content-Type |
| | | var formData = new List<KeyValuePair<string, string>>(); |
| | | foreach (var item in data) |
| | | { |
| | | formData.Add(new KeyValuePair<string, string>(item.Key, item.Value.ToString())); |
| | | } |
| | | |
| | | var content = new FormUrlEncodedContent(formData); |
| | | content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/x-www-form-urlencoded"); |
| | | |
| | | var response = await _httpClient.PostAsync(url, content); |
| | | var responseString = await response.Content.ReadAsStringAsync(); |
| | | |
| | | // æ·»å ååºå
æ°æ® |
| | | var responseInfo = new JObject |
| | | { |
| | | ["StatusCode"] = (int)response.StatusCode, |
| | | ["ReasonPhrase"] = response.ReasonPhrase, |
| | | ["Headers"] = JToken.FromObject(response.Headers), |
| | | ["Content"] = responseString |
| | | }; |
| | | |
| | | // è°è¯è¾åºå®æ´ååºä¿¡æ¯ |
| | | Console.WriteLine($"宿´ååºï¼\n{responseInfo.ToString(Formatting.Indented)}"); |
| | | |
| | | return responseInfo.ToString(); |
| | | } |
| | | |
| | | public void Dispose() |
| | | { |
| | | _httpClient?.Dispose(); |
| | | } |
| | | } |