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.Service.BookingOrder.Dto;
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 Myshipping.Application.EDI;
using System.Text;
using System.Web;
using Newtonsoft.Json.Linq;
using Myshipping.Core.Helper;
using Myshipping.Application.Enum;
using Org.BouncyCastle.Asn1.X500;
using System.Drawing.Drawing2D;
using StackExchange.Profiling.Internal;
using Myshipping.Application;
using Myshipping.Application.EDI.PIL;
using Newtonsoft.Json;
using Myshipping.Application.EDI.TSL;
using Myshipping.Application.EDI.WY;
using Myshipping.Application.EDI.YML;
using Myshipping.Application.EDI.YT;
using System.Runtime.InteropServices;
using System.Threading;
using Furion.JsonSerialization;
using System.Xml.Linq;
using Myshipping.Application.Helper;
using System.Net;
using Furion.DistributedIDGenerator;
using System.Linq.Expressions;
using Myshipping.Core.Extension;
using System.Text.RegularExpressions;
using MathNet.Numerics.Distributions;
using Microsoft.IdentityModel.Tokens;
using Myshipping.Application.EDI.ESL;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.SS.Formula.Functions;
using NPOI.HPSF;
using MimeKit;
using NPOI.SS.Formula;
using NPOI.Util;
using System.Collections.Specialized;
using System.Net.Http.Headers;
using MySqlX.XDevAPI.Common;
using Ubiety.Dns.Core;
using static ICSharpCode.SharpZipLib.Zip.ExtendedUnixData;
using System.Security.Cryptography;
using Myshipping.Application.Service.DataSync.Dto;
using RabbitMQ.Client;
using System.Configuration;
using System.Collections;
using System.Security.Principal;
using Myshipping.Core.Const;
using ICSharpCode.SharpZipLib.BZip2;
using Myshipping.Application.EDI.VOLTA;
using TinyPinyin;
using Furion.EventBus;
using Myshipping.Application.Service.BookingSlot.Dto;
namespace Myshipping.Application
{
///
/// 订舱服务
///
[ApiDescriptionSettings("Application", Name = "BookingOrder", Order = 1)]
public class BookingOrderService : IBookingOrderService, IDynamicApiController, ITransient
{
private readonly SqlSugarRepository _rep;
private readonly SqlSugarRepository _repCtn;
private readonly SqlSugarRepository _ctndetailrep;
private readonly SqlSugarRepository _bookinglog;
private readonly SqlSugarRepository _bookinglogdetail;
private readonly SqlSugarRepository _bookingremark;
private readonly SqlSugarRepository _bookingfile;
private readonly ISysDataUserMenu _right;
private readonly SqlSugarRepository _repPrint;
private readonly ILogger _logger;
private readonly ISysCacheService _cache;
private readonly IDjyWebsiteAccountConfigService _webAccountConfig;
private readonly SqlSugarRepository _repStatuslog;
private readonly SqlSugarRepository _statuslogdetail;
private readonly SqlSugarRepository _repPrintTemplate;
private readonly SqlSugarRepository _repLetterYard;
private readonly SqlSugarRepository _repUser;
private readonly SqlSugarRepository _repOrderUrl;
private readonly SqlSugarRepository _repOrderContact;
private readonly SqlSugarRepository _repSampleBill;
private readonly SqlSugarRepository _repUserMail;
private readonly SqlSugarRepository _repTenant;
private readonly SqlSugarRepository _repBookingStatus;
private readonly SqlSugarRepository _bookingEDIExt;
private readonly SqlSugarRepository _vesselInfo;
private readonly SqlSugarRepository _repUserConfig;
private readonly SqlSugarRepository _excelrep;
private readonly SqlSugarRepository _serviceItem;
private readonly SqlSugarRepository _goodsStatus;
private readonly SqlSugarRepository _goodsStatusConfig;
private readonly SqlSugarRepository _djycustomer;
private readonly SqlSugarRepository _bookingTemplate;
private readonly SqlSugarRepository _paraGoodsInfoRepository;
private readonly SqlSugarRepository _paraContractNoInfoRepository;
private readonly SqlSugarRepository _djyWebsiteAccountConfigRepository;
private readonly SqlSugarRepository _repPrintTemplateShare;
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly ISysOrgService _orgService;
private readonly IBookingGoodsStatusConfigService _GoodsConfig;
private readonly SqlSugarRepository _repLineOpMgrConfig;
private readonly SqlSugarRepository _repSysEmp;
private readonly SqlSugarRepository _repAutoYard;
private readonly SqlSugarRepository _repSlotBase;
private readonly SqlSugarRepository _repSlotAllocation;
private readonly SqlSugarRepository _repSlotAllocationCtn;
private readonly SqlSugarRepository _repBookingStatusSubscribe;
private readonly SqlSugarRepository _repextendstate;
private readonly IServiceWorkFlowManageService _serviceWorkFlowManageService;
private readonly IDjyUserConfigService _djyUserConfigService;
private readonly IBookingSlotService bookingSlotService;
private readonly IBookingValueAddedService bookingValueAddedService;
private readonly IEventPublisher _publisher;
private readonly SqlSugarRepository _repTenantParamValue;
const string CONST_MAPPING_MODULE = "BOOK_OR_CLOSING";
const string CONST_MAPPING_MODULE_ROUTE = "BOOK_OR_CLOSING_RT";
const string CONST_MAPPING_MODULE_VOLTA = "BOOK_CLOSING_VOLTA";
private const string PrintRecentListTypeKey = "booking_print_recent_list";
const string CONST_TSL_EDI_URL = "tsl_edi_declare_url";
const string CONST_TSL_TYPE_CODE = "TslWeb";
const string CONST_ONE_SOFILE_CATE_CODE = "one_so_file_template";
const string PRINT_DATASOURCE_KEY = "booking_order";
public BookingOrderService(SqlSugarRepository rep, SqlSugarRepository repCtn, SqlSugarRepository ctndetailrep,
SqlSugarRepository bookinglog, SqlSugarRepository bookinglogdetail, SqlSugarRepository bookingremark,
SqlSugarRepository bookingfile, SqlSugarRepository repUserConfig, SqlSugarRepository repPrint,
SqlSugarRepository dicdata, SqlSugarRepository statuslog, SqlSugarRepository statuslogdetail,
SqlSugarRepository repPrintTemplateShare, SqlSugarRepository vesselInfo, SqlSugarRepository repextendstate,
ILogger logger, ISysCacheService cache, IDjyWebsiteAccountConfigService webAccountConfig, ISysDataUserMenu right, SqlSugarRepository paraGoodsInfoRepository,
SqlSugarRepository repPrintTemplate, SqlSugarRepository repLetterYard, SqlSugarRepository repUser, SqlSugarRepository bookingTemplate,
SqlSugarRepository repOrderUrl, SqlSugarRepository repOrderContact, SqlSugarRepository repSampleBill, SqlSugarRepository djycustomer,
SqlSugarRepository excelrep, SqlSugarRepository repUserMail, SqlSugarRepository goodsStatus, SqlSugarRepository goodsStatusConfig,
SqlSugarRepository repTenant, SqlSugarRepository repBookingStatus, SqlSugarRepository bookingEDIExt, SqlSugarRepository serviceItem,
SqlSugarRepository paraContractNoInfoRepository, IHttpContextAccessor httpContextAccessor, IBookingGoodsStatusConfigService GoodsConfig, SqlSugarRepository djyWebsiteAccountConfigRepository,
ISysOrgService orgService, SqlSugarRepository repLineOpMgrConfig, SqlSugarRepository repSysEmp, SqlSugarRepository repAutoYard,
IServiceWorkFlowManageService serviceWorkFlowManageService, IDjyUserConfigService djyUserConfigService, IEventPublisher publisher, SqlSugarRepository repSlotBase,
SqlSugarRepository repSlotAllocation, SqlSugarRepository repSlotAllocationCtn, IBookingSlotService bookingSlotService,
SqlSugarRepository repBookingStatusSubscribe, SqlSugarRepository repTenantParamValue, IBookingValueAddedService bookingValueAddedService)
{
this._logger = logger;
this._rep = rep;
this._repCtn = repCtn;
this._ctndetailrep = ctndetailrep;
this._bookinglog = bookinglog;
this._bookinglogdetail = bookinglogdetail;
this._bookingremark = bookingremark;
this._bookingfile = bookingfile;
this._repPrint = repPrint;
this._right = right;
this._cache = cache;
this._webAccountConfig = webAccountConfig;
this._repStatuslog = statuslog;
this._statuslogdetail = statuslogdetail;
this._repPrintTemplate = repPrintTemplate;
this._repLetterYard = repLetterYard;
this._repUser = repUser;
this._repOrderUrl = repOrderUrl;
this._repOrderContact = repOrderContact;
this._repSampleBill = repSampleBill;
this._repUserMail = repUserMail;
this._repTenant = repTenant;
this._repBookingStatus = repBookingStatus;
this._bookingEDIExt = bookingEDIExt;
this._repUserConfig = repUserConfig;
this._excelrep = excelrep;
this._serviceItem = serviceItem;
this._goodsStatus = goodsStatus;
this._goodsStatusConfig = goodsStatusConfig;
this._bookingTemplate = bookingTemplate;
this._djycustomer = djycustomer;
this._paraGoodsInfoRepository = paraGoodsInfoRepository;
this._paraContractNoInfoRepository = paraContractNoInfoRepository;
this._orgService = orgService;
this._vesselInfo = vesselInfo;
this._repPrintTemplateShare = repPrintTemplateShare;
_httpContextAccessor = httpContextAccessor;
_GoodsConfig = GoodsConfig;
_djyWebsiteAccountConfigRepository = djyWebsiteAccountConfigRepository;
this._repLineOpMgrConfig = repLineOpMgrConfig;
this._repSysEmp = repSysEmp;
this._repAutoYard = repAutoYard;
this._repextendstate = repextendstate;
_serviceWorkFlowManageService = serviceWorkFlowManageService;
_djyUserConfigService = djyUserConfigService;
_publisher = publisher;
_repSlotBase = repSlotBase;
_repSlotAllocation = repSlotAllocation;
_repSlotAllocationCtn = repSlotAllocationCtn;
this.bookingSlotService = bookingSlotService;
_repBookingStatusSubscribe = repBookingStatusSubscribe;
_repTenantParamValue = repTenantParamValue;
this.bookingValueAddedService = bookingValueAddedService;
}
#region 主表和箱信息
///
/// 分页查询订舱主表
///
///
///
[HttpPost("/BookingOrder/PageData")]
public async Task PageData(BookingOrderInput input)
{
var reqId = Guid.NewGuid().ToString(); //请求id,跟踪请求耗时
var ticks = DateTime.Now;
if (!string.IsNullOrEmpty(reqId))
{
_logger.LogWarning($"PageData {reqId} Stage 0 ");
}
//获取菜单列表权限
List userlist = await _right.GetDataScopeList(MenuConst.MenuBookingOrder);
List userlistString = userlist?.Select(u => u.ToString())?.ToList();
List pidlist = new List();
if (!string.IsNullOrWhiteSpace(input.SEALNO) || !string.IsNullOrWhiteSpace(input.CNTRNO))
{
pidlist = await _repCtn.AsQueryable().WhereIF(!string.IsNullOrWhiteSpace(input.SEALNO), x => x.SEALNO.StartsWith(input.SEALNO)).WhereIF(!string.IsNullOrWhiteSpace(input.CNTRNO), x => x.CNTRNO.StartsWith(input.CNTRNO)).Select(x => x.BILLID).ToListAsync();
}
//默认首次查询取开船日期范围
var ftoday = DateTime.Now.AddDays(-15);
var etoday = DateTime.Now.AddDays(30);
//List userlist = await DataFilterExtensions.GetDataScopeIdList();
if (!string.IsNullOrEmpty(reqId))
{
var et = DateTime.Now - ticks;
ticks = DateTime.Now;
_logger.LogWarning($"PageData {reqId} Stage 1 {et.TotalMilliseconds}");
}
//按部门查询
List saleUserList = null;
List opUserList = null;
if (input.OrgSale.HasValue)
{
var tmpList = await _orgService.GetUserIdListInOrg(input.OrgSale.Value);
saleUserList = tmpList.Select(x => x.ToString()).ToList();
}
if (input.OrgOp.HasValue)
{
var tmpList = await _orgService.GetUserIdListInOrg(input.OrgOp.Value);
opUserList = tmpList.Select(x => x.ToString()).ToList();
}
if (!string.IsNullOrEmpty(reqId))
{
var et = DateTime.Now - ticks;
ticks = DateTime.Now;
_logger.LogWarning($"PageData {reqId} Stage 2 {et.TotalMilliseconds}");
}
#region
var query = _rep.AsQueryable().Filter(null, true).Where(x => x.TenantId == UserManager.TENANT_ID)
.WhereIF(!input.ISDel, x => x.IsDeleted == false)
.WhereIF(input.ISDel, x => x.IsDeleted == true)
.WhereIF(input.firstFlag, x => (x.ETD <= etoday && x.ETD >= ftoday || x.ETD == null) && (x.CreatedUserId == UserManager.UserId || x.OPID == UserManager.UserId.ToString() || x.DOCID == UserManager.UserId.ToString() || x.ROUTEID == UserManager.UserId.ToString() || x.LineManageID == UserManager.UserId.ToString() || x.CUSTSERVICEID == UserManager.UserId.ToString() || x.SALEID == UserManager.UserId.ToString())) //首次加载数据:ETD前后15天,且创建人、操作是当前人
.Where(x => x.ParentId == 0 || x.ParentId == null) //台账只查询主单!!
.WhereIF(input.Id != 0, x => x.Id == input.Id)
.WhereIF(pidlist != null && pidlist.Count > 0, x => pidlist.Contains(x.Id))
.WhereIF(!string.IsNullOrWhiteSpace(input.BSNO), u => u.BSNO.Contains(input.BSNO))
.WhereIF(!string.IsNullOrWhiteSpace(input.BSSTATUS), u => u.BSSTATUS == input.BSSTATUS)
.WhereIF(input.BBSDATE != null, u => u.BSDATE >= input.BBSDATE)
.WhereIF(input.EBSDATE != null, u => u.BSDATE <= input.EBSDATE)
.WhereIF(!string.IsNullOrWhiteSpace(input.MBLNO) && !input.MBLNO.Contains(','), u => u.MBLNO.Contains(input.MBLNO.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.TMBLNO) && !input.TMBLNO.Contains(','), u => u.TMBLNO.Contains(input.TMBLNO.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.HBLNO) && !input.HBLNO.Contains(','), u => u.HBLNO.Contains(input.HBLNO.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.MBLNO) && input.MBLNO.Contains(','), u => input.MBLNO.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).Contains(u.MBLNO.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.HBLNO) && input.HBLNO.Contains(','), u => input.HBLNO.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).Contains(u.HBLNO.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.BOOKINGNO), u => u.BOOKINGNO.Contains(input.BOOKINGNO))
.WhereIF(!string.IsNullOrWhiteSpace(input.CONTRACTNO), u => u.CONTRACTNO.Contains(input.CONTRACTNO))
.WhereIF(!string.IsNullOrWhiteSpace(input.SERVICECONTRACTNO), u => u.SERVICECONTRACTNO.Contains(input.SERVICECONTRACTNO))
.WhereIF(!string.IsNullOrWhiteSpace(input.SHIPPER), u => u.SHIPPER.Contains(input.SHIPPER))
.WhereIF(!string.IsNullOrWhiteSpace(input.CONSIGNEE), u => u.CONSIGNEE.Contains(input.CONSIGNEE))
.WhereIF(!string.IsNullOrWhiteSpace(input.NOTIFYPARTY), u => u.NOTIFYPARTY.Contains(input.NOTIFYPARTY))
.WhereIF(!string.IsNullOrWhiteSpace(input.NOTIFYPARTY2), u => u.NOTIFYPARTY2.Contains(input.NOTIFYPARTY2))
.WhereIF(!string.IsNullOrWhiteSpace(input.YARDID), u => u.YARDID == input.YARDID)
.WhereIF(!string.IsNullOrWhiteSpace(input.VESSELID), u => u.VESSELID.Contains(input.VESSELID))
.WhereIF(!string.IsNullOrWhiteSpace(input.VESSEL), u => u.VESSEL.ToLower().Contains(input.VESSEL.ToLower()))
.WhereIF(!string.IsNullOrWhiteSpace(input.VOYNO), u => u.VOYNO.Contains(input.VOYNO))
.WhereIF(!string.IsNullOrWhiteSpace(input.VOYNOINNER), u => u.VOYNOINNER.Contains(input.VOYNOINNER))
.WhereIF(input.BETD != null, u => u.ETD >= input.BETD)
.WhereIF(input.EETD != null, u => u.ETD < input.EETD.Value.AddDays(1))
.WhereIF(input.BATD != null, u => u.ATD >= input.BATD)
.WhereIF(input.EATD != null, u => u.ATD < input.EATD.Value.AddDays(1))
.WhereIF(input.BCLOSINGDATE != null, u => u.CLOSINGDATE >= input.BCLOSINGDATE)
.WhereIF(input.ECLOSINGDATE != null, u => u.CLOSINGDATE <= input.ECLOSINGDATE)
.WhereIF(input.BCLOSEDOCDATE != null, u => u.CLOSEDOCDATE >= input.BCLOSEDOCDATE)
.WhereIF(input.ECLOSEDOCDATE != null, u => u.CLOSEDOCDATE <= input.ECLOSEDOCDATE)
.WhereIF(input.BCLOSEVGMDATE != null, u => u.CLOSEVGMDATE >= input.BCLOSEVGMDATE)
.WhereIF(input.ECLOSEVGMDATE != null, u => u.CLOSEVGMDATE <= input.ECLOSEVGMDATE)
.WhereIF(input.BETA != null, u => u.ETA >= input.BETA)
.WhereIF(input.EETA != null, u => u.ETA < input.EETA.Value.AddDays(1))
.WhereIF(!string.IsNullOrWhiteSpace(input.PLACERECEIPT), u => u.PLACERECEIPT.Contains(input.PLACERECEIPT))
.WhereIF(!string.IsNullOrWhiteSpace(input.PORTLOAD), u => u.PORTLOAD.Contains(input.PORTLOAD))
.WhereIF(!string.IsNullOrWhiteSpace(input.PORTLOADID), u => u.PORTLOADID == input.PORTLOADID)
.WhereIF(!string.IsNullOrWhiteSpace(input.PORTDISCHARGEID), u => u.PORTDISCHARGEID == input.PORTDISCHARGEID)
.WhereIF(!string.IsNullOrWhiteSpace(input.PORTDISCHARGE), u => u.PORTDISCHARGE.Contains(input.PORTDISCHARGE))
.WhereIF(!string.IsNullOrWhiteSpace(input.PLACEDELIVERY), u => u.PLACEDELIVERY.Contains(input.PLACEDELIVERY))
.WhereIF(!string.IsNullOrWhiteSpace(input.PLACEDELIVERYID), u => u.PLACEDELIVERYID == input.PLACEDELIVERYID)
.WhereIF(!string.IsNullOrWhiteSpace(input.DESTINATION), u => u.DESTINATION.Contains(input.DESTINATION))
.WhereIF(!string.IsNullOrWhiteSpace(input.DESTINATIONID), u => u.DESTINATIONID == input.DESTINATIONID)
.WhereIF(!string.IsNullOrWhiteSpace(input.NOBILL), u => u.NOBILL == input.NOBILL)
.WhereIF(!string.IsNullOrWhiteSpace(input.COPYNOBILLL), u => u.COPYNOBILL == input.COPYNOBILLL)
.WhereIF(!string.IsNullOrWhiteSpace(input.ISSUETYPE), u => u.ISSUETYPE == input.ISSUETYPE)
.WhereIF(input.BISSUEDATE != null, u => u.ISSUEDATE >= input.BISSUEDATE)
.WhereIF(input.EISSUEDATE != null, u => u.ISSUEDATE < input.EISSUEDATE.Value.AddDays(1))
.WhereIF(!string.IsNullOrWhiteSpace(input.ISSUEPLACE), u => u.ISSUEPLACE.Contains(input.ISSUEPLACE))
.WhereIF(!string.IsNullOrWhiteSpace(input.ISSUEPLACEID), u => u.ISSUEPLACEID == input.ISSUEPLACEID)
.WhereIF(!string.IsNullOrWhiteSpace(input.BLFRT), u => u.BLFRT == input.BLFRT)
.WhereIF(!string.IsNullOrWhiteSpace(input.PREPARDATID), u => u.PREPARDATID == input.PREPARDATID)
.WhereIF(!string.IsNullOrWhiteSpace(input.PREPARDAT), u => u.PREPARDAT == input.PREPARDAT)
.WhereIF(!string.IsNullOrWhiteSpace(input.PAYABLEAT), u => u.PAYABLEAT.Contains(input.PAYABLEAT))
.WhereIF(!string.IsNullOrWhiteSpace(input.PAYABLEATID), u => u.PAYABLEATID == input.PAYABLEATID)
.WhereIF(!string.IsNullOrWhiteSpace(input.SERVICE), u => u.SERVICE.Contains(input.SERVICE))
.WhereIF(!string.IsNullOrWhiteSpace(input.MARKS), u => u.MARKS.Contains(input.MARKS))
.WhereIF(!string.IsNullOrWhiteSpace(input.HSCODE), u => u.HSCODE.Contains(input.HSCODE))
.WhereIF(!string.IsNullOrWhiteSpace(input.DESCRIPTION), u => u.DESCRIPTION.Contains(input.DESCRIPTION))
.WhereIF(!string.IsNullOrWhiteSpace(input.KINDPKGS), u => u.KINDPKGS == input.KINDPKGS)
.WhereIF(!string.IsNullOrWhiteSpace(input.CNTRTOTAL), u => u.CNTRTOTAL.StartsWith(input.CNTRTOTAL))
.WhereIF(!string.IsNullOrWhiteSpace(input.CARRIERID), u => u.CARRIERID == input.CARRIERID)
.WhereIF(!string.IsNullOrWhiteSpace(input.CARRIER), u => u.CARRIER.Contains(input.CARRIER))
.WhereIF(!string.IsNullOrWhiteSpace(input.CARGOID), u => u.CARGOID == input.CARGOID)
.WhereIF(!string.IsNullOrWhiteSpace(input.DCLASS), u => u.DCLASS == input.DCLASS)
.WhereIF(!string.IsNullOrWhiteSpace(input.DUNNO), u => u.DUNNO == input.DUNNO)
.WhereIF(!string.IsNullOrWhiteSpace(input.DPAGE), u => u.DPAGE == input.DPAGE)
.WhereIF(!string.IsNullOrWhiteSpace(input.DLABEL), u => u.DLABEL == input.DLABEL)
.WhereIF(!string.IsNullOrWhiteSpace(input.LINKMAN), u => u.LINKMAN == input.LINKMAN)
.WhereIF(!string.IsNullOrWhiteSpace(input.TEMPID), u => u.TEMPID == input.TEMPID)
.WhereIF(!string.IsNullOrWhiteSpace(input.TEMPSET), u => u.TEMPSET == input.TEMPSET)
.WhereIF(!string.IsNullOrWhiteSpace(input.REEFERF), u => u.REEFERF == input.REEFERF)
.WhereIF(!string.IsNullOrWhiteSpace(input.HUMIDITY), u => u.HUMIDITY == input.HUMIDITY)
.WhereIF(!string.IsNullOrWhiteSpace(input.TEMPMIN), u => u.TEMPMIN == input.TEMPMIN)
.WhereIF(!string.IsNullOrWhiteSpace(input.TEMPMAX), u => u.TEMPMAX == input.TEMPMAX)
.WhereIF(input.ISCONTAINERSOC != null, u => u.ISCONTAINERSOC == input.ISCONTAINERSOC)
.WhereIF(!string.IsNullOrWhiteSpace(input.SOREMARK), u => u.SOREMARK.Contains(input.SOREMARK))
.WhereIF(!string.IsNullOrWhiteSpace(input.SIREMARK), u => u.SIREMARK.Contains(input.SIREMARK))
.WhereIF(!string.IsNullOrWhiteSpace(input.YARDREMARK), u => u.YARDREMARK.Contains(input.YARDREMARK))
.WhereIF(!string.IsNullOrWhiteSpace(input.COMPID), u => u.COMPID == input.COMPID)
.WhereIF(!string.IsNullOrWhiteSpace(input.COMPNAME), u => u.COMPNAME.Contains(input.COMPNAME))
.WhereIF(!string.IsNullOrWhiteSpace(input.SHIPPERNAME), u => u.SHIPPERNAME.Contains(input.SHIPPERNAME))
.WhereIF(!string.IsNullOrWhiteSpace(input.SHIPPERCITY), u => u.SHIPPERCITY.Contains(input.SHIPPERCITY))
.WhereIF(!string.IsNullOrWhiteSpace(input.SHIPPERPROVINCE), u => u.SHIPPERPROVINCE == input.SHIPPERPROVINCE)
.WhereIF(!string.IsNullOrWhiteSpace(input.SHIPPERPOSTCODE), u => u.SHIPPERPOSTCODE == input.SHIPPERPOSTCODE)
.WhereIF(!string.IsNullOrWhiteSpace(input.SHIPPERCOUNTRY), u => u.SHIPPERCOUNTRY == input.SHIPPERCOUNTRY)
.WhereIF(!string.IsNullOrWhiteSpace(input.SHIPPERATTN), u => u.SHIPPERATTN.Contains(input.SHIPPERATTN))
.WhereIF(!string.IsNullOrWhiteSpace(input.SHIPPERTEL), u => u.SHIPPERTEL == input.SHIPPERTEL)
.WhereIF(!string.IsNullOrWhiteSpace(input.CONSIGNEENAME), u => u.CONSIGNEENAME.Contains(input.CONSIGNEENAME))
.WhereIF(!string.IsNullOrWhiteSpace(input.CONSIGNEECITY), u => u.CONSIGNEECITY.Contains(input.CONSIGNEECITY))
.WhereIF(!string.IsNullOrWhiteSpace(input.CONSIGNEEPROVINCE), u => u.CONSIGNEEPROVINCE == input.CONSIGNEEPROVINCE)
.WhereIF(!string.IsNullOrWhiteSpace(input.CONSIGNEEPOSTCODE), u => u.CONSIGNEEPOSTCODE == input.CONSIGNEEPOSTCODE)
.WhereIF(!string.IsNullOrWhiteSpace(input.CONSIGNEERCOUNTRY), u => u.CONSIGNEERCOUNTRY == input.CONSIGNEERCOUNTRY)
.WhereIF(!string.IsNullOrWhiteSpace(input.CONSIGNEEATTN), u => u.CONSIGNEEATTN.Contains(input.CONSIGNEEATTN))
.WhereIF(!string.IsNullOrWhiteSpace(input.CONSIGNEETEL), u => u.CONSIGNEETEL == input.CONSIGNEETEL)
.WhereIF(!string.IsNullOrWhiteSpace(input.NOTIFYPARTYNAME), u => u.NOTIFYPARTYNAME.Contains(input.NOTIFYPARTYNAME))
.WhereIF(!string.IsNullOrWhiteSpace(input.NOTIFYPARTYCITY), u => u.NOTIFYPARTYCITY.Contains(input.NOTIFYPARTYCITY))
.WhereIF(!string.IsNullOrWhiteSpace(input.NOTIFYPARTYPROVINCE), u => u.NOTIFYPARTYPROVINCE == input.NOTIFYPARTYPROVINCE)
.WhereIF(!string.IsNullOrWhiteSpace(input.NOTIFYPARTYPOSTCODE), u => u.NOTIFYPARTYPOSTCODE == input.NOTIFYPARTYPOSTCODE)
.WhereIF(!string.IsNullOrWhiteSpace(input.NOTIFYPARTYCOUNTRY), u => u.NOTIFYPARTYCOUNTRY == input.NOTIFYPARTYCOUNTRY)
.WhereIF(!string.IsNullOrWhiteSpace(input.NOTIFYPARTYATTN), u => u.NOTIFYPARTYATTN.Contains(input.NOTIFYPARTYATTN))
.WhereIF(!string.IsNullOrWhiteSpace(input.NOTIFYPARTYTEL), u => u.NOTIFYPARTYTEL == input.NOTIFYPARTYTEL)
.WhereIF(!string.IsNullOrWhiteSpace(input.PONO), u => u.PONO.Contains(input.PONO))
.WhereIF(!string.IsNullOrWhiteSpace(input.OPID), u => u.OPID == input.OPID)
.WhereIF(!string.IsNullOrWhiteSpace(input.DOCID), u => u.DOCID == input.DOCID)
.WhereIF(!string.IsNullOrWhiteSpace(input.OP), u => u.OP == input.OP)
.WhereIF(!string.IsNullOrWhiteSpace(input.DOC), u => u.DOC == input.DOC)
.WhereIF(!string.IsNullOrWhiteSpace(input.SALEID), u => u.SALEID == input.SALEID)
.WhereIF(!string.IsNullOrWhiteSpace(input.SALE), u => u.SALE.Contains(input.SALE))
.WhereIF(!string.IsNullOrWhiteSpace(input.CUSTSERVICEID), u => u.CUSTSERVICEID == input.CUSTSERVICEID)
.WhereIF(!string.IsNullOrWhiteSpace(input.CUSTSERVICE), u => u.CUSTSERVICE.Contains(input.CUSTSERVICE))
.WhereIF(!string.IsNullOrWhiteSpace(input.CUSTOMERNAME), u => u.CUSTOMERNAME.Contains(input.CUSTOMERNAME))
.WhereIF(input.CUSTOMERID != null && input.CUSTOMERID != 0, u => u.CUSTOMERID == input.CUSTOMERID)
.WhereIF(!string.IsNullOrWhiteSpace(input.FORWARDER), u => u.FORWARDER.Contains(input.FORWARDER))
.WhereIF(!string.IsNullOrWhiteSpace(input.AGENTID), u => u.AGENTID == input.AGENTID)
.WhereIF(!string.IsNullOrWhiteSpace(input.FORWARDERID), u => u.FORWARDERID == input.FORWARDERID)
.WhereIF(!string.IsNullOrWhiteSpace(input.SHIPAGENCY), u => u.SHIPAGENCY.Contains(input.SHIPAGENCY))
.WhereIF(!string.IsNullOrWhiteSpace(input.SHIPAGENCYID), u => u.SHIPAGENCYID == input.SHIPAGENCYID)
.WhereIF(!string.IsNullOrWhiteSpace(input.CUSTOMSER), u => u.CUSTOMSER.Contains(input.CUSTOMSER))
.WhereIF(!string.IsNullOrWhiteSpace(input.CUSTOMSERID), u => u.CUSTOMSERID == input.CUSTOMSERID)
.WhereIF(!string.IsNullOrWhiteSpace(input.TRUCKER), u => u.TRUCKER.Contains(input.TRUCKER))
.WhereIF(!string.IsNullOrWhiteSpace(input.TRUCKERID), u => u.TRUCKERID == input.TRUCKERID)
.WhereIF(!string.IsNullOrWhiteSpace(input.AGENTNAME), u => u.AGENTNAME.Contains(input.AGENTNAME))
.WhereIF(!string.IsNullOrWhiteSpace(input.WEITUO), u => u.WEITUO.Contains(input.WEITUO))
.WhereIF(!string.IsNullOrWhiteSpace(input.SCACCODE), u => u.SCACCODE == input.SCACCODE)
.WhereIF(!string.IsNullOrWhiteSpace(input.ITNCODE), u => u.ITNCODE == input.ITNCODE)
.WhereIF(!string.IsNullOrWhiteSpace(input.CUSTNO), u => u.CUSTNO.Contains(input.CUSTNO))
.WhereIF(!string.IsNullOrWhiteSpace(input.TRANSPORTID), u => u.TRANSPORTID == input.TRANSPORTID)
.WhereIF(!string.IsNullOrWhiteSpace(input.TRANSPORT), u => u.TRANSPORT.Contains(input.TRANSPORT))
.WhereIF(!string.IsNullOrWhiteSpace(input.YARDCONTRACTTEL), u => u.YARDCONTRACTTEL == input.YARDCONTRACTTEL)
.WhereIF(!string.IsNullOrWhiteSpace(input.YARDCONTRACTEMAIL), u => u.YARDCONTRACTEMAIL == input.YARDCONTRACTEMAIL)
.WhereIF(!string.IsNullOrWhiteSpace(input.LANECODE), u => u.LANECODE == input.LANECODE)
.WhereIF(!string.IsNullOrWhiteSpace(input.LANENAME), u => u.LANENAME.Contains(input.LANENAME))
.WhereIF(!string.IsNullOrWhiteSpace(input.ROUTEID), u => u.ROUTEID == input.ROUTEID)
.WhereIF(!string.IsNullOrWhiteSpace(input.ROUTE), u => u.ROUTE.Contains(input.ROUTE))
.WhereIF(!string.IsNullOrWhiteSpace(input.LineManageID), u => u.LineManageID == input.LineManageID)
.WhereIF(!string.IsNullOrWhiteSpace(input.LineManage), u => u.LineManage.Contains(input.LineManage))
.WhereIF(!string.IsNullOrWhiteSpace(input.ShippingMethod), u => u.ShippingMethod.Contains(input.ShippingMethod))
.WhereIF(!string.IsNullOrWhiteSpace(input.CreatedUserName), u => u.CreatedUserName.Contains(input.CreatedUserName))
.WhereIF(!string.IsNullOrWhiteSpace(input.FREIGHTPAYER), u => u.FREIGHTPAYER.Contains(input.FREIGHTPAYER))
.WhereIF(!string.IsNullOrWhiteSpace(input.DZRemark), u => u.DZRemark.Contains(input.DZRemark))
.WhereIF(!string.IsNullOrWhiteSpace(input.CZRemark), u => u.CZRemark.Contains(input.CZRemark))
.WhereIF(!string.IsNullOrWhiteSpace(input.ZhanCangFlag), u => u.ZhanCangFlag == input.ZhanCangFlag)
.WhereIF(!string.IsNullOrWhiteSpace(input.BSSTATUSNAME), u => u.BSSTATUSNAME == input.BSSTATUSNAME)
.WhereIF(input.BDELETETIME != null, u => u.DeleteTime >= input.BDELETETIME)
.WhereIF(input.EDELETETIME != null, u => u.DeleteTime < input.EDELETETIME.Value.AddDays(1))
.WhereIF(saleUserList != null && saleUserList.Count > 0, o => saleUserList.Contains(o.SALEID))
.WhereIF(opUserList != null && opUserList.Count > 0, o => opUserList.Contains(o.OPID))
.WhereIF(userlist != null && userlist.Count() > 0, u => userlist.Contains((long)u.CreatedUserId) ||
UserManager.UserId.ToString() == u.ROUTEID || UserManager.Name.ToString() == u.ROUTE ||
UserManager.UserId.ToString() == u.LineManageID || UserManager.Name.ToString() == u.LineManage ||
UserManager.UserId.ToString() == u.SALEID || UserManager.Name.ToString() == u.SALE ||
userlistString.Contains(u.OPID) || UserManager.Name.ToString() == u.OP ||
userlistString.Contains(u.DOCID) || UserManager.Name.ToString() == u.DOC ||
UserManager.UserId.ToString() == u.CUSTSERVICEID || UserManager.Name.ToString() == u.CUSTSERVICE);
if (!string.IsNullOrEmpty(input.SortField) || input.MultiSort == null || input.MultiSort.Count == 0)
{
query = query.OrderBy(PageInputOrder.OrderBuilder(input.SortField, input.DescSort));
}
else
{
query = query.OrderBy(PageInputOrder.MultiOrderBuilder(input.MultiSort));
}
#endregion
/*
//标识没有台账查询
bool isHasBKOrderQuery = query.QueryBuilder.WhereInfos.Any(a => !Regex.IsMatch(a, "`?\\bTenantId\\b`?\\s?\\=\\s?\\@\\bTenantId")
&& !Regex.IsMatch(a, "`?\\bIsDeleted\\b`\\s?\\=\\s?\\@\\bIsDeleted")
&& !Regex.IsMatch(a, "`?ParentId\\b`\\s?\\=\\s?\\@[a-zA-Z]+.*`?ParentId\\b`\\s\\bIS\\b\\s\\bNULL\\b"));
if(!isHasBKOrderQuery)
{
//如果没有台账查询条件,需要先取近一个月的
}
*/
var entities = await query.ToPagedListAsync(input.PageNo, input.PageSize);
//var sql = query.ToSqlString();
if (!string.IsNullOrEmpty(reqId))
{
var et = DateTime.Now - ticks;
ticks = DateTime.Now;
_logger.LogWarning($"PageData {reqId} Stage 3 {et.TotalMilliseconds}");
}
var list = entities.Adapt>();
if (!string.IsNullOrEmpty(reqId))
{
var et = DateTime.Now - ticks;
ticks = DateTime.Now;
_logger.LogWarning($"PageData {reqId} Stage 4 {et.TotalMilliseconds}");
}
var bookingidlist = list.Items.Select(x => x.Id).ToList();
var itgoodsStatus = new List();
var itconfigs = new List();
var pageColsCfg = _djyUserConfigService.Multi(new string[] { "booking_list_column" })
.GetAwaiter().GetResult().FirstOrDefault();
bool isUseGoodsStatus = true;
//这里因为个人配置的不是标准的格式化数据,所以这里只做了正则匹配
if (pageColsCfg != null && !string.IsNullOrWhiteSpace(pageColsCfg.ConfigJson))
{
isUseGoodsStatus = Regex.IsMatch(pageColsCfg.ConfigJson, "\\\"field\\\"\\s?\\:\\s?\\\"goodsStatusList\\\"");
_logger.LogInformation("取到个人配置里是否展示 goodsStatusList(货物状态)={rlt}", (isUseGoodsStatus ? "展示" : "隐藏"));
}
List statusList = new List();
if (App.Configuration["ServiceStatusOpenAuto"] == "1")
{
if (isUseGoodsStatus)
{
var curTenant = list.Items.FirstOrDefault()?.TenantId;
QueryServiceProjectWithStatusBatch batchQuery = new QueryServiceProjectWithStatusBatch
{
BookingIds = bookingidlist.ToArray(),
QueryType = TrackingQueryTypeEnum.QUERY_SERVICE_ALL,
TenantId = curTenant.HasValue ? curTenant.Value : 0
};
var queryRlt = _serviceWorkFlowManageService.GetEnableStatusListByBusinessBatch(batchQuery)
.GetAwaiter().GetResult();
if (queryRlt.succ)
{
statusList = JSON.Deserialize>(JSON.Serialize(queryRlt.ext));
}
}
}
else
{
//货物状态
itgoodsStatus = _goodsStatus.AsQueryable().LeftJoin(_goodsStatusConfig.AsQueryable(),
(goods, config) => config.Id == goods.ConfigId && bookingidlist.Contains((long)goods.bookingId)).
OrderBy((goods, config) => config.Sort).
Select((goods, config) => new ITGoodsStatusDto
{
bookingid = goods.bookingId,
ConfigId = goods.ConfigId,
SystemCode = config.SystemCode,
StatusName = config.StatusName,
FinishTime = goods.FinishTime,
ExtData = goods.ExtData,
Remark = goods.Remark,
CreatedUserId = config.CreatedUserId,
Sort = config.Sort
}).ToList();
var configID = itgoodsStatus.Select(x => x.ConfigId)
.Distinct().ToList();
itconfigs = _goodsStatusConfig.AsQueryable()
.Where(x => configID.Contains(x.Id)).Select(config => new ITConfigsDto
{
bookingid = "",
ConfigId = config.Id,
SystemCode = config.SystemCode,
StatusName = config.StatusName,
FinishTime = "",
ExtData = "",
Remark = "",
CreatedUserId = config.CreatedUserId,
Sort = config.Sort
}).ToList();
}
if (!string.IsNullOrEmpty(reqId))
{
var et = DateTime.Now - ticks;
ticks = DateTime.Now;
_logger.LogWarning($"PageData {reqId} Stage 5 {et.TotalMilliseconds}");
}
//提箱返场
var statusloglist = _repStatuslog.AsQueryable().Filter(null, true).Where(x => bookingidlist.Contains((long)x.BookingId) && (x.Status == "提箱" || x.Status == "返场") && x.IsDeleted == false).ToList();
var statuslogId = statusloglist.Select(x => x.Id).ToList();
//运踪状态详情
var statuslogdetaillist = _statuslogdetail.AsQueryable().Where(x => statuslogId.Contains(x.PId)).ToList();
//运踪状态
var BookingStatusList = _repBookingStatus.AsQueryable().Filter(null, true).Where(x => bookingidlist.Contains((long)x.BookingId)).ToList();
//备注
var bookingremarkList = _bookingremark.AsQueryable().Filter(null, true).Where(x => bookingidlist.Contains(x.PId)).ToList();
if (!string.IsNullOrEmpty(reqId))
{
var et = DateTime.Now - ticks;
ticks = DateTime.Now;
_logger.LogWarning($"PageData {reqId} Stage 6 {et.TotalMilliseconds}");
}
foreach (var item in list.Items)
{
#region 查询条件
var sta = BookingStatusList.Where(x => x.BookingId == item.Id).ToList();
if (sta != null)
{
item.bookstatus = sta;
}
var st = bookingremarkList.Where(x => x.PId == item.Id).ToList();
if (st != null)
{
item.bookremark = st;
}
//变更日期类型
if (!string.IsNullOrWhiteSpace(item.ETD))
{
item.ETD = Convert.ToDateTime(item.ETD).ToString("yyyy-MM-dd");
}
if (!string.IsNullOrWhiteSpace(item.ETA))
{
item.ETA = Convert.ToDateTime(item.ETA).ToString("yyyy-MM-dd");
}
if (!string.IsNullOrWhiteSpace(item.YgtETD))
{
item.YgtETD = Convert.ToDateTime(item.YgtETD).ToString("yyyy-MM-dd");
}
if (!string.IsNullOrWhiteSpace(item.ATD))
{
item.ATD = Convert.ToDateTime(item.ATD).ToString("yyyy-MM-dd");
}
if (!string.IsNullOrWhiteSpace(item.StartETA))
{
item.StartETA = Convert.ToDateTime(item.StartETA).ToString("yyyy-MM-dd");
}
if (!string.IsNullOrWhiteSpace(item.StartATA))
{
item.StartATA = Convert.ToDateTime(item.StartATA).ToString("yyyy-MM-dd");
}
if (!string.IsNullOrWhiteSpace(item.MiddleETA))
{
item.MiddleETA = Convert.ToDateTime(item.MiddleETA).ToString("yyyy-MM-dd");
}
if (!string.IsNullOrWhiteSpace(item.MiddleETD))
{
item.MiddleETD = Convert.ToDateTime(item.MiddleETD).ToString("yyyy-MM-dd");
}
if (!string.IsNullOrWhiteSpace(item.MiddleATA))
{
item.MiddleATA = Convert.ToDateTime(item.MiddleATA).ToString("yyyy-MM-dd");
}
if (!string.IsNullOrWhiteSpace(item.MiddleATD))
{
item.MiddleATD = Convert.ToDateTime(item.MiddleATD).ToString("yyyy-MM-dd");
}
if (!string.IsNullOrWhiteSpace(item.ATA))
{
item.ATA = Convert.ToDateTime(item.ATA).ToString("yyyy-MM-dd");
}
#endregion
if (App.Configuration["ServiceStatusOpenAuto"] == "1")
{
if (isUseGoodsStatus)
{
var currStatusList = statusList.Where(a => long.Parse(a.BusiId) == item.Id).ToList();
if (currStatusList.Count > 0)
{
if (currStatusList.Any(a => a.StatusSKUCode.Equals("YFVGM", StringComparison.OrdinalIgnoreCase) && a.IsYield))
{
var currStus = currStatusList.FirstOrDefault(a =>
a.StatusSKUCode.Equals("YFVGM", StringComparison.OrdinalIgnoreCase) && a.IsYield);
if (currStus != null)
item.IsVGM = currStus?.ActDate.Value;
}
if (currStatusList.Any(a => a.StatusSKUCode.Equals("YFCD", StringComparison.OrdinalIgnoreCase) && a.IsYield))
{
var currStus = currStatusList.FirstOrDefault(a =>
a.StatusSKUCode.Equals("YFCD", StringComparison.OrdinalIgnoreCase) && a.IsYield);
if (currStus != null)
item.IsCanDan = currStus?.ActDate.Value;
}
if (currStatusList.Any(a => a.StatusSKUCode.Equals("ZZFX", StringComparison.OrdinalIgnoreCase) && a.IsYield))
{
var currStus = currStatusList.FirstOrDefault(a =>
a.StatusSKUCode.Equals("ZZFX", StringComparison.OrdinalIgnoreCase) && a.IsYield);
if (currStus != null)
item.IsZZFX = currStus?.ActDate.Value;
}
item.GoodsStatusList = currStatusList.OrderBy(a => a.CalcSortNo)
.Select(a => new GoodsStatusList
{
FinishTime = a.ActDate,
IsLast = a.IsEnd,
Sort = a.ActSortNo,
StatusName = a.ShowName,
SystemCode = a.StatusSKUCode,
ExtData = !string.IsNullOrWhiteSpace(a.ActVal) ? a.ActVal : string.Empty,
Remark = !string.IsNullOrWhiteSpace(a.ActRemark) ? a.ActRemark : string.Empty
}).ToList();
}
else
{
item.GoodsStatusList = new List();
}
}
else
{
item.GoodsStatusList = new List();
}
}
else
{
var itgoods = itgoodsStatus.Where(x => x.CreatedUserId == item.CreatedUserId && x.bookingid == item.Id).OrderBy(x => x.Sort).
Select(x => new GoodsStatusList
{
ConfigId = x.ConfigId,
StatusName = x.StatusName,
SystemCode = x.SystemCode,
FinishTime = x.FinishTime,
ExtData = x.ExtData,
Remark = x.Remark,
Sort = x.Sort
}).ToList();
var itconfig = itconfigs.Where(x => x.CreatedUserId == item.CreatedUserId).OrderBy(x => x.Sort).
Select(x => new GoodsStatusList
{
ConfigId = x.ConfigId,
StatusName = x.StatusName,
SystemCode = x.SystemCode,
FinishTime = null,
ExtData = x.ExtData,
Remark = x.Remark,
Sort = x.Sort
}).ToList();
foreach (var ii in itgoods)
{
itconfig.RemoveAll(x => x.ConfigId == ii.ConfigId);
}
item.IsVGM = itgoods.Where(x => x.SystemCode == "YFVGM").FirstOrDefault() == null ? null : itgoods.Where(x => x.SystemCode == "YFVGM").Select(x => x.FinishTime).FirstOrDefault();
item.IsCanDan = itgoods.Where(x => x.SystemCode == "YFCD").FirstOrDefault() == null ? null : itgoods.Where(x => x.SystemCode == "YFCD").Select(x => x.FinishTime).FirstOrDefault();
item.IsZZFX = itgoods.Where(x => x.SystemCode == "ZZFX").FirstOrDefault() == null ? null : itgoods.Where(x => x.SystemCode == "ZZFX").Select(x => x.FinishTime).FirstOrDefault();
item.GoodsStatusList = itgoods.Union(itconfig).OrderBy(x => x.Sort).ToList();
}
//获取提箱返场状态
//var statuslog = statusloglist.Where(x => x.BookingId == item.Id).OrderByDescending(x => x.CreatedTime).ToList();
//var dto = statuslog.Adapt>();
//foreach (var it in dto)
//{
// var detail = statuslogdetaillist.Where(x => x.PId == it.Id).ToList();
// it.detail = detail.Adapt>();
//}
//item.statuslogs = dto;
var statusids = statusloglist.Where(x => x.BookingId == item.Id).Select(x => x.Id).ToList();
var dto = statuslogdetaillist.Where(x => statusids.Contains(x.PId)).ToList();
List CNTRNODtolist = new List();
foreach (var d in dto)
{
var ctn = CNTRNODtolist.Where(x => x.CNTRNO == d.CNTRNO).FirstOrDefault();
if (ctn == null)
{
if (d.Status == "提箱")
{
CNTRNODtolist.Add(new CNTRNODto
{
BookingId = item.Id,
CNTRNO = d.CNTRNO,
TXOPTime = d.OPTime,
FCOPTime = null
});
}
if (d.Status == "返场")
{
CNTRNODtolist.Add(new CNTRNODto
{
BookingId = item.Id,
CNTRNO = d.CNTRNO,
FCOPTime = d.OPTime,
TXOPTime = null
});
}
}
else
{
if (d.Status == "提箱")
{
ctn.TXOPTime = d.OPTime;
}
if (d.Status == "返场")
{
ctn.FCOPTime = d.OPTime;
}
}
}
item.statuslogs1 = CNTRNODtolist;
var extendstate = await _repextendstate.FirstOrDefaultAsync(x => x.bookingId == item.Id);
if (extendstate != null)
{
item.ExtendState = extendstate;
}
}
if (!string.IsNullOrEmpty(reqId))
{
var et = DateTime.Now - ticks;
ticks = DateTime.Now;
_logger.LogWarning($"PageData {reqId} Stage 7 {et.TotalMilliseconds}");
}
return list;
}
///
/// 分页查询订舱主表(新)
///
///
///
[HttpPost("/BookingOrder/PageDataNew")]
public async Task PageDataNew(BookingOrderInputNew input)
{
var reqId = Guid.NewGuid().ToString(); //请求id,跟踪请求耗时
var ticks = DateTime.Now;
if (!string.IsNullOrEmpty(reqId))
{
_logger.LogWarning($"PageDataNew {reqId} Stage 0 ");
}
//获取菜单列表权限
List userlist = await _right.GetDataScopeList(MenuConst.MenuBookingOrder);
List userlistString = userlist?.Select(u => u.ToString())?.ToList();
List pidlist = new List();
if (!string.IsNullOrWhiteSpace(input.SEALNO) || !string.IsNullOrWhiteSpace(input.CNTRNO))
{
pidlist = await _repCtn.AsQueryable().WhereIF(!string.IsNullOrWhiteSpace(input.SEALNO), x => x.SEALNO.StartsWith(input.SEALNO)).WhereIF(!string.IsNullOrWhiteSpace(input.CNTRNO), x => x.CNTRNO.StartsWith(input.CNTRNO)).Select(x => x.BILLID).ToListAsync();
}
//默认首次查询取开船日期范围
var ftoday = DateTime.Now.AddDays(-15);
var etoday = DateTime.Now.AddDays(30);
//List userlist = await DataFilterExtensions.GetDataScopeIdList();
if (!string.IsNullOrEmpty(reqId))
{
var et = DateTime.Now - ticks;
ticks = DateTime.Now;
_logger.LogWarning($"PageDataNew {reqId} Stage 1 {et.TotalMilliseconds}");
}
//按部门查询
List saleUserList = null;
List opUserList = null;
if (input.OrgSale.HasValue)
{
var tmpList = await _orgService.GetUserIdListInOrg(input.OrgSale.Value);
saleUserList = tmpList.Select(x => x.ToString()).ToList();
}
if (input.OrgOp.HasValue)
{
var tmpList = await _orgService.GetUserIdListInOrg(input.OrgOp.Value);
opUserList = tmpList.Select(x => x.ToString()).ToList();
}
if (!string.IsNullOrEmpty(reqId))
{
var et = DateTime.Now - ticks;
ticks = DateTime.Now;
_logger.LogWarning($"PageDataNew {reqId} Stage 2 {et.TotalMilliseconds}");
}
#region
var query = _rep.AsQueryable().Filter(null, true).Where(x => x.TenantId == UserManager.TENANT_ID)
.WhereIF(!input.ISDel, x => x.IsDeleted == false)
.WhereIF(input.ISDel, x => x.IsDeleted == true)
.WhereIF(input.firstFlag, x => (x.ETD <= etoday && x.ETD >= ftoday || x.ETD == null) && (x.CreatedUserId == UserManager.UserId || x.OPID == UserManager.UserId.ToString() || x.DOCID == UserManager.UserId.ToString() || x.ROUTEID == UserManager.UserId.ToString() || x.LineManageID == UserManager.UserId.ToString() || x.CUSTSERVICEID == UserManager.UserId.ToString() || x.SALEID == UserManager.UserId.ToString())) //首次加载数据:ETD前后15天,且创建人、操作是当前人
.Where(x => x.ParentId == 0 || x.ParentId == null) //台账只查询主单!!
.WhereIF(input.Id != 0, x => x.Id == input.Id)
.WhereIF(pidlist != null && pidlist.Count > 0, x => pidlist.Contains(x.Id))
.WhereIF(!string.IsNullOrWhiteSpace(input.BSNO), u => u.BSNO.Contains(input.BSNO))
.WhereIF(!string.IsNullOrWhiteSpace(input.BSSTATUS), u => u.BSSTATUS == input.BSSTATUS)
.WhereIF(input.BBSDATE != null, u => u.BSDATE >= input.BBSDATE)
.WhereIF(input.EBSDATE != null, u => u.BSDATE <= input.EBSDATE)
.WhereIF(!string.IsNullOrWhiteSpace(input.MBLNO) && !input.MBLNO.Contains(','), u => u.MBLNO.Contains(input.MBLNO.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.TMBLNO) && !input.TMBLNO.Contains(','), u => u.TMBLNO.Contains(input.TMBLNO.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.HBLNO) && !input.HBLNO.Contains(','), u => u.HBLNO.Contains(input.HBLNO.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.MBLNO) && input.MBLNO.Contains(','), u => input.MBLNO.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).Contains(u.MBLNO.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.HBLNO) && input.HBLNO.Contains(','), u => input.HBLNO.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).Contains(u.HBLNO.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.BOOKINGNO), u => u.BOOKINGNO.Contains(input.BOOKINGNO))
.WhereIF(!string.IsNullOrWhiteSpace(input.CONTRACTNO), u => u.CONTRACTNO.Contains(input.CONTRACTNO))
.WhereIF(!string.IsNullOrWhiteSpace(input.SERVICECONTRACTNO), u => u.SERVICECONTRACTNO.Contains(input.SERVICECONTRACTNO))
.WhereIF(!string.IsNullOrWhiteSpace(input.SHIPPER), u => u.SHIPPER.Contains(input.SHIPPER))
.WhereIF(!string.IsNullOrWhiteSpace(input.CONSIGNEE), u => u.CONSIGNEE.Contains(input.CONSIGNEE))
.WhereIF(!string.IsNullOrWhiteSpace(input.NOTIFYPARTY), u => u.NOTIFYPARTY.Contains(input.NOTIFYPARTY))
.WhereIF(!string.IsNullOrWhiteSpace(input.NOTIFYPARTY2), u => u.NOTIFYPARTY2.Contains(input.NOTIFYPARTY2))
.WhereIF(!string.IsNullOrWhiteSpace(input.YARDID), u => u.YARDID == input.YARDID)
.WhereIF(!string.IsNullOrWhiteSpace(input.VESSELID), u => u.VESSELID.Contains(input.VESSELID))
.WhereIF(!string.IsNullOrWhiteSpace(input.VESSEL), u => u.VESSEL.ToLower().Contains(input.VESSEL.ToLower()))
.WhereIF(!string.IsNullOrWhiteSpace(input.VOYNO), u => u.VOYNO.Contains(input.VOYNO))
.WhereIF(!string.IsNullOrWhiteSpace(input.VOYNOINNER), u => u.VOYNOINNER.Contains(input.VOYNOINNER))
.WhereIF(input.BETD != null, u => u.ETD >= input.BETD)
.WhereIF(input.EETD != null, u => u.ETD < input.EETD.Value.AddDays(1))
.WhereIF(input.BATD != null, u => u.ATD >= input.BATD)
.WhereIF(input.EATD != null, u => u.ATD < input.EATD.Value.AddDays(1))
.WhereIF(input.BCLOSINGDATE != null, u => u.CLOSINGDATE >= input.BCLOSINGDATE)
.WhereIF(input.ECLOSINGDATE != null, u => u.CLOSINGDATE <= input.ECLOSINGDATE)
.WhereIF(input.BCLOSEDOCDATE != null, u => u.CLOSEDOCDATE >= input.BCLOSEDOCDATE)
.WhereIF(input.ECLOSEDOCDATE != null, u => u.CLOSEDOCDATE <= input.ECLOSEDOCDATE)
.WhereIF(input.BCLOSEVGMDATE != null, u => u.CLOSEVGMDATE >= input.BCLOSEVGMDATE)
.WhereIF(input.ECLOSEVGMDATE != null, u => u.CLOSEVGMDATE <= input.ECLOSEVGMDATE)
.WhereIF(input.BETA != null, u => u.ETA >= input.BETA)
.WhereIF(input.EETA != null, u => u.ETA < input.EETA.Value.AddDays(1))
.WhereIF(!string.IsNullOrWhiteSpace(input.PLACERECEIPT), u => u.PLACERECEIPT.Contains(input.PLACERECEIPT))
.WhereIF(!string.IsNullOrWhiteSpace(input.PORTLOAD), u => u.PORTLOAD.Contains(input.PORTLOAD))
.WhereIF(!string.IsNullOrWhiteSpace(input.PORTLOADID), u => u.PORTLOADID == input.PORTLOADID)
.WhereIF(!string.IsNullOrWhiteSpace(input.PORTDISCHARGEID), u => u.PORTDISCHARGEID == input.PORTDISCHARGEID)
.WhereIF(!string.IsNullOrWhiteSpace(input.PORTDISCHARGE), u => u.PORTDISCHARGE.Contains(input.PORTDISCHARGE))
.WhereIF(!string.IsNullOrWhiteSpace(input.PLACEDELIVERY), u => u.PLACEDELIVERY.Contains(input.PLACEDELIVERY))
.WhereIF(!string.IsNullOrWhiteSpace(input.PLACEDELIVERYID), u => u.PLACEDELIVERYID == input.PLACEDELIVERYID)
.WhereIF(!string.IsNullOrWhiteSpace(input.DESTINATION), u => u.DESTINATION.Contains(input.DESTINATION))
.WhereIF(!string.IsNullOrWhiteSpace(input.DESTINATIONID), u => u.DESTINATIONID == input.DESTINATIONID)
.WhereIF(!string.IsNullOrWhiteSpace(input.NOBILL), u => u.NOBILL == input.NOBILL)
.WhereIF(!string.IsNullOrWhiteSpace(input.COPYNOBILLL), u => u.COPYNOBILL == input.COPYNOBILLL)
.WhereIF(!string.IsNullOrWhiteSpace(input.ISSUETYPE), u => u.ISSUETYPE == input.ISSUETYPE)
.WhereIF(input.BISSUEDATE != null, u => u.ISSUEDATE >= input.BISSUEDATE)
.WhereIF(input.EISSUEDATE != null, u => u.ISSUEDATE < input.EISSUEDATE.Value.AddDays(1))
.WhereIF(!string.IsNullOrWhiteSpace(input.ISSUEPLACE), u => u.ISSUEPLACE.Contains(input.ISSUEPLACE))
.WhereIF(!string.IsNullOrWhiteSpace(input.ISSUEPLACEID), u => u.ISSUEPLACEID == input.ISSUEPLACEID)
.WhereIF(!string.IsNullOrWhiteSpace(input.BLFRT), u => u.BLFRT == input.BLFRT)
.WhereIF(!string.IsNullOrWhiteSpace(input.PREPARDATID), u => u.PREPARDATID == input.PREPARDATID)
.WhereIF(!string.IsNullOrWhiteSpace(input.PREPARDAT), u => u.PREPARDAT == input.PREPARDAT)
.WhereIF(!string.IsNullOrWhiteSpace(input.PAYABLEAT), u => u.PAYABLEAT.Contains(input.PAYABLEAT))
.WhereIF(!string.IsNullOrWhiteSpace(input.PAYABLEATID), u => u.PAYABLEATID == input.PAYABLEATID)
.WhereIF(!string.IsNullOrWhiteSpace(input.SERVICE), u => u.SERVICE.Contains(input.SERVICE))
.WhereIF(!string.IsNullOrWhiteSpace(input.MARKS), u => u.MARKS.Contains(input.MARKS))
.WhereIF(!string.IsNullOrWhiteSpace(input.HSCODE), u => u.HSCODE.Contains(input.HSCODE))
.WhereIF(!string.IsNullOrWhiteSpace(input.DESCRIPTION), u => u.DESCRIPTION.Contains(input.DESCRIPTION))
.WhereIF(!string.IsNullOrWhiteSpace(input.KINDPKGS), u => u.KINDPKGS == input.KINDPKGS)
.WhereIF(!string.IsNullOrWhiteSpace(input.CNTRTOTAL), u => u.CNTRTOTAL.StartsWith(input.CNTRTOTAL))
.WhereIF(!string.IsNullOrWhiteSpace(input.CARRIERID), u => u.CARRIERID == input.CARRIERID)
.WhereIF(!string.IsNullOrWhiteSpace(input.CARRIER), u => u.CARRIER.Contains(input.CARRIER))
.WhereIF(!string.IsNullOrWhiteSpace(input.CARGOID), u => u.CARGOID == input.CARGOID)
.WhereIF(!string.IsNullOrWhiteSpace(input.DCLASS), u => u.DCLASS == input.DCLASS)
.WhereIF(!string.IsNullOrWhiteSpace(input.DUNNO), u => u.DUNNO == input.DUNNO)
.WhereIF(!string.IsNullOrWhiteSpace(input.DPAGE), u => u.DPAGE == input.DPAGE)
.WhereIF(!string.IsNullOrWhiteSpace(input.DLABEL), u => u.DLABEL == input.DLABEL)
.WhereIF(!string.IsNullOrWhiteSpace(input.LINKMAN), u => u.LINKMAN == input.LINKMAN)
.WhereIF(!string.IsNullOrWhiteSpace(input.TEMPID), u => u.TEMPID == input.TEMPID)
.WhereIF(!string.IsNullOrWhiteSpace(input.TEMPSET), u => u.TEMPSET == input.TEMPSET)
.WhereIF(!string.IsNullOrWhiteSpace(input.REEFERF), u => u.REEFERF == input.REEFERF)
.WhereIF(!string.IsNullOrWhiteSpace(input.HUMIDITY), u => u.HUMIDITY == input.HUMIDITY)
.WhereIF(!string.IsNullOrWhiteSpace(input.TEMPMIN), u => u.TEMPMIN == input.TEMPMIN)
.WhereIF(!string.IsNullOrWhiteSpace(input.TEMPMAX), u => u.TEMPMAX == input.TEMPMAX)
.WhereIF(input.ISCONTAINERSOC != null, u => u.ISCONTAINERSOC == input.ISCONTAINERSOC)
.WhereIF(!string.IsNullOrWhiteSpace(input.SOREMARK), u => u.SOREMARK.Contains(input.SOREMARK))
.WhereIF(!string.IsNullOrWhiteSpace(input.SIREMARK), u => u.SIREMARK.Contains(input.SIREMARK))
.WhereIF(!string.IsNullOrWhiteSpace(input.YARDREMARK), u => u.YARDREMARK.Contains(input.YARDREMARK))
.WhereIF(!string.IsNullOrWhiteSpace(input.COMPID), u => u.COMPID == input.COMPID)
.WhereIF(!string.IsNullOrWhiteSpace(input.COMPNAME), u => u.COMPNAME.Contains(input.COMPNAME))
.WhereIF(!string.IsNullOrWhiteSpace(input.SHIPPERNAME), u => u.SHIPPERNAME.Contains(input.SHIPPERNAME))
.WhereIF(!string.IsNullOrWhiteSpace(input.SHIPPERCITY), u => u.SHIPPERCITY.Contains(input.SHIPPERCITY))
.WhereIF(!string.IsNullOrWhiteSpace(input.SHIPPERPROVINCE), u => u.SHIPPERPROVINCE == input.SHIPPERPROVINCE)
.WhereIF(!string.IsNullOrWhiteSpace(input.SHIPPERPOSTCODE), u => u.SHIPPERPOSTCODE == input.SHIPPERPOSTCODE)
.WhereIF(!string.IsNullOrWhiteSpace(input.SHIPPERCOUNTRY), u => u.SHIPPERCOUNTRY == input.SHIPPERCOUNTRY)
.WhereIF(!string.IsNullOrWhiteSpace(input.SHIPPERATTN), u => u.SHIPPERATTN.Contains(input.SHIPPERATTN))
.WhereIF(!string.IsNullOrWhiteSpace(input.SHIPPERTEL), u => u.SHIPPERTEL == input.SHIPPERTEL)
.WhereIF(!string.IsNullOrWhiteSpace(input.CONSIGNEENAME), u => u.CONSIGNEENAME.Contains(input.CONSIGNEENAME))
.WhereIF(!string.IsNullOrWhiteSpace(input.CONSIGNEECITY), u => u.CONSIGNEECITY.Contains(input.CONSIGNEECITY))
.WhereIF(!string.IsNullOrWhiteSpace(input.CONSIGNEEPROVINCE), u => u.CONSIGNEEPROVINCE == input.CONSIGNEEPROVINCE)
.WhereIF(!string.IsNullOrWhiteSpace(input.CONSIGNEEPOSTCODE), u => u.CONSIGNEEPOSTCODE == input.CONSIGNEEPOSTCODE)
.WhereIF(!string.IsNullOrWhiteSpace(input.CONSIGNEERCOUNTRY), u => u.CONSIGNEERCOUNTRY == input.CONSIGNEERCOUNTRY)
.WhereIF(!string.IsNullOrWhiteSpace(input.CONSIGNEEATTN), u => u.CONSIGNEEATTN.Contains(input.CONSIGNEEATTN))
.WhereIF(!string.IsNullOrWhiteSpace(input.CONSIGNEETEL), u => u.CONSIGNEETEL == input.CONSIGNEETEL)
.WhereIF(!string.IsNullOrWhiteSpace(input.NOTIFYPARTYNAME), u => u.NOTIFYPARTYNAME.Contains(input.NOTIFYPARTYNAME))
.WhereIF(!string.IsNullOrWhiteSpace(input.NOTIFYPARTYCITY), u => u.NOTIFYPARTYCITY.Contains(input.NOTIFYPARTYCITY))
.WhereIF(!string.IsNullOrWhiteSpace(input.NOTIFYPARTYPROVINCE), u => u.NOTIFYPARTYPROVINCE == input.NOTIFYPARTYPROVINCE)
.WhereIF(!string.IsNullOrWhiteSpace(input.NOTIFYPARTYPOSTCODE), u => u.NOTIFYPARTYPOSTCODE == input.NOTIFYPARTYPOSTCODE)
.WhereIF(!string.IsNullOrWhiteSpace(input.NOTIFYPARTYCOUNTRY), u => u.NOTIFYPARTYCOUNTRY == input.NOTIFYPARTYCOUNTRY)
.WhereIF(!string.IsNullOrWhiteSpace(input.NOTIFYPARTYATTN), u => u.NOTIFYPARTYATTN.Contains(input.NOTIFYPARTYATTN))
.WhereIF(!string.IsNullOrWhiteSpace(input.NOTIFYPARTYTEL), u => u.NOTIFYPARTYTEL == input.NOTIFYPARTYTEL)
.WhereIF(!string.IsNullOrWhiteSpace(input.PONO), u => u.PONO.Contains(input.PONO))
.WhereIF(!string.IsNullOrWhiteSpace(input.OPID), u => u.OPID == input.OPID)
.WhereIF(!string.IsNullOrWhiteSpace(input.DOCID), u => u.DOCID == input.DOCID)
.WhereIF(!string.IsNullOrWhiteSpace(input.OP), u => u.OP == input.OP)
.WhereIF(!string.IsNullOrWhiteSpace(input.DOC), u => u.DOC == input.DOC)
.WhereIF(!string.IsNullOrWhiteSpace(input.SALEID), u => u.SALEID == input.SALEID)
.WhereIF(!string.IsNullOrWhiteSpace(input.SALE), u => u.SALE.Contains(input.SALE))
.WhereIF(!string.IsNullOrWhiteSpace(input.CUSTSERVICEID), u => u.CUSTSERVICEID == input.CUSTSERVICEID)
.WhereIF(!string.IsNullOrWhiteSpace(input.CUSTSERVICE), u => u.CUSTSERVICE.Contains(input.CUSTSERVICE))
.WhereIF(!string.IsNullOrWhiteSpace(input.CUSTOMERNAME), u => u.CUSTOMERNAME.Contains(input.CUSTOMERNAME))
.WhereIF(input.CUSTOMERID != null && input.CUSTOMERID != 0, u => u.CUSTOMERID == input.CUSTOMERID)
.WhereIF(!string.IsNullOrWhiteSpace(input.FORWARDER), u => u.FORWARDER.Contains(input.FORWARDER))
.WhereIF(!string.IsNullOrWhiteSpace(input.AGENTID), u => u.AGENTID == input.AGENTID)
.WhereIF(!string.IsNullOrWhiteSpace(input.FORWARDERID), u => u.FORWARDERID == input.FORWARDERID)
.WhereIF(!string.IsNullOrWhiteSpace(input.SHIPAGENCY), u => u.SHIPAGENCY.Contains(input.SHIPAGENCY))
.WhereIF(!string.IsNullOrWhiteSpace(input.SHIPAGENCYID), u => u.SHIPAGENCYID == input.SHIPAGENCYID)
.WhereIF(!string.IsNullOrWhiteSpace(input.CUSTOMSER), u => u.CUSTOMSER.Contains(input.CUSTOMSER))
.WhereIF(!string.IsNullOrWhiteSpace(input.CUSTOMSERID), u => u.CUSTOMSERID == input.CUSTOMSERID)
.WhereIF(!string.IsNullOrWhiteSpace(input.TRUCKER), u => u.TRUCKER.Contains(input.TRUCKER))
.WhereIF(!string.IsNullOrWhiteSpace(input.TRUCKERID), u => u.TRUCKERID == input.TRUCKERID)
.WhereIF(!string.IsNullOrWhiteSpace(input.AGENTNAME), u => u.AGENTNAME.Contains(input.AGENTNAME))
.WhereIF(!string.IsNullOrWhiteSpace(input.WEITUO), u => u.WEITUO.Contains(input.WEITUO))
.WhereIF(!string.IsNullOrWhiteSpace(input.SCACCODE), u => u.SCACCODE == input.SCACCODE)
.WhereIF(!string.IsNullOrWhiteSpace(input.ITNCODE), u => u.ITNCODE == input.ITNCODE)
.WhereIF(!string.IsNullOrWhiteSpace(input.CUSTNO), u => u.CUSTNO.Contains(input.CUSTNO))
.WhereIF(!string.IsNullOrWhiteSpace(input.TRANSPORTID), u => u.TRANSPORTID == input.TRANSPORTID)
.WhereIF(!string.IsNullOrWhiteSpace(input.TRANSPORT), u => u.TRANSPORT.Contains(input.TRANSPORT))
.WhereIF(!string.IsNullOrWhiteSpace(input.YARDCONTRACTTEL), u => u.YARDCONTRACTTEL == input.YARDCONTRACTTEL)
.WhereIF(!string.IsNullOrWhiteSpace(input.YARDCONTRACTEMAIL), u => u.YARDCONTRACTEMAIL == input.YARDCONTRACTEMAIL)
.WhereIF(!string.IsNullOrWhiteSpace(input.LANECODE), u => u.LANECODE == input.LANECODE)
.WhereIF(!string.IsNullOrWhiteSpace(input.LANENAME), u => u.LANENAME.Contains(input.LANENAME))
.WhereIF(!string.IsNullOrWhiteSpace(input.ROUTEID), u => u.ROUTEID == input.ROUTEID)
.WhereIF(!string.IsNullOrWhiteSpace(input.ROUTE), u => u.ROUTE.Contains(input.ROUTE))
.WhereIF(!string.IsNullOrWhiteSpace(input.LineManageID), u => u.LineManageID == input.LineManageID)
.WhereIF(!string.IsNullOrWhiteSpace(input.LineManage), u => u.LineManage.Contains(input.LineManage))
.WhereIF(!string.IsNullOrWhiteSpace(input.ShippingMethod), u => u.ShippingMethod.Contains(input.ShippingMethod))
.WhereIF(!string.IsNullOrWhiteSpace(input.CreatedUserName), u => u.CreatedUserName.Contains(input.CreatedUserName))
.WhereIF(!string.IsNullOrWhiteSpace(input.FREIGHTPAYER), u => u.FREIGHTPAYER.Contains(input.FREIGHTPAYER))
.WhereIF(!string.IsNullOrWhiteSpace(input.DZRemark), u => u.DZRemark.Contains(input.DZRemark))
.WhereIF(!string.IsNullOrWhiteSpace(input.CZRemark), u => u.CZRemark.Contains(input.CZRemark))
.WhereIF(!string.IsNullOrWhiteSpace(input.ZhanCangFlag), u => u.ZhanCangFlag == input.ZhanCangFlag)
.WhereIF(!string.IsNullOrWhiteSpace(input.BSSTATUSNAME), u => u.BSSTATUSNAME == input.BSSTATUSNAME)
.WhereIF(input.BDELETETIME != null, u => u.DeleteTime >= input.BDELETETIME)
.WhereIF(input.EDELETETIME != null, u => u.DeleteTime < input.EDELETETIME.Value.AddDays(1))
.WhereIF(saleUserList != null && saleUserList.Count > 0, o => saleUserList.Contains(o.SALEID))
.WhereIF(opUserList != null && opUserList.Count > 0, o => opUserList.Contains(o.OPID))
.WhereIF(userlist != null && userlist.Count() > 0, u => userlist.Contains((long)u.CreatedUserId) ||
UserManager.UserId.ToString() == u.ROUTEID || UserManager.Name.ToString() == u.ROUTE ||
UserManager.UserId.ToString() == u.LineManageID || UserManager.Name.ToString() == u.LineManage ||
UserManager.UserId.ToString() == u.SALEID || UserManager.Name.ToString() == u.SALE ||
userlistString.Contains(u.OPID) || UserManager.Name.ToString() == u.OP ||
userlistString.Contains(u.DOCID) || UserManager.Name.ToString() == u.DOC ||
UserManager.UserId.ToString() == u.CUSTSERVICEID || UserManager.Name.ToString() == u.CUSTSERVICE);
var selector = new List()
{
new SelectModel() { FiledName = "Id" },
new SelectModel() { FiledName = "TenantId" }
};
var ordProps = typeof(BookingOrder).GetProperties();
foreach (var sc in input.ShowColumns)
{
var prop = ordProps.FirstOrDefault(x => x.Name.ToLower() == sc.ToLower());
if (prop != null)
{
selector.Add(new SelectModel() { FiledName = prop.Name });
}
else
{
_logger.LogWarning($"找不到对象上的列:{sc}");
}
}
query = query.Select(selector);
if (!string.IsNullOrEmpty(input.SortField) || input.MultiSort == null || input.MultiSort.Count == 0)
{
query = query.OrderBy(PageInputOrder.OrderBuilder(input.SortField, input.DescSort));
}
else
{
query = query.OrderBy(PageInputOrder.MultiOrderBuilder(input.MultiSort));
}
#endregion
var entities = await query.ToPagedListAsync(input.PageNo, input.PageSize);
//var sql = query.ToSqlString();
if (!string.IsNullOrEmpty(reqId))
{
var et = DateTime.Now - ticks;
ticks = DateTime.Now;
_logger.LogWarning($"PageDataNew {reqId} Stage 3 {et.TotalMilliseconds}");
}
var list = entities.Adapt>();
if (!string.IsNullOrEmpty(reqId))
{
var et = DateTime.Now - ticks;
ticks = DateTime.Now;
_logger.LogWarning($"PageDataNew {reqId} Stage 4 {et.TotalMilliseconds}");
}
var bookingidlist = list.Items.Select(x => x.Id).ToList();
var itgoodsStatus = new List();
var itconfigs = new List();
var pageColsCfg = _djyUserConfigService.Multi(new string[] { "booking_list_column" })
.GetAwaiter().GetResult().FirstOrDefault();
bool isUseGoodsStatus = true;
//这里因为个人配置的不是标准的格式化数据,所以这里只做了正则匹配
if (pageColsCfg != null && !string.IsNullOrWhiteSpace(pageColsCfg.ConfigJson))
{
isUseGoodsStatus = Regex.IsMatch(pageColsCfg.ConfigJson, "\\\"field\\\"\\s?\\:\\s?\\\"goodsStatusList\\\"");
_logger.LogInformation("取到个人配置里是否展示 goodsStatusList(货物状态)={rlt}", (isUseGoodsStatus ? "展示" : "隐藏"));
}
List statusList = new List();
if (App.Configuration["ServiceStatusOpenAuto"] == "1")
{
if (isUseGoodsStatus)
{
QueryServiceProjectWithStatusBatch batchQuery = new QueryServiceProjectWithStatusBatch
{
BookingIds = bookingidlist.ToArray(),
QueryType = TrackingQueryTypeEnum.QUERY_SERVICE_ALL,
TenantId = list.Items.FirstOrDefault().TenantId.Value
};
var queryRlt = _serviceWorkFlowManageService.GetEnableStatusListByBusinessBatch(batchQuery)
.GetAwaiter().GetResult();
if (queryRlt.succ)
{
statusList = JSON.Deserialize>(JSON.Serialize(queryRlt.ext));
}
}
}
else
{
//货物状态
itgoodsStatus = _goodsStatus.AsQueryable().LeftJoin(_goodsStatusConfig.AsQueryable(),
(goods, config) => config.Id == goods.ConfigId && bookingidlist.Contains((long)goods.bookingId)).
OrderBy((goods, config) => config.Sort).
Select((goods, config) => new ITGoodsStatusDto
{
bookingid = goods.bookingId,
ConfigId = goods.ConfigId,
SystemCode = config.SystemCode,
StatusName = config.StatusName,
FinishTime = goods.FinishTime,
ExtData = goods.ExtData,
Remark = goods.Remark,
CreatedUserId = config.CreatedUserId,
Sort = config.Sort
}).ToList();
var configID = itgoodsStatus.Select(x => x.ConfigId)
.Distinct().ToList();
itconfigs = _goodsStatusConfig.AsQueryable()
.Where(x => configID.Contains(x.Id)).Select(config => new ITConfigsDto
{
bookingid = "",
ConfigId = config.Id,
SystemCode = config.SystemCode,
StatusName = config.StatusName,
FinishTime = "",
ExtData = "",
Remark = "",
CreatedUserId = config.CreatedUserId,
Sort = config.Sort
}).ToList();
}
if (!string.IsNullOrEmpty(reqId))
{
var et = DateTime.Now - ticks;
ticks = DateTime.Now;
_logger.LogWarning($"PageDataNew {reqId} Stage 5 {et.TotalMilliseconds}");
}
List statusloglist = null;
List statuslogdetaillist = null;
if (input.ShowColumns.Contains("statuslogs"))
{
//提箱返场
statusloglist = _repStatuslog.AsQueryable().Filter(null, true).Where(x => bookingidlist.Contains((long)x.BookingId) && (x.Status == "提箱" || x.Status == "返场") && x.IsDeleted == false).ToList();
var statuslogId = statusloglist.Select(x => x.Id).ToList();
//运踪状态详情
statuslogdetaillist = _statuslogdetail.AsQueryable().Where(x => statuslogId.Contains(x.PId)).ToList();
}
//运踪状态
List BookingStatusList = null;
if (input.ShowColumns.Contains("bookstatus"))
{
BookingStatusList = _repBookingStatus.AsQueryable().Filter(null, true).Where(x => bookingidlist.Contains((long)x.BookingId)).ToList();
}
//备注
List bookingremarkList = null;
if (input.ShowColumns.Contains("bookremark"))
{
bookingremarkList = _bookingremark.AsQueryable().Filter(null, true).Where(x => bookingidlist.Contains(x.PId)).ToList();
}
if (!string.IsNullOrEmpty(reqId))
{
var et = DateTime.Now - ticks;
ticks = DateTime.Now;
_logger.LogWarning($"PageDataNew {reqId} Stage 6 {et.TotalMilliseconds}");
}
if (input.ShowColumns.Contains("isVGM")
|| input.ShowColumns.Contains("isCanDan")
|| input.ShowColumns.Contains("isZZFX")
|| input.ShowColumns.Contains("goodsStatusList")
|| input.ShowColumns.Contains("statuslogs")
|| input.ShowColumns.Contains("txxp"))
{
foreach (var item in list.Items)
{
#region 查询条件
//运踪
if (input.ShowColumns.Contains("bookstatus"))
{
var sta = BookingStatusList.Where(x => x.BookingId == item.Id).ToList();
if (sta != null)
{
item.bookstatus = sta;
}
}
//备注
if (input.ShowColumns.Contains("bookremark"))
{
var st = bookingremarkList.Where(x => x.PId == item.Id).ToList();
if (st != null)
{
item.bookremark = st;
}
}
//变更日期类型
if (!string.IsNullOrWhiteSpace(item.ETD))
{
item.ETD = Convert.ToDateTime(item.ETD).ToString("yyyy-MM-dd");
}
if (!string.IsNullOrWhiteSpace(item.ETA))
{
item.ETA = Convert.ToDateTime(item.ETA).ToString("yyyy-MM-dd");
}
if (!string.IsNullOrWhiteSpace(item.YgtETD))
{
item.YgtETD = Convert.ToDateTime(item.YgtETD).ToString("yyyy-MM-dd");
}
if (!string.IsNullOrWhiteSpace(item.ATD))
{
item.ATD = Convert.ToDateTime(item.ATD).ToString("yyyy-MM-dd");
}
if (!string.IsNullOrWhiteSpace(item.StartETA))
{
item.StartETA = Convert.ToDateTime(item.StartETA).ToString("yyyy-MM-dd");
}
if (!string.IsNullOrWhiteSpace(item.StartATA))
{
item.StartATA = Convert.ToDateTime(item.StartATA).ToString("yyyy-MM-dd");
}
if (!string.IsNullOrWhiteSpace(item.MiddleETA))
{
item.MiddleETA = Convert.ToDateTime(item.MiddleETA).ToString("yyyy-MM-dd");
}
if (!string.IsNullOrWhiteSpace(item.MiddleETD))
{
item.MiddleETD = Convert.ToDateTime(item.MiddleETD).ToString("yyyy-MM-dd");
}
if (!string.IsNullOrWhiteSpace(item.MiddleATA))
{
item.MiddleATA = Convert.ToDateTime(item.MiddleATA).ToString("yyyy-MM-dd");
}
if (!string.IsNullOrWhiteSpace(item.MiddleATD))
{
item.MiddleATD = Convert.ToDateTime(item.MiddleATD).ToString("yyyy-MM-dd");
}
if (!string.IsNullOrWhiteSpace(item.ATA))
{
item.ATA = Convert.ToDateTime(item.ATA).ToString("yyyy-MM-dd");
}
#endregion
if (App.Configuration["ServiceStatusOpenAuto"] == "1")
{
if (isUseGoodsStatus)
{
var currStatusList = statusList.Where(a => long.Parse(a.BusiId) == item.Id).ToList();
if (currStatusList.Count > 0)
{
if (currStatusList.Any(a => a.StatusSKUCode.Equals("YFVGM", StringComparison.OrdinalIgnoreCase) && a.IsYield))
{
var currStus = currStatusList.FirstOrDefault(a =>
a.StatusSKUCode.Equals("YFVGM", StringComparison.OrdinalIgnoreCase) && a.IsYield);
if (currStus != null)
item.IsVGM = currStus?.ActDate.Value;
}
if (currStatusList.Any(a => a.StatusSKUCode.Equals("YFCD", StringComparison.OrdinalIgnoreCase) && a.IsYield))
{
var currStus = currStatusList.FirstOrDefault(a =>
a.StatusSKUCode.Equals("YFCD", StringComparison.OrdinalIgnoreCase) && a.IsYield);
if (currStus != null)
item.IsCanDan = currStus?.ActDate.Value;
}
if (currStatusList.Any(a => a.StatusSKUCode.Equals("ZZFX", StringComparison.OrdinalIgnoreCase) && a.IsYield))
{
var currStus = currStatusList.FirstOrDefault(a =>
a.StatusSKUCode.Equals("ZZFX", StringComparison.OrdinalIgnoreCase) && a.IsYield);
if (currStus != null)
item.IsZZFX = currStus?.ActDate.Value;
}
//货物状态列
if (input.ShowColumns.Contains("goodsStatusList"))
{
item.GoodsStatusList = currStatusList.OrderBy(a => a.CalcSortNo)
.Select(a => new GoodsStatusList
{
FinishTime = a.ActDate,
IsLast = a.IsEnd,
Sort = a.ActSortNo,
StatusName = a.ShowName,
SystemCode = a.StatusSKUCode,
ExtData = !string.IsNullOrWhiteSpace(a.ActVal) ? a.ActVal : string.Empty,
Remark = !string.IsNullOrWhiteSpace(a.ActRemark) ? a.ActRemark : string.Empty
}).ToList();
}
}
}
}
else
{
var itgoods = itgoodsStatus.Where(x => x.CreatedUserId == item.CreatedUserId && x.bookingid == item.Id).OrderBy(x => x.Sort).
Select(x => new GoodsStatusList
{
ConfigId = x.ConfigId,
StatusName = x.StatusName,
SystemCode = x.SystemCode,
FinishTime = x.FinishTime,
ExtData = x.ExtData,
Remark = x.Remark,
Sort = x.Sort
}).ToList();
var itconfig = itconfigs.Where(x => x.CreatedUserId == item.CreatedUserId).OrderBy(x => x.Sort).
Select(x => new GoodsStatusList
{
ConfigId = x.ConfigId,
StatusName = x.StatusName,
SystemCode = x.SystemCode,
FinishTime = null,
ExtData = x.ExtData,
Remark = x.Remark,
Sort = x.Sort
}).ToList();
foreach (var ii in itgoods)
{
itconfig.RemoveAll(x => x.ConfigId == ii.ConfigId);
}
item.IsVGM = itgoods.Where(x => x.SystemCode == "YFVGM").FirstOrDefault() == null ? null : itgoods.Where(x => x.SystemCode == "YFVGM").Select(x => x.FinishTime).FirstOrDefault();
item.IsCanDan = itgoods.Where(x => x.SystemCode == "YFCD").FirstOrDefault() == null ? null : itgoods.Where(x => x.SystemCode == "YFCD").Select(x => x.FinishTime).FirstOrDefault();
item.IsZZFX = itgoods.Where(x => x.SystemCode == "ZZFX").FirstOrDefault() == null ? null : itgoods.Where(x => x.SystemCode == "ZZFX").Select(x => x.FinishTime).FirstOrDefault();
item.GoodsStatusList = itgoods.Union(itconfig).OrderBy(x => x.Sort).ToList();
}
//获取提箱返场状态
if (input.ShowColumns.Contains("statuslogs"))
{
var statusids = statusloglist.Where(x => x.BookingId == item.Id).Select(x => x.Id).ToList();
var dto = statuslogdetaillist.Where(x => statusids.Contains(x.PId)).ToList();
List CNTRNODtolist = new List();
foreach (var d in dto)
{
var ctn = CNTRNODtolist.Where(x => x.CNTRNO == d.CNTRNO).FirstOrDefault();
if (ctn == null)
{
if (d.Status == "提箱")
{
CNTRNODtolist.Add(new CNTRNODto
{
BookingId = item.Id,
CNTRNO = d.CNTRNO,
TXOPTime = d.OPTime,
FCOPTime = null
});
}
if (d.Status == "返场")
{
CNTRNODtolist.Add(new CNTRNODto
{
BookingId = item.Id,
CNTRNO = d.CNTRNO,
FCOPTime = d.OPTime,
TXOPTime = null
});
}
}
else
{
if (d.Status == "提箱")
{
ctn.TXOPTime = d.OPTime;
}
if (d.Status == "返场")
{
ctn.FCOPTime = d.OPTime;
}
}
}
item.statuslogs1 = CNTRNODtolist;
}
//扩展表(小票相关)
if (input.ShowColumns.Contains("txxp"))
{
var extendstate = await _repextendstate.FirstOrDefaultAsync(x => x.bookingId == item.Id);
if (extendstate != null)
{
item.ExtendState = extendstate;
}
}
}
}
if (!string.IsNullOrEmpty(reqId))
{
var et = DateTime.Now - ticks;
ticks = DateTime.Now;
_logger.LogWarning($"PageDataNew {reqId} Stage 7 {et.TotalMilliseconds}");
}
return list;
}
///
/// 立即返回保存信息
///
///
///
[HttpPost("/BookingOrder/Save")]
public async Task Save(SaveBookingOrderInput input)
{
var reqId = Guid.NewGuid().ToString(); //请求id,跟踪请求耗时
if (input == null)
{
throw Oops.Bah("请传入正常数据!");
}
if (!string.IsNullOrEmpty(reqId))
{
_logger.LogWarning($"保存请求[{reqId}],开始:{UserManager.Name} {JsonConvert.SerializeObject(input, new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore })}");
}
var ms = JsonUtil.TrimFields(input);
if (!string.IsNullOrEmpty(ms))
{
throw Oops.Bah(ms);
}
if (!string.IsNullOrEmpty(reqId))
{
_logger.LogWarning($"保存请求[{reqId}],大写转换完成");
}
//转大写
JsonUtil.PropToUpper(input, "ORDNO", "BSSTATUS", "YARDID", "YardContract", "YardContractTel", "YardContractEmail", "MARKS", "DESCRIPTION", "CONSIGNEENAME", "SHIPPERNAME", "NOTIFYPARTYNAME", "DZRemark", "CZRemark");
if (input.ctnInputs != null)
{
var groupList = input.ctnInputs.GroupBy(c => c.CTNALL).Select(g => $"{g.Key}*{g.Sum(gg => gg.CTNNUM)}");
input.CNTRTOTAL = string.Join(" / ", groupList);
}
//条件限制 重复限制
if (!string.IsNullOrWhiteSpace(input.MBLNO) && input.ParentId == 0)
{
var et = await _rep.AsQueryable().Filter(null, true).Where(x => x.IsDeleted == false && x.MBLNO == input.MBLNO && x.TenantId == UserManager.TENANT_ID && x.ParentId == 0 && x.Id != input.Id).FirstAsync();
if (et != null)
{
throw Oops.Bah("当前主提单号已存在,请勿重复录入!");
}
}
//if (!string.IsNullOrWhiteSpace(input.HBLNO) && !string.IsNullOrWhiteSpace(input.MBLNO) && input.ParentId != 0)
//{
// var et = await _rep.AsQueryable().Filter(null, true).Where(x => x.IsDeleted == false && x.MBLNO == input.MBLNO && x.HBLNO == input.HBLNO && x.TenantId == UserManager.TENANT_ID && x.ParentId == input.ParentId && x.Id != input.Id).FirstAsync();
// if (et != null)
// {
// throw Oops.Bah("当前分提单号已存在,请勿重复录入!");
// }
//}
//input.HBLNO请求参数的分单号不为空
if (!string.IsNullOrWhiteSpace(input.HBLNO))
{
//查询表中是否有当前输入的分单号
if (input.ParentId > 0) //分单
{
var et = await _rep.AsQueryable().Filter(null, true).Where(x => x.IsDeleted == false && x.HBLNO == input.HBLNO && x.TenantId == UserManager.TENANT_ID && x.Id != input.Id && x.Id != input.ParentId).FirstAsync();
if (et != null)
{
throw Oops.Bah("当前分提单号已存在,请勿重复录入!");
}
}
else //主单
{
var et = await _rep.AsQueryable().Filter(null, true).Where(x => x.IsDeleted == false && x.HBLNO == input.HBLNO && x.TenantId == UserManager.TENANT_ID && x.Id != input.Id && x.ParentId != input.Id).FirstAsync();
if (et != null)
{
throw Oops.Bah("当前分提单号已存在,请勿重复录入!");
}
}
}
//陈冠宇提订舱编号不允许重复
if (!string.IsNullOrWhiteSpace(input.CUSTNO))
{
var et = await _rep.AsQueryable().Filter(null, true).Where(x => x.IsDeleted == false && x.CUSTNO == input.CUSTNO && x.TenantId == UserManager.TENANT_ID && x.ParentId == 0 && x.Id != input.Id).FirstAsync();
if (et != null)
{
throw Oops.Bah("当前订舱编号已存在,请勿重复录入!");
}
}
//孙晓飞提PONO不允许重复
if (!string.IsNullOrWhiteSpace(input.PONO))
{
var et = await _rep.AsQueryable().Filter(null, true).Where(x => x.IsDeleted == false && x.PONO == input.PONO && x.TenantId == UserManager.TENANT_ID && x.ParentId == 0 && x.Id != input.Id).FirstAsync();
if (et != null)
{
throw Oops.Bah("当前PONO已存在,请勿重复录入!");
}
}
//版本号避免多人同时操作数据错乱
//if (!string.IsNullOrWhiteSpace(input.VERSION) && input.Id != 0)
//{
// var et = await _rep.AsQueryable().Filter(null, true).Where(x => x.IsDeleted == false && x.VERSION == input.VERSION && x.Id == input.Id).FirstAsync();
// if (et == null)
// {
// throw Oops.Bah("当前版本号不一致,请刷新后在保存单据");
// }
//}
if (App.Configuration["RunType"] is CommonConst.RUN_TYPE_CUST or CommonConst.RUN_TYPE_DJY)
{
//2023年10月13日,衣国豪:箱号/封号不允许重复
//注意:封号只有两种允许重复,000000和W(框架箱没有封号,这两个封号是框架箱的通用封号)
if (input.ctnInputs != null && input.ctnInputs.Count > 0)
{
var repeatCntrNO = input.ctnInputs.Where(x => !string.IsNullOrEmpty(x.CNTRNO))
.GroupBy(x => x.CNTRNO).Select(x => new { x.Key, c = x.Count() }).Where(x => x.c > 1).ToList();
if (repeatCntrNO.Count > 0)
{
throw Oops.Bah($"箱号重复:{string.Join("、", repeatCntrNO.Select(x => x.Key))}");
}
var repeatSealNO = input.ctnInputs.Where(x => !string.IsNullOrEmpty(x.SEALNO) && x.SEALNO != "000000" && x.SEALNO != "W")
.GroupBy(x => x.SEALNO).Select(x => new { x.Key, c = x.Count() }).Where(x => x.c > 1).ToList();
if (repeatSealNO.Count > 0)
{
throw Oops.Bah($"封号重复:{string.Join("、", repeatSealNO.Select(x => x.Key))}");
}
}
}
if (!string.IsNullOrEmpty(reqId))
{
_logger.LogWarning($"保存请求[{reqId}],校验完成");
}
var entity = input.Adapt();
if (!string.IsNullOrEmpty(reqId))
{
_logger.LogWarning($"保存请求[{reqId}],转为实体对象完成");
}
//判断是否订阅运踪目的港起运港标识
if (!string.IsNullOrEmpty(entity.MBLNO))
{
entity.IsBookingYZ = "1";
//if (!string.IsNullOrEmpty(entity.CARRIERID) && !string.IsNullOrEmpty(entity.YARDID))
//{
// entity.IsBookingYZ = "3";
//}
//if (!string.IsNullOrEmpty(entity.CARRIERID) && string.IsNullOrEmpty(entity.YARDID))
//{
// entity.IsBookingYZ = "2";
//}
//if (string.IsNullOrEmpty(entity.CARRIERID) && !string.IsNullOrEmpty(entity.YARDID))
//{
// entity.IsBookingYZ = "1";
//}
}
else
{
entity.IsBookingYZ = "0";
}
// 【引入舱位】:判断订舱是否引入过舱位数据,以及余量是否充足
if (input.Slots?.Any() == true)
{
var checkResult = await bookingSlotService.CheckImportSlots(input.Slots, input.Id);
// 如果该票订舱引入过舱位,则清空后续input.Slots,不再执行舱位引入的逻辑
if (checkResult.isExists)
{
input.Slots.Clear();
}
else
{
// 如果该票订舱没有引入过舱位,判断余量是否充足
if (!checkResult.isEnough)
{
throw Oops.Bah(checkResult.message);
}
}
}
if (input.Id == 0)
{
if (string.IsNullOrEmpty(entity.VOYNO))
{
entity.VOYNO = entity.VOYNOINNER;
}
//存在船名航次引入船期数据
if (!string.IsNullOrEmpty(input.VESSEL) && !string.IsNullOrEmpty(input.VOYNO) && !string.IsNullOrEmpty(input.CARRIERID))
{
var vesselInfo = await _vesselInfo.AsQueryable()
.Where(x => x.Vessel == input.VESSEL && x.Voyno == input.VOYNO && x.CARRIERID == input.CARRIERID && x.ATD != null)
.FirstAsync();
if (vesselInfo != null)
{
entity.StartETA = vesselInfo.ETA;
entity.ATD = vesselInfo.ATD;
entity.YgtETD = vesselInfo.YgtETD;
if (!string.IsNullOrEmpty(reqId))
{
_logger.LogWarning($"保存请求[{reqId}],引用船期数据完成");
}
}
}
entity.VERSION = Guid.NewGuid().ToString();
entity.BOOKINGNO = Yitter.IdGenerator.YitIdHelper.NextId().ToString();
entity.BSDATE = DateTime.Today;
entity.BSNO = null;
await _rep.InsertAsync(entity);
if (!string.IsNullOrEmpty(reqId))
{
_logger.LogWarning($"保存请求[{reqId}],新增插入完成");
}
if (input.ctnInputs != null)
{
foreach (var item in input.ctnInputs)
{
var ctnentity = item.Adapt();
ctnentity.BILLID = entity.Id;
await _repCtn.InsertAsync(ctnentity);
//这里保存有可能没有添加多品名,所有箱下没有货物信息
if (item.ctnDetailInputs != null)
{
foreach (var it in item.ctnDetailInputs)
{
var ctndetail = it.Adapt();
ctndetail.CTNID = ctnentity.Id;
await _ctndetailrep.InsertAsync(ctndetail);
}
}
}
if (!string.IsNullOrEmpty(reqId))
{
_logger.LogWarning($"保存请求[{reqId}],箱信息插入完成");
}
}
if (input.BookingEDIExt != null)
{
//写入EDI扩展
var ediExt = input.BookingEDIExt.Adapt();
ediExt.BookingId = entity.Id;
await _bookingEDIExt.InsertAsync(ediExt);
if (!string.IsNullOrEmpty(reqId))
{
_logger.LogWarning($"保存请求[{reqId}],扩展数据插入完成");
}
}
////添加booking日志
await _bookinglog.InsertAsync(new BookingLog
{
Type = "Add",
BookingId = entity.Id,
TenantId = Convert.ToInt64(UserManager.TENANT_ID),
CreatedTime = DateTime.Now,
CreatedUserId = UserManager.UserId,
CreatedUserName = UserManager.Name
});
if (!string.IsNullOrEmpty(reqId))
{
_logger.LogWarning($"保存请求[{reqId}],添加订舱日志完成");
}
if (!string.IsNullOrEmpty(entity.MBLNO) && !string.IsNullOrEmpty(entity.YARDID))
{
await _publisher.PublishAsync(new ChannelEventSource("BillTrace:Update", new { BookingId = entity.Id, TenentId = UserManager.TENANT_ID, UserId = UserManager.UserId, UserName = UserManager.Name, DjyUserId = UserManager.DjyUserId }));
if (!string.IsNullOrEmpty(reqId))
{
_logger.LogWarning($"保存请求[{reqId}],更新运踪订阅完成");
}
}
}
else
{
//把前端传递的已修改字段转换为属性名称
var lstPropName = new List
{
"CNTRTOTAL","IsBookingYZ"
};
var mlist = await _rep.AsQueryable().Filter(null, true).Where(x => x.Id == input.Id).FirstAsync();
if (!string.IsNullOrEmpty(reqId))
{
_logger.LogWarning($"保存请求[{reqId}],获取订舱数据完成");
}
//封账处理
var extend = _repextendstate.FirstOrDefault(x => x.bookingId == input.Id);
var isextendorder = await GetIsBookingLockOrder(entity, mlist);
if (extend != null && extend.IsLockBooking && !isextendorder)
{
throw Oops.Bah("当前单据已封账,不允许修改");
}
var rightlist = await _right.GetDataScopeList(MenuConst.MenuBookingOrder, true);
//除现有配置权限外 创建人本人、操作、单证、客服 具有编辑权限
if (rightlist != null && !(
mlist.OPID == UserManager.UserId.ToString() || mlist.OP == UserManager.Name.ToString() ||
mlist.DOCID == UserManager.UserId.ToString() || mlist.DOC == UserManager.Name.ToString() ||
mlist.CUSTSERVICEID == UserManager.UserId.ToString() || mlist.CUSTSERVICE == UserManager.Name.ToString() ||
UserManager.UserId == 400234750476357 ||
mlist.CreatedUserId.ToString() == UserManager.UserId.ToString() ||
rightlist.Contains((long)mlist.CreatedUserId)
))
{
throw Oops.Bah("您没有当前单据的操作权限!");
}
if (!string.IsNullOrEmpty(reqId))
{
_logger.LogWarning($"保存请求[{reqId}],修改权限校验完成");
}
if (string.IsNullOrEmpty(entity.VOYNO))
{
entity.VOYNO = entity.VOYNOINNER;
}
entity.VERSION = Guid.NewGuid().ToString();
//判断如果船名航次船公司变动 同步更新船期字段
if (entity.CARRIERID != mlist.CARRIERID || entity.VOYNO != mlist.VOYNO || entity.VESSEL != mlist.VESSEL)
{
var vess = await _vesselInfo.AsQueryable().Filter(null, true).Where(x => x.IsDeleted == false && x.TenantId == UserManager.TENANT_ID && x.CARRIERID == entity.CARRIERID &&
x.Vessel == entity.VESSEL && x.Voyno == entity.VOYNO).FirstAsync();
if (vess != null)
{
entity.StartETA = vess.ETA;
entity.ATD = vess.ATD;
entity.YgtETD = vess.YgtETD;
}
else
{
entity.StartETA = null;
entity.ATD = null;
entity.YgtETD = null;
}
lstPropName.AddRange(new string[] {
nameof(BookingOrder.StartETA),
nameof(BookingOrder.ATD),
nameof(BookingOrder.YgtETD)
});
if (!string.IsNullOrEmpty(reqId))
{
_logger.LogWarning($"保存请求[{reqId}],拉取船期ETD、ATD等内容完成");
}
}
if (input.ChangedFields != null && input.ChangedFields.Count > 0)
{
var propsOrder = typeof(BookingOrder).GetProperties();
input.ChangedFields.ForEach(x =>
{
var pchg = propsOrder.FirstOrDefault(p => p.Name.ToLower() == x.ToLower());
if (pchg != null)
{
lstPropName.Add(pchg.Name);
}
});
}
await _rep.AsUpdateable(entity).UpdateColumns(lstPropName.ToArray()).ExecuteCommandAsync();
//await _rep.AsUpdateable(entity).IgnoreColumns(it => new
//{
// it.ParentId,
// it.BSDATE,
// it.BSNO,
// it.TenantId,
// it.CreatedTime,
// it.CreatedUserId,
// it.CreatedUserName,
// it.TenantName,
// it.IsDeleted,
// it.BOOKINGNO,
// it.BSSTATUSNAME,
// //it.YgtETD,
// it.LstShipOrderCompareId,
// it.LstShipOrderCompareDate,
// it.LstShipOrderCompareRlt,
// it.LstShipOrderCompareRltName,
// it.LstDraftCompareDate,
// it.LstDraftCompareRlt,
// //it.ATD,
// it.ETA,
// //it.StartETA,
// it.StartATA,
// it.MiddleETA,
// it.MiddleETD,
// it.MiddleATA,
// it.MiddleATD,
// it.ATA
//}).ExecuteCommandAsync();
if (!string.IsNullOrEmpty(reqId))
{
_logger.LogWarning($"保存请求[{reqId}],数据库更新数据完成");
}
var ctnlist = await _repCtn.AsQueryable().Filter(null, true).Where(x => x.BILLID == input.Id && x.IsDeleted == false).ToListAsync();
//删除箱信息 重新插入
await _repCtn.DeleteAsync(x => x.BILLID == input.Id);
await _ctndetailrep.DeleteAsync(x => ctnlist.Select(x => x.Id).Contains((long)x.CTNID));
if (!string.IsNullOrEmpty(reqId))
{
_logger.LogWarning($"保存请求[{reqId}],删除箱信息及多品名完成");
}
if (input.ctnInputs != null)
{
foreach (var item in input.ctnInputs)
{
var ctnentity = item.Adapt();
//封账处理
var oldctn = ctnlist.Where(x => x.CNTRNO == item.CNTRNO).FirstOrDefault();
if (oldctn != null)
{
var isextendctn = await GetIsBookingLockCtn(ctnentity, oldctn);
if (extend != null && extend.IsLockBooking && !isextendorder)
{
throw Oops.Bah("当前单据已封账,不允许修改箱信息");
}
}
ctnentity.BILLID = entity.Id;
await _repCtn.InsertAsync(ctnentity);
if (item.ctnDetailInputs != null)
{
foreach (var it in item.ctnDetailInputs)
{
var ctndetail = it.Adapt();
ctndetail.CTNID = ctnentity.Id;
await _ctndetailrep.InsertAsync(ctndetail);
}
}
}
if (!string.IsNullOrEmpty(reqId))
{
_logger.LogWarning($"保存请求[{reqId}],重新插入箱信息和多品名完成");
}
}
if (input.BookingEDIExt != null)
{
//检索EDI扩展
var ediExt = _bookingEDIExt.AsQueryable().Filter(null, true).First(u => u.BookingId == input.Id);
if (ediExt == null)
{
//写入EDI扩展
ediExt = input.BookingEDIExt.Adapt();
ediExt.BookingId = entity.Id;
await _bookingEDIExt.InsertAsync(ediExt);
}
else
{
//更新EDI扩展
var currEdiExtEntity = input.BookingEDIExt.Adapt();
currEdiExtEntity.Id = ediExt.Id;
currEdiExtEntity.BookingId = ediExt.BookingId;
await _bookingEDIExt.AsUpdateable(currEdiExtEntity).IgnoreColumns(it => new
{
it.BookingId,
it.TenantId,
it.CreatedTime,
it.CreatedUserId,
it.CreatedUserName
}).ExecuteCommandAsync();
}
if (!string.IsNullOrEmpty(reqId))
{
_logger.LogWarning($"保存请求[{reqId}],拓展数据更新完成");
}
}
//记录日志
await SaveLog(entity, mlist, "保存", lstPropName);
if (!string.IsNullOrEmpty(entity.MBLNO) && !string.IsNullOrEmpty(entity.YARDID) && (entity.MBLNO != mlist.MBLNO || entity.YARDID != mlist.YARDID || entity.CARRIERID != mlist.CARRIERID))
{
_logger.LogInformation($"数据有变化,更新运踪订阅");
//更改提单号重新订阅运踪
await _publisher.PublishAsync(new ChannelEventSource("BillTrace:Update", new { BookingId = entity.Id, TenentId = UserManager.TENANT_ID, UserId = UserManager.UserId, UserName = UserManager.Name, DjyUserId = UserManager.DjyUserId }));
if (!string.IsNullOrEmpty(reqId))
{
_logger.LogWarning($"保存请求[{reqId}],更新运踪完成");
}
}
else if (string.IsNullOrEmpty(entity.MBLNO) && !string.IsNullOrEmpty(mlist.MBLNO) && mlist.IsBookingYZ != "0")
{
// 在已经订阅运踪的情况下,如果操作员删除提单号,则取消订阅运踪
await UnsubscribeBillTrace(new List(1)
{
new BillTraceUnsubscribeList(mlist.Id.ToString(), mlist.MBLNO)
});
if (!string.IsNullOrEmpty(reqId))
{
_logger.LogWarning($"保存请求[{reqId}],退订运踪完成");
}
}
}
if (!string.IsNullOrEmpty(reqId))
{
_logger.LogWarning($"保存请求[{reqId}],{(input.Id == 0 ? "新增" : "更新")}数据完成");
}
// 【引入舱位】:保存引用信息
if (input.Slots?.Any() == true)
{
await bookingSlotService.ImportSlots(input.Slots, entity.Id, false);
}
var Id = entity.Id;
BookingOrderOutput ordOut = new BookingOrderOutput();
var main = await _rep.FirstOrDefaultAsync(u => u.Id == Id);
if (!string.IsNullOrEmpty(entity.MBLNO) || !string.IsNullOrEmpty(entity.CUSTNO))
{
#region 插入货运动态
if (!string.IsNullOrEmpty(entity.CUSTNO))
{
await SetGoodsStatus("YDC", Id);
}
if (!string.IsNullOrEmpty(entity.MBLNO))
{
await SetGoodsStatus("YSDBC", Id);
}
#endregion
}
if (string.IsNullOrEmpty(entity.MBLNO) || string.IsNullOrEmpty(entity.CUSTNO))
{
#region 取消货运动态
//配置中所有的货物状态
var config = _goodsStatusConfig.AsQueryable().Filter(null, true).Where(config => config.CreatedUserId == main.CreatedUserId).ToList();
if (string.IsNullOrEmpty(entity.CUSTNO))
{
if (App.Configuration["ServiceStatusOpenAuto"] == "1")
{
await SetGoodsStatusCancel("YDC", Id);
//await SetBookingOrderGoodsStatus(Id);
}
else
{
var Config = config.Where(x => x.SystemCode == "YDC").FirstOrDefault();
if (Config != null)
{
_goodsStatus.Delete(x => x.bookingId == Id && x.ConfigId == Config.Id);
//更新货物状态
await SetBookingOrderGoodsStatus(Id);
}
}
}
if (string.IsNullOrEmpty(entity.MBLNO))
{
if (App.Configuration["ServiceStatusOpenAuto"] == "1")
{
await SetGoodsStatusCancel("YSDBC", Id);
//await SetBookingOrderGoodsStatus(Id);
}
else
{
var Config = config.Where(x => x.SystemCode == "YSDBC").FirstOrDefault();
if (Config != null)
{
_goodsStatus.Delete(x => x.bookingId == Id && x.ConfigId == Config.Id);
//更新货物状态
await SetBookingOrderGoodsStatus(Id);
}
}
}
#endregion
}
if (main != null)
{
ordOut = main.Adapt();
var ctnlist = await _repCtn.AsQueryable().Where(x => x.BILLID == Id).ToListAsync();
var ctninput = ctnlist.Adapt>();
var ctnIdlist = ctnlist.Select(x => x.Id).ToList();
var ctndetaillist = await _ctndetailrep.AsQueryable().Where(x => ctnIdlist.Contains((long)x.CTNID)).ToListAsync();
foreach (var item in ctninput)
{
var _ctndetaillist = ctndetaillist.Where(x => x.CTNID == item.Id).ToList();
item.ctnDetailInputs = _ctndetaillist.Adapt>();
}
ordOut.ctnInputs = ctninput;
// 返回关联的舱位信息
var slotList = await _repSlotAllocation.AsQueryable()
.Where(a => a.BOOKING_ID == Id)
.ToListAsync(a => new BookingSlotBaseWithCtnDto
{
Id = a.BOOKING_SLOT_ID,
SLOT_BOOKING_NO = a.SLOT_BOOKING_NO
});
ordOut.Slots = slotList;
var ordUrl = _repOrderUrl.FirstOrDefault(x => x.BookingId == Id);
if (ordUrl != null)
{
ordOut.Link = new BookingOrderUrlOutput()
{
LinkUrlTxxp = ordUrl.UrlTxxp,
LinkUrlVgm = ordUrl.UrlVgm,
LinkUrlVmgSi = ordUrl.UrlVgmSi,
};
}
var extendstate = await _repextendstate.FirstOrDefaultAsync(x => x.bookingId == Id);
if (extendstate != null)
{
ordOut.ExtendState = extendstate;
//检索EDI扩展
}
}
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>();
var ctnIdlist = ctnlist.Select(x => x.Id).ToList();
var ctndetaillist = await _ctndetailrep.AsQueryable().Where(x => ctnIdlist.Contains((long)x.CTNID)).ToListAsync();
foreach (var it in ctninput)
{
var _ctndetaillist = ctndetaillist.Where(x => x.CTNID == item.Id).ToList();
it.ctnDetailInputs = _ctndetaillist.Adapt>();
}
item.ctnInputs = ctninput;
//检索EDI扩展
var ediExt = _bookingEDIExt.FirstOrDefault(u => u.BookingId == item.Id);
if (ediExt != null)
{
item.BookingEDIExt = ediExt.Adapt();
}
}
ordOut.HbList = HbList;
}
var ediExtEntity = _bookingEDIExt.FirstOrDefault(u => u.BookingId == Id);
if (ediExtEntity != null)
{
ordOut.BookingEDIExt = ediExtEntity.Adapt();
}
if (!string.IsNullOrEmpty(reqId))
{
_logger.LogWarning($"保存请求[{reqId}],从数据库拉取最新数据完成");
}
//推送东胜
await SendBookingOrder(new long[] { main.ParentId == 0 ? Id : (long)main.ParentId });
if (!string.IsNullOrEmpty(reqId))
{
_logger.LogWarning($"保存请求[{reqId}],推送东胜完成");
}
//临时文件转正式
if (input.TempFiles != null && input.TempFiles.Count > 0)
{
var optTmp = App.GetOptions();
foreach (var tmpFile in input.TempFiles)
{
var fpath = Path.Combine(App.WebHostEnvironment.WebRootPath, optTmp.Path, tmpFile.TempPathName);
if (File.Exists(fpath))
{
var fn = Path.GetFileName(tmpFile.TempPathName);
MemoryStream memStream = new MemoryStream(File.ReadAllBytes(fpath));
await AddFile(new FormFile(memStream, 0, memStream.Length, fn, fn), new BookingFileDto()
{
BookingId = Id,
TypeCode = tmpFile.TypeCode,
TypeName = tmpFile.TypeName
});
}
}
if (!string.IsNullOrEmpty(reqId))
{
_logger.LogWarning($"保存请求[{reqId}],临时文件处理完成");
}
}
// 客户订舱:运营端发送订舱数据给客户端
if (App.Configuration["RunType"] == CommonConst.RUN_TYPE_DJY)
{
CustomerBookingSyncHelper.SendCustomerBookingSync(Id, "ALL");
}
return ordOut;
}
///
/// 在订舱台账保存单证备注、操作备注等功能
///
///
///
[HttpPost("/BookingOrder/SaveDataInList")]
public async Task SaveDataInList(JObject obj)
{
if (!obj.ContainsKey("Id"))
{
throw Oops.Bah("参数有误,没有Id");
}
var id = obj.GetLongValue("Id");
var order = await _rep.AsQueryable().Filter(null, true).FirstAsync(x => x.Id == id);
if (order == null)
{
throw Oops.Bah("订舱数据不存在");
}
//判断权限,返回null表示有全部权限
List userlist = await _right.GetDataScopeList(MenuConst.MenuBookingOrder, true);
if (userlist != null && !userlist.Contains(UserManager.UserId))
{
throw Oops.Bah("无权修改");
}
var orderCompare = await _rep.AsQueryable().Filter(null, true).FirstAsync(x => x.Id == id);
var propsOrder = typeof(BookingOrder).GetProperties();
foreach (var property in obj)
{
var propNameLower = property.Key.ToLower();
var propOrd = propsOrder.FirstOrDefault(p => p.Name.ToLower() == propNameLower);
if (propOrd != null)
{
if (propOrd.PropertyType == typeof(string))
{
propOrd.SetValue(order, obj.GetStringValue(property.Key));
}
else if (propOrd.PropertyType == typeof(int) || propOrd.PropertyType == typeof(int?))
{
propOrd.SetValue(order, obj.GetIntValue(property.Key));
}
else if (propOrd.PropertyType == typeof(long) || propOrd.PropertyType == typeof(long?))
{
propOrd.SetValue(order, obj.GetLongValue(property.Key));
}
else if (propOrd.PropertyType == typeof(DateTime) || propOrd.PropertyType == typeof(DateTime?))
{
propOrd.SetValue(order, obj.GetDateTimeValue(property.Key));
}
else if (propOrd.PropertyType == typeof(bool) || propOrd.PropertyType == typeof(bool?))
{
propOrd.SetValue(order, obj.GetBooleanValue(property.Key));
}
else if (propOrd.PropertyType == typeof(decimal) || propOrd.PropertyType == typeof(decimal?))
{
propOrd.SetValue(order, obj.GetDecimalValue(property.Key));
}
}
}
JsonUtil.PropToUpper(order, "ORDNO", "BSSTATUS", "YARDID", "YardContract", "YardContractTel", "YardContractEmail", "MARKS", "DESCRIPTION", "CONSIGNEENAME", "SHIPPERNAME", "NOTIFYPARTYNAME", "DZRemark", "CZRemark");
order.VERSION = Guid.NewGuid().ToString();
await _rep.UpdateAsync(order);
//记录修改日志
await SaveLog(order, orderCompare, "保存(台账界面)");
//推送东胜
await SendBookingOrder(new long[] { order.Id });
}
///
/// 删除订舱
///
///
///
[SqlSugarUnitOfWork]
[HttpPost("/BookingOrder/Delete")]
public async Task Delete(string Ids)
{
var arr = Ids.Split(",");
if (arr.Count() > 0)
{
var url = _cache.GetAllDictData().Result.Where(x => x.Code == "bookingorder_delete").Select(x => x.Value).FirstOrDefault();
if (string.IsNullOrEmpty(url))
{
throw Oops.Bah("未获取到相关url,请联系管理员!");
}
// 要取消订阅运踪的列表
List waitUnsubscribeBilltrace = new(arr.Count());
foreach (var ar in arr)
{
long Id = Convert.ToInt64(ar);
var order = await _rep.AsQueryable().Filter(null, true).Where(x => x.IsDeleted == false && x.TenantId == UserManager.TENANT_ID && x.Id == Id).FirstAsync();
if (order == null)
{
continue;
}
var mblno = order.MBLNO;
// 将待删除的订舱单id存放到Cache中。目的:使用SendBookingOrder()推送订舱单数据前通过Cache判断是否正在走删除逻辑,来决定是否推送(如果是正在处理删除逻辑的数据,则不推送)
string deletingCacheKey = $"DeletingBookingOrderId_{ar}";
await _cache.SetTimeoutAsync(deletingCacheKey, null, TimeSpan.FromMinutes(1));
_logger.LogInformation("设置待删除的订舱单id到Cache中,key:" + deletingCacheKey);
BookingOrderDelete bookingOrderDelete = new BookingOrderDelete();
List deletelist = new List();
deletelist.Add(new BookingOrderDeleteDetail
{
Id = Id,
MBLNO = mblno
});
bookingOrderDelete.Delete = deletelist;
var stn = await url.SetBody(bookingOrderDelete).PostAsStringAsync();
var jobj = stn.ToJObject();
_logger.LogInformation(mblno + "删除单据:" + jobj);
if (jobj.GetIntValue("Code") == 200)
{
JObject data = jobj.GetValue("Data") as JObject;
JArray NoDeleted = data.GetValue("NoDeleted") as JArray;
var deleteTime = DateTime.Now;
if (NoDeleted == null || NoDeleted.Count() == 0)
{
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 });
await _rep.UpdateAsync(x => x.Id == Id, x => new BookingOrder { IsDeleted = true, DeleteTime = deleteTime });
await _bookingEDIExt.UpdateAsync(x => x.BookingId == Id && x.IsDeleted == false, x => new BookingEDIExt { IsDeleted = true });
_logger.LogInformation(mblno + "删除成功!");
// 取消订阅运踪
waitUnsubscribeBilltrace.Add(new BillTraceUnsubscribeList(Id.ToString(), mblno));
// 记录日志
var newOrder = order.Adapt();
newOrder.IsDeleted = true;
newOrder.DeleteTime = deleteTime;
await SaveLog(newOrder, order, "删除");
}
else
{
var re = NoDeleted[0] as JObject;
if (re.GetIntValue("Code") == 201)
{
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 });
await _rep.UpdateAsync(x => x.Id == Id, x => new BookingOrder { IsDeleted = true, DeleteTime = deleteTime });
await _bookingEDIExt.UpdateAsync(x => x.BookingId == Id && x.IsDeleted == false, x => new BookingEDIExt { IsDeleted = true });
_logger.LogInformation(mblno + "删除成功!");
// 取消订阅运踪
waitUnsubscribeBilltrace.Add(new BillTraceUnsubscribeList(Id.ToString(), mblno));
// 记录日志
var newOrder = order.Adapt();
newOrder.IsDeleted = true;
newOrder.DeleteTime = deleteTime;
await SaveLog(newOrder, order, "删除");
}
else
{
await _cache.DelAsync(deletingCacheKey);
_logger.LogInformation("从Cache中移除待删除的订舱单id,key:" + deletingCacheKey);
string result = re.GetStringValue("Result");
throw Oops.Bah(result);
}
}
}
else
{
await _cache.DelAsync(deletingCacheKey);
_logger.LogInformation("从Cache中移除待删除的订舱单id,key:" + deletingCacheKey);
throw Oops.Bah(mblno + "删除单据失败");
}
await _cache.DelAsync(deletingCacheKey);
_logger.LogInformation("从Cache中移除待删除的订舱单id,key:" + deletingCacheKey);
}
// 取消订阅运踪
if (waitUnsubscribeBilltrace.Count > 0)
{
await UnsubscribeBillTrace(waitUnsubscribeBilltrace);
}
#region 消息队列推送删除信息
//var itemcode = _cache.GetAllTenantParam().Result.Where(x => x.ParaCode == "BOOKING_DATA_PUSH" && x.TenantId == UserManager.TENANT_ID).Select(x => x.ItemCode).FirstOrDefault();
//if (!string.IsNullOrEmpty(itemcode))
//{
// if (itemcode == "true")
// try
// {
// const string MqActionExchangeName = "djy.output.dingcang.ds6";
// const string MqActionQueueName = "djy.output.dingcang.ds6_delete";
// ConnectionFactory factory = new ConnectionFactory();
// factory.Uri = new Uri(_cache.GetAllDictData().Result.Where(x => x.Code == "BookingOrderMQUri").Select(x => x.Value).FirstOrDefault());
// using (IConnection conn = factory.CreateConnection())
// {
// IModel mqModel = conn.CreateModel();
// mqModel.ExchangeDeclare(MqActionExchangeName, ExchangeType.Direct);
// var queueName = $"{MqActionQueueName}.{UserManager.TENANT_ID}";
// mqModel.QueueDeclare(queueName, false, false, false, null);
// mqModel.QueueBind(queueName, MqActionExchangeName, queueName, null);
// byte[] messageBodyBytes = Encoding.UTF8.GetBytes(Ids);
// IBasicProperties props = mqModel.CreateBasicProperties();
// props.DeliveryMode = 2;
// mqModel.BasicPublish(MqActionExchangeName,
// queueName, props,
// messageBodyBytes);
// conn.Close();
// _logger.LogInformation($"订舱数据删除回推,已发送数据到消息队列【{_cache.GetAllDictData().Result.Where(x => x.Code == "BookingOrderMQUri").Select(x => x.Value).FirstOrDefault()}】,数据内容:【{Ids}】");
// }
// }
// catch (Exception ex)
// {
// _logger.LogError(ex.Message);
// _logger.LogError(ex.StackTrace);
// }
//}
#endregion
}
else
{
throw Oops.Bah("请上传正确参数");
}
}
///
/// 恢复删除
///
///
///
[SqlSugarUnitOfWork]
[HttpPost("/BookingOrder/RecoverDelete")]
public async Task RecoverDelete(string Ids)
{
var arr = Ids.Split(",");
if (arr.Count() > 0)
{
foreach (var ar in arr)
{
long Id = Convert.ToInt64(ar);
var order = _rep.AsQueryable().Filter(null, true).Where(x => x.Id == Id).First();
if (!string.IsNullOrEmpty(order.MBLNO))
{
var et = await _rep.AsQueryable().Filter(null, true).Where(x => x.MBLNO == order.MBLNO && x.IsDeleted == false && x.TenantId == UserManager.TENANT_ID && x.ParentId == 0 && x.Id != Id).FirstAsync();
if (et != null)
{
throw Oops.Bah("当前主提单号已存在,无法恢复!");
}
}
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 = false });
await _ctndetailrep.UpdateAsync(x => ctnlist.Contains((long)x.CTNID), x => new BookingCtnDetail { IsDeleted = false });
await _rep.UpdateAsync(x => x.Id == Id, x => new BookingOrder { IsDeleted = false });
await _bookingEDIExt.UpdateAsync(x => x.BookingId == Id && x.IsDeleted == true, x => new BookingEDIExt { IsDeleted = false });
await SendBookingOrder(new long[] { Id });
// 记录日志
var newOrder = order.Adapt();
newOrder.IsDeleted = false;
await SaveLog(newOrder, order, "删除数据还原");
_logger.LogInformation(Id + "恢复删除成功!");
}
//try
//{
// SendBookingOrder(Id);
// const string MqActionExchangeName = "djy.output.dingcang.ds6";
// const string MqActionQueueName = "djy.output.dingcang.ds6_recoverdelete";
// ConnectionFactory factory = new ConnectionFactory();
// factory.Uri = new Uri(_cache.GetAllDictData().Result.Where(x => x.Code == "BookingOrderMQUri").Select(x => x.Value).FirstOrDefault());
// using (IConnection conn = factory.CreateConnection())
// {
// IModel mqModel = conn.CreateModel();
// mqModel.ExchangeDeclare(MqActionExchangeName, ExchangeType.Direct);
// var queueName = $"{MqActionQueueName}.{UserManager.TENANT_ID}";
// mqModel.QueueDeclare(queueName, false, false, false, null);
// mqModel.QueueBind(queueName, MqActionExchangeName, queueName, null);
// byte[] messageBodyBytes = Encoding.UTF8.GetBytes(Ids);
// IBasicProperties props = mqModel.CreateBasicProperties();
// props.DeliveryMode = 2;
// mqModel.BasicPublish(MqActionExchangeName,
// queueName, props,
// messageBodyBytes);
// conn.Close();
// _logger.LogInformation($"订舱数据删除恢复回推,已发送数据到消息队列【{_cache.GetAllDictData().Result.Where(x => x.Code == "BookingOrderMQUri").Select(x => x.Value).FirstOrDefault()}】,数据内容:【{Ids}】");
// }
//}
//catch (Exception ex)
//{
// _logger.LogError(ex.Message);
// _logger.LogError(ex.StackTrace);
//}
}
else
{
throw Oops.Bah("请上传正确参数");
}
}
///
/// 获取订舱明细
///
///
///
[HttpGet("/BookingOrder/Get")]
public async Task Get(long Id)
{
BookingOrderOutput ordOut = new BookingOrderOutput();
var main = await _rep.FirstOrDefaultAsync(u => u.Id == Id);
if (main != null)
{
ordOut = main.Adapt();
List ctnDtoList = await GetBookingCtnDtoList(Id);
ordOut.ctnInputs = ctnDtoList;
// 返回关联的舱位信息
var slotList = await _repSlotAllocation.AsQueryable()
.Where(a => a.BOOKING_ID == Id)
.ToListAsync(a => new BookingSlotBaseWithCtnDto
{
Id = a.BOOKING_SLOT_ID,
SLOT_BOOKING_NO = a.SLOT_BOOKING_NO
});
ordOut.Slots = slotList;
var ordUrl = _repOrderUrl.FirstOrDefault(x => x.BookingId == Id);
if (ordUrl != null)
{
ordOut.Link = new BookingOrderUrlOutput()
{
LinkUrlTxxp = ordUrl.UrlTxxp,
LinkUrlVgm = ordUrl.UrlVgm,
LinkUrlVmgSi = ordUrl.UrlVgmSi,
};
}
var extendstate = await _repextendstate.FirstOrDefaultAsync(x => x.bookingId == Id);
if (extendstate != null)
{
ordOut.ExtendState = extendstate;
//检索EDI扩展
}
}
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)
{
List ctnDtoList = await GetBookingCtnDtoList(item.Id);
item.ctnInputs = ctnDtoList;
//检索EDI扩展
var ediExt = _bookingEDIExt.FirstOrDefault(u => u.BookingId == item.Id);
if (ediExt != null)
{
item.BookingEDIExt = ediExt.Adapt();
}
}
ordOut.HbList = HbList;
}
//检索EDI扩展
var ediExtEntity = _bookingEDIExt.FirstOrDefault(u => u.BookingId == Id);
if (ediExtEntity != null)
{
ordOut.BookingEDIExt = ediExtEntity.Adapt();
}
return ordOut;
}
///
/// 根据订舱记录主键获取箱信息Dto列表
///
/// 订舱记录主键
/// 箱信息Dto列表
[HttpGet("/BookingOrder/GetCtnList")]
public async Task> GetBookingCtnDtoList(long orderId)
{
var ctnlist = await _repCtn.AsQueryable().Where(x => x.BILLID == orderId).ToListAsync();
var ctnDtoList = ctnlist.Adapt>();
var ctnIdlist = ctnlist.Select(x => x.Id).ToList();
var ctnDetaiList = await _ctndetailrep.AsQueryable().Where(x => ctnIdlist.Contains((long)x.CTNID)).ToListAsync();
foreach (var item in ctnDtoList)
{
var _ctndetaillist = ctnDetaiList.Where(x => x.CTNID == item.Id).ToList();
item.ctnDetailInputs = _ctndetaillist.Adapt>();
}
return ctnDtoList;
}
///
/// 修改订舱台账前,验证箱信息的件尺重、封号是否会被覆盖
///
/// true:会被覆盖;false:不会被覆盖
[HttpPost("/BookingOrder/CheckCtnCover")]
public async Task CheckCtnCover(CheckCtnCoverDto checkCtnDto)
{
// 如果保存时没有箱信息,则不认为会被覆盖
if (checkCtnDto.CtnInputs?.Any() != true)
{
return false;
}
List ctnDtoList = await GetBookingCtnDtoList(checkCtnDto.BookingOrderId);
// 如果之前没有箱信息,则不认为会被覆盖
if (ctnDtoList?.Any() != true)
{
return false;
}
var oldIdList = ctnDtoList.Select(c => c.Id);
var newIdList = checkCtnDto.CtnInputs.Select(c => c.Id);
var existsIdList = oldIdList.Intersect(newIdList);
var existsCtnList = ctnDtoList.Where(c => existsIdList.Contains(c.Id));
foreach (var oldCtn in existsCtnList)
{
var newCtn = checkCtnDto.CtnInputs.First(c => c.Id == oldCtn.Id);
if (
(!string.IsNullOrWhiteSpace(oldCtn.SEALNO) && string.IsNullOrWhiteSpace(newCtn.SEALNO))
|| (!string.IsNullOrWhiteSpace(oldCtn.CNTRNO) && string.IsNullOrWhiteSpace(newCtn.CNTRNO))
|| (oldCtn.PKGS != 0 && newCtn.PKGS == 0)
|| (oldCtn.KGS != 0 && newCtn.KGS == 0)
|| (oldCtn.CBM != 0 && newCtn.CBM == 0)
)
{
return true;
}
}
return false;
}
#endregion
#region 批量编辑相关
///
/// 批量编辑
///
///
[HttpPost("/BookingOrder/BachUpdate")]
public async Task BachUpdate(BatchUpdate dto)
{
if (dto == null || dto.Id.Count == 0)
{
throw Oops.Bah("未提交数据");
}
string version = Guid.NewGuid().ToString();
// 记录日志
var oldOrderList = await _rep.AsQueryable().Filter(null, true).Where(x => dto.Id.Contains(x.Id)).ToListAsync();
foreach (long item in dto.Id)
{
var oldOrder = oldOrderList.FirstOrDefault(x => x.Id == item);
if (oldOrder == null)
{
continue;
}
var newOrder = oldOrder.Adapt();
newOrder.VERSION = version;
newOrder.VESSEL = dto.VESSEL;
newOrder.VOYNOINNER = dto.VOYNOINNER;
newOrder.ETD = dto.ETD;
newOrder.VOYNO = dto.VOYNO;
newOrder.PORTDISCHARGEID = dto.PORTDISCHARGEID;
newOrder.PORTDISCHARGE = dto.PORTDISCHARGE;
newOrder.DESTINATIONID = dto.DESTINATIONID;
newOrder.DESTINATION = dto.DESTINATION;
newOrder.CLOSINGDATE = dto.CLOSINGDATE;
newOrder.CLOSEDOCDATE = dto.CLOSEDOCDATE;
await SaveLog(newOrder, oldOrder, "批量编辑台账");
}
await _rep.UpdateAsync(x => dto.Id.Contains(x.Id), x => new BookingOrder
{
VERSION = version,
VESSEL = dto.VESSEL,
VOYNOINNER = dto.VOYNOINNER,
ETD = dto.ETD,
VOYNO = dto.VOYNO,
PORTDISCHARGEID = dto.PORTDISCHARGEID,
PORTDISCHARGE = dto.PORTDISCHARGE,
DESTINATIONID = dto.DESTINATIONID,
DESTINATION = dto.DESTINATION,
CLOSINGDATE = dto.CLOSINGDATE,
CLOSEDOCDATE = dto.CLOSEDOCDATE
});
await SendBookingOrder(dto.Id.ToArray());
}
///
/// 批量修改船代
///
///
[HttpPost("/BookingOrder/BachUpdateShipagency")]
public async Task BachUpdateShipagency(BatchUpdateShipagency dto)
{
if (dto == null || dto.Id.Count == 0)
{
throw Oops.Bah("未提交数据");
}
// 记录日志
var oldOrderList = await _rep.AsQueryable().Filter(null, true).Where(x => dto.Id.Contains(x.Id)).ToListAsync();
foreach (var item in dto.Id)
{
var oldOrder = oldOrderList.FirstOrDefault(x => x.Id == item);
if (oldOrder == null)
{
continue;
}
var newOrder = oldOrder.Adapt();
newOrder.SHIPAGENCY = dto.Shipagency;
newOrder.SHIPAGENCYID = dto.ShipagencyId;
await SaveLog(newOrder, oldOrder, "批量编辑船代");
}
await _rep.UpdateAsync(x => dto.Id.Contains(x.Id), x => new BookingOrder
{
SHIPAGENCY = dto.Shipagency,
SHIPAGENCYID = dto.ShipagencyId
});
await SendBookingOrder(dto.Id.ToArray());
}
#endregion
#region 日志、备注、附件、货运动态、服务项目、货物状态 等
///
/// 获取日志明细
///
///
///
[HttpGet("/BookingOrder/GetLog")]
public async Task> GetLog(long Id)
{
List list = new List();
var main = await _bookinglog.AsQueryable().Where(u => u.BookingId == Id).ToListAsync();
list = main.Adapt>();
if (list != null)
{
foreach (var item in list)
{
var details = await _bookinglogdetail.AsQueryable().Where(x => x.PId == item.Id).ToListAsync();
item.details = details;
}
}
return list;
}
///
/// 获取备注
///
///
///
[HttpGet("/BookingOrder/GetRemark")]
public async Task> GetRemark(long Id)
{
var list = await _bookingremark.AsQueryable().Where(u => u.PId == Id).ToListAsync();
return list;
}
///
/// 增加备注
///
///
///
[SqlSugarUnitOfWork]
[HttpPost("/BookingOrder/AddRemark")]
public async Task AddRemark(BookingRemarkDto dto)
{
if (dto.Id == 0)
{
var entity = dto.Adapt();
entity.UpdatedUserId = UserManager.UserId;
entity.UpdatedUserName = UserManager.Name;
await _bookingremark.InsertAsync(entity);
}
else
{
var entity = _bookingremark.FirstOrDefault(x => x.Id == dto.Id);
entity.Remark = dto.Remark;
await _bookingremark.AsUpdateable(entity).IgnoreColumns(it => new
{
it.TenantId,
it.CreatedTime,
it.CreatedUserId,
it.CreatedUserName
}).ExecuteCommandAsync();
}
}
///
/// 删除备注
///
///
///
[SqlSugarUnitOfWork]
[HttpPost("/BookingOrder/DeleteRemark")]
public async Task DeleteRemark(long Id)
{
await _bookingremark.DeleteAsync(x => x.Id == Id);
}
///
/// 增加订舱附件
///
///
/// 注意,如果是新建单据,BookingId传0
///
[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(); // 文件后缀
if (!opt.fileType.Contains(fileSuffix))
{
throw Oops.Bah(BookingErrorCode.BOOK114);
}
var dirAbs = string.Empty;
var fileRelaPath = string.Empty;
var fileAbsPath = string.Empty;
//2023年8月9日,增加无bookingId时可上传附件功能(放在临时目录)
if (dto.BookingId == 0)
{
var optTmp = App.GetOptions();
dirAbs = Path.Combine(App.WebHostEnvironment.WebRootPath, optTmp.Path);
var tmpPath = YitIdHelper.NextId().ToString();
fileRelaPath = Path.Combine(tmpPath, originalFilename).ToLower();
dirAbs = Path.Combine(dirAbs, tmpPath);
if (!Directory.Exists(dirAbs))
Directory.CreateDirectory(dirAbs);
fileAbsPath = Path.Combine(dirAbs, originalFilename).ToLower();
}
else
{
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();
fileRelaPath = Path.Combine(opt.relativePath, fileSaveName).ToLower();
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);
}
return fileRelaPath;
}
///
/// 获取附件
///
/// 订舱ID
///
[HttpGet("/BookingOrder/GetFile")]
public async Task> GetFile(long Id)
{
var list = await _bookingfile.AsQueryable().Filter(null, true).Where(u => u.BookingId == Id).ToListAsync();
return list;
}
///
/// 获取货运动态
///
[HttpGet("/BookingOrder/GetStatusLog")]
public async Task> GetBookingStatusLog(long Id)
{
var statuslog = await _repStatuslog.AsQueryable().Filter(null, true).Where(x => x.BookingId == Id).OrderByDescending(x => x.OpTime).ToListAsync();
var dto = statuslog.Adapt>();
foreach (var item in dto)
{
var detail = await _statuslogdetail.AsQueryable().Where(x => x.PId == item.Id).ToListAsync();
item.detail = detail.Adapt>();
}
return dto;
}
///
/// 获取订舱动态
///
[HttpGet("/BookingOrder/GetStatus")]
public async Task> GetBookingStatus(long Id)
{
var dto = await _repBookingStatus.AsQueryable().Where(x => x.BookingId == Id).ToListAsync();
return dto;
}
///
/// 保存服务项目
///
///
///
[HttpPost("/BookingOrder/SaveServiceItem")]
[SqlSugarUnitOfWork]
public async Task SaveServiceItem(BookingServiceItemList input)
{
if (input.BookingId == null || input.BookingId == 0)
{
throw Oops.Bah("未传入业务id");
}
await _serviceItem.DeleteAsync(x => x.BookingId == input.BookingId);
foreach (var item in input.item)
{
await _serviceItem.InsertAsync(
new BookingServiceItem
{
BookingId = input.BookingId,
Code = item.Code,
Value = item.Value
});
}
}
///
/// 获取服务项目
///
///
///
[HttpGet("/BookingOrder/GetServiceItemList")]
public async Task GetServiceItemList(long bookingId)
{
return await _serviceItem.AsQueryable().Where(x => x.BookingId == bookingId).ToListAsync();
}
///
/// 增加货物状态
///
///
///
[SqlSugarUnitOfWork]
[HttpPost("/BookingOrder/SaveGoodsStatus")]
public async Task SaveGoodsStatus(GoodsStatusDtoList input)
{
if (input.BookingId == null || input.BookingId == 0)
{
throw Oops.Bah("未传入业务id");
}
await _goodsStatus.DeleteAsync(x => x.bookingId == input.BookingId);
foreach (var item in input.item)
{
var entity = item.Adapt();
entity.bookingId = input.BookingId;
if (item.FinishTime.HasValue) //2023年5月25日,王书岚:可以只填写申请箱使天数,但是没有完成申请箱使
{
entity.FinishUser = UserManager.Name;
entity.FinishTime = item.FinishTime;
entity.FinishUserId = UserManager.UserId;
}
await _goodsStatus.InsertAsync(entity);
}
//更新货物状态
await SetBookingOrderGoodsStatus((long)input.BookingId);
_logger.LogInformation("货物状态直推东胜:");
//推送东胜
await SendBookingOrder(new long[] { Convert.ToInt64(input.BookingId) });
var order = _rep.Where(x => x.Id == input.BookingId).First();
var userid = order.CreatedUserId;
if (userid != null)
{
//获取当前用户已经录入的货物状态
var list = await _goodsStatus.AsQueryable().LeftJoin(_goodsStatusConfig.AsQueryable(),
(goods, config) => config.Id == goods.ConfigId).Where((goods, config) => config.CreatedUserId == userid && goods.bookingId == input.BookingId).
OrderBy((goods, config) => config.Sort).
Select((goods, config) => new GoodsStatusQuery
{
ConfigId = config.Id,
SystemCode = config.SystemCode,
StatusName = config.StatusName,
FinishTime = goods.FinishTime,
FinishUser = goods.FinishUser,
FinishUserId = goods.FinishUserId,
IsPublic = goods.IsPublic,
ExtData = goods.ExtData,
Remark = goods.Remark,
Sort = config.Sort
}).ToListAsync();
//配置中所有的货物状态
var config = _goodsStatusConfig.AsQueryable().Where(config => config.CreatedUserId == userid).ToList().DistinctBy(x => x.StatusName).Select(config => new GoodsStatusQuery
{
ConfigId = config.Id,
SystemCode = config.SystemCode,
StatusName = config.StatusName,
FinishTime = null,
FinishUser = null,
FinishUserId = null,
IsPublic = false,
ExtData = null,
Remark = null,
Sort = config.Sort
}).ToList();
//去掉两个list中重复的货物状态
foreach (var item in list)
{
config.RemoveAll(x => x.ConfigId == item.ConfigId);
}
var t = list.Union(config).OrderBy(x => x.Sort).DistinctBy(x => x.StatusName).ToList();
return t;
}
return null;
}
///
/// 获取货物状态
///
///
///
[HttpGet("/BookingOrder/GetGoodsStatusList")]
public async Task> GetGoodsStatusList(long bookingId)
{
var userid = _rep.Where(x => x.Id == bookingId).Select(x => x.CreatedUserId).First();
if (userid != null)
{
//获取当前用户已经录入的货物状态
var list = await _goodsStatus.AsQueryable().LeftJoin(_goodsStatusConfig.AsQueryable(),
(goods, config) => config.Id == goods.ConfigId).Where((goods, config) => config.CreatedUserId == userid && goods.bookingId == bookingId).
OrderBy((goods, config) => config.Sort).
Select((goods, config) => new GoodsStatusQuery
{
ConfigId = config.Id,
SystemCode = config.SystemCode,
StatusName = config.StatusName,
FinishTime = goods.FinishTime,
FinishUser = goods.FinishUser,
FinishUserId = goods.FinishUserId,
IsPublic = goods.IsPublic,
ExtData = goods.ExtData,
Remark = goods.Remark,
Sort = config.Sort
}).ToListAsync();
//配置中所有的货物状态
var config = _goodsStatusConfig.AsQueryable().Where(config => config.CreatedUserId == userid).ToList().DistinctBy(x => x.StatusName).Select(config => new GoodsStatusQuery
{
ConfigId = config.Id,
SystemCode = config.SystemCode,
StatusName = config.StatusName,
FinishTime = null,
FinishUser = null,
FinishUserId = null,
IsPublic = false,
ExtData = null,
Remark = null,
Sort = config.Sort
}).ToList();
//去掉两个list中重复的货物状态
foreach (var item in list)
{
config.RemoveAll(x => x.ConfigId == item.ConfigId);
}
return list.Union(config).OrderBy(x => x.Sort).DistinctBy(x => x.StatusName).ToList();
}
return null;
}
#endregion
#region 运踪
///
/// 调用运踪接口
///
[HttpPost("/BookingOrder/SendTrace")]
[SqlSugarUnitOfWork]
public async Task SendTrace(List dto)
{
if (dto == null)
{
throw Oops.Bah("未传入正确参数!");
}
var key = _webAccountConfig.GetAccountConfig("seae_billtraceurl", UserManager.UserId).Result;
if (key == null)
{
throw Oops.Bah("调用运踪接口相关账号未维护!");
}
var url = _cache.GetAllDictData().Result;
BillTraceDto billdto = new BillTraceDto();
List billTraceList = new List();
var dicdatalist = _cache.GetAllDictData().Result;
foreach (var item in dto)
{
if (!string.IsNullOrWhiteSpace(item.CARRIERID))
{
var et = await _repBookingStatus.AsQueryable().Where(x => x.StaCode == "sta_mudigang" && x.BookingId == Convert.ToInt64(item.BusinessId)).FirstAsync();
if (et != null)
{
throw Oops.Bah("提单号" + item.MBLNO + "已订阅!");
}
}
if (!string.IsNullOrWhiteSpace(item.YardCode))
{
var et = await _repBookingStatus.AsQueryable().Where(x => x.StaCode == "sta_qiyungang" && x.BookingId == Convert.ToInt64(item.BusinessId)).FirstAsync();
if (et != null)
{
throw Oops.Bah("提单号" + item.MBLNO + "已订阅!");
}
}
_logger.LogInformation("调用运踪接口提单号:" + item.MBLNO + " 调用运踪接口");
if (item.isBook && (string.IsNullOrWhiteSpace(item.CARRIERID) || string.IsNullOrWhiteSpace(item.CARRIER) || string.IsNullOrWhiteSpace(item.MBLNO)))
{
throw Oops.Bah("订阅目的港船公司或提单号不能为空!");
}
if (!item.isBook && (string.IsNullOrWhiteSpace(item.YARD) || string.IsNullOrWhiteSpace(item.YardCode) || string.IsNullOrWhiteSpace(item.MBLNO)))
{
throw Oops.Bah("订阅港前数据提单号或场站不能为空!");
}
var YARDID = _cache.GetAllMappingYard().Result.Where(x => x.Module == "BillTrace" && x.Code == item.YardCode).Select(x => x.MapCode).FirstOrDefault();
billTraceList.Add(new BillTraceList
{
BusinessId = item.BusinessId,
MBLNO = item.MBLNO,
YARD = item.YARD == "" ? null : item.YARD,
YardCode = YARDID == "" ? null : YARDID,
CARRIER = item.CARRIER == "" ? null : item.CARRIER,
CARRIERID = item.CARRIERID == "" ? null : item.CARRIERID,
isBook = item.isBook
});
var status = string.Empty;
var IsBookingYZ = String.Empty;
if (!string.IsNullOrWhiteSpace(item.YardCode) && !string.IsNullOrWhiteSpace(item.CARRIERID))
{
status = "订阅起运港,目的港";
IsBookingYZ = "3";
}
else if (string.IsNullOrWhiteSpace(item.YardCode) && !string.IsNullOrWhiteSpace(item.CARRIERID))
{
status = "订阅目的港";
IsBookingYZ = "2";
}
else if (!string.IsNullOrWhiteSpace(item.YardCode) && string.IsNullOrWhiteSpace(item.CARRIERID))
{
status = "订阅起运港";
IsBookingYZ = "1";
}
else
{
IsBookingYZ = "0";
}
////添加booking日志
var bid = await _bookinglog.InsertReturnSnowflakeIdAsync(new BookingLog
{
Type = "Trace",
BookingId = Convert.ToInt64(item.BusinessId),
TenantId = Convert.ToInt64(UserManager.TENANT_ID),
CreatedTime = DateTime.Now,
CreatedUserId = UserManager.UserId,
CreatedUserName = UserManager.Name
});
await _bookinglogdetail.InsertReturnSnowflakeIdAsync(new BookingLogDetail
{
PId = bid,
Field = "",
OldValue = "",
NewValue = status,
});
await _rep.UpdateAsync(x => x.Id == Convert.ToInt64(item.BusinessId), x => new BookingOrder { IsBookingYZ = IsBookingYZ });
}
billdto.Children = billTraceList;
billdto.Key = key.Account;
billdto.PWD = key.Password;
billdto.url = url.FirstOrDefault(x => x.TypeCode == "url_set" && x.Code == "response_seae_billtraceurl").Value;
billdto.Gid = UserManager.DjyUserId;
var json = billdto.ToJsonString();
_logger.LogInformation("调用运踪接口发送josn:" + json);
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("调用运踪接口返回" + html.ToJsonString());
if (html.Success != true)
{
_logger.LogError("调用运踪接口返回:" + html.ToJsonString());
throw Oops.Bah(html.Message);
}
}
///
/// 即时刷新运踪
///
///
///
[HttpPost("/BookingOrder/RefreshBillTrace")]
public async Task RefreshBillTrace(string Ids)
{
var url = _cache.GetAllDictData().Result.FirstOrDefault(x => x.TypeCode == "url_set" && x.Code == "response_seae_billtraceRefreshurl").Value;
if (string.IsNullOrEmpty(url))
{
throw Oops.Bah("未找到相关URL,请联系管理员配置");
}
var html = await url.SetHttpMethod(HttpMethod.Post).SetQueries(new { Ids = Ids, flag = true }).SetRetryPolicy(3, 5000).SendAsAsync();
_logger.LogInformation("调用运踪刷新接口返回" + html.ToJsonString());
if (html.Success != true)
{
_logger.LogError("调用运踪刷新接口返回:" + html.ToJsonString());
throw Oops.Bah(html.Message);
}
}
///
/// 更新运踪提单号或自动订阅运踪
///
///
///
[HttpPost("/BookingOrder/UpdateMblno")]
[SqlSugarUnitOfWork]
public async Task UpdateMblno(BookingOrder order)
{
var key = _webAccountConfig.GetAccountConfig("seae_billtraceurl", UserManager.UserId).Result;
if (key == null)
{
throw Oops.Bah("调用运踪接口相关账号未维护!");
}
/*
* 2023-9-8,允许分单的主提单号和主单的主提单号不一致之后,操作填写的分单中的提单号可能是错误的,
* 导致订阅运踪且后期回推数据,然后又推送东胜,导致分单会在东胜中生成主单信息,
* 跟和川操作确认,取消分单订阅运踪
*/
if (order.ParentId > 0)
{
_logger.LogError("分单不再订阅运踪");
return;
}
var url = _cache.GetAllDictData().Result;
BillTraceDto billdto = new BillTraceDto();
List billTraceList = new List();
var dicdatalist = _cache.GetAllDictData().Result;
_logger.LogInformation("调用运踪修改接口提单号:" + order.MBLNO + " 调用运踪接口");
var uidList = new List();
if (!string.IsNullOrEmpty(order.OPID))
{
uidList.Add(Convert.ToInt64(order.OPID));
}
if (!string.IsNullOrEmpty(order.CUSTSERVICEID))
{
uidList.Add(Convert.ToInt64(order.CUSTSERVICEID));
}
var emailList = _repUser.AsQueryable().Where(x => uidList.Contains(x.Id) && !string.IsNullOrEmpty(x.Email)).Select(x => x.Email).ToList();
billTraceList.Add(new BillTraceList
{
BusinessId = order.Id.ToString(),
MBLNO = order.MBLNO,
YARD = order.YARD == "" ? null : order.YARD,
YardCode = order.YARDID == "" ? null : order.YARDID,
CARRIER = order.CARRIER == "" ? null : order.CARRIER,
CARRIERID = order.CARRIERID == "" ? null : order.CARRIERID,
isBook = true,
AlertEmail = string.Join(";", emailList)
});
var status = string.Empty;
if (!string.IsNullOrWhiteSpace(order.YARDID) && !string.IsNullOrWhiteSpace(order.CARRIERID))
{
status = "订阅起运港,目的港";
}
else
if (string.IsNullOrWhiteSpace(order.YARDID) && !string.IsNullOrWhiteSpace(order.CARRIERID))
{
status = "订阅目的港";
}
else if (!string.IsNullOrWhiteSpace(order.YARDID) && string.IsNullOrWhiteSpace(order.CARRIERID))
{
status = "订阅起运港";
}
var stalogids = _repStatuslog.AsQueryable().Filter(null, true).Where(x => x.BookingId == order.Id).Select(x => x.Id).ToList();
_repBookingStatus.Delete(x => x.BookingId == order.Id);
_statuslogdetail.Delete(x => stalogids.Contains(x.PId));
_repStatuslog.Delete(x => x.BookingId == order.Id);
////添加booking日志
var bid = await _bookinglog.InsertReturnSnowflakeIdAsync(new BookingLog
{
Type = "Trace",
BookingId = order.Id,
TenantId = UserManager.TENANT_ID,
CreatedTime = DateTime.Now,
CreatedUserId = UserManager.UserId,
CreatedUserName = UserManager.Name
});
await _bookinglogdetail.InsertReturnSnowflakeIdAsync(new BookingLogDetail
{
PId = bid,
Field = "",
OldValue = "",
NewValue = status,
});
//if (!string.IsNullOrWhiteSpace(order.CARRIERID))
//{
// BookingStatus bookingStatus = new BookingStatus();
// bookingStatus.BookingId = order.Id;
// bookingStatus.StaCode = "sta_mudigang";
// bookingStatus.StaName = dicdatalist.Where(x => x.Code == "sta_mudigang").Select(x => x.Value).FirstOrDefault();
// bookingStatus.StaTime = DateTime.Now;
// bookingStatus.StaCate = "book_sta_cate_billtrace";
// await _repBookingStatus.InsertAsync(bookingStatus);
//}
//if (!string.IsNullOrWhiteSpace(order.YARDID))
//{
// BookingStatus bookingStatus = new BookingStatus();
// bookingStatus.BookingId = order.Id;
// bookingStatus.StaCode = "sta_qiyungang";
// bookingStatus.StaName = dicdatalist.Where(x => x.Code == "sta_qiyungang").Select(x => x.Value).FirstOrDefault();
// bookingStatus.StaTime = DateTime.Now;
// bookingStatus.StaCate = "book_sta_cate_billtrace";
// await _repBookingStatus.InsertAsync(bookingStatus);
//}
billdto.Children = billTraceList;
billdto.Key = key.Account;
billdto.PWD = key.Password;
billdto.url = url.FirstOrDefault(x => x.TypeCode == "url_set" && x.Code == "response_seae_billtraceurl").Value;
billdto.Gid = UserManager.DjyUserId;
var json = billdto.ToJsonString();
_logger.LogInformation("调用运踪更改接口发送josn:" + json);
var html = await url.FirstOrDefault(x => x.TypeCode == "url_set" && x.Code == "request_seae_updatebilltraceurl").Value.SetHttpMethod(HttpMethod.Post).SetQueries(new { msg = json }).SetRetryPolicy(3, 5000).SendAsAsync();
_logger.LogInformation("调用运踪更改接口返回" + html.ToJsonString());
if (html.Success != true)
{
_logger.LogError("调用运踪更改接口返回:" + html.ToJsonString());
throw Oops.Bah(html.Message);
}
}
///
/// 退订运踪
///
public async Task UnsubscribeBillTrace(List billtraces)
{
if (billtraces == null)
{
throw Oops.Bah("未传入正确参数!");
}
var key = _webAccountConfig.GetAccountConfig("seae_billtraceurl", UserManager.UserId).Result;
if (key == null)
{
throw Oops.Bah("调用运踪接口相关账号未维护!");
}
var url = _cache.GetAllDictData().Result?.FirstOrDefault(x => x.TypeCode == "url_set" && x.Code == "request_unsubscribe_seae_billtrace_url")?.Value;
if (string.IsNullOrEmpty(url))
{
throw Oops.Bah("未配置退订运踪接口地址!");
}
BillTraceUnsubscribeDto reqDto = new BillTraceUnsubscribeDto()
{
Children = new List(),
Key = key.Account,
PWD = key.Password,
Gid = UserManager.DjyUserId
};
foreach (BillTraceUnsubscribeList item in billtraces)
{
_logger.LogInformation("调用退订运踪接口,提单号:" + item.MBLNO);
if (string.IsNullOrEmpty(item.BusinessId))
{
throw Oops.Bah("订舱记录主键不能为空!");
}
reqDto.Children.Add(new BillTraceUnsubscribeList(item.BusinessId, item.MBLNO));
////添加booking日志
var bid = await _bookinglog.InsertReturnSnowflakeIdAsync(new BookingLog
{
Type = "Trace",
BookingId = Convert.ToInt64(item.BusinessId),
TenantId = Convert.ToInt64(UserManager.TENANT_ID),
CreatedTime = DateTime.Now,
CreatedUserId = UserManager.UserId,
CreatedUserName = UserManager.Name
});
await _bookinglogdetail.InsertReturnSnowflakeIdAsync(new BookingLogDetail
{
PId = bid,
Field = "",
OldValue = "",
NewValue = "退订运踪",
});
await _rep.UpdateAsync(x => x.Id == Convert.ToInt64(item.BusinessId), x => new BookingOrder { IsBookingYZ = "0" });
}
var json = reqDto.ToJsonString();
_logger.LogInformation("调用退订运踪接口发送json:" + json);
var html = await url.SetHttpMethod(HttpMethod.Post).SetQueries(new { msg = json }).SetRetryPolicy(3, 5000).SendAsAsync();
_logger.LogInformation("调用退订运踪接口返回" + html.ToJsonString());
if (html.Success != true)
{
_logger.LogError("调用退订运踪接口返回:" + html.ToJsonString());
throw Oops.Bah(html.Message);
}
}
#endregion
#region 放舱(入货通知)
///
/// 获取放舱信息
///
///
///
[HttpGet("/BookingOrder/LetterYard")]
public async Task LetterYard(long bookingId)
{
var order = _rep.FirstOrDefault(x => x.Id == bookingId);
if (order == null)
{
throw Oops.Bah(BookingErrorCode.BOOK001);
}
var letterYard = await _repLetterYard.FirstOrDefaultAsync(x => x.BookingId == bookingId);
if (letterYard == null)
{
var user = _repUser.FirstOrDefault(x => x.Id == UserManager.UserId);
letterYard = new BookingLetteryard()
{
BookingId = bookingId,
Description = order.DESCRIPTION,
FromName = user.Name,
FromTel = user.Tel,
FromMail = user.Email,
FromPhone = user.Phone,
YARDID = order.YARDID,
YARD = order.YARD,
YARDCONTRACT = order.YARDCONTRACT,
YARDCONTRACTTEL = order.YARDCONTRACTTEL,
};
}
var output = letterYard.Adapt();
//链接信息
var urlModel = _repOrderUrl.FirstOrDefault(x => x.BookingId == bookingId);
if (urlModel != null)
{
output.OrderUrl = urlModel.Adapt();
}
return output;
}
///
/// 保存(新增或修改)放舱
///
///
///
[HttpPost("/BookingLetteryard/Save")]
public async Task LetteryardSave(UpdateBookingLetteryardInput input)
{
long rtnId = 0;
if (input.Id == 0)
{
var entity = input.Adapt();
await _repLetterYard.InsertAsync(entity);
rtnId = entity.Id;
}
else
{
var entity = _repLetterYard.AsQueryable().Filter(null, true).First(x => x.Id == input.Id);
input.Adapt(entity);
await _repLetterYard.UpdateAsync(entity);
rtnId = entity.Id;
}
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))
{
try
{
var txxpLink = await TxxpLink(input.BookingId);
}
catch { }
}
//vgm链接
allowCarrier = _cache.GetAllDictData().Result.Where(x => x.TypeCode == "vgm_carrier_list").Select(x => x.Code).ToList();
if (allowCarrier.Contains(order.CARRIERID))
{
try
{
await VgmLink(input.BookingId);
}
catch { }
}
// 以后需要把RUN_TYPE_CUST 、 RUN_TYPE_NORMAL放开
if (App.Configuration["RunType"] is not CommonConst.RUN_TYPE_CUST or CommonConst.RUN_TYPE_DJY or CommonConst.RUN_TYPE_NORMAL)
{
await SendLetterYard(input.BookingId);
}
return rtnId;
}
///
/// 放舱推送东胜
///
///
public async Task SendLetterYard(long bookingId)
{
var entity = _repLetterYard.AsQueryable().Filter(null, true).First(x => x.BookingId == bookingId && x.IsDeleted == false);
if (entity != null)
{
var json = entity.ToJsonString();
try
{
const string MqActionExchangeName = "djy.output.dingcang.ds6";
const string MqActionQueueName = "djy.output.dingcang.ds6_fangcang";
ConnectionFactory factory = new ConnectionFactory();
factory.Uri = new Uri(_cache.GetAllDictData().Result.Where(x => x.Code == "BookingOrderMQUri").Select(x => x.Value).FirstOrDefault());
using (IConnection conn = factory.CreateConnection())
{
IModel mqModel = conn.CreateModel();
mqModel.ExchangeDeclare(MqActionExchangeName, ExchangeType.Direct);
var queueName = $"{MqActionQueueName}.{UserManager.TENANT_ID}";
mqModel.QueueDeclare(queueName, false, false, false, null);
mqModel.QueueBind(queueName, MqActionExchangeName, queueName, null);
byte[] messageBodyBytes = Encoding.UTF8.GetBytes(json);
IBasicProperties props = mqModel.CreateBasicProperties();
props.DeliveryMode = 2;
mqModel.BasicPublish(MqActionExchangeName,
queueName, props,
messageBodyBytes);
conn.Close();
_logger.LogInformation($"放舱数据回推,已发送数据到消息队列【{_cache.GetAllDictData().Result.Where(x => x.Code == "BookingOrderMQUri").Select(x => x.Value).FirstOrDefault()}】,数据内容:【{json}】");
}
}
catch (Exception ex)
{
_logger.LogError(ex.Message);
_logger.LogError(ex.StackTrace);
}
}
return null;
}
///
/// 获取放舱历史信息(曾经删除的)
///
///
///
[HttpGet("/BookingLetteryard/LetterYardHis")]
public async Task> LetterYardHis(long bookingId)
{
var list = await _repLetterYard.AsQueryable()
.Filter(null, true)
.Where(x => x.BookingId == bookingId && x.TenantId == UserManager.TENANT_ID)
.OrderBy(x => x.CreatedTime)
.ToListAsync();
return list.Adapt>();
}
///
/// 删除放舱
///
///
///
[SqlSugarUnitOfWork]
[HttpPost("/BookingLetteryard/LetterYardDelete")]
public async Task LetterYardDelete(long Id)
{
var entity = _repLetterYard.FirstOrDefault(x => x.BookingId == Id);
entity.IsDeleted = true;
string json = entity.ToJsonString();
try
{
const string MqActionExchangeName = "djy.output.dingcang.ds6";
const string MqActionQueueName = "djy.output.dingcang.ds6_fangcangdelete";
ConnectionFactory factory = new ConnectionFactory();
factory.Uri = new Uri(_cache.GetAllDictData().Result.Where(x => x.Code == "BookingOrderMQUri").Select(x => x.Value).FirstOrDefault());
using (IConnection conn = factory.CreateConnection())
{
IModel mqModel = conn.CreateModel();
mqModel.ExchangeDeclare(MqActionExchangeName, ExchangeType.Direct);
var queueName = $"{MqActionQueueName}.{UserManager.TENANT_ID}";
mqModel.QueueDeclare(queueName, false, false, false, null);
mqModel.QueueBind(queueName, MqActionExchangeName, queueName, null);
byte[] messageBodyBytes = Encoding.UTF8.GetBytes(json);
IBasicProperties props = mqModel.CreateBasicProperties();
props.DeliveryMode = 2;
mqModel.BasicPublish(MqActionExchangeName,
queueName, props,
messageBodyBytes);
conn.Close();
_logger.LogInformation($"删除放舱,已发送数据到消息队列【{_cache.GetAllDictData().Result.Where(x => x.Code == "BookingOrderMQUri").Select(x => x.Value).FirstOrDefault()}】,数据内容:【{json}】");
}
}
catch (Exception ex)
{
_logger.LogError(ex.Message);
_logger.LogError(ex.StackTrace);
}
await _repLetterYard.UpdateAsync(entity);
_logger.LogInformation(Id + "放舱删除成功!");
}
///
/// 放舱发送
///
/// 订舱ID
/// 打印模板ID
///
[HttpPost("/BookingLetteryard/SendLetterYard")]
public async Task SendLetterYard(long bookingId, long templateId)
{
var order = _rep.FirstOrDefault(x => x.Id == bookingId);
var user = await _repUser.FirstOrDefaultAsync(u => u.Id == order.CreatedUserId);
var tenant = await _repTenant.FirstOrDefaultAsync(t => t.Id == order.TenantId);
var letterYard = await _repLetterYard.FirstOrDefaultAsync(x => x.BookingId == bookingId);
if (letterYard == null)
{
throw Oops.Bah("放舱信息未找到,请先保存数据");
}
if (string.IsNullOrEmpty(letterYard.AttnMail))
{
throw Oops.Bah("ATTN MAIL未正确填写");
}
if (string.IsNullOrEmpty(letterYard.FromMail))
{
throw Oops.Bah("FROM MAIL未正确填写");
}
var mailAcc = await _repUserMail.FirstOrDefaultAsync(x => x.CreatedUserId == user.Id && x.MailAccount == letterYard.FromMail && x.SmtpPort > 0 && x.SmtpServer != null && x.SmtpServer != "");
if (mailAcc == null)
{
throw Oops.Bah("用户邮箱未设置或smtp未正确配置");
}
var orderUrl = await _repOrderUrl.FirstOrDefaultAsync(u => u.BookingId == bookingId);
//if (orderUrl == null)
//{
// throw Oops.Bah("未生成链接信息,请重新保存数据");
//}
#region 保存放舱文件,并挂载到订舱附件
var printTemplate = await _repPrintTemplate.AsQueryable().Filter(null, true).FirstAsync(x => x.Id == templateId);
if (printTemplate == null)
{
throw Oops.Bah(BookingErrorCode.BOOK115);
}
var bs = await GenPrintFile(bookingId, printTemplate);
var opt = App.GetOptions();
var fileSaveName = $"放舱通知_{order.MBLNO}_{DateTime.Now.Ticks}.pdf"; // 文件原始名称
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);
var fileRelaPath = Path.Combine(opt.relativePath, fileSaveName).ToLower();
var fileAbsPath = Path.Combine(dirAbs, fileSaveName).ToLower();
File.WriteAllBytes(fileAbsPath, bs);
var newFile = new BookingFile
{
FileName = fileSaveName,
FilePath = fileRelaPath,
TypeCode = "ruhuotongzhi",
TypeName = ".pdf",
};
await _bookingfile.InsertAsync(newFile);
#endregion
//货运动态
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 SaveBookingStatus(bookingId, "sta_letter_yard", "放舱");
#region 发送邮件
var mailSubject = $"放舱信息:{order.MBLNO}/{order.CARRIERID}/{order.VESSEL}/{order.VOYNO}/PO:{order.PONO}/{order.TenantName}";
var extContent = string.Empty;
if (order.CARGOID == "R") //冻柜
{
extContent = $"温度:{order.TEMPSET}{order.TEMPID}
通风:{order.REEFERF}
湿度:{order.HUMIDITY}
";
}
else if (order.CARGOID == "D") //危险品
{
extContent = $"危险品等级:{order.DCLASS}
危险品编号:{order.DUNNO}
";
}
var linkContent = string.Empty;
if (orderUrl != null)
{
linkContent = $@"提箱小票链接:{orderUrl.UrlTxxp}
提交VGM链接:{orderUrl.UrlVgm}
";
}
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}
{linkContent}
温馨提示:
如果分票报关,请回箱前通知场站及我司。
开船及截港时间以码头具体计划为准。
若贵司自输VGM,请不要通过VGM链接提交数据,否则我司收取相关VGM申报费用。
订舱代理联系人:{UserManager.Name}
电话:{user.Tel} 手机:{user.Phone}
邮箱:{user.Email}
";
var sendResult = await MailSendHelper.SendMail(mailAcc, mailSubject, mailContent, letterYard.AttnMail, new KeyValuePair($"放舱通知_{order.MBLNO}.pdf", bs));
if (!sendResult.Key)
{
_logger.LogError($"放舱邮件发送失败:从{mailAcc.MailAccount}到{letterYard.AttnMail},主题 {mailSubject}");
throw Oops.Bah($"邮件发送失败:{sendResult.Value}");
}
#endregion
//设置货物状态-放舱
await SetGoodsStatus("YFC", bookingId);
await SendBookingOrder(new long[] { bookingId });
}
///
/// 获取放舱pdf(准备作废,后期使用打印相关接口)
///
///
/// 类型,1:pdf、2:xlsx、3:docx
///
[HttpGet("/BookingOrder/LetterYardPdf")]
public async Task LetterYardPdf(long bookingId, int type = 1)
{
var letterYard = await _repLetterYard.FirstOrDefaultAsync(x => x.BookingId == bookingId);
if (letterYard == null)
{
throw Oops.Bah("放舱信息未找到,请先保存数据");
}
var fileType = "";
if (type == 1)
{
fileType = ".pdf";
}
else if (type == 2)
{
fileType = ".xlsx";
}
else if (type == 3)
{
fileType = ".docx";
}
else
{
throw Oops.Bah("类型参数不正确");
}
var bs = await GetReportFile(bookingId, "fangcang", type);
var fileName = HttpUtility.UrlEncode($"{bookingId}_{DateTime.Now.Ticks}{fileType}", Encoding.GetEncoding("UTF-8"));
var result = new FileContentResult(bs, "application/octet-stream") { FileDownloadName = fileName };
return result;
}
///
/// 获取放舱excel(准备作废,后期使用打印相关接口)
///
///
///
[HttpGet("/BookingOrder/LetterYardXlsx")]
public async Task LetterYardXlsx(long bookingId)
{
var letterYard = await _repLetterYard.FirstOrDefaultAsync(x => x.BookingId == bookingId);
if (letterYard == null)
{
throw Oops.Bah("放舱信息未找到,请先保存数据");
}
var bs = await GetReportFile(bookingId, "fangcang", 2);
var fileName = HttpUtility.UrlEncode($"{bookingId}_{DateTime.Now.Ticks}.xlsx", Encoding.GetEncoding("UTF-8"));
var result = new FileContentResult(bs, "application/octet-stream") { FileDownloadName = fileName };
return result;
}
///
/// 生成报表文件(准备作废)
///
///
/// 类型,1:pdf、2:xlsx、3:docx
/// 报表类型代码,例如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)
{
throw Oops.Bah(BookingErrorCode.BOOK001);
}
_logger.LogInformation($"查找模板:bookingId-{bookingId} TenantId-{order.TenantId}");
var printTemplate = await _repPrintTemplate.AsQueryable().Filter(null, true).FirstAsync(x => x.TenantId == order.TenantId && x.TypeCode == typeCode);
if (printTemplate == null)
{
throw Oops.Bah(BookingErrorCode.BOOK115);
}
var opt = App.GetOptions();
var dirAbs = opt.basePath;
if (string.IsNullOrEmpty(dirAbs))
{
dirAbs = App.WebHostEnvironment.WebRootPath;
}
var fileAbsPath = Path.Combine(dirAbs, printTemplate.FilePath);
_logger.LogInformation($"查找模板文件:{fileAbsPath}");
if (!File.Exists(fileAbsPath))
{
throw Oops.Bah(BookingErrorCode.BOOK115);
}
_logger.LogInformation($"准备调用报表生成:id:{bookingId},文件:{printTemplate.FileName}");
var genUrl = $"{reportUrl}Report/BookingReport?bookingId={bookingId}&type={type}";
var rtn = await genUrl
.SetContentType("multipart/form-data")
.SetBodyBytes(("file", File.ReadAllBytes(fileAbsPath), HttpUtility.UrlEncode(printTemplate.FileName, Encoding.GetEncoding("UTF-8"))))
.PostAsStringAsync();
var jobjRtn = JObject.Parse(rtn);
_logger.LogInformation($"调用报表生成返回:{rtn}");
if (jobjRtn.GetBooleanValue("Success"))
{
//调用读取文件
var fn = jobjRtn.GetStringValue("Data");
_logger.LogInformation($"准备调用读取报表文件:id:{bookingId},文件名:{fn}");
var readFileUrl = $"{reportUrl}Report/GetFile?fileName={fn}";
var bs = await readFileUrl.GetAsByteArrayAsync();
_logger.LogInformation($"调用读取报表文件返回:{bs.Length}");
return bs;
}
else
{
throw Oops.Bah($"生成报表文件失败:{jobjRtn.GetStringValue("Message")}");
}
}
///
/// 生成打印报表文件
///
/// 订舱ID
/// 打印模板
/// 类型,1:pdf、2:xlsx、3:docx
///
[NonAction]
private async Task GenPrintFile(long bookingId, BookingPrintTemplate printTemplate, int type = 1)
{
//打印报表服务地址
var reportUrl = _cache.GetAllDictData().Result.FirstOrDefault(x => x.TypeCode == "url_set" && x.Code == "url_report_generate").Value;
if (!reportUrl.EndsWith("/"))
{
reportUrl += "/";
}
//订舱数据
var order = _rep.FirstOrDefault(x => x.Id == bookingId);
if (order == null)
{
throw Oops.Bah(BookingErrorCode.BOOK001);
}
var opt = App.GetOptions();
var dirAbs = opt.basePath;
if (string.IsNullOrEmpty(dirAbs))
{
dirAbs = App.WebHostEnvironment.WebRootPath;
}
var fileAbsPath = Path.Combine(dirAbs, printTemplate.FilePath);
_logger.LogInformation($"查找模板文件:{fileAbsPath}");
if (!File.Exists(fileAbsPath))
{
throw Oops.Bah(BookingErrorCode.BOOK115);
}
_logger.LogInformation($"准备调用报表生成:id:{bookingId},文件:{printTemplate.FileName}");
var genUrl = $"{reportUrl}Report/BookingReport?bookingId={bookingId}&type={type}";
var rtn = await genUrl
.SetContentType("multipart/form-data")
.SetBodyBytes(("file", File.ReadAllBytes(fileAbsPath), HttpUtility.UrlEncode(printTemplate.FileName, Encoding.GetEncoding("UTF-8"))))
.PostAsStringAsync();
var jobjRtn = JObject.Parse(rtn);
_logger.LogInformation($"调用报表生成返回:{rtn}");
if (jobjRtn.GetBooleanValue("Success"))
{
//调用读取文件
var fn = jobjRtn.GetStringValue("Data");
_logger.LogInformation($"准备调用读取报表文件:id:{bookingId},文件名:{fn}");
var readFileUrl = $"{reportUrl}Report/GetFile?fileName={fn}";
var bs = await readFileUrl.GetAsByteArrayAsync();
_logger.LogInformation($"调用读取报表文件返回:{bs.Length}");
return bs;
}
else
{
throw Oops.Bah($"生成报表文件失败:{jobjRtn.GetStringValue("Message")}");
}
}
///
/// 查询历史放舱数据(用于历史引入)
///
///
///
[HttpPost("/BookingOrder/LetterYardHis")]
public async Task> LetterYardHis(BookingLetteryardHisInput input)
{
var list = await _repLetterYard.AsQueryable()
.InnerJoin((ly, ord) => ly.BookingId == ord.Id)
.Where(ly => ly.CreatedUserId == UserManager.UserId)
.WhereIF(!string.IsNullOrEmpty(input.MBLNO), (ly, ord) => ord.MBLNO.Contains(input.MBLNO))
.WhereIF(!string.IsNullOrEmpty(input.HBLNO), (ly, ord) => ord.HBLNO.Contains(input.HBLNO))
.WhereIF(!string.IsNullOrEmpty(input.BOOKINGNO), (ly, ord) => ord.BOOKINGNO.Contains(input.BOOKINGNO))
.WhereIF(!string.IsNullOrEmpty(input.CUSTOMERNAME), (ly, ord) => ord.CUSTOMERNAME.Contains(input.CUSTOMERNAME))
.WhereIF(input.BETD.HasValue, (ly, ord) => ord.ETD > input.BETD.Value)
.WhereIF(input.EETD.HasValue, (ly, ord) => ord.ETD < input.EETD.Value.AddDays(1))
.OrderByDescending((ly, ord) => ly.CreatedTime)
.Select((ly, ord) => new BookingLetteryardHisOutput()
{
MBLNO = ord.MBLNO,
HBLNO = ord.HBLNO,
BOOKINGNO = ord.BOOKINGNO,
ETD = ord.ETD.Value.ToString("yyyy-MM-dd"),
CUSTOMERNAME = ord.CUSTOMERNAME,
ToName = ly.ToName,
Attn = ly.Attn,
AttnMail = ly.AttnMail,
AttnPhone = ly.AttnPhone,
AttnTel = ly.AttnTel,
FromMail = ly.FromMail,
FromName = ly.FromName,
FromPhone = ly.FromPhone,
FromTel = ly.FromTel,
Description = ly.Description,
CloseDocTime = ly.CloseDocTime,
ClosingTime = ly.ClosingTime,
VgmTime = ly.VgmTime,
YARD = ly.YARD,
YARDCONTRACT = ly.YARDCONTRACT,
YARDCONTRACTTEL = ly.YARDCONTRACTTEL,
YARDID = ly.YARDID,
Remark = ly.Remark,
})
.ToPagedListAsync(input.PageNo, input.PageSize); ;
return list;
}
#endregion
#region 打印
///
/// 下载打印文件
///
/// 文件名
///
[HttpGet("/BookingOrder/DownloadPrint"), AllowAnonymous]
public IActionResult DownloadPrint(string fileName)
{
var opt = App.GetOptions().Path;
var fileFullPath = Path.Combine(App.WebHostEnvironment.WebRootPath, opt);//服务器路径
var result = new FileStreamResult(new FileStream(Path.Combine(fileFullPath, fileName), FileMode.Open), "application/octet-stream") { FileDownloadName = fileName };
return result;
}
///
/// 订舱打印(返回文件名)
///
/// 订舱Id
/// 打印模板ID
/// 分类代码(使用字典【booking_template_category】中的代码)
/// 类型,1:pdf、2:xlsx、3:docx
/// 打印类型,10:FastReport、20:Excel模板
///
[HttpGet("/BookingOrder/PrintOrder")]
public async Task PrintOrder(long bookingId, long templateId, string cateCode, int type = 1, BookingPrintTemplateType printType = BookingPrintTemplateType.FastReport)
{
var printTemplate = await _repPrintTemplate.AsQueryable().Filter(null, true).FirstAsync(x => x.Id == templateId);
if (printTemplate == null)
{
throw Oops.Bah(BookingErrorCode.BOOK115);
}
var order = await _rep.FirstOrDefaultAsync(x => x.Id == bookingId);
var edi = await _bookingEDIExt.FirstOrDefaultAsync(x => x.BookingId == bookingId);
if (order == null)
{
throw Oops.Bah(BookingErrorCode.BOOK001);
}
var fileName = string.Empty;
var dicCate = (await _cache.GetAllDictData()).FirstOrDefault(x => x.Code == cateCode && x.TypeCode == "booking_template_category");
if (dicCate == null)
{
throw Oops.Bah("分类代码参数不正确");
}
#region FastReport打印
if (printType == BookingPrintTemplateType.FastReport)
{
var bs = await GenPrintFile(bookingId, printTemplate, type);
var fileType = "";
if (type == 1)
{
fileType = ".pdf";
}
else if (type == 2)
{
fileType = ".xlsx";
}
else if (type == 3)
{
fileType = ".docx";
}
else
{
throw Oops.Bah("类型参数不正确");
}
//2023-4-3,根据河川操作要求,文件名只带提单号
if (!string.IsNullOrEmpty(order.MBLNO))
{
fileName = $"{order.MBLNO}{fileType}";//名称
}
else
{
fileName = $"{order.Id}_{DateTime.Now.Ticks}{fileType}";//名称
}
var opt = App.GetOptions().Path;
var serverpath = Path.Combine(App.WebHostEnvironment.WebRootPath, opt);//服务器路径
if (!Directory.Exists(serverpath))
{
Directory.CreateDirectory(serverpath);
}
var fullPath = Path.Combine(serverpath, fileName);
await File.WriteAllBytesAsync(fullPath, bs);
}
#endregion
#region Excel模板打印
else if (printType == BookingPrintTemplateType.ExcelTemplate)
{
var opt = App.GetOptions();
var dirAbs = opt.basePath;
if (string.IsNullOrEmpty(dirAbs))
{
dirAbs = App.WebHostEnvironment.WebRootPath;
}
var fileAbsPath = Path.Combine(dirAbs, printTemplate.FilePath);
_logger.LogInformation($"准备调用EXCEL生成:id:{bookingId},文件:{printTemplate.FileName}");
var result = new FileStream(fileAbsPath, FileMode.Open);
var excelwork = new HSSFWorkbook(result);
var sheet = excelwork.GetSheetAt(0);
var entity = await _excelrep.AsQueryable().Where(x => x.PId == templateId).OrderBy(x => x.Row).ToListAsync();
if (entity == null)
{
throw Oops.Bah("当前模板未设置");
}
for (int _row = 1; _row <= entity.Max(x => x.Row); _row++)
{
if (entity.Where(x => x.Row == _row).Count() > 0)
{
////获取行
var row = sheet.GetRow(_row - 1);
if (row != null)
{
for (int _cellNum = 1; _cellNum <= entity.Max(x => x.Column); _cellNum++)
{
if (entity.Where(x => x.Row == _row && x.Column == _cellNum).Count() > 0)
{
var name = entity.Where(x => x.Row == _row && x.Column == _cellNum).Select(x => x.Field).FirstOrDefault();
if (name.Split('.')[0].ToLower() == "order")
{
foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(order))
{
var _name = descriptor.Name.ToLower();
if (name.Split('.')[0].ToLower() == "order" && name.Split('.')[1].ToLower() == _name)
{
var value = descriptor.GetValue(order) != null ? descriptor.GetValue(order).ToString() : "";
ICell cell = row.GetCell(_cellNum - 1);
if (descriptor.PropertyType.FullName.Contains("DateTime"))
{
value = value != "" ? Convert.ToDateTime(value).ToString("yyyy-MM-dd") : "";
}
if (cell != null)
{
row.Cells[_cellNum - 1].SetCellValue(value);
}
else
{
row.CreateCell(_cellNum - 1).SetCellValue(value);
}
}
if (name.Split('.')[0].ToLower() == "order" && name.Split('.')[1].ToLower() == "_pkgs" && _name == "pkgs")
{
var value = string.Empty;
if (order.PKGS != null)
{
if (order.PKGS.ToString().Split('.').Count() > 1 && Convert.ToInt32(order.PKGS.ToString().Split('.')[1]) > 0)
{
value = string.Format("{0:F3}", order.PKGS);
}
else
{
value = order.PKGS.ToString().Split('.')[0];
}
}
ICell cell = row.GetCell(_cellNum - 1);
if (cell != null)
{
row.Cells[_cellNum - 1].SetCellValue(value + order.KINDPKGS);
}
else
{
row.CreateCell(_cellNum - 1).SetCellValue(value + order.KINDPKGS);
}
}
if (name.Split('.')[0].ToLower() == "order" && name.Split('.')[1].ToLower() == "_kgs" && _name == "kgs")
{
var value = string.Empty;
if (order.KGS != null)
{
if (order.KGS.ToString().Split('.').Count() > 1 && Convert.ToInt32(order.KGS.ToString().Split('.')[1]) > 0)
{
value = string.Format("{0:F3}", order.KGS);
}
else
{
value = order.KGS.ToString().Split('.')[0];
}
}
ICell cell = row.GetCell(_cellNum - 1);
if (cell != null)
{
row.Cells[_cellNum - 1].SetCellValue(value + "KGS");
}
else
{
row.CreateCell(_cellNum - 1).SetCellValue(value + "KGS");
}
}
if (name.Split('.')[0].ToLower() == "order" && name.Split('.')[1].ToLower() == "_cbm" && _name == "cbm")
{
var value = string.Empty;
if (order.CBM != null)
{
if (order.CBM.ToString().Split('.').Count() > 1 && Convert.ToInt32(order.CBM.ToString().Split('.')[1]) > 0)
{
value = string.Format("{0:F3}", order.CBM);
}
else
{
value = order.CBM.ToString().Split('.')[0];
}
}
ICell cell = row.GetCell(_cellNum - 1);
if (cell != null)
{
row.Cells[_cellNum - 1].SetCellValue(value + "CBM");
}
else
{
row.CreateCell(_cellNum - 1).SetCellValue(value + "CBM");
}
}
}
}
if (name.Split('.')[0].ToLower() == "edi")
{
foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(edi))
{
var _name = descriptor.Name.ToLower();
if (name.Split('.')[0].ToLower() == "edi" && name.Split('.')[1].ToLower() == _name)
{
var value = descriptor.GetValue(edi) != null ? descriptor.GetValue(edi).ToString() : "";
ICell cell = row.GetCell(_cellNum - 1);
if (descriptor.PropertyType.FullName.Contains("DateTime"))
{
value = value != "" ? Convert.ToDateTime(value).ToString("yyyy-MM-dd") : "";
}
if (cell != null)
{
row.Cells[_cellNum - 1].SetCellValue(value);
}
else
{
row.CreateCell(_cellNum - 1).SetCellValue(value);
}
}
}
}
if (name.Split('.')[0].ToLower() == "userinfo")
{
ICell cell = row.GetCell(_cellNum - 1);
var value = string.Empty;
if (name.Split('.')[1].ToLower() == "username")
{
value = UserManager.Name;
}
if (name.Split('.')[1].ToLower() == "usertel")
{
value = UserManager.TEl;
}
if (name.Split('.')[1].ToLower() == "usermobile")
{
value = UserManager.Phone;
}
if (name.Split('.')[1].ToLower() == "useremail")
{
value = UserManager.Email;
}
if (name.Split('.')[1].ToLower() == "usertenant")
{
value = UserManager.TENANT_NAME;
}
if (cell != null)
{
row.Cells[_cellNum - 1].SetCellValue(value);
}
else
{
row.CreateCell(_cellNum - 1).SetCellValue(value);
}
}
}
}
}
else
{
////创建行
var srow = NpoiExcelExportHelper._.CreateRow(sheet, _row - 1);
for (int _cellNum = 1; _cellNum <= entity.Max(x => x.Column); _cellNum++)
{
if (entity.Where(x => x.Row == _row && x.Column == _cellNum).Count() > 0)
{
var name = entity.Where(x => x.Row == _row && x.Column == _cellNum).Select(x => x.Field).FirstOrDefault();
if (name.Split('.')[0].ToLower() == "order")
{
foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(order))
{
var _name = descriptor.Name.ToLower();
if (name.Split('.')[1].ToLower() == _name && name.Split('.')[0].ToLower() == "order")
{
var value = descriptor.GetValue(order) != null ? descriptor.GetValue(order).ToString() : "";
if (descriptor.PropertyType.FullName.Contains("DateTime"))
{
value = value != "" ? Convert.ToDateTime(value).ToString("yyyy-MM-dd") : "";
}
srow.CreateCell(_cellNum - 1).SetCellValue(value);
}
}
}
if (name.Split('.')[0].ToLower() == "edi")
{
foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(edi))
{
var _name = descriptor.Name.ToLower();
if (name.Split('.')[1].ToLower() == _name && name.Split('.')[0].ToLower() == "edi")
{
var value = descriptor.GetValue(edi) != null ? descriptor.GetValue(edi).ToString() : "";
if (descriptor.PropertyType.FullName.Contains("DateTime"))
{
value = value != "" ? Convert.ToDateTime(value).ToString("yyyy-MM-dd") : "";
}
srow.CreateCell(_cellNum - 1).SetCellValue(value);
}
}
}
if (name.Split('.')[0].ToLower() == "userinfo")
{
var value = string.Empty;
if (name.Split('.')[1].ToLower() == "username")
{
value = UserManager.Name;
}
if (name.Split('.')[1].ToLower() == "usertel")
{
value = UserManager.TEl;
}
if (name.Split('.')[1].ToLower() == "usermobile")
{
value = UserManager.Phone;
}
if (name.Split('.')[1].ToLower() == "useremail")
{
value = UserManager.Email;
}
if (name.Split('.')[1].ToLower() == "usertenant")
{
value = UserManager.TENANT_NAME;
}
srow.CreateCell(_cellNum - 1).SetCellValue(value);
}
}
}
}
}
}
var fileFullPath = Path.Combine(App.WebHostEnvironment.WebRootPath, App.GetOptions().Path);//服务器路径
if (!Directory.Exists(fileFullPath))
{
Directory.CreateDirectory(fileFullPath);
}
//2023-4-3,根据河川操作要求,文件名只带提单号
if (!string.IsNullOrEmpty(order.MBLNO))
{
fileName = $"{order.MBLNO}.xls";//名称
}
else
{
fileName = $"{order.Id}_{DateTime.Now.Ticks}.xls";//名称
}
_logger.LogInformation("导出excel:" + Path.Combine(fileFullPath, fileName));
var filestream = new FileStream(Path.Combine(fileFullPath, fileName), FileMode.OpenOrCreate, FileAccess.ReadWrite);
excelwork.Write(filestream);
}
#endregion
//记录打印次数和时间,用于前端动态展示常用的打印类型
var printRecentListKey = $"{PrintRecentListTypeKey}_{cateCode}_{printType}";
var usrCfg = _repUserConfig.AsQueryable().First(x => x.CreatedUserId == UserManager.UserId && x.Type == printRecentListKey);
if (usrCfg == null)
{
usrCfg = new DjyUserConfig();
usrCfg.Type = printRecentListKey;
usrCfg.ConfigJson = (new long[] { templateId }).ToJson();
await _repUserConfig.InsertAsync(usrCfg);
}
else
{
var arr = JArray.Parse(usrCfg.ConfigJson).Select(x => Convert.ToInt64(x)).Where(x => x != templateId).ToList();
arr.Insert(0, templateId);
usrCfg.ConfigJson = arr.ToArray().ToJson();
await _repUserConfig.UpdateAsync(usrCfg);
}
return HttpUtility.UrlEncode(fileName, Encoding.GetEncoding("UTF-8"));
}
///
/// 预览模板生成的pdf文件
///
/// 文件名称
///
[HttpGet("/BookingOrder/ViewPrintPdf/{fn}"), AllowAnonymous]
public void ViewPrintPdf(string fn)
{
var opt = App.GetOptions().Path;
var fileFullPath = Path.Combine(App.WebHostEnvironment.WebRootPath, opt);
var fileFullName = Path.Combine(fileFullPath, fn);
if (File.Exists(fileFullName))
{
_logger.LogInformation($"预览pdf文件:{fileFullName}");
var sysConfig = _cache.GetAllSysConfig().Result;
var viewUrl = sysConfig.FirstOrDefault(x => x.Code == "booking_print_view_pdf_url");
//var readMem = new ReadOnlyMemory(File.ReadAllBytes(fileFullName));
//_httpContextAccessor.HttpContext.Response.BodyWriter.WriteAsync(readMem);
_httpContextAccessor.HttpContext.Response.StatusCode = 302;
_httpContextAccessor.HttpContext.Response.Headers["Location"] = $"{viewUrl.Value}{fn}";
}
else
{
_logger.LogInformation($"未找到预览pdf文件:{fileFullName}");
_httpContextAccessor.HttpContext.Response.StatusCode = 404;
}
}
///
/// 获取订舱打印模板列表(带有当前用户打印历史排序)
///
/// 分类代码(使用字典【booking_template_category】中的代码)
/// 打印分类,10:FastReport、20:Excel模板
///
[HttpGet("/BookingOrder/PrintTemplateWithHistoryList")]
public async Task PrintTemplateWithHistoryList(string cateCode, BookingPrintTemplateType printType)
{
var typeCode = printType.ToString();
//当前公司所有已配置的模板
var allList = await _repPrintTemplate.AsQueryable()
.Filter(null, true).InnerJoin((d, t) => d.Id == t.PrintTemplateId && t.SysUserId == UserManager.UserId)
.Where(d => d.TenantId == UserManager.TENANT_ID && d.CateCode.Contains(cateCode) && d.Type == typeCode)
.Select(d => new
{
d.Id,
d.CateCode,
d.CateName,
d.DisplayName
})
.ToListAsync();
var listReult = new List();
//当前用户打印历史数据
var printRecentListKey = $"{PrintRecentListTypeKey}_{cateCode}_{printType}";
var usrCfg = await _repUserConfig.AsQueryable().FirstAsync(x => x.CreatedUserId == UserManager.UserId && x.Type == printRecentListKey);
if (usrCfg != null)
{
var arr = JArray.Parse(usrCfg.ConfigJson).Select(x => Convert.ToInt64(x)).ToList();
//按顺序加入到结果
arr.ForEach(x =>
{
var find = allList.FirstOrDefault(y => y.Id == x);
if (find != null)
{
listReult.Add(find);
}
});
var listOut = allList.Where(x => !arr.Contains(x.Id)).ToList();
listReult.AddRange(listOut);
return listReult;
}
else
{
return allList;
}
}
///
/// 下载文件
///
///
[HttpGet("/BookingOrder/Download")]
public async Task Download(long id)
{
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))
{
dirAbs = App.WebHostEnvironment.WebRootPath;
}
var fileFullPath = Path.Combine(dirAbs, printFile.FilePath);
if (!File.Exists(fileFullPath))
{
throw Oops.Oh(BookingErrorCode.BOOK115);
}
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 下货纸
///
/// 发送下货纸
///
///
///
[HttpPost("/BookingOrder/SendXHZ")]
public async Task SendXHZ(long bookingId)
{
var rtn = await XiahuozhiHelpler.Send(bookingId, "9");
if (!rtn.Key)
{
throw Oops.Bah($"发送失败:{rtn.Value}");
}
//订舱状态
await SaveBookingStatus(bookingId, "sta_xhz", "下货纸");
//设置货物状态:已发下货纸,并回传东胜
await SetGoodsStatus("YFXHZ", bookingId);
await SendBookingOrder(new long[] { bookingId });
}
#endregion
#region 样单(提单确认)
///
/// 样单
///
///
///
[HttpGet("/BookingOrder/SampleBill")]
public async Task SampleBill(long bookingId)
{
var order = _rep.FirstOrDefault(x => x.Id == bookingId);
var samp = await _repSampleBill.FirstOrDefaultAsync(x => x.BookingId == bookingId);
if (samp == null)
{
var user = _repUser.FirstOrDefault(x => x.Id == UserManager.UserId);
samp = new BookingSampleBill()
{
BookingId = bookingId,
Description = order.DESCRIPTION,
FromName = user.Name,
FromTel = user.Tel,
FromMail = user.Email,
};
}
var output = samp.Adapt();
return output;
}
///
/// 保存(新增或修改)样单
///
///
///
[HttpPost("/BookingSampleBill/Save")]
public async Task SampleBillSave(UpdateBookingSampleBillInput input)
{
BookingSampleBill entity = null;
if (input.Id == 0)
{
entity = input.Adapt();
await _repSampleBill.InsertAsync(entity);
}
else
{
entity = _repSampleBill.FirstOrDefault(x => x.BookingId == input.Id);
entity = input.Adapt(entity);
await _repSampleBill.UpdateAsync(entity);
}
return entity.Id;
}
///
/// 获取样单pdf(准备作废,后期使用打印相关api)
///
///
///
[HttpGet("/BookingOrder/SampleBillPdf")]
public async Task SampleBillPdf(long bookingId)
{
var samp = await _repSampleBill.FirstOrDefaultAsync(x => x.BookingId == bookingId);
if (samp == null)
{
throw Oops.Bah("请先保存提单确认数据后再继续");
}
var bs = await GetReportFile(bookingId, "tidanqueren");
var fileName = HttpUtility.UrlEncode($"{bookingId}_{DateTime.Now.Ticks}.xlsx", Encoding.GetEncoding("UTF-8"));
var result = new FileContentResult(bs, "application/octet-stream") { FileDownloadName = fileName };
return result;
}
#endregion
#region 小票链接
///
/// 获取提箱小票链接
///
///
///
[HttpGet("/BookingOrder/TxxpLink")]
public async Task TxxpLink(long bookingId)
{
var order = _rep.FirstOrDefault(x => x.Id == bookingId);
if (order == null)
{
throw Oops.Bah(BookingErrorCode.BOOK001);
}
var ordUrl = _repOrderUrl.FirstOrDefault(x => x.BookingId == bookingId);
if (ordUrl == null)
{
ordUrl = new BookingOrderUrl();
ordUrl.BookingId = bookingId;
await _repOrderUrl.InsertAsync(ordUrl);
}
//if (!string.IsNullOrEmpty(ordUrl.UrlTxxp))
//{
// return ordUrl.UrlTxxp;
//}
var dictData = await _cache.GetAllDictData();
//校验船公司
if (string.IsNullOrEmpty(order.CARRIERID))
{
throw Oops.Bah(BookingErrorCode.BOOK118);
}
//判断船公司是否支持
var allowCarrier = dictData.Where(x => x.TypeCode == "txxp_carrier_list").Select(x => x.Code).ToList();
if (!allowCarrier.Contains(order.CARRIERID))
{
throw Oops.Bah(BookingErrorCode.BOOK117);
}
var carrCode = order.CARRIERID;
var carrMap = _cache.GetAllMappingCarrier().Result.Where(y => y.Code == order.CARRIERID && y.Module == "BookingTxxp").FirstOrDefault();
if (carrMap != null)
{
carrCode = carrMap.MapCode;
}
//根据订舱代理获取账号类型
var ytMapList = dictData.Where(x => x.TypeCode == "txxp_yitong_forwarder_map").ToList();
var ytmap = ytMapList.FirstOrDefault(x => x.Value == order.FORWARDER);
if (ytmap == null)
{
throw Oops.Bah($"订舱代理 {order.FORWARDER} 对应的网站账号类型未配置");
}
//亿通账号
var ytAcc = _webAccountConfig.GetAccountConfig(ytmap.Code, UserManager.UserId).Result;
if (ytAcc == null)
{
throw Oops.Bah(BookingErrorCode.BOOK119);
}
//场站转换
var yardsetList = _cache.GetAllMappingYard().Result.Where(y => y.Code == order.YARDID && y.Module == "BookingTxxp" && (y.CarrierCode == null || y.CarrierCode == "" || y.CarrierCode == order.CARRIERID)).ToList();
if (yardsetList.Count == 0)
{
throw Oops.Bah(BookingErrorCode.BOOK120, $"{order.YARD} {order.CARRIER}(提箱小票)");
}
var yardset = yardsetList.FirstOrDefault(x => x.CarrierCode == order.CARRIERID);
if (yardset == null)
{
yardset = yardsetList.FirstOrDefault(x => x.CarrierCode == null || x.CarrierCode == "");
}
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)
//{
// throw Oops.Bah(BookingErrorCode.BOOK122);
//}
var expCode = ctns.Select(x => x.CTNCODE).Distinct().Except(ctnMapping.Select(y => y.Code)).ToList();
if (expCode.Count > 0)
{
var expName = ctns.Where(x => expCode.Contains(x.CTNCODE)).Select(x => x.CTNALL).Distinct().ToList();
throw Oops.Bah(BookingErrorCode.BOOK123, $"{string.Join(',', expName)}(提箱小票)");
}
var user = await _repUser.FirstOrDefaultAsync(x => x.Id == UserManager.UserId);
//调用小票服务
var dicUrlTxxp = dictData.First(x => x.TypeCode == "url_set" && x.Code == "txxp_service");
var postObj = new
{
SystemCode = "djy_hechuan",
CarrierCode = carrCode,
billOrderId = order.Id.ToString(),
sendOrderCode = order.MBLNO,
userId = UserManager.DjyUserId,
customerId = order.CUSTOMERID.ToString(),
// userName = currUser.CODENAME,
//userPassword = currUser.PASSWORD,
operatorName = UserManager.Name,
depotCode = yardset.MapCode,
depotName = yardset.MapName,
AgentName = UserManager.TENANT_NAME,
linkName = UserManager.Name,
linkMobile = user.Tel,
CustomerName = $"{UserManager.TENANT_NAME}+{UserManager.Name}", //公司名称+用户姓名
memo = string.Empty,
boxInfo = ctns.Select(c =>
{
var mapCtn = ctnMapping.First(x => x.Code == c.CTNCODE);
return new
{
boxType = mapCtn == null ? c.CTNALL : mapCtn.MapCode,
boxCount = c.CTNNUM.Value
};
}),
sysLoginName = ytAcc.Account,
sysPsssword = ytAcc.Password
};
string strPostObj = postObj.ToJsonString();
_logger.LogInformation($"调用提箱小票接口传递数据:{strPostObj}");
var strResp = await dicUrlTxxp.Value.SetBody(postObj).PostAsStringAsync();
_logger.LogInformation($"调用提箱小票接口返回:{strResp}");
var jobjResp = JObject.Parse(strResp);
int respCode = jobjResp.GetIntValue("code");
if (respCode != 200)
{
throw Oops.Bah(BookingErrorCode.BOOK124, jobjResp.GetStringValue("message"));
}
var addUrlFlag = string.IsNullOrEmpty(ordUrl.UrlTxxp) ? true : false; //新生成还是更新链接
//保存url
var txxpUrl = jobjResp.GetStringValue("data");
ordUrl.UrlTxxp = txxpUrl;
await _repOrderUrl.UpdateAsync(ordUrl);
//货运动态
var bsl = new BookingStatusLog();
bsl.BookingId = bookingId;
bsl.Status = $"{(addUrlFlag ? "生成" : "更新")}提箱小票链接";
bsl.OpTime = DateTime.Now;
bsl.Category = "ship";
bsl.MBLNO = order.MBLNO;
await _repStatuslog.InsertAsync(bsl);
return txxpUrl;
}
#endregion
#region VGM及VMG链接
///
/// 获取VGM、VGM SI链接
///
///
///
[HttpGet("/BookingOrder/VgmLink")]
public async Task VgmLink(long bookingId)
{
var order = _rep.FirstOrDefault(x => x.Id == bookingId);
if (order == null)
{
throw Oops.Bah(BookingErrorCode.BOOK001);
}
var ordUrl = _repOrderUrl.FirstOrDefault(x => x.BookingId == bookingId);
if (ordUrl == null)
{
ordUrl = new BookingOrderUrl();
ordUrl.BookingId = bookingId;
await _repOrderUrl.InsertAsync(ordUrl);
}
if (!string.IsNullOrEmpty(ordUrl.UrlVgm))
{
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 = _webAccountConfig.GetAccountConfig(carrWebAccMap.Value, UserManager.UserId).Result;
if (webacc == null)
{
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}(VGM)");
}
//校验箱子数据录入
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)
//{
// throw Oops.Bah(BookingErrorCode.BOOK122);
//}
var expCode = ctns.Select(x => x.CTNCODE).Distinct().Except(ctnMapping.Select(y => y.Code)).ToList();
if (expCode.Count > 0)
{
throw Oops.Bah(BookingErrorCode.BOOK123, $"{string.Join(',', expCode)}(VGM)");
}
//接收反馈地址
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链接服务
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}", //公司名称+用户姓名
customerId = order.CUSTOMERID.ToString(),
agentName = string.IsNullOrEmpty(order.FORWARDER) ? UserManager.TENANT_NAME : order.FORWARDER,
carrierCode = order.CARRIERID,
userName = webacc.Account,
userPassword = webacc.Password,
depotCode = yardset.MapCode,
depotName = order.YARD,
linkName = UserManager.Name,
linkMobile = user.Tel,
linkEmail = user.Email,
userId = UserManager.DjyUserId,
returnUrl = dicUrlVgmResp?.Value,
shipName = order.VESSEL,
voyNo = order.VOYNO,
etdstr = order.ETD.HasValue ? order.ETD.Value.ToString("yyyy-MM-dd") : string.Empty,
potrSend = order.PORTLOAD,
potrGoal = order.PORTDISCHARGE,
boxinfoStr = order.CNTRTOTAL,
vgmEndTimeStr = order.CLOSEVGMDATE.HasValue ? order.CLOSEVGMDATE.Value.ToString("yyyy-MM-dd") : string.Empty,
returnOkUrl = "",
SiReturnUrl = dicUrlSiResp?.Value,
DataInfoJson = new
{
order.SHIPPER,
order.CONSIGNEE,
order.NOTIFYPARTY,
order.MARKS,
order.DESCRIPTION,
order.BLFRT,
order.SERVICE,
order.ISSUETYPE,
order.TRANSPORT,
order.TRANSPORTID,
order.DESTINATION,
order.DESTINATIONID,
order.KINDPKGS,
order.THIRDPAYADDR,
order.PORTLOAD,
order.PORTLOADID,
order.PORTDISCHARGE,
order.PORTDISCHARGEID
}
};
string strPostObj = postObj.ToJsonString();
_logger.LogInformation($"调用VGM链接接口 {dicUrl.Value} 传递数据:{strPostObj}");
var strResp = await dicUrl.Value.SetBody(postObj).PostAsStringAsync();
_logger.LogInformation($"调用VGM链接接口返回:{strResp}");
var jobjResp = JObject.Parse(strResp);
int respCode = jobjResp.GetIntValue("code");
if (respCode != 200)
{
throw Oops.Bah(BookingErrorCode.BOOK126, jobjResp.GetStringValue("message"));
}
//保存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.OpTime = DateTime.Now;
bsl.Category = "ship";
bsl.MBLNO = order.MBLNO;
await _repStatuslog.InsertAsync(bsl);
return new string[] { ordUrl.UrlVgm, ordUrl.UrlVgmSi };
}
///
/// 直发VGM(单票)
///
///
///
[HttpPost("/BookingOrder/VgmSend")]
public async Task VgmSend(long bookingId)
{
var order = _rep.FirstOrDefault(x => x.Id == bookingId);
var ctns = _repCtn.Where(x => x.BILLID == bookingId).ToList();
//船公司
if (string.IsNullOrEmpty(order.CARRIERID))
{
throw Oops.Bah(BookingErrorCode.BOOK118);
}
//提单号不能为空
if (string.IsNullOrEmpty(order.MBLNO))
{
throw Oops.Bah(BookingErrorCode.BOOK127);
}
var config = _cache.GetAllTenantParam().Result.FirstOrDefault(x => x.TenantId == UserManager.TENANT_ID && x.ParaCode == "VgmDirectSendCarrierId");
if (config == null)
{
throw Oops.Bah("请配置租户的VGM直发船司参数");
}
var arrCarr = config.ItemCode.Split(",", StringSplitOptions.RemoveEmptyEntries);
if (!arrCarr.Contains(order.CARRIERID)) //使用大简云发送vgm
{
//ETD不能为空
if (!order.ETD.HasValue)
{
throw Oops.Bah("ETD不能为空");
}
//重量不能为空
if (!order.KGS.HasValue)
{
throw Oops.Bah("重量不能为空");
}
var sysconfig = await _cache.GetAllSysConfig();
var urlConfig = sysconfig.FirstOrDefault(x => x.GroupCode == "DJY_CONST" && x.Code == "DjyVgmApiMyshpping");
var accConfig = await _webAccountConfig.GetAccountConfig("DjyVgm", UserManager.UserId);
if (accConfig == null)
{
throw Oops.Bah("请在网站账号中维护VGM接口的用户id和秘钥");
}
var objMdata = new
{
MBLNO = order.MBLNO,
CARRIER = order.CARRIERID,
ChuanMing = order.VESSEL,
HangCi = order.VOYNOINNER,
ETD = order.ETD.Value.ToString("yyyy-MM-dd HH:mm:ss"),
ZongZhongLiang = order.KGS.ToString(),
BeiZhu = "",
ORDERNO = order.CUSTNO,
VGMCLOSETIME = order.CLOSEVGMDATE.HasValue ? order.CLOSEVGMDATE.Value.ToString("yyyy-MM-dd HH:mm:ss") : ""
};
var listCtn = new List();
foreach (var ctn in ctns)
{
if (string.IsNullOrEmpty(ctn.CTNALL)
|| string.IsNullOrEmpty(ctn.CNTRNO)
|| string.IsNullOrEmpty(ctn.SEALNO)
|| !ctn.WEIGHKGS.HasValue
|| string.IsNullOrEmpty(ctn.WEIGHDATE))
{
throw Oops.Bah("所有箱子的箱型、箱号、封号、称重重量和称重时间都不能为空");
}
listCtn.Add(new
{
ChengZhongZhongLiang = ctn.WEIGHKGS.Value.ToString(),
ChengZhongShiJian = ctn.WEIGHDATE,
CTNALL = ctn.CTNALL.Replace("'", ""),
CNTRNO = ctn.CNTRNO,
SEALNO = ctn.SEALNO
});
}
var dictParam = new Dictionary {
{ "ac", "vgm" },
{ "uid", accConfig.Account},
{ "skey", accConfig.Password},
{ "optype", "9"},
{ "mdata", JsonConvert.SerializeObject(objMdata)},
{ "ctndata", JsonConvert.SerializeObject(listCtn)}
};
_logger.LogInformation($"调用vgm发送接口:{urlConfig.Value},参数:{JsonConvert.SerializeObject(dictParam)}");
var rtn = await urlConfig.Value
.SetBody(dictParam, "application/x-www-form-urlencoded")
.PostAsStringAsync();
_logger.LogInformation($"调用vgm发送接口:{urlConfig.Value},返回:{rtn}");
var jobjRtn = JObject.Parse(rtn);
if (jobjRtn.GetBooleanValue("Success"))
{
//货运动态
var bsl = new BookingStatusLog();
bsl.BookingId = bookingId;
bsl.Status = $"发送VGM";
bsl.OpTime = DateTime.Now;
bsl.Category = "ship";
bsl.MBLNO = order.MBLNO;
await _repStatuslog.InsertAsync(bsl);
}
else
{
throw Oops.Bah(jobjRtn.GetStringValue("Message"));
}
}
else //直接调用vgm接口直发
{
//判断船公司是否支持
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);
if (carrWebAccMap == null)
{
throw Oops.Bah("不支持的船公司或账号映射未配置");
}
var webacc = _webAccountConfig.GetAccountConfig(carrWebAccMap.Value, UserManager.UserId).Result;
if (webacc == null)
{
throw Oops.Bah(BookingErrorCode.BOOK125);
}
////箱型映射
//var ctnMapping = await _cache.GetAllMappingCtn();
//ctnMapping = ctnMapping.Where(x => x.Module == "BookingVgm").ToList();
//if (ctnMapping.Count == 0)
//{
// throw Oops.Bah(BookingErrorCode.BOOK122);
//}
//var expCode = ctns.Select(x => x.CTNCODE).Distinct().Except(ctnMapping.Select(y => y.Code)).ToList();
//if (expCode.Count > 0)
//{
// throw Oops.Bah(BookingErrorCode.BOOK123, string.Join(',', expCode));
//}
#region 箱信息校验,2022-7-1修改:【累加】的必须有重量、皮重和称重重量;【总重】的只需要称重重量不为空
if (ctns.Where(c => c.WEIGHTYPE == "累加" &&
(
string.IsNullOrEmpty(c.CNTRNO)
|| !c.WEIGHKGS.HasValue
|| c.WEIGHKGS == 0
|| !c.TAREWEIGHT.HasValue
|| c.TAREWEIGHT == 0
|| !c.KGS.HasValue
|| c.KGS == 0)
).Count() > 0)
{
throw Oops.Bah("称重方式为累加时,箱号、重量、箱皮重以及称重重量都不能为空");
}
if (ctns.Where(c => c.WEIGHTYPE == "总重" &&
(
string.IsNullOrEmpty(c.CNTRNO)
|| !c.WEIGHKGS.HasValue
|| c.WEIGHKGS == 0)
).Count() > 0)
{
throw Oops.Bah("称重方式为总重时,箱号和称重重量都不能为空");
}
#endregion
////场站转换
//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 (string.IsNullOrEmpty(order.YARD) || string.IsNullOrEmpty(order.YARDID))
{
throw Oops.Bah("场站未正确选择");
}
// 场站映射
string mappingYard, mappingYardId;
var yardMapList = _cache.GetAllMappingYard().Result?.Where(y => y.Code == order.YARDID && y.Module == "BookingVgm" && (y.CarrierCode == null || y.CarrierCode == "" || y.CarrierCode == order.CARRIERID))?.ToList();
if (yardMapList?.Any() == true)
{
var yardset = yardMapList.FirstOrDefault(x => x.CarrierCode == order.CARRIERID)
?? yardMapList.FirstOrDefault(x => x.CarrierCode == null || x.CarrierCode == "");
mappingYard = yardset.MapName;
mappingYardId = yardset.MapCode;
}
else
{
mappingYard = order.YARD;
mappingYardId = order.YARDID;
}
// 船司映射
var carrMap = _cache.GetAllMappingCarrier().Result?.Where(y => y.Code == order.CARRIERID && y.Module == "BookingVgm")?.FirstOrDefault();
string mappingCarrierId = carrMap != null ? carrMap.MapCode : order.CARRIERID;
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}", //公司名称+用户姓名
customerId = order.CUSTOMERID.ToString(),
agentName = string.IsNullOrEmpty(order.FORWARDER) ? UserManager.TENANT_NAME : order.FORWARDER,
carrierCode = mappingCarrierId,
userName = webacc.Account,
userPassword = webacc.Password,
depotCode = mappingYardId,
depotName = mappingYard,
linkName = UserManager.Name,
linkMobile = user.Phone,
linkEmail = user.Email,
userId = user.DjyUserId,
signatory = user.NickName, //2023年8月28日,董怡含:把用户昵称当做vgm上传人
returnUrl = "",
shipName = order.VESSEL,
voyNo = order.VOYNO,
etdstr = order.ETD.HasValue ? order.ETD.Value.ToString("yyyy-MM-dd") : string.Empty,
potrSend = order.PORTLOAD,
potrGoal = order.PORTDISCHARGE,
boxinfoStr = order.CNTRTOTAL.Replace("'", ""),
vgmEndTimeStr = order.CLOSEVGMDATE.HasValue ? order.CLOSEVGMDATE.Value.ToString("yyyy-MM-dd") : string.Empty,
BoxInfo = ctns.Select(c => new
{
index = idx++,
boxType = c.CTNALL.Replace("'", ""),
boxcount = c.CTNNUM.HasValue ? c.CTNNUM.Value : 0,
code = c.CNTRNO,
sealCode = c.SEALNO,
weigth = c.KGS,
weigthTare = c.TAREWEIGHT,
weigthTotal = c.WEIGHKGS,
weigthType = c.WEIGHTYPE == "累加" ? "SM2" : "SM1"
}).ToList(),
returnOkUrl = ""
};
string strPostObj = sendObj.ToJsonString();
_logger.LogInformation($"调用VGM直发接口 {dicUrl.Value} 传递数据:{strPostObj}");
var strResp = await dicUrl.Value.SetBody(sendObj).PostAsStringAsync();
_logger.LogInformation($"调用VGM直发接口返回:{strResp}");
var jobjResp = JObject.Parse(strResp);
int respCode = jobjResp.GetIntValue("code");
if (respCode != 200)
{
throw Oops.Bah(BookingErrorCode.BOOK128, jobjResp.GetStringValue("message"));
}
//货运动态
var bsl = new BookingStatusLog();
bsl.BookingId = bookingId;
bsl.Status = $"直发VGM";
bsl.OpTime = DateTime.Now;
bsl.Category = "ship";
bsl.MBLNO = order.MBLNO;
await _repStatuslog.InsertAsync(bsl);
}
//设置货物状态:已发VGM,并回传东胜
await SetGoodsStatus("YFVGM", bookingId);
await SendBookingOrder(new long[] { bookingId });
}
///
/// 批量编辑vgm
///
/// 业务id 逗号拼接
///
[HttpGet("/BookingOrder/GetVmgDataList")]
public async Task> GetVmgDataList(string ids)
{
var arr = ids.Split(',');
if (arr.Length == 0)
{
throw Oops.Bah("请传入正确数据");
}
var main = await _rep.AsQueryable().Where(x => x.ParentId == 0).ToListAsync();
List batchVGMs = new List();
foreach (var item in arr)
{
BatchVGM batchVGM = new BatchVGM();
batchVGM.Id = Convert.ToInt64(item);
batchVGM.MBLNO = main.Where(x => x.Id == batchVGM.Id).Select(x => x.MBLNO).FirstOrDefault();
batchVGM.ctnlist = await _repCtn.Where(x => x.BILLID == batchVGM.Id).Select(x => new BatchVGMList
{
Id = x.Id,
CTNCODE = x.CTNCODE,
CTNALL = x.CTNALL,
CNTRNO = x.CNTRNO,
KGS = x.KGS,
TAREWEIGHT = x.TAREWEIGHT,
WEIGHTYPE = x.WEIGHTYPE,
WEIGHKGS = x.WEIGHKGS
}).ToListAsync();
batchVGMs.Add(batchVGM);
}
return batchVGMs;
}
///
/// 批量保存vgm
///
///
///
[HttpPost("/BookingOrder/SaveBatchVgm")]
public async Task SaveBatchVgm(List dto)
{
if (dto == null)
{
throw Oops.Bah("未提交数据");
}
foreach (var item in dto)
{
await _repCtn.UpdateAsync(x => x.Id == item.Id, x => new BookingCtn
{
CTNCODE = item.CTNCODE,
CTNALL = item.CTNALL,
CNTRNO = item.CNTRNO,
KGS = item.KGS,
TAREWEIGHT = item.TAREWEIGHT,
WEIGHTYPE = item.WEIGHTYPE,
WEIGHKGS = item.WEIGHKGS
});
}
}
#endregion
#region 订舱、截单EDI
///
/// 发送订舱、截单EDI
///
/// 订舱、截单EDI请求
/// 返回回执
[HttpPost("/BookingOrder/SendBookingOrClosingEDI")]
public async Task SendBookingOrClosingEDI(BookingOrClosingEDIOrderDto model)
{
var dictvalue = _cache.GetAllDictData().Result.Where(x => x.Code == "XiangManCang").Select(x => x.Value).FirstOrDefault();
var order = _rep.FirstOrDefault(x => x.Id == model.Id);
var FORWARDER = order.FORWARDER;
if (!string.IsNullOrEmpty(FORWARDER) && dictvalue == FORWARDER)
{
#region
//var edi = _bookingEDIExt.FirstOrDefault(x => x.BookingId == model.Id);
//var ctn = _repCtn.AsQueryable().Where(x => x.BILLID == model.Id).ToList();
//#region 箱满仓生成excel文件
//string fileName = String.Empty;
//var opt = App.GetOptions();
//var dirAbs = opt.basePath;
//if (string.IsNullOrEmpty(dirAbs))
//{
// dirAbs = App.WebHostEnvironment.WebRootPath;
//}
//var fPath = "upload/printtemplate/箱满舱上传Excel模板.xls";
//var fileAbsPath = Path.Combine(dirAbs, fPath);
//_logger.LogInformation($"准备调用EXCEL");
//var file = new FileStream(fileAbsPath, FileMode.Open);
//var excelwork = new HSSFWorkbook(file);
//var sheet = excelwork.GetSheetAt(0);
//for (int i = 0; i < sheet.LastRowNum; i++)
//{
// ////获取行
// var row = sheet.GetRow(i);
// if (i == 0)
// {
// //委托编号
// ICell cell = row.GetCell(5);
// if (cell != null)
// {
// row.Cells[5].SetCellValue(order.CUSTNO);
// }
// else
// {
// row.CreateCell(5).SetCellValue(order.CUSTNO);
// }
// }
// if (i == 1)
// {
// //场站
// var yardid = order.YARDID;
// if (!string.IsNullOrEmpty(yardid))
// {
// ICell cell = row.GetCell(5);
// var yard = _cache.GetAllMappingYard().Result.Where(x => x.Module == "XiangManCangEDI" && x.Code == yardid).Select(x => x.MapCode).First();
// if (cell != null)
// {
// row.Cells[5].SetCellValue(yard);
// }
// else
// {
// row.CreateCell(5).SetCellValue(yard);
// }
// }
// }
// if (i == 2)
// {
// //指定业务员
// ICell cell = row.GetCell(5);
// if (cell != null)
// {
// row.Cells[5].SetCellValue(edi.XMCYWY);
// }
// else
// {
// row.CreateCell(5).SetCellValue(edi.XMCYWY);
// }
// }
// if (i == 3)
// {
// //提单号
// ICell cell = row.GetCell(5);
// if (cell != null)
// {
// row.Cells[5].SetCellValue(order.MBLNO);
// }
// else
// {
// row.CreateCell(5).SetCellValue(order.MBLNO);
// }
// }
// if (i == 8)
// {
// //发货人
// ICell cell = row.GetCell(1);
// if (cell != null)
// {
// row.Cells[1].SetCellValue(order.SHIPPER);
// }
// else
// {
// row.CreateCell(1).SetCellValue(order.SHIPPER);
// }
// }
// if (i == 10)
// {
// //发货人代码
// ICell cell = row.GetCell(1);
// if (cell != null)
// {
// row.Cells[1].SetCellValue(order.SHIPPERID);
// }
// else
// {
// row.CreateCell(1).SetCellValue(order.SHIPPERID);
// }
// }
// if (i == 11)
// {
// //收货人
// ICell cell = row.GetCell(1);
// if (cell != null)
// {
// row.Cells[1].SetCellValue(order.CONSIGNEE);
// }
// else
// {
// row.CreateCell(1).SetCellValue(order.CONSIGNEE);
// }
// }
// if (i == 14)
// {
// //通知人
// ICell cell = row.GetCell(1);
// if (cell != null)
// {
// row.Cells[1].SetCellValue(order.NOTIFYPARTY);
// }
// else
// {
// row.CreateCell(1).SetCellValue(order.NOTIFYPARTY);
// }
// }
// if (i == 17)
// {
// //第二通知人
// ICell cell = row.GetCell(1);
// if (cell != null)
// {
// row.Cells[1].SetCellValue(order.NOTIFYPARTY2);
// }
// else
// {
// row.CreateCell(1).SetCellValue(order.NOTIFYPARTY2);
// }
// }
// if (i == 18)
// {
// //起运港国际五字代码
// ICell cell = row.GetCell(1);
// if (cell != null)
// {
// row.Cells[1].SetCellValue(order.PORTLOADID);
// }
// else
// {
// row.CreateCell(1).SetCellValue(order.PORTLOADID);
// }
// var service = order.SERVICE;
// //运输方式
// ICell cell5 = row.GetCell(5);
// if (cell5 != null)
// {
// row.Cells[5].SetCellValue(_cache.GetAllMappingService().Result.Where(x => x.Module == "XiangManCangEDI" && x.Code == service).Select(x => x.MapCode).First());
// }
// else
// {
// row.CreateCell(5).SetCellValue(_cache.GetAllMappingService().Result.Where(x => x.Module == "XiangManCangEDI" && x.Code == service).Select(x => x.MapCode).First());
// }
// }
// if (i == 19)
// {
// //卸货港国际五字代码
// ICell cell = row.GetCell(1);
// if (cell != null)
// {
// row.Cells[1].SetCellValue(order.PORTDISCHARGEID);
// }
// else
// {
// row.CreateCell(1).SetCellValue(order.PORTDISCHARGEID);
// }
// }
// if (i == 20)
// {
// //交货地国际五字代码
// ICell cell = row.GetCell(1);
// if (cell != null)
// {
// row.Cells[1].SetCellValue(order.PLACEDELIVERYID);
// }
// else
// {
// row.CreateCell(1).SetCellValue(order.PLACEDELIVERYID);
// }
// }
// if (i == 21)
// {
// //ETD
// if (order.ETD != null)
// {
// ICell cell = row.GetCell(1);
// if (cell != null)
// {
// row.Cells[1].SetCellValue(Convert.ToDateTime(order.ETD).ToString("yyyy-MM-dd"));
// }
// else
// {
// row.CreateCell(1).SetCellValue(Convert.ToDateTime(order.ETD).ToString("yyyy-MM-dd"));
// }
// }
// //船名
// ICell cell4 = row.GetCell(4);
// if (cell4 != null)
// {
// row.Cells[4].SetCellValue(order.VESSEL);
// }
// else
// {
// row.CreateCell(4).SetCellValue(order.VESSEL);
// }
// }
// if (i == 22)
// {
// //客户协约号
// ICell cell = row.GetCell(1);
// if (cell != null)
// {
// row.Cells[1].SetCellValue(order.CONTRACTNO);
// }
// else
// {
// row.CreateCell(1).SetCellValue(order.CONTRACTNO);
// }
// }
// if (i == 23)
// {
// //航次
// ICell cell = row.GetCell(4);
// if (cell != null)
// {
// row.Cells[4].SetCellValue(order.VOYNO);
// }
// else
// {
// row.CreateCell(4).SetCellValue(order.VOYNO);
// }
// }
// if (i == 26)
// {
// //唛头
// ICell cell = row.GetCell(0);
// if (cell != null)
// {
// row.Cells[0].SetCellValue(order.MARKS);
// }
// else
// {
// row.CreateCell(0).SetCellValue(order.MARKS);
// }
// if (order.PKGS != null)
// {
// //件数
// ICell cell1 = row.GetCell(1);
// if (cell1 != null)
// {
// row.Cells[1].SetCellValue(order.PKGS.ToString());
// }
// else
// {
// row.CreateCell(1).SetCellValue(order.PKGS.ToString());
// }
// }
// //包装
// ICell cell2 = row.GetCell(2);
// if (cell2 != null)
// {
// row.Cells[2].SetCellValue(order.KINDPKGS);
// }
// else
// {
// row.CreateCell(2).SetCellValue(order.KINDPKGS);
// }
// //品名
// ICell cell3 = row.GetCell(3);
// if (cell3 != null)
// {
// row.Cells[3].SetCellValue(order.DESCRIPTION);
// }
// else
// {
// row.CreateCell(3).SetCellValue(order.DESCRIPTION);
// }
// if (order.KGS != null)
// {
// //重量
// ICell cell4 = row.GetCell(4);
// if (cell3 != null)
// {
// row.Cells[4].SetCellValue(order.KGS.ToString());
// }
// else
// {
// row.CreateCell(4).SetCellValue(order.KGS.ToString());
// }
// }
// if (order.CBM != null)
// {
// //尺码
// ICell cell5 = row.GetCell(5);
// if (cell5 != null)
// {
// row.Cells[5].SetCellValue(order.CBM.ToString());
// }
// else
// {
// row.CreateCell(5).SetCellValue(order.CBM.ToString());
// }
// }
// }
// if (i == 39)
// {
// var c = ctn.DistinctBy(x => x.CTNALL).ToList();
// var ctnAll = string.Empty;
// foreach (var item in c)
// {
// ctnAll += $"{ctn.Where(x => x.CTNALL == item.CTNALL).Count()}*{_cache.GetAllMappingCtn().Result.Where(x => x.Module == "XiangManCangEDI" && x.Code == item.CTNCODE).Select(x => x.MapCode).First()}+";
// }
// ctnAll = ctnAll.Substring(0, ctnAll.Length - 1);
// //箱型箱量
// ICell cell = row.GetCell(0);
// if (cell != null)
// {
// row.Cells[0].SetCellValue(ctnAll);
// }
// else
// {
// row.CreateCell(0).SetCellValue(ctnAll);
// }
// }
// if (i == 42)
// {
// //运费支付方式
// var BLFRTCode = _cache.GetAllCodeFrt().Result.Where(x => x.EnName == order.BLFRT).Select(x => x.Code).First();
// var bl = string.Empty;
// if (!string.IsNullOrEmpty(BLFRTCode))
// {
// bl = _cache.GetAllMappingFrt().Result.Where(x => x.Module == "XiangManCangEDI" && x.Code == BLFRTCode).Select(x => x.MapCode).First();
// }
// ICell cell = row.GetCell(0);
// if (cell != null)
// {
// row.Cells[0].SetCellValue(bl);
// }
// else
// {
// row.CreateCell(0).SetCellValue(bl);
// }
// }
// if (i == 43)
// {
// //hscode
// ICell cell = row.GetCell(3);
// if (cell != null)
// {
// row.Cells[3].SetCellValue(order.HSCODE);
// }
// else
// {
// row.CreateCell(3).SetCellValue(order.HSCODE);
// }
// }
// if (i == 44)
// {
// var BLFRTCode = _cache.GetAllCodeFrt().Result.Where(x => x.EnName == order.BLFRT).Select(x => x.Code).First();
// var bl = string.Empty;
// if (!string.IsNullOrEmpty(BLFRTCode))
// {
// bl = _cache.GetAllMappingFrt().Result.Where(x => x.Module == "XiangManCangEDI" && x.Code == BLFRTCode).Select(x => x.MapCode).First();
// }
// if (bl == "预付")
// {
// //预付地点
// ICell cell = row.GetCell(1);
// if (cell != null)
// {
// row.Cells[1].SetCellValue(order.PREPARDATID);
// }
// else
// {
// row.CreateCell(1).SetCellValue(order.PREPARDATID);
// }
// }
// else if((bl == "到付"))
// {
// //预付地点
// ICell cell = row.GetCell(1);
// if (cell != null)
// {
// row.Cells[1].SetCellValue(order.PAYABLEATID);
// }
// else
// {
// row.CreateCell(1).SetCellValue(order.PAYABLEATID);
// }
// }
// }
// if (i == 45)
// {
// //Name accout
// ICell cell = row.GetCell(1);
// if (cell != null)
// {
// row.Cells[1].SetCellValue(edi.EmcNameAccount);
// }
// else
// {
// row.CreateCell(1).SetCellValue(edi.EmcNameAccount);
// }
// }
// if (i == 47)
// {
// //Name accout
// ICell cell = row.GetCell(1);
// if (cell != null)
// {
// row.Cells[1].SetCellValue(order.TEMPSET);
// }
// else
// {
// row.CreateCell(1).SetCellValue(order.TEMPSET);
// }
// //温度
// ICell cell2 = row.GetCell(2);
// if (cell2 != null)
// {
// row.Cells[2].SetCellValue(order.TEMPSET);
// }
// else
// {
// row.CreateCell(2).SetCellValue(order.TEMPSET);
// }
// //湿度
// ICell cell3 = row.GetCell(3);
// if (cell2 != null)
// {
// row.Cells[3].SetCellValue(order.HUMIDITY);
// }
// else
// {
// row.CreateCell(3).SetCellValue(order.HUMIDITY);
// }
// }
// if (i == 49)
// {
// //危险品编号
// ICell cell = row.GetCell(1);
// if (cell != null)
// {
// row.Cells[1].SetCellValue(order.DUNNO);
// }
// else
// {
// row.CreateCell(1).SetCellValue(order.DUNNO);
// }
// }
// if (i == 50)
// {
// //订舱备注
// ICell cell = row.GetCell(1);
// if (cell != null)
// {
// row.Cells[1].SetCellValue(order.SOREMARK);
// }
// else
// {
// row.CreateCell(1).SetCellValue(order.SOREMARK);
// }
// }
//}
//var fileFullPath = Path.Combine(App.WebHostEnvironment.WebRootPath, App.GetOptions().Path);//服务器路径
//if (!Directory.Exists(fileFullPath))
//{
// Directory.CreateDirectory(fileFullPath);
//}
////2023-4-3,根据合川操作要求,文件名只带提单号
//if (!string.IsNullOrEmpty(order.MBLNO))
//{
// fileName = $"{DateTime.Now.Ticks}_{order.MBLNO}.xls";//名称
//}
//else
//{
// fileName = $"{DateTime.Now.Ticks}_{order.MBLNO}.xls";//名称
//}
//_logger.LogInformation("导出excel:" + Path.Combine(fileFullPath, fileName));
//var filestream = new FileStream(Path.Combine(fileFullPath, fileName), FileMode.OpenOrCreate, FileAccess.ReadWrite);
//excelwork.Write(filestream);
//#endregion
//#region 调用爬虫接口
//var url = _cache.GetAllDictData().Result.Where(x => x.Code == "xiangManCangPostUrl").Select(x => x.Value).FirstOrDefault();
//var account = _webAccountConfig.GetAccountConfig("XiangManCang", UserManager.UserId).Result;
//var key = _cache.GetAllSysConfig().Result.Where(x => x.Code == "billTraceNewUserKey").Select(x => x.Value).FirstOrDefault();
//if (string.IsNullOrEmpty(key))
//{
// throw Oops.Bah("未获取到相关KEY,请联系管理员!");
//}
//var secret = _cache.GetAllSysConfig().Result.Where(x => x.Code == "billTraceNewUserSecret").Select(x => x.Value).FirstOrDefault();
//if (string.IsNullOrEmpty(secret))
//{
// throw Oops.Bah("未获取到相关SECRET,请联系管理员!");
//}
//////使用HttpClient方式上传文件
//var carrier_code = _cache.GetAllMappingCarrier().Result.Where(x => x.Module == "HeChuan" && x.MapCode == order.CARRIERID).Select(x => x.Code).First();
//string fn = string.Empty;
//using (var httpClient = new HttpClient())
//{
// using (var request = new HttpRequestMessage(new HttpMethod("Post"), url))
// {
// request.Headers.TryAddWithoutValidation("Content-Type", "application/x-www-form-urlencoded");
// var multipartContent = new MultipartFormDataContent();
// multipartContent.Add(new StringContent("user_key"), key);
// multipartContent.Add(new StringContent("user_secret"), secret);
// multipartContent.Add(new StringContent("web_user"), account.Account);
// multipartContent.Add(new StringContent("web_psw"), account.Password);
// multipartContent.Add(new StringContent("carrier_code"), carrier_code);
// multipartContent.Add(new StreamContent(filestream, (int)filestream.Length), "file", fileName);
// request.Content = multipartContent;
// var response = await httpClient.SendAsync(request);
// if (response.IsSuccessStatusCode)
// {
// var strRtn = response.Content.ReadAsStringAsync().Result;
// var jobj = strRtn.ToJObject();
// if (jobj.GetIntValue("code") == 200)
// {
// fn = jobj.GetStringValue("msg");
// }
// else
// {
// throw Oops.Bah(jobj.GetStringValue("msg"));
// }
// }
// }
//}
//return fn;
//#endregion
#endregion
return await XMCEXCEL(model.Id);
}
else
{
return await InnerBookingOrClosingEDI(model);
}
}
[NonAction]
public async Task XMCEXCEL(long Id, bool flag = false)
{
var order = _rep.FirstOrDefault(x => x.Id == Id);
var edi = _bookingEDIExt.FirstOrDefault(x => x.BookingId == Id);
var ctn = _repCtn.AsQueryable().Where(x => x.BILLID == Id).ToList();
#region 箱满仓生成excel文件
string fileName = String.Empty;
var opt = App.GetOptions();
var dirAbs = opt.basePath;
if (string.IsNullOrEmpty(dirAbs))
{
dirAbs = App.WebHostEnvironment.WebRootPath;
}
var fPath = "upload/printtemplate/箱满舱上传Excel模板.xls";
var fileAbsPath = Path.Combine(dirAbs, fPath);
_logger.LogInformation($"准备调用EXCEL");
var file = new FileStream(fileAbsPath, FileMode.Open);
var excelwork = new HSSFWorkbook(file);
var sheet = excelwork.GetSheetAt(0);
for (int i = 0; i < sheet.LastRowNum; i++)
{
////获取行
var row = sheet.GetRow(i);
if (i == 0)
{
//委托编号
ICell cell = row.GetCell(5);
if (cell != null)
{
row.Cells[5].SetCellValue(order.CUSTNO);
}
else
{
row.CreateCell(5).SetCellValue(order.CUSTNO);
}
}
if (i == 1)
{
//场站
var yardid = order.YARDID;
if (!string.IsNullOrEmpty(yardid))
{
ICell cell = row.GetCell(5);
var yard = _cache.GetAllMappingYard().Result.Where(x => x.Module == "XiangManCangEDI" && x.Code == yardid).Select(x => x.MapCode).FirstOrDefault();
if (cell != null)
{
row.Cells[5].SetCellValue(yard);
}
else
{
row.CreateCell(5).SetCellValue(yard);
}
}
}
if (i == 2)
{
//指定业务员
ICell cell = row.GetCell(5);
if (cell != null)
{
row.Cells[5].SetCellValue(edi.XMCYWY);
}
else
{
row.CreateCell(5).SetCellValue(edi.XMCYWY);
}
}
if (i == 3)
{
//提单号
ICell cell = row.GetCell(5);
if (cell != null)
{
if (string.IsNullOrEmpty(order.MBLNO))
{
row.Cells[5].SetCellValue(order.CUSTNO);
}
else
{
row.Cells[5].SetCellValue(order.MBLNO);
}
}
else
{
if (string.IsNullOrEmpty(order.MBLNO))
{
row.CreateCell(5).SetCellValue(order.CUSTNO);
}
else
{
row.CreateCell(5).SetCellValue(order.MBLNO);
}
}
}
if (i == 8)
{
//发货人
ICell cell = row.GetCell(1);
if (cell != null)
{
row.Cells[1].SetCellValue(order.SHIPPER);
}
else
{
row.CreateCell(1).SetCellValue(order.SHIPPER);
}
}
if (i == 10)
{
//发货人代码
ICell cell = row.GetCell(1);
if (cell != null)
{
row.Cells[1].SetCellValue(order.SHIPPERID);
}
else
{
row.CreateCell(1).SetCellValue(order.SHIPPERID);
}
}
if (i == 11)
{
//收货人
ICell cell = row.GetCell(1);
if (cell != null)
{
row.Cells[1].SetCellValue(order.CONSIGNEE);
}
else
{
row.CreateCell(1).SetCellValue(order.CONSIGNEE);
}
}
if (i == 14)
{
//通知人
ICell cell = row.GetCell(1);
if (cell != null)
{
row.Cells[1].SetCellValue(order.NOTIFYPARTY);
}
else
{
row.CreateCell(1).SetCellValue(order.NOTIFYPARTY);
}
}
if (i == 17)
{
//第二通知人
ICell cell = row.GetCell(1);
if (cell != null)
{
row.Cells[1].SetCellValue(order.NOTIFYPARTY2);
}
else
{
row.CreateCell(1).SetCellValue(order.NOTIFYPARTY2);
}
}
if (i == 18)
{
//起运港国际五字代码
ICell cell = row.GetCell(1);
if (cell != null)
{
row.Cells[1].SetCellValue(order.PORTLOADID);
}
else
{
row.CreateCell(1).SetCellValue(order.PORTLOADID);
}
var service = order.SERVICE;
//运输方式
ICell cell5 = row.GetCell(5);
if (cell5 != null)
{
row.Cells[5].SetCellValue(_cache.GetAllMappingService().Result.Where(x => x.Module == "XiangManCangEDI" && x.Code == service).Select(x => x.MapCode).FirstOrDefault());
}
else
{
row.CreateCell(5).SetCellValue(_cache.GetAllMappingService().Result.Where(x => x.Module == "XiangManCangEDI" && x.Code == service).Select(x => x.MapCode).FirstOrDefault());
}
}
if (i == 19)
{
//卸货港国际五字代码
ICell cell = row.GetCell(1);
if (cell != null)
{
row.Cells[1].SetCellValue(order.PORTDISCHARGEID);
}
else
{
row.CreateCell(1).SetCellValue(order.PORTDISCHARGEID);
}
}
if (i == 20)
{
//交货地国际五字代码
ICell cell = row.GetCell(1);
if (cell != null)
{
row.Cells[1].SetCellValue(order.DESTINATIONID);
}
else
{
row.CreateCell(1).SetCellValue(order.DESTINATIONID);
}
}
if (i == 21)
{
//ETD
if (order.ETD != null)
{
ICell cell = row.GetCell(1);
if (cell != null)
{
row.Cells[1].SetCellValue(Convert.ToDateTime(order.ETD).ToString("yyyy-MM-dd"));
}
else
{
row.CreateCell(1).SetCellValue(Convert.ToDateTime(order.ETD).ToString("yyyy-MM-dd"));
}
}
//船名
ICell cell4 = row.GetCell(4);
if (cell4 != null)
{
row.Cells[4].SetCellValue(order.VESSEL);
}
else
{
row.CreateCell(4).SetCellValue(order.VESSEL);
}
}
if (i == 22)
{
//客户协约号
ICell cell = row.GetCell(1);
if (cell != null)
{
row.Cells[1].SetCellValue(order.CONTRACTNO);
}
else
{
row.CreateCell(1).SetCellValue(order.CONTRACTNO);
}
}
if (i == 23)
{
//航次
ICell cell = row.GetCell(4);
if (cell != null)
{
row.Cells[4].SetCellValue(order.VOYNO);
}
else
{
row.CreateCell(4).SetCellValue(order.VOYNO);
}
}
if (i == 26)
{
//唛头
ICell cell = row.GetCell(0);
if (cell != null)
{
row.Cells[0].SetCellValue(order.MARKS);
}
else
{
row.CreateCell(0).SetCellValue(order.MARKS);
}
if (order.PKGS != null)
{
//件数
ICell cell1 = row.GetCell(1);
if (cell1 != null)
{
row.Cells[1].SetCellValue(order.PKGS.ToString());
}
else
{
row.CreateCell(1).SetCellValue(order.PKGS.ToString());
}
}
//包装
ICell cell2 = row.GetCell(2);
if (cell2 != null)
{
row.Cells[2].SetCellValue(order.KINDPKGS);
}
else
{
row.CreateCell(2).SetCellValue(order.KINDPKGS);
}
//品名
ICell cell3 = row.GetCell(3);
if (cell3 != null)
{
row.Cells[3].SetCellValue(order.DESCRIPTION);
}
else
{
row.CreateCell(3).SetCellValue(order.DESCRIPTION);
}
if (order.KGS != null)
{
//重量
ICell cell4 = row.GetCell(4);
if (cell3 != null)
{
row.Cells[4].SetCellValue(order.KGS.ToString());
}
else
{
row.CreateCell(4).SetCellValue(order.KGS.ToString());
}
}
if (order.CBM != null)
{
//尺码
ICell cell5 = row.GetCell(5);
if (cell5 != null)
{
row.Cells[5].SetCellValue(order.CBM.ToString());
}
else
{
row.CreateCell(5).SetCellValue(order.CBM.ToString());
}
}
}
if (i == 39)
{
var c = ctn.DistinctBy(x => x.CTNALL).ToList();
var ctnAll = string.Empty;
foreach (var item in c)
{
ctnAll += $"{ctn.Where(x => x.CTNALL == item.CTNALL).Count()}*{_cache.GetAllMappingCtn().Result.Where(x => x.Module == "XiangManCangEDI" && x.Code == item.CTNCODE).Select(x => x.MapCode).First()}+";
}
ctnAll = ctnAll.Substring(0, ctnAll.Length - 1);
//箱型箱量
ICell cell = row.GetCell(0);
if (cell != null)
{
row.Cells[0].SetCellValue(ctnAll);
}
else
{
row.CreateCell(0).SetCellValue(ctnAll);
}
}
if (i == 42)
{
//运费支付方式
var BLFRTCode = _cache.GetAllCodeFrt().Result.Where(x => x.EnName == order.BLFRT).Select(x => x.Code).FirstOrDefault();
var bl = string.Empty;
if (!string.IsNullOrEmpty(BLFRTCode))
{
bl = _cache.GetAllMappingFrt().Result.Where(x => x.Module == "XiangManCangEDI" && x.Code == BLFRTCode).Select(x => x.MapCode).FirstOrDefault();
}
ICell cell = row.GetCell(0);
if (cell != null)
{
row.Cells[0].SetCellValue(bl);
}
else
{
row.CreateCell(0).SetCellValue(bl);
}
}
if (i == 43)
{
//hscode
ICell cell = row.GetCell(3);
if (cell != null)
{
row.Cells[3].SetCellValue(order.HSCODE);
}
else
{
row.CreateCell(3).SetCellValue(order.HSCODE);
}
}
if (i == 44)
{
var BLFRTCode = _cache.GetAllCodeFrt().Result.Where(x => x.EnName == order.BLFRT).Select(x => x.Code).FirstOrDefault();
var bl = string.Empty;
if (!string.IsNullOrEmpty(BLFRTCode))
{
bl = _cache.GetAllMappingFrt().Result.Where(x => x.Module == "XiangManCangEDI" && x.Code == BLFRTCode).Select(x => x.MapCode).FirstOrDefault();
}
if (bl == "预付")
{
//预付地点
ICell cell = row.GetCell(1);
if (cell != null)
{
row.Cells[1].SetCellValue(order.PREPARDATID);
}
else
{
row.CreateCell(1).SetCellValue(order.PREPARDATID);
}
}
else if ((bl == "到付"))
{
//预付地点
ICell cell = row.GetCell(1);
if (cell != null)
{
row.Cells[1].SetCellValue(order.PAYABLEATID);
}
else
{
row.CreateCell(1).SetCellValue(order.PAYABLEATID);
}
}
}
if (i == 45)
{
//Name accout
ICell cell = row.GetCell(1);
if (cell != null)
{
row.Cells[1].SetCellValue(edi.EmcNameAccount);
}
else
{
row.CreateCell(1).SetCellValue(edi.EmcNameAccount);
}
}
if (i == 47)
{
//Name accout
ICell cell = row.GetCell(1);
if (cell != null)
{
row.Cells[1].SetCellValue(order.TEMPSET);
}
else
{
row.CreateCell(1).SetCellValue(order.TEMPSET);
}
//温度
ICell cell2 = row.GetCell(2);
if (cell2 != null)
{
row.Cells[2].SetCellValue(order.REEFERF);
}
else
{
row.CreateCell(2).SetCellValue(order.REEFERF);
}
//湿度
ICell cell3 = row.GetCell(3);
if (cell2 != null)
{
row.Cells[3].SetCellValue(order.HUMIDITY);
}
else
{
row.CreateCell(3).SetCellValue(order.HUMIDITY);
}
}
if (i == 49)
{
//危险品编号
ICell cell = row.GetCell(1);
if (cell != null)
{
row.Cells[1].SetCellValue(order.DUNNO);
}
else
{
row.CreateCell(1).SetCellValue(order.DUNNO);
}
}
if (i == 50)
{
//订舱备注
ICell cell = row.GetCell(1);
if (cell != null)
{
row.Cells[1].SetCellValue(order.SOREMARK);
}
else
{
row.CreateCell(1).SetCellValue(order.SOREMARK);
}
}
}
var fileFullPath = Path.Combine(App.WebHostEnvironment.WebRootPath, App.GetOptions().Path);//服务器路径
if (!Directory.Exists(fileFullPath))
{
Directory.CreateDirectory(fileFullPath);
}
//2023-4-3,根据合川操作要求,文件名只带提单号
if (!string.IsNullOrEmpty(order.MBLNO))
{
fileName = $"{DateTime.Now.Ticks}_{order.MBLNO}.xls";//名称
}
else
{
fileName = $"{DateTime.Now.Ticks}_{order.MBLNO}.xls";//名称
}
_logger.LogInformation("导出excel:" + Path.Combine(fileFullPath, fileName));
var filestream = new FileStream(Path.Combine(fileFullPath, fileName), FileMode.OpenOrCreate, FileAccess.ReadWrite);
excelwork.Write(filestream);
#endregion
if (flag)
{
filestream.Close();
filestream.Dispose();
var fpath = Path.Combine(fileFullPath, fileName);
var fInfo = new FileInfo(fpath);
_logger.LogInformation("箱满仓文件地址:" + fpath + " " + fInfo);
return new FileStreamResult(new FileStream(fpath, FileMode.Open), "application/octet-stream") { FileDownloadName = fInfo.Name };
}
#region 调用爬虫接口
var url = _cache.GetAllDictData().Result.Where(x => x.Code == "xiangManCangPostUrl").Select(x => x.Value).FirstOrDefault();
var account = _webAccountConfig.GetAccountConfig("XiangManCang", UserManager.UserId).Result;
if (account == null)
{
throw Oops.Bah("未配置箱满仓账号!");
}
var key = _cache.GetAllSysConfig().Result.Where(x => x.Code == "billTraceNewUserKey").Select(x => x.Value).FirstOrDefault();
if (string.IsNullOrEmpty(key))
{
throw Oops.Bah("未获取到相关KEY,请联系管理员!");
}
var secret = _cache.GetAllSysConfig().Result.Where(x => x.Code == "billTraceNewUserSecret").Select(x => x.Value).FirstOrDefault();
if (string.IsNullOrEmpty(secret))
{
throw Oops.Bah("未获取到相关SECRET,请联系管理员!");
}
////使用HttpClient方式上传文件
var carrier_code = _cache.GetAllMappingCarrier().Result.Where(x => x.Module == "HeChuan" && x.MapCode == order.CARRIERID).Select(x => x.Code).First();
string fn = string.Empty;
using (var httpClient = new HttpClient())
{
using (var request = new HttpRequestMessage(new HttpMethod("Post"), url))
{
//request.Headers.TryAddWithoutValidation("Content-Type", "application/x-www-form-urlencoded");
var multipartContent = new MultipartFormDataContent();
multipartContent.Add(new StringContent("user_key"), key);
multipartContent.Add(new StringContent("user_secret"), secret);
multipartContent.Add(new StringContent("web_user"), account.Account);
multipartContent.Add(new StringContent("web_psw"), account.Password);
multipartContent.Add(new StringContent("carrier_code"), carrier_code);
multipartContent.Add(new StreamContent(filestream, (int)filestream.Length), "file", fileName);
request.Content = multipartContent;
var response = await httpClient.SendAsync(request);
if (response.IsSuccessStatusCode)
{
var strRtn = response.Content.ReadAsStringAsync().Result;
var jobj = strRtn.ToJObject();
if (jobj.GetIntValue("code") == 200)
{
fn = jobj.GetStringValue("msg");
}
else
{
throw Oops.Bah(jobj.GetStringValue("msg"));
}
}
}
}
return fn;
#endregion
}
[NonAction]
public async Task