From ddea1761f2f6040a3e0b5bb1f693684306f4c4d4 Mon Sep 17 00:00:00 2001 From: 南骏 池 <chiffly@163.com> Date: 星期一, 07 四月 2025 11:18:33 +0800 Subject: [PATCH] 1.产品绑定模块 2.来料检提交oa --- Controllers/QC/OAJyController.cs | 39 +++++ Dto/service/WorkflowRequestDto.cs | 42 ++++++ service/QC/OAJyService.cs | 238 ++++++++++++++++++++++++++++++++++ service/Wom/WomdaaManager.cs | 50 +++++++ Controllers/Wom/WomdaaController.cs | 31 ++++ Controllers/AuthController.cs | 10 6 files changed, 405 insertions(+), 5 deletions(-) diff --git a/Controllers/AuthController.cs b/Controllers/AuthController.cs index 2795eda..e9a308e 100644 --- a/Controllers/AuthController.cs +++ b/Controllers/AuthController.cs @@ -77,7 +77,7 @@ return BadRequest("鏃犳硶鑾峰彇鏈夋晥Token"); } - + [HttpPost("createWorkflow")] public ActionResult<string> CreateWorkflowRequest([FromBody] WorkflowRequestDto request) @@ -99,7 +99,7 @@ var parameters = new Dictionary<string, string> { ["mainData"] = JsonConvert.SerializeObject(request.MainData), - ["workflowId"] = request.WorkflowId.ToString(), + ["workflowId"] = "", ["requestName"] = request.RequestName }; @@ -234,7 +234,7 @@ 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); @@ -243,12 +243,12 @@ // 鏋勫缓甯︽椂鍖虹殑鏃ユ湡鍙傛暟 var postData = new StringBuilder(); var dateParam = DateTime.Now.AddDays(-1).ToString("yyyy-MM-ddTHH:mm:sszzz"); - postData.AppendFormat("KQSDATE={0}&KQEDATE={1}", + 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()) { diff --git a/Controllers/QC/OAJyController.cs b/Controllers/QC/OAJyController.cs new file mode 100644 index 0000000..ba47301 --- /dev/null +++ b/Controllers/QC/OAJyController.cs @@ -0,0 +1,39 @@ +锘縰sing System.Dynamic; +using Microsoft.AspNetCore.Mvc; +using NewPdaSqlServer.Dto.service; +using NewPdaSqlServer.entity; +using NewPdaSqlServer.service.QC; +using NewPdaSqlServer.util; +using Newtonsoft.Json.Linq; + +namespace NewPdaSqlServer.Controllers.QC; + +[Route("api/[controller]")] +[ApiController] +public class OAJyController : ControllerBase +{ + IpqcService m = new IpqcService(); + + [HttpPost("SumbitIQCToOA")] + public ResponseResult SumbitIQCToOA([FromBody] dynamic queryObj) + { + try + { + dynamic resultInfos = new ExpandoObject(); + //var resultInfos = m.SumbitIQCToOA(queryObj); + //var tbBillList = + // resultInfos.tbBillList = item; + return new ResponseResult + { + status = 0, + message = "OK", + data = resultInfos + }; + } + catch (Exception ex) + { + return ResponseResult.ResponseError(ex); + } + } + +} \ No newline at end of file diff --git a/Controllers/Wom/WomdaaController.cs b/Controllers/Wom/WomdaaController.cs index 8b0f2a1..3492d8d 100644 --- a/Controllers/Wom/WomdaaController.cs +++ b/Controllers/Wom/WomdaaController.cs @@ -236,6 +236,7 @@ return ResponseResult.ResponseError(ex); } } + /// <summary> /// 淇敼 @@ -260,6 +261,36 @@ return ResponseResult.ResponseError(ex); } } + #endregion + #region 鐜板満绠$悊 + + //GetItemsByDaa001 + /// <summary> + /// 鎵弿娉ㄥ鐮侊紝鑾峰彇宸ュ崟鍜屾潯鐮佷俊鎭� + /// </summary> + /// <returns></returns> + [HttpPost("getZsBarInfo")] + public ResponseResult getZsBarInfo([FromBody] dynamic query) + { + try + { + dynamic resultInfos = new ExpandoObject(); + // 鍏堝垵濮嬪寲tbBillList灞炴�� + resultInfos.tbBillList = new ExpandoObject(); + resultInfos.tbBillList.ZsBarInfo = m.getZsBarInfo(query); + resultInfos.tbBillList.Traceability = m.getTraceability(query); + return new ResponseResult + { + status = 0, + message = "OK", + data = resultInfos + }; + } + catch (Exception ex) + { + return ResponseResult.ResponseError(ex); + } + } #endregion } \ No newline at end of file diff --git a/Dto/service/WorkflowRequestDto.cs b/Dto/service/WorkflowRequestDto.cs new file mode 100644 index 0000000..02e6b98 --- /dev/null +++ b/Dto/service/WorkflowRequestDto.cs @@ -0,0 +1,42 @@ +锘縰sing NewPdaSqlServer.Dto.@base; + +namespace NewPdaSqlServer.Dto.service; + + +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; } +} \ No newline at end of file diff --git a/service/QC/OAJyService.cs b/service/QC/OAJyService.cs new file mode 100644 index 0000000..605ad1f --- /dev/null +++ b/service/QC/OAJyService.cs @@ -0,0 +1,238 @@ +锘縰sing 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; + +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 = @"-----BEGIN PUBLIC KEY----- +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApobID/gwmD9OofMG1gEc +E94NCMeTYUq1cam/7ADZmxHCVpF143GaHWhqDdY0TTVbcUElsQ71DzAG2j3itWlI +JBK5fVGwCo3sPpAvUDdKMh+Uivcp7yxdy/IDRA/PS4JARuEyM4cVJLhIOU2KnSlb +IkheeoDkDgfaxu9kKrWnozJLiYraVTVDz9PdRX7fQdP+Zu/xB9txAGw4kvOm9Hwg +rzaSRdZEhisTJ5yyoNW/dLXtWKXA0cKhKOOIFu12TOrv/It6hl1ShTUuy79Pa51M +9Oc2dEfVs1tluNXPWo1uFXQbBaJxdqZEJJlK7iW2uQFIao2O4XFHYThwy2+6116L +twIDAQAB +-----END PUBLIC KEY-----"; + + + 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瀽鏂规硶 + + 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 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 headers = new Dictionary<string, string> + { + ["appid"] = APPID, + ["secret"] = RsaHelper.Encrypt(SECRET, SPK) + }; + + try + { + var response = 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); + } + } + + + public dynamic SumbitIQCToOA(dynamic queryObj) + { + 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); + } + } +} \ No newline at end of file diff --git a/service/Wom/WomdaaManager.cs b/service/Wom/WomdaaManager.cs index 2cc6490..5e2300b 100644 --- a/service/Wom/WomdaaManager.cs +++ b/service/Wom/WomdaaManager.cs @@ -251,4 +251,54 @@ return dto; } + + /// <summary> + /// 鑾峰彇宸ュ崟鏉$爜淇℃伅 + /// </summary> + /// <param name="query"></param> + /// <returns></returns> + public dynamic getZsBarInfo(dynamic query) + { + + var sql = string.Format(@"SELECT TOP 1 A.barCode AS zsBarcode, + D.name AS lineName, + D.line_no, + B.daa001, + C.item_no, + C.item_name, + C.item_model, + A.quantity as barQty, + B.daa008 as sumQty, + isnull((SELECT count(1) FROM WORK_COLLECT WHERE processNo = '{0}' AND ABOUT_GUID = A.ABOUT_GUID),0) AS finQty, + isnull((SELECT TOP 1 processNo FROM WORK_COLLECT WHERE WORK_COLLECT.barCode = '{1}' AND checkResult = '鈭�' ORDER BY WORK_COLLECT.createDate DESC ),'') AS lastGx +FROM WORK_TRAC_CODE A + LEFT JOIN WOMDAA B ON A.ABOUT_GUID = B.guid + LEFT JOIN MES_ITEMS C ON B.daa002 = C.item_id + LEFT JOIN MES_WORKSHOP_LINE D ON A.lineId = D.id +WHERE A.barCode = '{1}'", query.GX, query.Zsbarcode); + + var ZsBarInfo = Db.Ado.SqlQuery<dynamic>(sql); + + if (ZsBarInfo.Count < 1) + { + throw new Exception($"璇ヨ拷婧爜{query.Zsbarcode}涓嶅瓨鍦ㄤ笉瀛樺湪"); + } + + return ZsBarInfo; + } + + //鑾峰彇鐢熶骇 + public dynamic getTraceability(dynamic query) + { + var sql = string.Format(@"SELECT processNo, A.barCode, B.lineId, line_no, name AS lineName, checkResult, C.USER_NAME +FROM WORK_COLLECT A + LEFT JOIN WORK_TRAC_CODE B ON A.barCode = B.barCode + LEFT JOIN SYS_USER C ON C.ACCOUNT = A.createBy + LEFT JOIN MES_WORKSHOP_LINE D ON B.lineId = D.id +WHERE A.barCode = '{0}'", query.Zsbarcode); + + var Traceability = Db.Ado.SqlQuery<dynamic>(sql); + + return Traceability; + } } \ No newline at end of file -- Gitblit v1.9.3