From 955c117833da888852a2e0c239350c409cce93d5 Mon Sep 17 00:00:00 2001 From: 南骏 池 <chiffly@163.com> Date: 星期一, 28 四月 2025 08:50:58 +0800 Subject: [PATCH] 1.OA调通 2.携客云更新appkey --- Controllers/QC/OAJyController.cs | 2 service/QC/OAJyService.cs | 12 +- service/QC/OaApi.cs | 239 +++++++++++++++++++++++++++++++++++++++++++++++ util/XkyApiHelper.cs | 8 service/Warehouse/MesXkyService.cs | 2 5 files changed, 252 insertions(+), 11 deletions(-) diff --git a/Controllers/QC/OAJyController.cs b/Controllers/QC/OAJyController.cs index 64f03ca..44228f0 100644 --- a/Controllers/QC/OAJyController.cs +++ b/Controllers/QC/OAJyController.cs @@ -12,7 +12,7 @@ [ApiController] public class OAJyController : ControllerBase { - OAJyService m = new OAJyService(); + OaApiService m = new OaApiService(); [HttpPost("SumbitIQCToOA")] public ResponseResult SumbitIQCToOA([FromBody] dynamic queryObj) diff --git a/service/QC/OAJyService.cs b/service/QC/OAJyService.cs index a5191af..c7fb134 100644 --- a/service/QC/OAJyService.cs +++ b/service/QC/OAJyService.cs @@ -90,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 @@ -213,7 +215,7 @@ string strToken = GetToken(); - // 鏇挎崲鍘熸湁鐨勬祴璇曟暟鎹瀯寤� + // 鏇挎崲鍘熸湁鐨勬祴mainDataDict璇曟暟鎹瀯寤� mainDataDict = BuildMainDataFromQuery(query); @@ -339,7 +341,7 @@ var mainData = new Dictionary<string, object> { // 琛ㄧ粨鏋勫畾涔� - ["tableDBName"] = "formtable_main_1356_dt1", + ["tableDBName"] = "formtable_main_33", ["workflowRequestTableRecords"] = new List<Dictionary<string, object>> { new Dictionary<string, object> diff --git a/service/QC/OaApi.cs b/service/QC/OaApi.cs new file mode 100644 index 0000000..ef93298 --- /dev/null +++ b/service/QC/OaApi.cs @@ -0,0 +1,239 @@ +锘�// 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 + { + // 瑙f瀽璇锋眰鍙傛暟 + 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() + { + // 浠巕uery鍙傛暟涓幏鍙栧疄闄呬笟鍔℃暟鎹� + 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骞舵纭缃瓹ontent-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(); + } +} \ No newline at end of file diff --git a/service/Warehouse/MesXkyService.cs b/service/Warehouse/MesXkyService.cs index 5e75066..92ad9ee 100644 --- a/service/Warehouse/MesXkyService.cs +++ b/service/Warehouse/MesXkyService.cs @@ -26,7 +26,7 @@ ApiCommonParam Apiparam = ApiCommonParam.NewApiCommon(); try { - string data_inserted = ""; + string data_inserted = "{\r\n \"startDate\": 1745260800000,\r\n \"endDate\": 1745261100000,\r\n \"erpCode\": \"GXF001\"\r\n}"; ArrayList SQLStringList = new ArrayList(); // var client = new HttpClient(); var url = "https://openapi.xiekeyun.com/delivery/getNoList.json"; diff --git a/util/XkyApiHelper.cs b/util/XkyApiHelper.cs index 5350fcd..1cfa324 100644 --- a/util/XkyApiHelper.cs +++ b/util/XkyApiHelper.cs @@ -16,10 +16,10 @@ //this.operateCompanyCode = "鍙橀噺_operateCompanyCode"; //this.ownerCompanyCode = "鍙橀噺_ownerCompanyCode"; //this.appSecret = "鍙橀噺_appSecret"; - this.appKey = "86d3ae868978beff0d39948c420ec4ff"; - this.operateCompanyCode = "52265397"; - this.ownerCompanyCode = "52265397"; - this.appSecret = "978f5b950aefc3c1e0d4a56a562b0f8c"; + this.appKey = "5f0f8dadc4edc70197a73f7ef506aa9b"; + this.operateCompanyCode = "85621331"; + this.ownerCompanyCode = "85621331"; + this.appSecret = "fa7c117c02fd4967849a612963c034ca"; this.version = "1.0"; } -- Gitblit v1.9.3