using System.Dynamic; using System.Text.RegularExpressions; using MES.Service.Dto.service; using MES.Service.service.PLM; using MES.Service.util; using Microsoft.AspNetCore.Mvc; using Oracle.ManagedDataAccess.Client; namespace MESApplication.Controllers.PLM; [ApiController] [Route("api/PLM")] public class PLMController : ControllerBase { private readonly IConfiguration _configuration; private readonly PLMManager m = new(); private readonly WarehouseDownloadDoc wdd = new(); public PLMController(IConfiguration configuration) { _configuration = configuration; } // RetrieveDrawings 调取图纸 [HttpPost("RetrieveDrawings")] public async Task RetrieveDrawings(PurchaseInventory dto) { try { dynamic resultInfos = new ExpandoObject(); var retrieveDrawings = m.RetrieveDrawings(dto.ItemNo); // 自定义保存根目录 // string saveRootDirectory = @"D:\LTSMES\PLM"; var saveRootDirectory = @"E:\SOPimage"; var saveDirectory = Path.Combine(saveRootDirectory, dto.ItemNo); // 在循环处理所有 PDF 文件之前,如果该 itemNo 已存在表中,则进行删除操作 await DeleteRecordsByItemNo(dto.ItemNo); // 在循环处理所有 PDF 文件之前,检查并删除旧文件夹(如果存在),然后重新创建 if (Directory.Exists(saveDirectory)) Directory.Delete(saveDirectory, true); Directory.CreateDirectory(saveDirectory); foreach (var retrieveDrawing in retrieveDrawings) { var streamFile = wdd.SendRequest("Download", retrieveDrawing.FRelevantObject); var fileStreamResult = File(streamFile, "application/octet-stream", retrieveDrawing.FName); var saveResult = await SavePdfAsync(fileStreamResult, saveRootDirectory, dto.ItemNo, dto.Cx, retrieveDrawing.FName); } return new ResponseResult { status = 0, message = "OK", data = resultInfos }; } catch (Exception ex) { return ResponseResult.ResponseError(ex); } } // ✅ 直接保存 PDF,不再转换为图片 private async Task SavePdfAsync(FileStreamResult fileStreamResult, string saveRootDirectory, string itemNo, string cx, string fPhysicalFileName) { try { // 确保目录存在 var saveDirectory = Path.Combine(saveRootDirectory, itemNo); if (!Directory.Exists(saveDirectory)) Directory.CreateDirectory(saveDirectory); // 保存 PDF 文件 var outputFilePath = Path.Combine(saveDirectory, $"{Path.GetFileNameWithoutExtension(fPhysicalFileName)}.pdf"); using (var fileStream = new FileStream(outputFilePath, FileMode.Create, FileAccess.Write)) { await fileStreamResult.FileStream.CopyToAsync(fileStream); } Console.WriteLine( $"PDF 文件已保存: {outputFilePath}"); // 生成新的 URL(指向 PDF 文件) var url = $"http://192.168.1.92:89/{itemNo}/{Path.GetFileName(outputFilePath)}"; // 提取文件名中的最后一个'_'到'.pdf'之间的字母数字部分,并加上“工序”前缀 var extractedNumber = ExtractNumberFromFileName(fPhysicalFileName); var process = string.IsNullOrEmpty(extractedNumber) ? string.Empty : $"工序{extractedNumber}"; // ✅ 插入数据库(URL 指向 PDF,并更新工序字段) await InsertUrlIntoDatabase(url, itemNo, cx, process); return new { PdfFilePath = outputFilePath }; } catch (Exception ex) { Console.WriteLine($"PDF 保存失败: {ex.Message}"); return new { ErrorMessage = "PDF 保存失败", Exception = ex.Message }; } } // 提取文件名中的最后一个'_'到'.pdf'之间的字母数字部分,忽略括号等内容 private string ExtractNumberFromFileName(string fileName) { // 使用正则表达式提取最后一个'_'到'.pdf'之间的字母数字部分,忽略括号等字符 var match = Regex.Match(fileName, @"_([A-Za-z0-9]+)(?=\(?\.pdf$)"); if (match.Success) // 如果匹配成功,返回提取的部分 return match.Groups[1].Value; // 如果没有找到符合条件的部分,返回空字符串 return string.Empty; } // 将 URL、itemNo、cx 和工序字段插入到数据库中 private async Task InsertUrlIntoDatabase(string url, string itemNo, string cx, string gx) { var connectionString = _configuration["AppSettings:DataBaseConn"]; using (var connection = new OracleConnection(connectionString)) { await connection.OpenAsync(); var insertQuery = "INSERT INTO MES_SOP_URL_TABLE (id, URL, ITEM_NO, CX, GX, CREATE_DATE) VALUES (SEQ_SOP_URL.NEXTVAL, :url, :item_no, :cx, :gx, :create_date)"; using (var insertCommand = new OracleCommand(insertQuery, connection)) { // 使用 Parameters.Add 方法添加参数 insertCommand.Parameters.Add("url", OracleDbType.Varchar2) .Value = url; insertCommand.Parameters.Add("item_no", OracleDbType.Varchar2) .Value = itemNo; insertCommand.Parameters.Add("cx", OracleDbType.Varchar2) .Value = cx; insertCommand.Parameters.Add("gx", OracleDbType.Varchar2) .Value = gx; insertCommand.Parameters.Add("create_date", OracleDbType.Date) .Value = DateTime.Now; await insertCommand.ExecuteNonQueryAsync(); } } } // 删除指定 itemNo 的记录 private async Task DeleteRecordsByItemNo(string itemNo) { var connectionString = _configuration["AppSettings:DataBaseConn"]; using (var connection = new OracleConnection(connectionString)) { await connection.OpenAsync(); var deleteQuery = "DELETE FROM MES_SOP_URL_TABLE WHERE ITEM_NO = :item_no"; using (var deleteCommand = new OracleCommand(deleteQuery, connection)) { deleteCommand.Parameters.Add("item_no", OracleDbType.Varchar2) .Value = itemNo; await deleteCommand.ExecuteNonQueryAsync(); } } } }