南骏 池
2025-04-01 ef5240b3fdb861ce57367976ee62b1d0145ce1ac
1.委外调整
2.OA接口测试control
已添加1个文件
已修改1个文件
330 ■■■■■ 文件已修改
Controllers/AuthController.cs 328 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/Wom/WwGdManager.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Controllers/AuthController.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,328 @@
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Security.Cryptography;
using Newtonsoft.Json;
using System.Text;
using System.Net;
using Microsoft.AspNetCore.DataProtection;
using Microsoft.Extensions.Hosting;
namespace NewPdaSqlServer.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class AuthController : ControllerBase
    {
        // ä»¥ä¸‹å¸¸é‡å»ºè®®æ”¾åœ¨appsettings.json配置文件中
        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 = @"-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApobID/gwmD9OofMG1gEc
E94NCMeTYUq1cam/7ADZmxHCVpF143GaHWhqDdY0TTVbcUElsQ71DzAG2j3itWlI
JBK5fVGwCo3sPpAvUDdKMh+Uivcp7yxdy/IDRA/PS4JARuEyM4cVJLhIOU2KnSlb
IkheeoDkDgfaxu9kKrWnozJLiYraVTVDz9PdRX7fQdP+Zu/xB9txAGw4kvOm9Hwg
rzaSRdZEhisTJ5yyoNW/dLXtWKXA0cKhKOOIFu12TOrv/It6hl1ShTUuy79Pa51M
9Oc2dEfVs1tluNXPWo1uFXQbBaJxdqZEJJlK7iW2uQFIao2O4XFHYThwy2+6116L
twIDAQAB
-----END PUBLIC KEY-----";
        [HttpGet("token")]
        public ActionResult<string> GetToken()
        {
            var http = new HttpManager();
            var headers = new Dictionary<string, string>
            {
                ["appid"] = APPID,
                ["secret"] = RsaHelper.Encrypt(SECRET, SPK)
            };
            try
            {
                var response = http.PostDataSSL($"{HOST}/api/ec/dev/auth/applytoken",
                    new Dictionary<string, string>(), headers);
                if (!string.IsNullOrEmpty(response))
                {
                    var res = JsonConvert.DeserializeObject<dynamic>(response);
                    if (res.status == "true")
                    {
                        return res.token.ToString();
                    }
                }
                return BadRequest("Failed to get token");
            }
            catch (Exception ex)
            {
                // å»ºè®®ä½¿ç”¨ILogger记录日志
                return StatusCode(500, ex.Message);
            }
        }
        [HttpPost("getUserId")]
        public ActionResult<string> GetUserId()
        {
            var http = new HttpManager();
            var tokenResult = http.GetToken();
            if (tokenResult is not null)
            {
                Uri url = new Uri($"{HOST}/api/T100/GetSecretUserId");
                return http.GetOaKqInfo(url, tokenResult, "DQ000344");
            }
            return BadRequest("无法获取有效Token");
        }
        [HttpPost("createWorkflow")]
        public ActionResult<string> CreateWorkflowRequest([FromBody] WorkflowRequestDto request)
        {
            try
            {
                // åŠ å¯†ç”¨æˆ·ID
                var encryptedUserId = RsaHelper.Encrypt(request.UserId, SPK);
                var token = GetToken().ToString();
                // è®¾ç½®è¯·æ±‚头
                var headers = new Dictionary<string, string>
                {
                    ["token"] = token,
                    ["appid"] = APPID,
                    ["userid"] = encryptedUserId
                };
                // æž„建请求参数
                var parameters = new Dictionary<string, string>
                {
                    ["mainData"] = JsonConvert.SerializeObject(request.MainData),
                    ["workflowId"] = request.WorkflowId.ToString(),
                    ["requestName"] = request.RequestName
                };
                // æ·»åŠ å¯é€‰å‚æ•°
                if (request.DetailData != null)
                    parameters.Add("detailData", JsonConvert.SerializeObject(request.DetailData));
                if (request.OtherParams != null)
                    parameters.Add("otherParams", JsonConvert.SerializeObject(request.OtherParams));
                // å‘送请求
                var response = new HttpManager().PostDataSSL(
                    $"{HOST}/api/workflow/paService/doCreateRequest",
                    parameters,
                    headers);
                dynamic res = JsonConvert.DeserializeObject(response);
                if (res.code == "SUCCESS")
                    return Ok(res.data.requestid.ToString());
                return BadRequest($"创建失败:{res.errMsg}");
            }
            catch (Exception ex)
            {
                return StatusCode(500, $"系统异常:{ex.Message}");
            }
        }
    }
    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 = $"<RSAKeyValue><Modulus>{Convert.ToBase64String(parameters.Modulus)}</Modulus><Exponent>{Convert.ToBase64String(parameters.Exponent)}</Exponent></RSAKeyValue>";
            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);
        }
    }
    public class HttpManager
    {
        private readonly HttpClient _client = new HttpClient();
        // ä»¥ä¸‹å¸¸é‡å»ºè®®æ”¾åœ¨appsettings.json配置文件中
        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 = @"-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApobID/gwmD9OofMG1gEc
E94NCMeTYUq1cam/7ADZmxHCVpF143GaHWhqDdY0TTVbcUElsQ71DzAG2j3itWlI
JBK5fVGwCo3sPpAvUDdKMh+Uivcp7yxdy/IDRA/PS4JARuEyM4cVJLhIOU2KnSlb
IkheeoDkDgfaxu9kKrWnozJLiYraVTVDz9PdRX7fQdP+Zu/xB9txAGw4kvOm9Hwg
rzaSRdZEhisTJ5yyoNW/dLXtWKXA0cKhKOOIFu12TOrv/It6hl1ShTUuy79Pa51M
9Oc2dEfVs1tluNXPWo1uFXQbBaJxdqZEJJlK7iW2uQFIao2O4XFHYThwy2+6116L
twIDAQAB
-----END PUBLIC KEY-----";
        public string PostDataSSL(string url,
            Dictionary<string, string> parameters,
            Dictionary<string, string> 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 http = new HttpManager();
            var headers = new Dictionary<string, string>
            {
                ["appid"] = APPID,
                ["secret"] = RsaHelper.Encrypt(SECRET, SPK)
            };
            try
            {
                var response = http.PostDataSSL($"{HOST}/api/ec/dev/auth/applytoken",
                    new Dictionary<string, string>(), headers);
                if (!string.IsNullOrEmpty(response))
                {
                    var res = JsonConvert.DeserializeObject<dynamic>(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);
            }
        }
    }
    // æ–°å¢žDTOç±»
    public class WorkflowRequestDto
    {
        /// <summary>
        /// ç”¨æˆ·è®¤è¯ä»¤ç‰Œ
        /// </summary>
        public string Token { get; set; }
        /// <summary>
        /// åŽŸå§‹ç”¨æˆ·ID(加密前)
        /// </summary>
        public string UserId { get; set; }
        /// <summary>
        /// æµç¨‹ID(必填)
        /// </summary>
        public int WorkflowId { get; set; }
        /// <summary>
        /// æµç¨‹æ ‡é¢˜ï¼ˆå¿…填)
        /// </summary>
        public string RequestName { get; set; }
        /// <summary>
        /// ä¸»è¡¨æ•°æ®ï¼ˆå¿…填)
        /// </summary>
        public Dictionary<string, object> MainData { get; set; }
        /// <summary>
        /// æ˜Žç»†è¡¨æ•°æ®ï¼ˆé€‰å¡«ï¼‰
        /// </summary>
        public Dictionary<string, object> DetailData { get; set; }
        /// <summary>
        /// å…¶ä»–参数(选填)
        /// </summary>
        public Dictionary<string, object> OtherParams { get; set; }
    }
}
service/Wom/WwGdManager.cs
@@ -972,7 +972,7 @@
                PbillNo = query.billNo,
                ItemId = blDetail.Bld012,
                Unit = blDetail.Bld009,
                DepotId = (int)stockBarcode.DepotsId,
                DepotId = (int)stockBarcode.DepotId,
                EbelnK3id = womdab.Eid,
                LineK3id = womdab.Erpid
            }).IgnoreColumns(true).ExecuteCommand();