You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

185 lines
6.8 KiB
C#

using Furion;
using Furion.FriendlyException;
using Furion.JsonSerialization;
using Furion.Logging;
using Furion.RemoteRequest.Extensions;
using Microsoft.Extensions.Logging;
using Myshipping.Application.ConfigOption;
using Myshipping.Application.Entity;
using Myshipping.Application.Enum;
using Myshipping.Core;
using Newtonsoft.Json.Linq;
using NPOI.HPSF;
using Org.BouncyCastle.Asn1.X500;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using static System.Net.WebRequestMethods;
namespace Myshipping.Application
{
public static class PrintHelper
{
/// <summary>
/// 生成打印文件
/// </summary>
/// <param name="busiJson">业务详情JSON</param>
/// <param name="reportUrl">请求生成URL</param>
/// <param name="dataSourceKey">数据源Key</param>
/// <param name="printFileType">文档类型</param>
/// <param name="printTemplate">文档模板</param>
/// <returns>返回文件二进制</returns>
public static async Task<byte[]> GeneratePrintFile(string busiJson,string reportUrl, string dataSourceKey,
PrintFileTypeEnum printFileType,
BookingPrintTemplate printTemplate)
{
var logger = Log.CreateLogger(nameof(PrintHelper));
var opt = App.GetOptions<PrintTemplateOptions>();
var dirAbs = opt.basePath;
if (string.IsNullOrEmpty(dirAbs))
{
dirAbs = App.WebHostEnvironment.WebRootPath;
}
//根据部署环境选择替换文件路径
var fileAbsPath = Path.Combine(dirAbs, printTemplate.FilePath);
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{
fileAbsPath = fileAbsPath.Replace("\\", "/");
}
else
{
fileAbsPath = fileAbsPath.Replace("/", "\\");
}
if (!System.IO.File.Exists(fileAbsPath))
{
logger.LogInformation("模板文件不存在 path={path}", fileAbsPath);
throw Oops.Bah("模板文件不存在");
}
System.IO.FileStream file = new System.IO.FileStream(fileAbsPath, FileMode.Open, FileAccess.Read);
int SplitSize = 5242880;//5M分片长度
int index = 1; //序号 第几片
long StartPosition = 5242880 * (index - 1);
long lastLens = file.Length - StartPosition;//真不知道怎么起命了,就这样吧
if (lastLens < 5242880)
{
SplitSize = (int)lastLens;
}
byte[] heByte = new byte[SplitSize];
file.Seek(StartPosition, SeekOrigin.Begin);
//第一个参数是 起始位置
file.Read(heByte, 0, SplitSize);
//第三个参数是 读取长度(剩余长度)
file.Close();
NameValueCollection par = new NameValueCollection();
par.Add("printType", printFileType.ToString().ToLower());
par.Add($"dataJson{dataSourceKey}", busiJson);
var genUrl = $"{reportUrl}Report/PrintReport";
var rtn = TransmitFile(genUrl, par, new {
file = "file",
fileName = printTemplate.FileName,
fileBytes = heByte
});
var jobjRtn = JObject.Parse(rtn);
logger.LogInformation($"调用报表生成返回:{rtn}");
if (jobjRtn.GetBooleanValue("Success"))
{
//调用读取文件
var fn = jobjRtn.GetStringValue("Data");
//logger.LogInformation($"准备调用读取报表文件id{bookingId},文件名:{fn}");
var readFileUrl = $"{reportUrl}Report/GetFile?fileName={fn}";
var bs = await readFileUrl.GetAsByteArrayAsync();
logger.LogInformation($"调用读取报表文件返回:{bs.Length}");
return bs;
}
else
{
throw Oops.Bah($"生成报表文件失败:{jobjRtn.GetStringValue("Message")}");
}
}
#region 请求打印生成文件
/// <summary>
/// 请求打印生成文件
/// </summary>
/// <param name="requestUrl">请求接口地址</param>
/// <param name="nameValueCollection">键值对参数</param>
/// <param name="fileInfo">文件信息</param>
/// <param name="contentType">默认 application/json</param>
/// <returns>返回结果</returns>
public static string TransmitFile(string requestUrl, NameValueCollection nameValueCollection, dynamic fileInfo,
string contentType = "application/json")
{
var result = string.Empty;
using (var httpClient = new HttpClient())
{
try
{
using (var reduceAttach = new MultipartFormDataContent())
{
string[] allKeys = nameValueCollection.AllKeys;
foreach (string key in allKeys)
{
var dataContent = new ByteArrayContent(Encoding.UTF8.GetBytes(nameValueCollection[key]));
dataContent.Headers.ContentDisposition = new ContentDispositionHeaderValue($"form-data")
{
Name = key
};
reduceAttach.Add(dataContent);
}
#region 文件参数
if (fileInfo != null)
{
var Content = new ByteArrayContent(fileInfo.fileBytes);
Content.Headers.Add("Content-Type", contentType);
reduceAttach.Add(Content, fileInfo.file.ToString(), HttpUtility.UrlEncode(fileInfo.fileName.ToString()));
}
#endregion
//请求
var response = httpClient.PostAsync(requestUrl, reduceAttach).Result;
result = response.Content.ReadAsStringAsync().Result;
}
}
catch (Exception ex)
{
result = JSON.Serialize(new
{
message = $"{nameof(TransmitFile)} 请求打印生成文件异常,原因:{ex.Message}",
status = 0
});
}
}
return result;
}
#endregion
}
}