11
啊鑫
2025-07-15 5dc3cc86f5835369cd830f2a83318b9a8d69cf69
MESApplication/Controllers/PLM/PLMController.cs
@@ -1,162 +1,160 @@
using ConsoleApp1;
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 System.Dynamic;
using System.IO;
using PdfiumViewer;
using MES.Service.Dto.service;
using System.Drawing;
using System.Collections.Generic;
using System.Threading.Tasks;
using Oracle.ManagedDataAccess.Client;
using Microsoft.Extensions.Configuration;
using System;
using System.Text.RegularExpressions;
using IronSoftware.Drawing;
namespace MESApplication.Controllers.PLM
namespace MESApplication.Controllers.PLM;
[ApiController]
[Route("api/PLM")]
public class PLMController : ControllerBase
{
    [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)
    {
        private readonly PLMManager m = new();
        private readonly WarehouseDownloadDoc wdd = new();
        private readonly IConfiguration _configuration;
        _configuration = configuration;
    } // RetrieveDrawings 调取图纸
        public PLMController(IConfiguration configuration)
    [HttpPost("RetrieveDrawings")]
    public async Task<ResponseResult> RetrieveDrawings(PurchaseInventory dto)
    {
        try
        {
            _configuration = configuration;
        } // RetrieveDrawings 调取图纸
            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);
        [HttpPost("RetrieveDrawings")]
        public async Task<ResponseResult> RetrieveDrawings(PurchaseInventory dto)
            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)
        {
            try
            {
                dynamic resultInfos = new ExpandoObject();
                var retrieveDrawings =
                    m.RetrieveDrawings(dto.ItemNo); // 自定义保存根目录
                // string saveRootDirectory = @"D:\LTSMES\PLM";
                string saveRootDirectory = @"E:\SOPimage";
                string
                    saveDirectory =
                        Path.Combine(saveRootDirectory,
                            dto.ItemNo); // 在循环处理所有 PDF 文件之前,如果该 itemNo 已存在表中,则进行删除操作
                await DeleteRecordsByItemNo(dto.ItemNo);
                // 在循环处理所有 PDF 文件之前,检查并删除旧文件夹(如果存在),然后重新创建
                if (Directory.Exists(saveDirectory))
                {
                    Directory.Delete(saveDirectory, true);
                }
            return ResponseResult.ResponseError(ex);
        }
    } // ✅ 直接保存 PDF,不再转换为图片
                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)
    private async Task<dynamic> SavePdfAsync(FileStreamResult fileStreamResult,
        string saveRootDirectory,
        string itemNo, string cx, string fPhysicalFileName)
    {
        try
        {
            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))
            {
                // 确保目录存在
                string saveDirectory = Path.Combine(saveRootDirectory, itemNo);
                if (!Directory.Exists(saveDirectory))
                {
                    Directory.CreateDirectory(saveDirectory);
                } // 保存 PDF 文件
                string 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 文件)
                string
                    url =
                        $"http://192.168.1.92:89/{itemNo}/{Path.GetFileName(outputFilePath)}"; // 提取文件名中的最后一个'_'到'.pdf'之间的字母数字部分,并加上“工序”前缀
                string extractedNumber = ExtractNumberFromFileName(fPhysicalFileName);
                string
                    process = string.IsNullOrEmpty(extractedNumber)
                        ? string.Empty
                        : $"工序{extractedNumber}"; // ✅ 插入数据库(URL 指向 PDF,并更新工序字段)
                await InsertUrlIntoDatabase(url, itemNo, cx, process);
                return new { PdfFilePath = outputFilePath };
                await fileStreamResult.FileStream.CopyToAsync(fileStream);
            }
            catch (Exception ex)
            {
                Console.WriteLine($"PDF 保存失败: {ex.Message}");
                return new { ErrorMessage = "PDF 保存失败", Exception = ex.Message };
            }
        } // 提取文件名中的最后一个'_'到'.pdf'之间的字母数字部分,忽略括号等内容
        private string ExtractNumberFromFileName(string fileName)
            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)
        {
            // 使用正则表达式提取最后一个'_'到'.pdf'之间的字母数字部分,忽略括号等字符
            var match = Regex.Match(fileName, @"_([A-Za-z0-9]+)(?=\(?\.pdf$)");
            if (match.Success)
            {
                // 如果匹配成功,返回提取的部分
                return match.Groups[1].Value;
            }
            else
            {
                // 如果没有找到符合条件的部分,返回空字符串
                return string.Empty;
            }
        } // 将 URL、itemNo、cx 和工序字段插入到数据库中
            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)
    private async Task InsertUrlIntoDatabase(string url, string itemNo,
        string cx, string gx)
    {
        var connectionString = _configuration["AppSettings:DataBaseConn"];
        using (var connection = new OracleConnection(connectionString))
        {
            string connectionString = _configuration["AppSettings:DataBaseConn"];
            using (OracleConnection 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))
            {
                await connection.OpenAsync();
                string 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 (OracleCommand 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();
                }
                // 使用 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 的记录
        }
    } // 删除指定 itemNo 的记录
        private async Task DeleteRecordsByItemNo(string itemNo)
    private async Task DeleteRecordsByItemNo(string itemNo)
    {
        var connectionString = _configuration["AppSettings:DataBaseConn"];
        using (var connection = new OracleConnection(connectionString))
        {
            string connectionString = _configuration["AppSettings:DataBaseConn"];
            using (OracleConnection 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))
            {
                await connection.OpenAsync();
                string deleteQuery = "DELETE FROM MES_SOP_URL_TABLE WHERE ITEM_NO = :item_no";
                using (OracleCommand deleteCommand = new OracleCommand(deleteQuery, connection))
                {
                    deleteCommand.Parameters.Add("item_no", OracleDbType.Varchar2).Value = itemNo;
                    await deleteCommand.ExecuteNonQueryAsync();
                }
                deleteCommand.Parameters.Add("item_no", OracleDbType.Varchar2)
                    .Value = itemNo;
                await deleteCommand.ExecuteNonQueryAsync();
            }
        }
    }