From f95dd1ce548f2a465d13f70fe4616410a4d77cc5 Mon Sep 17 00:00:00 2001 From: 南骏 池 <chiffly@163.com> Date: 星期三, 14 五月 2025 08:45:58 +0800 Subject: [PATCH] 1.OA接口优化。 2.携客云接口调用 3.携客云送货单、送货明细、条码信息实体 --- service/QC/OAJyService.cs | 309 +++++++++++++++++++++++++++++++++++++-------------- 1 files changed, 222 insertions(+), 87 deletions(-) diff --git a/service/QC/OAJyService.cs b/service/QC/OAJyService.cs index 7c75f09..c7fb134 100644 --- a/service/QC/OAJyService.cs +++ b/service/QC/OAJyService.cs @@ -11,6 +11,13 @@ using System.Security.Cryptography; using System.Text; using static Azure.Core.HttpHeader; +using System.Security.Cryptography; +using System.Collections.Generic; +using System.Linq; +using System.Net.Security; +using System.Security.Cryptography.X509Certificates; +using Org.BouncyCastle.Crypto.Parameters; +using Org.BouncyCastle.Security; namespace NewPdaSqlServer.service.QC; @@ -23,34 +30,39 @@ // private const string SPK = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApobID/gwmD9OofMG1gEcE94NCMeTYUq1cam/7ADZmxHCVpF143GaHWhqDdY0TTVbcUElsQ71DzAG2j3itWlIJBK5fVGwCo3sPpAvUDdKMh+Uivcp7yxdy/IDRA/PS4JARuEyM4cVJLhIOU2KnSlbIkheeoDkDgfaxu9kKrWnozJLiYraVTVDz9PdRX7fQdP+Zu/xB9txAGw4kvOm9HwgrzaSRdZEhisTJ5yyoNW/dLXtWKXA0cKhKOOIFu12TOrv/It6hl1ShTUuy79Pa51M9Oc2dEfVs1tluNXPWo1uFXQbBaJxdqZEJJlK7iW2uQFIao2O4XFHYThwy2+6116LtwIDAQAB"; private const string HOST = "http://192.168.1.149:8099"; - private const string SPK = @"-----BEGIN PUBLIC KEY----- -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApobID/gwmD9OofMG1gEc -E94NCMeTYUq1cam/7ADZmxHCVpF143GaHWhqDdY0TTVbcUElsQ71DzAG2j3itWlI -JBK5fVGwCo3sPpAvUDdKMh+Uivcp7yxdy/IDRA/PS4JARuEyM4cVJLhIOU2KnSlb -IkheeoDkDgfaxu9kKrWnozJLiYraVTVDz9PdRX7fQdP+Zu/xB9txAGw4kvOm9Hwg -rzaSRdZEhisTJ5yyoNW/dLXtWKXA0cKhKOOIFu12TOrv/It6hl1ShTUuy79Pa51M -9Oc2dEfVs1tluNXPWo1uFXQbBaJxdqZEJJlK7iW2uQFIao2O4XFHYThwy2+6116L -twIDAQAB ------END PUBLIC KEY-----"; + private const string SPK = @"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApobID/gwmD9OofMG1gEcE94NCMeTYUq1cam/7ADZmxHCVpF143GaHWhqDdY0TTVbcUElsQ71DzAG2j3itWlIJBK5fVGwCo3sPpAvUDdKMh+Uivcp7yxdy/IDRA/PS4JARuEyM4cVJLhIOU2KnSlbIkheeoDkDgfaxu9kKrWnozJLiYraVTVDz9PdRX7fQdP+Zu/xB9txAGw4kvOm9HwgrzaSRdZEhisTJ5yyoNW/dLXtWKXA0cKhKOOIFu12TOrv/It6hl1ShTUuy79Pa51M9Oc2dEfVs1tluNXPWo1uFXQbBaJxdqZEJJlK7iW2uQFIao2O4XFHYThwy2+6116LtwIDAQAB"; public static class RsaHelper { public static string Encrypt(string plainText, string publicKeyPem) { - // 灏哖EM鏍煎紡鐨勫叕閽ヨ浆鎹负XML鏍煎紡 - var rsa = RSA.Create(); - rsa.ImportFromPem(publicKeyPem); // 浣跨敤.NET 5+ 鍐呯疆PEM瑙f瀽鏂规硶 + //// 灏哖EM鏍煎紡鐨勫叕閽ヨ浆鎹负XML鏍煎紡 + //var rsa = RSA.Create(); + //rsa.ImportFromPem(publicKeyPem); // 浣跨敤.NET 5+ 鍐呯疆PEM瑙f瀽鏂规硶 - var parameters = rsa.ExportParameters(false); - string publicKeyXml = $"<RSAKeyValue><Modulus>{Convert.ToBase64String(parameters.Modulus)}</Modulus><Exponent>{Convert.ToBase64String(parameters.Exponent)}</Exponent></RSAKeyValue>"; + //var parameters = rsa.ExportParameters(false); + //string publicKeyXml = $"<RSAKeyValue><Modulus>{Convert.ToBase64String(parameters.Modulus)}</Modulus><Exponent>{Convert.ToBase64String(parameters.Exponent)}</Exponent></RSAKeyValue>"; - using var rsaProvider = new RSACryptoServiceProvider(); - rsaProvider.FromXmlString(publicKeyXml); // 浣跨敤杞崲鍚庣殑XML鏍煎紡鍏挜 + //using var rsaProvider = new RSACryptoServiceProvider(); + //rsaProvider.FromXmlString(publicKeyXml); // 浣跨敤杞崲鍚庣殑XML鏍煎紡鍏挜 - var data = Encoding.UTF8.GetBytes(plainText); - var encrypted = rsaProvider.Encrypt(data, false); - return Convert.ToBase64String(encrypted); + //var data = Encoding.UTF8.GetBytes(plainText); + //var encrypted = rsaProvider.Encrypt(data, false); + //return Convert.ToBase64String(encrypted); + + RsaKeyParameters publicKeyParam = (RsaKeyParameters)PublicKeyFactory.CreateKey(Convert.FromBase64String(publicKeyPem)); + 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(plainText), false); + encryptedContent = Convert.ToBase64String(encryptedData); + } + return encryptedContent; } } @@ -78,12 +90,14 @@ public string GetToken() { - -; + var userId = "1268"; + var encryptedUserId = RsaHelper.Encrypt(userId, SPK); + ; var headers = new Dictionary<string, string> { ["appid"] = APPID, - ["secret"] = RsaHelper.Encrypt(SECRET, SPK) + ["secret"] = RsaHelper.Encrypt(SECRET, SPK), + ["userId"] = encryptedUserId }; try @@ -109,71 +123,7 @@ } - public string GetOaKqInfo(Uri url, string token, string userId) - { - try - { - ServicePointManager.ServerCertificateValidationCallback += (s, cert, chain, sslPolicyErrors) => true; - ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; - - var request = WebRequest.Create(url) as HttpWebRequest; - request.Method = "POST"; - request.Timeout = 20000; // 20绉掕秴鏃� - request.ContentType = "application/x-www-form-urlencoded; charset=utf-8"; // 鏄庣‘鎸囧畾缂栫爜 - - // 娣诲姞璋冭瘯澶翠俊鎭� - request.Headers.Add("appid", APPID); - request.Headers.Add("token", token); - request.Headers.Add("userId", userId); - - // 鏋勫缓甯︽椂鍖虹殑鏃ユ湡鍙傛暟 - var postData = new StringBuilder(); - var dateParam = DateTime.Now.AddDays(-1).ToString("yyyy-MM-ddTHH:mm:sszzz"); - postData.AppendFormat("KQSDATE={0}&KQEDATE={1}", - Uri.EscapeDataString(dateParam), - Uri.EscapeDataString(dateParam)); - - byte[] byteData = Encoding.UTF8.GetBytes(postData.ToString()); // 鏀圭敤UTF8缂栫爜 - - // 鏇村畬鍠勭殑璇锋眰鍐欏叆 - using (var stream = request.GetRequestStream()) - { - stream.Write(byteData, 0, byteData.Length); - } - - // 澶勭悊HTTP閿欒鐘舵�佺爜 - using (var response = request.GetResponse() as HttpWebResponse) - { - if (response.StatusCode != HttpStatusCode.OK) - { - throw new WebException($"鏈嶅姟鍣ㄨ繑鍥為敊璇姸鎬佺爜: {(int)response.StatusCode} {response.StatusDescription}"); - } - - using (var stream = response.GetResponseStream()) - using (var reader = new StreamReader(stream, Encoding.UTF8)) - { - return reader.ReadToEnd(); - } - } - } - catch (WebException ex) when (ex.Response is HttpWebResponse response) - { - // 璁板綍璇︾粏閿欒淇℃伅 - var errorStream = response.GetResponseStream(); - using (var reader = new StreamReader(errorStream)) - { - string errorDetails = reader.ReadToEnd(); - throw new Exception($"璇锋眰澶辫触 [Status: {response.StatusCode}]: {errorDetails}", ex); - } - } - catch (Exception ex) - { - throw new Exception($"璇锋眰寮傚父: {ex.Message}", ex); - } - } - - - //public dynamic SumbitIQCToOA(dynamic queryObj) + //public string GetOaKqInfo(Uri url, string token, string userId) //{ // try // { @@ -235,4 +185,189 @@ // throw new Exception($"璇锋眰寮傚父: {ex.Message}", ex); // } //} + + + public dynamic SubmitIQCToOA(dynamic query) + { + try + { + // 鍙傛暟鏍¢獙 + if (query == null) throw new ArgumentNullException(nameof(query), "鍙傛暟瀵硅薄涓嶈兘涓簄ull"); + //if (query.workflowId == null) throw new ArgumentException("workflowId涓嶈兘涓虹┖"); + //if (query.mainData == null) throw new ArgumentException("mainData涓嶈兘涓虹┖"); + + // 杞崲鍔ㄦ�佸弬鏁� + //var mainDataDict = ((IEnumerable<KeyValuePair<string, object>>)query.mainData) + // .ToDictionary(kvp => kvp.Key, kvp => kvp.Value); + + Dictionary<string, object> mainDataDict = null; + + Dictionary<string, object> detailDataDict = null; + //if (query.detailData != null) + //{ + // detailDataDict = ((IEnumerable<KeyValuePair<string, object>>)query.detailData) + // .ToDictionary(kvp => kvp.Key, kvp => kvp.Value); + //} + + // 鍔犲瘑澶勭悊 + var userId = "1268"; + var encryptedUserId = RsaHelper.Encrypt(userId, SPK); + string strToken = GetToken(); + + + // 鏇挎崲鍘熸湁鐨勬祴mainDataDict璇曟暟鎹瀯寤� + mainDataDict = BuildMainDataFromQuery(query); + + + // 璋冪敤鏂规硶澧炲姞userid璇锋眰澶� + var result = SubmitWorkflowRequest( + token: strToken, + workflowId: 379, + mainData: mainDataDict, + requestName: "MES->OA娴嬭瘯娴佺▼鏍囬", + otherParams:null, + remark:"Test", + requestLevel:"", + encryptedUserId: encryptedUserId // 鏂板鍙傛暟 + ); + return result; + } + catch (Exception ex) + { + // 鏇磋缁嗙殑閿欒澶勭悊 + return new { + status = -1, + message = $"瀹屾暣閿欒淇℃伅锛歿ex.ToString()}" // 鏄剧ず瀹屾暣鍫嗘爤 + }; + } + } + + // 淇敼鏂规硶绛惧悕 + public dynamic SubmitWorkflowRequest( + string token, + int workflowId, + Dictionary<string, object> mainData, + string encryptedUserId, // 鐢ㄦ埛id + Dictionary<string, object> detailData = null, + Dictionary<string, object> otherParams = null, + string remark = "", + string requestLevel = "", + string requestName = "榛樿娴佺▼鏍囬") + { + try + { + ServicePointManager.ServerCertificateValidationCallback += (s, cert, chain, sslPolicyErrors) => true; + ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; + + var url = new Uri($"{HOST}/api/workflow/paService/doCreateRequest"); + var request = WebRequest.Create(url) as HttpWebRequest; + request.Method = "POST"; + request.Timeout = 20000; + request.ContentType = "application/x-www-form-urlencoded"; // 淇敼涓篔SON鏍煎紡 + + // 鏋勫缓璇锋眰澶� + request.Headers.Set("appid", APPID); + request.Headers.Set("token", token); + request.Headers.Set("Content-Type", "application/x-www-form-urlencoded"); + request.Headers.Set("userId", encryptedUserId); + // 鍋囪闇�瑕佸姞瀵嗙殑userid浠庡叾浠栧湴鏂硅幏鍙栵紝杩欓噷闇�瑕佽ˉ鍏呰幏鍙栭�昏緫 + + // 鏋勫缓璇锋眰浣� + var requestBody = new Dictionary<string, object> + { + //["userId"] = "1268", + ["workflowId"] = workflowId, + ["mainData"] = new List<Dictionary<string, object>> { mainData }, // 鍖呰鎴愭暟缁� + ["detailData"] = null, + ["otherParams"] = otherParams ?? new Dictionary<string, object>(), + ["remark"] = remark, + ["requestLevel"] = requestLevel, + ["requestName"] = requestName + }; + + // 搴忓垪鍖栬姹備綋 + var jsonBody = JsonConvert.SerializeObject(requestBody); + byte[] byteData = Encoding.UTF8.GetBytes(jsonBody); + + // 鍙戦�佽姹� + using (var stream = request.GetRequestStream()) + { + stream.Write(byteData, 0, byteData.Length); + } + + // 澶勭悊鍝嶅簲 + using (var response = request.GetResponse() as HttpWebResponse) + { + using (var stream = response.GetResponseStream()) + using (var reader = new StreamReader(stream, Encoding.UTF8)) + { + var responseJson = reader.ReadToEnd(); + var result = JsonConvert.DeserializeObject<dynamic>(responseJson); + + // 娣诲姞鐘舵�佺爜妫�鏌� + if (response.StatusCode != HttpStatusCode.OK || result.code != "SUCCESS") + { + throw new Exception($"娴佺▼鎻愪氦澶辫触锛歿result.errMsg}"); + } + + return new + { + code = result.code, + data = result.data, + errMsg = result.errMsg + }; + } + } + } + catch (WebException ex) when (ex.Response is HttpWebResponse response) + { + using (var stream = response.GetResponseStream()) + using (var reader = new StreamReader(stream)) + { + var errorDetails = reader.ReadToEnd(); + throw new Exception($"璇锋眰澶辫触 [Status: {response.StatusCode}]: {errorDetails}"); + } + } + catch (Exception ex) + { + throw new Exception($"娴佺▼鎻愪氦寮傚父: {ex.Message}"); + } + } + + + // 鏂板鐨勬瀯寤烘柟娉� + private Dictionary<string, object> BuildMainDataFromQuery(dynamic query) + { + var mainData = new Dictionary<string, object> + { + // 琛ㄧ粨鏋勫畾涔� + ["tableDBName"] = "formtable_main_33", + ["workflowRequestTableRecords"] = new List<Dictionary<string, object>> + { + new Dictionary<string, object> + { + ["recordOrder"] = 0, + ["workflowRequestTableFields"] = new List<Dictionary<string, object>> + { + new Dictionary<string, object> { ["fieldName"] = "wlbm", ["fieldValue"] = "1.01.01.001" }, + new Dictionary<string, object> { ["fieldName"] = "khgys", ["fieldValue"] = "闄堥洩骞�" }, + new Dictionary<string, object> { ["fieldName"] = "jzmcwlmc", ["fieldValue"] = "椤剁洊" }, + new Dictionary<string, object> { ["fieldName"] = "bhgpqxms", ["fieldValue"] = "澶栬涓嶅悎鏍硷紝灏哄涓嶅悎鏍硷紝棰滆壊涓嶇鍚�" }, + new Dictionary<string, object> { ["fieldName"] = "dhdhmes", ["fieldValue"] = "MES001" } + } + } + } + }; + + return mainData; + } + + // 杈呭姪鏂规硶鐢ㄤ簬瀹夊叏娣诲姞灞炴�� + private void TryAddProperty(Dictionary<string, object> dict, string key, object value) + { + if (value != null) + { + dict[key] = value; + } + } } \ No newline at end of file -- Gitblit v1.9.3