using System;
using System.Collections.Generic;
using System.IO;
using WMS.Info;
using System.Data;
using WMS.Util;
using Microsoft.AspNetCore.Mvc;
namespace WMS.Core
{
///
/// 描 述:附件管理
///
public class AnnexesFileCore
{
/*缓存文件分片信息*/
private string cacheKey = "AnnexesFile";
///
/// 保存附件(支持大文件分片传输)
///
/// 文件主键
/// 文件名称
/// 文件总共分多少片
/// 文件二进制流
///
//public static string SaveAnnexes(string fileGuid, string fileName, int chunks, UserInfo userInfo)
//{
// try
// {
// //获取文件完整文件名(包含绝对路径)
// //文件存放路径格式:/Resource/ResourceFile/{userId}/{date}/{guid}.{后缀名}
// string filePath = "C:/";//Config.GetValue("AnnexesFile");
// string uploadDate = DateTime.Now.ToString("yyyyMMdd");
// string FileEextension = Path.GetExtension(fileName);
// string virtualPath = string.Format("{0}/{1}/{3}{4}", filePath, uploadDate, fileGuid, FileEextension);
// // string virtualPath = string.Format("{0}/{1}/{2}/{3}{4}", filePath, userInfo.userId, uploadDate, fileGuid, FileEextension);
// //创建文件夹
// string path = Path.GetDirectoryName(virtualPath);
// Directory.CreateDirectory(path);
// //AnnexesFileEntity fileAnnexesEntity = new AnnexesFileEntity();
// if (!System.IO.File.Exists(virtualPath))
// {
// long filesize = SaveAnnexesToFile(fileGuid, virtualPath, chunks);
// if (filesize == -1)// 表示保存失败
// {
// RemoveChunkAnnexes(fileGuid, chunks);
// return "";
// }
// }
// return virtualPath;
// }
// catch (Exception ex)
// {
// throw ex;
// }
//}
///
/// 保存附件到文件中
///
/// 文件主键
/// 文件路径
/// 总共分片数
/// 文件二进制流
/// -1:表示保存失败
public long SaveAnnexesToFile(string fileGuid, string filePath, int chunks)
{
try
{
long filesize = 0;
//创建一个FileInfo对象
FileInfo file = new FileInfo(filePath);
//创建文件
FileStream fs = file.Create();
for (int i = 0; i < chunks; i++)
{
byte[] bufferByRedis = RedisCache.Read(cacheKey + i + "_" + fileGuid, ERedisCacheNo.System);
if (bufferByRedis == null)
{
return -1;
}
//写入二进制流
fs.Write(bufferByRedis, 0, bufferByRedis.Length);
filesize += bufferByRedis.Length;
RedisCache.Remove(cacheKey + i + "_" + fileGuid, ERedisCacheNo.System);
}
//关闭文件流
fs.Close();
return filesize;
}
catch (Exception ex)
{
throw ex;
}
}
///
/// 保存附件到文件中
///
/// 文件主键
/// 文件路径
/// 总共分片数
/// 文件二进制流
/// -1:表示保存失败
public DataTable SaveAnnexesToDataTable(string fileGuid, string ext, int chunks)
{
try
{
MemoryStream ms = new MemoryStream();
for (int i = 0; i < chunks; i++)
{
byte[] bufferByRedis = RedisCache.Read(cacheKey + i + "_" + fileGuid, ERedisCacheNo.System);
if (bufferByRedis == null)
{
throw SysExCore.ThrowFailException("传输失败");
}
//写入二进制流
ms.Write(bufferByRedis, 0, bufferByRedis.Length);
RedisCache.Remove(cacheKey + i + "_" + fileGuid, ERedisCacheNo.System);
}
return ExcelHelper.ExcelImport(ms, "." + ext);
}
catch (Exception ex)
{
throw new Exception("无法识别的文件");
}
}
///
/// 保存错误文件保存到缓冲中
///
public void SaveErrJsonExecl(string fileGuid, JsonExecl jsonExecl)
{
try
{
RedisCache.Remove(cacheKey + "Err" + fileGuid, ERedisCacheNo.System);
string jsonstring = jsonExecl.ToJson();
RedisCache.Write(cacheKey + "Err" + fileGuid, jsonstring, DateTime.Now.AddMinutes(5), ERedisCacheNo.System);
}
catch (Exception ex)
{
throw ex;
}
}
///
/// 下载错误文件
///
public void DownErrJsonExecl(string fileGuid,string FileName)
{
try
{
var jsone = RedisCache.Read(cacheKey + "Err" + fileGuid, ERedisCacheNo.System);
if (jsone != null)
{
JsonExecl je = jsone.ToObject();
je.ExeclCfg.FileName = FileName;
ExcelHelper.ExcelDownload(je.dtSou, je.ExeclCfg);
}
}
catch (Exception ex)
{
throw ex;
}
}
///
/// 保存分片附件
///
/// 文件主键
/// 分片文件序号
/// 文件流
public void SaveChunkAnnexes(string fileGuid, int chunk, Stream fileStream)
{
try
{
byte[] bytes = new byte[fileStream.Length];
fileStream.Read(bytes, 0, bytes.Length);
RedisCache.Write(cacheKey + chunk + "_" + fileGuid, bytes, ERedisCacheNo.System);
}
catch (Exception ex)
{
throw ex;
}
}
///
/// 下载Exel模板
///
public FileStreamResult DownSchemeFile(int bustype)
{
try
{
BASE_IMPORTRELATIONSHIP item = null;
if (bustype == 0)
throw SysExCore.ThrowFailException("单据类型异常");
else if (bustype > 0)
// 获取参数配置
item = SysDbCore.GetDbCtx().Queryable().Where(v => v.BUSINSERTVAL == bustype).First();
else if (bustype == -1 || bustype == -2)
{
bustype = 7; // PO收货单(中)
if (bustype == -1)
item = SysDbCore.GetDbCtx().Queryable().Where(v => v.F_NO == "9").First();
else // PO收货单(英)
item = SysDbCore.GetDbCtx().Queryable().Where(v => v.F_NO == "51").First(); ;
}
else
{
throw SysExCore.ThrowFailException("未识别的单据类型");
}
//item = SysDbCore.GetDbCtx().Queryable().Where(it => it.BUSINSERTVAL == bustype).First();
if (item == null)
{
throw SysExCore.ThrowFailException("未找到Excel模板配置值。");
}
byte[] bytes = RedisCache.Read(cacheKey + "_Scheme_" + bustype, ERedisCacheNo.System);
if (bytes == null || bytes.Length == 0)
{
string s = FileDownUtil.MapPathFile("\\Content\\ExeclScheme\\" + item.BUSINESSTYPE + ".xlsx");
bytes = File.ReadAllBytes(s);
RedisCache.Write(cacheKey + "_Scheme_" + bustype, bytes, ERedisCacheNo.System);
}
MemoryStream ms = new MemoryStream();
ms.Write(bytes, 0, bytes.Length);
return ExcelHelper.ExcelDownload(ms, item.BUSINESSTYPE + ".xlsx");
}
catch (Exception ex)
{
throw ex;
}
}
///
/// 移除文件分片数据
///
/// 文件主键
/// 文件分片数
public void RemoveChunkAnnexes(string fileGuid, int chunks)
{
try
{
for (int i = 0; i < chunks; i++)
{
RedisCache.Remove(cacheKey + i + "_" + fileGuid, ERedisCacheNo.System);
}
}
catch (Exception ex)
{
throw ex;
}
}
}
}