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; } } } }