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