From a22af1da254b90c79fd3e1433ed98f51c0a39a65 Mon Sep 17 00:00:00 2001
From: sunpengfei <i@angelzzz.com>
Date: 星期五, 19 十二月 2025 18:57:08 +0800
Subject: [PATCH] feat:开发

---
 ApiTools.Core/Utils/NongYePayUtils/NongYePayUtils.cs |  191 +++++++++++++++++++++++++++++------------------
 1 files changed, 118 insertions(+), 73 deletions(-)

diff --git a/ApiTools.Core/Utils/NongYePayUtils/NongYePayUtils.cs b/ApiTools.Core/Utils/NongYePayUtils/NongYePayUtils.cs
index 163b90d..3a7fc7a 100644
--- a/ApiTools.Core/Utils/NongYePayUtils/NongYePayUtils.cs
+++ b/ApiTools.Core/Utils/NongYePayUtils/NongYePayUtils.cs
@@ -4,9 +4,11 @@
 using Azure.Core;
 using Furion;
 using Furion.DatabaseAccessor;
+using Furion.DataEncryption.Extensions;
 using Furion.DependencyInjection;
 using Furion.DistributedIDGenerator;
 using Furion.FriendlyException;
+using Furion.HttpRemote;
 using Microsoft.Extensions.Options;
 using NetTopologySuite.Algorithm;
 using Org.BouncyCastle.Asn1.Ocsp;
@@ -25,10 +27,12 @@
 namespace ApiTools.Core
 {
     public class NongYePayUtils(
+            IHttpRemoteService httpRemoteService,
             IOptions<NongYePayOptions> options,
             IRepository<ThreeResourceLog, LogDbContextLocator> repThreeResourceLog
         ) : ITransient
     {
+        private readonly IHttpRemoteService httpRemoteService = httpRemoteService;
         private readonly IOptions<NongYePayOptions> options = options;
         private readonly IRepository<ThreeResourceLog, LogDbContextLocator> repThreeResourceLog = repThreeResourceLog;
 
@@ -88,74 +92,17 @@
         /// <returns></returns>
         public async Task<NongYePayDownloadEreceiptResponse> DownloadEreceipt(NongYePayDownloadEreceiptRequest request)
         {
-            var response = await Send<NongYePayDownloadEreceiptRequest, NongYePayDownloadEreceiptResponse>(request);
-            if (response != null
-                && response.RespSource == "0"
-                && response.Cmp != null
-                && response.Cmp.BatchFileName.IsNotNull())
-            {
-                response.ZipFileName = $"{options.Value.FilePath}{response.Cmp.BatchFileName}";
-                if (File.Exists(response.ZipFileName))
-                {
-                    using (var archive = ZipFile.OpenRead(response.ZipFileName))
-                    {
-                        foreach (var entry in archive.Entries)
-                        {
-                            if (entry.FullName.EndsWith(".pdf"))
-                            {
-                                using (var stream = entry.Open())
-                                {
-                                    var ms = new MemoryStream();
-                                    stream.CopyTo(ms);
-                                    ms.Position = 0;
-                                    response.Items.Add(new NongYePayDownloadEreceiptResponseItem
-                                    {
-                                        FileName = entry.FullName,
-                                        Stream = ms
-                                    });
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-            return response;
+            return await SendWithZip<NongYePayDownloadEreceiptRequest, NongYePayDownloadEreceiptResponse>(request);
         }
 
+        /// <summary>
+        /// 瀹炴椂涓嬭浇鐢靛瓙鍥炲崟
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
         public async Task<NongYePayRealTimeDownloadEreceiptResponse> RealTimeDownloadEreceipt(NongYePayRealTimeDownloadEreceiptRequest request)
         {
-            var response = await Send<NongYePayRealTimeDownloadEreceiptRequest, NongYePayRealTimeDownloadEreceiptResponse>(request);
-            if (response != null
-                && response.RespSource == "0"
-                && response.Cmp != null
-                && response.Cmp.BatchFileName.IsNotNull())
-            {
-                response.ZipFileName = $"{options.Value.FilePath}{response.Cmp.BatchFileName}";
-                if (File.Exists(response.ZipFileName))
-                {
-                    using (var archive = ZipFile.OpenRead(response.ZipFileName))
-                    {
-                        foreach (var entry in archive.Entries)
-                        {
-                            if (entry.FullName.EndsWith(".pdf"))
-                            {
-                                using (var stream = entry.Open())
-                                {
-                                    var ms = new MemoryStream();
-                                    stream.CopyTo(ms);
-                                    ms.Position = 0;
-                                    response.Items.Add(new NongYePayDownloadEreceiptResponseItem
-                                    {
-                                        FileName = entry.FullName,
-                                        Stream = ms
-                                    });
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-            return response;
+            return await SendWithZip<NongYePayRealTimeDownloadEreceiptRequest, NongYePayRealTimeDownloadEreceiptResponse>(request);
         }
 
         /// <summary>
@@ -228,6 +175,69 @@
             return $"{now:yyyyMMddHHmmssfff}{random}";
         }
 
+        private async Task<List<NongYePayResponseZipFile>> GetZipFiles(NongYePayZipResponse response)
+        {
+            var list = new List<NongYePayResponseZipFile>();
+            if (response != null
+                && response.RespSource == "0"
+                && response.Cmp != null
+                && response.Cmp.BatchFileName.IsNotNull())
+            {
+                var memoryStream = new MemoryStream();
+                if (options.Value.RemoteFileUrl.IsNotNull())
+                {
+                    response.ZipFileName = response.Cmp.BatchFileName;
+                    var url = $"{options.Value.RemoteFileUrl}/api/file/download";
+                    var command = new DownloadFileCommand
+                    {
+                        Scene = "NongYePay",
+                        Path = response.Cmp.BatchFileName
+                    };
+                    var timestamp = DateTime.Now.ToTimeStamp(true);
+                    var sign = $"POST|/api/file/download|{command.ToJson()}|{options.Value.RemoteFilePrivateKey}|{timestamp}".ToMD5Encrypt();
+                    using var stream = await httpRemoteService.PostAsStreamAsync(url,
+                        builder => builder
+                            .SetJsonContent(command)
+                            .WithHeader("x-timestamp", timestamp, replace: true)
+                            .WithHeader("x-sign", sign, replace: true));
+                    stream.CopyTo(memoryStream);
+                    memoryStream.Position = 0;
+                }
+                else if (options.Value.FilePath.IsNotNull())
+                {
+                    response.ZipFileName = $"{options.Value.FilePath}{response.Cmp.BatchFileName}";
+                    if (File.Exists(response.ZipFileName))
+                    {
+                        using var stream = File.OpenRead(response.ZipFileName);
+                        stream.CopyTo(memoryStream);
+                        memoryStream.Position = 0;
+                    }
+                }
+
+                using (var archive = new ZipArchive(memoryStream))
+                {
+                    foreach (var entry in archive.Entries)
+                    {
+                        if (entry.FullName.EndsWith(".pdf"))
+                        {
+                            using (var stream = entry.Open())
+                            {
+                                var ms = new MemoryStream();
+                                stream.CopyTo(ms);
+                                ms.Position = 0;
+                                list.Add(new NongYePayResponseZipFile
+                                {
+                                    FileName = entry.FullName,
+                                    Stream = ms
+                                });
+                            }
+                        }
+                    }
+                }
+            }
+            return list;
+        }
+
         private async Task<List<T>> GetList<T>(NongYePayBaseResponse<T> response, ThreeResourceLog log)
             where T : class, new()
         {
@@ -236,11 +246,37 @@
                 && response.FileFlag == "1"
                 && response.Cmp.BatchFileName.IsNotNull())
             {
-                var fileName = $"{options.Value.FilePath}{response.Cmp.BatchFileName}";
-                if (File.Exists(fileName))
+                var lines = new List<string>();
+                if (options.Value.RemoteFileUrl.IsNotNull())
+                {
+                    var url = $"{options.Value.RemoteFileUrl}/api/file/download";
+                    var command = new DownloadFileCommand
+                    {
+                        Scene = "NongYePay",
+                        Path = response.Cmp.BatchFileName
+                    };
+                    var timestamp = DateTime.Now.ToTimeStamp(true);
+                    var sign = $"POST|/api/file/download|{command.ToJson()}|{options.Value.RemoteFilePrivateKey}|{timestamp}".ToMD5Encrypt();
+                    var buffer = await httpRemoteService.PostAsByteArrayAsync(url,
+                       builder => builder
+                           .SetJsonContent(command)
+                           .WithHeader("x-timestamp", timestamp, replace: true)
+                           .WithHeader("x-sign", sign, replace: true));
+                    var text = Encoding.GetEncoding("GBK").GetString(buffer);
+                    lines = text.Split("\n").Where(it => it.IsNotNull()).ToList();
+                }
+                else if (options.Value.FilePath.IsNotNull())
+                {
+                    var fileName = $"{options.Value.FilePath}{response.Cmp.BatchFileName}";
+                    if (File.Exists(fileName))
+                    {
+                        var array = await File.ReadAllLinesAsync(fileName, Encoding.GetEncoding("GBK"));
+                        lines = array.ToList();
+                    }
+                }
+                if (lines.IsNotNull())
                 {
                     var props = typeof(T).GetProperties();
-                    var lines = await File.ReadAllLinesAsync(fileName, Encoding.GetEncoding("GBK"));
                     foreach (var line in lines)
                     {
                         var item = new T();
@@ -251,12 +287,12 @@
                         }
                         list.Add(item);
                     }
-
-                    log.UpdatedTime = DateTimeOffset.Now;
-                    var json = list.ToJson();
-                    log.Response += $"\n{json}";
-                    await repThreeResourceLog.UpdateNowAsync(log);
                 }
+
+                log.UpdatedTime = DateTimeOffset.Now;
+                var json = list.ToJson();
+                log.Response += $"\n{json}";
+                await repThreeResourceLog.UpdateNowAsync(log);
             }
             return list;
         }
@@ -267,7 +303,16 @@
             where TResponseItem : class, new()
         {
             var response = await SendWithLog<TRequest, TResponse>(request);
-            response.response.Items = await GetList<TResponseItem>(response.response, response.log);
+            response.response.Items = await GetList(response.response, response.log);
+            return response.response;
+        }
+
+        private async Task<TResponse> SendWithZip<TRequest, TResponse>(TRequest request)
+            where TRequest : NongYePayBaseRequest
+            where TResponse : NongYePayZipResponse, new()
+        {
+            var response = await SendWithLog<TRequest, TResponse>(request);
+            response.response.Items = await GetZipFiles(response.response);
             return response.response;
         }
 

--
Gitblit v1.10.0