using Myshipping.Core; using Furion.DependencyInjection; using Furion.DynamicApiController; using Mapster; using Microsoft.AspNetCore.Mvc; using SqlSugar; using System.Linq; using System.Threading.Tasks; using Myshipping.Application.Entity; using Microsoft.AspNetCore.Authorization; using Furion; using Microsoft.AspNetCore.Http; using Furion.DataEncryption; using System.Collections.Generic; using System.Security.Claims; using Microsoft.AspNetCore.Authentication.Cookies; using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Identity; using Furion.FriendlyException; using Furion.Logging; using System; using Microsoft.Extensions.Logging; using System.Reflection; using System.ComponentModel; using Myshipping.Application.ConfigOption; using System.IO; using Yitter.IdGenerator; using Myshipping.Core.Entity; using Furion.RemoteRequest.Extensions; using System.Net.Http; using Myshipping.Core.Service; using System.Reflection.Emit; using Myshipping.Application.Service.BookingOrderSeaeEdi.Dto; using Myshipping.Application.Enum; using Myshipping.Application.Service.BookingOrder.Dto; using Newtonsoft.Json.Linq; using System.Text; using System.Web; namespace Myshipping.Application { /// /// 舱单服务 /// [ApiDescriptionSettings("Application", Name = "BookingOrderSeaeEdi", Order = 1)] public class BookingOrderSeaeEdiService : IBookingOrderSeaeEdiService, IDynamicApiController, ITransient { private readonly ILogger _logger; private readonly SqlSugarRepository _seaeedi; private readonly SqlSugarRepository _seaeedictn; private readonly ISysCacheService _cache; private readonly SqlSugarRepository _repStatuslog; private readonly IDjyWebsiteAccountConfigService _webAccountConfig; public BookingOrderSeaeEdiService(ILogger logger, SqlSugarRepository seaeedi, SqlSugarRepository seaeedictn, ISysCacheService cache, SqlSugarRepository repStatuslog, IDjyWebsiteAccountConfigService webAccountConfig) { this._logger = logger; this._seaeedi = seaeedi; this._seaeedictn = seaeedictn; this._cache = cache; this._repStatuslog = repStatuslog; this._webAccountConfig = webAccountConfig; } /// /// 获取数据 /// /// /// [HttpGet("/BookingOrderSeaeEdi/PageESeaeEdi")] public async Task> PageESeaeEdi(long bookingId) { var entities = await _seaeedi.AsQueryable().Filter(null, true).Where(x => x.BookingId == bookingId).ToListAsync(); var list = entities.Adapt>(); foreach (var item in list) { var ctn = await _seaeedictn.AsQueryable().Filter(null, true).Where(x => x.PId == item.Id).ToListAsync(); item.EdiCtn = ctn.Adapt>(); } return list; } /// /// 立即返回保存信息 /// /// /// [HttpPost("/BookingOrderSeaeEdi/Save")] public async Task Save(BookingOrderSeaeEdiServiceDto input) { if (input == null) { throw Oops.Bah("请传入正常数据!"); } if (!string.IsNullOrWhiteSpace(input.MBLNO)) { var et = await _seaeedi.Where(x => x.MBLNO == input.MBLNO && x.TenantId == UserManager.TENANT_ID && x.HBLNO == input.HBLNO && x.Id != input.Id).FirstAsync(); if (et != null) { throw Oops.Bah("当前提单号已存在,请勿重复录入!"); } } var entity = input.Adapt(); entity.State = "已录入"; if (input.Id == 0) { await _seaeedi.InsertAsync(entity); if (input.EdiCtn != null) { foreach (var item in input.EdiCtn) { var ctn = item.Adapt(); ctn.PId = entity.Id; await _seaeedictn.InsertAsync(ctn); } } } else { await _seaeedi.AsUpdateable(entity).IgnoreColumns(it => new { it.MBLNO, it.HBLNO, it.BookingId, it.TenantId, it.CreatedTime, it.CreatedUserId, it.CreatedUserName, it.IsDeleted }).ExecuteCommandAsync(); await _seaeedictn.DeleteAsync(x => x.PId == input.Id); if (input.EdiCtn != null) { foreach (var item in input.EdiCtn) { var ctn = item.Adapt(); ctn.PId = entity.Id; await _seaeedictn.InsertAsync(ctn); } } } var entities = await _seaeedi.AsQueryable().Filter(null, true).Where(x => x.BookingId == entity.Id).ToListAsync(); var list = entities.Adapt>(); foreach (var item in list) { var ctn = await _seaeedictn.AsQueryable().Filter(null, true).Where(x => x.PId == item.Id).ToListAsync(); item.EdiCtn = ctn.Adapt>(); } return list; } /// /// 删除舱单 /// /// /// [SqlSugarUnitOfWork] [HttpPost("/BookingOrderSeaeEdi/Delete")] public async Task Delete(string Ids) { var arr = Ids.Split(","); if (arr.Count() > 0) { foreach (var ar in arr) { long Id = Convert.ToInt64(ar); await _seaeedi.UpdateAsync(x => x.Id == Id, x => new BookingOrderSeaeEdi { IsDeleted = true }); await _seaeedictn.UpdateAsync(x => x.PId == Id, x => new BookingOrderSeaeEdiCtn { IsDeleted = true }); _logger.LogInformation(Id + "删除成功!"); } } } #region 舱单 /// /// 舱单 /// /// /// [HttpPost("/BookingOrderSeaeEdi/CustEDI")] public async Task CustEDI(long bookingId) { var order = await _seaeedi.AsQueryable().Filter(null, true).Where(x => x.BookingId == bookingId).FirstAsync(); var ctns = await _seaeedictn.AsQueryable().Filter(null, true).Where(x => x.PId == order.Id).ToListAsync(); //船公司 if (string.IsNullOrEmpty(order.CARRIERID)) { throw Oops.Bah(BookingErrorCode.BOOK118); } //提单号不能为空 if (string.IsNullOrEmpty(order.MBLNO)) { throw Oops.Bah(BookingErrorCode.BOOK127); } if (string.IsNullOrEmpty(order.YARDID)) { throw Oops.Bah("场站未正确选择"); } var dicUrl = _cache.GetAllDictData().Result.First(x => x.TypeCode == "url_set" && x.Code == "request_emf"); var key = _webAccountConfig.GetAccountConfig("DjyCangDan", UserManager.UserId).Result; List custEDIDtos = new List(); MDATA mDATA = new MDATA(); List CTNDATA = new List(); mDATA = order.Adapt(); CTNDATA = ctns.Adapt>(); custEDIDtos.Add( new CustEDIDto { MDATA = mDATA, CTNDATA = CTNDATA } ); string strPostObj = custEDIDtos.ToJsonString(); var sendObj = new { ac = "emf", uid = UserManager.DjyUserId, skey = key.Password, optype = "3", data = strPostObj }; _logger.LogInformation($"调用舱单接口 {dicUrl.Value} 传递数据:{strPostObj}"); var strResp = await dicUrl.Value.SetContentType("multipart/form-data").SetBody(sendObj).PostAsStringAsync(); _logger.LogInformation($"调用舱单接口返回:{strResp}"); var jobjResp = JObject.Parse(strResp); int respCode = jobjResp.GetIntValue("code"); if (respCode != 200) { throw Oops.Bah(BookingErrorCode.BOOK129, jobjResp.GetStringValue("message")); } //货运动态 var bsl = new BookingStatusLog(); bsl.BookingId = bookingId; bsl.Status = $"保存舱单"; bsl.OpTime = DateTime.Now; bsl.Category = "ship"; bsl.MBLNO = order.MBLNO; await _repStatuslog.InsertAsync(bsl); await _seaeedi.UpdateAsync(x => x.Id == bookingId, x => new BookingOrderSeaeEdi { State = "已发送" }); } #endregion } }