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<ResponseResult> 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<dynamic> 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();
|
}
|
}
|
}
|
}
|