diff --git a/Myshipping.Application/Entity/TaskManagePlat/TaskOriginalDownloadHisInfo.cs b/Myshipping.Application/Entity/TaskManagePlat/TaskOriginalDownloadHisInfo.cs new file mode 100644 index 00000000..b1b35e25 --- /dev/null +++ b/Myshipping.Application/Entity/TaskManagePlat/TaskOriginalDownloadHisInfo.cs @@ -0,0 +1,87 @@ +using SqlSugar; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Myshipping.Application +{ + [Tenant("taskmanage")] + [SugarTable("task_original_download_his")] + [Description("任务正本下载运行表")] + public class TaskOriginalDownloadHisInfo + { + /// + /// 惟一主键 + /// + [SugarColumn(ColumnDescription = "惟一主键", IsPrimaryKey = true)] + public string PK_ID { get; set; } + + /// + /// 任务主键 + /// + public string TASK_ID { get; set; } + + /// + /// 状态 succ-成功 failure-失败 timeout-超时 + /// + public string STATUS { get; set; } + + /// + /// 起始时间 + /// + public Nullable START_DATE { get; set; } + + /// + /// 结束时间 + /// + public Nullable END_DATE { get; set; } + + /// + /// 请求文件URL + /// + public string REQUEST_URL { get; set; } + + /// + /// 下载完文件URL + /// + public string RESULT_URL { get; set; } + + /// + /// 处理结果 + /// + public string RESULT_NOTE { get; set; } + + /// + /// 是否超时 1-超时 0-未超时 + /// + public int IS_TIMEOUT { get; set; } + + /// + /// 创建人ID + /// + public long CreatedUserId { get; set; } + + /// + /// 创建人名称 + /// + public string CreatedUserName { get; set; } + + /// + /// 租户id + /// + public long? TenantId { get; set; } + + /// + /// 租户名称 + /// + public string TenantName { get; set; } + + /// + /// 软删除 + /// + public bool IsDeleted { get; set; } = false; + } +} diff --git a/Myshipping.Application/Myshipping.Application.xml b/Myshipping.Application/Myshipping.Application.xml index 273f8c24..e2f0c7e5 100644 --- a/Myshipping.Application/Myshipping.Application.xml +++ b/Myshipping.Application/Myshipping.Application.xml @@ -4421,6 +4421,76 @@ 品名分类名称 + + + 惟一主键 + + + + + 任务主键 + + + + + 状态 succ-成功 failure-失败 timeout-超时 + + + + + 起始时间 + + + + + 结束时间 + + + + + 请求文件URL + + + + + 下载完文件URL + + + + + 处理结果 + + + + + 是否超时 1-超时 0-未超时 + + + + + 创建人ID + + + + + 创建人名称 + + + + + 租户id + + + + + 租户名称 + + + + + 软删除 + + 收发通模板类型 @@ -6027,16 +6097,25 @@ - 生成报表文件 + 生成报表文件(准备作废) 类型,1:pdf、2:xlsx、3:docx 报表类型代码,例如fangcang、samplebill等 + + + 生成打印报表文件 + + 订舱ID + 打印模板 + 类型,1:pdf、2:xlsx、3:docx + + - 打印 + 打印(准备作废,使用PrintOrder代替) 订舱Id 打印类型代码,对应字典booking_template_type @@ -6050,12 +6129,13 @@ 文件名 - + - 打印(可浏览器预览) + 打印(返回文件名) 订舱Id - 打印类型代码,对应字典booking_template_type + 打印模板ID + 类型,1:pdf、2:xlsx、3:docx @@ -9785,21 +9865,25 @@ 主键 + 358942162968645 合约号编号 + TAO21A00759 合约号名称 + 测试1 合约号备注 + 测试1 @@ -9948,6 +10032,163 @@ 修改者名称 + + + 约号台账查询 + + + + + 合约号编号 + + + + + 合约号名称 + + + + + 合约号备注 + + + + + 创建者名称 + + + + + + 修改者名称 + + + + + + 创建时间开始 + + 2022-01-01 + + + + 创建时间结束 + + 2023-07-01 + + + + 更新时间开始 + + + + + + 更新时间结束 + + + + + + 当前页码 + + 1 + + + + 页码容量 + + 20 + + + + 排序字段 + + ContractNo + + + + 排序方法,默认降序 + + true + + + + 品名分类参数台账查询 + + + + + 品名分类 + + 02 + + + + 品名分类名称 + + + + + + 创建者名称 + + + + + + 修改者名称 + + + + + + 创建时间开始 + + 2022-01-01 + + + + 创建时间结束 + + 2023-07-01 + + + + 更新时间开始 + + + + + + 更新时间结束 + + + + + + 当前页码 + + 1 + + + + 页码容量 + + 20 + + + + 排序字段 + + GoodsCategory + + + + 排序方法,默认降序 + + true + 品名参数台账查询 @@ -10069,6 +10310,7 @@ 检索品名参数 检索值 + 默认最大行数 返回回执 @@ -10078,6 +10320,78 @@ 品名参数台账查询请求 返回结果 + + + 保存品名分类参数 + + 品名分类参数 + 返回回执 + + + + 主键获取品名分类参数 + + 品名分类主键 + 返回回执 + + + + 检索品名分类参数 + + 检索值 + 默认最大行数 + 返回回执 + + + + 作废品名分类参数 + + 品名分类参数主键数组 + 返回回执 + + + + 品名分类参数台账查询 + + 品名分类参数台账查询请求 + 返回结果 + + + + 保存约号参数 + + 约号参数 + 返回回执 + + + + 主键获取约号参数 + + 约号主键 + 返回回执 + + + + 检索约号参数 + + 检索值 + 默认最大行数 + 返回回执 + + + + 作废约号参数 + + 约号参数主键数组 + 返回回执 + + + + 约号参数台账查询 + + 约号参数台账查询请求 + 返回结果 + 订舱业务参数 @@ -10119,6 +10433,78 @@ 品名参数台账查询请求 返回结果 + + + 保存品名分类参数 + + 品名分类参数 + 返回回执 + + + + 主键获取品名分类参数 + + 品名分类主键 + 返回回执 + + + + 检索品名分类参数 + + 检索值 + 默认最大行数 + 返回回执 + + + + 作废品名分类参数 + + 品名分类参数主键数组 + 返回回执 + + + + 品名分类参数台账查询 + + 品名分类参数台账查询请求 + 返回结果 + + + + 保存约号参数 + + 约号参数 + 返回回执 + + + + 主键获取约号参数 + + 约号主键 + 返回回执 + + + + 检索约号参数 + + 检索值 + 默认最大行数 + 返回回执 + + + + 作废约号参数 + + 约号参数主键数组 + 返回回执 + + + + 约号参数台账查询 + + 约号参数台账查询请求 + 返回结果 + 件数 @@ -12222,6 +12608,13 @@ 任务台账查询请求 返回结果 + + + 下载正本提单 + + 任务主键数组 + 返回结果 + 任务管理 @@ -12263,5 +12656,12 @@ 任务台账查询请求 返回结果 + + + 下载正本提单(可批量) + + 任务主键数组 + 返回结果 + diff --git a/Myshipping.Application/Service/BookingOrder/BookingOrderService.cs b/Myshipping.Application/Service/BookingOrder/BookingOrderService.cs index a94fd2d7..5b78a5e4 100644 --- a/Myshipping.Application/Service/BookingOrder/BookingOrderService.cs +++ b/Myshipping.Application/Service/BookingOrder/BookingOrderService.cs @@ -368,7 +368,7 @@ namespace Myshipping.Application var groupList = input.ctnInputs.Where(x => x.CTNNUM > 0).GroupBy(c => c.CTNALL).Select(g => $"{g.Key}*{g.Sum(gg => gg.CTNNUM)}"); input.CNTRTOTAL = string.Join(" / ", groupList); } - var et = await _rep.Where(x => x.MBLNO == input.MBLNO && x.TenantId == UserManager.TENANT_ID&&x.ParentId==0).FirstAsync(); + var et = await _rep.Where(x => x.MBLNO == input.MBLNO && x.TenantId == UserManager.TENANT_ID && x.ParentId == 0).FirstAsync(); if (et != null) { @@ -483,7 +483,7 @@ namespace Myshipping.Application } var main = await _rep.AsQueryable().Where(x => x.Id == input.Id).FirstAsync(); - var et = await _rep.Where(x => x.MBLNO == input.MBLNO && x.TenantId == UserManager.TENANT_ID && x.Id != input.Id&& x.ParentId == 0).FirstAsync(); + var et = await _rep.Where(x => x.MBLNO == input.MBLNO && x.TenantId == UserManager.TENANT_ID && x.Id != input.Id && x.ParentId == 0).FirstAsync(); if (et != null) { @@ -933,7 +933,8 @@ namespace Myshipping.Application } _logger.LogInformation("调用运踪接口提单号:" + item.MBLNO + " 调用运踪接口"); - if (item.isBook&&(string.IsNullOrWhiteSpace(item.CARRIERID)|| string.IsNullOrWhiteSpace(item.CARRIER) || string.IsNullOrWhiteSpace(item.MBLNO))) { + if (item.isBook && (string.IsNullOrWhiteSpace(item.CARRIERID) || string.IsNullOrWhiteSpace(item.CARRIER) || string.IsNullOrWhiteSpace(item.MBLNO))) + { throw Oops.Bah("订阅目的港船公司或提单号不能为空!"); } billTraceList.Add(new BillTraceList @@ -1372,7 +1373,7 @@ namespace Myshipping.Application } /// - /// 获取放舱pdf + /// 获取放舱pdf(准备作废,后期使用打印相关接口) /// /// /// 类型,1:pdf、2:xlsx、3:docx @@ -1412,7 +1413,7 @@ namespace Myshipping.Application } /// - /// 获取放舱excel + /// 获取放舱excel(准备作废,后期使用打印相关接口) /// /// /// @@ -1431,7 +1432,7 @@ namespace Myshipping.Application } /// - /// 生成报表文件 + /// 生成报表文件(准备作废) /// /// /// 类型,1:pdf、2:xlsx、3:docx @@ -1501,11 +1502,75 @@ namespace Myshipping.Application } } + /// + /// 生成打印报表文件 + /// + /// 订舱ID + /// 打印模板 + /// 类型,1:pdf、2:xlsx、3:docx + /// + [NonAction] + private async Task GenPrintFile(long bookingId, BookingPrintTemplate printTemplate, int type = 1) + { + //打印报表服务地址 + var reportUrl = _cache.GetAllDictData().Result.FirstOrDefault(x => x.TypeCode == "url_set" && x.Code == "url_report_generate").Value; + if (!reportUrl.EndsWith("/")) + { + reportUrl += "/"; + } + + //订舱数据 + var order = _rep.FirstOrDefault(x => x.Id == bookingId); + if (order == null) + { + throw Oops.Bah(BookingErrorCode.BOOK001); + } + + var opt = App.GetOptions(); + var dirAbs = opt.basePath; + if (string.IsNullOrEmpty(dirAbs)) + { + dirAbs = App.WebHostEnvironment.WebRootPath; + } + + var fileAbsPath = Path.Combine(dirAbs, printTemplate.FilePath); + _logger.LogInformation($"查找模板文件:{fileAbsPath}"); + if (!File.Exists(fileAbsPath)) + { + throw Oops.Bah(BookingErrorCode.BOOK115); + } + + _logger.LogInformation($"准备调用报表生成:id:{bookingId},文件:{printTemplate.FileName}"); + var genUrl = $"{reportUrl}Report/BookingReport?bookingId={bookingId}&type={type}"; + var rtn = await genUrl + .SetContentType("multipart/form-data") + .SetBodyBytes(("file", File.ReadAllBytes(fileAbsPath), HttpUtility.UrlEncode(printTemplate.FileName, Encoding.GetEncoding("UTF-8")))) + .PostAsStringAsync(); + 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")}"); + } + } + #endregion #region 打印 /// - /// 打印 + /// 打印(准备作废,使用PrintOrder代替) /// /// 订舱Id /// 打印类型代码,对应字典booking_template_type @@ -1589,16 +1654,40 @@ namespace Myshipping.Application } /// - /// 打印(可浏览器预览) + /// 打印(返回文件名) /// /// 订舱Id - /// 打印类型代码,对应字典booking_template_type + /// 打印模板ID + /// 类型,1:pdf、2:xlsx、3:docx /// - [HttpGet("/BookingOrder/PrintWithView")] - public async Task PrintWithView(long bookingId, string typeCode) + [HttpGet("/BookingOrder/PrintOrder")] + public async Task PrintOrder(long bookingId, long templateId, int type = 1) { - var bs = await GetReportFile(bookingId, typeCode); - var fileName = HttpUtility.UrlEncode($"{bookingId}_{DateTime.Now.Ticks}.pdf", Encoding.GetEncoding("UTF-8"));//名称 + var printTemplate = await _repPrintTemplate.AsQueryable().Filter(null, true).FirstAsync(x => x.Id == templateId); + if (printTemplate == null) + { + throw Oops.Bah(BookingErrorCode.BOOK115); + } + + var bs = await GenPrintFile(bookingId, printTemplate, type); + var fileType = ""; + if (type == 1) + { + fileType = ".pdf"; + } + else if (type == 2) + { + fileType = ".xlsx"; + } + else if (type == 3) + { + fileType = ".docx"; + } + else + { + throw Oops.Bah("类型参数不正确"); + } + var fileName = HttpUtility.UrlEncode($"{bookingId}_{DateTime.Now.Ticks}{fileType}", Encoding.GetEncoding("UTF-8"));//名称 var opt = App.GetOptions().Path; var serverpath = Path.Combine(App.WebHostEnvironment.WebRootPath, opt);//服务器路径 if (!Directory.Exists(serverpath)) @@ -1607,33 +1696,73 @@ namespace Myshipping.Application } var fullPath = Path.Combine(serverpath, fileName); await File.WriteAllBytesAsync(fullPath, bs); - var vid = Guid.NewGuid().ToString().Replace("-", ""); - await _cache.SetTimeoutAsync(vid, fullPath, TimeSpan.FromSeconds(300)); - return vid; + + //记录打印次数和时间,用于前端动态展示常用的打印类型 + var printRecentListKey = $"{PrintRecentListTypeKey}_{printTemplate.CateCode}"; + var usrCfg = _repUserConfig.AsQueryable().First(x => x.CreatedUserId == UserManager.UserId && x.Type == printRecentListKey); + if (usrCfg == null) + { + usrCfg = new DjyUserConfig(); + usrCfg.Type = printRecentListKey; + usrCfg.ConfigJson = (new long[] { templateId }).ToJson(); + await _repUserConfig.InsertAsync(usrCfg); + } + else + { + var arr = JArray.Parse(usrCfg.ConfigJson).Select(x => Convert.ToInt64(x)).Where(x => x != templateId).ToList(); + arr.Insert(0, templateId); + usrCfg.ConfigJson = arr.ToArray().ToJson(); + await _repUserConfig.UpdateAsync(usrCfg); + } + + + return fileName; } + ///// + ///// 下载打印文件(PDF直接预览) + ///// + ///// 查看ID + ///// + //[HttpGet("/BookingOrder/ViewPrintPdf/{vid}"), AllowAnonymous] + //public void ViewPrintPdf(string vid) + //{ + // if (_cache.Exists(vid)) + // { + // var fileFullName = _cache.Get(vid); + // var readMem = new ReadOnlyMemory(File.ReadAllBytes(fileFullName)); + // _httpContextAccessor.HttpContext.Response.BodyWriter.WriteAsync(readMem); + // } + // else + // { + // throw Oops.Bah("下载链接失效,请重新打印"); + // } + //} + /// - /// 下载打印文件(PDF直接预览) + /// 预览模板生成的pdf文件 /// - /// 查看ID + /// 文件名称 /// - [HttpGet("/BookingOrder/ViewPrintPdf/{vid}"), AllowAnonymous] - public void ViewPrintPdf(string vid) + [HttpGet("/BookingOrder/ViewPrintPdf/{fn}"), AllowAnonymous] + public void ViewPrintPdf(string fn) { - if (_cache.Exists(vid)) + var opt = App.GetOptions().Path; + var fileFullPath = Path.Combine(App.WebHostEnvironment.WebRootPath, opt); + var fileFullName = Path.Combine(fileFullPath, fn); + if (File.Exists(fileFullName)) { - var fileFullName = _cache.Get(vid); var readMem = new ReadOnlyMemory(File.ReadAllBytes(fileFullName)); _httpContextAccessor.HttpContext.Response.BodyWriter.WriteAsync(readMem); } else { - throw Oops.Bah("下载链接失效,请重新打印"); + _httpContextAccessor.HttpContext.Response.StatusCode = 404; } } /// - /// 获取订舱打印模板列表(带有当前用户打印历史排序) + /// 获取订舱打印模板列表(带有当前用户打印历史排序)(准备作废,使用PrintTemplateWithHistoryList代替) /// /// [HttpGet("/BookingOrder/PrintTemplateList")] @@ -1682,6 +1811,59 @@ namespace Myshipping.Application } } + + + /// + /// 获取订舱打印模板列表(带有当前用户打印历史排序) + /// + /// 分类代码(使用字典【booking_template_category】中的代码) + /// + [HttpGet("/BookingOrder/PrintTemplateWithHistoryList")] + public async Task PrintTemplateWithHistoryList(string cateCode) + { + //当前公司所有已配置的模板 + var allList = await _repPrintTemplate.AsQueryable() + .Filter(null, true).InnerJoin((d, t) => d.Id == t.PrintTemplateId && t.SysUserId == UserManager.UserId) + .Where(d => d.TenantId == UserManager.TENANT_ID && d.CateCode == cateCode) + .Select(d => new + { + d.Id, + d.CateCode, + d.CateName, + d.DisplayName + + }) + .ToListAsync(); + + var listReult = new List(); + //当前用户打印历史数据 + var printRecentListKey = $"{PrintRecentListTypeKey}_{cateCode}"; + var usrCfg = await _repUserConfig.AsQueryable().FirstAsync(x => x.CreatedUserId == UserManager.UserId && x.Type == printRecentListKey); + if (usrCfg != null) + { + var arr = JArray.Parse(usrCfg.ConfigJson).Select(x => Convert.ToInt64(x)).ToList(); + + //按顺序加入到结果 + arr.ForEach(x => + { + var find = allList.FirstOrDefault(y => y.Id == x); + if (find != null) + { + listReult.Add(find); + } + }); + + var listOut = allList.Where(x => !arr.Contains(x.Id)).ToList(); + listReult.AddRange(listOut); + + return listReult; + } + else + { + return allList; + } + + } #endregion #region 下货纸 diff --git a/Myshipping.Application/Service/Para/Dto/ParaContractNoDto.cs b/Myshipping.Application/Service/Para/Dto/ParaContractNoDto.cs index 802bf475..6ba7a685 100644 --- a/Myshipping.Application/Service/Para/Dto/ParaContractNoDto.cs +++ b/Myshipping.Application/Service/Para/Dto/ParaContractNoDto.cs @@ -11,21 +11,25 @@ namespace Myshipping.Application /// /// 主键 /// + /// 358942162968645 public string Id{ get; set; } /// /// 合约号编号 /// - public string ContractNo { get; set; } + /// TAO21A00759 + public string ContractNo { get; set; } /// /// 合约号名称 /// + /// 测试1 public string ContractName { get; set; } /// /// 合约号备注 /// + /// 测试1 public string ContractNote { get; set; } /// diff --git a/Myshipping.Application/Service/Para/Dto/QueryParaContractNoDto.cs b/Myshipping.Application/Service/Para/Dto/QueryParaContractNoDto.cs new file mode 100644 index 00000000..a24be897 --- /dev/null +++ b/Myshipping.Application/Service/Para/Dto/QueryParaContractNoDto.cs @@ -0,0 +1,89 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Myshipping.Application +{ + /// + /// 约号台账查询 + /// + public class QueryParaContractNoDto + { + /// + /// 合约号编号 + /// + public string ContractNo { get; set; } + + /// + /// 合约号名称 + /// + public string ContractName { get; set; } + + /// + /// 合约号备注 + /// + public string ContractNote { get; set; } + + /// + /// 创建者名称 + /// + /// + public string CreateUserName { get; set; } + + /// + /// 修改者名称 + /// + /// + public string UpdateUserName { get; set; } + + /// + /// 创建时间开始 + /// + /// 2022-01-01 + public string CreateTimeBegin { get; set; } + + /// + /// 创建时间结束 + /// + /// 2023-07-01 + public string CreateTimeEnd { get; set; } + + /// + /// 更新时间开始 + /// + /// + public string UpdateTimeBegin { get; set; } + + /// + /// 更新时间结束 + /// + /// + public string UpdateTimeEnd { get; set; } + + /// + /// 当前页码 + /// + /// 1 + public int PageNo { get; set; } = 1; + + /// + /// 页码容量 + /// + /// 20 + public int PageSize { get; set; } = 20; + + /// + /// 排序字段 + /// + /// ContractNo + public string SortField { get; set; } + + /// + /// 排序方法,默认降序 + /// + /// true + public bool descSort { get; set; } = true; + } +} diff --git a/Myshipping.Application/Service/Para/Dto/QueryParaGoodsCategoryDto.cs b/Myshipping.Application/Service/Para/Dto/QueryParaGoodsCategoryDto.cs new file mode 100644 index 00000000..f6546803 --- /dev/null +++ b/Myshipping.Application/Service/Para/Dto/QueryParaGoodsCategoryDto.cs @@ -0,0 +1,86 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Myshipping.Application +{ + /// + /// 品名分类参数台账查询 + /// + public class QueryParaGoodsCategoryDto + { + /// + /// 品名分类 + /// + /// 02 + public string GoodsCategory { get; set; } + + /// + /// 品名分类名称 + /// + /// + public string GoodsCategoryName { get; set; } + + /// + /// 创建者名称 + /// + /// + public string CreateUserName { get; set; } + + /// + /// 修改者名称 + /// + /// + public string UpdateUserName { get; set; } + + /// + /// 创建时间开始 + /// + /// 2022-01-01 + public string CreateTimeBegin { get; set; } + + /// + /// 创建时间结束 + /// + /// 2023-07-01 + public string CreateTimeEnd { get; set; } + + /// + /// 更新时间开始 + /// + /// + public string UpdateTimeBegin { get; set; } + + /// + /// 更新时间结束 + /// + /// + public string UpdateTimeEnd { get; set; } + + /// + /// 当前页码 + /// + /// 1 + public int PageNo { get; set; } = 1; + + /// + /// 页码容量 + /// + /// 20 + public int PageSize { get; set; } = 20; + + /// + /// 排序字段 + /// + /// GoodsCategory + public string SortField { get; set; } + + /// + /// 排序方法,默认降序 + /// + /// true + public bool descSort { get; set; } = true; + } +} diff --git a/Myshipping.Application/Service/Para/Interface/IParaService.cs b/Myshipping.Application/Service/Para/Interface/IParaService.cs index 7b4b9076..98357c8f 100644 --- a/Myshipping.Application/Service/Para/Interface/IParaService.cs +++ b/Myshipping.Application/Service/Para/Interface/IParaService.cs @@ -33,6 +33,7 @@ namespace Myshipping.Application /// 检索品名参数 /// /// 检索值 + /// 默认最大行数 /// 返回回执 Task> QueryParaGoodsInfo(string queryItem, int top = 10); @@ -43,47 +44,77 @@ namespace Myshipping.Application /// 返回结果 Task GetParaGoodsPageAsync(QueryParaGoodsDto QuerySearch); - ///// - ///// 保存品名分类参数 - ///// - ///// 品名分类参数 - ///// 返回回执 - //Task SaveParaGoodsCategoryInfo(ParaGoodsCategoryDto model); - - ///// - ///// 主键获取品名分类参数 - ///// - ///// 品名分类主键 - ///// 返回回执 - //Task GetParaGoodsCategoryInfo(long Id); - - ///// - ///// 检索品名分类参数 - ///// - ///// 检索值 - ///// 返回回执 - //Task QueryParaGoodsCategoryInfo(string queryItem); - - - ///// - ///// 保存约号参数 - ///// - ///// 约号参数 - ///// 返回回执 - //Task SaveParaContractNoInfo(ParaGoodsCategoryDto model); - - ///// - ///// 主键获取约号参数 - ///// - ///// 约号主键 - ///// 返回回执 - //Task GetParaContractNoInfo(long Id); - - ///// - ///// 检索约号参数 - ///// - ///// 检索值 - ///// 返回回执 - //Task QuerytParaContractNoInfo(string queryItem); + /// + /// 保存品名分类参数 + /// + /// 品名分类参数 + /// 返回回执 + Task SaveParaGoodsCategoryInfo(ParaGoodsCategoryDto model); + + /// + /// 主键获取品名分类参数 + /// + /// 品名分类主键 + /// 返回回执 + Task GetParaGoodsCategoryInfo(long Id); + + /// + /// 检索品名分类参数 + /// + /// 检索值 + /// 默认最大行数 + /// 返回回执 + Task> QueryParaGoodsCategoryInfo(string queryItem, int top = 10); + + /// + /// 作废品名分类参数 + /// + /// 品名分类参数主键数组 + /// 返回回执 + Task DeleteParaGoodsCategoryInfo(long[] Ids); + + /// + /// 品名分类参数台账查询 + /// + /// 品名分类参数台账查询请求 + /// 返回结果 + Task GetParaGoodsCategoryPageAsync(QueryParaGoodsCategoryDto QuerySearch); + + + /// + /// 保存约号参数 + /// + /// 约号参数 + /// 返回回执 + Task SaveParaContractNoInfo(ParaContractNoDto model); + + /// + /// 主键获取约号参数 + /// + /// 约号主键 + /// 返回回执 + Task GetParaContractNoInfo(long Id); + + /// + /// 检索约号参数 + /// + /// 检索值 + /// 默认最大行数 + /// 返回回执 + Task> QuerytParaContractNoInfo(string queryItem, int top = 10); + + /// + /// 作废约号参数 + /// + /// 约号参数主键数组 + /// 返回回执 + Task DeleteParaContractNoInfo(long[] Ids); + + /// + /// 约号参数台账查询 + /// + /// 约号参数台账查询请求 + /// 返回结果 + Task GetParaContractNoPageAsync(QueryParaContractNoDto QuerySearch); } } diff --git a/Myshipping.Application/Service/Para/ParaService.cs b/Myshipping.Application/Service/Para/ParaService.cs index c0b47131..7bf66c5c 100644 --- a/Myshipping.Application/Service/Para/ParaService.cs +++ b/Myshipping.Application/Service/Para/ParaService.cs @@ -7,8 +7,11 @@ using Microsoft.Extensions.Logging; using Myshipping.Application.Entity; using Myshipping.Application.Helper; using Myshipping.Core; +using Myshipping.Core.Entity; using NPOI.OpenXmlFormats.Wordprocessing; using NPOI.SS.Formula.Functions; +using NPOI.XWPF.UserModel; +using Org.BouncyCastle.Crypto; using System; using System.Collections.Generic; using System.Linq; @@ -60,6 +63,17 @@ namespace Myshipping.Application if(sameList.Count > 0 && !string.IsNullOrWhiteSpace(model.Id) && sameList.Any(t=>t.Id != long.Parse(model.Id))) throw Oops.Oh($"商品编码【{model.GoodsCode}】已存在不能重复保存"); + //如果填写了品名分配需要确认根据库中数据一致 + if (!string.IsNullOrWhiteSpace(model.GoodsCategory)) + { + var categoryInfo = _paraGoodsCategoryInfoRepository.AsQueryable().First(t => t.GOODS_CATEGORY.Equals(model.GoodsCategory.Trim())); + + if (categoryInfo == null) + throw Oops.Oh($"品名分类代码【{model.GoodsCategory}】不存在,请确认品名分类"); + + if (!string.IsNullOrWhiteSpace(model.GoodsCategoryName) && !categoryInfo.GOODS_CATEGORY_NAME.Equals(model.GoodsCategoryName.Trim())) + throw Oops.Oh($"品名分类名称【{model.GoodsCategoryName}】错误,code={model.GoodsCategory}请确认品名分类"); + } if (!string.IsNullOrWhiteSpace(model.Id)) { @@ -135,7 +149,6 @@ namespace Myshipping.Application await _paraGoodsInfoRepository.AsUpdateable(entity).IgnoreColumns(it => new { - it.Id, it.TenantId, it.CreatedTime, it.CreatedUserId, @@ -281,8 +294,8 @@ namespace Myshipping.Application .WhereIF(!string.IsNullOrWhiteSpace(QuerySearch.GoodsDesp), t => t.GOODS_DESP.Contains(QuerySearch.GoodsDesp.Trim(), StringComparison.OrdinalIgnoreCase)) .WhereIF(!string.IsNullOrWhiteSpace(QuerySearch.GoodsNameEN), t => t.GOODS_NAME_EN.Contains(QuerySearch.GoodsNameEN.Trim(), StringComparison.OrdinalIgnoreCase)) .WhereIF(!string.IsNullOrWhiteSpace(QuerySearch.GoodsCategory), t => t.GOODS_CATEGORY.Equals(QuerySearch.GoodsCategory.Trim(), StringComparison.OrdinalIgnoreCase)) - .WhereIF(!string.IsNullOrWhiteSpace(QuerySearch.CreateUserName), t => t.GOODS_NAME_EN.Contains(QuerySearch.CreateUserName.Trim(), StringComparison.OrdinalIgnoreCase)) - .WhereIF(!string.IsNullOrWhiteSpace(QuerySearch.UpdateUserName), t => t.GOODS_NAME_EN.Contains(QuerySearch.UpdateUserName.Trim(), StringComparison.OrdinalIgnoreCase)) + .WhereIF(!string.IsNullOrWhiteSpace(QuerySearch.CreateUserName), t => t.CreatedUserName.Contains(QuerySearch.CreateUserName.Trim(), StringComparison.OrdinalIgnoreCase)) + .WhereIF(!string.IsNullOrWhiteSpace(QuerySearch.UpdateUserName), t => t.UpdatedUserName.Contains(QuerySearch.UpdateUserName.Trim(), StringComparison.OrdinalIgnoreCase)) .OrderBy(entityOrderCol + (QuerySearch.descSort ? " asc " : " desc ")) .ToPagedListAsync(QuerySearch.PageNo, QuerySearch.PageSize); return new @@ -295,77 +308,525 @@ namespace Myshipping.Application }; } - ///// - ///// 保存品名分类参数 - ///// - ///// 品名分类参数 - ///// 返回回执 - //public async Task SaveParaGoodsCategoryInfo(ParaGoodsCategoryDto model) - //{ - // CommonWebApiResult result = new CommonWebApiResult(); - - // return result; - //} - - ///// - ///// 主键获取品名分类参数 - ///// - ///// 品名分类主键 - ///// 返回回执 - //public async Task GetParaGoodsCategoryInfo(long Id) - //{ - // CommonWebApiResult result = new CommonWebApiResult(); - - // return result; - //} - - ///// - ///// 检索品名分类参数 - ///// - ///// 检索值 - ///// 返回回执 - //public async Task QueryParaGoodsCategoryInfo(string queryItem) - //{ - // CommonWebApiResult result = new CommonWebApiResult(); - - // return result; - //} - - - ///// - ///// 保存约号参数 - ///// - ///// 约号参数 - ///// 返回回执 - //public async Task SaveParaContractNoInfo(ParaGoodsCategoryDto model) - //{ - // CommonWebApiResult result = new CommonWebApiResult(); - - // return result; - //} - - ///// - ///// 主键获取约号参数 - ///// - ///// 约号主键 - ///// 返回回执 - //public async Task GetParaContractNoInfo(long Id) - //{ - // CommonWebApiResult result = new CommonWebApiResult(); - - // return result; - //} - - ///// - ///// 检索约号参数 - ///// - ///// 检索值 - ///// 返回回执 - //public async Task QuerytParaContractNoInfo(string queryItem) - //{ - // CommonWebApiResult result = new CommonWebApiResult(); - - // return result; - //} + /// + /// 保存品名分类参数 + /// + /// 品名分类参数 + /// 返回回执 + [HttpPost("/Para/SaveParaGoodsCategoryInfo")] + public async Task SaveParaGoodsCategoryInfo(ParaGoodsCategoryDto model) + { + ParaGoodsCategoryInfo info = null; + + try + { + ////判断代码不能重复 + //var sameList = _paraGoodsCategoryInfoRepository.AsQueryable() + // .Where(t => t.GOODS_CATEGORY.Equals(model.GoodsCategory, StringComparison.OrdinalIgnoreCase)).ToList(); + + //if (sameList.Count > 0 && !string.IsNullOrWhiteSpace(model.Id) && sameList.Any(t => t.Id != long.Parse(model.Id))) + // throw Oops.Oh($"商品分类代码【{model.GoodsCategory}】已存在不能重复保存"); + + if (!string.IsNullOrWhiteSpace(model.Id)) + { + info = await _paraGoodsCategoryInfoRepository.AsQueryable().FirstAsync(t => t.Id == long.Parse(model.Id)); + + //如果填写了品名分配需要确认根据库中数据一致 + if (!info.GOODS_CATEGORY.Equals(model.GoodsCategory, StringComparison.OrdinalIgnoreCase)) + { + var existsList = _paraGoodsCategoryInfoRepository.AsQueryable() + .LeftJoin(_paraGoodsInfoRepository.AsQueryable(), (cate, goods) => cate.GOODS_CATEGORY == goods.GOODS_CATEGORY) + .Where(cate => cate.Id == info.Id) + .Select((cate, goods) => new { Cate = cate, Goods = goods }).ToList(); + + if (existsList.Any(t => t.Goods != null)) + throw Oops.Oh($"原分类代码{info.GOODS_CATEGORY}已有对应品名参数,不能修改"); + + } + + info.GOODS_CATEGORY = model.GoodsCategory; + info.GOODS_CATEGORY_NAME = model.GoodsCategoryName; + + await _paraGoodsCategoryInfoRepository.AsUpdateable(info).IgnoreColumns(it => new + { + it.Id, + it.TenantId, + it.CreatedTime, + it.CreatedUserId, + it.CreatedUserName + }).ExecuteCommandAsync(); + } + else + { + info = model.Adapt(); + + await _paraGoodsCategoryInfoRepository.InsertAsync(info); + } + } + catch (Exception ex) + { + throw Oops.Bah($"保存品名分类参数异常,{ex.Message}"); + } + + return info.Id; + } + + /// + /// 主键获取品名分类参数 + /// + /// 品名分类主键 + /// 返回回执 + [HttpGet("/Para/GetParaGoodsCategoryInfo")] + public async Task GetParaGoodsCategoryInfo(long Id) + { + ParaGoodsCategoryDto model = null; + + try + { + ParaGoodsCategoryInfo info = _paraGoodsCategoryInfoRepository.AsQueryable().First(t => t.Id == Id); + + if (info == null) + throw Oops.Oh($"获取品名分类参数失败"); + + + model = info.Adapt(); + + } + catch (Exception ex) + { + throw Oops.Bah($"获取品名分类参数异常,{ex.Message}"); + } + + return model; + } + + /// + /// 检索品名分类参数 + /// + /// 检索值 + /// 默认最大行数 + /// 返回回执 + [HttpGet("/Para/QueryParaGoodsCategoryInfo")] + public async Task> QueryParaGoodsCategoryInfo([FromQuery] string queryItem, [FromQuery] int top = 10) + { + List list = new List(); + + try + { + var query = _paraGoodsCategoryInfoRepository.AsQueryable(); + + if (!string.IsNullOrWhiteSpace(queryItem)) + { + query = query.Where(t => + t.GOODS_CATEGORY.Contains(queryItem.Trim(), StringComparison.OrdinalIgnoreCase) || + t.GOODS_CATEGORY_NAME.Contains(queryItem.Trim(), StringComparison.OrdinalIgnoreCase) + ); + } + + query = query.OrderBy("GOODS_CATEGORY asc"); + + var currList = await query.Take(top).ToListAsync(); + + if (currList.Count > 0) + list = currList.Select(t => t.Adapt()).ToList(); + + } + catch (Exception ex) + { + throw Oops.Bah($"保存品名参数异常,{ex.Message}"); + } + + return list; + } + + /// + /// 作废品名分类参数 + /// + /// 品名分类参数主键数组 + /// 返回回执 + [HttpPost("/Para/DeleteParaGoodsCategoryInfo")] + public async Task DeleteParaGoodsCategoryInfo(long[] Ids) + { + try + { + //如果没有给主键直接抛异常 + if (Ids.Length == 0) + throw Oops.Oh("没有提供需要作废的主键信息"); + + var list = _paraGoodsCategoryInfoRepository.AsQueryable().Where(t => Ids.Contains(t.Id)).ToList(); + + if (list.Count != Ids.Length) + { + var noRecord = string.Join(",", Ids.GroupJoin(list, l => l, r => r.Id, (l, r) => { + var currList = r.ToList(); + + if (r.Count() > 0) + return string.Empty; + + return l.ToString(); + }).Where(t => !string.IsNullOrWhiteSpace(t)).ToArray()); + + throw Oops.Oh($"以下主键信息 {noRecord} 检索失败或者已作废过"); + } + + //这里需要判断当前的品名分类是否已经对应到品名上,如果已有对应则不能直接作废 + var existsList = _paraGoodsCategoryInfoRepository.AsQueryable() + .LeftJoin(_paraGoodsInfoRepository.AsQueryable(),(cate, goods) => cate.GOODS_CATEGORY == goods.GOODS_CATEGORY) + .Where(cate => Ids.Contains(cate.Id)) + .Select((cate, goods) => new { Cate = cate, Goods = goods }).ToList(); + + if(existsList.Any(t=>t.Goods != null)) + throw Oops.Oh($"以下分类代码已指定品名参数不能直接删除,{string.Join(",",existsList.Select(t=>t.Cate.GOODS_CATEGORY).Distinct().ToArray())}"); + + list.ForEach(async entity => + { + entity.IsDeleted = true; + entity.UpdatedTime = DateTime.Now; + entity.UpdatedUserId = UserManager.UserId; + entity.UpdatedUserName = UserManager.Name; + + await _paraGoodsCategoryInfoRepository.AsUpdateable(entity).IgnoreColumns(it => new + { + it.TenantId, + it.CreatedTime, + it.CreatedUserId, + it.CreatedUserName + }).ExecuteCommandAsync(); + }); + + } + catch (Exception ex) + { + throw Oops.Bah($"作废品名参数异常,{ex.Message}"); + } + + return "作废成功"; + } + + #region 品名分类参数台账查询 + /// + /// 品名分类参数台账查询 + /// + /// 品名分类参数台账查询请求 + /// 返回结果 + [HttpPost("/Para/GetParaGoodsCategoryPage")] + public async Task GetParaGoodsCategoryPageAsync(QueryParaGoodsCategoryDto QuerySearch) + { + DateTime createBegin = DateTime.MinValue; + DateTime createEnd = DateTime.MinValue; + + DateTime updateBegin = DateTime.MinValue; + DateTime updateEnd = DateTime.MinValue; + + if (!string.IsNullOrWhiteSpace(QuerySearch.CreateTimeBegin)) + { + if (!DateTime.TryParse(QuerySearch.CreateTimeBegin, out createBegin)) + throw Oops.Oh($"创建开始日期格式错误,{QuerySearch.CreateTimeBegin}"); + } + + if (!string.IsNullOrWhiteSpace(QuerySearch.CreateTimeEnd)) + { + if (!DateTime.TryParse(QuerySearch.CreateTimeEnd, out createEnd)) + throw Oops.Oh($"创建结束日期格式错误,{QuerySearch.CreateTimeEnd}"); + + createEnd = createEnd.AddDays(1); + } + + if (!string.IsNullOrWhiteSpace(QuerySearch.UpdateTimeBegin)) + { + if (!DateTime.TryParse(QuerySearch.UpdateTimeBegin, out updateBegin)) + throw Oops.Oh($"更新起始日期格式错误,{QuerySearch.UpdateTimeBegin}"); + } + + if (!string.IsNullOrWhiteSpace(QuerySearch.UpdateTimeEnd)) + { + if (!DateTime.TryParse(QuerySearch.UpdateTimeEnd, out updateEnd)) + throw Oops.Oh($"更新结束日期格式错误,{QuerySearch.UpdateTimeEnd}"); + + updateEnd = updateEnd.AddDays(1); + } + + string entityOrderCol = "CreatedTime"; + + //这里因为返回给前端的台账数据是DTO,所以这里排序时候需要转换成Entity对应的字段 + if (!string.IsNullOrWhiteSpace(QuerySearch.SortField)) + entityOrderCol = MapsterExtHelper.GetAdaptProperty(QuerySearch.SortField); + + var entities = await _paraGoodsCategoryInfoRepository.AsQueryable().Filter(null, true) + .WhereIF(!string.IsNullOrWhiteSpace(QuerySearch.GoodsCategory), t => t.GOODS_CATEGORY.Contains(QuerySearch.GoodsCategory.Trim(), StringComparison.OrdinalIgnoreCase)) + .WhereIF(!string.IsNullOrWhiteSpace(QuerySearch.GoodsCategoryName), t => t.GOODS_CATEGORY_NAME.Contains(QuerySearch.GoodsCategoryName.Trim(), StringComparison.OrdinalIgnoreCase)) + .WhereIF(createBegin != DateTime.MinValue, t => t.CreatedTime.HasValue && t.CreatedTime.Value >= createBegin) + .WhereIF(createEnd != DateTime.MinValue, t => t.CreatedTime.HasValue && t.CreatedTime.Value < createEnd) + .WhereIF(updateBegin != DateTime.MinValue, t => t.UpdatedTime.HasValue && t.UpdatedTime.Value >= updateBegin) + .WhereIF(updateEnd != DateTime.MinValue, t => t.UpdatedTime.HasValue && t.UpdatedTime.Value < updateEnd) + .WhereIF(!string.IsNullOrWhiteSpace(QuerySearch.CreateUserName), t => t.CreatedUserName.Contains(QuerySearch.CreateUserName.Trim(), StringComparison.OrdinalIgnoreCase)) + .WhereIF(!string.IsNullOrWhiteSpace(QuerySearch.UpdateUserName), t => t.UpdatedUserName.Contains(QuerySearch.UpdateUserName.Trim(), StringComparison.OrdinalIgnoreCase)) + .OrderBy(entityOrderCol + (QuerySearch.descSort ? " asc " : " desc ")) + .ToPagedListAsync(QuerySearch.PageNo, QuerySearch.PageSize); + return new + { + PageNo = entities.PageIndex, + PageSize = entities.PageSize, + TotalPage = entities.TotalPages, + TotalRows = entities.TotalCount, + Rows = entities.Items.Select(t => t.Adapt()).ToList() + }; + } + #endregion + + #region 保存约号参数 + /// + /// 保存约号参数 + /// + /// 约号参数 + /// 返回回执 + [HttpPost("/Para/SaveParaContractNoInfo")] + public async Task SaveParaContractNoInfo(ParaContractNoDto model) + { + ParaContractNoInfo info = null; + + try + { + //判断代码不能重复 + var sameList = _paraContractNoInfoRepository.AsQueryable() + .Where(t => t.CONTRACT_NO.Equals(model.ContractNo, StringComparison.OrdinalIgnoreCase)).ToList(); + + if (sameList.Count > 0 && !string.IsNullOrWhiteSpace(model.Id) && sameList.Any(t => t.Id != long.Parse(model.Id))) + throw Oops.Oh($"合约号编号【{model.ContractNo}】已存在不能重复保存"); + + if (!string.IsNullOrWhiteSpace(model.Id)) + { + info = await _paraContractNoInfoRepository.AsQueryable().FirstAsync(t => t.Id == long.Parse(model.Id)); + + info.CONTRACT_NO = model.ContractNo; + info.CONTRACT_NAME = model.ContractName; + info.CONTRACT_NAME = model.ContractName; + + await _paraContractNoInfoRepository.AsUpdateable(info).IgnoreColumns(it => new + { + it.Id, + it.TenantId, + it.CreatedTime, + it.CreatedUserId, + it.CreatedUserName + }).ExecuteCommandAsync(); + } + else + { + info = model.Adapt(); + + await _paraContractNoInfoRepository.InsertAsync(info); + } + } + catch (Exception ex) + { + throw Oops.Bah($"保存约号参数异常,{ex.Message}"); + } + + return info.Id; + } + #endregion + + #region 主键获取约号参数 + /// + /// 主键获取约号参数 + /// + /// 约号主键 + /// 返回回执 + [HttpGet("/Para/GetParaContractNoInfo")] + public async Task GetParaContractNoInfo(long Id) + { + ParaContractNoDto model = null; + + try + { + ParaContractNoInfo info = _paraContractNoInfoRepository.AsQueryable().First(t => t.Id == Id); + + if (info == null) + throw Oops.Oh($"获取约号参数失败"); + + + model = info.Adapt(); + + } + catch (Exception ex) + { + throw Oops.Bah($"获取约号参数异常,{ex.Message}"); + } + + return model; + } + #endregion + + #region 检索约号参数 + /// + /// 检索约号参数 + /// + /// 检索值 + /// 默认最大行数 + /// 返回回执 + [HttpGet("/Para/QuerytParaContractNoInfo")] + public async Task> QuerytParaContractNoInfo([FromQuery] string queryItem, [FromQuery] int top = 10) + { + List list = new List(); + + try + { + var query = _paraContractNoInfoRepository.AsQueryable(); + + if (!string.IsNullOrWhiteSpace(queryItem)) + { + query = query.Where(t => + t.CONTRACT_NO.Contains(queryItem.Trim(), StringComparison.OrdinalIgnoreCase) || + t.CONTRACT_NAME.Contains(queryItem.Trim(), StringComparison.OrdinalIgnoreCase) || + t.CONTRACT_NOTE.Contains(queryItem.Trim(), StringComparison.OrdinalIgnoreCase) + ); + } + + query = query.OrderBy("CONTRACT_NO asc"); + + var currList = await query.Take(top).ToListAsync(); + + if (currList.Count > 0) + list = currList.Select(t => t.Adapt()).ToList(); + + } + catch (Exception ex) + { + throw Oops.Bah($"检索约号参数异常,{ex.Message}"); + } + + return list; + } + #endregion + + #region 作废约号参数 + /// + /// 作废约号参数 + /// + /// 约号参数主键数组 + /// 返回回执 + [HttpPost("/Para/DeleteParaContractNoInfo")] + public async Task DeleteParaContractNoInfo(long[] Ids) + { + try + { + //如果没有给主键直接抛异常 + if (Ids.Length == 0) + throw Oops.Oh("没有提供需要作废的主键信息"); + + var list = _paraContractNoInfoRepository.AsQueryable().Where(t => Ids.Contains(t.Id)).ToList(); + + if (list.Count != Ids.Length) + { + var noRecord = string.Join(",", Ids.GroupJoin(list, l => l, r => r.Id, (l, r) => { + var currList = r.ToList(); + + if (r.Count() > 0) + return string.Empty; + + return l.ToString(); + }).Where(t => !string.IsNullOrWhiteSpace(t)).ToArray()); + + throw Oops.Oh($"以下主键信息 {noRecord} 检索失败或者已作废过"); + } + + list.ForEach(async entity => + { + entity.IsDeleted = true; + entity.UpdatedTime = DateTime.Now; + entity.UpdatedUserId = UserManager.UserId; + entity.UpdatedUserName = UserManager.Name; + + await _paraContractNoInfoRepository.AsUpdateable(entity).IgnoreColumns(it => new + { + it.TenantId, + it.CreatedTime, + it.CreatedUserId, + it.CreatedUserName + }).ExecuteCommandAsync(); + }); + + } + catch (Exception ex) + { + throw Oops.Bah($"作废约号参数异常,{ex.Message}"); + } + + return "作废成功"; + } + #endregion + + #region 约号参数台账查询 + /// + /// 约号参数台账查询 + /// + /// 约号参数台账查询请求 + /// 返回结果 + [HttpPost("/Para/GetParaContractNoPage")] + public async Task GetParaContractNoPageAsync(QueryParaContractNoDto QuerySearch) + { + DateTime createBegin = DateTime.MinValue; + DateTime createEnd = DateTime.MinValue; + + DateTime updateBegin = DateTime.MinValue; + DateTime updateEnd = DateTime.MinValue; + + if (!string.IsNullOrWhiteSpace(QuerySearch.CreateTimeBegin)) + { + if (!DateTime.TryParse(QuerySearch.CreateTimeBegin, out createBegin)) + throw Oops.Oh($"创建开始日期格式错误,{QuerySearch.CreateTimeBegin}"); + } + + if (!string.IsNullOrWhiteSpace(QuerySearch.CreateTimeEnd)) + { + if (!DateTime.TryParse(QuerySearch.CreateTimeEnd, out createEnd)) + throw Oops.Oh($"创建结束日期格式错误,{QuerySearch.CreateTimeEnd}"); + + createEnd = createEnd.AddDays(1); + } + + if (!string.IsNullOrWhiteSpace(QuerySearch.UpdateTimeBegin)) + { + if (!DateTime.TryParse(QuerySearch.UpdateTimeBegin, out updateBegin)) + throw Oops.Oh($"更新起始日期格式错误,{QuerySearch.UpdateTimeBegin}"); + } + + if (!string.IsNullOrWhiteSpace(QuerySearch.UpdateTimeEnd)) + { + if (!DateTime.TryParse(QuerySearch.UpdateTimeEnd, out updateEnd)) + throw Oops.Oh($"更新结束日期格式错误,{QuerySearch.UpdateTimeEnd}"); + + updateEnd = updateEnd.AddDays(1); + } + + string entityOrderCol = "CreatedTime"; + + //这里因为返回给前端的台账数据是DTO,所以这里排序时候需要转换成Entity对应的字段 + if (!string.IsNullOrWhiteSpace(QuerySearch.SortField)) + entityOrderCol = MapsterExtHelper.GetAdaptProperty(QuerySearch.SortField); + + var entities = await _paraContractNoInfoRepository.AsQueryable().Filter(null, true) + .WhereIF(!string.IsNullOrWhiteSpace(QuerySearch.ContractNo), t => t.CONTRACT_NO.Contains(QuerySearch.ContractNo.Trim(), StringComparison.OrdinalIgnoreCase)) + .WhereIF(!string.IsNullOrWhiteSpace(QuerySearch.ContractName), t => t.CONTRACT_NAME.Contains(QuerySearch.ContractName.Trim(), StringComparison.OrdinalIgnoreCase)) + .WhereIF(!string.IsNullOrWhiteSpace(QuerySearch.ContractNote), t => t.CONTRACT_NOTE.Contains(QuerySearch.ContractNote.Trim(), StringComparison.OrdinalIgnoreCase)) + .WhereIF(createBegin != DateTime.MinValue, t => t.CreatedTime.HasValue && t.CreatedTime.Value >= createBegin) + .WhereIF(createEnd != DateTime.MinValue, t => t.CreatedTime.HasValue && t.CreatedTime.Value < createEnd) + .WhereIF(updateBegin != DateTime.MinValue, t => t.UpdatedTime.HasValue && t.UpdatedTime.Value >= updateBegin) + .WhereIF(updateEnd != DateTime.MinValue, t => t.UpdatedTime.HasValue && t.UpdatedTime.Value < updateEnd) + .WhereIF(!string.IsNullOrWhiteSpace(QuerySearch.CreateUserName), t => t.CreatedUserName.Contains(QuerySearch.CreateUserName.Trim(), StringComparison.OrdinalIgnoreCase)) + .WhereIF(!string.IsNullOrWhiteSpace(QuerySearch.UpdateUserName), t => t.UpdatedUserName.Contains(QuerySearch.UpdateUserName.Trim(), StringComparison.OrdinalIgnoreCase)) + .OrderBy(entityOrderCol + (QuerySearch.descSort ? " asc " : " desc ")) + .ToPagedListAsync(QuerySearch.PageNo, QuerySearch.PageSize); + return new + { + PageNo = entities.PageIndex, + PageSize = entities.PageSize, + TotalPage = entities.TotalPages, + TotalRows = entities.TotalCount, + Rows = entities.Items.Select(t => t.Adapt()).ToList() + }; + } + #endregion } } diff --git a/Myshipping.Application/Service/TaskManagePlat/Interface/ITaskManageService.cs b/Myshipping.Application/Service/TaskManagePlat/Interface/ITaskManageService.cs index 868d3b7a..0059d33e 100644 --- a/Myshipping.Application/Service/TaskManagePlat/Interface/ITaskManageService.cs +++ b/Myshipping.Application/Service/TaskManagePlat/Interface/ITaskManageService.cs @@ -40,5 +40,13 @@ namespace Myshipping.Application /// 任务台账查询请求 /// 返回结果 Task GetPageAsync(QueryTaskManageDto QuerySearch); + + + /// + /// 下载正本提单 + /// + /// 任务主键数组 + /// 返回结果 + Task DownloadOriginalTask(string[] PKIds); } } diff --git a/Myshipping.Application/Service/TaskManagePlat/TaskManageService.cs b/Myshipping.Application/Service/TaskManagePlat/TaskManageService.cs index 7d925ed7..580a3712 100644 --- a/Myshipping.Application/Service/TaskManagePlat/TaskManageService.cs +++ b/Myshipping.Application/Service/TaskManagePlat/TaskManageService.cs @@ -2,6 +2,7 @@ using Furion.DistributedIDGenerator; using Furion.DynamicApiController; using Furion.FriendlyException; +using Furion.JsonSerialization; using Furion.RemoteRequest; using Mapster; using Microsoft.AspNetCore.Authorization; @@ -13,6 +14,7 @@ using Myshipping.Application.Entity; using Myshipping.Application.Helper; using Myshipping.Core; using Myshipping.Core.Entity; +using Myshipping.Core.Service; using MySqlX.XDevAPI.Common; using NPOI.SS.Formula.Functions; using SqlSugar; @@ -43,10 +45,13 @@ namespace Myshipping.Application private readonly SqlSugarRepository _taskVGMFeedBackInfoRepository; private readonly SqlSugarRepository _sysUserRepository; private readonly SqlSugarRepository _taskStatManageInfoRepository; - + private readonly SqlSugarRepository _taskOriginalDownloadHisInfoRepository; + private readonly IDjyWebsiteAccountConfigService _webAccountConfig; private readonly ILogger _logger; + const string CONST_WEB_ACCOUNT_TYPE = "CmaWeb"; + public TaskManageService(SqlSugarRepository taskBaseInfoRepository, SqlSugarRepository taskSIFeedBackInfoRepository, SqlSugarRepository taskSIFeedBackContaInfoRepository, @@ -56,6 +61,8 @@ namespace Myshipping.Application SqlSugarRepository taskVGMFeedBackInfoRepository, SqlSugarRepository sysUserRepository, SqlSugarRepository taskStatManageInfoRepository, + SqlSugarRepository taskOriginalDownloadHisInfoRepository, + IDjyWebsiteAccountConfigService webAccountConfig, ILogger logger) { _taskBaseInfoRepository = taskBaseInfoRepository; @@ -67,6 +74,8 @@ namespace Myshipping.Application _taskVGMFeedBackInfoRepository = taskVGMFeedBackInfoRepository; _sysUserRepository = sysUserRepository; _taskStatManageInfoRepository = taskStatManageInfoRepository; + _taskOriginalDownloadHisInfoRepository = taskOriginalDownloadHisInfoRepository; + _webAccountConfig = webAccountConfig; _logger = logger; } @@ -611,5 +620,107 @@ namespace Myshipping.Application Rows = entities.Items.Select(t => t.Adapt()).ToList() }; } + + + #region 下载正本提单(可批量) + /// + /// 下载正本提单(可批量) + /// + /// 任务主键数组 + /// 返回结果 + [HttpPost("/TaskManage/DownloadOriginalTask")] + public async Task DownloadOriginalTask(string[] PKIds) + { + TaskManageOrderResultDto result = new TaskManageOrderResultDto(); + + try + { + var taskList = _taskBaseInfoRepository.AsQueryable().Where(t => PKIds.Contains(t.PK_ID)).ToList(); + + //获取个人对应的账户,这里GetAccountConfig逻辑优先取个人,个人没有配置取公司对应配置 + var userWebAccountConfig = _webAccountConfig.GetAccountConfig(CONST_WEB_ACCOUNT_TYPE, UserManager.UserId).GetAwaiter().GetResult(); + + if (userWebAccountConfig == null) + throw Oops.Bah($"个人/公司网站【{CONST_WEB_ACCOUNT_TYPE}】获取失败,请维护个人/公司网站账户信息"); + + taskList.ForEach(async tsk => { + + await InnerDownloadOriginalTask(tsk, userWebAccountConfig); + }); + + } + catch (Exception ex) + { + throw Oops.Bah($"下载正本提单异常,{0}", ex.Message); + } + + return result; + } + #endregion + + + private async Task InnerDownloadOriginalTask(TaskBaseInfo taskBaseInfo, DjyWebsiteAccountConfig webAccountConfig) + { + var result = new TaskManageOrderResultDto(); + + /* + 1、TaskOriginalDownloadHisInfo表中处理任务是succ/temp不允许重复下载。failure/timeout的记录可以再次发起下载。 + 2、从任务表提取RESULT_NOTE回执信息,里面包含了JSON数据 {"pageUrl":"http://www.cnc-ebusiness.com/ebusiness/bl/detail/AASM104300"} + 3、异步请求正本下载的链接,有超时时间。 + 4、下载完成后写入记录 + */ + + //正本下载URL + string originalUrl = string.Empty; + + try + { + var hisList = _taskOriginalDownloadHisInfoRepository + .Where(t => t.TASK_ID == taskBaseInfo.PK_ID).ToList(); + + if (hisList.Any(t => new string[] { "succ", "temp" }.Contains(t.STATUS))) + throw Oops.Bah("下载URL不存在,请用最新任务数据"); + + + if (string.IsNullOrWhiteSpace(taskBaseInfo.RESULT_NOTE)) + throw Oops.Bah("下载URL不存在,请用最新任务数据"); + + var resultObj = JSON.Deserialize(taskBaseInfo.RESULT_NOTE); + + originalUrl = resultObj.pageUrl.ToString(); + + if (string.IsNullOrWhiteSpace(originalUrl)) + throw Oops.Bah("解析下载URL不存在,请用最新任务数据"); + + DateTime startDate = DateTime.Now; + + TaskOriginalDownloadHisInfo taskOriginalDownloadHisInfo = new TaskOriginalDownloadHisInfo + { + PK_ID = IDGen.NextID().ToString(), + TASK_ID = taskBaseInfo.PK_ID, + REQUEST_URL = originalUrl, + CreatedUserId = UserManager.UserId, + CreatedUserName = UserManager.Name, + STATUS = "temp", + IS_TIMEOUT = 0, + START_DATE = startDate, + TenantId = UserManager.TENANT_ID, + TenantName = UserManager.TENANT_NAME + }; + + //写入记录 + _taskOriginalDownloadHisInfoRepository.Insert(taskOriginalDownloadHisInfo); + } + catch (Exception ex) + { + result.succ = false; + result.msg = ex.Message; + } + + return result; + } + + //private async Task Inner } + }