From 5fbb48e173228274ed9bd198866d7a7666e4dcd9 Mon Sep 17 00:00:00 2001 From: wet <1034391973@qq.com> Date: Fri, 18 Nov 2022 17:02:16 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=86=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Myshipping.Application.xml | 8 - .../BookingOrder/BookingOrderService.cs | 531 +++++++++--------- 2 files changed, 277 insertions(+), 262 deletions(-) diff --git a/Myshipping.Application/Myshipping.Application.xml b/Myshipping.Application/Myshipping.Application.xml index c356d164..ce966acc 100644 --- a/Myshipping.Application/Myshipping.Application.xml +++ b/Myshipping.Application/Myshipping.Application.xml @@ -4793,14 +4793,6 @@ 类型,对应字典中的【订舱打印模板类型】 - - - 获取场站数据 - - - - - 记录或更新订舱状态 diff --git a/Myshipping.Application/Service/BookingOrder/BookingOrderService.cs b/Myshipping.Application/Service/BookingOrder/BookingOrderService.cs index 67159fa9..a9d66ce9 100644 --- a/Myshipping.Application/Service/BookingOrder/BookingOrderService.cs +++ b/Myshipping.Application/Service/BookingOrder/BookingOrderService.cs @@ -1,4 +1,4 @@ -using Myshipping.Core; +using Myshipping.Core; using Furion.DependencyInjection; using Furion.DynamicApiController; using Mapster; @@ -47,12 +47,11 @@ using Myshipping.Application.EDI.WY; using Myshipping.Application.EDI.YML; using Myshipping.Application.EDI.YT; using System.Runtime.InteropServices; -using Myshipping.Application.Helper; namespace Myshipping.Application { /// - /// շ + /// 订舱服务 /// [ApiDescriptionSettings("Application", Name = "BookingOrder", Order = 1)] public class BookingOrderService : IBookingOrderService, IDynamicApiController, ITransient @@ -117,10 +116,10 @@ namespace Myshipping.Application this._repTenant = repTenant; this._repBookingStatus = repBookingStatus; } - ////id طֵϢ - #region Ϣ + ////传id 返回分单信息 + #region 主表和箱信息 /// - /// ҳѯ + /// 分页查询订舱主表 /// /// /// @@ -128,7 +127,7 @@ namespace Myshipping.Application public async Task Page([FromQuery] BookingOrderInput input) { List userlist = await DataFilterExtensions.GetDataScopeIdList(); - var entities = await _rep.AsQueryable() + var entities = await _rep.AsQueryable().Where(x => x.ParentId == 0) .WhereIF(!string.IsNullOrWhiteSpace(input.BSSTATUS), u => u.BSSTATUS == input.BSSTATUS) .WhereIF(!string.IsNullOrWhiteSpace(input.MBLNO), u => input.MBLNO.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).Contains(u.MBLNO)) .WhereIF(!string.IsNullOrWhiteSpace(input.HBLNO), u => input.HBLNO.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).Contains(u.HBLNO)) @@ -255,7 +254,7 @@ namespace Myshipping.Application } /// - /// Ӷ + /// 增加订舱 /// /// /// @@ -264,6 +263,22 @@ namespace Myshipping.Application public async Task Add(AddBookingOrderInput input) { + if (input.ParentId == 0) + { + if (string.IsNullOrWhiteSpace(input.HBLNO)) + { + throw Oops.Bah("主单不需要填写分单号"); + } + } + else + { + if (string.IsNullOrWhiteSpace(input.MBLNO)) + { + throw Oops.Bah("请填写主提单号"); + } + } + + JsonUtil.PropToUpper(input, "ORDNO", "BSSTATUS", "YardContract", "YardContractTel", "YardContractEmail"); JsonUtil.TrimFields(input); if (input.ctnInputs != null) @@ -291,7 +306,7 @@ namespace Myshipping.Application } } - ////booking־ + ////添加booking日志 await _bookinglog.InsertAsync(new BookingLog { Type = "Add", @@ -302,7 +317,7 @@ namespace Myshipping.Application CreatedUserName = UserManager.Name }); - ////ֵ + ////分单不调用 if (!string.IsNullOrWhiteSpace(input.YARDID) && !string.IsNullOrWhiteSpace(input.YARD) && !string.IsNullOrWhiteSpace(input.MBLNO)) { @@ -312,7 +327,7 @@ namespace Myshipping.Application } /// - /// ɾ + /// 删除订舱 /// /// /// @@ -323,11 +338,11 @@ namespace Myshipping.Application var ctnlist = await _repCtn.AsQueryable().Where(x => x.BILLID == Id).Select(x => x.Id).ToListAsync(); await _repCtn.UpdateAsync(x => x.BILLID == Id, x => new BookingCtn { IsDeleted = true }); await _ctndetailrep.UpdateAsync(x => ctnlist.Contains((long)x.CTNID), x => new BookingCtnDetail { IsDeleted = true }); - _logger.LogInformation(Id + "ɾɹ"); + _logger.LogInformation(Id + "删除成功!"); } /// - /// ¶ + /// 更新订舱 /// /// /// @@ -335,6 +350,20 @@ namespace Myshipping.Application [HttpPost("/BookingOrder/Update")] public async Task Update(UpdateBookingOrderInput input) { + if (input.ParentId == 0) + { + if (string.IsNullOrWhiteSpace(input.HBLNO)) + { + throw Oops.Bah("主单不需要填写分单号"); + } + } + else + { + if (string.IsNullOrWhiteSpace(input.MBLNO)) + { + throw Oops.Bah("请填写主提单号"); + } + } JsonUtil.PropToUpper(input, "ORDNO", "BSSTATUS", "YardContract", "YardContractTel", "YardContractEmail"); JsonUtil.TrimFields(input); if (input.ctnInputs != null) @@ -389,7 +418,7 @@ namespace Myshipping.Application { if (flag) { - ////booking־ + ////添加booking日志 bid = await _bookinglog.InsertReturnSnowflakeIdAsync(new BookingLog { Type = "Edit", @@ -420,7 +449,7 @@ namespace Myshipping.Application } /// - /// ȡϸ + /// 获取订舱明细 /// /// /// @@ -452,13 +481,34 @@ namespace Myshipping.Application }; } } + List HbList = new List(); + var _hblist = await _rep.AsQueryable().Where(x => x.ParentId == Id).ToListAsync(); + if (_hblist != null) + { + HbList = _hblist.Adapt>(); + foreach (var item in HbList) + { + var ctnlist = await _repCtn.AsQueryable().Where(x => x.BILLID == item.Id).ToListAsync(); + var ctninput = ctnlist.Adapt>(); + foreach (var it in ctninput) + { + var ctndetaillist = await _ctndetailrep.AsQueryable().Where(x => x.CTNID == it.Id).ToListAsync(); + it.ctnDetailInputs = ctndetaillist.Adapt>(); + } + + item.ctnInputs = ctninput; + } + + ordOut.HbList = HbList; + } + return ordOut; } #endregion - #region ־ע˶̬ + #region 日志、备注、附件、货运动态等 /// - /// ȡ־ϸ + /// 获取日志明细 /// /// /// @@ -480,7 +530,7 @@ namespace Myshipping.Application } /// - /// ȡע + /// 获取备注 /// /// /// @@ -492,7 +542,7 @@ namespace Myshipping.Application } /// - /// ӱע + /// 增加备注 /// /// /// @@ -505,7 +555,7 @@ namespace Myshipping.Application } /// - /// Ӷո + /// 增加订舱附件 /// /// /// @@ -513,15 +563,15 @@ namespace Myshipping.Application [HttpPost("/BookingOrder/AddFile")] public async Task AddFile(IFormFile file, [FromForm] BookingFileDto dto) { - //δϴӡģļ + //未上传打印模板文件 if (file == null || file.Length == 0) { throw Oops.Bah(BookingErrorCode.BOOK200); } var opt = App.GetOptions(); - var originalFilename = file.FileName; // ļԭʼ - var fileSuffix = Path.GetExtension(file.FileName).ToLower(); // ļ׺ + var originalFilename = file.FileName; // 文件原始名称 + var fileSuffix = Path.GetExtension(file.FileName).ToLower(); // 文件后缀 if (!opt.fileType.Contains(fileSuffix)) { throw Oops.Bah(BookingErrorCode.BOOK114); @@ -541,7 +591,7 @@ namespace Myshipping.Application Directory.CreateDirectory(dirAbs); - // ȴȡId + // 先存库获取Id var id = YitIdHelper.NextId(); var fileSaveName = $"{id}{fileSuffix}".ToLower(); var fileRelaPath = Path.Combine(opt.relativePath, fileSaveName).ToLower(); @@ -564,7 +614,7 @@ namespace Myshipping.Application } /// - /// ȡ + /// 获取附件 /// /// /// @@ -577,7 +627,7 @@ namespace Myshipping.Application /// - /// ȡ˶̬ + /// 获取货运动态 /// [HttpGet("/BookingOrder/GetStatusLog")] public async Task> GetBookingStatusLog(long Id) @@ -598,20 +648,18 @@ namespace Myshipping.Application /// - /// ļ + /// 下载文件 /// /// [HttpGet("/BookingOrder/download")] public async Task Download(long id) { - var file = await _bookingfile.FirstOrDefaultAsync(x => x.Id == id); - if (file == null) + var printFile = await _bookingfile.FirstOrDefaultAsync(u => u.Id == id); + if (printFile == null) { throw Oops.Oh(BookingErrorCode.BOOK200); } - - var opt = App.GetOptions(); var dirAbs = opt.basePath; if (string.IsNullOrEmpty(dirAbs)) @@ -619,26 +667,26 @@ namespace Myshipping.Application dirAbs = App.WebHostEnvironment.WebRootPath; } - var fileFullPath = Path.Combine(dirAbs, file.FilePath); + var fileFullPath = Path.Combine(dirAbs, printFile.FilePath); if (!File.Exists(fileFullPath)) { throw Oops.Oh(BookingErrorCode.BOOK115); } - var fileName = HttpUtility.UrlEncode(file.FileName, Encoding.GetEncoding("UTF-8")); + var fileName = HttpUtility.UrlEncode(printFile.FileName, Encoding.GetEncoding("UTF-8")); var result = new FileStreamResult(new FileStream(fileFullPath, FileMode.Open), "application/octet-stream") { FileDownloadName = fileName }; return result; } #endregion - #region + #region 运踪 /// - /// ٽӿ + /// 调用运踪接口 /// [NonAction] public async Task SendTrace(string BusinessId, string YARDID, string YARD, string MBLNO) { - _logger.LogInformation("ᵥţ" + MBLNO + " ٽӿ"); + _logger.LogInformation("提单号:" + MBLNO + " 调用运踪接口"); var key = _repWebAcc.FirstOrDefault(x => x.TenantId == Convert.ToInt64(UserManager.TENANT_ID) && x.TypeCode == "seae_billtraceurl"); var url = _cache.GetAllDictData().Result; BillTraceDto billdto = new BillTraceDto(); @@ -660,11 +708,11 @@ namespace Myshipping.Application billdto.Gid = UserManager.DjyUserId; var json = billdto.ToJsonString(); var html = await url.FirstOrDefault(x => x.TypeCode == "url_set" && x.Code == "request_seae_billtraceurl").Value.SetHttpMethod(HttpMethod.Post).SetQueries(new { msg = json }).SetRetryPolicy(3, 5000).SendAsAsync(); - _logger.LogInformation("ᵥţ" + MBLNO + " ٽӿڷ" + html.ToJsonString()); + _logger.LogInformation("提单号:" + MBLNO + " 调用运踪接口返回" + html.ToJsonString()); } /// - /// ˶̬ + /// 插入货运动态 /// [AllowAnonymous] [SqlSugarUnitOfWork] @@ -674,14 +722,14 @@ namespace Myshipping.Application foreach (var item in all) { - //ԭ + //清空原有数据 var old = await _repStatuslog.AsQueryable().Where(x => x.BookingId == item.BookingId && x.Category == "ship").ToListAsync(); await _repStatuslog.DeleteAsync(x => x.BookingId == item.BookingId && x.Category == "ship"); foreach (var ot in old) { await _statuslogdetail.DeleteAsync(x => x.PId == ot.Id); } - // + //新增数据 var bookingStatusLog = new BookingStatusLog(); bookingStatusLog.BookingId = item.BookingId; bookingStatusLog.Category = "ship"; @@ -709,10 +757,10 @@ namespace Myshipping.Application } #endregion - #region Ų(֪ͨ) + #region 放舱(入货通知) /// - /// ȡŲϢ + /// 获取放舱信息 /// /// /// @@ -737,7 +785,7 @@ namespace Myshipping.Application var output = letterYard.Adapt(); - //Ϣ + //链接信息 var urlModel = _repOrderUrl.FirstOrDefault(x => x.BookingId == bookingId); if (urlModel != null) { @@ -748,7 +796,7 @@ namespace Myshipping.Application } /// - /// 棨޸ģŲ + /// 保存(新增或修改)放舱 /// /// /// @@ -769,14 +817,14 @@ namespace Myshipping.Application var order = _rep.FirstOrDefault(x => x.Id == input.BookingId); - //СƱ + //生成提箱小票 var allowCarrier = _cache.GetAllDictData().Result.Where(x => x.TypeCode == "txxp_carrier_list").Select(x => x.Code).ToList(); if (allowCarrier.Contains(order.CARRIERID)) { var txxpLink = await TxxpLink(input.BookingId); } - //vgm + //vgm链接 allowCarrier = _cache.GetAllDictData().Result.Where(x => x.TypeCode == "vgm_carrier_list").Select(x => x.Code).ToList(); if (!allowCarrier.Contains(order.CARRIERID)) { @@ -785,7 +833,7 @@ namespace Myshipping.Application } /// - /// Ųշ + /// 放舱发送 /// /// /// @@ -799,30 +847,30 @@ namespace Myshipping.Application var letterYard = await _repLetterYard.FirstOrDefaultAsync(x => x.BookingId == bookingId); if (letterYard == null) { - throw Oops.Bah("ŲϢδҵȱ"); + throw Oops.Bah("放舱信息未找到,请先保存数据"); } var mailAcc = await _repUserMail.FirstOrDefaultAsync(x => x.CreatedUserId == user.Id && x.SmtpPort > 0 && x.SmtpServer != null && x.SmtpServer != ""); if (mailAcc == null) { - throw Oops.Bah("ûδûsmtpδȷ"); + throw Oops.Bah("用户邮箱未设置或smtp未正确配置"); } var orderUrl = await _repOrderUrl.FirstOrDefaultAsync(u => u.BookingId == bookingId); if (orderUrl == null) { - throw Oops.Bah("δϢ±"); + throw Oops.Bah("未生成链接信息,请重新保存数据"); } if (string.IsNullOrEmpty(letterYard.AttnMail)) { - throw Oops.Bah("ATTN MAILδȷд"); + throw Oops.Bah("ATTN MAIL未正确填写"); } - #region Ųļصո + #region 保存放舱文件,并挂载到订舱附件 var fileBytes = await GetReportFile(bookingId, "fangcang"); var opt = App.GetOptions(); - var fileSaveName = $"Ų_{order.MBLNO}_{DateTime.Now.Ticks}.pdf"; // ļԭʼ + var fileSaveName = $"放舱_{order.MBLNO}_{DateTime.Now.Ticks}.pdf"; // 文件原始名称 var dirAbs = string.Empty; if (string.IsNullOrEmpty(opt.basePath)) { @@ -852,68 +900,68 @@ namespace Myshipping.Application await _bookingfile.InsertAsync(newFile); #endregion - //˶̬ + //货运动态 var bsl = new BookingStatusLog(); bsl.BookingId = bookingId; - bsl.Status = $"Ųոͻ"; + bsl.Status = $"放舱给客户"; bsl.OpTime = DateTime.Now; bsl.Category = "ship"; bsl.MBLNO = order.MBLNO; await _repStatuslog.InsertAsync(bsl); - //״̬ - await SaveBookingStatus(bookingId, "sta_letter_yard", "Ų"); + //订舱状态 + await SaveBookingStatus(bookingId, "sta_letter_yard", "放舱"); - #region ʼ + #region 发送邮件 - var mailSubject = $"ŲϢ{order.MBLNO}/{order.CARRIERID}/{order.VESSEL}/{order.VOYNO}/PO:{order.PONO}/{order.TenantName}"; + var mailSubject = $"放舱信息:{order.MBLNO}/{order.CARRIERID}/{order.VESSEL}/{order.VOYNO}/PO:{order.PONO}/{order.TenantName}"; var extContent = string.Empty; - if (order.CARGOID == "R") // + if (order.CARGOID == "R") //冻柜 { - extContent = $"¶ȣ{order.TEMPSET}{order.TEMPID}
ͨ磺{order.REEFERF}
ʪȣ{order.HUMIDITY}
"; + extContent = $"温度:{order.TEMPSET}{order.TEMPID}
通风:{order.REEFERF}
湿度:{order.HUMIDITY}
"; } - else if (order.CARGOID == "D") //ΣƷ + else if (order.CARGOID == "D") //危险品 { - extContent = $"ΣƷȼ{order.DCLASS}
ΣƷţ{order.DUNNO}
"; + extContent = $"危险品等级:{order.DCLASS}
危险品编号:{order.DUNNO}
"; } - var mailContent = $@"TO:{order.CUSTOMERNAME} ˾ί˾ճڵĻϢ£лл
-ᵥţ{order.MBLNO}
-Σ{order.VESSEL}/{order.VOYNO}
-Ŀĸۣ{order.PORTDISCHARGE}
-Ԥƴڣ{(order.ETD.HasValue ? order.ETD.Value.Date.ToString("yyyy-MM-dd") : "")}
-վ{order.YARD}
-{order.SHIPAGENCY}
-Ԥƽظʱ䣺{order.CLOSINGDATE}
-Ԥƽصʱ䣺{order.CLOSEDOCDATE}
-VGMʱ䣺{order.CLOSEVGMDATE}
+ var mailContent = $@"TO:{order.CUSTOMERNAME} 贵司委托我司代理订舱出口的货物信息如下,详情请见附件,谢谢!
+提单号:{order.MBLNO}
+船名航次:{order.VESSEL}/{order.VOYNO}
+目的港:{order.PORTDISCHARGE}
+预计船期:{(order.ETD.HasValue ? order.ETD.Value.Date.ToString("yyyy-MM-dd") : "")}
+场站:{order.YARD}
+船代:{order.SHIPAGENCY}
+预计截港时间:{order.CLOSINGDATE}
+预计截单时间:{order.CLOSEDOCDATE}
+截VGM时间:{order.CLOSEVGMDATE}
{extContent} -ע{order.YARDREMARK}
- СƱӣ{orderUrl.UrlTxxp}
- ύVGMӣ{orderUrl.UrlVgm}
+备注:{order.YARDREMARK}
+ 提箱小票链接:{orderUrl.UrlTxxp}
+ 提交VGM链接:{orderUrl.UrlVgm}

- ܰʾ
- Ʊأǰ֪ͨվ˾
- ظʱͷƻΪ׼
- ˾VGM벻ҪͨVGMύݣ˾ȡVGM걨á
+ 温馨提示:
+ 如果分票报关,请回箱前通知场站及我司。
+ 开船及截港时间以码头具体计划为准。
+ 若贵司自输VGM,请不要通过VGM链接提交数据,否则我司收取相关VGM申报费用。

- մϵˣ{UserManager.Name}
- 绰{user.Tel} ֻ{user.Phone}
- 䣺{user.Email} + 订舱代理联系人:{UserManager.Name}
+ 电话:{user.Tel} 手机:{user.Phone}
+ 邮箱:{user.Email}
"; var sendResult = await MailSendHelper.SendMail(mailAcc, mailSubject, mailContent, letterYard.AttnMail); if (!sendResult.Key) { - _logger.LogError($"Ųʼʧܣ{mailAcc.MailAccount}{letterYard.AttnMail} {mailSubject}"); - throw Oops.Bah($"ʼʧܣ{sendResult.Value}"); + _logger.LogError($"放舱邮件发送失败:从{mailAcc.MailAccount}到{letterYard.AttnMail},主题 {mailSubject}"); + throw Oops.Bah($"邮件发送失败:{sendResult.Value}"); } #endregion } /// - /// ȡŲpdf + /// 获取放舱pdf /// /// /// @@ -923,7 +971,7 @@ namespace Myshipping.Application var letterYard = await _repLetterYard.FirstOrDefaultAsync(x => x.BookingId == bookingId); if (letterYard == null) { - throw Oops.Bah("ŲϢδҵȱ"); + throw Oops.Bah("放舱信息未找到,请先保存数据"); } var bs = await GetReportFile(bookingId, "fangcang", 1); var fileName = HttpUtility.UrlEncode($"{bookingId}_{DateTime.Now.Ticks}.pdf", Encoding.GetEncoding("UTF-8")); @@ -933,7 +981,7 @@ namespace Myshipping.Application } /// - /// ȡŲexcel + /// 获取放舱excel /// /// /// @@ -943,7 +991,7 @@ namespace Myshipping.Application var letterYard = await _repLetterYard.FirstOrDefaultAsync(x => x.BookingId == bookingId); if (letterYard == null) { - throw Oops.Bah("ŲϢδҵȱ"); + throw Oops.Bah("放舱信息未找到,请先保存数据"); } var bs = await GetReportFile(bookingId, "fangcang", 2); var fileName = HttpUtility.UrlEncode($"{bookingId}_{DateTime.Now.Ticks}.xlsx", Encoding.GetEncoding("UTF-8")); @@ -952,23 +1000,23 @@ namespace Myshipping.Application } /// - /// ɱļ + /// 生成报表文件 /// /// - /// ͣ1pdf2xlsx - /// ʹ룬fangcangsamplebill + /// 类型,1:pdf、2:xlsx + /// 报表类型代码,例如fangcang、samplebill等 /// [NonAction] private async Task GetReportFile(long bookingId, string typeCode, 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) { @@ -994,36 +1042,36 @@ namespace Myshipping.Application throw Oops.Bah(BookingErrorCode.BOOK115); } - _logger.LogInformation($"׼ñɣid{bookingId}ļ{printTemplate.FileName}"); + _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}"); + _logger.LogInformation($"调用报表生成返回:{rtn}"); if (jobjRtn.GetBooleanValue("Success")) { - //öȡļ + //调用读取文件 var fn = jobjRtn.GetStringValue("Data"); - _logger.LogInformation($"׼öȡļid{bookingId}ļ{fn}"); + _logger.LogInformation($"准备调用读取报表文件:id:{bookingId},文件名:{fn}"); var readFileUrl = $"{reportUrl}Report/GetFile?fileName={fn}"; var bs = await readFileUrl.GetAsByteArrayAsync(); - _logger.LogInformation($"öȡļأ{bs.Length}"); + _logger.LogInformation($"调用读取报表文件返回:{bs.Length}"); return bs; } else { - throw Oops.Bah($"ɱļʧܣ{jobjRtn.GetStringValue("Message")}"); + throw Oops.Bah($"生成报表文件失败:{jobjRtn.GetStringValue("Message")}"); } } #endregion - #region »ֽ + #region 下货纸 /// - /// »ֽ + /// 发送下货纸 /// /// /// @@ -1033,18 +1081,18 @@ namespace Myshipping.Application var rtn = await XiahuozhiHelpler.Send(bookingId, "9"); if (!rtn.Key) { - throw Oops.Bah($"ʧܣ{rtn.Value}"); + throw Oops.Bah($"发送失败:{rtn.Value}"); } - //״̬ - await SaveBookingStatus(bookingId, "sta_xhz", "»ֽ"); + //订舱状态 + await SaveBookingStatus(bookingId, "sta_xhz", "下货纸"); } #endregion - #region ᵥȷϣ + #region 样单(提单确认) /// - /// + /// 样单 /// /// /// @@ -1073,7 +1121,7 @@ namespace Myshipping.Application } /// - /// 棨޸ģ + /// 保存(新增或修改)样单 /// /// /// @@ -1094,7 +1142,7 @@ namespace Myshipping.Application } /// - /// ȡpdf + /// 获取样单pdf /// /// /// @@ -1104,7 +1152,7 @@ namespace Myshipping.Application var samp = await _repSampleBill.FirstOrDefaultAsync(x => x.BookingId == bookingId); if (samp == null) { - throw Oops.Bah("ȱᵥȷݺټ"); + throw Oops.Bah("请先保存提单确认数据后再继续"); } var bs = await GetReportFile(bookingId, "tidanqueren"); @@ -1114,10 +1162,10 @@ namespace Myshipping.Application } #endregion - #region СƱ + #region 小票链接 /// - /// ȡСƱ + /// 获取提箱小票链接 /// /// /// @@ -1143,27 +1191,27 @@ namespace Myshipping.Application return ordUrl.UrlTxxp; } - //У鴬˾ + //校验船公司 if (string.IsNullOrEmpty(order.CARRIERID)) { throw Oops.Bah(BookingErrorCode.BOOK118); } - //жϴ˾Ƿ֧ + //判断船公司是否支持 var allowCarrier = _cache.GetAllDictData().Result.Where(x => x.TypeCode == "txxp_carrier_list").Select(x => x.Code).ToList(); if (!allowCarrier.Contains(order.CARRIERID)) { throw Oops.Bah(BookingErrorCode.BOOK117); } - //ͨ˺ + //亿通账号 var ytAcc = _repWebAcc.FirstOrDefault(x => x.CreatedUserId == UserManager.UserId && x.TypeCode == "YitongWeb"); if (ytAcc == null) { throw Oops.Bah(BookingErrorCode.BOOK119); } - //վת + //场站转换 var yardset = _cache.GetAllMappingYard().Result.FirstOrDefault(y => y.Code == order.YARDID && y.Module == "BookingTxxp"); if (yardset == null) { @@ -1171,13 +1219,13 @@ namespace Myshipping.Application } var ctns = await _repCtn.Where(x => x.BILLID == bookingId).ToListAsync(); - //У¼ + //校验箱子数据录入 if (ctns.Where(c => string.IsNullOrEmpty(c.CTNALL) || !c.CTNNUM.HasValue).Count() > 0) { throw Oops.Bah(BookingErrorCode.BOOK121); } - //ӳ + //箱型映射 var ctnMapping = await _cache.GetAllMappingCtn(); ctnMapping = ctnMapping.Where(x => x.Module == "BookingTxxp").ToList(); if (ctnMapping.Count == 0) @@ -1193,7 +1241,7 @@ namespace Myshipping.Application var user = await _repUser.FirstOrDefaultAsync(x => x.Id == UserManager.UserId); - //СƱ + //调用小票服务 var dicUrlTxxp = _cache.GetAllDictData().Result.First(x => x.TypeCode == "url_set" && x.Code == "txxp_service"); var postObj = new { @@ -1211,7 +1259,7 @@ namespace Myshipping.Application AgentName = UserManager.TENANT_NAME, linkName = UserManager.Name, linkMobile = user.Tel, - CustomerName = $"{UserManager.TENANT_NAME}+{UserManager.Name}", //˾+û + CustomerName = $"{UserManager.TENANT_NAME}+{UserManager.Name}", //公司名称+用户姓名 memo = string.Empty, boxInfo = ctns.Select(c => { @@ -1227,9 +1275,9 @@ namespace Myshipping.Application string strPostObj = postObj.ToJsonString(); - _logger.LogInformation($"СƱӿڴݣ{strPostObj}"); + _logger.LogInformation($"调用提箱小票接口传递数据:{strPostObj}"); var strResp = await dicUrlTxxp.Value.SetBody(postObj).PostAsStringAsync(); - _logger.LogInformation($"СƱӿڷأ{strResp}"); + _logger.LogInformation($"调用提箱小票接口返回:{strResp}"); var jobjResp = JObject.Parse(strResp); int respCode = jobjResp.GetIntValue("code"); @@ -1238,15 +1286,15 @@ namespace Myshipping.Application throw Oops.Bah(BookingErrorCode.BOOK124, jobjResp.GetStringValue("message")); } - //url + //保存url var txxpUrl = jobjResp.GetStringValue("data"); ordUrl.UrlTxxp = txxpUrl; await _repOrderUrl.UpdateAsync(ordUrl); - //˶̬ + //货运动态 var bsl = new BookingStatusLog(); bsl.BookingId = bookingId; - bsl.Status = $"СƱ"; + bsl.Status = $"生成提箱小票链接"; bsl.OpTime = DateTime.Now; bsl.Category = "ship"; bsl.MBLNO = order.MBLNO; @@ -1256,9 +1304,9 @@ namespace Myshipping.Application } #endregion - #region VGMVMG + #region VGM及VMG链接 /// - /// ȡVGMVGM SI + /// 获取VGM、VGM SI链接 /// /// /// @@ -1284,21 +1332,21 @@ namespace Myshipping.Application return new string[] { ordUrl.UrlVgm, ordUrl.UrlVgmSi }; } - //У鴬˾ + //校验船公司 if (string.IsNullOrEmpty(order.CARRIERID)) { throw Oops.Bah(BookingErrorCode.BOOK118); } var ctns = await _repCtn.Where(x => x.BILLID == bookingId).ToListAsync(); - //жϴ˾Ƿ֧ + //判断船公司是否支持 var allowCarrier = _cache.GetAllDictData().Result.Where(x => x.TypeCode == "vgm_carrier_list").Select(x => x.Code).ToList(); if (!allowCarrier.Contains(order.CARRIERID)) { throw Oops.Bah(BookingErrorCode.BOOK117); } - //˾վ˺ + //船公司网站账号 var carrWebAccMap = _cache.GetAllDictData().Result.FirstOrDefault(x => x.TypeCode == "carrier_web_account_mapping" && x.Code == order.CARRIERID); var webacc = _repWebAcc.FirstOrDefault(x => x.TypeCode == carrWebAccMap.Value && x.CreatedUserId == UserManager.UserId); if (webacc == null) @@ -1306,20 +1354,20 @@ namespace Myshipping.Application throw Oops.Bah(BookingErrorCode.BOOK125); } - //վת + //场站转换 var yardset = _cache.GetAllMappingYard().Result.FirstOrDefault(y => y.Code == order.YARDID && y.Module == "BookingVgm"); if (yardset == null) { throw Oops.Bah(BookingErrorCode.BOOK120, order.YARDID); } - //У¼ + //校验箱子数据录入 if (ctns.Where(c => string.IsNullOrEmpty(c.CTNALL) || !c.CTNNUM.HasValue).Count() > 0) { throw Oops.Bah(BookingErrorCode.BOOK121); } - //ӳ + //箱型映射 var ctnMapping = await _cache.GetAllMappingCtn(); ctnMapping = ctnMapping.Where(x => x.Module == "BookingVgm").ToList(); if (ctnMapping.Count == 0) @@ -1333,20 +1381,20 @@ namespace Myshipping.Application throw Oops.Bah(BookingErrorCode.BOOK123, string.Join(',', expCode)); } - //շַ + //接收反馈地址 var dicUrlVgmResp = _cache.GetAllDictData().Result.FirstOrDefault(x => x.TypeCode == "url_reponse" && x.Code == "vgm_si_post_reponse"); var dicUrlSiResp = _cache.GetAllDictData().Result.FirstOrDefault(x => x.TypeCode == "url_reponse" && x.Code == "si_post_response"); var user = await _repUser.FirstOrDefaultAsync(x => x.Id == UserManager.UserId); - //vgmӷ + //调用vgm链接服务 var dicUrl = _cache.GetAllDictData().Result.First(x => x.TypeCode == "url_set" && x.Code == "vgm_link_service"); var postObj = new { SystemCode = "djy_hechuan", billOrderId = order.Id.ToString(), sendOrderCode = order.MBLNO, - customerName = $"{UserManager.TENANT_NAME}+{UserManager.Name}", //˾+û + customerName = $"{UserManager.TENANT_NAME}+{UserManager.Name}", //公司名称+用户姓名 customerId = order.CUSTOMERID.ToString(), agentName = string.IsNullOrEmpty(order.FORWARDER) ? UserManager.TENANT_NAME : order.FORWARDER, carrierCode = order.CARRIERID, @@ -1392,9 +1440,9 @@ namespace Myshipping.Application }; string strPostObj = postObj.ToJsonString(); - _logger.LogInformation($"VGMӽӿ {dicUrl.Value} ݣ{strPostObj}"); + _logger.LogInformation($"调用VGM链接接口 {dicUrl.Value} 传递数据:{strPostObj}"); var strResp = await dicUrl.Value.SetBody(postObj).PostAsStringAsync(); - _logger.LogInformation($"VGMӽӿڷأ{strResp}"); + _logger.LogInformation($"调用VGM链接接口返回:{strResp}"); var jobjResp = JObject.Parse(strResp); int respCode = jobjResp.GetIntValue("code"); @@ -1404,17 +1452,17 @@ namespace Myshipping.Application } - //url + //保存url var memoData = jobjResp.GetJObjectValue("memoData"); ordUrl.UrlVgm = memoData.GetStringValue("vgmUrl"); ordUrl.UrlVgmSi = memoData.GetStringValue("vgmAndSiUrl"); await _repOrderUrl.UpdateAsync(ordUrl); - //˶̬ + //货运动态 var bsl = new BookingStatusLog(); bsl.BookingId = bookingId; - bsl.Status = $"VGM"; + bsl.Status = $"生成VGM链接"; bsl.OpTime = DateTime.Now; bsl.Category = "ship"; bsl.MBLNO = order.MBLNO; @@ -1424,7 +1472,7 @@ namespace Myshipping.Application } /// - /// ֱVGMƱ + /// 直发VGM(单票) /// /// /// @@ -1436,20 +1484,20 @@ namespace Myshipping.Application var dicUrlVgm = _cache.GetAllDictData().Result.First(x => x.TypeCode == "url_set" && x.Code == "vgm_service_single"); - //˾ + //船公司 if (string.IsNullOrEmpty(order.CARRIERID)) { throw Oops.Bah(BookingErrorCode.BOOK118); } - //жϴ˾Ƿ֧ + //判断船公司是否支持 var allowCarrier = _cache.GetAllDictData().Result.Where(x => x.TypeCode == "vgm_carrier_list").Select(x => x.Code).ToList(); if (!allowCarrier.Contains(order.CARRIERID)) { throw Oops.Bah(BookingErrorCode.BOOK117); } - //˾վ˺ + //船公司网站账号 var carrWebAccMap = _cache.GetAllDictData().Result.FirstOrDefault(x => x.TypeCode == "carrier_web_account_mapping" && x.Code == order.CARRIERID); var webacc = _repWebAcc.FirstOrDefault(x => x.TypeCode == carrWebAccMap.Value && x.CreatedUserId == UserManager.UserId); if (webacc == null) @@ -1457,13 +1505,13 @@ namespace Myshipping.Application throw Oops.Bah(BookingErrorCode.BOOK125); } - //ᵥŲΪ + //提单号不能为空 if (string.IsNullOrEmpty(order.MBLNO)) { throw Oops.Bah(BookingErrorCode.BOOK127); } - //ӳ + //箱型映射 var ctnMapping = await _cache.GetAllMappingCtn(); ctnMapping = ctnMapping.Where(x => x.Module == "BookingVgm").ToList(); if (ctnMapping.Count == 0) @@ -1477,8 +1525,8 @@ namespace Myshipping.Application throw Oops.Bah(BookingErrorCode.BOOK123, string.Join(',', expCode)); } - #region ϢУ飬2022-7-1޸ģۼӡıƤغͳءֻҪΪ - if (ctns.Where(c => c.WEIGHTYPE == "ۼ" && + #region 箱信息校验,2022-7-1修改:【累加】的必须有重量、皮重和称重重量;【总重】的只需要称重重量不为空 + if (ctns.Where(c => c.WEIGHTYPE == "累加" && ( string.IsNullOrEmpty(c.CNTRNO) || !c.WEIGHKGS.HasValue @@ -1489,22 +1537,22 @@ namespace Myshipping.Application || c.KGS == 0) ).Count() > 0) { - throw Oops.Bah("طʽΪۼʱšƤԼΪ"); + throw Oops.Bah("称重方式为累加时,箱号、重量、箱皮重以及称重重量都不能为空"); } - if (ctns.Where(c => c.WEIGHTYPE == "" && + if (ctns.Where(c => c.WEIGHTYPE == "总重" && ( string.IsNullOrEmpty(c.CNTRNO) || !c.WEIGHKGS.HasValue || c.WEIGHKGS == 0) ).Count() > 0) { - throw Oops.Bah("طʽΪʱźͳΪ"); + throw Oops.Bah("称重方式为总重时,箱号和称重重量都不能为空"); } #endregion - //վת + //场站转换 var yardset = _cache.GetAllMappingYard().Result.FirstOrDefault(y => y.Code == order.YARDID && y.Module == "BookingVgm"); if (yardset == null) { @@ -1514,14 +1562,14 @@ namespace Myshipping.Application var user = await _repUser.FirstOrDefaultAsync(x => x.Id == UserManager.UserId); int idx = 1; - //ýӿ + //调用接口 var dicUrl = _cache.GetAllDictData().Result.First(x => x.TypeCode == "url_set" && x.Code == "vgm_service_single"); var sendObj = new { SystemCode = "djy_hechuan", billOrderId = order.Id.ToString(), sendOrderCode = order.MBLNO, - customerName = $"{UserManager.TENANT_NAME}+{UserManager.Name}", //˾+û + customerName = $"{UserManager.TENANT_NAME}+{UserManager.Name}", //公司名称+用户姓名 customerId = order.CUSTOMERID.ToString(), agentName = string.IsNullOrEmpty(order.FORWARDER) ? UserManager.TENANT_NAME : order.FORWARDER, carrierCode = order.CARRIERID, @@ -1551,15 +1599,15 @@ namespace Myshipping.Application weigth = c.KGS, weigthTare = c.TAREWEIGHT, weigthTotal = c.WEIGHKGS, - weigthType = c.WEIGHTYPE == "ۼ" ? "SM2" : "SM1" + weigthType = c.WEIGHTYPE == "累加" ? "SM2" : "SM1" }).ToList(), returnOkUrl = "" }; string strPostObj = sendObj.ToJsonString(); - _logger.LogInformation($"VGMֱӿ {dicUrl.Value} ݣ{strPostObj}"); + _logger.LogInformation($"调用VGM直发接口 {dicUrl.Value} 传递数据:{strPostObj}"); var strResp = await dicUrl.Value.SetBody(sendObj).PostAsStringAsync(); - _logger.LogInformation($"VGMֱӿڷأ{strResp}"); + _logger.LogInformation($"调用VGM直发接口返回:{strResp}"); var jobjResp = JObject.Parse(strResp); int respCode = jobjResp.GetIntValue("code"); @@ -1569,10 +1617,10 @@ namespace Myshipping.Application } - //˶̬ + //货运动态 var bsl = new BookingStatusLog(); bsl.BookingId = bookingId; - bsl.Status = $"ֱVGM"; + bsl.Status = $"直发VGM"; bsl.OpTime = DateTime.Now; bsl.Category = "ship"; bsl.MBLNO = order.MBLNO; @@ -1583,55 +1631,55 @@ namespace Myshipping.Application #endregion - #region աصEDI + #region 订舱、截单EDI /// - /// ͶաصEDI + /// 发送订舱、截单EDI /// - /// աصEDI - /// ػִ + /// 订舱、截单EDI请求 + /// 返回回执 [HttpPost("/BookingOrder/SendBookingOrClosingEDI")] public async Task SendBookingOrClosingEDI(BookingOrClosingEDIOrderDto model) { /* - ͶպͽصEDI - 1ͨŻȡϢ - 2鶩ıϢ - 3ݴ˾IDȡӦ·ö١ - 4ȡEDIתװͺšװʽ - 5ȡEDIϢȡ˾صEDIá - 6ϸϢ - 7ɶջ߽صEDIģļ· + 发送订舱和截单EDI的流程 + 1、通过订单号获取订单信息。 + 2、检查订单的必填信息。 + 3、根据船公司ID获取对应的路由枚举。 + 4、获取EDI转换参数。(集装箱型号、包装方式) + 5、读取EDI的配置信息,获取船公司相关的EDI配置。 + 6、检查详细信息。 + 7、生成订舱或者截单EDI报文,并返回文件保存绝对路径。 */ if (model.Id == 0) - throw Oops.Bah("IdΪ"); + throw Oops.Bah("订单Id不能为空"); var order = _rep.FirstOrDefault(a => a.Id == model.Id); if (order == null) - throw Oops.Bah($"ȡϢʧ"); + throw Oops.Bah($"获取订单信息失败"); CheckBookingOrClosingEDI(order); EDIRouteEnum ediRouteEnum = GetEDIRoute(order.CARRIERID); if (ediRouteEnum == EDIRouteEnum.NULL) - throw Oops.Bah($"ǰ˾ûжӦ·"); + throw Oops.Bah($"当前船公司没有对应的请求路由配置"); - //װ + //集装箱型 var ediCtnList = _cache.GetAllMappingCtn().GetAwaiter().GetResult() .Where(t => t.Module.Equals(CONST_MAPPING_MODULE, StringComparison.OrdinalIgnoreCase)).ToList(); - //װ + //包装 var ediPkgsList = _cache.GetAllMappingPackage().GetAwaiter().GetResult() .Where(t => t.Module.Equals(CONST_MAPPING_MODULE, StringComparison.OrdinalIgnoreCase)).ToList(); - //EDI SO\SI + //EDI SO\SI代码 var ediSOSICfg = _cache.GetAllMappingCarrier().GetAwaiter().GetResult() .FirstOrDefault(t => t.Module.Equals(CONST_MAPPING_MODULE, StringComparison.OrdinalIgnoreCase) && t.Code.Equals(order.CARRIERID, StringComparison.OrdinalIgnoreCase)); if (ediSOSICfg == null || string.IsNullOrWhiteSpace(ediSOSICfg.MapCode)) - throw Oops.Bah($"CARRIERID={order.CARRIERID} SO(SI)Ĵ˾EDIδҵ"); + throw Oops.Bah($"CARRIERID={order.CARRIERID} 发送SO(SI)的船公司EDI代码未找到"); var ediModel = new EDIBaseModel(); @@ -1639,16 +1687,16 @@ namespace Myshipping.Application .FirstOrDefault(a => a.EDICODE.Equals(ediRouteEnum.ToString(), StringComparison.OrdinalIgnoreCase)); if (ftpSet == null) - throw Oops.Bah($"ȡEDICODE={ediRouteEnum.ToString()}EDIʧ"); + throw Oops.Bah($"获取EDICODE={ediRouteEnum.ToString()}的EDI参数设置失败"); ediModel.SENDCODE = ftpSet.SENDCODE; ediModel.SENDNAME = ftpSet.SENDNAME; ediModel.RECEIVECODE = ftpSet.RECEIVECODE; - ediModel.filetype = model.sendType; // + ediModel.filetype = model.sendType; //订舱 ediModel.filerole = model.fileRole; - //ȡļ + //读取文件配置 var fileCfg = App.GetOptions(); string filePath = $"{Path.Combine(!string.IsNullOrWhiteSpace(fileCfg.basePath) ? fileCfg.basePath : App.WebHostEnvironment.WebRootPath, fileCfg.relativePath)}/edifiles/{order.BSNO}"; @@ -1656,7 +1704,7 @@ namespace Myshipping.Application if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) filePath = filePath.Replace("\\", "/"); - //ԤȴĿ¼ + //预先创建目录 if (!Directory.Exists(filePath)) { Directory.CreateDirectory(filePath); @@ -1677,40 +1725,40 @@ namespace Myshipping.Application var ediPkgs = ediPkgsList.FirstOrDefault(x => x.Code.Equals(order.KINDPKGS, StringComparison.OrdinalIgnoreCase)); if (ediPkgs == null || string.IsNullOrWhiteSpace(ediPkgs.MapCode)) - throw Oops.Bah($"װ{order.KINDPKGS}EDIδҵ"); + throw Oops.Bah($"包装{order.KINDPKGS}的EDI代码未找到"); primaryModel.KINDPKGS_EDI_CODE = ediPkgs.MapCode?.Trim(); - //Ϣ + //箱信息 var contaList = _repCtn.AsQueryable().Where(t => t.BILLID == order.Id).ToList(); primaryModel.CTNLIST = new List(); - //װ + //集装箱 foreach (var conta in contaList) { var contaModel = conta.Adapt(); - //EDI + //EDI箱型 var currConta = ediCtnList.FirstOrDefault(x => x.Code.Equals(conta.CTNCODE, StringComparison.OrdinalIgnoreCase)); if (currConta == null) - throw Oops.Oh($"{conta.CTNCODE}EDIδҵ"); + throw Oops.Oh($"箱型{conta.CTNCODE}的EDI代码未找到"); contaModel.CTNALLCODE = currConta.MapCode; - //EDIװ + //EDI包装 var ediContaPkgs = ediPkgsList.FirstOrDefault(x => x.Code.Equals(conta.KINDPKGS, StringComparison.OrdinalIgnoreCase)); if (currConta == null) - throw Oops.Oh($"װװ{conta.KINDPKGS}EDIδҵ"); + throw Oops.Oh($"集装箱包装{conta.KINDPKGS}的EDI代码未找到"); contaModel.KINDPKGS_EDI_CODE = ediContaPkgs.MapCode; primaryModel.CTNLIST.Add(contaModel); } - //Ʒ + //多品名 var cargoList = _ctndetailrep.AsQueryable().Where(t => contaList.Select(a => a.Id).ToArray().Contains(t.CTNID.Value)).ToList(); primaryModel.CTNGOODSLIST = new List(); @@ -1724,14 +1772,14 @@ namespace Myshipping.Application var ediDetailPkgs = ediPkgsList.FirstOrDefault(x => x.Code.Equals(cargo.KINDPKGS, StringComparison.OrdinalIgnoreCase)); if (ediDetailPkgs == null) - throw Oops.Oh($"ϸİװ{cargo.KINDPKGS}EDIδҵ"); + throw Oops.Oh($"货明细的包装{cargo.KINDPKGS}的EDI代码未找到"); cargoModel.KINDPKGS_EDI_CODE = ediDetailPkgs.MapCode; primaryModel.CTNGOODSLIST.Add(cargoModel); } - //ʱֵȷӦչֶκֵ + //这里临时赋值,等明确对应的扩展表字段后赋值 #if DEBUG primaryModel.MasterBOLIndicator = "A1"; primaryModel.ConsigneeEdiCode = "CEE1"; @@ -1760,7 +1808,7 @@ namespace Myshipping.Application #endregion /// - /// + /// 触发订舱 /// /// /// @@ -1778,10 +1826,10 @@ namespace Myshipping.Application #region PIL string strCheck = PILEdiHelper.IsCreatePILEDI(ediModel); - _logger.LogInformation($"SO(SI)У飺{strCheck}ݶ{JsonConvert.SerializeObject(ediModel)}"); + _logger.LogInformation($"调用SO(SI),校验:{strCheck},数据对象:{JsonConvert.SerializeObject(ediModel)}"); if (!string.IsNullOrWhiteSpace(strCheck)) - throw Oops.Bah($"{EDIRouteEnum.PIL.ToString()}Уʧܣ{strCheck}"); + throw Oops.Bah($"发送{EDIRouteEnum.PIL.ToString()}校验失败,{strCheck}"); string ediFile = PILEdiHelper.CreateEdiPIL(ediModel); #endregion @@ -1793,10 +1841,10 @@ namespace Myshipping.Application #region TSL string strCheck = TSLEdiHelper.IsCreateTSL(ediModel); - _logger.LogInformation($"SO(SI)У飺{strCheck}ݶ{JsonConvert.SerializeObject(ediModel)}"); + _logger.LogInformation($"调用SO(SI),校验:{strCheck},数据对象:{JsonConvert.SerializeObject(ediModel)}"); if (!string.IsNullOrWhiteSpace(strCheck)) - throw Oops.Bah($"{EDIRouteEnum.PIL.ToString()}Уʧܣ{strCheck}"); + throw Oops.Bah($"发送{EDIRouteEnum.PIL.ToString()}校验失败,{strCheck}"); string ediFile = string.Empty; @@ -1818,10 +1866,10 @@ namespace Myshipping.Application #region WY string strCheck = WYEdiHelper.IsCreateWYEDI(ediModel); - _logger.LogInformation($"SO(SI)У飺{strCheck}ݶ{JsonConvert.SerializeObject(ediModel)}"); + _logger.LogInformation($"调用SO(SI),校验:{strCheck},数据对象:{JsonConvert.SerializeObject(ediModel)}"); if (!string.IsNullOrWhiteSpace(strCheck)) - throw Oops.Bah($"{EDIRouteEnum.PIL.ToString()}Уʧܣ{strCheck}"); + throw Oops.Bah($"发送{EDIRouteEnum.PIL.ToString()}校验失败,{strCheck}"); string ediFile = WYEdiHelper.CreateEdiWY(ediModel); #endregion @@ -1834,10 +1882,10 @@ namespace Myshipping.Application #region YML string strCheck = YMLEdiHelper.IsCreateYMLEDI(ediModel); - _logger.LogInformation($"SO(SI)У飺{strCheck}ݶ{JsonConvert.SerializeObject(ediModel)}"); + _logger.LogInformation($"调用SO(SI),校验:{strCheck},数据对象:{JsonConvert.SerializeObject(ediModel)}"); if (!string.IsNullOrWhiteSpace(strCheck)) - throw Oops.Bah($"{EDIRouteEnum.PIL.ToString()}Уʧܣ{strCheck}"); + throw Oops.Bah($"发送{EDIRouteEnum.PIL.ToString()}校验失败,{strCheck}"); string ediFile = string.Empty; @@ -1859,10 +1907,10 @@ namespace Myshipping.Application #region YT string strCheck = YTEdiHelper.IsCreateYTEDI(ediModel); - _logger.LogInformation($"SO(SI)У飺{strCheck}ݶ{JsonConvert.SerializeObject(ediModel)}"); + _logger.LogInformation($"调用SO(SI),校验:{strCheck},数据对象:{JsonConvert.SerializeObject(ediModel)}"); if (!string.IsNullOrWhiteSpace(strCheck)) - throw Oops.Bah($"{EDIRouteEnum.PIL.ToString()}Уʧܣ{strCheck}"); + throw Oops.Bah($"发送{EDIRouteEnum.PIL.ToString()}校验失败,{strCheck}"); string ediFile = YTEdiHelper.CreateEdiYT(ediModel); #endregion @@ -1881,27 +1929,27 @@ namespace Myshipping.Application } /// - /// 鶩աصEDIϢ + /// 检查订舱、截单EDI订单信息 /// /// [NonAction] private void CheckBookingOrClosingEDI(BookingOrder order) { if (string.IsNullOrWhiteSpace(order.CARRIERID)) - throw Oops.Bah("˾д"); + throw Oops.Bah("船公司必须填写"); if (string.IsNullOrWhiteSpace(order.OPID)) - throw Oops.Bah("δд"); + throw Oops.Bah("未填写操作人"); if (string.IsNullOrWhiteSpace(order.KINDPKGS)) - throw Oops.Bah("װδд"); + throw Oops.Bah("包装种类未填写"); } /// - /// ݴ˾IDȡEDI·ö + /// 根据船公司ID获取EDI的路由枚举 /// - /// ˾ID - /// õ·ö + /// 船公司ID + /// 返回适用的路由枚举 [NonAction] private EDIRouteEnum GetEDIRoute(string carrierId) { @@ -1936,9 +1984,9 @@ namespace Myshipping.Application return routeEnum; } - #region + #region 其他 /// - /// ȡûjson + /// 获取用户报表的json /// /// [HttpGet("/BookingOrder/GenReportJson")] @@ -1959,36 +2007,36 @@ namespace Myshipping.Application } /// - /// ɱļ + /// 生成报表文件 /// /// - /// ͣӦֵеġմӡģ͡ + /// 类型,对应字典中的【订舱打印模板类型】 /// [HttpGet("/BookingOrder/GenReportFile")] public async Task GenReportFile(long id, string type) { - //ӡַ + //打印报表服务地址 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 == id); if (order == null) { throw Oops.Bah(BookingErrorCode.BOOK001); } - //ӡģ + //打印模板 var printTemplate = _repPrint.FirstOrDefault(x => x.TenantId == order.TenantId && x.TypeCode == type); if (printTemplate == null) { throw Oops.Bah(BookingErrorCode.BOOK112); } - //ȡ· + //读取配置路劲 var opt = App.GetOptions(); var dirAbs = opt.basePath; if (string.IsNullOrEmpty(dirAbs)) @@ -1996,31 +2044,31 @@ namespace Myshipping.Application dirAbs = App.WebHostEnvironment.WebRootPath; } - //ȡģ岢ýӿ + //读取模板并调用接口 var fileAbsPath = Path.Combine(dirAbs, printTemplate.FilePath).ToLower(); if (!File.Exists(fileAbsPath)) { throw Oops.Bah(BookingErrorCode.BOOK112); } - _logger.LogInformation($"׼ñɣid{id}ļ{printTemplate.FileName}"); + _logger.LogInformation($"准备调用报表生成:id:{id},文件:{printTemplate.FileName}"); var genUrl = reportUrl + "Report/BookingReport?bookingId=" + id; 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}"); + _logger.LogInformation($"调用报表生成返回:{rtn}"); if (jobjRtn.GetBooleanValue("Success")) { - //öȡļ + //调用读取文件 var fn = jobjRtn.GetStringValue("Data"); - _logger.LogInformation($"׼öȡļid{id}ļ{fn}"); + _logger.LogInformation($"准备调用读取文件:id:{id},文件名:{fn}"); var readFileUrl = reportUrl + "Report/GetFile?fileName=" + fn; var bs = await readFileUrl.GetAsByteArrayAsync(); - _logger.LogInformation($"öȡļأ{bs.Length}"); + _logger.LogInformation($"调用读取文件返回:{bs.Length}"); var fileName = HttpUtility.UrlEncode($"{id}_{type}_{DateTime.Now.Ticks}.pdf", Encoding.GetEncoding("UTF-8")); var result = new FileContentResult(bs, "application/octet-stream") { FileDownloadName = fileName }; @@ -2028,50 +2076,25 @@ namespace Myshipping.Application } else { - throw Oops.Bah($"ɱļʧܣ{jobjRtn.GetStringValue("Message")}"); - } - - } - - /// - /// ȡվ - /// - /// - /// - /// - [HttpGet("/BookingOrder/GetYardData")] - public async Task GetYardData(long bookingId, bool isWeb = false) - { - // - var order = _rep.FirstOrDefault(x => x.Id == bookingId); - if (order == null) - { - throw Oops.Bah(BookingErrorCode.BOOK001); - } - - var rtn = await YardDataHelper.GetYardData(order.TenantId.Value, order.TenantName, order.MBLNO, order.YARDID, isWeb); - if (!rtn.Key) - { - throw Oops.Bah(rtn.Value); + throw Oops.Bah($"生成报表文件失败:{jobjRtn.GetStringValue("Message")}"); } - return rtn.Value; } /// - /// ¼¶״̬ + /// 记录或更新订舱状态 /// /// /// /// /// [NonAction] - private async Task SaveBookingStatus(long bookingId, string code, string name) + public async Task SaveBookingStatus(long bookingId, string code, string name) { var bookSta = _repBookingStatus.FirstOrDefault(x => x.BookingId == bookingId && x.StaCode == code); if (bookSta == null) { - //¼״̬ + //记录状态 bookSta = new BookingStatus(); bookSta.BookingId = bookingId; bookSta.StaCode = code;