using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Runtime.Remoting.Metadata.W3cXsd2001; using System.Security.Policy; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Xml.Linq; using MisDataFunDll; using NPOI.SS.Formula.Functions; using NPOI.SS.UserModel; using Opc.Ua; namespace MisDataSaveDate { public class ND_Api { public static string LocalPath_Log = "D:\\MESlog"; public static void miReleaseSfcWithActivity(string apiName, string opName, MiReleaseSfcWithActivityParams miReleaseSfcWithActivityParams, out string sfc, out string code, out string message) { string apiNameCreateFile = "申请条码:miReleaseSfcWithActivity"; string requestContent =$@" {miReleaseSfcWithActivityParams.site} {miReleaseSfcWithActivityParams.resource} {miReleaseSfcWithActivityParams.operation} {miReleaseSfcWithActivityParams.operationRevision} {miReleaseSfcWithActivityParams.sfcQty} {miReleaseSfcWithActivityParams.activity} {miReleaseSfcWithActivityParams.user} {miReleaseSfcWithActivityParams.modeProcessSFC} " ; cmdApi(apiName, requestContent, opName, apiNameCreateFile, out code, out message, out sfc); } public static void miCheckInventoryAttributes(string apiName, string opName, MiCheckInventoryAttributes miCheckInventoryAttributes, out string code, out string message) { string apiNameCreateFile = "电芯校验:miCheckInventoryAttributes"; string requiredQuantity = ""; string inventoryArray = ""; for (int i = 0; i < miCheckInventoryAttributes.inventoryArray.Count; i++) { inventoryArray += $@" {miCheckInventoryAttributes.inventoryArray[i]}"; } string requestContent = $@" {miCheckInventoryAttributes.site} {miCheckInventoryAttributes.sfc} {miCheckInventoryAttributes.operation} {miCheckInventoryAttributes.operationRevision} {miCheckInventoryAttributes.resource} {miCheckInventoryAttributes.user} {miCheckInventoryAttributes.activityId} {miCheckInventoryAttributes.modeCheckInventory} {requiredQuantity} {inventoryArray} " ; cmdApi(apiName, miCheckInventoryAttributes.sfc, requestContent, opName, apiNameCreateFile, out code, out message); } public static void cellCustomDCCheck(string apiName, string opName, CellCustomDCCheck cellCustomDCCheck, out string code, out string message) { string apiNameCreateFile = "电芯K值:cellCustomDCCheck"; string inventoryListStr = ""; for (int i = 0; i < cellCustomDCCheck.inventoryList.Count; i++) { List inventoryDatalist = cellCustomDCCheck.inventoryList[i].inventoryDatalist; string inventoryDatalistStr = ""; for (int j = 0; j < inventoryDatalist.Count; j++) { inventoryDatalistStr += $@" {inventoryDatalist[j].name} {inventoryDatalist[j].value} "; } inventoryListStr += $@" {cellCustomDCCheck.inventoryList[i].inventoryId} {cellCustomDCCheck.inventoryList[i].marking} {inventoryDatalistStr} "; } string requestContent = $@" {cellCustomDCCheck.site} {cellCustomDCCheck.dcSequence} {cellCustomDCCheck.user} {cellCustomDCCheck.Multispec} {cellCustomDCCheck.operation} {cellCustomDCCheck.resource} {inventoryListStr} "; cmdApi(apiName, "", requestContent, opName, apiNameCreateFile, out code, out message); } public static void sfcStart(string apiName, string opName, SfcStart sfcStart, out string code, out string message) { string apiNameCreateFile = "产品进站:sfcStart"; string requestContent = $@" {sfcStart.site} {sfcStart.user} {sfcStart.operation} {sfcStart.operationRevision} {sfcStart.resource} {sfcStart.sfcArray} "; cmdApi(apiName, sfcStart.sfcArray, requestContent, opName, apiNameCreateFile, out code, out message); } public static void miFindCustomAndSfcData(string apiName, string opName, MiFindCustomAndSfcData miFindCustomAndSfcData, out string code, out string message) { string apiNameCreateFile = "产品进站:miFindCustomAndSfcData"; string requestContent = $@" {miFindCustomAndSfcData.site} {miFindCustomAndSfcData.operation} {miFindCustomAndSfcData.operationRevision} {miFindCustomAndSfcData.resource} {miFindCustomAndSfcData.masterDataArray} {miFindCustomAndSfcData.user} {miFindCustomAndSfcData.activity} {miFindCustomAndSfcData.sfc} {miFindCustomAndSfcData.modeProcessSfc} "; cmdApi(apiName, miFindCustomAndSfcData.sfc, requestContent, opName, apiNameCreateFile, out code, out message); } public static void miCheckSFCStatusEx(string apiName, string opName, MiCheckSFCStatusEx miCheckSFCStatusEx, out string code, out string message) { string apiNameCreateFile = "产品进站:miCheckSFCStatusEx"; string requestContent = $@" {miCheckSFCStatusEx.site} {miCheckSFCStatusEx.operation} {miCheckSFCStatusEx.operationRevision} {miCheckSFCStatusEx.sfc} "; cmdApi(apiName, miCheckSFCStatusEx.sfc, requestContent, opName, apiNameCreateFile, out code, out message); } public static void dataCollectForSfcEx(string apiName, string opName, DataCollectForSfcEx dataCollectForSfcEx, out string code, out string message) { string apiNameCreateFile = "产品出站:dataCollectForSfcEx"; string parametricDataArrayStr = ""; List parametricDataArray = dataCollectForSfcEx.parametricDataArray; for (int i = 0; i < parametricDataArray.Count; i++) { parametricDataArrayStr += $@" {parametricDataArray[i].name} {parametricDataArray[i].value} {parametricDataArray[i].dataType.ToUpper()} "; } string requestContent = $@" {dataCollectForSfcEx.site} {dataCollectForSfcEx.sfc} {dataCollectForSfcEx.dcGroup} {dataCollectForSfcEx.dcGroupRevision} {dataCollectForSfcEx.operation} {dataCollectForSfcEx.operationRevision} {dataCollectForSfcEx.resource} {dataCollectForSfcEx.user} {dataCollectForSfcEx.activityId} {dataCollectForSfcEx.modeProcessSfc} {parametricDataArrayStr} "; cmdApi(apiName, dataCollectForSfcEx.sfc, requestContent, opName, apiNameCreateFile, out code, out message); } public static void dataCollectForMoudleTest(string apiName, string opName, DataCollectForMoudleTest dataCollectForMoudleTest, out string code, out string message) { string apiNameCreateFile = "产品出站:dataCollectForMoudleTest"; string parametricDataArrayStr = ""; List parametricDataArray = dataCollectForMoudleTest.parametricDataArray; for (int i = 0; i < parametricDataArray.Count; i++) { parametricDataArrayStr += $@" {parametricDataArray[i].name} {parametricDataArray[i].value} {parametricDataArray[i].dataType} "; } string requestContent = $@" {dataCollectForMoudleTest.site} {dataCollectForMoudleTest.sfc} {dataCollectForMoudleTest.dcGroup} {dataCollectForMoudleTest.dcGroupRevision} {dataCollectForMoudleTest.operation} {dataCollectForMoudleTest.operationRevision} {dataCollectForMoudleTest.resource} {dataCollectForMoudleTest.user} {dataCollectForMoudleTest.activityId} {dataCollectForMoudleTest.modeProcessSfc} {parametricDataArrayStr} "; cmdApi(apiName, dataCollectForMoudleTest.sfc, requestContent, opName, apiNameCreateFile, out code, out message); } public static void sfcComplete(string apiName, string opName, SfcComplete sfcComplete, out string code, out string message) { string apiNameCreateFile = "产品出站:sfcComplete"; string requestContent = $@" {sfcComplete.site} {sfcComplete.user} {sfcComplete.operation} {sfcComplete.operationRevision} {sfcComplete.resource} {sfcComplete.sfcArray} "; cmdApi(apiName, sfcComplete.sfcArray, requestContent, opName, apiNameCreateFile, out code, out message); } public static void miAssmebleAndCollectDataForSfc(string apiName, string opName, MiAssmebleAndCollectDataForSfc miAssmebleAndCollectDataForSfc, out string code, out string message) { string apiNameCreateFile = "物料装配:miAssmebleAndCollectDataForSfc"; string inventoryArrayStr = ""; List inventoryArray = miAssmebleAndCollectDataForSfc.inventoryArray; for (int i = 0; i < inventoryArray.Count; i++) { string assemblyDataFieldsStr = ""; List assemblyDataFields = inventoryArray[i].assemblyDataFields; for (int j = 0; j < assemblyDataFields.Count; j++) { assemblyDataFieldsStr += $@" {assemblyDataFields[j].attribute} {assemblyDataFields[j].value} "; } inventoryArrayStr += $@" {inventoryArray[i].inventory} {inventoryArray[i].qty} {assemblyDataFieldsStr} "; } string requestContent = $@" {miAssmebleAndCollectDataForSfc.site} {miAssmebleAndCollectDataForSfc.sfc} {miAssmebleAndCollectDataForSfc.operation} {miAssmebleAndCollectDataForSfc.operationRevision} {miAssmebleAndCollectDataForSfc.resource} {miAssmebleAndCollectDataForSfc.user} {miAssmebleAndCollectDataForSfc.activityId} {miAssmebleAndCollectDataForSfc.modeProcessSFC} {miAssmebleAndCollectDataForSfc.partialAssembly} {inventoryArrayStr} "; cmdApi(apiName, miAssmebleAndCollectDataForSfc.sfc, requestContent, opName, apiNameCreateFile, out code, out message); } public static void getAllLabelContents(string apiName, string opName, GetAllLabelContents getAllLabelContents, out string responseContent,out string code, out string message) { string apiNameCreateFile = "获取打印配置:getAllLabelContents"; string requestContent = $@" {getAllLabelContents.site} {getAllLabelContents.sfcList} {getAllLabelContents.item} {getAllLabelContents.languageCode} {getAllLabelContents.Y} {getAllLabelContents.activity} "; cmdApi(apiName, getAllLabelContents.sfcList, requestContent, opName, apiNameCreateFile, out responseContent, out code, out message); } public static void dataCollectForResourceInspect(string apiName, string opName, DataCollectForResourceInspect dataCollectForResourceInspect, out string code, out string message) { string apiNameCreateFile = "首件:dataCollectForResourceInspect"; List parametricDataArray = dataCollectForResourceInspect.parametricDataArray; string parametricDataArrayStr = ""; for (int i = 0; i < parametricDataArray.Count; i++) { parametricDataArrayStr += $@" {parametricDataArray[i].name} {parametricDataArray[i].value} {parametricDataArray[i].dataType} "; } string requestContent = $@" {dataCollectForResourceInspect.site} {dataCollectForResourceInspect.user} {dataCollectForResourceInspect.dcMode} {dataCollectForResourceInspect.executeMode} {dataCollectForResourceInspect.resource} {dataCollectForResourceInspect.operation} {dataCollectForResourceInspect.operationRevision} {dataCollectForResourceInspect.dcGroup} {dataCollectForResourceInspect.dcGroupRevision} {dataCollectForResourceInspect.dcSequence} {parametricDataArrayStr} "; cmdApi(apiName, "", requestContent, opName, apiNameCreateFile, out code, out message); } // 申请条码 返回sfc public static void cmdApi(string apiName, string requestContent, string opName, string apiNameCreateFile, out string code, out string message, out string sfc) { sfc = ""; code = "9999999"; message = "未知错误"; string requestTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); string responseTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); MisDataFun.GetApiAuth(apiName, out string Username, out string Password, out int timeout, out string url, out code, out message); if (code != "0") goto step100; // 创建 WebRequest HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "POST"; request.ContentType = "text/xml"; request.Timeout = timeout; // 设置 Basic 认证头 string authToken = Convert.ToBase64String(Encoding.UTF8.GetBytes($"{Username}:{Password}")); request.Headers.Add("Authorization", "Basic " + authToken); try { // 写入请求体 byte[] requestBytes = Encoding.UTF8.GetBytes(requestContent); request.ContentLength = requestBytes.Length; using (Stream stream = request.GetRequestStream()) { stream.Write(requestBytes, 0, requestBytes.Length); } // 发送请求并获取响应 using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) using (StreamReader reader = new StreamReader(response.GetResponseStream())) { string responseBody = reader.ReadToEnd(); responseTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); XDocument doc = XDocument.Parse(responseBody); foreach (var element in doc.Descendants()) { if (element.Name.LocalName == "code") { code = element.Value; } if (element.Name.LocalName == "message") { message = element.Value; } if (element.Name.LocalName == "sfc") { //sfc.Add(element.Value); sfc = element.Value; } } } } catch (WebException err) { responseTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); if (err.Response != null) { using (var errorResponse = (HttpWebResponse)err.Response) using (var reader = new StreamReader(errorResponse.GetResponseStream())) { message = reader.ReadToEnd(); code = errorResponse.StatusCode.ToString(); } } else { message = err.Message; } } step100: ND_Api.RecordApiLog(apiName,apiNameCreateFile, opName, sfc, requestContent, requestTime, code, message, responseTime); } public static void cmdApi(string apiName, string sfc, string requestContent, string opName, string apiNameCreateFile, out string code, out string message) { code = "9999999"; message = "未知错误"; string requestTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); string responseTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); MisDataFun.GetApiAuth(apiName, out string Username, out string Password, out int timeout, out string url, out code, out message); if (code != "0") goto step100; // 创建 WebRequest HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "POST"; request.ContentType = "text/xml"; request.Timeout = timeout; // 设置 Basic 认证头 string authToken = Convert.ToBase64String(Encoding.UTF8.GetBytes($"{Username}:{Password}")); request.Headers.Add("Authorization", "Basic " + authToken); try { // 写入请求体 byte[] requestBytes = Encoding.UTF8.GetBytes(requestContent); request.ContentLength = requestBytes.Length; using (Stream stream = request.GetRequestStream()) { stream.Write(requestBytes, 0, requestBytes.Length); } // 发送请求并获取响应 using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) using (StreamReader reader = new StreamReader(response.GetResponseStream())) { string responseBody = reader.ReadToEnd(); responseTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); XDocument doc = XDocument.Parse(responseBody); foreach (var element in doc.Descendants()) { if (element.Name.LocalName == "code") { code = element.Value; } if (element.Name.LocalName == "message") { message = element.Value; } } //code = "0"; //message = ""; } } catch (WebException err) { responseTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); if (err.Response != null) { using (var errorResponse = (HttpWebResponse)err.Response) using (var reader = new StreamReader(errorResponse.GetResponseStream())) { code = errorResponse.StatusCode.ToString(); message = reader.ReadToEnd(); } } else { message = err.Message; } } step100: ND_Api.RecordApiLog(apiName,apiNameCreateFile, opName, sfc, requestContent, requestTime, code, message, responseTime); } public static void miCheckBOMInventory(string apiName, string opName, MiCheckBOMInventory miCheckBOMInventory, out string code, out string message) { string apiNameCreateFile = "批次校验:miCheckBOMInventory"; string requestContent = $@" {miCheckBOMInventory.site} {miCheckBOMInventory.operation} {miCheckBOMInventory.operationRevision} {miCheckBOMInventory.resource} {miCheckBOMInventory.user} {miCheckBOMInventory.activity} {miCheckBOMInventory.sfc} {miCheckBOMInventory.modeCheckOperation} {miCheckBOMInventory.inventory} {miCheckBOMInventory.component} "; cmdApi(apiName, miCheckBOMInventory.sfc, requestContent, opName, apiNameCreateFile, out code, out message); } public static void getSfcStatusAndOperation(string apiName, string opName, GetSfcStatusAndOperationParams getSfcStatusAndOperationParams, out string responseContent, out string code, out string message) { string apiNameCreateFile = "产品状态查询:getSfcStatusAndOperation"; string requestContent = $@" {getSfcStatusAndOperationParams.site} {getSfcStatusAndOperationParams.barcode} "; cmdApi(apiName, getSfcStatusAndOperationParams.barcode, requestContent, opName, apiNameCreateFile, out responseContent, out code, out message); } public static void cmdApi(string apiName, string sfc, string requestContent, string opName, string apiNameCreateFile, out string responseContent, out string code, out string message) { code = "9999999"; message = "未知错误"; responseContent = ""; string requestTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); string responseTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); MisDataFun.GetApiAuth(apiName, out string Username, out string Password, out int timeout, out string url, out code, out message); if (code != "0") goto step100; // 创建 WebRequest HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "POST"; request.ContentType = "text/xml"; request.Timeout = timeout; // 设置 Basic 认证头 string authToken = Convert.ToBase64String(Encoding.UTF8.GetBytes($"{Username}:{Password}")); request.Headers.Add("Authorization", "Basic " + authToken); try { // 写入请求体 byte[] requestBytes = Encoding.UTF8.GetBytes(requestContent); request.ContentLength = requestBytes.Length; using (Stream stream = request.GetRequestStream()) { stream.Write(requestBytes, 0, requestBytes.Length); } // 发送请求并获取响应 using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) using (StreamReader reader = new StreamReader(response.GetResponseStream())) { string responseBody = reader.ReadToEnd(); responseTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); XDocument doc = XDocument.Parse(responseBody); foreach (var element in doc.Descendants()) { if (element.Name.LocalName == "code") { code = element.Value; } if (element.Name.LocalName == "message") { message = element.Value; } } responseContent = responseBody; } } catch (WebException err) { responseTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); if (err.Response != null) { using (var errorResponse = (HttpWebResponse)err.Response) using (var reader = new StreamReader(errorResponse.GetResponseStream())) { code = errorResponse.StatusCode.ToString(); message = reader.ReadToEnd(); } } else { message = err.Message; } } step100: ND_Api.RecordApiLog(apiName,apiNameCreateFile, opName, sfc, requestContent, requestTime, code, message, responseTime); } public static void RecordApiLog(string apiName, string apiNameCreateFile, string opName, string sfc, string requestContent, string requestTime, string responseCode, string responseMessage, string responseTime) { var now = DateTime.Now; string path1 = Path.Combine(LocalPath_Log, apiNameCreateFile); string fileName = $"{opName}_log_{now:yyyy-MM-dd}.txt"; string fullPath = Path.Combine(path1, fileName); // 确保目录存在 Directory.CreateDirectory(path1); // 计算耗时(假设时间格式为 yyyy/MM/dd HH:mm:ss.fff) TimeSpan duration = DateTime.Parse(responseTime) - DateTime.Parse(requestTime); string durationStr = $"耗时:{duration.TotalMilliseconds}ms"; // 构建日志内容 StringBuilder logContent = new StringBuilder(); // 添加分隔线(如果不是新文件) if (File.Exists(fullPath)) { logContent.AppendLine(); } logContent.AppendLine($"{requestTime} 开始调用,sfc条码:{sfc}"); logContent.AppendLine($"{requestTime} 开始调用,请求参数:{requestContent}"); logContent.AppendLine($"{responseTime} 调用完成"); logContent.AppendLine($"{responseTime} {durationStr}"); logContent.AppendLine($"{responseTime} 返回代码:{responseCode};返回信息:{responseMessage}"); logContent.AppendLine(new string('-', 50)); // 分隔线 // 写入文件(追加模式) File.AppendAllText(fullPath, logContent.ToString(), Encoding.UTF8); MisDataFun.RecordApiContent(apiName, opName, sfc, requestTime, requestContent, responseTime, duration.TotalMilliseconds.ToString(), responseCode, responseMessage); } } }