using Furion ;
using Furion.DependencyInjection ;
using Furion.DistributedIDGenerator ;
using Furion.DynamicApiController ;
using Furion.FriendlyException ;
using Furion.JsonSerialization ;
using ICSharpCode.SharpZipLib.Zip ;
using Mapster ;
using Microsoft.AspNetCore.Mvc ;
using Microsoft.Extensions.Logging ;
using Myshipping.Application.ConfigOption ;
using Myshipping.Application.Entity ;
using Myshipping.Application.Entity.TaskManagePlat ;
using Myshipping.Application.Helper ;
using Myshipping.Application.Service ;
using Myshipping.Core ;
using Myshipping.Core.Service ;
using NPOI.OpenXmlFormats.Dml.Diagram ;
using Org.BouncyCastle.Asn1.X9 ;
using RabbitMQ.Client ;
using System ;
using System.Collections.Generic ;
using System.IO ;
using System.Linq ;
using System.Net.Http ;
using System.Net.Http.Headers ;
using System.Text ;
using System.Threading.Tasks ;
using Yitter.IdGenerator ;
namespace Myshipping.Application
{
/// <summary>
/// 截单回执
/// </summary>
[ApiDescriptionSettings("Application", Name = "TaskManageSISubmitted", Order = 10)]
public class TaskManageSISubmittedService : ITaskManageSISubmittedService , IDynamicApiController , ITransient
{
private readonly SqlSugarRepository < TaskSISubmitted > _taskSISubmittedRepository ;
private readonly SqlSugarRepository < TaskSISubmittedCtn > _taskSISubmittedCtnRepository ;
private readonly SqlSugarRepository < TaskBaseInfo > _taskBaseRepository ;
private readonly SqlSugarRepository < BookingOrder > _bookingOrderRepository ;
private readonly SqlSugarRepository < BookingCtn > _bookingCtnRepository ;
private readonly SqlSugarRepository < BookingCtnDetail > _bookingOrderContaCargoRepository ;
private readonly SqlSugarRepository < BusinessCompareDiffRecord > _businessCompareDiffRecordRepository ;
private readonly SqlSugarRepository < TaskFileInfo > _taskFileRepository ;
private readonly SqlSugarRepository < BookingFile > _bookingFileRepository ;
private readonly ILogger < TaskManageSISubmittedService > _logger ;
private readonly IBookingValueAddedService _bookingValueAddedService ;
private readonly IDjyTenantParamService _djyTenantParamService ;
private readonly IBookingOrderService _bookingOrderService ;
//租户SI回执是否自动更新订舱
const string CONST_SI_SUBMITTED_DEFAULT_PARAM = "SI_SUBMITTED_AUTO_UPDATE_ORDER" ;
public TaskManageSISubmittedService ( ILogger < TaskManageSISubmittedService > logger ,
SqlSugarRepository < TaskSISubmitted > taskSISubmittedRepository ,
SqlSugarRepository < TaskBaseInfo > taskBaseRepository ,
SqlSugarRepository < BookingOrder > bookingOrderRepository ,
SqlSugarRepository < BusinessCompareDiffRecord > businessCompareDiffRecordRepository ,
SqlSugarRepository < BookingCtn > bookingCtnRepository ,
SqlSugarRepository < TaskSISubmittedCtn > taskSISubmittedCtnRepository ,
SqlSugarRepository < TaskFileInfo > taskFileRepository ,
SqlSugarRepository < BookingFile > bookingFileRepository ,
SqlSugarRepository < BookingCtnDetail > bookingOrderContaCargoRepository ,
IBookingValueAddedService bookingValueAddedService , IDjyTenantParamService djyTenantParamService ,
IBookingOrderService bookingOrderService )
{
_logger = logger ;
_taskSISubmittedRepository = taskSISubmittedRepository ;
_taskBaseRepository = taskBaseRepository ;
_bookingOrderRepository = bookingOrderRepository ;
_bookingValueAddedService = bookingValueAddedService ;
_djyTenantParamService = djyTenantParamService ;
_businessCompareDiffRecordRepository = businessCompareDiffRecordRepository ;
_bookingCtnRepository = bookingCtnRepository ;
_taskSISubmittedCtnRepository = taskSISubmittedCtnRepository ;
_bookingOrderService = bookingOrderService ;
_taskFileRepository = taskFileRepository ;
_bookingFileRepository = bookingFileRepository ;
_bookingOrderContaCargoRepository = bookingOrderContaCargoRepository ;
}
#region 获取截单回执详情
/// <summary>
/// 获取截单回执详情
/// </summary>
/// <param name="pkId">截单回执主键</param>
/// <returns>返回回执</returns>
[HttpGet("/TaskManageSISubmitted/GetInfo")]
public async Task < TaskSISubmittedShowDto > GetInfo ( string pkId )
{
TaskSISubmittedShowDto dto = new TaskSISubmittedShowDto ( ) ;
var siSubmitted = _taskSISubmittedRepository . AsQueryable ( ) . First ( a = > a . PK_ID = = pkId ) ;
if ( siSubmitted = = null )
throw Oops . Oh ( $"截单回执主键{pkId}无法获取业务信息" ) ;
var taskBase = _taskBaseRepository . AsQueryable ( ) . First ( a = > a . PK_ID = = siSubmitted . TASK_ID ) ;
if ( taskBase = = null )
throw Oops . Oh ( $"任务主键无法获取业务信息" ) ;
dto = siSubmitted . Adapt < TaskSISubmittedShowDto > ( ) ;
if ( dto ! = null )
{
dto . IsComplete = taskBase . IS_COMPLETE = = 1 ? true : false ;
dto . CompleteTime = taskBase . COMPLETE_DATE ;
}
return dto ;
}
# endregion
#region 通过任务主键获取截单回执详情
/// <summary>
/// 通过任务主键获取截单回执详情
/// </summary>
/// <param name="taskPkId">截单回执任务主键</param>
/// <returns>返回回执</returns>
[HttpGet("/TaskManageSISubmitted/GetInfoByTaskId")]
public async Task < TaskSISubmittedShowDto > GetInfoByTaskId ( string taskPkId )
{
TaskSISubmittedShowDto dto = new TaskSISubmittedShowDto ( ) ;
var taskBase = _taskBaseRepository . AsQueryable ( ) . First ( a = > a . PK_ID = = taskPkId ) ;
if ( taskBase = = null )
throw Oops . Oh ( $"任务主键{taskPkId}无法获取业务信息" ) ;
var siSubmitted = _taskSISubmittedRepository . AsQueryable ( ) . First ( a = > a . TASK_ID = = taskBase . PK_ID ) ;
if ( siSubmitted = = null )
throw Oops . Oh ( $"截单回执主键{taskPkId}无法获取业务信息" ) ;
dto = siSubmitted . Adapt < TaskSISubmittedShowDto > ( ) ;
if ( dto ! = null )
{
dto . IsComplete = taskBase . IS_COMPLETE = = 1 ? true : false ;
dto . CompleteTime = taskBase . COMPLETE_DATE ;
}
return dto ;
}
# endregion
#region 同步更新订舱订单的截单状态
/// <summary>
/// 同步更新订舱订单的截单状态
/// </summary>
/// <param name="taskPkId">截单回执任务主键</param>
/// <returns>返回回执</returns>
[HttpGet("/TaskManageSISubmitted/SyncBookingSIStatus")]
public async Task < TaskManageOrderResultDto > SyncBookingSIStatus ( string taskPkId )
{
TaskManageOrderResultDto result = new TaskManageOrderResultDto ( ) ;
var taskBase = _taskBaseRepository . AsQueryable ( ) . First ( a = > a . PK_ID = = taskPkId ) ;
if ( taskBase = = null )
throw Oops . Oh ( $"任务主键{taskPkId}无法获取业务信息" ) ;
var siSubmitted = _taskSISubmittedRepository . AsQueryable ( ) . First ( a = > a . TASK_ID = = taskBase . PK_ID ) ;
if ( siSubmitted = = null )
throw Oops . Oh ( $"截单回执主键{taskPkId}无法获取业务信息" ) ;
if ( ! siSubmitted . BOOKING_ID . HasValue | | siSubmitted . BOOKING_ID . Value < 1 )
throw Oops . Oh ( $"当前截单回执未匹配到对应的订舱订单,请重对应截单" ) ;
var bookingOrder = _bookingOrderRepository . AsQueryable ( )
. FirstAsync ( a = > a . Id = = siSubmitted . BOOKING_ID . Value ) ;
if ( bookingOrder = = null )
throw Oops . Oh ( $"订舱订单信息获取失败" ) ;
//推送截单货物状态
var pushModel = new ModifyServiceProjectStatusDto
{
BookingId = bookingOrder . Id ,
SourceType = TrackingSourceTypeEnum . AUTO ,
StatusCodes = new List < ModifyServiceProjectStatusDetailDto > {
new ModifyServiceProjectStatusDetailDto { StatusCode = "JD" } }
} ;
if ( siSubmitted . NOTICE_DATE . HasValue )
{
pushModel . StatusCodes [ 0 ] . SetActDate = siSubmitted . NOTICE_DATE . Value ;
}
var saveStatusRlt = await _bookingValueAddedService . SaveServiceStatus ( pushModel ) ;
_logger . LogInformation ( "请求JSON={json} 异步推送服务状态[JD 截单]完成,结果={rlt}" , JSON . Serialize ( pushModel ) , JSON . Serialize ( saveStatusRlt ) ) ;
result . succ = true ;
result . msg = "成功" ;
return result ;
}
# endregion
#region 重新处理截单任务
/// <summary>
/// 重新处理截单任务
/// 对未匹配订舱订单的任务记录重新对应订舱订单
/// </summary>
/// <param name="taskPkId">截单回执任务主键</param>
/// <returns>返回回执</returns>
[HttpGet("/TaskManageSISubmitted/SearchAndConnectBookingInfo")]
public async Task < TaskManageOrderResultDto > SearchAndConnectBookingInfo ( string taskPkId )
{
TaskManageOrderResultDto result = new TaskManageOrderResultDto ( ) ;
var taskBase = _taskBaseRepository . AsQueryable ( ) . First ( a = > a . PK_ID = = taskPkId ) ;
if ( taskBase = = null )
throw Oops . Oh ( $"任务主键{taskPkId}无法获取业务信息" ) ;
var siSubmitted = _taskSISubmittedRepository . AsQueryable ( ) . First ( a = > a . TASK_ID = = taskBase . PK_ID ) ;
if ( siSubmitted = = null )
throw Oops . Oh ( $"截单回执主键{taskPkId}无法获取业务信息" ) ;
if ( siSubmitted . BOOKING_ID . HasValue )
throw Oops . Oh ( $"当前截单回执已有匹配的订舱订单" ) ;
string mblNo = siSubmitted . MBL_NO . ToUpper ( ) . Trim ( ) ;
var bookingInfo = _bookingOrderRepository . AsQueryable ( ) . Filter ( null , true )
. FirstAsync ( a = > a . MBLNO = = mblNo & & a . IsDeleted = = false & & ( a . ParentId = = null | | a . ParentId = = 0 ) & & a . TenantId = = UserManager . TENANT_ID ) ;
if ( bookingInfo = = null )
throw Oops . Oh ( $"提单号{mblNo}未提取有效的订舱订单" ) ;
siSubmitted . BOOKING_ID = bookingInfo . Id ;
siSubmitted . UpdatedUserId = UserManager . UserId ;
siSubmitted . UpdatedUserName = UserManager . Name ;
//更新任务BC
await _taskSISubmittedRepository . AsUpdateable ( siSubmitted ) . UpdateColumns ( it = > new
{
it . BOOKING_ID ,
it . UpdatedTime ,
it . UpdatedUserId ,
it . UpdatedUserName
} ) . ExecuteCommandAsync ( ) ;
result . succ = true ;
result . msg = "成功" ;
return result ;
}
# endregion
#region 处理SI截单回执
/// <summary>
/// 处理SI截单回执
/// </summary>
/// <param name="taskPkId">截单回执任务主键</param>
/// <returns>返回回执</returns>
public async Task < TaskManageOrderResultDto > ProcessSISubmitted ( string taskPkId )
{
TaskManageOrderResultDto result = new TaskManageOrderResultDto ( ) ;
TaskSISubmitted siSubmitted = null ;
try
{
/ *
1 、 判 断 当 前 租 户 开 启 了 自 动 更 新 订 舱 数 据 ( SI_SUBMITTED_AUTO_UPDATE_ORDER = ENABLE )
2 、 先 与 订 舱 数 据 进 行 比 对 , 记 录 比 对 结 果 。
3 、 更 新 订 舱 详 情
4 、 文 件 挂 到 订 舱 的 附 件 上
* /
var taskBase = _taskBaseRepository . AsQueryable ( ) . Filter ( null , true ) . First ( a = > a . PK_ID = = taskPkId & & a . TenantId = = UserManager . TENANT_ID ) ;
if ( taskBase = = null )
throw Oops . Oh ( $"任务主键{taskPkId}无法获取业务信息" ) ;
siSubmitted = _taskSISubmittedRepository . AsQueryable ( ) . Filter ( null , true ) . First ( a = > a . TASK_ID = = taskBase . PK_ID & & a . TenantId = = UserManager . TENANT_ID ) ;
if ( siSubmitted = = null )
throw Oops . Oh ( $"截单回执主键{taskPkId}无法获取业务信息" ) ;
if ( siSubmitted . BOOKING_ID . HasValue )
throw Oops . Oh ( $"当前截单回执已有匹配的订舱订单" ) ;
DjyTenantParamValueOutput paramConfig = null ;
var paramList = _djyTenantParamService . GetParaCodeWithValue ( new [ ] { CONST_SI_SUBMITTED_DEFAULT_PARAM } ) . GetAwaiter ( ) . GetResult ( ) ;
if ( paramList ! = null & & paramList . Count > 0 )
{
paramConfig = paramList . FirstOrDefault ( a = > a . ParaCode . Equals ( CONST_SI_SUBMITTED_DEFAULT_PARAM , StringComparison . OrdinalIgnoreCase ) ) ;
}
var siCtnList = _taskSISubmittedCtnRepository . AsQueryable ( ) . Filter ( null , true ) . Where ( a = > a . P_PKID = = siSubmitted . PK_ID & & a . TenantId = = UserManager . TENANT_ID ) . ToList ( ) ;
var orderInfo = _bookingOrderRepository . AsQueryable ( ) . Filter ( null , true )
. First ( a = > ( ( a . MBLNO = = siSubmitted . MBL_NO ) | | ( a . SPLIT_OR_MERGE_FLAG ! = null & & a . SPLIT_OR_MERGE_FLAG = = 1 & & a . CUSTNO = = siSubmitted . MBL_NO ) ) & & a . IsDeleted = = false
& & a . TenantId = = UserManager . TENANT_ID & & ( a . ParentId = = 0 | | a . ParentId = = null ) ) ;
if ( paramConfig ! = null & & paramConfig . ParaValue . Equals ( "ENABLE" , StringComparison . OrdinalIgnoreCase ) )
{
siSubmitted . IS_SET_AUTO_UPD_BOOKING = true ;
_logger . LogInformation ( $"taskPkId={taskPkId} 提单号{siSubmitted.MBL_NO} 配置了自动更新订舱详情" ) ;
if ( orderInfo ! = null )
{
_logger . LogInformation ( $"taskPkId={taskPkId} 提单号{siSubmitted.MBL_NO} 获取了订舱详情完成 bookingid={orderInfo.Id}" ) ;
siSubmitted . BOOKING_ID = orderInfo . Id ;
var ctnList = _bookingCtnRepository . AsQueryable ( ) . Filter ( null , true )
. Where ( a = > a . BILLID = = orderInfo . Id & & a . IsDeleted = = false & & a . TenantId = = UserManager . TENANT_ID ) . ToList ( ) ;
_logger . LogInformation ( $"taskPkId={taskPkId} 提单号{siSubmitted.MBL_NO} 获取订舱集装箱列表完成 ctnnum={ctnList.Count}" ) ;
SIFeedBackCompareDto siSrcDto = orderInfo . Adapt < SIFeedBackCompareDto > ( ) ;
if ( ctnList . Count > 0 )
{
siSrcDto . ContaList = ctnList . Select ( t = > new SIFeedBackCompareContaDto
{
ContaNo = t . CNTRNO ,
SealNo = t . SEALNO ,
ContaType = t . CTNCODE ,
ContaTypeName = t . CTNALL ,
PKGS = t . PKGS . HasValue ? t . PKGS . Value : 0 ,
CBM = t . CBM ,
KGS = t . KGS ,
WeighType = t . WEIGHTYPE = = "累加" ? "ADD" : "ALL" ,
WeighKGS = t . WEIGHKGS
} ) . ToList ( ) ;
}
SIFeedBackCompareDto siTargetDto = siSubmitted . Adapt < SIFeedBackCompareDto > ( ) ;
if ( siCtnList . Count > 0 )
{
siTargetDto . ContaList = siCtnList . Select ( t = > new SIFeedBackCompareContaDto
{
ContaNo = t . CNTRNO ,
SealNo = t . SEALNO ,
ContaType = t . CTNCODE ,
ContaTypeName = t . CTNALL ,
PKGS = t . PKGS . HasValue ? t . PKGS . Value : 0 ,
CBM = t . CBM ,
KGS = t . KGS ,
WeighType = t . WEIGHTYPE ,
WeighKGS = t . WEIGHKGS
} ) . ToList ( ) ;
}
_logger . LogInformation ( $"taskPkId={taskPkId} 提单号{siSubmitted.MBL_NO} 开始比对" ) ;
//更新前先比对一遍差异
var compareRlt = await PushCompareSIInfo ( siSrcDto , siTargetDto , orderInfo . Id , taskPkId ) ;
if ( string . IsNullOrWhiteSpace ( compareRlt . Item1 ) )
{
siSubmitted . DIFF_NUM = compareRlt . Item2 ;
}
_logger . LogInformation ( $"taskPkId={taskPkId} 提单号{siSubmitted.MBL_NO} 获取比对完成 结果={JSON.Serialize(compareRlt)}" ) ;
SaveBookingOrderInput bkModel = null ;
if ( orderInfo ! = null )
{
bkModel = new SaveBookingOrderInput
{
Id = orderInfo . Id ,
MBLNO = orderInfo . MBLNO ,
ctnInputs = new List < BookingCtnDto > ( ) ,
ChangedFields = new List < string > ( )
} ;
if ( ! string . IsNullOrEmpty ( siSubmitted . ISSUETYPE ) )
{
if ( siSubmitted . ISSUETYPE . Equals ( "seaway" , StringComparison . OrdinalIgnoreCase ) )
{
//bkModel.ISSUETYPE = "seaway";
bkModel . ISSUETYPE = "Seaway Bill" ;
}
else if ( siSubmitted . ISSUETYPE . Equals ( "telex" , StringComparison . OrdinalIgnoreCase ) )
{
//bkModel.ISSUETYPE = "telex";
bkModel . ISSUETYPE = "Telex" ;
}
else if ( siSubmitted . ISSUETYPE . Equals ( "original" , StringComparison . OrdinalIgnoreCase ) )
{
//bkModel.ISSUETYPE = "original";
bkModel . ISSUETYPE = "Original" ;
}
bkModel . ChangedFields . Add ( nameof ( SaveBookingOrderInput . ISSUETYPE ) ) ;
//bkModel.ChangedFields.Add(nameof(SaveBookingOrderInput.ISSUETYPE));
}
if ( ! string . IsNullOrEmpty ( siSubmitted . SHIPPER ) )
{
bkModel . SHIPPER = siSubmitted . SHIPPER ;
bkModel . ChangedFields . Add ( nameof ( SaveBookingOrderInput . SHIPPER ) ) ;
}
if ( ! string . IsNullOrEmpty ( siSubmitted . CONSIGNEE ) )
{
bkModel . CONSIGNEE = siSubmitted . CONSIGNEE ;
bkModel . ChangedFields . Add ( nameof ( SaveBookingOrderInput . CONSIGNEE ) ) ;
}
if ( ! string . IsNullOrEmpty ( siSubmitted . NOTIFYPARTY ) )
{
bkModel . NOTIFYPARTY = siSubmitted . NOTIFYPARTY ;
bkModel . ChangedFields . Add ( nameof ( SaveBookingOrderInput . NOTIFYPARTY ) ) ;
}
if ( ! string . IsNullOrEmpty ( siSubmitted . NOTIFYPARTY2 ) )
{
bkModel . NOTIFYPARTY2 = siSubmitted . NOTIFYPARTY2 ;
bkModel . ChangedFields . Add ( nameof ( SaveBookingOrderInput . NOTIFYPARTY2 ) ) ;
}
if ( ! string . IsNullOrEmpty ( siSubmitted . KINDPKGS ) )
{
bkModel . KINDPKGS = siSubmitted . KINDPKGS ;
bkModel . ChangedFields . Add ( nameof ( SaveBookingOrderInput . KINDPKGS ) ) ;
}
if ( ! string . IsNullOrEmpty ( siSubmitted . DESCRIPTION ) )
{
bkModel . DESCRIPTION = siSubmitted . DESCRIPTION ;
bkModel . ChangedFields . Add ( nameof ( SaveBookingOrderInput . DESCRIPTION ) ) ;
}
if ( ! string . IsNullOrEmpty ( siSubmitted . HSCODE ) )
{
bkModel . HSCODE = siSubmitted . HSCODE ;
bkModel . ChangedFields . Add ( nameof ( SaveBookingOrderInput . HSCODE ) ) ;
}
if ( ! string . IsNullOrEmpty ( siSubmitted . MARKS ) )
{
bkModel . MARKS = siSubmitted . MARKS ;
bkModel . ChangedFields . Add ( nameof ( SaveBookingOrderInput . MARKS ) ) ;
}
}
if ( ctnList . Count > 0 )
{
List < BookingCtn > oddCtnList = new List < BookingCtn > ( ) ;
foreach ( var ctn in ctnList )
{
if ( ! string . IsNullOrWhiteSpace ( ctn . CTNCODE ) & & string . IsNullOrWhiteSpace ( ctn . CNTRNO ) & & ctn . CTNNUM . HasValue & & ctn . CTNNUM . Value > 1 )
{
for ( int i = 0 ; i < ctn . CTNNUM . Value - 1 ; i + + )
{
oddCtnList . Add ( new BookingCtn
{
BILLID = orderInfo . Id ,
IsDeleted = false ,
CreatedTime = DateTime . Now ,
UpdatedTime = DateTime . Now ,
CreatedUserId = ctn . CreatedUserId ,
CreatedUserName = ctn . CreatedUserName ,
CTNCODE = ctn . CTNCODE ,
CTNALL = ctn . CTNALL ,
} ) ;
}
ctn . CTNNUM = 1 ;
}
}
if ( oddCtnList . Count > 0 )
{
ctnList . AddRange ( oddCtnList ) ;
}
}
if ( siCtnList . Count > 0 )
{
bkModel . KGS = siCtnList . Sum ( x = > x . KGS . HasValue ? x . KGS . Value : 0 ) ;
bkModel . ChangedFields . Add ( nameof ( SaveBookingOrderInput . KGS ) ) ;
bkModel . PKGS = siCtnList . Sum ( x = > x . PKGS . HasValue ? x . PKGS . Value : 0 ) ;
bkModel . ChangedFields . Add ( nameof ( SaveBookingOrderInput . PKGS ) ) ;
bkModel . CBM = siCtnList . Sum ( x = > x . CBM . HasValue ? x . CBM . Value : 0 ) ;
bkModel . ChangedFields . Add ( nameof ( SaveBookingOrderInput . CBM ) ) ;
siCtnList . ForEach ( x = >
{
var ctn = ctnList . FirstOrDefault ( a = > ! string . IsNullOrWhiteSpace ( x . CNTRNO ) & & ! string . IsNullOrWhiteSpace ( a . CNTRNO )
& & a . CNTRNO . Equals ( x . CNTRNO , StringComparison . OrdinalIgnoreCase ) ) ;
if ( ctn ! = null )
{
ctn . CTNCODE = x . CTNCODE ;
ctn . CTNALL = x . CTNALL ;
ctn . CTNNUM = 1 ;
ctn . SEALNO = x . SEALNO ;
ctn . PKGS = x . PKGS ;
ctn . KGS = x . KGS ;
ctn . WEIGHTYPE = x . WEIGHTYPE ;
ctn . WEIGHKGS = x . WEIGHKGS ;
ctn . CBM = x . CBM ;
ctn . REMARK + = "SI Add" ;
ctn . TenantId = UserManager . TENANT_ID ;
ctn . CreatedTime = DateTime . Now ;
ctn . CreatedUserId = UserManager . UserId ;
ctn . CreatedUserName = UserManager . Name ;
ctn . KINDPKGS = x . KINDPKGS ;
if ( string . IsNullOrWhiteSpace ( x . KINDPKGS ) & & ! string . IsNullOrWhiteSpace ( siSubmitted . KINDPKGS ) )
ctn . KINDPKGS = siSubmitted . KINDPKGS ;
if ( x . WEIGHKGS . HasValue & & x . KGS . HasValue )
ctn . TAREWEIGHT = x . WEIGHKGS . Value - x . KGS . Value ;
}
else
{
ctn = ctnList . FirstOrDefault ( a = > a . CTNCODE = = x . CTNCODE & & string . IsNullOrWhiteSpace ( a . CNTRNO ) ) ;
if ( ctn ! = null )
{
ctn . CNTRNO = x . CNTRNO ;
ctn . CTNCODE = x . CTNCODE ;
ctn . CTNALL = x . CTNALL ;
ctn . CTNNUM = 1 ;
ctn . SEALNO = x . SEALNO ;
ctn . PKGS = x . PKGS ;
ctn . KGS = x . KGS ;
ctn . WEIGHTYPE = x . WEIGHTYPE ;
ctn . WEIGHKGS = x . WEIGHKGS ;
ctn . CBM = x . CBM ;
ctn . REMARK + = "SI Add" ;
ctn . TenantId = UserManager . TENANT_ID ;
ctn . CreatedTime = DateTime . Now ;
ctn . CreatedUserId = UserManager . UserId ;
ctn . CreatedUserName = UserManager . Name ;
ctn . KINDPKGS = x . KINDPKGS ;
if ( string . IsNullOrWhiteSpace ( x . KINDPKGS ) & & ! string . IsNullOrWhiteSpace ( siSubmitted . KINDPKGS ) )
ctn . KINDPKGS = siSubmitted . KINDPKGS ;
if ( x . WEIGHKGS . HasValue & & x . KGS . HasValue )
ctn . TAREWEIGHT = x . WEIGHKGS . Value - x . KGS . Value ;
}
else
{
ctn = ctnList . FirstOrDefault ( a = > a . CTNALL = = x . CTNALL & & string . IsNullOrWhiteSpace ( a . CNTRNO ) ) ;
if ( ctn ! = null )
{
ctn . CNTRNO = x . CNTRNO ;
ctn . CTNCODE = x . CTNCODE ;
ctn . CTNALL = x . CTNALL ;
ctn . CTNNUM = 1 ;
ctn . SEALNO = x . SEALNO ;
ctn . PKGS = x . PKGS ;
ctn . KGS = x . KGS ;
ctn . WEIGHTYPE = x . WEIGHTYPE ;
ctn . WEIGHKGS = x . WEIGHKGS ;
ctn . CBM = x . CBM ;
ctn . REMARK + = "SI Add" ;
ctn . TenantId = UserManager . TENANT_ID ;
ctn . CreatedTime = DateTime . Now ;
ctn . CreatedUserId = UserManager . UserId ;
ctn . CreatedUserName = UserManager . Name ;
ctn . KINDPKGS = x . KINDPKGS ;
if ( string . IsNullOrWhiteSpace ( x . KINDPKGS ) & & ! string . IsNullOrWhiteSpace ( siSubmitted . KINDPKGS ) )
ctn . KINDPKGS = siSubmitted . KINDPKGS ;
if ( x . WEIGHKGS . HasValue & & x . KGS . HasValue )
ctn . TAREWEIGHT = x . WEIGHKGS . Value - x . KGS . Value ;
}
else
{
ctnList . Add ( new BookingCtn
{
BILLID = orderInfo . Id ,
IsDeleted = false ,
CreatedTime = DateTime . Now ,
UpdatedTime = DateTime . Now ,
CreatedUserId = UserManager . UserId ,
CreatedUserName = UserManager . Name ,
TenantId = UserManager . TENANT_ID ,
CNTRNO = x . CNTRNO ,
CTNCODE = x . CTNCODE ,
CTNALL = x . CTNALL ,
CTNNUM = 1 ,
SEALNO = x . SEALNO ,
PKGS = x . PKGS ,
KGS = x . KGS ,
WEIGHTYPE = x . WEIGHTYPE ,
WEIGHKGS = x . WEIGHKGS ,
CBM = x . CBM ,
REMARK = "SI Add" ,
TAREWEIGHT = x . WEIGHKGS . HasValue & & x . KGS . HasValue ? x . WEIGHKGS . Value - x . KGS . Value : 0 ,
KINDPKGS = ( string . IsNullOrWhiteSpace ( x . KINDPKGS ) & & ! string . IsNullOrWhiteSpace ( siSubmitted . KINDPKGS ) ) ? siSubmitted . KINDPKGS : x . KINDPKGS ,
} ) ;
}
}
}
} ) ;
if ( ctnList . Any ( t = > string . IsNullOrWhiteSpace ( t . REMARK ) | | t . REMARK . IndexOf ( "SI Add" ) < 0 ) )
{
ctnList = ctnList . Where ( t = > ! string . IsNullOrWhiteSpace ( t . REMARK ) & & t . REMARK . IndexOf ( "SI Add" ) > = 0 ) . ToList ( ) ;
}
}
if ( ctnList . Count > 0 )
{
bkModel . ctnInputs = ctnList . Select ( t = > new BookingCtnDto
{
BILLID = t . BILLID ,
CNTRNO = t . CNTRNO ,
CTNALL = t . CTNALL ,
CTNCODE = t . CTNCODE ,
CTNNUM = t . CTNNUM . HasValue ? t . CTNNUM . Value : 0 ,
CBM = t . CBM . HasValue ? t . CBM . Value : 0 ,
KINDPKGS = t . KINDPKGS ,
PKGS = t . PKGS . HasValue ? t . PKGS . Value : 0 ,
SEALNO = t . SEALNO ,
KGS = t . KGS . HasValue ? t . KGS . Value : 0 ,
TAREWEIGHT = t . TAREWEIGHT . HasValue ? t . TAREWEIGHT . Value : 0 ,
WEIGHKGS = t . WEIGHKGS . HasValue ? t . WEIGHKGS . Value : 0 ,
WEIGHTYPE = t . WEIGHTYPE ,
Id = t . Id ,
} ) . ToList ( ) ;
}
_logger . LogInformation ( $"taskPkId={taskPkId} 提单号{siSubmitted.MBL_NO} 准备更新订舱数据完更" ) ;
//更新订舱数据
var bkRlt = await _bookingOrderService . Save ( bkModel ) ;
if ( bkRlt . Id > 0 )
{
_logger . LogInformation ( $"taskPkId={taskPkId} 提单号{siSubmitted.MBL_NO} 更新订舱数据成功" ) ;
//推送截单货物状态
var pushModel = new ModifyServiceProjectStatusDto
{
BookingId = bkRlt . Id ,
SourceType = TrackingSourceTypeEnum . AUTO ,
StatusCodes = new List < ModifyServiceProjectStatusDetailDto > {
new ModifyServiceProjectStatusDetailDto { StatusCode = "JD" } }
} ;
if ( siSubmitted . NOTICE_DATE . HasValue )
{
pushModel . StatusCodes [ 0 ] . SetActDate = siSubmitted . NOTICE_DATE . Value ;
}
var saveStatusRlt = await _bookingValueAddedService . SaveServiceStatus ( pushModel ) ;
_logger . LogInformation ( $"taskPkId={taskPkId} 提单号{siSubmitted.MBL_NO} 推送截单状态完成 结果={JSON.Serialize(saveStatusRlt)}" ) ;
siSubmitted . PROCESS_STATUS = "SUCC" ;
siSubmitted . PROCESS_DATE = DateTime . Now ;
siSubmitted . IS_UPDATE_BOOKING = true ;
siSubmitted . UPDATE_BOOKING_DATE = DateTime . Now ;
//直接完成SI的回执任务
if ( taskBase . IS_PUBLIC = = 1 )
{
//更新任务的状态
taskBase . IS_PUBLIC = 0 ;
taskBase . IS_COMPLETE = 1 ;
taskBase . COMPLETE_DEAL = "AUTO" ;
taskBase . COMPLETE_DEAL_NAME = "自动" ;
taskBase . COMPLETE_DATE = DateTime . Now ;
if ( ! string . IsNullOrWhiteSpace ( orderInfo . OP ) )
{
taskBase . RealUserId = long . Parse ( orderInfo . OPID ) ;
taskBase . RealUserName = orderInfo . OP ;
taskBase . UpdatedTime = DateTime . Now ;
taskBase . UpdatedUserId = long . Parse ( orderInfo . OPID ) ;
taskBase . UpdatedUserName = orderInfo . OP ;
}
else
{
taskBase . RealUserId = orderInfo . CreatedUserId . Value ;
taskBase . RealUserName = orderInfo . CreatedUserName ;
taskBase . UpdatedTime = DateTime . Now ;
taskBase . UpdatedUserId = orderInfo . CreatedUserId . Value ;
taskBase . UpdatedUserName = orderInfo . CreatedUserName ;
}
//更新任务台,将当前任务变更为个人任务
await _taskBaseRepository . AsUpdateable ( taskBase ) . UpdateColumns ( it = > new {
it . IS_PUBLIC ,
it . RealUserId ,
it . RealUserName ,
it . UpdatedTime ,
it . UpdatedUserId ,
it . UpdatedUserName
} ) . ExecuteCommandAsync ( ) ;
}
else
{
taskBase . IS_COMPLETE = 1 ;
taskBase . COMPLETE_DEAL = "AUTO" ;
taskBase . COMPLETE_DEAL_NAME = "自动" ;
taskBase . COMPLETE_DATE = DateTime . Now ;
if ( ! string . IsNullOrWhiteSpace ( orderInfo . OP ) )
{
taskBase . RealUserId = long . Parse ( orderInfo . OPID ) ;
taskBase . RealUserName = orderInfo . OP ;
taskBase . UpdatedTime = DateTime . Now ;
taskBase . UpdatedUserId = long . Parse ( orderInfo . OPID ) ;
taskBase . UpdatedUserName = orderInfo . OP ;
}
else
{
taskBase . RealUserId = orderInfo . CreatedUserId . Value ;
taskBase . RealUserName = orderInfo . CreatedUserName ;
taskBase . UpdatedTime = DateTime . Now ;
taskBase . UpdatedUserId = orderInfo . CreatedUserId . Value ;
taskBase . UpdatedUserName = orderInfo . CreatedUserName ;
}
//更新任务台,将当前任务变更为个人任务
await _taskBaseRepository . AsUpdateable ( taskBase ) . UpdateColumns ( it = > new {
it . IS_PUBLIC ,
it . RealUserId ,
it . RealUserName ,
it . UpdatedTime ,
it . UpdatedUserId ,
it . UpdatedUserName
} ) . ExecuteCommandAsync ( ) ;
}
//处理附件
var opt = App . GetOptions < BookingAttachOptions > ( ) ;
var dirAbs = opt . basePath ;
if ( string . IsNullOrEmpty ( dirAbs ) )
{
dirAbs = App . WebHostEnvironment . WebRootPath ;
}
string batchNo = IDGen . NextID ( ) . ToString ( ) ;
var fileList = _taskFileRepository . AsQueryable ( ) . Filter ( null , true ) . Where ( a = > a . TASK_PKID = = taskPkId & & a . TenantId = = taskBase . TenantId . Value ) . ToList ( ) ;
fileList . ForEach ( file = >
{
if ( file . FILE_CATEGORY = = TaskFileCategoryEnum . SI_SUBMITTED . ToString ( ) )
{
var fileFullPath = Path . Combine ( dirAbs , file . FILE_PATH ) ;
if ( File . Exists ( fileFullPath ) )
{
//如果确认文件读取成功
var bookFilePath = FileAttachHelper . MoveFile ( bkRlt . Id . ToString ( ) , fileFullPath , batchNo
, false , null , true ) . GetAwaiter ( ) . GetResult ( ) ;
//将格式单附件写入订舱的附件
SaveEDIFile ( bkRlt . Id , bookFilePath , new System . IO . FileInfo ( bookFilePath ) . Name , taskBase . TenantId . Value ) . GetAwaiter ( ) ;
}
}
} ) ;
_logger . LogInformation ( $"taskPkId={taskPkId} 提单号{siSubmitted.MBL_NO} 上传订舱数据附件完成" ) ;
result . succ = true ;
result . msg = "处理成功" ;
_logger . LogInformation ( $"taskPkId={taskPkId} 提单号{siSubmitted.MBL_NO} 更新完成" ) ;
}
else
{
siSubmitted . PROCESS_STATUS = "FAILURE" ;
siSubmitted . PROCESS_DATE = DateTime . Now ;
siSubmitted . PROCESS_RESULT = "更新订舱信息失败" ;
siSubmitted . UPDATE_BOOKING_DATE = DateTime . Now ;
result . succ = false ;
result . msg = "处理失败" ;
_logger . LogInformation ( $"taskPkId={taskPkId} 提单号{siSubmitted.MBL_NO} 处理失败" ) ;
}
}
else
{
result . succ = false ;
result . msg = $"提单号{siSubmitted.MBL_NO} 检索订舱数据失败" ;
_logger . LogInformation ( $"taskPkId={taskPkId} 提单号{siSubmitted.MBL_NO} 检索订舱数据失败" ) ;
}
}
else
{
result . succ = false ;
result . msg = "当前租户没开通自动( SI回执是否自动更新订舱) " ;
siSubmitted . IS_SET_AUTO_UPD_BOOKING = false ;
//将文件同步到订舱的附件
if ( orderInfo ! = null )
{
//推送截单货物状态
var pushModel = new ModifyServiceProjectStatusDto
{
BookingId = orderInfo . Id ,
SourceType = TrackingSourceTypeEnum . AUTO ,
StatusCodes = new List < ModifyServiceProjectStatusDetailDto > {
new ModifyServiceProjectStatusDetailDto { StatusCode = "JD" } }
} ;
if ( siSubmitted . NOTICE_DATE . HasValue )
{
pushModel . StatusCodes [ 0 ] . SetActDate = siSubmitted . NOTICE_DATE . Value ;
}
var saveStatusRlt = await _bookingValueAddedService . SaveServiceStatus ( pushModel ) ;
_logger . LogInformation ( $"taskPkId={taskPkId} 提单号{siSubmitted.MBL_NO} 推送截单状态完成 结果={JSON.Serialize(saveStatusRlt)}" ) ;
siSubmitted . PROCESS_STATUS = "SUCC" ;
siSubmitted . PROCESS_DATE = DateTime . Now ;
siSubmitted . IS_UPDATE_BOOKING = true ;
siSubmitted . UPDATE_BOOKING_DATE = DateTime . Now ;
//直接完成SI的回执任务
if ( taskBase . IS_PUBLIC = = 1 )
{
//更新任务的状态
taskBase . IS_PUBLIC = 0 ;
taskBase . IS_COMPLETE = 1 ;
taskBase . COMPLETE_DEAL = "AUTO" ;
taskBase . COMPLETE_DEAL_NAME = "自动" ;
taskBase . COMPLETE_DATE = DateTime . Now ;
if ( ! string . IsNullOrWhiteSpace ( orderInfo . OP ) )
{
taskBase . RealUserId = long . Parse ( orderInfo . OPID ) ;
taskBase . RealUserName = orderInfo . OP ;
taskBase . UpdatedTime = DateTime . Now ;
taskBase . UpdatedUserId = long . Parse ( orderInfo . OPID ) ;
taskBase . UpdatedUserName = orderInfo . OP ;
}
else
{
taskBase . RealUserId = orderInfo . CreatedUserId . Value ;
taskBase . RealUserName = orderInfo . CreatedUserName ;
taskBase . UpdatedTime = DateTime . Now ;
taskBase . UpdatedUserId = orderInfo . CreatedUserId . Value ;
taskBase . UpdatedUserName = orderInfo . CreatedUserName ;
}
//更新任务台,将当前任务变更为个人任务
await _taskBaseRepository . AsUpdateable ( taskBase ) . UpdateColumns ( it = > new {
it . IS_PUBLIC ,
it . RealUserId ,
it . RealUserName ,
it . UpdatedTime ,
it . UpdatedUserId ,
it . UpdatedUserName
} ) . ExecuteCommandAsync ( ) ;
}
else
{
taskBase . IS_COMPLETE = 1 ;
taskBase . COMPLETE_DEAL = "AUTO" ;
taskBase . COMPLETE_DEAL_NAME = "自动" ;
taskBase . COMPLETE_DATE = DateTime . Now ;
if ( ! string . IsNullOrWhiteSpace ( orderInfo . OP ) )
{
taskBase . RealUserId = long . Parse ( orderInfo . OPID ) ;
taskBase . RealUserName = orderInfo . OP ;
taskBase . UpdatedTime = DateTime . Now ;
taskBase . UpdatedUserId = long . Parse ( orderInfo . OPID ) ;
taskBase . UpdatedUserName = orderInfo . OP ;
}
else
{
taskBase . RealUserId = orderInfo . CreatedUserId . Value ;
taskBase . RealUserName = orderInfo . CreatedUserName ;
taskBase . UpdatedTime = DateTime . Now ;
taskBase . UpdatedUserId = orderInfo . CreatedUserId . Value ;
taskBase . UpdatedUserName = orderInfo . CreatedUserName ;
}
//更新任务台,将当前任务变更为个人任务
await _taskBaseRepository . AsUpdateable ( taskBase ) . UpdateColumns ( it = > new {
it . IS_PUBLIC ,
it . RealUserId ,
it . RealUserName ,
it . UpdatedTime ,
it . UpdatedUserId ,
it . UpdatedUserName
} ) . ExecuteCommandAsync ( ) ;
}
//处理附件
var opt = App . GetOptions < BookingAttachOptions > ( ) ;
var dirAbs = opt . basePath ;
if ( string . IsNullOrEmpty ( dirAbs ) )
{
dirAbs = App . WebHostEnvironment . WebRootPath ;
}
string batchNo = IDGen . NextID ( ) . ToString ( ) ;
var fileList = _taskFileRepository . AsQueryable ( ) . Filter ( null , true ) . Where ( a = > a . TASK_PKID = = taskPkId & & a . TenantId = = taskBase . TenantId . Value ) . ToList ( ) ;
fileList . ForEach ( file = >
{
if ( file . FILE_CATEGORY = = TaskFileCategoryEnum . SI_SUBMITTED . ToString ( ) )
{
var fileFullPath = Path . Combine ( dirAbs , file . FILE_PATH ) ;
if ( File . Exists ( fileFullPath ) )
{
//如果确认文件读取成功
var bookFilePath = FileAttachHelper . MoveFile ( orderInfo . Id . ToString ( ) , fileFullPath , batchNo
, false , null , true ) . GetAwaiter ( ) . GetResult ( ) ;
//将格式单附件写入订舱的附件
SaveEDIFile ( orderInfo . Id , bookFilePath , new System . IO . FileInfo ( bookFilePath ) . Name , taskBase . TenantId . Value ) . GetAwaiter ( ) ;
}
}
} ) ;
_logger . LogInformation ( $"taskPkId={taskPkId} 提单号{siSubmitted.MBL_NO} 上传订舱数据附件完成" ) ;
result . succ = true ;
result . msg = "处理成功" ;
_logger . LogInformation ( $"taskPkId={taskPkId} 提单号{siSubmitted.MBL_NO} 更新完成" ) ;
}
else
{
result . succ = false ;
result . msg = $"提单号{siSubmitted.MBL_NO} 检索订舱数据失败" ;
_logger . LogInformation ( $"taskPkId={taskPkId} 提单号{siSubmitted.MBL_NO} 检索订舱数据失败" ) ;
}
}
}
catch ( Exception ex )
{
result . succ = false ;
result . msg = ex . Message ;
}
if ( ! result . succ )
{
if ( siSubmitted ! = null )
{
siSubmitted . PROCESS_STATUS = "FAILURE" ;
siSubmitted . PROCESS_DATE = DateTime . Now ;
if ( result . msg . Length > 500 )
{
siSubmitted . PROCESS_RESULT = result . msg . Substring ( 0 , 500 ) ;
}
else
{
siSubmitted . PROCESS_RESULT = result . msg ;
}
await _taskSISubmittedRepository . AsUpdateable ( siSubmitted ) . UpdateColumns ( x = > new
{
x . PROCESS_DATE ,
x . PROCESS_STATUS ,
x . PROCESS_RESULT ,
x . DIFF_NUM ,
x . IS_SET_AUTO_UPD_BOOKING ,
} ) . ExecuteCommandAsync ( ) ;
new EmailNoticeHelper ( ) . SendEmailNotice ( $"MBLNO={siSubmitted.MBL_NO} SI回执回写失败" , $"MBLNO={siSubmitted.MBL_NO} SI回执回写失败, 原因: {result.msg}" , App . Configuration [ "EmailNoticeDefaultUser" ] . GetUserEmailList ( ) ) ;
}
}
else
{
await _taskSISubmittedRepository . AsUpdateable ( siSubmitted ) . UpdateColumns ( x = > new
{
x . PROCESS_DATE ,
x . PROCESS_STATUS ,
x . PROCESS_RESULT ,
x . IS_UPDATE_BOOKING ,
x . UPDATE_BOOKING_DATE ,
x . DIFF_NUM ,
x . BOOKING_ID ,
x . IS_SET_AUTO_UPD_BOOKING
} ) . ExecuteCommandAsync ( ) ;
}
return result ;
}
# endregion
#region 异步写入附件表
/// <summary>
/// 异步写入附件表
/// </summary>
/// <param name="boookId">订舱ID</param>
/// <param name="FilePath">文件路径</param>
/// <param name="fileName">文件名</param>
/// <param name="tenantId">租户ID</param>
/// <param name="fileTypeCode">附件类型代码</param>
/// <param name="fileTypeName">附件类型名称</param>
/// <param name="moudle">附件模块代码</param>
/// <returns></returns>
[NonAction]
private async Task SaveEDIFile ( long boookId , string FilePath , string fileName , long tenantId ,
string fileTypeCode = "sifeed" , string fileTypeName = "SI submitted" , string moudle = "TaskSISubmitted" )
{
/ *
直 接 将 附 件 信 息 写 入 附 件 表
* /
//EDI文件
var bookFile = new BookingFile
{
Id = YitIdHelper . NextId ( ) ,
FileName = fileName ,
FilePath = FilePath ,
TypeCode = fileTypeCode ,
TypeName = fileTypeName ,
BookingId = boookId ,
TenantId = tenantId ,
Moudle = moudle
} ;
await _bookingFileRepository . InsertAsync ( bookFile ) ;
}
# endregion
///// <summary>
///// 获取SI反馈信息
///// </summary>
///// <param name="taskPKId">任务主键</param>
///// <returns>返回结果</returns>
//[HttpGet("/TaskManageSISubmitted/GetSIFeedBackInfo")]
//public async Task<TaskSISubmittedShowDto> GetSIFeedBackInfo(string taskPKId)
//{
// TaskSISubmittedShowDto dto = new TaskSISubmittedShowDto();
// var taskBase = _taskBaseRepository.AsQueryable().First(a => a.PK_ID == taskPKId);
// if (taskBase == null)
// throw Oops.Oh($"任务主键{taskPKId}无法获取业务信息");
// var siSubmitted = _taskSISubmittedRepository.AsQueryable().First(a => a.TASK_ID == taskBase.PK_ID);
// if (siSubmitted == null)
// throw Oops.Oh($"截单回执主键{taskPKId}无法获取业务信息");
// var bookOrderList = _bookingOrderRepository.AsQueryable().Filter(null, true)
// .InnerJoin<BookingCtn>((bk, ctn) => bk.Id == ctn.BILLID)
// .Where((bk, ctn) => bk.Id == siSubmitted.BOOKING_ID.Value && bk.TenantId == UserManager.TENANT_ID)
// .Select((bk, ctn) => new { bk = bk, ctn = ctn }).ToList();
// var orderInfo = bookOrderList.FirstOrDefault().bk;
// //var siFeedBackList = _taskSISubmittedRepository.EntityContext.Queryable<TaskSISubmitted>()
// // .InnerJoin<TaskSISubmittedCtn>((si, ctn) => si.PK_ID == ctn.P_PKID)
// // .Where((si, ctn) => si.TASK_PKID == model.TaskId && si.TenantId == UserManager.TENANT_ID)
// // .Select((si, ctn) => new { si = si, ctn = ctn }).ToList();
// //if (siFeedBackList.Count == 0)
// // throw Oops.Oh($"SI反馈信息不存在");
// //var siFeedBackInfo = siFeedBackList.FirstOrDefault().si;
// //var resultInfo = siFeedBackInfo.Adapt<TaskSIFeedBackResultBusiDto>();
// //resultInfo.ContaList = siFeedBackList.Select(t => t.ctn.Adapt<TaskSIFeedBackResultContaDto>()).ToList();
// //model.BusiInfo = resultInfo;
// //if (orderInfo != null)
// //{
// // //订舱
// // model.BookingOrder = orderInfo.Adapt<TaskBookingOrderDto>();
// //}
// ////进行数据比对确认差异字段KEY
// //var mainDiff = await InnerCompareMainInfoDiff(orderInfo, siFeedBackInfo);
// //model.SICompareOrderKeyList = mainDiff;
// //var contaDiff = await InnerCompareContaInfoDiff(bookOrderList.Select(t => t.ctn).ToList(),
// // siFeedBackList.Select(t => t.ctn).ToList());
// //model.SICompareOrderContaKeyList = contaDiff;
// return dto;
//}
#region 推送BC变更比对
/// <summary>
/// 推送BC变更比对sysUser
/// </summary>
/// <param name="siSrcDto">订舱详情</param>
/// <param name="siTargetDto">SI截单详情</param>
/// <param name="bookingId">订舱主键</param>
/// <param name="taskPKId">任务ID</param>
/// <returns></returns>
[NonAction]
public async Task < Tuple < string , int > > PushCompareSIInfo ( SIFeedBackCompareDto siSrcDto , SIFeedBackCompareDto siTargetDto , long bookingId , string taskPKId )
{
string result = string . Empty ;
int diffNum = 0 ;
string batchNo = IDGen . NextID ( ) . ToString ( ) ;
DateTime bDate = DateTime . Now ;
var compareResult = await ExcuteCompare ( siSrcDto , siTargetDto ) ;
DateTime eDate = DateTime . Now ;
TimeSpan ts = eDate . Subtract ( bDate ) ;
var timeDiff = ts . TotalMilliseconds ;
if ( compareResult ! = null )
{
_logger . LogInformation ( "批次={no} 请求完成,耗时:{timeDiff}ms. 结果{msg}" , batchNo , timeDiff , compareResult . succ ? "成功" : "失败" ) ;
if ( ! compareResult . succ )
{
result = $"比对失败,原因:{compareResult.msg}" ;
}
}
if ( compareResult ! = null )
{
DateTime nowDate = DateTime . Now ;
var hisInfo = _businessCompareDiffRecordRepository . AsQueryable ( ) . Filter ( null , true ) . First ( a = >
a . BUSI_ID = = bookingId . ToString ( ) & & a . TASK_ID = = taskPKId ) ;
if ( hisInfo = = null )
{
BusinessCompareDiffRecord entity = new BusinessCompareDiffRecord
{
BUSI_ID = bookingId . ToString ( ) ,
TASK_ID = taskPKId ,
BUSI_TYPE = "SI_SUBMITTED" ,
COMPARE_DIFF_NUM = compareResult . extra . IsExistsDiff ? compareResult . extra . ShowDetailList . Count : 0 ,
CreatedTime = nowDate ,
UpdatedTime = nowDate ,
CreatedUserId = UserManager . UserId ,
CreatedUserName = UserManager . Name ,
UpdatedUserId = UserManager . UserId ,
UpdatedUserName = UserManager . Name ,
COMPARE_TYPE = "SI_MODIFY" ,
COMPARE_RLT = JSON . Serialize ( compareResult . extra . ShowDetailList ) ,
} ;
await _businessCompareDiffRecordRepository . InsertAsync ( entity ) ;
}
else
{
hisInfo . COMPARE_DIFF_NUM = compareResult . extra . IsExistsDiff ? compareResult . extra . ShowDetailList . Count : 0 ;
hisInfo . UpdatedTime = nowDate ;
hisInfo . UpdatedUserId = UserManager . UserId ;
hisInfo . UpdatedUserName = UserManager . Name ;
hisInfo . COMPARE_RLT = JSON . Serialize ( compareResult . extra . ShowDetailList ) ;
await _businessCompareDiffRecordRepository . AsUpdateable ( hisInfo ) . UpdateColumns ( it = >
new
{
it . COMPARE_DIFF_NUM ,
it . COMPARE_RLT ,
it . UpdatedTime ,
it . UpdatedUserId ,
it . UpdatedUserName
} ) . ExecuteCommandAsync ( ) ;
}
if ( compareResult . extra . ShowDetailList = = null | | compareResult . extra . ShowDetailList . Count = = 0 )
{
result = $"比对失败,没有比对出差异" ;
new EmailNoticeHelper ( ) . SendEmailNotice ( $"MBLNO={siSrcDto.MblNo} SI 回执比对差异失败, 比对结果为0" , $"MBLNO={siSrcDto.MblNo} SI 回执比对差异失败, 比对结果为0" , App . Configuration [ "EmailNoticeDefaultUser" ] . GetUserEmailList ( ) ) ;
}
else
{
diffNum = compareResult . extra . ShowDetailList . Count ;
}
}
else
{
result = $"比对失败,未获取到比对结果" ;
new EmailNoticeHelper ( ) . SendEmailNotice ( $"MBLNO={siSrcDto.MblNo} SI 回执比对差异失败,未获取到比对结果" , $"MBLNO={siSrcDto.MblNo} SI 回执比对差异失败,未获取到比对结果" , App . Configuration [ "EmailNoticeDefaultUser" ] . GetUserEmailList ( ) ) ;
}
return new Tuple < string , int > ( result , diffNum ) ;
}
# endregion
#region 请求BC比对
/// <summary>
/// 请求SI比对
/// </summary>
/// <param name="siSrcDto">订舱详情</param>
/// <param name="siTargetDto">SI截单详情</param>
/// <returns>返回回执</returns>
[NonAction]
public async Task < TaskManageExcuteResultDto > ExcuteCompare ( SIFeedBackCompareDto siSrcDto , SIFeedBackCompareDto siTargetDto )
{
TaskManageExcuteResultDto model = null ;
/ *
1 、 读 取 配 置 文 件 中 的 规 则 引 擎 URL
2 、 填 充 请 求 的 类 , 并 生 成 JSON 报 文
3 、 POST 请 求 接 口 , 并 记 录 回 执 。
4 、 返 回 信 息 。
* /
var url = App . Configuration [ "SICompareUrl" ] ;
using ( var httpClient = new HttpClient ( ) )
{
try
{
using ( var reduceAttach = new MultipartFormDataContent ( ) )
{
var dataContent = new ByteArrayContent ( Encoding . UTF8 . GetBytes ( JSON . Serialize ( siSrcDto ) ) ) ;
dataContent . Headers . ContentDisposition = new ContentDispositionHeaderValue ( $"form-data" )
{
Name = "srcJson"
} ;
reduceAttach . Add ( dataContent ) ;
var dataContent2 = new ByteArrayContent ( Encoding . UTF8 . GetBytes ( JSON . Serialize ( siTargetDto ) ) ) ;
dataContent2 . Headers . ContentDisposition = new ContentDispositionHeaderValue ( $"form-data" )
{
Name = "destJson"
} ;
reduceAttach . Add ( dataContent2 ) ;
//请求
var response = httpClient . PostAsync ( url , reduceAttach ) . Result ;
var result = response . Content . ReadAsStringAsync ( ) . Result ;
model = JSON . Deserialize < TaskManageExcuteResultDto > ( result ) ;
}
}
catch ( Exception ex )
{
_logger . LogInformation ( "推送SI比对异常, 原因: {error}" , ex . Message ) ;
throw Oops . Oh ( $"推送SI比对异常, 原因: {ex.Message}" ) ;
}
}
return model ;
}
# endregion
#region 获取订舱详情
/// <summary>
/// 获取订舱详情
/// </summary>
/// <param name="taskPKId">任务主键</param>
/// <returns>返回结果</returns>
[HttpGet("/TaskManageSISubmitted/GetBookingOrderInfo")]
public async Task < TaskBookingOrderDto > GetBookingOrderInfo ( string taskPKId )
{
TaskBookingOrderDto model = new TaskBookingOrderDto ( ) ;
string batchNo = IDGen . NextID ( ) . ToString ( ) ;
try
{
var taskBase = _taskBaseRepository . AsQueryable ( ) . Filter ( null , true ) . First ( a = > a . PK_ID = = taskPKId & & a . TenantId = = UserManager . TENANT_ID ) ;
if ( taskBase = = null )
throw Oops . Oh ( $"任务主键{taskPKId}无法获取业务信息" ) ;
var siSubmitted = _taskSISubmittedRepository . AsQueryable ( ) . Filter ( null , true ) . First ( a = > a . TASK_ID = = taskBase . PK_ID & & a . TenantId = = UserManager . TENANT_ID ) ;
if ( siSubmitted = = null )
throw Oops . Oh ( $"截单回执主键{taskPKId}无法获取业务信息" ) ;
BookingOrder orderInfo = null ;
if ( ! siSubmitted . BOOKING_ID . HasValue )
{
orderInfo = _bookingOrderRepository . AsQueryable ( ) . Filter ( null , true )
. First ( a = > ( ( a . MBLNO = = siSubmitted . MBL_NO ) | | ( a . SPLIT_OR_MERGE_FLAG ! = null & & a . SPLIT_OR_MERGE_FLAG = = 1 & & a . CUSTNO = = siSubmitted . MBL_NO ) ) & & a . IsDeleted = = false
& & a . TenantId = = UserManager . TENANT_ID & & ( a . ParentId = = 0 | | a . ParentId = = null ) ) ;
if ( orderInfo ! = null )
{
siSubmitted . BOOKING_ID = orderInfo . Id ;
await _taskSISubmittedRepository . AsUpdateable ( siSubmitted ) . UpdateColumns ( x = > new
{
x . BOOKING_ID
} ) . ExecuteCommandAsync ( ) ;
}
}
else
{
var bookingId = siSubmitted . BOOKING_ID . Value ;
orderInfo = _bookingOrderRepository . AsQueryable ( ) . Filter ( null , true )
. First ( a = > a . Id = = bookingId & & a . IsDeleted = = false
& & a . TenantId = = UserManager . TENANT_ID & & ( a . ParentId = = 0 | | a . ParentId = = null ) ) ;
}
if ( orderInfo ! = null )
{
//订舱
model = orderInfo . Adapt < TaskBookingOrderDto > ( ) ;
var contaList = await _bookingCtnRepository . AsQueryable ( ) . Where ( x = > x . BILLID = = orderInfo . Id ) . ToListAsync ( ) ;
//获取集装箱的主键
var ctnArg = contaList . Select ( t = > t . Id ) . ToArray ( ) ;
//查询集装箱所有的货物信息
var cargoList = await _bookingOrderContaCargoRepository . AsQueryable ( )
. Where ( x = > ctnArg . Contains ( x . CTNID . Value ) ) . ToListAsync ( ) ;
_logger . LogInformation ( "批次={no} 提取货物明细完成 数量={total}" , batchNo , cargoList . Count ) ;
if ( cargoList . Count > 0 )
{
model . ContaList = contaList . GroupJoin ( cargoList , l = > l . Id , r = > r . CTNID , ( l , r ) = > {
var currList = r . ToList ( ) ;
if ( currList . Count > 0 )
{
var info = l . Adapt < TaskBookingOrderContaDto > ( ) ;
info . CargoList = currList . Adapt < List < TaskBookingOrderCargoDto > > ( ) ;
return info ;
}
return l . Adapt < TaskBookingOrderContaDto > ( ) ;
} ) . ToList ( ) ;
}
else
{
model . ContaList = contaList . Adapt < List < TaskBookingOrderContaDto > > ( ) ;
}
//任务
model . TaskBaseInfo = taskBase . Adapt < TaskBaseInfoDto > ( ) ;
}
}
catch ( Exception ex )
{
throw Oops . Bah ( "获取订舱详情异常,{0}" , ex . Message ) ;
}
return model ;
}
# endregion
#region 获取SI反馈信息
/// <summary>
/// 获取SI反馈信息
/// </summary>
/// <param name="taskPKId">任务主键</param>
/// <returns>返回结果</returns>
[HttpGet("/TaskManageSISubmitted/GetSIFeedBackInfo")]
public async Task < TaskSIFeedBackResultDto > GetSIFeedBackInfo ( string taskPKId )
{
TaskSIFeedBackResultDto model = new TaskSIFeedBackResultDto ( ) ;
try
{
var taskBase = _taskBaseRepository . AsQueryable ( ) . Filter ( null , true ) . First ( a = > a . PK_ID = = taskPKId & & a . TenantId = = UserManager . TENANT_ID ) ;
if ( taskBase = = null )
throw Oops . Oh ( $"任务主键{taskPKId}无法获取业务信息" ) ;
var siFeedBackList = _taskSISubmittedRepository . AsQueryable ( ) . Filter ( null , true )
. InnerJoin < TaskSISubmittedCtn > ( ( si , ctn ) = > si . PK_ID = = ctn . P_PKID )
. Where ( ( si , ctn ) = > si . TASK_ID = = taskBase . PK_ID & & si . TenantId = = UserManager . TENANT_ID )
. Select ( ( si , ctn ) = > new { si = si , ctn = ctn } ) . ToList ( ) ;
if ( siFeedBackList . Count = = 0 )
throw Oops . Oh ( $"SI反馈信息不存在" ) ;
var bookingId = siFeedBackList . FirstOrDefault ( ) . si . BOOKING_ID . Value ;
var bookOrderList = _bookingOrderRepository . EntityContext . Queryable < BookingOrder > ( )
. InnerJoin < BookingCtn > ( ( bk , ctn ) = > bk . Id = = ctn . BILLID )
. Where ( ( bk , ctn ) = > bk . Id = = bookingId & & bk . TenantId = = UserManager . TENANT_ID )
. Select ( ( bk , ctn ) = > new { bk = bk , ctn = ctn } ) . ToList ( ) ;
var orderInfo = bookOrderList . FirstOrDefault ( ) . bk ;
model . TaskId = taskBase . PK_ID ;
var siFeedBackInfo = siFeedBackList . FirstOrDefault ( ) . si ;
var resultInfo = siFeedBackInfo . Adapt < TaskSIFeedBackResultBusiDto > ( ) ;
resultInfo . ContaList = siFeedBackList . Select ( t = > t . ctn . Adapt < TaskSIFeedBackResultContaDto > ( ) ) . ToList ( ) ;
model . BusiInfo = resultInfo ;
if ( orderInfo ! = null )
{
//订舱
model . BookingOrder = orderInfo . Adapt < TaskBookingOrderDto > ( ) ;
}
//进行数据比对确认差异字段KEY
var mainDiff = await InnerCompareMainInfoDiff ( orderInfo , siFeedBackInfo ) ;
model . SICompareOrderKeyList = mainDiff ;
var contaDiff = await InnerCompareContaInfoDiff ( bookOrderList . Select ( t = > t . ctn ) . ToList ( ) ,
siFeedBackList . Select ( t = > t . ctn ) . ToList ( ) ) ;
model . SICompareOrderContaKeyList = contaDiff ;
}
catch ( Exception ex )
{
throw Oops . Bah ( "获取SI反馈信息异常,{0}" , ex . Message ) ;
}
return model ;
}
# endregion
#region 比较主信息
/// <summary>
/// 比较主信息
/// </summary>
/// <param name="bookingOrder">订舱详情</param>
/// <param name="taskSIFeedBackInfo">SI反馈详情</param>
/// <returns>返回差异</returns>
private async Task < List < string > > InnerCompareMainInfoDiff ( BookingOrder bookingOrder , TaskSISubmitted taskSIFeedBackInfo )
{
List < string > resultList = new List < string > ( ) ;
//需要比对的字段
var compareField = new string [ ] { "SHIPPER" , "CONSIGNEE" , "NOTIFYPARTY" , "MARKS" , "DESCRIPTION" , "BLFRT" , "SERVICE" , "ISSUETYPE" , "PORTLOAD" , "PORTDISCHARGE" ,
"TRANSPORT" , "DESTINATION" , "PKGS" , "KGS" , "CBM" , "KINDPKGS" , "THIRDPAYADDR" } ;
var bookProps = typeof ( BookingOrder ) . GetProperties ( ) ;
var feedProps = typeof ( TaskSISubmitted ) . GetProperties ( ) ;
resultList = bookProps . GroupJoin ( feedProps , l = > l . Name . ToUpper ( ) ,
r = > r . Name . ToUpper ( ) , ( l , r ) = >
{
if ( compareField . Any ( x = > x . Equals ( l . Name , StringComparison . OrdinalIgnoreCase ) ) )
{
var currList = r . ToList ( ) ;
if ( currList . Count > 0 )
{
var si = r . FirstOrDefault ( ) ;
var bkVal = l . GetValue ( bookingOrder ) ;
var siVal = si . GetValue ( taskSIFeedBackInfo ) ;
if ( l . PropertyType = = typeof ( string ) )
{
string st1 = string . Empty ;
string st2 = string . Empty ;
if ( bkVal = = null )
{
st1 = "" ;
}
else {
st1 = ( bkVal as string ) . AdjustString ( ) ;
}
if ( siVal = = null )
{
st2 = "" ;
}
else
{
st2 = ( siVal as string ) . AdjustString ( ) ;
}
if ( ! st1 . Equals ( st2 ) )
{
return l . Name . ToUpper ( ) ;
}
return string . Empty ;
}
else if ( l . PropertyType = = typeof ( int? ) )
{
var dt1 = bkVal as int? ;
var dt2 = siVal as int? ;
if ( ! dt1 . Equals ( dt2 ) )
{
return l . Name . ToUpper ( ) ;
}
return string . Empty ;
}
else if ( l . PropertyType = = typeof ( decimal? ) )
{
var dt1 = bkVal as decimal? ;
var dt2 = siVal as decimal? ;
if ( ! dt1 . Equals ( dt2 ) )
{
return l . Name . ToUpper ( ) ;
}
return string . Empty ;
}
}
return string . Empty ;
}
return string . Empty ;
} ) . Where ( t = > ! string . IsNullOrWhiteSpace ( t ) ) . ToList ( ) ;
return resultList ;
}
# endregion
#region 比较箱信息
/// <summary>
/// 比较箱信息
/// </summary>
/// <param name="bookContaList">订舱箱信息</param>
/// <param name="siContaList">SI反馈箱信息</param>
/// <returns>返回差异</returns>
private async Task < List < string > > InnerCompareContaInfoDiff ( List < BookingCtn > bookContaList , List < TaskSISubmittedCtn > siContaList )
{
List < string > resultList = new List < string > ( ) ;
var bookProps = typeof ( BookingCtn ) . GetProperties ( ) ;
var feedProps = typeof ( TaskSIFeedBackContaInfo ) . GetProperties ( ) ;
resultList = siContaList . GroupJoin ( bookContaList , l = > l . CNTRNO , r = > r . CNTRNO , ( l , r ) = >
{
var currList = r . ToList ( ) ;
if ( currList . Count > 0 )
{
var bkCtn = currList . FirstOrDefault ( ) ;
if ( ! l . KGS . Equals ( bkCtn . KGS )
| | ! l . PKGS . Equals ( bkCtn . PKGS )
| | ! l . SEALNO . Equals ( bkCtn . SEALNO )
| | ! l . CTNALL . Equals ( bkCtn . CTNALL )
| | ! l . CBM . Equals ( bkCtn . CBM ) )
{
return l . CNTRNO ;
}
return String . Empty ;
}
return l . CNTRNO ;
} ) . Where ( t = > ! string . IsNullOrWhiteSpace ( t ) ) . ToList ( ) ;
return resultList ;
}
# endregion
}
}