using MES.Service.Models; using Microsoft.IdentityModel.Tokens; using NewPdaSqlServer.Controllers; using NewPdaSqlServer.DB; using NewPdaSqlServer.Dto.service; using NewPdaSqlServer.entity; using NewPdaSqlServer.util; using Newtonsoft.Json; using SqlSugar; using System.Net; 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; public class OAJyService : RepositoryNoEntity { private readonly HttpClient _client = new HttpClient(); private const string APPID = "303233EF-AC39-40C1-8364-AC989C6258A5"; private const string SECRET = "30b41949-bcfb-48f8-9847-feb6e043fe72"; // 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 = @"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApobID/gwmD9OofMG1gEcE94NCMeTYUq1cam/7ADZmxHCVpF143GaHWhqDdY0TTVbcUElsQ71DzAG2j3itWlIJBK5fVGwCo3sPpAvUDdKMh+Uivcp7yxdy/IDRA/PS4JARuEyM4cVJLhIOU2KnSlbIkheeoDkDgfaxu9kKrWnozJLiYraVTVDz9PdRX7fQdP+Zu/xB9txAGw4kvOm9HwgrzaSRdZEhisTJ5yyoNW/dLXtWKXA0cKhKOOIFu12TOrv/It6hl1ShTUuy79Pa51M9Oc2dEfVs1tluNXPWo1uFXQbBaJxdqZEJJlK7iW2uQFIao2O4XFHYThwy2+6116LtwIDAQAB"; public static class RsaHelper { public static string Encrypt(string plainText, string publicKeyPem) { //// 将PEM格式的公钥转换为XML格式 //var rsa = RSA.Create(); //rsa.ImportFromPem(publicKeyPem); // 使用.NET 5+ 内置PEM解析方法 //var parameters = rsa.ExportParameters(false); //string publicKeyXml = $"{Convert.ToBase64String(parameters.Modulus)}{Convert.ToBase64String(parameters.Exponent)}"; //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); RsaKeyParameters publicKeyParam = (RsaKeyParameters)PublicKeyFactory.CreateKey(Convert.FromBase64String(publicKeyPem)); string XML = string.Format("{0}{1}", 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; } } public string PostDataSSL(string url, Dictionary parameters, Dictionary headers) { var request = new HttpRequestMessage(HttpMethod.Post, url); foreach (var header in headers) { request.Headers.Add(header.Key, header.Value); } // 如果需要表单参数 if (parameters.Count > 0) { request.Content = new FormUrlEncodedContent(parameters); } var response = _client.SendAsync(request).Result; return response.Content.ReadAsStringAsync().Result; } public string GetToken() { var userId = "1268"; var encryptedUserId = RsaHelper.Encrypt(userId, SPK); ; var headers = new Dictionary { ["appid"] = APPID, ["secret"] = RsaHelper.Encrypt(SECRET, SPK), ["userId"] = encryptedUserId }; try { var response = PostDataSSL($"{HOST}/api/ec/dev/auth/applytoken", new Dictionary(), headers); if (!string.IsNullOrEmpty(response)) { var res = JsonConvert.DeserializeObject(response); if (res.status == "true") { return res.token.ToString(); } } return "token不存在!"; } catch (Exception ex) { // 建议使用ILogger记录日志 return ex.Message; } } //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 SubmitIQCToOA(dynamic query) { try { // 参数校验 if (query == null) throw new ArgumentNullException(nameof(query), "参数对象不能为null"); //if (query.workflowId == null) throw new ArgumentException("workflowId不能为空"); //if (query.mainData == null) throw new ArgumentException("mainData不能为空"); // 转换动态参数 //var mainDataDict = ((IEnumerable>)query.mainData) // .ToDictionary(kvp => kvp.Key, kvp => kvp.Value); Dictionary mainDataDict = null; Dictionary detailDataDict = null; //if (query.detailData != null) //{ // detailDataDict = ((IEnumerable>)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 mainData, string encryptedUserId, // 用户id Dictionary detailData = null, Dictionary 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"; // 修改为JSON格式 // 构建请求头 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 { //["userId"] = "1268", ["workflowId"] = workflowId, ["mainData"] = new List> { mainData }, // 包装成数组 ["detailData"] = null, ["otherParams"] = otherParams ?? new Dictionary(), ["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(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 BuildMainDataFromQuery(dynamic query) { var mainData = new Dictionary { // 表结构定义 ["tableDBName"] = "formtable_main_33", ["workflowRequestTableRecords"] = new List> { new Dictionary { ["recordOrder"] = 0, ["workflowRequestTableFields"] = new List> { new Dictionary { ["fieldName"] = "wlbm", ["fieldValue"] = "1.01.01.001" }, new Dictionary { ["fieldName"] = "khgys", ["fieldValue"] = "陈雪年" }, new Dictionary { ["fieldName"] = "jzmcwlmc", ["fieldValue"] = "顶盖" }, new Dictionary { ["fieldName"] = "bhgpqxms", ["fieldValue"] = "外观不合格,尺寸不合格,颜色不符合" }, new Dictionary { ["fieldName"] = "dhdhmes", ["fieldValue"] = "MES001" } } } } }; return mainData; } // 辅助方法用于安全添加属性 private void TryAddProperty(Dictionary dict, string key, object value) { if (value != null) { dict[key] = value; } } }