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.DataSync.Dto; using Newtonsoft.Json.Linq; using Myshipping.Application.Service.BookingOrder.Dto; using Myshipping.Application.Enum; using Myshipping.Core.Helper; using Furion.TaskScheduler; using System.Linq.Expressions; namespace Myshipping.Application { /// /// 数据同步服务 /// [ApiDescriptionSettings("Application", Name = "DataSync", Order = 1), AllowAnonymous] public class DataSyncService : IDynamicApiController, ITransient { private readonly ILogger _logger; private readonly ISysCacheService _cache; private readonly SqlSugarRepository _rep; private readonly SqlSugarRepository _repCtn; private readonly SqlSugarRepository _ctndetailrep; private readonly SqlSugarRepository _repUser; private readonly SqlSugarRepository _repTenant; private readonly SqlSugarRepository _djycustomer; private readonly SqlSugarRepository _djycustomercontact; private readonly SqlSugarRepository _vesselinfo; private readonly SqlSugarRepository _bookingEDIExt; private readonly SqlSugarRepository _bookinglog; private readonly SqlSugarRepository _bookinglogdetail; private readonly SqlSugarRepository _bookingremark; private readonly SqlSugarRepository _goodsStatus; private readonly SqlSugarRepository _goodsStatusConfig; private readonly SqlSugarRepository _repline; private readonly SqlSugarRepository _mapcarrier; private readonly SqlSugarRepository _codeLaneRep; private readonly SqlSugarRepository _codePortRep; private readonly SqlSugarRepository _relaPortLane; private readonly ICommonDBService _commonDBService; private readonly SqlSugarRepository _codeForwarder; private readonly SqlSugarRepository _bookingfile; private readonly SqlSugarRepository _accountconfig; private readonly SqlSugarRepository _repStatuslog; private readonly SqlSugarRepository _statuslogdetail; private readonly SqlSugarRepository _repBookingStatus; private readonly IBookingOrderService _bookingorderservice; public DataSyncService(ILogger logger, ISysCacheService cache, SqlSugarRepository rep, SqlSugarRepository repCtn, SqlSugarRepository repUser, SqlSugarRepository repTenant, SqlSugarRepository djycustomer, SqlSugarRepository statuslog, SqlSugarRepository statuslogdetail, SqlSugarRepository repBookingStatus, SqlSugarRepository djycustomercontact, SqlSugarRepository vesselinfo, SqlSugarRepository ctndetailrep , SqlSugarRepository bookingEDIExt, SqlSugarRepository bookinglog, SqlSugarRepository bookinglogdetail, SqlSugarRepository goodsStatus, SqlSugarRepository goodsStatusConfig, SqlSugarRepository repline, SqlSugarRepository bookingremark, SqlSugarRepository mapcarrier, SqlSugarRepository codeForwarder, SqlSugarRepository codePortRep, SqlSugarRepository codeLaneRep, ICommonDBService commonDBService, SqlSugarRepository relaPortLane, SqlSugarRepository accountconfig, SqlSugarRepository bookingfile, IBookingOrderService bookingorderservice) { this._logger = logger; this._rep = rep; this._repCtn = repCtn; this._cache = cache; this._repUser = repUser; this._repTenant = repTenant; this._djycustomer = djycustomer; this._djycustomercontact = djycustomercontact; this._vesselinfo = vesselinfo; this._ctndetailrep = ctndetailrep; this._bookingEDIExt = bookingEDIExt; this._bookinglog = bookinglog; this._bookinglogdetail = bookinglogdetail; this._bookingremark = bookingremark; this._goodsStatus = goodsStatus; this._goodsStatusConfig = goodsStatusConfig; this._repline = repline; this._mapcarrier = mapcarrier; this._codePortRep = codePortRep; this._codeLaneRep = codeLaneRep; this._commonDBService = commonDBService; this._relaPortLane = relaPortLane; this._codeForwarder = codeForwarder; this._accountconfig = accountconfig; this._bookingfile = bookingfile; this._bookingorderservice = bookingorderservice; this._repStatuslog = statuslog; this._statuslogdetail = statuslogdetail; this._repBookingStatus = repBookingStatus; } #region 上传数据 /// /// 同步客户 /// /// 参数 /// [HttpPost("/DataSync/SyncCustomer"), ApiUser(ApiCode = "SyncCustomer")] public async Task SyncCustomer(DjyCustomerSyncDto model) { var userlist = await _repUser.AsQueryable().Filter(null, true).Where(x => x.IsDeleted == false && x.TenantId == UserManager.TENANT_ID).ToListAsync(); if (string.IsNullOrWhiteSpace(model.ShortName)) { throw Oops.Bah("简称未录入"); } var m = await _djycustomer.AsQueryable().Filter(null, true).Where(x => x.ShortName == model.ShortName && x.IsDeleted == false && x.TenantId == UserManager.TENANT_ID).FirstAsync(); var entity = model.Adapt(); if (!string.IsNullOrEmpty(entity.SALE)) { entity.SALEID = userlist.Where(x => x.Name == entity.SALE).Count() == 0 ? "" : userlist.Where(x => x.Name == entity.SALE).Select(x => x.Id).FirstOrDefault().ToString(); } if (!string.IsNullOrEmpty(entity.OP)) { entity.OPID = userlist.Where(x => x.Name == entity.OP).Count() == 0 ? "" : userlist.Where(x => x.Name == entity.OP).Select(x => x.Id).FirstOrDefault().ToString(); } if (!string.IsNullOrEmpty(entity.DOC)) { entity.DOCID = userlist.Where(x => x.Name == entity.DOC).Count() == 0 ? "" : userlist.Where(x => x.Name == entity.DOC).Select(x => x.Id).FirstOrDefault().ToString(); } if (!string.IsNullOrEmpty(entity.CUSTSERVICE)) { entity.CUSTSERVICEID = userlist.Where(x => x.Name == entity.CUSTSERVICE).Count() == 0 ? "" : userlist.Where(x => x.Name == entity.CUSTSERVICE).Select(x => x.Id).FirstOrDefault().ToString(); } if (entity.Level == "R3" && !string.IsNullOrEmpty(entity.CUSTSERVICE)) { throw Oops.Bah("等级为R3,客服为空"); } if ((entity.Level == "R1" || entity.Level == "R2") && string.IsNullOrEmpty(entity.CUSTSERVICE)) { throw Oops.Bah("等级为R1/R2,客服必填"); } entity.PropString = entity.PropString.Replace("forwarder", "booking_agent"); if (m == null) { entity.TenantId = UserManager.TENANT_ID; await _djycustomer.InsertAsync(entity); foreach (var item in model.ContactList) { var contact = item.Adapt(); contact.CustomerId = entity.Id; contact.TenantId = UserManager.TENANT_ID; await _djycustomercontact.InsertAsync(contact); } if (entity.PropString.Contains("shipagency")) { var ship = await _codeForwarder.AsQueryable().Where(x => x.Code == entity.CodeName).FirstAsync(); if (ship == null) { await _codeForwarder.InsertAsync(new CodeForwarder { GID = Guid.NewGuid().ToString(), CreateTime = DateTime.Now, CreateUser = UserManager.DjyUserId, Code = entity.CodeName, Name = entity.ShortName }); } else { ship.Code = entity.CodeName; ship.Name = entity.ShortName; ship.ModifyTime = DateTime.Now; ship.ModifyUser = UserManager.DjyUserId; await _codeForwarder.UpdateAsync(ship); } await _commonDBService.GetAllForwarder(false); } } else { entity.Id = m.Id; await _djycustomer.AsUpdateable(entity).IgnoreColumns(it => new { it.TenantId, it.TIDANINFO }).ExecuteCommandAsync(); await _djycustomercontact.DeleteAsync(x => x.CustomerId == entity.Id); if (entity.PropString.Contains("shipagency")) { var ship = await _codeForwarder.AsQueryable().Where(x => x.Code == entity.CodeName).FirstAsync(); if (ship == null) { await _codeForwarder.InsertAsync(new CodeForwarder { GID = Guid.NewGuid().ToString(), CreateTime = DateTime.Now, CreateUser = UserManager.DjyUserId, Code = entity.CodeName, Name = entity.ShortName }); } else { ship.Code = entity.CodeName; ship.Name = entity.ShortName; ship.ModifyTime = DateTime.Now; ship.ModifyUser = UserManager.DjyUserId; await _codeForwarder.UpdateAsync(ship); } await _commonDBService.GetAllForwarder(false); } foreach (var item in model.ContactList) { var contact = item.Adapt(); contact.CustomerId = entity.Id; contact.TenantId = UserManager.TENANT_ID; await _djycustomercontact.InsertAsync(contact); } } return entity.Id; } /// /// 批量同步客户无返回值 /// /// 参数 /// [HttpPost("/DataSync/SyncCustomerList"), ApiUser(ApiCode = "SyncCustomerList")] [SqlSugarUnitOfWork] public async Task SyncCustomer(List model) { var userlist = await _repUser.AsQueryable().Filter(null, true).Where(x => x.IsDeleted == false && x.TenantId == UserManager.TENANT_ID).ToListAsync(); var mlist = await _djycustomer.AsQueryable().Filter(null, true).Where(x => x.IsDeleted == false && x.TenantId == UserManager.TENANT_ID).ToListAsync(); var shiplist = await _codeForwarder.AsQueryable().ToListAsync(); foreach (var item in model) { if (string.IsNullOrWhiteSpace(item.ShortName)) { throw Oops.Bah("简称未录入"); } var m = mlist.Where(x => x.ShortName == item.ShortName).FirstOrDefault(); var entity = item.Adapt(); if (!string.IsNullOrEmpty(entity.SALE)) { entity.SALEID = userlist.Where(x => x.Name == entity.SALE).Count() == 0 ? "" : userlist.Where(x => x.Name == entity.SALE).Select(x => x.Id).FirstOrDefault().ToString(); } if (!string.IsNullOrEmpty(entity.OP)) { entity.OPID = userlist.Where(x => x.Name == entity.OP).Count() == 0 ? "" : userlist.Where(x => x.Name == entity.OP).Select(x => x.Id).FirstOrDefault().ToString(); } if (!string.IsNullOrEmpty(entity.DOC)) { entity.DOCID = userlist.Where(x => x.Name == entity.DOC).Count() == 0 ? "" : userlist.Where(x => x.Name == entity.DOC).Select(x => x.Id).FirstOrDefault().ToString(); } if (!string.IsNullOrEmpty(entity.CUSTSERVICE)) { entity.CUSTSERVICEID = userlist.Where(x => x.Name == entity.CUSTSERVICE).Count() == 0 ? "" : userlist.Where(x => x.Name == entity.CUSTSERVICE).Select(x => x.Id).FirstOrDefault().ToString(); } if (entity.Level == "R3" && !string.IsNullOrEmpty(entity.CUSTSERVICE)) { throw Oops.Bah("等级为R3,客服为空"); } if ((entity.Level == "R1" || entity.Level == "R2") && string.IsNullOrEmpty(entity.CUSTSERVICE)) { throw Oops.Bah("等级为R1/R2,客服必填"); } entity.PropString = entity.PropString.Replace("forwarder", "booking_agent"); if (m == null) { entity.TenantId = UserManager.TENANT_ID; await _djycustomer.InsertAsync(entity); foreach (var it in item.ContactList) { var contact = it.Adapt(); contact.CustomerId = entity.Id; contact.TenantId = UserManager.TENANT_ID; await _djycustomercontact.InsertAsync(contact); } if (entity.PropString.Contains("shipagency")) { var ship = shiplist.Where(x => x.Code == entity.CodeName).FirstOrDefault(); if (ship == null) { await _codeForwarder.InsertAsync(new CodeForwarder { GID = Guid.NewGuid().ToString(), CreateTime = DateTime.Now, CreateUser = UserManager.DjyUserId, Code = entity.CodeName, Name = entity.ShortName }); } else { ship.Code = entity.CodeName; ship.Name = entity.ShortName; ship.ModifyTime = DateTime.Now; ship.ModifyUser = UserManager.DjyUserId; await _codeForwarder.UpdateAsync(ship); } await _commonDBService.GetAllForwarder(false); } } else { entity.Id = m.Id; await _djycustomer.AsUpdateable(entity).IgnoreColumns(it => new { it.TenantId, it.TIDANINFO }).ExecuteCommandAsync(); await _djycustomercontact.DeleteAsync(x => x.CustomerId == entity.Id); foreach (var it in item.ContactList) { var contact = it.Adapt(); contact.CustomerId = entity.Id; contact.TenantId = UserManager.TENANT_ID; await _djycustomercontact.InsertAsync(contact); } if (entity.PropString.Contains("shipagency")) { var ship = shiplist.Where(x => x.Code == entity.CodeName).FirstOrDefault(); if (ship == null) { await _codeForwarder.InsertAsync(new CodeForwarder { GID = Guid.NewGuid().ToString(), CreateTime = DateTime.Now, CreateUser = UserManager.DjyUserId, Code = entity.CodeName, Name = entity.ShortName }); } else { ship.Code = entity.CodeName; ship.Name = entity.ShortName; ship.ModifyTime = DateTime.Now; ship.ModifyUser = UserManager.DjyUserId; await _codeForwarder.UpdateAsync(ship); } await _commonDBService.GetAllForwarder(false); } } } } /// /// 批量同步船期无返回值 /// /// /// [HttpPost("/DataSync/SyncVesselDateList"), ApiUser(ApiCode = "SyncVesselDateList")] [SqlSugarUnitOfWork] public async Task SyncVesselDateList(List model) { var mapcarrier = _mapcarrier.Where(x => x.Module == "HeChuan").ToList(); var userlist = _repUser.AsQueryable().Filter(null, true).Where(x => x.IsDeleted == false && x.TenantId == UserManager.TENANT_ID).ToList(); var mlist = _vesselinfo.AsQueryable().Filter(null, true).Where(x => x.TenantId == UserManager.TENANT_ID && x.IsDeleted == false).ToList(); var orderlist = _rep.AsQueryable().Filter(null, true).Where(x => x.TenantId == UserManager.TENANT_ID && x.IsDeleted == false).ToList(); foreach (var item in model) { var CreatedUserId = userlist.Where(x => x.Name == item.CreatedUserName).Select(x => x.Id).FirstOrDefault(); if (string.IsNullOrWhiteSpace(item.BSNO)) { throw Oops.Bah("BSNO未录入"); } var m = mlist.Where(x => x.BSNO == item.BSNO).FirstOrDefault(); var entity = item.Adapt(); entity.Vessel = item.Vessel.ToUpper().Trim(); if (!string.IsNullOrEmpty(item.CARRIER)) { entity.CARRIERID = _cache.GetAllCodeCarrier().Result.Where(x => x.CnName == item.CARRIER).Select(x => x.Code).FirstOrDefault(); if (string.IsNullOrEmpty(entity.CARRIERID)) { entity.CARRIERID = mapcarrier.Where(x => x.MapName == item.CARRIER).Select(x => x.Code).FirstOrDefault(); } if (string.IsNullOrEmpty(entity.CARRIERID)) { throw Oops.Bah($"未找到{item.CARRIER}对应code,请联系管理员!"); } } if (!string.IsNullOrEmpty(item.CreatedUserName)) { entity.CreatedUserId = CreatedUserId; } if (string.IsNullOrEmpty(item.Voyno)) { entity.Voyno = entity.VoynoInside; } if (m == null) { var e = mlist.Where(x => x.CARRIERID == entity.CARRIERID && x.Vessel == entity.Vessel && x.Voyno == entity.Voyno && x.VoynoInside == entity.VoynoInside).FirstOrDefault(); if (e == null) { //2023年7月27日,王书岚:航次为V.开头的不查询船期 if (!string.IsNullOrEmpty(entity.VoynoInside) && entity.VoynoInside.StartsWith("V.")) { entity.Sign = true; } await _vesselinfo.InsertAsync(entity); } else { entity.Id = e.Id; if (e.ETA != null) { entity.ETA = e.ETA; } await _vesselinfo.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); } } else { entity.Id = m.Id; if (m.ETA != null) { entity.ETA = m.ETA; } await _vesselinfo.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); } ////根据船公司船名航次更新船期信息 if (!string.IsNullOrEmpty(item.CARRIER) && !string.IsNullOrEmpty(item.Vessel) && (!string.IsNullOrEmpty(item.Voyno) || !string.IsNullOrWhiteSpace(item.VoynoInside))) { var order = orderlist.Where(x => x.CARRIERID == item.CARRIERID && x.VESSEL == item.Vessel) .WhereIF(!string.IsNullOrEmpty(item.Voyno), x => x.VOYNO == item.Voyno) .WhereIF(!string.IsNullOrEmpty(item.VoynoInside), x => x.VOYNOINNER == item.VoynoInside).Distinct().ToList(); _logger.LogInformation($"同步船期_查询到{UserManager.TENANT_NAME}需要更新{order.Count()}条订舱数据"); foreach (var it in order) { var old = it; //更新订舱船期 if (it.ETD != item.ETD && item.ETD != null) { it.ETD = item.ETD; await _rep.AsUpdateable(it).IgnoreColumns(it => new { it.ParentId, it.TenantId, it.CreatedTime, it.CreatedUserId, it.CreatedUserName, it.UpdatedTime, it.UpdatedUserId, it.UpdatedUserName, it.TenantName, it.IsDeleted, it.BOOKINGNO, it.LstShipOrderCompareId, it.LstShipOrderCompareDate, it.LstShipOrderCompareRlt, it.LstShipOrderCompareRltName, it.LstShipOrderCompareMode }).ExecuteCommandAsync(); await _bookingorderservice.SaveLog(it, old); await _bookingorderservice.SendBookingOrder(new long[] { it.Id }); } } } } return "上传成功!"; } /// /// 删除船期 /// /// [HttpPost("/DataSync/DeletaVesselDate"), ApiUser(ApiCode = "DeletaVesselDate")] [SqlSugarUnitOfWork] public async Task DeletaVesselDate(string bsnos) { var arr = bsnos.Split(","); if (arr.Count() > 0) { foreach (var item in arr) { await _vesselinfo.UpdateAsync(x => x.BSNO == item, x => new DjyVesselInfo { IsDeleted = true }); } } } /// /// 同步订舱批量 没有返回值 /// /// /// [SqlSugarUnitOfWork] [HttpPost("/DataSync/SyncBookingList"), ApiUser(ApiCode = "SyncBookingList")] public async Task SyncBookingList(List list) { List ctncode = await _cache.GetAllCodeCtn(); var mapcarrier = await _mapcarrier.Where(x => x.Module == "HeChuan").ToListAsync(); var userlist = await _repUser.AsQueryable().Filter(null, true).Where(x => x.IsDeleted == false && x.TenantId == UserManager.TENANT_ID).ToListAsync(); var djycustomer = await _djycustomer.AsQueryable().Filter(null, true).Where(x => x.IsDeleted == false && x.TenantId == UserManager.TENANT_ID).ToListAsync(); var goodsconfig = await _goodsStatusConfig.AsQueryable().Filter(null, true).Where(x => x.IsDeleted == false && x.TenantId == UserManager.TENANT_ID).ToListAsync(); var orderlist = await _rep.AsQueryable().Filter(null, true).Where(x => x.IsDeleted == false && x.TenantId == UserManager.TENANT_ID).ToListAsync(); var linelist = await _repline.AsQueryable().Filter(null, true).Where(m => m.TenantId == UserManager.TENANT_ID).ToListAsync(); foreach (var model in list) { if (string.IsNullOrWhiteSpace(model.BSNO)) { throw Oops.Bah("主单BSNO未录入"); } if (string.IsNullOrWhiteSpace(model.CreatedUserName)) { throw Oops.Bah("未录入创建人"); } var user = userlist.Where(x => x.Name == model.CreatedUserName.Trim() && x.IsDeleted == false).FirstOrDefault(); if (user == null) { throw Oops.Bah($"未匹配到创建人{model.CreatedUserName.Trim()}请联系管理员添加相关用户"); } var order = orderlist.Where(x => x.BSNO == model.BSNO).FirstOrDefault(); if (order == null) { #region 新增 if (string.IsNullOrWhiteSpace(model.MBLNO)) { throw Oops.Bah("请填写提单号!"); } JsonUtil.PropToUpper(model, "ORDNO", "BSSTATUS", "YARDID", "YardContract", "YardContractTel", "YardContractEmail", "MARKS", "DESCRIPTION", "CONSIGNEENAME", "SHIPPERNAME", "NOTIFYPARTYNAME"); var ms = JsonUtil.TrimFields(model); if (!string.IsNullOrEmpty(ms)) { throw Oops.Bah(ms); } if (model.ctnInputs != null) { var groupList = model.ctnInputs.Where(x => x.CTNNUM > 0).GroupBy(c => c.CTNALL).Select(g => $"{g.Key}*{g.Sum(gg => gg.CTNNUM)}"); model.CNTRTOTAL = string.Join(" / ", groupList); } var et = await _rep.Where(x => x.MBLNO == model.MBLNO && x.TenantId == UserManager.TENANT_ID && x.HBLNO == model.HBLNO && x.ParentId == 0).FirstAsync(); if (et != null) { throw Oops.Bah("当前提单号已存在,请勿重复录入!"); } var entity = model.Adapt(); if (!string.IsNullOrEmpty(entity.ROUTE)) { entity.ROUTEID = userlist.Where(x => x.Name == entity.ROUTE).Count() == 0 ? "" : userlist.Where(x => x.Name == entity.ROUTE).Select(x => x.Id).FirstOrDefault().ToString(); } if (!string.IsNullOrEmpty(entity.SALE)) { entity.SALEID = userlist.Where(x => x.Name == entity.SALE).Count() == 0 ? "" : userlist.Where(x => x.Name == entity.SALE).Select(x => x.Id).FirstOrDefault().ToString(); } if (!string.IsNullOrEmpty(entity.OP)) { entity.OPID = userlist.Where(x => x.Name == entity.OP).Count() == 0 ? "" : userlist.Where(x => x.Name == entity.OP).Select(x => x.Id).FirstOrDefault().ToString(); } if (!string.IsNullOrEmpty(entity.DOC)) { entity.DOCID = userlist.Where(x => x.Name == entity.DOC).Count() == 0 ? "" : userlist.Where(x => x.Name == entity.DOC).Select(x => x.Id).FirstOrDefault().ToString(); } if (!string.IsNullOrEmpty(entity.CUSTSERVICE)) { entity.CUSTSERVICEID = userlist.Where(x => x.Name == entity.CUSTSERVICE).Count() == 0 ? "" : userlist.Where(x => x.Name == entity.CUSTSERVICE).Select(x => x.Id).FirstOrDefault().ToString(); } if (!string.IsNullOrEmpty(entity.CUSTOMSER)) { entity.CUSTOMSERID = djycustomer.Where(x => x.ShortName == entity.CUSTOMSER && x.PropString == "customs_broker").Select(x => x.CodeName).FirstOrDefault(); } if (!string.IsNullOrEmpty(entity.TRUCKER)) { entity.TRUCKERID = djycustomer.Where(x => x.ShortName == entity.TRUCKER && x.PropString == "fleet").Select(x => x.CodeName).FirstOrDefault(); } if (!string.IsNullOrEmpty(entity.CUSTOMERNAME)) { entity.CUSTOMERID = djycustomer.Where(x => x.ShortName == entity.CUSTOMERNAME && x.PropString == "consignor").Select(x => x.Id).FirstOrDefault(); } if (!string.IsNullOrEmpty(entity.FORWARDER)) { entity.FORWARDERID = djycustomer.Where(x => x.ShortName == entity.FORWARDER && x.PropString == "booking_agent").Select(x => x.CodeName).FirstOrDefault(); } if (!string.IsNullOrEmpty(entity.YARD)) { entity.YARDID = _cache.GetAllCodeCarrier().Result.Where(x => x.CnName == entity.YARD).Select(x => x.Code).FirstOrDefault(); } if (!string.IsNullOrEmpty(entity.CARRIER)) { entity.CARRIERID = _cache.GetAllCodeCarrier().Result.Where(x => x.CnName == entity.CARRIER).Select(x => x.Code).FirstOrDefault(); if (string.IsNullOrEmpty(entity.CARRIERID)) { entity.CARRIERID = mapcarrier.Where(x => x.MapName == entity.CARRIER).Select(x => x.Code).FirstOrDefault(); } } if (!string.IsNullOrEmpty(entity.LineName)) { var line = linelist.Where(m => m.LineName.Contains(entity.LineName)).FirstOrDefault(); if (line == null) { await _repline.InsertAsync(new DjyTenantLine { LineName = entity.LineName, LineCode = "", TenantId = UserManager.TENANT_ID, CreatedUserId = user.Id, CreatedUserName = user.Name }); } } entity.BOOKINGNO = Yitter.IdGenerator.YitIdHelper.NextId().ToString(); entity.CreatedUserId = user.Id; entity.CreatedUserName = user.Name.ToString(); entity.CreatedTime = DateTime.Now; entity.TenantId = UserManager.TENANT_ID; entity.TenantName = UserManager.TENANT_NAME; entity.ParentId = 0; await _rep.InsertAsync(entity); if (model.ctnInputs != null) { foreach (var item in model.ctnInputs) { var ctnentity = item.Adapt(); ctnentity.BILLID = entity.Id; ctnentity.CreatedUserId = user.Id; ctnentity.CreatedUserName = user.Name; ctnentity.CTNCODE = ctncode.Where(x => x.Name == ctnentity.CTNALL).Select(x => x.Code).FirstOrDefault(); ctnentity.CreatedUserId = user.Id; ctnentity.CreatedUserName = user.Name.ToString(); ctnentity.CreatedTime = DateTime.Now; ctnentity.TenantId = UserManager.TENANT_ID; await _repCtn.InsertAsync(ctnentity); //这里保存有可能没有添加多品名,所有箱下没有货物信息 if (item.ctnDetailInputs != null) { foreach (var it in item.ctnDetailInputs) { var ctndetail = it.Adapt(); ctndetail.CTNID = ctnentity.Id; ctndetail.CreatedUserId = user.Id; ctndetail.CreatedUserName = user.Name; ctndetail.CreatedUserId = user.Id; ctndetail.CreatedUserName = user.Name.ToString(); ctndetail.CreatedTime = DateTime.Now; ctndetail.TenantId = UserManager.TENANT_ID; await _ctndetailrep.InsertAsync(ctndetail); } } } } if (model.BookingEDIExt != null) { //写入EDI扩展 var ediExtEntity = model.BookingEDIExt.Adapt(); ediExtEntity.BookingId = entity.Id; ediExtEntity.CreatedUserId = user.Id; ediExtEntity.CreatedUserName = user.Name; ediExtEntity.CreatedTime = DateTime.Now; ediExtEntity.TenantId = UserManager.TENANT_ID; await _bookingEDIExt.InsertAsync(ediExtEntity); } ////添加booking日志 await _bookinglog.InsertAsync(new BookingLog { Type = "Add", BookingId = entity.Id, TenantId = Convert.ToInt64(UserManager.TENANT_ID), CreatedTime = DateTime.Now, CreatedUserId = user.Id, CreatedUserName = "系统" }); //分单 if (model.childrens != null) { foreach (var item in model.childrens) { if (string.IsNullOrWhiteSpace(item.HBLNO)) { throw Oops.Bah("请填写分提单号!"); } JsonUtil.PropToUpper(item, "ORDNO", "BSSTATUS", "YARDID", "YardContract", "YardContractTel", "YardContractEmail", "MARKS", "DESCRIPTION", "CONSIGNEENAME", "SHIPPERNAME", "NOTIFYPARTYNAME"); var fms = JsonUtil.TrimFields(item); if (!string.IsNullOrEmpty(fms)) { throw Oops.Bah(fms); } if (item.ctnInputs != null) { var groupList = item.ctnInputs.Where(x => x.CTNNUM > 0).GroupBy(c => c.CTNALL).Select(g => $"{g.Key}*{g.Sum(gg => gg.CTNNUM)}"); item.CNTRTOTAL = string.Join(" / ", groupList); } var fdet = await _rep.Where(x => x.MBLNO == model.MBLNO && x.TenantId == UserManager.TENANT_ID && x.HBLNO == model.HBLNO && x.ParentId == entity.Id).FirstAsync(); if (fdet != null) { throw Oops.Bah($"当前分单中提单号({item.MBLNO}_{item.HBLNO})已存在,请勿重复录入!"); } var fdentity = item.Adapt(); if (!string.IsNullOrEmpty(fdentity.ROUTE)) { fdentity.ROUTEID = userlist.Where(x => x.Name == fdentity.ROUTE).Count() == 0 ? "" : userlist.Where(x => x.Name == fdentity.ROUTE).Select(x => x.Id).FirstOrDefault().ToString(); } if (!string.IsNullOrEmpty(fdentity.SALE)) { fdentity.SALEID = userlist.Where(x => x.Name == fdentity.SALE).Count() == 0 ? "" : userlist.Where(x => x.Name == fdentity.SALE).Select(x => x.Id).FirstOrDefault().ToString(); } if (!string.IsNullOrEmpty(fdentity.OP)) { fdentity.OPID = userlist.Where(x => x.Name == fdentity.OP).Count() == 0 ? "" : userlist.Where(x => x.Name == fdentity.OP).Select(x => x.Id).FirstOrDefault().ToString(); } if (!string.IsNullOrEmpty(fdentity.DOC)) { fdentity.DOCID = userlist.Where(x => x.Name == fdentity.DOC).Count() == 0 ? "" : userlist.Where(x => x.Name == fdentity.DOC).Select(x => x.Id).FirstOrDefault().ToString(); } if (!string.IsNullOrEmpty(fdentity.CUSTSERVICE)) { fdentity.CUSTSERVICEID = userlist.Where(x => x.Name == fdentity.CUSTSERVICE).Count() == 0 ? "" : userlist.Where(x => x.Name == fdentity.CUSTSERVICE).Select(x => x.Id).FirstOrDefault().ToString(); } if (!string.IsNullOrEmpty(fdentity.CUSTOMSER)) { fdentity.CUSTOMSERID = djycustomer.Where(x => x.ShortName == fdentity.CUSTOMSER && x.PropString == "customs_broker").Select(x => x.CodeName).FirstOrDefault(); } if (!string.IsNullOrEmpty(fdentity.TRUCKER)) { fdentity.TRUCKERID = djycustomer.Where(x => x.ShortName == fdentity.TRUCKER && x.PropString == "fleet").Select(x => x.CodeName).FirstOrDefault(); } if (!string.IsNullOrEmpty(fdentity.CUSTOMERNAME)) { fdentity.CUSTOMERID = djycustomer.Where(x => x.ShortName == fdentity.CUSTOMERNAME && x.PropString == "consignor").Select(x => x.Id).FirstOrDefault(); } if (!string.IsNullOrEmpty(fdentity.FORWARDER)) { fdentity.FORWARDERID = djycustomer.Where(x => x.ShortName == fdentity.FORWARDER && x.PropString == "booking_agent").Select(x => x.CodeName).FirstOrDefault(); } if (!string.IsNullOrEmpty(fdentity.CARRIERID)) { fdentity.CARRIER = _cache.GetAllCodeCarrier().Result.Where(x => x.Code == fdentity.CARRIERID).Select(x => x.CnName).FirstOrDefault(); } if (!string.IsNullOrEmpty(fdentity.YARD)) { fdentity.YARDID = _cache.GetAllCodeCarrier().Result.Where(x => x.CnName == fdentity.YARD).Select(x => x.Code).FirstOrDefault(); } if (!string.IsNullOrEmpty(fdentity.CARRIER)) { fdentity.CARRIERID = _cache.GetAllCodeCarrier().Result.Where(x => x.CnName == fdentity.CARRIER).Select(x => x.Code).FirstOrDefault(); if (string.IsNullOrEmpty(fdentity.CARRIERID)) { fdentity.CARRIERID = mapcarrier.Where(x => x.MapName == fdentity.CARRIER).Select(x => x.Code).FirstOrDefault(); } } if (!string.IsNullOrEmpty(item.LineName)) { var line = _repline.AsQueryable().Filter(null, true).Where(m => m.TenantId == UserManager.TENANT_ID && m.LineName.Contains(item.LineName)).FirstAsync(); if (line == null) { await _repline.InsertAsync(new DjyTenantLine { LineName = item.LineName, LineCode = "", TenantId = UserManager.TENANT_ID, CreatedUserId = user.Id, CreatedUserName = user.Name }); } } fdentity.BOOKINGNO = Yitter.IdGenerator.YitIdHelper.NextId().ToString(); fdentity.MBLNO = entity.MBLNO; fdentity.CreatedUserId = user.Id; fdentity.CreatedUserName = user.Name; fdentity.CreatedTime = DateTime.Now; fdentity.TenantId = UserManager.TENANT_ID; fdentity.TenantName = UserManager.TENANT_NAME; fdentity.ParentId = entity.Id; await _rep.InsertAsync(fdentity); if (item.ctnInputs != null) { foreach (var it in item.ctnInputs) { var ctnentity = item.Adapt(); ctnentity.BILLID = fdentity.Id; ctnentity.CreatedUserId = user.Id; ctnentity.CreatedUserName = user.Name; ctnentity.CTNCODE = ctncode.Where(x => x.Name == ctnentity.CTNALL).Select(x => x.Code).FirstOrDefault(); await _repCtn.InsertAsync(ctnentity); //这里保存有可能没有添加多品名,所有箱下没有货物信息 if (it.ctnDetailInputs != null) { foreach (var dit in it.ctnDetailInputs) { var ctndetail = dit.Adapt(); ctndetail.CTNID = ctnentity.Id; ctndetail.CreatedUserId = user.Id; ctndetail.CreatedUserName = user.Name; await _ctndetailrep.InsertAsync(ctndetail); } } } } if (item.BookingEDIExt != null) { //写入EDI扩展 var ediExtEntity = model.BookingEDIExt.Adapt(); ediExtEntity.BookingId = fdentity.Id; ediExtEntity.CreatedUserId = user.Id; ediExtEntity.CreatedUserName = user.Name; ediExtEntity.CreatedTime = DateTime.Now; await _bookingEDIExt.InsertAsync(ediExtEntity); } ////添加booking日志 await _bookinglog.InsertAsync(new BookingLog { Type = "Add", BookingId = fdentity.Id, TenantId = Convert.ToInt64(UserManager.TENANT_ID), CreatedTime = DateTime.Now, CreatedUserId = user.Id, CreatedUserName = "系统" }); } } if (model.GoodsStatus != null) { foreach (var item in model.GoodsStatus) { if (!string.IsNullOrEmpty(item.StatusName)) { var gc = goodsconfig.Where(x => x.StatusName == item.StatusName && x.CreatedUserId == user.Id).FirstOrDefault(); if (gc != null) { await _goodsStatus.InsertAsync(new BookingGoodsStatus { bookingId = entity.Id, ConfigId = gc.Id, FinishTime = item.FinishTime, FinishUser = user.Name, FinishUserId = user.Id, Remark = item.Remark, ExtData = item.ExtData }); } else { var configid = await _goodsStatusConfig.InsertReturnSnowflakeIdAsync(new BookingGoodsStatusConfig { StatusName = item.StatusName, Sort = goodsconfig.Where(x => x.CreatedUserId == user.Id).Max(x => x.Sort) + 1, CreatedTime = DateTime.Now, CreatedUserId = user.Id, CreatedUserName = user.Name, IsDeleted = false }); await _goodsStatus.InsertAsync(new BookingGoodsStatus { bookingId = entity.Id, ConfigId = configid, FinishTime = item.FinishTime, FinishUser = user.Name, FinishUserId = user.Id, Remark = item.Remark, ExtData = item.ExtData }); } } } } if (!string.IsNullOrEmpty(model.CtnDayNum)) { var gc = goodsconfig.Where(x => x.StatusName == "申请箱使" && x.CreatedUserId == user.Id).FirstOrDefault(); if (gc != null) { await _goodsStatus.InsertAsync(new BookingGoodsStatus { bookingId = entity.Id, ConfigId = gc.Id, FinishTime = DateTime.Now, FinishUser = user.Name, FinishUserId = user.Id, Remark = "", ExtData = model.CtnDayNum }); } else { var configid = await _goodsStatusConfig.InsertReturnSnowflakeIdAsync(new BookingGoodsStatusConfig { StatusName = "申请箱使", Sort = goodsconfig.Where(x => x.CreatedUserId == user.Id).Max(x => x.Sort) + 1, CreatedTime = DateTime.Now, CreatedUserId = user.Id, CreatedUserName = user.Name, IsDeleted = false }); await _goodsStatus.InsertAsync(new BookingGoodsStatus { bookingId = entity.Id, ConfigId = configid, FinishTime = DateTime.Now, FinishUser = user.Name, FinishUserId = user.Id, Remark = "", ExtData = model.CtnDayNum }); } } #endregion } else { #region 编辑 if (string.IsNullOrWhiteSpace(model.MBLNO)) { throw Oops.Bah("请填写提单号!"); } JsonUtil.PropToUpper(model, "ORDNO", "BSSTATUS", "YARDID", "YardContract", "YardContractTel", "YardContractEmail", "MARKS", "DESCRIPTION", "CONSIGNEENAME", "SHIPPERNAME", "NOTIFYPARTYNAME"); var ms = JsonUtil.TrimFields(model); if (!string.IsNullOrEmpty(ms)) { throw Oops.Bah(ms); } if (model.ctnInputs != null) { var groupList = model.ctnInputs.Where(x => x.CTNNUM > 0).GroupBy(c => c.CTNALL).Select(g => $"{g.Key}*{g.Sum(gg => gg.CTNNUM)}"); model.CNTRTOTAL = string.Join(" / ", groupList); } var main = await _rep.AsQueryable().Filter(null, true).Where(x => x.BSNO == model.BSNO && x.IsDeleted == false).FirstAsync(); var et = await _rep.AsQueryable().Filter(null, true).Where(x => x.MBLNO == model.MBLNO && x.TenantId == UserManager.TENANT_ID && x.HBLNO == model.HBLNO && x.BSNO != model.BSNO).FirstAsync(); if (et != null) { throw Oops.Bah("当前提单号已存在,请勿重复录入!"); } var entity = model.Adapt(); entity.Id = main.Id; entity.UpdatedUserName = user.Name; entity.UpdatedUserId = user.Id; entity.UpdatedTime = DateTime.Now; if (!string.IsNullOrEmpty(entity.ROUTE)) { entity.ROUTEID = userlist.Where(x => x.Name == entity.ROUTE).Count() == 0 ? "" : userlist.Where(x => x.Name == entity.ROUTE).Select(x => x.Id).FirstOrDefault().ToString(); } if (!string.IsNullOrEmpty(entity.SALE)) { entity.SALEID = userlist.Where(x => x.Name == entity.SALE).Count() == 0 ? "" : userlist.Where(x => x.Name == entity.SALE).Select(x => x.Id).FirstOrDefault().ToString(); } if (!string.IsNullOrEmpty(entity.OP)) { entity.OPID = userlist.Where(x => x.Name == entity.OP).Count() == 0 ? "" : userlist.Where(x => x.Name == entity.OP).Select(x => x.Id).FirstOrDefault().ToString(); } if (!string.IsNullOrEmpty(entity.DOC)) { entity.DOCID = userlist.Where(x => x.Name == entity.DOC).Count() == 0 ? "" : userlist.Where(x => x.Name == entity.DOC).Select(x => x.Id).FirstOrDefault().ToString(); } if (!string.IsNullOrEmpty(entity.CUSTSERVICE)) { entity.CUSTSERVICEID = userlist.Where(x => x.Name == entity.CUSTSERVICE).Count() == 0 ? "" : userlist.Where(x => x.Name == entity.CUSTSERVICE).Select(x => x.Id).FirstOrDefault().ToString(); } if (!string.IsNullOrEmpty(entity.CUSTOMSER)) { entity.CUSTOMSERID = djycustomer.Where(x => x.ShortName == entity.CUSTOMSER && x.PropString == "customs_broker").Select(x => x.CodeName).FirstOrDefault(); } if (!string.IsNullOrEmpty(entity.TRUCKER)) { entity.TRUCKERID = djycustomer.Where(x => x.ShortName == entity.TRUCKER && x.PropString == "fleet").Select(x => x.CodeName).FirstOrDefault(); } if (!string.IsNullOrEmpty(entity.CUSTOMERNAME)) { entity.CUSTOMERID = djycustomer.Where(x => x.ShortName == entity.CUSTOMERNAME && x.PropString == "consignor").Select(x => x.Id).FirstOrDefault(); } if (!string.IsNullOrEmpty(entity.FORWARDER)) { entity.FORWARDERID = djycustomer.Where(x => x.ShortName == entity.FORWARDER && x.PropString == "booking_agent").Select(x => x.CodeName).FirstOrDefault(); } if (!string.IsNullOrEmpty(entity.YARD)) { entity.YARDID = _cache.GetAllCodeCarrier().Result.Where(x => x.CnName == entity.YARD).Select(x => x.Code).FirstOrDefault(); } if (!string.IsNullOrEmpty(entity.CARRIER)) { entity.CARRIERID = _cache.GetAllCodeCarrier().Result.Where(x => x.CnName == entity.CARRIER).Select(x => x.Code).FirstOrDefault(); if (string.IsNullOrEmpty(entity.CARRIERID)) { entity.CARRIERID = mapcarrier.Where(x => x.MapName == entity.CARRIER).Select(x => x.Code).FirstOrDefault(); } } if (!string.IsNullOrEmpty(entity.LineName)) { var line = _repline.AsQueryable().Filter(null, true).Where(m => m.TenantId == UserManager.TENANT_ID && m.LineName.Contains(entity.LineName)).FirstAsync(); if (line == null) { await _repline.InsertAsync(new DjyTenantLine { LineName = entity.LineName, LineCode = "", TenantId = UserManager.TENANT_ID, CreatedUserId = user.Id, CreatedUserName = user.Name }); } } await _rep.AsUpdateable(entity).IgnoreColumns(it => new { it.BOOKINGNO, it.ParentId, it.TenantId, it.TenantName, it.YgtETD, it.CreatedTime, it.CreatedUserId, it.CreatedUserName, it.LstShipOrderCompareId, it.LstShipOrderCompareDate, it.LstShipOrderCompareRltName, it.LstShipOrderCompareMode }).ExecuteCommandAsync(); var ctnlist = await _repCtn.AsQueryable().Where(x => x.BILLID == main.Id).Select(x => x.Id).ToListAsync(); await _repCtn.DeleteAsync(x => x.BILLID == main.Id); await _ctndetailrep.DeleteAsync(x => ctnlist.Contains((long)x.CTNID)); await _goodsStatus.DeleteAsync(x => x.bookingId == main.Id); if (model.ctnInputs != null) { foreach (var item in model.ctnInputs) { var ctnentity = item.Adapt(); ctnentity.BILLID = main.Id; ctnentity.CreatedUserId = user.Id; ctnentity.CreatedUserName = user.Name; ctnentity.CTNCODE = ctncode.Where(x => x.Name == ctnentity.CTNALL).Select(x => x.Code).FirstOrDefault(); await _repCtn.InsertAsync(ctnentity); if (item.ctnDetailInputs != null) { foreach (var it in item.ctnDetailInputs) { var ctndetail = it.Adapt(); ctndetail.CTNID = ctnentity.Id; ctndetail.CreatedUserId = user.Id; ctndetail.CreatedUserName = user.Name; await _ctndetailrep.InsertAsync(ctndetail); } } } } if (model.BookingEDIExt != null) { //检索EDI扩展 var ediExtEntity = await _bookingEDIExt.AsQueryable().Filter(null, true).Where(x => x.BookingId == main.Id).FirstAsync(); if (ediExtEntity == null) { //写入EDI扩展 ediExtEntity = model.BookingEDIExt.Adapt(); ediExtEntity.BookingId = main.Id; ediExtEntity.CreatedUserId = user.Id; ediExtEntity.CreatedUserName = user.Name; ediExtEntity.CreatedTime = DateTime.Now; await _bookingEDIExt.InsertAsync(ediExtEntity); } else { //更新EDI扩展 var currEdiExtEntity = model.BookingEDIExt.Adapt(); currEdiExtEntity.Id = ediExtEntity.Id; currEdiExtEntity.UpdatedUserId = user.Id; currEdiExtEntity.UpdatedTime = DateTime.Now; await _bookingEDIExt.AsUpdateable(currEdiExtEntity).IgnoreColumns(it => new { it.BookingId, it.TenantId, it.CreatedTime, it.CreatedUserId, it.CreatedUserName }).ExecuteCommandAsync(); } } if (model.GoodsStatus != null) { foreach (var item in model.GoodsStatus) { if (!string.IsNullOrEmpty(item.StatusName)) { var gc = goodsconfig.Where(x => x.StatusName == item.StatusName && x.CreatedUserId == user.Id).FirstOrDefault(); if (gc != null) { await _goodsStatus.InsertAsync(new BookingGoodsStatus { bookingId = entity.Id, ConfigId = gc.Id, FinishTime = item.FinishTime, FinishUser = user.Name, FinishUserId = user.Id, Remark = item.Remark, ExtData = item.ExtData }); } else { long configid = await _goodsStatusConfig.InsertReturnSnowflakeIdAsync(new BookingGoodsStatusConfig { StatusName = item.StatusName, Sort = goodsconfig.Where(x => x.CreatedUserId == user.Id).Max(x => x.Sort) + 1, CreatedTime = DateTime.Now, CreatedUserId = user.Id, CreatedUserName = user.Name, IsDeleted = false }); await _goodsStatus.InsertAsync(new BookingGoodsStatus { bookingId = entity.Id, ConfigId = configid, FinishTime = item.FinishTime, FinishUser = user.Name, FinishUserId = user.Id, Remark = item.Remark, ExtData = item.ExtData }); } } } } if (!string.IsNullOrEmpty(model.CtnDayNum)) { var gc = goodsconfig.Where(x => x.StatusName == "申请箱使" && x.CreatedUserId == user.Id).FirstOrDefault(); if (gc != null) { await _goodsStatus.InsertAsync(new BookingGoodsStatus { bookingId = entity.Id, ConfigId = gc.Id, FinishTime = DateTime.Now, FinishUser = user.Name, FinishUserId = user.Id, Remark = "", ExtData = model.CtnDayNum }); } else { var Sort = goodsconfig.Where(x => x.CreatedUserId == user.Id).Count(); var configid = await _goodsStatusConfig.InsertReturnSnowflakeIdAsync(new BookingGoodsStatusConfig { StatusName = "申请箱使", Sort = Sort + 1, CreatedTime = DateTime.Now, CreatedUserId = user.Id, CreatedUserName = user.Name, IsDeleted = false }); await _goodsStatus.InsertAsync(new BookingGoodsStatus { bookingId = entity.Id, ConfigId = configid, FinishTime = DateTime.Now, FinishUser = user.Name, FinishUserId = user.Id, Remark = "", ExtData = model.CtnDayNum }); } } bool flag = true; long bid = 0; foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(entity)) { string name = descriptor.Name; if (name == "TenantId" || name == "CreatedTime" || name == "UpdatedTime" || name == "CreatedUserId" || name == "CreatedUserName") { continue; } object value = descriptor.GetValue(entity); var oldvalue = main.GetType().GetProperty(name).GetValue(main, null); if (name == "KGS" || name == "CBM") { if (Convert.ToDecimal(value) == Convert.ToDecimal(oldvalue)) { continue; } } string _oldvalue = oldvalue != null ? oldvalue.ToString() : ""; string _value = value != null ? value.ToString() : ""; if (_oldvalue != _value && !string.IsNullOrWhiteSpace(descriptor.Description)) { if (flag) { ////添加booking日志 bid = await _bookinglog.InsertReturnSnowflakeIdAsync(new BookingLog { Type = "Edit", BookingId = entity.Id, TenantId = Convert.ToInt64(UserManager.TENANT_ID), CreatedTime = DateTime.Now, CreatedUserId = user.Id, CreatedUserName = user.Name }); flag = false; } await _bookinglogdetail.InsertReturnSnowflakeIdAsync(new BookingLogDetail { PId = bid, Field = descriptor.Description, OldValue = _oldvalue, NewValue = _value, }); } } //分单 if (model.childrens != null) { foreach (var item in model.childrens) { var fenlanename = item.LANECODE; var fenlinename = item.LANENAME; if (string.IsNullOrWhiteSpace(item.HBLNO)) { throw Oops.Bah("请填写分提单号!"); } JsonUtil.PropToUpper(item, "ORDNO", "BSSTATUS", "YARDID", "YardContract", "YardContractTel", "YardContractEmail", "MARKS", "DESCRIPTION", "CONSIGNEENAME", "SHIPPERNAME", "NOTIFYPARTYNAME"); var fms = JsonUtil.TrimFields(item); if (!string.IsNullOrEmpty(fms)) { throw Oops.Bah(fms); } if (item.ctnInputs != null) { var groupList = item.ctnInputs.Where(x => x.CTNNUM > 0).GroupBy(c => c.CTNALL).Select(g => $"{g.Key}*{g.Sum(gg => gg.CTNNUM)}"); item.CNTRTOTAL = string.Join(" / ", groupList); } var fdmain = await _rep.AsQueryable().Filter(null, true).Where(x => x.BSNO == item.BSNO && x.IsDeleted == false).FirstAsync(); var fdentity = item.Adapt(); if (fdmain != null) { var fdet = await _rep.Where(x => x.MBLNO == item.MBLNO && x.TenantId == UserManager.TENANT_ID && x.HBLNO == item.HBLNO && x.BSNO != fdmain.BSNO).FirstAsync(); if (fdet != null) { throw Oops.Bah($"当前提单号{fdet.MBLNO}_{fdet.HBLNO}已存在,请勿重复录入!"); } fdentity.MBLNO = entity.MBLNO; fdentity.Id = fdmain.Id; fdentity.UpdatedUserName = user.Name; fdentity.UpdatedUserId = user.Id; fdentity.UpdatedTime = DateTime.Now; if (!string.IsNullOrEmpty(fdentity.ROUTE)) { fdentity.ROUTEID = userlist.Where(x => x.Name == fdentity.ROUTE).Count() == 0 ? "" : userlist.Where(x => x.Name == fdentity.ROUTE).Select(x => x.Id).FirstOrDefault().ToString(); } if (!string.IsNullOrEmpty(fdentity.SALE)) { fdentity.SALEID = userlist.Where(x => x.Name == fdentity.SALE).Count() == 0 ? "" : userlist.Where(x => x.Name == fdentity.SALE).Select(x => x.Id).FirstOrDefault().ToString(); } if (!string.IsNullOrEmpty(fdentity.OP)) { fdentity.OPID = userlist.Where(x => x.Name == fdentity.OP).Count() == 0 ? "" : userlist.Where(x => x.Name == fdentity.OP).Select(x => x.Id).FirstOrDefault().ToString(); } if (!string.IsNullOrEmpty(fdentity.DOC)) { fdentity.DOCID = userlist.Where(x => x.Name == fdentity.DOC).Count() == 0 ? "" : userlist.Where(x => x.Name == fdentity.DOC).Select(x => x.Id).FirstOrDefault().ToString(); } if (!string.IsNullOrEmpty(fdentity.CUSTSERVICE)) { fdentity.CUSTSERVICEID = userlist.Where(x => x.Name == fdentity.CUSTSERVICE).Count() == 0 ? "" : userlist.Where(x => x.Name == fdentity.CUSTSERVICE).Select(x => x.Id).FirstOrDefault().ToString(); } if (!string.IsNullOrEmpty(fdentity.CUSTOMSER)) { fdentity.CUSTOMSERID = djycustomer.Where(x => x.ShortName == fdentity.CUSTOMSER && x.PropString == "customs_broker").Select(x => x.CodeName).FirstOrDefault(); } if (!string.IsNullOrEmpty(fdentity.TRUCKER)) { fdentity.TRUCKERID = djycustomer.Where(x => x.ShortName == fdentity.TRUCKER && x.PropString == "fleet").Select(x => x.CodeName).FirstOrDefault(); } if (!string.IsNullOrEmpty(fdentity.CUSTOMERNAME)) { fdentity.CUSTOMERID = djycustomer.Where(x => x.ShortName == fdentity.CUSTOMERNAME && x.PropString == "consignor").Select(x => x.Id).FirstOrDefault(); } if (!string.IsNullOrEmpty(fdentity.FORWARDER)) { fdentity.FORWARDERID = djycustomer.Where(x => x.ShortName == fdentity.FORWARDER && x.PropString == "booking_agent").Select(x => x.CodeName).FirstOrDefault(); } if (!string.IsNullOrEmpty(fdentity.YARD)) { fdentity.YARDID = _cache.GetAllCodeCarrier().Result.Where(x => x.CnName == fdentity.YARD).Select(x => x.Code).FirstOrDefault(); } if (!string.IsNullOrEmpty(fdentity.CARRIER)) { fdentity.CARRIERID = _cache.GetAllCodeCarrier().Result.Where(x => x.CnName == fdentity.CARRIER).Select(x => x.Code).FirstOrDefault(); if (string.IsNullOrEmpty(fdentity.CARRIERID)) { fdentity.CARRIERID = mapcarrier.Where(x => x.MapName == fdentity.CARRIER).Select(x => x.Code).FirstOrDefault(); } } if (!string.IsNullOrEmpty(fdentity.LineName)) { var line = _repline.AsQueryable().Filter(null, true).Where(m => m.TenantId == UserManager.TENANT_ID && m.LineName.Contains(fdentity.LineName)).FirstAsync(); if (line == null) { await _repline.InsertAsync(new DjyTenantLine { LineName = fdentity.LineName, LineCode = "", TenantId = UserManager.TENANT_ID, CreatedUserId = user.Id, CreatedUserName = user.Name }); } } await _rep.AsUpdateable(fdentity).IgnoreColumns(it => new { it.BOOKINGNO, it.ParentId, it.TenantId, it.TenantName, it.CreatedTime, it.CreatedUserId, it.YgtETD, it.CreatedUserName, it.LstShipOrderCompareId, it.LstShipOrderCompareDate, it.LstShipOrderCompareRltName, it.LstShipOrderCompareMode }).ExecuteCommandAsync(); var fdctnlist = await _repCtn.AsQueryable().Where(x => x.BILLID == fdmain.Id).Select(x => x.Id).ToListAsync(); await _repCtn.DeleteAsync(x => x.BILLID == fdmain.Id); await _ctndetailrep.DeleteAsync(x => fdctnlist.Contains((long)x.CTNID)); if (item.ctnInputs != null) { foreach (var it in model.ctnInputs) { var ctnentity = item.Adapt(); ctnentity.BILLID = fdmain.Id; ctnentity.CreatedUserId = user.Id; ctnentity.CreatedUserName = user.Name; ctnentity.CTNCODE = ctncode.Where(x => x.Name == ctnentity.CTNALL).Select(x => x.Code).FirstOrDefault(); await _repCtn.InsertAsync(ctnentity); if (it.ctnDetailInputs != null) { foreach (var it_ in it.ctnDetailInputs) { var ctndetail = it_.Adapt(); ctndetail.CTNID = ctnentity.Id; ctndetail.CreatedUserId = user.Id; ctndetail.CreatedUserName = user.Name; await _ctndetailrep.InsertAsync(ctndetail); } } } } if (item.BookingEDIExt != null) { //检索EDI扩展 var ediExtEntity = await _bookingEDIExt.AsQueryable().Filter(null, true).Where(x => x.BookingId == fdmain.Id).FirstAsync(); if (ediExtEntity == null) { //写入EDI扩展 ediExtEntity = item.BookingEDIExt.Adapt(); ediExtEntity.BookingId = fdmain.Id; ediExtEntity.CreatedUserId = user.Id; ediExtEntity.CreatedUserName = user.Name; ediExtEntity.CreatedTime = DateTime.Now; await _bookingEDIExt.InsertAsync(ediExtEntity); } else { //更新EDI扩展 var currEdiExtEntity = model.BookingEDIExt.Adapt(); currEdiExtEntity.Id = ediExtEntity.Id; await _bookingEDIExt.AsUpdateable(currEdiExtEntity).IgnoreColumns(it => new { it.BookingId, it.TenantId, it.CreatedTime, it.CreatedUserId, it.CreatedUserName }).ExecuteCommandAsync(); } } bool fdflag = true; long fdbid = 0; foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(fdentity)) { string name = descriptor.Name; if (name == "TenantId" || name == "CreatedTime" || name == "UpdatedTime" || name == "CreatedUserId" || name == "CreatedUserName") { continue; } object value = descriptor.GetValue(fdentity); var oldvalue = fdmain.GetType().GetProperty(name).GetValue(fdmain, null); if (name == "KGS" || name == "CBM") { if (Convert.ToDecimal(value) == Convert.ToDecimal(oldvalue)) { continue; } } string _oldvalue = oldvalue != null ? oldvalue.ToString() : ""; string _value = value != null ? value.ToString() : ""; if (_oldvalue != _value && !string.IsNullOrWhiteSpace(descriptor.Description)) { if (fdflag) { ////添加booking日志 fdbid = await _bookinglog.InsertReturnSnowflakeIdAsync(new BookingLog { Type = "Edit", BookingId = fdentity.Id, TenantId = Convert.ToInt64(UserManager.TENANT_ID), CreatedTime = DateTime.Now, CreatedUserId = user.Id, CreatedUserName = user.Name, }); fdflag = false; } await _bookinglogdetail.InsertReturnSnowflakeIdAsync(new BookingLogDetail { PId = fdbid, Field = descriptor.Description, OldValue = _oldvalue, NewValue = _value, }); } } } else { fdentity.CreatedUserId = user.Id; fdentity.CreatedUserName = user.Name; fdentity.CreatedTime = DateTime.Now; fdentity.ParentId = entity.Id; await _rep.InsertAsync(fdentity); if (item.ctnInputs != null) { foreach (var it in item.ctnInputs) { var ctnentity = item.Adapt(); ctnentity.BILLID = fdentity.Id; ctnentity.CreatedUserId = user.Id; ctnentity.CreatedUserName = user.Name; await _repCtn.InsertAsync(ctnentity); //这里保存有可能没有添加多品名,所有箱下没有货物信息 if (it.ctnDetailInputs != null) { foreach (var dit in it.ctnDetailInputs) { var ctndetail = dit.Adapt(); ctndetail.CTNID = ctnentity.Id; ctndetail.CreatedUserId = user.Id; ctndetail.CreatedUserName = user.Name; await _ctndetailrep.InsertAsync(ctndetail); } } } } if (item.BookingEDIExt != null) { //检索EDI扩展 var ediExtEntity = await _bookingEDIExt.AsQueryable().Filter(null, true).Where(x => x.BookingId == fdentity.Id).FirstAsync(); if (ediExtEntity == null) { //写入EDI扩展 ediExtEntity = model.BookingEDIExt.Adapt(); ediExtEntity.BookingId = fdentity.Id; ediExtEntity.CreatedUserId = user.Id; ediExtEntity.CreatedUserName = user.Name; ediExtEntity.CreatedTime = DateTime.Now; await _bookingEDIExt.InsertAsync(ediExtEntity); } else { //更新EDI扩展 var currEdiExtEntity = model.BookingEDIExt.Adapt(); currEdiExtEntity.Id = ediExtEntity.Id; currEdiExtEntity.UpdatedUserId = user.Id; currEdiExtEntity.UpdatedTime = DateTime.Now; await _bookingEDIExt.AsUpdateable(currEdiExtEntity).IgnoreColumns(it => new { it.BookingId, it.TenantId, it.CreatedTime, it.CreatedUserId, it.CreatedUserName }).ExecuteCommandAsync(); } } } } } #endregion } } } /// /// 爬虫上传船期港前 /// /// [HttpPost("/DataSync/SaveSyncVesselDate"), ApiUser(ApiCode = "SaveSyncVesselDate")] [SqlSugarUnitOfWork] public async Task SaveSyncVesselDate(List dto) { var infolist = _vesselinfo.AsQueryable().Filter(null, true).Where(x => x.TenantId == UserManager.TENANT_ID && x.IsDeleted == false).ToList(); var orderlist = await _rep.AsQueryable().Filter(null, true).Where(x => x.TenantId == UserManager.TENANT_ID && x.IsDeleted == false).ToListAsync(); foreach (var item in dto) { var model = infolist.Where(x => x.Vessel == item.Vessel && x.Voyno == item.Voyno).FirstOrDefault(); if (model != null) { model.ETA = item.ETA; model.YgtETD = item.ETD; model.ATD = item.ATD; model.UpdatedTime = DateTime.Now; await _vesselinfo.AsUpdateable(model).IgnoreColumns().ExecuteCommandAsync(); } var order = orderlist.Where(x => x.VESSEL == item.Vessel && x.VOYNO == item.Voyno).ToList(); bool issend = false; if (order != null) { foreach (var it in order) { var old = it; bool flag = false; if (it.StartETA != item.ETA) { flag = true; it.StartETA = item.ETA; } if (it.YgtETD != item.ETD) { flag = true; it.YgtETD = item.ETD; } if (it.ATD != item.ATD && it.ATD == null) { flag = true; it.ATD = item.ATD; } if (it.StartATA != item.ATA) { flag = true; it.StartATA = item.ATA; } if (flag) { issend = true; await _rep.AsUpdateable(it).IgnoreColumns().ExecuteCommandAsync(); await _bookingorderservice.SaveLog(it, old); } } if (issend) { var ids = order.Where(x => x.ParentId == 0).Select(x => x.Id).ToArray(); if (ids.Count() > 0) { await _bookingorderservice.SendBookingOrder(ids); } } } } } /// /// 爬虫上传船期港后 /// /// [HttpPost("/DataSync/SaveSyncGHVesselDate"), ApiUser(ApiCode = "SaveSyncGHVesselDate")] [SqlSugarUnitOfWork] public async Task SaveSyncGHVesselDate(List dto) { var orderlist = await _rep.AsQueryable().Filter(null, true).Where(x => x.TenantId == UserManager.TENANT_ID && x.IsDeleted == false).ToListAsync(); foreach (var item in dto) { //var model = _vesselinfo.AsQueryable().Filter(null, true).Where(x => x.Vessel == item.Vessel && x.Voyno == item.Voyno && x.TenantId == UserManager.TENANT_ID).FirstOrDefault(); //model.ETA = item.ETA; //model.ETD = item.ETD; //model.ATD = item.ATD; //await _vesselinfo.AsUpdateable(model).IgnoreColumns().ExecuteCommandAsync(); var order = orderlist.Where(x => x.VESSEL == item.Vessel && x.VOYNO == item.Voyno).ToList(); bool issend = false; if (order != null) { foreach (var it in order) { var old = it; bool flag = false; if (it.ETA != item.ETA) { flag = true; it.ETA = item.ETA; } if (it.MiddleETA != item.MiddleETA) { flag = true; it.MiddleETA = item.MiddleETA; } if (it.MiddleETD != item.MiddleETD) { flag = true; it.MiddleETD = item.MiddleETD; } if (item.MiddleATA != it.MiddleATA) { flag = true; it.MiddleATA = item.MiddleATA; } if (item.MiddleATD != it.MiddleATD) { flag = true; it.MiddleATD = item.MiddleATD; } if (item.ATA != it.ATA) { flag = true; it.ATA = item.ATA; } if (flag) { issend = true; await _rep.AsUpdateable(it).IgnoreColumns().ExecuteCommandAsync(); await _bookingorderservice.SaveLog(it, old); } } if (issend) { var ids = order.Where(x => x.ParentId == 0).Select(x => x.Id).ToArray(); if (ids.Count() > 0) { await _bookingorderservice.SendBookingOrder(ids); } } } } } /// /// 航线上传同步 /// /// [HttpPost("/DataSync/SyncLine"), ApiUser(ApiCode = "SyncLine")] [SqlSugarUnitOfWork] public async Task SyncLine(LineSyncDto dto) { var idList = dto.DataList.Select(x => x.Code).ToList(); var laneList = _codeLaneRep.Where(x => idList.Contains(x.Code)).ToList(); if (dto.Type == "save") { foreach (var dtoLine in dto.DataList) { var lane = laneList.FirstOrDefault(x => x.Code == dtoLine.Code); if (lane != null) { lane.EnName = dtoLine.Name; lane.CnName = dtoLine.Name; lane.ModifyTime = DateTime.Now; lane.ModifyUser = UserManager.Name; await _codeLaneRep.UpdateAsync(lane); } else { lane = new CodeLane(); lane.GID = Guid.NewGuid().ToString(); lane.Code = dtoLine.Code; lane.EnName = dtoLine.Name; lane.CnName = dtoLine.Name; lane.LaneType = "SEA"; lane.CreateTime = DateTime.Now; lane.CreateUser = UserManager.Name; await _codeLaneRep.InsertAsync(lane); } } await _commonDBService.GetAllLane(false); //刷新缓存 } else if (dto.Type == "del") { foreach (var lane in laneList) { await _codeLaneRep.DeleteAsync(lane); } await _commonDBService.GetAllLane(false); //刷新缓存 } else { throw Oops.Bah($"同步类型无效:{dto.Type}"); } } /// /// 目的港上传同步 /// /// [HttpPost("/DataSync/SyncDisport"), ApiUser(ApiCode = "SyncDisport")] [SqlSugarUnitOfWork] public async Task SyncDisport(DisportSyncDto dto) { var idList = dto.DataList.Select(x => x.Code).ToList(); var portList = _codePortRep.Where(x => idList.Contains(x.Code)).ToList(); var relaList = _relaPortLane.Where(x => idList.Contains(x.PortCode) && (x.CarrierCode == null || x.CarrierCode == "") && (x.Module == null || x.Module == "")).ToList(); var laneList = _codeLaneRep.ToList(); if (dto.Type == "save") { foreach (var dtoPort in dto.DataList) { var port = portList.FirstOrDefault(x => x.Code == dtoPort.Code); if (port != null) { dtoPort.Adapt(port); port.ModifyTime = DateTime.Now; port.ModifyUser = UserManager.Name; await _codePortRep.UpdateAsync(port); } else { port = new CodePort(); port.GID = Guid.NewGuid().ToString(); dtoPort.Adapt(port); port.CreateTime = DateTime.Now; port.CreateUser = UserManager.Name; await _codePortRep.InsertAsync(port); } //处理港口、航线对应关系 var lane = laneList.FirstOrDefault(x => x.CnName == port.ShippingRoute); if (lane != null) { var rela = relaList.FirstOrDefault(x => x.PortCode == port.Code && x.LaneCode == lane.Code); if (rela == null) //没有存在的映射关系,直接添加 { rela = new RelaPortCarrierLane(); rela.GID = Guid.NewGuid().ToString(); rela.PortCode = port.Code; rela.LaneCode = lane.Code; rela.CarrierCode = ""; rela.Module = ""; rela.CreateTime = DateTime.Now; rela.CreateUser = UserManager.Name; await _relaPortLane.InsertAsync(rela); } else if (rela.LaneCode != lane.Code) //存在映射关系,但不是上传数据中的航线 { rela.LaneCode = lane.Code; //修改航线映射 rela.ModifyTime = DateTime.Now; rela.ModifyUser = UserManager.Name; await _relaPortLane.UpdateAsync(rela); } } } await _commonDBService.GetAllPort(false); //刷新缓存 await _commonDBService.GetAllRelaPortCarrierLane(false); //刷新缓存 } else if (dto.Type == "del") { //删除港口数据 foreach (var port in portList) { await _codePortRep.DeleteAsync(port); } //删除映射关系 foreach (var rela in relaList) { await _relaPortLane.DeleteAsync(rela); } await _commonDBService.GetAllPort(false); //刷新缓存 await _commonDBService.GetAllRelaPortCarrierLane(false); //刷新缓存 } else { throw Oops.Bah($"同步类型无效:{dto.Type}"); } } /// /// 船期获取异常提醒 /// /// [HttpPost("/DataSync/SyncVesselDateExcept"), ApiUser(ApiCode = "SyncVesselDateExcept")] public async Task SyncVesselDateExcept(List dto) { if (dto != null) { string msg = string.Empty; dto = dto.Distinct().ToList(); foreach (var item in dto) { msg += $"船名:{item.Vessel} 航次:{item.Voyno} 异常信息: {item.Message}"; msg += "\r\n"; } //推送钉钉消息 DingTalkGroupHelper.SendDingTalkGroupMessage("hechuanVesselExcepNotify", "船期获取异常提醒", msg); //推送和川钉钉群,@具体操作 SyncVesselExcepAtOp(dto); } } //[HttpPost("/DataSync/SyncVesselDateTest"), ApiUser(ApiCode = "SaveSyncVesselDate")] //public async Task SyncVesselDateTest(List dto) private async Task SyncVesselExcepAtOp(List dto) { var tenantId = UserManager.TENANT_ID; SpareTime.DoOnce(60000, (tmr, l) => { try { _logger.LogInformation($"SaveSyncVesselDate @通知执行"); int maxSendLimit = 20; //钉钉每分钟发送限制 var usrList = _repUser.AsQueryable().Filter(null, true).Where(u => u.TenantId == tenantId && !u.IsDeleted).ToList(); Dictionary> dic = new Dictionary>(); //遍历船名航次,查询船期维护人 foreach (var item in dto) { var veUserList = _vesselinfo.AsQueryable().Filter(null, true) .Where(v => v.TenantId == tenantId && v.Vessel == item.Vessel && v.Voyno == item.Voyno && !v.IsDeleted) .Select(x => x.CreatedUserId) .ToList(); if (veUserList.Count > 0) { var phoneList = usrList.Where(u => veUserList.Contains(u.Id) && u.Phone != "" && u.Phone != null).Select(x => x.Phone).ToList(); foreach (var phone in phoneList) { var msg = $"船名:{item.Vessel},航次:{item.Voyno},{item.Message}"; if (dic.ContainsKey(phone)) { dic[phone].Add(msg); } else { dic.Add(phone, new List(new string[] { msg })); } } } } _logger.LogInformation($"处理发送后,准备给{dic.Count}个用户发送通知"); if (dic.Count > maxSendLimit) //大于限制,分多次发送 { int times = (int)Math.Ceiling(dic.Count * 1.0 / maxSendLimit); _logger.LogInformation($"发送通知超限,准备分为{times}次发送"); for (var t = 0; t < times; t++) { var keyList = dic.Keys.Skip(t * maxSendLimit).Take(maxSendLimit); var currTimes = t + 1; SpareTime.DoOnce(t == 0 ? 1000 : 70 * 1000 * t, doWhat: (st, val) => { _logger.LogInformation($"超限第{currTimes}次发送,共{keyList.Count()}个"); foreach (var k in keyList) { var content = string.Join("\r\n", dic[k]); _logger.LogInformation($"准备发送船期通知给 {k},内容:\r\n{content}"); DingTalkGroupHelper.SendDingTalkGroupMessage("hechuanVesselAtOpNotify", "船期提醒", content, false, new string[] { k }, null); } }); } } else { foreach (var item in dic) { var content = string.Join("\r\n", item.Value); _logger.LogInformation($"准备发送船期通知给 {item.Key},内容:\r\n{content}"); DingTalkGroupHelper.SendDingTalkGroupMessage("hechuanVesselAtOpNotify", "船期提醒", content, false, new string[] { item.Key }, null); } } } catch (Exception ex) { var excep = ex; while (excep != null) { _logger.LogError(excep.Message); _logger.LogError(excep.StackTrace); excep = excep.InnerException; } } }); } /// /// 插入货运动态 /// [SqlSugarUnitOfWork] [HttpPost("/DataSync/AddBookingStatusLog"), ApiUser(ApiCode = "AddBookingStatusLog")] public async Task AddBookingStatusLog(List all) { try { var old = await _repStatuslog.AsQueryable().Filter(null, true).Where(x => x.BookingId == all[0].BookingId && x.Category == "yunzong" && x.IsDeleted == false).ToListAsync(); await _repStatuslog.DeleteAsync(x => x.BookingId == all[0].BookingId && x.Category == "yunzong"); foreach (var ot in old) { await _statuslogdetail.DeleteAsync(x => x.PId == ot.Id); } var dicdatalist = _cache.GetAllDictData().Result; var list = await _repBookingStatus.AsQueryable().Filter(null, true).InnerJoin((d, t) => d.StaCode == t.Code && d.StaCate == "book_sta_cate_billtrace" && d.BookingId == all[0].BookingId).Select((d, t) => new { BookingId = d.BookingId, StaCode = d.StaCode, StaName = d.StaName, StaTime = d.StaTime, Code = t.Code, Value = t.Value }).ToListAsync(); bool flag = false; foreach (var item in all) { #region 日志 //新增数据 var bookingStatusLog = new BookingStatusLog(); bookingStatusLog.BookingId = item.BookingId; bookingStatusLog.Category = "yunzong"; bookingStatusLog.CreatedTime = DateTime.Now; bookingStatusLog.Status = item.Status; bookingStatusLog.OpTime = item.OpTime; bookingStatusLog.MBLNO = item.MBLNO; await _repStatuslog.InsertAsync(bookingStatusLog); if (item.detail != null && item.detail.Count > 0) { foreach (var dt in item.detail) { var BookingStatusLogDetail = new BookingStatusLogDetail(); BookingStatusLogDetail.PId = bookingStatusLog.Id; BookingStatusLogDetail.Status = dt.Status; BookingStatusLogDetail.CNTRNO = dt.CNTRNO; BookingStatusLogDetail.OPTime = dt.OPTime; await _statuslogdetail.InsertAsync(BookingStatusLogDetail); } } #endregion #region 订舱状态 if (item.Status == "舱单") { if (list.Where(x => x.Code == "sta_cangdan").FirstOrDefault() == null) { BookingStatus bookingStatus = new BookingStatus(); bookingStatus.BookingId = item.BookingId; bookingStatus.StaCode = "sta_cangdan"; bookingStatus.StaName = dicdatalist.Where(x => x.Code == "sta_cangdan").Select(x => x.Value).FirstOrDefault(); bookingStatus.StaTime = item.OpTime; bookingStatus.StaCate = "book_sta_cate_billtrace"; await _repBookingStatus.InsertAsync(bookingStatus); } } if (item.Status == "海关放行") { if (list.Where(x => x.Code == "sta_haifang").FirstOrDefault() == null) { BookingStatus bookingStatus = new BookingStatus(); bookingStatus.BookingId = item.BookingId; bookingStatus.StaCode = "sta_haifang"; bookingStatus.StaName = dicdatalist.Where(x => x.Code == "sta_haifang").Select(x => x.Value).FirstOrDefault(); bookingStatus.StaTime = item.OpTime; bookingStatus.StaCate = "book_sta_cate_billtrace"; await _repBookingStatus.InsertAsync(bookingStatus); await _bookingorderservice.SetGoodsStatus("BG", item.BookingId); flag = true; } } if (item.Status == "装载") { if (list.Where(x => x.Code == "sta_zhuangzai").FirstOrDefault() == null) { BookingStatus bookingStatus = new BookingStatus(); bookingStatus.BookingId = item.BookingId; bookingStatus.StaCode = "sta_zhuangzai"; bookingStatus.StaName = dicdatalist.Where(x => x.Code == "sta_zhuangzai").Select(x => x.Value).FirstOrDefault(); bookingStatus.StaTime = item.OpTime; bookingStatus.StaCate = "book_sta_cate_billtrace"; await _repBookingStatus.InsertAsync(bookingStatus); await _bookingorderservice.SetGoodsStatus("ZZFX", item.BookingId); flag = true; } } if (item.Status == "码放") { if (list.Where(x => x.Code == "sta_mafang").FirstOrDefault() == null) { BookingStatus bookingStatus = new BookingStatus(); bookingStatus.BookingId = item.BookingId; bookingStatus.StaCode = "sta_mafang"; bookingStatus.StaName = dicdatalist.Where(x => x.Code == "sta_mafang").Select(x => x.Value).FirstOrDefault(); bookingStatus.StaTime = item.OpTime; bookingStatus.StaCate = "book_sta_cate_billtrace"; await _repBookingStatus.InsertAsync(bookingStatus); await _bookingorderservice.SetGoodsStatus("MTFX", item.BookingId); flag = true; } } if (item.Status == "装船") { if (list.Where(x => x.Code == "sta_zhuangchuan").FirstOrDefault() == null) { BookingStatus bookingStatus = new BookingStatus(); bookingStatus.BookingId = item.BookingId; bookingStatus.StaCode = "sta_zhuangchuan"; bookingStatus.StaName = dicdatalist.Where(x => x.Code == "sta_zhuangchuan").Select(x => x.Value).FirstOrDefault(); bookingStatus.StaTime = item.detail.Max(x => x.OPTime); bookingStatus.StaCate = "book_sta_cate_billtrace"; await _repBookingStatus.InsertAsync(bookingStatus); } } if (item.Status == "ATD") { if (list.Where(x => x.Code == "sta_atd").FirstOrDefault() == null) { BookingStatus bookingStatus = new BookingStatus(); bookingStatus.BookingId = item.BookingId; bookingStatus.StaCode = "sta_atd"; bookingStatus.StaName = dicdatalist.Where(x => x.Code == "sta_atd").Select(x => x.Value).FirstOrDefault(); bookingStatus.StaTime = item.OpTime; bookingStatus.StaCate = "book_sta_cate_billtrace"; await _repBookingStatus.InsertAsync(bookingStatus); } } if (item.Status == "MDGETA") { if (list.Where(x => x.Code == "sta_mdgeta").FirstOrDefault() == null) { BookingStatus bookingStatus = new BookingStatus(); bookingStatus.BookingId = item.BookingId; bookingStatus.StaCode = "sta_atd"; bookingStatus.StaName = dicdatalist.Where(x => x.Code == "sta_mdgeta").Select(x => x.Value).FirstOrDefault(); bookingStatus.StaTime = item.OpTime; bookingStatus.StaCate = "book_sta_cate_billtrace"; await _repBookingStatus.InsertAsync(bookingStatus); } } if (item.Status == "MDGATA") { if (list.Where(x => x.Code == "sta_mdgeta").FirstOrDefault() == null) { BookingStatus bookingStatus = new BookingStatus(); bookingStatus.BookingId = item.BookingId; bookingStatus.StaCode = "sta_mdgata"; bookingStatus.StaName = dicdatalist.Where(x => x.Code == "sta_mdgata").Select(x => x.Value).FirstOrDefault(); bookingStatus.StaTime = item.OpTime; bookingStatus.StaCate = "book_sta_cate_billtrace"; await _repBookingStatus.InsertAsync(bookingStatus); } } #region 入港时间 if (item.Status == "入港") { if (list.Where(x => x.Code == "sta_rugang").FirstOrDefault() == null) { BookingStatus bookingStatus = new BookingStatus(); bookingStatus.BookingId = item.BookingId; bookingStatus.StaCode = "sta_rugang"; bookingStatus.StaName = dicdatalist.Where(x => x.Code == "sta_rugang").Select(x => x.Value).FirstOrDefault(); bookingStatus.StaTime = item.OpTime; bookingStatus.StaCate = "book_sta_cate_billtrace"; await _repBookingStatus.InsertAsync(bookingStatus); await _bookingorderservice.SetGoodsStatus("YRG", item.BookingId); flag = true; } } #endregion #endregion #region ATD MDGETA MDGATA if (item.Status == "ATD") { var o = _rep.AsQueryable().Filter(null, true).Where(x => x.Id == all[0].BookingId && x.IsDeleted == false).First(); var oldorder = o; var oldatd = o == null ? null : o.ATD; if (oldatd != item.OpTime && item.OpTime != null) { o.ATD = item.OpTime; await _rep.UpdateAsync(o); flag = true; await _bookingorderservice.SaveLog(o, oldorder); } if (!string.IsNullOrEmpty(o.VESSEL) && !string.IsNullOrEmpty(o.VOYNO) && !string.IsNullOrEmpty(o.CARRIERID)) { var order = await _rep.AsQueryable().Filter(null, true).Where(x => x.VOYNO == o.VOYNO && x.VESSEL == o.VESSEL && x.CARRIERID == o.CARRIERID && x.TenantId == o.TenantId && x.IsDeleted == false && x.Id != item.BookingId).ToListAsync(); foreach (var it in order) { var _oldorder = it; var _oldatd = it.ATD; if (_oldatd != item.OpTime) { it.ATD = item.OpTime; await _rep.UpdateAsync(it); await _bookingorderservice.SaveLog(it, _oldorder); await _bookingorderservice.SendBookingOrder(new long[] { it.Id }); } } } } if (item.Status == "MDGETA") { var o = _rep.AsQueryable().Filter(null, true).Where(x => x.Id == all[0].BookingId && x.IsDeleted == false).First(); var oldorder = o; var oldeta = o == null ? null : o.ETA; if (oldeta != item.OpTime && item.OpTime != null) { o.ETA = item.OpTime; await _rep.UpdateAsync(o); flag = true; await _bookingorderservice.SaveLog(o, oldorder); } if (!string.IsNullOrEmpty(o.VESSEL) && !string.IsNullOrEmpty(o.VOYNO) && !string.IsNullOrEmpty(o.CARRIERID)) { var order = await _rep.AsQueryable().Filter(null, true).Where(x => x.VOYNO == o.VOYNO && x.VESSEL == o.VESSEL && x.CARRIERID == o.CARRIERID && x.TenantId == o.TenantId && x.IsDeleted == false && x.Id != item.BookingId).ToListAsync(); foreach (var it in order) { var _oldorder = it; var _oldatd = it.ETA; if (_oldatd != item.OpTime) { it.ETA = item.OpTime; await _rep.UpdateAsync(it); await _bookingorderservice.SendBookingOrder(new long[] { it.Id }); await _bookingorderservice.SaveLog(it, _oldorder); } } } } if (item.Status == "MDGATA") { var o = _rep.AsQueryable().Filter(null, true).Where(x => x.Id == all[0].BookingId && x.IsDeleted == false).First(); var oldorder = o; var oldata = o == null ? null : o.ATA; if (oldata != item.OpTime && item.OpTime != null) { o.ATA = item.OpTime; await _rep.UpdateAsync(o); flag = true; await _bookingorderservice.SaveLog(o, oldorder); } if (!string.IsNullOrEmpty(o.VESSEL) && !string.IsNullOrEmpty(o.VOYNO) && !string.IsNullOrEmpty(o.CARRIERID)) { var order = await _rep.AsQueryable().Filter(null, true).Where(x => x.VOYNO == o.VOYNO && x.VESSEL == o.VESSEL && x.CARRIERID == o.CARRIERID && x.TenantId == o.TenantId && x.IsDeleted == false && x.Id != item.BookingId).ToListAsync(); foreach (var it in order) { var _oldorder = it; var _oldatd = it.ATA; if (_oldatd != item.OpTime) { it.ATA = item.OpTime; await _rep.UpdateAsync(it); await _bookingorderservice.SendBookingOrder(new long[] { it.Id }); await _bookingorderservice.SaveLog(it, _oldorder); } } } } #endregion } if (flag) { await _bookingorderservice.SendBookingOrder(new long[] { all[0].BookingId }); } } catch (Exception ex) { _logger.LogError(ex.Message); _logger.LogError(ex.StackTrace); } } #endregion #region 下载数据 /// /// 爬虫获取船名航次 /// /// [HttpGet("/DataSync/GetSyncVesselDate"), ApiUser(ApiCode = "GetSyncVesselDate")] public async Task GetSyncVesselDate() { var list = await _vesselinfo.AsQueryable().Filter(null, true) .Where(x => x.Sign == false && x.ATD == null && x.IsDeleted == false && x.TenantId == UserManager.TENANT_ID && (x.Voyno != null && x.Voyno != "") && x.ETD < DateTime.Today.AddDays(15)) //2023年7月19日,根据吴悦蓉反馈,查询3周左右的即可,再远的无效,而且也会产生无效提醒;2023年7月25日,改为2周 .Select(x => new { Vessel = x.Vessel, Voyno = x.Voyno, CARRIER = x.CARRIER, CARRIERID = x.CARRIERID }).Distinct().ToListAsync(); return list; } #endregion #region 其他 #endregion #region 自动化接口 /// /// 获取订舱数据 /// /// [HttpGet("/DataSync/GetBookingOrder"), ApiUser(ApiCode = "GetBookingOrder")] public async Task GetBookingOrder(QueryBookingOrder query) { if (query == null) { throw Oops.Bah("未录入正确查询条件"); } if (string.IsNullOrEmpty(query.MBLNO) && string.IsNullOrEmpty(query.TMBLNO) && string.IsNullOrEmpty(query.BOOKINGNO)) { return null; } var list = await _rep.AsQueryable().Filter(null, true).Where(x => x.TenantId == UserManager.TENANT_ID && x.IsDeleted == false). WhereIF(!string.IsNullOrEmpty(query.MBLNO), x => x.MBLNO == query.MBLNO). WhereIF(!string.IsNullOrEmpty(query.TMBLNO), x => x.TMBLNO == query.TMBLNO). WhereIF(!string.IsNullOrEmpty(query.BOOKINGNO), x => x.BOOKINGNO == query.BOOKINGNO).ToListAsync(); return list; } /// /// 更新订舱 /// /// /// [SqlSugarUnitOfWork] [HttpPost("/DataSync/SaveBookingOrder"), ApiUser(ApiCode = "SaveBookingOrder")] public async Task SaveBookingOrder(UpdateBookingOrder input) { if (input == null) { throw Oops.Bah("未录入数据"); } if (string.IsNullOrEmpty(input.MBLNO) && string.IsNullOrEmpty(input.TMBLNO) && string.IsNullOrEmpty(input.BOOKINGNO) && input.Id == 0) { throw Oops.Bah("未录入正确数据"); } var order = await _rep.AsQueryable().Filter(null, true).Where(x => x.Id == input.Id).FirstAsync(); var old = order; order.MBLNO = input.MBLNO; order.TMBLNO = input.TMBLNO; order.BOOKINGNO = input.BOOKINGNO; order.UpdatedUserId = order.CreatedUserId; order.UpdatedUserName = order.CreatedUserName; order.UpdatedTime = DateTime.Now; await _rep.AsUpdateable(order).IgnoreColumns(it => new { it.ParentId, it.TenantId, it.CreatedTime, it.CreatedUserId, it.CreatedUserName, it.TenantName, it.IsDeleted, }).ExecuteCommandAsync(); await _bookingorderservice.SaveLog(order, old); } /// /// 获取接口Key 个人或公司 /// /// /// /// [HttpGet("/DataSync/GetAccountConfig"), ApiUser(ApiCode = "GetAccountConfig")] public async Task GetAccountConfig(string TypeCode, long UserId) { if (string.IsNullOrWhiteSpace(TypeCode)) { throw Oops.Bah("请传入正确参数!"); } DjyWebsiteAccountConfig accountConfig = new DjyWebsiteAccountConfig(); if (UserId == 0) { accountConfig = await _accountconfig.AsQueryable().InnerJoin((d, t) => d.TenantId == t.TenantId).Where((d, t) => d.TypeCode == TypeCode && t.TenantId == UserManager.TENANT_ID && d.IsTenant == true).FirstAsync(); } else { accountConfig = await _accountconfig.FirstOrDefaultAsync(x => x.TypeCode == TypeCode && x.CreatedUserId == UserId); } return accountConfig; } /// /// 获取租户参数 /// /// [HttpGet("/DataSync/GetParamValue"), ApiUser(ApiCode = "GetParamValue")] public dynamic GetParamValue() { var list = _cache.GetAllTenantParam().Result.Where(x => x.TenantId == UserManager.TENANT_ID).OrderBy(x => x.Sort).ToList(); return list; } /// /// 挂载订舱文件 /// /// /// /// [HttpPost("/DataSync/AddFile"), ApiUser(ApiCode = "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(); // 文件后缀 if (!opt.fileType.Contains(fileSuffix)) { throw Oops.Bah(BookingErrorCode.BOOK114); } var dirAbs = string.Empty; if (string.IsNullOrEmpty(opt.basePath)) { dirAbs = Path.Combine(App.WebHostEnvironment.WebRootPath, opt.relativePath); } else { dirAbs = Path.Combine(opt.basePath, opt.relativePath); } if (!Directory.Exists(dirAbs)) Directory.CreateDirectory(dirAbs); // 先存库获取Id var id = YitIdHelper.NextId(); var fileSaveName = $"{id}{fileSuffix}".ToLower(); var fileRelaPath = Path.Combine(opt.relativePath, fileSaveName).ToLower(); var fileAbsPath = Path.Combine(dirAbs, fileSaveName).ToLower(); var newFile = new BookingFile { Id = id, FileName = originalFilename, FilePath = fileRelaPath, TypeCode = dto.TypeCode, TypeName = dto.TypeName, BookingId = dto.BookingId, }; await _bookingfile.InsertAsync(newFile); using (var stream = File.Create(fileAbsPath)) { await file.CopyToAsync(stream); } } #endregion } }